diff --git a/gns3server/modules/vmware/__init__.py b/gns3server/modules/vmware/__init__.py index b7f5cf88..40196ee1 100644 --- a/gns3server/modules/vmware/__init__.py +++ b/gns3server/modules/vmware/__init__.py @@ -31,6 +31,7 @@ import codecs from collections import OrderedDict from gns3server.utils.interfaces import interfaces from gns3server.utils.asyncio import subprocess_check_output +from pkg_resources import parse_version log = logging.getLogger(__name__) @@ -358,6 +359,31 @@ class VMware(BaseManager): return stdout_data.decode("utf-8", errors="ignore").splitlines() + @asyncio.coroutine + def check_vmrun_version(self): + + with (yield from self._execute_lock): + vmrun_path = self.vmrun_path + if not vmrun_path: + vmrun_path = self.find_vmrun() + + try: + output = yield from subprocess_check_output(vmrun_path) + match = re.search("vmrun version ([0-9\.]+)", output) + version = None + if match: + version = match.group(1) + log.debug("VMware vmrun version {} detected".format(version)) + if parse_version(version) < parse_version("1.13"): + # VMware VIX library version must be at least >= 1.13 + raise VMwareError("VMware vmrun executable version must be >= version 1.13") + if version is None: + log.warning("Could not find VMware vmrun version. Output: {}".format(output)) + raise VMwareError("Could not find VMware vmrun version. Output: {}".format(output)) + except (OSError, subprocess.SubprocessError) as e: + log.error("Error while looking for the VMware vmrun version: {}".format(e)) + raise VMwareError("Error while looking for the VMware vmrun version: {}".format(e)) + @asyncio.coroutine def remove_from_vmware_inventory(self, vmx_path): """ diff --git a/gns3server/modules/vmware/vmware_vm.py b/gns3server/modules/vmware/vmware_vm.py index 8460a08a..516c674c 100644 --- a/gns3server/modules/vmware/vmware_vm.py +++ b/gns3server/modules/vmware/vmware_vm.py @@ -142,6 +142,7 @@ class VMwareVM(BaseVM): Creates this VM and handle linked clones. """ + yield from self.manager.check_vmrun_version() if self._linked_clone and not os.path.exists(os.path.join(self.working_dir, os.path.basename(self._vmx_path))): # create the base snapshot for linked clones base_snapshot_name = "GNS3 Linked Base for clones"