Newer
Older
#!/usr/bin/env python
import calendar
import ConfigParser
import httplib
import json
import os
import sys
import time
from filelock import FileLock
class api_response():
__status = None
__data = None
__msg = None
def __init__(self, status, data, msg):
self.setStatus(status)
self.setData(data)
self.setMsg(msg)
def setStatus(self, status):
self.__status = status
def getStatus(self):
return self.__status
def setData(self, data):
self.__data = data
def getData(self):
return self.__data
def setMsg(self, msg):
self.__msg = 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
def getToken(protocol, server, port, tenant, username, password):
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"}
if protocol == 'http':
res = api_request.httpPost('/v2.0/tokens', server, port, auth, header)
else:
res = api_request.httpsPost('/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 getMeter(protocol, server, port, token_id, 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!"
if protocol == 'http':
res_json = json.loads(api_request.httpGet(url, server, port, {"X-Auth-Token": token_id}).getData())
else:
res_json = json.loads(api_request.httpsGet(url, server, port, {"X-Auth-Token": token_id}).getData())
return res_json[0]['counter_volume']
def main():
config_file_path = os.path.join(os.path.dirname(__file__), 'proxy.conf')
parser_config = ConfigParser.SafeConfigParser()
parser_config.readfp(open(config_file_path))
token_id = getToken(
parser_config.get('keystone', 'protocol')
parser_config.get('keystone', 'server'),
parser_config.get('keystone', 'port'),
parser_config.get('keystone', 'tenant'),
parser_config.get('keystone', 'username'),
parser_config.get('keystone', 'password')
)
print getMeter(
parser_config.get('ceilometer', 'protocol'),
parser_config.get('ceilometer', 'server'),
parser_config.get('ceilometer', 'port'),
token_id,
sys.argv[1],
sys.argv[2]
)
if __name__ == "__main__":