Skip to content

Commit 9626096

Browse files
feat(policy): add custom control (#530)
* add crud for posture control * add docs * fix * add test * remove * fix * fix test * add acceptance --------- Co-authored-by: hila1608 <[email protected]>
1 parent daf27af commit 9626096

9 files changed

+478
-69
lines changed

sysdig/common.go

+72-68
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,76 @@
11
package sysdig
22

33
const (
4-
SchemaIDKey = "id"
5-
SchemaTeamIDKey = "team_id"
6-
SchemaPoliciesKey = "policies"
7-
SchemaPolicyIDsKey = "policy_ids"
8-
SchemaAuthorsKey = "authors"
9-
SchemaAuthorKey = "author"
10-
SchemaNameKey = "name"
11-
SchemaEnabledKey = "enabled"
12-
SchemaStatusKey = "status"
13-
SchemaTypeKey = "type"
14-
SchemaKindKey = "kind"
15-
SchemaDescriptionKey = "description"
16-
SchemaVersionKey = "version"
17-
SchemaLinkKey = "link"
18-
SchemaGroupKey = "group"
19-
SchemaLastModifiedBy = "last_modified_by"
20-
SchemaLastUpdated = "last_updated"
21-
SchemaExpirationDateKey = "expiration_date"
22-
SchemaPublishedDateKey = "published_date"
23-
SchemaCreatedDateKey = "date_created"
24-
SchemaMinKubeVersionKey = "min_kube_version"
25-
SchemaMaxKubeVersionKey = "max_kube_version"
26-
SchemaIsCustomKey = "is_custom"
27-
SchemaIsActiveKey = "is_active"
28-
SchemaPlatformKey = "platform"
29-
SchemaZonesKey = "zones"
30-
SchemaZonesIDsKey = "zone_ids"
31-
SchemaAllZones = "all_zones"
32-
SchemaScopeKey = "scope"
33-
SchemaScopesKey = "scopes"
34-
SchemaTargetTypeKey = "target_type"
35-
SchemaRoleKey = "role"
36-
SchemaSystemRoleKey = "system_role"
37-
SchemaRulesKey = "rules"
38-
SchemaApiKeyKey = "api_key"
39-
SchemaPermissionsKey = "permissions"
40-
SchemaMonitorPermKey = "monitor_permissions"
41-
SchemaSecurePermKey = "secure_permissions"
42-
SchemaRequestedPermKey = "requested_permissions"
43-
SchemaEnrichedPermKey = "enriched_permissions"
44-
SchemaSecureThreatDetection = "secure_threat_detection"
45-
SchemaSecureConfigPosture = "secure_config_posture"
46-
SchemaSecureIdentityEntitlement = "secure_identity_entitlement"
47-
SchemaSecureAgentlessScanning = "secure_agentless_scanning"
48-
SchemaMonitorCloudMetrics = "monitor_cloud_metrics"
49-
SchemaType = "type"
50-
SchemaInstance = "instance"
51-
SchemaVersion = "version"
52-
SchemaCloudConnectorMetadata = "cloud_connector_metadata"
53-
SchemaTrustedRoleMetadata = "trusted_role_metadata"
54-
SchemaEventBridgeMetadata = "event_bridge_metadata"
55-
SchemaServicePrincipalMetadata = "service_principal_metadata"
56-
SchemaWebhookDatasourceMetadata = "webhook_datasource_metadata"
57-
SchemaCryptoKeyMetadata = "crypto_key_metadata"
58-
SchemaCloudLogsMetadata = "cloud_logs_metadata"
59-
SchemaEnabled = "enabled"
60-
SchemaComponents = "components"
61-
SchemaComponent = "component"
62-
SchemaCloudProviderId = "provider_id"
63-
SchemaCloudProviderType = "provider_type"
64-
SchemaFeature = "feature"
65-
SchemaManagementAccountId = "management_account_id"
66-
SchemaOrganizationIDKey = "organization_id"
67-
SchemaOrganizationalUnitIds = "organizational_unit_ids"
68-
SchemaCloudProviderTenantId = "provider_tenant_id"
69-
SchemaCloudProviderAlias = "provider_alias"
70-
SchemaAccountId = "account_id"
71-
SchemaFeatureFlags = "flags"
4+
SchemaIDKey = "id"
5+
SchemaTeamIDKey = "team_id"
6+
SchemaPoliciesKey = "policies"
7+
SchemaPolicyIDsKey = "policy_ids"
8+
SchemaAuthorsKey = "authors"
9+
SchemaAuthorKey = "author"
10+
SchemaNameKey = "name"
11+
SchemaEnabledKey = "enabled"
12+
SchemaStatusKey = "status"
13+
SchemaTypeKey = "type"
14+
SchemaResourceKindKey = "resource_kind"
15+
SchemaResourceRegoKey = "rego"
16+
SchemaResourceSeverityKey = "severity"
17+
SchemaResourceRemediationDetailsKey = "remediation_details"
18+
SchemaKindKey = "kind"
19+
SchemaDescriptionKey = "description"
20+
SchemaVersionKey = "version"
21+
SchemaLinkKey = "link"
22+
SchemaGroupKey = "group"
23+
SchemaLastModifiedBy = "last_modified_by"
24+
SchemaLastUpdated = "last_updated"
25+
SchemaExpirationDateKey = "expiration_date"
26+
SchemaPublishedDateKey = "published_date"
27+
SchemaCreatedDateKey = "date_created"
28+
SchemaMinKubeVersionKey = "min_kube_version"
29+
SchemaMaxKubeVersionKey = "max_kube_version"
30+
SchemaIsCustomKey = "is_custom"
31+
SchemaIsActiveKey = "is_active"
32+
SchemaPlatformKey = "platform"
33+
SchemaZonesKey = "zones"
34+
SchemaZonesIDsKey = "zone_ids"
35+
SchemaAllZones = "all_zones"
36+
SchemaScopeKey = "scope"
37+
SchemaScopesKey = "scopes"
38+
SchemaTargetTypeKey = "target_type"
39+
SchemaRoleKey = "role"
40+
SchemaSystemRoleKey = "system_role"
41+
SchemaRulesKey = "rules"
42+
SchemaApiKeyKey = "api_key"
43+
SchemaPermissionsKey = "permissions"
44+
SchemaMonitorPermKey = "monitor_permissions"
45+
SchemaSecurePermKey = "secure_permissions"
46+
SchemaRequestedPermKey = "requested_permissions"
47+
SchemaEnrichedPermKey = "enriched_permissions"
48+
SchemaSecureThreatDetection = "secure_threat_detection"
49+
SchemaSecureConfigPosture = "secure_config_posture"
50+
SchemaSecureIdentityEntitlement = "secure_identity_entitlement"
51+
SchemaSecureAgentlessScanning = "secure_agentless_scanning"
52+
SchemaMonitorCloudMetrics = "monitor_cloud_metrics"
53+
SchemaType = "type"
54+
SchemaInstance = "instance"
55+
SchemaVersion = "version"
56+
SchemaCloudConnectorMetadata = "cloud_connector_metadata"
57+
SchemaTrustedRoleMetadata = "trusted_role_metadata"
58+
SchemaEventBridgeMetadata = "event_bridge_metadata"
59+
SchemaServicePrincipalMetadata = "service_principal_metadata"
60+
SchemaWebhookDatasourceMetadata = "webhook_datasource_metadata"
61+
SchemaCryptoKeyMetadata = "crypto_key_metadata"
62+
SchemaCloudLogsMetadata = "cloud_logs_metadata"
63+
SchemaEnabled = "enabled"
64+
SchemaComponents = "components"
65+
SchemaComponent = "component"
66+
SchemaCloudProviderId = "provider_id"
67+
SchemaCloudProviderType = "provider_type"
68+
SchemaFeature = "feature"
69+
SchemaManagementAccountId = "management_account_id"
70+
SchemaOrganizationIDKey = "organization_id"
71+
SchemaOrganizationalUnitIds = "organizational_unit_ids"
72+
SchemaCloudProviderTenantId = "provider_tenant_id"
73+
SchemaCloudProviderAlias = "provider_alias"
74+
SchemaAccountId = "account_id"
75+
SchemaFeatureFlags = "flags"
7276
)

sysdig/internal/client/v2/client.go

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type MonitorCommon interface {
5757
type SecureCommon interface {
5858
PosturePolicyInterface
5959
PostureZoneInterface
60+
PostureControlInterface
6061
}
6162

6263
type Requester interface {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package v2
2+
3+
type SaveControlRequest struct {
4+
ID string `json:"id,omitempty"`
5+
Name string `json:"name"`
6+
Description string `json:"description"`
7+
ResourceKind string `json:"resourceKind"`
8+
Severity string `json:"severity"`
9+
Rego string `json:"rego"`
10+
RemediationDetails string `json:"remediationDetails"`
11+
}
12+
13+
type SaveControlResponse struct {
14+
Data PostureControl `json:"data"`
15+
}
16+
17+
type PostureControl struct {
18+
ID string `json:"id"`
19+
Name string `json:"name"`
20+
Description string `json:"description"`
21+
ResourceKind string `json:"resourceKind"`
22+
Severity string `json:"severity"`
23+
Rego string `json:"rego"`
24+
RemediationDetails string `json:"remediationDetails"`
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package v2
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/http"
7+
)
8+
9+
const (
10+
PostureControlSavePath = "%s/api/cspm/v1/policy/controls"
11+
PostureControlGetPath = "%s/api/cspm/v1/policy/controls/view/%d"
12+
PostureControlDeletePath = "%s/api/cspm/v1/policy/controls/%d"
13+
)
14+
15+
type PostureControlInterface interface {
16+
Base
17+
CreateOrUpdatePostureControl(ctx context.Context, p *SaveControlRequest) (*PostureControl, string, error)
18+
GetPostureControl(ctx context.Context, id int64) (*PostureControl, error)
19+
DeletePostureControl(ctx context.Context, id int64) error
20+
}
21+
22+
func (c *Client) CreateOrUpdatePostureControl(ctx context.Context, p *SaveControlRequest) (*PostureControl, string, error) {
23+
payload, err := Marshal(p)
24+
if err != nil {
25+
return nil, "", err
26+
}
27+
response, err := c.requester.Request(ctx, http.MethodPost, c.getPostureControlURL(PostureControlSavePath), payload)
28+
if err != nil {
29+
return nil, "", err
30+
}
31+
defer response.Body.Close()
32+
if response.StatusCode != http.StatusOK && response.StatusCode != http.StatusCreated {
33+
errStatus, err := c.ErrorAndStatusFromResponse(response)
34+
return nil, errStatus, err
35+
}
36+
resp, err := Unmarshal[SaveControlResponse](response.Body)
37+
if err != nil {
38+
return nil, "", err
39+
}
40+
return &resp.Data, "", nil
41+
42+
}
43+
44+
func (c *Client) GetPostureControl(ctx context.Context, id int64) (*PostureControl, error) {
45+
response, err := c.requester.Request(ctx, http.MethodGet, fmt.Sprintf(PostureControlGetPath, c.config.url, id), nil)
46+
if err != nil {
47+
return nil, err
48+
}
49+
defer response.Body.Close()
50+
51+
wrapper, err := Unmarshal[SaveControlResponse](response.Body)
52+
if err != nil {
53+
return nil, err
54+
}
55+
return &wrapper.Data, nil
56+
}
57+
58+
func (c *Client) DeletePostureControl(ctx context.Context, id int64) error {
59+
response, err := c.requester.Request(ctx, http.MethodDelete, fmt.Sprintf(PostureControlDeletePath, c.config.url, id), nil)
60+
if err != nil {
61+
return err
62+
}
63+
defer response.Body.Close()
64+
65+
if response.StatusCode != http.StatusNoContent && response.StatusCode != http.StatusOK && response.StatusCode != http.StatusNotFound {
66+
return c.ErrorFromResponse(response)
67+
}
68+
69+
return nil
70+
}
71+
func (c *Client) getPostureControlURL(path string) string {
72+
return fmt.Sprintf(path, c.config.url)
73+
}

sysdig/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ func (p *SysdigProvider) Provider() *schema.Provider {
193193
"sysdig_secure_posture_zone": resourceSysdigSecurePostureZone(),
194194
"sysdig_secure_organization": resourceSysdigSecureOrganization(),
195195
"sysdig_secure_posture_policy": resourceSysdigSecurePosturePolicy(),
196+
"sysdig_secure_posture_control": resourceSysdigSecurePostureControl(),
196197
},
197198
DataSourcesMap: map[string]*schema.Resource{
198199
"sysdig_secure_agentless_scanning_assets": dataSourceSysdigSecureAgentlessScanningAssets(),

0 commit comments

Comments
 (0)