Skip to content

Commit 7f52edf

Browse files
Merge pull request openshift#8192 from bfournie/iam-set-policy
OCPBUGS-31209: CAPG - Fix setting ServiceAccount role bindings for GCP
2 parents b9defe6 + 369da62 commit 7f52edf

File tree

1 file changed

+39
-18
lines changed
  • pkg/infrastructure/gcp/clusterapi

1 file changed

+39
-18
lines changed

pkg/infrastructure/gcp/clusterapi/iam.go

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func CreateServiceAccount(ctx context.Context, infraID, projectID, role string)
7979
_, err := service.Projects.ServiceAccounts.Get(sa.Name).Do()
8080
if err == nil {
8181
logrus.Debugf("Service account created for %s", accountID)
82-
return accountID, nil
82+
return sa.Email, nil
8383
}
8484
time.Sleep(retryTime)
8585
}
@@ -89,40 +89,61 @@ func CreateServiceAccount(ctx context.Context, infraID, projectID, role string)
8989

9090
// AddServiceAccountRoles adds predefined roles for service account.
9191
func AddServiceAccountRoles(ctx context.Context, projectID, serviceAccountID string, roles []string) error {
92-
policy, err := getProjectIAMPolicy(ctx, projectID)
92+
// Get cloudresourcemanager service
93+
ctx, cancel := context.WithTimeout(ctx, time.Minute*1)
94+
defer cancel()
95+
96+
ssn, err := gcp.GetSession(ctx)
97+
if err != nil {
98+
return fmt.Errorf("failed to get session: %w", err)
99+
}
100+
service, err := resourcemanager.NewService(ctx, option.WithCredentials(ssn.Credentials))
101+
if err != nil {
102+
return fmt.Errorf("failed to create resourcemanager service: %w", err)
103+
}
104+
105+
policy, err := getPolicy(ctx, service, projectID)
93106
if err != nil {
94107
return err
95108
}
96109

110+
member := fmt.Sprintf("serviceAccount:%s", serviceAccountID)
97111
for _, role := range roles {
98-
err = addMemberToRole(policy, role, serviceAccountID)
112+
err = addMemberToRole(policy, role, member)
99113
if err != nil {
100-
return fmt.Errorf("failed to add role %s to %s: %w", role, serviceAccountID, err)
114+
return fmt.Errorf("failed to add role %s to %s: %w", role, member, err)
101115
}
102116
}
103117

118+
err = setPolicy(ctx, service, projectID, policy)
119+
if err != nil {
120+
return err
121+
}
122+
104123
return nil
105124
}
106125

107-
func getProjectIAMPolicy(ctx context.Context, projectID string) (*resourcemanager.Policy, error) {
108-
ctx, cancel := context.WithTimeout(ctx, time.Minute*1)
109-
defer cancel()
110-
req := &resourcemanager.GetIamPolicyRequest{}
111-
112-
ssn, err := gcp.GetSession(ctx)
126+
// getPolicy gets the project's IAM policy.
127+
func getPolicy(ctx context.Context, crmService *resourcemanager.Service, projectID string) (*resourcemanager.Policy, error) {
128+
request := &resourcemanager.GetIamPolicyRequest{}
129+
policy, err := crmService.Projects.GetIamPolicy(projectID, request).Context(ctx).Do()
113130
if err != nil {
114-
return nil, fmt.Errorf("failed to get session: %w", err)
115-
}
116-
service, err := resourcemanager.NewService(ctx, option.WithCredentials(ssn.Credentials))
117-
if err != nil {
118-
return nil, fmt.Errorf("failed to create resourcemanager service: %w", err)
131+
return nil, fmt.Errorf("failed to fetch project IAM policy: %w", err)
119132
}
120133

121-
policy, err := service.Projects.GetIamPolicy(projectID, req).Context(ctx).Do()
134+
return policy, nil
135+
}
136+
137+
// setPolicy sets the project's IAM policy.
138+
func setPolicy(ctx context.Context, crmService *resourcemanager.Service, projectID string, policy *resourcemanager.Policy) error {
139+
request := &resourcemanager.SetIamPolicyRequest{}
140+
request.Policy = policy
141+
_, err := crmService.Projects.SetIamPolicy(projectID, request).Context(ctx).Do()
122142
if err != nil {
123-
return nil, fmt.Errorf("failed to fetch project IAM policy: %w", err)
143+
return fmt.Errorf("failed to set project IAM policy: %w", err)
124144
}
125-
return policy, nil
145+
146+
return nil
126147
}
127148

128149
// addMemberToRole adds a member to a role binding.

0 commit comments

Comments
 (0)