Remove stubs from VolumeAttachmentsSample API sample test

The amount of DB and compute service stubbing in these
functional tests is pretty gross and makes it harder to
maintain/extend them for new microversions which makes
it harder for new contributors to work with these kinds
of tests.

This removes the stubs and uses the CinderFixture. The
only new stub is dealing with detaching a volume with a
device tag since the fake driver does not track device
metadata on instances.

The API reference doc samples are regenerated using:

  tox -e api-samples VolumeAttachmentsSample

Change-Id: I04bca162c3a1d4fed7056385dfdca72c07bab9a5
This commit is contained in:
Matt Riedemann 2019-09-07 16:03:55 -04:00
parent c51187ab5b
commit df28420760
33 changed files with 120 additions and 280 deletions

View File

@ -1,6 +1,6 @@
{
"volumeAttachment": {
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"device": "/dev/vdd"
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"device": "/dev/sdb"
}
}

View File

@ -1,8 +1,8 @@
{
"volumeAttachment": {
"device": "/dev/vdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "0c92f3f6-c253-4c9b-bd43-e880a8d2eb0a",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "802db873-0373-4bdd-a433-d272a539ba18",
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
}

View File

@ -1,16 +1,10 @@
{
"volumeAttachments": [
{
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
},
{
"device": "/dev/sdc",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
"serverId": "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804"
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "fd5bb1c4-de31-4071-8472-9410bc9155ec",
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
]
}

View File

@ -1,5 +1,5 @@
{
"volumeAttachment": {
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f805"
"volumeId": "227cc671-f30b-4488-96fd-7d0bf13648d8"
}
}

View File

@ -1,6 +1,6 @@
{
"volumeAttachment": {
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"tag": "foo"
}
}
}

View File

@ -1,8 +1,8 @@
{
"volumeAttachment": {
"device": "/dev/vdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "189dc814-35bc-428b-bba4-8d5ac0d1e087",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "69d19439-fa5f-4d6e-8b78-1868e7eb93a5",
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
}

View File

@ -1,16 +1,10 @@
{
"volumeAttachments": [
{
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "4bcb3ae6-68aa-4e89-aac3-97b3dac2f714",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
},
{
"device": "/dev/sdc",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
"serverId": "4bcb3ae6-68aa-4e89-aac3-97b3dac2f714",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804"
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "1b92ff87-0116-40f5-9087-f4b907aeeaf1",
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
]
}

View File

@ -1,5 +1,5 @@
{
"volumeAttachment": {
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f805"
"volumeId": "227cc671-f30b-4488-96fd-7d0bf13648d8"
}
}

View File

@ -1,8 +1,8 @@
{
"volumeAttachment": {
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "3dc0a2a6-e1bb-4643-8b6f-c146684d676d",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "9ad0352c-48ff-4290-9db8-3385a676f035",
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
}

View File

@ -1,6 +1,6 @@
{
"volumeAttachment": {
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"tag": "foo"
}
}

View File

@ -1,9 +1,9 @@
{
"volumeAttachment": {
"device": "/dev/vdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "521b9e49-4855-4a9a-8474-759a86c1b12d",
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "70f5c62a-972d-4a8b-abcf-e1375ca7f8c0",
"tag": "foo",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
}

View File

@ -1,18 +1,11 @@
{
"volumeAttachments": [
{
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "fb6077e6-c10d-4e81-87fa-cb0f8c103051",
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "297155de-f7f2-4e87-82d0-ccc7d225d491",
"tag": "foo",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
},
{
"device": "/dev/sdc",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
"serverId": "fb6077e6-c10d-4e81-87fa-cb0f8c103051",
"tag": null,
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804"
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
]
}

View File

@ -1,5 +1,5 @@
{
"volumeAttachment": {
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f805"
"volumeId": "227cc671-f30b-4488-96fd-7d0bf13648d8"
}
}

View File

@ -1,9 +1,9 @@
{
"volumeAttachment": {
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "d989feee-002d-40f6-b47d-f0dbee48bbc1",
"tag": "foo",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
}

View File

@ -1,7 +1,7 @@
{
"volumeAttachment": {
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"tag": "foo",
"delete_on_termination": true
}
}
}

View File

@ -1,10 +1,10 @@
{
"volumeAttachment": {
"device": "/dev/vdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "521b9e49-4855-4a9a-8474-759a86c1b12d",
"delete_on_termination": true,
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "09b3b9d1-b8c5-48e1-841d-62c3ef967a88",
"tag": "foo",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"delete_on_termination": true
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
}
}

View File

@ -1,20 +1,12 @@
{
"volumeAttachments": [
{
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "fb6077e6-c10d-4e81-87fa-cb0f8c103051",
"delete_on_termination": true,
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "09b3b9d1-b8c5-48e1-841d-62c3ef967a88",
"tag": "foo",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"delete_on_termination": false
},
{
"device": "/dev/sdc",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
"serverId": "fb6077e6-c10d-4e81-87fa-cb0f8c103051",
"tag": null,
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
"delete_on_termination": false
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
]
}
}

View File

@ -1,5 +1,5 @@
{
"volumeAttachment": {
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f805"
"volumeId": "227cc671-f30b-4488-96fd-7d0bf13648d8"
}
}
}

View File

@ -1,10 +1,10 @@
{
"volumeAttachment": {
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"delete_on_termination": true,
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "2aad99d3-7aa4-41e9-b4e6-3f960b115d68",
"tag": "foo",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"delete_on_termination": false
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
}
}

View File

@ -1,8 +1,8 @@
{
"volumeAttachment": {
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"serverId": "2390fb4d-1693-45d7-b309-e29c4af16538",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
"device": "/dev/sdb",
"id": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113",
"serverId": "1ad6852e-6605-4510-b639-d0bff864b49a",
"volumeId": "a07f71dc-8151-4e7d-a0cc-cd24a3f11113"
}
}

View File

@ -1,16 +1,10 @@
{
"volumeAttachments": [
{
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"device": "%(device)s",
"id": "%(volume_id)s",
"serverId": "%(uuid)s",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
},
{
"device": "/dev/sdc",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
"serverId": "%(uuid)s",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804"
"volumeId": "%(volume_id)s"
}
]
}

View File

@ -1,5 +1,5 @@
{
"volumeAttachment": {
"volumeId": "%(volume_id)s"
"volumeId": "%(new_volume_id)s"
}
}

View File

@ -1,16 +1,10 @@
{
"volumeAttachments": [
{
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"device": "%(device)s",
"id": "%(volume_id)s",
"serverId": "%(uuid)s",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
},
{
"device": "/dev/sdc",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
"serverId": "%(uuid)s",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804"
"volumeId": "%(volume_id)s"
}
]
}

View File

@ -1,5 +1,5 @@
{
"volumeAttachment": {
"volumeId": "%(volume_id)s"
"volumeId": "%(new_volume_id)s"
}
}

View File

@ -1,8 +1,8 @@
{
"volumeAttachment": {
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"device": "%(device)s",
"id": "%(volume_id)s",
"serverId": "%(uuid)s",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
"volumeId": "%(volume_id)s"
}
}

View File

@ -1,18 +1,11 @@
{
"volumeAttachments": [
{
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"device": "%(device)s",
"id": "%(volume_id)s",
"serverId": "%(uuid)s",
"tag": "%(tag)s",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
},
{
"device": "/dev/sdc",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
"serverId": "%(uuid)s",
"tag": null,
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804"
"volumeId": "%(volume_id)s"
}
]
}

View File

@ -1,5 +1,5 @@
{
"volumeAttachment": {
"volumeId": "%(volume_id)s"
"volumeId": "%(new_volume_id)s"
}
}

View File

@ -1,9 +1,9 @@
{
"volumeAttachment": {
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"device": "%(device)s",
"id": "%(volume_id)s",
"serverId": "%(uuid)s",
"tag": "%(tag)s",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
"volumeId": "%(volume_id)s"
}
}

View File

@ -1,20 +1,12 @@
{
"volumeAttachments": [
{
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"device": "%(device)s",
"id": "%(volume_id)s",
"serverId": "%(uuid)s",
"tag": "%(tag)s",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"delete_on_termination": false
},
{
"device": "/dev/sdc",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
"serverId": "%(uuid)s",
"tag": null,
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f804",
"delete_on_termination": false
"volumeId": "%(volume_id)s",
"delete_on_termination": true
}
]
}

View File

@ -1,5 +1,5 @@
{
"volumeAttachment": {
"volumeId": "%(volume_id)s"
"volumeId": "%(new_volume_id)s"
}
}

View File

@ -1,10 +1,10 @@
{
"volumeAttachment": {
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"device": "%(device)s",
"id": "%(volume_id)s",
"serverId": "%(uuid)s",
"tag": "%(tag)s",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"delete_on_termination": false
"volumeId": "%(volume_id)s",
"delete_on_termination": true
}
}

View File

@ -1,8 +1,8 @@
{
"volumeAttachment": {
"device": "/dev/sdd",
"id": "a26887c6-c47b-4654-abb5-dfadf7d3f803",
"device": "%(device)s",
"id": "%(volume_id)s",
"serverId": "%(uuid)s",
"volumeId": "a26887c6-c47b-4654-abb5-dfadf7d3f803"
"volumeId": "%(volume_id)s"
}
}

View File

@ -15,16 +15,10 @@
import datetime
from oslo_utils.fixture import uuidsentinel as uuids
from nova import context
from nova import objects
from nova.tests import fixtures
from nova.tests.functional.api_sample_tests import api_sample_base
from nova.tests.functional.api_sample_tests import test_servers
from nova.tests.unit.api.openstack import fakes
from nova.tests.unit import fake_block_device
from nova.tests.unit import fake_instance
class SnapshotsSampleJsonTests(api_sample_base.ApiSampleTestBaseV21):
@ -198,155 +192,57 @@ class VolumesSampleJsonTest(test_servers.ServersSampleBase):
class VolumeAttachmentsSample(test_servers.ServersSampleBase):
sample_dir = "os-volumes"
OLD_VOLUME_ID = 'a26887c6-c47b-4654-abb5-dfadf7d3f803'
NEW_VOLUME_ID = 'a26887c6-c47b-4654-abb5-dfadf7d3f805'
OLD_VOLUME_ID = fixtures.CinderFixture.SWAP_OLD_VOL
NEW_VOLUME_ID = fixtures.CinderFixture.SWAP_NEW_VOL
def _get_tags_per_volume(self):
"""Allows subclasses to override which volumes have tags
:returns: dict, keyed by volume ID, to tag value; if a volume ID is
not found in the resulting dict it is assumed to not have a tag
"""
return {}
# TODO(mriedem): There is really no good reason we should have to stub
# so much of this DB and compute service code when we can just use the
# CinderFixture. The stubs make these tests very brittle and potentially
# false regarding how the API/compute service interaction works.
def _stub_db_bdms_get_all_by_instance(self, server_id):
def fake_bdms_get_all_by_instance(context, instance_uuid,
use_slave=False):
bdms = [
fake_block_device.FakeDbBlockDeviceDict(
{'id': 1, 'volume_id': self.OLD_VOLUME_ID,
'instance_uuid': server_id, 'source_type': 'volume',
'destination_type': 'volume', 'device_name': '/dev/sdd'}),
fake_block_device.FakeDbBlockDeviceDict(
{'id': 2, 'volume_id': 'a26887c6-c47b-4654-abb5-dfadf7d3f804',
'instance_uuid': server_id, 'source_type': 'volume',
'destination_type': 'volume', 'device_name': '/dev/sdc'})
]
tags_per_volume = self._get_tags_per_volume()
for bdm_dict in bdms:
bdm_dict['tag'] = tags_per_volume.get(bdm_dict['volume_id'])
return bdms
self.stub_out('nova.db.api.block_device_mapping_get_all_by_instance',
fake_bdms_get_all_by_instance)
def fake_bdm_get_by_volume_and_instance(
self, ctxt, volume_id, instance_uuid, expected_attrs=None):
tag = self._get_tags_per_volume().get(self.OLD_VOLUME_ID)
return objects.BlockDeviceMapping._from_db_object(
ctxt, objects.BlockDeviceMapping(),
fake_block_device.FakeDbBlockDeviceDict(
{'id': 1, 'volume_id': self.OLD_VOLUME_ID,
'instance_uuid': instance_uuid, 'source_type': 'volume',
'destination_type': 'volume', 'device_name': '/dev/sdd',
'tag': tag, 'delete_on_termination': False})
)
def _stub_compute_api_get(self):
def fake_compute_api_get(self, context, instance_id,
expected_attrs=None,
cell_down_support=False):
return fake_instance.fake_instance_obj(
context, **{'uuid': instance_id})
self.stub_out('nova.compute.api.API.get', fake_compute_api_get)
def setUp(self):
super(VolumeAttachmentsSample, self).setUp()
self.useFixture(fixtures.CinderFixture(self))
self.server_id = self._post_server()
def _get_vol_attachment_subs(self, subs):
"""Allows subclasses to override/supplement request/response subs"""
return subs
def test_attach_volume_to_server(self):
self.stub_out('nova.volume.cinder.API.get', fakes.stub_volume_get)
self.stub_out('nova.volume.cinder.API.attachment_create',
lambda *a, **k: {'id': uuids.volume})
device_name = '/dev/vdd'
bdm = objects.BlockDeviceMapping()
bdm['device_name'] = device_name
bdm['delete_on_termination'] = True
self.stub_out(
'nova.compute.manager.ComputeManager.reserve_block_device_name',
lambda *a, **k: bdm)
# 2.79+ will save the delete_on_termination value on the BDM after
# reserve_block_device_name "creates" the BDM.
self.stub_out('nova.objects.BlockDeviceMapping.save',
lambda *a, **k: None)
self.stub_out(
'nova.compute.manager.ComputeManager.attach_volume',
lambda *a, **k: None)
volume = fakes.stub_volume_get(None, context.get_admin_context(),
'a26887c6-c47b-4654-abb5-dfadf7d3f803')
subs = {
'volume_id': volume['id'],
'device': device_name
'volume_id': self.OLD_VOLUME_ID,
'device': '/dev/sdb'
}
server_id = self._post_server()
subs = self._get_vol_attachment_subs(subs)
response = self._do_post('servers/%s/os-volume_attachments'
% server_id,
% self.server_id,
'attach-volume-to-server-req', subs)
self._verify_response('attach-volume-to-server-resp', subs,
response, 200)
return subs
def test_list_volume_attachments(self):
server_id = self._post_server()
self._stub_db_bdms_get_all_by_instance(server_id)
subs = self.test_attach_volume_to_server()
response = self._do_get('servers/%s/os-volume_attachments'
% server_id)
subs = self._get_vol_attachment_subs({})
% self.server_id)
self._verify_response('list-volume-attachments-resp', subs,
response, 200)
def test_volume_attachment_detail(self):
server_id = self._post_server()
self.stub_out(
'nova.objects.BlockDeviceMapping.get_by_volume_and_instance',
self.fake_bdm_get_by_volume_and_instance)
self._stub_compute_api_get()
subs = self.test_attach_volume_to_server()
response = self._do_get('servers/%s/os-volume_attachments/%s'
% (server_id, self.OLD_VOLUME_ID))
subs = self._get_vol_attachment_subs({})
% (self.server_id, subs['volume_id']))
self._verify_response('volume-attachment-detail-resp', subs,
response, 200)
def test_volume_attachment_delete(self):
server_id = self._post_server()
self.stub_out(
'nova.objects.BlockDeviceMapping.get_by_volume_and_instance',
self.fake_bdm_get_by_volume_and_instance)
self._stub_compute_api_get()
self.stub_out('nova.volume.cinder.API.get', fakes.stub_volume_get)
self.stub_out('nova.compute.api.API.detach_volume',
lambda *a, **k: None)
subs = self.test_attach_volume_to_server()
response = self._do_delete('servers/%s/os-volume_attachments/%s'
% (server_id, self.OLD_VOLUME_ID))
% (self.server_id, subs['volume_id']))
self.assertEqual(202, response.status_code)
self.assertEqual('', response.text)
def test_volume_attachment_update(self):
self.stub_out('nova.volume.cinder.API.get', fakes.stub_volume_get)
subs = {
'volume_id': self.NEW_VOLUME_ID
}
server_id = self._post_server()
self.stub_out(
'nova.objects.BlockDeviceMapping.get_by_volume_and_instance',
self.fake_bdm_get_by_volume_and_instance)
self._stub_compute_api_get()
self.stub_out('nova.volume.cinder.API.get', fakes.stub_volume_get)
self.stub_out('nova.compute.api.API.swap_volume',
lambda *a, **k: None)
subs = self.test_attach_volume_to_server()
subs['new_volume_id'] = self.NEW_VOLUME_ID
response = self._do_put('servers/%s/os-volume_attachments/%s'
% (server_id, self.OLD_VOLUME_ID),
% (self.server_id, subs['volume_id']),
'update-volume-req',
subs)
self.assertEqual(202, response.status_code)
@ -360,7 +256,11 @@ class VolumeAttachmentsSampleV249(VolumeAttachmentsSample):
def setUp(self):
super(VolumeAttachmentsSampleV249, self).setUp()
self.useFixture(fixtures.CinderFixture(self))
# Stub out ComputeManager._delete_disk_metadata since the fake virt
# driver does not actually update the instance.device_metadata.devices
# list with the tagged bdm disk device metadata.
self.stub_out('nova.compute.manager.ComputeManager.'
'_delete_disk_metadata', lambda *a, **kw: None)
def _get_vol_attachment_subs(self, subs):
return dict(subs, tag='foo')
@ -371,12 +271,6 @@ class VolumeAttachmentsSampleV270(VolumeAttachmentsSampleV249):
microversion = '2.70'
scenarios = [('v2_70', {'api_major_version': 'v2.1'})]
def _get_tags_per_volume(self):
return {
self.OLD_VOLUME_ID: 'foo',
self.NEW_VOLUME_ID: None
}
class VolumeAttachmentsSampleV279(VolumeAttachmentsSampleV270):
"""Microversion 2.79 adds the "delete_on_termination" parameter to the