diff --git a/sysdig/data_source_sysdig_secure_posture_policy.go b/sysdig/data_source_sysdig_secure_posture_policy.go index 695e5684..b421dc6b 100644 --- a/sysdig/data_source_sysdig_secure_posture_policy.go +++ b/sysdig/data_source_sysdig_secure_posture_policy.go @@ -2,6 +2,7 @@ package sysdig import ( "context" + "fmt" "strconv" "time" @@ -17,12 +18,16 @@ func dataSourceSysdigSecurePosturePolicy() *schema.Resource { }, Schema: map[string]*schema.Schema{ SchemaIDKey: { - Type: schema.TypeString, - Required: true, + Type: schema.TypeString, + Optional: true, + Computed: true, + ExactlyOneOf: []string{SchemaIDKey, SchemaNameKey}, }, SchemaNameKey: { - Type: schema.TypeString, - Computed: true, + Type: schema.TypeString, + Optional: true, + Computed: true, + ExactlyOneOf: []string{SchemaIDKey, SchemaNameKey}, }, SchemaDescriptionKey: { Type: schema.TypeString, @@ -67,11 +72,38 @@ func dataSourceSysdigSecurePosturePolicyRead(ctx context.Context, d *schema.Reso return diag.FromErr(err) } - id, err := strconv.ParseInt(d.Get("id").(string), 10, 64) - if err != nil { - return diag.FromErr(err) + var policyID int64 + + if idRaw, hasID := d.GetOk(SchemaIDKey); hasID { + policyID, err = strconv.ParseInt(idRaw.(string), 10, 64) + if err != nil { + return diag.FromErr(fmt.Errorf("invalid policy id: %s", err)) + } + } else if nameRaw, hasName := d.GetOk(SchemaNameKey); hasName { + name := nameRaw.(string) + policies, listErr := client.ListPosturePolicies(ctx) + if listErr != nil { + return diag.FromErr(fmt.Errorf("error listing posture policies: %s", listErr)) + } + var matchedID string + for _, p := range policies { + if p.Name == name { + matchedID = p.ID + break + } + } + if matchedID == "" { + return diag.FromErr(fmt.Errorf("posture policy with name %q not found", name)) + } + policyID, err = strconv.ParseInt(matchedID, 10, 64) + if err != nil { + return diag.FromErr(fmt.Errorf("invalid policy id %q: %s", matchedID, err)) + } + } else { + return diag.FromErr(fmt.Errorf("either id or name must be specified")) } - policy, err := client.GetPosturePolicyByID(ctx, id) + + policy, err := client.GetPosturePolicyByID(ctx, policyID) if err != nil { return diag.FromErr(err) } diff --git a/sysdig/data_source_sysdig_secure_posture_policy_test.go b/sysdig/data_source_sysdig_secure_posture_policy_test.go index 96e46a62..603ffefe 100644 --- a/sysdig/data_source_sysdig_secure_posture_policy_test.go +++ b/sysdig/data_source_sysdig_secure_posture_policy_test.go @@ -12,6 +12,29 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) +func TestAccPosturePolicyDataSource_ByName(t *testing.T) { + resource.ParallelTest(t, resource.TestCase{ + PreCheck: preCheckAnyEnv(t, SysdigSecureApiTokenEnv), + ProviderFactories: map[string]func() (*schema.Provider, error){ + "sysdig": func() (*schema.Provider, error) { + return sysdig.Provider(), nil + }, + }, + Steps: []resource.TestStep{ + { + Config: ` + data "sysdig_secure_posture_policy" "by_name" { + name = "Sysdig Kubernetes" + }`, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("data.sysdig_secure_posture_policy.by_name", "id", "2"), + resource.TestCheckResourceAttr("data.sysdig_secure_posture_policy.by_name", "name", "Sysdig Kubernetes"), + ), + }, + }, + }) +} + func TestAccPosturePolicyDataSource(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ PreCheck: preCheckAnyEnv(t, SysdigSecureApiTokenEnv), diff --git a/website/docs/d/secure_posture_policy.md b/website/docs/d/secure_posture_policy.md index 709839f5..e57ffae5 100644 --- a/website/docs/d/secure_posture_policy.md +++ b/website/docs/d/secure_posture_policy.md @@ -3,26 +3,33 @@ subcategory: "Sysdig Secure" layout: "sysdig" page_title: "Sysdig: sysdig_secure_posture_policy" description: |- - Retrieves Posture policy by ID. + Retrieves Posture policy by ID or name. --- # Data Source: sysdig_secure_posture_policy -Retrieves the information of a Posture Policy. +Retrieves the information of a Posture Policy by ID or name. -> **Note:** Sysdig Terraform Provider is under rapid development at this point. If you experience any issue or discrepancy while using it, please make sure you have the latest version. If the issue persists, or you have a Feature Request to support an additional set of resources, please open a [new issue](https://github.com/sysdiglabs/terraform-provider-sysdig/issues/new) in the GitHub repository. ## Example Usage ```terraform -data sysdig_secure_posture_policiy policy { - id = "454678" +data "sysdig_secure_posture_policy" "by_id" { + id = "2" +} + +data "sysdig_secure_posture_policy" "by_name" { + name = "Sysdig Kubernetes" } ``` ## Argument Reference -- `id` - (Required) The ID of the Posture Policy, eg. `2` +Exactly one of the following arguments must be provided: + +- `id` - (Optional) The ID of the Posture Policy. +- `name` - (Optional) The name of the Posture Policy. Policy names are unique. ## Attributes Reference