diff --git a/ceilometer b/ceilometer old mode 100644 new mode 100755 index cbc2714dc3ae77a5216770c2dcd4b61a7ff544bd..218d89af0555ce635a5fd478fa8aa619f66997ce --- a/ceilometer +++ b/ceilometer @@ -1,137 +1,126 @@ #!/usr/bin/env python -import optparse +import calendar +import ConfigParser import httplib import json -import time +import math +import optparse import os import sys -import math +import time + +from filelock import FileLock class api_response(): - __status = None - __data = None - __msg = None + __status = None + __data = None + __msg = None - def __init__(self, status, data, msg): - self.setStatus(status) - self.setData(data) - self.setMsg(msg) + def __init__(self, status, data, msg): + self.setStatus(status) + self.setData(data) + self.setMsg(msg) - def setStatus(self, status): - self.__status = status + def setStatus(self, status): + self.__status = status - def getStatus(self): - return self.__status + def getStatus(self): + return self.__status - def setData(self, data): - self.__data = data + def setData(self, data): + self.__data = data - def getData(self): - return self.__data + def getData(self): + return self.__data - def setMsg(self, msg): - self.__msg = msg + def setMsg(self, msg): + self.__msg = msg - def getMsg(self): - return self.__msg + def getMsg(self): + return self.__msg class api_request(): - @staticmethod - def httpGet(url, host, port, header): - conn = httplib.HTTPConnection(host, port) - conn.request("GET", url, headers = header) - res = conn.getresponse() - response = api_response(res.status, res.read(), res.msg) - return response - @staticmethod - def httpsGet(url, host, port, header): - conn = httplib.HTTPSConnection(host, port) - conn.request("GET", url, headers = header) - res = conn.getresponse() - response = api_response(res.status, res.read(), res.msg) - return response - @staticmethod - def httpPost(url, host, port, params, headers): - conn = httplib.HTTPConnection(host, port) - conn.request("POST", url, params, headers) - res = conn.getresponse() - response = api_response(res.status, res.read(), res.msg) - return response - @staticmethod - def httpsPost(url, host, port, params, headers): - conn = httplib.HTTPSConnection(host, port) - conn.request("POST", url, params, headers) - res = conn.getresponse() - response = api_response(res.status, res.read(), res.msg) - return response - -class Ceilometer: - - __username = '' - __tenant = '' - __token = '' - __password = '' - __tenantID = None - __server = '' - - def __init__(self, tenant, username, password, server, port): - auth = '{"auth": {"tenantName": "%s", "passwordCredentials": {"username": "%s", "password": "%s"}}}' % (tenant, username, password) - header = {"Content-Type": "application/json", "Accept": "application/json"} - res = api_request.httpsPost('/v2.0/tokens', server, port, auth, header) - res_json = json.loads(res.getData()) -# print json.dumps(res_json, sort_keys=True, indent=4) - self.setUsername(username) - self.setTenant(tenant) - self.setTenantID(res_json['access']['token']['tenant']['id']) - self.setToken(res_json['access']['token']['id']) - self.setPassword(password) - self.__server=server - - def setUsername(self, username): - self.__username = username - - def setPassword(self, password): - self.__password = password - - def setTenant(self, tenant): - self.__tenant = tenant - - def getTenant(self): - return self.__tenant - - def setTenantID(self, tenantID): - self.__tenantID = tenantID - - def getTenantID(self): - return self.__tenantID - - def setToken(self, token): - self.__token = token - - def getToken(self): - return self.__token - - def getAuth(self): - return {"X-Auth-Token": self.__token} - - def getMeter(self, meter, resource_id): - url = "/v2/meters/%s?q.field=resource_id&q.op=eq&q.value=%s&limit=1" % (meter, resource_id ) - res = api_request.httpGet(url, self.__server, 8777, self.getAuth()) -# print res.getStatus(), res.getMsg() - res_json = json.loads(res.getData()) -# print json.dumps(res_json, sort_keys=True, indent=4) -# return res_json[0]['counter_volume'] - meter = res_json[0]['counter_volume'] -# if type(meter) is float: -# meter = math.floor(meter) - return meter + @staticmethod + def httpGet(url, host, port, header): + conn = httplib.HTTPConnection(host, port) + conn.request("GET", url, headers = header) + res = conn.getresponse() + response = api_response(res.status, res.read(), res.msg) + return response + @staticmethod + def httpsGet(url, host, port, header): + conn = httplib.HTTPSConnection(host, port) + conn.request("GET", url, headers = header) + res = conn.getresponse() + response = api_response(res.status, res.read(), res.msg) + return response + @staticmethod + def httpPost(url, host, port, params, headers): + conn = httplib.HTTPConnection(host, port) + conn.request("POST", url, params, headers) + res = conn.getresponse() + response = api_response(res.status, res.read(), res.msg) + return response + @staticmethod + def httpsPost(url, host, port, params, headers): + conn = httplib.HTTPSConnection(host, port) + conn.request("POST", url, params, headers) + res = conn.getresponse() + response = api_response(res.status, res.read(), res.msg) + return response + +def getMeter(token_id, server, meter, resource_id): + if meter in ('cpu', 'cpu_util', 'disk.ephemeral.size', 'disk.root.size', 'memory', 'vcpus'): + url = "/v2/meters/%s?q.field=resource_id&q.op=eq&q.value=%s&limit=1" % (meter, resource_id) + elif meter in ('network.incoming.bytes', 'network.outgoing.bytes'): + url = "/v2/meters/%s?q.field=metadata.instance_id&q.op=eq&q.value=%s&limit=1" % (meter, resource_id) + else: + return "Error: unknown meter!" + + res_json = json.loads(api_request.httpGet(url, server, 8777, {"X-Auth-Token": token_id}).getData()) + + return res_json[0]['counter_volume'] + +def getToken(server, tenant, username, password, port): + token_file_path = os.path.join(os.path.dirname(__file__), 'token_backup') + parser_token = ConfigParser.SafeConfigParser() + + with FileLock(token_file_path): + parser_token.readfp(open(token_file_path)) + + if (not parser_token.get('token', 'expires')) or (int(float(parser_token.get('token', 'expires')) - time.time()) <= 0): + auth = '{"auth": {"tenantName": "%s", "passwordCredentials": {"username": "%s", "password": "%s"}}}' % (tenant, username, password) + header = {"Content-Type": "application/json", "Accept": "application/json"} + res = api_request.httpPost('/v2.0/tokens', server, port, auth, header) + res_json = json.loads(res.getData()) + + timestamp = calendar.timegm(time.strptime(res_json['access']['token']['expires'],"%Y-%m-%dT%H:%M:%SZ")) + + parser_token.set('token', 'id', res_json['access']['token']['id']) + parser_token.set('token', 'expires', str(timestamp)) + + with FileLock(token_file_path): + with open(token_file_path, 'w') as configfile: + parser_token.write(configfile) + + return parser_token.get('token', 'id') def main(): - ceilometer=Ceilometer('service', 'ceilometer', 'PASSWORD', 'prisma-cloud.ba.infn.it', 5000) -# print ceilometer.getMeter('cpu_util', '407480dd-7ba2-40d2-8686-2be78c93c6d6') - print ceilometer.getMeter(sys.argv[1], sys.argv[2]) + config_file_path = os.path.join(os.path.dirname(__file__), 'proxy.conf') + parser_config = ConfigParser.SafeConfigParser() + parser_config.readfp(open(config_file_path)) + + server = parser_config.get('ceilometer', 'server') + tenant = parser_config.get('ceilometer', 'tenant') + username = parser_config.get('ceilometer', 'username') + password = parser_config.get('ceilometer', 'password') + port = parser_config.get('ceilometer', 'port') + + token_id = getToken(server, tenant, username, password, port) + + print getMeter(token_id, server, sys.argv[1], sys.argv[2]) if __name__ == "__main__": - main() + main() diff --git a/ceilometer.sh b/ceilometer.sh old mode 100644 new mode 100755 index 78398019e8fdec99c4169b97e0ce4b1612d6f0f9..8d19dbeaea012cbe570a1b73a050a5a527702f1f --- a/ceilometer.sh +++ b/ceilometer.sh @@ -1,2 +1,2 @@ #!/bin/bash -python /usr/lib/zabbix/externalscripts/ceilometer $1 $2 +python /usr/lib/zabbix/externalscripts/ceilometer $1 $2