diff --git a/app/models/services/managed_service_instance.rb b/app/models/services/managed_service_instance.rb index 4a01fa11998..a6422567d2c 100644 --- a/app/models/services/managed_service_instance.rb +++ b/app/models/services/managed_service_instance.rb @@ -12,16 +12,16 @@ class ManagedServiceInstance < ServiceInstance export_attributes :name, :credentials, :service_plan_guid, :space_guid, :gateway_data, :dashboard_url, :type, :last_operation, - :tags, :maintenance_info + :tags, :maintenance_info, :broker_metadata import_attributes :name, :service_plan_guid, - :space_guid, :gateway_data, :maintenance_info + :space_guid, :gateway_data, :maintenance_info, :broker_metadata strip_attributes :name plugin :after_initialize - serialize_attributes :json, :maintenance_info + serialize_attributes :json, :maintenance_info, :broker_metadata def validation_policies if space diff --git a/app/presenters/v3/service_instance_presenter.rb b/app/presenters/v3/service_instance_presenter.rb index 0e561bb3046..7916ed635fe 100644 --- a/app/presenters/v3/service_instance_presenter.rb +++ b/app/presenters/v3/service_instance_presenter.rb @@ -50,7 +50,7 @@ def hash_common } }, metadata: { - labels: hashified_labels(service_instance.labels), + labels: merged_labels, annotations: hashified_annotations(service_instance.annotations) }, links: { @@ -77,7 +77,7 @@ def hash_common end def hash_additions_managed - { + hash = { type: 'managed', maintenance_info: maintenance_info, upgrade_available: upgrade_available, @@ -101,6 +101,13 @@ def hash_additions_managed } } } + + # Add broker metadata if present + if service_instance.broker_metadata.present? + hash[:broker_metadata] = service_instance.broker_metadata + end + + hash end def hash_additions_user_provided @@ -145,6 +152,21 @@ def last_operation service_instance.last_operation.to_hash({}) end + + def merged_labels + # Start with existing CF labels + cf_labels = hashified_labels(service_instance.labels) + + # Get broker metadata labels if they exist (only for managed service instances) + broker_labels = {} + if service_instance.is_a?(ManagedServiceInstance) && service_instance.broker_metadata.present? + broker_metadata_labels = service_instance.broker_metadata.dig('labels') + broker_labels = broker_metadata_labels if broker_metadata_labels.is_a?(Hash) + end + + # Merge broker labels into CF labels (broker labels take precedence for conflicts) + cf_labels.merge(broker_labels) + end end end end diff --git a/db/migrations/20251023214733_add_broker_metadata_to_service_instances.rb b/db/migrations/20251023214733_add_broker_metadata_to_service_instances.rb new file mode 100644 index 00000000000..8ab1c04ab21 --- /dev/null +++ b/db/migrations/20251023214733_add_broker_metadata_to_service_instances.rb @@ -0,0 +1,7 @@ +Sequel.migration do + change do + alter_table :service_instances do + add_column :broker_metadata, String, text: true + end + end +end diff --git a/lib/services/service_brokers/v2/client.rb b/lib/services/service_brokers/v2/client.rb index d22433686ae..35e0c9d8711 100644 --- a/lib/services/service_brokers/v2/client.rb +++ b/lib/services/service_brokers/v2/client.rb @@ -56,7 +56,8 @@ def provision(instance, arbitrary_parameters: {}, accepts_incomplete: false, mai return_values = { instance: { credentials: {}, - dashboard_url: parsed_response['dashboard_url'] + dashboard_url: parsed_response['dashboard_url'], + broker_metadata: parsed_response['metadata'] }, last_operation: { type: 'create', @@ -203,6 +204,7 @@ def update(instance, plan, accepts_incomplete: false, arbitrary_parameters: nil, } attributes[:dashboard_url] = dashboard_url if dashboard_url + attributes[:broker_metadata] = parsed_response['metadata'] if parsed_response['metadata'] if state == 'in progress' proposed_changes = { service_plan_guid: plan.guid } diff --git a/lib/services/service_brokers/v2/response_parser.rb b/lib/services/service_brokers/v2/response_parser.rb index 759a3a3d8df..bae5ff51166 100644 --- a/lib/services/service_brokers/v2/response_parser.rb +++ b/lib/services/service_brokers/v2/response_parser.rb @@ -263,6 +263,17 @@ def provision_response_schema 'operation' => { 'type' => 'string', 'maxLength' => 10_000 + }, + 'metadata' => { + 'type' => 'object', + 'properties' => { + 'labels' => { + 'type' => 'object' + }, + 'attributes' => { + 'type' => 'object' + } + } } } }] @@ -292,6 +303,17 @@ def update_response_schema 'operation' => { 'type' => 'string', 'maxLength' => 10_000 + }, + 'metadata' => { + 'type' => 'object', + 'properties' => { + 'labels' => { + 'type' => 'object' + }, + 'attributes' => { + 'type' => 'object' + } + } } } }]