Skip to content

Commit d980522

Browse files
committed
feat: implement sysdig_secure_accept_vulnerability_risk resource
1 parent 358a8d0 commit d980522

File tree

6 files changed

+806
-0
lines changed

6 files changed

+806
-0
lines changed

sysdig/internal/client/v2/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ type SecureCommon interface {
5959
PostureZoneInterface
6060
PostureControlInterface
6161
PostureAcceptRiskInterface
62+
PostureVulnerabilityAcceptRiskInterface
6263
}
6364

6465
type Requester interface {
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package v2
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
type (
9+
EntityType string
10+
ReasonType string
11+
StatusType string
12+
StageType string
13+
ContextType string
14+
)
15+
16+
const (
17+
EntityTypeImageName EntityType = "imageName"
18+
EntityTypeImagePrefix EntityType = "imagePrefix"
19+
EntityTypeImageSuffix EntityType = "imageSuffix"
20+
EntityTypeImageNameContains EntityType = "imageNameContains"
21+
EntityTypeVulnerability EntityType = "vulnerability"
22+
EntityTypeHostName EntityType = "hostName"
23+
EntityTypeHostNameContains EntityType = "hostNameContains"
24+
EntityTypePolicyRule EntityType = "policyRule"
25+
)
26+
27+
const (
28+
ReasonRiskTransferred ReasonType = "RiskTransferred"
29+
ReasonRiskAvoided ReasonType = "RiskAvoided"
30+
ReasonRiskMitigated ReasonType = "RiskMitigated"
31+
ReasonRiskOwned ReasonType = "RiskOwned"
32+
ReasonRiskNotRelevant ReasonType = "RiskNotRelevant"
33+
ReasonCustom ReasonType = "Custom"
34+
)
35+
36+
func ReasonTypeFromString(value string) (ReasonType, error) {
37+
t := ReasonType(value)
38+
switch t {
39+
case ReasonRiskTransferred, ReasonRiskAvoided, ReasonRiskMitigated, ReasonRiskOwned, ReasonRiskNotRelevant, ReasonCustom:
40+
return t, nil
41+
default:
42+
return "", fmt.Errorf("unsupported reason type: %s", value)
43+
}
44+
}
45+
46+
const (
47+
StatusActive StatusType = "active"
48+
StatusExpired StatusType = "expired"
49+
)
50+
51+
const (
52+
ContextTypeImageName ContextType = "imageName"
53+
ContextTypeImagePrefix ContextType = "imagePrefix"
54+
ContextTypeImageSuffix ContextType = "imageSuffix"
55+
ContextTypeImageNameContains ContextType = "imageNameContains"
56+
ContextTypeHostName ContextType = "hostName"
57+
ContextTypeHostNameContains ContextType = "hostNameContains"
58+
ContextTypePackageName ContextType = "packageName"
59+
ContextTypePackageVersion ContextType = "packageVersion"
60+
)
61+
62+
type AcceptVulnerabilityRiskRequest struct {
63+
EntityType EntityType `json:"entityType"`
64+
EntityValue string `json:"entityValue"`
65+
Reason ReasonType `json:"reason"`
66+
Description string `json:"description"`
67+
ExpirationDate string `json:"expirationDate,omitempty"`
68+
Context []AcceptVulnerabilityRiskContext `json:"context"`
69+
Stages []StageType `json:"stages,omitempty"`
70+
}
71+
72+
type UpdateAcceptVulnerabilityRiskRequest struct {
73+
ID string `json:"id"`
74+
ExpirationDate string `json:"expirationDate,omitempty"`
75+
Reason ReasonType `json:"reason"`
76+
Description string `json:"description"`
77+
}
78+
79+
type AcceptVulnerabilityRisk struct {
80+
ID string `json:"id"`
81+
EntityType EntityType `json:"entityType"`
82+
EntityValue string `json:"entityValue"`
83+
Reason ReasonType `json:"reason"`
84+
Description string `json:"description"`
85+
ExpirationDate string `json:"expirationDate,omitempty"`
86+
Status StatusType `json:"status"`
87+
CreatedAt time.Time `json:"createdAt,omitempty"`
88+
UpdatedAt time.Time `json:"updatedAt,omitempty"`
89+
CreatedBy string `json:"createdBy,omitempty"`
90+
UpdatedBy string `json:"updatedBy,omitempty"`
91+
Context []AcceptVulnerabilityRiskContext `json:"context"`
92+
Stages []StageType `json:"stages,omitempty"`
93+
}
94+
95+
type AcceptVulnerabilityRiskContext struct {
96+
ContextType ContextType `json:"contextType"`
97+
ContextValue string `json:"contextValue"`
98+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package v2
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/http"
7+
)
8+
9+
type PostureVulnerabilityAcceptRiskInterface interface {
10+
Base
11+
12+
SaveAcceptVulnerabilityRisk(ctx context.Context, p *AcceptVulnerabilityRiskRequest) (*AcceptVulnerabilityRisk, string, error)
13+
GetAcceptanceVulnerabilityRisk(ctx context.Context, id string) (*AcceptVulnerabilityRisk, string, error)
14+
DeleteAcceptanceVulnerabilityRisk(ctx context.Context, id string) error
15+
UpdateAcceptanceVulnerabilityRisk(ctx context.Context, p *UpdateAcceptVulnerabilityRiskRequest) (*AcceptVulnerabilityRisk, string, error)
16+
}
17+
18+
const (
19+
AcceptVulnerabilityRiskCreatePath = "%s/secure/vulnerability/v1beta1/accepted-risks"
20+
AcceptVulnerabilityRiskGetPath = "%s/secure/vulnerability/v1beta1/accepted-risks/%s"
21+
AcceptVulnerabilityRiskDeletePath = "%s/secure/vulnerability/v1beta1/accepted-risks/%s"
22+
AcceptVulnerabilityRiskUpdatePath = "%s/secure/vulnerability/v1beta1/accepted-risks/%s"
23+
)
24+
25+
func (c *Client) SaveAcceptVulnerabilityRisk(ctx context.Context, p *AcceptVulnerabilityRiskRequest) (*AcceptVulnerabilityRisk, string, error) {
26+
payload, err := Marshal(p)
27+
if err != nil {
28+
return nil, "", err
29+
}
30+
31+
response, err := c.requester.Request(ctx, http.MethodPost, fmt.Sprintf(AcceptVulnerabilityRiskCreatePath, c.config.url), payload)
32+
if err != nil {
33+
return nil, "", err
34+
}
35+
defer response.Body.Close()
36+
37+
if response.StatusCode != http.StatusCreated {
38+
errStatus, err := c.ErrorAndStatusFromResponse(response)
39+
return nil, errStatus, err
40+
}
41+
42+
resp, err := Unmarshal[AcceptVulnerabilityRisk](response.Body)
43+
if err != nil {
44+
return nil, "", err
45+
}
46+
47+
return &resp, "", nil
48+
}
49+
50+
func (c *Client) GetAcceptanceVulnerabilityRisk(ctx context.Context, id string) (*AcceptVulnerabilityRisk, string, error) {
51+
response, err := c.requester.Request(ctx, http.MethodGet, fmt.Sprintf(AcceptVulnerabilityRiskGetPath, c.config.url, id), nil)
52+
if err != nil {
53+
return nil, "", err
54+
}
55+
defer response.Body.Close()
56+
57+
if response.StatusCode != http.StatusOK {
58+
errStatus, err := c.ErrorAndStatusFromResponse(response)
59+
return nil, errStatus, err
60+
}
61+
62+
resp, err := Unmarshal[AcceptVulnerabilityRisk](response.Body)
63+
if err != nil {
64+
return nil, "", err
65+
}
66+
67+
return &resp, "", nil
68+
}
69+
70+
func (c *Client) DeleteAcceptanceVulnerabilityRisk(ctx context.Context, id string) error {
71+
response, err := c.requester.Request(ctx, http.MethodDelete, fmt.Sprintf(AcceptVulnerabilityRiskDeletePath, c.config.url, id), nil)
72+
if err != nil {
73+
return err
74+
}
75+
defer response.Body.Close()
76+
77+
if response.StatusCode != http.StatusNoContent {
78+
return c.ErrorFromResponse(response)
79+
}
80+
81+
return nil
82+
}
83+
84+
func (c *Client) UpdateAcceptanceVulnerabilityRisk(ctx context.Context, p *UpdateAcceptVulnerabilityRiskRequest) (*AcceptVulnerabilityRisk, string, error) {
85+
payload, err := Marshal(p)
86+
if err != nil {
87+
return nil, "", err
88+
}
89+
90+
response, err := c.requester.Request(ctx, http.MethodPut, fmt.Sprintf(AcceptVulnerabilityRiskUpdatePath, c.config.url, p.ID), payload)
91+
if err != nil {
92+
return nil, "", err
93+
}
94+
defer response.Body.Close()
95+
96+
if response.StatusCode != http.StatusOK {
97+
errStatus, err := c.ErrorAndStatusFromResponse(response)
98+
return nil, errStatus, err
99+
}
100+
101+
resp, err := Unmarshal[AcceptVulnerabilityRisk](response.Body)
102+
if err != nil {
103+
return nil, "", err
104+
}
105+
106+
return &resp, "", nil
107+
}

sysdig/provider.go

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

0 commit comments

Comments
 (0)