Load ceilometer credentials from controller
[plstackapi.git] / planetstack / openstack_observer / ceilometer.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 from ceilometerclient import client
5 from os import environ as env
6 import keystoneclient.v2_0.client as ksclient
7 import re
8 import datetime
9 import time
10 from monitor.monitordriver import *
11 import pdb
12
13 def object_to_filter(model_name, pk):
14     from core.models import *
15     filter_dict = {
16             'ControllerSlice':[ControllerSlice, 'tenant_id', 'project_id'],
17             'Sliver':[Sliver, 'instance_id', 'resource_id'],
18             'ControllerSite':[ControllerSite, 'tenant_id', 'project_id']
19     }
20
21     mod,field,tag = filter_dict[model_name]
22     obj = mod.objects.get(pk=pk)
23     return '%s=%s'%(tag,getattr(obj,field))
24
25
26 def cli_to_array(cli_query):
27     '''This converts from the cli list of queries to what is required
28     by the python api.
29     so from:
30     "this<=34;that=foo"
31     to
32     "[{field=this,op=le,value=34},{field=that,op=eq,value=foo}]"
33     '''
34     if cli_query is None:
35         return None
36
37     op_lookup = {'!=': 'ne',
38                  '>=': 'ge',
39                  '<=': 'le',
40                  '>': 'gt',
41                  '<': 'lt',
42                  '=': 'eq'}
43
44     def split_by_op(string):
45         # two character split (<=,!=)
46         frags = re.findall(r'([[a-zA-Z0-9_.]+)([><!]=)([^ -,\t\n\r\f\v]+)',
47                            string)
48         if len(frags) == 0:
49             #single char split (<,=)
50             frags = re.findall(r'([a-zA-Z0-9_.]+)([><=])([^ -,\t\n\r\f\v]+)',
51                                string)
52         return frags
53
54     opts = []
55     queries = cli_query.split(';')
56     for q in queries:
57         frag = split_by_op(q)
58         if len(frag) > 1:
59             raise ValueError('incorrect seperator %s in query "%s"' %
60                              ('(should be ";")', q))
61         if len(frag) == 0:
62             raise ValueError('invalid query %s' % q)
63         query = frag[0]
64         opt = {}
65         opt['field'] = query[0]
66         opt['op'] = op_lookup[query[1]]
67         opt['value'] = query[2]
68         opts.append(opt)
69     return opts
70
71 def meters_to_stats(meters):
72     stats = DashboardStatistics()
73     for m in meters:
74         timestamp = m.duration_start
75         stats['stat_list'].append({'timestamp':timestamp, 'value':m.sum})
76         stats['sum']+=m.sum
77         stats['average']+=m.sum
78         stats['unit'] = 'ns'
79
80     if (len(meters)):
81         stats['average']/=len(meters)
82     else:
83         stats['average']=0
84     return stats
85
86
87 class CeilometerDriver(MonitorDriver):
88     def get_meter(self, meter, obj, pk, keystone=None):
89         if (not keystone):
90                 keystone={}
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']
97
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']
104
105         keystone['auth_plugin']=client.AuthPlugin(**keystone)
106
107         ceilometer = client.get_client(2,**keystone)
108         
109         cur_ts = datetime.datetime.fromtimestamp(time.time()-86400)
110         str_ts = cur_ts.strftime('%Y-%m-%dT%H:%M:%S')
111
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)
116
117         meters = ceilometer.statistics.list(meter,q=query,period=3600)
118
119         stats = meters_to_stats(meters)
120         return stats