class NodeInterface(object): def __init__(self, name, cluster_id): self.name = name # self.protected_instance_list = [] self.cluster_id = cluster_id self.ipmi = IPMIManager() self.ipmi_status = self.ipmi._getIPMIStatus(self.name) self.nova_client = NovaClient.getInstance() self.detection_thread = None self.initDetectionThread() def setNodeName(self, name): self.name = name def getNodeName(self): return self.name def setClusterId(self, cluster_id): self.cluster_id = cluster_id def getClusterId(self, cluster_id): return self.cluster_id def initDetectionThread(self): config = ConfigParser.RawConfigParser() config.read('hass.conf') cluster_id = self.cluster_id node = self polling_port = int(config.get("detection", "polling_port")) # ipmi_status = self.ipmi_status polling_interval = float(config.get("detection", "polling_interval")) self.detection_thread = DetectionThread(cluster_id, node, polling_port, polling_interval) def startDetectionThread(self): self.detection_thread.daemon = True self.detection_thread.start() def deleteDetectionThread(self): self.detection_thread.stop() def getInfo(self): return [self.name, self.cluster_id, self.ipmi_status] def sendUpdateInstance(self): so = socket.socket(socket.AF_INET, socket.SOCK_STREAM) so.connect((self.name, 5001)) # ip = so.recv(1024) so.send("update instance") so.close()
class Operator(object): def __init__(self): self.ipmi_module = IPMIManager() self.cluster_list = ClusterManager.getClusterList() self.config = ConfigParser.RawConfigParser() self.config.read('hass.conf') self.port = int(self.config.get("detection", "polling_port")) def startNode(self, node_name, default_wait_time=180): """ :param node_name: :param default_wait_time: :return: """ message = "" data = {"node_name": node_name} result = None try: if self._checkNodeIPMI(node_name) and self._checkNodeInComputePool( node_name): message += " IPMIOperator--node is in compute pool . The node is %s." % node_name ipmi_result = self.ipmi_module.startNode(node_name) if ipmi_result.code == "succeed": boot_up = self._checkNodeBootSuccess( node_name, default_wait_time) if boot_up: message += "start node success.The node is %s." % node_name detection = self._checkDetectionAgent( node_name, default_wait_time) if not detection: message += "DetectionAgent in computing node is fail." message += "DetectionAgent in computing is running!" result = self.successResult(message, data) logging.info(message) else: # boot_up is fail message += "check node boot fail" result = self.failResult(message, data) logging.error(message) else: # ipmi_result is fail message += "IpmiModule start node fail" result = self.failResult(message, data) logging.error(message) else: # node is not ipmi node message += " IPMIOperator--node is not in compute pool or is not a IPMI PC . The node is %s." % \ node_name result = self.failResult(message, data) logging.error(message) except Exception as e: message += "IPMIOperator--start node fail.The node is %s.%s" % ( node_name, str(e)) result = self.failResult(message, data) logging.error(message) finally: return result def shutOffNode(self, node_name): """ :param node_name: :return: """ message = "" data = {"node_name": node_name} result = None try: if self._checkNodeIPMI(node_name) and self._checkNodeInComputePool( node_name) and self._checkNodeNotInCluster(node_name): ipmi_result = self.ipmi_module.shutOffNode(node_name) # check power status in IPMIModule if ipmi_result.code == "succeed": message += "shut off node success.The node is %s." % node_name result = self.successResult(message, data) logging.info(message) else: message += "IpmiModule shut off node fail" result = self.failResult(message, data) logging.error(message) else: message += " IPMIOperator--node is not in compute pool or is not a IPMI PC or is already be " \ "protected. The node is %s." % node_name result = self.failResult(message, data) logging.error(message) except Exception as e: # shut off fail message += "IPMIOperator--shut off node fail.The node is %s.%s" % ( node_name, str(e)) result = self.failResult(message, data) logging.error(message) finally: return result def rebootNode(self, node_name, default_wait_time=180): """ :param node_name: :param default_wait_time: :return: """ result = None data = {"node_name": node_name} message = "" try: if self._checkNodeIPMI(node_name) and self._checkNodeInComputePool( node_name) and self._checkNodeNotInCluster(node_name): ipmi_result = self.ipmi_module.rebootNode(node_name) if ipmi_result.code == "succeed": message += "reboot node success.The node is %s." % node_name detection = self._checkDetectionAgent( node_name, default_wait_time) if not detection: message += "DetectionAgent in computing node is fail." message += "DetectionAgent in computing is running!" result = self.successResult(message, data) logging.info(message) else: message += "IpmiModule reboot node fail" result = self.failResult(message, data) logging.error(message) else: message += " IPMIOperator--node is not in compute pool or is not a IPMI PC or is already be " \ "protected. The node is %s." % node_name result = self.failResult(message, data) logging.error(message) except Exception as e: message += "IPMIOperator--reboot node fail.The node is %s.%s" % ( node_name, str(e)) result = self.failResult(message, data) logging.error(message) finally: return result def getAllInfoByNode(self, node_name): """ :param node_name: :return: """ global result try: result = self.ipmi_module.getAllInfoByNode(node_name) except Exception as e: message = " IPMIOperator--get node info bt type fail. The node is %s." % node_name result = self.failResult(message, []) logging.error("IPMIOperator get all sensor info of node fail.%s" % str(e)) finally: return result def getNodeInfoByType(self, node_name, sensor_type): """ :param node_name: :param sensor_type: :return: """ global result try: result = self.ipmi_module.getNodeInfoByType(node_name, sensor_type) except Exception as e: message = " IPMIOperator--get node info bt type fail. The node is %s,sensor type is %s ." % ( node_name, sensor_type) result = self.failResult(message, []) logging.error("IPMIOperator get %s sensor info of node fail.%s" % (sensor_type, str(e))) finally: return result def _checkNodeIPMI(self, node_name): ipmistatus = self.ipmi_module._getIPMIStatus(node_name) if not ipmistatus: message = " Node is not IPMI PC please check again! The node is %s." % node_name logging.error(message) else: message = " Node is IPMI PC. node is %s." % node_name logging.info(message) return ipmistatus def _checkNodeInComputePool(self, node_name): result = ClusterManager.nova.isInComputePool(node_name) if result: message = " Node is in compute pool . The node is %s." % node_name logging.info(message) else: message = " Node is not in compute pool please check again! The node is %s." % node_name logging.error(message) return result def _checkNodeNotInCluster(self, node_name): result = True if self.cluster_list is None: pass else: for cluster_id, cluster in self.cluster_list.iteritems(): node_list = cluster.getAllNodeStr() if node_name in node_list: logging.error( " Node is in HA cluster. The node is %s, cluster id is %s" % (node_name, cluster_id)) result = False return result def _checkNodeBootSuccess(self, nodeName, check_timeout): # check power statue in IPMIModule status = False while not status: if check_timeout > 0: result = self.ipmi_module.getPowerStatus(nodeName) print(result, check_timeout) if result == "OK": status = True else: time.sleep(1) check_timeout -= 1 else: return status return status def _checkDetectionAgent(self, nodeName, check_timeout): # not be protect(not connect socket) # check detection agent status = False data = "" try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setblocking(0) sock.settimeout(0.5) sock.connect((nodeName, self.port)) except Exception as e: print("create socket fail", str(e)) while not status: time.sleep(5) if check_timeout > 0: try: sock.sendall("polling request") data, addr = sock.recvfrom(2048) except Exception as e: print(str(e)) if "OK" in data: status = True sock.close() else: # time.sleep(1) print("waiting:", check_timeout) check_timeout -= 5 else: # timeout return status # status is True return status def successResult(self, message, data): """ :param message: :param data: :return: """ result = Response(code="succeed", message=message, data=data) return result def failResult(self, message, data): """ :param message: :param data: :return: """ result = Response(code="failed", message=message, data=data) return result
class Operator(object): def __init__(self): # self.clusterList = self.nova_client = NovaClient.getInstance() self.ipmi_module = IPMIManager() self.cluster_list = ClusterManager.getClusterList() config = ConfigParser.RawConfigParser() config.read('hass.conf') self.port = int(config.get("detection", "polling_port")) def startNode(self, node_name, default_wait_time=180): message = "" # code = "" result = None if self._checkNodeIPMI(node_name): # code = "0" message += " IPMIOperator--node is in compute pool . The node is %s." % node_name try: ipmi_result = self.ipmi_module.startNode(node_name) if ipmi_result.code == "succeed": boot_up = self._checkNodeBootSuccess( node_name, default_wait_time) if boot_up: message += "start node success.The node is %s." % node_name logging.info(message) detection = self._checkDetectionAgent( node_name, default_wait_time) if not detection: message += "detectionagent in computing node is fail." # result = {"code": "0", "node_name": node_name, "message": message} result = Response(code="succeed", message=message, data={"node_name": node_name}) else: raise Exception("check node boot fail") else: raise Exception("IpmiModule start node fail") except Exception as e: # start fail message += "IPMIOperator--start node fail.The node is %s.%s" % ( node_name, e) logging.error(message) # result = {"code": "1", "node_name": node_name, "message": message} result = Response(code="failed", message=message, data={"node_name": node_name}) else: # code = "1" message += " IPMIOperator--node is not in compute pool or is not a IPMI PC . The node is %s." % node_name logging.error(message) # result = {"code": "1", "node_name": node_name, "message": message} result = Response(code="failed", message=message, data={"node_name": node_name}) return result def shutOffNode(self, node_name): message = "" # result =None if self._checkNodeIPMI(node_name) and self._checkNodeNotInCluster( node_name): try: ipmi_result = self.ipmi_module.shutOffNode(node_name) # check power status in IPMIModule if ipmi_result.code == "succeed": message += "shut off node success.The node is %s." % node_name logging.info(message) # result = {"code": "0", "node_name": node_name, "message": message} result = Response(code="succeed", message=message, data={"node_name": node_name}) else: raise Exception("IpmiModule shut off node fail") except Exception as e: # shut off fail message += "IPMIOperator--shut off node fail.The node is %s.%s" % ( node_name, e) logging.error(message) # result = {"code": "1", "node_name": node_name, "message": message} result = Response(code="failed", message=message, data={"node_name": node_name}) else: message += " IPMIOperator--node is not in compute pool or is not a IPMI PC or is already be protected. The node is %s." % node_name logging.error(message) # result = {"code": "1", "node_name": node_name, "message": message} result = Response(code="failed", message=message, data={"node_name": node_name}) return result def rebootNode(self, node_name, default_wait_time=180): result = None message = "" if self._checkNodeIPMI(node_name) and self._checkNodeNotInCluster( node_name): try: ipmi_result = self.ipmi_module.rebootNode(node_name) if ipmi_result.code == "succeed": message += "reboot node success.The node is %s." % node_name logging.info(message) detection = self._checkDetectionAgent( node_name, default_wait_time) if not detection: message += "detectionagent in computing node is fail." # result = {"code": "0", "node_name": node_name, "message": message} result = Response(code="succeed", message=message, data={"node_name": node_name}) else: raise Exception("IpmiModule reboot node fail") except Exception as e: # shut off fail message += "IPMIOperator--reboot node fail.The node is %s.%s" % ( node_name, e) logging.error(message) # result = {"code": "1", "node_name": node_name, "message": message} result = Response(code="failed", message=message, data={"node_name": node_name}) else: message += " IPMIOperator--node is not in compute pool or is not a IPMI PC or is already be protected. The node is %s." % node_name logging.error(message) # result = {"code": "1", "node_name": node_name, "message": message} result = Response(code="failed", message=message, data={"node_name": node_name}) return result def getAllInfoByNode(self, node_name): data = self.ipmi_module.getAllInfoByNode(node_name) return data def getNodeInfoByType(self, node_name, sensor_type): data = self.ipmi_module.getNodeInfoByType(node_name, sensor_type) return data def _checkNodeIPMI(self, node_name): # is IPMI PC ipmistatus = self.ipmi_module._getIPMIStatus(node_name) if not ipmistatus: return False # is in computing pool if node_name in self.nova_client.getComputePool(): message = " node is in compute pool . The node is %s." % node_name logging.info(message) return True else: message = " node is not in compute pool please check again! The node is %s." % node_name logging.error(message) return False def _checkNodeNotInCluster(self, node_name): for cluster_id in self.cluster_list: cluster = ClusterManager.getCluster(cluster_id) node_list = cluster.getAllNodeStr() if node_name in node_list: return False return True def _checkNodeBootSuccess(self, nodeName, check_timeout): # check power statue in IPMIModule status = False while not status: if check_timeout > 0: result = self.ipmi_module.getPowerStatus(nodeName) print result, check_timeout if result == "OK": status = True else: time.sleep(1) check_timeout -= 1 else: return status return status def _checkDetectionAgent(self, nodeName, check_timeout): # not be protect(not connect socket) # check detection agent status = False data = "" try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setblocking(0) sock.settimeout(0.5) sock.connect((nodeName, self.port)) except Exception as e: print "create socket fail", str(e) while status == False: time.sleep(5) if check_timeout > 0: try: sock.sendall("polling request") data, addr = sock.recvfrom(2048) except Exception as e: print str(e) if "OK" in data: status = True sock.close() #print data else: # time.sleep(1) print "wating:", check_timeout check_timeout -= 5 else: # timeout return status # status is True return status
class NodeInterface(object): def __init__(self, name, cluster_id, detection_list): self.name = name self.cluster_id = cluster_id self.detection_list = detection_list self.ipmi = IPMIManager() self.ipmi_status = self.ipmi._getIPMIStatus(self.name) self.nova_client = NovaClient.getInstance() self.detection_thread = None self.config = ConfigParser.RawConfigParser() self.config.read('/home/localadmin/HASS/hass.conf') self.initDetectionThread() def setNodeName(self, name): self.name = name def getNodeName(self): return self.name def setClusterId(self, cluster_id): self.cluster_id = cluster_id def getClusterId(self, cluster_id): return self.cluster_id ''' def addInstance(self, instance): self.protected.instance_list.append(instance) def removeInstance(self, instance): self.instance_list.remove(instance) def initInstanceList(self): self.instance_list = [] ''' def initDetectionThread(self): cluster_id = self.cluster_id node = self detection_list = self.detection_list polling_port = int(self.config.get("detection", "polling_port")) # ipmi_status = self.ipmi_status polling_interval = float( self.config.get("detection", "polling_interval")) self.detection_thread = DetectionThread(cluster_id, node, detection_list, polling_port, polling_interval) def startDetectionThread(self): self.detection_thread.daemon = True self.detection_thread.start() def deleteDetectionThread(self): self.detection_thread.stop() def getDetectionList(self): detection_to_string = [] detection_list_map = { '1': 'Host Power', '2': 'Host OS', '3': 'Host Network', '4': 'Host Service', '5': 'VM Power', '6': 'VM OS', '7': 'VM Network' } if self.detection_list != []: for i in self.detection_list[:]: detection_to_string.append(detection_list_map[i]) return detection_to_string else: for i in self.detection_list_map[:]: detection_to_string.append(detection_list_map[i]) return detection_to_string def getAllDetectionStr(self): convert_to_string_detection = ",".join( str(x) for x in self.getDetectionList()) return convert_to_string_detection def getInfo(self): return { "node_name": self.name, "below_cluster_id": self.cluster_id, "ipmi_enable": self.ipmi_status, "detection_list": self.detection_list } def sendUpdateInstance(self): # try: # logging.info("Init update instance socket to %s" % self.name) # so = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # so.settimeout(10) # so.connect((self.name, 5001)) # so.send("update instance") # so.close() # except Exception as e: # logging.error("send updata instance fail %s" % str(e)) pass def undefine_instance_via_socket(self, instance): port = int(self.config.get("detection", "polling_port")) try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setblocking(0) sock.settimeout(3) sock.connect((self.name, port)) msg = "undefine %s" % instance.name sock.sendall(msg) data, addr = sock.recvfrom(1024) if data != "OK": logging.error("undefine instance fail msg %s" % data) except Exception as e: logging.error("socket send undefine instance fail %s" % str(e)) finally: if sock: sock.close() print "sock close"