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