Skip to content

Commit edee724

Browse files
feat(cloudtrail): add support for SNS ingestion (#588)
* Add support for CloudTrail SNS ingestion * update tests * update style * update logic to support empty cloudprovider and cloudprovider_id * update docs * remove redundant line and fix comments * update docs
1 parent fa105cf commit edee724

File tree

4 files changed

+51
-12
lines changed

4 files changed

+51
-12
lines changed

sysdig/data_source_sysdig_secure_onboarding.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import (
88
"time"
99

1010
"github.com/aws/aws-sdk-go/aws/arn"
11-
v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2"
1211
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1312
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1413
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
14+
15+
v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2"
1516
)
1617

1718
func getSecureOnboardingClient(c SysdigClients) (v2.OnboardingSecureInterface, error) {
@@ -344,6 +345,15 @@ func dataSourceSysdigSecureCloudIngestionAssets() *schema.Resource {
344345
},
345346

346347
Schema: map[string]*schema.Schema{
348+
"cloud_provider": {
349+
Type: schema.TypeString,
350+
Optional: true,
351+
ValidateFunc: validation.StringInSlice([]string{"aws", "gcp", "azure"}, false),
352+
},
353+
"cloud_provider_id": {
354+
Type: schema.TypeString,
355+
Optional: true,
356+
},
347357
"aws": {
348358
Type: schema.TypeMap,
349359
Computed: true,
@@ -370,18 +380,25 @@ func dataSourceSysdigSecureCloudIngestionAssetsRead(ctx context.Context, d *sche
370380
return diag.FromErr(err)
371381
}
372382

373-
assets, err := client.GetCloudIngestionAssetsSecure(ctx)
383+
assets, err := client.GetCloudIngestionAssetsSecure(ctx, d.Get("cloud_provider").(string), d.Get("cloud_provider_id").(string))
374384
if err != nil {
375385
return diag.FromErr(err)
376386
}
377387

378388
assetsAws, _ := assets["aws"].(map[string]interface{})
379389
assetsGcp, _ := assets["gcp"].(map[string]interface{})
380390

391+
var ingestionURL string
392+
if assetsAws["snsMetadata"] != nil {
393+
ingestionURL = assetsAws["snsMetadata"].(map[string]interface{})["ingestionURL"].(string)
394+
}
395+
381396
d.SetId("cloudIngestionAssets")
382397
err = d.Set("aws", map[string]interface{}{
383-
"eventBusARN": assetsAws["eventBusARN"],
384-
"eventBusARNGov": assetsAws["eventBusARNGov"],
398+
"eventBusARN": assetsAws["eventBusARN"],
399+
"eventBusARNGov": assetsAws["eventBusARNGov"],
400+
"sns_routing_key": assetsAws["snsRoutingKey"],
401+
"sns_routing_url": ingestionURL,
385402
})
386403
if err != nil {
387404
return diag.FromErr(err)
@@ -456,8 +473,10 @@ func dataSourceSysdigSecureTrustedOracleAppRead(ctx context.Context, d *schema.R
456473
return nil
457474
}
458475

459-
var matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)")
460-
var matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])")
476+
var (
477+
matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)")
478+
matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])")
479+
)
461480

462481
func snakeCase(str string) string {
463482
snake := matchFirstCap.ReplaceAllString(str, "${1}_${2}")

sysdig/data_source_sysdig_secure_onboarding_test.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,17 @@ func TestAccCloudIngestionAssetsDataSource(t *testing.T) {
175175
},
176176
},
177177
Steps: []resource.TestStep{
178+
{
179+
Config: `data "sysdig_secure_cloud_ingestion_assets" "assets" {
180+
cloud_provider = "invalid"
181+
cloud_provider_id = "123"
182+
}`,
183+
ExpectError: regexp.MustCompile(`.*expected cloud_provider to be one of.*`),
184+
},
178185
{
179186
Config: `data "sysdig_secure_cloud_ingestion_assets" "assets" {}`,
180187
Check: resource.ComposeTestCheckFunc(
181-
resource.TestCheckResourceAttr("data.sysdig_secure_cloud_ingestion_assets.assets", "aws.%", "2"),
188+
resource.TestCheckResourceAttr("data.sysdig_secure_cloud_ingestion_assets.assets", "aws.%", "4"),
182189
// not asserting the gov exported fields because not every backend environment is gov supported and thus will have empty values
183190

184191
resource.TestCheckResourceAttrSet("data.sysdig_secure_cloud_ingestion_assets.assets", "gcp_routing_key"),
@@ -188,6 +195,16 @@ func TestAccCloudIngestionAssetsDataSource(t *testing.T) {
188195
resource.TestCheckResourceAttrSet("data.sysdig_secure_cloud_ingestion_assets.assets", "gcp_metadata.ingestionURL"),
189196
),
190197
},
198+
{
199+
Config: `data "sysdig_secure_cloud_ingestion_assets" "assets" {
200+
cloud_provider = "aws"
201+
cloud_provider_id = "012345678901"
202+
}`,
203+
Check: resource.ComposeTestCheckFunc(
204+
resource.TestCheckResourceAttrSet("data.sysdig_secure_cloud_ingestion_assets.assets", "aws.sns_routing_key"),
205+
resource.TestCheckResourceAttrSet("data.sysdig_secure_cloud_ingestion_assets.assets", "aws.sns_routing_url"),
206+
),
207+
},
191208
},
192209
})
193210
}

sysdig/internal/client/v2/onboarding.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const (
1111
onboardingTrustedAzureAppPath = "%s/api/secure/onboarding/v2/trustedAzureApp?app=%s"
1212
onboardingTenantExternaIDPath = "%s/api/secure/onboarding/v2/externalID"
1313
onboardingAgentlessScanningAssetsPath = "%s/api/secure/onboarding/v2/agentlessScanningAssets"
14-
onboardingCloudIngestionAssetsPath = "%s/api/secure/onboarding/v2/cloudIngestionAssets"
14+
onboardingCloudIngestionAssetsPath = "%s/api/secure/onboarding/v2/cloudIngestionAssets?provider=%s&providerID=%s"
1515
onboardingTrustedRegulationAssetsPath = "%s/api/secure/onboarding/v2/trustedRegulationAssets?provider=%s"
1616
onboardingTrustedOracleAppPath = "%s/api/secure/onboarding/v2/trustedOracleApp?app=%s"
1717
)
@@ -22,7 +22,7 @@ type OnboardingSecureInterface interface {
2222
GetTrustedAzureAppSecure(ctx context.Context, app string) (map[string]string, error)
2323
GetTenantExternalIDSecure(ctx context.Context) (string, error)
2424
GetAgentlessScanningAssetsSecure(ctx context.Context) (map[string]any, error)
25-
GetCloudIngestionAssetsSecure(ctx context.Context) (map[string]any, error)
25+
GetCloudIngestionAssetsSecure(ctx context.Context, provider, providerID string) (map[string]any, error)
2626
GetTrustedCloudRegulationAssetsSecure(ctx context.Context, provider string) (map[string]string, error)
2727
GetTrustedOracleAppSecure(ctx context.Context, app string) (map[string]string, error)
2828
}
@@ -83,8 +83,8 @@ func (client *Client) GetAgentlessScanningAssetsSecure(ctx context.Context) (map
8383
return Unmarshal[map[string]interface{}](response.Body)
8484
}
8585

86-
func (client *Client) GetCloudIngestionAssetsSecure(ctx context.Context) (map[string]interface{}, error) {
87-
response, err := client.requester.Request(ctx, http.MethodGet, fmt.Sprintf(onboardingCloudIngestionAssetsPath, client.config.url), nil)
86+
func (client *Client) GetCloudIngestionAssetsSecure(ctx context.Context, provider, providerID string) (map[string]interface{}, error) {
87+
response, err := client.requester.Request(ctx, http.MethodGet, fmt.Sprintf(onboardingCloudIngestionAssetsPath, client.config.url, provider, providerID), nil)
8888
if err != nil {
8989
return nil, err
9090
}

website/docs/d/secure_cloud_ingestion_assets.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ In addition to all arguments above, the following attributes are exported:
2828

2929
* `aws.eventBusARNGov` - AWS Gov event bus (if supported) from which Sysdig Cloud Ingestion operates
3030

31+
* `aws.sns_routing_key` - AWS CloudTrail SNS ingestion routing key
32+
33+
* `aws.sns_routing_url` - AWS CloudTrail SNS ingestion URL
34+
3135
* `gcp_routing_key` - GCP ingestion routing key
3236

3337
* `gcp_metadata` - GCP ingestion metadata
34-

0 commit comments

Comments
 (0)