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  })