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()
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') )
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):
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,
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
self.timeframe = 'm'
replacements = {'timeframe':self.timeframe}
+
for attr, tag in self.BASEFILTERS.iteritems():
if tag in info:
value = info[tag]
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 = \
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):
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
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
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)
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):