@@ -25,6 +25,7 @@ import (
25
25
"k8s.io/kops/upup/pkg/fi"
26
26
"k8s.io/kops/upup/pkg/fi/cloudup/gce"
27
27
"k8s.io/kops/upup/pkg/fi/cloudup/terraform"
28
+ "k8s.io/kops/upup/pkg/fi/cloudup/terraformWriter"
28
29
)
29
30
30
31
// StorageBucketIAM represents an IAM rule on a google cloud storage bucket
@@ -33,9 +34,9 @@ type StorageBucketIAM struct {
33
34
Name * string
34
35
Lifecycle fi.Lifecycle
35
36
36
- Bucket * string
37
- Member * string
38
- Role * string
37
+ Bucket * string
38
+ MemberServiceAccount * ServiceAccount
39
+ Role * string
39
40
}
40
41
41
42
var _ fi.CompareWithID = & StorageBucketIAM {}
@@ -50,7 +51,7 @@ func (e *StorageBucketIAM) Find(c *fi.CloudupContext) (*StorageBucketIAM, error)
50
51
cloud := c .T .Cloud .(gce.GCECloud )
51
52
52
53
bucket := fi .ValueOf (e .Bucket )
53
- member := fi .ValueOf (e .Member )
54
+ member := "serviceAccount:" + fi .ValueOf (e .MemberServiceAccount . Email )
54
55
role := fi .ValueOf (e .Role )
55
56
56
57
klog .V (2 ).Infof ("Checking GCS bucket IAM for gs://%s for %s" , bucket , member )
@@ -69,7 +70,7 @@ func (e *StorageBucketIAM) Find(c *fi.CloudupContext) (*StorageBucketIAM, error)
69
70
70
71
actual := & StorageBucketIAM {}
71
72
actual .Bucket = e .Bucket
72
- actual .Member = e .Member
73
+ actual .MemberServiceAccount = e .MemberServiceAccount
73
74
actual .Role = e .Role
74
75
75
76
// Ignore "system" fields
@@ -87,7 +88,10 @@ func (_ *StorageBucketIAM) CheckChanges(a, e, changes *StorageBucketIAM) error {
87
88
if fi .ValueOf (e .Bucket ) == "" {
88
89
return fi .RequiredField ("Bucket" )
89
90
}
90
- if fi .ValueOf (e .Member ) == "" {
91
+ if e .MemberServiceAccount == nil {
92
+ return fi .RequiredField ("MemberServiceAccount" )
93
+ }
94
+ if fi .ValueOf (e .MemberServiceAccount .Email ) == "" {
91
95
return fi .RequiredField ("Member" )
92
96
}
93
97
if fi .ValueOf (e .Role ) == "" {
@@ -100,7 +104,7 @@ func (_ *StorageBucketIAM) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Storage
100
104
ctx := context .TODO ()
101
105
102
106
bucket := fi .ValueOf (e .Bucket )
103
- member := fi .ValueOf (e .Member )
107
+ member := "serviceAccount:" + fi .ValueOf (e .MemberServiceAccount . Email )
104
108
role := fi .ValueOf (e .Role )
105
109
106
110
klog .V (2 ).Infof ("Creating GCS bucket IAM for gs://%s for %s as %s" , bucket , member , role )
@@ -126,19 +130,23 @@ func (_ *StorageBucketIAM) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Storage
126
130
127
131
// terraformStorageBucketIAM is the model for a terraform google_storage_bucket_iam_member rule
128
132
type terraformStorageBucketIAM struct {
129
- Bucket string `cty:"bucket"`
130
- Role string `cty:"role"`
131
- Member string `cty:"member"`
133
+ Bucket string `cty:"bucket"`
134
+ Role string `cty:"role"`
135
+ Member * terraformWriter. Literal `cty:"member"`
132
136
}
133
137
134
138
func (_ * StorageBucketIAM ) RenderTerraform (t * terraform.TerraformTarget , a , e , changes * StorageBucketIAM ) error {
135
139
tf := & terraformStorageBucketIAM {
136
140
Bucket : fi .ValueOf (e .Bucket ),
137
141
Role : fi .ValueOf (e .Role ),
138
- Member : fi .ValueOf (e .Member ),
142
+ Member : e .MemberServiceAccount .TerraformLink_Member (),
143
+ }
144
+
145
+ if err := t .RenderResource ("google_storage_bucket_iam_member" , * e .Name , tf ); err != nil {
146
+ return err
139
147
}
140
148
141
- return t . RenderResource ( "google_storage_bucket_iam_member" , * e . Name , tf )
149
+ return nil
142
150
}
143
151
144
152
func patchPolicy (policy * storage.Policy , wantMember string , wantRole string ) bool {
0 commit comments