vcap_services_base 0.2.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/lib/base/abstract.rb +11 -0
  3. data/lib/base/api/message.rb +31 -0
  4. data/lib/base/asynchronous_service_gateway.rb +529 -0
  5. data/lib/base/backup.rb +206 -0
  6. data/lib/base/barrier.rb +54 -0
  7. data/lib/base/base.rb +159 -0
  8. data/lib/base/base_async_gateway.rb +164 -0
  9. data/lib/base/base_job.rb +5 -0
  10. data/lib/base/catalog_manager_base.rb +67 -0
  11. data/lib/base/catalog_manager_v1.rb +225 -0
  12. data/lib/base/catalog_manager_v2.rb +291 -0
  13. data/lib/base/cloud_controller_services.rb +75 -0
  14. data/lib/base/datamapper_l.rb +148 -0
  15. data/lib/base/gateway.rb +167 -0
  16. data/lib/base/gateway_service_catalog.rb +68 -0
  17. data/lib/base/http_handler.rb +101 -0
  18. data/lib/base/job/async_job.rb +71 -0
  19. data/lib/base/job/config.rb +27 -0
  20. data/lib/base/job/lock.rb +153 -0
  21. data/lib/base/job/package.rb +112 -0
  22. data/lib/base/job/serialization.rb +365 -0
  23. data/lib/base/job/snapshot.rb +354 -0
  24. data/lib/base/node.rb +471 -0
  25. data/lib/base/node_bin.rb +154 -0
  26. data/lib/base/plan.rb +63 -0
  27. data/lib/base/provisioner.rb +1120 -0
  28. data/lib/base/provisioner_v1.rb +125 -0
  29. data/lib/base/provisioner_v2.rb +193 -0
  30. data/lib/base/service.rb +93 -0
  31. data/lib/base/service_advertiser.rb +184 -0
  32. data/lib/base/service_error.rb +122 -0
  33. data/lib/base/service_message.rb +94 -0
  34. data/lib/base/service_plan_change_set.rb +11 -0
  35. data/lib/base/simple_aop.rb +63 -0
  36. data/lib/base/snapshot_v2/snapshot.rb +227 -0
  37. data/lib/base/snapshot_v2/snapshot_client.rb +158 -0
  38. data/lib/base/snapshot_v2/snapshot_job.rb +95 -0
  39. data/lib/base/utils.rb +63 -0
  40. data/lib/base/version.rb +7 -0
  41. data/lib/base/warden/instance_utils.rb +161 -0
  42. data/lib/base/warden/node_utils.rb +205 -0
  43. data/lib/base/warden/service.rb +426 -0
  44. data/lib/base/worker_bin.rb +76 -0
  45. data/lib/vcap_services_base.rb +16 -0
  46. metadata +364 -0
@@ -0,0 +1,5 @@
1
+ # Copyright (c) 2009-2011 VMware, Inc.
2
+ require 'job/config'
3
+ require 'job/snapshot'
4
+ require 'job/serialization'
5
+ require 'job/lock'
@@ -0,0 +1,67 @@
1
+ require 'abstract'
2
+
3
+ module VCAP
4
+ module Services
5
+ class CatalogManagerBase
6
+
7
+ def initialize(opts)
8
+ @proxy_opts = opts[:proxy]
9
+ end
10
+
11
+ def create_http_request(args)
12
+ req = {
13
+ :head => args[:head],
14
+ :body => args[:body],
15
+ }
16
+ if (@proxy_opts)
17
+ req[:proxy] = @proxy_opts
18
+ # this is a workaround for em-http-requesr 0.3.0 so that headers are not lost
19
+ # more info: https://github.com/igrigorik/em-http-request/issues/130
20
+ req[:proxy][:head] = req[:head]
21
+ end
22
+
23
+ f = Fiber.current
24
+ http = EM::HttpRequest.new(args[:uri]).send(args[:method], req)
25
+ if http.error && http.error != ""
26
+ unless args[:need_raise]
27
+ @logger.error("CC Catalog Manager: Failed to connect to CC, the error is #{http.error}")
28
+ return
29
+ else
30
+ raise("CC Catalog Manager: Failed to connect to CC, the error is #{http.error}")
31
+ end
32
+ end
33
+ http.callback { f.resume(http, nil) }
34
+ http.errback { |e| f.resume(http, e) }
35
+ _, error = Fiber.yield
36
+ yield http, error if block_given?
37
+ http
38
+ end
39
+
40
+ abstract :snapshot_and_reset_stats
41
+
42
+ # update_catalog(activate, load_catalog_callback, after_update_callback=nil)
43
+ abstract :update_catalog
44
+
45
+ # generate_cc_advertise_offering_request(svc, active = true)
46
+ abstract :generate_cc_advertise_offering_request
47
+
48
+ # advertise_service_to_cc(svc, active)
49
+ abstract :advertise_service_to_cc
50
+
51
+ # load_registered_services_from_cc
52
+ abstract :load_registered_services_from_cc
53
+
54
+ # delete_offering(id, version, provider)
55
+ abstract :delete_offering
56
+
57
+ ##### Handles processing #####
58
+
59
+ # update_handle_in_cc(service_label, handle, on_success_callback, on_failure_callback)
60
+ abstract :update_handle_in_cc
61
+
62
+ # fetch_handles_from_cc(service_label, after_fetch_callback)
63
+ abstract :fetch_handles_from_cc
64
+
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,225 @@
1
+ require 'fiber'
2
+ require 'nats/client'
3
+ require 'uri'
4
+ require 'catalog_manager_base'
5
+
6
+ module VCAP
7
+ module Services
8
+ class CatalogManagerV1 < VCAP::Services::CatalogManagerBase
9
+
10
+ REQ_OPTS = %w(cloud_controller_uri token gateway_name logger).map {|o| o.to_sym}
11
+
12
+ def initialize(opts)
13
+ super(opts)
14
+
15
+ missing_opts = REQ_OPTS.select {|o| !opts.has_key? o}
16
+ raise ArgumentError, "Missing options: #{missing_opts.join(', ')}" unless missing_opts.empty?
17
+
18
+ @gateway_name = opts[:gateway_name]
19
+
20
+ @cld_ctrl_uri = opts[:cloud_controller_uri]
21
+ @service_list_uri = "#{@cld_ctrl_uri}/proxied_services/v1/offerings"
22
+ @offering_uri = "#{@cld_ctrl_uri}/services/v1/offerings"
23
+ @logger = opts[:logger]
24
+
25
+ token_hdrs = VCAP::Services::Api::GATEWAY_TOKEN_HEADER
26
+ @cc_req_hdrs = {
27
+ 'Content-Type' => 'application/json',
28
+ token_hdrs => opts[:token],
29
+ }
30
+
31
+ @gateway_stats = {}
32
+ @gateway_stats_lock = Mutex.new
33
+ end
34
+
35
+ def snapshot_and_reset_stats
36
+ stats_snapshot = {}
37
+ @gateway_stats_lock.synchronize do
38
+ stats_snapshot = @gateway_stats.dup
39
+ end
40
+ stats_snapshot
41
+ end
42
+
43
+ def get_handles_uri(service_label)
44
+ "#{@cld_ctrl_uri}/services/v1/offerings/#{service_label}/handles"
45
+ end
46
+
47
+ def create_key(label, version, provider)
48
+ "#{label}-#{version}"
49
+ end
50
+
51
+ def update_catalog(activate, load_catalog_callback, after_update_callback = nil)
52
+ f = Fiber.new do
53
+ configured_services = load_catalog_callback.call()
54
+ active_count = 0
55
+ configured_services.values.each { |svc|
56
+ advertise_service_to_cc(svc, activate)
57
+ active_count += 1 if activate
58
+ }
59
+
60
+ @gateway_stats_lock.synchronize do
61
+ @gateway_stats[:active_offerings] = active_count
62
+ end
63
+
64
+ after_update_callback.call if after_update_callback
65
+ end
66
+ f.resume
67
+ end
68
+
69
+ def generate_cc_advertise_offering_request(svc, active = true)
70
+ plans = svc["plans"] if svc["plans"].is_a?(Array)
71
+ if svc["plans"].is_a?(Hash)
72
+ plans = []
73
+ svc["plans"].keys.each { |k| plans << k.to_s }
74
+ end
75
+
76
+ VCAP::Services::Api::ServiceOfferingRequest.new({
77
+ :label => svc["label"],
78
+ :description => svc["description"],
79
+
80
+ :provider => svc["provider"] || 'core',
81
+
82
+ :url => svc["url"],
83
+
84
+ :plans => plans,
85
+ :cf_plan_id => svc["cf_plan_id"],
86
+ :default_plan => svc["default_plan"],
87
+
88
+ :tags => svc["tags"] || [],
89
+
90
+ :active => active,
91
+
92
+ :acls => svc["acls"],
93
+
94
+ :supported_versions => svc["supported_versions"],
95
+ :version_aliases => svc["version_aliases"],
96
+
97
+ :timeout => svc["timeout"],
98
+ }).encode
99
+ end
100
+
101
+ def load_registered_services_from_cc
102
+ @logger.info("CC Catalog Manager: Get registred services from cloud_controller: #{@service_list_uri}")
103
+
104
+ services = {}
105
+ create_http_request(:uri => @service_list_uri, :method => "get", :head => @cc_req_hdrs, :need_raise => true) do |http, error|
106
+ if !error
107
+ if http.response_header.status == 200
108
+ resp = JSON.parse(http.response)
109
+ resp["proxied_services"].each {|svc|
110
+ @logger.info("CC Catalog Manager: Fetch #{@gateway_name} service from CC: label=#{svc["label"]} - #{svc.inspect}")
111
+ services[svc["label"]] = svc
112
+ }
113
+ else
114
+ raise "CC Catalog Manager: Failed to fetch #{@gateway_name} service from CC - status=#{http.response_header.status}"
115
+ end
116
+ else
117
+ raise "CC Catalog Manager: Failed to fetch #{@gateway_name} service from CC: #{http.error}"
118
+ end
119
+ end
120
+
121
+ return services
122
+ end
123
+
124
+ def advertise_service_to_cc(svc, active = true)
125
+ offering = generate_cc_advertise_offering_request(svc, active)
126
+
127
+ @logger.debug("CC Catalog Manager: Advertise service offering #{offering.inspect} to cloud_controller: #{@offering_uri}")
128
+ return false unless offering
129
+
130
+ create_http_request(:uri => @offering_uri, :method => "post", :head => @cc_req_hdrs, :body => offering) do |http, error|
131
+ if !error
132
+ if http.response_header.status == 200
133
+ @logger.info("CC Catalog Manager: Successfully advertised offering: #{offering.inspect}")
134
+ return true
135
+ else
136
+ @logger.error("CC Catalog Manager: Failed to advertise offerings:#{offering.inspect}, status=#{http.response_header.status}")
137
+ end
138
+ else
139
+ @logger.error("CC Catalog Manager: Failed to advertise offerings:#{offering.inspect}: #{http.error}")
140
+ end
141
+ end
142
+ return false
143
+ end
144
+
145
+ def delete_offering(id, version, provider)
146
+ # See: https://github.com/cloudfoundry/cloud_controller/blob/master/cloud_controller/config/routes.rb
147
+ offering_id = "#{id}-#{version}/#{provider}"
148
+ uri = "#{@offering_uri}/#{offering_id}"
149
+ @logger.info("CC Catalog Manager: Delete service offering: #{offering_id}")
150
+
151
+ create_http_request(:uri => uri, :method => "delete", :head => @cc_req_hdrs) do |http, error|
152
+ if !error
153
+ if http.response_header.status == 200
154
+ @logger.info("CC Catalog Manager: Successfully deleted offering: #{offering_id}")
155
+ return true
156
+ else
157
+ @logger.warn("CC Catalog Manager: Failed to delete offering: #{offering_id}, status: #{http.response_header.status}")
158
+ end
159
+ else
160
+ @logger.warn("CC Catalog Manager: Failed to delete offering: #{offering_id} due to: #{http.error}")
161
+ end
162
+ end
163
+ return false
164
+ end
165
+
166
+ ###### Handles processing #####
167
+
168
+ def fetch_handles_from_cc(service_label, after_fetch_callback)
169
+ return if @fetching_handles
170
+
171
+ handles_uri = get_handles_uri(service_label)
172
+
173
+ @logger.info("CC Catalog Manager: Fetching handles from cloud controller: #{handles_uri}")
174
+ @fetching_handles = true
175
+
176
+ create_http_request(:uri => handles_uri, :method => "get", :head => @cc_req_hdrs) do |http, error|
177
+ @fetching_handles = false
178
+
179
+ if !error
180
+ if http.response_header.status == 200
181
+ @logger.info("CC Catalog Manager: Successfully fetched handles")
182
+
183
+ begin
184
+ resp = VCAP::Services::Api::ListHandlesResponse.decode(http.response)
185
+ after_fetch_callback.call(resp) if after_fetch_callback
186
+ rescue => e
187
+ @logger.error("CC Catalog Manager: Error decoding reply from gateway: #{e}")
188
+ end
189
+ else
190
+ @logger.error("CC Catalog Manager: Failed fetching handles, status=#{http.response_header.status}")
191
+ end
192
+ else
193
+ @logger.error("CC Catalog Manager: Failed fetching handles: #{http.error}")
194
+ end
195
+ end
196
+ end
197
+
198
+ def update_handle_in_cc(service_label, handle, on_success_callback, on_failure_callback)
199
+ @logger.debug("CC Catalog Manager: Update service handle: #{handle.inspect}")
200
+ if not handle
201
+ on_failure_callback.call if on_failure_callback
202
+ return
203
+ end
204
+
205
+ uri = "#{get_handles_uri(service_label)}/#{handle["service_id"]}"
206
+
207
+ create_http_request(:uri => uri, method => "post", :head => @cc_req_hdrs, :body => Yajl::Encoder.encode(handle)) do |http, error|
208
+ if !error
209
+ if http.response_header.status == 200
210
+ @logger.info("CC Catalog Manager: Successful update handle #{handle["service_id"]}")
211
+ on_success_callback.call if on_success_callback
212
+ else
213
+ @logger.error("CC Catalog Manager: Failed to update handle #{handle["service_id"]}: http status #{http.response_header.status}")
214
+ on_failure_callback.call if on_failure_callback
215
+ end
216
+ else
217
+ @logger.error("CC Catalog Manager: Failed to update handle #{handle["service_id"]}: #{http.error}")
218
+ on_failure_callback.call if on_failure_callback
219
+ end
220
+ end
221
+ end
222
+
223
+ end
224
+ end
225
+ end
@@ -0,0 +1,291 @@
1
+ require 'fiber'
2
+ require 'nats/client'
3
+ require 'uri'
4
+ require 'uaa'
5
+ require 'services/api/const'
6
+ require 'catalog_manager_base'
7
+ require 'base/cloud_controller_services'
8
+ require 'base/http_handler'
9
+ require 'base/service_advertiser'
10
+
11
+ module VCAP
12
+ module Services
13
+ class CatalogManagerV2 < VCAP::Services::CatalogManagerBase
14
+ attr_reader :logger
15
+
16
+ def initialize(opts)
17
+ super(opts)
18
+
19
+ @opts = opts
20
+ @test_mode = opts[:test_mode] || false
21
+
22
+ required_opts = %w(cloud_controller_uri token gateway_name logger).map { |o| o.to_sym }
23
+ required_opts.concat( %w(uaa_endpoint uaa_client_id uaa_client_auth_credentials).map { |o| o.to_sym } ) if !@test_mode
24
+
25
+ missing_opts = required_opts.select {|o| !opts.has_key? o}
26
+ raise ArgumentError, "Missing options: #{missing_opts.join(', ')}" unless missing_opts.empty?
27
+
28
+ @gateway_name = opts[:gateway_name]
29
+ @cld_ctrl_uri = opts[:cloud_controller_uri]
30
+ @service_list_uri = "/v2/services?inline-relations-depth=2"
31
+
32
+ @service_instances_uri = "/v2/service_instances"
33
+ @service_bindings_uri = "/v2/service_bindings"
34
+ @handle_guid = {}
35
+
36
+ @logger = opts[:logger]
37
+
38
+ @gateway_stats = {}
39
+ @gateway_stats_lock = Mutex.new
40
+ snapshot_and_reset_stats
41
+ @http_handler = HTTPHandler.new(opts)
42
+ @multiple_page_getter = CloudControllerServices.new(
43
+ @http_handler.method(:cc_http_request),
44
+ @http_handler.cc_req_hdrs,
45
+ @logger)
46
+ end
47
+
48
+ def create_key(label, version, provider)
49
+ "#{label}_#{provider}"
50
+ end
51
+
52
+ ######### Stats Handling #########
53
+
54
+ def snapshot_and_reset_stats
55
+ stats_snapshot = {}
56
+ @gateway_stats_lock.synchronize do
57
+ stats_snapshot = @gateway_stats.dup
58
+
59
+ @gateway_stats[:refresh_catalog_requests] = 0
60
+ @gateway_stats[:refresh_catalog_failures] = 0
61
+ @gateway_stats[:refresh_cc_services_requests] = 0
62
+ @gateway_stats[:refresh_cc_services_failures] = 0
63
+ @gateway_stats[:advertise_services_requests] = 0
64
+ @gateway_stats[:advertise_services_failures] = 0
65
+ end
66
+ stats_snapshot
67
+ end
68
+
69
+ def update_stats(op_name, failed)
70
+ op_key = "#{op_name}_requests".to_sym
71
+ op_failure_key = "#{op_name}_failures".to_sym
72
+
73
+ @gateway_stats_lock.synchronize do
74
+ @gateway_stats[op_key] += 1
75
+ @gateway_stats[op_failure_key] += 1 if failed
76
+ end
77
+ end
78
+
79
+ ######### Catalog update functionality #######
80
+ def update_catalog(activate, catalog_loader, after_update_callback = nil)
81
+ f = Fiber.new do
82
+ # Load offering from ccdb
83
+ logger.info("CCNG Catalog Manager: Loading services from CC")
84
+ failed = false
85
+ begin
86
+ catalog_in_ccdb = load_registered_services_from_cc
87
+
88
+ rescue => e
89
+ failed = true
90
+ logger.error("CCNG Catalog Manager: Failed to get currently advertized offerings from cc: #{e.inspect}")
91
+ logger.error(e.backtrace)
92
+ ensure
93
+ update_stats("refresh_cc_services", failed)
94
+ end
95
+
96
+ # Load current catalog (e.g. config, external marketplace etc...)
97
+ logger.info("CCNG Catalog Manager: Loading current catalog...")
98
+ failed = false
99
+ begin
100
+ current_catalog = catalog_loader.call().values.collect do |service_hash|
101
+ label, _ = VCAP::Services::Api::Util.parse_label(service_hash.fetch('label'))
102
+ Service.new(service_hash.merge('label' => label))
103
+ end
104
+ rescue => e1
105
+ failed = true
106
+ logger.error("CCNG Catalog Manager: Failed to get latest service catalog: #{e1.inspect}")
107
+ logger.error(e1.backtrace)
108
+ ensure
109
+ update_stats("refresh_catalog", failed)
110
+ end
111
+
112
+ # Update
113
+ logger.info("CCNG Catalog Manager: Updating Offerings...")
114
+ advertise_services(current_catalog, catalog_in_ccdb, activate)
115
+
116
+ # Post-update processing
117
+ if after_update_callback
118
+ logger.info("CCNG Catalog Manager: Invoking after update callback...")
119
+ after_update_callback.call()
120
+ end
121
+ end
122
+ f.resume
123
+ end
124
+
125
+ def load_registered_services_from_cc
126
+ @multiple_page_getter.load_registered_services(@service_list_uri)
127
+ end
128
+
129
+ def fetch_handles_from_cc(service_label, after_fetch_callback)
130
+ logger.info("CCNG Catalog Manager:(v2) Fetching all handles from cloud controller...")
131
+ return unless after_fetch_callback
132
+
133
+ instance_handles = fetch_all_instance_handles_from_cc
134
+ binding_handles = fetch_all_binding_handles_from_cc(instance_handles)
135
+ logger.info("CCNG Catalog Manager:(v2) Successfully fetched all handles from cloud controller...")
136
+
137
+ handles = [instance_handles, binding_handles]
138
+ handles = VCAP::Services::Api::ListHandlesResponse.decode(Yajl::Encoder.encode({:handles => handles}))
139
+ after_fetch_callback.call(handles) if after_fetch_callback
140
+ end
141
+
142
+ def update_handle_uri(handle)
143
+ if handle['gateway_name'] == handle['credentials']['name']
144
+ return "#{@service_instances_uri}/internal/#{handle['gateway_name']}"
145
+ else
146
+ return "#{@service_bindings_uri}/internal/#{handle['gateway_name']}"
147
+ end
148
+ end
149
+
150
+ def update_handle_in_cc(service_label, handle, on_success_callback, on_failure_callback)
151
+ logger.debug("CCNG Catalog Manager:(v1) Update service handle: #{handle.inspect}")
152
+ if not handle
153
+ on_failure_callback.call if on_failure_callback
154
+ return
155
+ end
156
+
157
+ uri = update_handle_uri(handle)
158
+
159
+ # replace the "configuration" field with "gateway_data", and remove "gateway_name" for the internal update
160
+ handle["gateway_data"] = handle.delete("configuration")
161
+ handle.delete("gateway_name")
162
+
163
+ # manipulate handle to be a handle that is acceptable to ccng
164
+ cc_handle = {
165
+ "token" => @service_auth_tokens.values[0],
166
+ "credentials" => handle["credentials"],
167
+ "gateway_data" => handle["gateway_data"],
168
+ }
169
+
170
+ cc_http_request(:uri => uri,
171
+ :method => "put",
172
+ :head => @cc_req_hdrs,
173
+ :body => Yajl::Encoder.encode(cc_handle)) do |http|
174
+ if ! http.error
175
+ if http.response_header.status == 200
176
+ logger.info("CCNG Catalog Manager:(v2) Successful update handle #{handle["service_id"]}")
177
+ on_success_callback.call if on_success_callback
178
+ else
179
+ logger.error("CCNG Catalog Manager:(v2) Failed to update handle #{handle["service_id"]}: http status #{http.response_header.status}")
180
+ on_failure_callback.call if on_failure_callback
181
+ end
182
+ else
183
+ logger.error("CCNG Catalog Manager:(v2) Failed to update handle #{handle["service_id"]}: #{http.error}")
184
+ on_failure_callback.call if on_failure_callback
185
+ end
186
+ end
187
+ end
188
+
189
+ private
190
+ def fetch_all_instance_handles_from_cc
191
+ logger.info("CCNG Catalog Manager:(v2) Fetching all service instance handles from cloud controller: #{@cld_ctrl_uri}#{@service_instance_uri}")
192
+ instance_handle_list = {}
193
+
194
+ registered_services = load_registered_services_from_cc
195
+
196
+ registered_services.each do |registered_service|
197
+ registered_service.plans.each do |plan_details|
198
+ plan_guid = plan_details.guid
199
+ instance_handles_query = "?q=service_plan_guid:#{plan_guid}"
200
+ instance_handles = fetch_instance_handles_from_cc(instance_handles_query)
201
+ instance_handle_list.merge!(instance_handles) if instance_handles
202
+ end
203
+ end
204
+ logger.info("CCNG Catalog Manager:(v2) Successfully fetched all service instance handles from cloud controller: #{@cld_ctrl_uri}#{@service_instance_uri}")
205
+ instance_handle_list
206
+ end
207
+
208
+ # fetch instance handles from cloud_controller_ng
209
+ # this function allows users to get a dedicated set of instance handles
210
+ # from cloud_controller_ng using a customized query for /v2/service_binding api
211
+ #
212
+ # @param string instance_handles_query
213
+ def fetch_instance_handles_from_cc(instance_handles_query)
214
+ logger.info("CCNG Catalog Manager:(v2) Fetching service instance handles from cloud controller: #{@cld_ctrl_uri}#{@service_instance_uri}#{instance_handles_query}")
215
+
216
+ instance_handles = {}
217
+ # currently we are fetching all the service instances from different plans;
218
+ # TODO: add a query parameter in ccng v2 to support a query from service name to instance handle;
219
+ service_instance_uri = "#{@service_instances_uri}#{instance_handles_query}"
220
+
221
+ @multiple_page_getter.each(service_instance_uri, "service instance handles") do |resources|
222
+ instance_info = resources['entity']
223
+ instance_handles[instance_info['credentials']['name']] = instance_info
224
+ @handle_guid[instance_info['credentials']['name']] = resources['metadata']['guid']
225
+ end
226
+ instance_handles
227
+ rescue => e
228
+ logger.error("CCNG Catalog Manager:(v2) Error decoding reply from gateway: #{e.backtrace}")
229
+ end
230
+
231
+ def fetch_all_binding_handles_from_cc(instance_handles)
232
+ logger.info("CCNG Catalog Manager:(v2) Fetching all service binding handles from cloud controller: #{@cld_ctrl_uri}#{@service_instance_uri}")
233
+ binding_handles_list = {}
234
+
235
+ # currently we will fetch each binding handle according to instance handle
236
+ # TODO: add a query parameter in ccng v2 to support query from service name to binding handle;
237
+ instance_handles.each do |instance_id, _|
238
+ binding_handles_query = "?q=service_instance_guid:#{@handle_guid[instance_id]}"
239
+ binding_handles = fetch_binding_handles_from_cc(binding_handles_query)
240
+ binding_handles_list.merge!(binding_handles) if binding_handles
241
+ end
242
+ logger.info("CCNG Catalog Manager:(v2) Successfully fetched all service binding handles from cloud controller: #{@cld_ctrl_uri}#{@service_instance_uri}")
243
+ binding_handles_list
244
+ end
245
+
246
+ # fetch binding handles from cloud_controller_ng
247
+ # this function allows users to get a dedicated set of binding handles
248
+ # from cloud_controller_ng using a customized query for /v2/service_binding api
249
+ #
250
+ # @param string binding_handles_query
251
+ def fetch_binding_handles_from_cc(binding_handles_query)
252
+ logger.info("CCNG Catalog Manager:(v2) Fetching service binding handles from cloud controller: #{@cld_ctrl_uri}#{@service_bindings_uri}#{binding_handles_query}")
253
+
254
+ binding_handles = {}
255
+ binding_handles_uri = "#{@service_bindings_uri}#{binding_handles_query}"
256
+
257
+ @multiple_page_getter.each(binding_handles_uri, "service binding handles") do |resources|
258
+ binding_info = resources['entity']
259
+ binding_handles[binding_info['gateway_name']] = binding_info
260
+ @handle_guid[binding_info['gateway_name']] = resources['metadata']['guid']
261
+ end
262
+ binding_handles
263
+ rescue => e
264
+ logger.error("CCNG Catalog Manager:(v2) Error decoding reply from gateway: #{e}")
265
+ end
266
+
267
+ def advertise_services(current_catalog, catalog_in_ccdb, active=true)
268
+ logger.info("CCNG Catalog Manager: #{active ? "Activate" : "Deactivate"} services...")
269
+
270
+ if !(current_catalog && catalog_in_ccdb)
271
+ logger.warn("CCNG Catalog Manager: Cannot advertise services since the offerings list from either the catalog or ccdb could not be retrieved")
272
+ return
273
+ end
274
+
275
+ service_advertiser = ServiceAdvertiser.new(
276
+ current_catalog: current_catalog,
277
+ catalog_in_ccdb: catalog_in_ccdb,
278
+ http_handler: @http_handler,
279
+ logger: logger,
280
+ active: active
281
+ )
282
+ service_advertiser.advertise_services
283
+
284
+ @gateway_stats_lock.synchronize do
285
+ @gateway_stats[:active_offerings] = service_advertiser.active_count
286
+ @gateway_stats[:disabled_services] = service_advertiser.disabled_count
287
+ end
288
+ end
289
+ end
290
+ end
291
+ end