github.com/sleungcy/cli@v7.1.0+incompatible/command/v7/set_org_role_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     5  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
     6  	"code.cloudfoundry.org/cli/cf/errors"
     7  	"code.cloudfoundry.org/cli/command/flag"
     8  	"code.cloudfoundry.org/cli/command/translatableerror"
     9  )
    10  
    11  type SetOrgRoleCommand struct {
    12  	BaseCommand
    13  
    14  	Args            flag.OrgRoleArgs `positional-args:"yes"`
    15  	IsClient        bool             `long:"client" description:"Assign an org role to a client-id of a (non-user) service account"`
    16  	Origin          string           `long:"origin" description:"Indicates the identity provider to be used for authentication"`
    17  	usage           interface{}      `usage:"CF_NAME set-org-role USERNAME ORG ROLE\n   CF_NAME set-org-role USERNAME ORG ROLE [--client]\n   CF_NAME set-org-role USERNAME ORG ROLE [--origin ORIGIN]\n\nROLES:\n   OrgManager - Invite and manage users, select and change plans, and set spending limits\n   BillingManager - Create and manage the billing account and payment info\n   OrgAuditor - Read-only access to org info and reports"`
    18  	relatedCommands interface{}      `related_commands:"org-users, set-space-role"`
    19  }
    20  
    21  func (cmd *SetOrgRoleCommand) Execute(args []string) error {
    22  	err := cmd.validateFlags()
    23  	if err != nil {
    24  		return err
    25  	}
    26  
    27  	err = cmd.SharedActor.CheckTarget(false, false)
    28  	if err != nil {
    29  		return err
    30  	}
    31  
    32  	currentUser, err := cmd.Config.CurrentUser()
    33  	if err != nil {
    34  		return err
    35  	}
    36  
    37  	cmd.UI.DisplayTextWithFlavor("Assigning role {{.RoleType}} to user {{.TargetUserName}} in org {{.OrgName}} as {{.CurrentUserName}}...", map[string]interface{}{
    38  		"RoleType":        cmd.Args.Role.Role,
    39  		"TargetUserName":  cmd.Args.Username,
    40  		"OrgName":         cmd.Args.Organization,
    41  		"CurrentUserName": currentUser.Name,
    42  	})
    43  
    44  	roleType, err := convertRoleType(cmd.Args.Role)
    45  	if err != nil {
    46  		return err
    47  	}
    48  
    49  	org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Args.Organization)
    50  	cmd.UI.DisplayWarnings(warnings)
    51  	if err != nil {
    52  		return err
    53  	}
    54  
    55  	warnings, err = cmd.Actor.CreateOrgRole(roleType, org.GUID, cmd.Args.Username, cmd.Origin, cmd.IsClient)
    56  	cmd.UI.DisplayWarnings(warnings)
    57  	if err != nil {
    58  		if _, ok := err.(ccerror.RoleAlreadyExistsError); ok {
    59  			cmd.UI.DisplayWarning("User '{{.TargetUserName}}' already has role '{{.RoleType}}' in org '{{.OrgName}}'.", map[string]interface{}{
    60  				"RoleType":       cmd.Args.Role.Role,
    61  				"TargetUserName": cmd.Args.Username,
    62  				"OrgName":        cmd.Args.Organization,
    63  			})
    64  		} else {
    65  			return err
    66  		}
    67  	}
    68  
    69  	cmd.UI.DisplayOK()
    70  
    71  	return nil
    72  }
    73  
    74  func (cmd SetOrgRoleCommand) validateFlags() error {
    75  	if cmd.IsClient && cmd.Origin != "" {
    76  		return translatableerror.ArgumentCombinationError{
    77  			Args: []string{"--client", "--origin"},
    78  		}
    79  	}
    80  
    81  	return nil
    82  }
    83  
    84  func convertRoleType(givenRole flag.OrgRole) (constant.RoleType, error) {
    85  	switch givenRole.Role {
    86  	case "OrgAuditor":
    87  		return constant.OrgAuditorRole, nil
    88  	case "OrgManager":
    89  		return constant.OrgManagerRole, nil
    90  	case "BillingManager":
    91  		return constant.OrgBillingManagerRole, nil
    92  	default:
    93  		return "", errors.New("Invalid role type.")
    94  	}
    95  }