github.com/sleungcy/cli@v7.1.0+incompatible/actor/v2action/service_instance_summary_test.go (about) 1 package v2action_test 2 3 import ( 4 "errors" 5 6 . "code.cloudfoundry.org/cli/actor/v2action" 7 "code.cloudfoundry.org/cli/actor/v2action/v2actionfakes" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant" 11 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/ginkgo/extensions/table" 14 . "github.com/onsi/gomega" 15 ) 16 17 var _ = Describe("Service Instance Summary Actions", func() { 18 var ( 19 actor *Actor 20 fakeCloudControllerClient *v2actionfakes.FakeCloudControllerClient 21 ) 22 23 BeforeEach(func() { 24 fakeCloudControllerClient = new(v2actionfakes.FakeCloudControllerClient) 25 actor = NewActor(fakeCloudControllerClient, nil, nil) 26 }) 27 28 Describe("ServiceInstanceSummary", func() { 29 var summary ServiceInstanceSummary 30 31 Describe("IsShareable", func() { 32 When("the 'service_instance_sharing' feature flag is enabled", func() { 33 BeforeEach(func() { 34 summary.ServiceInstanceSharingFeatureFlag = true 35 }) 36 37 When("the service broker has enabled sharing", func() { 38 BeforeEach(func() { 39 summary.Service.Extra.Shareable = true 40 }) 41 42 It("returns true", func() { 43 Expect(summary.IsShareable()).To(BeTrue()) 44 }) 45 }) 46 47 When("the service broker has not enabled sharing", func() { 48 BeforeEach(func() { 49 summary.Service.Extra.Shareable = false 50 }) 51 52 It("returns true", func() { 53 Expect(summary.IsShareable()).To(BeFalse()) 54 }) 55 }) 56 }) 57 58 When("the 'service_instance_sharing' feature flag is not enabled", func() { 59 BeforeEach(func() { 60 summary.ServiceInstanceSharingFeatureFlag = false 61 }) 62 63 When("the service broker has enabled sharing", func() { 64 BeforeEach(func() { 65 summary.Service.Extra.Shareable = true 66 }) 67 68 It("returns true", func() { 69 Expect(summary.IsShareable()).To(BeFalse()) 70 }) 71 }) 72 73 When("the service broker has not enabled sharing", func() { 74 BeforeEach(func() { 75 summary.Service.Extra.Shareable = false 76 }) 77 78 It("returns true", func() { 79 Expect(summary.IsShareable()).To(BeFalse()) 80 }) 81 }) 82 }) 83 }) 84 85 DescribeTable("UpgradeAvailable", 86 func(versionFromPlan, versionFromServiceInstance string, expectedResult bool) { 87 summary.MaintenanceInfo.Version = versionFromServiceInstance 88 summary.ServicePlan.MaintenanceInfo.Version = versionFromPlan 89 Expect(summary.UpgradeAvailable()).To(Equal(expectedResult)) 90 }, 91 Entry("values are the same", "2.0.0", "2.0.0", false), 92 Entry("values are different", "3.0.0", "2.0.0", true), 93 Entry("values are both empty", "", "", false), 94 Entry("plan has value but instance does not", "1.0.0", "", true), 95 Entry("instance has value but plan does not", "", "1.0.0", false), 96 ) 97 98 DescribeTable("UpgradeSupported", 99 func(versionFromPlan string, expectedResult bool) { 100 summary.ServicePlan.MaintenanceInfo.Version = versionFromPlan 101 Expect(summary.UpgradeSupported()).To(Equal(expectedResult)) 102 }, 103 Entry("plan has value", "1.0.0", true), 104 Entry("plan does not have value", "", false), 105 ) 106 }) 107 108 Describe("GetServiceInstanceSummaryByNameAndSpace", func() { 109 var ( 110 summary ServiceInstanceSummary 111 summaryWarnings Warnings 112 summaryErr error 113 ) 114 115 JustBeforeEach(func() { 116 summary, summaryWarnings, summaryErr = actor.GetServiceInstanceSummaryByNameAndSpace("some-service-instance", "some-space-guid") 117 }) 118 119 When("an error is encountered getting the service instance", func() { 120 var expectedErr error 121 122 BeforeEach(func() { 123 expectedErr = errors.New("get space service instance error") 124 fakeCloudControllerClient.GetSpaceServiceInstancesReturns( 125 []ccv2.ServiceInstance{}, 126 ccv2.Warnings{"get-space-service-instance-warning"}, 127 expectedErr) 128 }) 129 130 It("returns the error and all warnings", func() { 131 Expect(summaryErr).To(MatchError(expectedErr)) 132 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning")) 133 134 Expect(fakeCloudControllerClient.GetSpaceServiceInstancesCallCount()).To(Equal(1)) 135 spaceGUIDArg, getUserProvidedServicesArg, queriesArg := fakeCloudControllerClient.GetSpaceServiceInstancesArgsForCall(0) 136 Expect(spaceGUIDArg).To(Equal("some-space-guid")) 137 Expect(getUserProvidedServicesArg).To(BeTrue()) 138 Expect(queriesArg).To(HaveLen(1)) 139 Expect(queriesArg[0]).To(Equal(ccv2.Filter{ 140 Type: constant.NameFilter, 141 Operator: constant.EqualOperator, 142 Values: []string{"some-service-instance"}, 143 })) 144 }) 145 }) 146 147 When("no errors are encountered getting the service instance", func() { 148 var ( 149 returnedServiceInstance ccv2.ServiceInstance 150 returnedFeatureFlag ccv2.FeatureFlag 151 ) 152 153 When("the service instance is a managed service instance", func() { 154 BeforeEach(func() { 155 returnedServiceInstance = ccv2.ServiceInstance{ 156 DashboardURL: "some-dashboard", 157 GUID: "some-service-instance-guid", 158 Name: "some-service-instance", 159 ServiceGUID: "some-service-guid", 160 ServicePlanGUID: "some-service-plan-guid", 161 Tags: []string{"tag-1", "tag-2"}, 162 Type: constant.ManagedService, 163 } 164 fakeCloudControllerClient.GetSpaceServiceInstancesReturns( 165 []ccv2.ServiceInstance{returnedServiceInstance}, 166 ccv2.Warnings{"get-space-service-instance-warning"}, 167 nil) 168 169 returnedFeatureFlag = ccv2.FeatureFlag{ 170 Name: "service_instance_sharing", 171 Enabled: true, 172 } 173 fakeCloudControllerClient.GetConfigFeatureFlagsReturns( 174 []ccv2.FeatureFlag{returnedFeatureFlag}, 175 ccv2.Warnings{"get-feature-flags-warning"}, 176 nil) 177 }) 178 179 It("returns the service instance info and all warnings", func() { 180 Expect(summaryErr).ToNot(HaveOccurred()) 181 Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance))) 182 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning")) 183 184 Expect(fakeCloudControllerClient.GetSpaceServiceInstancesCallCount()).To(Equal(1)) 185 spaceGUIDArg, getUserProvidedServicesArg, queriesArg := fakeCloudControllerClient.GetSpaceServiceInstancesArgsForCall(0) 186 Expect(spaceGUIDArg).To(Equal("some-space-guid")) 187 Expect(getUserProvidedServicesArg).To(BeTrue()) 188 Expect(queriesArg).To(HaveLen(1)) 189 Expect(queriesArg[0]).To(Equal(ccv2.Filter{ 190 Type: constant.NameFilter, 191 Operator: constant.EqualOperator, 192 Values: []string{"some-service-instance"}, 193 })) 194 }) 195 196 When("the service instance is shared from another space (not created in the currently targeted space)", func() { 197 When("the source space of the service instance is different from the currently targeted space", func() { 198 BeforeEach(func() { 199 returnedServiceInstance.SpaceGUID = "not-currently-targeted-space-guid" 200 fakeCloudControllerClient.GetSpaceServiceInstancesReturns( 201 []ccv2.ServiceInstance{returnedServiceInstance}, 202 ccv2.Warnings{"get-space-service-instance-warning"}, 203 nil) 204 }) 205 206 When("an error is encountered getting the shared_from information", func() { 207 var expectedErr error 208 209 When("the error is generic", func() { 210 BeforeEach(func() { 211 expectedErr = errors.New("get-service-instance-shared-from-error") 212 fakeCloudControllerClient.GetServiceInstanceSharedFromReturns( 213 ccv2.ServiceInstanceSharedFrom{}, 214 ccv2.Warnings{"get-service-instance-shared-from-warning"}, 215 expectedErr, 216 ) 217 }) 218 219 It("returns the error and all warnings", func() { 220 Expect(summaryErr).To(MatchError(expectedErr)) 221 Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning")) 222 223 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1)) 224 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 225 Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0)) 226 }) 227 }) 228 229 When("the API version does not support service instance sharing", func() { 230 BeforeEach(func() { 231 expectedErr = ccerror.ResourceNotFoundError{} 232 fakeCloudControllerClient.GetServiceInstanceSharedFromReturns( 233 ccv2.ServiceInstanceSharedFrom{}, 234 ccv2.Warnings{"get-service-instance-shared-from-warning"}, 235 expectedErr, 236 ) 237 }) 238 239 It("ignores the 404 error and continues without shared_from information", func() { 240 Expect(summaryErr).ToNot(HaveOccurred()) 241 Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning")) 242 Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom{})) 243 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1)) 244 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 245 Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0)) 246 }) 247 }) 248 }) 249 250 When("no errors are encountered getting the shared_from information", func() { 251 When("the shared_from info is NOT empty", func() { 252 var returnedServiceSharedFrom ccv2.ServiceInstanceSharedFrom 253 254 BeforeEach(func() { 255 returnedServiceSharedFrom = ccv2.ServiceInstanceSharedFrom{ 256 SpaceGUID: "some-space-guid", 257 SpaceName: "some-space-name", 258 OrganizationName: "some-org-name", 259 } 260 fakeCloudControllerClient.GetServiceInstanceSharedFromReturns( 261 returnedServiceSharedFrom, 262 ccv2.Warnings{"get-service-instance-shared-from-warning"}, 263 nil) 264 }) 265 266 It("returns the service instance share type, shared_from info, and all warnings", func() { 267 Expect(summaryErr).ToNot(HaveOccurred()) 268 Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance))) 269 Expect(summary.ServiceInstanceSharingFeatureFlag).To(BeTrue()) 270 Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsSharedFrom)) 271 Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom(returnedServiceSharedFrom))) 272 Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning")) 273 274 Expect(fakeCloudControllerClient.GetConfigFeatureFlagsCallCount()).To(Equal(1)) 275 276 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1)) 277 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 278 Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0)) 279 }) 280 }) 281 282 When("the shared_from info is empty", func() { 283 It("sets the share type to not shared", func() { 284 Expect(summaryErr).ToNot(HaveOccurred()) 285 Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsNotShared)) 286 }) 287 }) 288 }) 289 }) 290 291 When("the source space of the service instance is 'null'", func() { 292 BeforeEach(func() { 293 // API returns a json null value that is unmarshalled into the empty string 294 returnedServiceInstance.SpaceGUID = "" 295 fakeCloudControllerClient.GetSpaceServiceInstancesReturns( 296 []ccv2.ServiceInstance{returnedServiceInstance}, 297 ccv2.Warnings{"get-space-service-instance-warning"}, 298 nil) 299 }) 300 301 When("an error is encountered getting the shared_from information", func() { 302 var expectedErr error 303 304 When("the error is generic", func() { 305 BeforeEach(func() { 306 expectedErr = errors.New("get-service-instance-shared-from-error") 307 fakeCloudControllerClient.GetServiceInstanceSharedFromReturns( 308 ccv2.ServiceInstanceSharedFrom{}, 309 ccv2.Warnings{"get-service-instance-shared-from-warning"}, 310 expectedErr, 311 ) 312 }) 313 314 It("returns the error and all warnings", func() { 315 Expect(summaryErr).To(MatchError(expectedErr)) 316 Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning")) 317 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1)) 318 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 319 }) 320 }) 321 322 When("the API version does not support service instance sharing", func() { 323 BeforeEach(func() { 324 expectedErr = ccerror.ResourceNotFoundError{} 325 fakeCloudControllerClient.GetServiceInstanceSharedFromReturns( 326 ccv2.ServiceInstanceSharedFrom{}, 327 ccv2.Warnings{"get-service-instance-shared-from-warning"}, 328 expectedErr, 329 ) 330 }) 331 332 It("ignores the 404 error and continues without shared_from information", func() { 333 Expect(summaryErr).ToNot(HaveOccurred()) 334 Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-from-warning", "get-feature-flags-warning", "get-space-service-instance-warning")) 335 Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom{})) 336 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1)) 337 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 338 }) 339 }) 340 }) 341 342 When("no errors are encountered getting the shared_from information", func() { 343 When("the shared_from info is NOT empty", func() { 344 var returnedServiceSharedFrom ccv2.ServiceInstanceSharedFrom 345 346 BeforeEach(func() { 347 returnedServiceSharedFrom = ccv2.ServiceInstanceSharedFrom{ 348 SpaceGUID: "some-space-guid", 349 SpaceName: "some-space-name", 350 OrganizationName: "some-org-name", 351 } 352 fakeCloudControllerClient.GetServiceInstanceSharedFromReturns( 353 returnedServiceSharedFrom, 354 ccv2.Warnings{"get-service-instance-shared-from-warning"}, 355 nil) 356 }) 357 358 It("returns the service instance share type, shared_from info, and all warnings", func() { 359 Expect(summaryErr).ToNot(HaveOccurred()) 360 Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance))) 361 Expect(summary.ServiceInstanceSharingFeatureFlag).To(BeTrue()) 362 Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsSharedFrom)) 363 Expect(summary.ServiceInstanceSharedFrom).To(Equal(ServiceInstanceSharedFrom(returnedServiceSharedFrom))) 364 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-instance-shared-from-warning")) 365 366 Expect(fakeCloudControllerClient.GetConfigFeatureFlagsCallCount()).To(Equal(1)) 367 368 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(1)) 369 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 370 Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(0)) 371 }) 372 }) 373 374 When("the shared_from info is empty", func() { 375 It("sets the share type to not shared", func() { 376 Expect(summaryErr).ToNot(HaveOccurred()) 377 Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsNotShared)) 378 }) 379 }) 380 }) 381 }) 382 }) 383 384 When("the service instance is shared to other spaces", func() { 385 When("the source space of the service instance is the same as the currently targeted space", func() { 386 BeforeEach(func() { 387 returnedServiceInstance.SpaceGUID = "some-space-guid" 388 fakeCloudControllerClient.GetSpaceServiceInstancesReturns( 389 []ccv2.ServiceInstance{returnedServiceInstance}, 390 ccv2.Warnings{"get-space-service-instance-warning"}, 391 nil) 392 }) 393 394 When("an error is encountered getting the shared_to information", func() { 395 var expectedErr error 396 397 When("the error is generic", func() { 398 BeforeEach(func() { 399 expectedErr = errors.New("get-service-instance-shared-tos-error") 400 fakeCloudControllerClient.GetServiceInstanceSharedTosReturns( 401 []ccv2.ServiceInstanceSharedTo{}, 402 ccv2.Warnings{"get-service-instance-shared-tos-warning"}, 403 expectedErr, 404 ) 405 }) 406 407 It("returns the error and all warnings", func() { 408 Expect(summaryErr).To(MatchError(expectedErr)) 409 Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-tos-warning", "get-feature-flags-warning", "get-space-service-instance-warning")) 410 Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(1)) 411 Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 412 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(0)) 413 }) 414 }) 415 416 When("the API version does not support service instance sharing", func() { 417 BeforeEach(func() { 418 expectedErr = ccerror.ResourceNotFoundError{} 419 fakeCloudControllerClient.GetServiceInstanceSharedTosReturns( 420 []ccv2.ServiceInstanceSharedTo{}, 421 ccv2.Warnings{"get-service-instance-shared-tos-warning"}, 422 expectedErr, 423 ) 424 }) 425 426 It("ignores the 404 error and continues without shared_to information", func() { 427 Expect(summaryErr).ToNot(HaveOccurred()) 428 Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-tos-warning", "get-feature-flags-warning", "get-space-service-instance-warning")) 429 Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(1)) 430 Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 431 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(0)) 432 }) 433 }) 434 }) 435 436 When("no errors are encountered getting the shared_to information", func() { 437 When("the shared_to info is NOT an empty list", func() { 438 var returnedServiceSharedTos []ccv2.ServiceInstanceSharedTo 439 440 BeforeEach(func() { 441 returnedServiceSharedTos = []ccv2.ServiceInstanceSharedTo{ 442 { 443 SpaceGUID: "some-space-guid", 444 SpaceName: "some-space-name", 445 OrganizationName: "some-org-name", 446 }, 447 { 448 SpaceGUID: "some-space-guid2", 449 SpaceName: "some-space-name2", 450 OrganizationName: "some-org-name2", 451 }, 452 } 453 454 fakeCloudControllerClient.GetServiceInstanceSharedTosReturns( 455 returnedServiceSharedTos, 456 ccv2.Warnings{"get-service-instance-shared-tos-warning"}, 457 nil) 458 }) 459 460 It("returns the service instance share type, shared_to info, and all warnings", func() { 461 Expect(summaryErr).ToNot(HaveOccurred()) 462 Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance))) 463 Expect(summary.ServiceInstanceSharingFeatureFlag).To(BeTrue()) 464 Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsSharedTo)) 465 Expect(summary.ServiceInstanceSharedTos).To(ConsistOf(ServiceInstanceSharedTo(returnedServiceSharedTos[0]), ServiceInstanceSharedTo(returnedServiceSharedTos[1]))) 466 Expect(summaryWarnings).To(ConsistOf("get-service-instance-shared-tos-warning", "get-feature-flags-warning", "get-space-service-instance-warning")) 467 468 Expect(fakeCloudControllerClient.GetConfigFeatureFlagsCallCount()).To(Equal(1)) 469 470 Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosCallCount()).To(Equal(1)) 471 Expect(fakeCloudControllerClient.GetServiceInstanceSharedTosArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 472 Expect(fakeCloudControllerClient.GetServiceInstanceSharedFromCallCount()).To(Equal(0)) 473 }) 474 }) 475 476 When("the shared_to info is an empty list", func() { 477 It("sets the share type to not shared", func() { 478 Expect(summaryErr).ToNot(HaveOccurred()) 479 Expect(summary.ServiceInstanceShareType).To(Equal(ServiceInstanceIsNotShared)) 480 }) 481 }) 482 }) 483 }) 484 }) 485 486 When("an error is encountered getting the service plan", func() { 487 Describe("a generic error", func() { 488 var expectedErr error 489 490 BeforeEach(func() { 491 expectedErr = errors.New("get-service-plan-error") 492 fakeCloudControllerClient.GetServicePlanReturns( 493 ccv2.ServicePlan{}, 494 ccv2.Warnings{"get-service-plan-warning"}, 495 expectedErr) 496 }) 497 498 It("returns the error and all warnings", func() { 499 Expect(summaryErr).To(MatchError(expectedErr)) 500 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning")) 501 }) 502 }) 503 504 Describe("a Forbidden error", func() { 505 BeforeEach(func() { 506 fakeCloudControllerClient.GetServicePlanReturns( 507 ccv2.ServicePlan{}, 508 ccv2.Warnings{"get-service-plan-warning"}, 509 ccerror.ForbiddenError{}) 510 }) 511 512 It("returns warnings and continues on", func() { 513 Expect(summaryErr).ToNot(HaveOccurred()) 514 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "This org is not authorized to view necessary data about this service plan. Contact your administrator regarding service GUID some-service-plan-guid.")) 515 516 Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(1)) 517 Expect(fakeCloudControllerClient.GetServiceArgsForCall(0)).To(Equal("some-service-guid")) 518 }) 519 }) 520 }) 521 522 When("no errors are encountered getting the service plan", func() { 523 var returnedServicePlan ccv2.ServicePlan 524 525 BeforeEach(func() { 526 returnedServicePlan = ccv2.ServicePlan{ 527 GUID: "some-service-plan-guid", 528 Name: "some-service-plan", 529 ServiceGUID: "some-service-guid", 530 } 531 fakeCloudControllerClient.GetServicePlanReturns( 532 returnedServicePlan, 533 ccv2.Warnings{"get-service-plan-warning"}, 534 nil) 535 }) 536 537 It("returns the service plan info and all warnings", func() { 538 Expect(summaryErr).ToNot(HaveOccurred()) 539 Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance))) 540 Expect(summary.ServicePlan).To(Equal(ServicePlan(returnedServicePlan))) 541 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning")) 542 543 Expect(fakeCloudControllerClient.GetServicePlanCallCount()).To(Equal(1)) 544 Expect(fakeCloudControllerClient.GetServicePlanArgsForCall(0)).To(Equal(returnedServiceInstance.ServicePlanGUID)) 545 }) 546 547 When("an error is encountered getting the service", func() { 548 Describe("a generic error", func() { 549 var expectedErr error 550 551 BeforeEach(func() { 552 expectedErr = errors.New("get service error") 553 fakeCloudControllerClient.GetServiceReturns( 554 ccv2.Service{}, 555 ccv2.Warnings{"get-service-warning"}, 556 expectedErr) 557 }) 558 559 It("returns the error and all warnings", func() { 560 Expect(summaryErr).To(MatchError(expectedErr)) 561 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning")) 562 563 Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(1)) 564 Expect(fakeCloudControllerClient.GetServiceArgsForCall(0)).To(Equal(returnedServicePlan.ServiceGUID)) 565 }) 566 }) 567 568 Describe("a Forbidden error", func() { 569 BeforeEach(func() { 570 fakeCloudControllerClient.GetServiceReturns( 571 ccv2.Service{}, 572 ccv2.Warnings{"get-service-warning"}, 573 ccerror.ForbiddenError{}) 574 }) 575 576 It("returns warnings and continues on", func() { 577 Expect(summaryErr).ToNot(HaveOccurred()) 578 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning", "This org is not authorized to view necessary data about this service. Contact your administrator regarding service GUID some-service-guid.")) 579 580 Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(BeNumerically(">=", 1)) 581 }) 582 }) 583 }) 584 585 When("no errors are encountered getting the service", func() { 586 var returnedService ccv2.Service 587 588 BeforeEach(func() { 589 returnedService = ccv2.Service{ 590 GUID: "some-service-guid", 591 Label: "some-service", 592 Description: "some-description", 593 DocumentationURL: "some-url", 594 Extra: ccv2.ServiceExtra{ 595 Shareable: true, 596 }, 597 } 598 599 fakeCloudControllerClient.GetServiceReturns( 600 returnedService, 601 ccv2.Warnings{"get-service-warning"}, 602 nil) 603 }) 604 605 It("returns the service info and all warnings", func() { 606 Expect(summaryErr).ToNot(HaveOccurred()) 607 Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance))) 608 Expect(summary.ServicePlan).To(Equal(ServicePlan(returnedServicePlan))) 609 Expect(summary.Service).To(Equal(Service(returnedService))) 610 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning")) 611 612 Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(1)) 613 Expect(fakeCloudControllerClient.GetServiceArgsForCall(0)).To(Equal(returnedServicePlan.ServiceGUID)) 614 }) 615 616 When("an error is encountered getting the service bindings", func() { 617 var expectedErr error 618 619 BeforeEach(func() { 620 expectedErr = errors.New("get service bindings error") 621 fakeCloudControllerClient.GetServiceInstanceServiceBindingsReturns( 622 []ccv2.ServiceBinding{}, 623 ccv2.Warnings{"get-service-bindings-warning"}, 624 expectedErr) 625 }) 626 627 It("returns the error and all warnings", func() { 628 Expect(summaryErr).To(MatchError(expectedErr)) 629 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning", "get-service-bindings-warning")) 630 631 Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(Equal(1)) 632 Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 633 }) 634 }) 635 636 When("no errors are encountered getting the service bindings", func() { 637 var returnedServiceBindings []ccv2.ServiceBinding 638 639 BeforeEach(func() { 640 returnedServiceBindings = []ccv2.ServiceBinding{ 641 { 642 GUID: "some-service-binding-1-guid", 643 Name: "some-service-binding-1", 644 AppGUID: "some-app-1-guid", 645 LastOperation: ccv2.LastOperation{Type: "create", State: constant.LastOperationInProgress, Description: "10% complete"}, 646 }, 647 { 648 GUID: "some-service-binding-2-guid", 649 Name: "some-service-binding-2", 650 AppGUID: "some-app-2-guid", 651 LastOperation: ccv2.LastOperation{Type: "delete", State: constant.LastOperationSucceeded, Description: "100% complete"}, 652 }, 653 } 654 fakeCloudControllerClient.GetServiceInstanceServiceBindingsReturns( 655 returnedServiceBindings, 656 ccv2.Warnings{"get-service-bindings-warning"}, 657 nil) 658 }) 659 660 When("an error is encountered getting bound application info", func() { 661 var expectedErr error 662 663 BeforeEach(func() { 664 expectedErr = errors.New("get application error") 665 fakeCloudControllerClient.GetApplicationReturns( 666 ccv2.Application{}, 667 ccv2.Warnings{"get-application-warning"}, 668 expectedErr) 669 }) 670 671 It("returns the error", func() { 672 Expect(summaryErr).To(MatchError(expectedErr)) 673 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning", "get-service-bindings-warning", "get-application-warning")) 674 675 Expect(fakeCloudControllerClient.GetApplicationCallCount()).To(Equal(1)) 676 Expect(fakeCloudControllerClient.GetApplicationArgsForCall(0)).To(Equal(returnedServiceBindings[0].AppGUID)) 677 }) 678 }) 679 680 When("no errors are encountered getting bound application info", func() { 681 BeforeEach(func() { 682 fakeCloudControllerClient.GetApplicationReturnsOnCall( 683 0, 684 ccv2.Application{ 685 GUID: "some-app-1-guid", 686 Name: "some-app-1", 687 }, 688 ccv2.Warnings{"get-application-warning-1"}, 689 nil) 690 fakeCloudControllerClient.GetApplicationReturnsOnCall( 691 1, 692 ccv2.Application{ 693 GUID: "some-app-2-guid", 694 Name: "some-app-2", 695 }, 696 ccv2.Warnings{"get-application-warning-2"}, 697 nil) 698 }) 699 700 It("returns a list of applications bound to the service instance and all warnings", func() { 701 Expect(summaryErr).ToNot(HaveOccurred()) 702 Expect(summary.ServiceInstance).To(Equal(ServiceInstance(returnedServiceInstance))) 703 Expect(summary.ServicePlan).To(Equal(ServicePlan(returnedServicePlan))) 704 Expect(summary.Service).To(Equal(Service(returnedService))) 705 Expect(summary.BoundApplications).To(Equal([]BoundApplication{ 706 { 707 AppName: "some-app-1", 708 ServiceBindingName: "some-service-binding-1", 709 LastOperation: LastOperation{ 710 Type: "create", 711 State: constant.LastOperationInProgress, 712 Description: "10% complete", 713 }, 714 }, 715 { 716 AppName: "some-app-2", 717 ServiceBindingName: "some-service-binding-2", 718 LastOperation: LastOperation{ 719 Type: "delete", 720 State: constant.LastOperationSucceeded, 721 Description: "100% complete", 722 }, 723 }, 724 })) 725 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-feature-flags-warning", "get-service-plan-warning", "get-service-warning", "get-service-bindings-warning", "get-application-warning-1", "get-application-warning-2")) 726 727 Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(Equal(1)) 728 Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 729 730 Expect(fakeCloudControllerClient.GetApplicationCallCount()).To(Equal(2)) 731 Expect(fakeCloudControllerClient.GetApplicationArgsForCall(0)).To(Equal(returnedServiceBindings[0].AppGUID)) 732 Expect(fakeCloudControllerClient.GetApplicationArgsForCall(1)).To(Equal(returnedServiceBindings[1].AppGUID)) 733 734 Expect(fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsCallCount()).To(Equal(0)) 735 }) 736 }) 737 }) 738 }) 739 }) 740 }) 741 742 When("the service instance is a user provided service instance", func() { 743 BeforeEach(func() { 744 returnedServiceInstance = ccv2.ServiceInstance{ 745 GUID: "some-user-provided-service-instance-guid", 746 Name: "some-user-provided-service-instance", 747 Type: constant.UserProvidedService, 748 } 749 fakeCloudControllerClient.GetSpaceServiceInstancesReturns( 750 []ccv2.ServiceInstance{returnedServiceInstance}, 751 ccv2.Warnings{"get-space-service-instance-warning"}, 752 nil) 753 }) 754 755 Context("getting the service bindings errors", func() { 756 BeforeEach(func() { 757 fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsReturns( 758 nil, 759 ccv2.Warnings{"some-get-user-provided-si-bindings-warnings"}, 760 errors.New("some-get-user-provided-si-bindings-error")) 761 }) 762 763 It("should return the error and return all warnings", func() { 764 Expect(summaryErr).To(MatchError("some-get-user-provided-si-bindings-error")) 765 Expect(summaryWarnings).To(ConsistOf("some-get-user-provided-si-bindings-warnings", 766 "get-space-service-instance-warning")) 767 }) 768 }) 769 770 When("no errors are encountered getting the service bindings", func() { 771 var returnedServiceBindings []ccv2.ServiceBinding 772 773 BeforeEach(func() { 774 returnedServiceBindings = []ccv2.ServiceBinding{ 775 { 776 GUID: "some-service-binding-1-guid", 777 Name: "some-service-binding-1", 778 AppGUID: "some-app-1-guid", 779 }, 780 { 781 GUID: "some-service-binding-2-guid", 782 Name: "some-service-binding-2", 783 AppGUID: "some-app-2-guid", 784 }, 785 } 786 fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsReturns( 787 returnedServiceBindings, 788 ccv2.Warnings{"get-service-bindings-warning"}, 789 nil) 790 }) 791 792 When("no errors are encountered getting bound application info", func() { 793 BeforeEach(func() { 794 fakeCloudControllerClient.GetApplicationReturnsOnCall( 795 0, 796 ccv2.Application{ 797 GUID: "some-app-1-guid", 798 Name: "some-app-1", 799 }, 800 ccv2.Warnings{"get-application-warning-1"}, 801 nil) 802 fakeCloudControllerClient.GetApplicationReturnsOnCall( 803 1, 804 ccv2.Application{ 805 GUID: "some-app-2-guid", 806 Name: "some-app-2", 807 }, 808 ccv2.Warnings{"get-application-warning-2"}, 809 nil) 810 }) 811 812 It("returns a list of applications bound to the service instance and all warnings", func() { 813 Expect(summaryErr).ToNot(HaveOccurred()) 814 Expect(summary).To(Equal(ServiceInstanceSummary{ 815 ServiceInstance: ServiceInstance(returnedServiceInstance), 816 BoundApplications: []BoundApplication{ 817 { 818 AppName: "some-app-1", 819 ServiceBindingName: "some-service-binding-1", 820 }, 821 { 822 AppName: "some-app-2", 823 ServiceBindingName: "some-service-binding-2", 824 }, 825 }, 826 })) 827 Expect(summaryWarnings).To(ConsistOf("get-space-service-instance-warning", "get-service-bindings-warning", "get-application-warning-1", "get-application-warning-2")) 828 829 Expect(fakeCloudControllerClient.GetSpaceServiceInstancesCallCount()).To(Equal(1)) 830 spaceGUIDArg, getUserProvidedServicesArg, queriesArg := fakeCloudControllerClient.GetSpaceServiceInstancesArgsForCall(0) 831 Expect(spaceGUIDArg).To(Equal("some-space-guid")) 832 Expect(getUserProvidedServicesArg).To(BeTrue()) 833 Expect(queriesArg).To(HaveLen(1)) 834 Expect(queriesArg[0]).To(Equal(ccv2.Filter{ 835 Type: constant.NameFilter, 836 Operator: constant.EqualOperator, 837 Values: []string{"some-service-instance"}, 838 })) 839 840 Expect(fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsCallCount()).To(Equal(1)) 841 Expect(fakeCloudControllerClient.GetUserProvidedServiceInstanceServiceBindingsArgsForCall(0)).To(Equal(returnedServiceInstance.GUID)) 842 843 Expect(fakeCloudControllerClient.GetApplicationCallCount()).To(Equal(2)) 844 Expect(fakeCloudControllerClient.GetApplicationArgsForCall(0)).To(Equal(returnedServiceBindings[0].AppGUID)) 845 Expect(fakeCloudControllerClient.GetApplicationArgsForCall(1)).To(Equal(returnedServiceBindings[1].AppGUID)) 846 847 Expect(fakeCloudControllerClient.GetServicePlanCallCount()).To(Equal(0)) 848 Expect(fakeCloudControllerClient.GetServiceCallCount()).To(Equal(0)) 849 Expect(fakeCloudControllerClient.GetServiceInstanceServiceBindingsCallCount()).To(Equal(0)) 850 }) 851 }) 852 }) 853 }) 854 }) 855 }) 856 857 Describe("GetServiceInstancesSummaryBySpace", func() { 858 var ( 859 serviceInstancesSummary []ServiceInstanceSummary 860 warnings Warnings 861 executeErr error 862 ) 863 864 JustBeforeEach(func() { 865 serviceInstancesSummary, warnings, executeErr = actor.GetServiceInstancesSummaryBySpace("some-space-GUID") 866 }) 867 868 When("an error is encountered getting a space's summary", func() { 869 var expectedErr error 870 871 BeforeEach(func() { 872 expectedErr = errors.New("summary error") 873 874 fakeCloudControllerClient.GetSpaceSummaryReturns( 875 ccv2.SpaceSummary{}, 876 ccv2.Warnings{"get-by-space-service-instances-warning"}, 877 expectedErr, 878 ) 879 }) 880 881 It("returns the error and all warnings", func() { 882 Expect(executeErr).To(MatchError(expectedErr)) 883 Expect(warnings).To(ConsistOf("get-by-space-service-instances-warning")) 884 }) 885 }) 886 887 When("no errors are encountered getting a space's summary", func() { 888 BeforeEach(func() { 889 fakeCloudControllerClient.GetServicesReturns( 890 []ccv2.Service{ 891 { 892 GUID: "service-guid-1", 893 Label: "service-label", 894 ServiceBrokerName: "some-broker", 895 }, 896 { 897 GUID: "service-guid-2", 898 Label: "service-label", 899 ServiceBrokerName: "other-broker", 900 }, 901 }, 902 ccv2.Warnings{"get-space-services-warning"}, 903 nil, 904 ) 905 fakeCloudControllerClient.GetSpaceSummaryReturns( 906 ccv2.SpaceSummary{ 907 Name: "space-name", 908 Applications: []ccv2.SpaceSummaryApplication{ 909 { 910 Name: "1-app-name", 911 ServiceNames: []string{"managed-service-instance", "user-provided-service-instance"}, 912 }, 913 { 914 Name: "2-app-name", 915 ServiceNames: []string{"managed-service-instance"}, 916 }, 917 }, 918 ServiceInstances: []ccv2.SpaceSummaryServiceInstance{ 919 { 920 Name: "managed-service-instance", 921 MaintenanceInfo: ccv2.MaintenanceInfo{ 922 Version: "2.0.0", 923 }, 924 ServicePlan: ccv2.SpaceSummaryServicePlan{ 925 GUID: "plan-guid", 926 Name: "simple-plan", 927 MaintenanceInfo: ccv2.MaintenanceInfo{ 928 Version: "3.0.0", 929 }, 930 Service: ccv2.SpaceSummaryService{ 931 GUID: "service-guid-1", 932 Label: "service-label", 933 ServiceBrokerName: "some-broker", 934 }, 935 }, 936 LastOperation: ccv2.LastOperation{ 937 Type: "create", 938 State: "succeeded", 939 Description: "a description", 940 }, 941 }, 942 { 943 Name: "user-provided-service-instance", 944 }, 945 }, 946 }, 947 ccv2.Warnings{"get-space-summary-warning"}, 948 nil, 949 ) 950 }) 951 952 It("returns the service instances summary with bound apps and all warnings", func() { 953 Expect(executeErr).NotTo(HaveOccurred()) 954 Expect(warnings).To(ConsistOf("get-space-summary-warning", "get-space-services-warning")) 955 Expect(serviceInstancesSummary).To(Equal([]ServiceInstanceSummary{ 956 { 957 ServiceInstance: ServiceInstance{ 958 Name: "managed-service-instance", 959 Type: constant.ManagedService, 960 LastOperation: ccv2.LastOperation{ 961 Type: "create", 962 State: "succeeded", 963 Description: "a description", 964 }, 965 MaintenanceInfo: ccv2.MaintenanceInfo{ 966 Version: "2.0.0", 967 }, 968 }, 969 ServicePlan: ServicePlan{ 970 Name: "simple-plan", 971 MaintenanceInfo: ccv2.MaintenanceInfo{ 972 Version: "3.0.0", 973 }, 974 }, 975 Service: Service{ 976 Label: "service-label", 977 ServiceBrokerName: "some-broker", 978 }, 979 BoundApplications: []BoundApplication{ 980 {AppName: "1-app-name"}, 981 {AppName: "2-app-name"}, 982 }, 983 }, 984 { 985 ServiceInstance: ServiceInstance{ 986 Name: "user-provided-service-instance", 987 Type: constant.UserProvidedService, 988 }, 989 BoundApplications: []BoundApplication{ 990 {AppName: "1-app-name"}, 991 }, 992 }, 993 }, 994 )) 995 }) 996 997 When("an error is encountered getting all services", func() { 998 BeforeEach(func() { 999 fakeCloudControllerClient.GetServicesReturns( 1000 []ccv2.Service{}, 1001 ccv2.Warnings{"warning-1", "warning-2"}, 1002 errors.New("oops"), 1003 ) 1004 }) 1005 1006 It("returns the error and all warnings", func() { 1007 Expect(executeErr).To(MatchError(errors.New("oops"))) 1008 Expect(warnings).To(ConsistOf("get-space-summary-warning", "warning-1", "warning-2")) 1009 }) 1010 }) 1011 }) 1012 }) 1013 })