コード例 #1
0
    def _get_nodeinfolist(self, server_nodes_info):
        ##_LOGGER.info("***** START - get_nodeinfolist ***** ")
        nodeinfolist = collections.OrderedDict()
        default_node_info = collections.OrderedDict()

        # DEFAULT NODE INFO
        try:
            vnodes = json.load(open(self._nodes_info_file, 'r'))
            for vnode in vnodes:
                NODE = {}
                NODE['name'] = vnode["name"]
                NODE['state'] = NodeInfo.OFF
                NODE['keywords'] = {}

                NODE['cpus'] = float(self._default_cpu_node)
                if "cpu" in vnode:
                    NODE['cpus'] = int(vnode["cpu"])

                NODE['memory'] = _get_memory_in_bytes(
                    self._default_memory_node)
                if "memory" in vnode:
                    NODE['memory'] = _get_memory_in_bytes(vnode["memory"])

                if "keywords" in vnode:
                    for keypair in vnode["keywords"].split(','):
                        parts = keypair.split('=')
                        NODE['keywords'][parts[0].strip()] = TypedClass(
                            parts[1].strip(), TypedClass.STRING)

                if "queues" in vnode:
                    queues = vnode["queues"].split(",")
                    if queues:
                        NODE['keywords']['queues'] = TypedList(
                            [TypedClass.auto(q) for q in queues])
                else:  # All queues to the node
                    NODE['keywords']['queues'] = TypedList(
                        [TypedClass.auto(q) for q in self._queues[:]])

                default_node_info[NODE['name']] = NODE

        except Exception as ex:
            _LOGGER.error("Error processing file %s: %s" %
                          (self._nodes_info_file, str(ex)))

        clients_by_server = {}
        for server_node in server_nodes_info:
            clients_by_server[server_node] = self._get_Clients_by_Server(
                server_node
            )  # Obtain ID, Name, Status, NodeClass and if the Client is running some job
            # Obtain Resources and Queues
            for client_id in clients_by_server[server_node]:
                info_client = clients_by_server[server_node][client_id]
                if (info_client['state'] in [NodeInfo.IDLE,
                                             NodeInfo.USED]):  # Client is ON
                    # Obtain Client node address for checking used resources
                    info_client['resources'] = self._get_Client_resources(
                        server_node, client_id)

                    if info_client[
                            'name'] in default_node_info:  # Valid node for CLUES and IM
                        nodeinfolist[info_client['name']] = self._get_NodeInfo(
                            info_client,
                            default_node_info[info_client['name']])
                    else:
                        _LOGGER.warning(
                            "Nomad Client with name '%s' founded using Nomad Server API but not exists this node in the configuration file %s"
                            % (info_client['name'], self._nodes_info_file))

        # Add nodes from nomad_info file to the list
        for namenode, node_info in default_node_info.items():
            if namenode not in nodeinfolist:
                nodeinfolist[namenode] = NodeInfo(namenode, node_info['cpus'],
                                                  node_info['cpus'],
                                                  node_info['memory'],
                                                  node_info['memory'],
                                                  node_info['keywords'])
                nodeinfolist[namenode].state = node_info['state']

        # Print all nodes in log with keywords
        for key, value in nodeinfolist.items():
            string = "%s + keywords={ " % (str(value))
            for key2 in value.keywords:
                string += key2 + ":" + str(value.keywords[key2]) + ","
            string = string[:-1] + "}"
            _LOGGER.debug(string)
        ##_LOGGER.info("***** END - get_nodeinfolist ***** ")
        return nodeinfolist
コード例 #2
0
    def get_nodeinfolist(self):
        nodeinfolist = collections.OrderedDict()

        nodes_data = self._create_request('GET', self._nodes_api_url_path,
                                          self.auth_data)
        if nodes_data:
            pods_data = self._create_request('GET', self._pods_api_url_path,
                                             self.auth_data)
            if not pods_data:
                _LOGGER.error(
                    "Error getting Kubernetes pod list. Node usage will not be obtained."
                )

            for node in nodes_data["items"]:
                name = node["metadata"]["name"]
                memory_total = self._get_memory_in_bytes(
                    node["status"]["allocatable"]["memory"])
                slots_total = int(node["status"]["allocatable"]["cpu"])
                pods_total = int(node["status"]["allocatable"]["pods"])

                skip_node = False
                # Get Taints
                if 'taints' in node["spec"] and node["spec"]['taints']:
                    for taint in node["spec"]['taints']:
                        if taint['effect'] in [
                                "NoSchedule", "PreferNoSchedule", "NoExecute"
                        ]:
                            skip_node = True
                            _LOGGER.debug(
                                "Node %s is tainted with %s, skiping." %
                                (name, taint['effect']))

                if not skip_node:
                    used_mem, used_cpus, used_pods, system_pods = self._get_node_used_resources(
                        name, pods_data)

                    memory_free = memory_total - used_mem
                    slots_free = slots_total - used_cpus
                    pods_free = pods_total - used_pods

                    is_ready = True
                    for conditions in node["status"]["conditions"]:
                        if conditions['type'] == "Ready":
                            if conditions['status'] != "True":
                                is_ready = False

                    keywords = {
                        'pods_free': TypedNumber(pods_free),
                        'nodeName': TypedClass(name, TypedClass.STRING)
                    }
                    # Add labels as keywords
                    for key, value in node["metadata"]["labels"].items():
                        keywords[key] = TypedClass(value, TypedClass.STRING)

                    nodeinfolist[name] = NodeInfo(name, slots_total,
                                                  slots_free, memory_total,
                                                  memory_free, keywords)
                    if is_ready:
                        nodeinfolist[name].state = NodeInfo.IDLE
                        if (used_pods - system_pods) > 0:
                            nodeinfolist[name].state = NodeInfo.USED
                    else:
                        nodeinfolist[name].state = NodeInfo.OFF
        else:
            _LOGGER.error("Error getting Kubernetes node list.")

        # Add the "virtual" nodes
        try:
            vnodes = json.load(open('/etc/clues2/kubernetes_vnodes.info', 'r'))
            for vnode in vnodes:
                name = vnode["name"]
                if name not in nodeinfolist:
                    keywords = {
                        'pods_free': TypedNumber(self._node_pods),
                        'nodeName': TypedClass(name, TypedClass.STRING)
                    }

                    cpus = self._node_slots
                    if "cpu" in vnode:
                        cpus = int(vnode["cpu"])

                    memory = self._node_memory
                    if "memory" in vnode:
                        memory = self._get_memory_in_bytes(vnode["memory"])

                    if "queues" in vnode:
                        queues = vnode["queues"].split(",")
                        if queues:
                            keywords['queues'] = TypedList(
                                [TypedClass.auto(q) for q in queues])

                    if "keywords" in vnode:
                        for keypair in vnode["keywords"].split(','):
                            parts = keypair.split('=')
                            keywords[parts[0].strip()] = TypedClass(
                                parts[1].strip(), TypedClass.STRING)

                    nodeinfolist[name] = NodeInfo(name, cpus, cpus, memory,
                                                  memory, keywords)
                    nodeinfolist[name].state = NodeInfo.OFF
        except Exception as ex:
            _LOGGER.error(
                "Error processing file /etc/clues2/kubernetes_vnodes.info: %s"
                % str(ex))

        return nodeinfolist
コード例 #3
0
    def get_nodeinfolist(self):
        nodeinfolist = collections.OrderedDict()
        try:
            vnodes = json.load(open('/etc/clues2/mesos_vnodes.info', 'r'))
            for vnode in vnodes:
                name = vnode["name"]
                if name not in nodeinfolist:
                    keywords = {'hostname': TypedClass(name, TypedClass.STRING)}
                    state = NodeInfo.OFF
                    slots_count = self._node_slots
                    slots_free = self._node_slots
                    if "cpu" in vnode:
                        slots_count = int(vnode["cpu"])
                        slots_free = int(vnode["cpu"])

                    memory_total = self._node_memory
                    memory_free = self._node_memory
                    if "memory" in vnode:
                        memory_total = get_memory_in_bytes(vnode["memory"])
                        memory_free = get_memory_in_bytes(vnode["memory"])
                    #queues = ["default"]
                    #if "queues" in vnode:
                    #    queues = vnode["queues"].split(",")
                    #    if queues:
                    #        keywords['queues'] = TypedList([TypedClass.auto(q) for q in queues])

                    if "keywords" in vnode:
                        for keypair in vnode["keywords"].split(','):
                            parts = keypair.split('=')
                            keywords[parts[0].strip()] = TypedClass(parts[1].strip(), TypedClass.STRING)

                    nodeinfolist[name] = NodeInfo(name, slots_count, slots_free, memory_total, memory_free, keywords)
                    nodeinfolist[name].state = state
        except Exception as ex:
            _LOGGER.error("Error processing file /etc/clues2/mesos_vnodes.info: %s" % str(ex))

        mesos_slaves = self._obtain_mesos_nodes()
        if mesos_slaves:
            for mesos_slave in mesos_slaves['slaves']:
                name = mesos_slave['hostname']
                if nodeinfolist:
                    for node in nodeinfolist:
                        nodeinfolist_node_ip = None
                        try:
                            nodeinfolist_node_ip = socket.gethostbyname(nodeinfolist[node].name)
                        except:
                            _LOGGER.warning("Error resolving node ip %s" % nodeinfolist[node].name)
                        if name == nodeinfolist[node].name or name == nodeinfolist_node_ip:
                            name = nodeinfolist[node].name
                            slots_count = float(mesos_slave['resources']['cpus'])
                            memory_total = calculate_memory_bytes(mesos_slave['resources']['mem'])
                            used_cpu = float(mesos_slave['used_resources']['cpus'])
                            used_mem = calculate_memory_bytes(mesos_slave['used_resources']['mem'])

                            state = NodeInfo.UNKNOWN
                            if mesos_slave["active"]:
                                if used_cpu > 0 or used_mem > 0:
                                    state = NodeInfo.USED
                                else:
                                    state = NodeInfo.IDLE
                            else:
                                state = NodeInfo.OFF

                            slots_free = slots_count - used_cpu
                            memory_free = memory_total - used_mem

                            # Create a fake queue
                            keywords = {}
                            keywords['hostname'] = TypedClass.auto(name)
                            #queues = ["default"]
                            #if queues:
                            #    keywords['queues'] = TypedList([TypedClass.auto(q) for q in queues])

                            nodeinfolist[name] = NodeInfo(
                                name, slots_count, slots_free, memory_total, memory_free, keywords)
                            nodeinfolist[name].state = state

        return nodeinfolist