Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Metros Data Source Development #842

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
95 changes: 95 additions & 0 deletions docs/data-sources/fabric_metro.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
---
subcategory: "Fabric"
---

# equinix_fabric_metro (Data Source)



## Example Usage

```terraform
data "equinix_fabric_metro" "metro" {
metro_code = "<metro_code>"
}
output "id" {
value = data.equinix_fabric_metro.metro.id
}
output "type" {
value = data.equinix_fabric_metro.metro.type
}
output "metro_code" {
value = data.equinix_fabric_metro.metro.metro_code
}
output "region" {
value = data.equinix_fabric_metro.metro.region
}
output "name" {
value = data.equinix_fabric_metro.metro.name
}
output "equinix_asn" {
value = data.equinix_fabric_metro.metro.equinix_asn
}
output "local_vc_bandwidth_max" {
value = data.equinix_fabric_metro.metro.local_vc_bandwidth_max
}
output "geo_coordinates" {
value = data.equinix_fabric_metro.metro.geo_coordinates
}
output "connected_metros" {
value = data.equinix_fabric_metro.metro.connected_metros
}
output "geoScopes" {
value = data.equinix_fabric_metro.metro.geo_scopes
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `metro_code` (String) The metro code this data source should retrieve

### Read-Only

- `code` (String) Code assigned to an Equinix IBX data center in a specified metropolitan area
- `connected_metros` (List of Object) Arrays of objects containing latency data for the specified metro (see [below for nested schema](#nestedatt--connected_metros))
- `equinix_asn` (Number) Autonomous system number (ASN) for a specified Fabric metro. The ASN is a unique identifier that carries the network routing protocol and exchanges that data with other internal systems via border gateway protocol.
- `geo_coordinates` (Attributes) Geographic location data of Fabric Metro (see [below for nested schema](#nestedatt--geo_coordinates))
- `geo_scopes` (List of String) List of supported geographic boundaries of a Fabric Metro. Example values: CANADA, CONUS.
- `href` (String) The canonical URL at which the resource resides
- `id` (String) The unique identifier of the resource
- `local_vc_bandwidth_max` (Number) This field holds Max Connection speed within the metro.
- `name` (String) Name of the region in which the data center is located
- `region` (String) Board geographical area in which the data center is located
- `type` (String) Indicator of a fabric metro

<a id="nestedatt--connected_metros"></a>
### Nested Schema for `connected_metros`

Read-Only:

- `avg_latency` (Number)
- `code` (String)
- `href` (String)
- `remote_vc_bandwidth_max` (Number)


<a id="nestedatt--geo_coordinates"></a>
### Nested Schema for `geo_coordinates`

Read-Only:

- `latitude` (Number) Latitude of the Metro
- `longitude` (Number) Longitude of the Metro
128 changes: 128 additions & 0 deletions docs/data-sources/fabric_metros.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
---
subcategory: "Fabric"
---

# equinix_fabric_metros (Data Source)



## Example Usage

```terraform
data "equinix_fabric_metros" "metros" {
pagination = {
limit = 12,
offset = 6
}
}

output "number_of_returned_metros" {
value = length(data.equinix_fabric_metros.metros.data)
}

output "first_metro_id" {
value = data.equinix_fabric_metros.metros.data.0.id
}

output "first_metro_type" {
value = data.equinix_fabric_metros.metros.data.0.type
}

output "first_metro_code" {
value = data.equinix_fabric_metros.metros.data.0.code
}

output "first_metro_region" {
value = data.equinix_fabric_metros.metros.data.0.region
}

output "first_metro_name" {
value = data.equinix_fabric_metros.metros.data.0.name
}

output "first_metro_equinix_asn" {
value = data.equinix_fabric_metros.metros.data.0.equinix_asn
}

output "first_metro_local_vc_bandwidth_max" {
value = data.equinix_fabric_metros.metros.data.0.local_vc_bandwidth_max
}

output "first_metro_geo_coordinates" {
value = data.equinix_fabric_metros.metros.data.0.geo_coordinates
}

output "first_metro_connected_metros" {
value = data.equinix_fabric_metros.metros.data.0.connected_metros
}

output "first_metro_geo_scopes" {
value = data.equinix_fabric_metros.metros.data.0.geo_scopes
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `pagination` (Attributes) Pagination details for the returned metro list (see [below for nested schema](#nestedatt--pagination))

### Optional

- `presence` (String) User On Boarded Metros based on Fabric resource availability

### Read-Only

- `data` (Attributes List) Returned list of metro objects (see [below for nested schema](#nestedatt--data))
- `id` (String) The unique identifier of the resource

<a id="nestedatt--pagination"></a>
### Nested Schema for `pagination`

Optional:

- `limit` (Number) Maximum number of search results returned per page.
- `offset` (Number) Index of the first item returned in the response.

Read-Only:

- `next` (String) URL relative to the next item in the response.
- `previous` (String) URL relative to the previous item in the response.
- `total` (Number) The total number of metro returned


<a id="nestedatt--data"></a>
### Nested Schema for `data`

Read-Only:

- `code` (String) Code assigned to an Equinix IBX data center in a specified metropolitan area
- `connected_metros` (List of Object) Arrays of objects containing latency data for the specified metro (see [below for nested schema](#nestedatt--data--connected_metros))
- `equinix_asn` (Number) Autonomous system number (ASN) for a specified Fabric metro. The ASN is a unique identifier that carries the network routing protocol and exchanges that data with other internal systems via border gateway protocol.
- `geo_coordinates` (Attributes) Geographic location data of Fabric Metro (see [below for nested schema](#nestedatt--data--geo_coordinates))
- `geo_scopes` (List of String) List of supported geographic boundaries of a Fabric Metro. Example values: CANADA, CONUS.
- `href` (String) The canonical URL at which the resource resides
- `local_vc_bandwidth_max` (Number) This field holds Max Connection speed within the metro.
- `name` (String) Name of the region in which the data center is located
- `region` (String) Board geographical area in which the data center is located
- `type` (String) Indicator of a fabric metro

<a id="nestedatt--data--connected_metros"></a>
### Nested Schema for `data.connected_metros`

Read-Only:

- `avg_latency` (Number)
- `code` (String)
- `href` (String)
- `remote_vc_bandwidth_max` (Number)


<a id="nestedatt--data--geo_coordinates"></a>
### Nested Schema for `data.geo_coordinates`

Read-Only:

- `latitude` (Number) Latitude of the Metro
- `longitude` (Number) Longitude of the Metro
44 changes: 44 additions & 0 deletions examples/data-sources/equinix_fabric_metro/data-source.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
data "equinix_fabric_metro" "metro" {
metro_code = "<metro_code>"
}

output "id" {
value = data.equinix_fabric_metro.metro.id
}

output "type" {
value = data.equinix_fabric_metro.metro.type
}

output "metro_code" {
value = data.equinix_fabric_metro.metro.metro_code
}

output "region" {
value = data.equinix_fabric_metro.metro.region
}

output "name" {
value = data.equinix_fabric_metro.metro.name
}

output "equinix_asn" {
value = data.equinix_fabric_metro.metro.equinix_asn
}

output "local_vc_bandwidth_max" {
value = data.equinix_fabric_metro.metro.local_vc_bandwidth_max
}

output "geo_coordinates" {
value = data.equinix_fabric_metro.metro.geo_coordinates
}

output "connected_metros" {
value = data.equinix_fabric_metro.metro.connected_metros
}

output "geoScopes" {
value = data.equinix_fabric_metro.metro.geo_scopes
}

51 changes: 51 additions & 0 deletions examples/data-sources/equinix_fabric_metros/data-source.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
data "equinix_fabric_metros" "metros" {
pagination = {
limit = 12,
offset = 6
}
}

output "number_of_returned_metros" {
value = length(data.equinix_fabric_metros.metros.data)
}

output "first_metro_id" {
value = data.equinix_fabric_metros.metros.data.0.id
}

output "first_metro_type" {
value = data.equinix_fabric_metros.metros.data.0.type
}

output "first_metro_code" {
value = data.equinix_fabric_metros.metros.data.0.code
}

output "first_metro_region" {
value = data.equinix_fabric_metros.metros.data.0.region
}

output "first_metro_name" {
value = data.equinix_fabric_metros.metros.data.0.name
}

output "first_metro_equinix_asn" {
value = data.equinix_fabric_metros.metros.data.0.equinix_asn
}

output "first_metro_local_vc_bandwidth_max" {
value = data.equinix_fabric_metros.metros.data.0.local_vc_bandwidth_max
}

output "first_metro_geo_coordinates" {
value = data.equinix_fabric_metros.metros.data.0.geo_coordinates
}

output "first_metro_connected_metros" {
value = data.equinix_fabric_metros.metros.data.0.connected_metros
}

output "first_metro_geo_scopes" {
value = data.equinix_fabric_metros.metros.data.0.geo_scopes
}

3 changes: 3 additions & 0 deletions 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/metro"
"github.com/equinix/terraform-provider-equinix/internal/resources/fabric/stream"
"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-framework/resource"
Expand All @@ -14,6 +15,8 @@ func FabricResources() []func() resource.Resource {

func FabricDatasources() []func() datasource.DataSource {
return []func() datasource.DataSource{
metro.NewDataSourceMetroCode,
metro.NewDataSourceMetros,
stream.NewDataSourceByStreamID,
stream.NewDataSourceAllStreams,
}
Expand Down
56 changes: 56 additions & 0 deletions internal/resources/fabric/metro/datasources_metro_code.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package metro

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"
)

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

type DataSourceMetroCode struct {
framework.BaseDataSource
}

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

func (r *DataSourceMetroCode) Read(ctx context.Context, request datasource.ReadRequest, response *datasource.ReadResponse) {
client := r.Meta.NewFabricClientForFramework(ctx, request.ProviderMeta)

var data DataSourceByCodeModel
response.Diagnostics.Append(request.Config.Get(ctx, &data)...)
if response.Diagnostics.HasError() {
return
}

metroCode := data.MetroCode.ValueString()
metroByCode, _, err := client.MetrosApi.GetMetroByCode(ctx, metroCode).Execute()
if err != nil {
response.State.RemoveResource(ctx)
response.Diagnostics.AddError("Get By Metro Code API Error", equinix_errors.FormatFabricError(err).Error())
return
}

response.Diagnostics.Append(data.parse(ctx, metroByCode)...)
if response.Diagnostics.HasError() {
return
}

response.Diagnostics.Append(response.State.Set(ctx, &data)...)
}
Loading
Loading