diff --git a/app/decorators/field_service_instance_offering_decorator.rb b/app/decorators/field_service_instance_offering_decorator.rb index a7c7ee8d685..d54863bf6b5 100644 --- a/app/decorators/field_service_instance_offering_decorator.rb +++ b/app/decorators/field_service_instance_offering_decorator.rb @@ -1,7 +1,7 @@ module VCAP::CloudController class FieldServiceInstanceOfferingDecorator def self.allowed - Set.new(%w[name guid description documentation_url tags relationships.service_broker]) + Set.new(%w[name guid description documentation_url tags broker_catalog.id relationships.service_broker]) end def self.match?(fields) @@ -16,14 +16,7 @@ def decorate(hash, service_instances) managed_service_instances = service_instances.select(&:managed_instance?) return hash if managed_service_instances.empty? - offerings = Service. - join(:service_plans, service_id: :services__id). - join(:service_instances, service_plan_id: :service_plans__id). - where(service_instances__id: managed_service_instances.map(&:id)). - distinct. - order_by(:services__created_at, :services__guid). - select(:services__label, :services__guid, :services__description, :services__tags, :services__extra, :services__service_broker_id, :services__created_at). - all + offerings = service_offerings(managed_service_instances) hash[:included] ||= {} hash[:included][:service_offerings] = offerings.map do |offering| @@ -33,6 +26,13 @@ def decorate(hash, service_instances) offering_view[:description] = offering.description if @fields.include?('description') offering_view[:tags] = offering.tags if @fields.include?('tags') offering_view[:documentation_url] = extract_documentation_url(offering.extra) if @fields.include?('documentation_url') + + if @fields.include?('broker_catalog.id') + offering_view[:broker_catalog] = { + id: offering.unique_id + } + end + if @fields.include?('relationships.service_broker') offering_view[:relationships] = { service_broker: { @@ -51,6 +51,17 @@ def decorate(hash, service_instances) private + def service_offerings(managed_service_instances) + Service.join(:service_plans, service_id: :services__id). + join(:service_instances, service_plan_id: :service_plans__id). + where(service_instances__id: managed_service_instances.map(&:id)). + distinct. + order_by(:services__created_at, :services__guid). + select(:services__label, :services__guid, :services__description, :services__tags, :services__extra, + :services__service_broker_id, :services__created_at, :services__unique_id). + all + end + def extract_documentation_url(extra) metadata = Oj.load(extra) metadata['documentationUrl'] diff --git a/app/decorators/field_service_instance_plan_decorator.rb b/app/decorators/field_service_instance_plan_decorator.rb index dd1af646a4e..e46b25d3e3f 100644 --- a/app/decorators/field_service_instance_plan_decorator.rb +++ b/app/decorators/field_service_instance_plan_decorator.rb @@ -1,7 +1,7 @@ module VCAP::CloudController class FieldServiceInstancePlanDecorator def self.allowed - Set['guid', 'name', 'relationships.service_offering'] + Set['guid', 'name', 'broker_catalog.id', 'relationships.service_offering'] end def self.match?(fields) @@ -23,6 +23,11 @@ def decorate(hash, service_instances) plan_view = {} plan_view[:guid] = plan.guid if @fields.include?('guid') plan_view[:name] = plan.name if @fields.include?('name') + if @fields.include?('broker_catalog.id') + plan_view[:broker_catalog] = { + id: plan.unique_id + } + end if @fields.include?('relationships.service_offering') plan_view[:relationships] = { service_offering: { diff --git a/app/messages/service_instance_show_message.rb b/app/messages/service_instance_show_message.rb index 9669c0f1452..bba154526dd 100644 --- a/app/messages/service_instance_show_message.rb +++ b/app/messages/service_instance_show_message.rb @@ -7,8 +7,8 @@ class ServiceInstanceShowMessage < BaseMessage allowed: { 'space' => %w[name guid], 'space.organization' => %w[name guid], - 'service_plan' => %w[name guid], - 'service_plan.service_offering' => %w[name guid description tags documentation_url], + 'service_plan' => %w[name guid broker_catalog.id], + 'service_plan.service_offering' => %w[name guid description tags documentation_url broker_catalog.id], 'service_plan.service_offering.service_broker' => %w[name guid] } } diff --git a/app/messages/service_instances_list_message.rb b/app/messages/service_instances_list_message.rb index 0119746c486..940a359571e 100644 --- a/app/messages/service_instances_list_message.rb +++ b/app/messages/service_instances_list_message.rb @@ -28,8 +28,8 @@ class ServiceInstancesListMessage < MetadataListMessage allowed: { 'space' => %w[guid name relationships.organization], 'space.organization' => %w[name guid], - 'service_plan' => %w[guid name relationships.service_offering], - 'service_plan.service_offering' => %w[name guid description documentation_url tags relationships.service_broker], + 'service_plan' => %w[guid name broker_catalog.id relationships.service_offering], + 'service_plan.service_offering' => %w[name guid description documentation_url tags broker_catalog.id relationships.service_broker], 'service_plan.service_offering.service_broker' => %w[name guid] } } diff --git a/docs/v3/source/includes/resources/service_instances/_get.md.erb b/docs/v3/source/includes/resources/service_instances/_get.md.erb index 2e817428223..e62036a9980 100644 --- a/docs/v3/source/includes/resources/service_instances/_get.md.erb +++ b/docs/v3/source/includes/resources/service_instances/_get.md.erb @@ -51,8 +51,8 @@ Resource | Allowed Keys ------------------- | ---- space | `guid`, `name` space.organization | `name`, `guid` -service_plan| `name`, `guid` -service_plan.service_offering| `name`, `guid`, `description`, `documentation_url`, `tags` +service_plan| `name`, `guid`, `broker_catalog.id` +service_plan.service_offering| `name`, `guid`, `description`, `documentation_url`, `tags`, `broker_catalog.id` service_plan.service_offering.service_broker| `name`, `guid` #### Permitted roles diff --git a/docs/v3/source/includes/resources/service_instances/_list.md.erb b/docs/v3/source/includes/resources/service_instances/_list.md.erb index 3cf64034740..ed797faa68e 100644 --- a/docs/v3/source/includes/resources/service_instances/_list.md.erb +++ b/docs/v3/source/includes/resources/service_instances/_list.md.erb @@ -51,8 +51,8 @@ Resource | Allowed Keys ------------------- | ---- space | `guid`, `name`, `relationships.organization` space.organization| `guid`, `name` -service_plan| `guid`, `name`, `relationships.service_offering` -service_plan.service_offering| `guid`, `name`, `description`, `documentation_url`, `tags`, `relationships.service_broker` +service_plan| `guid`, `name`, `broker_catalog.id`, `relationships.service_offering` +service_plan.service_offering| `guid`, `name`, `description`, `documentation_url`, `tags`, `broker_catalog.id`, `relationships.service_broker` service_plan.service_offering.service_broker| `guid`, `name` #### Permitted roles diff --git a/spec/request/service_instances_spec.rb b/spec/request/service_instances_spec.rb index bd427456c3b..1f1aac8c05b 100644 --- a/spec/request/service_instances_spec.rb +++ b/spec/request/service_instances_spec.rb @@ -96,8 +96,8 @@ expect({ included: parsed_response['included'] }).to match_json_response({ included: }) end - it 'can include service plan guid and name fields' do - get "/v3/service_instances/#{guid}?fields[service_plan]=guid,name", nil, admin_headers + it 'can include service plan guid, name and broker catalog fields' do + get "/v3/service_instances/#{guid}?fields[service_plan]=guid,name,broker_catalog.id", nil, admin_headers expect(last_response).to have_status_code(200) @@ -105,7 +105,10 @@ service_plans: [ { guid: instance.service_plan.guid, - name: instance.service_plan.name + name: instance.service_plan.name, + broker_catalog: { + id: instance.service_plan.unique_id + } } ] } @@ -114,7 +117,7 @@ end it 'can include service offering and broker fields' do - get "/v3/service_instances/#{guid}?fields[service_plan.service_offering]=name,guid,description,documentation_url&" \ + get "/v3/service_instances/#{guid}?fields[service_plan.service_offering]=name,guid,description,documentation_url,broker_catalog.id&" \ 'fields[service_plan.service_offering.service_broker]=name,guid', nil, admin_headers expect(last_response).to have_status_code(200) @@ -124,7 +127,10 @@ name: instance.service_plan.service.name, guid: instance.service_plan.service.guid, description: instance.service_plan.service.description, - documentation_url: 'https://some.url.for.docs/' + documentation_url: 'https://some.url.for.docs/', + broker_catalog: { + id: instance.service_plan.service.unique_id + } } ], service_brokers: [ @@ -386,8 +392,8 @@ def check_filtered_instances(*instances) end it 'can include the service plan, offering and broker fields' do - get '/v3/service_instances?fields[service_plan]=guid,name,relationships.service_offering&' \ - 'fields[service_plan.service_offering]=name,guid,description,documentation_url,relationships.service_broker&' \ + get '/v3/service_instances?fields[service_plan]=guid,name,broker_catalog.id,relationships.service_offering&' \ + 'fields[service_plan.service_offering]=name,guid,description,documentation_url,broker_catalog.id,relationships.service_broker&' \ 'fields[service_plan.service_offering.service_broker]=name,guid', nil, admin_headers expect(last_response).to have_status_code(200) @@ -397,6 +403,9 @@ def check_filtered_instances(*instances) { guid: msi_1.service_plan.guid, name: msi_1.service_plan.name, + broker_catalog: { + id: msi_1.service_plan.unique_id + }, relationships: { service_offering: { data: { @@ -408,6 +417,9 @@ def check_filtered_instances(*instances) { guid: msi_2.service_plan.guid, name: msi_2.service_plan.name, + broker_catalog: { + id: msi_2.service_plan.unique_id + }, relationships: { service_offering: { data: { @@ -419,6 +431,9 @@ def check_filtered_instances(*instances) { guid: ssi.service_plan.guid, name: ssi.service_plan.name, + broker_catalog: { + id: ssi.service_plan.unique_id + }, relationships: { service_offering: { data: { @@ -434,6 +449,9 @@ def check_filtered_instances(*instances) guid: msi_1.service_plan.service.guid, description: msi_1.service_plan.service.description, documentation_url: 'https://some.url.for.docs/', + broker_catalog: { + id: msi_1.service_plan.service.unique_id + }, relationships: { service_broker: { data: { @@ -447,6 +465,9 @@ def check_filtered_instances(*instances) guid: msi_2.service_plan.service.guid, description: msi_2.service_plan.service.description, documentation_url: 'https://some.url.for.docs/', + broker_catalog: { + id: msi_2.service_plan.service.unique_id + }, relationships: { service_broker: { data: { @@ -460,6 +481,9 @@ def check_filtered_instances(*instances) guid: ssi.service_plan.service.guid, description: ssi.service_plan.service.description, documentation_url: 'https://some.url.for.docs/', + broker_catalog: { + id: ssi.service_plan.service.unique_id + }, relationships: { service_broker: { data: { diff --git a/spec/support/fakes/blueprints.rb b/spec/support/fakes/blueprints.rb index f70ee3574de..dc89e7b677b 100644 --- a/spec/support/fakes/blueprints.rb +++ b/spec/support/fakes/blueprints.rb @@ -604,6 +604,7 @@ module VCAP::CloudController unique_id { SecureRandom.uuid } active { true } maintenance_info {} + unique_id { SecureRandom.uuid } end ServicePlan.blueprint(:routing) do