Skip to content

Commit c98830f

Browse files
authored
feat: add vulnerability policy resource (#662)
1 parent 3c84487 commit c98830f

7 files changed

+610
-15
lines changed

sysdig/internal/client/v2/sysdig.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,39 +18,43 @@ type SysdigRequest struct {
1818

1919
type SysdigCommon interface {
2020
Common
21-
GroupMappingInterface
22-
GroupMappingConfigInterface
21+
2322
CustomRoleInterface
2423
CustomRolePermissionInterface
25-
TeamServiceAccountInterface
26-
IPFiltersInterface
24+
GroupMappingConfigInterface
25+
GroupMappingInterface
2726
IPFilteringSettingsInterface
27+
IPFiltersInterface
28+
TeamServiceAccountInterface
2829
}
2930

3031
type SysdigMonitor interface {
3132
SysdigCommon
3233
MonitorCommon
34+
3335
CloudAccountMonitorInterface
3436
}
3537

3638
type SysdigSecure interface {
3739
SysdigCommon
3840
SecureCommon
39-
PolicyInterface
40-
CompositePolicyInterface
41-
RuleInterface
42-
ListInterface
43-
MacroInterface
44-
DeprecatedScanningPolicyInterface
45-
DeprecatedScanningPolicyAssignmentInterface
46-
DeprecatedVulnerabilityExceptionListInterface
47-
DeprecatedVulnerabilityExceptionInterface
41+
4842
CloudAccountSecureInterface
49-
CloudauthAccountSecureInterface
50-
OrganizationSecureInterface
5143
CloudauthAccountComponentSecureInterface
5244
CloudauthAccountFeatureSecureInterface
45+
CloudauthAccountSecureInterface
46+
CompositePolicyInterface
47+
DeprecatedScanningPolicyAssignmentInterface
48+
DeprecatedScanningPolicyInterface
49+
DeprecatedVulnerabilityExceptionInterface
50+
DeprecatedVulnerabilityExceptionListInterface
51+
ListInterface
52+
MacroInterface
5353
OnboardingSecureInterface
54+
OrganizationSecureInterface
55+
PolicyInterface
56+
RuleInterface
57+
VulnerabilityPolicyClient
5458
}
5559

5660
func (sr *SysdigRequest) Request(ctx context.Context, method string, url string, payload io.Reader) (*http.Response, error) {
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package v2
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
"net/http"
8+
"strconv"
9+
)
10+
11+
const (
12+
vulnerabilityPoliciesPath = "%s/secure/vulnerability/v1/policies"
13+
vulnerabilityPolicyPath = "%s/secure/vulnerability/v1/policies/%s"
14+
)
15+
16+
type VulnerabilityPolicyClient interface {
17+
CreateVulnerabilityPolicy(ctx context.Context, vulnerabilityPolicy VulnerabilityPolicy) (VulnerabilityPolicy, error)
18+
GetVulnerabilityPolicyByID(ctx context.Context, vulnerabilityPolicyID string) (VulnerabilityPolicy, error)
19+
UpdateVulnerabilityPolicy(ctx context.Context, vulnerabilityPolicy VulnerabilityPolicy) (VulnerabilityPolicy, error)
20+
DeleteVulnerabilityPolicyByID(ctx context.Context, vulnerabilityPolicyID string) error
21+
}
22+
23+
func (c *Client) CreateVulnerabilityPolicy(ctx context.Context, vulnerabilityPolicy VulnerabilityPolicy) (policy VulnerabilityPolicy, err error) {
24+
payload, err := Marshal(vulnerabilityPolicy)
25+
if err != nil {
26+
return VulnerabilityPolicy{}, err
27+
}
28+
29+
response, err := c.requester.Request(ctx, http.MethodPost, c.vulnerabilityPoliciesURL(), payload)
30+
if err != nil {
31+
return VulnerabilityPolicy{}, err
32+
}
33+
defer func() {
34+
if dErr := response.Body.Close(); dErr != nil {
35+
err = fmt.Errorf("unable to close response body: %w", dErr)
36+
}
37+
}()
38+
39+
if response.StatusCode != http.StatusOK && response.StatusCode != http.StatusCreated {
40+
return VulnerabilityPolicy{}, c.ErrorFromResponse(response)
41+
}
42+
43+
return Unmarshal[VulnerabilityPolicy](response.Body)
44+
}
45+
46+
func (c *Client) GetVulnerabilityPolicyByID(ctx context.Context, vulnerabilityPolicyID string) (policy VulnerabilityPolicy, err error) {
47+
response, err := c.requester.Request(ctx, http.MethodGet, c.vulnerabilityPolicyURL(vulnerabilityPolicyID), nil)
48+
if err != nil {
49+
return VulnerabilityPolicy{}, err
50+
}
51+
defer func() {
52+
if dErr := response.Body.Close(); dErr != nil {
53+
err = fmt.Errorf("unable to close response body: %w", dErr)
54+
}
55+
}()
56+
57+
if response.StatusCode != http.StatusOK {
58+
return VulnerabilityPolicy{}, c.ErrorFromResponse(response)
59+
}
60+
61+
return Unmarshal[VulnerabilityPolicy](response.Body)
62+
}
63+
64+
func (c *Client) UpdateVulnerabilityPolicy(ctx context.Context, vulnerabilityPolicy VulnerabilityPolicy) (policy VulnerabilityPolicy, err error) {
65+
if vulnerabilityPolicy.ID == nil {
66+
return VulnerabilityPolicy{}, errors.New("policy id was null")
67+
}
68+
69+
payload, err := Marshal(vulnerabilityPolicy)
70+
if err != nil {
71+
return VulnerabilityPolicy{}, err
72+
}
73+
74+
idAsStr := strconv.Itoa(int(*vulnerabilityPolicy.ID))
75+
response, err := c.requester.Request(ctx, http.MethodPut, c.vulnerabilityPolicyURL(idAsStr), payload)
76+
if err != nil {
77+
return VulnerabilityPolicy{}, err
78+
}
79+
defer func() {
80+
if dErr := response.Body.Close(); dErr != nil {
81+
err = fmt.Errorf("unable to close response body: %w", dErr)
82+
}
83+
}()
84+
85+
if response.StatusCode != http.StatusOK {
86+
return VulnerabilityPolicy{}, c.ErrorFromResponse(response)
87+
}
88+
89+
return Unmarshal[VulnerabilityPolicy](response.Body)
90+
}
91+
92+
func (c *Client) DeleteVulnerabilityPolicyByID(ctx context.Context, vulnerabilityPolicyID string) (err error) {
93+
response, err := c.requester.Request(ctx, http.MethodDelete, c.vulnerabilityPolicyURL(vulnerabilityPolicyID), nil)
94+
if err != nil {
95+
return err
96+
}
97+
defer func() {
98+
if dErr := response.Body.Close(); dErr != nil {
99+
err = fmt.Errorf("unable to close response body: %w", dErr)
100+
}
101+
}()
102+
103+
if response.StatusCode != http.StatusNoContent && response.StatusCode != http.StatusOK {
104+
return c.ErrorFromResponse(response)
105+
}
106+
107+
return err
108+
}
109+
110+
func (c *Client) vulnerabilityPoliciesURL() string {
111+
return fmt.Sprintf(vulnerabilityPoliciesPath, c.config.url)
112+
}
113+
114+
func (c *Client) vulnerabilityPolicyURL(vulnerabilityPolicyID string) string {
115+
return fmt.Sprintf(vulnerabilityPolicyPath, c.config.url, vulnerabilityPolicyID)
116+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package v2
2+
3+
type VulnerabilityPolicy struct {
4+
Bundles []Bundle `json:"bundles"`
5+
Description string `json:"description"`
6+
Name string `json:"name"`
7+
Stages []Stage `json:"stages,omitempty"`
8+
ID *int32 `json:"id,omitempty"`
9+
Identifier *string `json:"identifier,omitempty"`
10+
}
11+
12+
type Bundle struct {
13+
ID int64 `json:"id"`
14+
}
15+
16+
type Stage struct {
17+
Name string `json:"name"`
18+
Configuration []Configuration `json:"configuration,omitempty"`
19+
}
20+
21+
type Configuration struct {
22+
Scope string `json:"scope"`
23+
}

sysdig/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ func (p *SysdigProvider) Provider() *schema.Provider {
199199
"sysdig_secure_rule_syscall": resourceSysdigSecureRuleSyscall(),
200200
"sysdig_secure_team": resourceSysdigSecureTeam(),
201201
"sysdig_secure_vulnerability_accept_risk": resourceSysdigSecureVulnerabilityAcceptRisk(),
202+
"sysdig_secure_vulnerability_policy": resourceSysdigSecureVulnerabilityPolicy(),
202203
"sysdig_secure_zone": resourceSysdigSecureZone(),
203204
},
204205
DataSourcesMap: map[string]*schema.Resource{

0 commit comments

Comments
 (0)