44 "context"
55 "fmt"
66 "net/http"
7+ "path"
78 "strings"
89
910 equinix_errors "github.com/equinix/terraform-provider-equinix/internal/errors"
@@ -15,7 +16,7 @@ import (
1516)
1617
1718var (
18- vlanDefaultIncludes = []string {"assigned_to" , "facility" , " metro" }
19+ vlanDefaultIncludes = []string {"assigned_to" , "metro" }
1920)
2021
2122type Resource struct {
@@ -87,7 +88,7 @@ func (r *Resource) Create(ctx context.Context, request resource.CreateRequest, r
8788 }
8889
8990 // get the current state of newly created vlan with default include fields
90- vlan , _ , err = client . VLANsApi . GetVirtualNetwork (ctx , vlan .GetId ()). Include ( vlanDefaultIncludes ). Execute ( )
91+ vlan , err = loadVlan (ctx , client , vlan .GetId ())
9192 if err != nil {
9293 response .Diagnostics .AddError ("Error reading Vlan after create" , err .Error ())
9394 return
@@ -112,10 +113,7 @@ func (r *Resource) Read(ctx context.Context, request resource.ReadRequest, respo
112113 return
113114 }
114115
115- vlan , _ , err := client .VLANsApi .GetVirtualNetwork (
116- ctx ,
117- data .ID .ValueString (),
118- ).Include (vlanDefaultIncludes ).Execute ()
116+ vlan , err := loadVlan (ctx , client , data .ID .ValueString ())
119117 if err != nil {
120118 if equinix_errors .IsNotFound (err ) {
121119 response .Diagnostics .AddWarning (
@@ -163,7 +161,7 @@ func (r *Resource) Delete(ctx context.Context, request resource.DeleteRequest, r
163161 vlan , resp , err := client .VLANsApi .GetVirtualNetwork (
164162 ctx ,
165163 data .ID .ValueString (),
166- ).Include ([]string {"instances" , "virtual_network" , "meta_gateway " }).Execute ()
164+ ).Include ([]string {"instances" , "virtual_networks " }).Execute ()
167165 if err != nil {
168166 if err := equinix_errors .IgnoreHttpResponseErrors (http .StatusForbidden , http .StatusNotFound )(resp , err ); err != nil {
169167 response .Diagnostics .AddWarning (
@@ -201,3 +199,27 @@ func (r *Resource) Delete(ctx context.Context, request resource.DeleteRequest, r
201199 return
202200 }
203201}
202+
203+ func loadVlan (ctx context.Context , client * metalv1.APIClient , id string ) (* metalv1.VirtualNetwork , error ) {
204+ vlan , _ , err := client .VLANsApi .GetVirtualNetwork (ctx , id ).Include (vlanDefaultIncludes ).Execute ()
205+
206+ // If this is a facility-based VLAN we have to find the facility separately
207+ // because if we include `facility`, the facility.href attribute becomes
208+ // unreachable and the API response above won't validate against the VLAN schema
209+ if err == nil && vlan .Facility != nil {
210+ facilityId := path .Base (vlan .Facility .GetHref ())
211+ facilities , _ , err := client .FacilitiesApi .FindFacilities (ctx ).Include ([]metalv1.FindFacilitiesIncludeParameterInner {"metro" }).Execute ()
212+ if err == nil {
213+ for _ , facility := range facilities .GetFacilities () {
214+ if facility .GetId () == facilityId {
215+ vlan .Metro = (* metalv1 .Metro )(facility .Metro )
216+ }
217+ }
218+ if vlan .Metro == nil {
219+ return vlan , fmt .Errorf ("could not find facility %v for VLAN %v" , facilityId , vlan .GetId ())
220+ }
221+ }
222+ }
223+
224+ return vlan , err
225+ }
0 commit comments