Setting tag plcapi-5.2-5
[plcapi.git] / omf / reset_xmpp_pubsub_nodes.py
old mode 100644 (file)
new mode 100755 (executable)
index 1fe359c..86c72bb
@@ -2,25 +2,60 @@
 
 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=True)
+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 "called"
+    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)
 
-if __name__ == "__main__":
+def is_local_node(node_id, slice_name):
+    try:
+        return GetNodes({'node_id': node_id}, ['peer_id'])[0]['peer_id'] == None
+    except IndexError:
+        print "WARNING: can not find the node with node_id %s" % node_id
+        print "WARNING: node_id %s was referenced in slice %s" % (node_id, slice_name)
+        return False
+
+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")
@@ -30,12 +65,39 @@ if __name__ == "__main__":
     reactor.connectTCP(pubsub.id.host, 5222, pubsub.factory)
     reactor.run()
 
-    slices = GetSlices()
+    print "Re-creating PubSub groups..."
+    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']:
-            node = GetNodes(node_id)[0]['hostname']
-            xmlrpc.addResource(slice['name'], node)
-            
+            # 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()