Skip to content

Commit 975843f

Browse files
authored
feat(onboarding): add datasource sysdig_secure_trusted_azure_app (#519)
* feat(onboarding): add datasource sysdig_secure_trusted_azure_app * docs(onboarding): add sysdig_secure_trusted_azure_app * fix(onboarding): docs spelling
1 parent 7683cdd commit 975843f

File tree

5 files changed

+187
-26
lines changed

5 files changed

+187
-26
lines changed

sysdig/data_source_sysdig_secure_onboarding.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package sysdig
22

33
import (
44
"context"
5+
"fmt"
6+
"regexp"
57
"strings"
68
"time"
79

@@ -94,6 +96,62 @@ func dataSourceSysdigSecureTrustedCloudIdentityRead(ctx context.Context, d *sche
9496
return nil
9597
}
9698

99+
func dataSourceSysdigSecureTrustedAzureApp() *schema.Resource {
100+
timeout := 5 * time.Minute
101+
102+
return &schema.Resource{
103+
ReadContext: dataSourceSysdigSecureTrustedAzureAppRead,
104+
105+
Timeouts: &schema.ResourceTimeout{
106+
Read: schema.DefaultTimeout(timeout),
107+
},
108+
109+
Schema: map[string]*schema.Schema{
110+
"name": {
111+
Type: schema.TypeString,
112+
Required: true,
113+
ValidateFunc: validation.StringInSlice([]string{"config_posture", "onboarding", "threat_detection"}, false),
114+
},
115+
"tenant_id": {
116+
Type: schema.TypeString,
117+
Computed: true,
118+
},
119+
"application_id": {
120+
Type: schema.TypeString,
121+
Computed: true,
122+
},
123+
"service_principal_id": {
124+
Type: schema.TypeString,
125+
Computed: true,
126+
},
127+
},
128+
}
129+
}
130+
131+
// Retrieves the information of a resource form the file and loads it in Terraform
132+
func dataSourceSysdigSecureTrustedAzureAppRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
133+
client, err := getSecureOnboardingClient(meta.(SysdigClients))
134+
if err != nil {
135+
return diag.FromErr(err)
136+
}
137+
138+
app := d.Get("name").(string)
139+
registration, err := client.GetTrustedAzureAppSecure(ctx, app)
140+
if err != nil {
141+
return diag.FromErr(err)
142+
}
143+
d.SetId(app)
144+
for k, v := range registration {
145+
fmt.Printf("%s, %s\n", k, snakeCase(k))
146+
err = d.Set(snakeCase(k), v)
147+
if err != nil {
148+
return diag.FromErr(err)
149+
}
150+
}
151+
152+
return nil
153+
}
154+
97155
func dataSourceSysdigSecureTenantExternalID() *schema.Resource {
98156
timeout := 5 * time.Minute
99157

@@ -223,3 +281,12 @@ func dataSourceSysdigSecureAgentlessScanningAssetsRead(ctx context.Context, d *s
223281
}
224282
return nil
225283
}
284+
285+
var matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)")
286+
var matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])")
287+
288+
func snakeCase(str string) string {
289+
snake := matchFirstCap.ReplaceAllString(str, "${1}_${2}")
290+
snake = matchAllCap.ReplaceAllString(snake, "${1}_${2}")
291+
return strings.ToLower(snake)
292+
}

sysdig/data_source_sysdig_secure_onboarding_test.go

Lines changed: 65 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package sysdig_test
44

55
import (
66
"os"
7+
"regexp"
78
"testing"
89

910
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -26,40 +27,79 @@ func TestAccTrustedCloudIdentityDataSource(t *testing.T) {
2627
},
2728
Steps: []resource.TestStep{
2829
{
29-
Config: trustedIdentityDatasourceAWS(),
30+
Config: `data "sysdig_secure_trusted_cloud_identity" "trusted_identity" { cloud_provider = "aws" }`,
31+
Check: resource.ComposeTestCheckFunc(
32+
resource.TestCheckResourceAttr("data.sysdig_secure_trusted_cloud_identity.trusted_identity", "cloud_provider", "aws"),
33+
resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_cloud_identity.trusted_identity", "aws_account_id"),
34+
resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_cloud_identity.trusted_identity", "aws_role_name"),
35+
),
3036
},
3137
{
32-
Config: trustedIdentityDatasourceGCP(),
38+
Config: `data "sysdig_secure_trusted_cloud_identity" "trusted_identity" { cloud_provider = "gcp" }`,
39+
Check: resource.ComposeTestCheckFunc(
40+
resource.TestCheckResourceAttr("data.sysdig_secure_trusted_cloud_identity.trusted_identity", "cloud_provider", "gcp"),
41+
resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_cloud_identity.trusted_identity", "aws_account_id"),
42+
resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_cloud_identity.trusted_identity", "aws_role_name"),
43+
),
3344
},
3445
{
35-
Config: trustedIdentityDatasourceAzure(),
46+
Config: `data "sysdig_secure_trusted_cloud_identity" "trusted_identity" { cloud_provider = "azure" }`,
47+
Check: resource.ComposeTestCheckFunc(
48+
resource.TestCheckResourceAttr("data.sysdig_secure_trusted_cloud_identity.trusted_identity", "cloud_provider", "azure"),
49+
resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_cloud_identity.trusted_identity", "azure_tenant_id"),
50+
resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_cloud_identity.trusted_identity", "azure_service_principal_id"),
51+
),
3652
},
3753
},
3854
})
3955
}
4056

41-
func trustedIdentityDatasourceAWS() string {
42-
return `
43-
data "sysdig_secure_trusted_cloud_identity" "trusted_identity" {
44-
cloud_provider = "aws"
45-
}
46-
`
47-
}
48-
49-
func trustedIdentityDatasourceGCP() string {
50-
return `
51-
data "sysdig_secure_trusted_cloud_identity" "trusted_identity" {
52-
cloud_provider = "gcp"
53-
}
54-
`
55-
}
56-
57-
func trustedIdentityDatasourceAzure() string {
58-
return `
59-
data "sysdig_secure_trusted_cloud_identity" "trusted_identity" {
60-
cloud_provider = "azure"
61-
}
62-
`
57+
func TestAccTrustedAzureAppDataSource(t *testing.T) {
58+
resource.ParallelTest(t, resource.TestCase{
59+
PreCheck: func() {
60+
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
61+
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
62+
}
63+
},
64+
ProviderFactories: map[string]func() (*schema.Provider, error){
65+
"sysdig": func() (*schema.Provider, error) {
66+
return sysdig.Provider(), nil
67+
},
68+
},
69+
Steps: []resource.TestStep{
70+
{
71+
Config: `data "sysdig_secure_trusted_azure_app" "config_posture" { name = "invalid" }`,
72+
ExpectError: regexp.MustCompile(`.*expected name to be one of.*`),
73+
},
74+
{
75+
Config: `data "sysdig_secure_trusted_azure_app" "config_posture" { name = "config_posture" }`,
76+
Check: resource.ComposeTestCheckFunc(
77+
resource.TestCheckResourceAttr("data.sysdig_secure_trusted_azure_app.config_posture", "name", "config_posture"),
78+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_azure_app.config_posture", "application_id"), // uncomment to assert a non empty value
79+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_azure_app.config_posture", "tenant_id"), // uncomment to assert a non empty value
80+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_azure_app.config_posture", "service_principal_id"), // uncomment to assert a non empty value
81+
),
82+
},
83+
{
84+
Config: `data "sysdig_secure_trusted_azure_app" "onboarding" { name = "onboarding" }`,
85+
Check: resource.ComposeTestCheckFunc(
86+
resource.TestCheckResourceAttr("data.sysdig_secure_trusted_azure_app.onboarding", "name", "onboarding"),
87+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_azure_app.onboarding", "application_id"), // uncomment to assert a non empty value
88+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_azure_app.onboarding", "tenant_id"), // uncomment to assert a non empty value
89+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_azure_app.onboarding", "service_principal_id"), // uncomment to assert a non empty value
90+
),
91+
},
92+
{
93+
Config: `data "sysdig_secure_trusted_azure_app" "threat_detection" { name = "threat_detection" }`,
94+
Check: resource.ComposeTestCheckFunc(
95+
resource.TestCheckResourceAttr("data.sysdig_secure_trusted_azure_app.threat_detection", "name", "threat_detection"),
96+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_azure_app.threat_detection", "application_id"), // uncomment to assert a non empty value
97+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_azure_app.threat_detection", "tenant_id"), // uncomment to assert a non empty value
98+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_azure_app.threat_detection", "service_principal_id"), // uncomment to assert a non empty value
99+
),
100+
},
101+
},
102+
})
63103
}
64104

65105
func TestAccTenantExternalIDDataSource(t *testing.T) {

sysdig/internal/client/v2/onboarding.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@ import (
88

99
const (
1010
onboardingTrustedIdentityPath = "%s/api/secure/onboarding/v2/trustedIdentity?provider=%s"
11+
onboardingTrustedAzureAppPath = "%s/api/secure/onboarding/v2/trustedAzureApp?app=%s"
1112
onboardingTenantExternaIDPath = "%s/api/secure/onboarding/v2/externalID"
1213
onboardingAgentlessScanningAssetsPath = "%s/api/secure/onboarding/v2/agentlessScanningAssets"
1314
)
1415

1516
type OnboardingSecureInterface interface {
1617
Base
1718
GetTrustedCloudIdentitySecure(ctx context.Context, provider string) (string, error)
19+
GetTrustedAzureAppSecure(ctx context.Context, app string) (map[string]string, error)
1820
GetTenantExternalIDSecure(ctx context.Context) (string, error)
19-
GetAgentlessScanningAssetsSecure(ctx context.Context) (map[string]interface{}, error)
21+
GetAgentlessScanningAssetsSecure(ctx context.Context) (map[string]any, error)
2022
}
2123

2224
func (client *Client) GetTrustedCloudIdentitySecure(ctx context.Context, provider string) (string, error) {
@@ -33,6 +35,20 @@ func (client *Client) GetTrustedCloudIdentitySecure(ctx context.Context, provide
3335
return Unmarshal[string](response.Body)
3436
}
3537

38+
func (client *Client) GetTrustedAzureAppSecure(ctx context.Context, app string) (map[string]string, error) {
39+
response, err := client.requester.Request(ctx, http.MethodGet, fmt.Sprintf(onboardingTrustedAzureAppPath, client.config.url, app), nil)
40+
if err != nil {
41+
return nil, err
42+
}
43+
defer response.Body.Close()
44+
45+
if response.StatusCode != http.StatusOK {
46+
return nil, client.ErrorFromResponse(response)
47+
}
48+
49+
return Unmarshal[map[string]string](response.Body)
50+
}
51+
3652
func (client *Client) GetTenantExternalIDSecure(ctx context.Context) (string, error) {
3753
response, err := client.requester.Request(ctx, http.MethodGet, fmt.Sprintf(onboardingTenantExternaIDPath, client.config.url), nil)
3854
if err != nil {

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ func (p *SysdigProvider) Provider() *schema.Provider {
195195
},
196196
DataSourcesMap: map[string]*schema.Resource{
197197
"sysdig_secure_agentless_scanning_assets": dataSourceSysdigSecureAgentlessScanningAssets(),
198+
"sysdig_secure_trusted_azure_app": dataSourceSysdigSecureTrustedAzureApp(),
198199
"sysdig_secure_trusted_cloud_identity": dataSourceSysdigSecureTrustedCloudIdentity(),
199200
"sysdig_secure_tenant_external_id": dataSourceSysdigSecureTenantExternalID(),
200201
"sysdig_secure_notification_channel": dataSourceSysdigSecureNotificationChannel(),
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
subcategory: "Sysdig Secure"
3+
layout: "sysdig"
4+
page_title: "Sysdig: sysdig_secure_trusted_azure_app"
5+
description: |-
6+
Retrieves information about the Sysdig Secure Trusted Azure App
7+
---
8+
9+
# Data Source: sysdig_secure_trusted_azure_app
10+
11+
Retrieves information about the Sysdig Secure Trusted Azure App
12+
13+
-> **Note:** Sysdig Terraform Provider is under rapid development at this point. If you experience any issue or discrepancy while using it, please make sure you have the latest version. If the issue persists, or you have a Feature Request to support an additional set of resources, please open a [new issue](https://github.com/sysdiglabs/terraform-provider-sysdig/issues/new) in the GitHub repository.
14+
15+
## Example Usage
16+
17+
```terraform
18+
data "sysdig_secure_trusted_azure_app" "onboarding" {
19+
name = "onboarding"
20+
}
21+
```
22+
23+
## Argument Reference
24+
25+
* `name` - (Required) Sysdig's Azure App name urrently supported applications are `config_posture`, `onboarding` and `threat_detection`
26+
27+
28+
## Attributes Reference
29+
30+
In addition to all arguments above, the following attributes are exported:
31+
32+
* `tenant_id` - The application's associated tenant identifer
33+
34+
* `application_id` - The application's identifier
35+
36+
* `service_principal_id` - The application's associated service principal identifier.
37+

0 commit comments

Comments
 (0)