diff --git a/api/alarm.py b/api/alarm.py new file mode 100644 index 0000000..35590ff --- /dev/null +++ b/api/alarm.py @@ -0,0 +1,99 @@ +from django.http import HttpResponse +from public import NOVA_DB,NEUTRON_DB,NOVA,NEUTRON,RTN_200,RTN_500,getConnIp +import ks_auth +import time +import utils +import base64,urllib,httplib,json,os +from beans import InstanceManager,KeyStoneManager,NetworkFlowManager,AlarmManager + + + +def connUrl(url): + rtn=url.replace("http://","") + return rtn[:(rtn.index("/"))] if "/" in rtn else rtn + +def ifaceID(uuid,portid,instid): + vir="instance-%s" % hex(instid)[2:].zfill(8) + return "%s-%s-%s" % (vir,uuid,"tap"+portid[:11]) + +def virs_list(req,region): + REGION=region + virs=InstanceManager().getallActiveInstances(NOVA_DB(region)) + data = [] + for vir in virs: + item= {} + item['instance_id']= vir.uuid + item['user'] = KeyStoneManager().getUserByUserID(vir.user_id) + item['project'] = KeyStoneManager().getProjectByProjectID(vir.project_id) + item['instance_name'] = vir.hostname + data.append(item) + body = json.dumps({"code":200,"message":"ok","data":data},ensure_ascii=False, indent=2) + return HttpResponse(body) + +####same wit statics, need fix later +def alarm_statics(req,Meteric,UUID,time,region): + vir=InstanceManager().getInstanceByID(NOVA_DB(region),UUID) + if not vir: + return None + RTN=[] + if "network" in Meteric: + ports=NetworkFlowManager().getNetInfoByUUID(UUID,NEUTRON_DB(region)) + print ports + for port in ports: + obj={} + obj["name"]=port["ip_address"] + ifaceId=ifaceID(UUID,port["id"],int(vir.id)) + print "ifaceid:",ifaceId + obj["data"]=alarm_statistics(region,Meteric.replace("_","."),time,ifaceId) + RTN.append(obj) + elif "disk" in Meteric: + obj={} + obj["name"]=vir.hostname + obj["data"]=alarm_statistics(region,Meteric.replace("_","."),time,UUID) + RTN.append(obj) + elif "cpu_util"==Meteric: + obj={} + obj["name"]=vir.hostname + obj["data"]=alarm_statistics(region,Meteric,time,UUID) + RTN.append(obj) + return HttpResponse(json.dumps(RTN)) + + +def alarm_statistics(region,Meteric,duration,RES_ID): + metricUrl=KeyStoneManager().getServiceUrl("metering",region) + token=ks_auth.getToken() + print "token:",token + headers1 = { "X-Auth-Token":token, "Content-type":"application/json" } + now=int(time.time()) + duration_sec=int(duration) + period_start=utils.msecs2utc(now-8*3600-duration_sec) + data1={ + "Meteric":Meteric, + "RES_ID":RES_ID, + "period":1, + "period_start":urllib.quote(period_start,''), + } + print "metricUrl:",metricUrl + print "->:",connUrl(metricUrl) + conn1 = httplib.HTTPConnection(connUrl(metricUrl)) + m_url="/v2/meters/%(Meteric)s/statistics?q.field=resource_id&q.field=timestamp&q.op=eq&q.op=gt&q.type=&q.type=&q.value=%(RES_ID)s&q.value=%(period_start)s&period=%(period)s" % data1 + print "m_url:",m_url + conn1.request("GET",m_url,None,headers1) + response1 = conn1.getresponse() + rtn = response1.read() + conn1.close() + if rtn: + rtn = json.loads(rtn) + print "rtn:",rtn + return rtn + +def getAlarmTask(req, region, time): + time = int(time) + data=AlarmManager().getAlarmFromCycletime(region, time) + #for line in data: + # instance_id = line.get('instance').get('instance_id') + # vir = InstanceManager().getInstanceByID(NOVA_DB(region),instance_id) + # line.get('instance')['user'] = KeyStoneManager().getUserByUserID(vir.user_id) + # line.get('instance')['project'] = KeyStoneManager().getProjectByProjectID(vir.project_id) + # line.get('instance')['instance_name'] = vir.hostname + return HttpResponse(json.dumps({"code":200,"message":"ok","data":data},ensure_ascii=False, indent=2)) diff --git a/api/beans.py b/api/beans.py index cd37da2..8b50a8a 100755 --- a/api/beans.py +++ b/api/beans.py @@ -1,7 +1,7 @@ from django.conf import settings from django.db import connections from django.db import connection -from public import NOVA_DB,NEUTRON_DB,NOVA,NEUTRON +from public import NOVA_DB, NEUTRON_DB, NOVA, NEUTRON UPDATE_USER_PWD=""" @@ -10,40 +10,41 @@ class C2Keystone: def chgPwd(self,userid,pwd): - try: - conn=connections["KEYSTONE_Master"] - cursor=conn.cursor() + try: + conn=connections["KEYSTONE_Master"] + cursor=conn.cursor() cursor.execute(UPDATE_USER_PWD,(pwd,userid)) - conn.commit() + conn.commit() except Exception,ex: print Exception,":",ex return False - finally: - conn.close() + finally: + conn.close() cursor.close() - return True + return True class ComputeNode: - def __init__(self,vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms,deleted=0,host_ip=None,id=None): - self.vcpus=vcpus - self.memory_mb=memory_mb - self.vcpus_used=vcpus_used - self.memory_mb_used=memory_mb_used - self.hypervisor_hostname=hypervisor_hostname - self.running_vms=running_vms - self.rest_vcpus=vcpus*4-vcpus_used - self.rest_memory_mb=memory_mb-memory_mb_used - self.deleted=deleted - self.host_ip=host_ip - self.id=id - def __str__(self): - return "--host:%s,rest_vcpus:%s,rest_mem:%s-- " % (self.hypervisor_hostname,self.rest_vcpus,self.rest_memory_mb) - - def __repr__(self): - return "--host:%s,rest_vcpus:%s,rest_mem:%s-- " % (self.hypervisor_hostname,self.rest_vcpus,self.rest_memory_mb) - - def availability(self,cpu,mem): - return self.rest_vcpus>cpu and self.rest_memory_mb>mem + def __init__(self,vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms,deleted=0,host_ip=None,id=None): + self.vcpus=vcpus + self.memory_mb=memory_mb + self.vcpus_used=vcpus_used + self.memory_mb_used=memory_mb_used + self.hypervisor_hostname=hypervisor_hostname + self.running_vms=running_vms + self.rest_vcpus=vcpus*4-vcpus_used + self.rest_memory_mb=memory_mb-memory_mb_used + self.deleted=deleted + self.host_ip=host_ip + self.id=id + + def __str__(self): + return "--host:%s,rest_vcpus:%s,rest_mem:%s-- " % (self.hypervisor_hostname,self.rest_vcpus,self.rest_memory_mb) + + def __repr__(self): + return "--host:%s,rest_vcpus:%s,rest_mem:%s-- " % (self.hypervisor_hostname,self.rest_vcpus,self.rest_memory_mb) + + def availability(self,cpu,mem): + return self.rest_vcpus>cpu and self.rest_memory_mb>mem GET_PHYSICAL="SELECT vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms FROM compute_nodes WHERE deleted=0 AND host_ip=%s" @@ -72,126 +73,126 @@ def availability(self,cpu,mem): """ class ComputeNodeMana: - + def getComputeNodeByIp(self,ip,db): - cursor=db.cursor() - cursor.execute(GET_PHYSICAL,ip) - result=cursor.fetchone() - cursor.close() - if not result: - print "Can't find physical machine by ip(%s)" % ip - return None - vcpus=result[0] - memory_mb=result[1] - vcpus_used=result[2] - memory_mb_used=result[3] - hypervisor_hostname=result[4] - running_vms=result[5] - computeNode=ComputeNode(vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms) - return computeNode + cursor=db.cursor() + cursor.execute(GET_PHYSICAL,ip) + result=cursor.fetchone() + cursor.close() + if not result: + print "Can't find physical machine by ip(%s)" % ip + return None + vcpus=result[0] + memory_mb=result[1] + vcpus_used=result[2] + memory_mb_used=result[3] + hypervisor_hostname=result[4] + running_vms=result[5] + computeNode=ComputeNode(vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms) + return computeNode def updateMinion(self,vms,deleted,_id,region): - cursor=connection.cursor() - cursor.execute(UPDATE_MINION_VMS,(vms,deleted,_id,region)) - cursor.close() + cursor=connection.cursor() + cursor.execute(UPDATE_MINION_VMS,(vms,deleted,_id,region)) + cursor.close() def updateMinionState(self,state,_id,region): - cursor=connection.cursor() - cursor.execute(UPDATE_MINION_STATE,(state,_id,region)) - cursor.close() + cursor=connection.cursor() + cursor.execute(UPDATE_MINION_STATE,(state,_id,region)) + cursor.close() def addMinion(self,n,region): - cursor=connection.cursor() - try: - cursor.execute(ADD_Minion,(n.id,n.host_ip,n.hypervisor_hostname,region,n.running_vms,n.deleted)) - except Exception,ex: - print Exception,":",ex - return False - finally: - cursor.close() - return True + cursor=connection.cursor() + try: + cursor.execute(ADD_Minion,(n.id,n.host_ip,n.hypervisor_hostname,region,n.running_vms,n.deleted)) + except Exception,ex: + print Exception,":",ex + return False + finally: + cursor.close() + return True def addSaltLog(self,log,Type): - cursor=connection.cursor() - try: - cursor.execute(SALT_LOG,(log,Type,)) - except Exception,ex: - print Exception,":",ex - return False - finally: - cursor.close() - return True + cursor=connection.cursor() + try: + cursor.execute(SALT_LOG,(log,Type,)) + except Exception,ex: + print Exception,":",ex + return False + finally: + cursor.close() + return True def getComputeNodes(self,db): - cursor=db.cursor() - cursor.execute(GET_ALL_PHYSICAL) - results=cursor.fetchall() - nodes=[] - for line in results: - vcpus=line[0] - memory_mb=line[1] - vcpus_used=line[2] - memory_mb_used=line[3] - hypervisor_hostname=line[4] - running_vms=line[5] - nodes.append(ComputeNode(vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms)) - cursor.close() - return nodes + cursor=db.cursor() + cursor.execute(GET_ALL_PHYSICAL) + results=cursor.fetchall() + nodes=[] + for line in results: + vcpus=line[0] + memory_mb=line[1] + vcpus_used=line[2] + memory_mb_used=line[3] + hypervisor_hostname=line[4] + running_vms=line[5] + nodes.append(ComputeNode(vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms)) + cursor.close() + return nodes def getAllComputeNodes(self,db): - cursor=db.cursor() - cursor.execute(ALL_PHYSICAL) - results=cursor.fetchall() - nodes=[] - for line in results: - vcpus=line[0] - memory_mb=line[1] - vcpus_used=line[2] - memory_mb_used=line[3] - hypervisor_hostname=line[4] - running_vms=line[5] - deleted=line[6] - host_ip=line[7] - _id=line[8] - nodes.append(ComputeNode(vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms,deleted,host_ip,_id)) - cursor.close() - return nodes + cursor=db.cursor() + cursor.execute(ALL_PHYSICAL) + results=cursor.fetchall() + nodes=[] + for line in results: + vcpus=line[0] + memory_mb=line[1] + vcpus_used=line[2] + memory_mb_used=line[3] + hypervisor_hostname=line[4] + running_vms=line[5] + deleted=line[6] + host_ip=line[7] + _id=line[8] + nodes.append(ComputeNode(vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms,deleted,host_ip,_id)) + cursor.close() + return nodes def getSaltComputeNodes(self,region): - cursor=connection.cursor() - cursor.execute(GET_SALT_PHYSICAL,(region,)) - results=cursor.fetchall() - cursor.close() - nodes={} - for line in results: - minion={} - minion["compute_node_ip"]=line[0] - minion["compute_node_host"]=line[1] - minion["region"]=line[2] - minion["running_vms"]=line[3] - minion["node_deleted"]=line[4] - minion["id"]=line[5] - nodes["%s_%d" % (line[1],minion["id"])]=minion - return nodes + cursor=connection.cursor() + cursor.execute(GET_SALT_PHYSICAL,(region,)) + results=cursor.fetchall() + cursor.close() + nodes={} + for line in results: + minion={} + minion["compute_node_ip"]=line[0] + minion["compute_node_host"]=line[1] + minion["region"]=line[2] + minion["running_vms"]=line[3] + minion["node_deleted"]=line[4] + minion["id"]=line[5] + nodes["%s_%d" % (line[1],minion["id"])]=minion + return nodes def getFilterComputeNodes(self,db,filters): - cursor=db.cursor() - in_p=', '.join(list(map(lambda x: '%s', filters))) - sql=GET_FILTER_PHYSICAL % in_p - cursor.execute(sql,filters) - results=cursor.fetchall() - nodes=[] - for line in results: - vcpus=line[0] - memory_mb=line[1] - vcpus_used=line[2] - memory_mb_used=line[3] - hypervisor_hostname=line[4] - running_vms=line[5] - nodes.append(ComputeNode(vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms)) - cursor.close() - return nodes + cursor=db.cursor() + in_p=', '.join(list(map(lambda x: '%s', filters))) + sql=GET_FILTER_PHYSICAL % in_p + cursor.execute(sql,filters) + results=cursor.fetchall() + nodes=[] + for line in results: + vcpus=line[0] + memory_mb=line[1] + vcpus_used=line[2] + memory_mb_used=line[3] + hypervisor_hostname=line[4] + running_vms=line[5] + nodes.append(ComputeNode(vcpus,memory_mb,vcpus_used,memory_mb_used,hypervisor_hostname,running_vms)) + cursor.close() + return nodes @@ -222,188 +223,271 @@ def getFilterComputeNodes(self,db,filters): SELECT count(ports.id) FROM ports,nova.instances WHERE ports.`status`="ACTIVE" AND ports.tenant_id=%s AND ports.network_id IN (SELECT id FROM networks WHERE `name` REGEXP 'WT|DX|BGP' AND admin_state_up=1 AND shared=1) AND ports.device_id=nova.instances.uuid AND nova.instances.user_id=%s """ +GET_INSTANCE_STAT = """SELECT power_state FROM nova.instances WHERE uuid=%s""" + class InstanceBean: - def __init__(self,uuid,memory_mb,vcpus,vm_state,host,user_id,project_id,hostname,id_): - self.uuid=uuid - self.memory_mb=memory_mb - self.vcpus=vcpus - self.vm_state=vm_state - self.host=host - self.user_id=user_id - self.project_id=project_id - self.hostname=hostname - self.id=id_ + def __init__(self,uuid,memory_mb,vcpus,vm_state,host,user_id,project_id,hostname,id_): + self.uuid=uuid + self.memory_mb=memory_mb + self.vcpus=vcpus + self.vm_state=vm_state + self.host=host + self.user_id=user_id + self.project_id=project_id + self.hostname=hostname + self.id=id_ def __repr__(self): return "--id,%s,uuid:%s,hostname:%s,vcpus:%s,mem:%s-- " % (self.id,self.uuid,self.hostname,self.vcpus,self.memory_mb) class InstanceManager: - def getIpsByTenant(self,neutron_db,userid,tenanted): - cursor=neutron_db.cursor() - cursor.execute(COUNT_USER_IPS,(tenanted,userid)) - result=cursor.fetchone() - cursor.close() - if not result: - print "Can't find instances by userid(%s)" % userid - return 0 - return int(result[0]) - - def getUserInstCountByTenant(self,nova_db,userid,tenanted): - cursor=nova_db.cursor() - cursor.execute(COUNT_USER_INST_TENANT,(userid,tenanted)) - result=cursor.fetchone() - cursor.close() - if not result: - print "Can't find instances by userid(%s)" % userid - return 0 - return int(result[0]) - - def getUserInstCount(self,nova_db,userid): - cursor=nova_db.cursor() - cursor.execute(COUNT_USER_INST,(userid,)) - result=cursor.fetchone() - cursor.close() - if not result: - print "Can't find instances by userid(%s)" % userid - return 0 - return int(result[0]) - - def getHostIp(self,nova_db,uuid): - cursor=nova_db.cursor() - cursor.execute(GET_HOST_IP,(uuid,)) - result=cursor.fetchone() - cursor.close() - obj={} - if not result: - print "Can't find host ip by uuid(%s)" % uuid - return None - obj["host"]=result[0] - obj["host_ip"]=result[1] - obj["id"]=result[2] - return obj - - def findPortIdByDevid(self,neutron_db,device_id): - cursor=neutron_db.cursor() - cursor.execute(GET_PORTID_BY_DEVICEID,device_id) - result=cursor.fetchone() - cursor.close() - return None if not result else result[0] - - def findInstanceIdByIp(self,neutron_db,nova_db,ip): - cursor=neutron_db.cursor() - cursor.execute(VIR_PORT,ip) - result=cursor.fetchone() - - size=0 if not result else len(result) - if size>0: - print "GET PORT_ID %s" % result[0] - cursor.execute(VIR_UUID,result[0]) - result=cursor.fetchone() - size=0 if not result else len(result) - else: - print "Can't find port_id by ip(%s),break!" % ip - cursor.close() - if size==0: - print "Can't find device_id by ip(%s),break!" % ip - return None - uuid=result[0] - print "GET UUID %s" % uuid - cur=nova_db.cursor() - cur.execute(GET_INSTANCE,uuid) - result=cur.fetchone() - cur.close() - if not result: - print "Can't find instance by device_id(%s),break!" % uuid - return None - uuid=result[0] - memory_mb=result[1] - vcpus=result[2] - vm_state=result[3] - host=result[4] - user_id=result[5] - project_id=result[6] - hostname=result[7] - id_=result[8] - instanceBean=InstanceBean(uuid,memory_mb,vcpus,vm_state,host,user_id,project_id,hostname,id_) - return instanceBean - - def getInstanceByID(self,nova_db,uuid): - cur=nova_db.cursor() - cur.execute(GET_INSTANCE,(uuid,)) - result=cur.fetchone() - cur.close() - if not result: - print "Can't find instance by uuid(%s),break!" % uuid - return None - uuid=result[0] - memory_mb=result[1] - vcpus=result[2] - vm_state=result[3] - host=result[4] - user_id=result[5] - project_id=result[6] - hostname=result[7] - id_=result[8] - instanceBean=InstanceBean(uuid,memory_mb,vcpus,vm_state,host,user_id,project_id,hostname,id_) - return instanceBean - - def getallActiveInstances(self,nova_db): - cursor=nova_db.cursor() - cursor.execute(GET_ACTIVE_INSTANCE) - childs=[] - results=cursor.fetchall() - for result in results: - uuid=result[0] - memory_mb=result[1] - vcpus=result[2] - vm_state=result[3] - host=result[4] - user_id=result[5] - project_id=result[6] - hostname=result[7] - id_=result[8] - instanceBean=InstanceBean(uuid,memory_mb,vcpus,vm_state,host,user_id,project_id,hostname,id_) - childs.append(instanceBean) - cursor.close() - return childs - - def getChildrens(self,nova_db,ip): - node=ComputeNodeMana().getComputeNodeByIp(ip,nova_db) - if not node: - return None - host=node.hypervisor_hostname - cursor=nova_db.cursor() - cursor.execute(PHY_CHILDS,host) - childs=[] - results=cursor.fetchall() - for result in results: - uuid=result[0] - memory_mb=result[1] - vcpus=result[2] - vm_state=result[3] - host=result[4] - user_id=result[5] - project_id=result[6] - hostname=result[7] - id_=result[8] - instanceBean=InstanceBean(uuid,memory_mb,vcpus,vm_state,host,user_id,project_id,hostname,id_) - childs.append(instanceBean) - cursor.close() - return childs - + def getIpsByTenant(self,neutron_db,userid,tenanted): + cursor=neutron_db.cursor() + cursor.execute(COUNT_USER_IPS,(tenanted,userid)) + result=cursor.fetchone() + cursor.close() + if not result: + print "Can't find instances by userid(%s)" % userid + return 0 + return int(result[0]) + + def getUserInstCountByTenant(self,nova_db,userid,tenanted): + cursor=nova_db.cursor() + cursor.execute(COUNT_USER_INST_TENANT,(userid,tenanted)) + result=cursor.fetchone() + cursor.close() + if not result: + print "Can't find instances by userid(%s)" % userid + return 0 + return int(result[0]) + + def getUserInstCount(self,nova_db,userid): + cursor=nova_db.cursor() + cursor.execute(COUNT_USER_INST,(userid,)) + result=cursor.fetchone() + cursor.close() + if not result: + print "Can't find instances by userid(%s)" % userid + return 0 + return int(result[0]) + + def getHostIp(self,nova_db,uuid): + cursor=nova_db.cursor() + cursor.execute(GET_HOST_IP,(uuid,)) + result=cursor.fetchone() + cursor.close() + obj={} + if not result: + print "Can't find host ip by uuid(%s)" % uuid + return None + obj["host"]=result[0] + obj["host_ip"]=result[1] + obj["id"]=result[2] + return obj + + def findPortIdByDevid(self,neutron_db,device_id): + cursor=neutron_db.cursor() + cursor.execute(GET_PORTID_BY_DEVICEID,device_id) + result=cursor.fetchone() + cursor.close() + return None if not result else result[0] + + def findInstanceIdByIp(self,neutron_db,nova_db,ip): + cursor=neutron_db.cursor() + cursor.execute(VIR_PORT,ip) + result=cursor.fetchone() + + size=0 if not result else len(result) + if size>0: + print "GET PORT_ID %s" % result[0] + cursor.execute(VIR_UUID,result[0]) + result=cursor.fetchone() + size=0 if not result else len(result) + else: + print "Can't find port_id by ip(%s),break!" % ip + cursor.close() + if size==0: + print "Can't find device_id by ip(%s),break!" % ip + return None + uuid=result[0] + print "GET UUID %s" % uuid + cur=nova_db.cursor() + cur.execute(GET_INSTANCE,uuid) + result=cur.fetchone() + cur.close() + if not result: + print "Can't find instance by device_id(%s),break!" % uuid + return None + uuid=result[0] + memory_mb=result[1] + vcpus=result[2] + vm_state=result[3] + host=result[4] + user_id=result[5] + project_id=result[6] + hostname=result[7] + id_=result[8] + instanceBean=InstanceBean(uuid,memory_mb,vcpus,vm_state,host,user_id,project_id,hostname,id_) + return instanceBean + + def getInstanceByID(self,nova_db,uuid): + cur=nova_db.cursor() + cur.execute(GET_INSTANCE,(uuid,)) + result=cur.fetchone() + cur.close() + if not result: + print "Can't find instance by uuid(%s),break!" % uuid + return None + uuid=result[0] + memory_mb=result[1] + vcpus=result[2] + vm_state=result[3] + host=result[4] + user_id=result[5] + project_id=result[6] + hostname=result[7] + id_=result[8] + instanceBean=InstanceBean(uuid,memory_mb,vcpus,vm_state,host,user_id,project_id,hostname,id_) + return instanceBean + + def getallActiveInstances(self,nova_db): + cursor=nova_db.cursor() + cursor.execute(GET_ACTIVE_INSTANCE) + childs=[] + results=cursor.fetchall() + for result in results: + uuid=result[0] + memory_mb=result[1] + vcpus=result[2] + vm_state=result[3] + host=result[4] + user_id=result[5] + project_id=result[6] + hostname=result[7] + id_=result[8] + instanceBean=InstanceBean(uuid,memory_mb,vcpus,vm_state,host,user_id,project_id,hostname,id_) + childs.append(instanceBean) + cursor.close() + return childs + + def getChildrens(self,nova_db,ip): + node=ComputeNodeMana().getComputeNodeByIp(ip,nova_db) + if not node: + return None + host=node.hypervisor_hostname + cursor=nova_db.cursor() + cursor.execute(PHY_CHILDS,host) + childs=[] + results=cursor.fetchall() + for result in results: + uuid=result[0] + memory_mb=result[1] + vcpus=result[2] + vm_state=result[3] + host=result[4] + user_id=result[5] + project_id=result[6] + hostname=result[7] + id_=result[8] + instanceBean=InstanceBean(uuid,memory_mb,vcpus,vm_state,host,user_id,project_id,hostname,id_) + childs.append(instanceBean) + cursor.close() + return childs + + def getInstanceStat(self, nova_db, uuid): + power_stat = { + 0:'pending', + 1:'running', + 2:'paused', + 3:'shutdown', + 4:'crashed', + 5:'suspended', + 6:'building' + } + cur=nova_db.cursor() + cur.execute(GET_INSTANCE_STAT,(uuid,)) + result=cur.fetchone() + cur.close() + if not result: + print "Can't find instance state by uuid(%s),break!" % uuid + return None + stat = power_stat.get(result[0]) + return stat + GET_SERVICE_URL='SELECT url FROM endpoint WHERE interface="public" AND region=%s AND service_id =(SELECT id FROM service WHERE type=%s)' - +#GET_USER_BY_USERID = 'SELECT name FROM user WHERE id=%s' +GET_USER_BY_USERID = "SELECT name FROM user WHERE id='%s'" +GET_PROJECT_BY_PROJECTID = "SELECT name FROM project WHERE id='%s'" + class KeyStoneManager: def getServiceUrl(self,service_name,region,tenant=settings.SYS_C2): - print "getServiceUrl: region:%s,service_name:%s" % (region,service_name) - db_region=connections["KEYSTONE"] - cursor=db_region.cursor() - cursor.execute(GET_SERVICE_URL,(region,service_name)) - result=cursor.fetchone() - cursor.close() - return None if not result else result[0] % tenant + print "getServiceUrl: region:%s,service_name:%s" % (region,service_name) + db_region=connections["KEYSTONE"] + cursor=db_region.cursor() + cursor.execute(GET_SERVICE_URL,(region,service_name)) + result=cursor.fetchone() + cursor.close() + db_region.close() + return None if not result else result[0] % tenant + + def getUserByUserID(self, user_id): + ##keystone_db = KEYSTONE_DB + #keystone_db = connections["KEYSTONE"] + #cursor = keystone_db.cursor() + #sql = GET_USER_BY_USERID %user_id + ##cursor.execute(GET_USER_BY_USERID,[user_id]) + #cursor.execute(sql) + #result = cursor.fetchone() + #cursor.close() + #keystone_db.close() + #return None if not result else result[0] + + from mana.conf import DATABASES + import MySQLdb + v_host = DATABASES.get('KEYSTONE').get('HOST') + v_user = DATABASES.get('KEYSTONE').get('USER') + v_passwd = DATABASES.get('KEYSTONE').get('PASSWORD') + v_db = DATABASES.get('KEYSTONE').get('NAME') + v_charset = 'latin1' + con = MySQLdb.connect(host=v_host, user=v_user, passwd=v_passwd, db=v_db, charset=v_charset) + cur = con.cursor() + sql_query = GET_USER_BY_USERID %user_id + cur.execute(sql_query) + result = cur.fetchone() + cur.close() + con.close() + return None if not result else result[0].encode('latin-1').decode('utf-8') + + def getProjectByProjectID(self, project_id): + ##keystone_db = KEYSTONE_DB + #keystone_db = connections["KEYSTONE"] + #cursor = keystone_db.cursor() + ##cursor.execute('set names ') + ##cursor.execute(GET_PROJECT_BY_PROJECTID,[project_id]) + #sql = GET_PROJECT_BY_PROJECTID %project_id + #cursor.execute(sql) + #result = cursor.fetchone() + #cursor.close() + #keystone_db.close() + #return None if not result else result[0] + + from mana.conf import DATABASES + import MySQLdb + v_host = DATABASES.get('KEYSTONE').get('HOST') + v_user = DATABASES.get('KEYSTONE').get('USER') + v_passwd = DATABASES.get('KEYSTONE').get('PASSWORD') + v_db = DATABASES.get('KEYSTONE').get('NAME') + v_charset = 'latin1' + con = MySQLdb.connect(host=v_host, user=v_user, passwd=v_passwd, db=v_db, charset=v_charset) + cur = con.cursor() + sql_query = GET_PROJECT_BY_PROJECTID %project_id + cur.execute(sql_query) + result = cur.fetchone() + cur.close() + con.close() + return None if not result else result[0].encode('latin-1').decode('utf-8') GET_FREE_IP='SELECT networks.`name`,networks.`status`,subnets.id,ipavailabilityranges.first_ip,ipavailabilityranges.last_ip,networks.id,subnets.`name` as "subnet_name" FROM ipavailabilityranges,ipallocationpools,subnets,networks WHERE ipavailabilityranges.allocation_pool_id=ipallocationpools.id AND ipallocationpools.subnet_id=subnets.id AND subnets.network_id=networks.id AND networks.`status`="ACTIVE" AND networks.admin_state_up=1 AND networks.shared=1 ORDER BY networks.`name`,subnets.`name`' @@ -411,76 +495,75 @@ def getServiceUrl(self,service_name,region,tenant=settings.SYS_C2): class NetWork: - def __init__(self,id_,name,status,subnet=None,subnet_id=None,first_ip="",last_ip=""): - self.name=name - self.status=status - self.subnet=subnet - self.subnet_id=subnet_id - self.first_ip=first_ip - self.last_ip=last_ip - self.id=id_ - if subnet: - self.freeNumber=self.freeNum() - - def freeNum(self): - index=self.first_ip.rindex(".")+1 - first_num=int(self.first_ip[index:]) - index=self.last_ip.rindex(".")+1 - last_num=int(self.last_ip[index:]) - return last_num-first_num+1 + def __init__(self,id_,name,status,subnet=None,subnet_id=None,first_ip="",last_ip=""): + self.name=name + self.status=status + self.subnet=subnet + self.subnet_id=subnet_id + self.first_ip=first_ip + self.last_ip=last_ip + self.id=id_ + if subnet: + self.freeNumber=self.freeNum() + + def freeNum(self): + index=self.first_ip.rindex(".")+1 + first_num=int(self.first_ip[index:]) + index=self.last_ip.rindex(".")+1 + last_num=int(self.last_ip[index:]) + return last_num-first_num+1 class NetWorkManager: - def getFreeIp(self,db): - cursor=db.cursor() - cursor.execute(GET_FREE_IP) - results=cursor.fetchall() - cursor.close() - nodes=[] - for line in results: - name=line[0] - status=line[1] - subnet_id=line[2] - first_ip=line[3] - last_ip=line[4] - id_=line[5] - subnet=line[6] - nodes.append(NetWork(id_,name,status,subnet,subnet_id,first_ip,last_ip)) - return nodes + cursor=db.cursor() + cursor.execute(GET_FREE_IP) + results=cursor.fetchall() + cursor.close() + nodes=[] + for line in results: + name=line[0] + status=line[1] + subnet_id=line[2] + first_ip=line[3] + last_ip=line[4] + id_=line[5] + subnet=line[6] + nodes.append(NetWork(id_,name,status,subnet,subnet_id,first_ip,last_ip)) + return nodes def getTotalNum(self,nodes): - display={} - rtn={} - for node in nodes: - if display.has_key(node.name): - total=display.get(node.name) - total+=node.freeNum() - display[node.name]=total - else: - display[node.name]=node.freeNum() - rtn[node.name]={"freeNum":display[node.name],"network_id":node.id} - return rtn + display={} + rtn={} + for node in nodes: + if display.has_key(node.name): + total=display.get(node.name) + total+=node.freeNum() + display[node.name]=total + else: + display[node.name]=node.freeNum() + rtn[node.name]={"freeNum":display[node.name],"network_id":node.id} + return rtn def getAllNetWorks(self,db): - cursor=db.cursor() - cursor.execute(GET_ALL_NETWORKS) - results=cursor.fetchall() - cursor.close() - nodes=[] - for line in results: - id_=line[0] - name=line[1] - status=line[2] - nodes.append(NetWork(id_,name,status)) - return nodes + cursor=db.cursor() + cursor.execute(GET_ALL_NETWORKS) + results=cursor.fetchall() + cursor.close() + nodes=[] + for line in results: + id_=line[0] + name=line[1] + status=line[2] + nodes.append(NetWork(id_,name,status)) + return nodes def getAllTotalNum(self,nodes,db): - freeNodes=self.getTotalNum(nodes) - networks=self.getAllNetWorks(db) - for network in networks: - if not freeNodes.has_key(network.name): - freeNodes[network.name]={"freeNum":0,"network_id":network.id} - return freeNodes + freeNodes=self.getTotalNum(nodes) + networks=self.getAllNetWorks(db) + for network in networks: + if not freeNodes.has_key(network.name): + freeNodes[network.name]={"freeNum":0,"network_id":network.id} + return freeNodes GET_IP_BY_UUID=""" SELECT ports.id,ipallocations.ip_address,ipallocations.network_id,networks.`name` @@ -498,34 +581,34 @@ def getAllTotalNum(self,nodes,db): class NetworkFlowManager: def getNetInfoByUUID(self,uuid,db_region): - cursor=db_region.cursor() - cursor.execute(GET_IP_BY_UUID,(uuid,)) - results=cursor.fetchall() - cursor.close() - nodes=[] - for line in results: - obj={} - obj["id"]=line[0] - obj["ip_address"]=line[1] - obj["network_id"]=line[2] - obj["network_name"]=line[3] - nodes.append(obj) - return nodes + cursor=db_region.cursor() + cursor.execute(GET_IP_BY_UUID,(uuid,)) + results=cursor.fetchall() + cursor.close() + nodes=[] + for line in results: + obj={} + obj["id"]=line[0] + obj["ip_address"]=line[1] + obj["network_id"]=line[2] + obj["network_name"]=line[3] + nodes.append(obj) + return nodes def getNetInfoByUUIDAndNetId(self,db_region,uuid,network_id): - cursor=db_region.cursor() - cursor.execute(GET_IP_BY_UUID_NETID,(uuid,network_id)) - result=cursor.fetchone() - cursor.close() - if not result: - print "Can't find network info by device_id(%s),break!" % uuid - return None - obj={} - obj["id"]=result[0] - obj["ip_address"]=result[1] - obj["network_id"]=result[2] - obj["network_name"]=result[3] - return obj + cursor=db_region.cursor() + cursor.execute(GET_IP_BY_UUID_NETID,(uuid,network_id)) + result=cursor.fetchone() + cursor.close() + if not result: + print "Can't find network info by device_id(%s),break!" % uuid + return None + obj={} + obj["id"]=result[0] + obj["ip_address"]=result[1] + obj["network_id"]=result[2] + obj["network_name"]=result[3] + return obj ADD_EVA_LOG=""" @@ -534,15 +617,15 @@ def getNetInfoByUUIDAndNetId(self,db_region,uuid,network_id): class EvaLog: def addLog(self,user,eva_ip,output,remote_ip): - cursor=connection.cursor() - try: - cursor.execute(ADD_EVA_LOG,(user,eva_ip,output,remote_ip)) - except Exception,ex: - print Exception,"ADD_EVA_LOG:",ex - return False - finally: - cursor.close() - return True + cursor=connection.cursor() + try: + cursor.execute(ADD_EVA_LOG,(user,eva_ip,output,remote_ip)) + except Exception,ex: + print Exception,"ADD_EVA_LOG:",ex + return False + finally: + cursor.close() + return True ADD_NET_FLOW=""" INSERT INTO c2_network_flow(`uuid`,`network_flow`,`region`,`network_id`) VALUES (%s,%s,%s,%s) @@ -558,44 +641,44 @@ def addLog(self,user,eva_ip,output,remote_ip): class NetWorkFlow: def addNetWorkFlow(self,uuid,network_flow,region,network_id): - cursor=connection.cursor() - try: - cursor.execute(ADD_NET_FLOW,(uuid,network_flow,region,network_id)) - except Exception,ex: - print Exception,":",ex - return False - finally: - cursor.close() - return True + cursor=connection.cursor() + try: + cursor.execute(ADD_NET_FLOW,(uuid,network_flow,region,network_id)) + except Exception,ex: + print Exception,":",ex + return False + finally: + cursor.close() + return True def getNetWorkFlows(self,uuid,region): - cursor=connection.cursor() - cursor.execute(GET_NET_FLOWS,(uuid,region)) - results=cursor.fetchall() - cursor.close() - nodes=[] - for line in results: - obj={} - obj["network_flow"]=line[0] - obj["network_id"]=line[1] - obj["uuid"]=uuid - obj["region"]=region - nodes.append(obj) - return nodes + cursor=connection.cursor() + cursor.execute(GET_NET_FLOWS,(uuid,region)) + results=cursor.fetchall() + cursor.close() + nodes=[] + for line in results: + obj={} + obj["network_flow"]=line[0] + obj["network_id"]=line[1] + obj["uuid"]=uuid + obj["region"]=region + nodes.append(obj) + return nodes def addLog(self,uuid,region,network_id,network_name,log,action): - cursor=connection.cursor() - log="_%s_" % log - try: - cursor.execute(ADD_SU_LOG,(uuid,region,network_id,network_name,action,log)) - except Exception,ex: - print Exception,"ADD_SU_LOG:",ex - return False - finally: - cursor.close() - return True - - + cursor=connection.cursor() + log="_%s_" % log + try: + cursor.execute(ADD_SU_LOG,(uuid,region,network_id,network_name,action,log)) + except Exception,ex: + print Exception,"ADD_SU_LOG:",ex + return False + finally: + cursor.close() + return True + + C2_CIDR_GET=""" SELECT id,cidr,tenant_id,network_id,region FROM c2_cidr_allocation WHERE tenant_id=%s AND region=%s OR tenant_id is NULL AND region =%s ORDER BY tenant_id DESC,id ASC limit 1 """ @@ -611,20 +694,20 @@ def addLog(self,uuid,region,network_id,network_name,log,action): class C2cidrManager: def getFreecidr(self,tenant_id,region): - cursor=connection.cursor() - cursor.execute(C2_CIDR_GET,(tenant_id,region,region)) - result=cursor.fetchone() - cursor.close() - if not result: - print "Can't find cidr " - return None - obj={} - obj["id"]=result[0] - obj["cidr"]=result[1] - obj["tenantid"]=result[2] - obj["network_id"]=result[3] - obj["region"]=result[4] - return obj + cursor=connection.cursor() + cursor.execute(C2_CIDR_GET,(tenant_id,region,region)) + result=cursor.fetchone() + cursor.close() + if not result: + print "Can't find cidr " + return None + obj={} + obj["id"]=result[0] + obj["cidr"]=result[1] + obj["tenantid"]=result[2] + obj["network_id"]=result[3] + obj["region"]=result[4] + return obj def getMultiFreecidr(self,tenant_id,region): cursor=connection.cursor() @@ -643,30 +726,90 @@ def getMultiFreecidr(self,tenant_id,region): return obj def useCidr(self,id_,tenantid,network_id,region): - cursor=connection.cursor() - try: - cursor.execute(C2_CIDR_UPDATE,(tenantid,network_id,id_,region)) - except Exception,ex: - print Exception,":",ex - return False - finally: - cursor.close() - return True - - - - - - - - - - - - - - - - + cursor=connection.cursor() + try: + cursor.execute(C2_CIDR_UPDATE,(tenantid,network_id,id_,region)) + except Exception,ex: + print Exception,":",ex + return False + finally: + cursor.close() + return True +ALARM_ITEM_GET = """SELECT * FROM alarm WHERE disable='0' AND region=%s AND cycletime=%s""" +ALARM_CONTACTS_GET = """SELECT terminal FROM contacts WHERE list_id=%s AND type=%s""" +""" +alarm_item= [{ + 'instance':'***', + 'alarm_obj':'***', + 'threshold':'***', + 'region':'***', + 'contacts':{ + 'email':['*','*'], + 'sms':['*','*'] + } + }, + ] +""" +class AlarmManager: + def getAlarmFromCycletime(self, region, time): + result = self._getAlarmItemsFromCycletime(region, time) + alarm_items = [] + for line in result: + instance_id = line[9] + alarm_obj = line[3] + threshold = line[4] + region = line[11] + contact_list = line[8] + instance = self._getInstancedetail(instance_id, region) + sms_list = self._getAlarmContacts(contact_list, 'SMS') + email_list = self._getAlarmContacts(contact_list, 'EMAIL') + contacts = {'sms':sms_list, 'email':email_list} + alarm_item = {'instance':instance, + 'alarm_obj':alarm_obj, + 'threshold':threshold, + 'region':region, + 'contacts':contacts + } + alarm_items.append(alarm_item) + return alarm_items + + def _getAlarmItemsFromCycletime(self, region, cycletime): + cursor=connection.cursor() + try: + cursor.execute(ALARM_ITEM_GET, (region, cycletime)) + result = cursor.fetchall() + except Exception,ex: + print Exception,":",ex + return [] + finally: + cursor.close() + return result + + def _getAlarmContacts(self, list_id, type): + cursor=connection.cursor() + contacts_list = [] + try: + cursor.execute(ALARM_CONTACTS_GET, (list_id, type)) + result = cursor.fetchall() + for line in result: + contacts_list.append(line[0]) + except Exception,ex: + print Exception,":",ex + return [] + finally: + cursor.close() + return contacts_list + + def _getInstancedetail(self, instance_id, region): + item= {} + try: + vir = InstanceManager().getInstanceByID(NOVA_DB(region),instance_id) + item['instance_id']= instance_id + item['user'] = KeyStoneManager().getUserByUserID(vir.user_id) + item['project'] = KeyStoneManager().getProjectByProjectID(vir.project_id) + item['instance_name'] = vir.hostname + except Exception,ex: + print Exception,":",ex + return item diff --git a/api/c2_ssh.py b/api/c2_ssh.py index 64331cd..59a96b1 100644 --- a/api/c2_ssh.py +++ b/api/c2_ssh.py @@ -3,38 +3,38 @@ import json import os -def conn(host,command,user="root",pwd=None,port=22): - ssh=paramiko.SSHClient() - ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - print "host:%s,command:%s,user:%s,pwd:%s,port:%s" % (host,command,user,pwd,port) - PRIVATE_KEY='/root/.ssh/id_rsa' - ssh.connect(host,port,user,pwd,key_filename=PRIVATE_KEY) - stdin,stdout,stderr=ssh.exec_command(command) - error=stderr.readlines() - output=stdout.readlines() - ssh.close() - if not error: - return output - else: - errot_list=json.dumps(error) - print "An error happened by:%s" % errot_list - return error +def conn(host,command,user="root",pwd=None,port=22): + ssh=paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + print "host:%s,command:%s,user:%s,pwd:%s,port:%s" % (host,command,user,pwd,port) + PRIVATE_KEY='/root/.ssh/id_rsa' + ssh.connect(host,port,user,pwd,key_filename=PRIVATE_KEY) + stdin,stdout,stderr=ssh.exec_command(command) + error=stderr.readlines() + output=stdout.readlines() + ssh.close() + if not error: + return output + else: + errot_list=json.dumps(error) + print "An error happened by:%s" % errot_list + return error -def conn2(host,command,user="root",pwd=None,port=22): - ssh=paramiko.SSHClient() - ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - PRIVATE_KEY='/root/.ssh/id_rsa' - ssh.connect(host,port,user,pwd,key_filename=PRIVATE_KEY) -#,timeout=300 - stdin,stdout,stderr=ssh.exec_command(command) - error=stderr.readlines() - output=stdout.readlines() - ssh.close() - if not error: - return output - else: - return "An _error_ happened by:%s" % error +def conn2(host,command,user="root",pwd=None,port=22): + ssh=paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + PRIVATE_KEY='/root/.ssh/id_rsa' + ssh.connect(host,port,user,pwd,key_filename=PRIVATE_KEY) + #,timeout=300 + stdin,stdout,stderr=ssh.exec_command(command) + error=stderr.readlines() + output=stdout.readlines() + ssh.close() + if not error: + return output + else: + return "An _error_ happened by:%s" % error diff --git a/api/checker.py b/api/checker.py index 2df5d62..d88ea5e 100755 --- a/api/checker.py +++ b/api/checker.py @@ -9,12 +9,10 @@ #判断是否为整数 15 def IsNumber(varObj): - return type(varObj) is types.IntType #判断是否为字符串 string def IsString(varObj): - return type(varObj) is types.StringType #判断是否为浮点数 1.324 @@ -23,27 +21,22 @@ def IsFloat(varObj): #判断是否为字典 {'a1':'1','a2':'2'} def IsDict(varObj): - return type(varObj) is types.DictType #判断是否为tuple [1,2,3] def IsTuple(varObj): - return type(varObj) is types.TupleType #判断是否为List [1,3,4] def IsList(varObj): - return type(varObj) is types.ListType #判断是否为布尔值 True def IsBoolean(varObj): - return type(varObj) is types.BooleanType #判断是否为货币型 1.32 def IsCurrency(varObj): - #数字是否为整数或浮点数 if IsFloat(varObj) and IsNumber(varObj): #数字不能为负数 @@ -54,19 +47,16 @@ def IsCurrency(varObj): #判断某个变量是否为空 x def IsEmpty(varObj): - if len(varObj) == 0: return True return False #判断变量是否为None None def IsNone(varObj): - return type(varObj) is types.NoneType# == "None" or varObj == "none": #判断是否为日期格式,并且是否符合日历规则 2010-01-31 def IsDate(varObj): - if len(varObj) == 10: rule = '(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$/' match = re.match( rule , varObj ) @@ -77,17 +67,14 @@ def IsDate(varObj): #判断是否为邮件地址 def IsEmail(varObj): - rule = '[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$' match = re.match( rule , varObj ) - if match: return True return False #判断是否为中文字符串 def IsChineseCharString(varObj): - for x in varObj: if (x >= u"\u4e00" and x<=u"\u9fa5") or (x >= u'\u0041' and x<=u'\u005a') or (x >= u'\u0061' and x<=u'\u007a'): continue @@ -98,27 +85,22 @@ def IsChineseCharString(varObj): #判断是否为中文字符 def IsChineseChar(varObj): - if varObj[0] > chr(127): return True return False #判断帐号是否合法 字母开头,允许4-16字节,允许字母数字下划线 def IsLegalAccounts(varObj): - rule = '[a-zA-Z][a-zA-Z0-9_]{3,15}$' match = re.match( rule , varObj ) - if match: return True return False #匹配IP地址 def IsIpAddr(varObj): - rule = '\d+\.\d+\.\d+\.\d+' match = re.match( rule , varObj ) - if match: return True return False diff --git a/api/eva.py b/api/eva.py index f6df6e4..8008cf3 100755 --- a/api/eva.py +++ b/api/eva.py @@ -10,6 +10,8 @@ from public import NOVA_DB,NEUTRON_DB,NOVA,NEUTRON,RTN_200,RTN_500 import framework +from django.utils.encoding import smart_text + DATABASES=settings.DATABASES REGIONS=settings.REGIONS @@ -18,117 +20,113 @@ def controller(req,ip,region=settings.REGIONS): if not checker.IsIpAddr(ip): - rtn="check ip(%s) address failed" % ip + rtn="check ip(%s) address failed" % ip else: - ip_addr=req.META.get("REMOTE_ADDR",None) - user=framework.getApiUserByToken(req) - if not user: - return HttpResponse(RTN_500 % "Unknow auth token request." ) - regions=[] - if not region ==settings.REGIONS: - regions.append(region) - else: - regions=region - rtn=eva(ip,regions) - EvaLog().addLog(user,ip,rtn,ip_addr) + ip_addr=req.META.get("REMOTE_ADDR",None) + user=framework.getApiUserByToken(req) + if not user: + return HttpResponse(RTN_500 % "Unknow auth token request." ) + regions=[] + if not region ==settings.REGIONS: + regions.append(region) + else: + regions=region + rtn=eva(ip,regions) + EvaLog().addLog(user,ip,rtn,ip_addr) return HttpResponse(rtn) def eva(ip,regions): apitoken=ks_auth.getToken() if not apitoken: - return RTN_500 % "Can't get token from keystone" + return RTN_500 % "Can't get token from keystone" for region in regions: - if not NOVA(region) in nova_list: - print "DB %s_nova doesn't configure." % region - continue - if not NEUTRON(region) in neutron_list: - print "DB %s_neutron doesn't configure." % region - continue - print "---------Start to query instanceId from db(%s)-------------" % region - instanceBean=InstanceManager().findInstanceIdByIp(NEUTRON_DB(region),NOVA_DB(region),ip) - if not instanceBean: - print "can't find instance in db(%s) by vir" % region - print "------- check if it's a physical machine --------" - childs=InstanceManager().getChildrens(NOVA_DB(region),ip) - - print childs - - if not childs: - if isinstance(childs,list): - return RTN_500 % ("[] instance find in nova.instances by physical machine(%s) in Region(%s)" % (ip,region)) - print "can't find it as a physical machine in db(%s)" % region - continue - msg={} - for child in childs: - msg["uuid_%s" % child.uuid]=evacuate(apitoken,child,region,child.host) - return RTN_200 % msg - else: - mess=evacuate(apitoken,instanceBean,region,instanceBean.host) - return RTN_200 % mess + if not NOVA(region) in nova_list: + print "DB %s_nova doesn't configure." % region + continue + if not NEUTRON(region) in neutron_list: + print "DB %s_neutron doesn't configure." % region + continue + print "---------Start to query instanceId from db(%s)-------------" % region + instanceBean=InstanceManager().findInstanceIdByIp(NEUTRON_DB(region),NOVA_DB(region),ip) + if not instanceBean: + print "can't find instance in db(%s) by vir" % region + print "------- check if it's a physical machine --------" + childs=InstanceManager().getChildrens(NOVA_DB(region),ip) + + print childs + + if not childs: + if isinstance(childs,list): + return RTN_500 % ("[] instance find in nova.instances by physical machine(%s) in Region(%s)" % (ip,region)) + print "can't find it as a physical machine in db(%s)" % region + continue + msg={} + for child in childs: + msg["uuid_%s" % child.uuid]=evacuate(apitoken,child,region,child.host) + return RTN_200 % msg + else: + mess=evacuate(apitoken,instanceBean,region,instanceBean.host) + return RTN_200 % mess return RTN_500 % ("Can't find machine|virtual by ip (%s)" % ip) from su import runScript def evacuate(apitoken,instanceBean,region,filterHost=None): - node=getFilterAvailabilityHost(region,instanceBean.vcpus,instanceBean.memory_mb,filterHost,apitoken) - if not node: - node=getAvailabilityHost(region,instanceBean.vcpus,instanceBean.memory_mb,filterHost,apitoken) - else: - print "find filter node %s" % node - if not node: - return "no compute node match" - else: - rtn=ks_auth.evacuate(apitoken,region,instanceBean.uuid,node.hypervisor_hostname) - print "%s
adapt by
%s
%s" % (instanceBean,node,rtn) - if rtn.has_key("evacuate"): - runScript(region,instanceBean.uuid,"EVACUATE") - return rtn + node=getFilterAvailabilityHost(region,instanceBean.vcpus,instanceBean.memory_mb,filterHost,apitoken) + if not node: + node=getAvailabilityHost(region,instanceBean.vcpus,instanceBean.memory_mb,filterHost,apitoken) + else: + print "find filter node %s" % node + if not node: + return "no compute node match" + else: + rtn=ks_auth.evacuate(apitoken,region,instanceBean.uuid,node.hypervisor_hostname) + print "%s
adapt by
%s
%s" % (instanceBean,node,rtn) + if rtn.has_key("evacuate"): + runScript(region,instanceBean.uuid,"EVACUATE") + return rtn def getFreeResByRegion(req,region=None): if not region or not region in nova_list: - return HttpResponse("region(%s) doesn't exist." % region) + return HttpResponse("region(%s) doesn't exist." % region) nodes=ComputeNodeMana().getComputeNodes(NOVA_DB(region)) #return HttpResponse(json.dumps(nodes), content_type="application/json") return HttpResponse(nodes) def getAvailabilityHost(region,cpu,mem,filterHost=None,apitoken=None): print "cpu %s mem %s" % (cpu,mem) - + nodes=ComputeNodeMana().getComputeNodes(NOVA_DB(region)) print "nodes %s " % nodes service=ks_auth.getOsServices(apitoken,region) if not service: - return HttpResponse("Can't get service status.") + return HttpResponse("Can't get service status.") for node in nodes: - if filterHost and filterHost==node.hypervisor_hostname: - continue - if not service.has_key(node.hypervisor_hostname) or service[node.hypervisor_hostname]=="down": - continue - if node.availability(cpu,mem): - return node + if filterHost and filterHost==node.hypervisor_hostname: + continue + if not service.has_key(node.hypervisor_hostname) or service[node.hypervisor_hostname]=="down": + continue + if node.availability(cpu,mem): + return node return None def getFilterAvailabilityHost(region,cpu,mem,filterHost=None,apitoken=None): - zones=ks_auth.getAvaZones(apitoken,region) - if not zones.has_key(settings.BACK_UP_AZ) or not zones[settings.BACK_UP_AZ]: - print "Can't find backupAZ compute nodes" - return None + print "Can't find backupAZ compute nodes" + return None backupAZ=zones[settings.BACK_UP_AZ] - #filters=",".join(backupAZ) - nodes=ComputeNodeMana().getFilterComputeNodes(NOVA_DB(region),backupAZ) for node in nodes: - if node.availability(cpu,mem): - return node + if node.availability(cpu,mem): + return node return None def test(req): @@ -138,64 +136,63 @@ def test(req): def getMachineInfoByIp(req,ip): apitoken=ks_auth.getToken() if not apitoken: - return HttpResponse("Can't get token from keystone") + return HttpResponse("Can't get token from keystone") for region in REGIONS: - if not NOVA(region) in nova_list: - print "DB %s_nova doesn't configure." % region - continue - if not NEUTRON(region) in neutron_list: - print "DB %s_neutron doesn't configure." % region - continue - print "---------Start to query instanceId from db(%s)-------------" % region - instanceBean=InstanceManager().findInstanceIdByIp(connections[NEUTRON(region)],connections[NOVA(region)],ip) - if not instanceBean: - print "can't find instance in db(%s) by vir" % region - print "------- check if it's a physical machine --------" - cnode=ComputeNodeMana().getComputeNodeByIp(ip,connections[NOVA(region)]) - - if cnode: - return HttpResponse("Region(%s),physical machine info:%s" % (region,cnode)) - else: - return HttpResponse("Region(%s),virtual instance info:%s" % (region,instanceBean)) + if not NOVA(region) in nova_list: + print "DB %s_nova doesn't configure." % region + continue + if not NEUTRON(region) in neutron_list: + print "DB %s_neutron doesn't configure." % region + continue + print "---------Start to query instanceId from db(%s)-------------" % region + instanceBean=InstanceManager().findInstanceIdByIp(connections[NEUTRON(region)],connections[NOVA(region)],ip) + if not instanceBean: + print "can't find instance in db(%s) by vir" % region + print "------- check if it's a physical machine --------" + cnode=ComputeNodeMana().getComputeNodeByIp(ip,connections[NOVA(region)]) + + if cnode: + return HttpResponse("Region(%s),physical machine info:%s" % (region,cnode)) + else: + return HttpResponse("Region(%s),virtual instance info:%s" % (region,instanceBean)) return HttpResponse("Can't get machine info.") def getServiceStatus(req): apitoken=ks_auth.getToken() if not apitoken: - return HttpResponse("Can't get token from keystone") + return HttpResponse("Can't get token from keystone") response="" for region in REGIONS: service=ks_auth.getOsServices(apitoken,region) if not service: - return HttpResponse("Can't get service status from Region %s" % region) + return HttpResponse("Can't get service status from Region %s" % region) else: - response+="
Region:%s
" % region - for k,v in service.items(): - if v=="down": - response+=k+"  "+v+"
" - else: - response+=k+"  "+v+"
" - + response+="
Region:%s
" % region + for k,v in service.items(): + if v=="down": + response+=k+"  "+v+"
" + else: + response+=k+"  "+v+"
" return HttpResponse(response) - + def az_list(req): apitoken=ks_auth.getToken() if not apitoken: - return HttpResponse("Can't get token from keystone") + return HttpResponse("Can't get token from keystone") zones=ks_auth.getAvaZones(apitoken,"RegionOne") if not zones: - return HttpResponse("Can't get az - compute nodes.") + return HttpResponse("Can't get az - compute nodes.") else: - json_str=json.dumps(zones) - return render_to_response('json.html',locals()) + json_str=json.dumps(zones) + return render_to_response('json.html',locals()) def getFreeRes(req): regions={} for nova_db in nova_list: - nodes=ComputeNodeMana().getComputeNodes(connections[nova_db]) - regions[nova_db]=nodes - print nodes + nodes=ComputeNodeMana().getComputeNodes(connections[nova_db]) + regions[nova_db]=nodes + print nodes #nodes=ComputeNodeMana().getComputeNodes(connections["dev112_nova"]) return render_to_response('free_res.html',locals()) @@ -204,17 +201,17 @@ def ip_list(req): totals={} print neutron_list for neutron_db in neutron_list: - ips=NetWorkManager().getFreeIp(connections[neutron_db]) - print "ips %s" % ips - regions[neutron_db]=ips - totals[neutron_db]=json.dumps(NetWorkManager().getAllTotalNum(ips,connections[neutron_db])) + ips=NetWorkManager().getFreeIp(connections[neutron_db]) + print "ips %s" % ips + regions[neutron_db]=ips + totals[neutron_db]=json.dumps(NetWorkManager().getAllTotalNum(ips,connections[neutron_db])) print regions print totals return render_to_response('ip_list.html',locals()) def ip_list_region(req,region): if not region in REGIONS: - return HttpResponse("""{"code":500,"message":"region doesn't exist"}""") + return HttpResponse("""{"code":500,"message":"region doesn't exist"}""") neutron_db=NEUTRON_DB(region) ips=NetWorkManager().getFreeIp(neutron_db) obj=json.dumps(NetWorkManager().getAllTotalNum(ips,neutron_db)) @@ -222,25 +219,43 @@ def ip_list_region(req,region): def get_ava_network(req,region,nets): if not region in REGIONS: - return HttpResponse("""{"code":500,"message":"region doesn't exist"}""") + return HttpResponse("""{"code":500,"message":"region doesn't exist"}""") neutron_db=NEUTRON_DB(region) ips=NetWorkManager().getFreeIp(neutron_db) nodes=NetWorkManager().getAllTotalNum(ips,neutron_db) array=nets.split("_") obj=[] for tag in array: - check=getAvaNetworkId(nodes,tag) - if check==0: - return HttpResponse("""{"code":500,"message":"no free ip in %s."}""" % tag) - obj.append(check) + check=getAvaNetworkId(nodes,tag) + if check==0: + return HttpResponse("""{"code":500,"message":"no free ip in %s."}""" % tag) + obj.append(check) return HttpResponse("""{"code":200,"message":"ok","data":"%s"}""" % ",".join(obj)) def getAvaNetworkId(nodes,tag): for k,v in nodes.items(): - if tag in k and v["freeNum"]>0: - return v["network_id"] + if tag in k and v["freeNum"]>0: + return v["network_id"] return 0 - - +""" +def virs_list(req,region): + REGION=region + virs=InstanceManager().getallActiveInstances(NOVA_DB(region)) + data = [] + for vir in virs: + item= {} + item['instance_id']= vir.uuid + #item['user'] = KeyStoneManager().getUserByUserID(vir.user_id).encode('latin-1').decode('utf-8') + #item['project'] = KeyStoneManager().getProjectByProjectID(vir.project_id).encode('latin-1').decode('utf-8') + item['user'] = KeyStoneManager().getUserByUserID(vir.user_id) + item['project'] = KeyStoneManager().getProjectByProjectID(vir.project_id) + #smart_text(item['user'], encoding='latin-1', strings_onliy=False, error='strict') + #smart_text(item['project'], encoding='latin-1', strings_onliy=False, error='strict')l + item['instance_name'] = vir.hostname + #data.append(vir.uuid) + data.append(item) + body = json.dumps({"code":200,"message":"ok","data":data},ensure_ascii=False, indent=2) + return HttpResponse(body) +""" diff --git a/api/framework.py b/api/framework.py index e71d802..81492f6 100644 --- a/api/framework.py +++ b/api/framework.py @@ -3,16 +3,16 @@ def require_login(view): def new_view(req,*args,**kwargs): - token=req.META.get("HTTP_C2_AUTH_TOKEN",None) - print token - if not settings.C2_AUTH_TOKEN.has_key(token): - return HttpResponse("Unknow auth token(%s) request." % token) - return view(request,*args,**kwargs) + token=req.META.get("HTTP_C2_AUTH_TOKEN",None) + print token + if not settings.C2_AUTH_TOKEN.has_key(token): + return HttpResponse("Unknow auth token(%s) request." % token) + return view(request,*args,**kwargs) return new_view def getApiUserByToken(req): token=req.META.get("HTTP_C2_AUTH_TOKEN",None) if not settings.C2_AUTH_TOKEN.has_key(token): - return None + return None else: - return settings.C2_AUTH_TOKEN[token] + return settings.C2_AUTH_TOKEN[token] diff --git a/api/ks_auth.py b/api/ks_auth.py index 15c729d..6366f41 100755 --- a/api/ks_auth.py +++ b/api/ks_auth.py @@ -13,20 +13,20 @@ def getTokenFromKS(): - headers1 = {"Content-type":"application/json" } - KEYSTONE=settings.SYS_C2["KS_AUTH"] - conn1 = httplib.HTTPConnection(connUrl(KEYSTONE)) - params1 = '{"auth": {"tenantName":"%(KS_TENANT)s", "passwordCredentials": {"username": "%(KS_USER)s", "password": "%(KS_PWD)s"}}}' % settings.SYS_C2 - conn1.request("POST","%s/tokens" % KEYSTONE ,params1,headers1) - response1 = conn1.getresponse() - data1 = response1.read() - dd1 = json.loads(data1) - apitoken = dd1['access']['token']['id'] - expire=dd1['access']['token']['expires'] - public.TOKEN["id"]=apitoken - public.TOKEN["expire"]=utils.getNowAfterHours() - conn1.close() - return apitoken + headers1 = {"Content-type":"application/json" } + KEYSTONE=settings.SYS_C2["KS_AUTH"] + conn1 = httplib.HTTPConnection(connUrl(KEYSTONE)) + params1 = '{"auth": {"tenantName":"%(KS_TENANT)s", "passwordCredentials": {"username": "%(KS_USER)s", "password": "%(KS_PWD)s"}}}' % settings.SYS_C2 + conn1.request("POST","%s/tokens" % KEYSTONE ,params1,headers1) + response1 = conn1.getresponse() + data1 = response1.read() + dd1 = json.loads(data1) + apitoken = dd1['access']['token']['id'] + expire=dd1['access']['token']['expires'] + public.TOKEN["id"]=apitoken + public.TOKEN["expire"]=utils.getNowAfterHours() + conn1.close() + return apitoken def getToken(): expire=public.TOKEN["expire"] @@ -34,164 +34,148 @@ def getToken(): now=utils.getlocalstrtime() print "now:",now if expire>now: - print "expire>now" + print "expire>now" return public.TOKEN["id"] else: - print "expire%s" % response1 - - #dd1 = json.loads(data1) - if not rtn: - return None - - - - rtn = json.loads(rtn) - services={} - - for service in rtn['services']: - if not service["binary"]=="nova-compute" or service["zone"]=="internal": - continue - services[service["host"]]=service["state"] - - print "----------------------------------------------------" - print services - return services +def getOsServices(apitoken,region): + Compute=KeyStoneManager().getServiceUrl("compute",region) + headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } + conn1 = httplib.HTTPConnection(connUrl(Compute)) + conn1.request("GET","%s/os-services" % Compute,None,headers1) + response1 = conn1.getresponse() + rtn = response1.read() + conn1.close() + print "getOsServices:os-services->%s" % response1 + #dd1 = json.loads(data1) + if not rtn: + return None + + rtn = json.loads(rtn) + services={} + + for service in rtn['services']: + if not service["binary"]=="nova-compute" or service["zone"]=="internal": + continue + services[service["host"]]=service["state"] + + print "----------------------------------------------------" + print services + return services def connUrl(url): - rtn=url.replace("http://","") - return rtn[:(rtn.index("/"))] if "/" in rtn else rtn + rtn=url.replace("http://","") + return rtn[:(rtn.index("/"))] if "/" in rtn else rtn def getAvaZones(apitoken,region): - Compute=KeyStoneManager().getServiceUrl("compute",region) - print "getAvaZones compute ->%s" % Compute - - headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } - - conn1 = httplib.HTTPConnection(connUrl(Compute)) + Compute=KeyStoneManager().getServiceUrl("compute",region) + print "getAvaZones compute ->%s" % Compute + headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } + conn1 = httplib.HTTPConnection(connUrl(Compute)) + conn1.request("GET","%s/os-availability-zone/detail" % Compute,None,headers1) - conn1.request("GET","%s/os-availability-zone/detail" % Compute,None,headers1) + response1 = conn1.getresponse() + rtn = response1.read() + conn1.close() - response1 = conn1.getresponse() + if not rtn: + return None - rtn = response1.read() - conn1.close() + rtn = json.loads(rtn) + zones={} - if not rtn: - return None - - rtn = json.loads(rtn) - zones={} + print rtn - print rtn + for zone in rtn['availabilityZoneInfo']: + if zone["zoneName"]=="internal" or not zone["zoneState"]["available"]: + continue + zones[zone["zoneName"]]=[] + for k,v in zone["hosts"].items(): + if not v["nova-compute"]["available"] or not v["nova-compute"]["active"]: + continue + zones[zone["zoneName"]].append(k) - for zone in rtn['availabilityZoneInfo']: - if zone["zoneName"]=="internal" or not zone["zoneState"]["available"]: - continue - zones[zone["zoneName"]]=[] - for k,v in zone["hosts"].items(): - if not v["nova-compute"]["available"] or not v["nova-compute"]["active"]: - continue - zones[zone["zoneName"]].append(k) - - print "----------------------------------------------------" - print zones - return zones + print "----------------------------------------------------" + print zones + return zones def createNetwork(apitoken,region,segmentation_id,networkname,tenant_id): - Network=KeyStoneManager().getServiceUrl("network",region,{"tenant_id":tenant_id}) - headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } - conn1 = httplib.HTTPConnection(connUrl(Network)) - data={ - "network": { - "name": networkname, - "admin_state_up": True, - "provider:segmentation_id":segmentation_id, - "provider:network_type":"vlan", - "provider:physical_network":"vlannet", - "tenant_id":tenant_id, - "shared":False - } - } - param=json.dumps(data) - print param - print "%s/networks" % Network - conn1.request("POST","%s/v2.0/networks" % Network,param,headers1) - response1 = conn1.getresponse() - rtn = response1.read() - conn1.close() - if rtn: - rtn = json.loads(rtn) - print rtn - return rtn + Network=KeyStoneManager().getServiceUrl("network",region,{"tenant_id":tenant_id}) + headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } + conn1 = httplib.HTTPConnection(connUrl(Network)) + data={ + "network": { + "name": networkname, + "admin_state_up": True, + "provider:segmentation_id":segmentation_id, + "provider:network_type":"vlan", + "provider:physical_network":"vlannet", + "tenant_id":tenant_id, + "shared":False + } + } + param=json.dumps(data) + print param + print "%s/networks" % Network + conn1.request("POST","%s/v2.0/networks" % Network,param,headers1) + response1 = conn1.getresponse() + rtn = response1.read() + conn1.close() + if rtn: + rtn = json.loads(rtn) + print rtn + return rtn def createSubnet(apitoken,region,cidr,network_id,tenant_id): - Network=KeyStoneManager().getServiceUrl("network",region,{"tenant_id":tenant_id}) - headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } - conn1 = httplib.HTTPConnection(connUrl(Network)) - data={ - "subnet": { - "network_id": network_id, - "cidr": cidr, - "ip_version":4, - "tenant_id":tenant_id, - "enable_dhcp":True, - "name":"%s-net" % cidr.split("/")[0], - "gateway_ip":None - } - } - param=json.dumps(data) - print param - conn1.request("POST","%s/v2.0/subnets" % Network,param,headers1) - response1 = conn1.getresponse() - rtn = response1.read() - conn1.close() - #dd1 = json.loads(data1) - if rtn: - rtn = json.loads(rtn) - print rtn - return rtn + Network=KeyStoneManager().getServiceUrl("network",region,{"tenant_id":tenant_id}) + headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } + conn1 = httplib.HTTPConnection(connUrl(Network)) + data={ + "subnet": { + "network_id": network_id, + "cidr": cidr, + "ip_version":4, + "tenant_id":tenant_id, + "enable_dhcp":True, + "name":"%s-net" % cidr.split("/")[0], + "gateway_ip":None + } + } + param=json.dumps(data) + print param + conn1.request("POST","%s/v2.0/subnets" % Network,param,headers1) + response1 = conn1.getresponse() + rtn = response1.read() + conn1.close() + #dd1 = json.loads(data1) + if rtn: + rtn = json.loads(rtn) + print rtn + return rtn diff --git a/api/ks_auth.py.bak b/api/ks_auth.py.bak new file mode 100755 index 0000000..a5d004e --- /dev/null +++ b/api/ks_auth.py.bak @@ -0,0 +1,193 @@ +#!/usr/bin/python +#coding=utf-8 + +import base64,urllib,httplib,json,os + +from urlparse import urlparse +from django.conf import settings +import json +from beans import KeyStoneManager +import public +from public import NOVA_DB,NEUTRON_DB,NOVA,NEUTRON +import utils + + +def getTokenFromKS(): + headers1 = {"Content-type":"application/json" } + KEYSTONE=settings.SYS_C2["KS_AUTH"] + conn1 = httplib.HTTPConnection(connUrl(KEYSTONE)) + params1 = '{"auth": {"tenantName":"%(KS_TENANT)s", "passwordCredentials": {"username": "%(KS_USER)s", "password": "%(KS_PWD)s"}}}' % settings.SYS_C2 + conn1.request("POST","%s/tokens" % KEYSTONE ,params1,headers1) + response1 = conn1.getresponse() + data1 = response1.read() + dd1 = json.loads(data1) + apitoken = dd1['access']['token']['id'] + expire=dd1['access']['token']['expires'] + public.TOKEN["id"]=apitoken + public.TOKEN["expire"]=utils.getNowAfterHours() + conn1.close() + return apitoken + +def getToken():#headers1 = { "X-Auth-Token":"422172848609489ea8126be290b4687f", "Content-type":"application/json" } + expire=public.TOKEN["expire"] + now=utils.getlocalstrtime() + if expire>now: + return public.TOKEN["id"] + else: + return getTokenFromKS() + + +def evacuate(apitoken,region,server_id,targetHost): + + Compute=KeyStoneManager().getServiceUrl("compute",region) + + headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } + conn1 = httplib.HTTPConnection(connUrl(Compute)) + + param=json.dumps({"evacuate": {"host":targetHost,"onSharedStorage": "False"}}) + print param + + conn1.request("POST","%s/servers/%s/action" % (Compute,server_id),param,headers1) + + response1 = conn1.getresponse() + + rtn = response1.read() + conn1.close() + #dd1 = json.loads(data1) + if rtn: + rtn = json.loads(rtn) + + print rtn + return rtn + +def getOsServices(apitoken,region): + Compute=KeyStoneManager().getServiceUrl("compute",region) + + headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } + + conn1 = httplib.HTTPConnection(connUrl(Compute)) + + conn1.request("GET","%s/os-services" % Compute,None,headers1) + + response1 = conn1.getresponse() + + rtn = response1.read() + + conn1.close() + + print "getOsServices:os-services->%s" % response1 + + #dd1 = json.loads(data1) + if not rtn: + return None + + + + rtn = json.loads(rtn) + services={} + + for service in rtn['services']: + if not service["binary"]=="nova-compute" or service["zone"]=="internal": + continue + services[service["host"]]=service["state"] + + print "----------------------------------------------------" + print services + return services + +def connUrl(url): + rtn=url.replace("http://","") + return rtn[:(rtn.index("/"))] if "/" in rtn else rtn + +def getAvaZones(apitoken,region): + Compute=KeyStoneManager().getServiceUrl("compute",region) + print "getAvaZones compute ->%s" % Compute + + headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } + + conn1 = httplib.HTTPConnection(connUrl(Compute)) + + conn1.request("GET","%s/os-availability-zone/detail" % Compute,None,headers1) + + response1 = conn1.getresponse() + + rtn = response1.read() + conn1.close() + + if not rtn: + return None + + rtn = json.loads(rtn) + zones={} + + print rtn + + for zone in rtn['availabilityZoneInfo']: + if zone["zoneName"]=="internal" or not zone["zoneState"]["available"]: + continue + zones[zone["zoneName"]]=[] + for k,v in zone["hosts"].items(): + if not v["nova-compute"]["available"] or not v["nova-compute"]["active"]: + continue + zones[zone["zoneName"]].append(k) + + print "----------------------------------------------------" + print zones + return zones + +def createNetwork(apitoken,region,segmentation_id,networkname,tenant_id): + Network=KeyStoneManager().getServiceUrl("network",region,{"tenant_id":tenant_id}) + headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } + conn1 = httplib.HTTPConnection(connUrl(Network)) + data={ + "network": { + "name": networkname, + "admin_state_up": True, + "provider:segmentation_id":segmentation_id, + "provider:network_type":"vlan", + "provider:physical_network":"vlannet", + "tenant_id":tenant_id, + "shared":False + } + } + param=json.dumps(data) + print param + print "%s/networks" % Network + conn1.request("POST","%s/v2.0/networks" % Network,param,headers1) + response1 = conn1.getresponse() + rtn = response1.read() + conn1.close() + if rtn: + rtn = json.loads(rtn) + print rtn + return rtn + +def createSubnet(apitoken,region,cidr,network_id,tenant_id): + Network=KeyStoneManager().getServiceUrl("network",region,{"tenant_id":tenant_id}) + headers1 = { "X-Auth-Token":apitoken, "Content-type":"application/json" } + conn1 = httplib.HTTPConnection(connUrl(Network)) + data={ + "subnet": { + "network_id": network_id, + "cidr": cidr, + "ip_version":4, + "tenant_id":tenant_id, + "enable_dhcp":True, + "name":"%s-net" % cidr.split("/")[0], + "gateway_ip":None + } + } + param=json.dumps(data) + print param + conn1.request("POST","%s/v2.0/subnets" % Network,param,headers1) + response1 = conn1.getresponse() + rtn = response1.read() + conn1.close() + #dd1 = json.loads(data1) + if rtn: + rtn = json.loads(rtn) + print rtn + return rtn + + + diff --git a/api/metric.py b/api/metric.py index 596600a..7ec9be4 100644 --- a/api/metric.py +++ b/api/metric.py @@ -24,6 +24,8 @@ def m1(req): token=ks_auth.getToken() expire=public.TOKEN["expire"] li=json.dumps(public.TOKEN) + metricUrl = '1111' + expire = '22222' return render_to_response('m1.html',locals()) PERIOD={ @@ -41,8 +43,8 @@ def m1(req): } def connUrl(url): - rtn=url.replace("http://","") - return rtn[:(rtn.index("/"))] if "/" in rtn else rtn + rtn=url.replace("http://","") + return rtn[:(rtn.index("/"))] if "/" in rtn else rtn def ifaceID(uuid,portid,instid): @@ -76,7 +78,7 @@ def statistics(region,Meteric,duration,RES_ID): rtn = response1.read() conn1.close() if rtn: - rtn = json.loads(rtn) + rtn = json.loads(rtn) print "rtn:",rtn return rtn @@ -110,5 +112,62 @@ def statics(req,Meteric,UUID,duration,region): RTN.append(obj) return HttpResponse(json.dumps(RTN)) +""" +####same wit statics, need fix later +def alarm_statics(req,Meteric,UUID,time,region): + vir=InstanceManager().getInstanceByID(NOVA_DB(region),UUID) + if not vir: + return None + RTN=[] + if "network" in Meteric: + ports=NetworkFlowManager().getNetInfoByUUID(UUID,NEUTRON_DB(region)) + print ports + for port in ports: + obj={} + obj["name"]=port["ip_address"] + ifaceId=ifaceID(UUID,port["id"],int(vir.id)) + print "ifaceid:",ifaceId + obj["data"]=alarm_statistics(region,Meteric.replace("_","."),time,ifaceId) + RTN.append(obj) + elif "disk" in Meteric: + obj={} + obj["name"]=vir.hostname + obj["data"]=alarm_statistics(region,Meteric.replace("_","."),time,UUID) + RTN.append(obj) + elif "cpu_util"==Meteric: + obj={} + obj["name"]=vir.hostname + obj["data"]=alarm_statistics(region,Meteric,time,UUID) + RTN.append(obj) + return HttpResponse(json.dumps(RTN)) + +def alarm_statistics(region,Meteric,duration,RES_ID): + metricUrl=KeyStoneManager().getServiceUrl("metering",region) + token=ks_auth.getToken() + print "token:",token + headers1 = { "X-Auth-Token":token, "Content-type":"application/json" } + now=int(time.time()) + duration_sec=int(duration) + period_start=utils.msecs2utc(now-8*3600-duration_sec) + data1={ + "Meteric":Meteric, + "RES_ID":RES_ID, + "period":1, + "period_start":urllib.quote(period_start,''), + } + print "metricUrl:",metricUrl + print "->:",connUrl(metricUrl) + conn1 = httplib.HTTPConnection(connUrl(metricUrl)) + m_url="/v2/meters/%(Meteric)s/statistics?q.field=resource_id&q.field=timestamp&q.op=eq&q.op=gt&q.type=&q.type=&q.value=%(RES_ID)s&q.value=%(period_start)s&period=%(period)s" % data1 + print "m_url:",m_url + conn1.request("GET",m_url,None,headers1) + response1 = conn1.getresponse() + rtn = response1.read() + conn1.close() + if rtn: + rtn = json.loads(rtn) + print "rtn:",rtn + return rtn +""" diff --git a/api/public.py b/api/public.py index 260f7ef..e0d880d 100644 --- a/api/public.py +++ b/api/public.py @@ -16,7 +16,7 @@ def getConnIp(host_ip): compute_nodes_interface={"172.28.2":"172.28.1","172.29.204":"172.29.202","172.30.251":"172.30.250"} prex=".".join(host_ip.split(".")[:3]) if compute_nodes_interface.has_key(prex): - host_ip=host_ip.replace(prex,compute_nodes_interface[prex]) + host_ip=host_ip.replace(prex,compute_nodes_interface[prex]) return host_ip diff --git a/api/su.py b/api/su.py index 4551d57..50bc9cf 100644 --- a/api/su.py +++ b/api/su.py @@ -24,29 +24,35 @@ def limitSu(req,region,uuid,network_flow,network_id): network_list=network_id.split("_") rtn={} for network in network_list: - addSuc=NetWorkFlow().addNetWorkFlow(uuid,network_flow,region,network) - if addSuc: - rtn=runScript(region,uuid,"INIT") - print "limitsu:",rtn - if "_error500_" in rtn: - return HttpResponse(RTN_500 % rtn) - else: - rtn=RTN_500 % "add networkflow failed" + addSuc=NetWorkFlow().addNetWorkFlow(uuid,network_flow,region,network) + if addSuc: + rtn=runScript(region,uuid,"INIT") + print "limitsu:",rtn + if "_error500_" in rtn: + return HttpResponse(RTN_500 % rtn) + else: + rtn=RTN_500 % "add networkflow failed" return HttpResponse(rtn) def relimit(req,region,uuid,action): if action not in ["RESTART","EVACUATE","INIT"]: - return HttpResponse(RTN_500 % "Unknow limit su action request.") + return HttpResponse(RTN_500 % "Unknow limit su action request.") rtn=runScript(region,uuid,action) return HttpResponse(rtn) + #import threading + #limitthread = threading.Thread(target = limit_entry, name = "limit_thread", args = (region, uuid, action)) + #limitthread.setDaemon(True) + #limitthread.start() + #rtn = """{"code":200,"message":"ok","data":"null"}""" + #return HttpResponse(rtn) def chgPwd(req,uuid,region,pwd): user=framework.getApiUserByToken(req) #if not user: - #return HttpResponse(RTN_500 % "Unknow auth token request.") + #return HttpResponse(RTN_500 % "Unknow auth token request.") hostInfo=InstanceManager().getHostIp(NOVA_DB(region),uuid) if not hostInfo: - return HttpResponse(RTN_500 % ("Can't find host ip by uuid(%s) in Region(%s)" % (uuid,region))) + return HttpResponse(RTN_500 % ("Can't find host ip by uuid(%s) in Region(%s)" % (uuid,region))) host_ip=hostInfo["host_ip"] #change private to public ip @@ -58,73 +64,89 @@ def chgPwd(req,uuid,region,pwd): exe="%s %s %s" %(script_name,vir,pwd) print "runScript--->host_ip:%s,exe:%s" % (host_ip,exe) try: - LOG=c2_ssh.conn(host_ip,exe) + LOG=c2_ssh.conn(host_ip,exe) except Exception,ex: - print Exception,":",ex - LOG="SSH exception:%s" % str(ex) + print Exception,":",ex + LOG="SSH exception:%s" % str(ex) return HttpResponse((RTN_200 % LOG) if "True\n" in LOG else (RTN_500 % LOG)) +#def limit_entry(region, uuid, action): +# index = 0 +# while(True): +# stat = InstanceManager().getInstanceStat(NOVA_DB(region),uuid) +# print "The instance %s power_state is %s"%(uuid, stat) +# if stat == "running": +# runScript(region,uuid,action) +# break +# elif stat == None: +# print "Can't find instance %s"%uuid +# break +# else: +# time.sleep(5) +# index = index + 1 +# if index > 1000: +# print "Can't limit the vm %s's network, because it's not running"%uuid + def runScript(region,uuid,action): #find host ip - time.sleep(5) + #time.sleep(5) hostInfo=InstanceManager().getHostIp(NOVA_DB(region),uuid) if not hostInfo: - print "Can't find host ip by uuid(%s) in Region(%s)" % (uuid,region) - return "_error500_ Can't find host ip by uuid(%s) in Region(%s)" % (uuid,region) + print "Can't find host ip by uuid(%s) in Region(%s)" % (uuid,region) + return "_error500_ Can't find host ip by uuid(%s) in Region(%s)" % (uuid,region) print "xxx_",hostInfo["host_ip"] host_ip=getConnIp(hostInfo["host_ip"]) print "---hostip:",host_ip su_list=NetWorkFlow().getNetWorkFlows(uuid,region) msg={} for su in su_list: - #find vir name by port - print "-region-%s| -uuid-%s| -action-%s|-network-%s,loop!!!" % (region,uuid,action,su["network_id"]) - port=NetworkFlowManager().getNetInfoByUUIDAndNetId(NEUTRON_DB(su["region"]),su["uuid"],su["network_id"]) - if not port: - print "-region-%s| -uuid-%s| -action-%s|-network-%s,can't find port!!!" % (region,uuid,action,su["network_id"]) - continue - virName="tap"+port["id"][0:11] - netWorkName=port["network_name"] - network_flow=su["network_flow"] - script_params="start "+virName+" "+str(network_flow)+" "+str(network_flow) - #command -------port_id network_flow start tapName 30 30 - script_name=settings.C2_LIMIT_NETWORK_FLOW_SCRIPT - exe=script_name+" "+script_params - print "runScript(limit su)--->host_ip:%s,exe:%s" % (host_ip,exe) - try: - LOG=c2_ssh.conn(host_ip,exe) - except Exception,ex: - print Exception,":",ex - LOG="SSH exception:%s" % str(ex) - msg[uuid+"_"+netWorkName]=LOG - NetWorkFlow().addLog(uuid,region,su["network_id"],netWorkName,LOG,action) + #find vir name by port + print "-region-%s| -uuid-%s| -action-%s|-network-%s,loop!!!" % (region,uuid,action,su["network_id"]) + port=NetworkFlowManager().getNetInfoByUUIDAndNetId(NEUTRON_DB(su["region"]),su["uuid"],su["network_id"]) + if not port: + print "-region-%s| -uuid-%s| -action-%s|-network-%s,can't find port!!!" % (region,uuid,action,su["network_id"]) + continue + virName="tap"+port["id"][0:11] + netWorkName=port["network_name"] + network_flow=su["network_flow"] + script_params="start "+virName+" "+str(network_flow)+" "+str(network_flow) + #command -------port_id network_flow start tapName 30 30 + script_name=settings.C2_LIMIT_NETWORK_FLOW_SCRIPT + exe=script_name+" "+script_params + print "runScript(limit su)--->host_ip:%s,exe:%s" % (host_ip,exe) + try: + LOG=c2_ssh.conn(host_ip,exe) + except Exception,ex: + print Exception,":",ex + LOG="SSH exception:%s" % str(ex) + msg[uuid+"_"+netWorkName]=LOG + NetWorkFlow().addLog(uuid,region,su["network_id"],netWorkName,LOG,action) return """{"code":200,"message":"ok","data":%s}""" % json.dumps(msg) - def getUserNetwork(req,region,tenant_id,networkname): if not region in REGIONS: return HttpResponse("""{"code":500,"message":"X REG."}""") obj=C2cidrManager().getFreecidr(tenant_id,region) if not obj: - return HttpResponse("""{"code":500,"message":"Can't find cidr."}""") + return HttpResponse("""{"code":500,"message":"Can't find cidr."}""") if not obj["network_id"]: - apitoken=ks_auth.getToken() - if not apitoken: - return HttpResponse("""{"code":500,"message":"Can't get token from keystone"}""") - #create network - data=ks_auth.createNetwork(apitoken,region,obj["id"],base64.standard_b64decode(networkname),tenant_id) - if not data or data.has_key("NeutronError"): - return HttpResponse("""{"code":500,"message":"Can't get data from create-network api.","data":"%s"}""" % (None if not data else data)) - network=data["network"]["id"] - #create subnet - data2=ks_auth.createSubnet(apitoken,region,obj["cidr"],network,tenant_id) - if not data2 or data2.has_key("NeutronError"): - return HttpResponse("""{"code":500,"message":"Can't get data from create-subnet api.","data":"%s"}""" % (None if not data2 else data2)) - #update cidr - C2cidrManager().useCidr(int(obj["id"]),tenant_id,network,region) - return HttpResponse("""{"code":200,"message":"ok","data":"%s"}""" % network) + apitoken=ks_auth.getToken() + if not apitoken: + return HttpResponse("""{"code":500,"message":"Can't get token from keystone"}""") + #create network + data=ks_auth.createNetwork(apitoken,region,obj["id"],base64.standard_b64decode(networkname),tenant_id) + if not data or data.has_key("NeutronError"): + return HttpResponse("""{"code":500,"message":"Can't get data from create-network api.","data":"%s"}""" % (None if not data else data)) + network=data["network"]["id"] + #create subnet + data2=ks_auth.createSubnet(apitoken,region,obj["cidr"],network,tenant_id) + if not data2 or data2.has_key("NeutronError"): + return HttpResponse("""{"code":500,"message":"Can't get data from create-subnet api.","data":"%s"}""" % (None if not data2 else data2)) + #update cidr + C2cidrManager().useCidr(int(obj["id"]),tenant_id,network,region) + return HttpResponse("""{"code":200,"message":"ok","data":"%s"}""" % network) else: - return HttpResponse("""{"code":200,"message":"ok","data":"%s"}""" % obj["network_id"]) + return HttpResponse("""{"code":200,"message":"ok","data":"%s"}""" % obj["network_id"]) def getMultiUserNetwork(req,region,tenant_id,networkname): if not region in REGIONS: @@ -151,13 +173,11 @@ def getMultiUserNetwork(req,region,tenant_id,networkname): else: return HttpResponse("""{"code":200,"message":"ok","data":"%s"}""" % obj["network_id"]) - def getUserNetwork2(req,region,tenant_id,networkname): - user=framework.getApiUserByToken(req) - if not user: - return HttpResponse(RTN_500 % "Unknow auth token request." ) - return getUserNetwork(req,region,tenant_id,networkname) - + user=framework.getApiUserByToken(req) + if not user: + return HttpResponse(RTN_500 % "Unknow auth token request." ) + return getUserNetwork(req,region,tenant_id,networkname) def getUserStackInfo(req,region,userid,tenantid): rtn={"Networks":1} @@ -174,14 +194,3 @@ def getUserStackInfo(req,region,userid,tenantid): - - - - - - - - - - - diff --git a/api/urls.py b/api/urls.py index a803286..be54b40 100755 --- a/api/urls.py +++ b/api/urls.py @@ -3,25 +3,25 @@ from su import chgPwd,getUserNetwork,getUserNetwork2,getMultiUserNetwork urlpatterns = patterns('', - url(r'index/$','api.views.index'), - url(r'virs/(?P[\w-]+)/$','api.views.virs'), - url(r'metric/(?P[\w-]+)/(?P[\w-]+)/$','api.metric.index'), - url(r'm1/$','api.metric.m1'), - url(r'statics/(?P[\w-]+)/(?P[\w-]+)/(?P[\w-]+)/(?P[\w-]+)/$','api.metric.statics'), - url(r'evacuate/(?P[\w-]+)/$','api.views.evacuate'), - url(r'face/$','api.views.face'), - url(r'eva/$','api.views.eva'), - url(r'chgPwd/(?P[\w-]+)/(?P[\w-]+)/$','api.views.chgPwd'), - url(r'free-res/$','api.eva.getFreeRes'), - url(r'free-res/(\w+)/$','api.eva.getFreeResByRegion'), + url(r'index/$','api.views.index'),#get use:index.html + url(r'virs/(?P[\w-]+)/$','api.views.virs'), #get use:virs.html + url(r'metric/(?P[\w-]+)/(?P[\w-]+)/$','api.metric.index'), #get use:metric.html + url(r'm1/$','api.metric.m1'), # nothing use:m1.html + url(r'statics/(?P[\w-]+)/(?P[\w-]+)/(?P[\w-]+)/(?P[\w-]+)/$','api.metric.statics'),# get ceilometer data + url(r'evacuate/(?P[\w-]+)/$','api.views.evacuate'), #nothing + url(r'face/$','api.views.face'),# nothing + url(r'eva/$','api.views.eva'), # nothing + url(r'chgPwd/(?P[\w-]+)/(?P[\w-]+)/$','api.views.chgPwd'), #get change keystone user's pwd? + url(r'free-res/$','api.eva.getFreeRes'), #get use:ip_list.html + url(r'free-res/(\w+)/$','api.eva.getFreeResByRegion'), #error??????? url(r'repair-eva/(?P[\w\.]+)/$','api.eva.controller'), url(r'repair-eva/(?P[\w\.]+)/(?P[\w-]+)/$','api.eva.controller'), url(r'machine/([\w\.]+)/$','api.eva.getMachineInfoByIp'), - url(r'service-status/$','api.eva.getServiceStatus'), + url(r'service-status/$','api.eva.getServiceStatus'), #get url(r'az-list/$','api.eva.az_list'), - url(r'free-ip-list/$','api.eva.ip_list'), + url(r'free-ip-list/$','api.eva.ip_list'), #get use:ip_list.html url(r'ava-network/(?P[\w-]+)/(?P[\w-]+)/$','api.eva.get_ava_network'), - url(r'free-ip/(?P[\w-]+)/$','api.eva.ip_list_region'), + url(r'free-ip/(?P[\w-]+)/$','api.eva.ip_list_region'), #get url(r'add-network-flow/(?P[\w-]+)/(?P[\w-]+)/(?P[\w-]+)/(?P[\w-]+)/$','api.su.limitSu'), url(r'su/relimit/(?P[\w-]+)/(?P[\w-]+)/(?P[\w-]+)/$','api.su.relimit'), url(r'chgPwd/(?P[\w-]+)/(?P[\w-]+)/(?P[\w-]+)/$',chgPwd), @@ -30,4 +30,7 @@ url(r'get-token-network/(?P[\w-]+)/(?P[\w-]+)/(?P[=\w-]+)/$',getUserNetwork2), url(r'user-resource-quotas/(?P[\w-]+)/(?P[\w-]+)/(?P[\w-]+)/$','api.su.getUserStackInfo'), url(r'test/$','api.eva.test'), + url(r'virs_list/(?P[\w-]+)/$','api.alarm.virs_list'), + url(r'statics/(?P[\w-]+)/(?P[\w-]+)/(?P[\w-]+)/seconds/(?P