~yolanda.robla/+junk/ceilometer_openerp

« back to all changes in this revision

Viewing changes to ceilometer_configuration.py

  • Committer: yolanda.robla at canonical
  • Date: 2013-01-08 13:51:06 UTC
  • Revision ID: yolanda.robla@canonical.com-20130108135106-5q9wf1nopjwf50uy
first beta version

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
from ceilometerclient import exc
4
4
from ceilometerclient import client as ceilometerclient
5
5
import openerp.exceptions
6
 
import md5
 
6
import md5, base64
 
7
from datetime import datetime, timedelta
7
8
 
8
9
class ceilometer_subscription(osv.osv):
9
10
    _description = 'Ceilometer subscription configuration'
11
12
    _endpoint_type = 'metering'
12
13
    _endpoint_url = 'publicURL'
13
14
    _api_version = '1'
 
15
 
 
16
    def _get_total_users(self, cr, uid, ids, field_name, field_value, arg, context=None):
 
17
        records = self.browse(cr, uid, ids)
 
18
        result = {}
 
19
 
 
20
        for record in records:
 
21
            # count the number of users
 
22
            result[record.id] = len(record.user_ids)
 
23
        return result
 
24
 
 
25
    def _get_total_projects(self, cr, uid, ids, field_name, field_value, arg, context=None):
 
26
        records = self.browse(cr, uid, ids)
 
27
        result = {}
 
28
 
 
29
        for record in records:
 
30
            # count the number of projects
 
31
            result[record.id] = len(record.project_ids)
 
32
        return result
 
33
 
 
34
    def _get_total_resources(self, cr, uid, ids, field_name, field_value, arg, context=None):
 
35
        records = self.browse(cr, uid, ids)
 
36
        result = {}
 
37
 
 
38
        for record in records:
 
39
            # count the number of users
 
40
            result[record.id] = len(record.resource_ids)
 
41
        return result
 
42
 
 
43
    def _get_total_meters(self, cr, uid, ids, field_name, field_value, arg, context=None):
 
44
        records = self.browse(cr, uid, ids)
 
45
        result = {}
 
46
 
 
47
        for record in records:
 
48
            # count the number of users
 
49
            result[record.id] = len(record.meter_ids)
 
50
        return result
14
51
    
15
52
    _columns = {
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')
26
67
    }
27
68
 
28
69
    _defaults = {
173
214
            print e
174
215
            return False
175
216
 
 
217
    def sync_samples(self, cr, uid, ceil_client, subscription_details, context=None):
 
218
        try:
 
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")
 
222
 
 
223
            obj_resource = self.pool.get("ceilometer.resource")
 
224
            obj_meter = self.pool.get("ceilometer.meter")
 
225
 
 
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)
 
229
 
 
230
            # timestamp
 
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     
 
234
 
 
235
            for meter_data in meter_items:
 
236
                # get samples from api
 
237
                api_samples = []
 
238
 
 
239
                # search related ids
 
240
                if meter_data.resource_id:
 
241
                    resource_name = meter_data.resource_id.name
 
242
 
 
243
                    path = "v1/resources/"+resource_name+"/meters/"+meter_data.name+"?"+date_range
 
244
 
 
245
                    samples = ceil_client.samples._list(path, "events")
 
246
                    for sample in samples:
 
247
                        # create new entry
 
248
                        new_sample = {
 
249
                            "resource_id": meter_data.resource_id.id,
 
250
                            "meter_id": meter_data.id,
 
251
                            "sum": sample.counter_volume,
 
252
                            "start_date": previous,
 
253
                            "end_date": current
 
254
                        }
 
255
                        sample_id = obj_sample_resource.create(cr, uid, new_sample, context=context)
 
256
 
 
257
                if meter_data.user_id:
 
258
                    user_name = meter_data.user_id.name
 
259
 
 
260
                    path = "v1/users/"+user_name+"/meters/"+meter_data.name+"?"+date_range
 
261
 
 
262
                    samples = ceil_client.samples._list(path, "events")
 
263
                    for sample in samples:
 
264
                        # create new entry
 
265
                        new_sample = {
 
266
                            "user_id": meter_data.user_id.id,
 
267
                            "meter_id": meter_data.id,
 
268
                            "sum": sample.counter_volume,
 
269
                            "start_date": previous,
 
270
                            "end_date": current
 
271
                        }
 
272
                        sample_id = obj_sample_user.create(cr, uid, new_sample, context=context)
 
273
 
 
274
                if meter_data.project_id:
 
275
                    resource_name = meter_data.project_id.name
 
276
 
 
277
                    path = "v1/projects/"+resource_name+"/meters/"+meter_data.name+"?"+date_range
 
278
 
 
279
                    samples = ceil_client.samples._list(path, "events")
 
280
                    for sample in samples:
 
281
 
 
282
                        # create new entry
 
283
                        new_sample = {
 
284
                            "project_id": meter_data.project_id.id,
 
285
                            "meter_id": meter_data.id,
 
286
                            "sum": sample.counter_volume,
 
287
                            "start_date": previous,
 
288
                            "end_date": current
 
289
                        }
 
290
                        sample_id = obj_sample_project.create(cr, uid, new_sample, context=context)
 
291
 
 
292
                cr.commit()
 
293
            return True
 
294
 
 
295
        except Exception, e:
 
296
            print e
 
297
            return False
 
298
 
176
299
    def search_project(self, cr, uid, project_id, context=None):
177
300
        existing_project = None
178
301
 
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)
228
351
 
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,
264
387
            print e
265
388
            return False
266
389
 
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):
 
391
        if type(ids)==list:
 
392
            ids = ids[0]
 
393
 
 
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")
277
405
 
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)
285
413
 
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
 
416
        if not ids:
 
417
            ids = self.search(cr, uid, [('active','=',True)])
 
418
 
 
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)
 
424
                if ceil_client:
 
425
                    self.sync_samples(cr, uid, ceil_client, subscription_details, context)
 
426
 
 
427
        return True
287
428
 
288
429
ceilometer_subscription()
289
430