github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/role.go (about)

     1  package v7action
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
     7  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
     8  )
     9  
    10  type Role ccv3.Role
    11  
    12  func (actor Actor) CreateOrgRole(roleType constant.RoleType, orgGUID string, userNameOrGUID string, userOrigin string, isClient bool) (Warnings, error) {
    13  	roleToCreate := ccv3.Role{
    14  		Type:    roleType,
    15  		OrgGUID: orgGUID,
    16  	}
    17  
    18  	if isClient {
    19  		err := actor.UAAClient.ValidateClientUser(userNameOrGUID)
    20  		if err != nil {
    21  			return Warnings{}, err
    22  		}
    23  
    24  		roleToCreate.UserGUID = userNameOrGUID
    25  	} else {
    26  		roleToCreate.Username = userNameOrGUID
    27  		roleToCreate.Origin = userOrigin
    28  	}
    29  
    30  	_, warnings, err := actor.CloudControllerClient.CreateRole(roleToCreate)
    31  
    32  	return Warnings(warnings), err
    33  }
    34  
    35  func (actor Actor) CreateSpaceRole(roleType constant.RoleType, orgGUID string, spaceGUID string, userNameOrGUID string, userOrigin string, isClient bool) (Warnings, error) {
    36  	roleToCreate := ccv3.Role{
    37  		Type:      roleType,
    38  		SpaceGUID: spaceGUID,
    39  	}
    40  
    41  	if isClient {
    42  		roleToCreate.UserGUID = userNameOrGUID
    43  	} else {
    44  		roleToCreate.Username = userNameOrGUID
    45  		roleToCreate.Origin = userOrigin
    46  	}
    47  
    48  	warnings, err := actor.CreateOrgRole(constant.OrgUserRole, orgGUID, userNameOrGUID, userOrigin, isClient)
    49  	if err != nil {
    50  		_, isIdempotentError := err.(ccerror.RoleAlreadyExistsError)
    51  		_, isForbiddenError := err.(ccerror.ForbiddenError)
    52  		_, isUserNotFoundError := err.(actionerror.UserNotFoundError)
    53  
    54  		if !isIdempotentError && !isForbiddenError && !isUserNotFoundError {
    55  			return warnings, err
    56  		}
    57  	}
    58  
    59  	_, ccv3Warnings, err := actor.CloudControllerClient.CreateRole(roleToCreate)
    60  	warnings = append(warnings, ccv3Warnings...)
    61  
    62  	return warnings, err
    63  }
    64  
    65  func (actor Actor) DeleteOrgRole(roleType constant.RoleType, orgGUID string, userNameOrGUID string, userOrigin string, isClient bool) (Warnings, error) {
    66  	var userGUID string
    67  	var allWarnings Warnings
    68  	userGUID, warnings, err := actor.getUserGuidForDeleteRole(isClient, userNameOrGUID, userOrigin, allWarnings)
    69  	allWarnings = append(allWarnings, warnings...)
    70  	if err != nil {
    71  		return allWarnings, err
    72  	}
    73  
    74  	roleGUID, warnings, err := actor.GetRoleGUID(ccv3.OrganizationGUIDFilter, orgGUID, userGUID, roleType)
    75  	allWarnings = append(allWarnings, warnings...)
    76  	if err != nil || roleGUID == "" {
    77  		return allWarnings, err
    78  	}
    79  
    80  	jobURL, deleteRoleWarnings, err := actor.CloudControllerClient.DeleteRole(roleGUID)
    81  	allWarnings = append(allWarnings, deleteRoleWarnings...)
    82  	if err != nil {
    83  		return allWarnings, err
    84  	}
    85  
    86  	pollJobWarnings, err := actor.CloudControllerClient.PollJob(jobURL)
    87  	allWarnings = append(allWarnings, pollJobWarnings...)
    88  	if err != nil {
    89  		return allWarnings, err
    90  	}
    91  
    92  	return allWarnings, nil
    93  }
    94  
    95  func (actor Actor) DeleteSpaceRole(roleType constant.RoleType, spaceGUID string, userNameOrGUID string, userOrigin string, isClient bool) (Warnings, error) {
    96  	var userGUID string
    97  	var allWarnings Warnings
    98  	userGUID, userWarnings, err := actor.getUserGuidForDeleteRole(isClient, userNameOrGUID, userOrigin, allWarnings)
    99  	allWarnings = append(allWarnings, userWarnings...)
   100  	if err != nil {
   101  		return allWarnings, err
   102  	}
   103  
   104  	roleGUID, roleWarnings, err := actor.GetRoleGUID(ccv3.SpaceGUIDFilter, spaceGUID, userGUID, roleType)
   105  	allWarnings = append(allWarnings, roleWarnings...)
   106  	if err != nil || roleGUID == "" {
   107  		return allWarnings, err
   108  	}
   109  
   110  	jobURL, deleteRoleWarnings, err := actor.CloudControllerClient.DeleteRole(roleGUID)
   111  	allWarnings = append(allWarnings, deleteRoleWarnings...)
   112  	if err != nil {
   113  		return allWarnings, err
   114  	}
   115  
   116  	pollJobWarnings, err := actor.CloudControllerClient.PollJob(jobURL)
   117  	allWarnings = append(allWarnings, pollJobWarnings...)
   118  	if err != nil {
   119  		return allWarnings, err
   120  	}
   121  
   122  	return allWarnings, nil
   123  }
   124  
   125  func (actor Actor) getUserGuidForDeleteRole(isClient bool, userNameOrGUID string, userOrigin string, allWarnings Warnings) (string, Warnings, error) {
   126  	var userGUID string
   127  	if isClient {
   128  		user, warnings, err := actor.CloudControllerClient.GetUser(userNameOrGUID)
   129  		allWarnings = append(allWarnings, warnings...)
   130  		if err != nil {
   131  			if _, ok := err.(ccerror.UserNotFoundError); ok {
   132  				err = actionerror.UserNotFoundError{Username: userNameOrGUID}
   133  			}
   134  			return "", allWarnings, err
   135  		}
   136  		userGUID = user.GUID
   137  	} else {
   138  		ccv3Users, warnings, err := actor.CloudControllerClient.GetUsers(
   139  			ccv3.Query{
   140  				Key:    ccv3.UsernamesFilter,
   141  				Values: []string{userNameOrGUID},
   142  			},
   143  			ccv3.Query{
   144  				Key:    ccv3.OriginsFilter,
   145  				Values: []string{userOrigin},
   146  			},
   147  		)
   148  		allWarnings = append(allWarnings, warnings...)
   149  		if err != nil {
   150  			return "", allWarnings, err
   151  		}
   152  		if len(ccv3Users) == 0 {
   153  			return "", allWarnings, actionerror.UserNotFoundError{Username: userNameOrGUID, Origin: userOrigin}
   154  		}
   155  		userGUID = ccv3Users[0].GUID
   156  	}
   157  	return userGUID, allWarnings, nil
   158  }
   159  
   160  func (actor Actor) GetRoleGUID(queryKey ccv3.QueryKey, orgOrSpaceGUID string, userGUID string, roleType constant.RoleType) (string, Warnings, error) {
   161  	ccv3Roles, _, warnings, err := actor.CloudControllerClient.GetRoles(
   162  		ccv3.Query{
   163  			Key:    ccv3.UserGUIDFilter,
   164  			Values: []string{userGUID},
   165  		},
   166  		ccv3.Query{
   167  			Key:    ccv3.RoleTypesFilter,
   168  			Values: []string{string(roleType)},
   169  		},
   170  		ccv3.Query{
   171  			Key:    queryKey,
   172  			Values: []string{orgOrSpaceGUID},
   173  		},
   174  	)
   175  
   176  	if err != nil {
   177  		return "", Warnings(warnings), err
   178  	}
   179  
   180  	if len(ccv3Roles) == 0 {
   181  		return "", Warnings(warnings), nil
   182  	}
   183  
   184  	return ccv3Roles[0].GUID, Warnings(warnings), nil
   185  }
   186  
   187  func (actor Actor) GetOrgUsersByRoleType(orgGuid string) (map[constant.RoleType][]User, Warnings, error) {
   188  	return actor.getUsersByRoleType(orgGuid, ccv3.OrganizationGUIDFilter)
   189  }
   190  
   191  func (actor Actor) GetSpaceUsersByRoleType(spaceGuid string) (map[constant.RoleType][]User, Warnings, error) {
   192  	return actor.getUsersByRoleType(spaceGuid, ccv3.SpaceGUIDFilter)
   193  }
   194  
   195  func (actor Actor) getUsersByRoleType(guid string, filterKey ccv3.QueryKey) (map[constant.RoleType][]User, Warnings, error) {
   196  	ccv3Roles, includes, ccWarnings, err := actor.CloudControllerClient.GetRoles(
   197  		ccv3.Query{
   198  			Key:    filterKey,
   199  			Values: []string{guid},
   200  		},
   201  		ccv3.Query{
   202  			Key:    ccv3.Include,
   203  			Values: []string{"user"},
   204  		},
   205  	)
   206  	if err != nil {
   207  		return nil, Warnings(ccWarnings), err
   208  	}
   209  	usersByGuids := make(map[string]ccv3.User)
   210  	for _, user := range includes.Users {
   211  		usersByGuids[user.GUID] = user
   212  	}
   213  	usersByRoleType := make(map[constant.RoleType][]User)
   214  	for _, role := range ccv3Roles {
   215  		user := User(usersByGuids[role.UserGUID])
   216  		usersByRoleType[role.Type] = append(usersByRoleType[role.Type], user)
   217  	}
   218  	return usersByRoleType, Warnings(ccWarnings), nil
   219  }