in internal/apiclient/iam.go [120:174]
func setIAMPermission(endpoint string, name string, memberName string, role string, memberType string) (err error) {
u, _ := url.Parse(endpoint)
u.Path = path.Join(u.Path, name+":getIamPolicy")
ClientPrintHttpResponse.Set(false)
getIamPolicyBody, err := HttpClient(u.String())
ClientPrintHttpResponse.Set(GetCmdPrintHttpResponseSetting())
if err != nil {
clilog.Error.Println(err)
return err
}
getIamPolicy := iamPolicy{}
err = json.Unmarshal(getIamPolicyBody, &getIamPolicy)
if err != nil {
clilog.Error.Println(err)
return err
}
foundRole := false
for i, binding := range getIamPolicy.Bindings {
if binding.Role == role {
// found members with the role already, add the new SA to the role
getIamPolicy.Bindings[i].Members = append(binding.Members, memberType+":"+memberName)
foundRole = true
}
}
// no members with the role, add a new one
if !foundRole {
binding := roleBinding{}
binding.Role = role
binding.Members = append(binding.Members, memberType+":"+memberName)
getIamPolicy.Bindings = append(getIamPolicy.Bindings, binding)
}
u, _ = url.Parse(endpoint)
u.Path = path.Join(u.Path, name+":setIamPolicy")
setIamPolicy := setIamPolicy{}
setIamPolicy.Policy = getIamPolicy
setIamPolicyBody, err := json.Marshal(setIamPolicy)
if err != nil {
clilog.Error.Println(err)
return err
}
ClientPrintHttpResponse.Set(false)
_, err = HttpClient(u.String(), string(setIamPolicyBody))
ClientPrintHttpResponse.Set(GetCmdPrintHttpResponseSetting())
return err
}