github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/space.go (about) 1 package v7action 2 3 import ( 4 "fmt" 5 "sort" 6 7 "code.cloudfoundry.org/cli/actor/actionerror" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 11 ) 12 13 type Space ccv3.Space 14 15 type SpaceSummary struct { 16 Space 17 Name string 18 OrgName string 19 AppNames []string 20 ServiceInstanceNames []string 21 IsolationSegmentName string 22 } 23 24 func (actor Actor) CreateSpace(spaceName, orgGUID string) (Space, Warnings, error) { 25 allWarnings := Warnings{} 26 27 space, apiWarnings, err := actor.CloudControllerClient.CreateSpace(ccv3.Space{ 28 Name: spaceName, 29 Relationships: ccv3.Relationships{ 30 constant.RelationshipTypeOrganization: ccv3.Relationship{GUID: orgGUID}, 31 }, 32 }) 33 34 actorWarnings := Warnings(apiWarnings) 35 allWarnings = append(allWarnings, actorWarnings...) 36 37 if _, ok := err.(ccerror.NameNotUniqueInOrgError); ok { 38 return Space{}, allWarnings, actionerror.SpaceAlreadyExistsError{Space: spaceName} 39 } 40 return Space{ 41 GUID: space.GUID, 42 Name: spaceName, 43 }, allWarnings, err 44 } 45 46 // ResetSpaceIsolationSegment disassociates a space from an isolation segment. 47 // 48 // If the space's organization has a default isolation segment, return its 49 // name. Otherwise return the empty string. 50 func (actor Actor) ResetSpaceIsolationSegment(orgGUID string, spaceGUID string) (string, Warnings, error) { 51 var allWarnings Warnings 52 53 _, apiWarnings, err := actor.CloudControllerClient.UpdateSpaceIsolationSegmentRelationship(spaceGUID, "") 54 allWarnings = append(allWarnings, apiWarnings...) 55 if err != nil { 56 return "", allWarnings, err 57 } 58 59 isoSegRelationship, apiWarnings, err := actor.CloudControllerClient.GetOrganizationDefaultIsolationSegment(orgGUID) 60 allWarnings = append(allWarnings, apiWarnings...) 61 if err != nil { 62 return "", allWarnings, err 63 } 64 65 var isoSegName string 66 if isoSegRelationship.GUID != "" { 67 isolationSegment, apiWarnings, err := actor.CloudControllerClient.GetIsolationSegment(isoSegRelationship.GUID) 68 allWarnings = append(allWarnings, apiWarnings...) 69 if err != nil { 70 return "", allWarnings, err 71 } 72 isoSegName = isolationSegment.Name 73 } 74 75 return isoSegName, allWarnings, nil 76 } 77 78 func (actor Actor) GetSpaceByNameAndOrganization(spaceName string, orgGUID string) (Space, Warnings, error) { 79 ccv3Spaces, warnings, err := actor.CloudControllerClient.GetSpaces( 80 ccv3.Query{Key: ccv3.NameFilter, Values: []string{spaceName}}, 81 ccv3.Query{Key: ccv3.OrganizationGUIDFilter, Values: []string{orgGUID}}, 82 ) 83 84 if err != nil { 85 return Space{}, Warnings(warnings), err 86 } 87 88 if len(ccv3Spaces) == 0 { 89 return Space{}, Warnings(warnings), actionerror.SpaceNotFoundError{Name: spaceName} 90 } 91 92 return Space(ccv3Spaces[0]), Warnings(warnings), nil 93 } 94 95 func (actor Actor) GetSpaceSummaryByNameAndOrganization(spaceName string, orgGUID string) (SpaceSummary, Warnings, error) { 96 var allWarnings Warnings 97 98 org, warnings, err := actor.GetOrganizationByGUID(orgGUID) 99 allWarnings = append(allWarnings, warnings...) 100 if err != nil { 101 return SpaceSummary{}, allWarnings, err 102 } 103 104 space, warnings, err := actor.GetSpaceByNameAndOrganization(spaceName, org.GUID) 105 allWarnings = append(allWarnings, warnings...) 106 if err != nil { 107 return SpaceSummary{}, allWarnings, err 108 } 109 110 apps, warnings, err := actor.GetApplicationsBySpace(space.GUID) 111 allWarnings = append(allWarnings, warnings...) 112 if err != nil { 113 return SpaceSummary{}, allWarnings, err 114 } 115 116 appNames := make([]string, len(apps)) 117 for i, app := range apps { 118 appNames[i] = app.Name 119 } 120 sort.Strings(appNames) 121 122 serviceInstances, ccv3Warnings, err := actor.CloudControllerClient.GetServiceInstances( 123 ccv3.Query{ 124 Key: ccv3.SpaceGUIDFilter, 125 Values: []string{space.GUID}, 126 }) 127 allWarnings = append(allWarnings, Warnings(ccv3Warnings)...) 128 if err != nil { 129 return SpaceSummary{}, allWarnings, err 130 } 131 132 serviceInstanceNames := make([]string, len(serviceInstances)) 133 for i, instance := range serviceInstances { 134 serviceInstanceNames[i] = instance.Name 135 } 136 sort.Strings(serviceInstanceNames) 137 138 isoSegRelationship, ccv3Warnings, err := actor.CloudControllerClient.GetSpaceIsolationSegment(space.GUID) 139 allWarnings = append(allWarnings, Warnings(ccv3Warnings)...) 140 if err != nil { 141 return SpaceSummary{}, allWarnings, err 142 } 143 144 isoSegName := "" 145 isoSegGUID := isoSegRelationship.GUID 146 isDefaultIsoSeg := false 147 148 if isoSegGUID == "" { 149 defaultIsoSeg, ccv3Warnings, err := actor.CloudControllerClient.GetOrganizationDefaultIsolationSegment(org.GUID) 150 allWarnings = append(allWarnings, Warnings(ccv3Warnings)...) 151 if err != nil { 152 return SpaceSummary{}, allWarnings, err 153 } 154 isoSegGUID = defaultIsoSeg.GUID 155 if isoSegGUID != "" { 156 isDefaultIsoSeg = true 157 } 158 } 159 160 if isoSegGUID != "" { 161 isoSeg, ccv3warnings, err := actor.CloudControllerClient.GetIsolationSegment(isoSegGUID) 162 allWarnings = append(allWarnings, Warnings(ccv3warnings)...) 163 if err != nil { 164 return SpaceSummary{}, allWarnings, err 165 } 166 if isDefaultIsoSeg { 167 isoSegName = fmt.Sprintf("%s (org default)", isoSeg.Name) 168 } else { 169 isoSegName = isoSeg.Name 170 } 171 } 172 173 spaceSummary := SpaceSummary{ 174 OrgName: org.Name, 175 Name: space.Name, 176 Space: space, 177 AppNames: appNames, 178 ServiceInstanceNames: serviceInstanceNames, 179 IsolationSegmentName: isoSegName, 180 } 181 182 return spaceSummary, allWarnings, nil 183 } 184 185 // GetOrganizationSpacesWithLabelSelector returns a list of spaces in the specified org 186 func (actor Actor) GetOrganizationSpacesWithLabelSelector(orgGUID string, labelSelector string) ([]Space, Warnings, error) { 187 188 queries := []ccv3.Query{ 189 ccv3.Query{Key: ccv3.OrganizationGUIDFilter, Values: []string{orgGUID}}, 190 ccv3.Query{Key: ccv3.OrderBy, Values: []string{ccv3.NameOrder}}, 191 } 192 if len(labelSelector) > 0 { 193 queries = append(queries, ccv3.Query{Key: ccv3.LabelSelectorFilter, Values: []string{labelSelector}}) 194 } 195 196 ccv3Spaces, warnings, err := actor.CloudControllerClient.GetSpaces(queries...) 197 if err != nil { 198 return []Space{}, Warnings(warnings), err 199 } 200 201 spaces := make([]Space, len(ccv3Spaces)) 202 for i, ccv3Space := range ccv3Spaces { 203 spaces[i] = Space(ccv3Space) 204 } 205 206 return spaces, Warnings(warnings), nil 207 } 208 209 // GetOrganizationSpaces returns a list of spaces in the specified org 210 func (actor Actor) GetOrganizationSpaces(orgGUID string) ([]Space, Warnings, error) { 211 return actor.GetOrganizationSpacesWithLabelSelector(orgGUID, "") 212 } 213 214 func (actor Actor) DeleteSpaceByNameAndOrganizationName(spaceName string, orgName string) (Warnings, error) { 215 var allWarnings Warnings 216 217 org, actorWarnings, err := actor.GetOrganizationByName(orgName) 218 allWarnings = append(allWarnings, actorWarnings...) 219 if err != nil { 220 return allWarnings, err 221 } 222 223 space, warnings, err := actor.GetSpaceByNameAndOrganization(spaceName, org.GUID) 224 allWarnings = append(allWarnings, warnings...) 225 if err != nil { 226 return allWarnings, err 227 } 228 229 jobURL, deleteWarnings, err := actor.CloudControllerClient.DeleteSpace(space.GUID) 230 allWarnings = append(allWarnings, Warnings(deleteWarnings)...) 231 if err != nil { 232 return allWarnings, err 233 } 234 235 ccWarnings, err := actor.CloudControllerClient.PollJob(jobURL) 236 allWarnings = append(allWarnings, Warnings(ccWarnings)...) 237 238 return allWarnings, err 239 } 240 241 func (actor Actor) RenameSpaceByNameAndOrganizationGUID(oldSpaceName, newSpaceName, orgGUID string) (Space, Warnings, error) { 242 var allWarnings Warnings 243 244 space, getWarnings, err := actor.GetSpaceByNameAndOrganization(oldSpaceName, orgGUID) 245 allWarnings = append(allWarnings, getWarnings...) 246 if err != nil { 247 return Space{}, allWarnings, err 248 } 249 250 ccSpace, updateWarnings, err := actor.CloudControllerClient.UpdateSpace(ccv3.Space{GUID: space.GUID, Name: newSpaceName}) 251 allWarnings = append(allWarnings, Warnings(updateWarnings)...) 252 253 return Space(ccSpace), allWarnings, err 254 }