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 }