first draft for the federica driver
[sfa.git] / sfa / federica / fdshell.py
diff --git a/sfa/federica/fdshell.py b/sfa/federica/fdshell.py
new file mode 100644 (file)
index 0000000..d362c7f
--- /dev/null
@@ -0,0 +1,43 @@
+import xmlrpclib
+
+from sfa.util.sfalogging import logger
+
+class FdShell:
+    """
+    A simple xmlrpc shell to a federica API server
+    This class can receive the XMLRPC calls to the federica testbed
+    For safety this is limited to a set of hard-coded calls
+    """
+    
+    direct_calls = [ 'listAvailableResources',
+                     'listSliceResources',
+                     'createSlice',
+                     'deleteSlice',
+                    ]
+
+    def __init__ ( self, config ) :
+        # xxx to be configurable
+        SFA_FEDERICA_URL = "http://%s:%s@%s:%s/"%\
+            (config.SFA_FEDERICA_USER,config.SFA_FEDERICA_PASSWORD,
+             config.SFA_FEDERICA_HOSTNAME,config.SFA_FEDERICA_PORT)
+        url=SFA_FEDERICA_URL
+        # xxx not sure if java xmlrpc has support for None
+        # self.proxy = xmlrpclib.Server(url, verbose = False, allow_none = True)
+        # xxx turn on verbosity
+        self.proxy = xmlrpclib.Server(url, verbose = True)
+
+    def __getattr__(self, name):
+        def func(*args, **kwds):
+            if name not in FdShell.direct_calls:
+                raise Exception, "Illegal method call %s for FEDERICA driver"%(name)
+            # xxx get credentials from the config ?
+            # right now basic auth data goes into the URL
+            # the API still provides for a first credential arg though
+            credential='xxx-unused-xxx'
+            logger.info("Issuing %s args=%s kwds=%s to federica"%\
+                            (name,args,kwds))
+            result=getattr(self.proxy, "AggregateManager.%s"%name)(credential, *args, **kwds)
+            logger.debug('FdShell %s (%s) returned ... '%(name,name))
+            return result
+        return func
+