import sys
import xmlrpclib
+from optparse import OptionParser
+
sys.path.append("/usr/bin/")
from omf_slicemgr import *
+from PLC.Config import Config
-xmlrpc = xmlrpclib.ServerProxy("http://localhost:5053")
+config = Config("/etc/planetlab/plc_config")
+pubsub=None
+verbose=False
-xmppserver = config.PLC_OMF_XMPP_SERVER
-xmppuser = "@".join([config.PLC_OMF_XMPP_USER, xmppserver])
-xmpppass = config.PLC_OMF_XMPP_PASSWORD
-pubsub = PubSubClient(xmppuser, xmpppass, verbose=False)
+def init_global_pubsub(verbose):
+ xmppserver = config.PLC_OMF_XMPP_SERVER
+ xmppuser = "@".join([config.PLC_OMF_XMPP_USER, xmppserver])
+ xmpppass = config.PLC_OMF_XMPP_PASSWORD
+ global pubsub
+ pubsub = PubSubClient(xmppuser, xmpppass, verbose=verbose)
+def init_xmlrpc ():
+ return xmlrpclib.ServerProxy(config.PLC_OMF_SLICEMGR_URL)
+
def delete_all_nodes(iq):
global pubsub
print "Deleting PubSub groups..."
for i in iq.query.elements():
node = i['node']
+ if verbose: print 'deleting node',node
reactor.callLater(1, pubsub.delete_node, node)
def is_local_node(node_id, slice_name):
print "WARNING: node_id %s was referenced in slice %s" % (node_id, slice_name)
return False
-if __name__ == "__main__":
+def main ():
+ usage="Usage: %prog -- [options]"
+ parser=OptionParser (usage=usage)
+ parser.add_option ("-v","--verbose",action='store_true',dest='verbose',default=False,
+ help="be verbose")
+ parser.add_option ("-s","--slice_pattern", action='store', dest='slice_pattern', default=None,
+ help="specify just one slice (or a slice name pattern), for debug mostly")
+ (options,args) = parser.parse_args()
+ global verbose
+ verbose=options.verbose
+ if args:
+ parser.print_help()
+ sys.exit(1)
+
+ init_global_pubsub (options.verbose)
+ xmlrpc = init_xmlrpc ()
+
pubsub.add_result_hook("discover", delete_all_nodes)
reactor.callLater(1, pubsub.discover)
reactor.callLater(2, pubsub.create_node, "/OMF")
reactor.run()
print "Re-creating PubSub groups..."
- slices = GetSlices()
+ if options.slice_pattern:
+ slices=GetSlices({'name':options.slice_pattern})
+ if not slices:
+ print 'Could not find any slice with',options.slice_pattern
+ sys.exit(1)
+ else:
+ slices = GetSlices()
+ # optimizing the API calls
+ nodes = GetNodes ({},['node_id','hrn','peer_id'])
+ local_node_hash = dict ( [ (n['node_id'],n['hrn']) for n in nodes if n['peer_id'] is None ] )
+ foreign_node_hash = dict ( [ (n['node_id'],n['hrn']) for n in nodes if n['peer_id'] is not None ] )
+ total=len(slices)
+ slice_counter=1
+ node_counter=0
for slice in slices:
+ print 40*'x' + " slice %s (%d/%d)"%(slice['name'],slice_counter,total)
+ slice_counter +=1
xmlrpc.createSlice(slice['name'])
for node_id in slice['node_ids']:
- try:
- hrn = GetNodeTags({'tagname':'hrn', 'node_id': node_id})[0]['value']
- xmlrpc.addResource(slice['name'], hrn)
- except IndexError:
- if is_local_node(node_id, slice['name']):
+ # silently ignore foreign nodes
+ if node_id in foreign_node_hash: continue
+ elif node_id in local_node_hash:
+ hrn=local_node_hash[node_id]
+ if hrn:
+ print 'add resource',slice['name'],hrn
+ xmlrpc.addResource(slice['name'],hrn)
+ node_counter +=1
+ else:
print "WARNING: missing hrn tag for node_id: %s" % node_id
+ else:
+ print "Cannot find node with node_id %d (in slice %s)"%(node_id,slice['name'])
+ print "Re-created a total of %d pubsub nodes"%node_counter
+
+if __name__ == "__main__":
+ main()