Skip to content

Commit

Permalink
CXF-106630: Fix testing errors
Browse files Browse the repository at this point in the history
  • Loading branch information
d-bhola committed Jan 15, 2025
1 parent 4f7cf8a commit 95b604d
Show file tree
Hide file tree
Showing 5 changed files with 169 additions and 85 deletions.
30 changes: 18 additions & 12 deletions equinix/fabric_provider_maps.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,19 @@ func fabricDatasources() map[string]*schema.Resource {
"equinix_fabric_cloud_router": dataSourceFabricCloudRouter(),
"equinix_fabric_cloud_routers": dataSourceFabricGetCloudRouters(),
"equinix_fabric_market_place_subscription": fabric_market_place_subscription.DataSourceFabricMarketplaceSubscription(),
"equinix_fabric_network": fabric_network.DataSource(),
"equinix_fabric_networks": fabric_network.DataSourceSearch(),
"equinix_fabric_port": dataSourceFabricPort(),
"equinix_fabric_ports": dataSourceFabricGetPortsByName(),
"equinix_fabric_route_filter": fabric_route_filter.DataSource(),
"equinix_fabric_route_filters": fabric_route_filter.DataSourceSearch(),
"equinix_fabric_route_filter_rule": fabric_route_filter_rule.DataSource(),
"equinix_fabric_route_filter_rules": fabric_route_filter_rule.DataSourceGetAllRules(),
"equinix_fabric_service_profile": dataSourceFabricServiceProfileReadByUuid(),
"equinix_fabric_service_profiles": dataSourceFabricSearchServiceProfilesByName(),
"equinix_fabric_service_token": fabric_service_token.DataSource(),
"equinix_fabric_service_tokens": fabric_service_token.DataSourceSearch(),
//"equinix_fabric_metros": fabric_metros.DataSource(),
"equinix_fabric_network": fabric_network.DataSource(),
"equinix_fabric_networks": fabric_network.DataSourceSearch(),
"equinix_fabric_port": dataSourceFabricPort(),
"equinix_fabric_ports": dataSourceFabricGetPortsByName(),
"equinix_fabric_route_filter": fabric_route_filter.DataSource(),
"equinix_fabric_route_filters": fabric_route_filter.DataSourceSearch(),
"equinix_fabric_route_filter_rule": fabric_route_filter_rule.DataSource(),
"equinix_fabric_route_filter_rules": fabric_route_filter_rule.DataSourceGetAllRules(),
"equinix_fabric_service_profile": dataSourceFabricServiceProfileReadByUuid(),
"equinix_fabric_service_profiles": dataSourceFabricSearchServiceProfilesByName(),
"equinix_fabric_service_token": fabric_service_token.DataSource(),
"equinix_fabric_service_tokens": fabric_service_token.DataSourceSearch(),
}
}

Expand All @@ -50,3 +51,8 @@ func fabricResources() map[string]*schema.Resource {
"equinix_fabric_service_token": fabric_service_token.Resource(),
}
}

//Failed to load plugin schemas
//│
//│ Error while loading schemas for plugin components: Failed to obtain provider schema: Could not load the schema for provider developer.equinix.com/terraform/equinix: failed to retrieve schema from provider
//│ "developer.equinix.com/terraform/equinix": Missing Schema: Base data source was not provided a schema. Please provide a Schema config attribute or implement, the Schema(...) function...
5 changes: 4 additions & 1 deletion internal/provider/services/fabric.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package services

import (
"github.com/equinix/terraform-provider-equinix/internal/resources/fabric/metros"
"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-framework/resource"
)
Expand All @@ -10,5 +11,7 @@ func FabricResources() []func() resource.Resource {
}

func FabricDatasources() []func() datasource.DataSource {
return []func() datasource.DataSource{}
return []func() datasource.DataSource{
metros.NewDataSourceMetroCode,
}
}
92 changes: 92 additions & 0 deletions internal/resources/fabric/metros/datasources_metro_code.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package metros

import (
"context"
equinix_errors "github.com/equinix/terraform-provider-equinix/internal/errors"
"github.com/equinix/terraform-provider-equinix/internal/framework"
"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
)

func NewDataSourceMetroCode() datasource.DataSource {
return &DataSource{
BaseDataSource: framework.NewBaseDataSource(
framework.BaseDataSourceConfig{
Name: "equinix_fabric_metro_code",
},
),
}
}

type DataSourceMetroCode struct {
framework.BaseDataSource
}

func (r *DataSource) Schema(
ctx context.Context,
req datasource.SchemaRequest,
resp *datasource.SchemaResponse,
) {
resp.Schema = dataSourceSingleMetroSchema(ctx)
}

//func (d *DataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) {
// resp.Schema = schema.Schema{
// Attributes: map[string]schema.Attribute{
// "example_attribute": schema.StringAttribute{
// Required: true,
// },
// "id": schema.StringAttribute{
// Computed: true,
// },
// },
// }
//}

//
//func (r *DataSource) Schema(ctx context.Context, request SchemaRequest, response SchemaResponse) {
// response.Schema = dataSourceSingleMetroSchema(ctx)
//}

/*func (r *DataSource) AllMetrosSchema(ctx context.Context, response *datasource.SchemaResponse) {
response.Schema = dataSourceAllMetroSchema(ctx)
}
func (r *DataSource) MetroCodeSchema(ctx context.Context, response *datasource.SchemaResponse) {
response.Schema = dataSourceSingleMetroSchema(ctx)
}*/

// READ function for GET Metro Code data source
func (r *DataSource) Read(ctx context.Context, request datasource.ReadRequest, response *datasource.ReadResponse) {
client := r.Meta.NewFabricClientForFramework(ctx, request.ProviderMeta)

// Retrieve values from plan
var data MetroModel
response.Diagnostics.Append(request.Config.Get(ctx, &data)...)
if response.Diagnostics.HasError() {
return
}

// Extract the ID of the resource from the config
//id := data.ID.ValueString()

metroCode := data.Code.ValueString()

// Use API client to get the current state of the resource
metroByCode, _, err := client.MetrosApi.GetMetroByCode(ctx, metroCode).Execute()

if err != nil {
response.State.RemoveResource(ctx)
diag.FromErr(equinix_errors.FormatFabricError(err))
return
}

// Set state to fully populated data
response.Diagnostics.Append(data.parseDataSourceByMetroCode(ctx, metroByCode)...)
if response.Diagnostics.HasError() {
return
}

// Update the Terraform state
response.Diagnostics.Append(response.State.Set(ctx, &data)...)
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
package metros

import (
"context"
equinix_errors "github.com/equinix/terraform-provider-equinix/internal/errors"
"github.com/equinix/terraform-provider-equinix/internal/framework"
"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
)

func NewDataSource() datasource.DataSource {
func NewDataSourceMetros() datasource.DataSource {
return &DataSource{
BaseDataSource: framework.NewBaseDataSource(
framework.BaseDataSourceConfig{
Name: "equinix_fabric_metros",
Name: "equinix_fabric_metro_code",
},
),
}
Expand All @@ -22,48 +19,27 @@ type DataSource struct {
framework.BaseDataSource
}

func (r *DataSource) AllMetrosSchema(ctx context.Context, response *datasource.SchemaResponse) {
response.Schema = dataSourceAllMetroSchema(ctx)
}

func (r *DataSource) MetroCodeSchema(ctx context.Context, response *datasource.SchemaResponse) {
response.Schema = dataSourceSingleMetroSchema(ctx)
}

// READ function for GET Metro Code data source
func (r *DataSource) Read(ctx context.Context, request datasource.ReadRequest, response *datasource.ReadResponse) {
client := r.Meta.NewFabricClientForFramework(ctx, request.ProviderMeta)

// Retrieve values from plan
var data MetroModel
response.Diagnostics.Append(request.Config.Get(ctx, &data)...)
if response.Diagnostics.HasError() {
return
}

// Extract the ID of the resource from the config
//id := data.ID.ValueString()

metroCode := data.Code.ValueString()

// Use API client to get the current state of the resource
metroByCode, _, err := client.MetrosApi.GetMetroByCode(ctx, metroCode).Execute()

if err != nil {
response.State.RemoveResource(ctx)
diag.FromErr(equinix_errors.FormatFabricError(err))
return
}

// Set state to fully populated data
response.Diagnostics.Append(data.parseDataSourceByMetroCode(ctx, metroByCode)...)
if response.Diagnostics.HasError() {
return
}
//
//func (r *DataSource) Schema(
// ctx context.Context,
// req datasource.SchemaRequest,
// resp *datasource.SchemaResponse,
//) {
// resp.Schema = dataSourceAllMetroSchema(ctx)
//}

// Update the Terraform state
response.Diagnostics.Append(response.State.Set(ctx, &data)...)
}
//func (r *DataSource) Read(ctx context.Context, request datasource.ReadRequest, response *datasource.ReadResponse) {
// //TODO implement me
// panic("implement me")
//}
//
//func (r *DataSource) Schema(
// ctx context.Context,
// req datasource.SchemaRequest,
// resp *datasource.SchemaResponse,
//) {
// resp.Schema = dataSourceAllMetroSchema(ctx)
//}

//READ function for the Get Metros data source also, use the Get Metros API

Expand Down
59 changes: 33 additions & 26 deletions internal/resources/fabric/metros/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"github.com/equinix/equinix-sdk-go/services/fabricv4"
fwtypes "github.com/equinix/terraform-provider-equinix/internal/framework/types"
"github.com/hashicorp/terraform-plugin-framework/attr"
"github.com/hashicorp/terraform-plugin-framework/diag"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
Expand Down Expand Up @@ -65,7 +66,7 @@ func parseMetros(ctx context.Context, metro *fabricv4.Metro, id, tp, href, code,
*tp = types.StringValue(metro.GetType())
*code = types.StringValue(metro.GetCode())
*region = types.StringValue(metro.GetRegion())
if metro.GetName() != "" { //Check if we need these null checks
if metro.GetName() != "" {
*name = types.StringValue(metro.GetName())
}

Expand All @@ -77,21 +78,24 @@ func parseMetros(ctx context.Context, metro *fabricv4.Metro, id, tp, href, code,
*localBandwidthMax = types.Int64Value(metro.GetLocalVCBandwidthMax())
}

geoCoord, diags := parseGeoCoordinates(ctx, metro.GeoCoordinates)
geoCoord, diags := parseGeoCoordinates(ctx, metro.GetGeoCoordinates())

if diags.HasError() {
return diags
}

connMetros, diags := parseconnectedMetros(ctx, metro.ConnectedMetros)
*geoCoordinates = geoCoord

connMetros, diags := parseconnectedMetros(ctx, metro.GetConnectedMetros())
if diags.HasError() {
return diags
}

geoScopes, diags := parseGeoScopes(ctx, metro.GeoScopes)
*connectedMetros = connMetros
geoScopes, diags := parseGeoScopes(ctx, metro.GetGeoScopes())
if diags.HasError() {
return diags
}

*gScopes = geoScopes
return diags
}

Expand All @@ -108,34 +112,37 @@ func parseconnectedMetros(ctx context.Context, connectedMetros []fabricv4.Connec
return fwtypes.NewListNestedObjectValueOfValueSlice(ctx, connMetros), nil
}

func parseGeoCoordinates(ctx context.Context, coordinates *fabricv4.GeoCoordinates) (fwtypes.ObjectValueOf[GeoCoordinatesModel], diag.Diagnostics) {
func parseGeoCoordinates(ctx context.Context, coordinates fabricv4.GeoCoordinates) (fwtypes.ObjectValueOf[GeoCoordinatesModel], diag.Diagnostics) {
var diags diag.Diagnostics
if coordinates == nil {
diags.AddError("Invalid Input", "Coordinates should not be nil")
return nil, diags
}

if coordinates.Latitude == nil || coordinates.Longitude == nil {
diags.AddError("Invalid Input", "Latitude and Longitude should not be nil")
return nil, diags
}

if *coordinates.Latitude < -90 || *coordinates.Latitude > 90 {
diags.AddError("Invalid Latitude", "Latitude should be between -90 and 90 degrees")
return nil, diags
}
//if coordinates == nil {
// diags.AddError("Invalid Input", "Coordinates should not be nil")
// return nil, diags
//}
//
//if coordinates.Latitude == nil || coordinates.Longitude == nil {
// diags.AddError("Invalid Input", "Latitude and Longitude should not be nil")
// return nil, diags
//}

if *coordinates.Longitude < -180 || *coordinates.Longitude > 180 {
diags.AddError("Invalid Longitude", "Longitude should be between -180 and 180 degrees")
return nil, diags
}
result := GeoCoordinatesModel{
Latitude: types.Float64Value(*coordinates.Latitude),
Longitude: types.Float64Value(*coordinates.Longitude),
}
return result, nil

return fwtypes.NewObjectValueOf[GeoCoordinatesModel](ctx, &result), diags
}

func parseGeoScopes(ctx context.Context, scopes []fabricv4.GeoScopeType) (fwtypes.ListValueOf[types.String], diag.Diagnostics) {
var diags diag.Diagnostics
geoScopeTypeList := make([]attr.Value, len(scopes))

for i, scope := range scopes {
geoScopeTypeList[i] = types.StringValue(string(scope))
}
geoScopeValue, diags := fwtypes.NewListValueOf[types.String](ctx, geoScopeTypeList)

if diags.HasError() {
return fwtypes.NewListValueOfNull[types.String](ctx), diags
}
return geoScopeValue, diags
}

0 comments on commit 95b604d

Please sign in to comment.