github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v7/set_org_role_command.go (about) 1 package v7 2 3 import ( 4 "code.cloudfoundry.org/cli/actor/v7action" 5 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 6 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 7 "code.cloudfoundry.org/cli/cf/errors" 8 "code.cloudfoundry.org/cli/command/translatableerror" 9 "code.cloudfoundry.org/clock" 10 11 "code.cloudfoundry.org/cli/actor/sharedaction" 12 "code.cloudfoundry.org/cli/command" 13 "code.cloudfoundry.org/cli/command/flag" 14 "code.cloudfoundry.org/cli/command/v7/shared" 15 ) 16 17 //go:generate counterfeiter . SetOrgRoleActor 18 19 type SetOrgRoleActor interface { 20 CreateOrgRole(roleType constant.RoleType, orgGUID string, userNameOrGUID string, userOrigin string, isClient bool) (v7action.Warnings, error) 21 GetOrganizationByName(name string) (v7action.Organization, v7action.Warnings, error) 22 GetUser(username, origin string) (v7action.User, error) 23 } 24 25 type SetOrgRoleCommand struct { 26 Args flag.OrgRoleArgs `positional-args:"yes"` 27 IsClient bool `long:"client" description:"Assign an org role to a client-id of a (non-user) service account"` 28 Origin string `long:"origin" description:"Indicates the identity provider to be used for authentication"` 29 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"` 30 relatedCommands interface{} `related_commands:"org-users, set-space-role"` 31 32 UI command.UI 33 Config command.Config 34 SharedActor command.SharedActor 35 Actor SetOrgRoleActor 36 } 37 38 func (cmd *SetOrgRoleCommand) Setup(config command.Config, ui command.UI) error { 39 cmd.UI = ui 40 cmd.Config = config 41 sharedActor := sharedaction.NewActor(config) 42 cmd.SharedActor = sharedActor 43 44 ccClient, uaaClient, err := shared.GetNewClientsAndConnectToCF(config, ui, "") 45 if err != nil { 46 return err 47 } 48 cmd.Actor = v7action.NewActor(ccClient, config, sharedActor, uaaClient, clock.NewClock()) 49 return nil 50 } 51 52 func (cmd *SetOrgRoleCommand) Execute(args []string) error { 53 err := cmd.validateFlags() 54 if err != nil { 55 return err 56 } 57 58 err = cmd.SharedActor.CheckTarget(false, false) 59 if err != nil { 60 return err 61 } 62 63 currentUser, err := cmd.Config.CurrentUser() 64 if err != nil { 65 return err 66 } 67 68 cmd.UI.DisplayTextWithFlavor("Assigning role {{.RoleType}} to user {{.TargetUserName}} in org {{.OrgName}} as {{.CurrentUserName}}...", map[string]interface{}{ 69 "RoleType": cmd.Args.Role.Role, 70 "TargetUserName": cmd.Args.Username, 71 "OrgName": cmd.Args.Organization, 72 "CurrentUserName": currentUser.Name, 73 }) 74 75 roleType, err := convertRoleType(cmd.Args.Role) 76 if err != nil { 77 return err 78 } 79 80 org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Args.Organization) 81 cmd.UI.DisplayWarnings(warnings) 82 if err != nil { 83 return err 84 } 85 86 origin := cmd.Origin 87 if cmd.Origin == "" { 88 origin = constant.DefaultOriginUaa 89 } 90 91 warnings, err = cmd.Actor.CreateOrgRole(roleType, org.GUID, cmd.Args.Username, origin, cmd.IsClient) 92 cmd.UI.DisplayWarnings(warnings) 93 if err != nil { 94 if _, ok := err.(ccerror.RoleAlreadyExistsError); ok { 95 cmd.UI.DisplayWarning("User '{{.TargetUserName}}' already has role '{{.RoleType}}' in org '{{.OrgName}}'.", map[string]interface{}{ 96 "RoleType": cmd.Args.Role.Role, 97 "TargetUserName": cmd.Args.Username, 98 "OrgName": cmd.Args.Organization, 99 }) 100 } else { 101 return err 102 } 103 } 104 105 cmd.UI.DisplayOK() 106 107 return nil 108 } 109 110 func (cmd SetOrgRoleCommand) validateFlags() error { 111 if cmd.IsClient && cmd.Origin != "" { 112 return translatableerror.ArgumentCombinationError{ 113 Args: []string{"--client", "--origin"}, 114 } 115 } 116 117 return nil 118 } 119 120 func convertRoleType(givenRole flag.OrgRole) (constant.RoleType, error) { 121 switch givenRole.Role { 122 case "OrgAuditor": 123 return constant.OrgAuditorRole, nil 124 case "OrgManager": 125 return constant.OrgManagerRole, nil 126 case "BillingManager": 127 return constant.OrgBillingManagerRole, nil 128 default: 129 return "", errors.New("Invalid role type.") 130 } 131 }