vcap_services_base 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/base/abstract.rb +11 -0
- data/lib/base/api/message.rb +31 -0
- data/lib/base/asynchronous_service_gateway.rb +529 -0
- data/lib/base/backup.rb +206 -0
- data/lib/base/barrier.rb +54 -0
- data/lib/base/base.rb +159 -0
- data/lib/base/base_async_gateway.rb +164 -0
- data/lib/base/base_job.rb +5 -0
- data/lib/base/catalog_manager_base.rb +67 -0
- data/lib/base/catalog_manager_v1.rb +225 -0
- data/lib/base/catalog_manager_v2.rb +291 -0
- data/lib/base/cloud_controller_services.rb +75 -0
- data/lib/base/datamapper_l.rb +148 -0
- data/lib/base/gateway.rb +167 -0
- data/lib/base/gateway_service_catalog.rb +68 -0
- data/lib/base/http_handler.rb +101 -0
- data/lib/base/job/async_job.rb +71 -0
- data/lib/base/job/config.rb +27 -0
- data/lib/base/job/lock.rb +153 -0
- data/lib/base/job/package.rb +112 -0
- data/lib/base/job/serialization.rb +365 -0
- data/lib/base/job/snapshot.rb +354 -0
- data/lib/base/node.rb +471 -0
- data/lib/base/node_bin.rb +154 -0
- data/lib/base/plan.rb +63 -0
- data/lib/base/provisioner.rb +1120 -0
- data/lib/base/provisioner_v1.rb +125 -0
- data/lib/base/provisioner_v2.rb +193 -0
- data/lib/base/service.rb +93 -0
- data/lib/base/service_advertiser.rb +184 -0
- data/lib/base/service_error.rb +122 -0
- data/lib/base/service_message.rb +94 -0
- data/lib/base/service_plan_change_set.rb +11 -0
- data/lib/base/simple_aop.rb +63 -0
- data/lib/base/snapshot_v2/snapshot.rb +227 -0
- data/lib/base/snapshot_v2/snapshot_client.rb +158 -0
- data/lib/base/snapshot_v2/snapshot_job.rb +95 -0
- data/lib/base/utils.rb +63 -0
- data/lib/base/version.rb +7 -0
- data/lib/base/warden/instance_utils.rb +161 -0
- data/lib/base/warden/node_utils.rb +205 -0
- data/lib/base/warden/service.rb +426 -0
- data/lib/base/worker_bin.rb +76 -0
- data/lib/vcap_services_base.rb +16 -0
- metadata +364 -0
@@ -0,0 +1,125 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (c) 2009-2011 VMware, Inc.
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
5
|
+
require "base/provisioner"
|
6
|
+
|
7
|
+
module VCAP::Services::Base::ProvisionerV1
|
8
|
+
|
9
|
+
attr_accessor :prov_svcs
|
10
|
+
|
11
|
+
# Updates our internal handle state from external v1 handles, e.g., ccdb handles
|
12
|
+
# @param hash handles
|
13
|
+
def update_handles(handles)
|
14
|
+
@logger.info("[#{service_description}] Updating #{handles.size} handles v1")
|
15
|
+
handles.each do |handle|
|
16
|
+
unless verify_handle_format(handle)
|
17
|
+
@logger.warn("Skip not well-formed handle:#{handle}.")
|
18
|
+
next
|
19
|
+
end
|
20
|
+
|
21
|
+
h = handle.deep_dup
|
22
|
+
@prov_svcs[h['service_id']] = {
|
23
|
+
:configuration => h['configuration'],
|
24
|
+
:credentials => h['credentials'],
|
25
|
+
:service_id => h['service_id']
|
26
|
+
}
|
27
|
+
end
|
28
|
+
@logger.info("[#{service_description}] Handles updated")
|
29
|
+
end
|
30
|
+
|
31
|
+
def verify_handle_format(handle)
|
32
|
+
return nil unless handle
|
33
|
+
return nil unless handle.is_a? Hash
|
34
|
+
|
35
|
+
VCAP::Services::Internal::ServiceHandle.new(handle)
|
36
|
+
true
|
37
|
+
rescue => e
|
38
|
+
@logger.warn("Verify handle #{handle} failed:#{e}")
|
39
|
+
return nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def indexing_handles(handles)
|
43
|
+
# instance handles hash's key is service_id, value is handle
|
44
|
+
# binding handles hash's key is credentials name & username, value is handle
|
45
|
+
ins_handles = {}
|
46
|
+
bin_handles = {}
|
47
|
+
|
48
|
+
handles.each do |h|
|
49
|
+
if h["service_id"] == h["credentials"]["name"]
|
50
|
+
ins_handles[h["service_id"]] = h
|
51
|
+
else
|
52
|
+
user = h["credentials"]["username"] || h["credentials"]["user"]
|
53
|
+
next unless user
|
54
|
+
key = h["credentials"]["name"] + user
|
55
|
+
bin_handles[key] = h
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
[ins_handles, bin_handles]
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_instance_id_list(node_id, &blk)
|
63
|
+
@logger.debug("Get instance id list for migration")
|
64
|
+
|
65
|
+
id_list = []
|
66
|
+
@prov_svcs.each do |k, v|
|
67
|
+
id_list << k if (k == v[:credentials]["name"] && node_id == v[:credentials]["node_id"])
|
68
|
+
end
|
69
|
+
blk.call(success(id_list))
|
70
|
+
end
|
71
|
+
|
72
|
+
########
|
73
|
+
# Helpers
|
74
|
+
########
|
75
|
+
|
76
|
+
def get_all_instance_handles
|
77
|
+
instance_handles = @prov_svcs.select {|service_id, entity| service_id.to_s == entity[:credentials]["name"]}
|
78
|
+
instance_handles.each {|service_id, handle| yield handle if block_given?}
|
79
|
+
instance_handles
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_all_binding_handles
|
83
|
+
binding_handles = @prov_svcs.select {|service_id, entity| service_id.to_s != entity[:credentials]["name"]}
|
84
|
+
binding_handles.each {|service_id, handle| yield handle if block_given?}
|
85
|
+
binding_handles
|
86
|
+
end
|
87
|
+
|
88
|
+
def get_instance_handle(instance_id)
|
89
|
+
@prov_svcs[instance_id].deep_dup
|
90
|
+
end
|
91
|
+
|
92
|
+
def get_binding_handle(binding_id)
|
93
|
+
@prov_svcs[binding_id].deep_dup
|
94
|
+
end
|
95
|
+
|
96
|
+
def add_instance_handle(response)
|
97
|
+
@prov_svcs[response[:service_id]] = response
|
98
|
+
end
|
99
|
+
|
100
|
+
def add_binding_handle(response)
|
101
|
+
@prov_svcs[response[:service_id]] = response
|
102
|
+
end
|
103
|
+
|
104
|
+
def delete_instance_handle(instance_handle)
|
105
|
+
@prov_svcs.delete(instance_handle[:service_id])
|
106
|
+
end
|
107
|
+
|
108
|
+
def delete_binding_handle(binding_handle)
|
109
|
+
@prov_svcs.delete(binding_handle[:service_id])
|
110
|
+
end
|
111
|
+
|
112
|
+
def find_instance_bindings(instance_id)
|
113
|
+
binding_handles = []
|
114
|
+
@prov_svcs.each do |_, handle|
|
115
|
+
if handle[:credentials]["name"] == instance_id
|
116
|
+
binding_handles << handle if handle[:service_id] != instance_id
|
117
|
+
end
|
118
|
+
end
|
119
|
+
binding_handles
|
120
|
+
end
|
121
|
+
|
122
|
+
def get_all_handles
|
123
|
+
@prov_svcs.deep_dup
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,193 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (c) 2009-2011 VMware, Inc.
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
5
|
+
require "base/provisioner"
|
6
|
+
|
7
|
+
module VCAP::Services::Base::ProvisionerV2
|
8
|
+
|
9
|
+
attr_accessor :service_instances
|
10
|
+
attr_accessor :service_bindings
|
11
|
+
|
12
|
+
# Updates our internal handle state from external v2 handles, e.g., ccdb handles
|
13
|
+
# @param array handles
|
14
|
+
# handles[0] contains all instance handles
|
15
|
+
# handles[1] contains all binding handles
|
16
|
+
def update_handles(handles)
|
17
|
+
if handles.size == 2
|
18
|
+
@logger.info("[#{service_description}] Updating #{handles[0].size} instance handles and #{handles[1].size} binding handles in v2 api...")
|
19
|
+
update_instance_handles(handles[0])
|
20
|
+
update_binding_handles(handles[1])
|
21
|
+
@logger.info("[#{service_description}] Handles updated")
|
22
|
+
elsif handles.size == 1
|
23
|
+
# this is for the internal update when doing version update and some other updates
|
24
|
+
# and thus it would only be updating either binding or instance handle;
|
25
|
+
# binding handle would have a field of gateway_name but instance handle would not;
|
26
|
+
if handles[0].has_key?('gateway_name')
|
27
|
+
internal_handle = { handles[0]['gateway_name'] => handles[0] }
|
28
|
+
update_binding_handles(internal_handle)
|
29
|
+
else
|
30
|
+
internal_handle = { handles[0]['credentials']['name'] => handles[0] }
|
31
|
+
update_instance_handles(internal_handle)
|
32
|
+
end
|
33
|
+
else
|
34
|
+
raise "unknown handle type in update handles v2"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def update_instance_handles(instance_handles)
|
39
|
+
instance_handles.each do |instance_id, instance_handle|
|
40
|
+
unless verify_instance_handle_format(instance_handle)
|
41
|
+
@logger.warn("Skip not well-formed instance handle:#{instance_handle}.")
|
42
|
+
next
|
43
|
+
end
|
44
|
+
|
45
|
+
handle = instance_handle.deep_dup
|
46
|
+
@service_instances[instance_id] = {
|
47
|
+
:credentials => handle['credentials'],
|
48
|
+
# NOTE on gateway we have have 'configuration' field in instance handle in replacement
|
49
|
+
# of the 'gateway_data' field as in ccdb handle, this is for a easy management/translation
|
50
|
+
# between gateway v1 and v2 provisioner code
|
51
|
+
:configuration => handle['gateway_data'],
|
52
|
+
:gateway_name => handle['credentials']['name'],
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def update_binding_handles(binding_handles)
|
58
|
+
binding_handles.each do |binding_id, binding_handle|
|
59
|
+
unless verify_binding_handle_format(binding_handle)
|
60
|
+
@logger.warn("Skip not well-formed binding handle:#{binding_handle}.")
|
61
|
+
next
|
62
|
+
end
|
63
|
+
|
64
|
+
handle = binding_handle.deep_dup
|
65
|
+
@service_bindings[binding_id] = {
|
66
|
+
:credentials => handle['credentials'],
|
67
|
+
# NOTE on gateway we have have 'configuration' field in binding handle in replacement
|
68
|
+
# of the 'gateway_data' field as in ccdb, this is for a easy management/translation
|
69
|
+
# between gateway v1 and v2 provisioner code
|
70
|
+
:configuration => handle['gateway_data'],
|
71
|
+
:gateway_name => handle['gateway_name'],
|
72
|
+
}
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def verify_instance_handle_format(handle)
|
77
|
+
return nil unless handle
|
78
|
+
return nil unless handle.is_a? Hash
|
79
|
+
|
80
|
+
VCAP::Services::Internal::ServiceInstanceHandleV2.new(handle)
|
81
|
+
true
|
82
|
+
rescue => e
|
83
|
+
@logger.warn("Verify v2 instance handle #{handle} failed:#{e}")
|
84
|
+
return nil
|
85
|
+
end
|
86
|
+
|
87
|
+
def verify_binding_handle_format(handle)
|
88
|
+
return nil unless handle
|
89
|
+
return nil unless handle.is_a? Hash
|
90
|
+
|
91
|
+
VCAP::Services::Internal::ServiceBindingHandleV2.new(handle)
|
92
|
+
true
|
93
|
+
rescue => e
|
94
|
+
@logger.warn("Verify v2 binding handle #{handle} failed:#{e}")
|
95
|
+
return nil
|
96
|
+
end
|
97
|
+
|
98
|
+
# indexing handles for (double) check orphan only
|
99
|
+
# @param: array handles
|
100
|
+
# handles[0] contains an array of instance handles
|
101
|
+
# handles[1] contains an array of binding handles
|
102
|
+
# returns: array of handles which contains two hashes for instance handles and binding handle.
|
103
|
+
def indexing_handles(handles)
|
104
|
+
instance_handles = {}
|
105
|
+
binding_handles = {}
|
106
|
+
handles[0].each { |instance_id, _| instance_handles[instance_id] = nil }
|
107
|
+
handles[1].each do |binding_id, binding_handle|
|
108
|
+
user = binding_handle["credentials"]["username"] || binding_handle["credentials"]["user"]
|
109
|
+
next unless user
|
110
|
+
key = binding_handle["credentials"]["name"] + user
|
111
|
+
binding_handles[key] = nil
|
112
|
+
end
|
113
|
+
[instance_handles, binding_handles]
|
114
|
+
end
|
115
|
+
|
116
|
+
def get_instance_id_list(node_id, &blk)
|
117
|
+
@logger.debug("Get instance id list for migration")
|
118
|
+
|
119
|
+
id_list = []
|
120
|
+
@service_instances.each do |service_id, entity|
|
121
|
+
id_list << service_id if node_id == entity[:credentials]["node_id"]
|
122
|
+
end
|
123
|
+
blk.call(success(id_list))
|
124
|
+
end
|
125
|
+
|
126
|
+
########
|
127
|
+
# Helpers
|
128
|
+
########
|
129
|
+
|
130
|
+
def get_all_instance_handles
|
131
|
+
instance_handles = @service_instances.deep_dup
|
132
|
+
instance_handles.each {|instance_id, handle| yield handle if block_given?}
|
133
|
+
instance_handles
|
134
|
+
end
|
135
|
+
|
136
|
+
def get_all_binding_handles
|
137
|
+
binding_handles = @service_bindings.deep_dup
|
138
|
+
binding_handles.each {|binding_id, handle| yield handle if block_given?}
|
139
|
+
binding_handles
|
140
|
+
end
|
141
|
+
|
142
|
+
def get_instance_handle(instance_id)
|
143
|
+
@service_instances[instance_id].deep_dup
|
144
|
+
end
|
145
|
+
|
146
|
+
def get_binding_handle(binding_id)
|
147
|
+
@service_bindings[binding_id].deep_dup
|
148
|
+
end
|
149
|
+
|
150
|
+
def add_instance_handle(entity)
|
151
|
+
# NOTE this handle contains a subset of the information of the handles in ccdb
|
152
|
+
# the handle will possess the full information after the next fetch handle operation
|
153
|
+
# on the gateway and update the corresponding handle; but these information is sufficient
|
154
|
+
# for current operations
|
155
|
+
@service_instances[entity[:service_id]] = {
|
156
|
+
:credentials => entity[:credentials],
|
157
|
+
:configuration => entity[:configuration],
|
158
|
+
:gateway_name => entity[:service_id],
|
159
|
+
}
|
160
|
+
end
|
161
|
+
|
162
|
+
def add_binding_handle(entity)
|
163
|
+
# NOTE this handle contains a subset of the information of the handles in ccdb
|
164
|
+
# the handle will possess the full information after the next fetch handle operation
|
165
|
+
# on the gateway and update the corresponding handle; but these information is sufficient
|
166
|
+
# for current operations
|
167
|
+
@service_bindings[entity[:service_id]] = {
|
168
|
+
:credentials => entity[:credentials],
|
169
|
+
:configuration => entity[:configuration],
|
170
|
+
:gateway_name => entity[:service_id],
|
171
|
+
}
|
172
|
+
end
|
173
|
+
|
174
|
+
def delete_instance_handle(instance_handle)
|
175
|
+
@service_instances.delete(instance_handle[:credentials]["name"])
|
176
|
+
end
|
177
|
+
|
178
|
+
def delete_binding_handle(binding_handle)
|
179
|
+
@service_bindings.delete(binding_handle[:gateway_name])
|
180
|
+
end
|
181
|
+
|
182
|
+
def find_instance_bindings(instance_id)
|
183
|
+
binding_handles = []
|
184
|
+
@service_bindings.each do |_, handle|
|
185
|
+
binding_handles << handle if handle[:credentials]["name"] == instance_id
|
186
|
+
end
|
187
|
+
binding_handles
|
188
|
+
end
|
189
|
+
|
190
|
+
def get_all_handles
|
191
|
+
@service_instances.merge(@service_bindings).deep_dup
|
192
|
+
end
|
193
|
+
end
|
data/lib/base/service.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
require "base/plan"
|
2
|
+
require "base/service_plan_change_set"
|
3
|
+
|
4
|
+
module VCAP::Services
|
5
|
+
class Service
|
6
|
+
attr_reader :description, :provider, :version, :url, :info_url, :documentation_url, :plans, :tags,
|
7
|
+
:unique_id, :label, :active, :tags, :plan_options, :acls, :timeout,
|
8
|
+
:default_plan, :supported_versions, :version_aliases, :extra, :bindable
|
9
|
+
attr_accessor :guid
|
10
|
+
|
11
|
+
def initialize(attrs)
|
12
|
+
@unique_id = attrs.fetch('unique_id')
|
13
|
+
@label = attrs['label']
|
14
|
+
@active = attrs['active']
|
15
|
+
@active = true if @active.nil?
|
16
|
+
@tags = attrs['tags']
|
17
|
+
@plan_options = attrs['plan_options']
|
18
|
+
@acls = attrs['acls']
|
19
|
+
@timeout = attrs['timeout']
|
20
|
+
@default_plan = attrs['default_plan']
|
21
|
+
@supported_versions = attrs['supported_versions']
|
22
|
+
@version_aliases = attrs['version_aliases']
|
23
|
+
@extra = attrs.fetch('extra')
|
24
|
+
@info_url = attrs['info_url']
|
25
|
+
@documentation_url = attrs['documentation_url']
|
26
|
+
@bindable = attrs.fetch('bindable', true)
|
27
|
+
@guid = attrs['guid']
|
28
|
+
@description = attrs['description']
|
29
|
+
@provider = attrs.fetch('provider')
|
30
|
+
@version = attrs.fetch('version')
|
31
|
+
@url = attrs.fetch('url')
|
32
|
+
@plans = Plan.plan_hash_as_plan_array(attrs.fetch('plans'))
|
33
|
+
@tags = attrs['tags']
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_change_set(service_in_ccdb)
|
37
|
+
|
38
|
+
if service_in_ccdb
|
39
|
+
service_guid = service_in_ccdb.guid
|
40
|
+
plans_to_update = []
|
41
|
+
plans_to_add = []
|
42
|
+
|
43
|
+
self.plans.each do |catalog_plan|
|
44
|
+
ccdb_plan = service_in_ccdb.plans.find { |ccp| catalog_plan.unique_id == ccp.unique_id }
|
45
|
+
ccdb_plan = service_in_ccdb.plans.find { |ccp| catalog_plan.name.to_s == ccp.name.to_s } unless ccdb_plan
|
46
|
+
|
47
|
+
if ccdb_plan
|
48
|
+
catalog_plan.guid = ccdb_plan.guid
|
49
|
+
plans_to_update << catalog_plan
|
50
|
+
else
|
51
|
+
plans_to_add << catalog_plan
|
52
|
+
end
|
53
|
+
end
|
54
|
+
else
|
55
|
+
service_guid = nil
|
56
|
+
plans_to_add = self.plans
|
57
|
+
plans_to_update = []
|
58
|
+
end
|
59
|
+
|
60
|
+
ServicePlanChangeSet.new(self, service_guid,
|
61
|
+
plans_to_add: plans_to_add,
|
62
|
+
plans_to_update: plans_to_update,
|
63
|
+
)
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_hash
|
67
|
+
{
|
68
|
+
"description" => description,
|
69
|
+
"provider" => provider,
|
70
|
+
"version" => version,
|
71
|
+
"url" => url,
|
72
|
+
"documentation_url" => documentation_url,
|
73
|
+
"plans" => Plan.plans_array_to_hash(plans),
|
74
|
+
"unique_id" => unique_id,
|
75
|
+
"label" => label,
|
76
|
+
"active" => active,
|
77
|
+
"acls" => acls,
|
78
|
+
"timeout" => timeout,
|
79
|
+
"extra" => extra,
|
80
|
+
"bindable" => bindable,
|
81
|
+
"tags" => tags
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
def same_tuple?(other)
|
86
|
+
[self.label, self.provider, self.version].each { |x| return false if x.nil? }
|
87
|
+
|
88
|
+
(self.label == other.label &&
|
89
|
+
self.provider == other.provider &&
|
90
|
+
self.version == other.version)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
module VCAP::Services
|
2
|
+
class ServiceAdvertiser
|
3
|
+
attr_reader :logger, :active, :catalog_services, :registered_services
|
4
|
+
|
5
|
+
def initialize(options)
|
6
|
+
@catalog_services = options.fetch(:current_catalog)
|
7
|
+
@registered_services = options.fetch(:catalog_in_ccdb)
|
8
|
+
@http_handler = options.fetch(:http_handler)
|
9
|
+
@logger = options.fetch(:logger)
|
10
|
+
@active = options.fetch(:active, true)
|
11
|
+
@offering_uri = "/v2/services"
|
12
|
+
@service_plans_uri = "/v2/service_plans"
|
13
|
+
|
14
|
+
build_service_lists_and_prepare_guids
|
15
|
+
end
|
16
|
+
|
17
|
+
def advertise_services
|
18
|
+
logger.debug("CCNG Catalog Manager: Registered in ccng: #{registered_services.inspect}")
|
19
|
+
logger.debug("CCNG Catalog Manager: Current catalog: #{catalog_services.inspect}")
|
20
|
+
|
21
|
+
active_services.each do |active_service|
|
22
|
+
service_in_ccdb = registered_services.find do |registered_service|
|
23
|
+
active_service.guid == registered_service.guid
|
24
|
+
end
|
25
|
+
|
26
|
+
service_change_set = active_service.create_change_set(service_in_ccdb)
|
27
|
+
logger.debug("CCNG Catalog Manager: service_change_set = #{service_change_set.inspect}")
|
28
|
+
advertise_service_to_cc(active_service,
|
29
|
+
active_service.guid,
|
30
|
+
service_change_set.plans_to_add,
|
31
|
+
service_change_set.plans_to_update)
|
32
|
+
end
|
33
|
+
|
34
|
+
new_services.each do |service|
|
35
|
+
service_plan_change_set = service.create_change_set(nil)
|
36
|
+
logger.debug("CCNG Catalog Manager: plans_to_add = #{service_plan_change_set.plans_to_add.inspect}")
|
37
|
+
|
38
|
+
logger.debug("CCNG Catalog Manager: Add new offering: #{service.inspect}")
|
39
|
+
advertise_service_to_cc(service, nil, service_plan_change_set.plans_to_add, {}) # nil guid => new service, so add all plans
|
40
|
+
end
|
41
|
+
|
42
|
+
logger.info("CCNG Catalog Manager: Found #{active_services.size} active, #{disabled_count} disabled and #{new_services.size} new service offerings")
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def active_count
|
47
|
+
active ? @catalog_services.size : 0
|
48
|
+
end
|
49
|
+
|
50
|
+
def disabled_count
|
51
|
+
active ? inactive_services.size : registered_services.size
|
52
|
+
end
|
53
|
+
|
54
|
+
def active_services
|
55
|
+
@active_services
|
56
|
+
end
|
57
|
+
|
58
|
+
def inactive_services
|
59
|
+
@inactive_services
|
60
|
+
end
|
61
|
+
|
62
|
+
def new_services
|
63
|
+
@new_services
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def build_service_lists_and_prepare_guids
|
69
|
+
@inactive_services = registered_services.dup
|
70
|
+
@active_services = []
|
71
|
+
@new_services = []
|
72
|
+
|
73
|
+
@catalog_services.each do |service|
|
74
|
+
registered_service = registered_services.find { |rs| service.unique_id == rs.unique_id }
|
75
|
+
|
76
|
+
unless registered_service
|
77
|
+
registered_service = registered_services.find { |rs| service.same_tuple?(rs) }
|
78
|
+
|
79
|
+
if registered_service && service.unique_id
|
80
|
+
logger.warn("CCNG Catalog Manager: Service with unique id #{service.unique_id} in broker catalog matched service with unique id #{registered_service.unique_id} from cloud controller using label-version-provider tuple.")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
if registered_service
|
85
|
+
service.guid = registered_service.guid
|
86
|
+
@active_services << service
|
87
|
+
@inactive_services.delete(registered_service)
|
88
|
+
else
|
89
|
+
@new_services << service
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def add_or_update_offering(offering, guid)
|
95
|
+
update = !guid.nil?
|
96
|
+
uri = update ? "#{@offering_uri}/#{guid}" : @offering_uri
|
97
|
+
service_guid = nil
|
98
|
+
|
99
|
+
logger.debug("CCNG Catalog Manager: #{update ? "Update" : "Advertise"} service offering #{offering.inspect} to cloud_controller: #{uri}")
|
100
|
+
|
101
|
+
offerings_hash = offering.to_hash
|
102
|
+
method = update ? "put" : "post"
|
103
|
+
if method == 'put'
|
104
|
+
offerings_hash.delete('unique_id')
|
105
|
+
end
|
106
|
+
offerings_hash.delete('plans')
|
107
|
+
@http_handler.cc_http_request(:uri => uri,
|
108
|
+
:method => method,
|
109
|
+
:body => Yajl::Encoder.encode(offerings_hash)) do |http|
|
110
|
+
if !http.error
|
111
|
+
if (200..299) === http.response_header.status
|
112
|
+
response = JSON.parse(http.response)
|
113
|
+
logger.info("CCNG Catalog Manager: Advertise offering response (code=#{http.response_header.status}): #{response.inspect}")
|
114
|
+
service_guid = response["metadata"]["guid"]
|
115
|
+
else
|
116
|
+
logger.error("CCNG Catalog Manager: Failed advertise offerings:#{offering.inspect}, status=#{http.response_header.status}")
|
117
|
+
end
|
118
|
+
else
|
119
|
+
logger.error("CCNG Catalog Manager: Failed advertise offerings:#{offering.inspect}: #{http.error}")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
return service_guid
|
124
|
+
end
|
125
|
+
|
126
|
+
def advertise_service_to_cc(service, guid, plans_to_add, plans_to_update)
|
127
|
+
service_guid = add_or_update_offering(service, guid)
|
128
|
+
return false if service_guid.nil?
|
129
|
+
|
130
|
+
return true if !service.active # If deactivating, don't update plans
|
131
|
+
|
132
|
+
logger.debug("CCNG Catalog Manager: Processing plans for: #{service_guid} -Add: #{plans_to_add.size} plans, Update: #{plans_to_update.size} plans")
|
133
|
+
|
134
|
+
plans_to_add.each { |plan|
|
135
|
+
add_plan(plan, service_guid)
|
136
|
+
}
|
137
|
+
|
138
|
+
plans_to_update.each { |plan|
|
139
|
+
update_plan(plan, service_guid)
|
140
|
+
}
|
141
|
+
return true
|
142
|
+
end
|
143
|
+
|
144
|
+
def add_plan(plan, service_guid)
|
145
|
+
uri = @service_plans_uri
|
146
|
+
method = 'post'
|
147
|
+
plan_as_hash = plan.get_add_hash(service_guid)
|
148
|
+
|
149
|
+
logger.info("CCNG Catalog Manager: Add new plan #{plan.inspect} via #{uri}")
|
150
|
+
|
151
|
+
make_plan_request(uri, method, plan_as_hash, plan)
|
152
|
+
end
|
153
|
+
|
154
|
+
def update_plan(plan, service_guid)
|
155
|
+
uri = "#{@service_plans_uri}/#{plan.guid}"
|
156
|
+
method = 'put'
|
157
|
+
plan_as_hash = plan.get_update_hash(service_guid)
|
158
|
+
|
159
|
+
logger.info("CCNG Catalog Manager: Update plan (guid: #{plan.guid}) to #{plan.inspect} via #{uri}")
|
160
|
+
|
161
|
+
make_plan_request(uri, method, plan_as_hash, plan)
|
162
|
+
end
|
163
|
+
|
164
|
+
def make_plan_request(uri, method, plan_as_hash, plan)
|
165
|
+
add_plan = method == 'post'
|
166
|
+
|
167
|
+
@http_handler.cc_http_request(:uri => uri,
|
168
|
+
:method => method,
|
169
|
+
:body => Yajl::Encoder.encode(plan_as_hash)) do |http|
|
170
|
+
if !http.error
|
171
|
+
if (200..299) === http.response_header.status
|
172
|
+
logger.info("CCNG Catalog Manager: Successfully #{add_plan ? "added" : "updated"} service plan: #{plan.inspect}")
|
173
|
+
return true
|
174
|
+
else
|
175
|
+
logger.error("CCNG Catalog Manager: Failed to #{add_plan ? "add" : "update"} plan: #{plan.inspect}, status=#{http.response_header.status}")
|
176
|
+
end
|
177
|
+
else
|
178
|
+
logger.error("CCNG Catalog Manager: Failed to #{add_plan ? "add" : "update"} plan: #{plan.inspect}: #{http.error}")
|
179
|
+
end
|
180
|
+
end
|
181
|
+
return false
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|