Skip to content

Commit c42df0c

Browse files
authored
feat(security-email): add support for security email (#497)
Signed-off-by: Michal Wasilewski <[email protected]>
1 parent 921dad3 commit c42df0c

File tree

6 files changed

+179
-0
lines changed

6 files changed

+179
-0
lines changed

docs/resources/security_email.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "spacelift_security_email Resource - terraform-provider-spacelift"
4+
subcategory: ""
5+
description: |-
6+
spacelift_security_email represents an email address that receives notifications about security issues in Spacelift.
7+
---
8+
9+
# spacelift_security_email (Resource)
10+
11+
`spacelift_security_email` represents an email address that receives notifications about security issues in Spacelift.
12+
13+
## Example Usage
14+
15+
```terraform
16+
resource "spacelift_security_email" "example" {
17+
18+
}
19+
```
20+
21+
<!-- schema generated by tfplugindocs -->
22+
## Schema
23+
24+
### Required
25+
26+
- `email` (String) Email address to which the security notifications are sent
27+
28+
### Read-Only
29+
30+
- `id` (String) The ID of this resource.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
resource "spacelift_security_email" "example" {
2+
3+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package structs
2+
3+
type SecurityEmail struct {
4+
Email string `graphql:"email"`
5+
}

spacelift/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ func Provider(commit, version string) plugin.ProviderFunc {
119119
"spacelift_space": resourceSpace(),
120120
"spacelift_scheduled_task": resourceScheduledTask(),
121121
"spacelift_scheduled_delete_stack": resourceScheduledDeleteStack(),
122+
"spacelift_security_email": resourceSecurityEmail(),
122123
"spacelift_stack": resourceStack(),
123124
"spacelift_stack_dependency": resourceStackDependency(),
124125
"spacelift_stack_dependency_reference": resourceStackDependencyReference(),

spacelift/resource_security_email.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package spacelift
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
10+
"github.com/spacelift-io/terraform-provider-spacelift/spacelift/internal"
11+
)
12+
13+
func resourceSecurityEmail() *schema.Resource {
14+
return &schema.Resource{
15+
Description: "" +
16+
"`spacelift_security_email` represents an email address that " +
17+
"receives notifications about security issues in Spacelift.",
18+
19+
CreateContext: resourceSecurityEmailCreate,
20+
ReadContext: resourceSecurityEmailRead,
21+
UpdateContext: resourceSecurityEmailUpdate,
22+
DeleteContext: resourceSecurityEmailDelete,
23+
24+
Importer: &schema.ResourceImporter{
25+
StateContext: schema.ImportStatePassthroughContext,
26+
},
27+
28+
Schema: map[string]*schema.Schema{
29+
"email": {
30+
Type: schema.TypeString,
31+
Description: "Email address to which the security notifications are sent",
32+
Required: true,
33+
},
34+
},
35+
}
36+
}
37+
38+
func resourceSecurityEmailCreate(ctx context.Context, data *schema.ResourceData, i interface{}) diag.Diagnostics {
39+
var mutation struct {
40+
SecurityEmail *string `graphql:"accountUpdateSecurityEmail(securityEmail: $securityEmail)"`
41+
}
42+
43+
variables := map[string]interface{}{"securityEmail": toString(data.Get("email"))}
44+
if err := i.(*internal.Client).Mutate(ctx, "AccountUpdateSecurityEmail", &mutation, variables); err != nil {
45+
return diag.Errorf("could not create security email: %v", err)
46+
}
47+
48+
data.SetId(time.Now().String())
49+
50+
return resourceSecurityEmailRead(ctx, data, i)
51+
}
52+
53+
func resourceSecurityEmailRead(ctx context.Context, data *schema.ResourceData, i interface{}) diag.Diagnostics {
54+
var query struct {
55+
SecurityEmail *string `graphql:"securityEmail"`
56+
}
57+
if err := i.(*internal.Client).Query(ctx, "SecurityEmail", &query, nil); err != nil {
58+
return diag.Errorf("could not query for security email: %v", err)
59+
}
60+
61+
if query.SecurityEmail == nil {
62+
data.SetId("")
63+
return nil
64+
}
65+
66+
data.Set("email", query.SecurityEmail)
67+
68+
return nil
69+
}
70+
71+
func resourceSecurityEmailUpdate(ctx context.Context, data *schema.ResourceData, i interface{}) diag.Diagnostics {
72+
var mutation struct {
73+
SecurityEmail *string `graphql:"accountUpdateSecurityEmail(securityEmail: $email)"`
74+
}
75+
variables := map[string]interface{}{
76+
"email": toString(data.Get("email")),
77+
}
78+
if err := i.(*internal.Client).Mutate(ctx, "AccountUpdateSecurityEmail", &mutation, variables); err != nil {
79+
return diag.Errorf("could not create security email: %v", err)
80+
}
81+
82+
return resourceSecurityEmailRead(ctx, data, i)
83+
}
84+
85+
func resourceSecurityEmailDelete(ctx context.Context, data *schema.ResourceData, i interface{}) diag.Diagnostics {
86+
data.SetId("")
87+
return diag.Diagnostics{{
88+
Severity: diag.Warning,
89+
Summary: "deleting security email is not supported, the resource has been removed from the state, but is left configured in Spacelift",
90+
}}
91+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package spacelift
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
10+
. "github.com/spacelift-io/terraform-provider-spacelift/spacelift/internal/testhelpers"
11+
)
12+
13+
var securityEmailSimple = `
14+
resource "spacelift_security_email" "test" {
15+
email = "%s"
16+
}
17+
`
18+
19+
func Test_resourceSecurityEmail(t *testing.T) {
20+
const resourceName = "spacelift_security_email.test"
21+
22+
t.Run("creates and updates a security email without an error", func(t *testing.T) {
23+
randomID := acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum)
24+
emailAddress := fmt.Sprintf("%[email protected]", randomID)
25+
emailAddress2 := fmt.Sprintf("%[email protected]", randomID)
26+
27+
testSteps(t, []resource.TestStep{
28+
{
29+
Config: fmt.Sprintf(securityEmailSimple, emailAddress),
30+
Check: Resource(
31+
resourceName,
32+
Attribute("email", Equals(emailAddress)),
33+
),
34+
},
35+
{
36+
ResourceName: resourceName,
37+
ImportState: true,
38+
ImportStateVerify: true,
39+
},
40+
{
41+
Config: fmt.Sprintf(securityEmailSimple, emailAddress2),
42+
Check: Resource(
43+
resourceName,
44+
Attribute("email", Equals(emailAddress2)),
45+
),
46+
},
47+
})
48+
})
49+
}

0 commit comments

Comments
 (0)