func setIAMPermission()

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
}