@@ -5,41 +5,85 @@ import (
5
5
"regexp"
6
6
)
7
7
8
- const networkLinkTemplate = "projects/%s/global/networks/%s"
8
+ const (
9
+ globalLinkTemplate = "projects/%s/global/%s/%s"
10
+ globalLinkBasePattern = "projects/(.+)/global/%s/(.+)"
11
+ )
12
+
13
+ // ------------------------------------------------------------
14
+ // Field helpers
15
+ // ------------------------------------------------------------
16
+
17
+ func ParseNetworkFieldValue (network string , d TerraformResourceData , config * Config ) (* GlobalFieldValue , error ) {
18
+ return parseGlobalFieldValue ("networks" , network , "project" , d , config , true )
19
+ }
9
20
10
- var networkLinkRegex = regexp .MustCompile ("projects/(.+)/global/networks/(.+)" )
21
+ // ------------------------------------------------------------
22
+ // Base helpers used to create helpers for specific fields.
23
+ // ------------------------------------------------------------
11
24
12
- type NetworkFieldValue struct {
25
+ type GlobalFieldValue struct {
13
26
Project string
14
27
Name string
28
+
29
+ resourceType string
30
+ }
31
+
32
+ func (f GlobalFieldValue ) RelativeLink () string {
33
+ if len (f .Name ) == 0 {
34
+ return ""
35
+ }
36
+
37
+ return fmt .Sprintf (globalLinkTemplate , f .Project , f .resourceType , f .Name )
15
38
}
16
39
17
- // Parses a `network` supporting 5 different formats:
18
- // - https://www.googleapis.com/compute/{version}/projects/myproject/global/networks/my-network
19
- // - projects/myproject/global/networks/my-network
20
- // - global/networks/my-network (default project is used)
21
- // - my-network (default project is used)
22
- // - "" (empty string). RelativeLink() returns empty. For most API, the behavior is to use the default network.
23
- func ParseNetworkFieldValue (network string , config * Config ) * NetworkFieldValue {
24
- if networkLinkRegex .MatchString (network ) {
25
- parts := networkLinkRegex .FindStringSubmatch (network )
26
-
27
- return & NetworkFieldValue {
40
+ // Parses a global field supporting 4 different formats:
41
+ // - https://www.googleapis.com/compute/ANY_VERSION/projects/{my-project}/global/{resource_type}/{resource_name}
42
+ // - projects/{my-project}/global/{resource_type}/{resource_name}
43
+ // - global/{resource_type}/{resource_name} (default project is used)
44
+ // - resource_name (default project is used)
45
+ // - "" (empty string). RelativeLink() returns empty if isEmptyValid is true.
46
+ func parseGlobalFieldValue (resourceType , fieldValue , projectSchemaField string , d TerraformResourceData , config * Config , isEmptyValid bool ) (* GlobalFieldValue , error ) {
47
+ if len (fieldValue ) == 0 {
48
+ if isEmptyValid {
49
+ return & GlobalFieldValue {resourceType : resourceType }, nil
50
+ }
51
+ return nil , fmt .Errorf ("The global field for resource %s cannot be empty" , resourceType )
52
+ }
53
+
54
+ r := regexp .MustCompile (fmt .Sprintf (globalLinkBasePattern , resourceType ))
55
+
56
+ if r .MatchString (fieldValue ) {
57
+ parts := r .FindStringSubmatch (fieldValue )
58
+
59
+ return & GlobalFieldValue {
28
60
Project : parts [1 ],
29
61
Name : parts [2 ],
30
- }
62
+
63
+ resourceType : resourceType ,
64
+ }, nil
31
65
}
32
66
33
- return & NetworkFieldValue {
34
- Project : config . Project ,
35
- Name : GetResourceNameFromSelfLink ( network ),
67
+ project , err := getProjectFromSchema ( projectSchemaField , d , config )
68
+ if err != nil {
69
+ return nil , err
36
70
}
71
+
72
+ return & GlobalFieldValue {
73
+ Project : project ,
74
+ Name : GetResourceNameFromSelfLink (fieldValue ),
75
+
76
+ resourceType : resourceType ,
77
+ }, nil
37
78
}
38
79
39
- func (f NetworkFieldValue ) RelativeLink () string {
40
- if len (f .Name ) == 0 {
41
- return ""
80
+ func getProjectFromSchema (projectSchemaField string , d TerraformResourceData , config * Config ) (string , error ) {
81
+ res , ok := d .GetOk (projectSchemaField )
82
+ if ! ok || len (projectSchemaField ) == 0 {
83
+ if config .Project != "" {
84
+ return config .Project , nil
85
+ }
86
+ return "" , fmt .Errorf ("project: required field is not set" )
42
87
}
43
-
44
- return fmt .Sprintf (networkLinkTemplate , f .Project , f .Name )
88
+ return res .(string ), nil
45
89
}
0 commit comments