1 #!/usr/bin/env /usr/bin/plcsh
5 from optparse import OptionParser
7 sys.path.append("/usr/bin/")
8 from omf_slicemgr import *
9 from PLC.Config import Config
11 config = Config("/etc/planetlab/plc_config")
15 def init_global_pubsub(verbose):
16 xmppserver = config.PLC_OMF_XMPP_SERVER
17 xmppuser = "@".join([config.PLC_OMF_XMPP_USER, xmppserver])
18 xmpppass = config.PLC_OMF_XMPP_PASSWORD
20 pubsub = PubSubClient(xmppuser, xmpppass, verbose=verbose)
23 return xmlrpclib.ServerProxy(config.PLC_OMF_SLICEMGR_URL)
26 def delete_all_nodes(iq):
28 print "Deleting PubSub groups..."
29 for i in iq.query.elements():
31 if verbose: print 'deleting node',node
32 reactor.callLater(1, pubsub.delete_node, node)
34 def is_local_node(node_id, slice_name):
36 return GetNodes({'node_id': node_id}, ['peer_id'])[0]['peer_id'] == None
38 print "WARNING: can not find the node with node_id %s" % node_id
39 print "WARNING: node_id %s was referenced in slice %s" % (node_id, slice_name)
43 usage="Usage: %prog -- [options]"
44 parser=OptionParser (usage=usage)
45 parser.add_option ("-v","--verbose",action='store_true',dest='verbose',default=False,
47 parser.add_option ("-s","--slice_pattern", action='store', dest='slice_pattern', default=None,
48 help="specify just one slice (or a slice name pattern), for debug mostly")
49 (options,args) = parser.parse_args()
51 verbose=options.verbose
56 init_global_pubsub (options.verbose)
57 xmlrpc = init_xmlrpc ()
59 pubsub.add_result_hook("discover", delete_all_nodes)
60 reactor.callLater(1, pubsub.discover)
61 reactor.callLater(2, pubsub.create_node, "/OMF")
62 reactor.callLater(2, pubsub.create_node, "/SYSTEM")
64 reactor.callLater(4, reactor.stop)
65 reactor.connectTCP(pubsub.id.host, 5222, pubsub.factory)
68 print "Re-creating PubSub groups..."
69 if options.slice_pattern:
70 slices=GetSlices({'name':options.slice_pattern})
72 print 'Could not find any slice with',options.slice_pattern
76 # optimizing the API calls
77 nodes = GetNodes ({},['node_id','hrn','peer_id'])
78 local_node_hash = dict ( [ (n['node_id'],n['hrn']) for n in nodes if n['peer_id'] is None ] )
79 foreign_node_hash = dict ( [ (n['node_id'],n['hrn']) for n in nodes if n['peer_id'] is not None ] )
84 print 40*'x' + " slice %s (%d/%d)"%(slice['name'],slice_counter,total)
86 xmlrpc.createSlice(slice['name'])
87 for node_id in slice['node_ids']:
88 # silently ignore foreign nodes
89 if node_id in foreign_node_hash: continue
90 elif node_id in local_node_hash:
91 hrn=local_node_hash[node_id]
93 print 'add resource',slice['name'],hrn
94 xmlrpc.addResource(slice['name'],hrn)
97 print "WARNING: missing hrn tag for node_id: %s" % node_id
99 print "Cannot find node with node_id %d (in slice %s)"%(node_id,slice['name'])
100 print "Re-created a total of %d pubsub nodes"%node_counter
102 if __name__ == "__main__":