Skip to content

Commit d53a13f

Browse files
Add terraform support to Okta ML Policy (#676)
Key changes: - Added resource and data source for sysdig_secure_okta_ml_policy - Implemented CRUD operations with proper error handling - Added tests and documentation Similar open PR: #675 (I'll close this once new one merged) --------- Co-authored-by: Fede Barcelona <[email protected]>
1 parent a72ecaf commit d53a13f

13 files changed

+686
-5
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ junit-report.xml
4646
# Binaries
4747
terraform-provider-sysdig
4848
oanc
49-
.vscode/settings.json
49+
.vscode/
5050

5151
# goland .run
5252
.run/
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package sysdig
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
v2 "github.com/draios/terraform-provider-sysdig/sysdig/internal/client/v2"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
)
11+
12+
func dataSourceSysdigSecureOktaMLPolicy() *schema.Resource {
13+
timeout := 5 * time.Minute
14+
15+
return &schema.Resource{
16+
ReadContext: dataSourceSysdigSecureOktaMLPolicyRead,
17+
18+
Timeouts: &schema.ResourceTimeout{
19+
Read: schema.DefaultTimeout(timeout),
20+
},
21+
22+
Schema: createOktaMLPolicyDataSourceSchema(),
23+
}
24+
}
25+
26+
func dataSourceSysdigSecureOktaMLPolicyRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
27+
return oktaMLPolicyDataSourceRead(ctx, d, meta, "custom Okta ML policy", isCustomCompositePolicy)
28+
}
29+
30+
func createOktaMLPolicyDataSourceSchema() map[string]*schema.Schema {
31+
return map[string]*schema.Schema{
32+
// IMPORTANT: Type is implicit: It's automatically added upon conversion to JSON
33+
"type": {
34+
Type: schema.TypeString,
35+
Computed: true,
36+
},
37+
"name": NameSchema(),
38+
"description": DescriptionComputedSchema(),
39+
"enabled": EnabledComputedSchema(),
40+
"severity": SeverityComputedSchema(),
41+
"scope": ScopeComputedSchema(),
42+
"version": VersionSchema(),
43+
"notification_channels": NotificationChannelsComputedSchema(),
44+
"runbook": RunbookComputedSchema(),
45+
"rule": {
46+
Type: schema.TypeList,
47+
Computed: true,
48+
Elem: &schema.Resource{
49+
Schema: map[string]*schema.Schema{
50+
"id": ReadOnlyIntSchema(),
51+
"name": ReadOnlyStringSchema(),
52+
"description": DescriptionComputedSchema(),
53+
"tags": TagsSchema(),
54+
"version": VersionSchema(),
55+
"anomalous_console_login": MLRuleThresholdAndSeverityComputedSchema(),
56+
},
57+
},
58+
},
59+
}
60+
}
61+
62+
func oktaMLPolicyDataSourceRead(ctx context.Context, d *schema.ResourceData, meta any, resourceName string, validationFunc func(v2.PolicyRulesComposite) bool) diag.Diagnostics {
63+
policy, err := compositePolicyDataSourceRead(ctx, d, meta, resourceName, policyTypeOktaML, validationFunc)
64+
if err != nil {
65+
return diag.FromErr(err)
66+
}
67+
68+
err = oktaMLPolicyToResourceData(policy, d)
69+
if err != nil {
70+
return diag.FromErr(err)
71+
}
72+
73+
return nil
74+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//go:build tf_acc_sysdig_secure || tf_acc_policies || tf_acc_policies_okta
2+
3+
package sysdig_test
4+
5+
import (
6+
"fmt"
7+
"os"
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
14+
"github.com/draios/terraform-provider-sysdig/sysdig"
15+
)
16+
17+
func TestAccOktaMLPolicyDataSource(t *testing.T) {
18+
rText := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)
19+
20+
resource.ParallelTest(t, resource.TestCase{
21+
PreCheck: func() {
22+
if v := os.Getenv("SYSDIG_SECURE_API_TOKEN"); v == "" {
23+
t.Fatal("SYSDIG_SECURE_API_TOKEN must be set for acceptance tests")
24+
}
25+
},
26+
ProviderFactories: map[string]func() (*schema.Provider, error){
27+
"sysdig": func() (*schema.Provider, error) {
28+
return sysdig.Provider(), nil
29+
},
30+
},
31+
Steps: []resource.TestStep{
32+
{
33+
Config: oktaMLPolicyDataSource(rText),
34+
Check: resource.ComposeTestCheckFunc(
35+
resource.TestCheckResourceAttr("data.sysdig_secure_okta_ml_policy.policy_2", "name", fmt.Sprintf("Test Okta ML Policy %s", rText)),
36+
resource.TestCheckResourceAttr("data.sysdig_secure_okta_ml_policy.policy_2", "description", fmt.Sprintf("Test Okta ML Policy Description %s", rText)),
37+
resource.TestCheckResourceAttr("data.sysdig_secure_okta_ml_policy.policy_2", "enabled", "true"),
38+
resource.TestCheckResourceAttr("data.sysdig_secure_okta_ml_policy.policy_2", "severity", "4"),
39+
),
40+
},
41+
},
42+
})
43+
}
44+
45+
func oktaMLPolicyDataSource(name string) string {
46+
return fmt.Sprintf(`
47+
resource "sysdig_secure_okta_ml_policy" "policy_1" {
48+
name = "Test Okta ML Policy %s"
49+
description = "Test Okta ML Policy Description %s"
50+
enabled = true
51+
severity = 4
52+
53+
rule {
54+
description = "Test Okta ML Rule Description"
55+
56+
anomalous_console_login {
57+
enabled = true
58+
threshold = 2
59+
}
60+
}
61+
62+
}
63+
64+
data "sysdig_secure_okta_ml_policy" "policy_2" {
65+
name = sysdig_secure_okta_ml_policy.policy_1.name
66+
depends_on = [sysdig_secure_okta_ml_policy.policy_1]
67+
}
68+
`, name, name)
69+
}

sysdig/internal/client/v2/model.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,8 @@ func (r *RuntimePolicyRule) UnmarshalJSON(b []byte) error {
338338
d = &MLRuleDetails{}
339339
case "AWS_MACHINE_LEARNING":
340340
d = &AWSMLRuleDetails{}
341+
case "OKTA_MACHINE_LEARNING":
342+
d = &OktaMLRuleDetails{}
341343
case "MALWARE":
342344
d = &MalwareRuleDetails{}
343345
default:
@@ -441,6 +443,16 @@ func (p AWSMLRuleDetails) GetRuleType() ElementType {
441443
return p.RuleType
442444
}
443445

446+
type OktaMLRuleDetails struct {
447+
RuleType ElementType `json:"ruleType" yaml:"ruleType"`
448+
AnomalousConsoleLogin *MLRuleThresholdAndSeverity `json:"anomalousConsoleLogin" yaml:"anomalousConsoleLogin"`
449+
Details `json:"-"`
450+
}
451+
452+
func (p OktaMLRuleDetails) GetRuleType() ElementType {
453+
return p.RuleType
454+
}
455+
444456
type PolicyRule struct {
445457
Name string `json:"ruleName"`
446458
Enabled bool `json:"enabled"`

sysdig/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ func (p *SysdigProvider) Provider() *schema.Provider {
151151
"sysdig_monitor_team": resourceSysdigMonitorTeam(),
152152

153153
"sysdig_secure_aws_ml_policy": resourceSysdigSecureAWSMLPolicy(),
154+
"sysdig_secure_okta_ml_policy": resourceSysdigSecureOktaMLPolicy(),
154155
"sysdig_secure_cloud_auth_account": resourceSysdigSecureCloudauthAccount(),
155156
"sysdig_secure_cloud_auth_account_component": resourceSysdigSecureCloudauthAccountComponent(),
156157
"sysdig_secure_cloud_auth_account_feature": resourceSysdigSecureCloudauthAccountFeature(),
@@ -216,6 +217,7 @@ func (p *SysdigProvider) Provider() *schema.Provider {
216217

217218
"sysdig_secure_agentless_scanning_assets": dataSourceSysdigSecureAgentlessScanningAssets(),
218219
"sysdig_secure_aws_ml_policy": dataSourceSysdigSecureAWSMLPolicy(),
220+
"sysdig_secure_okta_ml_policy": dataSourceSysdigSecureOktaMLPolicy(),
219221
"sysdig_secure_cloud_ingestion_assets": dataSourceSysdigSecureCloudIngestionAssets(),
220222
"sysdig_secure_connection": dataSourceSysdigSecureConnection(),
221223
"sysdig_secure_custom_policy": dataSourceSysdigSecureCustomPolicy(),

0 commit comments

Comments
 (0)