diff --git a/mso/datasource_mso_schema_template_contract_test.go b/mso/datasource_mso_schema_template_contract_test.go new file mode 100644 index 00000000..51b8193a --- /dev/null +++ b/mso/datasource_mso_schema_template_contract_test.go @@ -0,0 +1,57 @@ +package mso + +import ( + "fmt" + "regexp" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" +) + +func TestAccMSOSchemaTemplateContractDatasource(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckMSOSchemaTemplateContractDestroy, + Steps: []resource.TestStep{ + { + PreConfig: func() { fmt.Println("Test: Read contract datasource not found error") }, + Config: testAccMSOSchemaTemplateContractDatasourceNotFound(), + ExpectError: regexp.MustCompile("Unable to find the Contract"), + }, + { + PreConfig: func() { fmt.Println("Test: Read contract datasource") }, + Config: testAccMSOSchemaTemplateContractDatasource(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("data.mso_schema_template_contract.contract", "schema_id"), + resource.TestCheckResourceAttr("data.mso_schema_template_contract.contract", "template_name", msoSchemaTemplateName), + resource.TestCheckResourceAttr("data.mso_schema_template_contract.contract", "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("data.mso_schema_template_contract.contract", "display_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("data.mso_schema_template_contract.contract", "filter_type", "bothWay"), + resource.TestCheckResourceAttr("data.mso_schema_template_contract.contract", "scope", "context"), + resource.TestCheckResourceAttr("data.mso_schema_template_contract.contract", "filter_relationship.#", "1"), + resource.TestCheckResourceAttr("data.mso_schema_template_contract.contract", "filter_relationship.0.filter_name", msoSchemaTemplateFilterName), + resource.TestCheckResourceAttr("data.mso_schema_template_contract.contract", "filter_relationship.0.filter_type", "bothWay"), + ), + }, + }, + }) +} + +func testAccMSOSchemaTemplateContractDatasource() string { + return fmt.Sprintf(`%s + data "mso_schema_template_contract" "contract" { + schema_id = mso_schema.%[2]s.id + template_name = "%[3]s" + contract_name = mso_schema_template_contract.%[4]s.contract_name + }`, testAccMSOSchemaTemplateContractConfigCreate(), msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateContractName) +} + +func testAccMSOSchemaTemplateContractDatasourceNotFound() string { + return fmt.Sprintf(`%s + data "mso_schema_template_contract" "contract" { + schema_id = mso_schema.%[2]s.id + template_name = "%[3]s" + contract_name = "non_existing_contract_name" + }`, testAccMSOSchemaTemplateContractConfigCreate(), msoSchemaName, msoSchemaTemplateName) +} diff --git a/mso/resource_mso_schema_template_contract.go b/mso/resource_mso_schema_template_contract.go index f93228a3..f731c7bf 100644 --- a/mso/resource_mso_schema_template_contract.go +++ b/mso/resource_mso_schema_template_contract.go @@ -219,7 +219,8 @@ func resourceMSOTemplateContract() *schema.Resource { "description": &schema.Schema{ Type: schema.TypeString, Optional: true, - Computed: true, + // Removed computed to allow description to be set to an empty string + // Computed: true, }, }), CustomizeDiff: func(diff *schema.ResourceDiff, v interface{}) error { @@ -581,7 +582,7 @@ func resourceMSOTemplateContractUpdate(d *schema.ResourceData, m interface{}) er if d.HasChange("target_dscp") { targetDscp := d.Get("target_dscp").(string) if targetDscp != "" { - err := addPatchPayloadToContainer(payloadCont, "replace", fmt.Sprintf("%s/prio", updatePath), targetDscp) + err := addPatchPayloadToContainer(payloadCont, "replace", fmt.Sprintf("%s/targetDscp", updatePath), targetDscp) if err != nil { return err } @@ -630,11 +631,7 @@ func resourceMSOTemplateContractUpdate(d *schema.ResourceData, m interface{}) er // filterRelationships, filterRelationshipsProviderToConsumer, filterRelationshipsConsumerToProvider := getFilterRelationshipsFromConfig(schemaId, templateName, filterRelationship) if d.HasChange("description") { - var description string - if descr, ok := d.GetOk("description"); ok { - description = descr.(string) - } - err := addPatchPayloadToContainer(payloadCont, "replace", fmt.Sprintf("%s/description", updatePath), description) + err := addPatchPayloadToContainer(payloadCont, "replace", fmt.Sprintf("%s/description", updatePath), d.Get("description")) if err != nil { return err } diff --git a/mso/resource_mso_schema_template_contract_test.go b/mso/resource_mso_schema_template_contract_test.go index 567bf47d..37f03286 100644 --- a/mso/resource_mso_schema_template_contract_test.go +++ b/mso/resource_mso_schema_template_contract_test.go @@ -2,6 +2,7 @@ package mso import ( "fmt" + "regexp" "testing" "github.com/ciscoecosystem/mso-go-client/client" @@ -10,168 +11,509 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/terraform" ) -func TestAccMSOSchemaTemplateContract_Basic(t *testing.T) { - var tc TemplateContract +// msoSchemaTemplateContractSchemaId is set during the first test step's Check to capture the dynamic schema ID for use in the manual deletion PreConfig step. +var msoSchemaTemplateContractSchemaId string + +func TestAccMSOSchemaTemplateContractResourceTwoWay(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckMSOSchemaTemplateContractDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckMSOTemplateContractConfig_basic("bothWay"), - Check: resource.ComposeTestCheckFunc( - testAccCheckMSOSchemaTemplateContractExists("mso_schema_template_contract.template_contract", &tc), - testAccCheckMSOSchemaTemplateContractAttributes("bothWay", &tc), + PreConfig: func() { + fmt.Println("Test: Create contract with name, display_name, filter_type, scope, and filter_relationship") + }, + Config: testAccMSOSchemaTemplateContractConfigCreate(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "template_name", msoSchemaTemplateName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "display_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "filter_type", "bothWay"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "scope", "context"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "description", ""), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "filter_relationship.#", "1"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "filter_relationship.0.filter_name", msoSchemaTemplateFilterName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "filter_relationship.0.filter_type", "bothWay"), + // Capture the dynamic schema ID from state for use in the manual deletion PreConfig step + func(s *terraform.State) error { + rs, ok := s.RootModule().Resources["mso_schema_template_contract."+msoSchemaTemplateContractName] + if !ok { + return fmt.Errorf("Contract resource not found in state") + } + msoSchemaTemplateContractSchemaId = rs.Primary.Attributes["schema_id"] + return nil + }, + ), + }, + { + PreConfig: func() { fmt.Println("Test: Expect error when changing filter_type from bothWay to oneWay") }, + Config: testAccMSOSchemaTemplateContractConfigChangeFilterType(), + ExpectError: regexp.MustCompile(`The filter_type cannot be changed`), + }, + { + PreConfig: func() { fmt.Println("Test: Update contract display_name") }, + Config: testAccMSOSchemaTemplateContractConfigUpdateDisplayName(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "display_name", msoSchemaTemplateContractName+" updated"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "description", ""), + ), + }, + { + PreConfig: func() { fmt.Println("Test: Add contract description") }, + Config: testAccMSOSchemaTemplateContractConfigAddDescription(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "display_name", msoSchemaTemplateContractName+" updated"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "description", "Terraform test contract"), + ), + }, + { + PreConfig: func() { fmt.Println("Test: Remove contract description") }, + Config: testAccMSOSchemaTemplateContractConfigRemoveDescription(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "display_name", msoSchemaTemplateContractName+" updated"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "description", ""), + ), + }, + { + PreConfig: func() { fmt.Println("Test: Update contract scope") }, + Config: testAccMSOSchemaTemplateContractConfigUpdateScope(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "scope", "tenant"), + ), + }, + { + PreConfig: func() { fmt.Println("Test: Update contract priority") }, + Config: testAccMSOSchemaTemplateContractConfigUpdatePriority(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "scope", "tenant"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "priority", "level1"), + ), + }, + { + PreConfig: func() { fmt.Println("Test: Update contract target_dscp") }, + Config: testAccMSOSchemaTemplateContractConfigUpdateDscpPriority(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "scope", "tenant"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "target_dscp", "af11"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "priority", "level1"), + ), + }, + { + PreConfig: func() { fmt.Println("Test: Add second filter_relationship with directives and action") }, + Config: testAccMSOSchemaTemplateContractConfigTwoFilters(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "filter_relationship.#", "2"), + ), + }, + { + PreConfig: func() { fmt.Println("Test: Import contract") }, + ResourceName: "mso_schema_template_contract." + msoSchemaTemplateContractName, + ImportState: true, + ImportStateIdFunc: func(s *terraform.State) (string, error) { + rs, ok := s.RootModule().Resources["mso_schema_template_contract."+msoSchemaTemplateContractName] + if !ok { + return "", fmt.Errorf("Contract resource not found in state") + } + return fmt.Sprintf("%s/templates/%s/contracts/%s", rs.Primary.Attributes["schema_id"], rs.Primary.Attributes["template_name"], rs.Primary.Attributes["contract_name"]), nil + }, + ImportStateVerify: true, + // filter_relationships and directives are deprecated computed attributes that get set during import but not in config + ImportStateVerifyIgnore: []string{"filter_relationships", "directives"}, + }, + { + PreConfig: func() { + fmt.Println("Test: Recreate contract after manual deletion from NDO") + msoClient := testAccProvider.Meta().(*client.Client) + contractRemovePatchPayload := models.GetRemovePatchPayload(fmt.Sprintf("/templates/%s/contracts/%s", msoSchemaTemplateName, msoSchemaTemplateContractName)) + _, err := msoClient.PatchbyID(fmt.Sprintf("api/v1/schemas/%s", msoSchemaTemplateContractSchemaId), contractRemovePatchPayload) + if err != nil { + t.Fatalf("Failed to manually delete contract: %v", err) + } + }, + Config: testAccMSOSchemaTemplateContractConfigTwoFilters(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "filter_relationship.#", "2"), + ), + }, + { + PreConfig: func() { fmt.Println("Test: Remove second filter_relationship") }, + Config: testAccMSOSchemaTemplateContractConfigSingleFilter(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "contract_name", msoSchemaTemplateContractName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "filter_relationship.#", "1"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "filter_relationship.0.filter_name", msoSchemaTemplateFilterName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractName, "filter_relationship.0.filter_type", "bothWay"), ), }, }, }) } -func TestAccMSOSchemaTemplateContract_Update(t *testing.T) { - var tc TemplateContract - +func TestAccMSOSchemaTemplateContractResourceOneWay(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckMSOSchemaTemplateContractDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckMSOTemplateContractConfig_basic("bothWay"), - Check: resource.ComposeTestCheckFunc( - testAccCheckMSOSchemaTemplateContractExists("mso_schema_template_contract.template_contract", &tc), - testAccCheckMSOSchemaTemplateContractAttributes("bothWay", &tc), + PreConfig: func() { + fmt.Println("Test: Create oneWay contract with provider_to_consumer and consumer_to_provider filter_relationships") + }, + Config: testAccMSOSchemaTemplateContractOneWayConfigCreate(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "template_name", msoSchemaTemplateName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "contract_name", msoSchemaTemplateContractOneWayName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "display_name", msoSchemaTemplateContractOneWayName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "filter_type", "oneWay"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "scope", "context"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "filter_relationship.#", "2"), ), }, { - Config: testAccCheckMSOTemplateContractConfig_basic("oneWay"), - Check: resource.ComposeTestCheckFunc( - testAccCheckMSOSchemaTemplateContractExists("mso_schema_template_contract.template_contract", &tc), - testAccCheckMSOSchemaTemplateContractAttributes("oneWay", &tc), + PreConfig: func() { fmt.Println("Test: Expect error when changing filter_type from oneWay to bothWay") }, + Config: testAccMSOSchemaTemplateContractOneWayConfigChangeFilterType(), + ExpectError: regexp.MustCompile(`The filter_type cannot be changed`), + }, + { + PreConfig: func() { fmt.Println("Test: Add bothWay filter alongside directional filters") }, + Config: testAccMSOSchemaTemplateContractOneWayConfigAddBothWay(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "schema_id"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "contract_name", msoSchemaTemplateContractOneWayName), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "filter_type", "oneWay"), + resource.TestCheckResourceAttr("mso_schema_template_contract."+msoSchemaTemplateContractOneWayName, "filter_relationship.#", "3"), ), }, + { + PreConfig: func() { fmt.Println("Test: Import oneWay contract") }, + ResourceName: "mso_schema_template_contract." + msoSchemaTemplateContractOneWayName, + ImportState: true, + ImportStateIdFunc: func(s *terraform.State) (string, error) { + rs, ok := s.RootModule().Resources["mso_schema_template_contract."+msoSchemaTemplateContractOneWayName] + if !ok { + return "", fmt.Errorf("Contract resource not found in state") + } + return fmt.Sprintf("%s/templates/%s/contracts/%s", rs.Primary.Attributes["schema_id"], rs.Primary.Attributes["template_name"], rs.Primary.Attributes["contract_name"]), nil + }, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"filter_relationships", "directives"}, + }, }, }) } -func testAccCheckMSOTemplateContractConfig_basic(filter_type string) string { - return fmt.Sprintf(` - resource "mso_schema_template_contract" "template_contract" { - schema_id = "5c4d5bb72700000401f80948" - template_name = "Template1" - contract_name = "C1" - display_name = "C1" - filter_type = "%v" - scope = "context" - filter_relationships = { - filter_schema_id = "5c4d5bb72700000401f80948" - filter_template_name = "Template1" - filter_name = "Any" +// Prerequisite config: site + tenant + schema + filter +func testAccMSOSchemaTemplateContractPrerequisiteConfig() string { + return fmt.Sprintf(`%s%s%s%s`, testSiteConfigAnsibleTest(), testTenantConfig(), testSchemaConfig(), testSchemaTemplateFilterEntryConfig()) +} + +// Prerequisite config with two filters +func testAccMSOSchemaTemplateContractPrerequisiteWithTwoFiltersConfig() string { + return fmt.Sprintf(`%s%s`, testAccMSOSchemaTemplateContractPrerequisiteConfig(), testSchemaTemplateFilterEntryConfig2()) +} + +func testAccMSOSchemaTemplateContractConfigChangeFilterType() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s" + filter_type = "oneWay" + scope = "context" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" } - directives = ["log"] - } -`, filter_type) + }`, testAccMSOSchemaTemplateContractPrerequisiteConfig(), msoSchemaTemplateContractName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName) } -func testAccCheckMSOSchemaTemplateContractExists(contractName string, tc *TemplateContract) resource.TestCheckFunc { - return func(s *terraform.State) error { - client := testAccProvider.Meta().(*client.Client) - rs, error := s.RootModule().Resources[contractName] +func testAccMSOSchemaTemplateContractConfigCreate() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s" + filter_type = "bothWay" + scope = "context" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" + } + }`, testAccMSOSchemaTemplateContractPrerequisiteConfig(), msoSchemaTemplateContractName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName) +} - if !error { - return fmt.Errorf("Contract %s not found", contractName) +func testAccMSOSchemaTemplateContractConfigUpdateDisplayName() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s updated" + filter_type = "bothWay" + scope = "context" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" } - if rs.Primary.ID == "" { - return fmt.Errorf("No Schema id was set") + }`, testAccMSOSchemaTemplateContractPrerequisiteConfig(), msoSchemaTemplateContractName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName) +} + +func testAccMSOSchemaTemplateContractConfigAddDescription() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s updated" + filter_type = "bothWay" + scope = "context" + description = "Terraform test contract" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" } + }`, testAccMSOSchemaTemplateContractPrerequisiteConfig(), msoSchemaTemplateContractName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName) +} - cont, err := client.GetViaURL("api/v1/schemas/5c4d5bb72700000401f80948") - if err != nil { - return err +func testAccMSOSchemaTemplateContractConfigRemoveDescription() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s updated" + filter_type = "bothWay" + scope = "context" + description = "" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" } - count, err := cont.ArrayCount("templates") - if err != nil { - return fmt.Errorf("No Template found") + }`, testAccMSOSchemaTemplateContractPrerequisiteConfig(), msoSchemaTemplateContractName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName) +} + +func testAccMSOSchemaTemplateContractConfigUpdateScope() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s updated" + filter_type = "bothWay" + scope = "tenant" + description = "" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" } - tp := TemplateContract{} - found := false - for i := 0; i < count; i++ { - tempCont, err := cont.ArrayElement(i, "templates") - if err != nil { - return err - } + }`, testAccMSOSchemaTemplateContractPrerequisiteConfig(), msoSchemaTemplateContractName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName) +} - apiTemplateName := models.StripQuotes(tempCont.S("name").String()) - if apiTemplateName == "Template1" { - contractCount, err := tempCont.ArrayCount("contracts") - if err != nil { - return fmt.Errorf("Unable to get Contract list") - } - for j := 0; j < contractCount; j++ { - contractCont, err := tempCont.ArrayElement(j, "contracts") - if err != nil { - return err - } - apiContract := models.StripQuotes(contractCont.S("name").String()) - if apiContract == "C1" { - tp.display_name = models.StripQuotes(contractCont.S("displayName").String()) - tp.filter_type = models.StripQuotes(contractCont.S("filterType").String()) - tp.scope = models.StripQuotes(contractCont.S("scope").String()) +func testAccMSOSchemaTemplateContractConfigUpdatePriority() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s updated" + filter_type = "bothWay" + scope = "tenant" + priority = "level1" + description = "" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" + } + }`, testAccMSOSchemaTemplateContractPrerequisiteConfig(), msoSchemaTemplateContractName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName) +} - found = true - break +func testAccMSOSchemaTemplateContractConfigUpdateDscpPriority() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s updated" + filter_type = "bothWay" + scope = "tenant" + target_dscp = "af11" + priority = "level1" + description = "" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" + } + }`, testAccMSOSchemaTemplateContractPrerequisiteConfig(), msoSchemaTemplateContractName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName) +} - } - } - } +func testAccMSOSchemaTemplateContractConfigTwoFilters() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s updated" + filter_type = "bothWay" + scope = "tenant" + target_dscp = "af11" + priority = "level1" + description = "" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" } + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[6]s.name + filter_type = "bothWay" + directives = ["log"] + action = "deny" + priority = "level3" + } + }`, testAccMSOSchemaTemplateContractPrerequisiteWithTwoFiltersConfig(), msoSchemaTemplateContractName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName, msoSchemaTemplateFilterName2) +} - if !found { - return fmt.Errorf("Contract not found from API") +func testAccMSOSchemaTemplateContractConfigSingleFilter() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s updated" + filter_type = "bothWay" + scope = "tenant" + target_dscp = "af11" + priority = "level1" + description = "" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" } + }`, testAccMSOSchemaTemplateContractPrerequisiteWithTwoFiltersConfig(), msoSchemaTemplateContractName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName) +} - tp1 := &tp +// oneWay contract configs - *tc = *tp1 - return nil - } +func testAccMSOSchemaTemplateContractOneWayPrerequisiteConfig() string { + return testAccMSOSchemaTemplateContractPrerequisiteWithTwoFiltersConfig() +} + +func testAccMSOSchemaTemplateContractOneWayConfigCreate() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s" + filter_type = "oneWay" + scope = "context" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "provider_to_consumer" + } + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[6]s.name + filter_type = "consumer_to_provider" + } + }`, testAccMSOSchemaTemplateContractOneWayPrerequisiteConfig(), msoSchemaTemplateContractOneWayName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName, msoSchemaTemplateFilterName2) +} + +func testAccMSOSchemaTemplateContractOneWayConfigChangeFilterType() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s" + filter_type = "bothWay" + scope = "context" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "provider_to_consumer" + } + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[6]s.name + filter_type = "consumer_to_provider" + } + }`, testAccMSOSchemaTemplateContractOneWayPrerequisiteConfig(), msoSchemaTemplateContractOneWayName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName, msoSchemaTemplateFilterName2) +} + +func testAccMSOSchemaTemplateContractOneWayConfigAddBothWay() string { + return fmt.Sprintf(`%[1]s + resource "mso_schema_template_contract" "%[2]s" { + schema_id = mso_schema.%[3]s.id + template_name = "%[4]s" + contract_name = "%[2]s" + display_name = "%[2]s" + filter_type = "oneWay" + scope = "context" + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "bothWay" + } + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[5]s.name + filter_type = "provider_to_consumer" + } + filter_relationship { + filter_name = mso_schema_template_filter_entry.%[6]s.name + filter_type = "consumer_to_provider" + } + }`, testAccMSOSchemaTemplateContractOneWayPrerequisiteConfig(), msoSchemaTemplateContractOneWayName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateFilterName, msoSchemaTemplateFilterName2) } func testAccCheckMSOSchemaTemplateContractDestroy(s *terraform.State) error { client := testAccProvider.Meta().(*client.Client) for _, rs := range s.RootModule().Resources { - if rs.Type == "mso_schema_template_contract" { - cont, err := client.GetViaURL("api/v1/schemas/5c4d5bb72700000401f80948") + schemaID := rs.Primary.Attributes["schema_id"] + con, err := client.GetViaURL(fmt.Sprintf("api/v1/schemas/%s", schemaID)) if err != nil { return nil - } else { - count, err := cont.ArrayCount("templates") + } + count, err := con.ArrayCount("templates") + if err != nil { + return fmt.Errorf("No Template found") + } + for i := 0; i < count; i++ { + tempCont, err := con.ArrayElement(i, "templates") if err != nil { - return fmt.Errorf("No Template found") + return fmt.Errorf("No template exists") } - for i := 0; i < count; i++ { - tempCont, err := cont.ArrayElement(i, "templates") + contractCount, err := tempCont.ArrayCount("contracts") + if err != nil { + return fmt.Errorf("Unable to get Contract list") + } + for j := 0; j < contractCount; j++ { + contractCont, err := tempCont.ArrayElement(j, "contracts") if err != nil { - return fmt.Errorf("No Template exists") + return err } - apiTemplateName := models.StripQuotes(tempCont.S("name").String()) - if apiTemplateName == "Template1" { - contractCount, err := tempCont.ArrayCount("contracts") - if err != nil { - return fmt.Errorf("Unable to get Contract list") - } - for j := 0; j < contractCount; j++ { - contractCont, err := tempCont.ArrayElement(j, "contracts") - if err != nil { - return err - } - apiContract := models.StripQuotes(contractCont.S("name").String()) - if apiContract == "C1" { - return fmt.Errorf("template contract still exists.") - } - } + name := models.StripQuotes(contractCont.S("name").String()) + if rs.Primary.Attributes["contract_name"] == name { + return fmt.Errorf("Schema Template Contract record still exists") } } } @@ -179,25 +521,3 @@ func testAccCheckMSOSchemaTemplateContractDestroy(s *terraform.State) error { } return nil } -func testAccCheckMSOSchemaTemplateContractAttributes(filter_type string, tc *TemplateContract) resource.TestCheckFunc { - return func(s *terraform.State) error { - if filter_type != tc.filter_type { - return fmt.Errorf("Bad Template Contract filter_type %v", tc.filter_type) - } - - if "C1" != tc.display_name { - return fmt.Errorf("Bad Template Contract display name %s", tc.display_name) - } - - if "context" != tc.scope { - return fmt.Errorf("Bad Template Contract Scope name %s", tc.scope) - } - return nil - } -} - -type TemplateContract struct { - display_name string - scope string - filter_type string -} diff --git a/mso/test_constants.go b/mso/test_constants.go index d6ac91e7..918da2ad 100644 --- a/mso/test_constants.go +++ b/mso/test_constants.go @@ -28,7 +28,9 @@ var msoFabricPolicyTemplateL3DomainName = acctest.RandStringFromCharSet(10, acct var msoFabricPolicyTemplateSyncEInterfacePolicyName = acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) var msoFabricPolicyTemplateMacsecPolicyName = acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) var msoSchemaTemplateFilterName = acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) +var msoSchemaTemplateFilterName2 = acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) var msoSchemaTemplateContractName = acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) +var msoSchemaTemplateContractOneWayName = acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) var msoSchemaTemplateBdL3MulticastName = acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) var msoSchemaTemplateVrfL3MulticastName = acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) @@ -292,3 +294,16 @@ resource "mso_schema_template_anp_epg_subnet" "%[1]s_subnet" { } `, msoSchemaTemplateAnpEpgName, msoSchemaName, msoSchemaTemplateName, msoSchemaTemplateAnpName, msoSchemaTemplateAnpEpgName, msoSchemaTemplateAnpEpgSubnetIp) } + +func testSchemaTemplateFilterEntryConfig2() string { + return fmt.Sprintf(` +resource "mso_schema_template_filter_entry" "%[1]s" { + schema_id = mso_schema.%[2]s.id + template_name = "%[3]s" + name = "%[1]s" + display_name = "%[1]s" + entry_name = "%[1]s_entry" + entry_display_name = "%[1]s_entry" +} +`, msoSchemaTemplateFilterName2, msoSchemaName, msoSchemaTemplateName) +}