* re-enable error handling in create_node results.
[plcapi.git] / omf / omf-slicemgr.py
index f1bf1d1..6719e42 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python
 # Baris Metin <tmetin@sophia.inria.fr>
 
 import os
@@ -96,7 +96,8 @@ class BaseClient(object):
 
     def message_chat(self, m):
         n = domish.Element((None, "message"))
-        n['to'], n['from'] = m['from'], m['to']
+        n['to'] = m['from']
+        n['from'] = self.id.full()
         n.addElement("body", content = "don't have time to chat. working!")
         self.xmlstream.send(n)
 
@@ -121,6 +122,7 @@ class PubSubClient(BaseClient):
         xs.addObserver("/iq/pubsub/create", self.result_create_node)
         xs.addObserver("/iq/pubsub/delete", self.result_delete_node)
         xs.addObserver("/iq/query[@xmlns='http://jabber.org/protocol/disco#items']", self.result_discover)
+        xs.addObserver("/iq/pubsub/subscription[@subscription='subscribed']", self.result_subscribe_to_node)
 
     def __iq(self, t="get"):
         iq = domish.Element((None, "iq"))
@@ -130,6 +132,11 @@ class PubSubClient(BaseClient):
         iq.addUniqueId()
         return iq
 
+    def __add_pubsub(self, iq):
+        pubsub = iq.addElement("pubsub")
+        pubsub['xmlns'] = "http://jabber.org/protocol/pubsub"
+        return pubsub
+
     def discover(self, node = None):
         iq = self.__iq("get")
         query = iq.addElement("query")
@@ -143,15 +150,31 @@ class PubSubClient(BaseClient):
         if self.verbose: self.info("Items for node: %s" % self.requests[iq['id']])
         
         hook = self.hooks.get('discover', None)
-        for i in iq.query.elements():
-            if self.verbose: self.msg(i.toXml())
-            if hook: hook(i)
+        if hook:
+            hook(iq)
+            self.delete_result_hook('discover')
+
+        if self.verbose:
+            for i in iq.query.elements():
+                self.msg(i.toXml())
+
+        self.requests.pop(iq['id'])
+
+    def subscribe_to_node(self, node):
+        iq = self.__iq("set")
+        pubsub = self.__add_pubsub(iq)
+        subscribe = pubsub.addElement("subscribe")
+        subscribe['node'] = node
+        subscribe['jid'] = self.id.full()
+        self.requests[iq['id']] = node
+        self.xmlstream.send(iq)
+
+    def result_subscribe_to_node(self, iq):
         self.requests.pop(iq['id'])
 
     def create_node(self, node = None):
         iq = self.__iq("set")
-        pubsub = iq.addElement("pubsub")
-        pubsub['xmlns'] = "http://jabber.org/protocol/pubsub"
+        pubsub = self.__add_pubsub(iq)
         create = pubsub.addElement("create")
         if node:
             create['node'] = node
@@ -160,27 +183,31 @@ class PubSubClient(BaseClient):
         self.xmlstream.send(iq)
 
     def result_create_node(self, iq):
-#         if hasattr(iq, "error"):
-#             node = self.requests[iq['id']]
-#             if hasattr(iq.error, "conflict"):
-#                 # node is already there, nothing important.
-#                 self.warn("NodeID exists: %s" % node)
-#             else:
-#                 err_type = ""
-#                 err_name = ""
-#                 if iq.error:
-#                     if iq.error.has_key('type'):
-#                         err_type = iq.error['type']
-#                     if iq.error.firstChildElement and hasattr(iq.error.firstChildElement, "name"):
-#                         err_name = iq.error.firstChildElement.name
-#                 self.error("Can not create node: %s (error type: %s, %s)" %  (node, err_type, err_name))
+        node = self.requests[iq['id']]
+        try:
+            if hasattr(iq.error, "conflict"):
+                # node is already there, nothing important.
+                self.warn("NodeID exists: %s" % node)
+            else:
+                err_type = ""
+                err_name = ""
+                if iq.error:
+                    if iq.error.has_key('type'):
+                        err_type = iq.error['type']
+                    if iq.error.firstChildElement and hasattr(iq.error.firstChildElement, "name"):
+                        err_name = iq.error.firstChildElement.name
+                self.error("Can not create node: %s (error type: %s, %s)" %  (node, err_type, err_name))
+        except AttributeError:
+            # no errors
+            # try subscribing to the node for debugging purposes
+            self.subscribe_to_node(node)
+
         self.requests.pop(iq['id'])
 
 
     def delete_node(self, node):
         iq = self.__iq("set")
-        pubsub = iq.addElement("pubsub")
-        pubsub['xmlns'] = "http://jabber.org/protocol/pubsub#owner"
+        pubsub = self.__add_pubsub(iq)
         delete = pubsub.addElement("delete")
         delete['node'] = node
         self.requests[iq['id']] = node
@@ -189,20 +216,42 @@ class PubSubClient(BaseClient):
     def result_delete_node(self, iq):
         self.requests.pop(iq['id'])
 
-
-
-
-class Slicemgr(PubSubClient, xmlrpc.XMLRPC):
+    def message_chat(self, m):
+        command = ""
+        for e in m.elements():
+            if e.name == "body":
+                command = "%s" % e
+                break
+
+        if command == "list groups":
+            def list_groups(iq):
+                reply = ""
+                for i in iq.query.elements():
+                    reply += "%s\n" % i['node']
+                n = domish.Element((None, "message"))
+                n['to'] = m['from']
+                n['from'] = self.id.full()
+                n.addElement("body", content = reply)
+                self.xmlstream.send(n)
+
+            self.add_result_hook("discover", list_groups)
+            self.discover()
+
+        else:
+            BaseClient.message_chat(self, m)
+
+
+class Slicemgr(xmlrpc.XMLRPC, PubSubClient):
     
     DOMAIN = "/OMF"
     RESOURCES = 'resources'
 
     def __init__(self, id, secret, verbose = False, log = None):
+        xmlrpc.XMLRPC.__init__(self, allowNone=True)
         PubSubClient.__init__(self, id, secret, verbose = verbose, log = log)
         self.command_queue = Queue.Queue()
 
-        # for xmlrpc interface
-        self.allowNone = True
+        xmlrpc.addIntrospection(self)
 
     def xmlrpc_createSlice(self, slice):
         self.create_slice(slice)
@@ -234,13 +283,13 @@ class Slicemgr(PubSubClient, xmlrpc.XMLRPC):
         slice_prefix = "/".join([self.DOMAIN,slice])
         resource_prefix = "/".join([self.DOMAIN,slice,self.RESOURCES])
         def delete_slice_resources(iq):
-            node = iq['node']
-            if node.startswith(resource_prefix):
-                self.command_que.put(self.delete_node, node)
+            for i in iq.query.elements():
+                node = i['node']
+                if node.startswith(resource_prefix):
+                    self.command_que.put(self.delete_node, node)
 
         self.add_result_hook("discover", delete_slice_resources)
         self.discover()
-        self.delete_result_hook("discover")
 
         self.command_queue.put(( self.delete_node, resource_prefix) )
         self.command_queue.put(( self.delete_node, slice_prefix) )
@@ -264,7 +313,7 @@ if __name__ == "__main__":
     t = task.LoopingCall(slicemgr.flush_commands)
     t.start(5.0) # check every 5 seconds
     reactor.connectTCP(slicemgr.id.host, 5222, slicemgr.factory)
-    reactor.listenTCP(5053, server.Site(slicemgr))
+    reactor.listenTCP(5053, server.Site(slicemgr), interface="localhost")
     reactor.run(installSignalHandlers=True)