Skip to content

Commit 3b305fd

Browse files
authored
Merge branch 'master' into feat-implement-sysdig-secure-accept-vulnerability-risk
2 parents d980522 + e33ed88 commit 3b305fd

12 files changed

+1375
-400
lines changed

sysdig/data_source_sysdig_secure_onboarding.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,62 @@ func dataSourceSysdigSecureCloudIngestionAssetsRead(ctx context.Context, d *sche
400400
return nil
401401
}
402402

403+
func dataSourceSysdigSecureTrustedOracleApp() *schema.Resource {
404+
timeout := 5 * time.Minute
405+
406+
return &schema.Resource{
407+
ReadContext: dataSourceSysdigSecureTrustedOracleAppRead,
408+
409+
Timeouts: &schema.ResourceTimeout{
410+
Read: schema.DefaultTimeout(timeout),
411+
},
412+
413+
Schema: map[string]*schema.Schema{
414+
"name": {
415+
Type: schema.TypeString,
416+
Required: true,
417+
ValidateFunc: validation.StringInSlice([]string{"config_posture", "onboarding"}, false),
418+
},
419+
"tenancy_ocid": {
420+
Type: schema.TypeString,
421+
Computed: true,
422+
},
423+
"group_ocid": {
424+
Type: schema.TypeString,
425+
Computed: true,
426+
},
427+
"user_ocid": {
428+
Type: schema.TypeString,
429+
Computed: true,
430+
},
431+
},
432+
}
433+
}
434+
435+
// Retrieves the information of a resource from the file and loads it in Terraform
436+
func dataSourceSysdigSecureTrustedOracleAppRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
437+
client, err := getSecureOnboardingClient(meta.(SysdigClients))
438+
if err != nil {
439+
return diag.FromErr(err)
440+
}
441+
442+
app := d.Get("name").(string)
443+
trustedIdentityGroup, err := client.GetTrustedOracleAppSecure(ctx, app)
444+
if err != nil {
445+
return diag.FromErr(err)
446+
}
447+
d.SetId(app)
448+
for k, v := range trustedIdentityGroup {
449+
fmt.Printf("%s, %s\n", k, snakeCase(k))
450+
err = d.Set(snakeCase(k), v)
451+
if err != nil {
452+
return diag.FromErr(err)
453+
}
454+
}
455+
456+
return nil
457+
}
458+
403459
var matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)")
404460
var matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])")
405461

sysdig/data_source_sysdig_secure_onboarding_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,44 @@ func TestAccCloudIngestionAssetsDataSource(t *testing.T) {
191191
},
192192
})
193193
}
194+
195+
func TestAccTrustedOracleAppDataSource(t *testing.T) {
196+
resource.ParallelTest(t, resource.TestCase{
197+
PreCheck: func() {
198+
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
199+
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
200+
}
201+
},
202+
ProviderFactories: map[string]func() (*schema.Provider, error){
203+
"sysdig": func() (*schema.Provider, error) {
204+
return sysdig.Provider(), nil
205+
},
206+
},
207+
Steps: []resource.TestStep{
208+
{
209+
Config: `data "sysdig_secure_trusted_oracle_app" "invalid" { name = "invalid" }`,
210+
ExpectError: regexp.MustCompile(`.*expected name to be one of.*`),
211+
},
212+
{
213+
Config: `data "sysdig_secure_trusted_oracle_app" "config_posture" { name = "config_posture" }`,
214+
Check: resource.ComposeTestCheckFunc(
215+
resource.TestCheckResourceAttr("data.sysdig_secure_trusted_oracle_app.config_posture", "name", "config_posture"),
216+
// not asserting the oci exported fields because not every backend environment is oci supported yet and thus will have empty values
217+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_oracle_app.config_posture", "tenancy_ocid"), // uncomment to assert a non empty value
218+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_oracle_app.config_posture", "group_ocid"), // uncomment to assert a non empty value
219+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_oracle_app.config_posture", "user_ocid"), // uncomment to assert a non empty value
220+
),
221+
},
222+
{
223+
Config: `data "sysdig_secure_trusted_oracle_app" "onboarding" { name = "onboarding" }`,
224+
Check: resource.ComposeTestCheckFunc(
225+
resource.TestCheckResourceAttr("data.sysdig_secure_trusted_oracle_app.onboarding", "name", "onboarding"),
226+
// not asserting the oci exported fields because not every backend environment is oci supported yet and thus will have empty values
227+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_oracle_app.onboarding", "tenancy_ocid"), // uncomment to assert a non empty value
228+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_oracle_app.onboarding", "group_ocid"), // uncomment to assert a non empty value
229+
// resource.TestCheckResourceAttrSet("data.sysdig_secure_trusted_oracle_app.onboarding", "user_ocid"), // uncomment to assert a non empty value
230+
),
231+
},
232+
},
233+
})
234+
}

sysdig/internal/client/v2/cloud_account.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ const (
1212
cloudAccountPath = "%s/api/cloud/v2/accounts/%s"
1313
cloudAccountWithExternalIDPath = "%s/api/cloud/v2/accounts/%s?includeExternalID=true"
1414
providersPath = "%v/api/v2/providers"
15+
costCloudAccountPath = "%s/api/cloudaccount"
16+
costProviderURL = "%s/api/cloudaccount/features/cost/account?id=%d"
17+
updateCostProviderURL = "%s/api/cloudaccount/features/cost"
1518
)
1619

1720
type CloudAccountSecureInterface interface {
@@ -25,8 +28,11 @@ type CloudAccountSecureInterface interface {
2528
type CloudAccountMonitorInterface interface {
2629
Base
2730
CreateCloudAccountMonitor(ctx context.Context, provider *CloudAccountMonitor) (*CloudAccountMonitor, error)
31+
CreateCloudAccountMonitorForCost(ctx context.Context, provider *CloudAccountMonitorForCost) (*CloudAccountCreatedForCost, error)
2832
UpdateCloudAccountMonitor(ctx context.Context, id int, provider *CloudAccountMonitor) (*CloudAccountMonitor, error)
33+
UpdateCloudAccountMonitorForCost(ctx context.Context, provider *CloudAccountCostProvider) (*CloudAccountCostProvider, error)
2934
GetCloudAccountMonitor(ctx context.Context, id int) (*CloudAccountMonitor, error)
35+
GetCloudAccountMonitorForCost(ctx context.Context, id int) (*CloudAccountCostProvider, error)
3036
DeleteCloudAccountMonitor(ctx context.Context, id int) error
3137
}
3238

@@ -135,6 +141,30 @@ func (client *Client) CreateCloudAccountMonitor(ctx context.Context, provider *C
135141
return &wrapper.CloudAccount, nil
136142
}
137143

144+
func (client *Client) CreateCloudAccountMonitorForCost(ctx context.Context, provider *CloudAccountMonitorForCost) (*CloudAccountCreatedForCost, error) {
145+
payload, err := Marshal(provider)
146+
if err != nil {
147+
return nil, err
148+
}
149+
150+
response, err := client.requester.Request(ctx, http.MethodPost, client.getCostProvidersURL(), payload)
151+
if err != nil {
152+
return nil, err
153+
}
154+
defer response.Body.Close()
155+
156+
if response.StatusCode != http.StatusOK {
157+
return nil, client.ErrorFromResponse(response)
158+
}
159+
160+
wrapper, err := Unmarshal[CloudAccountCreatedForCost](response.Body)
161+
if err != nil {
162+
return nil, err
163+
}
164+
165+
return &wrapper, nil
166+
}
167+
138168
func (client *Client) UpdateCloudAccountMonitor(ctx context.Context, id int, provider *CloudAccountMonitor) (*CloudAccountMonitor, error) {
139169
payload, err := Marshal(provider)
140170
if err != nil {
@@ -159,6 +189,30 @@ func (client *Client) UpdateCloudAccountMonitor(ctx context.Context, id int, pro
159189
return &wrapper.CloudAccount, nil
160190
}
161191

192+
func (client *Client) UpdateCloudAccountMonitorForCost(ctx context.Context, provider *CloudAccountCostProvider) (*CloudAccountCostProvider, error) {
193+
payload, err := Marshal(provider)
194+
if err != nil {
195+
return nil, err
196+
}
197+
198+
response, err := client.requester.Request(ctx, http.MethodPut, client.getUpdateCostProviderURL(), payload)
199+
if err != nil {
200+
return nil, err
201+
}
202+
defer response.Body.Close()
203+
204+
if response.StatusCode != http.StatusOK {
205+
return nil, client.ErrorFromResponse(response)
206+
}
207+
208+
wrapper, err := Unmarshal[CloudAccountCostProviderWrapper](response.Body)
209+
if err != nil {
210+
return nil, err
211+
}
212+
213+
return &wrapper.CloudAccountCostProvider, nil
214+
}
215+
162216
func (client *Client) GetCloudAccountMonitor(ctx context.Context, id int) (*CloudAccountMonitor, error) {
163217
response, err := client.requester.Request(ctx, http.MethodGet, client.getProviderURL(id), nil)
164218
if err != nil {
@@ -178,6 +232,25 @@ func (client *Client) GetCloudAccountMonitor(ctx context.Context, id int) (*Clou
178232
return &wrapper.CloudAccount, nil
179233
}
180234

235+
func (client *Client) GetCloudAccountMonitorForCost(ctx context.Context, id int) (*CloudAccountCostProvider, error) {
236+
response, err := client.requester.Request(ctx, http.MethodGet, client.getCostProviderURL(id), nil)
237+
if err != nil {
238+
return nil, err
239+
}
240+
defer response.Body.Close()
241+
242+
if response.StatusCode != http.StatusOK {
243+
return nil, client.ErrorFromResponse(response)
244+
}
245+
246+
wrapper, err := Unmarshal[CloudAccountCostProviderWrapper](response.Body)
247+
if err != nil {
248+
return nil, err
249+
}
250+
251+
return &wrapper.CloudAccountCostProvider, nil
252+
}
253+
181254
func (client *Client) DeleteCloudAccountMonitor(ctx context.Context, id int) error {
182255
response, err := client.requester.Request(ctx, http.MethodDelete, client.getProviderURL(id), nil)
183256
if err != nil {
@@ -199,3 +272,15 @@ func (client *Client) getProviderURL(id int) string {
199272
func (client *Client) getProvidersURL() string {
200273
return fmt.Sprintf(providersPath, client.config.url)
201274
}
275+
276+
func (client *Client) getCostProvidersURL() string {
277+
return fmt.Sprintf(costCloudAccountPath, client.config.url)
278+
}
279+
280+
func (client *Client) getCostProviderURL(id int) string {
281+
return fmt.Sprintf(costProviderURL, client.config.url, id)
282+
}
283+
284+
func (client *Client) getUpdateCostProviderURL() string {
285+
return fmt.Sprintf(updateCostProviderURL, client.config.url)
286+
}

0 commit comments

Comments
 (0)