Skip to content

Commit edfed6e

Browse files
authored
feat(secure-zone): add data source for secure zone (#615)
* add data source for secure zones * fix secure_zone.md * fix acc test * fix acc test * fix acc test
1 parent 631a98d commit edfed6e

File tree

6 files changed

+249
-4
lines changed

6 files changed

+249
-4
lines changed
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package sysdig
2+
3+
import (
4+
"context"
5+
"fmt"
6+
v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2"
7+
"strconv"
8+
"time"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
)
13+
14+
func dataSourceSysdigSecureZone() *schema.Resource {
15+
return &schema.Resource{
16+
ReadContext: dataSourceSysdigSecureZoneRead,
17+
18+
Schema: map[string]*schema.Schema{
19+
SchemaDescriptionKey: {
20+
Type: schema.TypeString,
21+
Computed: true,
22+
},
23+
SchemaIsSystemKey: {
24+
Type: schema.TypeBool,
25+
Computed: true,
26+
},
27+
SchemaAuthorKey: {
28+
Type: schema.TypeString,
29+
Computed: true,
30+
},
31+
SchemaLastModifiedBy: {
32+
Type: schema.TypeString,
33+
Computed: true,
34+
},
35+
SchemaLastUpdated: {
36+
Type: schema.TypeString,
37+
Computed: true,
38+
},
39+
SchemaScopeKey: {
40+
Type: schema.TypeSet,
41+
Computed: true,
42+
Elem: &schema.Resource{
43+
Schema: map[string]*schema.Schema{
44+
SchemaIDKey: {
45+
Type: schema.TypeInt,
46+
Computed: true,
47+
},
48+
SchemaTargetTypeKey: {
49+
Type: schema.TypeString,
50+
Computed: true,
51+
},
52+
SchemaRulesKey: {
53+
Type: schema.TypeString,
54+
Computed: true,
55+
},
56+
},
57+
},
58+
},
59+
"id": {
60+
Type: schema.TypeString,
61+
Optional: true,
62+
ExactlyOneOf: []string{"id", "name"},
63+
Description: "The ID of the zone to retrieve.",
64+
},
65+
"name": {
66+
Type: schema.TypeString,
67+
Optional: true,
68+
ExactlyOneOf: []string{"id", "name"},
69+
Description: "The name of the zone to retrieve.",
70+
},
71+
},
72+
}
73+
}
74+
75+
func dataSourceSysdigSecureZoneRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
76+
client, err := getZoneClient(m.(SysdigClients))
77+
if err != nil {
78+
return diag.FromErr(err)
79+
}
80+
81+
var zone *v2.Zone
82+
zoneIDRaw, hasZoneID := d.GetOk("id")
83+
if hasZoneID {
84+
zoneID, err := strconv.Atoi(zoneIDRaw.(string))
85+
if err != nil {
86+
return diag.FromErr(fmt.Errorf("invalid zone id: %s", err))
87+
}
88+
zone, err = client.GetZoneById(ctx, zoneID)
89+
if err != nil {
90+
return diag.FromErr(fmt.Errorf("error fetching zone by ID: %s", err))
91+
}
92+
} else if nameRaw, hasName := d.GetOk("name"); hasName {
93+
name := nameRaw.(string)
94+
zones, err := client.GetZones(ctx, name)
95+
if err != nil {
96+
return diag.FromErr(fmt.Errorf("error fetching zones: %s", err))
97+
}
98+
for _, z := range zones {
99+
if z.Name == name {
100+
zone = &z
101+
break
102+
}
103+
}
104+
if zone == nil {
105+
return diag.FromErr(fmt.Errorf("zone with name '%s' not found", name))
106+
}
107+
} else {
108+
return diag.FromErr(fmt.Errorf("either id or name must be specified"))
109+
}
110+
111+
d.SetId(fmt.Sprintf("%d", zone.ID))
112+
_ = d.Set(SchemaNameKey, zone.Name)
113+
_ = d.Set(SchemaDescriptionKey, zone.Description)
114+
_ = d.Set(SchemaIsSystemKey, zone.IsSystem)
115+
_ = d.Set(SchemaAuthorKey, zone.Author)
116+
_ = d.Set(SchemaLastModifiedBy, zone.LastModifiedBy)
117+
_ = d.Set(SchemaLastUpdated, time.UnixMilli(zone.LastUpdated).Format(time.RFC3339))
118+
119+
if err := d.Set(SchemaScopeKey, fromZoneScopesResponse(zone.Scopes)); err != nil {
120+
return diag.FromErr(fmt.Errorf("error setting scope: %s", err))
121+
}
122+
123+
return nil
124+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
//go:build tf_acc_sysdig_secure || tf_acc_onprem_secure
2+
3+
package sysdig_test
4+
5+
import (
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
11+
"github.com/draios/terraform-provider-sysdig/sysdig"
12+
)
13+
14+
func TestAccDataSourceSysdigSecureZone(t *testing.T) {
15+
resource.ParallelTest(t, resource.TestCase{
16+
PreCheck: preCheckAnyEnv(t, SysdigSecureApiTokenEnv),
17+
ProviderFactories: map[string]func() (*schema.Provider, error){
18+
"sysdig": func() (*schema.Provider, error) {
19+
return sysdig.Provider(), nil
20+
},
21+
},
22+
Steps: []resource.TestStep{
23+
{
24+
Config: testAccDataSourceSysdigSecureZoneConfig(),
25+
Check: resource.ComposeTestCheckFunc(
26+
resource.TestCheckResourceAttr("data.sysdig_secure_zone.test", "name", "test-secure-zone"),
27+
resource.TestCheckResourceAttrSet("data.sysdig_secure_zone.test", "description"),
28+
resource.TestCheckResourceAttrSet("data.sysdig_secure_zone.test", "is_system"),
29+
resource.TestCheckResourceAttrSet("data.sysdig_secure_zone.test", "author"),
30+
resource.TestCheckResourceAttrSet("data.sysdig_secure_zone.test", "last_modified_by"),
31+
resource.TestCheckResourceAttrSet("data.sysdig_secure_zone.test", "last_updated"),
32+
resource.TestCheckTypeSetElemNestedAttrs(
33+
"data.sysdig_secure_zone.test",
34+
"scope.*",
35+
map[string]string{
36+
"target_type": "aws",
37+
"rules": "organization in (\"o1\", \"o2\") and account in (\"a1\", \"a2\")",
38+
},
39+
),
40+
),
41+
},
42+
},
43+
})
44+
}
45+
46+
func testAccDataSourceSysdigSecureZoneConfig() string {
47+
return `
48+
resource "sysdig_secure_zone" "sample" {
49+
name = "test-secure-zone"
50+
description = "Test secure zone"
51+
scope {
52+
target_type = "aws"
53+
rules = "organization in (\"o1\", \"o2\") and account in (\"a1\", \"a2\")"
54+
}
55+
}
56+
57+
data "sysdig_secure_zone" "test" {
58+
depends_on = ["sysdig_secure_zone.sample"]
59+
name = "test-secure-zone"
60+
}
61+
`
62+
}

sysdig/internal/client/v2/model.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1225,7 +1225,7 @@ type OrganizationSecure struct {
12251225
}
12261226

12271227
type ZonesWrapper struct {
1228-
Zones []Zone `json:"zones"`
1228+
Zones []Zone `json:"data"`
12291229
}
12301230

12311231
type ZoneRequest struct {

sysdig/internal/client/v2/zones.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"net/http"
7+
"net/url"
78
)
89

910
const (
@@ -13,15 +14,18 @@ const (
1314

1415
type ZoneInterface interface {
1516
Base
16-
GetZones(ctx context.Context) ([]Zone, error)
17+
GetZones(ctx context.Context, name string) ([]Zone, error)
1718
GetZoneById(ctx context.Context, id int) (*Zone, error)
1819
CreateZone(ctx context.Context, zone *ZoneRequest) (*Zone, error)
1920
UpdateZone(ctx context.Context, zone *ZoneRequest) (*Zone, error)
2021
DeleteZone(ctx context.Context, id int) error
2122
}
2223

23-
func (client *Client) GetZones(ctx context.Context) ([]Zone, error) {
24-
response, err := client.requester.Request(ctx, http.MethodGet, client.getZonesURL(), nil)
24+
func (client *Client) GetZones(ctx context.Context, name string) ([]Zone, error) {
25+
zonesURL := client.getZonesURL()
26+
zonesURL = fmt.Sprintf("%s?filter=name:%s", zonesURL, url.QueryEscape(name))
27+
28+
response, err := client.requester.Request(ctx, http.MethodGet, zonesURL, nil)
2529
if err != nil {
2630
return nil, err
2731
}

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ func (p *SysdigProvider) Provider() *schema.Provider {
237237
"sysdig_secure_custom_role_permissions": dataSourceSysdigSecureCustomRolePermissions(),
238238
"sysdig_secure_rule_stateful": dataSourceSysdigSecureRuleStateful(),
239239
"sysdig_secure_rule_stateful_count": dataSourceSysdigSecureRuleStatefulCount(),
240+
"sysdig_secure_zone": dataSourceSysdigSecureZone(),
240241

241242
"sysdig_current_user": dataSourceSysdigCurrentUser(),
242243
"sysdig_user": dataSourceSysdigUser(),

website/docs/d/secure_zone.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
subcategory: "Sysdig Secure"
3+
layout: "sysdig"
4+
page_title: "Sysdig: sysdig_secure_zone"
5+
description: |-
6+
Retrieves Zone by ID.
7+
---
8+
9+
# sysdig\_secure\_zone Data Source
10+
11+
The `sysdig_secure_zone` data source allows you to retrieve information about a specific Sysdig Secure Zone.
12+
13+
## Example Usage
14+
15+
```hcl
16+
resource "sysdig_secure_zone" "sample" {
17+
name = "test-secure-zone"
18+
description = "Test secure zone"
19+
scope {
20+
target_type = "aws"
21+
rules = "organization in (\"o1\", \"o2\") and account in (\"a1\", \"a2\")"
22+
}
23+
}
24+
25+
data "sysdig_secure_zone" "test" {
26+
depends_on = [sysdig_secure_zone.sample]
27+
name = sysdig_secure_zone.sample.name
28+
}
29+
```
30+
31+
## Argument Reference
32+
33+
The following arguments are supported, it is required that one of them is provided:
34+
35+
- `name` - The name of the Sysdig Secure Zone.
36+
- `id` - The ID of the Sysdig Secure Zone.
37+
38+
## Attributes Reference
39+
40+
In addition to all arguments above, the following attributes are exported:
41+
42+
- `is_system` - (Computed) Whether the Zone is a system zone.
43+
- `author` - (Computed) The zone author.
44+
- `scope` - (Computed) The scope of the zone.
45+
- `last_modified_by` - (Computed) By whom is last modification made.
46+
- `last_updated` - (Computed) Timestamp of last modification of zone.
47+
48+
## Import
49+
50+
Zone can be imported using the ID, e.g.
51+
52+
```
53+
$ terraform import sysdig_secure_zone.example 12345
54+
```

0 commit comments

Comments
 (0)