diff --git a/docs/resources/platform_filters.md b/docs/resources/platform_filters.md index e79fc0276..5348fd8be 100644 --- a/docs/resources/platform_filters.md +++ b/docs/resources/platform_filters.md @@ -39,7 +39,7 @@ resource "harness_platform_filters" "test" { ### Optional -- `filter_visibility` (String) This indicates visibility of filter. By default, everyone can view this filter. +- `filter_visibility` (String) This indicates visibility of filter. By default, everyone can view this filter. Can either be EveryOne or OnlyCreator - `org_id` (String) organization Identifier for the Entity - `project_id` (String) project Identifier for the Entity diff --git a/internal/acctest/acctest.go b/internal/acctest/acctest.go index d03ede371..2d698d736 100644 --- a/internal/acctest/acctest.go +++ b/internal/acctest/acctest.go @@ -155,6 +155,14 @@ func AccountLevelResourceImportStateIdFunc(resourceName string) resource.ImportS } } +func AccountFilterImportStateIdFunc(resourceName string) resource.ImportStateIdFunc { + return func(s *terraform.State) (string, error) { + primary := s.RootModule().Resources[resourceName].Primary + id := primary.ID + type_ := primary.Attributes["type"] + return fmt.Sprintf("%s/%s", id, type_), nil + } +} func ProjectFilterImportStateIdFunc(resourceName string) resource.ImportStateIdFunc { return func(s *terraform.State) (string, error) { primary := s.RootModule().Resources[resourceName].Primary diff --git a/internal/service/platform/filters/data_source_filters_test.go b/internal/service/platform/filters/data_source_filters_test.go index b960f5f4d..78131d7b4 100644 --- a/internal/service/platform/filters/data_source_filters_test.go +++ b/internal/service/platform/filters/data_source_filters_test.go @@ -21,6 +21,31 @@ func TestAccDataSourceFilters(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccDataSourceFilters(id, name), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "identifier", id), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.tags.#", "1"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.filter_type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_visibility", "EveryOne"), + ), + }, + }, + }) +} + +func TestAccDataSourceFiltersProjectLevel(t *testing.T) { + + id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(6)) + name := id + resourceName := "data.harness_platform_filters.test" + + resource.UnitTest(t, resource.TestCase{ + PreCheck: func() { acctest.TestAccPreCheck(t) }, + ProviderFactories: acctest.ProviderFactories, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceFiltersProjectLevel(id, name), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttr(resourceName, "identifier", id), resource.TestCheckResourceAttr(resourceName, "org_id", id), @@ -63,6 +88,26 @@ func TestAccDataSourceFiltersOrgLevel(t *testing.T) { } func testAccDataSourceFilters(id string, name string) string { + return fmt.Sprintf(` + resource "harness_platform_filters" "test" { + identifier = "%[1]s" + name = "%[2]s" + type = "Connector" + filter_properties { + tags = ["foo:bar"] + filter_type = "Connector" + } + filter_visibility = "EveryOne" + } + + data "harness_platform_filters" "test" { + identifier = harness_platform_filters.test.identifier + type = harness_platform_filters.test.type + } +`, id, name) +} + +func testAccDataSourceFiltersProjectLevel(id string, name string) string { return fmt.Sprintf(` resource "harness_platform_organization" "test" { identifier = "%[1]s" diff --git a/internal/service/platform/filters/resource_filters.go b/internal/service/platform/filters/resource_filters.go index 87a13798b..70fdae355 100644 --- a/internal/service/platform/filters/resource_filters.go +++ b/internal/service/platform/filters/resource_filters.go @@ -74,9 +74,10 @@ func ResourceFilters() *schema.Resource { }, }, "filter_visibility": { - Description: "This indicates visibility of filter. By default, everyone can view this filter.", + Description: "This indicates visibility of filter. By default, everyone can view this filter. Can either be EveryOne or OnlyCreator", Type: schema.TypeString, Optional: true, + Computed: true, ValidateFunc: validation.StringInSlice([]string{"EveryOne", "OnlyCreator"}, false), }, }, diff --git a/internal/service/platform/filters/resource_filters_test.go b/internal/service/platform/filters/resource_filters_test.go index 3a4f0d594..435a3e93d 100644 --- a/internal/service/platform/filters/resource_filters_test.go +++ b/internal/service/platform/filters/resource_filters_test.go @@ -46,6 +46,130 @@ func TestAccResourceFilters(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "filter_visibility", "EveryOne"), ), }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + ImportStateIdFunc: acctest.AccountFilterImportStateIdFunc(resourceName), + }, + }, + }) +} + +func TestAccResourceFiltersWOnlyCreator(t *testing.T) { + + id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5)) + name := id + updatedName := fmt.Sprintf("%s_updated", name) + resourceName := "harness_platform_filters.test" + + resource.UnitTest(t, resource.TestCase{ + PreCheck: func() { acctest.TestAccPreCheck(t) }, + ProviderFactories: acctest.ProviderFactories, + CheckDestroy: testAccFiltersDestroy(resourceName), + Steps: []resource.TestStep{ + { + Config: testAccResourceFilterswCreator(id, name), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "id", id), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.tags.#", "1"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.filter_type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_visibility", "EveryOne"), + ), + }, + { + Config: testAccResourceFilterswCreator(id, updatedName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "id", id), + resource.TestCheckResourceAttr(resourceName, "name", updatedName), + resource.TestCheckResourceAttr(resourceName, "type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.filter_type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.tags.#", "1"), + resource.TestCheckResourceAttr(resourceName, "filter_visibility", "EveryOne"), + ), + }, + + }, + }) +} + +func TestAccResourceFiltersProjectLevel(t *testing.T) { + + id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5)) + name := id + updatedName := fmt.Sprintf("%s_updated", name) + resourceName := "harness_platform_filters.test" + + resource.UnitTest(t, resource.TestCase{ + PreCheck: func() { acctest.TestAccPreCheck(t) }, + ProviderFactories: acctest.ProviderFactories, + CheckDestroy: testAccFiltersDestroy(resourceName), + Steps: []resource.TestStep{ + { + Config: testAccResourceFiltersProjectLevel(id, name), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "id", id), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.tags.#", "1"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.filter_type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_visibility", "EveryOne"), + ), + }, + { + Config: testAccResourceFiltersProjectLevel(id, updatedName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "id", id), + resource.TestCheckResourceAttr(resourceName, "name", updatedName), + resource.TestCheckResourceAttr(resourceName, "type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.filter_type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.tags.#", "1"), + resource.TestCheckResourceAttr(resourceName, "filter_visibility", "EveryOne"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + ImportStateIdFunc: acctest.ProjectFilterImportStateIdFunc(resourceName), + }, + }, + }) +} +func TestAccResourceFiltersProjectLevelNoFilterVisiblity(t *testing.T) { + + id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5)) + name := id + updatedName := fmt.Sprintf("%s_updated", name) + resourceName := "harness_platform_filters.test" + + resource.UnitTest(t, resource.TestCase{ + PreCheck: func() { acctest.TestAccPreCheck(t) }, + ProviderFactories: acctest.ProviderFactories, + CheckDestroy: testAccFiltersDestroy(resourceName), + Steps: []resource.TestStep{ + { + Config: testAccResourceFiltersProjectLevelNoFilterVisiblity(id, name), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "id", id), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.tags.#", "1"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.filter_type", "Connector"), + ), + }, + { + Config: testAccResourceFiltersProjectLevelNoFilterVisiblity(id, updatedName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "id", id), + resource.TestCheckResourceAttr(resourceName, "name", updatedName), + resource.TestCheckResourceAttr(resourceName, "type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.filter_type", "Connector"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.tags.#", "1"), + ), + }, { ResourceName: resourceName, ImportState: true, @@ -100,6 +224,48 @@ func TestAccResourceFiltersOrgLevel(t *testing.T) { }) } +func TestAccResourceFiltersOrgLevelWfFileStore(t *testing.T) { + + id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5)) + name := id + updatedName := fmt.Sprintf("%s_updated", name) + resourceName := "harness_platform_filters.test" + + resource.UnitTest(t, resource.TestCase{ + PreCheck: func() { acctest.TestAccPreCheck(t) }, + ProviderFactories: acctest.ProviderFactories, + CheckDestroy: testAccFiltersOrgLevelDestroy(resourceName), + Steps: []resource.TestStep{ + { + Config: testAccResourceFiltersOrgLevelWFileStore(id, name), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "id", id), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "type", "FileStore"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.tags.#", "1"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.filter_type", "FileStore"), + ), + }, + { + Config: testAccResourceFiltersOrgLevelWFileStore(id, updatedName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "id", id), + resource.TestCheckResourceAttr(resourceName, "name", updatedName), + resource.TestCheckResourceAttr(resourceName, "type", "FileStore"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.tags.#", "1"), + resource.TestCheckResourceAttr(resourceName, "filter_properties.0.filter_type", "FileStore"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + ImportStateIdFunc: acctest.OrgFilterImportStateIdFunc(resourceName), + }, + }, + }) +} + func testAccGetResourceFilters(resourceName string, state *terraform.State) (*nextgen.Filter, error) { r := acctest.TestAccGetResource(resourceName, state) c, ctx := acctest.TestAccGetPlatformClientWithContext() @@ -152,6 +318,36 @@ func buildField(r *terraform.ResourceState, field string) optional.String { } func testAccResourceFilters(id string, name string) string { + return fmt.Sprintf(` + resource "harness_platform_filters" "test" { + identifier = "%[1]s" + name = "%[2]s" + type = "Connector" + filter_properties { + tags = ["foo:bar"] + filter_type = "Connector" + } + filter_visibility = "EveryOne" + } +`, id, name) +} + +func testAccResourceFilterswCreator(id string, name string) string { + return fmt.Sprintf(` + resource "harness_platform_filters" "test" { + identifier = "%[1]s" + name = "%[2]s" + type = "Connector" + filter_properties { + tags = ["foo:bar"] + filter_type = "Connector" + } + filter_visibility = "OnlyCreator" + } +`, id, name) +} + +func testAccResourceFiltersProjectLevel(id string, name string) string { return fmt.Sprintf(` resource "harness_platform_organization" "test" { identifier = "%[1]s" @@ -179,6 +375,53 @@ func testAccResourceFilters(id string, name string) string { } `, id, name) } +func testAccResourceFiltersProjectLevelNoFilterVisiblity(id string, name string) string { + return fmt.Sprintf(` + resource "harness_platform_organization" "test" { + identifier = "%[1]s" + name = "%[2]s" + } + + resource "harness_platform_project" "test" { + identifier = "%[1]s" + name = "%[2]s" + org_id = harness_platform_organization.test.id + color = "#472848" + } + + resource "harness_platform_filters" "test" { + identifier = "%[1]s" + name = "%[2]s" + org_id = harness_platform_project.test.org_id + project_id = harness_platform_project.test.id + type = "Connector" + filter_properties { + tags = ["foo:bar"] + filter_type = "Connector" + } + } +`, id, name) +} + +func testAccResourceFiltersOrgLevelWFileStore(id string, name string) string { + return fmt.Sprintf(` + resource "harness_platform_organization" "test" { + identifier = "%[1]s" + name = "%[2]s" + } + + resource "harness_platform_filters" "test" { + identifier = "%[1]s" + name = "%[2]s" + org_id = harness_platform_organization.test.id + type = "FileStore" + filter_properties { + tags = ["foo:bar"] + filter_type = "FileStore" + } + } +`, id, name) +} func testAccResourceFiltersOrgLevel(id string, name string) string { return fmt.Sprintf(`