Ejemplo n.º 1
0
class CNode(object):
    def __init__(self, node_info=None):
        self.__tasks_list = []
        self.__node = node_info
        self.__node_name = ""
        self.workspace = None
        self.__sol_enabled = None
        self.__netns = None
        self.__logger = infrasim_log.get_logger(LoggerType.model.value)
        self.__shm_key = None

    @property
    def netns(self):
        return self.__netns

    def get_task_list(self):
        return self.__tasks_list

    def get_node_name(self):
        return self.__node_name

    def set_node_name(self, name):
        self.__node_name = name

    def get_node_info(self):
        return self.__node

    @run_in_namespace
    def precheck(self):
        if self.__is_running():
            return

        for task in self.__tasks_list:
            task.precheck()

    def terminate_workspace(self):
        if Workspace.check_workspace_exists(self.__node_name):
            shutil.rmtree(self.workspace.get_workspace())
        self.__logger.info(
            "[Node] Node {} runtime workspcace is destroyed".format(
                self.__node_name))
        print "Node {} runtime workspace is destroyed.".format(
            self.__node_name)

    def init(self):
        """
        1. Prepare CNode attributes:
            - self.__node
        2. Then use this information to init workspace
        3. Use this information to init sub module
        """
        if 'name' in self.__node:
            self.set_node_name(self.__node['name'])
        else:
            raise ArgsNotCorrect(
                "[Node] No node name is given in node information.")

        self.__logger = infrasim_log.get_logger(LoggerType.model.value,
                                                self.__node_name)

        if self.__node['compute'] is None:
            raise ArgsNotCorrect("[Node] No compute information")

        if 'sol_enable' not in self.__node:
            self.__node['sol_enable'] = True
        self.__sol_enabled = self.__node['sol_enable']

        self.__netns = self.__node.get("namespace")

        if 'uuid' in self.__node["compute"]:
            uuid_num = self.__node["compute"].get("uuid")
        else:
            uuid_num = str(uuid.uuid4())
        self.__node["compute"]["uuid"] = uuid_num

        if 'serial_number' in self.__node["compute"]:
            serial_number = self.__node["compute"].get("serial_number")
        else:
            serial_number = pre_serial_number + ''.join(
                random.SystemRandom().choice(string.digits) for _ in range(3))
        self.__node["compute"]["serial_number"] = serial_number

        # If user specify "network_mode" as "bridge" but without MAC
        # address, generate one for this network.
        for network in self.__node['compute']['networks']:
            if 'mac' not in network:
                uuid_val = uuid.uuid4()
                str1 = str(uuid_val)[-2:]
                str2 = str(uuid_val)[-4:-2]
                str3 = str(uuid_val)[-6:-4]
                network['mac'] = ":".join(["52:54:BE", str1, str2, str3])

        # If user specify "nmve" controller(drive) in "storage_backend"
        # with NO serial, generate one for it, since QEMU now (2.10.1)
        # treat "serail" as a mandatory attribute for "nvme"
        for storage in self.__node['compute']['storage_backend']:
            if storage.get('type') == 'nvme':
                if not storage.get('serial', ''):
                    storage['serial'] = helper.random_serial()

        if self.__sol_enabled:
            socat_obj = CSocat()
            socat_obj.logger = self.__logger
            socat_obj.set_priority(0)
            socat_obj.set_task_name("{}-socat".format(self.__node_name))
            socat_obj.set_node_name(self.__node['name'])
            self.__tasks_list.append(socat_obj)

        bmc_info = self.__node.get('bmc', {})
        bmc_obj = CBMC(bmc_info)
        bmc_obj.logger = self.__logger
        bmc_obj.set_priority(1)
        bmc_obj.set_task_name("{}-bmc".format(self.__node_name))
        bmc_obj.enable_sol(self.__sol_enabled)
        bmc_obj.set_log_path(
            os.path.join(config.infrasim_log_dir, self.__node_name,
                         "openipmi.log"))
        bmc_obj.set_node_name(self.__node['name'])
        self.__tasks_list.append(bmc_obj)

        compute_obj = CCompute(self.__node['compute'])
        compute_obj.logger = self.__logger
        asyncr = bmc_info.get("startnow", True)
        compute_obj.set_asyncronous(asyncr)
        compute_obj.enable_sol(self.__sol_enabled)
        compute_obj.set_priority(2)
        compute_obj.set_uuid(uuid_num)
        compute_obj.set_serial_number(self.__node["compute"]["serial_number"])
        compute_obj.set_task_name("{}-node".format(self.__node_name))
        compute_obj.set_log_path(
            os.path.join(config.infrasim_log_dir, self.__node_name,
                         "qemu.log"))
        self.__tasks_list.append(compute_obj)

        if "type" in self.__node and "dell" in self.__node["type"]:
            racadm_info = self.__node.get("racadm", {})
            racadm_obj = CRacadm(racadm_info)
            racadm_obj.logger = self.__logger
            racadm_obj.set_priority(3)
            racadm_obj.set_node_name(self.__node_name)
            racadm_obj.set_task_name("{}-racadm".format(self.__node_name))
            racadm_obj.set_log_path(
                os.path.join(config.infrasim_log_dir, self.__node_name,
                             "racadm.log"))
            self.__tasks_list.append(racadm_obj)

        # Set interface
        if "type" not in self.__node:
            raise ArgsNotCorrect("[Node] Can't get infrasim type")
        else:
            bmc_obj.set_type(self.__node['type'])
            compute_obj.set_type(self.__node['type'])

        if self.__sol_enabled:
            if "sol_device" in self.__node:
                socat_obj.set_sol_device(self.__node["sol_device"])
                bmc_obj.set_sol_device(self.__node["sol_device"])

            if "serial_socket" not in self.__node:
                self.__node["serial_socket"] = os.path.join(
                    config.infrasim_home, self.__node["name"], ".serial")
            socat_obj.set_socket_serial(self.__node["serial_socket"])
            compute_obj.set_socket_serial(self.__node["serial_socket"])

        if "ipmi_console_port" in self.__node:
            bmc_obj.set_port_ipmi_console(self.__node["ipmi_console_port"])
            # ipmi-console shall connect to same port with the same conf file

        if "bmc_connection_port" in self.__node:
            bmc_obj.set_port_qemu_ipmi(self.__node["bmc_connection_port"])
            compute_obj.set_port_qemu_ipmi(self.__node["bmc_connection_port"])

        # Init monitor task
        monitor_info = {}
        if "monitor" not in self.__node:
            monitor_info = {
                "enable": True,
                # Interface and port is for north bound REST service of
                # infrasim-monitor, not the socket of QEMU monitor
                "inferface": None,
                "port": 9005
            }
        else:
            monitor_info = {
                "enable": self.__node["monitor"].get("enable", True),
                "interface": self.__node["monitor"].get("interface", None),
                "port": self.__node["monitor"].get("port", 9005)
            }
        if not isinstance(monitor_info["enable"], bool):
            raise ArgsNotCorrect("[Monitor] Invalid setting")
        if monitor_info["enable"]:
            compute_obj.enable_qemu_monitor()
            monitor_obj = CMonitor(monitor_info)
            monitor_obj.logger = self.__logger
            monitor_obj.set_priority(4)
            monitor_obj.set_node_name(self.__node_name)
            monitor_obj.set_task_name("{}-monitor".format(self.__node_name))
            monitor_obj.set_log_path(
                os.path.join(config.infrasim_log_dir, self.__node_name,
                             "monitor.log"))
            self.__tasks_list.append(monitor_obj)

        self.workspace = Workspace(self.__node)

        for task in self.__tasks_list:
            task.set_workspace(self.workspace.get_workspace())

        if not self.__is_running():
            self.workspace.init()

        if self.__netns:
            for task in self.__tasks_list:
                task.netns = self.__netns

        for task in self.__tasks_list:
            task.init()

    # Run tasks list as the priority
    def start(self):
        # sort the tasks as the priority
        self.__tasks_list.sort(key=lambda x: x.get_priority(), reverse=False)

        for task in self.__tasks_list:
            task.run()

    def stop(self):
        # sort the tasks as the priority in reversed sequence
        self.__tasks_list.sort(key=lambda x: x.get_priority(), reverse=True)

        for task in self.__tasks_list:
            task.terminate()

    def status(self):
        for task in self.__tasks_list:
            task.status()

    def __is_running(self):
        state = True
        for task in self.__tasks_list:
            state &= task.task_is_running()

        return state

    def wait_node_up(self, timeout=180):
        start = time.time()
        while self.__is_running() is False:
            if time.time() - start > timeout:
                return False
        return True
Ejemplo n.º 2
0
class CNode(object):
    def __init__(self, node_info=None):
        self.__tasks_list = []
        self.__node = node_info
        self.__node_name = ""
        self.workspace = None
        self.__sol_enabled = None
        self.__netns = None
        self.__logger = infrasim_log.get_logger(LoggerType.model.value)

    @property
    def netns(self):
        return self.__netns

    def get_task_list(self):
        return self.__tasks_list

    def get_node_name(self):
        return self.__node_name

    def set_node_name(self, name):
        self.__node_name = name

    def get_node_info(self):
        return self.__node

    @run_in_namespace
    def precheck(self):
        if self.__is_running():
            return

        for task in self.__tasks_list:
            task.precheck()

    def terminate_workspace(self):
        if Workspace.check_workspace_exists(self.__node_name):
            shutil.rmtree(self.workspace.get_workspace())
        self.__logger.info("[Node] Node {} runtime workspcace is destroyed".
                           format(self.__node_name))
        print "Node {} runtime workspace is destroyed.".format(self.__node_name)

    def init(self):
        """
        1. Prepare CNode attributes:
            - self.__node
        2. Then use this information to init workspace
        3. Use this information to init sub module
        """
        if 'name' in self.__node:
            self.set_node_name(self.__node['name'])
        else:
            raise ArgsNotCorrect("[Node] No node name is given in node information.")

        self.__logger = infrasim_log.get_logger(LoggerType.model.value,
                                                self.__node_name)

        if self.__node['compute'] is None:
            raise ArgsNotCorrect("[Node] No compute information")

        if 'sol_enable' not in self.__node:
            self.__node['sol_enable'] = True
        self.__sol_enabled = self.__node['sol_enable']

        self.__netns = self.__node.get("namespace")

        # If user specify "network_mode" as "bridge" but without MAC
        # address, generate one for this network.
        for network in self.__node['compute']['networks']:
            if 'mac' not in network:
                uuid_val = uuid.uuid4()
                str1 = str(uuid_val)[-2:]
                str2 = str(uuid_val)[-4:-2]
                str3 = str(uuid_val)[-6:-4]
                network['mac'] = ":".join(["52:54:BE", str1, str2, str3])

        # If user specify "nmve" controller(drive) in "storage_backend"
        # with NO serial, generate one for it, since QEMU now (2.10.1)
        # treat "serail" as a mandatory attribute for "nvme"
        for storage in self.__node['compute']['storage_backend']:
            if storage.get('type') == 'nvme':
                if not storage.get('serial', ''):
                    storage['serial'] = helper.random_serial()

        if self.__sol_enabled:
            socat_obj = CSocat()
            socat_obj.logger = self.__logger
            socat_obj.set_priority(0)
            socat_obj.set_task_name("{}-socat".format(self.__node_name))
            self.__tasks_list.append(socat_obj)

        bmc_info = self.__node.get('bmc', {})
        bmc_obj = CBMC(bmc_info)
        bmc_obj.logger = self.__logger
        bmc_obj.set_priority(1)
        bmc_obj.set_task_name("{}-bmc".format(self.__node_name))
        bmc_obj.enable_sol(self.__sol_enabled)
        bmc_obj.set_log_path("/var/log/infrasim/{}/openipmi.log".
                             format(self.__node_name))
        bmc_obj.set_node_name(self.__node['name'])
        self.__tasks_list.append(bmc_obj)

        compute_obj = CCompute(self.__node['compute'])
        compute_obj.logger = self.__logger
        asyncr = bmc_info.get("startnow", True)
        compute_obj.set_asyncronous(asyncr)
        compute_obj.enable_sol(self.__sol_enabled)
        compute_obj.set_priority(2)
        compute_obj.set_task_name("{}-node".format(self.__node_name))
        compute_obj.set_log_path("/var/log/infrasim/{}/qemu.log".
                                 format(self.__node_name))
        self.__tasks_list.append(compute_obj)

        if "type" in self.__node and "dell" in self.__node["type"]:
            racadm_info = self.__node.get("racadm", {})
            racadm_obj = CRacadm(racadm_info)
            racadm_obj.logger = self.__logger
            racadm_obj.set_priority(3)
            racadm_obj.set_node_name(self.__node_name)
            racadm_obj.set_task_name("{}-racadm".format(self.__node_name))
            racadm_obj.set_log_path("/var/log/infrasim/{}/racadm.log".
                                    format(self.__node_name))
            self.__tasks_list.append(racadm_obj)

        # Set interface
        if "type" not in self.__node:
            raise ArgsNotCorrect("[Node] Can't get infrasim type")
        else:
            bmc_obj.set_type(self.__node['type'])
            compute_obj.set_type(self.__node['type'])

        if self.__sol_enabled:
            if "sol_device" in self.__node:
                socat_obj.set_sol_device(self.__node["sol_device"])
                bmc_obj.set_sol_device(self.__node["sol_device"])

            if "serial_socket" not in self.__node:
                self.__node["serial_socket"] = os.path.join(config.infrasim_home,
                                                            self.__node["name"],
                                                            ".serial")
            socat_obj.set_socket_serial(self.__node["serial_socket"])
            compute_obj.set_socket_serial(self.__node["serial_socket"])

        if "ipmi_console_port" in self.__node:
            bmc_obj.set_port_ipmi_console(self.__node["ipmi_console_port"])
            # ipmi-console shall connect to same port with the same conf file

        if "bmc_connection_port" in self.__node:
            bmc_obj.set_port_qemu_ipmi(self.__node["bmc_connection_port"])
            compute_obj.set_port_qemu_ipmi(self.__node["bmc_connection_port"])

        # Init monitor task
        monitor_info = {}
        if "monitor" not in self.__node:
            monitor_info = {
                "enable": True,
                # Interface and port is for north bound REST service of
                # infrasim-monitor, not the socket of QEMU monitor
                "inferface": None,
                "port": 9005
            }
        else:
            monitor_info = {
                "enable": self.__node["monitor"].get("enable", True),
                "interface": self.__node["monitor"].get("interface", None),
                "port": self.__node["monitor"].get("port", 9005)
            }
        if not isinstance(monitor_info["enable"], bool):
            raise ArgsNotCorrect("[Monitor] Invalid setting")
        if monitor_info["enable"]:
            compute_obj.enable_qemu_monitor()
            monitor_obj = CMonitor(monitor_info)
            monitor_obj.logger = self.__logger
            monitor_obj.set_priority(4)
            monitor_obj.set_node_name(self.__node_name)
            monitor_obj.set_task_name("{}-monitor".format(self.__node_name))
            monitor_obj.set_log_path("/var/log/infrasim/{}/monitor.log".
                                     format(self.__node_name))
            self.__tasks_list.append(monitor_obj)

        self.workspace = Workspace(self.__node)

        for task in self.__tasks_list:
            task.set_workspace(self.workspace.get_workspace())

        if not self.__is_running():
            self.workspace.init()

        if self.__netns:
            for task in self.__tasks_list:
                task.netns = self.__netns

        for task in self.__tasks_list:
            task.init()

    # Run tasks list as the priority
    def start(self):
        # sort the tasks as the priority
        self.__tasks_list.sort(key=lambda x: x.get_priority(), reverse=False)

        for task in self.__tasks_list:
            task.run()

    def stop(self):
        # sort the tasks as the priority in reversed sequence
        self.__tasks_list.sort(key=lambda x: x.get_priority(), reverse=True)

        for task in self.__tasks_list:
            task.terminate()

    def status(self):
        for task in self.__tasks_list:
            task.status()

    def __is_running(self):
        state = False
        for task in self.__tasks_list:
            state |= task._task_is_running()

        return state
Ejemplo n.º 3
0
class CNode(object):
    def __init__(self, node_info=None):
        self.__tasks_list = []
        self.__node = node_info
        self.__node_name = ""
        self.workspace = None
        self.__sol_enabled = None
        self.__netns = None
        self.__logger = infrasim_log.get_logger(LoggerType.model.value)

    @property
    def netns(self):
        return self.__netns

    def get_task_list(self):
        return self.__tasks_list

    def get_node_name(self):
        return self.__node_name

    def set_node_name(self, name):
        self.__node_name = name

    def get_node_info(self):
        return self.__node

    @run_in_namespace
    def precheck(self):
        if self.__is_running():
            return

        for task in self.__tasks_list:            \
                        task.precheck()

    def terminate_workspace(self):
        if Workspace.check_workspace_exists(self.__node_name):
            shutil.rmtree(self.workspace.get_workspace())
        self.__logger.info(
            "[Node] Node {} runtime workspcace is destroyed".format(
                self.__node_name))
        print "Node {} runtime workspace is destroyed.".format(
            self.__node_name)

    def init(self):
        """
        1. Prepare CNode attributes:
            - self.__node
        2. Then use this information to init workspace
        3. Use this information to init sub module
        """
        if 'name' in self.__node:
            self.set_node_name(self.__node['name'])
        else:
            raise ArgsNotCorrect(
                "[Node] No node name is given in node information.")

        self.__logger = infrasim_log.get_logger(LoggerType.model.value,
                                                self.__node_name)

        if self.__node['compute'] is None:
            raise ArgsNotCorrect("[Node] No compute information")

        if 'sol_enable' not in self.__node:
            self.__node['sol_enable'] = True
        self.__sol_enabled = self.__node['sol_enable']

        self.__netns = self.__node.get("namespace")

        # If user specify "network_mode" as "bridge" but without MAC
        # address, generate one for this network.
        for network in self.__node['compute']['networks']:
            if 'mac' not in network:
                uuid_val = uuid.uuid4()
                str1 = str(uuid_val)[-2:]
                str2 = str(uuid_val)[-4:-2]
                str3 = str(uuid_val)[-6:-4]
                network['mac'] = ":".join(["52:54:BE", str1, str2, str3])

        # If user specify "nmve" controller(drive) in "storage_backend"
        # with NO serial, generate one for it, since QEMU now (2.10.1)
        # treat "serail" as a mandatory attribute for "nvme"
        for storage in self.__node['compute']['storage_backend']:
            if storage.get('type') == 'nvme':
                if not storage.get('serial', ''):
                    storage['serial'] = helper.random_serial()

        if self.__sol_enabled:
            socat_obj = CSocat()
            socat_obj.logger = self.__logger
            socat_obj.set_priority(0)
            socat_obj.set_task_name("{}-socat".format(self.__node_name))
            self.__tasks_list.append(socat_obj)

        bmc_info = self.__node.get('bmc', {})
        bmc_obj = CBMC(bmc_info)
        bmc_obj.logger = self.__logger
        bmc_obj.set_priority(1)
        bmc_obj.set_task_name("{}-bmc".format(self.__node_name))
        bmc_obj.enable_sol(self.__sol_enabled)
        bmc_obj.set_log_path("/var/log/infrasim/{}/openipmi.log".format(
            self.__node_name))
        bmc_obj.set_node_name(self.__node['name'])
        self.__tasks_list.append(bmc_obj)

        compute_obj = CCompute(self.__node['compute'])
        compute_obj.logger = self.__logger
        asyncr = bmc_info.get("startnow", True)
        compute_obj.set_asyncronous(asyncr)
        compute_obj.enable_sol(self.__sol_enabled)
        compute_obj.set_priority(2)
        compute_obj.set_task_name("{}-node".format(self.__node_name))
        compute_obj.set_log_path("/var/log/infrasim/{}/qemu.log".format(
            self.__node_name))
        self.__tasks_list.append(compute_obj)

        if "type" in self.__node and "dell" in self.__node["type"]:
            racadm_info = self.__node.get("racadm", {})
            racadm_obj = CRacadm(racadm_info)
            racadm_obj.logger = self.__logger
            racadm_obj.set_priority(3)
            racadm_obj.set_node_name(self.__node_name)
            racadm_obj.set_task_name("{}-racadm".format(self.__node_name))
            racadm_obj.set_log_path("/var/log/infrasim/{}/racadm.log".format(
                self.__node_name))
            self.__tasks_list.append(racadm_obj)

        # Set interface
        if "type" not in self.__node:
            raise ArgsNotCorrect("[Node] Can't get infrasim type")
        else:
            bmc_obj.set_type(self.__node['type'])
            compute_obj.set_type(self.__node['type'])

        if self.__sol_enabled:
            if "sol_device" in self.__node:
                socat_obj.set_sol_device(self.__node["sol_device"])
                bmc_obj.set_sol_device(self.__node["sol_device"])

            if "serial_socket" not in self.__node:
                self.__node["serial_socket"] = os.path.join(
                    config.infrasim_home, self.__node["name"], ".serial")
            socat_obj.set_socket_serial(self.__node["serial_socket"])
            compute_obj.set_socket_serial(self.__node["serial_socket"])

        if "ipmi_console_port" in self.__node:
            bmc_obj.set_port_ipmi_console(self.__node["ipmi_console_port"])
            # ipmi-console shall connect to same port with the same conf file

        if "bmc_connection_port" in self.__node:
            bmc_obj.set_port_qemu_ipmi(self.__node["bmc_connection_port"])
            compute_obj.set_port_qemu_ipmi(self.__node["bmc_connection_port"])

        self.workspace = Workspace(self.__node)

        for task in self.__tasks_list:
            task.set_workspace(self.workspace.get_workspace())

        if not self.__is_running():
            self.workspace.init()

        if self.__netns:
            for task in self.__tasks_list:
                task.netns = self.__netns

        for task in self.__tasks_list:
            task.init()

    # Run tasks list as the priority
    def start(self):
        # sort the tasks as the priority
        self.__tasks_list.sort(key=lambda x: x.get_priority(), reverse=False)

        for task in self.__tasks_list:
            task.run()

    def stop(self):
        # sort the tasks as the priority in reversed sequence
        self.__tasks_list.sort(key=lambda x: x.get_priority(), reverse=True)

        for task in self.__tasks_list:
            task.terminate()

    def status(self):
        for task in self.__tasks_list:
            task.status()

    def __is_running(self):
        state = False
        for task in self.__tasks_list:
            state |= task._task_is_running()

        return state