github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+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  }