Skip to content

Commit

Permalink
feat: Adding Marketplace Subscription capability to Fabric Cloud Rout…
Browse files Browse the repository at this point in the history
…er Resource (#762)

- Added marketplace_subscription schema to fabric_cloud_router resource
- Marked 'account' schema as optional and computed because this
parameter is optional while creating Fabric Cloud Router using
Marketplace Subscription id.
  • Loading branch information
srushti-patl authored Sep 10, 2024
2 parents 4b0785b + 9dc48cd commit 692594c
Show file tree
Hide file tree
Showing 7 changed files with 187 additions and 13 deletions.
10 changes: 10 additions & 0 deletions docs/data-sources/fabric_cloud_router.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ output "type" {
- `href` (String) Fabric Cloud Router URI information
- `id` (String) The ID of this resource.
- `location` (Set of Object) Fabric Cloud Router location (see [below for nested schema](#nestedatt--location))
- `marketplace_subscription` (Set of Object) Equinix Fabric Entity for Marketplace Subscription (see [below for nested schema](#nestedatt--marketplace_subscription))
- `name` (String) Fabric Cloud Router name. An alpha-numeric 24 characters string which can include only hyphens and underscores
- `notifications` (List of Object) Preferences for notifications on Fabric Cloud Router configuration or status changes (see [below for nested schema](#nestedatt--notifications))
- `order` (Set of Object) Order information related to this Fabric Cloud Router (see [below for nested schema](#nestedatt--order))
Expand Down Expand Up @@ -125,6 +126,15 @@ Read-Only:
- `region` (String)


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

Read-Only:

- `type` (String)
- `uuid` (String)


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

Expand Down
10 changes: 10 additions & 0 deletions docs/data-sources/fabric_cloud_routers.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ Read-Only:
- `equinix_asn` (Number)
- `href` (String)
- `location` (Set of Object) (see [below for nested schema](#nestedobjatt--data--location))
- `marketplace_subscription` (Set of Object) (see [below for nested schema](#nestedobjatt--data--marketplace_subscription))
- `name` (String)
- `notifications` (List of Object) (see [below for nested schema](#nestedobjatt--data--notifications))
- `order` (Set of Object) (see [below for nested schema](#nestedobjatt--data--order))
Expand Down Expand Up @@ -207,6 +208,15 @@ Read-Only:
- `region` (String)


<a id="nestedobjatt--data--marketplace_subscription"></a>
### Nested Schema for `data.marketplace_subscription`

Read-Only:

- `type` (String)
- `uuid` (String)


<a id="nestedobjatt--data--notifications"></a>
### Nested Schema for `data.notifications`

Expand Down
60 changes: 51 additions & 9 deletions docs/resources/fabric_cloud_router.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Additional documentation:

## Example Usage

Fabric Cloud Router
```terraform
resource "equinix_fabric_cloud_router" "new_cloud_router"{
name = "Router-SV"
Expand All @@ -38,12 +39,39 @@ resource "equinix_fabric_cloud_router" "new_cloud_router"{
}
```

Fabric Cloud Router with Marketplace Subscription id
```terraform
resource "equinix_fabric_cloud_router" "new_cloud_router"{
name = "Router-SV"
type = "XF_ROUTER"
notifications{
type = "ALL"
emails = ["[email protected]","[email protected]"]
}
order {
purchase_order_number = "1-323292"
}
location {
metro_code = "SV"
}
package {
code = "STANDARD"
}
project {
project_id = "776847000642406"
}
marketplace_subscription {
type = "AWS_MARKETPLACE_SUBSCRIPTION"
uuid = "2823b8ae07-a2a2-45b4-a658-c3542bb24e9"
}
}
```

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

### Required

- `account` (Block Set, Min: 1, Max: 1) Customer account information that is associated with this Fabric Cloud Router (see [below for nested schema](#nestedblock--account))
- `location` (Block Set, Min: 1, Max: 1) Fabric Cloud Router location (see [below for nested schema](#nestedblock--location))
- `name` (String) Fabric Cloud Router name. An alpha-numeric 24 characters string which can include only hyphens and underscores
- `notifications` (Block List, Min: 1) Preferences for notifications on Fabric Cloud Router configuration or status changes (see [below for nested schema](#nestedblock--notifications))
Expand All @@ -53,8 +81,10 @@ resource "equinix_fabric_cloud_router" "new_cloud_router"{

### Optional

- `account` (Block Set, Max: 1) Customer account information that is associated with this Fabric Cloud Router (see [below for nested schema](#nestedblock--account))
- `description` (String) Customer-provided Fabric Cloud Router description
- `href` (String) Fabric Cloud Router URI information
- `marketplace_subscription` (Block Set, Max: 1) Equinix Fabric Entity for Marketplace Subscription (see [below for nested schema](#nestedblock--marketplace_subscription))
- `order` (Block Set, Max: 1) Order information related to this Fabric Cloud Router (see [below for nested schema](#nestedblock--order))
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `uuid` (String) Equinix-assigned Fabric Cloud Router identifier
Expand All @@ -71,14 +101,6 @@ resource "equinix_fabric_cloud_router" "new_cloud_router"{
- `id` (String) The ID of this resource.
- `state` (String) Fabric Cloud Router overall state

<a id="nestedblock--account"></a>
### Nested Schema for `account`

Optional:

- `account_number` (Number) Account Number


<a id="nestedblock--location"></a>
### Nested Schema for `location`

Expand Down Expand Up @@ -120,6 +142,26 @@ Optional:
- `project_id` (String) Project Id


<a id="nestedblock--account"></a>
### Nested Schema for `account`

Required:

- `account_number` (Number) Account Number


<a id="nestedblock--marketplace_subscription"></a>
### Nested Schema for `marketplace_subscription`

Required:

- `uuid` (String) Equinix-assigned Marketplace Subscription identifier

Optional:

- `type` (String) Marketplace Subscription type like; AWS_MARKETPLACE_SUBSCRIPTION


<a id="nestedblock--order"></a>
### Nested Schema for `order`

Expand Down
71 changes: 67 additions & 4 deletions equinix/resource_fabric_cloud_router.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ func fabricCloudRouterAccountSch() map[string]*schema.Schema {
return map[string]*schema.Schema{
"account_number": {
Type: schema.TypeInt,
Computed: true,
Optional: true,
Required: true,
Description: "Account Number",
},
}
Expand All @@ -57,6 +56,22 @@ func fabricCloudRouterProjectSch() map[string]*schema.Schema {
}
}

func fabricMarketplaceSubscriptionSch() map[string]*schema.Schema {
return map[string]*schema.Schema{
"type": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: "Marketplace Subscription type like; AWS_MARKETPLACE_SUBSCRIPTION",
},
"uuid": {
Type: schema.TypeString,
Required: true,
Description: "Equinix-assigned Marketplace Subscription identifier",
},
}
}

func fabricCloudRouterResourceSchema() map[string]*schema.Schema {
return map[string]*schema.Schema{
"uuid": {
Expand Down Expand Up @@ -133,9 +148,20 @@ func fabricCloudRouterResourceSchema() map[string]*schema.Schema {
Schema: fabricCloudRouterProjectSch(),
},
},
"marketplace_subscription": {
Type: schema.TypeSet,
Optional: true,
Computed: true,
Description: "Equinix Fabric Entity for Marketplace Subscription",
MaxItems: 1,
Elem: &schema.Resource{
Schema: fabricMarketplaceSubscriptionSch(),
},
},
"account": {
Type: schema.TypeSet,
Required: true,
Optional: true,
Computed: true,
Description: "Customer account information that is associated with this Fabric Cloud Router",
MaxItems: 1,
Elem: &schema.Resource{
Expand Down Expand Up @@ -214,7 +240,7 @@ Additional documentation:
}

func accountCloudRouterTerraformToGo(accountList []interface{}) fabricv4.SimplifiedAccount {
if accountList == nil {
if len(accountList) == 0 {
return fabricv4.SimplifiedAccount{}
}
simplifiedAccount := fabricv4.SimplifiedAccount{}
Expand Down Expand Up @@ -248,6 +274,23 @@ func projectCloudRouterTerraformToGo(projectTerraform []interface{}) fabricv4.Pr

return project
}
func marketplaceSubscriptionCloudRouterTerraformToGo(marketplaceSubscriptionTerraform []interface{}) fabricv4.MarketplaceSubscription {
if len(marketplaceSubscriptionTerraform) == 0 {
return fabricv4.MarketplaceSubscription{}
}
marketplaceSubscription := fabricv4.MarketplaceSubscription{}
marketplaceSubscriptionMap := marketplaceSubscriptionTerraform[0].(map[string]interface{})
subscriptionUUID := marketplaceSubscriptionMap["uuid"].(string)
subscriptionType := marketplaceSubscriptionMap["type"].(string)
if subscriptionUUID != "" {
marketplaceSubscription.SetUuid(subscriptionUUID)
}
if subscriptionType != "" {
marketplaceSubscription.SetType(fabricv4.MarketplaceSubscriptionType(subscriptionType))
}

return marketplaceSubscription
}
func resourceFabricCloudRouterCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*config.Config).NewFabricClientForSDK(d)

Expand Down Expand Up @@ -283,6 +326,11 @@ func resourceFabricCloudRouterCreate(ctx context.Context, d *schema.ResourceData
createCloudRouterRequest.SetOrder(order)
}

if marketplaceSubscriptionTerraform, ok := d.GetOk("marketplace_subscription"); ok {
marketplaceSubscription := marketplaceSubscriptionCloudRouterTerraformToGo(marketplaceSubscriptionTerraform.(*schema.Set).List())
createCloudRouterRequest.SetMarketplaceSubscription(marketplaceSubscription)
}

start := time.Now()
fcr, _, err := client.CloudRoutersApi.CreateCloudRouter(ctx).CloudRouterPostRequest(createCloudRouterRequest).Execute()
if err != nil {
Expand Down Expand Up @@ -320,6 +368,7 @@ func fabricCloudRouterMap(fcr *fabricv4.CloudRouter) map[string]interface{} {
notifications := fcr.GetNotifications()
project := fcr.GetProject()
order := fcr.GetOrder()
marketplaceSubscription := fcr.GetMarketplaceSubscription()
return map[string]interface{}{
"name": fcr.GetName(),
"uuid": fcr.GetUuid(),
Expand All @@ -339,6 +388,7 @@ func fabricCloudRouterMap(fcr *fabricv4.CloudRouter) map[string]interface{} {
"distinct_ipv6_prefixes_count": fcr.GetDistinctIpv6PrefixesCount(),
"connections_count": fcr.GetConnectionsCount(),
"order": equinix_fabric_schema.OrderGoToTerraform(&order),
"marketplace_subscription": marketplaceSubscriptionCloudRouterGoToTerraform(&marketplaceSubscription),
}
}

Expand Down Expand Up @@ -377,6 +427,19 @@ func packageCloudRouterGoToTerraform(packageType *fabricv4.CloudRouterPostReques
)
return packageSet
}
func marketplaceSubscriptionCloudRouterGoToTerraform(subscription *fabricv4.MarketplaceSubscription) *schema.Set {
if subscription == nil {
return nil
}
mappedSubscription := make(map[string]interface{})
mappedSubscription["type"] = string(subscription.GetType())
mappedSubscription["uuid"] = subscription.GetUuid()

subscriptionSet := schema.NewSet(
schema.HashResource(&schema.Resource{Schema: fabricMarketplaceSubscriptionSch()}),
[]interface{}{mappedSubscription})
return subscriptionSet
}
func getCloudRouterUpdateRequest(conn *fabricv4.CloudRouter, d *schema.ResourceData) (fabricv4.CloudRouterChangeOperation, error) {
changeOps := fabricv4.CloudRouterChangeOperation{}
existingName := conn.GetName()
Expand Down
24 changes: 24 additions & 0 deletions examples/resources/equinix_fabric_cloud_router/example_2.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
resource "equinix_fabric_cloud_router" "new_cloud_router"{
name = "Router-SV"
type = "XF_ROUTER"
notifications{
type = "ALL"
emails = ["[email protected]","[email protected]"]
}
order {
purchase_order_number = "1-323292"
}
location {
metro_code = "SV"
}
package {
code = "STANDARD"
}
project {
project_id = "776847000642406"
}
marketplace_subscription {
type = "AWS_MARKETPLACE_SUBSCRIPTION"
uuid = "2823b8ae07-a2a2-45b4-a658-c3542bb24e9"
}
}
25 changes: 25 additions & 0 deletions templates/resources/fabric_cloud_router.md.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
subcategory: "Fabric"
---

{{/* This template serves as a starting point for documentation generation, and can be customized with hardcoded values and/or doc gen templates.

For example, the {{ .SchemaMarkdown }} template can be used to replace manual schema documentation if descriptions of schema attributes are added in the provider source code. */ -}}

# equinix_fabric_cloud_router (Resource)

Fabric V4 API compatible resource allows creation and management of [Equinix Fabric Cloud Router](https://docs.equinix.com/en-us/Content/Interconnection/FCR/FCR-intro.htm#HowItWorks).

Additional documentation:
* Getting Started: https://docs.equinix.com/en-us/Content/Interconnection/FCR/FCR-intro.htm#HowItWorks
* API: https://developer.equinix.com/dev-docs/fabric/api-reference/fabric-v4-apis#fabric-cloud-routers

## Example Usage

Fabric Cloud Router
{{tffile "examples/resources/equinix_fabric_cloud_router/example_1.tf"}}

Fabric Cloud Router with Marketplace Subscription id
{{tffile "examples/resources/equinix_fabric_cloud_router/example_2.tf"}}

{{ .SchemaMarkdown | trimspace }}

0 comments on commit 692594c

Please sign in to comment.