Merge lp:~corey.bryant/nova/2014.1.4 into lp:~ubuntu-server-dev/nova/icehouse
- 2014.1.4
- Merge into icehouse
Proposed by
Corey Bryant
on 2015-03-17
| Status: | Merged | ||||
|---|---|---|---|---|---|
| Merged at revision: | 700 | ||||
| Proposed branch: | lp:~corey.bryant/nova/2014.1.4 | ||||
| Merge into: | lp:~ubuntu-server-dev/nova/icehouse | ||||
| Diff against target: |
728 lines (+132/-526) 9 files modified
debian/changelog (+56/-0) debian/patches/block-device-mapping-config.patch (+0/-122) debian/patches/cells-json-store.patch (+0/-76) debian/patches/disable-websockify-tests.patch (+25/-0) debian/patches/drop-oslo-utils-usage.patch (+41/-0) debian/patches/fix-requirements.patch (+6/-6) debian/patches/libvirt-Handle-unsupported-host-capabilities.patch (+0/-303) debian/patches/series (+2/-3) debian/patches/update-run-tests.patch (+2/-16) |
||||
| To merge this branch: | bzr merge lp:~corey.bryant/nova/2014.1.4 | ||||
| Related bugs: |
|
| Reviewer | Review Type | Date Requested | Status |
|---|---|---|---|
| James Page | 2015-03-17 | Needs Fixing on 2015-03-19 | |
|
Review via email:
|
|||
Commit Message
Description of the Change
To post a comment you must log in.
lp:~corey.bryant/nova/2014.1.4
updated
on 2015-03-19
- 701. By Corey Bryant on 2015-03-19
-
d/p/update-
run-tests. patch: Run tests with default concurrencey. - 702. By Corey Bryant on 2015-03-19
-
Update patch description for update-
run-tests. patch
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
| 1 | === modified file 'debian/changelog' |
| 2 | --- debian/changelog 2014-11-17 17:54:05 +0000 |
| 3 | +++ debian/changelog 2015-03-19 16:31:42 +0000 |
| 4 | @@ -1,3 +1,59 @@ |
| 5 | +nova (1:2014.1.4-0ubuntu1) trusty; urgency=medium |
| 6 | + |
| 7 | + * Resynchronize with stable/icehouse (cac6472) (LP: #1432608): |
| 8 | + - [0ff6742] Websocket Proxy should verify Origin header |
| 9 | + - [c70e1fb] Fix kwargs['instance'] KeyError in @reverts_task_state decorator |
| 10 | + - [07ec12c] Revert "Eventlet green threads not released back to pool" |
| 11 | + - [e9cf07b] Compute: Catch binding failed exception while init host |
| 12 | + - [e275961] Make tests use sha256 as openssl default digest algorithm |
| 13 | + - [a657582] Eventlet green threads not released back to pool |
| 14 | + - [4b46a86] Fix image metadata returned for volumes |
| 15 | + - [58a6393] Check min_ram and min_disk when boot from volume |
| 16 | + - [c5411d2] Extends use of ServiceProxy to more methods in HostAPI in cells |
| 17 | + - [1e2abd6] Remove usage of self.__dict__ for message var replacement |
| 18 | + - [54f9225] only emit deprecation warnings once |
| 19 | + - [52103be] Fix disconnecting necessary iSCSI sessions issue |
| 20 | + - [cca94d0] Fix connecting unnecessary iSCSI sessions issue |
| 21 | + - [ac9f5c7] Fix wrong command for _rescan_multipath |
| 22 | + - [d7c8e93] Fix unsafe SSL connection on TrustedFilter |
| 23 | + - [9ecc468] Fix SecurityGroupExists error when booting instances |
| 24 | + - [33be7d7] Update "num_instance" during delete instance |
| 25 | + - [3de3f10] Fix nova evacuate issues for RBD |
| 26 | + - [fe289fb] Fix nova-compute start issue after evacuate |
| 27 | + - [f781656] Add _security_group_ensure_default() DBAPI method |
| 28 | + - [8812672] Run build_and_run_instance in a separate greenthread |
| 29 | + - [b6a080b] Fixes DOS issue in instance list ip filter |
| 30 | + - [5ab0421] Make the block device mapping retries configurable |
| 31 | + - [0695e14] Retry on closing of luks encrypted volume in case device is busy |
| 32 | + - [dffa810] Add @_retry_on_deadlock to _instance_update() |
| 33 | + - [f086ca3] Nova api service doesn't handle SIGHUP properly |
| 34 | + - [7cdb643] Fix XML UnicodeEncode serialization error |
| 35 | + - [98a6c1e] postgresql: use postgres db instead of template1 |
| 36 | + - [155664f] share neutron admin auth tokens |
| 37 | + - [3e80433] VMware: validate that VM exists on backend prior to deletion |
| 38 | + - [d71445c] VMWare: Fix VM leak when deletion of VM during resizing |
| 39 | + - [56b62b7] Sync process utils from oslo |
| 40 | + - [ddd62ff] VMware: prevent race condition with VNC port allocation |
| 41 | + - [4174130] Fixes Hyper-V volume mapping issue on reboot |
| 42 | + - [bfeae68] Fix CellStateManagerFile init to failure |
| 43 | + - [5ec3cd3] Raise descriptive error for over volume quota |
| 44 | + - [f9fad7a] Fixes missing ec2 api address disassociate error on failure |
| 45 | + - [64ec1bf] Fix instance cross AZ check when attaching volumes |
| 46 | + - [698c821] Ignore errors when deleting non-existing vifs |
| 47 | + - [8141e7a] libvirt: Handle unsupported host capabilities |
| 48 | + - [df9ead9] libvirt: Make `fakelibvirt.libvirtError` match |
| 49 | + - [cac6472] Add _wrap_db_error() support to SessionTransaction.commit() |
| 50 | + * d/p/drop-oslo-utils-usage.patch: Added to override new oslo.utils dep. |
| 51 | + * d/p/disable-websockify-tests.patch: Added to disable websockify tests. |
| 52 | + * d/p/block-device-mapping-config.patch: Dropped. Fixed upstream in [5ab0421]. |
| 53 | + * d/p/libvirt-Handle-unsupported-host-capabilities.patch: Dropped. Fixed |
| 54 | + upstream in [8141e7a] and [df9ead9]. |
| 55 | + * d/p/cells-json-store.patch: Dropped. Fixed upstream in [bfeae68]. |
| 56 | + * d/p/fix-requirements.patch: Rebased. |
| 57 | + * d/p/update-run-tests.patch: Run tests with default concurrencey. |
| 58 | + |
| 59 | + -- Corey Bryant <corey.bryant@canonical.com> Mon, 16 Mar 2015 08:29:39 -0400 |
| 60 | + |
| 61 | nova (1:2014.1.3-0ubuntu2) trusty; urgency=medium |
| 62 | |
| 63 | [ Corey Bryant ] |
| 64 | |
| 65 | === removed file 'debian/patches/block-device-mapping-config.patch' |
| 66 | --- debian/patches/block-device-mapping-config.patch 2014-11-10 16:31:07 +0000 |
| 67 | +++ debian/patches/block-device-mapping-config.patch 1970-01-01 00:00:00 +0000 |
| 68 | @@ -1,122 +0,0 @@ |
| 69 | -Description: Make the block device mapping retries configurable |
| 70 | -Author: Akash Gangil <akashg1611@gmail.com> |
| 71 | -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/nova/+bug/1376927 |
| 72 | -Forwarded: https://review.openstack.org/#/c/129276/ |
| 73 | -diff --git a/nova/compute/manager.py b/nova/compute/manager.py |
| 74 | -index 260a2b7..45e143c 100644 |
| 75 | ---- a/nova/compute/manager.py |
| 76 | -+++ b/nova/compute/manager.py |
| 77 | -@@ -120,6 +120,10 @@ compute_opts = [ |
| 78 | - cfg.IntOpt('network_allocate_retries', |
| 79 | - default=0, |
| 80 | - help="Number of times to retry network allocation on failures"), |
| 81 | -+ cfg.IntOpt('block_device_allocate_retries', |
| 82 | -+ default=180, |
| 83 | -+ help='Number of times to retry block device' |
| 84 | -+ ' allocation on failures') |
| 85 | - ] |
| 86 | - |
| 87 | - interval_opts = [ |
| 88 | -@@ -153,7 +157,11 @@ interval_opts = [ |
| 89 | - cfg.IntOpt('instance_delete_interval', |
| 90 | - default=300, |
| 91 | - help=('Interval in seconds for retrying failed instance file ' |
| 92 | -- 'deletes')) |
| 93 | -+ 'deletes')), |
| 94 | -+ cfg.IntOpt('block_device_allocate_retries_interval', |
| 95 | -+ default=1, |
| 96 | -+ help='Waiting time interval (seconds) between block' |
| 97 | -+ ' device allocation retries on failures') |
| 98 | - ] |
| 99 | - |
| 100 | - timeout_opts = [ |
| 101 | -@@ -1135,24 +1143,21 @@ class ComputeManager(manager.Manager): |
| 102 | - instance) |
| 103 | - return network_info |
| 104 | - |
| 105 | -- def _await_block_device_map_created(self, context, vol_id, max_tries=180, |
| 106 | -- wait_between=1): |
| 107 | -+ def _await_block_device_map_created(self, context, vol_id): |
| 108 | - # TODO(yamahata): creating volume simultaneously |
| 109 | - # reduces creation time? |
| 110 | - # TODO(yamahata): eliminate dumb polling |
| 111 | -- # TODO(harlowja): make the max_tries configurable or dynamic? |
| 112 | - attempts = 0 |
| 113 | - start = time.time() |
| 114 | -- while attempts < max_tries: |
| 115 | -+ while attempts < CONF.block_device_allocate_retries: |
| 116 | - volume = self.volume_api.get(context, vol_id) |
| 117 | - volume_status = volume['status'] |
| 118 | - if volume_status not in ['creating', 'downloading']: |
| 119 | - if volume_status != 'available': |
| 120 | - LOG.warn(_("Volume id: %s finished being created but was" |
| 121 | - " not set as 'available'"), vol_id) |
| 122 | -- # NOTE(harlowja): return how many attempts were tried |
| 123 | - return attempts + 1 |
| 124 | -- greenthread.sleep(wait_between) |
| 125 | -+ greenthread.sleep(CONF.block_device_allocate_retries_interval) |
| 126 | - attempts += 1 |
| 127 | - # NOTE(harlowja): Should only happen if we ran out of attempts |
| 128 | - raise exception.VolumeNotCreated(volume_id=vol_id, |
| 129 | -diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py |
| 130 | -index f1e334d..81765b4 100644 |
| 131 | ---- a/nova/tests/compute/test_compute.py |
| 132 | -+++ b/nova/tests/compute/test_compute.py |
| 133 | -@@ -34,6 +34,8 @@ from oslo import messaging |
| 134 | - import six |
| 135 | - from testtools import matchers as testtools_matchers |
| 136 | - |
| 137 | -+from eventlet import greenthread |
| 138 | -+ |
| 139 | - import nova |
| 140 | - from nova import availability_zones |
| 141 | - from nova import block_device |
| 142 | -@@ -378,6 +380,8 @@ class ComputeVolumeTestCase(BaseTestCase): |
| 143 | - lambda *a, **kw: None) |
| 144 | - self.stubs.Set(self.compute.volume_api, 'check_attach', |
| 145 | - lambda *a, **kw: None) |
| 146 | -+ self.stubs.Set(greenthread, 'sleep', |
| 147 | -+ lambda *a, **kw: None) |
| 148 | - |
| 149 | - def store_cinfo(context, *args, **kwargs): |
| 150 | - self.cinfo = jsonutils.loads(args[-1].get('connection_info')) |
| 151 | -@@ -438,7 +442,9 @@ class ComputeVolumeTestCase(BaseTestCase): |
| 152 | - mock_get_by_id.assert_called_once_with(self.context, 'fake') |
| 153 | - self.assertTrue(mock_attach.called) |
| 154 | - |
| 155 | -- def test_await_block_device_created_to_slow(self): |
| 156 | -+ def test_await_block_device_created_too_slow(self): |
| 157 | -+ self.flags(block_device_allocate_retries=2) |
| 158 | -+ self.flags(block_device_allocate_retries_interval=0.1) |
| 159 | - |
| 160 | - def never_get(context, vol_id): |
| 161 | - return { |
| 162 | -@@ -449,13 +455,15 @@ class ComputeVolumeTestCase(BaseTestCase): |
| 163 | - self.stubs.Set(self.compute.volume_api, 'get', never_get) |
| 164 | - self.assertRaises(exception.VolumeNotCreated, |
| 165 | - self.compute._await_block_device_map_created, |
| 166 | -- self.context, '1', max_tries=2, wait_between=0.1) |
| 167 | -+ self.context, '1') |
| 168 | - |
| 169 | - def test_await_block_device_created_slow(self): |
| 170 | - c = self.compute |
| 171 | -+ self.flags(block_device_allocate_retries=4) |
| 172 | -+ self.flags(block_device_allocate_retries_interval=0.1) |
| 173 | - |
| 174 | - def slow_get(context, vol_id): |
| 175 | -- while self.fetched_attempts < 2: |
| 176 | -+ if self.fetched_attempts < 2: |
| 177 | - self.fetched_attempts += 1 |
| 178 | - return { |
| 179 | - 'status': 'creating', |
| 180 | -@@ -467,9 +475,7 @@ class ComputeVolumeTestCase(BaseTestCase): |
| 181 | - } |
| 182 | - |
| 183 | - self.stubs.Set(c.volume_api, 'get', slow_get) |
| 184 | -- attempts = c._await_block_device_map_created(self.context, '1', |
| 185 | -- max_tries=4, |
| 186 | -- wait_between=0.1) |
| 187 | -+ attempts = c._await_block_device_map_created(self.context, '1') |
| 188 | - self.assertEqual(attempts, 3) |
| 189 | - |
| 190 | - def test_boot_volume_serial(self): |
| 191 | |
| 192 | === removed file 'debian/patches/cells-json-store.patch' |
| 193 | --- debian/patches/cells-json-store.patch 2014-09-30 09:25:52 +0000 |
| 194 | +++ debian/patches/cells-json-store.patch 1970-01-01 00:00:00 +0000 |
| 195 | @@ -1,76 +0,0 @@ |
| 196 | -Description: Fix nova cells failing with a json topology file bug |
| 197 | -Author: Liam Young <liam.young@canonical.com> |
| 198 | -Bug: https://bugs.launchpad.net/nova/+bug/1314677 |
| 199 | -Forwarded: https://review.openstack.org/#/c/124811/ |
| 200 | -diff --git a/nova/cells/state.py b/nova/cells/state.py |
| 201 | -index b9112bd..1e12450 100644 |
| 202 | ---- a/nova/cells/state.py |
| 203 | -+++ b/nova/cells/state.py |
| 204 | -@@ -152,10 +152,7 @@ class CellStateManager(base.Base): |
| 205 | - cells_config = CONF.cells.cells_config |
| 206 | - |
| 207 | - if cells_config: |
| 208 | -- config_path = CONF.find_file(cells_config) |
| 209 | -- if not config_path: |
| 210 | -- raise cfg.ConfigFilesNotFoundError(config_files=[cells_config]) |
| 211 | -- return CellStateManagerFile(cell_state_cls, config_path) |
| 212 | -+ return CellStateManagerFile(cell_state_cls) |
| 213 | - |
| 214 | - return CellStateManagerDB(cell_state_cls) |
| 215 | - |
| 216 | -@@ -450,8 +447,11 @@ class CellStateManagerDB(CellStateManager): |
| 217 | - |
| 218 | - |
| 219 | - class CellStateManagerFile(CellStateManager): |
| 220 | -- def __init__(self, cell_state_cls, cells_config_path): |
| 221 | -- self.cells_config_path = cells_config_path |
| 222 | -+ def __init__(self, cell_state_cls=None): |
| 223 | -+ cells_config = CONF.cells.cells_config |
| 224 | -+ self.cells_config_path = CONF.find_file(cells_config) |
| 225 | -+ if not self.cells_config_path: |
| 226 | -+ raise cfg.ConfigFilesNotFoundError(config_files=[cells_config]) |
| 227 | - super(CellStateManagerFile, self).__init__(cell_state_cls) |
| 228 | - |
| 229 | - def _cell_data_sync(self, force=False): |
| 230 | -diff --git a/nova/tests/cells/test_cells_state_manager.py b/nova/tests/cells/test_cells_state_manager.py |
| 231 | -index 1c29927..4841e14 100644 |
| 232 | ---- a/nova/tests/cells/test_cells_state_manager.py |
| 233 | -+++ b/nova/tests/cells/test_cells_state_manager.py |
| 234 | -@@ -16,12 +16,16 @@ |
| 235 | - Tests For CellStateManager |
| 236 | - """ |
| 237 | - |
| 238 | -+import mock |
| 239 | -+import six |
| 240 | -+ |
| 241 | - from oslo.config import cfg |
| 242 | - |
| 243 | - from nova.cells import state |
| 244 | - from nova import db |
| 245 | - from nova.db.sqlalchemy import models |
| 246 | - from nova import exception |
| 247 | -+from nova.openstack.common import fileutils |
| 248 | - from nova import test |
| 249 | - |
| 250 | - |
| 251 | -@@ -78,6 +82,19 @@ class TestCellsStateManager(test.TestCase): |
| 252 | - state.CellStateManager) |
| 253 | - self.assertEqual(['no_such_file_exists.conf'], e.config_files) |
| 254 | - |
| 255 | -+ @mock.patch.object(cfg.ConfigOpts, 'find_file') |
| 256 | -+ @mock.patch.object(fileutils, 'read_cached_file') |
| 257 | -+ def test_filemanager_returned(self, mock_read_cached_file, mock_find_file): |
| 258 | -+ mock_find_file.return_value = "/etc/nova/cells.json" |
| 259 | -+ mock_read_cached_file.return_value = (False, six.StringIO({})) |
| 260 | -+ self.flags(cells_config='cells.json', group='cells') |
| 261 | -+ self.assertIsInstance(state.CellStateManager(), |
| 262 | -+ state.CellStateManagerFile) |
| 263 | -+ |
| 264 | -+ def test_dbmanager_returned(self): |
| 265 | -+ self.assertIsInstance(state.CellStateManager(), |
| 266 | -+ state.CellStateManagerDB) |
| 267 | -+ |
| 268 | - def test_capacity_no_reserve(self): |
| 269 | - # utilize entire cell |
| 270 | - cap = self._capacity(0.0) |
| 271 | - |
| 272 | |
| 273 | === added file 'debian/patches/disable-websockify-tests.patch' |
| 274 | --- debian/patches/disable-websockify-tests.patch 1970-01-01 00:00:00 +0000 |
| 275 | +++ debian/patches/disable-websockify-tests.patch 2015-03-19 16:31:42 +0000 |
| 276 | @@ -0,0 +1,25 @@ |
| 277 | +--- a/nova/tests/console/test_websocketproxy.py |
| 278 | ++++ b/nova/tests/console/test_websocketproxy.py |
| 279 | +@@ -16,8 +16,13 @@ |
| 280 | + |
| 281 | + |
| 282 | + import mock |
| 283 | ++import testtools |
| 284 | ++ |
| 285 | ++try: |
| 286 | ++ from nova.console import websocketproxy |
| 287 | ++except: |
| 288 | ++ websocketproxy = None |
| 289 | + |
| 290 | +-from nova.console import websocketproxy |
| 291 | + from nova import exception |
| 292 | + from nova import test |
| 293 | + from oslo.config import cfg |
| 294 | +@@ -27,6 +32,7 @@ |
| 295 | + |
| 296 | + class NovaProxyRequestHandlerBaseTestCase(test.TestCase): |
| 297 | + |
| 298 | ++ @testtools.skipIf(websocketproxy is None, "websockify not available") |
| 299 | + def setUp(self): |
| 300 | + super(NovaProxyRequestHandlerBaseTestCase, self).setUp() |
| 301 | + |
| 302 | |
| 303 | === added file 'debian/patches/drop-oslo-utils-usage.patch' |
| 304 | --- debian/patches/drop-oslo-utils-usage.patch 1970-01-01 00:00:00 +0000 |
| 305 | +++ debian/patches/drop-oslo-utils-usage.patch 2015-03-19 16:31:42 +0000 |
| 306 | @@ -0,0 +1,41 @@ |
| 307 | +Description: Override python-oslo.utils dependency as it's not in trusty. |
| 308 | +Author: Corey Bryant <corey.bryant@canonical.com> |
| 309 | +Bug: https://bugs.launchpad.net/bugs/1432685 |
| 310 | +Forwarded: yes |
| 311 | + |
| 312 | +--- a/nova/compute/api.py |
| 313 | ++++ b/nova/compute/api.py |
| 314 | +@@ -26,7 +26,6 @@ |
| 315 | + import uuid |
| 316 | + |
| 317 | + from oslo.config import cfg |
| 318 | +-from oslo.utils import units |
| 319 | + import six |
| 320 | + |
| 321 | + from nova import availability_zones |
| 322 | +@@ -68,6 +67,7 @@ |
| 323 | + from nova.openstack.common import log as logging |
| 324 | + from nova.openstack.common import strutils |
| 325 | + from nova.openstack.common import timeutils |
| 326 | ++from nova.openstack.common import units |
| 327 | + from nova.openstack.common import uuidutils |
| 328 | + import nova.policy |
| 329 | + from nova import quota |
| 330 | +--- a/nova/tests/compute/test_compute.py |
| 331 | ++++ b/nova/tests/compute/test_compute.py |
| 332 | +@@ -31,7 +31,6 @@ |
| 333 | + import mox |
| 334 | + from oslo.config import cfg |
| 335 | + from oslo import messaging |
| 336 | +-from oslo.utils import units |
| 337 | + import six |
| 338 | + from testtools import matchers as testtools_matchers |
| 339 | + |
| 340 | +@@ -69,6 +68,7 @@ |
| 341 | + from nova.openstack.common import jsonutils |
| 342 | + from nova.openstack.common import log as logging |
| 343 | + from nova.openstack.common import timeutils |
| 344 | ++from nova.openstack.common import units |
| 345 | + from nova.openstack.common import uuidutils |
| 346 | + from nova import policy |
| 347 | + from nova import quota |
| 348 | |
| 349 | === modified file 'debian/patches/fix-requirements.patch' |
| 350 | --- debian/patches/fix-requirements.patch 2014-08-08 17:43:35 +0000 |
| 351 | +++ debian/patches/fix-requirements.patch 2015-03-19 16:31:42 +0000 |
| 352 | @@ -4,13 +4,13 @@ |
| 353 | --- a/requirements.txt |
| 354 | +++ b/requirements.txt |
| 355 | @@ -25,9 +25,8 @@ |
| 356 | - python-neutronclient>=2.3.4,<3 |
| 357 | - python-glanceclient>=0.9.0 |
| 358 | - python-keystoneclient>=0.7.0 |
| 359 | + python-neutronclient>=2.3.4,<2.3.11 |
| 360 | + python-glanceclient>=0.9.0,!=0.14.0,<=0.14.2 |
| 361 | + python-keystoneclient>=0.7.0,<=0.11.2 |
| 362 | -six>=1.6.0 |
| 363 | +six>=1.5.2 |
| 364 | - stevedore>=0.14 |
| 365 | + stevedore>=0.14,<1.2 |
| 366 | -websockify>=0.5.1,<0.6 |
| 367 | wsgiref>=0.1.2 |
| 368 | - oslo.config>=1.2.0 |
| 369 | - oslo.rootwrap |
| 370 | + oslo.config>=1.2.0,<1.5 |
| 371 | + oslo.rootwrap<1.4 |
| 372 | |
| 373 | === removed file 'debian/patches/libvirt-Handle-unsupported-host-capabilities.patch' |
| 374 | --- debian/patches/libvirt-Handle-unsupported-host-capabilities.patch 2014-10-03 17:24:01 +0000 |
| 375 | +++ debian/patches/libvirt-Handle-unsupported-host-capabilities.patch 1970-01-01 00:00:00 +0000 |
| 376 | @@ -1,303 +0,0 @@ |
| 377 | -Description: Fix exception when starting LXC containers with libvirt-lxc. |
| 378 | -Author: Chuck Short <zulcss@ubuntu.com> |
| 379 | -Forwarded: Not Needed. |
| 380 | ---- a/nova/tests/virt/libvirt/fakelibvirt.py |
| 381 | -+++ b/nova/tests/virt/libvirt/fakelibvirt.py |
| 382 | -@@ -172,18 +172,76 @@ |
| 383 | - |
| 384 | - |
| 385 | - class libvirtError(Exception): |
| 386 | -- def __init__(self, msg, |
| 387 | -- error_code=VIR_ERR_INTERNAL_ERROR, |
| 388 | -- error_domain=VIR_FROM_QEMU): |
| 389 | -- self.error_code = error_code |
| 390 | -- self.error_domain = error_domain |
| 391 | -- Exception(self, msg) |
| 392 | -+ """This class was copied and slightly modified from |
| 393 | -+ `libvirt-python:libvirt-override.py`. |
| 394 | -+ |
| 395 | -+ Since a test environment will use the real `libvirt-python` version of |
| 396 | -+ `libvirtError` if it's installed and not this fake, we need to maintain |
| 397 | -+ strict compatability with the original class, including `__init__` args |
| 398 | -+ and instance-attributes. |
| 399 | -+ |
| 400 | -+ To create a libvirtError instance you should: |
| 401 | -+ |
| 402 | -+ # Create an unsupported error exception |
| 403 | -+ exc = libvirtError('my message') |
| 404 | -+ exc.err = (libvirt.VIR_ERR_NO_SUPPORT,) |
| 405 | -+ |
| 406 | -+ self.err is a tuple of form: |
| 407 | -+ (error_code, error_domain, error_message, error_level, str1, str2, |
| 408 | -+ str3, int1, int2) |
| 409 | -+ |
| 410 | -+ Alternatively, you can use the `make_libvirtError` convenience function to |
| 411 | -+ allow you to specify these attributes in one shot. |
| 412 | -+ """ |
| 413 | -+ def __init__(self, defmsg, conn=None, dom=None, net=None, pool=None, |
| 414 | -+ vol=None): |
| 415 | -+ Exception.__init__(self, defmsg) |
| 416 | -+ self.err = None |
| 417 | - |
| 418 | - def get_error_code(self): |
| 419 | -- return self.error_code |
| 420 | -+ if self.err is None: |
| 421 | -+ return None |
| 422 | -+ return self.err[0] |
| 423 | - |
| 424 | - def get_error_domain(self): |
| 425 | -- return self.error_domain |
| 426 | -+ if self.err is None: |
| 427 | -+ return None |
| 428 | -+ return self.err[1] |
| 429 | -+ |
| 430 | -+ def get_error_message(self): |
| 431 | -+ if self.err is None: |
| 432 | -+ return None |
| 433 | -+ return self.err[2] |
| 434 | -+ |
| 435 | -+ def get_error_level(self): |
| 436 | -+ if self.err is None: |
| 437 | -+ return None |
| 438 | -+ return self.err[3] |
| 439 | -+ |
| 440 | -+ def get_str1(self): |
| 441 | -+ if self.err is None: |
| 442 | -+ return None |
| 443 | -+ return self.err[4] |
| 444 | -+ |
| 445 | -+ def get_str2(self): |
| 446 | -+ if self.err is None: |
| 447 | -+ return None |
| 448 | -+ return self.err[5] |
| 449 | -+ |
| 450 | -+ def get_str3(self): |
| 451 | -+ if self.err is None: |
| 452 | -+ return None |
| 453 | -+ return self.err[6] |
| 454 | -+ |
| 455 | -+ def get_int1(self): |
| 456 | -+ if self.err is None: |
| 457 | -+ return None |
| 458 | -+ return self.err[7] |
| 459 | -+ |
| 460 | -+ def get_int2(self): |
| 461 | -+ if self.err is None: |
| 462 | -+ return None |
| 463 | -+ return self.err[8] |
| 464 | - |
| 465 | - |
| 466 | - class NWFilter(object): |
| 467 | -@@ -219,8 +277,10 @@ |
| 468 | - try: |
| 469 | - tree = etree.fromstring(xml) |
| 470 | - except etree.ParseError: |
| 471 | -- raise libvirtError("Invalid XML.", |
| 472 | -- VIR_ERR_XML_DETAIL, VIR_FROM_DOMAIN) |
| 473 | -+ raise make_libvirtError( |
| 474 | -+ libvirtError, "Invalid XML.", |
| 475 | -+ error_code=VIR_ERR_XML_DETAIL, |
| 476 | -+ error_domain=VIR_FROM_DOMAIN) |
| 477 | - |
| 478 | - definition = {} |
| 479 | - |
| 480 | -@@ -369,7 +429,11 @@ |
| 481 | - 123456789L] |
| 482 | - |
| 483 | - def migrateToURI(self, desturi, flags, dname, bandwidth): |
| 484 | -- raise libvirtError("Migration always fails for fake libvirt!") |
| 485 | -+ raise make_libvirtError( |
| 486 | -+ libvirtError, |
| 487 | -+ "Migration always fails for fake libvirt!", |
| 488 | -+ error_code=VIR_ERR_INTERNAL_ERROR, |
| 489 | -+ error_domain=VIR_FROM_QEMU) |
| 490 | - |
| 491 | - def attachDevice(self, xml): |
| 492 | - disk_info = _parse_disk_info(etree.fromstring(xml)) |
| 493 | -@@ -380,7 +444,11 @@ |
| 494 | - def attachDeviceFlags(self, xml, flags): |
| 495 | - if (flags & VIR_DOMAIN_AFFECT_LIVE and |
| 496 | - self._state != VIR_DOMAIN_RUNNING): |
| 497 | -- raise libvirtError("AFFECT_LIVE only allowed for running domains!") |
| 498 | -+ raise make_libvirtError( |
| 499 | -+ libvirtError, |
| 500 | -+ "AFFECT_LIVE only allowed for running domains!", |
| 501 | -+ error_code=VIR_ERR_INTERNAL_ERROR, |
| 502 | -+ error_domain=VIR_FROM_QEMU) |
| 503 | - self.attachDevice(xml) |
| 504 | - |
| 505 | - def detachDevice(self, xml): |
| 506 | -@@ -533,9 +601,11 @@ |
| 507 | - 'test:///default'] |
| 508 | - |
| 509 | - if uri not in uri_whitelist: |
| 510 | -- raise libvirtError("libvirt error: no connection driver " |
| 511 | -- "available for No connection for URI %s" % uri, |
| 512 | -- 5, 0) |
| 513 | -+ raise make_libvirtError( |
| 514 | -+ libvirtError, |
| 515 | -+ "libvirt error: no connection driver " |
| 516 | -+ "available for No connection for URI %s" % uri, |
| 517 | -+ error_code=5, error_domain=0) |
| 518 | - |
| 519 | - self.readonly = readonly |
| 520 | - self._uri = uri |
| 521 | -@@ -594,16 +664,20 @@ |
| 522 | - def lookupByID(self, id): |
| 523 | - if id in self._running_vms: |
| 524 | - return self._running_vms[id] |
| 525 | -- raise libvirtError('Domain not found: no domain with matching ' |
| 526 | -- 'id %d' % id, |
| 527 | -- VIR_ERR_NO_DOMAIN, VIR_FROM_QEMU) |
| 528 | -+ raise make_libvirtError( |
| 529 | -+ libvirtError, |
| 530 | -+ 'Domain not found: no domain with matching id %d' % id, |
| 531 | -+ error_code=VIR_ERR_NO_DOMAIN, |
| 532 | -+ error_domain=VIR_FROM_QEMU) |
| 533 | - |
| 534 | - def lookupByName(self, name): |
| 535 | - if name in self._vms: |
| 536 | - return self._vms[name] |
| 537 | -- raise libvirtError('Domain not found: no domain with matching ' |
| 538 | -- 'name "%s"' % name, |
| 539 | -- VIR_ERR_NO_DOMAIN, VIR_FROM_QEMU) |
| 540 | -+ raise make_libvirtError( |
| 541 | -+ libvirtError, |
| 542 | -+ 'Domain not found: no domain with matching name "%s"' % name, |
| 543 | -+ error_code=VIR_ERR_NO_DOMAIN, |
| 544 | -+ error_domain=VIR_FROM_QEMU) |
| 545 | - |
| 546 | - def _emit_lifecycle(self, dom, event, detail): |
| 547 | - if VIR_DOMAIN_EVENT_ID_LIFECYCLE not in self._event_callbacks: |
| 548 | -@@ -904,14 +978,21 @@ |
| 549 | - 'user': 26728850000000L, |
| 550 | - 'iowait': 6121490000000L} |
| 551 | - else: |
| 552 | -- raise libvirtError("invalid argument: Invalid cpu number") |
| 553 | -+ raise make_libvirtError( |
| 554 | -+ libvirtError, |
| 555 | -+ "invalid argument: Invalid cpu number", |
| 556 | -+ error_code=VIR_ERR_INTERNAL_ERROR, |
| 557 | -+ error_domain=VIR_FROM_QEMU) |
| 558 | - |
| 559 | - def nwfilterLookupByName(self, name): |
| 560 | - try: |
| 561 | - return self._nwfilters[name] |
| 562 | - except KeyError: |
| 563 | -- raise libvirtError("no nwfilter with matching name %s" % name, |
| 564 | -- VIR_ERR_NO_NWFILTER, VIR_FROM_NWFILTER) |
| 565 | -+ raise make_libvirtError( |
| 566 | -+ libvirtError, |
| 567 | -+ "no nwfilter with matching name %s" % name, |
| 568 | -+ error_code=VIR_ERR_NO_NWFILTER, |
| 569 | -+ error_domain=VIR_FROM_NWFILTER) |
| 570 | - |
| 571 | - def nwfilterDefineXML(self, xml): |
| 572 | - nwfilter = NWFilter(self, xml) |
| 573 | -@@ -964,6 +1045,24 @@ |
| 574 | - pass |
| 575 | - |
| 576 | - |
| 577 | -+def make_libvirtError(error_class, msg, error_code=None, |
| 578 | -+ error_domain=None, error_message=None, |
| 579 | -+ error_level=None, str1=None, str2=None, str3=None, |
| 580 | -+ int1=None, int2=None): |
| 581 | -+ """Convenience function for creating `libvirtError` exceptions which |
| 582 | -+ allow you to specify arguments in constructor without having to manipulate |
| 583 | -+ the `err` tuple directly. |
| 584 | -+ |
| 585 | -+ We need to pass in `error_class` to this function because it may be |
| 586 | -+ `libvirt.libvirtError` or `fakelibvirt.libvirtError` depending on whether |
| 587 | -+ `libvirt-python` is installed. |
| 588 | -+ """ |
| 589 | -+ exc = error_class(msg) |
| 590 | -+ exc.err = (error_code, error_domain, error_message, error_level, |
| 591 | -+ str1, str2, str3, int1, int2) |
| 592 | -+ return exc |
| 593 | -+ |
| 594 | -+ |
| 595 | - virDomain = Domain |
| 596 | - |
| 597 | - |
| 598 | ---- a/nova/virt/libvirt/driver.py |
| 599 | -+++ b/nova/virt/libvirt/driver.py |
| 600 | -@@ -77,6 +77,7 @@ |
| 601 | - from nova.openstack.common import excutils |
| 602 | - from nova.openstack.common import fileutils |
| 603 | - from nova.openstack.common.gettextutils import _ |
| 604 | -+from nova.openstack.common.gettextutils import _LW |
| 605 | - from nova.openstack.common import importutils |
| 606 | - from nova.openstack.common import jsonutils |
| 607 | - from nova.openstack.common import log as logging |
| 608 | -@@ -2888,9 +2889,14 @@ |
| 609 | - # this -1 checking should be removed later. |
| 610 | - if features and features != -1: |
| 611 | - self._caps.host.cpu.parse_str(features) |
| 612 | -- except libvirt.VIR_ERR_NO_SUPPORT: |
| 613 | -- # Note(yjiang5): ignore if libvirt has no support |
| 614 | -- pass |
| 615 | -+ except libvirt.libvirtError as ex: |
| 616 | -+ error_code = ex.get_error_code() |
| 617 | -+ if error_code == libvirt.VIR_ERR_NO_SUPPORT: |
| 618 | -+ LOG.warn(_LW("URI %(uri)s does not support full set" |
| 619 | -+ " of host capabilities: " "%(error)s"), |
| 620 | -+ {'uri': self.uri(), 'error': ex}) |
| 621 | -+ else: |
| 622 | -+ raise |
| 623 | - return self._caps |
| 624 | - |
| 625 | - def get_host_uuid(self): |
| 626 | ---- a/nova/tests/virt/libvirt/test_libvirt.py |
| 627 | -+++ b/nova/tests/virt/libvirt/test_libvirt.py |
| 628 | -@@ -83,7 +83,7 @@ |
| 629 | - try: |
| 630 | - import libvirt |
| 631 | - except ImportError: |
| 632 | -- import nova.tests.virt.libvirt.fakelibvirt as libvirt |
| 633 | -+ libvirt = fakelibvirt |
| 634 | - libvirt_driver.libvirt = libvirt |
| 635 | - |
| 636 | - |
| 637 | -@@ -887,6 +887,42 @@ |
| 638 | - caps = conn.get_host_capabilities() |
| 639 | - self.assertIn('aes', [x.name for x in caps.host.cpu.features]) |
| 640 | - |
| 641 | -+ def test_baseline_cpu_not_supported(self): |
| 642 | -+ conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) |
| 643 | -+ |
| 644 | -+ # `mock` has trouble stubbing attributes that don't exist yet, so |
| 645 | -+ # fallback to plain-Python attribute setting/deleting |
| 646 | -+ cap_str = 'VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES' |
| 647 | -+ if not hasattr(libvirt_driver.libvirt, cap_str): |
| 648 | -+ setattr(libvirt_driver.libvirt, cap_str, True) |
| 649 | -+ self.addCleanup(delattr, libvirt_driver.libvirt, cap_str) |
| 650 | -+ |
| 651 | -+ # Handle just the NO_SUPPORT error |
| 652 | -+ not_supported_exc = fakelibvirt.make_libvirtError( |
| 653 | -+ libvirt.libvirtError, |
| 654 | -+ 'this function is not supported by the connection driver:' |
| 655 | -+ ' virConnectBaselineCPU', |
| 656 | -+ error_code=libvirt.VIR_ERR_NO_SUPPORT) |
| 657 | -+ |
| 658 | -+ with mock.patch.object(conn._conn, 'baselineCPU', |
| 659 | -+ side_effect=not_supported_exc): |
| 660 | -+ caps = conn.get_host_capabilities() |
| 661 | -+ self.assertEqual(vconfig.LibvirtConfigCaps, type(caps)) |
| 662 | -+ self.assertNotIn('aes', [x.name for x in caps.host.cpu.features]) |
| 663 | -+ |
| 664 | -+ # Clear cached result so we can test again... |
| 665 | -+ conn._caps = None |
| 666 | -+ |
| 667 | -+ # Other errors should not be caught |
| 668 | -+ other_exc = fakelibvirt.make_libvirtError( |
| 669 | -+ libvirt.libvirtError, |
| 670 | -+ 'other exc', |
| 671 | -+ error_code=libvirt.VIR_ERR_NO_DOMAIN) |
| 672 | -+ |
| 673 | -+ with mock.patch.object(conn._conn, 'baselineCPU', |
| 674 | -+ side_effect=other_exc): |
| 675 | -+ self.assertRaises(libvirt.libvirtError, conn.get_host_capabilities) |
| 676 | -+ |
| 677 | - def test_lxc_get_host_capabilities_failed(self): |
| 678 | - conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) |
| 679 | - |
| 680 | |
| 681 | === modified file 'debian/patches/series' |
| 682 | --- debian/patches/series 2014-11-10 16:31:07 +0000 |
| 683 | +++ debian/patches/series 2015-03-19 16:31:42 +0000 |
| 684 | @@ -1,8 +1,7 @@ |
| 685 | # Ubuntu specific patches below here. Note these can be dropped eventually. |
| 686 | -block-device-mapping-config.patch |
| 687 | +drop-oslo-utils-usage.patch |
| 688 | +disable-websockify-tests.patch |
| 689 | fix-requirements.patch |
| 690 | skip_ipv6_test.patch |
| 691 | arm-console-patch.patch |
| 692 | update-run-tests.patch |
| 693 | -libvirt-Handle-unsupported-host-capabilities.patch |
| 694 | -cells-json-store.patch |
| 695 | |
| 696 | === modified file 'debian/patches/update-run-tests.patch' |
| 697 | --- debian/patches/update-run-tests.patch 2014-03-05 14:00:22 +0000 |
| 698 | +++ debian/patches/update-run-tests.patch 2015-03-19 16:31:42 +0000 |
| 699 | @@ -1,20 +1,9 @@ |
| 700 | -Description: Update run_tests.sh to show results and default the concurrency to 1. |
| 701 | +Description: Update run_tests.sh to show results. |
| 702 | Author: Chuck Short <zulcss@ubuntu.com> |
| 703 | Forwarded: Not needed. |
| 704 | -diff --git a/run_tests.sh b/run_tests.sh |
| 705 | -index 1fecc4c..84537cb 100755 |
| 706 | --- a/run_tests.sh |
| 707 | +++ b/run_tests.sh |
| 708 | -@@ -86,7 +86,7 @@ no_pep8=0 |
| 709 | - coverage=0 |
| 710 | - debug=0 |
| 711 | - update=0 |
| 712 | --concurrency=0 |
| 713 | -+concurrency=4 |
| 714 | - |
| 715 | - LANG=en_US.UTF-8 |
| 716 | - LANGUAGE=en_US:en |
| 717 | -@@ -137,14 +137,7 @@ function run_tests { |
| 718 | +@@ -137,14 +137,7 @@ |
| 719 | ${wrapper} python setup.py egg_info |
| 720 | fi |
| 721 | echo "Running \`${wrapper} $TESTRTESTS\`" |
| 722 | @@ -30,6 +19,3 @@ |
| 723 | RESULT=$? |
| 724 | set -e |
| 725 | |
| 726 | --- |
| 727 | -1.9.0 |
| 728 | - |


Build failure:
https:/ /launchpad. net/~james- page/+archive/ ubuntu/ icehouse/ +build/ 7089237