Skip to content
Snippets Groups Projects
prisma-iaas 8.49 KiB
Newer Older
#!/usr/bin/env python

import sys
import httplib
import json
import io

################## Start API service class ##################

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


################## End API service class ##################

################## Start Structure service function ##################

def add_service_to_host(struct, host, service, state):
	find = 0
	if 'hosts' not in struct.keys():
		struct['hosts'] = []

	for h in iter(struct['hosts']):
		if h['host'] == host:
			h['services'][service] = state
			find = 1
		else:
			continue

	if find == 0:
		struct['hosts'].append({'host' : host, 'services' : {service : state}})
			
def add_service(struct, service, state):
	struct[service] = state

################## End Structure service function ##################

################## Start Prisma class ##################

class Prisma:

	__username = ''
	__tenant = ''
	__token = ''
	__password = ''
	__tenantID = None

	def __init__(self, username, tenant, password):
		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','prisma-cloud.ba.infn.it', 5000, auth, header)
		res_json = json.loads(res.getData())
		self.setUsername(username)
		self.setTenant(tenant)
		self.setTenantID(res_json['access']['token']['tenant']['id'])
		self.setToken(res_json['access']['token']['id'])
		self.setPassword(password)

	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):
#		tenantID = None
#		res = api_request.httpsGet("%s%s" % ('/v2.0/tenants?name=', self.getTenant()), 'prisma-cloud.ba.infn.it', 35357, self.getAuth())
#		if res.getStatus() == 200:
#			tenantID = json.loads(res.getData())['tenant']['id']
#		return tenantID
		return self.__tenantID

	def setToken(self, token):
		self.__token = token

	def getToken(self):
		return self.__token

	def getAuth(self):
		return {"X-Auth-Token": self.getToken()}

	def nova_service_list(self):
		service = None
		res = api_request.httpGet("%s%s%s" % ('/v2/', self.getTenantID(), '/os-services'), 'prisma-cloud.ba.infn.it', 8774, self.getAuth())
		if res.getStatus() == 200:
			service = json.loads(res.getData())
		return service

	def neutron_agent_list(self):
		agent = None
		res = api_request.httpGet('/v2.0/agents.json', 'prisma-cloud-net.ba.infn.it', 9696, self.getAuth())
		if res.getStatus() == 200:
			agent = json.loads(res.getData())
		return agent

	def glance_images(self):
		images = None
		res = api_request.httpGet('/v1.1/images', 'prisma-cloud.ba.infn.it', '9292', self.getAuth())
		if res.getStatus() == 200:
			images = json.loads(res.getData())
		return images

	def cinder_blocks_list(self):
		blocks = None
		res = api_request.httpGet('%s%s%s' % ('/v2/', self.getTenantID(), '/os-services'), 'prisma-cloud.ba.infn.it', '8776', self.getAuth())
		if res.getStatus() == 200:
			blocks = json.loads(res.getData())
		return blocks

	def swift_blocks_list(self):
		blocks = None
		res = api_request.httpsGet('%s%s%s' % ('/v1/AUTH_', self.getTenantID(), '?format=json'), 'prisma-swift.ba.infn.it', '8080', self.getAuth())
		if res.getStatus() == 200:
			blocks = json.loads(res.getData())
		return blocks
		

################## End Prisma class ##################

def encode():

	struct = {}
	prisma = Prisma('admin', 'admin', 'password_da_cambiare')

#keystone
	keystone = prisma.getTenantID()
	if keystone != None:
		add_service(struct, 'keystone', 1)
	else:
		add_service(struct, 'keystone', 0)

#nova
	nova = prisma.nova_service_list()
	compute = 0
	if nova != None:
		add_service(struct, 'nova', 1)
		for i in iter(nova['services']):
			if i['status'] == 'enabled':
				add_service_to_host(struct, i['host'], i['binary'],0 if i['state'] == 'down' else 1)
	else:
		add_service(struct, 'nova', 0)

#neutron
	neutron = prisma.neutron_agent_list()
	if neutron != None:
		add_service(struct, 'neutron', 1)
		for i in iter(neutron['agents']):
			add_service_to_host(struct, i['host'], i['binary'],0 if i['alive'] == 'false' else 1)
	else:
		add_service(struct, 'neutron', 0)

#glance
	glance = prisma.glance_images()
	if glance != None:
		add_service(struct, 'glance', 1)
	else:
		add_service(struct, 'glance', 0)

#cinder
	cinder = prisma.cinder_blocks_list()
	if cinder != None:
		add_service(struct, 'cinder', 1)
	else:
		add_service(struct, 'cinder', 0)

#cinder
	swift = prisma.swift_blocks_list()
	if swift != None:
		add_service(struct, 'swift', 1)
	else:
		add_service(struct, 'swift', 0)

	#print json.dumps(struct, sort_keys=True, indent=4)


	#add_service_to_host(struct, 'test', 'nova-compute', 0)
	#add_service_to_host(struct, 'test', 'neutron-openvswitch-agent', 1)
	return struct

def check( test_json):
	try:
		keystone = test_json["keystone"]
	except:
		print "keystone"
		return

#nova
	controller_dic = {'nova-cert': 0, 'nova-consoleauth': 0, 'nova-scheduler': 0, 'nova-conductor': 0}
	nova = test_json["nova"]
	for host in iter(test_json["hosts"]):
		for i in iter(host["services"]):
			try:
				controller_dic[i]|=host["services"][i]
			except:
				continue
	for i in iter(controller_dic):
		nova &= controller_dic[i]
#neutron
	network_dic = {'neutron-l3-agent': 0, 'neutron-dhcp-agent': 0, 'neutron-openvswitch-agent': 0}
	neutron = test_json["neutron"]
	for host in iter(test_json["hosts"]):
		for i in iter(host["services"]):
			try:
				network_dic[i]|=host["services"][i]
			except:
				continue
	for i in iter(network_dic):
		neutron &= network_dic[i]
#cinder
	cinder = test_json["cinder"]
#glance
	glance = test_json["glance"]
#compute
	computerun = 0
	computecount = 0
	compute = 1
	for host in iter(test_json["hosts"]):
		test = 0
		try:
			if 'nova-compute' in host["services"].keys():
				computecount += 1
			if host["services"]["nova-compute"] & host["services"]["neutron-openvswitch-agent"]:
				computerun += 1
			if host["services"]["nova-compute"] == 1 and host["services"]["neutron-openvswitch-agent"] == 0:
				compute = 0
		except:
			continue
		#print 'hostname: %s | nova: %d | ovs: %d' % (host['host'], host["services"]["nova-compute"], host["services"]["neutron-openvswitch-agent"])

	#print 'keystone: %d | compute: %d | nova: %d | neutron: %d | cinder: %d | glance: %d' % (keystone, compute, nova, neutron, cinder, glance)

	status = {}

	if cinder == 1:
		add_service(status, 'storage', 'OK')
	if neutron == 1:
		add_service(status, 'network', 'OK')
	if compute == 1:
		add_service(status, 'available_nodes', computerun)
		add_service(status, 'total_nodes', computecount)
	else:
		add_service(status, 'available_nodes', 0)
		add_service(status, 'total_nodes', computecount)

	return status
#	return keystone & compute & nova & neutron & cinder & glance

def main():
	struct = encode()
	#print struct
	status = check(struct)
	print status
	#if status > 0:
	#	print "OK"
	#else:
	#	print "KO"

if __name__ == "__main__":
	main()