Skip to content

Commit 228c73f

Browse files
committed
different workaround for loading facility-based VLANs
1 parent 71bdbf9 commit 228c73f

File tree

2 files changed

+35
-23
lines changed

2 files changed

+35
-23
lines changed

internal/resources/metal/vlan/models.go

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,13 @@ func (m *DataSourceModel) parse(vlan *metalv1.VirtualNetwork) (d diag.Diagnostic
3131
m.Description = types.StringValue(vlan.GetDescription())
3232
}
3333

34-
if vlan.AdditionalProperties["project"] != nil {
35-
project := vlan.AdditionalProperties["project"].(map[string]interface{})
36-
project_id := project["id"].(string)
37-
m.ProjectID = types.StringValue(project_id)
34+
if vlan.AssignedTo != nil {
35+
m.ProjectID = types.StringValue(vlan.AssignedTo.GetId())
3836
}
3937

4038
if vlan.Facility != nil {
41-
facility_code := vlan.Facility.AdditionalProperties["code"].(string)
42-
metro := vlan.Facility.AdditionalProperties["metro"].(map[string]interface{})
43-
metro_code := metro["code"].(string)
39+
facility_code := vlan.Facility.AdditionalProperties["facility_code"].(string)
4440
m.Facility = types.StringValue(strings.ToLower(facility_code))
45-
m.Metro = types.StringValue(strings.ToLower(metro_code))
4641
}
4742

4843
if vlan.Metro != nil {
@@ -82,18 +77,13 @@ func (m *ResourceModel) parse(vlan *metalv1.VirtualNetwork) (d diag.Diagnostics)
8277
m.Description = types.StringValue(vlan.GetDescription())
8378
}
8479

85-
if vlan.AdditionalProperties["project"] != nil {
86-
project := vlan.AdditionalProperties["project"].(map[string]interface{})
87-
project_id := project["id"].(string)
88-
m.ProjectID = types.StringValue(project_id)
80+
if vlan.AssignedTo != nil {
81+
m.ProjectID = types.StringValue(vlan.AssignedTo.GetId())
8982
}
9083

9184
if vlan.Facility != nil {
92-
facility_code := vlan.Facility.AdditionalProperties["code"].(string)
93-
metro := vlan.Facility.AdditionalProperties["metro"].(map[string]interface{})
94-
metro_code := metro["code"].(string)
85+
facility_code := vlan.Facility.AdditionalProperties["facility_code"].(string)
9586
m.Facility = types.StringValue(strings.ToLower(facility_code))
96-
m.Metro = types.StringValue(strings.ToLower(metro_code))
9787
}
9888

9989
if vlan.Metro != nil {

internal/resources/metal/vlan/resource.go

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
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

1718
var (
18-
vlanDefaultIncludes = []string{"assigned_to", "facility", "metro"}
19+
vlanDefaultIncludes = []string{"assigned_to", "metro"}
1920
)
2021

2122
type 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

Comments
 (0)