Blob Blame History Raw
diff --git a/fence/agents/compute/fence_compute.py b/fence/agents/compute/fence_compute.py
index 0a238b6..4b229b0 100644
--- a/fence/agents/compute/fence_compute.py
+++ b/fence/agents/compute/fence_compute.py
@@ -4,6 +4,7 @@ import sys
 import time
 import atexit
 import logging
+import inspect
 import requests.exceptions
 
 sys.path.append("@FENCEAGENTSLIBDIR@")
@@ -310,15 +311,46 @@ def create_nova_connection(options):
 
 	versions = [ "2.11", "2" ]
 	for version in versions:
-		nova = client.Client(version,
-				     options["--username"],
-				     options["--password"],
-				     options["--tenant-name"],
-				     options["--auth-url"],
-				     insecure=options["--insecure"],
-				     region_name=options["--region-name"],
-				     endpoint_type=options["--endpoint-type"],
-				     http_log_debug=options.has_key("--verbose"))
+                clientargs = inspect.getargspec(client.Client).varargs
+
+                # Some versions of Openstack prior to Ocata only
+                # supported positional arguments for username,
+                # password and tenant.
+                #
+                # Versions since Ocata only support named arguments.
+                #
+                # So we need to use introspection to figure out how to
+                # create a Nova client.
+                #
+                # Happy days
+                #
+                if clientargs:
+                        # OSP < 11
+                        # ArgSpec(args=['version', 'username', 'password', 'project_id', 'auth_url'],
+                        #         varargs=None,
+                        #         keywords='kwargs', defaults=(None, None, None, None))
+		        nova = client.Client(version,
+				             options["--username"],
+				             options["--password"],
+				             options["--tenant-name"],
+				             options["--auth-url"],
+				             insecure=options["--insecure"],
+				             region_name=options["--region-name"],
+				             endpoint_type=options["--endpoint-type"],
+				             http_log_debug=options.has_key("--verbose"))
+                else:
+                        # OSP >= 11
+                        # ArgSpec(args=['version'], varargs='args', keywords='kwargs', defaults=None)
+		        nova = client.Client(version,
+				             username=options["--username"],
+				             password=options["--password"],
+				             tenant_name=options["--tenant-name"],
+				             auth_url=options["--auth-url"],
+				             insecure=options["--insecure"],
+				             region_name=options["--region-name"],
+				             endpoint_type=options["--endpoint-type"],
+				             http_log_debug=options.has_key("--verbose"))
+
 		try:
 			nova.hypervisors.list()
 			return
@@ -329,7 +361,7 @@ def create_nova_connection(options):
 		except Exception as e:
 			logging.warning("Nova connection failed. %s: %s" % (e.__class__.__name__, e))
 			
-	fail_usage("Couldn't obtain a supported connection to nova, tried: %s" % repr(versions))
+	logging.warning("Couldn't obtain a supported connection to nova, tried: %s\n" % repr(versions))
 
 def define_new_opts():
 	all_opt["endpoint-type"] = {
@@ -417,7 +449,7 @@ def main():
 	global override_status
 	atexit.register(atexit_handler)
 
-	device_opt = ["login", "passwd", "tenant-name", "auth-url", "fabric_fencing", "on_target",
+	device_opt = ["login", "passwd", "tenant-name", "auth-url", "fabric_fencing", 
 		"no_login", "no_password", "port", "domain", "no-shared-storage", "endpoint-type",
 		"record-only", "instance-filtering", "insecure", "region-name"]
 	define_new_opts()