diff options
| author | Vu Tran <vu.tran@windriver.com> | 2014-03-18 21:01:01 -0400 |
|---|---|---|
| committer | Bruce Ashfield <bruce.ashfield@windriver.com> | 2014-03-24 16:41:59 -0400 |
| commit | 3b5ec214c506a47cbd8abf7bd6557246980ddea5 (patch) | |
| tree | 3d596654a8c53494d898a0fdfd140adefea0e741 /meta-openstack/recipes-devtools | |
| parent | d156d7e1155fc325cb398f98ed41b540031c9df3 (diff) | |
| download | meta-cloud-services-3b5ec214c506a47cbd8abf7bd6557246980ddea5.tar.gz | |
nova-compute: enable to use ceph
Enable nova-compute to:
* use cinder volume stored in a ceph pool as a block device
* store glance image into a ceph pool.
Also port 2 patches from https://github.com/openstack/nova
branch master into Havana branch.
Signed-off-by: Vu Tran <vu.tran@windriver.com>
Diffstat (limited to 'meta-openstack/recipes-devtools')
4 files changed, 191 insertions, 0 deletions
diff --git a/meta-openstack/recipes-devtools/python/python-nova/Fix-rbd-backend-not-working-for-none-admin-ceph-user.patch b/meta-openstack/recipes-devtools/python/python-nova/Fix-rbd-backend-not-working-for-none-admin-ceph-user.patch new file mode 100644 index 0000000..c5fbbbb --- /dev/null +++ b/meta-openstack/recipes-devtools/python/python-nova/Fix-rbd-backend-not-working-for-none-admin-ceph-user.patch | |||
| @@ -0,0 +1,130 @@ | |||
| 1 | Fix rbd backend not working for none admin ceph user | ||
| 2 | |||
| 3 | commit 7104a6d8b1885f04d3012d621ec14f4be5145994 from | ||
| 4 | https://github.com/openstack/nova | ||
| 5 | |||
| 6 | The 'rbd_user' option allows nova administrators to override the default user | ||
| 7 | account used for RBD operations, with one that has potentially lower | ||
| 8 | privileges. Not all parts of the Nova code honoured the 'rbd_user' option, | ||
| 9 | which resulted in failures when attempting to use a lesser privileged user for | ||
| 10 | RBD. This fix ensures the '--id' and '--config' parameters are passed to the | ||
| 11 | RBD command line tools in all cases. | ||
| 12 | |||
| 13 | Change-Id: Id99aa303791143360ad78074184583048e4878f0 | ||
| 14 | Close-bug: 1255536 | ||
| 15 | |||
| 16 | Signed-off-by: Haomai Wang <haomai@unitedstack.com> | ||
| 17 | [VT: Ported to Havana branch] | ||
| 18 | Signed-off-by: Vu Tran <vu.tran@windriver.com> | ||
| 19 | |||
| 20 | diff --git a/nova/tests/virt/libvirt/test_libvirt_utils.py b/nova/tests/virt/libvirt/test_libvirt_utils.py | ||
| 21 | index ea83d3a..74f4a9e 100644 | ||
| 22 | --- a/nova/tests/virt/libvirt/test_libvirt_utils.py | ||
| 23 | +++ b/nova/tests/virt/libvirt/test_libvirt_utils.py | ||
| 24 | @@ -40,3 +40,44 @@ blah BLAH: bb | ||
| 25 | self.mox.ReplayAll() | ||
| 26 | disk_type = libvirt_utils.get_disk_type(path) | ||
| 27 | self.assertEqual(disk_type, 'raw') | ||
| 28 | + | ||
| 29 | + def test_list_rbd_volumes(self): | ||
| 30 | + conf = '/etc/ceph/fake_ceph.conf' | ||
| 31 | + pool = 'fake_pool' | ||
| 32 | + user = 'user' | ||
| 33 | + self.flags(images_rbd_ceph_conf=conf, group='libvirt') | ||
| 34 | + self.flags(rbd_user=user, group='libvirt') | ||
| 35 | + fn = self.mox.CreateMockAnything() | ||
| 36 | + self.mox.StubOutWithMock(libvirt_utils.utils, | ||
| 37 | + 'execute') | ||
| 38 | + libvirt_utils.utils.execute('rbd', '-p', pool, 'ls', '--id', | ||
| 39 | + user, | ||
| 40 | + '--conf', conf).AndReturn(("Out", "Error")) | ||
| 41 | + self.mox.ReplayAll() | ||
| 42 | + | ||
| 43 | + libvirt_utils.list_rbd_volumes(pool) | ||
| 44 | + | ||
| 45 | + self.mox.VerifyAll() | ||
| 46 | + | ||
| 47 | + def test_remove_rbd_volumes(self): | ||
| 48 | + conf = '/etc/ceph/fake_ceph.conf' | ||
| 49 | + pool = 'fake_pool' | ||
| 50 | + user = 'user' | ||
| 51 | + names = ['volume1', 'volume2', 'volume3'] | ||
| 52 | + self.flags(images_rbd_ceph_conf=conf, group='libvirt') | ||
| 53 | + self.flags(rbd_user=user, group='libvirt') | ||
| 54 | + fn = self.mox.CreateMockAnything() | ||
| 55 | + libvirt_utils.utils.execute('rbd', '-p', pool, 'rm', 'volume1', | ||
| 56 | + '--id', user, '--conf', conf, attempts=3, | ||
| 57 | + run_as_root=True) | ||
| 58 | + libvirt_utils.utils.execute('rbd', '-p', pool, 'rm', 'volume2', | ||
| 59 | + '--id', user, '--conf', conf, attempts=3, | ||
| 60 | + run_as_root=True) | ||
| 61 | + libvirt_utils.utils.execute('rbd', '-p', pool, 'rm', 'volume3', | ||
| 62 | + '--id', user, '--conf', conf, attempts=3, | ||
| 63 | + run_as_root=True) | ||
| 64 | + self.mox.ReplayAll() | ||
| 65 | + | ||
| 66 | + libvirt_utils.remove_rbd_volumes(pool, *names) | ||
| 67 | + | ||
| 68 | + self.mox.VerifyAll() | ||
| 69 | diff --git a/nova/virt/libvirt/imagebackend.py b/nova/virt/libvirt/imagebackend.py | ||
| 70 | index 51872cf..89fe494 100644 | ||
| 71 | --- a/nova/virt/libvirt/imagebackend.py | ||
| 72 | +++ b/nova/virt/libvirt/imagebackend.py | ||
| 73 | @@ -460,8 +460,10 @@ class Rbd(Image): | ||
| 74 | |||
| 75 | def _ceph_args(self): | ||
| 76 | args = [] | ||
| 77 | - args.extend(['--id', CONF.rbd_user]) | ||
| 78 | - args.extend(['--conf', self.ceph_conf]) | ||
| 79 | + if CONF.rbd_user: | ||
| 80 | + args.extend(['--id', CONF.rbd_user]) | ||
| 81 | + if self.ceph_conf: | ||
| 82 | + args.extend(['--conf', self.ceph_conf]) | ||
| 83 | return args | ||
| 84 | |||
| 85 | def _get_mon_addrs(self): | ||
| 86 | diff --git a/nova/virt/libvirt/utils.py b/nova/virt/libvirt/utils.py | ||
| 87 | index d7c92b7..db533e1 100644 | ||
| 88 | --- a/nova/virt/libvirt/utils.py | ||
| 89 | +++ b/nova/virt/libvirt/utils.py | ||
| 90 | @@ -262,12 +262,27 @@ def import_rbd_image(*args): | ||
| 91 | execute('rbd', 'import', *args) | ||
| 92 | |||
| 93 | |||
| 94 | +def _run_rbd(*args, **kwargs): | ||
| 95 | + total = list(args) | ||
| 96 | + | ||
| 97 | + if CONF.rbd_user: | ||
| 98 | + total.extend(['--id', str(CONF.rbd_user)]) | ||
| 99 | + if CONF.libvirt_images_rbd_ceph_conf: | ||
| 100 | + total.extend(['--conf', str(CONF.libvirt_images_rbd_ceph_conf)]) | ||
| 101 | + | ||
| 102 | + return utils.execute(*total, **kwargs) | ||
| 103 | + | ||
| 104 | + | ||
| 105 | def list_rbd_volumes(pool): | ||
| 106 | """List volumes names for given ceph pool. | ||
| 107 | |||
| 108 | :param pool: ceph pool name | ||
| 109 | """ | ||
| 110 | - out, err = utils.execute('rbd', '-p', pool, 'ls') | ||
| 111 | + try: | ||
| 112 | + out, err = _run_rbd('rbd', '-p', pool, 'ls') | ||
| 113 | + except processutils.ProcessExecutionError: | ||
| 114 | + # No problem when no volume in rbd pool | ||
| 115 | + return [] | ||
| 116 | |||
| 117 | return [line.strip() for line in out.splitlines()] | ||
| 118 | |||
| 119 | @@ -275,9 +290,9 @@ def list_rbd_volumes(pool): | ||
| 120 | def remove_rbd_volumes(pool, *names): | ||
| 121 | """Remove one or more rbd volume.""" | ||
| 122 | for name in names: | ||
| 123 | - rbd_remove = ('rbd', '-p', pool, 'rm', name) | ||
| 124 | + rbd_remove = ['rbd', '-p', pool, 'rm', name] | ||
| 125 | try: | ||
| 126 | - execute(*rbd_remove, attempts=3, run_as_root=True) | ||
| 127 | + _run_rbd(*rbd_remove, attempts=3, run_as_root=True) | ||
| 128 | except processutils.ProcessExecutionError: | ||
| 129 | LOG.warn(_("rbd remove %(name)s in pool %(pool)s failed"), | ||
| 130 | {'name': name, 'pool': pool}) | ||
diff --git a/meta-openstack/recipes-devtools/python/python-nova/Make-rbd.libvirt_info-parent-class-compatible.patch b/meta-openstack/recipes-devtools/python/python-nova/Make-rbd.libvirt_info-parent-class-compatible.patch new file mode 100644 index 0000000..542abf5 --- /dev/null +++ b/meta-openstack/recipes-devtools/python/python-nova/Make-rbd.libvirt_info-parent-class-compatible.patch | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | Make rbd.libvirt_info parent class compatible | ||
| 2 | |||
| 3 | commit 7a34be0ec0cd0cb9555fe64ff6c486faae1ae91d from | ||
| 4 | https://github.com/openstack/nova | ||
| 5 | |||
| 6 | Rbd.libvirt_info function definition misses hypervisor_version argument added in change: | ||
| 7 | https://review.openstack.org/32379 | ||
| 8 | |||
| 9 | Closes-Bug: #1233188 | ||
| 10 | Change-Id: Ib68d743e783af0f6d82d2ba180869ee642e86050 | ||
| 11 | |||
| 12 | diff --git a/nova/tests/virt/libvirt/test_imagebackend.py b/nova/tests/virt/libvirt/test_imagebackend.py | ||
| 13 | index 2455ec8..5bfa94d 100644 | ||
| 14 | --- a/nova/tests/virt/libvirt/test_imagebackend.py | ||
| 15 | +++ b/nova/tests/virt/libvirt/test_imagebackend.py | ||
| 16 | @@ -20,6 +20,8 @@ import os | ||
| 17 | import fixtures | ||
| 18 | from oslo.config import cfg | ||
| 19 | |||
| 20 | +from inspect import getargspec | ||
| 21 | + | ||
| 22 | from nova import exception | ||
| 23 | from nova.openstack.common import uuidutils | ||
| 24 | from nova import test | ||
| 25 | @@ -630,6 +632,10 @@ class RbdTestCase(_ImageTestCase, test.NoDBTestCase): | ||
| 26 | |||
| 27 | self.assertEqual(fake_processutils.fake_execute_get_log(), []) | ||
| 28 | |||
| 29 | + def test_parent_compatible(self): | ||
| 30 | + self.assertEqual(getargspec(imagebackend.Image.libvirt_info), | ||
| 31 | + getargspec(self.image_class.libvirt_info)) | ||
| 32 | + | ||
| 33 | |||
| 34 | class BackendTestCase(test.NoDBTestCase): | ||
| 35 | INSTANCE = {'name': 'fake-instance', | ||
| 36 | diff --git a/nova/virt/libvirt/imagebackend.py b/nova/virt/libvirt/imagebackend.py | ||
| 37 | index e900789..51872cf 100644 | ||
| 38 | --- a/nova/virt/libvirt/imagebackend.py | ||
| 39 | +++ b/nova/virt/libvirt/imagebackend.py | ||
| 40 | @@ -482,7 +482,7 @@ class Rbd(Image): | ||
| 41 | return hosts, ports | ||
| 42 | |||
| 43 | def libvirt_info(self, disk_bus, disk_dev, device_type, cache_mode, | ||
| 44 | - extra_specs): | ||
| 45 | + extra_specs, hypervisor_version): | ||
| 46 | """Get `LibvirtConfigGuestDisk` filled for this image. | ||
| 47 | |||
| 48 | :disk_dev: Disk bus device name | ||
diff --git a/meta-openstack/recipes-devtools/python/python-nova/nova.conf b/meta-openstack/recipes-devtools/python/python-nova/nova.conf index 84ef48b..8aaf41a 100644 --- a/meta-openstack/recipes-devtools/python/python-nova/nova.conf +++ b/meta-openstack/recipes-devtools/python/python-nova/nova.conf | |||
| @@ -21,6 +21,7 @@ my_ip = %CONTROLLER_IP% | |||
| 21 | glance_host = %CONTROLLER_IP% | 21 | glance_host = %CONTROLLER_IP% |
| 22 | lock_path=/var/lock/nova/ | 22 | lock_path=/var/lock/nova/ |
| 23 | state_path=/var/run/nova/ | 23 | state_path=/var/run/nova/ |
| 24 | libvirt_images_type = %LIBVIRT_IMAGES_TYPE% | ||
| 24 | 25 | ||
| 25 | #VNC | 26 | #VNC |
| 26 | vnc_enabled = true | 27 | vnc_enabled = true |
| @@ -61,3 +62,9 @@ instance_usage_audit_period=hour | |||
| 61 | notify_on_state_change=vm_and_task_state | 62 | notify_on_state_change=vm_and_task_state |
| 62 | notification_driver=nova.openstack.common.notifier.rpc_notifier | 63 | notification_driver=nova.openstack.common.notifier.rpc_notifier |
| 63 | notification_driver=ceilometer.compute.nova_notifier | 64 | notification_driver=ceilometer.compute.nova_notifier |
| 65 | |||
| 66 | # nova-compute configuration for ceph | ||
| 67 | libvirt_images_rbd_pool=cinder-volumes | ||
| 68 | libvirt_images_rbd_ceph_conf=/etc/ceph/ceph.conf | ||
| 69 | rbd_user=cinder-volume | ||
| 70 | #rbd_secret_uuid= | ||
diff --git a/meta-openstack/recipes-devtools/python/python-nova_git.bb b/meta-openstack/recipes-devtools/python/python-nova_git.bb index 7f3d2e2..523102a 100644 --- a/meta-openstack/recipes-devtools/python/python-nova_git.bb +++ b/meta-openstack/recipes-devtools/python/python-nova_git.bb | |||
| @@ -14,6 +14,8 @@ FILESEXTRAPATHS := "${THISDIR}/${PN}" | |||
| 14 | SRC_URI = "git://github.com/openstack/${SRCNAME}.git;branch=stable/havana \ | 14 | SRC_URI = "git://github.com/openstack/${SRCNAME}.git;branch=stable/havana \ |
| 15 | file://0001-nova-api-paste.ini-make-controller-IP-configurable.patch \ | 15 | file://0001-nova-api-paste.ini-make-controller-IP-configurable.patch \ |
| 16 | file://nova-add-migrate.cfg-to-the-MANIFEST.patch \ | 16 | file://nova-add-migrate.cfg-to-the-MANIFEST.patch \ |
| 17 | file://Make-rbd.libvirt_info-parent-class-compatible.patch \ | ||
| 18 | file://Fix-rbd-backend-not-working-for-none-admin-ceph-user.patch \ | ||
| 17 | " | 19 | " |
| 18 | 20 | ||
| 19 | SRC_URI += "file://nova-all \ | 21 | SRC_URI += "file://nova-all \ |
| @@ -30,6 +32,8 @@ S = "${WORKDIR}/git" | |||
| 30 | 32 | ||
| 31 | inherit update-rc.d setuptools identity hosts useradd default_configs | 33 | inherit update-rc.d setuptools identity hosts useradd default_configs |
| 32 | 34 | ||
| 35 | LIBVIRT_IMAGES_TYPE ?= "default" | ||
| 36 | |||
| 33 | do_install_append() { | 37 | do_install_append() { |
| 34 | if [ ! -f "${WORKDIR}/nova.conf" ]; then | 38 | if [ ! -f "${WORKDIR}/nova.conf" ]; then |
| 35 | return | 39 | return |
| @@ -82,6 +86,8 @@ do_install_append() { | |||
| 82 | sed -e "s:%COMPUTE_IP%:${COMPUTE_IP}:g" -i ${WORKDIR}/nova.conf | 86 | sed -e "s:%COMPUTE_IP%:${COMPUTE_IP}:g" -i ${WORKDIR}/nova.conf |
| 83 | sed -e "s:%COMPUTE_HOST%:${COMPUTE_HOST}:g" -i ${WORKDIR}/nova.conf | 87 | sed -e "s:%COMPUTE_HOST%:${COMPUTE_HOST}:g" -i ${WORKDIR}/nova.conf |
| 84 | 88 | ||
| 89 | sed -e "s:%LIBVIRT_IMAGES_TYPE%:${LIBVIRT_IMAGES_TYPE}:g" -i ${WORKDIR}/nova.conf | ||
| 90 | |||
| 85 | sed -e "s:%OS_PASSWORD%:${ADMIN_PASSWORD}:g" -i ${WORKDIR}/openrc | 91 | sed -e "s:%OS_PASSWORD%:${ADMIN_PASSWORD}:g" -i ${WORKDIR}/openrc |
| 86 | sed -e "s:%SERVICE_TOKEN%:${SERVICE_TOKEN}:g" -i ${WORKDIR}/openrc | 92 | sed -e "s:%SERVICE_TOKEN%:${SERVICE_TOKEN}:g" -i ${WORKDIR}/openrc |
| 87 | 93 | ||
