@@ -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.
9191func 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