Skip to content

Commit 740b2d2

Browse files
feat(accept-risk) accept posture risk (#556)
* accept posture risk * fix name * fix * fix * Refactor attribute section in secure posture accept risk documentation * fix test * fix * fix * open the option to put expires_at * ExpiresAt must be in the future * fix docs * fix * fix * fix * add fix
1 parent 8633c57 commit 740b2d2

File tree

8 files changed

+645
-0
lines changed

8 files changed

+645
-0
lines changed

sysdig/common.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ const (
88
SchemaAuthorsKey = "authors"
99
SchemaAuthorKey = "author"
1010
SchemaNameKey = "name"
11+
SchemaAcceptanceIDKey = "acceptance_id"
12+
SchemaControlNameKey = "control_name"
13+
SchemaZoneNameKey = "zone_name"
1114
SchemaEnabledKey = "enabled"
1215
SchemaStatusKey = "status"
1316
SchemaTypeKey = "type"
@@ -17,6 +20,16 @@ const (
1720
SchemaResourceRemediationDetailsKey = "remediation_details"
1821
SchemaKindKey = "kind"
1922
SchemaDescriptionKey = "description"
23+
SchemaFilterKey = "filter"
24+
SchemaExpiresInKey = "expires_in"
25+
SchemaExpiresAtKey = "expires_at"
26+
SchemaAcceptanceDateKey = "acceptance_date"
27+
SchemaIsExpiredKey = "is_expired"
28+
SchemaIsSystemKey = "is_system"
29+
SchemaUsernameKey = "username"
30+
SchemaAcceptPeriodKey = "accept_period"
31+
SchemaEndTimeKey = "end_time"
32+
SchemaReasonKey = "reason"
2033
SchemaVersionKey = "version"
2134
SchemaLinkKey = "link"
2235
SchemaGroupKey = "group"

sysdig/internal/client/v2/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ type SecureCommon interface {
5858
PosturePolicyInterface
5959
PostureZoneInterface
6060
PostureControlInterface
61+
PostureAcceptRiskInterface
6162
}
6263

6364
type Requester interface {

sysdig/internal/client/v2/model_posture_control.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,54 @@ type PostureControl struct {
2323
Rego string `json:"rego"`
2424
RemediationDetails string `json:"remediationDetails"`
2525
}
26+
27+
type AccepetPostureRiskRequest struct {
28+
AcceptanceID string `json:"id"`
29+
ControlName string `json:"controlName"`
30+
ZoneName string `json:"zoneName"`
31+
Description string `json:"description"`
32+
Filter string `json:"filter"`
33+
Reason string `json:"reason"`
34+
ExpiresAt string `json:"expiresAt"`
35+
}
36+
37+
type UpdateAccepetPostureRiskRequest struct {
38+
AcceptanceID string `json:"id"`
39+
Acceptance UpdateAcceptPostureRiskFields `json:"riskAcceptance"`
40+
}
41+
42+
type UpdateAccepetPostureResponse struct {
43+
Acceptance AcceptPostureRisk `json:"riskAcceptance"`
44+
}
45+
46+
type AcceptPostureRisk struct {
47+
AcceptanceID string `json:"id"`
48+
ControlName string `json:"controlName"`
49+
ZoneName string `json:"zoneName"`
50+
Description string `json:"description"`
51+
Filter string `json:"filter"`
52+
Reason string `json:"reason"`
53+
ExpiresAt string `json:"expiresAt"`
54+
AcceeptanceDate string `json:"acceptanceDate"`
55+
UserName string `json:"username"`
56+
Type string `json:"type"`
57+
IsExpired bool `json:"isExpired"`
58+
IsSystem bool `json:"isSystem"`
59+
AcceptPeriod string `json:"acceptPeriod"`
60+
}
61+
62+
type UpdateAcceptPostureRiskFields struct {
63+
Description string `json:"description"`
64+
Reason string `json:"reason"`
65+
ExpiresAt string `json:"expiresAt"`
66+
AcceptPeriod string `json:"acceptPeriod"`
67+
}
68+
69+
type AcceptPostureRiskResponse struct {
70+
Data AcceptPostureRisk `json:"data"`
71+
}
72+
73+
type DeleteAcceptPostureRisk struct {
74+
AcceptanceID string `json:"id"`
75+
Filter string `json:"filter"`
76+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package v2
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/http"
7+
)
8+
9+
const (
10+
AcceptPostureRiskCreatePath = "%s/api/cspm/v1/compliance/risk-acceptances"
11+
AcceptPostureRiskGetPath = "%s/api/cspm/v1/compliance/risk-acceptances/%s"
12+
AcceptPostureRiskDelete = "%s/api/cspm/v1/compliance/violations/revoke"
13+
AcceptPostureRiskUpdate = "%s/api/cspm/v1/compliance/risk-acceptances/%s"
14+
)
15+
16+
type PostureAcceptRiskInterface interface {
17+
Base
18+
SaveAcceptPostureRisk(ctx context.Context, p *AccepetPostureRiskRequest) (*AcceptPostureRiskResponse, string, error)
19+
GetAcceptancePostureRisk(ctx context.Context, id string) (*AcceptPostureRiskResponse, string, error)
20+
DeleteAcceptancePostureRisk(ctx context.Context, p *DeleteAcceptPostureRisk) error
21+
UpdateAcceptancePostureRisk(ctx context.Context, p *UpdateAccepetPostureRiskRequest) (*AcceptPostureRisk, string, error)
22+
}
23+
24+
func (c *Client) SaveAcceptPostureRisk(ctx context.Context, p *AccepetPostureRiskRequest) (*AcceptPostureRiskResponse, string, error) {
25+
payload, err := Marshal(p)
26+
if err != nil {
27+
return nil, "", err
28+
}
29+
response, err := c.requester.Request(ctx, http.MethodPost, c.getPostureControlURL(AcceptPostureRiskCreatePath), payload)
30+
if err != nil {
31+
return nil, "", err
32+
}
33+
34+
defer response.Body.Close()
35+
if response.StatusCode != http.StatusOK && response.StatusCode != http.StatusCreated {
36+
errStatus, err := c.ErrorAndStatusFromResponse(response)
37+
return nil, errStatus, err
38+
}
39+
resp, err := Unmarshal[AcceptPostureRiskResponse](response.Body)
40+
41+
if err != nil {
42+
return nil, "", err
43+
}
44+
45+
return &resp, "", nil
46+
}
47+
48+
func (c *Client) GetAcceptancePostureRisk(ctx context.Context, id string) (*AcceptPostureRiskResponse, string, error) {
49+
response, err := c.requester.Request(ctx, http.MethodGet, fmt.Sprintf(AcceptPostureRiskGetPath, c.config.url, id), nil)
50+
if err != nil {
51+
return nil, "", err
52+
}
53+
defer response.Body.Close()
54+
55+
if response.StatusCode != http.StatusOK {
56+
errStatus, err := c.ErrorAndStatusFromResponse(response)
57+
return nil, errStatus, err
58+
}
59+
60+
wrapper, err := Unmarshal[AcceptPostureRiskResponse](response.Body)
61+
if err != nil {
62+
return nil, "", err
63+
}
64+
return &wrapper, "", nil
65+
}
66+
67+
func (c *Client) DeleteAcceptancePostureRisk(ctx context.Context, p *DeleteAcceptPostureRisk) error {
68+
payload, err := Marshal(p)
69+
if err != nil {
70+
return err
71+
}
72+
73+
response, err := c.requester.Request(ctx, http.MethodPost, fmt.Sprintf(AcceptPostureRiskDelete, c.config.url), payload)
74+
if err != nil {
75+
return err
76+
}
77+
defer response.Body.Close()
78+
79+
if response.StatusCode != http.StatusNoContent && response.StatusCode != http.StatusOK && response.StatusCode != http.StatusNotFound {
80+
return c.ErrorFromResponse(response)
81+
}
82+
83+
return nil
84+
}
85+
86+
func (c *Client) UpdateAcceptancePostureRisk(ctx context.Context, p *UpdateAccepetPostureRiskRequest) (*AcceptPostureRisk, string, error) {
87+
payload, err := Marshal(p)
88+
if err != nil {
89+
return nil, "", err
90+
}
91+
response, err := c.requester.Request(ctx, http.MethodPatch, fmt.Sprintf(AcceptPostureRiskUpdate, c.config.url, p.AcceptanceID), payload)
92+
if err != nil {
93+
return nil, "", err
94+
}
95+
defer response.Body.Close()
96+
if response.StatusCode != http.StatusOK && response.StatusCode != http.StatusCreated {
97+
errStatus, err := c.ErrorAndStatusFromResponse(response)
98+
return nil, errStatus, err
99+
}
100+
resp, err := Unmarshal[AcceptPostureRiskResponse](response.Body)
101+
if err != nil {
102+
return nil, "", err
103+
}
104+
105+
return &resp.Data, "", nil
106+
}

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ func (p *SysdigProvider) Provider() *schema.Provider {
196196
"sysdig_secure_organization": resourceSysdigSecureOrganization(),
197197
"sysdig_secure_posture_policy": resourceSysdigSecurePosturePolicy(),
198198
"sysdig_secure_posture_control": resourceSysdigSecurePostureControl(),
199+
"sysdig_secure_posture_accept_risk": resourceSysdigSecureAcceptPostureRisk(),
199200
},
200201
DataSourcesMap: map[string]*schema.Resource{
201202
"sysdig_secure_agentless_scanning_assets": dataSourceSysdigSecureAgentlessScanningAssets(),

0 commit comments

Comments
 (0)