From bc59530e8c8f78fd3ea76cd8fe4f6d80c449403c Mon Sep 17 00:00:00 2001 From: Roberto Jung Drebes Date: Wed, 27 Nov 2019 00:13:57 +0100 Subject: [PATCH] Auto-generate BgpPeer (#2434) Merged PR #2434. --- build/terraform | 2 +- build/terraform-beta | 2 +- products/compute/ansible.yaml | 4 + products/compute/api.yaml | 170 ++++++++ products/compute/inspec.yaml | 2 + products/compute/terraform.yaml | 30 ++ .../examples/router_peer_basic.tf.erb | 9 + .../resources/resource_compute_router_peer.go | 399 ------------------ ... resource_compute_router_bgp_peer_test.go} | 0 third_party/terraform/utils/provider.go.erb | 1 - .../terraform/website-compiled/google.erb | 2 +- .../docs/r/compute_router_peer.html.markdown | 104 ----- 12 files changed, 218 insertions(+), 507 deletions(-) create mode 100644 templates/terraform/examples/router_peer_basic.tf.erb delete mode 100644 third_party/terraform/resources/resource_compute_router_peer.go rename third_party/terraform/tests/{resource_compute_router_peer_test.go => resource_compute_router_bgp_peer_test.go} (100%) delete mode 100644 third_party/terraform/website/docs/r/compute_router_peer.html.markdown diff --git a/build/terraform b/build/terraform index 645b298d3e49..4d2b96874a47 160000 --- a/build/terraform +++ b/build/terraform @@ -1 +1 @@ -Subproject commit 645b298d3e49e1da8c4a128884ca72456e9c4550 +Subproject commit 4d2b96874a474fff754483f24fe669361f13be47 diff --git a/build/terraform-beta b/build/terraform-beta index d365481e9607..cfe3b7ae63ec 160000 --- a/build/terraform-beta +++ b/build/terraform-beta @@ -1 +1 @@ -Subproject commit d365481e9607af631fa6b7fc89e3f2127d6b472d +Subproject commit cfe3b7ae63eca36bf6ede4803a0d5816bd3d09a2 diff --git a/products/compute/ansible.yaml b/products/compute/ansible.yaml index b528af0048e9..5669f9081db1 100644 --- a/products/compute/ansible.yaml +++ b/products/compute/ansible.yaml @@ -49,6 +49,8 @@ datasources: !ruby/object:Overrides::ResourceOverrides exclude: true ResourcePolicy: !ruby/object:Overrides::Ansible::ResourceOverride exclude: true + RouterBgpPeer: !ruby/object:Overrides::Ansible::ResourceOverride + exclude: true RouterNat: !ruby/object:Overrides::Ansible::ResourceOverride exclude: true ExternalVpnGateway: !ruby/object:Overrides::Ansible::ResourceOverride @@ -330,6 +332,8 @@ overrides: !ruby/object:Overrides::ResourceOverrides exclude: true RegionUrlMap: !ruby/object:Overrides::Ansible::ResourceOverride exclude: true + RouterBgpPeer: !ruby/object:Overrides::Ansible::ResourceOverride + exclude: true RouterNat: !ruby/object:Overrides::Ansible::ResourceOverride exclude: true Zone: !ruby/object:Overrides::Ansible::ResourceOverride diff --git a/products/compute/api.yaml b/products/compute/api.yaml index f3a53a31c2bd..accbb6f1c49c 100644 --- a/products/compute/api.yaml +++ b/products/compute/api.yaml @@ -9332,6 +9332,176 @@ objects: - :ERRORS_ONLY - :TRANSLATIONS_ONLY - :ALL + - !ruby/object:Api::Resource + name: 'RouterBgpPeer' + base_url: projects/{{project}}/regions/{{region}}/routers/{{router}} + self_link: projects/{{project}}/regions/{{region}}/routers/{{router}} + create_verb: :PATCH + update_verb: :PATCH + delete_verb: :PATCH + identity: + - name + nested_query: !ruby/object:Api::Resource::NestedQuery + modify_by_patch: true + keys: + - bgpPeers + description: | + BGP information that must be configured into the routing stack to + establish BGP peering. This information must specify the peer ASN + and either the interface name, IP address, or peer IP address. + Please refer to RFC4273. + references: !ruby/object:Api::Resource::ReferenceLinks + guides: + 'Google Cloud Router': 'https://cloud.google.com/router/docs/' + api: 'https://cloud.google.com/compute/docs/reference/rest/v1/routers' + async: !ruby/object:Api::Async + operation: !ruby/object:Api::Async::Operation + kind: 'compute#operation' + path: 'name' + base_url: 'projects/{{project}}/regions/{{regions}}/operations/{{op_id}}' + wait_ms: 1000 + timeouts: !ruby/object:Api::Timeouts + insert_minutes: 10 + update_minutes: 10 + delete_minutes: 10 + result: !ruby/object:Api::Async::Result + path: 'targetLink' + status: !ruby/object:Api::Async::Status + path: 'status' + complete: 'DONE' + allowed: + - 'PENDING' + - 'RUNNING' + - 'DONE' + error: !ruby/object:Api::Async::Error + path: 'error/errors' + message: 'message' + parameters: + - !ruby/object:Api::Type::ResourceRef + name: 'router' + resource: 'Router' + imports: 'name' + description: | + The name of the Cloud Router in which this BgpPeer will be configured. + required: true + input: true + url_param_only: true + - !ruby/object:Api::Type::ResourceRef + name: region + resource: Region + imports: name + description: Region where the router and BgpPeer reside. + input: true + required: true + url_param_only: true + properties: + - !ruby/object:Api::Type::String + name: 'name' + description: | + Name of this BGP peer. The name must be 1-63 characters long, + and comply with RFC1035. Specifically, the name must be 1-63 characters + long and match the regular expression `[a-z]([-a-z0-9]*[a-z0-9])?` which + means the first character must be a lowercase letter, and all + following characters must be a dash, lowercase letter, or digit, + except the last character, which cannot be a dash. + required: true + input: true + - !ruby/object:Api::Type::String + name: 'interfaceName' + description: | + Name of the interface the BGP peer is associated with. + required: true + input: true + - !ruby/object:Api::Type::String + name: 'ipAddress' + description: | + IP address of the interface inside Google Cloud Platform. + Only IPv4 is supported. + output: true + - !ruby/object:Api::Type::String + name: 'peerIpAddress' + description: | + IP address of the BGP interface outside Google Cloud Platform. + Only IPv4 is supported. + required: true + input: true + - !ruby/object:Api::Type::Integer + name: 'peerAsn' + description: | + Peer BGP Autonomous System Number (ASN). + Each BGP interface may use a different value. + required: true + input: true + - !ruby/object:Api::Type::Integer + name: 'advertisedRoutePriority' + description: | + The priority of routes advertised to this BGP peer. + Where there is more than one matching route of maximum + length, the routes with the lowest priority value win. + - !ruby/object:Api::Type::Enum + name: advertiseMode + description: | + User-specified flag to indicate which mode to use for advertisement. + Valid values of this enum field are: `DEFAULT`, `CUSTOM` + values: + - :DEFAULT + - :CUSTOM + default_value: :DEFAULT + input: true + - !ruby/object:Api::Type::Array + name: advertisedGroups + description: | + User-specified list of prefix groups to advertise in custom + mode, which can take one of the following options: + + * `ALL_SUBNETS`: Advertises all available subnets, including peer VPC subnets. + * `ALL_VPC_SUBNETS`: Advertises the router's own VPC subnets. + * `ALL_PEER_VPC_SUBNETS`: Advertises peer subnets of the router's VPC network. + + + Note that this field can only be populated if advertiseMode is `CUSTOM` + and overrides the list defined for the router (in the "bgp" message). + These groups are advertised in addition to any specified prefixes. + Leave this field blank to advertise no custom groups. + send_empty_value: true + item_type: Api::Type::String + input: true + - !ruby/object:Api::Type::Array + name: advertisedIpRanges + description: | + User-specified list of individual IP ranges to advertise in + custom mode. This field can only be populated if advertiseMode + is `CUSTOM` and is advertised to all peers of the router. These IP + ranges will be advertised in addition to any specified groups. + Leave this field blank to advertise no custom IP ranges. + send_empty_value: true + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: range + required: true + description: | + The IP range to advertise. The value must be a + CIDR-formatted string. + - !ruby/object:Api::Type::String + name: description + description: | + User-specified description for the IP range. + send_empty_value: true + - !ruby/object:Api::Type::String + name: 'managementType' + description: | + The resource that configures and manages this BGP peer. + + * `MANAGED_BY_USER` is the default value and can be managed by + you or other users + * `MANAGED_BY_ATTACHMENT` is a BGP peer that is configured and + managed by Cloud Interconnect, specifically by an + InterconnectAttachment of type PARTNER. Google automatically + creates, updates, and deletes this type of BGP peer when the + PARTNER InterconnectAttachment is created, updated, + or deleted. + output: true - !ruby/object:Api::Resource name: 'Snapshot' kind: 'compute#snapshot' diff --git a/products/compute/inspec.yaml b/products/compute/inspec.yaml index 1a6b8c03d695..9d5630c2eba5 100644 --- a/products/compute/inspec.yaml +++ b/products/compute/inspec.yaml @@ -80,6 +80,8 @@ overrides: !ruby/object:Overrides::ResourceOverrides exclude: true ResourcePolicy: !ruby/object:Overrides::Inspec::ResourceOverride exclude: true + RouterBgpPeer: !ruby/object:Overrides::Inspec::ResourceOverride + exclude: true Subnetwork: !ruby/object:Overrides::Inspec::ResourceOverride exclude_resource: true iam_policy: !ruby/object:Api::Resource::IamPolicy diff --git a/products/compute/terraform.yaml b/products/compute/terraform.yaml index 9ba2d64acd56..a653b3cc0614 100644 --- a/products/compute/terraform.yaml +++ b/products/compute/terraform.yaml @@ -1422,6 +1422,36 @@ overrides: !ruby/object:Overrides::ResourceOverrides custom_code: !ruby/object:Provider::Terraform::CustomCode constants: 'templates/terraform/constants/router_nat.go.erb' resource_definition: 'templates/terraform/resource_definition/router_nat.go.erb' + RouterBgpPeer: !ruby/object:Overrides::Terraform::ResourceOverride + legacy_name: 'google_compute_router_peer' + exclude_validator: true + id_format: "projects/{{project}}/regions/{{region}}/routers/{{router}}/{{name}}" + mutex: router/{{region}}/{{router}} + examples: + # These examples are not used to autogenerate tests, as fine-grained + # resources do not fit the normal test flow - we need to test deletion + # in a test step while parent resource still exists vs in CheckDestroy + # when all resources have been deleted. + - !ruby/object:Provider::Terraform::Examples + name: "router_peer_basic" + primary_resource_id: "peer" + skip_test: true + vars: + router_name: "my-router" + peer_name: "my-router-peer" + properties: + name: !ruby/object:Overrides::Terraform::PropertyOverride + validation: !ruby/object:Provider::Terraform::Validation + function: 'validateRFC1035Name(2, 63)' + interfaceName: !ruby/object:Overrides::Terraform::PropertyOverride + name: 'interface' + region: !ruby/object:Overrides::Terraform::PropertyOverride + required: false + default_from_api: true + custom_flatten: 'templates/terraform/custom_flatten/name_from_self_link.erb' + description: | + {{description}} + If it is not provided, the provider region is used. Snapshot: !ruby/object:Overrides::Terraform::ResourceOverride timeouts: !ruby/object:Api::Timeouts insert_minutes: 5 diff --git a/templates/terraform/examples/router_peer_basic.tf.erb b/templates/terraform/examples/router_peer_basic.tf.erb new file mode 100644 index 000000000000..b17f3331acbf --- /dev/null +++ b/templates/terraform/examples/router_peer_basic.tf.erb @@ -0,0 +1,9 @@ +resource "google_compute_router_peer" "<%= ctx[:primary_resource_id] %>" { + name = "<%= ctx[:vars]['peer_name'] %>" + router = "<%= ctx[:vars]['router_name'] %>" + region = "us-central1" + peer_ip_address = "169.254.1.2" + peer_asn = 65513 + advertised_route_priority = 100 + interface = "interface-1" +} diff --git a/third_party/terraform/resources/resource_compute_router_peer.go b/third_party/terraform/resources/resource_compute_router_peer.go deleted file mode 100644 index 80963e4bbef6..000000000000 --- a/third_party/terraform/resources/resource_compute_router_peer.go +++ /dev/null @@ -1,399 +0,0 @@ -package google - -import ( - "fmt" - "log" - - "strings" - - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - "github.com/hashicorp/terraform-plugin-sdk/helper/validation" - "google.golang.org/api/compute/v1" - "google.golang.org/api/googleapi" -) - -func resourceComputeRouterPeer() *schema.Resource { - return &schema.Resource{ - Create: resourceComputeRouterPeerCreate, - Read: resourceComputeRouterPeerRead, - Delete: resourceComputeRouterPeerDelete, - Importer: &schema.ResourceImporter{ - State: resourceComputeRouterPeerImportState, - }, - - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - "router": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - "interface": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - - "peer_ip_address": { - Type: schema.TypeString, - Optional: true, - ForceNew: true, - }, - - "peer_asn": { - Type: schema.TypeInt, - Required: true, - ForceNew: true, - }, - - "advertised_route_priority": { - Type: schema.TypeInt, - Optional: true, - ForceNew: true, - }, - - "advertise_mode": { - Type: schema.TypeString, - Optional: true, - ForceNew: true, - ValidateFunc: validation.StringInSlice([]string{"DEFAULT", "CUSTOM", ""}, false), - Default: "DEFAULT", - }, - - "advertised_groups": { - Type: schema.TypeList, - Optional: true, - ForceNew: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - - "advertised_ip_ranges": { - Type: schema.TypeList, - Optional: true, - ForceNew: true, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "description": { - Type: schema.TypeString, - Optional: true, - }, - "range": { - Type: schema.TypeString, - Required: true, - }, - }, - }, - }, - - "ip_address": { - Type: schema.TypeString, - Computed: true, - }, - - "project": { - Type: schema.TypeString, - Optional: true, - Computed: true, - ForceNew: true, - }, - - "region": { - Type: schema.TypeString, - Optional: true, - Computed: true, - ForceNew: true, - }, - }, - } -} - -func resourceComputeRouterPeerCreate(d *schema.ResourceData, meta interface{}) error { - - config := meta.(*Config) - - region, err := getRegion(d, config) - if err != nil { - return err - } - - project, err := getProject(d, config) - if err != nil { - return err - } - - routerName := d.Get("router").(string) - peerName := d.Get("name").(string) - - routerLock := getRouterLockName(region, routerName) - mutexKV.Lock(routerLock) - defer mutexKV.Unlock(routerLock) - - routersService := config.clientCompute.Routers - router, err := routersService.Get(project, region, routerName).Do() - if err != nil { - if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { - log.Printf("[WARN] Removing router peer %s because its router %s/%s is gone", peerName, region, routerName) - d.SetId("") - - return nil - } - - return fmt.Errorf("Error Reading router %s/%s: %s", region, routerName, err) - } - - peers := router.BgpPeers - for _, peer := range peers { - if peer.Name == peerName { - d.SetId("") - return fmt.Errorf("Router %s has peer %s already", routerName, peerName) - } - } - - ifaceName := d.Get("interface").(string) - - peer := &compute.RouterBgpPeer{Name: peerName, - InterfaceName: ifaceName} - - if v, ok := d.GetOk("peer_ip_address"); ok { - peer.PeerIpAddress = v.(string) - } - - if v, ok := d.GetOk("peer_asn"); ok { - peer.PeerAsn = int64(v.(int)) - } - - if v, ok := d.GetOk("advertised_route_priority"); ok { - peer.AdvertisedRoutePriority = int64(v.(int)) - } - - if v, ok := d.GetOk("advertise_mode"); ok { - peer.AdvertiseMode = v.(string) - } - - if v, ok := d.GetOk("advertised_groups"); ok { - peer.AdvertisedGroups = expandAdvertisedGroups(v.([]interface{})) - } - - if v, ok := d.GetOk("advertised_ip_ranges"); ok { - peer.AdvertisedIpRanges = expandAdvertisedIpRanges(v.([]interface{})) - } - - log.Printf("[INFO] Adding peer %s", peerName) - peers = append(peers, peer) - patchRouter := &compute.Router{ - BgpPeers: peers, - } - - log.Printf("[DEBUG] Updating router %s/%s with peers: %+v", region, routerName, peers) - op, err := routersService.Patch(project, region, router.Name, patchRouter).Do() - if err != nil { - return fmt.Errorf("Error patching router %s/%s: %s", region, routerName, err) - } - d.SetId(fmt.Sprintf("%s/%s/%s", region, routerName, peerName)) - err = computeOperationWait(config, op, project, "Patching router") - if err != nil { - d.SetId("") - return fmt.Errorf("Error waiting to patch router %s/%s: %s", region, routerName, err) - } - - return resourceComputeRouterPeerRead(d, meta) -} - -func resourceComputeRouterPeerRead(d *schema.ResourceData, meta interface{}) error { - - config := meta.(*Config) - - region, err := getRegion(d, config) - if err != nil { - return err - } - - project, err := getProject(d, config) - if err != nil { - return err - } - - routerName := d.Get("router").(string) - peerName := d.Get("name").(string) - - routersService := config.clientCompute.Routers - router, err := routersService.Get(project, region, routerName).Do() - if err != nil { - if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { - log.Printf("[WARN] Removing router peer %s because its router %s/%s is gone", peerName, region, routerName) - d.SetId("") - - return nil - } - - return fmt.Errorf("Error Reading router %s/%s: %s", region, routerName, err) - } - - for _, peer := range router.BgpPeers { - - if peer.Name == peerName { - d.SetId(fmt.Sprintf("%s/%s/%s", region, routerName, peerName)) - d.Set("interface", peer.InterfaceName) - d.Set("peer_ip_address", peer.PeerIpAddress) - d.Set("peer_asn", peer.PeerAsn) - d.Set("advertised_route_priority", peer.AdvertisedRoutePriority) - d.Set("advertise_mode", flattenAdvertiseMode(peer.AdvertiseMode, d)) - d.Set("advertised_groups", peer.AdvertisedGroups) - d.Set("advertised_ip_ranges", flattenAdvertisedIpRanges(peer.AdvertisedIpRanges)) - d.Set("ip_address", peer.IpAddress) - d.Set("region", region) - d.Set("project", project) - return nil - } - } - - log.Printf("[WARN] Removing router peer %s/%s/%s because it is gone", region, routerName, peerName) - d.SetId("") - return nil -} - -func resourceComputeRouterPeerDelete(d *schema.ResourceData, meta interface{}) error { - - config := meta.(*Config) - - region, err := getRegion(d, config) - if err != nil { - return err - } - - project, err := getProject(d, config) - if err != nil { - return err - } - - routerName := d.Get("router").(string) - peerName := d.Get("name").(string) - - routerLock := getRouterLockName(region, routerName) - mutexKV.Lock(routerLock) - defer mutexKV.Unlock(routerLock) - - routersService := config.clientCompute.Routers - router, err := routersService.Get(project, region, routerName).Do() - if err != nil { - if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { - log.Printf("[WARN] Removing router peer %s because its router %s/%s is gone", peerName, region, routerName) - - return nil - } - - return fmt.Errorf("Error Reading Router %s: %s", routerName, err) - } - - var newPeers []*compute.RouterBgpPeer = make([]*compute.RouterBgpPeer, 0, len(router.BgpPeers)) - for _, peer := range router.BgpPeers { - if peer.Name == peerName { - continue - } else { - newPeers = append(newPeers, peer) - } - } - - if len(newPeers) == len(router.BgpPeers) { - log.Printf("[DEBUG] Router %s/%s had no peer %s already", region, routerName, peerName) - d.SetId("") - return nil - } - - log.Printf( - "[INFO] Removing peer %s from router %s/%s", peerName, region, routerName) - patchRouter := &compute.Router{ - BgpPeers: newPeers, - } - - if len(newPeers) == 0 { - patchRouter.ForceSendFields = append(patchRouter.ForceSendFields, "BgpPeers") - } - - log.Printf("[DEBUG] Updating router %s/%s with peers: %+v", region, routerName, newPeers) - op, err := routersService.Patch(project, region, router.Name, patchRouter).Do() - if err != nil { - return fmt.Errorf("Error patching router %s/%s: %s", region, routerName, err) - } - - err = computeOperationWait(config, op, project, "Patching router") - if err != nil { - return fmt.Errorf("Error waiting to patch router %s/%s: %s", region, routerName, err) - } - - d.SetId("") - return nil -} - -func resourceComputeRouterPeerImportState(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { - parts := strings.Split(d.Id(), "/") - if len(parts) != 3 { - return nil, fmt.Errorf("Invalid router peer specifier. Expecting {region}/{router}/{peer}") - } - - d.Set("region", parts[0]) - d.Set("router", parts[1]) - d.Set("name", parts[2]) - - return []*schema.ResourceData{d}, nil -} - -func expandAdvertisedGroups(v []interface{}) []string { - var groups []string - - if len(v) == 0 { - return nil - } - - for _, group := range v { - groups = append(groups, group.(string)) - } - - return groups -} - -func expandAdvertisedIpRanges(v []interface{}) []*compute.RouterAdvertisedIpRange { - var ranges []*compute.RouterAdvertisedIpRange - - if len(v) == 0 { - return nil - } - - for _, r := range v { - ipRange := r.(map[string]interface{}) - - ranges = append(ranges, &compute.RouterAdvertisedIpRange{ - Range: ipRange["range"].(string), - Description: ipRange["description"].(string), - }) - } - - return ranges -} - -func flattenAdvertisedIpRanges(ranges []*compute.RouterAdvertisedIpRange) []map[string]interface{} { - ls := make([]map[string]interface{}, 0, len(ranges)) - for _, r := range ranges { - if r == nil { - continue - } - ls = append(ls, map[string]interface{}{ - "range": r.Range, - "description": r.Description, - }) - } - return ls -} - -func flattenAdvertiseMode(v interface{}, d *schema.ResourceData) interface{} { - if v == nil || v.(string) == "" { - return "DEFAULT" - } - return v -} diff --git a/third_party/terraform/tests/resource_compute_router_peer_test.go b/third_party/terraform/tests/resource_compute_router_bgp_peer_test.go similarity index 100% rename from third_party/terraform/tests/resource_compute_router_peer_test.go rename to third_party/terraform/tests/resource_compute_router_bgp_peer_test.go diff --git a/third_party/terraform/utils/provider.go.erb b/third_party/terraform/utils/provider.go.erb index 76bdbb15bab6..06f0625ce6ce 100644 --- a/third_party/terraform/utils/provider.go.erb +++ b/third_party/terraform/utils/provider.go.erb @@ -294,7 +294,6 @@ end # products.each do "google_compute_project_metadata_item": resourceComputeProjectMetadataItem(), "google_compute_region_instance_group_manager": resourceComputeRegionInstanceGroupManager(), "google_compute_router_interface": resourceComputeRouterInterface(), - "google_compute_router_peer": resourceComputeRouterPeer(), "google_compute_security_policy": resourceComputeSecurityPolicy(), "google_compute_shared_vpc_host_project": resourceComputeSharedVpcHostProject(), "google_compute_shared_vpc_service_project": resourceComputeSharedVpcServiceProject(), diff --git a/third_party/terraform/website-compiled/google.erb b/third_party/terraform/website-compiled/google.erb index 728ddb59664a..c545ec8f42bb 100644 --- a/third_party/terraform/website-compiled/google.erb +++ b/third_party/terraform/website-compiled/google.erb @@ -710,7 +710,7 @@ > - google_compute_router_peer + google_compute_router_peer > diff --git a/third_party/terraform/website/docs/r/compute_router_peer.html.markdown b/third_party/terraform/website/docs/r/compute_router_peer.html.markdown deleted file mode 100644 index f83134db3653..000000000000 --- a/third_party/terraform/website/docs/r/compute_router_peer.html.markdown +++ /dev/null @@ -1,104 +0,0 @@ ---- -subcategory: "Compute Engine" -layout: "google" -page_title: "Google: google_compute_router_peer" -sidebar_current: "docs-google-compute-router-peer" -description: |- - Manages a Cloud Router BGP peer. ---- - -# google\_compute\_router\_peer - -Manages a Cloud Router BGP peer. For more information see -[the official documentation](https://cloud.google.com/compute/docs/cloudrouter) -and -[API](https://cloud.google.com/compute/docs/reference/latest/routers). - -## Example Usage - -```hcl -resource "google_compute_router_peer" "foobar" { - name = "peer-1" - router = "router-1" - region = "us-central1" - peer_ip_address = "169.254.1.2" - peer_asn = 65513 - advertised_route_priority = 100 - interface = "interface-1" -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) A unique name for BGP peer, required by GCE. Changing - this forces a new peer to be created. - -* `router` - (Required) The name of the router in which this BGP peer will be configured. - Changing this forces a new peer to be created. - -* `interface` - (Required) The name of the interface the BGP peer is associated with. - Changing this forces a new peer to be created. - -* `peer_ip_address` - (Required) IP address of the BGP interface outside Google Cloud. - Changing this forces a new peer to be created. - -* `peer_asn` - (Required) Peer BGP Autonomous System Number (ASN). - Changing this forces a new peer to be created. - -- - - - -* `advertised_route_priority` - (Optional) The priority of routes advertised to this BGP peer. - Changing this forces a new peer to be created. - -* `advertise_mode` - (Optional) User-specified flag to indicate which mode to use for advertisement. - Options include `DEFAULT` or `CUSTOM`. - -* `advertised_groups` - (Optional) User-specified list of prefix groups to advertise in custom mode, - which can take one of the following options: - - `ALL_SUBNETS`: Advertises all available subnets, including peer VPC subnets. - `ALL_VPC_SUBNETS`: Advertises the router's own VPC subnets. - `ALL_PEER_VPC_SUBNETS`: Advertises peer subnets of the router's VPC network. - - Note that this field can only be populated if `advertise_mode` is `CUSTOM` and overrides the list - defined for the router (in the "bgp" message). These groups are advertised in addition to any - specified prefixes. Leave this field blank to advertise no custom groups. - -* `advertised_ip_ranges` - (Optional) User-specified list of individual IP ranges to advertise in - custom mode. This field can only be populated if `advertise_mode` is `CUSTOM` and overrides - the list defined for the router (in the "bgp" message). These IP ranges are advertised in - addition to any specified groups. Leave this field blank to advertise no custom IP ranges. - -* `project` - (Optional) The ID of the project in which this peer's router belongs. If it - is not provided, the provider project is used. Changing this forces a new peer to be created. - -* `region` - (Optional) The region this peer's router sits in. If not specified, - the project region will be used. Changing this forces a new peer to be - created. - - -The `advertised_ip_ranges` block supports: - -* `description` - - (Optional) User-specified description for the IP range. - -* `range` - - (Required) The IP range to advertise. The value must be a CIDR-formatted string. - - -## Attributes Reference - -In addition to the arguments listed above, the following computed attributes are -exported: - -* `ip_address` - IP address of the interface inside Google Cloud Platform. - -## Import - -Router BGP peers can be imported using the `region`, `router`, and `name`, e.g. - -``` -$ terraform import google_compute_router_peer.foobar us-central1/router-1/peer-1 -```