diff --git a/releasenotes/notes/add-show-volume-image-metadata-api-to-v2-volumes-client-ee3c027f35276561.yaml b/releasenotes/notes/add-show-volume-image-metadata-api-to-v2-volumes-client-ee3c027f35276561.yaml new file mode 100644 index 0000000000..ac7c74e592 --- /dev/null +++ b/releasenotes/notes/add-show-volume-image-metadata-api-to-v2-volumes-client-ee3c027f35276561.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Add show volume image metadata API to v2 volumes_client library. + This feature enables the possibility to show volume's image metadata. diff --git a/tempest/api/volume/test_image_metadata.py b/tempest/api/volume/test_image_metadata.py index 77baf18bf1..129981b61e 100644 --- a/tempest/api/volume/test_image_metadata.py +++ b/tempest/api/volume/test_image_metadata.py @@ -40,7 +40,7 @@ class VolumesImageMetadata(base.BaseVolumeTest): @decorators.idempotent_id('03efff0b-5c75-4822-8f10-8789ac15b13e') @test.services('image') - def test_update_image_metadata(self): + def test_update_show_delete_image_metadata(self): # Update image metadata image_metadata = {'image_id': '5137a025-3c5f-43c1-bc64-5f41270040a5', 'image_name': 'image', @@ -49,7 +49,7 @@ class VolumesImageMetadata(base.BaseVolumeTest): self.volumes_client.update_volume_image_metadata(self.volume['id'], **image_metadata) - # Fetch image metadata from the volume + # Fetch volume's image metadata by show_volume method volume_image_metadata = self.volumes_client.show_volume( self.volume['id'])['volume']['volume_image_metadata'] @@ -62,9 +62,9 @@ class VolumesImageMetadata(base.BaseVolumeTest): 'ramdisk_id') del image_metadata['ramdisk_id'] - # Fetch the new image metadata from the volume - volume_image_metadata = self.volumes_client.show_volume( - self.volume['id'])['volume']['volume_image_metadata'] + # Fetch volume's image metadata by show_volume_image_metadata method + volume_image_metadata = self.volumes_client.show_volume_image_metadata( + self.volume['id'])['metadata'] # Verify image metadata was updated after item deletion self.assertThat(volume_image_metadata.items(), diff --git a/tempest/lib/services/volume/v2/volumes_client.py b/tempest/lib/services/volume/v2/volumes_client.py index 62b9992dd4..e932adc7dc 100644 --- a/tempest/lib/services/volume/v2/volumes_client.py +++ b/tempest/lib/services/volume/v2/volumes_client.py @@ -355,6 +355,15 @@ class VolumesClient(base_client.BaseClient): self.expected_success(200, resp.status) return rest_client.ResponseBody(resp, body) + def show_volume_image_metadata(self, volume_id): + """Show image metadata for the volume.""" + post_body = json.dumps({'os-show_image_metadata': {}}) + url = "volumes/%s/action" % volume_id + resp, body = self.post(url, post_body) + body = json.loads(body) + self.expected_success(200, resp.status) + return rest_client.ResponseBody(resp, body) + @removals.remove(message="use list_pools from tempest.lib.services." "volume.v2.scheduler_stats_client") def show_pools(self, detail=False): diff --git a/tempest/tests/lib/services/volume/v2/test_volumes_client.py b/tempest/tests/lib/services/volume/v2/test_volumes_client.py index e53e0a2a85..d7b042e595 100644 --- a/tempest/tests/lib/services/volume/v2/test_volumes_client.py +++ b/tempest/tests/lib/services/volume/v2/test_volumes_client.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +from oslo_serialization import jsonutils as json + from tempest.lib.services.volume.v2 import volumes_client from tempest.tests.lib import fake_auth_provider from tempest.tests.lib.services import base @@ -26,6 +28,19 @@ class TestVolumesClient(base.BaseServiceTest): } } + FAKE_VOLUME_IMAGE_METADATA = { + "metadata": { + "container_format": "bare", + "min_ram": "0", + "disk_format": "raw", + "image_name": "xly-ubuntu16-server", + "image_id": "3e087b0c-10c5-4255-b147-6e8e9dbad6fc", + "checksum": "008f5d22fe3cb825d714da79607a90f9", + "min_disk": "0", + "size": "8589934592" + } + } + def setUp(self): super(TestVolumesClient, self).setUp() fake_auth = fake_auth_provider.FakeAuthProvider() @@ -76,6 +91,17 @@ class TestVolumesClient(base.BaseServiceTest): volume_id="a3be971b-8de5-4bdf-bdb8-3d8eb0fb69f8", id="key1") + def _test_show_volume_image_metadata(self, bytes_body=False): + fake_volume_id = "a3be971b-8de5-4bdf-bdb8-3d8eb0fb69f8" + self.check_service_client_function( + self.client.show_volume_image_metadata, + 'tempest.lib.common.rest_client.RestClient.post', + self.FAKE_VOLUME_IMAGE_METADATA, + to_utf=bytes_body, + mock_args=['volumes/%s/action' % fake_volume_id, + json.dumps({"os-show_image_metadata": {}})], + volume_id=fake_volume_id) + def test_force_detach_volume_with_str_body(self): self._test_force_detach_volume() @@ -88,6 +114,12 @@ class TestVolumesClient(base.BaseServiceTest): def test_show_volume_metadata_item_with_bytes_body(self): self._test_show_volume_metadata_item(bytes_body=True) + def test_show_volume_image_metadata_with_str_body(self): + self._test_show_volume_image_metadata() + + def test_show_volume_image_metadata_with_bytes_body(self): + self._test_show_volume_image_metadata(bytes_body=True) + def test_retype_volume_with_str_body(self): self._test_retype_volume()