Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Async #349

Merged
merged 6 commits into from
Feb 11, 2015
Merged

Async #349

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 22 additions & 13 deletions cf/api/resources/service_instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,31 @@ type ServiceInstanceResource struct {
Entity ServiceInstanceEntity
}

type LastOperation struct {
Type string `json:"type"`
State string `json:"state"`
Description string `json:"description"`
}

type ServiceInstanceEntity struct {
Name string
DashboardUrl string `json:"dashboard_url"`
ServiceBindings []ServiceBindingResource `json:"service_bindings"`
ServicePlan ServicePlanResource `json:"service_plan"`
State string `json:"state"`
StateDescription string `json:"state_description"`
Name string
DashboardUrl string `json:"dashboard_url"`
ServiceBindings []ServiceBindingResource `json:"service_bindings"`
ServicePlan ServicePlanResource `json:"service_plan"`
LastOperation LastOperation `json:"last_operation"`
}

func (resource ServiceInstanceResource) ToFields() (fields models.ServiceInstanceFields) {
fields.Guid = resource.Metadata.Guid
fields.Name = resource.Entity.Name
fields.State = resource.Entity.State
fields.StateDescription = resource.Entity.StateDescription
fields.DashboardUrl = resource.Entity.DashboardUrl
return
func (resource ServiceInstanceResource) ToFields() models.ServiceInstanceFields {
return models.ServiceInstanceFields{
Guid: resource.Metadata.Guid,
Name: resource.Entity.Name,
DashboardUrl: resource.Entity.DashboardUrl,
LastOperation: models.LastOperationFields{
Type: resource.Entity.LastOperation.Type,
State: resource.Entity.LastOperation.State,
Description: resource.Entity.LastOperation.Description,
},
}
}

func (resource ServiceInstanceResource) ToModel() (instance models.ServiceInstance) {
Expand Down
157 changes: 126 additions & 31 deletions cf/api/resources/service_instances_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
)

var _ = Describe("ServiceInstanceResource", func() {
var resource ServiceInstanceResource
var resource, resourceWithNullLastOp ServiceInstanceResource

BeforeEach(func() {
err := json.Unmarshal([]byte(`
Expand All @@ -33,8 +33,11 @@ var _ = Describe("ServiceInstanceResource", func() {
"space_url": "/v2/spaces/fake-space-guid",
"service_plan_url": "/v2/service_plans/fake-service-plan-guid",
"service_bindings_url": "/v2/service_instances/fake-guid/service_bindings",
"state": "creating",
"state_description": "fake state description",
"last_operation": {
"type": "create",
"state": "in progress",
"description": "fake state description"
},
"service_plan": {
"metadata": {
"guid": "fake-service-plan-guid"
Expand All @@ -61,40 +64,132 @@ var _ = Describe("ServiceInstanceResource", func() {
}`), &resource)

Expect(err).ToNot(HaveOccurred())

err = json.Unmarshal([]byte(`
{
"metadata": {
"guid": "fake-guid",
"url": "/v2/service_instances/fake-guid",
"created_at": "2015-01-13T18:52:08+00:00",
"updated_at": null
},
"entity": {
"name": "fake service name",
"credentials": {
},
"service_plan_guid": "fake-service-plan-guid",
"space_guid": "fake-space-guid",
"gateway_data": null,
"dashboard_url": "https://fake/dashboard/url",
"type": "managed_service_instance",
"space_url": "/v2/spaces/fake-space-guid",
"service_plan_url": "/v2/service_plans/fake-service-plan-guid",
"service_bindings_url": "/v2/service_instances/fake-guid/service_bindings",
"last_operation": null,
"service_plan": {
"metadata": {
"guid": "fake-service-plan-guid"
},
"entity": {
"name": "fake-service-plan-name",
"free": true,
"description": "fake-description",
"public": true,
"active": true,
"service_guid": "fake-service-guid"
}
},
"service_bindings": [{
"metadata": {
"guid": "fake-service-binding-guid",
"url": "http://fake/url"
},
"entity": {
"app_guid": "fake-app-guid"
}
}]
}
}`), &resourceWithNullLastOp)

Expect(err).ToNot(HaveOccurred())
})

Describe("#ToFields", func() {
It("unmarshalls the fields of a service instance resource", func() {
fields := resource.ToFields()
Context("Async brokers", func() {
Describe("#ToFields", func() {
It("unmarshalls the fields of a service instance resource", func() {
fields := resource.ToFields()

Expect(fields.Guid).To(Equal("fake-guid"))
Expect(fields.Name).To(Equal("fake service name"))
Expect(fields.DashboardUrl).To(Equal("https://fake/dashboard/url"))
Expect(fields.LastOperation.Type).To(Equal("create"))
Expect(fields.LastOperation.State).To(Equal("in progress"))
Expect(fields.LastOperation.Description).To(Equal("fake state description"))
})
})

Describe("#ToModel", func() {
It("unmarshalls the service instance resource model", func() {
instance := resource.ToModel()

Expect(instance.ServiceInstanceFields.Guid).To(Equal("fake-guid"))
Expect(instance.ServiceInstanceFields.Name).To(Equal("fake service name"))
Expect(instance.ServiceInstanceFields.DashboardUrl).To(Equal("https://fake/dashboard/url"))
Expect(instance.ServiceInstanceFields.LastOperation.Type).To(Equal("create"))
Expect(instance.ServiceInstanceFields.LastOperation.State).To(Equal("in progress"))
Expect(instance.ServiceInstanceFields.LastOperation.Description).To(Equal("fake state description"))

Expect(instance.ServicePlan.Guid).To(Equal("fake-service-plan-guid"))
Expect(instance.ServicePlan.Free).To(BeTrue())
Expect(instance.ServicePlan.Description).To(Equal("fake-description"))
Expect(instance.ServicePlan.Public).To(BeTrue())
Expect(instance.ServicePlan.Active).To(BeTrue())
Expect(instance.ServicePlan.ServiceOfferingGuid).To(Equal("fake-service-guid"))

Expect(fields.Guid).To(Equal("fake-guid"))
Expect(fields.Name).To(Equal("fake service name"))
Expect(fields.DashboardUrl).To(Equal("https://fake/dashboard/url"))
Expect(fields.State).To(Equal("creating"))
Expect(fields.StateDescription).To(Equal("fake state description"))
Expect(instance.ServiceBindings[0].Guid).To(Equal("fake-service-binding-guid"))
Expect(instance.ServiceBindings[0].Url).To(Equal("http://fake/url"))
Expect(instance.ServiceBindings[0].AppGuid).To(Equal("fake-app-guid"))
})
})
})

Describe("#ToModel", func() {
It("unmarshalls the service instance resource model", func() {
instance := resource.ToModel()

Expect(instance.ServiceInstanceFields.Guid).To(Equal("fake-guid"))
Expect(instance.ServiceInstanceFields.Name).To(Equal("fake service name"))
Expect(instance.ServiceInstanceFields.DashboardUrl).To(Equal("https://fake/dashboard/url"))
Expect(instance.ServiceInstanceFields.State).To(Equal("creating"))
Expect(instance.ServiceInstanceFields.StateDescription).To(Equal("fake state description"))

Expect(instance.ServicePlan.Guid).To(Equal("fake-service-plan-guid"))
Expect(instance.ServicePlan.Free).To(BeTrue())
Expect(instance.ServicePlan.Description).To(Equal("fake-description"))
Expect(instance.ServicePlan.Public).To(BeTrue())
Expect(instance.ServicePlan.Active).To(BeTrue())
Expect(instance.ServicePlan.ServiceOfferingGuid).To(Equal("fake-service-guid"))

Expect(instance.ServiceBindings[0].Guid).To(Equal("fake-service-binding-guid"))
Expect(instance.ServiceBindings[0].Url).To(Equal("http://fake/url"))
Expect(instance.ServiceBindings[0].AppGuid).To(Equal("fake-app-guid"))
Context("Old brokers (no last_operation)", func() {
Describe("#ToFields", func() {
It("unmarshalls the fields of a service instance resource", func() {
fields := resourceWithNullLastOp.ToFields()

Expect(fields.Guid).To(Equal("fake-guid"))
Expect(fields.Name).To(Equal("fake service name"))
Expect(fields.DashboardUrl).To(Equal("https://fake/dashboard/url"))
Expect(fields.LastOperation.Type).To(Equal(""))
Expect(fields.LastOperation.State).To(Equal(""))
Expect(fields.LastOperation.Description).To(Equal(""))
})
})

Describe("#ToModel", func() {
It("unmarshalls the service instance resource model", func() {
instance := resourceWithNullLastOp.ToModel()

Expect(instance.ServiceInstanceFields.Guid).To(Equal("fake-guid"))
Expect(instance.ServiceInstanceFields.Name).To(Equal("fake service name"))
Expect(instance.ServiceInstanceFields.DashboardUrl).To(Equal("https://fake/dashboard/url"))

Expect(instance.ServiceInstanceFields.LastOperation.Type).To(Equal(""))
Expect(instance.ServiceInstanceFields.LastOperation.State).To(Equal(""))
Expect(instance.ServiceInstanceFields.LastOperation.Description).To(Equal(""))

Expect(instance.ServicePlan.Guid).To(Equal("fake-service-plan-guid"))
Expect(instance.ServicePlan.Free).To(BeTrue())
Expect(instance.ServicePlan.Description).To(Equal("fake-description"))
Expect(instance.ServicePlan.Public).To(BeTrue())
Expect(instance.ServicePlan.Active).To(BeTrue())
Expect(instance.ServicePlan.ServiceOfferingGuid).To(Equal("fake-service-guid"))

Expect(instance.ServiceBindings[0].Guid).To(Equal("fake-service-binding-guid"))
Expect(instance.ServiceBindings[0].Url).To(Equal("http://fake/url"))
Expect(instance.ServiceBindings[0].AppGuid).To(Equal("fake-app-guid"))
})
})
})
})
18 changes: 12 additions & 6 deletions cf/api/service_summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@ func (resource ServiceInstancesSummaries) ToModels() (instances []models.Service

instance := models.ServiceInstance{}
instance.Name = instanceSummary.Name
instance.State = instanceSummary.State
instance.StateDescription = instanceSummary.StateDescription
instance.LastOperation.Type = instanceSummary.LastOperation.Type
instance.LastOperation.State = instanceSummary.LastOperation.State
instance.LastOperation.Description = instanceSummary.LastOperation.Description
instance.ApplicationNames = applicationNames
instance.ServicePlan = servicePlan
instance.ServiceOffering = serviceOffering
Expand Down Expand Up @@ -59,11 +60,16 @@ type ServiceInstanceSummaryApp struct {
ServiceNames []string `json:"service_names"`
}

type LastOperationSummary struct {
Type string `json:"type"`
State string `json:"state"`
Description string `json:"description"`
}

type ServiceInstanceSummary struct {
Name string
State string
StateDescription string `json:"state_description"`
ServicePlan ServicePlanSummary `json:"service_plan"`
Name string
LastOperation LastOperationSummary `json:"last_operation"`
ServicePlan ServicePlanSummary `json:"service_plan"`
}

type ServicePlanSummary struct {
Expand Down
14 changes: 9 additions & 5 deletions cf/api/service_summary_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,12 @@ var _ = Describe("ServiceSummaryRepository", func() {
"guid": "my-service-instance-guid",
"name": "my-service-instance",
"bound_app_count": 2,
"state": "in progress",
"state_description": "50% done",
"service_plan": {
"last_operation": {
"type": "create",
"state": "in progress",
"description": "50% done"
},
"service_plan": {
"guid": "service-plan-guid",
"name": "spark",
"service": {
Expand Down Expand Up @@ -77,8 +80,9 @@ var _ = Describe("ServiceSummaryRepository", func() {

instance1 := serviceInstances[0]
Expect(instance1.Name).To(Equal("my-service-instance"))
Expect(instance1.State).To(Equal("in progress"))
Expect(instance1.StateDescription).To(Equal("50% done"))
Expect(instance1.LastOperation.Type).To(Equal("create"))
Expect(instance1.LastOperation.State).To(Equal("in progress"))
Expect(instance1.LastOperation.Description).To(Equal("50% done"))
Expect(instance1.ServicePlan.Name).To(Equal("spark"))
Expect(instance1.ServiceOffering.Label).To(Equal("cleardb"))
Expect(instance1.ServiceOffering.Label).To(Equal("cleardb"))
Expand Down
4 changes: 2 additions & 2 deletions cf/api/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ func (repo CloudControllerServiceRepository) CreateServiceInstance(name, planGui
}

func (repo CloudControllerServiceRepository) UpdateServiceInstance(instanceGuid, planGuid string) (err error) {
path := fmt.Sprintf("/v2/service_instances/%s", instanceGuid)
path := fmt.Sprintf("/v2/service_instances/%s?accepts_incomplete=true", instanceGuid)
data := fmt.Sprintf(`{"service_plan_guid":"%s"}`, planGuid)

err = repo.gateway.UpdateResource(repo.config.ApiEndpoint(), path, strings.NewReader(data))
Expand All @@ -163,7 +163,7 @@ func (repo CloudControllerServiceRepository) UpdateServiceInstance(instanceGuid,

func (repo CloudControllerServiceRepository) RenameService(instance models.ServiceInstance, newName string) (apiErr error) {
body := fmt.Sprintf(`{"name":"%s"}`, newName)
path := fmt.Sprintf("/v2/service_instances/%s", instance.Guid)
path := fmt.Sprintf("/v2/service_instances/%s?accepts_incomplete=true", instance.Guid)

if instance.IsUserProvided() {
path = fmt.Sprintf("/v2/user_provided_service_instances/%s", instance.Guid)
Expand Down
6 changes: 3 additions & 3 deletions cf/api/services_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ var _ = Describe("Services Repo", func() {
It("makes the right request", func() {
setupTestServer(testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "PUT",
Path: "/v2/service_instances/instance-guid",
Path: "/v2/service_instances/instance-guid?accepts_incomplete=true",
Matcher: testnet.RequestBodyMatcher(`{"service_plan_guid":"plan-guid"}`),
Response: testnet.TestResponse{Status: http.StatusOK},
}))
Expand All @@ -271,7 +271,7 @@ var _ = Describe("Services Repo", func() {
It("fails", func() {
setupTestServer(testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "PUT",
Path: "/v2/service_instances/instance-guid",
Path: "/v2/service_instances/instance-guid?accepts_incomplete=true",
Matcher: testnet.RequestBodyMatcher(`{"service_plan_guid":"plan-guid"}`),
Response: testnet.TestResponse{Status: http.StatusNotFound},
}))
Expand Down Expand Up @@ -420,7 +420,7 @@ var _ = Describe("Services Repo", func() {
BeforeEach(func() {
setupTestServer(testapi.NewCloudControllerTestRequest(testnet.TestRequest{
Method: "PUT",
Path: "/v2/service_instances/my-service-instance-guid",
Path: "/v2/service_instances/my-service-instance-guid?accepts_incomplete=true",
Matcher: testnet.RequestBodyMatcher(`{"name":"new-name"}`),
Response: testnet.TestResponse{Status: http.StatusCreated},
}))
Expand Down
6 changes: 4 additions & 2 deletions cf/commands/service/create_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,10 @@ func (cmd CreateService) printSuccessMessage(serviceInstanceName string) error {
return apiErr
}

if instance.ServiceInstanceFields.State == "creating" {
cmd.ui.Say(T("Instance status is unavailable (creating). Check status using cf services or cf service {{.ServiceInstanceName}}.",
if instance.ServiceInstanceFields.LastOperation.State == "in progress" {
cmd.ui.Ok()
cmd.ui.Say("")
cmd.ui.Say(T("Create in progress. Use 'cf services' or 'cf service {{.ServiceInstanceName}}' to check operation status.",
map[string]interface{}{"ServiceInstanceName": serviceInstanceName}))
} else {
cmd.ui.Ok()
Expand Down
12 changes: 8 additions & 4 deletions cf/commands/service/create_service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,12 @@ var _ = Describe("create-service command", func() {
BeforeEach(func() {
serviceInstance = models.ServiceInstance{
ServiceInstanceFields: models.ServiceInstanceFields{
Name: "my-cleardb-service",
State: "creating",
StateDescription: "fake service instance description",
Name: "my-cleardb-service",
LastOperation: models.LastOperationFields{
Type: "create",
State: "in progress",
Description: "fake service instance description",
},
},
}
serviceRepo.FindInstanceByNameMap = generic.NewMap()
Expand All @@ -118,10 +121,11 @@ var _ = Describe("create-service command", func() {
Expect(spaceGuid).To(Equal(config.SpaceFields().Guid))
Expect(serviceName).To(Equal("cleardb"))

creatingServiceMessage := fmt.Sprintf("Instance status is unavailable (creating). Check status using cf services or cf service %s.", serviceInstance.ServiceInstanceFields.Name)
creatingServiceMessage := fmt.Sprintf("Create in progress. Use 'cf services' or 'cf service %s' to check operation status.", serviceInstance.ServiceInstanceFields.Name)

Expect(ui.Outputs).To(ContainSubstrings(
[]string{"Creating service", "my-cleardb-service", "my-org", "my-space", "my-user"},
[]string{"OK"},
[]string{creatingServiceMessage},
))
Expect(serviceRepo.CreateServiceInstanceArgs.Name).To(Equal("my-cleardb-service"))
Expand Down
Loading