2 # -*- coding: utf-8 -*-
4 from ceilometerclient import client
5 from os import environ as env
6 import keystoneclient.v2_0.client as ksclient
10 from monitor.monitordriver import *
13 def object_to_filter(model_name, pk):
14 from core.models import *
16 'ControllerSlice':[ControllerSlice, 'tenant_id', 'project_id'],
17 'Sliver':[Sliver, 'instance_id', 'resource_id'],
18 'ControllerSite':[ControllerSite, 'tenant_id', 'project_id']
21 mod,field,tag = filter_dict[model_name]
22 obj = mod.objects.get(pk=pk)
23 return '%s=%s'%(tag,getattr(obj,field))
26 def cli_to_array(cli_query):
27 '''This converts from the cli list of queries to what is required
32 "[{field=this,op=le,value=34},{field=that,op=eq,value=foo}]"
37 op_lookup = {'!=': 'ne',
44 def split_by_op(string):
45 # two character split (<=,!=)
46 frags = re.findall(r'([[a-zA-Z0-9_.]+)([><!]=)([^ -,\t\n\r\f\v]+)',
49 #single char split (<,=)
50 frags = re.findall(r'([a-zA-Z0-9_.]+)([><=])([^ -,\t\n\r\f\v]+)',
55 queries = cli_query.split(';')
59 raise ValueError('incorrect seperator %s in query "%s"' %
60 ('(should be ";")', q))
62 raise ValueError('invalid query %s' % q)
65 opt['field'] = query[0]
66 opt['op'] = op_lookup[query[1]]
67 opt['value'] = query[2]
71 def meters_to_stats(meters):
72 stats = DashboardStatistics()
74 timestamp = m.duration_start
75 stats['stat_list'].append({'timestamp':timestamp, 'value':m.sum})
77 stats['average']+=m.sum
81 stats['average']/=len(meters)
87 class CeilometerDriver(MonitorDriver):
88 def get_meter(self, meter, obj, pk, keystone=None):
91 keystone['os_username']=env['OS_USERNAME']
92 keystone['os_password']=env['OS_PASSWORD']
93 keystone['os_auth_url']=env['OS_AUTH_URL']
94 keystone['os_tenant_name']=env['OS_TENANT_NAME']
95 keystone['os_cacert']=env['OS_CACERT']
96 keystone['os_region_name']=env['OS_REGION_NAME']
98 keystone['username']=env['OS_USERNAME']
99 keystone['password']=env['OS_PASSWORD']
100 keystone['auth_url']=env['OS_AUTH_URL']
101 keystone['tenant_name']=env['OS_TENANT_NAME']
102 keystone['cacert']=env['OS_CACERT']
103 keystone['region_name']=env['OS_REGION_NAME']
105 keystone['auth_plugin']=client.AuthPlugin(**keystone)
107 ceilometer = client.get_client(2,**keystone)
109 cur_ts = datetime.datetime.fromtimestamp(time.time()-86400)
110 str_ts = cur_ts.strftime('%Y-%m-%dT%H:%M:%S')
112 object_filter = object_to_filter(obj, pk)
113 filter=';'.join([object_filter,'timestamp>%s'%str_ts])
114 #query = cli_to_array("project_id=124de34266b24f57957345cdb43cc9ff;timestamp>2014-12-11T00:00:00")
115 query = cli_to_array(filter)
117 meters = ceilometer.statistics.list(meter,q=query,period=3600)
119 stats = meters_to_stats(meters)