X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fplanetlab%2Fnode.py;h=eb229cdb0b2732734f84cc1d1c7ea7b6503302db;hb=2efd5eabeba8a6577ace9132d6336d44be0510e8;hp=7782bd80b36d525e86d4f5fce886a5a2934a8d1d;hpb=f4a5a9a345818610739e9e5841b9da5b1a062f5d;p=nepi.git diff --git a/src/nepi/resources/planetlab/node.py b/src/nepi/resources/planetlab/node.py index 7782bd80..eb229cdb 100644 --- a/src/nepi/resources/planetlab/node.py +++ b/src/nepi/resources/planetlab/node.py @@ -198,6 +198,10 @@ class PlanetlabNode(LinuxNode): self._slicenode = False self._hostname = False + if self.get("gateway") or self.get("gatewayUser"): + self.set("gateway", None) + self.set("gatewayUser", None) + def _skip_provision(self): pl_user = self.get("pluser") pl_pass = self.get("plpassword") @@ -233,10 +237,9 @@ class PlanetlabNode(LinuxNode): hostname = self._get_hostname() if hostname: # the user specified one particular node to be provisioned - # check with PLCAPI if it is alive self._hostname = True - node_id = self._query_if_alive(hostname=hostname) - node_id = node_id.pop() + node_id = self._get_nodes_id({'hostname':hostname}) + node_id = node_id.pop()['node_id'] # check that the node is not blacklisted or being provisioned # by other RM @@ -263,12 +266,11 @@ class PlanetlabNode(LinuxNode): # the user specifies constraints based on attributes, zero, one or # more nodes can match these constraints nodes = self._filter_based_on_attributes() - nodes_alive = self._query_if_alive(nodes) # nodes that are already part of user's slice have the priority to # provisioned - nodes_inslice = self._check_if_in_slice(nodes_alive) - nodes_not_inslice = list(set(nodes_alive) - set(nodes_inslice)) + nodes_inslice = self._check_if_in_slice(nodes) + nodes_not_inslice = list(set(nodes) - set(nodes_inslice)) node_id = None if nodes_inslice: @@ -341,20 +343,22 @@ class PlanetlabNode(LinuxNode): self.warn(" Could not SSH login ") self._blacklist_node(node) #self._delete_node_from_slice(node) - #self.set('hostname', None) self.do_discover() continue # check /proc directory is mounted (ssh_ok = True) + # and file system is not read only else: cmd = 'mount |grep proc' - ((out, err), proc) = self.execute(cmd) - if out.find("/proc type proc") < 0: + ((out1, err1), proc1) = self.execute(cmd) + cmd = 'touch /tmp/tmpfile; rm /tmp/tmpfile' + ((out2, err2), proc2) = self.execute(cmd) + if out1.find("/proc type proc") < 0 or \ + "Read-only file system".lower() in err2.lower(): with PlanetlabNode.lock: - self.warn(" Could not find directory /proc ") + self.warn(" Corrupted file system ") self._blacklist_node(node) #self._delete_node_from_slice(node) - #self.set('hostname', None) self.do_discover() continue @@ -413,13 +417,11 @@ class PlanetlabNode(LinuxNode): nodes_id = self._filter_by_range_attr(attr_name, attr_value, filters, nodes_id) if not filters: - nodes = self.plapi.get_nodes() + nodes = self._get_nodes_id() for node in nodes: nodes_id.append(node['node_id']) - return nodes_id - def _filter_by_fixed_attr(self, filters, nodes_id): """ Query PLCAPI for nodes ids matching fixed attributes defined by the @@ -503,45 +505,6 @@ class PlanetlabNode(LinuxNode): return nodes_id - def _query_if_alive(self, nodes_id=None, hostname=None): - """ - Query PLCAPI for nodes that register activity recently, using filters - related to the state of the node, e.g. last time it was contacted - """ - if nodes_id is None and hostname is None: - msg = "Specify nodes_id or hostname" - raise RuntimeError, msg - - if nodes_id is not None and hostname is not None: - msg = "Specify either nodes_id or hostname" - raise RuntimeError, msg - - # define PL filters to check the node is alive - filters = dict() - filters['run_level'] = 'boot' - filters['boot_state'] = 'boot' - filters['node_type'] = 'regular' - #filters['>last_contact'] = int(time.time()) - 2*3600 - - # adding node_id or hostname to the filters to check for the particular - # node - if nodes_id: - filters['node_id'] = list(nodes_id) - alive_nodes_id = self._get_nodes_id(filters) - elif hostname: - filters['hostname'] = hostname - alive_nodes_id = self._get_nodes_id(filters) - - if len(alive_nodes_id) == 0: - self.fail_node_not_alive(hostname) - else: - nodes_id = list() - for node_id in alive_nodes_id: - nid = node_id['node_id'] - nodes_id.append(nid) - - return nodes_id - def _choose_random_node(self, nodes): """ From the possible nodes for provision, choose randomly to decrese the @@ -566,13 +529,12 @@ class PlanetlabNode(LinuxNode): self._set_hostname_attr(node_id) self.warn(" Node not responding PING ") self._blacklist_node(node_id) - #self.set('hostname', None) else: # discovered node for provision, added to provision list self._put_node_in_provision(node_id) return node_id - def _get_nodes_id(self, filters): + def _get_nodes_id(self, filters=None): return self.plapi.get_nodes(filters, fields=['node_id']) def _add_node_to_slice(self, node_id): @@ -626,7 +588,8 @@ class PlanetlabNode(LinuxNode): ip = self._get_ip(node_id) if not ip: return ping_ok - command = "ping -c4 %s" % ip + command = ['ping', '-c4'] + command.append(ip) (out, err) = lexec(command) if not out.find("2 received") or not out.find("3 received") or not \