diff --git a/oslo/vmware/pbm.py b/oslo/vmware/pbm.py
index 1ac052d..3b5446a 100644
--- a/oslo/vmware/pbm.py
+++ b/oslo/vmware/pbm.py
@@ -21,8 +21,12 @@ Refer http://goo.gl/GR2o6U for more details.
"""
import logging
+import os
import suds.sax.element as element
+import urllib
+import urlparse
+from oslo.vmware.openstack.common.gettextutils import _LW
from oslo.vmware import service
from oslo.vmware import vim_util
@@ -166,3 +170,26 @@ def filter_datastores_by_hubs(hubs, datastores):
if ds.value in hub_ids:
filtered_dss.append(ds)
return filtered_dss
+
+
+def get_pbm_wsdl_location(vc_version):
+ """Return PBM WSDL file location corresponding to VC version.
+
+ :param vc_version: a dot-separated version string. For example, "1.2".
+ :return: the pbm wsdl file location.
+ """
+ if not vc_version:
+ return
+ ver = vc_version.split('.')
+ major_minor = ver[0]
+ if len(ver) >= 2:
+ major_minor = '%s.%s' % (major_minor, ver[1])
+ curr_dir = os.path.abspath(os.path.dirname(__file__))
+ pbm_service_wsdl = os.path.join(curr_dir, 'wsdl', major_minor,
+ 'pbmService.wsdl')
+ if not os.path.exists(pbm_service_wsdl):
+ LOG.warn(_LW("PBM WSDL file %s not found."), pbm_service_wsdl)
+ return
+ pbm_wsdl = urlparse.urljoin('file:', urllib.pathname2url(pbm_service_wsdl))
+ LOG.debug("Using PBM WSDL location: %s.", pbm_wsdl)
+ return pbm_wsdl
diff --git a/oslo/vmware/vim_util.py b/oslo/vmware/vim_util.py
index 28e236f..e3f8c2e 100644
--- a/oslo/vmware/vim_util.py
+++ b/oslo/vmware/vim_util.py
@@ -414,3 +414,12 @@ def register_extension(vim, key, type, label='OpenStack',
os_ext.description = desc
os_ext.lastHeartbeatTime = timeutils.strtime()
vim.client.service.RegisterExtension(extension_manager, os_ext)
+
+
+def get_vc_version(session):
+ """Return the dot-separated vCenter version string. For example, "1.2".
+
+ :param session: vCenter soap session
+ :return: vCenter version
+ """
+ return session.vim.service_content.about.version
diff --git a/oslo/vmware/wsdl/5.5/core-types.xsd b/oslo/vmware/wsdl/5.5/core-types.xsd
new file mode 100644
index 0000000..51aedf4
--- /dev/null
+++ b/oslo/vmware/wsdl/5.5/core-types.xsd
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/oslo/vmware/wsdl/5.5/pbm-messagetypes.xsd b/oslo/vmware/wsdl/5.5/pbm-messagetypes.xsd
new file mode 100644
index 0000000..1f06b9f
--- /dev/null
+++ b/oslo/vmware/wsdl/5.5/pbm-messagetypes.xsd
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/oslo/vmware/wsdl/5.5/pbm-types.xsd b/oslo/vmware/wsdl/5.5/pbm-types.xsd
new file mode 100644
index 0000000..e919a2a
--- /dev/null
+++ b/oslo/vmware/wsdl/5.5/pbm-types.xsd
@@ -0,0 +1,729 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/oslo/vmware/wsdl/5.5/pbm.wsdl b/oslo/vmware/wsdl/5.5/pbm.wsdl
new file mode 100644
index 0000000..dee980f
--- /dev/null
+++ b/oslo/vmware/wsdl/5.5/pbm.wsdl
@@ -0,0 +1,889 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/oslo/vmware/wsdl/5.5/pbmService.wsdl b/oslo/vmware/wsdl/5.5/pbmService.wsdl
new file mode 100644
index 0000000..ff77383
--- /dev/null
+++ b/oslo/vmware/wsdl/5.5/pbmService.wsdl
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/test_pbm.py b/tests/test_pbm.py
index f84b971..85b3ef1 100644
--- a/tests/test_pbm.py
+++ b/tests/test_pbm.py
@@ -17,6 +17,10 @@
Unit tests for PBM utility methods.
"""
+import os
+import urllib
+import urlparse
+
import mock
from oslo.vmware import pbm
@@ -145,3 +149,27 @@ class PBMUtilityTest(base.TestCase):
self.assertEqual(len(hubs), len(filtered_ds))
filtered_ds_values = [ds.value for ds in filtered_ds]
self.assertEqual(set(hub_ids), set(filtered_ds_values))
+
+ def test_get_pbm_wsdl_location(self):
+ wsdl = pbm.get_pbm_wsdl_location(None)
+ self.assertIsNone(wsdl)
+
+ def expected_wsdl(version):
+ driver_dir = os.path.join(os.path.dirname(__file__), '..',
+ 'oslo', 'vmware')
+ driver_abs_dir = os.path.abspath(driver_dir)
+ path = os.path.join(driver_abs_dir, 'wsdl', version,
+ 'pbmService.wsdl')
+ return urlparse.urljoin('file:', urllib.pathname2url(path))
+
+ with mock.patch('os.path.exists') as path_exists:
+ path_exists.return_value = True
+ wsdl = pbm.get_pbm_wsdl_location('5')
+ self.assertEqual(expected_wsdl('5'), wsdl)
+ wsdl = pbm.get_pbm_wsdl_location('5.5')
+ self.assertEqual(expected_wsdl('5.5'), wsdl)
+ wsdl = pbm.get_pbm_wsdl_location('5.5.1')
+ self.assertEqual(expected_wsdl('5.5'), wsdl)
+ path_exists.return_value = False
+ wsdl = pbm.get_pbm_wsdl_location('5.5')
+ self.assertIsNone(wsdl)
diff --git a/tests/test_vim_util.py b/tests/test_vim_util.py
index a0ea964..941f29e 100644
--- a/tests/test_vim_util.py
+++ b/tests/test_vim_util.py
@@ -308,3 +308,14 @@ class VimUtilTest(base.TestCase):
service_content = vim.service_content
vim.client.service.RegisterExtension.assert_called_once_with(
service_content.extensionManager, mock.ANY)
+
+ def test_get_vc_version(self):
+ session = mock.Mock()
+ expected_version = '6.0.1'
+ session.vim.service_content.about.version = expected_version
+ version = vim_util.get_vc_version(session)
+ self.assertEqual(expected_version, version)
+ expected_version = '5.5'
+ session.vim.service_content.about.version = expected_version
+ version = vim_util.get_vc_version(session)
+ self.assertEqual(expected_version, version)
diff --git a/tox.ini b/tox.ini
index 6d12430..0f9de1c 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,4 +1,5 @@
[tox]
+skipsdist = True
envlist = py26,py27,py33,pep8
[testenv]
@@ -6,6 +7,7 @@ setenv = VIRTUAL_ENV={envdir}
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands = python setup.py testr --slowest --testr-args='{posargs}'
+usedevelop = True
[testenv:pep8]
commands = flake8