github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/api/cloudcontroller/ccv2/service_instance_test.go (about) 1 package ccv2_test 2 3 import ( 4 "net/http" 5 6 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 7 . "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant" 9 . "github.com/onsi/ginkgo" 10 . "github.com/onsi/gomega" 11 . "github.com/onsi/gomega/ghttp" 12 ) 13 14 var _ = Describe("Service Instance", func() { 15 var client *Client 16 17 BeforeEach(func() { 18 client = NewTestClient() 19 }) 20 21 Describe("Bind", func() { 22 Context("when the update is successful", func() { 23 Context("when setting the minimum", func() { // are we **only** encoding the things we want 24 BeforeEach(func() { 25 response := ` 26 { 27 "metadata": { 28 "guid": "some-app-guid" 29 }, 30 "entity": { 31 "name": "some-app-name", 32 "space_guid": "some-space-guid" 33 } 34 }` 35 requestBody := map[string]string{ 36 "name": "some-app-name", 37 "space_guid": "some-space-guid", 38 } 39 server.AppendHandlers( 40 CombineHandlers( 41 VerifyRequest(http.MethodPost, "/v2/apps"), 42 VerifyJSONRepresenting(requestBody), 43 RespondWith(http.StatusCreated, response, http.Header{"X-Cf-Warnings": {"this is a warning"}}), 44 ), 45 ) 46 }) 47 48 It("returns the created object and warnings", func() { 49 app, warnings, err := client.CreateApplication(Application{ 50 Name: "some-app-name", 51 SpaceGUID: "some-space-guid", 52 }) 53 Expect(err).NotTo(HaveOccurred()) 54 55 Expect(app).To(Equal(Application{ 56 GUID: "some-app-guid", 57 Name: "some-app-name", 58 SpaceGUID: "some-space-guid", 59 })) 60 Expect(warnings).To(ConsistOf(Warnings{"this is a warning"})) 61 }) 62 }) 63 }) 64 65 Context("when the create returns an error", func() { 66 BeforeEach(func() { 67 response := ` 68 { 69 "description": "Request invalid due to parse error: Field: name, Error: Missing field name, Field: space_guid, Error: Missing field space_guid", 70 "error_code": "CF-MessageParseError", 71 "code": 1001 72 }` 73 74 server.AppendHandlers( 75 CombineHandlers( 76 VerifyRequest(http.MethodPost, "/v2/apps"), 77 RespondWith(http.StatusBadRequest, response, http.Header{"X-Cf-Warnings": {"this is a warning"}}), 78 ), 79 ) 80 }) 81 82 It("returns the error and warnings", func() { 83 _, warnings, err := client.CreateApplication(Application{}) 84 Expect(err).To(MatchError(ccerror.BadRequestError{Message: "Request invalid due to parse error: Field: name, Error: Missing field name, Field: space_guid, Error: Missing field space_guid"})) 85 Expect(warnings).To(ConsistOf(Warnings{"this is a warning"})) 86 }) 87 }) 88 }) 89 90 Describe("ServiceInstance", func() { 91 Describe("Managed", func() { 92 Context("when type is MANAGED_SERVICE", func() { 93 It("returns false", func() { 94 service := ServiceInstance{Type: constant.ServiceInstanceTypeManagedService} 95 Expect(service.Managed()).To(BeTrue()) 96 }) 97 }) 98 99 Context("when type is USER_PROVIDED_SERVICE", func() { 100 It("returns true", func() { 101 service := ServiceInstance{Type: constant.ServiceInstanceTypeUserProvidedService} 102 Expect(service.Managed()).To(BeFalse()) 103 }) 104 }) 105 }) 106 107 Describe("UserProvided", func() { 108 Context("when type is USER_PROVIDED_SERVICE", func() { 109 It("returns true", func() { 110 service := ServiceInstance{Type: constant.ServiceInstanceTypeUserProvidedService} 111 Expect(service.UserProvided()).To(BeTrue()) 112 }) 113 }) 114 115 Context("when type is MANAGED_SERVICE", func() { 116 It("returns false", func() { 117 service := ServiceInstance{Type: constant.ServiceInstanceTypeManagedService} 118 Expect(service.UserProvided()).To(BeFalse()) 119 }) 120 }) 121 }) 122 }) 123 124 Describe("GetServiceInstance", func() { 125 BeforeEach(func() { 126 response := `{ 127 "metadata": { 128 "guid": "some-service-guid" 129 }, 130 "entity": { 131 "name": "some-service-name", 132 "space_guid": "some-space-guid", 133 "service_guid": "some-service-guid", 134 "service_plan_guid": "some-service-plan-guid", 135 "type": "managed_service_instance", 136 "tags": [ 137 "tag-1", 138 "tag-2" 139 ], 140 "dashboard_url": "some-dashboard-url", 141 "last_operation": { 142 "type": "create", 143 "state": "succeeded", 144 "description": "service broker-provided description", 145 "updated_at": "updated-at-time", 146 "created_at": "created-at-time" 147 } 148 } 149 }` 150 151 server.AppendHandlers( 152 CombineHandlers( 153 VerifyRequest(http.MethodGet, "/v2/service_instances/some-service-guid"), 154 RespondWith(http.StatusOK, response, http.Header{"X-Cf-Warnings": {"this is a warning"}}), 155 ), 156 ) 157 }) 158 159 Context("when service instances exist", func() { 160 It("returns the service instance and warnings", func() { 161 serviceInstance, warnings, err := client.GetServiceInstance("some-service-guid") 162 Expect(err).NotTo(HaveOccurred()) 163 164 Expect(serviceInstance).To(Equal(ServiceInstance{ 165 GUID: "some-service-guid", 166 Name: "some-service-name", 167 SpaceGUID: "some-space-guid", 168 ServiceGUID: "some-service-guid", 169 ServicePlanGUID: "some-service-plan-guid", 170 Type: constant.ServiceInstanceTypeManagedService, 171 Tags: []string{"tag-1", "tag-2"}, 172 DashboardURL: "some-dashboard-url", 173 LastOperation: LastOperation{ 174 Type: "create", 175 State: "succeeded", 176 Description: "service broker-provided description", 177 UpdatedAt: "updated-at-time", 178 CreatedAt: "created-at-time", 179 }, 180 })) 181 Expect(warnings).To(ConsistOf(Warnings{"this is a warning"})) 182 }) 183 }) 184 }) 185 186 Describe("GetServiceInstances", func() { 187 BeforeEach(func() { 188 response1 := `{ 189 "next_url": "/v2/service_instances?q=space_guid:some-space-guid&page=2", 190 "resources": [ 191 { 192 "metadata": { 193 "guid": "some-service-guid-1" 194 }, 195 "entity": { 196 "name": "some-service-name-1", 197 "space_guid": "some-space-guid", 198 "service_guid": "some-service-guid", 199 "type": "managed_service_instance" 200 } 201 }, 202 { 203 "metadata": { 204 "guid": "some-service-guid-2" 205 }, 206 "entity": { 207 "name": "some-service-name-2", 208 "space_guid": "some-space-guid", 209 "type": "managed_service_instance" 210 } 211 } 212 ] 213 }` 214 215 response2 := `{ 216 "next_url": null, 217 "resources": [ 218 { 219 "metadata": { 220 "guid": "some-service-guid-3" 221 }, 222 "entity": { 223 "name": "some-service-name-3", 224 "space_guid": "some-space-guid", 225 "type": "managed_service_instance" 226 } 227 }, 228 { 229 "metadata": { 230 "guid": "some-service-guid-4" 231 }, 232 "entity": { 233 "name": "some-service-name-4", 234 "space_guid": "some-space-guid", 235 "type": "managed_service_instance" 236 } 237 } 238 ] 239 }` 240 241 server.AppendHandlers( 242 CombineHandlers( 243 VerifyRequest(http.MethodGet, "/v2/service_instances", "q=space_guid:some-space-guid"), 244 RespondWith(http.StatusOK, response1, http.Header{"X-Cf-Warnings": {"this is a warning"}}), 245 ), 246 ) 247 248 server.AppendHandlers( 249 CombineHandlers( 250 VerifyRequest(http.MethodGet, "/v2/service_instances", "q=space_guid:some-space-guid&page=2"), 251 RespondWith(http.StatusOK, response2, http.Header{"X-Cf-Warnings": {"this is another warning"}}), 252 ), 253 ) 254 }) 255 256 Context("when service instances exist", func() { 257 It("returns all the queried service instances", func() { 258 serviceInstances, warnings, err := client.GetServiceInstances(Filter{ 259 Type: constant.SpaceGUIDFilter, 260 Operator: constant.EqualOperator, 261 Values: []string{"some-space-guid"}, 262 }) 263 Expect(err).NotTo(HaveOccurred()) 264 265 Expect(serviceInstances).To(ConsistOf([]ServiceInstance{ 266 { 267 Name: "some-service-name-1", 268 GUID: "some-service-guid-1", 269 SpaceGUID: "some-space-guid", 270 ServiceGUID: "some-service-guid", 271 Type: constant.ServiceInstanceTypeManagedService, 272 }, 273 { 274 Name: "some-service-name-2", 275 GUID: "some-service-guid-2", 276 SpaceGUID: "some-space-guid", 277 Type: constant.ServiceInstanceTypeManagedService, 278 }, 279 { 280 Name: "some-service-name-3", 281 GUID: "some-service-guid-3", 282 SpaceGUID: "some-space-guid", 283 Type: constant.ServiceInstanceTypeManagedService, 284 }, 285 { 286 Name: "some-service-name-4", 287 GUID: "some-service-guid-4", 288 SpaceGUID: "some-space-guid", 289 Type: constant.ServiceInstanceTypeManagedService, 290 }, 291 })) 292 Expect(warnings).To(ConsistOf(Warnings{"this is a warning", "this is another warning"})) 293 }) 294 }) 295 }) 296 297 Describe("GetSpaceServiceInstances", func() { 298 Context("including user provided services", func() { 299 BeforeEach(func() { 300 response1 := `{ 301 "next_url": "/v2/spaces/some-space-guid/service_instances?return_user_provided_service_instances=true&q=name:foobar&page=2", 302 "resources": [ 303 { 304 "metadata": { 305 "guid": "some-service-guid-1" 306 }, 307 "entity": { 308 "name": "some-service-name-1", 309 "space_guid": "some-space-guid", 310 "service_guid": "some-service-guid", 311 "type": "managed_service_instance" 312 } 313 }, 314 { 315 "metadata": { 316 "guid": "some-service-guid-2" 317 }, 318 "entity": { 319 "name": "some-service-name-2", 320 "space_guid": "some-space-guid", 321 "type": "user_provided_service_instance" 322 } 323 } 324 ] 325 }` 326 327 response2 := `{ 328 "next_url": null, 329 "resources": [ 330 { 331 "metadata": { 332 "guid": "some-service-guid-3" 333 }, 334 "entity": { 335 "name": "some-service-name-3", 336 "space_guid": "some-space-guid", 337 "type": "managed_service_instance" 338 } 339 }, 340 { 341 "metadata": { 342 "guid": "some-service-guid-4" 343 }, 344 "entity": { 345 "name": "some-service-name-4", 346 "space_guid": "some-space-guid", 347 "type": "user_provided_service_instance" 348 } 349 } 350 ] 351 }` 352 353 server.AppendHandlers( 354 CombineHandlers( 355 VerifyRequest(http.MethodGet, "/v2/spaces/some-space-guid/service_instances", "return_user_provided_service_instances=true&q=name:foobar"), 356 RespondWith(http.StatusOK, response1, http.Header{"X-Cf-Warnings": {"this is a warning"}}), 357 ), 358 ) 359 360 server.AppendHandlers( 361 CombineHandlers( 362 VerifyRequest(http.MethodGet, "/v2/spaces/some-space-guid/service_instances", "return_user_provided_service_instances=true&q=name:foobar&page=2"), 363 RespondWith(http.StatusOK, response2, http.Header{"X-Cf-Warnings": {"this is another warning"}}), 364 ), 365 ) 366 }) 367 368 Context("when service instances exist", func() { 369 It("returns all the queried service instances", func() { 370 serviceInstances, warnings, err := client.GetSpaceServiceInstances("some-space-guid", true, Filter{ 371 Type: constant.NameFilter, 372 Operator: constant.EqualOperator, 373 Values: []string{"foobar"}, 374 }) 375 Expect(err).NotTo(HaveOccurred()) 376 377 Expect(serviceInstances).To(ConsistOf([]ServiceInstance{ 378 {Name: "some-service-name-1", GUID: "some-service-guid-1", SpaceGUID: "some-space-guid", ServiceGUID: "some-service-guid", Type: constant.ServiceInstanceTypeManagedService}, 379 {Name: "some-service-name-2", GUID: "some-service-guid-2", SpaceGUID: "some-space-guid", Type: constant.ServiceInstanceTypeUserProvidedService}, 380 {Name: "some-service-name-3", GUID: "some-service-guid-3", SpaceGUID: "some-space-guid", Type: constant.ServiceInstanceTypeManagedService}, 381 {Name: "some-service-name-4", GUID: "some-service-guid-4", SpaceGUID: "some-space-guid", Type: constant.ServiceInstanceTypeUserProvidedService}, 382 })) 383 Expect(warnings).To(ConsistOf(Warnings{"this is a warning", "this is another warning"})) 384 }) 385 }) 386 }) 387 388 Context("excluding user provided services", func() { 389 BeforeEach(func() { 390 response := `{ 391 "next_url": null, 392 "resources": [ 393 { 394 "metadata": { 395 "guid": "some-service-guid-1" 396 }, 397 "entity": { 398 "name": "some-service-name-1", 399 "space_guid": "some-space-guid", 400 "type": "managed_service_instance" 401 } 402 }, 403 { 404 "metadata": { 405 "guid": "some-service-guid-2" 406 }, 407 "entity": { 408 "name": "some-service-name-2", 409 "space_guid": "some-space-guid", 410 "type": "managed_service_instance" 411 } 412 } 413 ] 414 }` 415 416 server.AppendHandlers( 417 CombineHandlers( 418 VerifyRequest(http.MethodGet, "/v2/spaces/some-space-guid/service_instances", "q=name:foobar"), 419 RespondWith(http.StatusOK, response, http.Header{"X-Cf-Warnings": {"this is a warning"}}), 420 ), 421 ) 422 }) 423 424 Context("when service instances exist", func() { 425 It("returns all the queried service instances", func() { 426 serviceInstances, warnings, err := client.GetSpaceServiceInstances("some-space-guid", false, Filter{ 427 Type: constant.NameFilter, 428 Operator: constant.EqualOperator, 429 Values: []string{"foobar"}, 430 }) 431 Expect(err).NotTo(HaveOccurred()) 432 433 Expect(serviceInstances).To(ConsistOf([]ServiceInstance{ 434 {Name: "some-service-name-1", GUID: "some-service-guid-1", SpaceGUID: "some-space-guid", Type: constant.ServiceInstanceTypeManagedService}, 435 {Name: "some-service-name-2", GUID: "some-service-guid-2", SpaceGUID: "some-space-guid", Type: constant.ServiceInstanceTypeManagedService}, 436 })) 437 Expect(warnings).To(ConsistOf(Warnings{"this is a warning"})) 438 }) 439 }) 440 }) 441 }) 442 443 Describe("GetUserProvidedServiceInstances", func() { 444 var ( 445 serviceInstances []ServiceInstance 446 warnings Warnings 447 executeErr error 448 ) 449 450 JustBeforeEach(func() { 451 serviceInstances, warnings, executeErr = client.GetUserProvidedServiceInstances(Filter{ 452 Type: constant.SpaceGUIDFilter, 453 Operator: constant.EqualOperator, 454 Values: []string{"some-space-guid"}, 455 }) 456 }) 457 458 Context("when getting user provided service instances errors", func() { 459 BeforeEach(func() { 460 response := `{ 461 "code": 1, 462 "description": "some error description", 463 "error_code": "CF-SomeError" 464 }` 465 server.AppendHandlers( 466 CombineHandlers( 467 VerifyRequest(http.MethodGet, "/v2/user_provided_service_instances", "q=space_guid:some-space-guid"), 468 RespondWith(http.StatusTeapot, response, http.Header{"X-Cf-Warnings": {"warning-1, warning-2"}}), 469 ), 470 ) 471 }) 472 473 It("returns the error and all warnings", func() { 474 Expect(executeErr).To(MatchError(ccerror.V2UnexpectedResponseError{ 475 V2ErrorResponse: ccerror.V2ErrorResponse{ 476 Code: 1, 477 Description: "some error description", 478 ErrorCode: "CF-SomeError", 479 }, 480 ResponseCode: http.StatusTeapot, 481 })) 482 483 Expect(warnings).To(ConsistOf("warning-1", "warning-2")) 484 }) 485 }) 486 487 Context("when getting user provided service instances succeeds", func() { 488 BeforeEach(func() { 489 response1 := `{ 490 "next_url": "/v2/user_provided_service_instances?q=space_guid:some-space-guid&page=2", 491 "resources": [ 492 { 493 "metadata": { 494 "guid": "some-service-guid-1" 495 }, 496 "entity": { 497 "name": "some-service-name-1", 498 "space_guid": "some-space-guid", 499 "type": "user_provided_service_instance" 500 } 501 }, 502 { 503 "metadata": { 504 "guid": "some-service-guid-2" 505 }, 506 "entity": { 507 "name": "some-service-name-2", 508 "space_guid": "some-space-guid", 509 "type": "user_provided_service_instance" 510 } 511 } 512 ] 513 }` 514 515 response2 := `{ 516 "next_url": null, 517 "resources": [ 518 { 519 "metadata": { 520 "guid": "some-service-guid-3" 521 }, 522 "entity": { 523 "name": "some-service-name-3", 524 "space_guid": "some-space-guid", 525 "type": "user_provided_service_instance" 526 } 527 }, 528 { 529 "metadata": { 530 "guid": "some-service-guid-4" 531 }, 532 "entity": { 533 "name": "some-service-name-4", 534 "space_guid": "some-space-guid", 535 "type": "user_provided_service_instance" 536 } 537 } 538 ] 539 }` 540 541 server.AppendHandlers( 542 CombineHandlers( 543 VerifyRequest(http.MethodGet, "/v2/user_provided_service_instances", "q=space_guid:some-space-guid"), 544 RespondWith(http.StatusOK, response1, http.Header{"X-Cf-Warnings": {"this is a warning"}}), 545 ), 546 ) 547 548 server.AppendHandlers( 549 CombineHandlers( 550 VerifyRequest(http.MethodGet, "/v2/user_provided_service_instances", "q=space_guid:some-space-guid&page=2"), 551 RespondWith(http.StatusOK, response2, http.Header{"X-Cf-Warnings": {"this is another warning"}}), 552 ), 553 ) 554 }) 555 556 It("returns all the queried service instances", func() { 557 Expect(executeErr).NotTo(HaveOccurred()) 558 559 Expect(serviceInstances).To(ConsistOf([]ServiceInstance{ 560 { 561 Name: "some-service-name-1", 562 GUID: "some-service-guid-1", 563 SpaceGUID: "some-space-guid", 564 Type: constant.ServiceInstanceTypeUserProvidedService, 565 }, 566 { 567 Name: "some-service-name-2", 568 GUID: "some-service-guid-2", 569 SpaceGUID: "some-space-guid", 570 Type: constant.ServiceInstanceTypeUserProvidedService, 571 }, 572 { 573 Name: "some-service-name-3", 574 GUID: "some-service-guid-3", 575 SpaceGUID: "some-space-guid", 576 Type: constant.ServiceInstanceTypeUserProvidedService, 577 }, 578 { 579 Name: "some-service-name-4", 580 GUID: "some-service-guid-4", 581 SpaceGUID: "some-space-guid", 582 Type: constant.ServiceInstanceTypeUserProvidedService, 583 }, 584 })) 585 586 Expect(warnings).To(ConsistOf(Warnings{"this is a warning", "this is another warning"})) 587 }) 588 }) 589 }) 590 })