diff --git a/lib/backend.py b/lib/backend.py index 01fd28dc27bbd89454036ee36cd682c6a1ebb301..0b922884d5d18b6fcd6c77a7dbbb3d4ec0efe657 100644 --- a/lib/backend.py +++ b/lib/backend.py @@ -712,7 +712,7 @@ def InstanceOsAdd(instance, reinstall): """ inst_os = OSFromDisk(instance.os) - create_env = OSEnvironment(instance) + create_env = OSEnvironment(instance, inst_os) if reinstall: create_env['INSTANCE_REINSTALL'] = "1" @@ -744,7 +744,7 @@ def RunRenameInstance(instance, old_name): """ inst_os = OSFromDisk(instance.os) - rename_env = OSEnvironment(instance) + rename_env = OSEnvironment(instance, inst_os) rename_env['OLD_INSTANCE_NAME'] = old_name logfile = "%s/rename-%s-%s-%s-%d.log" % (constants.LOG_OS_DIR, instance.os, @@ -1569,9 +1569,9 @@ def _TryOSFromDisk(name, base_dir=None): # push the error up return status, api_versions - if constants.OS_API_VERSION not in api_versions: + if not constants.OS_API_VERSIONS.intersection(api_versions): return False, ("API version mismatch for path '%s': found %s, want %s." % - (os_dir, api_versions, constants.OS_API_VERSION)) + (os_dir, api_versions, constants.OS_API_VERSIONS)) # OS Scripts dictionary, we will populate it with the actual script names os_scripts = dict.fromkeys(constants.OS_SCRIPTS) @@ -1628,11 +1628,13 @@ def OSFromDisk(name, base_dir=None): return payload -def OSEnvironment(instance, debug=0): +def OSEnvironment(instance, os, debug=0): """Calculate the environment for an os script. @type instance: L{objects.Instance} @param instance: target instance for the os script run + @type os: L{objects.OS} + @param os: operating system for which the environment is being built @type debug: integer @param debug: debug level (0 or 1, for OS Api 10) @rtype: dict @@ -1642,7 +1644,8 @@ def OSEnvironment(instance, debug=0): """ result = {} - result['OS_API_VERSION'] = '%d' % constants.OS_API_VERSION + api_version = max(constants.OS_API_VERSIONS.intersection(os.api_versions)) + result['OS_API_VERSION'] = '%d' % api_version result['INSTANCE_NAME'] = instance.name result['INSTANCE_OS'] = instance.os result['HYPERVISOR'] = instance.hypervisor @@ -1759,9 +1762,9 @@ def ExportSnapshot(disk, dest_node, instance, cluster_name, idx): @rtype: None """ - export_env = OSEnvironment(instance) - inst_os = OSFromDisk(instance.os) + export_env = OSEnvironment(instance, inst_os) + export_script = inst_os.export_script logfile = "%s/exp-%s-%s-%s.log" % (constants.LOG_OS_DIR, inst_os.name, @@ -1903,8 +1906,8 @@ def ImportOSIntoInstance(instance, src_node, src_images, cluster_name): @return: each boolean represent the success of importing the n-th disk """ - import_env = OSEnvironment(instance) inst_os = OSFromDisk(instance.os) + import_env = OSEnvironment(instance, inst_os) import_script = inst_os.import_script logfile = "%s/import-%s-%s-%s.log" % (constants.LOG_OS_DIR, instance.os, diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 03660c1534192b2c8b7255e0a9f9c2170b182f76..91a35a35b59872e08123a826ae4770f814086c07 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -2577,7 +2577,7 @@ class LUQueryClusterInfo(NoHooksLU): "software_version": constants.RELEASE_VERSION, "protocol_version": constants.PROTOCOL_VERSION, "config_version": constants.CONFIG_VERSION, - "os_api_version": constants.OS_API_VERSION, + "os_api_version": max(constants.OS_API_VERSIONS), "export_version": constants.EXPORT_VERSION, "architecture": (platform.architecture()[0], platform.machine()), "name": cluster.cluster_name, diff --git a/lib/constants.py b/lib/constants.py index 01034051e75ad64f9883b0308a70923c0e9af2d0..13dad7ad9c3a164f871936372e7bba73747baa30 100644 --- a/lib/constants.py +++ b/lib/constants.py @@ -26,7 +26,9 @@ from ganeti import _autoconf # various versions PROTOCOL_VERSION = 20 RELEASE_VERSION = _autoconf.PACKAGE_VERSION -OS_API_VERSION = 10 +OS_API_V10 = 10 +OS_API_V15 = 15 +OS_API_VERSIONS = frozenset([OS_API_V10, OS_API_V15]) EXPORT_VERSION = 0 RAPI_VERSION = 2 diff --git a/qa/qa_os.py b/qa/qa_os.py index b39e3ca3917c3e420e96980fddd0951227ca40bb..4b6fa5e22f159c9ce9bd08ffd312d589c82bb261 100644 --- a/qa/qa_os.py +++ b/qa/qa_os.py @@ -72,7 +72,7 @@ def _SetupTempOs(node, dir, valid): if valid: parts.append(sq(["ln", "-fs", "/bin/true", "create"])) - parts.append(sq(["echo", str(constants.OS_API_VERSION)]) + + parts.append(sq(["echo", str(constants.OS_API_V10)]) + " >ganeti_api_version") cmd = ' && '.join(parts)