11
12
_endpoint_type = 'metering'
12
13
_endpoint_url = 'publicURL'
16
def _get_total_users(self, cr, uid, ids, field_name, field_value, arg, context=None):
17
records = self.browse(cr, uid, ids)
20
for record in records:
21
# count the number of users
22
result[record.id] = len(record.user_ids)
25
def _get_total_projects(self, cr, uid, ids, field_name, field_value, arg, context=None):
26
records = self.browse(cr, uid, ids)
29
for record in records:
30
# count the number of projects
31
result[record.id] = len(record.project_ids)
34
def _get_total_resources(self, cr, uid, ids, field_name, field_value, arg, context=None):
35
records = self.browse(cr, uid, ids)
38
for record in records:
39
# count the number of users
40
result[record.id] = len(record.resource_ids)
43
def _get_total_meters(self, cr, uid, ids, field_name, field_value, arg, context=None):
44
records = self.browse(cr, uid, ids)
47
for record in records:
48
# count the number of users
49
result[record.id] = len(record.meter_ids)
16
53
'name': fields.char('Subscription name', size=64, required=True),
23
60
'project_ids': fields.one2many('ceilometer.project', 'subscription_id', 'Associated projects'),
24
61
'resource_ids': fields.one2many('ceilometer.resource', 'subscription_id', 'Associated resources'),
25
62
'meter_ids': fields.one2many('ceilometer.meter', 'subscription_id', 'Associated meters'),
63
'total_users': fields.function(_get_total_users, type='integer', method=True, store=False, string='# users'),
64
'total_projects': fields.function(_get_total_projects, type='integer', method=True, store=False, string='# projects'),
65
'total_meters': fields.function(_get_total_meters, type='integer', method=True, store=False, string='# meters'),
66
'total_resources': fields.function(_get_total_resources, type='integer', method=True, store=False, string='# resources')
217
def sync_samples(self, cr, uid, ceil_client, subscription_details, context=None):
219
obj_sample_user = self.pool.get("ceilometer.sample_user")
220
obj_sample_project = self.pool.get("ceilometer.sample_project")
221
obj_sample_resource = self.pool.get("ceilometer.sample_resource")
223
obj_resource = self.pool.get("ceilometer.resource")
224
obj_meter = self.pool.get("ceilometer.meter")
226
# for each meter, get the samples
227
existing_meter_ids = obj_meter.search(cr, uid, [(1, '=', 1)])
228
meter_items = obj_meter.browse(cr, uid, existing_meter_ids)
231
current = (datetime.utcnow() - timedelta(minutes = 5)).isoformat()
232
previous = (datetime.utcnow() - timedelta(minutes = 10)).isoformat()
233
date_range = "start_timestamp="+previous+"&end_timestamp="+current
235
for meter_data in meter_items:
236
# get samples from api
240
if meter_data.resource_id:
241
resource_name = meter_data.resource_id.name
243
path = "v1/resources/"+resource_name+"/meters/"+meter_data.name+"?"+date_range
245
samples = ceil_client.samples._list(path, "events")
246
for sample in samples:
249
"resource_id": meter_data.resource_id.id,
250
"meter_id": meter_data.id,
251
"sum": sample.counter_volume,
252
"start_date": previous,
255
sample_id = obj_sample_resource.create(cr, uid, new_sample, context=context)
257
if meter_data.user_id:
258
user_name = meter_data.user_id.name
260
path = "v1/users/"+user_name+"/meters/"+meter_data.name+"?"+date_range
262
samples = ceil_client.samples._list(path, "events")
263
for sample in samples:
266
"user_id": meter_data.user_id.id,
267
"meter_id": meter_data.id,
268
"sum": sample.counter_volume,
269
"start_date": previous,
272
sample_id = obj_sample_user.create(cr, uid, new_sample, context=context)
274
if meter_data.project_id:
275
resource_name = meter_data.project_id.name
277
path = "v1/projects/"+resource_name+"/meters/"+meter_data.name+"?"+date_range
279
samples = ceil_client.samples._list(path, "events")
280
for sample in samples:
284
"project_id": meter_data.project_id.id,
285
"meter_id": meter_data.id,
286
"sum": sample.counter_volume,
287
"start_date": previous,
290
sample_id = obj_sample_project.create(cr, uid, new_sample, context=context)
176
299
def search_project(self, cr, uid, project_id, context=None):
177
300
existing_project = None
223
346
meters = ceil_client.meters.list()
224
347
for meter in meters:
225
348
content_signature = str(meter.type)+"|"+str(meter.project_id)+"|"+str(meter.user_id)+"|"+str(meter.name)+"|"+str(meter.resource_id)
226
content_hash = md5.new(content_signature).digest()
349
content_hash = base64.b64encode(md5.new(content_signature).digest())
227
350
api_meters.append(content_hash)
229
352
new_api_meter = {"type": meter.type, "project_id": meter.project_id, "user_id": meter.user_id, "name": meter.name, "resource_id": meter.resource_id,
267
def sync_subscription(self, cr, uid, id, context=None):
268
subscription_details = self.browse(cr, uid, id)
390
def sync_subscription(self, cr, uid, ids, context=None):
394
subscription_details = self.browse(cr, uid, ids)
269
395
if subscription_details:
270
396
# test ceilometer client
271
397
ceil_client = self._get_ceilometer_client(subscription_details)
274
400
self.sync_projects(cr, uid, ceil_client, subscription_details, context)
275
401
self.sync_resources(cr, uid, ceil_client, subscription_details, context)
276
402
self.sync_meters(cr, uid, ceil_client, subscription_details, context)
403
self.sync_samples(cr, uid, ceil_client, subscription_details, context)
404
raise openerp.exceptions.Warning("Ceilometer sync finished")
278
406
def sync_subscriptions(self, cr, uid, ids, context=None):
279
407
# if no ids are passed, read all
283
411
for subscription_id in ids:
284
412
self.sync_subscription(cr, uid, subscription_id, context)
286
raise openerp.exceptions.Warning("Ceilometer sync finished")
414
def sync_meters_task(self, cr, uid, ids, context=None):
415
# if no ids are passed, read all
417
ids = self.search(cr, uid, [('active','=',True)])
419
for subscription_id in ids:
420
subscription_details = self.browse(cr, uid, subscription_id)
421
if subscription_details:
422
# test ceilometer client
423
ceil_client = self._get_ceilometer_client(subscription_details)
425
self.sync_samples(cr, uid, ceil_client, subscription_details, context)
288
429
ceilometer_subscription()