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