diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-08-24 15:58:36 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-08-24 15:58:36 +0000 |
| commit | 96ded530c2fe814f779af5db575fa2f196bf38f3 (patch) | |
| tree | f2c4fe4f1f19d6fe01a5d937ac155979e773c689 | |
| parent | af687ffb04021e2aa6daf9a876d18c32d6ad3d3f (diff) | |
| parent | ff17c6fd898403da58c30672fe0276be75f410e3 (diff) | |
| download | nova-96ded530c2fe814f779af5db575fa2f196bf38f3.tar.gz nova-96ded530c2fe814f779af5db575fa2f196bf38f3.tar.xz nova-96ded530c2fe814f779af5db575fa2f196bf38f3.zip | |
Merge "XCP-XAPI version fix"
| -rw-r--r-- | nova/tests/test_xenapi.py | 63 | ||||
| -rw-r--r-- | nova/virt/xenapi/driver.py | 19 | ||||
| -rw-r--r-- | nova/virt/xenapi/vmops.py | 29 |
3 files changed, 97 insertions, 14 deletions
diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py index 5ab059d07..7dab9bbc1 100644 --- a/nova/tests/test_xenapi.py +++ b/nova/tests/test_xenapi.py @@ -2534,3 +2534,66 @@ class XenAPIInjectMetadataTestCase(stubs.XenAPITestBase): 'vm-data/user-metadata/c': '3', }, }) + + +class VMOpsTestCase(test.TestCase): + def _get_mock_session(self, product_brand, product_version): + class Mock(object): + pass + + mock_session = Mock() + mock_session.product_brand = product_brand + mock_session.product_version = product_version + + return mock_session + + def test_check_resize_func_name_defaults_to_VDI_resize(self): + session = self._get_mock_session(None, None) + ops = vmops.VMOps(session) + + self.assertEquals( + 'VDI.resize', + ops.check_resize_func_name()) + + +class XenAPISessionTestCase(test.TestCase): + def _get_mock_xapisession(self, software_version): + class XcpXapiSession(xenapi_conn.XenAPISession): + def __init__(_ignore): + "Skip the superclass's dirty init" + + def _get_software_version(_ignore): + return software_version + + return XcpXapiSession() + + def test_get_product_version_product_brand_does_not_fail(self): + session = self._get_mock_xapisession({ + 'build_number': '0', + 'date': '2012-08-03', + 'hostname': 'komainu', + 'linux': '3.2.0-27-generic', + 'network_backend': 'bridge', + 'platform_name': 'XCP_Kronos', + 'platform_version': '1.6.0', + 'xapi': '1.3', + 'xen': '4.1.2', + 'xencenter_max': '1.10', + 'xencenter_min': '1.10' + }) + + self.assertEquals( + (None, None), + session._get_product_version_and_brand() + ) + + def test_get_product_version_product_brand_xs_6(self): + session = self._get_mock_xapisession({ + 'product_brand': 'XenServer', + 'product_version': '6.0.50' + }) + + self.assertEquals( + ((6, 0, 50), 'XenServer'), + session._get_product_version_and_brand() + ) diff --git a/nova/virt/xenapi/driver.py b/nova/virt/xenapi/driver.py index 6eb39e2b7..644f598ca 100644 --- a/nova/virt/xenapi/driver.py +++ b/nova/virt/xenapi/driver.py @@ -652,14 +652,23 @@ class XenAPISession(object): def _get_product_version_and_brand(self): """Return a tuple of (major, minor, rev) for the host version and a string of the product brand""" - host = self.get_xenapi_host() - software_version = self.call_xenapi('host.get_software_version', - host) + software_version = self._get_software_version() + + product_version_str = software_version.get('product_version') + product_brand = software_version.get('product_brand') + + if None in (product_version_str, product_brand): + return (None, None) + product_version = tuple(int(part) for part in - software_version['product_version'].split('.')) - product_brand = software_version['product_brand'] + product_version_str.split('.')) + return product_version, product_brand + def _get_software_version(self): + host = self.get_xenapi_host() + return self.call_xenapi('host.get_software_version', host) + def get_session_id(self): """Return a string session_id. Used for vnc consoles.""" with self._get_session() as session: diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index d233244b2..090a16d46 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -789,17 +789,28 @@ class VMOps(object): def check_resize_func_name(self): """Check the function name used to resize an instance based on product_brand and product_version.""" - if (self._session.product_brand == 'XCP' and - ((self._session.product_version[0] == 1 and - self._session.product_version[1] > 1) or - self._session.product_version[0] > 1)): - return 'VDI.resize' - if (self._session.product_brand == 'XenServer' and - self._session.product_version[0] > 5): - return 'VDI.resize' + brand = self._session.product_brand + version = self._session.product_version - return 'VDI.resize_online' + # To maintain backwards compatibility. All recent versions + # should use VDI.resize + if bool(version) and bool(brand): + xcp = brand == 'XCP' + r1_2_or_above = ( + ( + version[0] == 1 + and version[1] > 1 + ) + or version[0] > 1) + + xenserver = brand == 'XenServer' + r6_or_above = version[0] > 5 + + if (xcp and not r1_2_or_above) or (xenserver and not r6_or_above): + return 'VDI.resize_online' + + return 'VDI.resize' def reboot(self, instance, reboot_type): """Reboot VM instance.""" |
