From e9ec3baedf4607aefd6f034647ec745ab5ea4ee3 Mon Sep 17 00:00:00 2001 From: smbaker Date: Mon, 28 Nov 2011 03:16:24 -0800 Subject: [PATCH] changes for latest sfa --- sface/screens/mainscreen.py | 88 ++++++++++++++++++++++++++----------- sface/sfidata.py | 8 +--- 2 files changed, 64 insertions(+), 32 deletions(-) diff --git a/sface/screens/mainscreen.py b/sface/screens/mainscreen.py index 74d3abb..05e4fe4 100644 --- a/sface/screens/mainscreen.py +++ b/sface/screens/mainscreen.py @@ -6,6 +6,7 @@ from PyQt4.QtCore import * from PyQt4.QtGui import * #from sfa.util.rspecHelper import RSpec +from sfa.util.xrn import Xrn from sface.config import config from sface.sfirenew import RenewWindow from sface.sfiprocess import SfiProcess @@ -341,7 +342,7 @@ class SliceWidget(QWidget): self.connect(refresh, SIGNAL('clicked()'), self.refresh) self.connect(renew, SIGNAL('clicked()'), self.renew) - self.connect(submit, SIGNAL('clicked()'), self.submit_pg_compat) + self.connect(submit, SIGNAL('clicked()'), self.submit) # _pg_compat) self.connect(searchbox, SIGNAL('textChanged(QString)'), self.search) self.connect(filterbox, SIGNAL('currentIndexChanged(QString)'), self.filter) self.connect(self.nodeView, SIGNAL('hostnameClicked(QString)'), @@ -407,7 +408,7 @@ class SliceWidget(QWidget): return str(item.data(Qt.DisplayRole).toString()) # Recursively walk the tree, making changes to the RSpec - def process_subtree(self, rspec, resources, item, depth = 0): + def process_subtree(self, rspec, rspec_node_names, resource_node_names, item, depth = 0): change = False model = self.nodeModel @@ -420,17 +421,20 @@ class SliceWidget(QWidget): if status == node_status['add']: print "Add hostname: %s" % hostname - resource_node = resources.get_node_element(hostname) + resource_node = resource_node_names.get(hostname, None) if resource_node==None: print "Error: Failed to find %s in resources rspec" % hostname else: - rspec.merge_node(resource_node, testbed) - rspec.add_slivers([{"hostname": str(hostname)}], testbed) + if not (hostname in rspec_node_names): + network_name = Xrn(resource_node['component_manager_id']).get_hrn() + rspec.version.add_network(network_name) + rspec.version.add_nodes([resource_node]) + rspec.version.add_slivers([str(hostname)]) change = True elif status == node_status['remove']: print "Remove hostname: %s" % hostname - rspec.remove_slivers([{"hostname": str(hostname)}], testbed) + rspec.version.remove_slivers([str(hostname)]) change = True elif depth == 3: # Tag tag, value = self.itemText(item).split(": ") @@ -456,7 +460,7 @@ class SliceWidget(QWidget): children = item.rowCount() for row in range(0, children): - status = self.process_subtree(rspec, resources, item.child(row), depth + 1) + status = self.process_subtree(rspec, rspec_node_names, resource_node_names, item.child(row), depth + 1) change = change or status return change @@ -467,7 +471,11 @@ class SliceWidget(QWidget): rspec = SfiData().getSliceRSpec() resources = SfiData().getResourcesRSpec() - change = self.process_subtree(rspec, resources, self.nodeModel.invisibleRootItem()) + + resource_node_names = self.nodesByName(resources.version.get_nodes()) + rspec_node_names = self.nodesByName(rspec.version.get_nodes_with_slivers()) + + change = self.process_subtree(rspec, rspec_node_names, resource_node_names, self.nodeModel.invisibleRootItem()) if not change: self.setStatus("No change in slice data. Not submitting!", timeout=3000) @@ -523,6 +531,29 @@ class SliceWidget(QWidget): self.process.retrieveResources() self.setStatus("Refreshing resources. This will take some time...") + def nodesByNetwork(self, nodeList): + netDict = {} + for node in nodeList: + network_name = Xrn(node['component_manager_id']).get_hrn() + if network_name: + net = netDict.get(network_name, []) + if net == []: + netDict[network_name] = net + + net.append(node) + + return netDict + + def nodesByName(self, nodeList, nameDict=None): + if nameDict==None: + nameDict = {} + for node in nodeList: + hostname = node.get("component_name", None) + if hostname and (not hostname in nameDict): + nameDict[hostname] = node + + return nameDict + def updateView(self): global already_in_nodes already_in_nodes = [] @@ -538,24 +569,34 @@ class SliceWidget(QWidget): return None rootItem = self.nodeModel.invisibleRootItem() - networks = rspec.get_networks() + networks = [] + for network in rspec.get_networks(): + network_name = network.get("name", None) + if (network_name != None) and (not network_name in networks): + networks.append(network_name) for network in resources.get_networks(): - if not network in networks: - networks.append(network) + network_name = network.get("name", None) + if (network_name != None) and (not network_name in networks): + networks.append(network_name) + + resources_nodes = self.nodesByNetwork(resources.version.get_nodes()) + rspec_nodes = self.nodesByNetwork(rspec.version.get_nodes_with_slivers()) for network in networks: self.network_names.append(network) - all_nodes = resources.get_nodes(network) - sliver_nodes = rspec.get_nodes_with_slivers(network) + all_nodes = resources_nodes.get(network, []) + sliver_nodes = rspec_nodes.get(network, []) - available_nodes = [ node for node in all_nodes if node not in sliver_nodes ] + sliver_node_names = self.nodesByName(sliver_nodes) + + available_nodes = [ node for node in all_nodes if node["component_name"] not in sliver_node_names ] msg = "%s Nodes\t%s Selected" % (len(all_nodes), len(sliver_nodes)) networkItem = self.nodeView.appendRow(rootItem, network, membership=msg, kind="network") - already_in_nodes += sliver_nodes + already_in_nodes += sliver_node_names.keys() # Add default slice tags self.nodeView.appendRow(networkItem, "%s for %s" % (default_tags, network), kind="defaults") @@ -566,13 +607,9 @@ class SliceWidget(QWidget): for node in sliver_nodes: self.nodeView.appendRow(networkItem, - node, - nodeStatus=rspec.get_node_boot_state(node, network), - nodeType=rspec.get_node_sliver_type(node, network), - - #get_node_element(node, network).attrib.get("boot_state",""), - #nodeType=rspec.get_node_element(node, network).attrib.get("sliver_type",""), - + node["component_name"], + nodeStatus=node.get("boot_state", ""), + #nodeType=node.get("rspec.get_node_sliver_type(node, network), membership=node_status['in'], kind="node") @@ -585,10 +622,9 @@ class SliceWidget(QWidget): for node in available_nodes: self.nodeView.appendRow(networkItem, - node, - #nodeStatus=resources.get_node_element(node, network).attrib.get("boot_state",""), - nodeStatus = resources.get_node_boot_state(node, network), - nodeType= resources.get_node_sliver_type(node, network), + node["component_name"], + nodeStatus = node.get("boot_state", ""), + #nodeType= resources.get_node_sliver_type(node, network), membership=node_status['out'], kind="node") diff --git a/sface/sfidata.py b/sface/sfidata.py index a70cb47..41b904f 100644 --- a/sface/sfidata.py +++ b/sface/sfidata.py @@ -57,7 +57,7 @@ class SfaceRSpec(RSpec): return self.version.merge_node(source_node_tag, network, no_dupes) # sfav1.add_slivers isn't working for us... - def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False): + def add_slivers_xxx(self, slivers, network=None, sliver_urn=None, no_dupes=False): # add slice name to network tag network_tags = self.xml.xpath('//network') if network_tags: @@ -73,10 +73,6 @@ class SfaceRSpec(RSpec): for tag in sliver['tags']: etree.SubElement(sliver_elem, tag['tagname']).text = value=tag['value'] - # these should be moved to SFAv1, etc. - def get_node_boot_state(self, node, network): - return self.get_node_element(node, network).attrib.get("boot_state","") - def get_node_sliver_type(self, node, network): node = self.get_node_element(node, network) if node is None: @@ -161,7 +157,7 @@ class SfiData: xml = open(rspec_file).read() rspec = SfaceRSpec(rspec=xml) #rspec = parse_rspec(xml) - self.purgeNonSliceResources(rspec) + #self.purgeNonSliceResources(rspec) return rspec return None -- 2.43.0