Skip to content

Commit e5b7777

Browse files
Add support to create NCC Gateway Spoke (#15198) (#10894)
[upstream:f64ff0d77642f1509b148b4cdce5cb9e97cad993] Signed-off-by: Modular Magician <[email protected]>
1 parent 2ffb56d commit e5b7777

File tree

39 files changed

+1018
-335
lines changed

39 files changed

+1018
-335
lines changed

.changelog/15198.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
```release-note:enhancement
2+
networkconnectivity: added `gateway` field to `google_network_connectivity_spoke` resource (beta)
3+
```
4+
5+
```release-note:enhancement
6+
networkconnectivity: added `HYBRID_INSPECTION` enum value to `preset_topology` field in `google_network_connectivity_hub` resource (ga)
7+
```
8+
9+
```release-note:enhancement
10+
compute: added `ncc_gateway` field to `google_compute_router` resource (beta)
11+
```

google-beta/fwmodels/provider_model.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ type ProviderModel struct {
160160
MonitoringCustomEndpoint types.String `tfsdk:"monitoring_custom_endpoint"`
161161
NetappCustomEndpoint types.String `tfsdk:"netapp_custom_endpoint"`
162162
NetworkConnectivityCustomEndpoint types.String `tfsdk:"network_connectivity_custom_endpoint"`
163+
NetworkConnectivityv1CustomEndpoint types.String `tfsdk:"network_connectivityv1_custom_endpoint"`
163164
NetworkManagementCustomEndpoint types.String `tfsdk:"network_management_custom_endpoint"`
164165
NetworkSecurityCustomEndpoint types.String `tfsdk:"network_security_custom_endpoint"`
165166
NetworkServicesCustomEndpoint types.String `tfsdk:"network_services_custom_endpoint"`

google-beta/fwprovider/framework_provider.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,12 @@ func (p *FrameworkProvider) Schema(_ context.Context, _ provider.SchemaRequest,
826826
transport_tpg.CustomEndpointValidator(),
827827
},
828828
},
829+
"network_connectivityv1_custom_endpoint": &schema.StringAttribute{
830+
Optional: true,
831+
Validators: []validator.String{
832+
transport_tpg.CustomEndpointValidator(),
833+
},
834+
},
829835
"network_management_custom_endpoint": &schema.StringAttribute{
830836
Optional: true,
831837
Validators: []validator.String{

google-beta/provider/provider.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,11 @@ func Provider() *schema.Provider {
728728
Optional: true,
729729
ValidateFunc: transport_tpg.ValidateCustomEndpoint,
730730
},
731+
"network_connectivityv1_custom_endpoint": {
732+
Type: schema.TypeString,
733+
Optional: true,
734+
ValidateFunc: transport_tpg.ValidateCustomEndpoint,
735+
},
731736
"network_management_custom_endpoint": {
732737
Type: schema.TypeString,
733738
Optional: true,
@@ -1299,6 +1304,7 @@ func ProviderConfigure(ctx context.Context, d *schema.ResourceData, p *schema.Pr
12991304
config.MonitoringBasePath = d.Get("monitoring_custom_endpoint").(string)
13001305
config.NetappBasePath = d.Get("netapp_custom_endpoint").(string)
13011306
config.NetworkConnectivityBasePath = d.Get("network_connectivity_custom_endpoint").(string)
1307+
config.NetworkConnectivityv1BasePath = d.Get("network_connectivityv1_custom_endpoint").(string)
13021308
config.NetworkManagementBasePath = d.Get("network_management_custom_endpoint").(string)
13031309
config.NetworkSecurityBasePath = d.Get("network_security_custom_endpoint").(string)
13041310
config.NetworkServicesBasePath = d.Get("network_services_custom_endpoint").(string)

google-beta/provider/provider_mmv1_resources.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ import (
126126
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/monitoring"
127127
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/netapp"
128128
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/networkconnectivity"
129+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/networkconnectivityv1"
129130
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/networkmanagement"
130131
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/networksecurity"
131132
"github.com/hashicorp/terraform-provider-google-beta/google-beta/services/networkservices"
@@ -1405,11 +1406,11 @@ var generatedResources = map[string]*schema.Resource{
14051406
"google_netapp_kmsconfig": netapp.ResourceNetappkmsconfig(),
14061407
"google_network_connectivity_group": networkconnectivity.ResourceNetworkConnectivityGroup(),
14071408
"google_network_connectivity_hub": networkconnectivity.ResourceNetworkConnectivityHub(),
1408-
"google_network_connectivity_internal_range": networkconnectivity.ResourceNetworkConnectivityInternalRange(),
14091409
"google_network_connectivity_policy_based_route": networkconnectivity.ResourceNetworkConnectivityPolicyBasedRoute(),
14101410
"google_network_connectivity_regional_endpoint": networkconnectivity.ResourceNetworkConnectivityRegionalEndpoint(),
1411-
"google_network_connectivity_service_connection_policy": networkconnectivity.ResourceNetworkConnectivityServiceConnectionPolicy(),
14121411
"google_network_connectivity_spoke": networkconnectivity.ResourceNetworkConnectivitySpoke(),
1412+
"google_network_connectivity_internal_range": networkconnectivityv1.ResourceNetworkConnectivityv1InternalRange(),
1413+
"google_network_connectivity_service_connection_policy": networkconnectivityv1.ResourceNetworkConnectivityv1ServiceConnectionPolicy(),
14131414
"google_network_management_connectivity_test": networkmanagement.ResourceNetworkManagementConnectivityTest(),
14141415
"google_network_management_organization_vpc_flow_logs_config": networkmanagement.ResourceNetworkManagementOrganizationVpcFlowLogsConfig(),
14151416
"google_network_management_vpc_flow_logs_config": networkmanagement.ResourceNetworkManagementVpcFlowLogsConfig(),
@@ -1973,6 +1974,7 @@ func UseGeneratedProducts() {
19731974
var _ = monitoring.ProductName
19741975
var _ = netapp.ProductName
19751976
var _ = networkconnectivity.ProductName
1977+
var _ = networkconnectivityv1.ProductName
19761978
var _ = networkmanagement.ProductName
19771979
var _ = networksecurity.ProductName
19781980
var _ = networkservices.ProductName

google-beta/services/compute/resource_compute_router.go

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"log"
2626
"net/http"
2727
"reflect"
28+
"strings"
2829
"time"
2930

3031
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
@@ -88,13 +89,6 @@ which means the first character must be a lowercase letter, and all
8889
following characters must be a dash, lowercase letter, or digit,
8990
except the last character, which cannot be a dash.`,
9091
},
91-
"network": {
92-
Type: schema.TypeString,
93-
Required: true,
94-
ForceNew: true,
95-
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
96-
Description: `A reference to the network to which this router belongs.`,
97-
},
9892
"bgp": {
9993
Type: schema.TypeList,
10094
Optional: true,
@@ -204,6 +198,22 @@ Must be referenced by exactly one bgpPeer. Must comply with RFC1035.`,
204198
},
205199
},
206200
},
201+
"ncc_gateway": {
202+
Type: schema.TypeString,
203+
Optional: true,
204+
ForceNew: true,
205+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
206+
Description: `A URI of an NCC Gateway spoke`,
207+
ConflictsWith: []string{"network"},
208+
},
209+
"network": {
210+
Type: schema.TypeString,
211+
Optional: true,
212+
ForceNew: true,
213+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
214+
Description: `A reference to the network to which this router belongs.`,
215+
ConflictsWith: []string{"ncc_gateway"},
216+
},
207217
"params": {
208218
Type: schema.TypeList,
209219
Optional: true,
@@ -313,6 +323,12 @@ func resourceComputeRouterCreate(d *schema.ResourceData, meta interface{}) error
313323
} else if v, ok := d.GetOkExists("md5_authentication_keys"); !tpgresource.IsEmptyValue(reflect.ValueOf(md5AuthenticationKeysProp)) && (ok || !reflect.DeepEqual(v, md5AuthenticationKeysProp)) {
314324
obj["md5AuthenticationKeys"] = md5AuthenticationKeysProp
315325
}
326+
nccGatewayProp, err := expandComputeRouterNccGateway(d.Get("ncc_gateway"), d, config)
327+
if err != nil {
328+
return err
329+
} else if v, ok := d.GetOkExists("ncc_gateway"); !tpgresource.IsEmptyValue(reflect.ValueOf(nccGatewayProp)) && (ok || !reflect.DeepEqual(v, nccGatewayProp)) {
330+
obj["nccGateway"] = nccGatewayProp
331+
}
316332
paramsProp, err := expandComputeRouterParams(d.Get("params"), d, config)
317333
if err != nil {
318334
return err
@@ -449,6 +465,9 @@ func resourceComputeRouterRead(d *schema.ResourceData, meta interface{}) error {
449465
if err := d.Set("encrypted_interconnect_router", flattenComputeRouterEncryptedInterconnectRouter(res["encryptedInterconnectRouter"], d, config)); err != nil {
450466
return fmt.Errorf("Error reading Router: %s", err)
451467
}
468+
if err := d.Set("ncc_gateway", flattenComputeRouterNccGateway(res["nccGateway"], d, config)); err != nil {
469+
return fmt.Errorf("Error reading Router: %s", err)
470+
}
452471
if err := d.Set("region", flattenComputeRouterRegion(res["region"], d, config)); err != nil {
453472
return fmt.Errorf("Error reading Router: %s", err)
454473
}
@@ -745,6 +764,13 @@ func flattenComputeRouterEncryptedInterconnectRouter(v interface{}, d *schema.Re
745764
return v
746765
}
747766

767+
func flattenComputeRouterNccGateway(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
768+
if v == nil {
769+
return v
770+
}
771+
return tpgresource.ConvertSelfLinkToV1(v.(string))
772+
}
773+
748774
func flattenComputeRouterRegion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
749775
if v == nil {
750776
return v
@@ -927,6 +953,25 @@ func expandComputeRouterMd5AuthenticationKeysKey(v interface{}, d tpgresource.Te
927953
return v, nil
928954
}
929955

956+
func expandComputeRouterNccGateway(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
957+
// This method returns a full self link from a partial self link.
958+
if v == nil || v.(string) == "" {
959+
// It does not try to construct anything from empty.
960+
return "", nil
961+
} else if strings.HasPrefix(v.(string), "https://") {
962+
// Anything that starts with a URL scheme is assumed to be a self link worth using.
963+
return v, nil
964+
}
965+
// Anything else is assumed to be a regional resource, with a partial link that begins with the resource name.
966+
// This isn't very likely - it's a last-ditch effort to extract something useful here. We can do a better job
967+
// as soon as MultiResourceRefs are working since we'll know the types that this field is supposed to point to.
968+
url, err := tpgresource.ReplaceVars(d, config, "{{NetworkConnectivityBasePath}}")
969+
if err != nil {
970+
return nil, err
971+
}
972+
return url + v.(string), nil
973+
}
974+
930975
func expandComputeRouterParams(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
931976
if v == nil {
932977
return nil, nil

google-beta/services/compute/resource_compute_router_generated_meta.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ fields:
1818
- api_field: 'md5AuthenticationKeys.key'
1919
- api_field: 'md5AuthenticationKeys.name'
2020
- api_field: 'name'
21+
- api_field: 'nccGateway'
2122
- api_field: 'network'
2223
- api_field: 'params.resourceManagerTags'
2324
- api_field: 'region'

google-beta/services/compute/resource_compute_router_generated_test.go

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func TestAccComputeRouter_routerBasicExample(t *testing.T) {
4949
ResourceName: "google_compute_router.foobar",
5050
ImportState: true,
5151
ImportStateVerify: true,
52-
ImportStateVerifyIgnore: []string{"advertisedIpRanges", "md5_authentication_keys", "network", "params", "region"},
52+
ImportStateVerifyIgnore: []string{"advertisedIpRanges", "md5_authentication_keys", "ncc_gateway", "network", "params", "region"},
5353
},
5454
},
5555
})
@@ -99,7 +99,7 @@ func TestAccComputeRouter_computeRouterEncryptedInterconnectExample(t *testing.T
9999
ResourceName: "google_compute_router.encrypted-interconnect-router",
100100
ImportState: true,
101101
ImportStateVerify: true,
102-
ImportStateVerifyIgnore: []string{"advertisedIpRanges", "md5_authentication_keys", "network", "params", "region"},
102+
ImportStateVerifyIgnore: []string{"advertisedIpRanges", "md5_authentication_keys", "ncc_gateway", "network", "params", "region"},
103103
},
104104
},
105105
})
@@ -142,7 +142,7 @@ func TestAccComputeRouter_computeRouterMd5encryptedExample(t *testing.T) {
142142
ResourceName: "google_compute_router.foobar",
143143
ImportState: true,
144144
ImportStateVerify: true,
145-
ImportStateVerifyIgnore: []string{"advertisedIpRanges", "md5_authentication_keys", "network", "params", "region"},
145+
ImportStateVerifyIgnore: []string{"advertisedIpRanges", "md5_authentication_keys", "ncc_gateway", "network", "params", "region"},
146146
},
147147
},
148148
})
@@ -177,6 +177,95 @@ resource "google_compute_network" "foobar" {
177177
`, context)
178178
}
179179

180+
func TestAccComputeRouter_routerNccGwExample(t *testing.T) {
181+
t.Parallel()
182+
183+
context := map[string]interface{}{
184+
"random_suffix": acctest.RandString(t, 10),
185+
}
186+
187+
acctest.VcrTest(t, resource.TestCase{
188+
PreCheck: func() { acctest.AccTestPreCheck(t) },
189+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
190+
CheckDestroy: testAccCheckComputeRouterDestroyProducer(t),
191+
Steps: []resource.TestStep{
192+
{
193+
Config: testAccComputeRouter_routerNccGwExample(context),
194+
},
195+
{
196+
ResourceName: "google_compute_router.foobar",
197+
ImportState: true,
198+
ImportStateVerify: true,
199+
ImportStateVerifyIgnore: []string{"md5_authentication_keys", "ncc_gateway", "network", "params", "region"},
200+
},
201+
},
202+
})
203+
}
204+
205+
func testAccComputeRouter_routerNccGwExample(context map[string]interface{}) string {
206+
return acctest.Nprintf(`
207+
resource "google_compute_network" "network" {
208+
provider = google-beta
209+
name = "tf-test-net-spoke%{random_suffix}"
210+
auto_create_subnetworks = false
211+
}
212+
213+
resource "google_compute_subnetwork" "subnetwork" {
214+
provider = google-beta
215+
name = "tf-test-subnet%{random_suffix}"
216+
ip_cidr_range = "10.0.0.0/28"
217+
region = "us-central1"
218+
network = google_compute_network.network.self_link
219+
}
220+
221+
resource "google_network_connectivity_hub" "basic_hub" {
222+
provider = google-beta
223+
name = "hub%{random_suffix}"
224+
description = "A sample hub"
225+
labels = {
226+
label-two = "value-one"
227+
}
228+
preset_topology = "HYBRID_INSPECTION"
229+
}
230+
231+
resource "google_network_connectivity_spoke" "primary" {
232+
provider = google-beta
233+
name = "tf-test-my-ncc-gw%{random_suffix}"
234+
location = "us-central1"
235+
description = "A sample spoke of type Gateway"
236+
labels = {
237+
label-one = "value-one"
238+
}
239+
hub = google_network_connectivity_hub.basic_hub.id
240+
gateway {
241+
ip_range_reservations {
242+
ip_range = "10.0.0.0/23"
243+
}
244+
capacity = "CAPACITY_1_GBPS"
245+
}
246+
group = "gateways"
247+
}
248+
249+
250+
resource "google_compute_router" "foobar" {
251+
provider = google-beta
252+
name = "tf-test-my-router%{random_suffix}"
253+
bgp {
254+
asn = 64514
255+
advertise_mode = "CUSTOM"
256+
advertised_groups = ["ALL_SUBNETS"]
257+
advertised_ip_ranges {
258+
range = "1.2.3.4"
259+
}
260+
advertised_ip_ranges {
261+
range = "6.7.0.0/16"
262+
}
263+
}
264+
ncc_gateway = google_network_connectivity_spoke.primary.id
265+
}
266+
`, context)
267+
}
268+
180269
func testAccCheckComputeRouterDestroyProducer(t *testing.T) func(s *terraform.State) error {
181270
return func(s *terraform.State) error {
182271
for name, rs := range s.RootModule().Resources {

google-beta/services/networkconnectivity/resource_network_connectivity_group_generated_meta.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ resource: 'google_network_connectivity_group'
22
generation_type: 'mmv1'
33
source_file: 'products/networkconnectivity/Group.yaml'
44
api_service_name: 'networkconnectivity.googleapis.com'
5-
api_version: 'v1'
5+
api_version: 'v1beta'
66
api_resource_type_kind: 'Group'
77
fields:
88
- api_field: 'autoAccept.autoAcceptProjects'

google-beta/services/networkconnectivity/resource_network_connectivity_hub.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ Please refer to the field 'effective_labels' for all of the labels present on th
9999
Computed: true,
100100
Optional: true,
101101
ForceNew: true,
102-
ValidateFunc: verify.ValidateEnum([]string{"MESH", "STAR", ""}),
103-
Description: `Optional. The topology implemented in this hub. Currently, this field is only used when policyMode = PRESET. The available preset topologies are MESH and STAR. If presetTopology is unspecified and policyMode = PRESET, the presetTopology defaults to MESH. When policyMode = CUSTOM, the presetTopology is set to PRESET_TOPOLOGY_UNSPECIFIED. Possible values: ["MESH", "STAR"]`,
102+
ValidateFunc: verify.ValidateEnum([]string{"MESH", "STAR", "HYBRID_INSPECTION", ""}),
103+
Description: `Optional. The topology implemented in this hub. Currently, this field is only used when policyMode = PRESET. The available preset topologies are MESH and STAR. If presetTopology is unspecified and policyMode = PRESET, the presetTopology defaults to MESH. When policyMode = CUSTOM, the presetTopology is set to PRESET_TOPOLOGY_UNSPECIFIED. Possible values: ["MESH", "STAR", "HYBRID_INSPECTION"]`,
104104
},
105105
"create_time": {
106106
Type: schema.TypeString,

0 commit comments

Comments
 (0)