github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/set_space_role_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/LukasHeimann/cloudfoundrycli/v8/api/cloudcontroller/ccerror"
     7  	"github.com/LukasHeimann/cloudfoundrycli/v8/api/cloudcontroller/ccv3/constant"
     8  	"github.com/LukasHeimann/cloudfoundrycli/v8/cf/errors"
     9  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/flag"
    10  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/translatableerror"
    11  )
    12  
    13  type SetSpaceRoleCommand struct {
    14  	BaseCommand
    15  
    16  	Args            flag.SpaceRoleArgs `positional-args:"yes"`
    17  	IsClient        bool               `long:"client" description:"Assign a space role to a client-id of a (non-user) service account"`
    18  	Origin          string             `long:"origin" description:"Indicates the identity provider to be used for authentication"`
    19  	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\n   SpaceSupporter [Beta role, subject to change] - Manage app lifecycle and service bindings"`
    20  	relatedCommands interface{}        `related_commands:"space-users, unset-space-role"`
    21  }
    22  
    23  func (cmd *SetSpaceRoleCommand) Execute(args []string) error {
    24  	err := cmd.validateFlags()
    25  	if err != nil {
    26  		return err
    27  	}
    28  
    29  	err = cmd.SharedActor.CheckTarget(false, false)
    30  	if err != nil {
    31  		return err
    32  	}
    33  
    34  	currentUser, err := cmd.Actor.GetCurrentUser()
    35  	if err != nil {
    36  		return err
    37  	}
    38  
    39  	cmd.UI.DisplayTextWithFlavor("Assigning role {{.RoleType}} to user {{.TargetUserName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUserName}}...", map[string]interface{}{
    40  		"RoleType":        cmd.Args.Role.Role,
    41  		"TargetUserName":  cmd.Args.Username,
    42  		"OrgName":         cmd.Args.Organization,
    43  		"SpaceName":       cmd.Args.Space,
    44  		"CurrentUserName": currentUser.Name,
    45  	})
    46  
    47  	roleType, err := convertSpaceRoleType(cmd.Args.Role)
    48  	if err != nil {
    49  		return err
    50  	}
    51  
    52  	org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Args.Organization)
    53  	cmd.UI.DisplayWarnings(warnings)
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	space, warnings, err := cmd.Actor.GetSpaceByNameAndOrganization(cmd.Args.Space, org.GUID)
    59  	cmd.UI.DisplayWarnings(warnings)
    60  	if err != nil {
    61  		return err
    62  	}
    63  
    64  	warnings, err = cmd.Actor.CreateSpaceRole(roleType, org.GUID, space.GUID, cmd.Args.Username, cmd.Origin, cmd.IsClient)
    65  	cmd.UI.DisplayWarnings(warnings)
    66  	if err != nil {
    67  		if _, ok := err.(ccerror.RoleAlreadyExistsError); ok {
    68  			cmd.UI.DisplayWarning("User '{{.TargetUserName}}' already has role '{{.RoleType}}' in org '{{.OrgName}}' / space '{{.SpaceName}}'.", map[string]interface{}{
    69  				"RoleType":       cmd.Args.Role.Role,
    70  				"TargetUserName": cmd.Args.Username,
    71  				"OrgName":        cmd.Args.Organization,
    72  				"SpaceName":      cmd.Args.Space,
    73  			})
    74  		} else {
    75  			return err
    76  		}
    77  	}
    78  
    79  	cmd.UI.DisplayOK()
    80  
    81  	return nil
    82  }
    83  
    84  func (cmd SetSpaceRoleCommand) validateFlags() error {
    85  	if cmd.IsClient && cmd.Origin != "" {
    86  		return translatableerror.ArgumentCombinationError{
    87  			Args: []string{"--client", "--origin"},
    88  		}
    89  	}
    90  	return nil
    91  }
    92  
    93  func convertSpaceRoleType(givenRole flag.SpaceRole) (constant.RoleType, error) {
    94  	switch strings.ToLower(givenRole.Role) {
    95  	case "spaceauditor":
    96  		return constant.SpaceAuditorRole, nil
    97  	case "spacemanager":
    98  		return constant.SpaceManagerRole, nil
    99  	case "spacedeveloper":
   100  		return constant.SpaceDeveloperRole, nil
   101  	case "spacesupporter":
   102  		return constant.SpaceSupporterRole, nil
   103  	default:
   104  		return "", errors.New("Invalid role type.")
   105  	}
   106  }