This microversion drops the duplicate ``id`` field while adding ``attachment_id`` and ``bdm_uuid`` to the output of the os-volume_attachments API reflected within osc by the ``openstack server volume list $server``command. Depends-On: https://review.opendev.org/c/openstack/nova/+/804275 Change-Id: I8a7002d8d65d7795e106b768df868198ab8b8143
		
			
				
	
	
		
			337 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			337 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#   Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
						|
#   not use this file except in compliance with the License. You may obtain
 | 
						|
#   a copy of the License at
 | 
						|
#
 | 
						|
#        http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
#   Unless required by applicable law or agreed to in writing, software
 | 
						|
#   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
						|
#   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
						|
#   License for the specific language governing permissions and limitations
 | 
						|
#   under the License.
 | 
						|
#
 | 
						|
 | 
						|
from novaclient import api_versions
 | 
						|
from osc_lib import exceptions
 | 
						|
 | 
						|
from openstackclient.compute.v2 import server_volume
 | 
						|
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
 | 
						|
 | 
						|
 | 
						|
class TestServerVolume(compute_fakes.TestComputev2):
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        super().setUp()
 | 
						|
 | 
						|
        # Get a shortcut to the compute client ServerManager Mock
 | 
						|
        self.servers_mock = self.app.client_manager.compute.servers
 | 
						|
        self.servers_mock.reset_mock()
 | 
						|
 | 
						|
        # Get a shortcut to the compute client VolumeManager mock
 | 
						|
        self.servers_volumes_mock = self.app.client_manager.compute.volumes
 | 
						|
        self.servers_volumes_mock.reset_mock()
 | 
						|
 | 
						|
 | 
						|
class TestServerVolumeList(TestServerVolume):
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        super().setUp()
 | 
						|
 | 
						|
        self.server = compute_fakes.FakeServer.create_one_server()
 | 
						|
        self.volume_attachments = (
 | 
						|
            compute_fakes.FakeVolumeAttachment.create_volume_attachments())
 | 
						|
 | 
						|
        self.servers_mock.get.return_value = self.server
 | 
						|
        self.servers_volumes_mock.get_server_volumes.return_value = (
 | 
						|
            self.volume_attachments)
 | 
						|
 | 
						|
        # Get the command object to test
 | 
						|
        self.cmd = server_volume.ListServerVolume(self.app, None)
 | 
						|
 | 
						|
    def test_server_volume_list(self):
 | 
						|
        self.app.client_manager.compute.api_version = \
 | 
						|
            api_versions.APIVersion('2.1')
 | 
						|
 | 
						|
        arglist = [
 | 
						|
            self.server.id,
 | 
						|
        ]
 | 
						|
        verifylist = [
 | 
						|
            ('server', self.server.id),
 | 
						|
        ]
 | 
						|
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
						|
 | 
						|
        columns, data = self.cmd.take_action(parsed_args)
 | 
						|
 | 
						|
        self.assertEqual(('ID', 'Device', 'Server ID', 'Volume ID'), columns)
 | 
						|
        self.assertEqual(
 | 
						|
            (
 | 
						|
                (
 | 
						|
                    self.volume_attachments[0].id,
 | 
						|
                    self.volume_attachments[0].device,
 | 
						|
                    self.volume_attachments[0].serverId,
 | 
						|
                    self.volume_attachments[0].volumeId,
 | 
						|
                ),
 | 
						|
                (
 | 
						|
                    self.volume_attachments[1].id,
 | 
						|
                    self.volume_attachments[1].device,
 | 
						|
                    self.volume_attachments[1].serverId,
 | 
						|
                    self.volume_attachments[1].volumeId,
 | 
						|
                ),
 | 
						|
            ),
 | 
						|
            tuple(data),
 | 
						|
        )
 | 
						|
        self.servers_volumes_mock.get_server_volumes.assert_called_once_with(
 | 
						|
            self.server.id)
 | 
						|
 | 
						|
    def test_server_volume_list_with_tags(self):
 | 
						|
        self.app.client_manager.compute.api_version = \
 | 
						|
            api_versions.APIVersion('2.70')
 | 
						|
 | 
						|
        arglist = [
 | 
						|
            self.server.id,
 | 
						|
        ]
 | 
						|
        verifylist = [
 | 
						|
            ('server', self.server.id),
 | 
						|
        ]
 | 
						|
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
						|
 | 
						|
        columns, data = self.cmd.take_action(parsed_args)
 | 
						|
 | 
						|
        self.assertEqual(
 | 
						|
            ('ID', 'Device', 'Server ID', 'Volume ID', 'Tag',), columns,
 | 
						|
        )
 | 
						|
        self.assertEqual(
 | 
						|
            (
 | 
						|
                (
 | 
						|
                    self.volume_attachments[0].id,
 | 
						|
                    self.volume_attachments[0].device,
 | 
						|
                    self.volume_attachments[0].serverId,
 | 
						|
                    self.volume_attachments[0].volumeId,
 | 
						|
                    self.volume_attachments[0].tag,
 | 
						|
                ),
 | 
						|
                (
 | 
						|
                    self.volume_attachments[1].id,
 | 
						|
                    self.volume_attachments[1].device,
 | 
						|
                    self.volume_attachments[1].serverId,
 | 
						|
                    self.volume_attachments[1].volumeId,
 | 
						|
                    self.volume_attachments[1].tag,
 | 
						|
                ),
 | 
						|
            ),
 | 
						|
            tuple(data),
 | 
						|
        )
 | 
						|
        self.servers_volumes_mock.get_server_volumes.assert_called_once_with(
 | 
						|
            self.server.id)
 | 
						|
 | 
						|
    def test_server_volume_list_with_delete_on_attachment(self):
 | 
						|
        self.app.client_manager.compute.api_version = \
 | 
						|
            api_versions.APIVersion('2.79')
 | 
						|
 | 
						|
        arglist = [
 | 
						|
            self.server.id,
 | 
						|
        ]
 | 
						|
        verifylist = [
 | 
						|
            ('server', self.server.id),
 | 
						|
        ]
 | 
						|
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
						|
 | 
						|
        columns, data = self.cmd.take_action(parsed_args)
 | 
						|
 | 
						|
        self.assertEqual(
 | 
						|
            (
 | 
						|
                'ID', 'Device', 'Server ID', 'Volume ID', 'Tag',
 | 
						|
                'Delete On Termination?',
 | 
						|
            ),
 | 
						|
            columns,
 | 
						|
        )
 | 
						|
        self.assertEqual(
 | 
						|
            (
 | 
						|
                (
 | 
						|
                    self.volume_attachments[0].id,
 | 
						|
                    self.volume_attachments[0].device,
 | 
						|
                    self.volume_attachments[0].serverId,
 | 
						|
                    self.volume_attachments[0].volumeId,
 | 
						|
                    self.volume_attachments[0].tag,
 | 
						|
                    self.volume_attachments[0].delete_on_termination,
 | 
						|
                ),
 | 
						|
                (
 | 
						|
                    self.volume_attachments[1].id,
 | 
						|
                    self.volume_attachments[1].device,
 | 
						|
                    self.volume_attachments[1].serverId,
 | 
						|
                    self.volume_attachments[1].volumeId,
 | 
						|
                    self.volume_attachments[1].tag,
 | 
						|
                    self.volume_attachments[1].delete_on_termination,
 | 
						|
                ),
 | 
						|
            ),
 | 
						|
            tuple(data),
 | 
						|
        )
 | 
						|
        self.servers_volumes_mock.get_server_volumes.assert_called_once_with(
 | 
						|
            self.server.id)
 | 
						|
 | 
						|
    def test_server_volume_list_with_attachment_ids(self):
 | 
						|
        self.app.client_manager.compute.api_version = \
 | 
						|
            api_versions.APIVersion('2.89')
 | 
						|
 | 
						|
        arglist = [
 | 
						|
            self.server.id,
 | 
						|
        ]
 | 
						|
        verifylist = [
 | 
						|
            ('server', self.server.id),
 | 
						|
        ]
 | 
						|
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
						|
 | 
						|
        columns, data = self.cmd.take_action(parsed_args)
 | 
						|
 | 
						|
        self.assertEqual(
 | 
						|
            (
 | 
						|
                'Device', 'Server ID', 'Volume ID', 'Tag',
 | 
						|
                'Delete On Termination?', 'Attachment ID',
 | 
						|
                'BlockDeviceMapping UUID',
 | 
						|
            ),
 | 
						|
            columns,
 | 
						|
        )
 | 
						|
        self.assertEqual(
 | 
						|
            (
 | 
						|
                (
 | 
						|
                    self.volume_attachments[0].device,
 | 
						|
                    self.volume_attachments[0].serverId,
 | 
						|
                    self.volume_attachments[0].volumeId,
 | 
						|
                    self.volume_attachments[0].tag,
 | 
						|
                    self.volume_attachments[0].delete_on_termination,
 | 
						|
                    self.volume_attachments[0].attachment_id,
 | 
						|
                    self.volume_attachments[0].bdm_uuid
 | 
						|
 | 
						|
                ),
 | 
						|
                (
 | 
						|
                    self.volume_attachments[1].device,
 | 
						|
                    self.volume_attachments[1].serverId,
 | 
						|
                    self.volume_attachments[1].volumeId,
 | 
						|
                    self.volume_attachments[1].tag,
 | 
						|
                    self.volume_attachments[1].delete_on_termination,
 | 
						|
                    self.volume_attachments[1].attachment_id,
 | 
						|
                    self.volume_attachments[1].bdm_uuid
 | 
						|
                ),
 | 
						|
            ),
 | 
						|
            tuple(data),
 | 
						|
        )
 | 
						|
        self.servers_volumes_mock.get_server_volumes.assert_called_once_with(
 | 
						|
            self.server.id)
 | 
						|
 | 
						|
 | 
						|
class TestServerVolumeUpdate(TestServerVolume):
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        super().setUp()
 | 
						|
 | 
						|
        self.server = compute_fakes.FakeServer.create_one_server()
 | 
						|
        self.servers_mock.get.return_value = self.server
 | 
						|
 | 
						|
        # Get the command object to test
 | 
						|
        self.cmd = server_volume.UpdateServerVolume(self.app, None)
 | 
						|
 | 
						|
    def test_server_volume_update(self):
 | 
						|
 | 
						|
        arglist = [
 | 
						|
            self.server.id,
 | 
						|
            'foo',
 | 
						|
        ]
 | 
						|
        verifylist = [
 | 
						|
            ('server', self.server.id),
 | 
						|
            ('volume', 'foo'),
 | 
						|
            ('delete_on_termination', None),
 | 
						|
        ]
 | 
						|
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
						|
 | 
						|
        result = self.cmd.take_action(parsed_args)
 | 
						|
 | 
						|
        # This is a no-op
 | 
						|
        self.servers_volumes_mock.update_server_volume.assert_not_called()
 | 
						|
        self.assertIsNone(result)
 | 
						|
 | 
						|
    def test_server_volume_update_with_delete_on_termination(self):
 | 
						|
        self.app.client_manager.compute.api_version = \
 | 
						|
            api_versions.APIVersion('2.85')
 | 
						|
 | 
						|
        arglist = [
 | 
						|
            self.server.id,
 | 
						|
            'foo',
 | 
						|
            '--delete-on-termination',
 | 
						|
        ]
 | 
						|
        verifylist = [
 | 
						|
            ('server', self.server.id),
 | 
						|
            ('volume', 'foo'),
 | 
						|
            ('delete_on_termination', True),
 | 
						|
        ]
 | 
						|
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
						|
 | 
						|
        result = self.cmd.take_action(parsed_args)
 | 
						|
 | 
						|
        self.servers_volumes_mock.update_server_volume.assert_called_once_with(
 | 
						|
            self.server.id, 'foo', 'foo',
 | 
						|
            delete_on_termination=True)
 | 
						|
        self.assertIsNone(result)
 | 
						|
 | 
						|
    def test_server_volume_update_with_preserve_on_termination(self):
 | 
						|
        self.app.client_manager.compute.api_version = \
 | 
						|
            api_versions.APIVersion('2.85')
 | 
						|
 | 
						|
        arglist = [
 | 
						|
            self.server.id,
 | 
						|
            'foo',
 | 
						|
            '--preserve-on-termination',
 | 
						|
        ]
 | 
						|
        verifylist = [
 | 
						|
            ('server', self.server.id),
 | 
						|
            ('volume', 'foo'),
 | 
						|
            ('delete_on_termination', False),
 | 
						|
        ]
 | 
						|
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
						|
 | 
						|
        result = self.cmd.take_action(parsed_args)
 | 
						|
 | 
						|
        self.servers_volumes_mock.update_server_volume.assert_called_once_with(
 | 
						|
            self.server.id, 'foo', 'foo',
 | 
						|
            delete_on_termination=False)
 | 
						|
        self.assertIsNone(result)
 | 
						|
 | 
						|
    def test_server_volume_update_with_delete_on_termination_pre_v285(self):
 | 
						|
        self.app.client_manager.compute.api_version = \
 | 
						|
            api_versions.APIVersion('2.84')
 | 
						|
 | 
						|
        arglist = [
 | 
						|
            self.server.id,
 | 
						|
            'foo',
 | 
						|
            '--delete-on-termination',
 | 
						|
        ]
 | 
						|
        verifylist = [
 | 
						|
            ('server', self.server.id),
 | 
						|
            ('volume', 'foo'),
 | 
						|
            ('delete_on_termination', True),
 | 
						|
        ]
 | 
						|
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
						|
 | 
						|
        self.assertRaises(
 | 
						|
            exceptions.CommandError,
 | 
						|
            self.cmd.take_action,
 | 
						|
            parsed_args)
 | 
						|
 | 
						|
    def test_server_volume_update_with_preserve_on_termination_pre_v285(self):
 | 
						|
        self.app.client_manager.compute.api_version = \
 | 
						|
            api_versions.APIVersion('2.84')
 | 
						|
 | 
						|
        arglist = [
 | 
						|
            self.server.id,
 | 
						|
            'foo',
 | 
						|
            '--preserve-on-termination',
 | 
						|
        ]
 | 
						|
        verifylist = [
 | 
						|
            ('server', self.server.id),
 | 
						|
            ('volume', 'foo'),
 | 
						|
            ('delete_on_termination', False),
 | 
						|
        ]
 | 
						|
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
						|
 | 
						|
        self.assertRaises(
 | 
						|
            exceptions.CommandError,
 | 
						|
            self.cmd.take_action,
 | 
						|
            parsed_args)
 |