Change namespace to nova.virt.powervm_ext

In order to avoid conflict with the in-tree nova.virt.powervm driver,
the namespace of out-of-tree ('ext'ernal) driver is being change to
nova.virt.powervm_ext.

Change-Id: I9c8ad22be448a724b4a62d560a0cf3021da1b9eb
This commit is contained in:
Eric Fried 2016-12-21 11:42:23 -06:00
parent d8582acb97
commit eedae5b0d4
8 changed files with 57 additions and 23 deletions

View File

@ -85,9 +85,14 @@ The driver enables the following:
* Thorough unit, syntax, and style testing is provided and enforced for the * Thorough unit, syntax, and style testing is provided and enforced for the
driver. driver.
The intention is that this driver follows the OpenStack Nova model and will The intention is that this driver follows the OpenStack Nova model.
be a candidate for promotion (via a subsequent blueprint) into the nova core
project. The driver is being promoted into the nova core project in stages, the first of
which is represented by blueprint `powervm-nova-compute-driver`_. The
coexistence of these two incarnations of the driver raises some `Dual Driver
Considerations`_.
.. _`powervm-nova-compute-driver`: https://blueprints.launchpad.net/nova/+spec/powervm-nova-compute-driver
Data Model Impact Data Model Impact
@ -159,7 +164,7 @@ Developer Impact
---------------- ----------------
The code for this driver is currently contained within a powervm project. The code for this driver is currently contained within a powervm project.
The driver is within the /nova_powervm/virt/powervm/ package and extends the The driver is within the /nova/virt/powervm_ext/ package and extends the
nova.virt.driver.ComputeDriver class. nova.virt.driver.ComputeDriver class.
The code interacts with PowerVM through the pypowervm library. This python The code interacts with PowerVM through the pypowervm library. This python
@ -229,6 +234,35 @@ Dependencies
.. _pypowervm library: https://github.com/powervm/pypowervm .. _pypowervm library: https://github.com/powervm/pypowervm
Upgrade Considerations
======================
Prior to Ocata, only the out-of-tree nova_powervm driver existed. The in-tree
driver is introduced in Ocata.
Namespaces
----------
In Liberty and Mitaka, the namespace of the out-of-tree driver is
``nova_powervm.virt.powervm``. In Newton, it was moved to
``nova.virt.powervm``. In Ocata, the new in-tree driver occupies the
``nova.virt.powervm`` namespace, and the out-of-tree driver is moved to
``nova.virt.powervm_ext``. Ocata consumers have the option of using the
in-tree driver, which will provide limited functionality until it is fully
integrated; or the out-of-tree driver, which provides full functionality.
Refer to the documentation for the ``nova.conf`` settings required to load
the desired driver.
Live Migrate Data Object
------------------------
In order to use live migration prior to Ocata, it was necessary to run the
customized nova_powervm conductor to bring in the ``PowerVMLiveMigrateData``
object. In Ocata, this object is included in core nova, so no custom conductor
is necessary.
Testing Testing
======= =======
@ -242,12 +276,12 @@ Tempest tests that require function that the platform does not yet support
(e.g. iSCSI or Floating IPs) will not pass. These should be ommitted from (e.g. iSCSI or Floating IPs) will not pass. These should be ommitted from
the Tempest test suite. the Tempest test suite.
A `sample Tempest test configuration` for the PowerVM driver has been provided. A `sample Tempest test configuration`_ for the PowerVM driver has been provided.
Thorough unit tests exist within the project to validate specific functions Thorough unit tests exist within the project to validate specific functions
within this implementation. within this implementation.
.. _sample Tempest test configuration: https://github.com/powervm/powervm-ci/tree/master/tempest .. _`sample Tempest test configuration`: https://github.com/powervm/powervm-ci/tree/master/tempest
Functional Tests Functional Tests

View File

@ -10,7 +10,7 @@ INSTALL_PYPOWERVM=$(trueorfalse False INSTALL_PYPOWERVM)
PVM_ADMIN_GROUP=${PVM_ADMIN_GROUP:-pvm_admin} PVM_ADMIN_GROUP=${PVM_ADMIN_GROUP:-pvm_admin}
# Nova settings # Nova settings
PVM_DRIVER=powervm.driver.PowerVMDriver PVM_DRIVER=powervm_ext.driver.PowerVMDriver
INSTANCE_NAME_TEMPLATE=${INSTANCE_NAME_TEMPLATE:-"%(display_name).13s-%(uuid).8s-pvm"} INSTANCE_NAME_TEMPLATE=${INSTANCE_NAME_TEMPLATE:-"%(display_name).13s-%(uuid).8s-pvm"}
COMPUTE_MONITORS=${COMPUTE_MONITORS:-nova.compute.monitors.all_monitors} COMPUTE_MONITORS=${COMPUTE_MONITORS:-nova.compute.monitors.all_monitors}
FORCE_CONFIG_DRIVE=${FORCE_CONFIG_DRIVE:-True} FORCE_CONFIG_DRIVE=${FORCE_CONFIG_DRIVE:-True}

View File

@ -45,7 +45,7 @@ Configuration File Options
-------------------------- --------------------------
After nova-powervm has been installed the user must enable PowerVM as the After nova-powervm has been installed the user must enable PowerVM as the
compute driver. To do so, set the ``compute_driver`` value in the ``nova.conf`` compute driver. To do so, set the ``compute_driver`` value in the ``nova.conf``
file to ``compute_driver = powervm.driver.PowerVMDriver``. file to ``compute_driver = powervm_ext.driver.PowerVMDriver``.
The standard nova configuration options are supported. In particular, to use The standard nova configuration options are supported. In particular, to use
PowerVM SR-IOV vNIC for networking, the ``pci_passthrough_whitelist`` option PowerVM SR-IOV vNIC for networking, the ``pci_passthrough_whitelist`` option

View File

@ -20,7 +20,7 @@ from __future__ import absolute_import
import fixtures import fixtures
import mock import mock
from nova.virt.powervm import driver from nova.virt.powervm_ext import driver
from nova.virt import fake from nova.virt import fake
from pypowervm.tests import test_fixtures as pvm_fx from pypowervm.tests import test_fixtures as pvm_fx

View File

@ -44,7 +44,7 @@ from pypowervm.wrappers import base_partition as pvm_bp
from pypowervm.wrappers import logical_partition as pvm_lpar from pypowervm.wrappers import logical_partition as pvm_lpar
from pypowervm.wrappers import virtual_io_server as pvm_vios from pypowervm.wrappers import virtual_io_server as pvm_vios
from nova.virt.powervm import driver from nova.virt.powervm_ext import driver
from nova_powervm.tests.virt import powervm from nova_powervm.tests.virt import powervm
from nova_powervm.tests.virt.powervm import fixtures as fx from nova_powervm.tests.virt.powervm import fixtures as fx
@ -300,7 +300,7 @@ class TestPowerVMDriver(test.TestCase):
'.execute') '.execute')
@mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg' @mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg'
'.execute') '.execute')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_is_booted_from_volume') '_is_booted_from_volume')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute')
@ -378,7 +378,7 @@ class TestPowerVMDriver(test.TestCase):
@mock.patch('nova.virt.block_device.DriverVolumeBlockDevice.save') @mock.patch('nova.virt.block_device.DriverVolumeBlockDevice.save')
@mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg' @mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg'
'.execute') '.execute')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_is_booted_from_volume') '_is_booted_from_volume')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute')
@ -433,7 +433,7 @@ class TestPowerVMDriver(test.TestCase):
@mock.patch('nova.virt.block_device.DriverVolumeBlockDevice.save') @mock.patch('nova.virt.block_device.DriverVolumeBlockDevice.save')
@mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg' @mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg'
'.execute') '.execute')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_is_booted_from_volume') '_is_booted_from_volume')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute')
@ -494,7 +494,7 @@ class TestPowerVMDriver(test.TestCase):
@mock.patch('nova.virt.block_device.DriverVolumeBlockDevice.save') @mock.patch('nova.virt.block_device.DriverVolumeBlockDevice.save')
@mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg' @mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg'
'.execute') '.execute')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_is_booted_from_volume') '_is_booted_from_volume')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute')
@ -548,7 +548,7 @@ class TestPowerVMDriver(test.TestCase):
@mock.patch('nova_powervm.virt.powervm.tasks.storage.ConnectVolume') @mock.patch('nova_powervm.virt.powervm.tasks.storage.ConnectVolume')
@mock.patch('nova_powervm.virt.powervm.tasks.storage.ConnectDisk') @mock.patch('nova_powervm.virt.powervm.tasks.storage.ConnectDisk')
@mock.patch('nova_powervm.virt.powervm.tasks.storage.FindDisk') @mock.patch('nova_powervm.virt.powervm.tasks.storage.FindDisk')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_is_booted_from_volume') '_is_booted_from_volume')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs')
@ -660,7 +660,7 @@ class TestPowerVMDriver(test.TestCase):
@mock.patch('nova.virt.block_device.DriverVolumeBlockDevice.save') @mock.patch('nova.virt.block_device.DriverVolumeBlockDevice.save')
@mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg.' @mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg.'
'execute') 'execute')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_is_booted_from_volume') '_is_booted_from_volume')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute')
@ -668,7 +668,7 @@ class TestPowerVMDriver(test.TestCase):
@mock.patch('nova.objects.flavor.Flavor.get_by_id') @mock.patch('nova.objects.flavor.Flavor.get_by_id')
@mock.patch('nova_powervm.virt.powervm.tasks.vm.UpdateIBMiSettings.' @mock.patch('nova_powervm.virt.powervm.tasks.vm.UpdateIBMiSettings.'
'execute') 'execute')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_get_boot_connectivity_type') '_get_boot_connectivity_type')
@mock.patch('pypowervm.tasks.power.power_on') @mock.patch('pypowervm.tasks.power.power_on')
def test_spawn_ibmi(self, mock_pwron, mock_boot_conn_type, def test_spawn_ibmi(self, mock_pwron, mock_boot_conn_type,
@ -718,7 +718,7 @@ class TestPowerVMDriver(test.TestCase):
'.execute') '.execute')
@mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg' @mock.patch('nova_powervm.virt.powervm.tasks.storage.CreateDiskForImg'
'.execute') '.execute')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_is_booted_from_volume') '_is_booted_from_volume')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugMgmtVif.execute')
@mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.PlugVifs.execute')
@ -726,7 +726,7 @@ class TestPowerVMDriver(test.TestCase):
@mock.patch('nova.objects.flavor.Flavor.get_by_id') @mock.patch('nova.objects.flavor.Flavor.get_by_id')
@mock.patch('nova_powervm.virt.powervm.tasks.vm.UpdateIBMiSettings' @mock.patch('nova_powervm.virt.powervm.tasks.vm.UpdateIBMiSettings'
'.execute') '.execute')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_get_boot_connectivity_type') '_get_boot_connectivity_type')
@mock.patch('pypowervm.tasks.power.power_on') @mock.patch('pypowervm.tasks.power.power_on')
def test_spawn_ibmi_without_bdms(self, mock_pwron, mock_boot_conn_type, def test_spawn_ibmi_without_bdms(self, mock_pwron, mock_boot_conn_type,
@ -945,7 +945,7 @@ class TestPowerVMDriver(test.TestCase):
@mock.patch('pypowervm.wrappers.entry_wrapper.EntryWrapper.update', @mock.patch('pypowervm.wrappers.entry_wrapper.EntryWrapper.update',
new=mock.Mock()) new=mock.Mock())
@mock.patch('nova_powervm.virt.powervm.tasks.network.UnplugVifs.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.UnplugVifs.execute')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_is_booted_from_volume') '_is_booted_from_volume')
@mock.patch('nova_powervm.virt.powervm.vm.dlt_lpar') @mock.patch('nova_powervm.virt.powervm.vm.dlt_lpar')
@mock.patch('nova_powervm.virt.powervm.vm.power_off') @mock.patch('nova_powervm.virt.powervm.vm.power_off')
@ -1108,7 +1108,7 @@ class TestPowerVMDriver(test.TestCase):
assert_not_called() assert_not_called()
@mock.patch('nova_powervm.virt.powervm.tasks.network.UnplugVifs.execute') @mock.patch('nova_powervm.virt.powervm.tasks.network.UnplugVifs.execute')
@mock.patch('nova.virt.powervm.driver.PowerVMDriver.' @mock.patch('nova.virt.powervm_ext.driver.PowerVMDriver.'
'_is_booted_from_volume') '_is_booted_from_volume')
@mock.patch('nova_powervm.virt.powervm.vm.dlt_lpar') @mock.patch('nova_powervm.virt.powervm.vm.dlt_lpar')
@mock.patch('nova_powervm.virt.powervm.vm.power_off') @mock.patch('nova_powervm.virt.powervm.vm.power_off')
@ -1683,7 +1683,7 @@ class TestPowerVMDriver(test.TestCase):
def test_get_host_ip_addr(self): def test_get_host_ip_addr(self):
self.assertEqual(self.drv.get_host_ip_addr(), '127.0.0.1') self.assertEqual(self.drv.get_host_ip_addr(), '127.0.0.1')
@mock.patch('nova.virt.powervm.driver.LOG.warning') @mock.patch('nova.virt.powervm_ext.driver.LOG.warning')
@mock.patch('nova.compute.utils.get_machine_ips') @mock.patch('nova.compute.utils.get_machine_ips')
def test_get_host_ip_addr_failure(self, mock_ips, mock_log): def test_get_host_ip_addr_failure(self, mock_ips, mock_log):
mock_ips.return_value = ['1.1.1.1'] mock_ips.return_value = ['1.1.1.1']

View File

@ -20,7 +20,7 @@ classifier =
[files] [files]
packages = packages =
nova_powervm nova_powervm
nova/virt/powervm nova/virt/powervm_ext
[build_sphinx] [build_sphinx]
source-dir = doc/source source-dir = doc/source