From bcd88aa441a15c36a01c29a941b74c3a7e96c941 Mon Sep 17 00:00:00 2001 From: Alina Quereilhac Date: Sat, 14 Jan 2012 20:06:31 +0100 Subject: [PATCH] A small one-node SFA/planetlab test worked. --- src/nepi/testbeds/planetlab/execute.py | 2 +- src/nepi/testbeds/planetlab/interfaces.py | 11 +++++++++-- src/nepi/testbeds/planetlab/node.py | 11 ++++++----- src/nepi/util/parser/sfa.py | 7 ++++++- src/nepi/util/sfiapi.py | 17 ++++++++++++----- 5 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/nepi/testbeds/planetlab/execute.py b/src/nepi/testbeds/planetlab/execute.py index 698e865b..65ee9c47 100644 --- a/src/nepi/testbeds/planetlab/execute.py +++ b/src/nepi/testbeds/planetlab/execute.py @@ -247,7 +247,7 @@ class TestbedController(testbed_impl.TestbedController): to_provision.add(node_id) reserved.add(hostname) elif not candidates: - raise RuntimeError, "Cannot assign resources for node %s, no candidates sith %s" % (guid, + raise RuntimeError, "Cannot assign resources for node %s, no candidates with %s" % (guid, node.make_filter_description()) finally: reserve_lock.release() diff --git a/src/nepi/testbeds/planetlab/interfaces.py b/src/nepi/testbeds/planetlab/interfaces.py index cc8d1798..78239006 100644 --- a/src/nepi/testbeds/planetlab/interfaces.py +++ b/src/nepi/testbeds/planetlab/interfaces.py @@ -60,9 +60,16 @@ class NodeIface(object): if self.node is None or self.node._node_id is None: raise RuntimeError, "Cannot pick interface without an assigned node" - + + # HACK: SFA doesnt give the node_id!! + if not isinstance(self.node._node_id, int): + node_data = self._api.GetNodes(filters={'hostname':self.node.hostname}, fields=('node_id',))[0] + node_id = node_data['node_id'] + else: + node_id = self.node._node_id + avail = self._api.GetInterfaces( - node_id=self.node._node_id, + node_id=node_id, is_primary=self.primary, fields=('interface_id','mac','netmask','ip') ) diff --git a/src/nepi/testbeds/planetlab/node.py b/src/nepi/testbeds/planetlab/node.py index e6bbebb7..eb9a6ded 100644 --- a/src/nepi/testbeds/planetlab/node.py +++ b/src/nepi/testbeds/planetlab/node.py @@ -265,9 +265,9 @@ class Node(object): hostnames = None if candidates: self._logger.info(" Found %s candidates. Checking for reachability...", len(candidates)) - + hostnames = dict(map(operator.itemgetter('node_id','hostname'), - self._api.GetNodes(list(candidates), ['node_id','hostname']) + self._sliceapi.GetNodes(list(candidates), ['node_id','hostname']) )) def resolvable(node_id): @@ -348,7 +348,7 @@ class Node(object): replacements = {'timeframe':self.timeframe} tagnames = [ tagname % replacements for tagname, weight, default in self.RATE_FACTORS ] - + taginfo = self._sliceapi.GetNodeTags( node_id=list(nodes), tagname=tagnames, @@ -358,7 +358,7 @@ class Node(object): for value in taginfo: node, tagname, value = unpack(value) if value and value.lower() != 'n/a': - tags[tagname][int(node)] = float(value) + tags[tagname][node] = float(value) for tagname, weight, default in self.RATE_FACTORS: taginfo = tags[tagname % replacements].get @@ -383,6 +383,7 @@ class Node(object): self.timeframe = 'm' replacements = {'timeframe':self.timeframe} + for attr, tag in self.BASEFILTERS.iteritems(): if tag in info: value = info[tag] @@ -401,7 +402,7 @@ class Node(object): if 'peer_id' in info: orig_attrs['site'] = self.site - self.site = self._api.peer_map[info['peer_id']] + self.site = self._sliceapi.peer_map[info['peer_id']] if 'interface_ids' in info: self.min_num_external_ifaces = \ diff --git a/src/nepi/util/parser/sfa.py b/src/nepi/util/parser/sfa.py index 51944934..bb83508b 100644 --- a/src/nepi/util/parser/sfa.py +++ b/src/nepi/util/parser/sfa.py @@ -95,11 +95,16 @@ class SFAResourcesParser(object): node_data[name] = get_child_text(node_tag, name) iface_tags = node_tag.getElementsByTagName('interface') ifaces_data = dict() + iface_ids = list() for iface_tag in iface_tags: if iface_tag.nodeType == doc.ELEMENT_NODE: for name in ['component_id', 'ipv4']: - ifaces_data[name] = get_attribute(iface_tag, name) + value = get_attribute(iface_tag, name) + ifaces_data[name] = value + if name == 'component_id': + iface_ids.append(value) node_data['interfaces'] = ifaces_data + node_data['interface_ids'] = iface_ids return nodes_data def slice_tags_from_xml(self, doc, rspec_tag): diff --git a/src/nepi/util/sfiapi.py b/src/nepi/util/sfiapi.py index 90affffc..5b4b3cc1 100644 --- a/src/nepi/util/sfiapi.py +++ b/src/nepi/util/sfiapi.py @@ -22,6 +22,7 @@ class SFIAPI(object): return list(self._slice_nodes) def GetNodeInfo(self, node_id): + # TODO: thread-unsafe!! sanitize! info = self.GetNodes(node_id) tags = self.GetNodeTags(node_id=node_id, fields=('tagname','value')) return info, tags @@ -50,7 +51,6 @@ class SFIAPI(object): def GetNodes(self, nodeIdOrName=None, fields=[], **kw): #TODO: filter - peer - # field - interface_ids nodes = self._all_nodes if nodeIdOrName is not None: node_ids = nodeIdOrName @@ -62,8 +62,12 @@ class SFIAPI(object): if '|slice_ids' in filters: nodes = self._FilterByNodeId(nodes, self._slice_nodes) del filters['|slice_ids'] + # TODO: Remove this!! need to allow filter '>last_contact' !!! + for f in ['>last_contact', 'node_type', 'run_level']: + if f in filters: + del filters[f] nodes = self._FilterByFilters(nodes, filters) - return self._GetNodeInfo(nodes, fields) + return self._GetNodeFieldsInfo(nodes, fields) def _FilterByNodeId(self, nodes, node_ids): return dict((k, nodes[k]) for k in node_ids if k in nodes) @@ -73,22 +77,25 @@ class SFIAPI(object): data = nodes[node_id] for name, value in filters.iteritems(): #if (name == '>last_contact' and data['lastcontact'] > value) or \ - if (not name in data or data[tag] != value): + if (not name in data or data[name] != value): return False return True return dict((k, value) for k, value in nodes.iteritems() if has_all_tags(k)) - def _GetNodeInfo(self, nodes, fields): + def _GetNodeFieldsInfo(self, nodes, fields): result = list() for k, data in nodes.iteritems(): + if not fields: + result.append(data) + continue r_data = dict() - result.append(r_data) for f in fields: if f == "node_id": value = k else: value = data[f] r_data[f] = value + result.append(r_data) return result def _GetTagInfo(self, nodes, tagnames, fields): -- 2.47.0