Sfi can be created without options at all
[sfa.git] / sfa / client / sfi.py
index 1c49dc9..a70590b 100755 (executable)
@@ -26,6 +26,7 @@ from sfa.util.xrn import Xrn, get_leaf, get_authority, hrn_to_urn
 from sfa.util.xmlrpcprotocol import ServerException
 import sfa.util.xmlrpcprotocol as xmlrpcprotocol
 from sfa.util.config import Config
+from sfa.util.version import version_core
 
 AGGREGATE_PORT=12346
 CM_PORT=12346
@@ -119,13 +120,24 @@ def load_record_from_file(filename):
 
 
 class Sfi:
+    
+    required_options=['verbose',  'debug',  'registry',  'sm',  'auth',  'user']
+
+    # dummy to meet Sfi's expectations for its 'options' field
+    # i.e. s/t we can do setattr on
+    class DummyOptions:
+        pass
 
-    def __init__ (self):
+    def __init__ (self,options=None):
+        if options is None: options=Sfi.DummyOptions()
+        for opt in Sfi.required_options:
+            if not hasattr(options,opt): setattr(options,opt,None)
+        if not hasattr(options,'sfi_dir'): options.sfi_dir=os.path.expanduser("~/.sfi/")
+        self.options = options
         self.slicemgr = None
         self.registry = None
         self.user = None
         self.authority = None
-        self.options = None
         self.hashrequest = False
         sfa_logger_goes_to_console()
         self.logger=sfa_logger()
@@ -213,8 +225,11 @@ class Sfi:
         
         if command in ("version"):
             parser.add_option("-R","--registry-version",
-                              action="store_true", dest="probe_registry", default=False,
+                              action="store_true", dest="version_registry", default=False,
                               help="probe registry version instead of slicemgr")
+            parser.add_option("-l","--local",
+                              action="store_true", dest="version_local", default=False,
+                              help="display version of the local client")
 
         return parser
 
@@ -251,10 +266,7 @@ class Sfi:
         return parser
         
  
-    #
-    # Establish Connection to SliceMgr and Registry Servers
-    #
-    def set_servers(self):
+    def read_config(self):
        config_file = self.options.sfi_dir + os.sep + "sfi_config"
        try:
           config = Config (config_file)
@@ -270,18 +282,18 @@ class Sfi:
        errors = 0
        # Set SliceMgr URL
        if (self.options.sm is not None):
-          sm_url = self.options.sm
+          self.sm_url = self.options.sm
        elif hasattr(config, "SFI_SM"):
-          sm_url = config.SFI_SM
+          self.sm_url = config.SFI_SM
        else:
           self.logger.error("You need to set e.g. SFI_SM='http://your.slicemanager.url:12347/' in %s" % config_file)
           errors += 1 
     
        # Set Registry URL
        if (self.options.registry is not None):
-          reg_url = self.options.registry
+          self.reg_url = self.options.registry
        elif hasattr(config, "SFI_REGISTRY"):
-          reg_url = config.SFI_REGISTRY
+          self.reg_url = config.SFI_REGISTRY
        else:
           self.logger.errors("You need to set e.g. SFI_REGISTRY='http://your.registry.url:12345/' in %s" % config_file)
           errors += 1 
@@ -307,8 +319,14 @@ class Sfi:
     
        if errors:
           sys.exit(1)
-    
-    
+
+
+    #
+    # Establish Connection to SliceMgr and Registry Servers
+    #
+    def set_servers(self):
+
+       self.read_config() 
        # Get key and certificate
        key_file = self.get_key_file()
        cert_file = self.get_cert_file(key_file)
@@ -317,10 +335,10 @@ class Sfi:
        self.cert_file = cert_file
        self.cert = Certificate(filename=cert_file) 
        # Establish connection to server(s)
-       self.logger.info("Contacting Registry at: %s"%reg_url)
-       self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file, self.options)  
-       self.logger.info("Contacting Slice Manager at: %s"%sm_url)
-       self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file, self.options)
+       self.logger.info("Contacting Registry at: %s"%self.reg_url)
+       self.registry = xmlrpcprotocol.get_server(self.reg_url, key_file, cert_file, self.options)  
+       self.logger.info("Contacting Slice Manager at: %s"%self.sm_url)
+       self.slicemgr = xmlrpcprotocol.get_server(self.sm_url, key_file, cert_file, self.options)
 
        return
     
@@ -554,7 +572,7 @@ class Sfi:
     # list entires in named authority registry
     def list(self, opts, args):
         if len(args)!= 1:
-            self.parser.print_help()
+            self.print_help()
             sys.exit(1)
         hrn = args[0]
         user_cred = self.get_user_cred().save_to_string(save_parents=True)
@@ -578,7 +596,7 @@ class Sfi:
     # show named registry record
     def show(self, opts, args):
         if len(args)!= 1:
-            self.parser.print_help()
+            self.print_help()
             sys.exit(1)
         hrn = args[0]
         user_cred = self.get_user_cred().save_to_string(save_parents=True)
@@ -662,7 +680,7 @@ class Sfi:
     def remove(self, opts, args):
         auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
         if len(args)!=1:
-            self.parser.print_help()
+            self.print_help()
             sys.exit(1)
         hrn = args[0]
         type = opts.type 
@@ -674,7 +692,7 @@ class Sfi:
     def add(self, opts, args):
         auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
         if len(args)!=1:
-            self.parser.print_help()
+            self.print_help()
             sys.exit(1)
         record_filepath = args[0]
         rec_file = self.get_record_file(record_filepath)
@@ -685,7 +703,7 @@ class Sfi:
     def update(self, opts, args):
         user_cred = self.get_user_cred()
         if len(args)!=1:
-            self.parser.print_help()
+            self.print_help()
             sys.exit(1)
         rec_file = self.get_record_file(args[0])
         record = load_record_from_file(rec_file)
@@ -755,11 +773,15 @@ class Sfi:
     
 
     def version(self, opts, args):
-        if opts.probe_registry:
-            server=self.registry
+        if opts.version_local:
+            version=version_core()
         else:
-            server = self.get_server_from_opts(opts)
-        for (k,v) in server.GetVersion().items():
+            if opts.version_registry:
+                server=self.registry
+            else:
+                server = self.get_server_from_opts(opts)
+            version=server.GetVersion()
+        for (k,v) in version.items():
             print "%-20s: %s"%(k,v)
 
     # list instantiated slices
@@ -798,8 +820,9 @@ class Sfi:
             creds.append(delegated_cred) 
         result = server.ListResources(creds, call_options)
         format = opts.format
-        display_rspec(result, format)
-        if (opts.file is not None):
+        if opts.file is None:
+            display_rspec(result, format)
+        else:
             file = opts.file
             if not file.startswith(os.sep):
                 file = os.path.join(self.options.sfi_dir, file)
@@ -960,13 +983,16 @@ class Sfi:
         server = self.get_server_from_opts(opts)
         return server.Shutdown(slice_urn, creds)         
     
+    def print_help (self):
+        self.sfi_parser.print_help()
+        self.cmd_parser.print_help()
 
     #
     # Main: parse arguments and dispatch to command
     #
     def main(self):
-        parser = self.create_parser()
-        (options, args) = parser.parse_args()
+        self.sfi_parser = self.create_parser()
+        (options, args) = self.sfi_parser.parse_args()
         self.options = options
 
         self.logger.setLevelFromOptVerbose(self.options.verbose)
@@ -978,8 +1004,8 @@ class Sfi:
             return -1
     
         command = args[0]
-        self.parser = self.create_cmd_parser(command)
-        (cmd_opts, cmd_args) = self.parser.parse_args(args[1:])
+        self.cmd_parser = self.create_cmd_parser(command)
+        (cmd_opts, cmd_args) = self.cmd_parser.parse_args(args[1:])
 
         self.set_servers()