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.
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,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
@@ -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