Skip to content

Commit 60c71cb

Browse files
add numeric_id field into google_compute_network resource (#9473) (#16712)
* add numberic_id field * add flattener, encoders, and id field for numeric_id use * WIP: add numberId test * add value checks for id and numeric_id * add strconv * use decoder to store id into numericId after API request * remove network check and add suffix variable * add endlines * typo * Updated test to explicitly check numeric_id and id with ResourceAttr * update regex to be more strict on numeric_id check [upstream:d6ce7020cd1e2a490a93c91ccc643531dba8bae7] Signed-off-by: Modular Magician <[email protected]>
1 parent c83ce0b commit 60c71cb

File tree

4 files changed

+85
-0
lines changed

4 files changed

+85
-0
lines changed

.changelog/9473.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: added `numeric_id` field to `google_compute_network` resource
3+
```

google/services/compute/resource_compute_network.go

+49
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ subnetworks of this network, across regions. Possible values: ["REGIONAL", "GLOB
141141
Description: `The gateway address for default routing out of the network. This value
142142
is selected by GCP.`,
143143
},
144+
"numeric_id": {
145+
Type: schema.TypeString,
146+
Computed: true,
147+
Description: `The unique identifier for the resource. This identifier is defined by the server.`,
148+
},
144149
"delete_default_routes_on_create": {
145150
Type: schema.TypeBool,
146151
Optional: true,
@@ -220,6 +225,11 @@ func resourceComputeNetworkCreate(d *schema.ResourceData, meta interface{}) erro
220225
obj["networkFirewallPolicyEnforcementOrder"] = networkFirewallPolicyEnforcementOrderProp
221226
}
222227

228+
obj, err = resourceComputeNetworkEncoder(d, meta, obj)
229+
if err != nil {
230+
return err
231+
}
232+
223233
url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/global/networks")
224234
if err != nil {
225235
return err
@@ -342,6 +352,18 @@ func resourceComputeNetworkRead(d *schema.ResourceData, meta interface{}) error
342352
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("ComputeNetwork %q", d.Id()))
343353
}
344354

355+
res, err = resourceComputeNetworkDecoder(d, meta, res)
356+
if err != nil {
357+
return err
358+
}
359+
360+
if res == nil {
361+
// Decoding the object has resulted in it being gone. It may be marked deleted
362+
log.Printf("[DEBUG] Removing ComputeNetwork because it no longer exists.")
363+
d.SetId("")
364+
return nil
365+
}
366+
345367
// Explicitly set virtual fields to default values if unset
346368
if _, ok := d.GetOkExists("delete_default_routes_on_create"); !ok {
347369
if err := d.Set("delete_default_routes_on_create", false); err != nil {
@@ -361,6 +383,9 @@ func resourceComputeNetworkRead(d *schema.ResourceData, meta interface{}) error
361383
if err := d.Set("name", flattenComputeNetworkName(res["name"], d, config)); err != nil {
362384
return fmt.Errorf("Error reading Network: %s", err)
363385
}
386+
if err := d.Set("numeric_id", flattenComputeNetworkNumericId(res["numericId"], d, config)); err != nil {
387+
return fmt.Errorf("Error reading Network: %s", err)
388+
}
364389
if err := d.Set("auto_create_subnetworks", flattenComputeNetworkAutoCreateSubnetworks(res["autoCreateSubnetworks"], d, config)); err != nil {
365390
return fmt.Errorf("Error reading Network: %s", err)
366391
}
@@ -431,6 +456,11 @@ func resourceComputeNetworkUpdate(d *schema.ResourceData, meta interface{}) erro
431456
obj["networkFirewallPolicyEnforcementOrder"] = networkFirewallPolicyEnforcementOrderProp
432457
}
433458

459+
obj, err = resourceComputeNetworkUpdateEncoder(d, meta, obj)
460+
if err != nil {
461+
return err
462+
}
463+
434464
url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/global/networks/{{name}}")
435465
if err != nil {
436466
return err
@@ -559,6 +589,10 @@ func flattenComputeNetworkName(v interface{}, d *schema.ResourceData, config *tr
559589
return v
560590
}
561591

592+
func flattenComputeNetworkNumericId(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
593+
return v
594+
}
595+
562596
func flattenComputeNetworkAutoCreateSubnetworks(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
563597
return v
564598
}
@@ -652,3 +686,18 @@ func expandComputeNetworkInternalIpv6Range(v interface{}, d tpgresource.Terrafor
652686
func expandComputeNetworkNetworkFirewallPolicyEnforcementOrder(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
653687
return v, nil
654688
}
689+
690+
func resourceComputeNetworkEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) {
691+
delete(obj, "numeric_id") // Field doesn't exist in the API
692+
return obj, nil
693+
}
694+
695+
func resourceComputeNetworkUpdateEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) {
696+
delete(obj, "numeric_id") // Field doesn't exist in the API
697+
return obj, nil
698+
}
699+
700+
func resourceComputeNetworkDecoder(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) {
701+
res["numericId"] = res["id"] // stores unique id into numericId attribute before it's changed to path format
702+
return res, nil
703+
}

google/services/compute/resource_compute_network_test.go

+30
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ package compute_test
55
import (
66
"fmt"
77
"github.com/hashicorp/terraform-provider-google/google/acctest"
8+
"github.com/hashicorp/terraform-provider-google/google/envvar"
9+
"regexp"
810
"testing"
911

1012
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -103,6 +105,34 @@ func TestAccComputeNetwork_routingModeAndUpdate(t *testing.T) {
103105
})
104106
}
105107

108+
func TestAccComputeNetwork_numericId(t *testing.T) {
109+
t.Parallel()
110+
suffixName := acctest.RandString(t, 10)
111+
networkName := fmt.Sprintf("tf-test-network-basic-%s", suffixName)
112+
projectId := envvar.GetTestProjectFromEnv()
113+
networkId := fmt.Sprintf("projects/%v/global/networks/%v", projectId, networkName)
114+
115+
acctest.VcrTest(t, resource.TestCase{
116+
PreCheck: func() { acctest.AccTestPreCheck(t) },
117+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
118+
CheckDestroy: testAccCheckComputeNetworkDestroyProducer(t),
119+
Steps: []resource.TestStep{
120+
{
121+
Config: testAccComputeNetwork_basic(suffixName),
122+
Check: resource.ComposeTestCheckFunc(
123+
resource.TestMatchResourceAttr("google_compute_network.bar", "numeric_id", regexp.MustCompile("^\\d{1,}$")),
124+
resource.TestCheckResourceAttr("google_compute_network.bar", "id", networkId),
125+
),
126+
},
127+
{
128+
ResourceName: "google_compute_network.bar",
129+
ImportState: true,
130+
ImportStateVerify: true,
131+
},
132+
},
133+
})
134+
}
135+
106136
func TestAccComputeNetwork_default_routing_mode(t *testing.T) {
107137
t.Parallel()
108138

website/docs/r/compute_network.html.markdown

+3
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ In addition to the arguments listed above, the following computed attributes are
148148
* `gateway_ipv4` -
149149
The gateway address for default routing out of the network. This value
150150
is selected by GCP.
151+
152+
* `numeric_id` -
153+
The unique identifier for the resource. This identifier is defined by the server.
151154
* `self_link` - The URI of the created resource.
152155

153156

0 commit comments

Comments
 (0)