Merge lp:~mpontillo/maas/bug-1460189-python-vmomi-import into lp:~maas-committers/maas/trunk

Proposed by Mike Pontillo
Status: Merged
Approved by: Mike Pontillo
Approved revision: no longer in the source branch.
Merged at revision: 3976
Proposed branch: lp:~mpontillo/maas/bug-1460189-python-vmomi-import
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 87 lines (+24/-17)
2 files modified
src/provisioningserver/drivers/hardware/tests/test_vmware.py (+1/-9)
src/provisioningserver/drivers/hardware/vmware.py (+23/-8)
To merge this branch: bzr merge lp:~mpontillo/maas/bug-1460189-python-vmomi-import
Reviewer Review Type Date Requested Status
Gavin Panella (community) Approve
Review via email: mp+260767@code.launchpad.net

Commit message

Import python-pyvmomi using import_module() just before use, so that there is no need to restart maas-clusterd after installing python-pyvmomi.

To post a comment you must log in.
Revision history for this message
Gavin Panella (allenap) wrote :

Good stuff, but as ever I've blathered on a bit.

review: Approve
Revision history for this message
Mike Pontillo (mpontillo) wrote :

Some replies below. Thanks for the review!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/provisioningserver/drivers/hardware/tests/test_vmware.py'
2--- src/provisioningserver/drivers/hardware/tests/test_vmware.py 2015-05-20 19:23:53 +0000
3+++ src/provisioningserver/drivers/hardware/tests/test_vmware.py 2015-06-01 23:10:51 +0000
4@@ -40,14 +40,6 @@
5 from twisted.internet.threads import deferToThread
6
7
8-try:
9- import pyVmomi
10- import pyVim.connect as vmomi_api
11-except ImportError:
12- pyVmomi = None
13- vmomi_api = None
14-
15-
16 class FakeVmomiVMSummaryConfig(object):
17 def __init__(self, name, has_instance_uuid=None, has_uuid=None):
18 self.name = name
19@@ -230,7 +222,7 @@
20
21 def setUp(self):
22 super(TestVMwarePyvmomi, self).setUp()
23- if vmomi_api is None:
24+ if vmware.try_pyvmomi_import() is False:
25 self.skipTest('cannot test VMware without python-pyvmomi')
26
27 def test_api_connection(self):
28
29=== modified file 'src/provisioningserver/drivers/hardware/vmware.py'
30--- src/provisioningserver/drivers/hardware/vmware.py 2015-05-20 07:02:32 +0000
31+++ src/provisioningserver/drivers/hardware/vmware.py 2015-06-01 23:10:51 +0000
32@@ -18,6 +18,7 @@
33
34 from abc import abstractmethod
35 from collections import OrderedDict
36+from importlib import import_module
37 import traceback
38 from urllib import unquote
39
40@@ -29,17 +30,31 @@
41 from provisioningserver.utils.twisted import synchronous
42
43
44-try:
45- import pyVmomi
46- from pyVmomi import vim
47- import pyVim.connect as vmomi_api
48-except ImportError:
49- pyVmomi = None
50- vmomi_api = None
51+vmomi_api = None
52+vim = None
53
54 maaslog = get_maas_logger("drivers.vmware")
55
56
57+def try_pyvmomi_import():
58+ """Attempt to import the pyVmomi API. This API is provided by the
59+ python-pyvmomi package; if it doesn't work out, we need to notify
60+ the user so they can install it.
61+ """
62+ global vim
63+ global vmomi_api
64+ try:
65+ if vim is None:
66+ vim_module = import_module('pyVmomi')
67+ vim = getattr(vim_module, 'vim')
68+ if vmomi_api is None:
69+ vmomi_api = import_module('pyVim.connect')
70+ except ImportError:
71+ return False
72+ else:
73+ return True
74+
75+
76 class VMwareAPIException(Exception):
77 """Failure talking to the VMware API."""
78
79@@ -321,7 +336,7 @@
80
81 def _get_vmware_api(
82 host, username, password, port=None, protocol=None):
83- if pyVmomi is not None:
84+ if try_pyvmomi_import():
85 # Attempt to detect the best available VMware API
86 return VMwarePyvmomiAPI(
87 host, username, password, port=port, protocol=protocol)