示例#1
0
 def pbs_service(self, rack_name=None):
     config = cm_config()
     username = config.get("cloudmesh.hpc.username")
     pbs = PBS(username, "india.futuregrid.org")
     dict_pbs_info = pbs.pbsnodes()
     dict_data = {}
     inventory = Inventory()
     racks = inventory.get_clusters()
     for rack in racks:
         rack_name = rack["cm_cluster"]
         dict_data[rack_name] = {}
         hosts = rack["cm_value"]
         for host in hosts:
             (hid, hlabel) = inventory.get_host_id_label(host, "public")
             utype = "unknown"
             if hlabel in dict_pbs_info:
                 server = dict_pbs_info[hlabel]
                 if "note" in server.keys():
                     note_value = server["note"]
                     # to compatible with the future change
                     if type(note_value) is dict:
                         utype = note_value["service"]
                     else:   # currently is a literal string for note
                         utype = note_value
             dict_data[rack_name][hid] = utype
     return dict_data
示例#2
0
class pbs_note_builder:
    def __init__(self, user, host):
        self.username = user
        self.hostname = host
        self.inventory = Inventory()
        self.fetch_pbs_nodes_info()

    # get recent pbsnodes info
    def fetch_pbs_nodes_info(self):
        pbs = PBS(self.username, self.hostname)
        self.pbs_nodes_info = pbs.pbsnodes()
        #print self.pbs_nodes_info

    def check_node_validation(self, node):
        node_id_label = self.inventory.get_host_id_label(node)
        berror = False
        if node_id_label is None:
            berror = True
        else:
            (node_id, node_label) = node_id_label

        if not berror:
            if node_label not in self.pbs_nodes_info.keys():
                berror = True

        if berror:
            raise NameError(
                "pbs_note_builder: '{0}' is NOT a valid or existed node.".
                format(node))

        return node_id_label

    def get_note(self, node):
        (node_id, node_label) = self.check_node_validation(node)
        print "{0}-note: {1}".format(node_id,
                                     self.pbs_nodes_info[node_label]["note"])

    # node is the server name, e.g., i129, i15
    # note is a dict, {"attr1": "value1", "attr2": "value2"}
    # setNote doesn't check the correctness of the attribute-value pair
    def set_note(self, node, note):
        (node_id, node_label) = self.check_node_validation(node)

        # ["note"] ONLY has two type: dict or string
        prev_note = self.pbs_nodes_info[node_label]["note"]
        if type(prev_note) is dict:
            curr_note = deepcopy(prev_note)
        else:
            # assume the default note is for 'service'
            curr_note = {"service": deepcopy(prev_note)}

        # now curr_note already is a dict
        # to keep consistency, the keys in note should be lower
        map(lambda x: str(x).lower(), note.keys())
        curr_note.update(note)

        # convert the dict to a unique string
        # e.g., "'other': 'test', 'temperature': '10.2', 'service': 'hpc'"
        #kvpair_list = ", ".join([": ".join(map(lambda x: "'".join(["", str(x), ""]), [key, prev_note[key]])) for key in sorted(prev_note.keys())])
        #snote = "".join(['{', kvpair_list, '}'])
        #sshnote = '"'.join(["", snote, ""])

        # try get the dict string with json dumps
        sshnote = json.dumps(curr_note)

        # update the note attribute in memory to real node
        command = " ".join(["pbsnodes -N", sshnote, node_label])
        str_ssh = "@".join([self.username, self.hostname])
        log.debug(
            "pbs_note_builder: command ready to execute is: \n  > ssh {0} {1}\n"
            .format(str_ssh, command))

        # This operation NEED authorization ...
        #ssh(str_ssh, command)

    # set server's temperature
    # a shortcut of set_note
    def set_temperature_note(self, node, temp):
        self.set_one_note(node, "temperature", temp)

    # set server's service type
    # a shortcut of set_note
    def set_service_note(self, node, service):
        self.set_one_note(node, "service", service)

    def set_one_note(self, node, attr, value):
        self.set_note(node, {attr: value})
示例#3
0
class pbs_note_builder:

    def __init__(self, user, host):
        self.username = user
        self.hostname = host
        self.inventory = Inventory()
        self.fetch_pbs_nodes_info()
    
    # get recent pbsnodes info
    def fetch_pbs_nodes_info(self):
        pbs = PBS(self.username, self.hostname)
        self.pbs_nodes_info = pbs.pbsnodes()
        #print self.pbs_nodes_info
    
    def check_node_validation(self, node):
        node_id_label = self.inventory.get_host_id_label(node)
        berror = False
        if node_id_label is None:
            berror = True
        else:
            (node_id, node_label) = node_id_label
            
        if not berror:
            if node_label not in self.pbs_nodes_info.keys():
                berror = True
        
        if berror:
            raise NameError("pbs_note_builder: '{0}' is NOT a valid or existed node.".format(node))
        
        return node_id_label
    
    
    def get_note(self, node):
        (node_id, node_label) = self.check_node_validation(node)
        print "{0}-note: {1}".format(node_id, self.pbs_nodes_info[node_label]["note"])
    
    # node is the server name, e.g., i129, i15
    # note is a dict, {"attr1": "value1", "attr2": "value2"}
    # setNote doesn't check the correctness of the attribute-value pair
    def set_note(self, node, note):
        (node_id, node_label) = self.check_node_validation(node)
            
        # ["note"] ONLY has two type: dict or string
        prev_note = self.pbs_nodes_info[node_label]["note"]
        if type(prev_note) is dict:
            curr_note = deepcopy(prev_note)
        else:
            # assume the default note is for 'service'
            curr_note = {"service": deepcopy(prev_note)}
        
        # now curr_note already is a dict
        # to keep consistency, the keys in note should be lower
        map(lambda x: str(x).lower(), note.keys())
        curr_note.update(note)

        # convert the dict to a unique string
        # e.g., "'other': 'test', 'temperature': '10.2', 'service': 'hpc'"
        #kvpair_list = ", ".join([": ".join(map(lambda x: "'".join(["", str(x), ""]), [key, prev_note[key]])) for key in sorted(prev_note.keys())])
        #snote = "".join(['{', kvpair_list, '}'])
        #sshnote = '"'.join(["", snote, ""])
        
        # try get the dict string with json dumps
        sshnote = json.dumps(curr_note)
         
        # update the note attribute in memory to real node
        command = " ".join(["pbsnodes -N", sshnote, node_label])
        str_ssh = "@".join([self.username, self.hostname])
        log.debug("pbs_note_builder: command ready to execute is: \n  > ssh {0} {1}\n".format(str_ssh, command))
        
        # This operation NEED authorization ...
        #ssh(str_ssh, command)
    
    
    # set server's temperature
    # a shortcut of set_note
    def set_temperature_note(self, node, temp):
        self.set_one_note(node, "temperature", temp)
        
    
    # set server's service type
    # a shortcut of set_note
    def set_service_note(self, node, service):
        self.set_one_note(node, "service", service)
        
    def set_one_note(self, node, attr, value):
        self.set_note(node, {attr: value})