Skip to content

Commit 39d477e

Browse files
authored
Merge pull request #47 from hi-artem/feature/coderepo-compliance
Add coderepo compliance and coderepo compliance ci resources
2 parents 4e0c311 + a64b74c commit 39d477e

10 files changed

+998
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package policy
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
7+
"github.com/PaloAltoNetworks/terraform-provider-prismacloudcompute/internal/api"
8+
"github.com/PaloAltoNetworks/terraform-provider-prismacloudcompute/internal/api/collection"
9+
)
10+
11+
const (
12+
ComplianceCodereposEndpoint = "api/v1/policies/compliance/coderepos"
13+
ComplianceCiCodereposEndpoint = "api/v1/policies/compliance/ci/coderepos"
14+
)
15+
16+
type ComplianceCoderepoPolicy struct {
17+
Rules []ComplianceCoderepoRule `json:"rules,omitempty"`
18+
Type string `json:"policyType,omitempty"`
19+
}
20+
21+
type ComplianceCoderepoRule struct {
22+
Collections []collection.Collection `json:"collections,omitempty"`
23+
Disabled bool `json:"disabled"`
24+
Effect string `json:"effect,omitempty"`
25+
GraceDays int `json:"graceDays,omitempty"`
26+
GraceDaysPolicy ComplianceCoderepoGraceDaysPolicy `json:"graceDaysPolicy,omitempty"`
27+
Name string `json:"name,omitempty"`
28+
Notes string `json:"notes,omitempty"`
29+
License ComplianceCoderepoLicense `json:"license,omitempty"`
30+
}
31+
32+
type ComplianceCoderepoLicense struct {
33+
AlertThreshold ComplianceCoderepoThreshold `json:"alertThreshold,omitempty"`
34+
BlockThreshold ComplianceCoderepoThreshold `json:"blockThreshold,omitempty"`
35+
Critical []string `json:"critical,omitempty"`
36+
High []string `json:"high,omitempty"`
37+
Medium []string `json:"medium,omitempty"`
38+
Low []string `json:"low,omitempty"`
39+
}
40+
41+
type ComplianceCoderepoThreshold struct {
42+
Disabled bool `json:"disabled"`
43+
Enabled bool `json:"enabled"`
44+
Value int `json:"value,omitempty"`
45+
}
46+
47+
type ComplianceCoderepoGraceDaysPolicy struct {
48+
Enabled bool `json:"enabled,omitempty"`
49+
Low int `json:"low,omitempty"`
50+
Medium int `json:"medium,omitempty"`
51+
High int `json:"high,omitempty"`
52+
Critical int `json:"critical,omitempty"`
53+
}
54+
55+
// Get the current CI coderepo compliance policy.
56+
func GetComplianceCiCoderepo(c api.Client) (ComplianceCoderepoPolicy, error) {
57+
var ans ComplianceCoderepoPolicy
58+
if err := c.Request(http.MethodGet, ComplianceCiCodereposEndpoint, nil, nil, &ans); err != nil {
59+
return ans, fmt.Errorf("error getting CI coderepo compliance policy: %s", err)
60+
}
61+
return ans, nil
62+
}
63+
64+
// Get the current coderepo compliance policy.
65+
func GetComplianceCoderepo(c api.Client) (ComplianceCoderepoPolicy, error) {
66+
var ans ComplianceCoderepoPolicy
67+
if err := c.Request(http.MethodGet, ComplianceCodereposEndpoint, nil, nil, &ans); err != nil {
68+
return ans, fmt.Errorf("error getting coderepo compliance policy: %s", err)
69+
}
70+
return ans, nil
71+
}
72+
73+
// Update the current CI coderepo compliance policy.
74+
func UpdateComplianceCiCoderepo(c api.Client, policy ComplianceCoderepoPolicy) error {
75+
return c.Request(http.MethodPut, ComplianceCiCodereposEndpoint, nil, policy, nil)
76+
}
77+
78+
// Update the current coderepo compliance policy.
79+
func UpdateComplianceCoderepo(c api.Client, policy ComplianceCoderepoPolicy) error {
80+
return c.Request(http.MethodPut, ComplianceCodereposEndpoint, nil, policy, nil)
81+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package convert
2+
3+
import (
4+
"github.com/PaloAltoNetworks/terraform-provider-prismacloudcompute/internal/api/policy"
5+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
6+
)
7+
8+
func SchemaToComplianceCiCoderepoRules(d *schema.ResourceData) ([]policy.ComplianceCoderepoRule, error) {
9+
parsedRules := make([]policy.ComplianceCoderepoRule, 0)
10+
if rules, ok := d.GetOk("rule"); ok {
11+
presentRules := rules.([]interface{})
12+
for _, val := range presentRules {
13+
presentRule := val.(map[string]interface{})
14+
parsedRule := policy.ComplianceCoderepoRule{}
15+
16+
if len(presentRule["license"].([]interface{})) > 0 && presentRule["license"].([]interface{})[0] != nil {
17+
presentLicense := presentRule["license"].([]interface{})[0].(map[string]interface{})
18+
if len(presentLicense["critical"].([]interface{})) > 0 && presentLicense["critical"].([]interface{})[0] != nil {
19+
parsedRule.License.Critical = SchemaToStringSlice(presentLicense["critical"].([]interface{}))
20+
}
21+
if len(presentLicense["high"].([]interface{})) > 0 && presentLicense["high"].([]interface{})[0] != nil {
22+
parsedRule.License.High = SchemaToStringSlice(presentLicense["high"].([]interface{}))
23+
}
24+
if len(presentLicense["medium"].([]interface{})) > 0 && presentLicense["medium"].([]interface{})[0] != nil {
25+
parsedRule.License.Medium = SchemaToStringSlice(presentLicense["medium"].([]interface{}))
26+
}
27+
if len(presentLicense["low"].([]interface{})) > 0 && presentLicense["low"].([]interface{})[0] != nil {
28+
parsedRule.License.Low = SchemaToStringSlice(presentLicense["low"].([]interface{}))
29+
}
30+
if presentLicense["alert_threshold"].([]interface{})[0] != nil {
31+
presentAlertThreshold := presentLicense["alert_threshold"].([]interface{})[0].(map[string]interface{})
32+
parsedRule.License.AlertThreshold = policy.ComplianceCoderepoThreshold{
33+
Enabled: presentAlertThreshold["enabled"].(bool),
34+
Value: presentAlertThreshold["value"].(int),
35+
}
36+
}
37+
if presentLicense["block_threshold"].([]interface{})[0] != nil {
38+
presentBlockThreshold := presentLicense["block_threshold"].([]interface{})[0].(map[string]interface{})
39+
parsedRule.License.BlockThreshold = policy.ComplianceCoderepoThreshold{
40+
Enabled: presentBlockThreshold["enabled"].(bool),
41+
Value: presentBlockThreshold["value"].(int),
42+
}
43+
}
44+
} else {
45+
parsedRule.License = policy.ComplianceCoderepoLicense{}
46+
}
47+
48+
parsedRule.Collections = PolicySchemaToCollections(presentRule["collections"].([]interface{}))
49+
50+
parsedRule.Disabled = presentRule["disabled"].(bool)
51+
parsedRule.Effect = presentRule["effect"].(string)
52+
parsedRule.Name = presentRule["name"].(string)
53+
parsedRule.Notes = presentRule["notes"].(string)
54+
55+
parsedRules = append(parsedRules, parsedRule)
56+
}
57+
}
58+
return parsedRules, nil
59+
}
60+
61+
func ComplianceCoderepoCiRulesToSchema(in []policy.ComplianceCoderepoRule) []interface{} {
62+
ans := make([]interface{}, 0, len(in))
63+
for _, val := range in {
64+
m := make(map[string]interface{})
65+
m["collections"] = CollectionsToPolicySchema(val.Collections)
66+
m["license"] = complianceCoderepoCiLicenseToSchema(val.License)
67+
m["disabled"] = val.Disabled
68+
m["effect"] = val.Effect
69+
m["name"] = val.Name
70+
m["notes"] = val.Notes
71+
ans = append(ans, m)
72+
}
73+
return ans
74+
}
75+
76+
func complianceCoderepoCiLicenseToSchema(in policy.ComplianceCoderepoLicense) []interface{} {
77+
ans := make([]interface{}, 0, 1)
78+
m := make(map[string]interface{})
79+
m["alert_threshold"] = complianceCoderepoThresholdToSchema(in.AlertThreshold)
80+
m["block_threshold"] = complianceCoderepoThresholdToSchema(in.BlockThreshold)
81+
m["critical"] = in.Critical
82+
m["high"] = in.High
83+
m["medium"] = in.Medium
84+
m["low"] = in.Low
85+
86+
ans = append(ans, m)
87+
return ans
88+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package convert
2+
3+
import (
4+
"github.com/PaloAltoNetworks/terraform-provider-prismacloudcompute/internal/api/policy"
5+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
6+
)
7+
8+
func SchemaToComplianceCoderepoRules(d *schema.ResourceData) ([]policy.ComplianceCoderepoRule, error) {
9+
parsedRules := make([]policy.ComplianceCoderepoRule, 0)
10+
if rules, ok := d.GetOk("rule"); ok {
11+
presentRules := rules.([]interface{})
12+
for _, val := range presentRules {
13+
presentRule := val.(map[string]interface{})
14+
parsedRule := policy.ComplianceCoderepoRule{}
15+
16+
if len(presentRule["license"].([]interface{})) > 0 && presentRule["license"].([]interface{})[0] != nil {
17+
presentLicense := presentRule["license"].([]interface{})[0].(map[string]interface{})
18+
if len(presentLicense["critical"].([]interface{})) > 0 && presentLicense["critical"].([]interface{})[0] != nil {
19+
parsedRule.License.Critical = SchemaToStringSlice(presentLicense["critical"].([]interface{}))
20+
}
21+
if len(presentLicense["high"].([]interface{})) > 0 && presentLicense["high"].([]interface{})[0] != nil {
22+
parsedRule.License.High = SchemaToStringSlice(presentLicense["high"].([]interface{}))
23+
}
24+
if len(presentLicense["medium"].([]interface{})) > 0 && presentLicense["medium"].([]interface{})[0] != nil {
25+
parsedRule.License.Medium = SchemaToStringSlice(presentLicense["medium"].([]interface{}))
26+
}
27+
if len(presentLicense["low"].([]interface{})) > 0 && presentLicense["low"].([]interface{})[0] != nil {
28+
parsedRule.License.Low = SchemaToStringSlice(presentLicense["low"].([]interface{}))
29+
}
30+
if presentLicense["alert_threshold"].([]interface{})[0] != nil {
31+
presentAlertThreshold := presentLicense["alert_threshold"].([]interface{})[0].(map[string]interface{})
32+
parsedRule.License.AlertThreshold = policy.ComplianceCoderepoThreshold{
33+
Enabled: presentAlertThreshold["enabled"].(bool),
34+
Value: presentAlertThreshold["value"].(int),
35+
}
36+
}
37+
} else {
38+
parsedRule.License = policy.ComplianceCoderepoLicense{}
39+
}
40+
41+
parsedRule.Collections = PolicySchemaToCollections(presentRule["collections"].([]interface{}))
42+
43+
parsedRule.Disabled = presentRule["disabled"].(bool)
44+
parsedRule.Effect = presentRule["effect"].(string)
45+
parsedRule.Name = presentRule["name"].(string)
46+
parsedRule.Notes = presentRule["notes"].(string)
47+
48+
parsedRules = append(parsedRules, parsedRule)
49+
}
50+
}
51+
return parsedRules, nil
52+
}
53+
54+
func ComplianceCoderepoRulesToSchema(in []policy.ComplianceCoderepoRule) []interface{} {
55+
ans := make([]interface{}, 0, len(in))
56+
for _, val := range in {
57+
m := make(map[string]interface{})
58+
m["collections"] = CollectionsToPolicySchema(val.Collections)
59+
m["license"] = complianceCoderepoLicenseToSchema(val.License)
60+
m["disabled"] = val.Disabled
61+
m["effect"] = val.Effect
62+
m["name"] = val.Name
63+
m["notes"] = val.Notes
64+
ans = append(ans, m)
65+
}
66+
return ans
67+
}
68+
69+
func complianceCoderepoThresholdToSchema(in policy.ComplianceCoderepoThreshold) []interface{} {
70+
ans := make([]interface{}, 0, 1)
71+
m := make(map[string]interface{})
72+
m["enabled"] = in.Enabled
73+
m["value"] = in.Value
74+
ans = append(ans, m)
75+
return ans
76+
}
77+
78+
func complianceCoderepoLicenseToSchema(in policy.ComplianceCoderepoLicense) []interface{} {
79+
ans := make([]interface{}, 0, 1)
80+
m := make(map[string]interface{})
81+
m["alert_threshold"] = complianceCoderepoThresholdToSchema(in.AlertThreshold)
82+
m["critical"] = in.Critical
83+
m["high"] = in.High
84+
m["medium"] = in.Medium
85+
m["low"] = in.Low
86+
87+
ans = append(ans, m)
88+
return ans
89+
}

internal/provider/common.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package provider
33
const (
44
policyTypeAdmission = "admission"
55
policyTypeComplianceCiImage = "ciImagesCompliance"
6+
policyTypeComplianceCoderepo = "codeRepoCompliance"
7+
policyTypeComplianceCiCoderepo = "ciCodeRepoCompliance"
68
policyTypeComplianceContainer = "containerCompliance"
79
policyTypeComplianceHost = "hostCompliance"
810
policyTypeRuntimeContainer = "containerRuntime"

internal/provider/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ func Provider() *schema.Provider {
6464
"prismacloudcompute_ci_coderepo_vulnerability_policy": resourcePoliciesVulnerabilityCiCoderepo(),
6565
"prismacloudcompute_ci_image_vulnerability_policy": resourcePoliciesVulnerabilityCiImage(),
6666
"prismacloudcompute_coderepo_vulnerability_policy": resourcePoliciesVulnerabilityCoderepo(),
67+
"prismacloudcompute_coderepo_compliance_policy": resourcePoliciesComplianceCoderepo(),
68+
"prismacloudcompute_ci_coderepo_compliance_policy": resourcePoliciesComplianceCiCoderepo(),
6769
"prismacloudcompute_host_vulnerability_policy": resourcePoliciesVulnerabilityHost(),
6870
"prismacloudcompute_image_vulnerability_policy": resourcePoliciesVulnerabilityImage(),
6971
"prismacloudcompute_registry_settings": resourceRegistry(),

0 commit comments

Comments
 (0)