blob: f93dc1a4bf81d2e788e5fc8876debbca867b3fcc [file] [log] [blame]
#!/usr/bin/python
# -*- coding: utf-8 -*-
from ceilometerclient import client
from os import environ as env
import keystoneclient.v2_0.client as ksclient
import re
import datetime
import time
from monitor.monitordriver import *
from core.models import *
def object_to_filter(model_name, pk):
filter_dict = {
'Slice':[Slice, 'tenant_id', 'project_id'],
'Sliver':[Sliver, 'instance_id', 'resource_id'],
'Site':[Site, 'tenant_id', 'project_id']
}
mod,field,tag = filter_dict[model_name]
obj = mod.objects.get(pk=pk)
return '%s=%s'%(tag,mod[field])
def cli_to_array(cli_query):
'''This converts from the cli list of queries to what is required
by the python api.
so from:
"this<=34;that=foo"
to
"[{field=this,op=le,value=34},{field=that,op=eq,value=foo}]"
'''
if cli_query is None:
return None
op_lookup = {'!=': 'ne',
'>=': 'ge',
'<=': 'le',
'>': 'gt',
'<': 'lt',
'=': 'eq'}
def split_by_op(string):
# two character split (<=,!=)
frags = re.findall(r'([[a-zA-Z0-9_.]+)([><!]=)([^ -,\t\n\r\f\v]+)',
string)
if len(frags) == 0:
#single char split (<,=)
frags = re.findall(r'([a-zA-Z0-9_.]+)([><=])([^ -,\t\n\r\f\v]+)',
string)
return frags
opts = []
queries = cli_query.split(';')
for q in queries:
frag = split_by_op(q)
if len(frag) > 1:
raise ValueError('incorrect seperator %s in query "%s"' %
('(should be ";")', q))
if len(frag) == 0:
raise ValueError('invalid query %s' % q)
query = frag[0]
opt = {}
opt['field'] = query[0]
opt['op'] = op_lookup[query[1]]
opt['value'] = query[2]
opts.append(opt)
return opts
def meters_to_stats(meters):
stats = DashboardStatistics()
for m in meters:
timestamp = datetime.datetime.strptime(m.duration_start,'%Y-%m-%dT%H:%M:%S')
stats.stat_list.append({'timestamp':timestamp, 'value':m.sum})
stats.sum+=m.sum
stats.average+=m.sum
stats.unit = 'ns'
stats.average/=len(meters)
return stats
class CeilometerDriver(MonitorDriver):
def get_meter(self, meter, obj, pk, keystone=None):
if (not keystone):
keystone = {}
keystone['username']=env['OS_USERNAME']
keystone['password']=env['OS_PASSWORD']
keystone['auth_url']=env['OS_AUTH_URL']
keystone['tenant_name']=env['OS_TENANT_NAME']
keystone['os_cacert']=env['OS_CACERT']
ceilometer_client = client._get_ksclient(**keystone)
token = ceilometer_client.auth_token
ceilo_endpoint = client._get_endpoint(ceilometer_client, **keystone)
#ceilometer = client.get_client(2, username=keystone['username'], password=keystone['password'], tenant_name=keystone['tenant_name'], auth_url=keystone['auth_url'])
ceilometer = client.Client('2',endpoint = ceilo_endpoint, token = lambda: token)
cur_ts = datetime.datetime.fromtimestamp(time.time()-86400)
str_ts = cur_ts.strftime('%Y-%m-%dT%H:%M:%S')
object_filter = object_to_filter(obj, pk)
filter=';'.join([object_filter,'timestamp>%s'%str_ts])
#query = cli_to_array("project_id=124de34266b24f57957345cdb43cc9ff;timestamp>2014-12-11T00:00:00")
query = cli_to_array(filter)
meters = ceilometer.statistics.list(meter,q=query,period=3600)
stats = meters_to_stats(meters)
return stats