github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v7/set_space_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 . SetSpaceRoleActor 18 19 type SetSpaceRoleActor interface { 20 CreateSpaceRole(roleType constant.RoleType, orgGUID string, spaceGUID string, userNameOrGUID string, userOrigin string, isClient bool) (v7action.Warnings, error) 21 GetOrganizationByName(name string) (v7action.Organization, v7action.Warnings, error) 22 GetSpaceByNameAndOrganization(spaceName string, orgGUID string) (v7action.Space, v7action.Warnings, error) 23 GetUser(username, origin string) (v7action.User, error) 24 } 25 26 type SetSpaceRoleCommand struct { 27 Args flag.SpaceRoleArgs `positional-args:"yes"` 28 IsClient bool `long:"client" description:"Assign a space role to a client-id of a (non-user) service account"` 29 Origin string `long:"origin" description:"Indicates the identity provider to be used for authentication"` 30 usage interface{} `usage:"CF_NAME set-space-role USERNAME ORG SPACE ROLE\n CF_NAME set-space-role USERNAME ORG SPACE ROLE [--client]\n CF_NAME set-space-role USERNAME ORG SPACE ROLE [--origin ORIGIN]\n\nROLES:\n SpaceManager - Invite and manage users, and enable features for a given space\n SpaceDeveloper - Create and manage apps and services, and see logs and reports\n SpaceAuditor - View logs, reports, and settings on this space"` 31 relatedCommands interface{} `related_commands:"space-users, unset-space-role"` 32 33 UI command.UI 34 Config command.Config 35 SharedActor command.SharedActor 36 Actor SetSpaceRoleActor 37 } 38 39 func (cmd *SetSpaceRoleCommand) Setup(config command.Config, ui command.UI) error { 40 cmd.UI = ui 41 cmd.Config = config 42 sharedActor := sharedaction.NewActor(config) 43 cmd.SharedActor = sharedActor 44 45 ccClient, uaaClient, err := shared.GetNewClientsAndConnectToCF(config, ui, "") 46 if err != nil { 47 return err 48 } 49 cmd.Actor = v7action.NewActor(ccClient, config, sharedActor, uaaClient, clock.NewClock()) 50 return nil 51 } 52 53 func (cmd *SetSpaceRoleCommand) Execute(args []string) error { 54 err := cmd.validateFlags() 55 if err != nil { 56 return err 57 } 58 59 err = cmd.SharedActor.CheckTarget(false, false) 60 if err != nil { 61 return err 62 } 63 64 currentUser, err := cmd.Config.CurrentUser() 65 if err != nil { 66 return err 67 } 68 69 cmd.UI.DisplayTextWithFlavor("Assigning role {{.RoleType}} to user {{.TargetUserName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUserName}}...", map[string]interface{}{ 70 "RoleType": cmd.Args.Role.Role, 71 "TargetUserName": cmd.Args.Username, 72 "OrgName": cmd.Args.Organization, 73 "SpaceName": cmd.Args.Space, 74 "CurrentUserName": currentUser.Name, 75 }) 76 77 roleType, err := convertSpaceRoleType(cmd.Args.Role) 78 if err != nil { 79 return err 80 } 81 82 org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Args.Organization) 83 cmd.UI.DisplayWarnings(warnings) 84 if err != nil { 85 return err 86 } 87 88 space, warnings, err := cmd.Actor.GetSpaceByNameAndOrganization(cmd.Args.Space, org.GUID) 89 cmd.UI.DisplayWarnings(warnings) 90 if err != nil { 91 return err 92 } 93 94 origin := cmd.Origin 95 if cmd.Origin == "" { 96 origin = constant.DefaultOriginUaa 97 } 98 99 warnings, err = cmd.Actor.CreateSpaceRole(roleType, org.GUID, space.GUID, cmd.Args.Username, origin, cmd.IsClient) 100 cmd.UI.DisplayWarnings(warnings) 101 if err != nil { 102 if _, ok := err.(ccerror.RoleAlreadyExistsError); ok { 103 cmd.UI.DisplayWarning("User '{{.TargetUserName}}' already has role '{{.RoleType}}' in org '{{.OrgName}}' / space '{{.SpaceName}}'.", map[string]interface{}{ 104 "RoleType": cmd.Args.Role.Role, 105 "TargetUserName": cmd.Args.Username, 106 "OrgName": cmd.Args.Organization, 107 "SpaceName": cmd.Args.Space, 108 }) 109 } else { 110 return err 111 } 112 } 113 114 cmd.UI.DisplayOK() 115 116 return nil 117 } 118 119 func (cmd SetSpaceRoleCommand) validateFlags() error { 120 if cmd.IsClient && cmd.Origin != "" { 121 return translatableerror.ArgumentCombinationError{ 122 Args: []string{"--client", "--origin"}, 123 } 124 } 125 return nil 126 } 127 128 func convertSpaceRoleType(givenRole flag.SpaceRole) (constant.RoleType, error) { 129 switch givenRole.Role { 130 case "SpaceAuditor": 131 return constant.SpaceAuditorRole, nil 132 case "SpaceManager": 133 return constant.SpaceManagerRole, nil 134 case "SpaceDeveloper": 135 return constant.SpaceDeveloperRole, nil 136 default: 137 return "", errors.New("Invalid role type.") 138 } 139 }