diff --git a/examples/schema_site_external_epg/main.tf b/examples/schema_site_external_epg/main.tf index aaa80a99..c8ee311f 100644 --- a/examples/schema_site_external_epg/main.tf +++ b/examples/schema_site_external_epg/main.tf @@ -14,103 +14,63 @@ provider "mso" { platform = "nd" } -resource "mso_site" "test_site" { - name = "test_site" - username = "" # - password = "" # - apic_site_id = "105" - urls = "" # - location = { - lat = 78.946 - long = 95.623 - } +data "mso_tenant" "demo_tenant" { + name = "demo_tenant" + display_name = "demo_tenant" +} + +data "mso_site" "demo_site" { + name = "demo_site" } -resource "mso_tenant" "tenant1" { - name = "test_tenant" - display_name = "test_tenant" - description = "DemoTenant" - site_associations { - site_id = mso_site.test_site.id +resource "mso_schema" "schema_blocks" { + name = "demo_schema_blocks" + template { + name = "Template1" + display_name = "Template1" + tenant_id = data.mso_tenant.demo_tenant.id } } -resource "mso_schema" "schema1" { - name = "test_schema" - template_name = "Template1" - tenant_id = mso_tenant.tenant1.id +resource "mso_schema_site" "demo_schema_site" { + schema_id = mso_schema.schema_blocks.id + template_name = one(mso_schema.schema_blocks.template).name + site_id = data.mso_site.demo_site.id } resource "mso_schema_template_vrf" "vrf1" { - schema_id = mso_schema.schema1.id - template = mso_schema.schema1.template_name - name = "vrf1" - display_name = "vrf1" + schema_id = mso_schema.schema_blocks.id + template = one(mso_schema.schema_blocks.template).name + name = "vrf1" + display_name = "vrf1" + ip_data_plane_learning = "enabled" } resource "mso_schema_template_l3out" "template_l3out" { - schema_id = mso_schema.schema1.id - template_name = mso_schema.schema1.template_name + schema_id = mso_schema.schema_blocks.id + template_name = one(mso_schema.schema_blocks.template).name l3out_name = "l3out1" display_name = "l3out1" - vrf_name = mso_schema_template_vrf.vrf1.id + vrf_name = mso_schema_template_vrf.vrf1.name vrf_schema_id = mso_schema_template_vrf.vrf1.schema_id vrf_template_name = mso_schema_template_vrf.vrf1.template } -resource "mso_schema_template_external_epg" "template_externalepg" { - schema_id = mso_schema.schema1.id - template_name = mso_schema.schema1.template_name - external_epg_name = "temp_epg" - display_name = "temp_epg" - vrf_name = mso_schema_template_vrf.vrf1.id +resource "mso_schema_template_external_epg" "extepg1" { + schema_id = mso_schema.schema_blocks.id + template_name = one(mso_schema.schema_blocks.template).name + external_epg_name = "extepg1" + display_name = "extepg1" + vrf_name = mso_schema_template_vrf.vrf1.name vrf_schema_id = mso_schema_template_vrf.vrf1.schema_id vrf_template_name = mso_schema_template_vrf.vrf1.template + l3out_name = mso_schema_template_l3out.template_l3out.l3out_name } -resource "mso_schema_site" "schema_site_1" { - schema_id = mso_schema.schema1.id - site_id = mso_site.test_site.id - template_name = mso_schema.schema1.template_name -} - -resource "mso_schema_site_vrf" "site_vrf" { - template_name = mso_schema_site.schema_site_1.template_name - site_id = mso_schema_site.schema_site_1.site_id - schema_id = mso_schema_site.schema_site_1.schema_id - vrf_name = mso_schema_template_vrf.vrf1.name -} - -resource "mso_rest" "site_l3out" { - path = "/mso/api/v1/schemas/${mso_schema_site.schema_site_1.schema_id}?validate=false" - method = "PATCH" - payload = <= 4 { + if match[3] == stateExternalEpg { + d.SetId(match[3]) + d.Set("external_epg_name", match[3]) + d.Set("schema_id", match[1]) + d.Set("template_name", match[2]) + d.Set("site_id", apiSiteId) - l3outRef := models.StripQuotes(externalEpgCont.S("l3outRef").String()) - reL3out := regexp.MustCompile("/schemas/(.*)/templates/(.*)/l3outs/(.*)") - matchL3out := reL3out.FindStringSubmatch(l3outRef) - d.Set("l3out_name", matchL3out[3]) + l3outRef := models.StripQuotes(externalEpgCont.S("l3outRef").String()) + if l3outRef != "{}" && l3outRef != "" { + reL3out := regexp.MustCompile("/schemas/(.*?)/templates/(.*?)/l3outs/(.*)") + matchL3out := reL3out.FindStringSubmatch(l3outRef) + log.Printf("[TRACE] resourceMSOSchemaSiteExternalEpgRead l3outRef: %s matchL3out: %s", l3outRef, matchL3out) + if len(matchL3out) >= 4 { + d.Set("l3out_name", matchL3out[3]) + } else { + return fmt.Errorf("Error in parsing l3outRef to get L3Out name") + } + } - found = true - break + found = true + break + } + } else { + return fmt.Errorf("Error in parsing externalEpgRef to get External EPG name") } } } diff --git a/mso/resource_mso_rest.go b/mso/resource_mso_rest.go index 333be983..b81ef99a 100644 --- a/mso/resource_mso_rest.go +++ b/mso/resource_mso_rest.go @@ -96,12 +96,12 @@ func resourceMSORestDelete(d *schema.ResourceData, m interface{}) error { var method, path, payload string path = d.Get("path").(string) payload = d.Get("payload").(string) - - if tempVar, ok := d.GetOk("method"); !ok { + + if _, ok := d.GetOk("method"); !ok { method = "DELETE" msoClient := m.(*client.Client) _, err := MakeRestRequest(msoClient, path, method, payload) - + if err != nil { return err } diff --git a/mso/resource_mso_schema_site_external_epg.go b/mso/resource_mso_schema_site_external_epg.go index a9d216ef..7bb82848 100644 --- a/mso/resource_mso_schema_site_external_epg.go +++ b/mso/resource_mso_schema_site_external_epg.go @@ -76,7 +76,7 @@ func resourceMSOSchemaSiteExternalEpgImport(d *schema.ResourceData, m interface{ stateSiteId := get_attribute[2] found := false stateExternalEpg := get_attribute[4] - for i := 0; i < count; i++ { + for i := 0; i < count && !found; i++ { siteCont, err := cont.ArrayElement(i, "sites") if err != nil { return nil, err @@ -86,7 +86,7 @@ func resourceMSOSchemaSiteExternalEpgImport(d *schema.ResourceData, m interface{ if apiSiteId == stateSiteId { externalEpgCount, err := siteCont.ArrayCount("externalEpgs") if err != nil { - return nil, fmt.Errorf("Unable to get Externalepg list") + return nil, fmt.Errorf("Unable to get External EPG list") } for j := 0; j < externalEpgCount; j++ { externalEpgCont, err := siteCont.ArrayElement(j, "externalEpgs") @@ -94,22 +94,34 @@ func resourceMSOSchemaSiteExternalEpgImport(d *schema.ResourceData, m interface{ return nil, err } externalEpgRef := models.StripQuotes(externalEpgCont.S("externalEpgRef").String()) - re := regexp.MustCompile("/schemas/(.*)/templates/(.*)/externalEpgs/(.*)") + re := regexp.MustCompile("/schemas/(.*?)/templates/(.*?)/externalEpgs/(.*)") match := re.FindStringSubmatch(externalEpgRef) - if match[3] == stateExternalEpg { - d.SetId(match[3]) - d.Set("external_epg_name", match[3]) - d.Set("schema_id", match[1]) - d.Set("template_name", match[2]) - d.Set("site_id", apiSiteId) - - l3outRef := models.StripQuotes(externalEpgCont.S("l3outRef").String()) - reL3out := regexp.MustCompile("/schemas/(.*)/templates/(.*)/l3outs/(.*)") - matchL3out := reL3out.FindStringSubmatch(l3outRef) - d.Set("l3out_name", matchL3out[3]) - - found = true - break + log.Printf("[TRACE] resourceMSOSchemaSiteExternalEpgRead externalEpgRef: %s match: %s", externalEpgRef, match) + if len(match) >= 4 { + if match[3] == stateExternalEpg { + d.SetId(match[3]) + d.Set("external_epg_name", match[3]) + d.Set("schema_id", match[1]) + d.Set("template_name", match[2]) + d.Set("site_id", apiSiteId) + + l3outRef := models.StripQuotes(externalEpgCont.S("l3outRef").String()) + if l3outRef != "{}" && l3outRef != "" { + reL3out := regexp.MustCompile("/schemas/(.*?)/templates/(.*?)/l3outs/(.*)") + matchL3out := reL3out.FindStringSubmatch(l3outRef) + log.Printf("[TRACE] resourceMSOSchemaSiteExternalEpgRead l3outRef: %s matchL3out: %s", l3outRef, matchL3out) + if len(matchL3out) >= 4 { + d.Set("l3out_name", matchL3out[3]) + } else { + return nil, fmt.Errorf("Error in parsing l3outRef to get L3Out name") + } + } + + found = true + break + } + } else { + return nil, fmt.Errorf("Error in parsing externalEpgRef to get External EPG name") } } } @@ -206,7 +218,7 @@ func resourceMSOSchemaSiteExternalEpgRead(d *schema.ResourceData, m interface{}) stateSiteId := d.Get("site_id").(string) found := false stateExternalEpg := d.Get("external_epg_name").(string) - for i := 0; i < count; i++ { + for i := 0; i < count && !found; i++ { siteCont, err := cont.ArrayElement(i, "sites") if err != nil { return err diff --git a/website/docs/d/schema_site_external_epg.html.markdown b/website/docs/d/schema_site_external_epg.html.markdown new file mode 100644 index 00000000..924feae9 --- /dev/null +++ b/website/docs/d/schema_site_external_epg.html.markdown @@ -0,0 +1,33 @@ +--- +layout: "mso" +page_title: "MSO: mso_schema_site_external_epg" +sidebar_current: "docs-mso-data-source-schema_site_external_epg" +description: |- + Data source for MSO Schema Site External Endpoint Groups. +--- + +# mso_schema_site_external_epg # + +Data source for MSO Schema Site External Endpoint Groups. + +```hcl + +data "mso_schema_site_external_epg" "external_epg_1" { + schema_id = data.mso_schema.schema1.id + template_name = "Template1" + site_id = data.mso_site.site1.id + external_epg_name = "external_epg_1" +} + +``` + +## Argument Reference ## + +* `schema_id` - (Required) Schema ID under which you want to deploy the External Endpoint Group. +* `site_id` - (Required) Site ID under which you want to deploy the External Endpoint Group. +* `template_name` - (Required) Template Name under which you want to define the External Endpoint Group. +* `external_epg_name` - (Required) Name of the External Endpoint Group. + +## Attribute Reference ## + +* `l3out_name` - (Read-Only) Name of the L3Out. \ No newline at end of file diff --git a/website/docs/r/schema_site_external_epg.html.markdown b/website/docs/r/schema_site_external_epg.html.markdown new file mode 100644 index 00000000..244695c6 --- /dev/null +++ b/website/docs/r/schema_site_external_epg.html.markdown @@ -0,0 +1,42 @@ +--- +layout: "mso" +page_title: "MSO: mso_schema_site_external_epg" +sidebar_current: "docs-mso-resource-schema_site_external_epg" +description: |- + Manages MSO Schema Site External Endpoint Groups. +--- + +# mso_schema_site_external_epg_selector# + +Manages MSO Schema Site External Endpoint Groups. + +## Example Usage ## +```hcl + +resource "mso_schema_site_external_epg" "external_epg_1" { + schema_id = data.mso_schema.schema1.id + template_name = "Template1" + site_id = data.mso_site.site1.id + external_epg_name = "external_epg_1" +} + +``` + +## Argument Reference ## + +* `schema_id` - (Required) Schema ID under which you want to deploy the External Endpoint Group. +* `site_id` - (Required) Site ID under which you want to deploy the External Endpoint Group. +* `template_name` - (Required) Template Name under which you want to define the External Endpoint Group. +* `external_epg_name` - (Required) Name of the External Endpoint Group. + +## Attribute Reference ## + +* `l3out_name` - (Optional) Name of the L3Out. + +## Importing ## + +An existing MSO Schema Site External Endpoint Group can be [imported][docs-import] into this resource via its Id/path, via the following command: [docs-import]: + +```bash +terraform import mso_schema_site_external_epg.extepg1 {schema_id}/site/{site_id}/externalEPG/{external_epg_name} +``` \ No newline at end of file