Skip to content

Commit 0232bcb

Browse files
Machine image updates (#3873) (#2637)
Co-authored-by: Cameron Thornton <[email protected]> Signed-off-by: Modular Magician <[email protected]> Co-authored-by: Cameron Thornton <[email protected]>
1 parent f1c2828 commit 0232bcb

12 files changed

+1812
-68
lines changed

.changelog/3873.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
```release-note:enhancement
2+
compute: added storage_locations & cmek fields to `google_compute_machine_image` resource
3+
```
4+
```release-note:note
5+
compute: updated `google_compute_machine_image` resource to complete once the Image is ready.
6+
```
7+
```release-note:new-resource
8+
`google_compute_instance_from_machine_image`
9+
```
10+
```release-note:new-resource
11+
`google_compute_machine_image_iam_member`
12+
```
13+
```release-note:new-resource
14+
`google_compute_machine_image_iam_binding`
15+
```
16+
```release-note:new-resource
17+
`google_compute_machine_image_iam_policy`
18+
```

google-beta/field_helpers.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ func ParseInstanceTemplateFieldValue(instanceTemplate string, d TerraformResourc
7676
return parseGlobalFieldValue("instanceTemplates", instanceTemplate, "project", d, config, false)
7777
}
7878

79+
func ParseMachineImageFieldValue(machineImage string, d TerraformResourceData, config *Config) (*GlobalFieldValue, error) {
80+
return parseGlobalFieldValue("machineImages", machineImage, "project", d, config, false)
81+
}
82+
7983
func ParseSecurityPolicyFieldValue(securityPolicy string, d TerraformResourceData, config *Config) (*GlobalFieldValue, error) {
8084
return parseGlobalFieldValue("securityPolicies", securityPolicy, "project", d, config, true)
8185
}
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
// ----------------------------------------------------------------------------
2+
//
3+
// *** AUTO GENERATED CODE *** AUTO GENERATED CODE ***
4+
//
5+
// ----------------------------------------------------------------------------
6+
//
7+
// This file is automatically generated by Magic Modules and manual
8+
// changes will be clobbered when the file is regenerated.
9+
//
10+
// Please read more about how to change this file in
11+
// .github/CONTRIBUTING.md.
12+
//
13+
// ----------------------------------------------------------------------------
14+
package google
15+
16+
import (
17+
"fmt"
18+
19+
"github.com/hashicorp/errwrap"
20+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
21+
"google.golang.org/api/cloudresourcemanager/v1"
22+
)
23+
24+
var ComputeMachineImageIamSchema = map[string]*schema.Schema{
25+
"project": {
26+
Type: schema.TypeString,
27+
Computed: true,
28+
Optional: true,
29+
ForceNew: true,
30+
},
31+
"machine_image": {
32+
Type: schema.TypeString,
33+
Required: true,
34+
ForceNew: true,
35+
DiffSuppressFunc: compareSelfLinkOrResourceName,
36+
},
37+
}
38+
39+
type ComputeMachineImageIamUpdater struct {
40+
project string
41+
machineImage string
42+
d *schema.ResourceData
43+
Config *Config
44+
}
45+
46+
func ComputeMachineImageIamUpdaterProducer(d *schema.ResourceData, config *Config) (ResourceIamUpdater, error) {
47+
values := make(map[string]string)
48+
49+
project, _ := getProject(d, config)
50+
if project != "" {
51+
if err := d.Set("project", project); err != nil {
52+
return nil, fmt.Errorf("Error setting project: %s", err)
53+
}
54+
}
55+
values["project"] = project
56+
if v, ok := d.GetOk("machine_image"); ok {
57+
values["machine_image"] = v.(string)
58+
}
59+
60+
// We may have gotten either a long or short name, so attempt to parse long name if possible
61+
m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/global/machineImages/(?P<machine_image>[^/]+)", "(?P<project>[^/]+)/(?P<machine_image>[^/]+)", "(?P<machine_image>[^/]+)"}, d, config, d.Get("machine_image").(string))
62+
if err != nil {
63+
return nil, err
64+
}
65+
66+
for k, v := range m {
67+
values[k] = v
68+
}
69+
70+
u := &ComputeMachineImageIamUpdater{
71+
project: values["project"],
72+
machineImage: values["machine_image"],
73+
d: d,
74+
Config: config,
75+
}
76+
77+
if err := d.Set("project", u.project); err != nil {
78+
return nil, fmt.Errorf("Error setting project: %s", err)
79+
}
80+
if err := d.Set("machine_image", u.GetResourceId()); err != nil {
81+
return nil, fmt.Errorf("Error setting machine_image: %s", err)
82+
}
83+
84+
return u, nil
85+
}
86+
87+
func ComputeMachineImageIdParseFunc(d *schema.ResourceData, config *Config) error {
88+
values := make(map[string]string)
89+
90+
project, _ := getProject(d, config)
91+
if project != "" {
92+
values["project"] = project
93+
}
94+
95+
m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/global/machineImages/(?P<machine_image>[^/]+)", "(?P<project>[^/]+)/(?P<machine_image>[^/]+)", "(?P<machine_image>[^/]+)"}, d, config, d.Id())
96+
if err != nil {
97+
return err
98+
}
99+
100+
for k, v := range m {
101+
values[k] = v
102+
}
103+
104+
u := &ComputeMachineImageIamUpdater{
105+
project: values["project"],
106+
machineImage: values["machine_image"],
107+
d: d,
108+
Config: config,
109+
}
110+
if err := d.Set("machine_image", u.GetResourceId()); err != nil {
111+
return fmt.Errorf("Error setting machine_image: %s", err)
112+
}
113+
d.SetId(u.GetResourceId())
114+
return nil
115+
}
116+
117+
func (u *ComputeMachineImageIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
118+
url, err := u.qualifyMachineImageUrl("getIamPolicy")
119+
if err != nil {
120+
return nil, err
121+
}
122+
123+
project, err := getProject(u.d, u.Config)
124+
if err != nil {
125+
return nil, err
126+
}
127+
var obj map[string]interface{}
128+
url, err = addQueryParams(url, map[string]string{"optionsRequestedPolicyVersion": fmt.Sprintf("%d", iamPolicyVersion)})
129+
if err != nil {
130+
return nil, err
131+
}
132+
133+
userAgent, err := generateUserAgentString(u.d, u.Config.userAgent)
134+
if err != nil {
135+
return nil, err
136+
}
137+
138+
policy, err := sendRequest(u.Config, "GET", project, url, userAgent, obj)
139+
if err != nil {
140+
return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
141+
}
142+
143+
out := &cloudresourcemanager.Policy{}
144+
err = Convert(policy, out)
145+
if err != nil {
146+
return nil, errwrap.Wrapf("Cannot convert a policy to a resource manager policy: {{err}}", err)
147+
}
148+
149+
return out, nil
150+
}
151+
152+
func (u *ComputeMachineImageIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
153+
json, err := ConvertToMap(policy)
154+
if err != nil {
155+
return err
156+
}
157+
158+
obj := make(map[string]interface{})
159+
obj["policy"] = json
160+
161+
url, err := u.qualifyMachineImageUrl("setIamPolicy")
162+
if err != nil {
163+
return err
164+
}
165+
project, err := getProject(u.d, u.Config)
166+
if err != nil {
167+
return err
168+
}
169+
170+
userAgent, err := generateUserAgentString(u.d, u.Config.userAgent)
171+
if err != nil {
172+
return err
173+
}
174+
175+
_, err = sendRequestWithTimeout(u.Config, "POST", project, url, userAgent, obj, u.d.Timeout(schema.TimeoutCreate))
176+
if err != nil {
177+
return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
178+
}
179+
180+
return nil
181+
}
182+
183+
func (u *ComputeMachineImageIamUpdater) qualifyMachineImageUrl(methodIdentifier string) (string, error) {
184+
urlTemplate := fmt.Sprintf("{{ComputeBasePath}}%s/%s", fmt.Sprintf("projects/%s/global/machineImages/%s", u.project, u.machineImage), methodIdentifier)
185+
url, err := replaceVars(u.d, u.Config, urlTemplate)
186+
if err != nil {
187+
return "", err
188+
}
189+
return url, nil
190+
}
191+
192+
func (u *ComputeMachineImageIamUpdater) GetResourceId() string {
193+
return fmt.Sprintf("projects/%s/global/machineImages/%s", u.project, u.machineImage)
194+
}
195+
196+
func (u *ComputeMachineImageIamUpdater) GetMutexKey() string {
197+
return fmt.Sprintf("iam-compute-machineimage-%s", u.GetResourceId())
198+
}
199+
200+
func (u *ComputeMachineImageIamUpdater) DescribeResource() string {
201+
return fmt.Sprintf("compute machineimage %q", u.GetResourceId())
202+
}

0 commit comments

Comments
 (0)