diff --git a/equinix/data_source_metal_connection.go b/equinix/data_source_metal_connection.go index 207c60829..28b513b87 100644 --- a/equinix/data_source_metal_connection.go +++ b/equinix/data_source_metal_connection.go @@ -223,6 +223,30 @@ func getConnectionPorts(cps []packngo.ConnectionPort) []map[string]interface{} { return ret } +func getConnectionVlans(conn *packngo.Connection) []int { + var ret []int + + if conn.Type == packngo.ConnectionShared { + order := map[packngo.ConnectionPortRole]int{ + packngo.ConnectionPortPrimary: 0, + packngo.ConnectionPortSecondary: 1, + } + + rawVlans := make([]int, len(conn.Ports)) + for _, p := range conn.Ports { + rawVlans[order[p.Role]] = p.VirtualCircuits[0].VNID + } + + for _, v := range rawVlans { + if v > 0 { + ret = append(ret, v) + } + } + } + + return ret +} + func dataSourceMetalConnectionRead(d *schema.ResourceData, meta interface{}) error { connId := d.Get("connection_id").(string) d.SetId(connId) diff --git a/equinix/data_source_metal_connection_acc_test.go b/equinix/data_source_metal_connection_acc_test.go new file mode 100644 index 000000000..337e1c623 --- /dev/null +++ b/equinix/data_source_metal_connection_acc_test.go @@ -0,0 +1,120 @@ +package equinix + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func TestAccDataSourceMetalConnection_withoutVlans(t *testing.T) { + rInt := acctest.RandInt() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testDataSourceMetalConnectionConfig_withoutVlans(rInt), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair( + "equinix_metal_connection.test", "id", + "data.equinix_metal_connection.test", "id"), + resource.TestCheckResourceAttrPair( + "equinix_metal_connection.test", "vlans.#", + "data.equinix_metal_connection.test", "vlans.#"), + resource.TestCheckResourceAttr( + "data.equinix_metal_connection.test", "vlans.#", "0"), + ), + }, + }, + }) +} + +func testDataSourceMetalConnectionConfig_withoutVlans(r int) string { + return fmt.Sprintf(` + resource "equinix_metal_project" "test" { + name = "tfacc-conn-project-%d" + } + + resource "equinix_metal_connection" "test" { + name = "tfacc-conn-%d" + project_id = equinix_metal_project.test.id + type = "shared" + redundancy = "redundant" + metro = "sv" + speed = "50Mbps" + service_token_type = "a_side" + } + + data "equinix_metal_connection" "test" { + connection_id = equinix_metal_connection.test.id + }`, + r, r) +} + +func TestAccDataSourceMetalConnection_withVlans(t *testing.T) { + rInt := acctest.RandInt() + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testDataSourceMetalConnectionConfig_withVlans(rInt), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair( + "equinix_metal_connection.test", "id", + "data.equinix_metal_connection.test", "id"), + resource.TestCheckResourceAttr( + "data.equinix_metal_connection.test", "vlans.#", "2"), + resource.TestCheckResourceAttrPair( + "equinix_metal_vlan.test1", "vxlan", + "data.equinix_metal_connection.test", "vlans.0"), + resource.TestCheckResourceAttrPair( + "equinix_metal_vlan.test2", "vxlan", + "data.equinix_metal_connection.test", "vlans.1"), + ), + }, + }, + }) +} + +func testDataSourceMetalConnectionConfig_withVlans(r int) string { + return fmt.Sprintf(` + resource "equinix_metal_project" "test" { + name = "tfacc-conn-pro-%d" + } + + resource "equinix_metal_vlan" "test1" { + description = "tfacc-conn-vlan1-%d" + metro = "sv" + project_id = equinix_metal_project.test.id + } + + resource "equinix_metal_vlan" "test2" { + description = "tfacc-conn-vlan2-%d" + metro = "sv" + project_id = equinix_metal_project.test.id + } + + resource "equinix_metal_connection" "test" { + name = "tfacc-conn-%d" + project_id = equinix_metal_project.test.id + type = "shared" + redundancy = "redundant" + metro = "sv" + speed = "50Mbps" + service_token_type = "a_side" + vlans = [ + equinix_metal_vlan.test1.vxlan, + equinix_metal_vlan.test2.vxlan + ] + } + + data "equinix_metal_connection" "test" { + connection_id = equinix_metal_connection.test.id + }`, + r, r, r, r) +} diff --git a/equinix/resource_metal_connection.go b/equinix/resource_metal_connection.go index 26fe481bf..1a0e9fd5a 100644 --- a/equinix/resource_metal_connection.go +++ b/equinix/resource_metal_connection.go @@ -383,6 +383,11 @@ func resourceMetalConnectionRead(d *schema.ResourceData, meta interface{}) error return err } + vlans := getConnectionVlans(conn) + if vlans != nil { + d.Set("vlans", vlans) + } + return setMap(d, map[string]interface{}{ "organization_id": conn.Organization.ID, "project_id": projectId,