86c72bb8a631cc9df95133b440bd5246b18eee61
[plcapi.git] / omf / reset_xmpp_pubsub_nodes.py
1 #!/usr/bin/env /usr/bin/plcsh
2
3 import sys
4 import xmlrpclib
5 from optparse import OptionParser
6
7 sys.path.append("/usr/bin/")
8 from omf_slicemgr import *
9 from PLC.Config import Config
10
11 config = Config("/etc/planetlab/plc_config")
12 pubsub=None
13 verbose=False
14
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
19     global pubsub
20     pubsub = PubSubClient(xmppuser, xmpppass, verbose=verbose)
21
22 def init_xmlrpc ():
23     return xmlrpclib.ServerProxy(config.PLC_OMF_SLICEMGR_URL)
24     
25
26 def delete_all_nodes(iq):
27     global pubsub
28     print "Deleting PubSub groups..."
29     for i in iq.query.elements():
30         node = i['node']
31         if verbose: print 'deleting node',node
32         reactor.callLater(1, pubsub.delete_node, node)
33
34 def is_local_node(node_id, slice_name):
35     try:
36         return GetNodes({'node_id': node_id}, ['peer_id'])[0]['peer_id'] == None
37     except IndexError:
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)
40         return False
41
42 def main ():
43     usage="Usage: %prog -- [options]"
44     parser=OptionParser (usage=usage)
45     parser.add_option ("-v","--verbose",action='store_true',dest='verbose',default=False,
46                        help="be verbose")
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()
50     global verbose
51     verbose=options.verbose
52     if args: 
53         parser.print_help()
54         sys.exit(1)
55
56     init_global_pubsub (options.verbose)
57     xmlrpc = init_xmlrpc ()
58     
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")
63
64     reactor.callLater(4, reactor.stop)
65     reactor.connectTCP(pubsub.id.host, 5222, pubsub.factory)
66     reactor.run()
67
68     print "Re-creating PubSub groups..."
69     if options.slice_pattern:
70         slices=GetSlices({'name':options.slice_pattern})
71         if not slices:
72             print 'Could not find any slice with',options.slice_pattern
73             sys.exit(1)
74     else:
75         slices = GetSlices()
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 ] )
80     total=len(slices)
81     slice_counter=1
82     node_counter=0
83     for slice in slices:
84         print 40*'x' + " slice %s (%d/%d)"%(slice['name'],slice_counter,total)
85         slice_counter +=1
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]
92                 if hrn:
93                     print 'add resource',slice['name'],hrn
94                     xmlrpc.addResource(slice['name'],hrn)
95                     node_counter +=1
96                 else:
97                     print "WARNING: missing hrn tag for node_id: %s" % node_id
98             else:
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
101
102 if __name__ == "__main__":
103     main()