diff --git a/internal/resources/metal/vlan/datasource.go b/internal/resources/metal/vlan/datasource.go index 9a751d450..a912cc663 100644 --- a/internal/resources/metal/vlan/datasource.go +++ b/internal/resources/metal/vlan/datasource.go @@ -5,12 +5,11 @@ import ( "fmt" "strings" - equinix_errors "github.com/equinix/terraform-provider-equinix/internal/errors" + "github.com/equinix/equinix-sdk-go/services/metalv1" "github.com/equinix/terraform-provider-equinix/internal/framework" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" - "github.com/packethost/packngo" ) func NewDataSource() datasource.DataSource { @@ -45,8 +44,7 @@ func (r *DataSource) Read( req datasource.ReadRequest, resp *datasource.ReadResponse, ) { - r.Meta.AddFwModuleToMetalUserAgent(ctx, req.ProviderMeta) - client := r.Meta.Metal + client := r.Meta.NewMetalClientForFramework(ctx, req.ProviderMeta) var data DataSourceModel resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) @@ -57,49 +55,42 @@ func (r *DataSource) Read( if data.VlanID.IsNull() && (data.Vxlan.IsNull() && data.ProjectID.IsNull() && data.Metro.IsNull() && data.Facility.IsNull()) { resp.Diagnostics.AddError("Error fetching Vlan datasource", - equinix_errors. - FriendlyError(fmt.Errorf("You must set either vlan_id or a combination of vxlan, project_id, and, metro or facility")). - Error()) + "You must set either vlan_id or a combination of vxlan, project_id, and, metro or facility") return } - var vlan *packngo.VirtualNetwork + var vlan *metalv1.VirtualNetwork if !data.VlanID.IsNull() { var err error - vlan, _, err = client.ProjectVirtualNetworks.Get( + vlan, _, err = client.VLANsApi.GetVirtualNetwork( + ctx, data.VlanID.ValueString(), - &packngo.GetOptions{Includes: []string{"assigned_to"}}, - ) + ).Include([]string{"assigned_to"}).Execute() if err != nil { - resp.Diagnostics.AddError("Error fetching Vlan using vlanId", equinix_errors.FriendlyError(err).Error()) + resp.Diagnostics.AddError("Error fetching Vlan using vlanId", err.Error()) return } } else { - vlans, _, err := client.ProjectVirtualNetworks.List( + vlans, _, err := client.VLANsApi.FindVirtualNetworks( + ctx, data.ProjectID.ValueString(), - &packngo.GetOptions{Includes: []string{"assigned_to"}}, - ) + ).Include([]string{"assigned_to"}).Execute() if err != nil { resp.Diagnostics.AddError("Error fetching vlan list for projectId", - equinix_errors.FriendlyError(err).Error()) + err.Error()) return } vlan, err = MatchingVlan(vlans.VirtualNetworks, int(data.Vxlan.ValueInt64()), data.ProjectID.ValueString(), data.Facility.ValueString(), data.Metro.ValueString()) if err != nil { - resp.Diagnostics.AddError("Error expected vlan not found", equinix_errors.FriendlyError(err).Error()) + resp.Diagnostics.AddError("Error expected vlan not found", err.Error()) return } } - assignedDevices := []string{} - for _, d := range vlan.Instances { - assignedDevices = append(assignedDevices, d.ID) - } - // Set state to fully populated data resp.Diagnostics.Append(data.parse(vlan)...) if resp.Diagnostics.HasError() { @@ -110,26 +101,27 @@ func (r *DataSource) Read( resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) } -func MatchingVlan(vlans []packngo.VirtualNetwork, vxlan int, projectID, facility, metro string) (*packngo.VirtualNetwork, error) { - matches := []packngo.VirtualNetwork{} +func MatchingVlan(vlans []metalv1.VirtualNetwork, vxlan int, projectID, facility, metro string) (*metalv1.VirtualNetwork, error) { + matches := []metalv1.VirtualNetwork{} for _, v := range vlans { - if vxlan != 0 && v.VXLAN != vxlan { + if vxlan != 0 && int(v.GetVxlan()) != vxlan { continue } - if facility != "" && !strings.EqualFold(v.FacilityCode, facility) { + facility_code, ok := v.AdditionalProperties["facility_code"].(string) + if ok && facility != "" && !strings.EqualFold(facility_code, facility) { continue } - if metro != "" && !strings.EqualFold(v.MetroCode, metro) { + if metro != "" && !strings.EqualFold(v.GetMetroCode(), metro) { continue } matches = append(matches, v) } if len(matches) > 1 { - return nil, equinix_errors.FriendlyError(fmt.Errorf("Project %s has more than one matching VLAN", projectID)) + return nil, fmt.Errorf("Project %s has more than one matching VLAN", projectID) } if len(matches) == 0 { - return nil, equinix_errors.FriendlyError(fmt.Errorf("Project %s does not have matching VLANs for vlan [%d] and metro [%s]", projectID, vxlan, metro)) + return nil, fmt.Errorf("Project %s does not have matching VLANs for vlan [%d] and metro [%s]", projectID, vxlan, metro) } return &matches[0], nil } diff --git a/internal/resources/metal/vlan/datasource_test.go b/internal/resources/metal/vlan/datasource_test.go index cae8a7deb..ba6e29883 100644 --- a/internal/resources/metal/vlan/datasource_test.go +++ b/internal/resources/metal/vlan/datasource_test.go @@ -1,6 +1,7 @@ package vlan_test import ( + "context" "fmt" "reflect" "testing" @@ -9,11 +10,11 @@ import ( "github.com/equinix/terraform-provider-equinix/internal/config" "github.com/equinix/terraform-provider-equinix/internal/resources/metal/vlan" + "github.com/equinix/equinix-sdk-go/services/metalv1" "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/plancheck" "github.com/hashicorp/terraform-plugin-testing/terraform" - "github.com/packethost/packngo" ) func TestAccDataSourceMetalVlan_byVxlanMetro(t *testing.T) { @@ -181,7 +182,7 @@ data "equinix_metal_vlan" "dsvlan" { func TestMetalVlan_matchingVlan(t *testing.T) { type args struct { - vlans []packngo.VirtualNetwork + vlans []metalv1.VirtualNetwork vxlan int projectID string facility string @@ -190,52 +191,52 @@ func TestMetalVlan_matchingVlan(t *testing.T) { tests := []struct { name string args args - want *packngo.VirtualNetwork + want *metalv1.VirtualNetwork wantErr bool }{ { name: "MatchingVLAN", args: args{ - vlans: []packngo.VirtualNetwork{{VXLAN: 123}}, + vlans: []metalv1.VirtualNetwork{{Vxlan: metalv1.PtrInt32(123)}}, vxlan: 123, projectID: "", facility: "", metro: "", }, - want: &packngo.VirtualNetwork{VXLAN: 123}, + want: &metalv1.VirtualNetwork{Vxlan: metalv1.PtrInt32(123)}, wantErr: false, }, { name: "MatchingFac", args: args{ - vlans: []packngo.VirtualNetwork{{FacilityCode: "fac"}}, + vlans: []metalv1.VirtualNetwork{{AdditionalProperties: map[string]interface{}{"facility_code": "fac"}}}, facility: "fac", }, - want: &packngo.VirtualNetwork{FacilityCode: "fac"}, + want: &metalv1.VirtualNetwork{AdditionalProperties: map[string]interface{}{"facility_code": "fac"}}, wantErr: false, }, { name: "MatchingMet", args: args{ - vlans: []packngo.VirtualNetwork{{MetroCode: "met"}}, + vlans: []metalv1.VirtualNetwork{{MetroCode: metalv1.PtrString("met")}}, metro: "met", }, - want: &packngo.VirtualNetwork{MetroCode: "met"}, + want: &metalv1.VirtualNetwork{MetroCode: metalv1.PtrString("met")}, wantErr: false, }, { name: "SecondMatch", args: args{ - vlans: []packngo.VirtualNetwork{{FacilityCode: "fac"}, {MetroCode: "met"}}, + vlans: []metalv1.VirtualNetwork{{AdditionalProperties: map[string]interface{}{"facility_code": "fac"}}, {MetroCode: metalv1.PtrString("met")}}, metro: "met", }, - want: &packngo.VirtualNetwork{MetroCode: "met"}, + want: &metalv1.VirtualNetwork{MetroCode: metalv1.PtrString("met")}, wantErr: false, }, { name: "TwoMatches", args: args{ - vlans: []packngo.VirtualNetwork{{MetroCode: "met"}, {MetroCode: "met"}}, + vlans: []metalv1.VirtualNetwork{{MetroCode: metalv1.PtrString("met")}, {MetroCode: metalv1.PtrString("met")}}, metro: "met", }, want: nil, @@ -244,10 +245,10 @@ func TestMetalVlan_matchingVlan(t *testing.T) { { name: "ComplexMatch", args: args{ - vlans: []packngo.VirtualNetwork{{VXLAN: 987, FacilityCode: "fac", MetroCode: "skip"}, {VXLAN: 123, FacilityCode: "fac", MetroCode: "met"}, {VXLAN: 456, FacilityCode: "fac", MetroCode: "nope"}}, + vlans: []metalv1.VirtualNetwork{{Vxlan: metalv1.PtrInt32(987), AdditionalProperties: map[string]interface{}{"facility_code": "fac"}, MetroCode: metalv1.PtrString("skip")}, {Vxlan: metalv1.PtrInt32(123), AdditionalProperties: map[string]interface{}{"facility_code": "fac"}, MetroCode: metalv1.PtrString("met")}, {Vxlan: metalv1.PtrInt32(456), AdditionalProperties: map[string]interface{}{"facility_code": "fac"}, MetroCode: metalv1.PtrString("nope")}}, metro: "met", }, - want: &packngo.VirtualNetwork{VXLAN: 123, FacilityCode: "fac", MetroCode: "met"}, + want: &metalv1.VirtualNetwork{Vxlan: metalv1.PtrInt32(123), AdditionalProperties: map[string]interface{}{"facility_code": "fac"}, MetroCode: metalv1.PtrString("met")}, wantErr: false, }, { @@ -278,13 +279,13 @@ func TestMetalVlan_matchingVlan(t *testing.T) { } func testAccMetalDatasourceVlanCheckDestroyed(s *terraform.State) error { - client := acceptance.TestAccProvider.Meta().(*config.Config).Metal + client := acceptance.TestAccProvider.Meta().(*config.Config).NewMetalClientForTesting() for _, rs := range s.RootModule().Resources { if rs.Type != "equinix_metal_vlan" { continue } - if _, _, err := client.ProjectVirtualNetworks.Get(rs.Primary.ID, nil); err == nil { + if _, _, err := client.VLANsApi.GetVirtualNetwork(context.Background(), rs.Primary.ID).Execute(); err == nil { return fmt.Errorf("Data source VLAN still exists") } } diff --git a/internal/resources/metal/vlan/models.go b/internal/resources/metal/vlan/models.go index 920e2c42d..ceef78528 100644 --- a/internal/resources/metal/vlan/models.go +++ b/internal/resources/metal/vlan/models.go @@ -5,9 +5,9 @@ import ( "fmt" "strings" + "github.com/equinix/equinix-sdk-go/services/metalv1" "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/packethost/packngo" ) type DataSourceModel struct { @@ -21,29 +21,29 @@ type DataSourceModel struct { AssignedDevicesIds types.List `tfsdk:"assigned_devices_ids"` } -func (m *DataSourceModel) parse(vlan *packngo.VirtualNetwork) (d diag.Diagnostics) { - m.ID = types.StringValue(vlan.ID) - m.VlanID = types.StringValue(vlan.ID) - m.Vxlan = types.Int64Value(int64(vlan.VXLAN)) +func (m *DataSourceModel) parse(vlan *metalv1.VirtualNetwork) (d diag.Diagnostics) { + m.ID = types.StringValue(vlan.GetId()) + m.VlanID = types.StringValue(vlan.GetId()) + m.Vxlan = types.Int64Value(int64(vlan.GetVxlan())) m.Facility = types.StringValue("") - if vlan.Description != "" { - m.Description = types.StringValue(vlan.Description) + if vlan.GetDescription() != "" { + m.Description = types.StringValue(vlan.GetDescription()) } - if vlan.Project.ID != "" { - m.ProjectID = types.StringValue(vlan.Project.ID) + if vlan.AssignedTo != nil { + m.ProjectID = types.StringValue(vlan.AssignedTo.GetId()) } if vlan.Facility != nil { - m.Facility = types.StringValue(strings.ToLower(vlan.Facility.Code)) - m.Metro = types.StringValue(strings.ToLower(vlan.Facility.Metro.Code)) + facility_code := vlan.Facility.AdditionalProperties["facility_code"].(string) + m.Facility = types.StringValue(strings.ToLower(facility_code)) } if vlan.Metro != nil { if m.Metro.IsNull() { - m.Metro = types.StringValue(vlan.Metro.Code) - } else if !strings.EqualFold(m.Metro.ValueString(), vlan.Metro.Code) { + m.Metro = types.StringValue(vlan.Metro.GetCode()) + } else if !strings.EqualFold(m.Metro.ValueString(), vlan.Metro.GetCode()) { d.AddWarning( "unexpected value for metro", fmt.Sprintf("expected vlan %v to have metro %v, but metro was %v", @@ -53,7 +53,7 @@ func (m *DataSourceModel) parse(vlan *packngo.VirtualNetwork) (d diag.Diagnostic deviceIds := make([]types.String, 0, len(vlan.Instances)) for _, device := range vlan.Instances { - deviceIds = append(deviceIds, types.StringValue(device.ID)) + deviceIds = append(deviceIds, types.StringValue(device.GetId())) } return m.AssignedDevicesIds.ElementsAs(context.Background(), &deviceIds, false) @@ -68,28 +68,28 @@ type ResourceModel struct { Description types.String `tfsdk:"description"` } -func (m *ResourceModel) parse(vlan *packngo.VirtualNetwork) (d diag.Diagnostics) { - m.ID = types.StringValue(vlan.ID) - m.Vxlan = types.Int64Value(int64(vlan.VXLAN)) +func (m *ResourceModel) parse(vlan *metalv1.VirtualNetwork) (d diag.Diagnostics) { + m.ID = types.StringValue(vlan.GetId()) + m.Vxlan = types.Int64Value(int64(vlan.GetVxlan())) m.Facility = types.StringValue("") - if vlan.Description != "" { - m.Description = types.StringValue(vlan.Description) + if vlan.GetDescription() != "" { + m.Description = types.StringValue(vlan.GetDescription()) } - if vlan.Project.ID != "" { - m.ProjectID = types.StringValue(vlan.Project.ID) + if vlan.AssignedTo != nil { + m.ProjectID = types.StringValue(vlan.AssignedTo.GetId()) } if vlan.Facility != nil { - m.Facility = types.StringValue(strings.ToLower(vlan.Facility.Code)) - m.Metro = types.StringValue(strings.ToLower(vlan.Facility.Metro.Code)) + facility_code := vlan.Facility.AdditionalProperties["facility_code"].(string) + m.Facility = types.StringValue(strings.ToLower(facility_code)) } if vlan.Metro != nil { if m.Metro.IsNull() { - m.Metro = types.StringValue(vlan.Metro.Code) - } else if !strings.EqualFold(m.Metro.ValueString(), vlan.Metro.Code) { + m.Metro = types.StringValue(vlan.Metro.GetCode()) + } else if !strings.EqualFold(m.Metro.ValueString(), vlan.Metro.GetCode()) { d.AddError( "unexpected value for metro", fmt.Sprintf("expected vlan %v to have metro %v, but metro was %v", diff --git a/internal/resources/metal/vlan/resource.go b/internal/resources/metal/vlan/resource.go index 80d13d0c1..219082399 100644 --- a/internal/resources/metal/vlan/resource.go +++ b/internal/resources/metal/vlan/resource.go @@ -2,20 +2,21 @@ package vlan import ( "context" - "errors" "fmt" + "net/http" + "path" "strings" equinix_errors "github.com/equinix/terraform-provider-equinix/internal/errors" "github.com/equinix/terraform-provider-equinix/internal/framework" + "github.com/equinix/equinix-sdk-go/services/metalv1" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" - "github.com/packethost/packngo" ) var ( - vlanDefaultIncludes = []string{"assigned_to", "facility", "metro"} + vlanDefaultIncludes = []string{"assigned_to", "metro"} ) type Resource struct { @@ -49,8 +50,7 @@ func (r *Resource) Schema( } func (r *Resource) Create(ctx context.Context, request resource.CreateRequest, response *resource.CreateResponse) { - r.Meta.AddFwModuleToMetalUserAgent(ctx, request.ProviderMeta) - client := r.Meta.Metal + client := r.Meta.NewMetalClientForFramework(ctx, request.ProviderMeta) var data ResourceModel response.Diagnostics.Append(request.Config.Get(ctx, &data)...) @@ -60,36 +60,37 @@ func (r *Resource) Create(ctx context.Context, request resource.CreateRequest, r if data.Facility.IsNull() && data.Metro.IsNull() { response.Diagnostics.AddError("Invalid input params", - equinix_errors.FriendlyError(errors.New("one of facility or metro must be configured")).Error()) + "one of facility or metro must be configured") return } if !data.Facility.IsNull() && !data.Vxlan.IsNull() { response.Diagnostics.AddError("Invalid input params", - equinix_errors.FriendlyError(errors.New("you can set vxlan only for metro vlan")).Error()) + "you can set vxlan only for metro vlan") return } - createRequest := &packngo.VirtualNetworkCreateRequest{ - ProjectID: data.ProjectID.ValueString(), - Description: data.Description.ValueString(), + createRequest := metalv1.VirtualNetworkCreateInput{ + Description: data.Description.ValueStringPointer(), } if !data.Metro.IsNull() { - createRequest.Metro = strings.ToLower(data.Metro.ValueString()) - createRequest.VXLAN = int(data.Vxlan.ValueInt64()) + createRequest.Metro = metalv1.PtrString(strings.ToLower(data.Metro.ValueString())) + } + if !data.Vxlan.IsNull() { + createRequest.Vxlan = metalv1.PtrInt32(int32(data.Vxlan.ValueInt64())) } if !data.Facility.IsNull() { - createRequest.Facility = data.Facility.ValueString() + createRequest.Facility = data.Facility.ValueStringPointer() } - vlan, _, err := client.ProjectVirtualNetworks.Create(createRequest) + vlan, _, err := client.VLANsApi.CreateVirtualNetwork(ctx, data.ProjectID.ValueString()).VirtualNetworkCreateInput(createRequest).Execute() if err != nil { - response.Diagnostics.AddError("Error creating Vlan", equinix_errors.FriendlyError(err).Error()) + response.Diagnostics.AddError("Error creating Vlan", err.Error()) return } // get the current state of newly created vlan with default include fields - vlan, _, err = client.ProjectVirtualNetworks.Get(vlan.ID, &packngo.GetOptions{Includes: vlanDefaultIncludes}) + vlan, err = loadVlan(ctx, client, vlan.GetId()) if err != nil { - response.Diagnostics.AddError("Error reading Vlan after create", equinix_errors.FriendlyError(err).Error()) + response.Diagnostics.AddError("Error reading Vlan after create", err.Error()) return } @@ -104,8 +105,7 @@ func (r *Resource) Create(ctx context.Context, request resource.CreateRequest, r } func (r *Resource) Read(ctx context.Context, request resource.ReadRequest, response *resource.ReadResponse) { - r.Meta.AddFwModuleToMetalUserAgent(ctx, request.ProviderMeta) - client := r.Meta.Metal + client := r.Meta.NewMetalClientForFramework(ctx, request.ProviderMeta) var data ResourceModel response.Diagnostics.Append(request.State.Get(ctx, &data)...) @@ -113,10 +113,7 @@ func (r *Resource) Read(ctx context.Context, request resource.ReadRequest, respo return } - vlan, _, err := client.ProjectVirtualNetworks.Get( - data.ID.ValueString(), - &packngo.GetOptions{Includes: vlanDefaultIncludes}, - ) + vlan, err := loadVlan(ctx, client, data.ID.ValueString()) if err != nil { if equinix_errors.IsNotFound(err) { response.Diagnostics.AddWarning( @@ -127,7 +124,7 @@ func (r *Resource) Read(ctx context.Context, request resource.ReadRequest, respo return } response.Diagnostics.AddError("Error fetching Vlan using vlanId", - equinix_errors.FriendlyError(err).Error()) + err.Error()) return } @@ -153,8 +150,7 @@ func (r *Resource) Update(ctx context.Context, req resource.UpdateRequest, resp } func (r *Resource) Delete(ctx context.Context, request resource.DeleteRequest, response *resource.DeleteResponse) { - r.Meta.AddFwModuleToMetalUserAgent(ctx, request.ProviderMeta) - client := r.Meta.Metal + client := r.Meta.NewMetalClientForFramework(ctx, request.ProviderMeta) var data ResourceModel response.Diagnostics.Append(request.State.Get(ctx, &data)...) @@ -162,32 +158,33 @@ func (r *Resource) Delete(ctx context.Context, request resource.DeleteRequest, r return } - vlan, resp, err := client.ProjectVirtualNetworks.Get( + vlan, resp, err := client.VLANsApi.GetVirtualNetwork( + ctx, data.ID.ValueString(), - &packngo.GetOptions{Includes: []string{"instances", "virtual_networks", "meta_gateway"}}, - ) + ).Include([]string{"instances", "virtual_networks"}).Execute() if err != nil { - if equinix_errors.IgnoreResponseErrors(equinix_errors.HttpForbidden, equinix_errors.HttpNotFound)(resp, err) != nil { + if err := equinix_errors.IgnoreHttpResponseErrors(http.StatusForbidden, http.StatusNotFound)(resp, err); err != nil { response.Diagnostics.AddWarning( "Equinix Metal Vlan not found during delete", - equinix_errors.FriendlyError(err).Error(), + err.Error(), ) return } response.Diagnostics.AddError("Error fetching Vlan using vlanId", - equinix_errors.FriendlyError(err).Error()) + err.Error()) return } // all device ports must be unassigned before delete for _, instance := range vlan.Instances { for _, port := range instance.NetworkPorts { - for _, v := range port.AttachedVirtualNetworks { - if v.ID == vlan.ID { - _, resp, err = client.Ports.Unassign(port.ID, vlan.ID) - if equinix_errors.IgnoreResponseErrors(equinix_errors.HttpForbidden, equinix_errors.HttpNotFound)(resp, err) != nil { - response.Diagnostics.AddError("Error unassign port with Vlan", - equinix_errors.FriendlyError(err).Error()) + for _, v := range port.GetVirtualNetworks() { + if v.GetId() == vlan.GetId() { + _, resp, err = client.PortsApi.UnassignPort(ctx, port.GetId()).PortAssignInput(metalv1.PortAssignInput{ + Vnid: vlan.Id, + }).Execute() + if equinix_errors.IgnoreHttpResponseErrors(http.StatusForbidden, http.StatusNotFound)(resp, err) != nil { + response.Diagnostics.AddError("Error unassign port with Vlan", err.Error()) return } } @@ -195,9 +192,34 @@ func (r *Resource) Delete(ctx context.Context, request resource.DeleteRequest, r } } - if err := equinix_errors.IgnoreResponseErrors(equinix_errors.HttpForbidden, equinix_errors.HttpNotFound)(client.ProjectVirtualNetworks.Delete(vlan.ID)); err != nil { + resp, err = client.VLANsApi.DeleteVirtualNetwork(ctx, vlan.GetId()).Execute() + if err := equinix_errors.IgnoreHttpResponseErrors(http.StatusForbidden, http.StatusNotFound)(resp, err); err != nil { response.Diagnostics.AddError("Error deleting Vlan", - equinix_errors.FriendlyError(err).Error()) + err.Error()) return } } + +func loadVlan(ctx context.Context, client *metalv1.APIClient, id string) (*metalv1.VirtualNetwork, error) { + vlan, _, err := client.VLANsApi.GetVirtualNetwork(ctx, id).Include(vlanDefaultIncludes).Execute() + + // If this is a facility-based VLAN we have to find the facility separately + // because if we include `facility`, the facility.href attribute becomes + // unreachable and the API response above won't validate against the VLAN schema + if err == nil && vlan.Facility != nil { + facilityId := path.Base(vlan.Facility.GetHref()) + facilities, _, err := client.FacilitiesApi.FindFacilities(ctx).Include([]metalv1.FindFacilitiesIncludeParameterInner{"metro"}).Execute() + if err == nil { + for _, facility := range facilities.GetFacilities() { + if facility.GetId() == facilityId { + vlan.Metro = (*metalv1.Metro)(facility.Metro) + } + } + if vlan.Metro == nil { + return vlan, fmt.Errorf("could not find facility %v for VLAN %v", facilityId, vlan.GetId()) + } + } + } + + return vlan, err +} diff --git a/internal/resources/metal/vlan/resource_test.go b/internal/resources/metal/vlan/resource_test.go index d7c951fb0..3874f1611 100644 --- a/internal/resources/metal/vlan/resource_test.go +++ b/internal/resources/metal/vlan/resource_test.go @@ -1,10 +1,12 @@ package vlan_test import ( + "context" "fmt" "strings" "testing" + "github.com/equinix/equinix-sdk-go/services/metalv1" "github.com/equinix/terraform-provider-equinix/internal/acceptance" "github.com/equinix/terraform-provider-equinix/internal/config" "github.com/hashicorp/terraform-plugin-testing/plancheck" @@ -12,7 +14,6 @@ import ( "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" - "github.com/packethost/packngo" ) func testAccCheckMetalVlanConfig_metro(projSuffix, metro, desc string) string { @@ -56,7 +57,7 @@ resource "equinix_metal_vlan" "foovlan" { } func TestAccMetalVlan_metro(t *testing.T) { - var vlan packngo.VirtualNetwork + var vlan metalv1.VirtualNetwork rs := acctest.RandString(10) lowerSiliconValley := "sv" upperDallas := "DA" @@ -109,7 +110,7 @@ func TestAccMetalVlan_metro(t *testing.T) { } func TestAccMetalVlan_NoDescription(t *testing.T) { - var vlan packngo.VirtualNetwork + var vlan metalv1.VirtualNetwork rs := acctest.RandString(10) metro := "sv" @@ -134,7 +135,7 @@ func TestAccMetalVlan_NoDescription(t *testing.T) { } func TestAccMetalVlan_RemoveDescription(t *testing.T) { - var vlan packngo.VirtualNetwork + var vlan metalv1.VirtualNetwork rs := acctest.RandString(10) metro := "sv" @@ -168,7 +169,7 @@ func TestAccMetalVlan_RemoveDescription(t *testing.T) { }) } -func testAccCheckMetalVlanExists(n string, vlan *packngo.VirtualNetwork) resource.TestCheckFunc { +func testAccCheckMetalVlanExists(n string, vlan *metalv1.VirtualNetwork) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] if !ok { @@ -178,13 +179,13 @@ func testAccCheckMetalVlanExists(n string, vlan *packngo.VirtualNetwork) resourc return fmt.Errorf("No Record ID is set") } - client := acceptance.TestAccProvider.Meta().(*config.Config).Metal + client := acceptance.TestAccProvider.Meta().(*config.Config).NewMetalClientForTesting() - foundVlan, _, err := client.ProjectVirtualNetworks.Get(rs.Primary.ID, nil) + foundVlan, _, err := client.VLANsApi.GetVirtualNetwork(context.Background(), rs.Primary.ID).Execute() if err != nil { return err } - if foundVlan.ID != rs.Primary.ID { + if foundVlan.GetId() != rs.Primary.ID { return fmt.Errorf("Record not found: %v - %v", rs.Primary.ID, foundVlan) } @@ -232,7 +233,7 @@ func TestAccMetalVlan_importBasic(t *testing.T) { } func TestAccMetalVlan_facility_to_metro(t *testing.T) { - var vlan packngo.VirtualNetwork + var vlan metalv1.VirtualNetwork rs := acctest.RandString(10) metro := "sv" facility := "sv15" @@ -273,7 +274,7 @@ func TestAccMetalVlan_facility_to_metro(t *testing.T) { } func TestAccMetalVlan_metro_upgradeFromVersion(t *testing.T) { - var vlan packngo.VirtualNetwork + var vlan metalv1.VirtualNetwork rs := acctest.RandString(10) metro := "sv" @@ -311,7 +312,7 @@ func TestAccMetalVlan_metro_upgradeFromVersion(t *testing.T) { } func TestAccMetalVlan_metro_suppress_diff(t *testing.T) { - var vlan packngo.VirtualNetwork + var vlan metalv1.VirtualNetwork rs := acctest.RandString(10) metro := "sv"