* Adding grants related methods to Roles. * Adding grants back after the merge of Principals. * Adding tests for Grant related custom methods. * Improving api handler methods. * Fixing tests and sdk field. * Adding todos for adding principals and grants to List and Update Role responses. * Fix up Set* tests and fix SetPrincipals bug. * Making AddPrincipals and RemovePrincipals similar to the tests for AddGrants and RemoveGrants. * Add JSON grants to output (#187) I also changed canonical_grants to grants_canonical and used grants_json. I believe that when members are simply different formats of other members this is the preferred way to have it in the API. Let me know if you disagree and we can dig in more. * Regenerate the API role resource. Co-authored-by: Jeff Mitchell <jeffrey.mitchell@gmail.com>
204 lines
5.6 KiB
Go
204 lines
5.6 KiB
Go
package roles
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/watchtower/api"
|
|
)
|
|
|
|
func (s Role) AddPrincipals(ctx context.Context, groups, users []string) (*Role, *api.Error, error) {
|
|
if s.Client == nil {
|
|
return nil, nil, fmt.Errorf("nil client in AddPrincipals request")
|
|
}
|
|
// We assume that the client provided has the org and optionally the project id of the request.
|
|
|
|
body := map[string]interface{}{
|
|
"group_ids": groups,
|
|
"user_ids": users,
|
|
"version": s.Version,
|
|
}
|
|
|
|
req, err := s.Client.NewRequest(ctx, "POST", fmt.Sprintf("roles/%s:add-principals", s.Id), body)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error creating AddPrincipals request: %w", err)
|
|
}
|
|
|
|
resp, err := s.Client.Do(req)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error performing client request during AddPrincipals call: %w", err)
|
|
}
|
|
|
|
target := new(Role)
|
|
apiErr, err := resp.Decode(target)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error decoding AddPrincipals repsonse: %w", err)
|
|
}
|
|
|
|
target.Client = s.Client
|
|
|
|
return target, apiErr, nil
|
|
}
|
|
|
|
func (s Role) SetPrincipals(ctx context.Context, groups, users []string) (*Role, *api.Error, error) {
|
|
if s.Client == nil {
|
|
return nil, nil, fmt.Errorf("nil client in SetPrincipals request")
|
|
}
|
|
// We assume that the client provided has the org and optionally the project id of the request.
|
|
|
|
body := map[string]interface{}{
|
|
"group_ids": groups,
|
|
"user_ids": users,
|
|
"version": s.Version,
|
|
}
|
|
|
|
req, err := s.Client.NewRequest(ctx, "POST", fmt.Sprintf("roles/%s:set-principals", s.Id), body)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error creating SetPrincipals request: %w", err)
|
|
}
|
|
|
|
resp, err := s.Client.Do(req)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error performing client request during SetPrincipals call: %w", err)
|
|
}
|
|
|
|
target := new(Role)
|
|
apiErr, err := resp.Decode(target)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error decoding SetPrincipals repsonse: %w", err)
|
|
}
|
|
|
|
target.Client = s.Client
|
|
|
|
return target, apiErr, nil
|
|
}
|
|
|
|
func (s Role) RemovePrincipals(ctx context.Context, groups, users []string) (*Role, *api.Error, error) {
|
|
if s.Client == nil {
|
|
return nil, nil, fmt.Errorf("nil client in RemovePrincipals request")
|
|
}
|
|
// We assume that the client provided has the org and optionally the project id of the request.
|
|
|
|
body := map[string]interface{}{
|
|
"group_ids": groups,
|
|
"user_ids": users,
|
|
"version": s.Version,
|
|
}
|
|
|
|
req, err := s.Client.NewRequest(ctx, "POST", fmt.Sprintf("roles/%s:remove-principals", s.Id), body)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error creating RemovePrincipals request: %w", err)
|
|
}
|
|
|
|
resp, err := s.Client.Do(req)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error performing client request during RemovePrincipals call: %w", err)
|
|
}
|
|
|
|
target := new(Role)
|
|
apiErr, err := resp.Decode(target)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error decoding RemovePrincipals repsonse: %w", err)
|
|
}
|
|
|
|
target.Client = s.Client
|
|
|
|
return target, apiErr, nil
|
|
}
|
|
|
|
func (s Role) AddGrants(ctx context.Context, grants []string) (*Role, *api.Error, error) {
|
|
if s.Client == nil {
|
|
return nil, nil, fmt.Errorf("nil client in AddGrants request")
|
|
}
|
|
// We assume that the client provided has the org and optionally the project id of the request.
|
|
|
|
body := map[string]interface{}{
|
|
"grants": grants,
|
|
"version": s.Version,
|
|
}
|
|
|
|
req, err := s.Client.NewRequest(ctx, "POST", fmt.Sprintf("roles/%s:add-grants", s.Id), body)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error creating AddGrants request: %w", err)
|
|
}
|
|
|
|
resp, err := s.Client.Do(req)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error performing client request during AddGrants call: %w", err)
|
|
}
|
|
|
|
target := new(Role)
|
|
apiErr, err := resp.Decode(target)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error decoding AddGrants repsonse: %w", err)
|
|
}
|
|
|
|
target.Client = s.Client
|
|
|
|
return target, apiErr, nil
|
|
}
|
|
|
|
func (s Role) SetGrants(ctx context.Context, grants []string) (*Role, *api.Error, error) {
|
|
if s.Client == nil {
|
|
return nil, nil, fmt.Errorf("nil client in SetGrants request")
|
|
}
|
|
// We assume that the client provided has the org and optionally the project id of the request.
|
|
|
|
body := map[string]interface{}{
|
|
"grants": grants,
|
|
"version": s.Version,
|
|
}
|
|
|
|
req, err := s.Client.NewRequest(ctx, "POST", fmt.Sprintf("roles/%s:set-grants", s.Id), body)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error creating SetGrants request: %w", err)
|
|
}
|
|
|
|
resp, err := s.Client.Do(req)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error performing client request during SetGrants call: %w", err)
|
|
}
|
|
|
|
target := new(Role)
|
|
apiErr, err := resp.Decode(target)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error decoding SetGrants repsonse: %w", err)
|
|
}
|
|
|
|
target.Client = s.Client
|
|
|
|
return target, apiErr, nil
|
|
}
|
|
|
|
func (s Role) RemoveGrants(ctx context.Context, grants []string) (*Role, *api.Error, error) {
|
|
if s.Client == nil {
|
|
return nil, nil, fmt.Errorf("nil client in RemoveGrants request")
|
|
}
|
|
// We assume that the client provided has the org and optionally the project id of the request.
|
|
|
|
body := map[string]interface{}{
|
|
"grants": grants,
|
|
"version": s.Version,
|
|
}
|
|
|
|
req, err := s.Client.NewRequest(ctx, "POST", fmt.Sprintf("roles/%s:remove-grants", s.Id), body)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error creating RemoveGrants request: %w", err)
|
|
}
|
|
|
|
resp, err := s.Client.Do(req)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error performing client request during RemoveGrants call: %w", err)
|
|
}
|
|
|
|
target := new(Role)
|
|
apiErr, err := resp.Decode(target)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("error decoding RemoveGrants repsonse: %w", err)
|
|
}
|
|
|
|
target.Client = s.Client
|
|
|
|
return target, apiErr, nil
|
|
}
|