diff --git a/examples/cloud-router-2-azure-connection/main.tf b/examples/cloud-router-2-azure-connection/main.tf index 8aeddd6e..7ccc28af 100644 --- a/examples/cloud-router-2-azure-connection/main.tf +++ b/examples/cloud-router-2-azure-connection/main.tf @@ -2,7 +2,35 @@ provider "equinix" { client_id = var.equinix_client_id client_secret = var.equinix_client_secret } +provider "azurerm" { + features {} + client_id = var.azure_client_id + client_secret = var.azure_client_secret + tenant_id = var.azure_tenant_id + subscription_id = var.azure_subscription_id + skip_provider_registration = true +} +resource "azurerm_resource_group" "fcr2azure" { + name = var.azure_resource_name + location = var.azure_location +} +resource "azurerm_express_route_circuit" "fcr2azure" { + name = var.azure_service_key_name + resource_group_name = azurerm_resource_group.fcr2azure.name + location = azurerm_resource_group.fcr2azure.location + service_provider_name = var.azure_service_provider_name + peering_location = var.azure_peering_location + bandwidth_in_mbps = var.bandwidth + sku { + tier = var.azure_tier + family = var.azure_family + } + allow_classic_operations = false + tags = { + environment = var.azure_environment + } +} module "cloud_router_azure_connection" { source = "../../modules/cloud-router-connection" @@ -10,7 +38,7 @@ module "cloud_router_azure_connection" { connection_type = var.connection_type notifications_type = var.notifications_type notifications_emails = var.notifications_emails - bandwidth = var.bandwidth + bandwidth = azurerm_express_route_circuit.fcr2azure.bandwidth_in_mbps purchase_order_number = var.purchase_order_number #Aside @@ -19,7 +47,7 @@ module "cloud_router_azure_connection" { #Zside zside_ap_type = var.zside_ap_type - zside_ap_authentication_key = var.zside_ap_authentication_key + zside_ap_authentication_key = azurerm_express_route_circuit.fcr2azure.service_key zside_ap_profile_type = var.zside_ap_profile_type zside_location = var.zside_location zside_peering_type = var.zside_peering_type diff --git a/examples/cloud-router-2-azure-connection/terraform.tfvars.example b/examples/cloud-router-2-azure-connection/terraform.tfvars.example index a637cc5d..07a2da95 100644 --- a/examples/cloud-router-2-azure-connection/terraform.tfvars.example +++ b/examples/cloud-router-2-azure-connection/terraform.tfvars.example @@ -15,3 +15,14 @@ zside_ap_profile_type = "L2_PROFILE" zside_location = "SV" zside_peering_type = "PRIVATE" zside_fabric_sp_name = "Azure ExpressRoute" +azure_client_id = "" +azure_client_secret = "" +azure_tenant_id = "" +azure_subscription_id = "" +azure_location = "West US 2" +azure_service_key_name = "Test_Azure_Key" +azure_service_provider_name = "" +azure_peering_location = "Silicon Valley Test" +azure_tier = "Standard" +azure_family = "UnlimitedData" +azure_environment = "PROD" diff --git a/examples/cloud-router-2-azure-connection/variables.tf b/examples/cloud-router-2-azure-connection/variables.tf index 142a6d9a..6ba26eed 100644 --- a/examples/cloud-router-2-azure-connection/variables.tf +++ b/examples/cloud-router-2-azure-connection/variables.tf @@ -41,12 +41,6 @@ variable "aside_fcr_uuid" { description = "Equinix-assigned Fabric Cloud Router identifier" type = string } - -variable "zside_ap_authentication_key" { - description = "Authentication key for provider based connections" - type = string - default = "" -} variable "zside_ap_type" { description = "Access point type - COLO, VD, VG, SP, IGW, SUBNET, GW" type = string @@ -72,3 +66,53 @@ variable "zside_fabric_sp_name" { type = string default = "" } +variable "azure_client_id" { + description = "Azure Client id" + type = string +} +variable "azure_client_secret" { + description = "Azure Secret value" + type = string +} +variable "azure_tenant_id" { + description = "Azure Tenant id" + type = string +} +variable "azure_subscription_id" { + description = "Azure Subscription id" + type = string +} +variable "azure_resource_name" { + description = "The name of Azure Resource" + type = string +} +variable "azure_location" { + description = "The Location of Azure service provider(resource)" + type = string +} +variable "azure_service_key_name" { + description = "Azure Service Key Name" + type = string +} +variable "azure_service_provider_name" { + description = "The name of Azure Service Provider" + type = string + default = "" +} +variable "azure_peering_location" { + description = "The name of the peering location (not the Azure resource location)" + type = string + default = "" +} +variable "azure_tier" { + description = "The Service tier. Possible values are Basic, Local, Standard or Premium" + type = string +} +variable "azure_family" { + description = "The billing mode for bandwidth. Possible values are MeteredData or UnlimitedData" + type = string +} +variable "azure_environment" { + description = "The Cloud environment which should be used for Service Key" + type = string +} diff --git a/examples/cloud-router-2-azure-connection/versions.tf b/examples/cloud-router-2-azure-connection/versions.tf index 8e226867..50f7c1cf 100644 --- a/examples/cloud-router-2-azure-connection/versions.tf +++ b/examples/cloud-router-2-azure-connection/versions.tf @@ -5,5 +5,9 @@ terraform { source = "equinix/equinix" version = ">= 1.20.0" } + azurerm = { + source = "hashicorp/azurerm" + version = "3.84.0" + } } } diff --git a/examples/cloud-router-2-azure-redundant-connection/main.tf b/examples/cloud-router-2-azure-redundant-connection/main.tf index 55308ec2..9bc6aa9b 100644 --- a/examples/cloud-router-2-azure-redundant-connection/main.tf +++ b/examples/cloud-router-2-azure-redundant-connection/main.tf @@ -2,7 +2,35 @@ provider "equinix" { client_id = var.equinix_client_id client_secret = var.equinix_client_secret } +provider "azurerm" { + features {} + client_id = var.azure_client_id + client_secret = var.azure_client_secret + tenant_id = var.azure_tenant_id + subscription_id = var.azure_subscription_id + skip_provider_registration = true +} +resource "azurerm_resource_group" "fcr2azure" { + name = var.azure_resource_name + location = var.azure_location +} +resource "azurerm_express_route_circuit" "fcr2azure" { + name = var.azure_service_key_name + resource_group_name = azurerm_resource_group.fcr2azure.name + location = azurerm_resource_group.fcr2azure.location + service_provider_name = var.azure_service_provider_name + peering_location = var.azure_peering_location + bandwidth_in_mbps = var.bandwidth + sku { + tier = var.azure_tier + family = var.azure_family + } + allow_classic_operations = false + tags = { + environment = var.azure_environment + } +} module "cloud_router_azure_redundant_connection" { source = "../../modules/cloud-router-connection" @@ -11,7 +39,7 @@ module "cloud_router_azure_redundant_connection" { connection_type = var.connection_type notifications_type = var.notifications_type notifications_emails = var.notifications_emails - bandwidth = var.bandwidth + bandwidth = azurerm_express_route_circuit.fcr2azure.bandwidth_in_mbps purchase_order_number = var.purchase_order_number #Aside @@ -20,7 +48,7 @@ module "cloud_router_azure_redundant_connection" { #Zside zside_ap_type = var.zside_ap_type - zside_ap_authentication_key = var.zside_ap_authentication_key + zside_ap_authentication_key = azurerm_express_route_circuit.fcr2azure.service_key zside_ap_profile_type = var.zside_ap_profile_type zside_location = var.zside_location zside_fabric_sp_name = var.zside_fabric_sp_name @@ -28,6 +56,6 @@ module "cloud_router_azure_redundant_connection" { #Secondary-Connection secondary_connection_name = var.secondary_connection_name - secondary_bandwidth = var.secondary_bandwidth + secondary_bandwidth = azurerm_express_route_circuit.fcr2azure.service_key aside_sec_fcr_uuid = var.aside_sec_fcr_uuid } diff --git a/examples/cloud-router-2-azure-redundant-connection/terraform.tfvars.example b/examples/cloud-router-2-azure-redundant-connection/terraform.tfvars.example index 3357c3df..ac10cfa7 100644 --- a/examples/cloud-router-2-azure-redundant-connection/terraform.tfvars.example +++ b/examples/cloud-router-2-azure-redundant-connection/terraform.tfvars.example @@ -19,3 +19,14 @@ zside_location = "SV" zside_peering_type = "PRIVATE" zside_seller_region = "us-west-1" zside_fabric_sp_name = "Azure ExpressRoute" +azure_client_id = "" +azure_client_secret = "" +azure_tenant_id = "" +azure_subscription_id = "" +azure_location = "West US 2" +azure_service_key_name = "Test_Azure_Key" +azure_service_provider_name = "" +azure_peering_location = "Silicon Valley Test" +azure_tier = "Standard" +azure_family = "UnlimitedData" +azure_environment = "PROD" diff --git a/examples/cloud-router-2-azure-redundant-connection/variables.tf b/examples/cloud-router-2-azure-redundant-connection/variables.tf index 19c795d3..768e48d0 100644 --- a/examples/cloud-router-2-azure-redundant-connection/variables.tf +++ b/examples/cloud-router-2-azure-redundant-connection/variables.tf @@ -42,11 +42,6 @@ variable "aside_fcr_uuid" { description = "Equinix-assigned Fabric Cloud Router identifier" type = string } -variable "zside_ap_authentication_key" { - description = "Authentication key for provider based connections" - type = string - default = "" -} variable "zside_ap_type" { description = "Access point type - COLO, VD, VG, SP, IGW, SUBNET, GW" type = string @@ -81,13 +76,59 @@ variable "aside_sec_fcr_uuid" { type = string default = "" } -variable "secondary_bandwidth" { - description = "Connection bandwidth in Mbps" - type = number - default = 50 -} variable "secondary_redundancy" { description = "Redundancy Priority for the Secondary connection" type = string default = "SECONDARY" } +variable "azure_client_id" { + description = "Azure Client id" + type = string +} +variable "azure_client_secret" { + description = "Azure Secret value" + type = string +} +variable "azure_tenant_id" { + description = "Azure Tenant id" + type = string +} +variable "azure_subscription_id" { + description = "Azure Subscription id" + type = string +} +variable "azure_resource_name" { + description = "The name of Azure Resource" + type = string +} +variable "azure_location" { + description = "The Location of Azure service provider(resource)" + type = string +} +variable "azure_service_key_name" { + description = "Azure Service Key Name" + type = string +} +variable "azure_service_provider_name" { + description = "The name of Azure Service Provider" + type = string + default = "" +} +variable "azure_peering_location" { + description = "The name of the peering location (not the Azure resource location)" + type = string + default = "" +} +variable "azure_tier" { + description = "The Service tier. Possible values are Basic, Local, Standard or Premium" + type = string +} +variable "azure_family" { + description = "The billing mode for bandwidth. Possible values are MeteredData or UnlimitedData" + type = string +} +variable "azure_environment" { + description = "The Cloud environment which should be used for Service Key" + type = string +} + diff --git a/examples/cloud-router-2-azure-redundant-connection/versions.tf b/examples/cloud-router-2-azure-redundant-connection/versions.tf index 8e226867..50f7c1cf 100644 --- a/examples/cloud-router-2-azure-redundant-connection/versions.tf +++ b/examples/cloud-router-2-azure-redundant-connection/versions.tf @@ -5,5 +5,9 @@ terraform { source = "equinix/equinix" version = ">= 1.20.0" } + azurerm = { + source = "hashicorp/azurerm" + version = "3.84.0" + } } } diff --git a/examples/port-2-azure-connection/main.tf b/examples/port-2-azure-connection/main.tf index 07f7532b..a42bde1c 100644 --- a/examples/port-2-azure-connection/main.tf +++ b/examples/port-2-azure-connection/main.tf @@ -2,7 +2,35 @@ provider "equinix" { client_id = var.equinix_client_id client_secret = var.equinix_client_secret } +provider "azurerm" { + features {} + client_id = var.azure_client_id + client_secret = var.azure_client_secret + tenant_id = var.azure_tenant_id + subscription_id = var.azure_subscription_id + skip_provider_registration = true +} +resource "azurerm_resource_group" "port2azure" { + name = var.azure_resource_name + location = var.azure_location +} +resource "azurerm_express_route_circuit" "port2azure" { + name = var.azure_service_key_name + resource_group_name = azurerm_resource_group.port2azure.name + location = azurerm_resource_group.port2azure.location + service_provider_name = var.azure_service_provider_name + peering_location = var.azure_peering_location + bandwidth_in_mbps = var.bandwidth + sku { + tier = var.azure_tier + family = var.azure_family + } + allow_classic_operations = false + tags = { + environment = var.azure_environment + } +} module "create_port_2_azure_connection" { source = "../../modules/port-connection" @@ -10,7 +38,7 @@ module "create_port_2_azure_connection" { connection_type = var.connection_type notifications_type = var.notifications_type notifications_emails = var.notifications_emails - bandwidth = var.bandwidth + bandwidth = azurerm_express_route_circuit.port2azure.bandwidth_in_mbps purchase_order_number = var.purchase_order_number # A-side @@ -20,7 +48,8 @@ module "create_port_2_azure_connection" { # Z-side zside_ap_type = var.zside_ap_type - zside_ap_authentication_key = var.zside_ap_authentication_key + zside_peering_type = var.zside_peering_type + zside_ap_authentication_key = azurerm_express_route_circuit.port2azure.service_key zside_ap_profile_type = var.zside_ap_profile_type zside_location = var.zside_location zside_sp_name = var.zside_sp_name diff --git a/examples/port-2-azure-connection/terraform.tfvars.example b/examples/port-2-azure-connection/terraform.tfvars.example index 2f474979..ec7cbb86 100644 --- a/examples/port-2-azure-connection/terraform.tfvars.example +++ b/examples/port-2-azure-connection/terraform.tfvars.example @@ -1,5 +1,5 @@ -equinix_client_id = "MyEquinixClientId" -equinix_client_secret = "MyEquinixSecret" +equinix_client_id = "" +equinix_client_secret = "" connection_name = "Port2Azure" connection_type = "EVPL_VC" @@ -11,7 +11,18 @@ aside_port_name = "sit-001-200009-CX-TY4-NL-Qinq-STD-10G-PRI-JP-252" aside_vlan_tag = "2019" aside_vlan_inner_tag = "2022" zside_ap_type = "SP" -zside_ap_authentication_key = "" zside_ap_profile_type = "L2_PROFILE" zside_location = "SV" zside_sp_name = "Azure ExpressRoute" +zside_peering_type = "PRIVATE" +azure_client_id = "" +azure_client_secret = "" +azure_tenant_id = "" +azure_subscription_id = "" +azure_location = "West US 2" +azure_service_key_name = "Test_Azure_Key" +azure_service_provider_name = "" +azure_peering_location = "Silicon Valley Test" +azure_tier = "Standard" +azure_family = "UnlimitedData" +azure_environment = "PROD" diff --git a/examples/port-2-azure-connection/variables.tf b/examples/port-2-azure-connection/variables.tf index 9d9643bb..597b3bab 100644 --- a/examples/port-2-azure-connection/variables.tf +++ b/examples/port-2-azure-connection/variables.tf @@ -6,7 +6,6 @@ variable "equinix_client_secret" { description = "Equinix client secret ID (consumer secret), obtained after registering app in the developer platform" type = string } - variable "connection_name" { description = "Connection name. An alpha-numeric 24 characters string which can include only hyphens and underscores" type = string @@ -33,12 +32,10 @@ variable "purchase_order_number" { type = string default = "" } - variable "aside_port_name" { description = "Equinix A-Side Port Name" type = string } - variable "aside_vlan_tag" { description = "Vlan Tag information, outer vlanSTag for QINQ connections" type = string @@ -52,10 +49,6 @@ variable "zside_ap_type" { description = "Access point type - COLO, VD, VG, SP, IGW, SUBNET, GW" type = string } -variable "zside_ap_authentication_key" { - description = "Authentication key for provider based connections" - type = string -} variable "zside_ap_profile_type" { description = "Service profile type - L2_PROFILE, L3_PROFILE, ECIA_PROFILE, ECMC_PROFILE" type = string @@ -68,3 +61,57 @@ variable "zside_sp_name" { description = "Equinix Service Profile Name" type = string } +variable "zside_peering_type" { + description = "Zside Access Point Peering type. Available values; PRIVATE, MICROSOFT, PUBLIC, MANUAL" + type = string +} +variable "azure_client_id" { + description = "Azure Client id" + type = string +} +variable "azure_client_secret" { + description = "Azure Secret value" + type = string +} +variable "azure_tenant_id" { + description = "Azure Tenant id" + type = string +} +variable "azure_subscription_id" { + description = "Azure Subscription id" + type = string +} +variable "azure_resource_name" { + description = "The name of Azure Resource" + type = string +} +variable "azure_location" { + description = "The location of Azure service provider(resource)" + type = string +} +variable "azure_service_key_name" { + description = "Azure Service Key Name" + type = string +} +variable "azure_service_provider_name" { + description = "The name of Azure Service Provider" + type = string + default = "" +} +variable "azure_peering_location" { + description = "The name of the peering location (not the Azure resource location)" + type = string + default = "" +} +variable "azure_tier" { + description = "The Service tier. Possible values are Basic, Local, Standard or Premium" + type = string +} +variable "azure_family" { + description = "The billing mode for bandwidth. Possible values are MeteredData or UnlimitedData" + type = string +} +variable "azure_environment" { + description = "The Cloud environment which should be used for Service Key" + type = string +} diff --git a/examples/port-2-azure-connection/versions.tf b/examples/port-2-azure-connection/versions.tf index 8e226867..ddfa46b5 100644 --- a/examples/port-2-azure-connection/versions.tf +++ b/examples/port-2-azure-connection/versions.tf @@ -1,9 +1,13 @@ terraform { - required_version = ">= 1.5.4" + required_version = ">= 1.5.2" required_providers { equinix = { source = "equinix/equinix" version = ">= 1.20.0" } + azurerm = { + source = "hashicorp/azurerm" + version = "3.84.0" + } } -} +} \ No newline at end of file diff --git a/examples/port-2-azure-redundant-connections/main.tf b/examples/port-2-azure-redundant-connections/main.tf index eb331b15..0ee0f9bf 100644 --- a/examples/port-2-azure-redundant-connections/main.tf +++ b/examples/port-2-azure-redundant-connections/main.tf @@ -2,7 +2,35 @@ provider "equinix" { client_id = var.equinix_client_id client_secret = var.equinix_client_secret } +provider "azurerm" { + features {} + client_id = var.azure_client_id + client_secret = var.azure_client_secret + tenant_id = var.azure_tenant_id + subscription_id = var.azure_subscription_id + skip_provider_registration = true +} +resource "azurerm_resource_group" "port2azure" { + name = var.azure_resource_name + location = var.azure_location +} +resource "azurerm_express_route_circuit" "port2azure" { + name = var.azure_service_key_name + resource_group_name = azurerm_resource_group.port2azure.name + location = azurerm_resource_group.port2azure.location + service_provider_name = var.azure_service_provider_name + peering_location = var.azure_peering_location + bandwidth_in_mbps = var.bandwidth + sku { + tier = var.azure_tier + family = var.azure_family + } + allow_classic_operations = false + tags = { + environment = var.azure_environment + } +} module "create_port_2_azure_connections" { source = "../../modules/port-connection" @@ -11,12 +39,12 @@ module "create_port_2_azure_connections" { connection_type = var.connection_type notifications_type = var.notifications_type notifications_emails = var.notifications_emails - bandwidth = var.bandwidth + bandwidth = azurerm_express_route_circuit.port2azure.bandwidth_in_mbps purchase_order_number = var.purchase_order_number # Secondary Connection Overrides secondary_connection_name = var.secondary_connection_name - secondary_bandwidth = var.secondary_bandwidth + secondary_bandwidth = azurerm_express_route_circuit.port2azure.bandwidth_in_mbps # Primary A-side aside_port_name = var.aside_port_name @@ -28,8 +56,9 @@ module "create_port_2_azure_connections" { # Z-side zside_ap_type = var.zside_ap_type - zside_ap_authentication_key = var.zside_ap_authentication_key + zside_ap_authentication_key = azurerm_express_route_circuit.port2azure.service_key zside_ap_profile_type = var.zside_ap_profile_type zside_location = var.zside_location zside_sp_name = var.zside_sp_name + zside_peering_type = var.zside_peering_type } diff --git a/examples/port-2-azure-redundant-connections/terraform.tfvars.example b/examples/port-2-azure-redundant-connections/terraform.tfvars.example index a81c7a9c..4a251bfe 100644 --- a/examples/port-2-azure-redundant-connections/terraform.tfvars.example +++ b/examples/port-2-azure-redundant-connections/terraform.tfvars.example @@ -18,3 +18,15 @@ zside_ap_authentication_key = "" zside_ap_profile_type = "L2_PROFILE" zside_location = "SV" zside_sp_name = "Azure ExpressRoute" +zside_peering_type = "PRIVATE" +azure_client_id = "" +azure_client_secret = "" +azure_tenant_id = "" +azure_subscription_id = "" +azure_location = "West US 2" +azure_service_key_name = "Test_Azure_Key" +azure_service_provider_name = "" +azure_peering_location = "Silicon Valley Test" +azure_tier = "Standard" +azure_family = "UnlimitedData" +azure_environment = "PROD" diff --git a/examples/port-2-azure-redundant-connections/variables.tf b/examples/port-2-azure-redundant-connections/variables.tf index 602b266b..cb53729d 100644 --- a/examples/port-2-azure-redundant-connections/variables.tf +++ b/examples/port-2-azure-redundant-connections/variables.tf @@ -6,12 +6,10 @@ variable "equinix_client_secret" { description = "Equinix client secret ID (consumer secret), obtained after registering app in the developer platform" type = string } - variable "connection_name" { description = "Connection name. An alpha-numeric 24 characters string which can include only hyphens and underscores" type = string } - variable "secondary_connection_name" { description = "Secondary Connection name. An alpha-numeric 24 characters string which can include only hyphens and underscores" type = string @@ -33,7 +31,6 @@ variable "bandwidth" { description = "Connection bandwidth in Mbps" type = number } - variable "secondary_bandwidth" { description = "Secondary Connection bandwidth in Mbps" type = number @@ -43,18 +40,14 @@ variable "purchase_order_number" { type = string default = "" } - variable "aside_port_name" { description = "Equinix A-Side Port Name" type = string } - - variable "aside_secondary_port_name" { description = "Secondary Equinix A-Side Port Name" type = string } - variable "aside_vlan_tag" { description = "Vlan Tag information, outer vlanSTag for QINQ connections" type = string @@ -68,10 +61,6 @@ variable "zside_ap_type" { description = "Access point type - COLO, VD, VG, SP, IGW, SUBNET, GW" type = string } -variable "zside_ap_authentication_key" { - description = "Authentication key for provider based connections" - type = string -} variable "zside_ap_profile_type" { description = "Service profile type - L2_PROFILE, L3_PROFILE, ECIA_PROFILE, ECMC_PROFILE" type = string @@ -84,3 +73,57 @@ variable "zside_sp_name" { description = "Equinix Service Profile Name" type = string } +variable "zside_peering_type" { + description = "Zside Access Point Peering type. Available values; PRIVATE, MICROSOFT, PUBLIC, MANUAL" + type = string +} +variable "azure_client_id" { + description = "Azure Client id" + type = string +} +variable "azure_client_secret" { + description = "Azure Secret value" + type = string +} +variable "azure_tenant_id" { + description = "Azure Tenant id" + type = string +} +variable "azure_subscription_id" { + description = "Azure Subscription id" + type = string +} +variable "azure_resource_name" { + description = "The name of Azure Resource" + type = string +} +variable "azure_location" { + description = "The location of Azure service provider(resource)" + type = string +} +variable "azure_service_key_name" { + description = "Azure Service Key" + type = string +} +variable "azure_service_provider_name" { + description = "The name of Azure Service Provider" + type = string + default = "" +} +variable "azure_peering_location" { + description = "The name of the peering location (not the Azure resource location)" + type = string + default = "" +} +variable "azure_tier" { + description = "The Service tier. Possible values are Basic, Local, Standard or Premium" + type = string +} +variable "azure_family" { + description = "The billing mode for bandwidth. Possible values are MeteredData or UnlimitedData" + type = string +} +variable "azure_environment" { + description = "The Cloud environment which should be used for Service Key" +} + diff --git a/examples/port-2-azure-redundant-connections/versions.tf b/examples/port-2-azure-redundant-connections/versions.tf index 8e226867..50f7c1cf 100644 --- a/examples/port-2-azure-redundant-connections/versions.tf +++ b/examples/port-2-azure-redundant-connections/versions.tf @@ -5,5 +5,9 @@ terraform { source = "equinix/equinix" version = ">= 1.20.0" } + azurerm = { + source = "hashicorp/azurerm" + version = "3.84.0" + } } }