Skip to content

Commit 369da62

Browse files
committed
OCPBUGS-31209: CAPG - Fix setting ServiceAccount role bindings for GCP
When using the CAPG provider, the ServiceAccounts created for master and worker nodes did not have the role bindings set because the policy was not updated.
1 parent fb92a96 commit 369da62

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)