summaryrefslogtreecommitdiff
path: root/openstackclient/tests/unit
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/tests/unit')
-rw-r--r--openstackclient/tests/unit/compute/v2/fakes.py73
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py1440
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server_event.py235
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server_group.py47
-rw-r--r--openstackclient/tests/unit/network/v2/test_network_rbac.py6
-rw-r--r--openstackclient/tests/unit/network/v2/test_port.py20
-rw-r--r--openstackclient/tests/unit/network/v2/test_subnet.py4
7 files changed, 1570 insertions, 255 deletions
diff --git a/openstackclient/tests/unit/compute/v2/fakes.py b/openstackclient/tests/unit/compute/v2/fakes.py
index e4cf1045..4a2a44de 100644
--- a/openstackclient/tests/unit/compute/v2/fakes.py
+++ b/openstackclient/tests/unit/compute/v2/fakes.py
@@ -1566,12 +1566,12 @@ class FakeRateLimit(object):
self.next_available = next_available
-class FakeServerMigration(object):
- """Fake one or more server migrations."""
+class FakeMigration(object):
+ """Fake one or more migrations."""
@staticmethod
- def create_one_server_migration(attrs=None, methods=None):
- """Create a fake server migration.
+ def create_one_migration(attrs=None, methods=None):
+ """Create a fake migration.
:param Dictionary attrs:
A dictionary with all attributes
@@ -1612,27 +1612,80 @@ class FakeServerMigration(object):
return migration
@staticmethod
- def create_server_migrations(attrs=None, methods=None, count=2):
- """Create multiple fake server migrations.
+ def create_migrations(attrs=None, methods=None, count=2):
+ """Create multiple fake migrations.
:param Dictionary attrs:
A dictionary with all attributes
:param Dictionary methods:
A dictionary with all methods
:param int count:
- The number of server migrations to fake
+ The number of migrations to fake
:return:
- A list of FakeResource objects faking the server migrations
+ A list of FakeResource objects faking the migrations
"""
migrations = []
for i in range(0, count):
migrations.append(
- FakeServerMigration.create_one_server_migration(
+ FakeMigration.create_one_migration(
attrs, methods))
return migrations
+class FakeServerMigration(object):
+ """Fake one or more server migrations."""
+
+ @staticmethod
+ def create_one_server_migration(attrs=None, methods=None):
+ """Create a fake server migration.
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :param Dictionary methods:
+ A dictionary with all methods
+ :return:
+ A FakeResource object, with id, type, and so on
+ """
+ attrs = attrs or {}
+ methods = methods or {}
+
+ # Set default attributes.
+
+ migration_info = {
+ "created_at": "2016-01-29T13:42:02.000000",
+ "dest_compute": "compute2",
+ "dest_host": "1.2.3.4",
+ "dest_node": "node2",
+ "id": random.randint(1, 999),
+ "server_uuid": uuid.uuid4().hex,
+ "source_compute": "compute1",
+ "source_node": "node1",
+ "status": "running",
+ "memory_total_bytes": random.randint(1, 99999),
+ "memory_processed_bytes": random.randint(1, 99999),
+ "memory_remaining_bytes": random.randint(1, 99999),
+ "disk_total_bytes": random.randint(1, 99999),
+ "disk_processed_bytes": random.randint(1, 99999),
+ "disk_remaining_bytes": random.randint(1, 99999),
+ "updated_at": "2016-01-29T13:42:02.000000",
+ # added in 2.59
+ "uuid": uuid.uuid4().hex,
+ # added in 2.80
+ "user_id": uuid.uuid4().hex,
+ "project_id": uuid.uuid4().hex,
+ }
+
+ # Overwrite default attributes.
+ migration_info.update(attrs)
+
+ migration = fakes.FakeResource(
+ info=copy.deepcopy(migration_info),
+ methods=methods,
+ loaded=True)
+ return migration
+
+
class FakeVolumeAttachment(object):
"""Fake one or more volume attachments (BDMs)."""
@@ -1680,7 +1733,7 @@ class FakeVolumeAttachment(object):
:param Dictionary methods:
A dictionary with all methods
:param int count:
- The number of server migrations to fake
+ The number of volume attachments to fake
:return:
A list of FakeResource objects faking the volume attachments.
"""
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index 16885eb8..c6dff5a8 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -16,6 +16,8 @@ import argparse
import collections
import copy
import getpass
+import json
+import tempfile
from unittest import mock
from unittest.mock import call
@@ -1311,8 +1313,28 @@ class TestServerCreate(TestServer):
verifylist = [
('image', 'image1'),
('flavor', 'flavor1'),
- ('nic', ['net-id=net1', 'net-id=net1,v4-fixed-ip=10.0.0.2',
- 'port-id=port1', 'net-id=net1', 'port-id=port2']),
+ ('nics', [
+ {
+ 'net-id': 'net1', 'port-id': '',
+ 'v4-fixed-ip': '', 'v6-fixed-ip': '',
+ },
+ {
+ 'net-id': 'net1', 'port-id': '',
+ 'v4-fixed-ip': '10.0.0.2', 'v6-fixed-ip': '',
+ },
+ {
+ 'net-id': '', 'port-id': 'port1',
+ 'v4-fixed-ip': '', 'v6-fixed-ip': '',
+ },
+ {
+ 'net-id': 'net1', 'port-id': '',
+ 'v4-fixed-ip': '', 'v6-fixed-ip': '',
+ },
+ {
+ 'net-id': '', 'port-id': 'port2',
+ 'v4-fixed-ip': '', 'v6-fixed-ip': '',
+ },
+ ]),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -1403,6 +1425,113 @@ class TestServerCreate(TestServer):
self.assertEqual(self.columns, columns)
self.assertEqual(self.datalist(), data)
+ def test_server_create_with_network_tag(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.43')
+
+ arglist = [
+ '--image', 'image1',
+ '--flavor', 'flavor1',
+ '--nic', 'net-id=net1,tag=foo',
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', 'flavor1'),
+ ('nics', [
+ {
+ 'net-id': 'net1', 'port-id': '',
+ 'v4-fixed-ip': '', 'v6-fixed-ip': '',
+ 'tag': 'foo',
+ },
+ ]),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ find_network = mock.Mock()
+ network_client = self.app.client_manager.network
+ network_client.find_network = find_network
+ network_resource = mock.Mock(id='net1_uuid')
+ find_network.return_value = network_resource
+
+ # Mock sdk APIs.
+ _network = mock.Mock(id='net1_uuid')
+ find_network = mock.Mock()
+ find_network.return_value = _network
+ self.app.client_manager.network.find_network = find_network
+
+ # In base command class ShowOne in cliff, abstract method take_action()
+ # returns a two-part tuple with a tuple of column names and a tuple of
+ # data to be shown.
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = dict(
+ meta=None,
+ files={},
+ reservation_id=None,
+ min_count=1,
+ max_count=1,
+ security_groups=[],
+ userdata=None,
+ key_name=None,
+ availability_zone=None,
+ admin_pass=None,
+ block_device_mapping_v2=[],
+ nics=[
+ {
+ 'net-id': 'net1_uuid',
+ 'v4-fixed-ip': '',
+ 'v6-fixed-ip': '',
+ 'port-id': '',
+ 'tag': 'foo',
+ },
+ ],
+ scheduler_hints={},
+ config_drive=None,
+ )
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ self.image,
+ self.flavor,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+
+ network_client.find_network.assert_called_once()
+ self.app.client_manager.network.find_network.assert_called_once()
+
+ def test_server_create_with_network_tag_pre_v243(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.42')
+
+ arglist = [
+ '--image', 'image1',
+ '--flavor', 'flavor1',
+ '--nic', 'net-id=net1,tag=foo',
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', 'flavor1'),
+ ('nics', [
+ {
+ 'net-id': 'net1', 'port-id': '',
+ 'v4-fixed-ip': '', 'v6-fixed-ip': '',
+ 'tag': 'foo',
+ },
+ ]),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.assertRaises(
+ exceptions.CommandError, self.cmd.take_action, parsed_args)
+
def test_server_create_with_auto_network(self):
arglist = [
'--image', 'image1',
@@ -1413,7 +1542,7 @@ class TestServerCreate(TestServer):
verifylist = [
('image', 'image1'),
('flavor', 'flavor1'),
- ('nic', ['auto']),
+ ('nics', ['auto']),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -1509,7 +1638,7 @@ class TestServerCreate(TestServer):
verifylist = [
('image', 'image1'),
('flavor', 'flavor1'),
- ('nic', ['none']),
+ ('nics', ['none']),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -1557,7 +1686,14 @@ class TestServerCreate(TestServer):
verifylist = [
('image', 'image1'),
('flavor', 'flavor1'),
- ('nic', ['none', 'auto', 'port-id=port1']),
+ ('nics', [
+ 'none',
+ 'auto',
+ {
+ 'net-id': '', 'port-id': 'port1',
+ 'v4-fixed-ip': '', 'v6-fixed-ip': '',
+ },
+ ]),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -1587,17 +1723,10 @@ class TestServerCreate(TestServer):
'--nic', 'abcdefgh',
self.new_server.name,
]
- verifylist = [
- ('image', 'image1'),
- ('flavor', 'flavor1'),
- ('nic', ['abcdefgh']),
- ('config_drive', False),
- ('server_name', self.new_server.name),
- ]
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
- self.assertRaises(exceptions.CommandError,
- self.cmd.take_action, parsed_args)
+ self.assertRaises(
+ argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
self.assertNotCalled(self.servers_mock.create)
def test_server_create_with_invalid_network_key(self):
@@ -1607,17 +1736,10 @@ class TestServerCreate(TestServer):
'--nic', 'abcdefgh=12324',
self.new_server.name,
]
- verifylist = [
- ('image', 'image1'),
- ('flavor', 'flavor1'),
- ('nic', ['abcdefgh=12324']),
- ('config_drive', False),
- ('server_name', self.new_server.name),
- ]
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
- self.assertRaises(exceptions.CommandError,
- self.cmd.take_action, parsed_args)
+ self.assertRaises(
+ argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
self.assertNotCalled(self.servers_mock.create)
def test_server_create_with_empty_network_key_value(self):
@@ -1627,17 +1749,10 @@ class TestServerCreate(TestServer):
'--nic', 'net-id=',
self.new_server.name,
]
- verifylist = [
- ('image', 'image1'),
- ('flavor', 'flavor1'),
- ('nic', ['net-id=']),
- ('config_drive', False),
- ('server_name', self.new_server.name),
- ]
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
- self.assertRaises(exceptions.CommandError,
- self.cmd.take_action, parsed_args)
+ self.assertRaises(
+ argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
self.assertNotCalled(self.servers_mock.create)
def test_server_create_with_only_network_key(self):
@@ -1647,17 +1762,11 @@ class TestServerCreate(TestServer):
'--nic', 'net-id',
self.new_server.name,
]
- verifylist = [
- ('image', 'image1'),
- ('flavor', 'flavor1'),
- ('nic', ['net-id']),
- ('config_drive', False),
- ('server_name', self.new_server.name),
- ]
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.assertRaises(
+ argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
- self.assertRaises(exceptions.CommandError,
- self.cmd.take_action, parsed_args)
self.assertNotCalled(self.servers_mock.create)
@mock.patch.object(common_utils, 'wait_for_status', return_value=True)
@@ -1818,6 +1927,430 @@ class TestServerCreate(TestServer):
self.assertEqual(self.columns, columns)
self.assertEqual(self.datalist(), data)
+ def test_server_create_with_volume(self):
+ arglist = [
+ '--flavor', self.flavor.id,
+ '--volume', self.volume.name,
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('flavor', self.flavor.id),
+ ('volume', self.volume.name),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # CreateServer.take_action() returns two tuples
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'meta': None,
+ 'files': {},
+ 'reservation_id': None,
+ 'min_count': 1,
+ 'max_count': 1,
+ 'security_groups': [],
+ 'userdata': None,
+ 'key_name': None,
+ 'availability_zone': None,
+ 'admin_pass': None,
+ 'block_device_mapping_v2': [{
+ 'uuid': self.volume.id,
+ 'boot_index': '0',
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ }],
+ 'nics': [],
+ 'scheduler_hints': {},
+ 'config_drive': None,
+ }
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ None,
+ self.flavor,
+ **kwargs
+ )
+ self.volumes_mock.get.assert_called_once_with(
+ self.volume.name)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+
+ def test_server_create_with_snapshot(self):
+ arglist = [
+ '--flavor', self.flavor.id,
+ '--snapshot', self.snapshot.name,
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('flavor', self.flavor.id),
+ ('snapshot', self.snapshot.name),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # CreateServer.take_action() returns two tuples
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'meta': None,
+ 'files': {},
+ 'reservation_id': None,
+ 'min_count': 1,
+ 'max_count': 1,
+ 'security_groups': [],
+ 'userdata': None,
+ 'key_name': None,
+ 'availability_zone': None,
+ 'admin_pass': None,
+ 'block_device_mapping_v2': [{
+ 'uuid': self.snapshot.id,
+ 'boot_index': '0',
+ 'source_type': 'snapshot',
+ 'destination_type': 'volume',
+ 'delete_on_termination': False,
+ }],
+ 'nics': [],
+ 'scheduler_hints': {},
+ 'config_drive': None,
+ }
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ None,
+ self.flavor,
+ **kwargs
+ )
+ self.snapshots_mock.get.assert_called_once_with(
+ self.snapshot.name)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+
+ def test_server_create_with_block_device(self):
+ block_device = f'uuid={self.volume.id},source_type=volume'
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--block-device', block_device,
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', self.flavor.id),
+ ('block_devices', [
+ {
+ 'uuid': self.volume.id,
+ 'source_type': 'volume',
+ },
+ ]),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # CreateServer.take_action() returns two tuples
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'meta': None,
+ 'files': {},
+ 'reservation_id': None,
+ 'min_count': 1,
+ 'max_count': 1,
+ 'security_groups': [],
+ 'userdata': None,
+ 'key_name': None,
+ 'availability_zone': None,
+ 'admin_pass': None,
+ 'block_device_mapping_v2': [{
+ 'uuid': self.volume.id,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ }],
+ 'nics': [],
+ 'scheduler_hints': {},
+ 'config_drive': None,
+ }
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ self.image,
+ self.flavor,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+
+ def test_server_create_with_block_device_full(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.67')
+
+ block_device = (
+ f'uuid={self.volume.id},source_type=volume,'
+ f'destination_type=volume,disk_bus=ide,device_type=disk,'
+ f'device_name=sdb,guest_format=ext4,volume_size=64,'
+ f'volume_type=foo,boot_index=1,delete_on_termination=true,'
+ f'tag=foo'
+ )
+
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--block-device', block_device,
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', self.flavor.id),
+ ('block_devices', [
+ {
+ 'uuid': self.volume.id,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'disk_bus': 'ide',
+ 'device_type': 'disk',
+ 'device_name': 'sdb',
+ 'guest_format': 'ext4',
+ 'volume_size': '64',
+ 'volume_type': 'foo',
+ 'boot_index': '1',
+ 'delete_on_termination': 'true',
+ 'tag': 'foo',
+ },
+ ]),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # CreateServer.take_action() returns two tuples
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'meta': None,
+ 'files': {},
+ 'reservation_id': None,
+ 'min_count': 1,
+ 'max_count': 1,
+ 'security_groups': [],
+ 'userdata': None,
+ 'key_name': None,
+ 'availability_zone': None,
+ 'admin_pass': None,
+ 'block_device_mapping_v2': [{
+ 'uuid': self.volume.id,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'disk_bus': 'ide',
+ 'device_name': 'sdb',
+ 'volume_size': '64',
+ 'guest_format': 'ext4',
+ 'boot_index': 1,
+ 'device_type': 'disk',
+ 'delete_on_termination': True,
+ 'tag': 'foo',
+ 'volume_type': 'foo',
+ }],
+ 'nics': 'auto',
+ 'scheduler_hints': {},
+ 'config_drive': None,
+ }
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ self.image,
+ self.flavor,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+
+ def test_server_create_with_block_device_from_file(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.67')
+
+ block_device = {
+ 'uuid': self.volume.id,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'disk_bus': 'ide',
+ 'device_type': 'disk',
+ 'device_name': 'sdb',
+ 'guest_format': 'ext4',
+ 'volume_size': 64,
+ 'volume_type': 'foo',
+ 'boot_index': 1,
+ 'delete_on_termination': True,
+ 'tag': 'foo',
+ }
+
+ with tempfile.NamedTemporaryFile(mode='w+') as fp:
+ json.dump(block_device, fp=fp)
+ fp.flush()
+
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--block-device', fp.name,
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', self.flavor.id),
+ ('block_devices', [block_device]),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # CreateServer.take_action() returns two tuples
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'meta': None,
+ 'files': {},
+ 'reservation_id': None,
+ 'min_count': 1,
+ 'max_count': 1,
+ 'security_groups': [],
+ 'userdata': None,
+ 'key_name': None,
+ 'availability_zone': None,
+ 'admin_pass': None,
+ 'block_device_mapping_v2': [{
+ 'uuid': self.volume.id,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'disk_bus': 'ide',
+ 'device_name': 'sdb',
+ 'volume_size': 64,
+ 'guest_format': 'ext4',
+ 'boot_index': 1,
+ 'device_type': 'disk',
+ 'delete_on_termination': True,
+ 'tag': 'foo',
+ 'volume_type': 'foo',
+ }],
+ 'nics': 'auto',
+ 'scheduler_hints': {},
+ 'config_drive': None,
+ }
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ self.image,
+ self.flavor,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+
+ def test_server_create_with_block_device_invalid_boot_index(self):
+ block_device = \
+ f'uuid={self.volume.name},source_type=volume,boot_index=foo'
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--block-device', block_device,
+ self.new_server.name,
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action, parsed_args)
+ self.assertIn('The boot_index key of --block-device ', str(ex))
+
+ def test_server_create_with_block_device_invalid_source_type(self):
+ block_device = f'uuid={self.volume.name},source_type=foo'
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--block-device', block_device,
+ self.new_server.name,
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action, parsed_args)
+ self.assertIn('The source_type key of --block-device ', str(ex))
+
+ def test_server_create_with_block_device_invalid_destination_type(self):
+ block_device = \
+ f'uuid={self.volume.name},destination_type=foo'
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--block-device', block_device,
+ self.new_server.name,
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action, parsed_args)
+ self.assertIn('The destination_type key of --block-device ', str(ex))
+
+ def test_server_create_with_block_device_invalid_shutdown(self):
+ block_device = \
+ f'uuid={self.volume.name},delete_on_termination=foo'
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--block-device', block_device,
+ self.new_server.name,
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action, parsed_args)
+ self.assertIn(
+ 'The delete_on_termination key of --block-device ', str(ex))
+
+ def test_server_create_with_block_device_tag_pre_v242(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.41')
+
+ block_device = \
+ f'uuid={self.volume.name},tag=foo'
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--block-device', block_device,
+ self.new_server.name,
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action, parsed_args)
+ self.assertIn(
+ '--os-compute-api-version 2.42 or greater is required',
+ str(ex))
+
+ def test_server_create_with_block_device_volume_type_pre_v267(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.66')
+
+ block_device = f'uuid={self.volume.name},volume_type=foo'
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--block-device', block_device,
+ self.new_server.name,
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action, parsed_args)
+ self.assertIn(
+ '--os-compute-api-version 2.67 or greater is required',
+ str(ex))
+
def test_server_create_with_block_device_mapping(self):
arglist = [
'--image', 'image1',
@@ -1828,7 +2361,15 @@ class TestServerCreate(TestServer):
verifylist = [
('image', 'image1'),
('flavor', self.flavor.id),
- ('block_device_mapping', {'vda': self.volume.name + ':::false'}),
+ ('block_device_mapping', [
+ {
+ 'device_name': 'vda',
+ 'uuid': self.volume.name,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'delete_on_termination': 'false',
+ }
+ ]),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -1881,7 +2422,14 @@ class TestServerCreate(TestServer):
verifylist = [
('image', 'image1'),
('flavor', self.flavor.id),
- ('block_device_mapping', {'vdf': self.volume.name}),
+ ('block_device_mapping', [
+ {
+ 'device_name': 'vdf',
+ 'uuid': self.volume.name,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ }
+ ]),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -1933,7 +2481,14 @@ class TestServerCreate(TestServer):
verifylist = [
('image', 'image1'),
('flavor', self.flavor.id),
- ('block_device_mapping', {'vdf': self.volume.name + ':::'}),
+ ('block_device_mapping', [
+ {
+ 'device_name': 'vdf',
+ 'uuid': self.volume.name,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ }
+ ]),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -1986,8 +2541,16 @@ class TestServerCreate(TestServer):
verifylist = [
('image', 'image1'),
('flavor', self.flavor.id),
- ('block_device_mapping',
- {'vde': self.volume.name + ':volume:3:true'}),
+ ('block_device_mapping', [
+ {
+ 'device_name': 'vde',
+ 'uuid': self.volume.name,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'volume_size': '3',
+ 'delete_on_termination': 'true',
+ }
+ ]),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -2042,8 +2605,16 @@ class TestServerCreate(TestServer):
verifylist = [
('image', 'image1'),
('flavor', self.flavor.id),
- ('block_device_mapping',
- {'vds': self.volume.name + ':snapshot:5:true'}),
+ ('block_device_mapping', [
+ {
+ 'device_name': 'vds',
+ 'uuid': self.volume.name,
+ 'source_type': 'snapshot',
+ 'volume_size': '5',
+ 'destination_type': 'volume',
+ 'delete_on_termination': 'true',
+ }
+ ]),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -2098,8 +2669,22 @@ class TestServerCreate(TestServer):
verifylist = [
('image', 'image1'),
('flavor', self.flavor.id),
- ('block_device_mapping', {'vdb': self.volume.name + ':::false',
- 'vdc': self.volume.name + ':::true'}),
+ ('block_device_mapping', [
+ {
+ 'device_name': 'vdb',
+ 'uuid': self.volume.name,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'delete_on_termination': 'false',
+ },
+ {
+ 'device_name': 'vdc',
+ 'uuid': self.volume.name,
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'delete_on_termination': 'true',
+ },
+ ]),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -2152,26 +2737,29 @@ class TestServerCreate(TestServer):
self.assertEqual(self.datalist(), data)
def test_server_create_with_block_device_mapping_invalid_format(self):
- # 1. block device mapping don't contain equal sign "="
+ # block device mapping don't contain equal sign "="
arglist = [
'--image', 'image1',
'--flavor', self.flavor.id,
'--block-device-mapping', 'not_contain_equal_sign',
self.new_server.name,
]
- self.assertRaises(argparse.ArgumentTypeError,
- self.check_parser,
- self.cmd, arglist, [])
- # 2. block device mapping don't contain device name "=uuid:::true"
+ self.assertRaises(
+ argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
+
+ # block device mapping don't contain device name "=uuid:::true"
arglist = [
'--image', 'image1',
'--flavor', self.flavor.id,
'--block-device-mapping', '=uuid:::true',
self.new_server.name,
]
- self.assertRaises(argparse.ArgumentTypeError,
- self.check_parser,
- self.cmd, arglist, [])
+ self.assertRaises(
+ argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
def test_server_create_with_block_device_mapping_no_uuid(self):
arglist = [
@@ -2180,18 +2768,10 @@ class TestServerCreate(TestServer):
'--block-device-mapping', 'vdb=',
self.new_server.name,
]
- verifylist = [
- ('image', 'image1'),
- ('flavor', self.flavor.id),
- ('block_device_mapping', {'vdb': ''}),
- ('config_drive', False),
- ('server_name', self.new_server.name),
- ]
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
- self.assertRaises(exceptions.CommandError,
- self.cmd.take_action,
- parsed_args)
+ self.assertRaises(
+ argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
def test_server_create_volume_boot_from_volume_conflict(self):
# Tests that specifying --volume and --boot-from-volume results in
@@ -2230,7 +2810,7 @@ class TestServerCreate(TestServer):
verifylist = [
('image_properties', {'hypervisor_type': 'qemu'}),
('flavor', 'flavor1'),
- ('nic', ['none']),
+ ('nics', ['none']),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -2286,7 +2866,7 @@ class TestServerCreate(TestServer):
('image_properties', {'hypervisor_type': 'qemu',
'hw_disk_bus': 'ide'}),
('flavor', 'flavor1'),
- ('nic', ['none']),
+ ('nics', ['none']),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -2342,7 +2922,7 @@ class TestServerCreate(TestServer):
('image_properties', {'hypervisor_type': 'qemu',
'hw_disk_bus': 'virtio'}),
('flavor', 'flavor1'),
- ('nic', ['none']),
+ ('nics', ['none']),
('config_drive', False),
('server_name', self.new_server.name),
]
@@ -2374,7 +2954,7 @@ class TestServerCreate(TestServer):
('image_properties',
{'owner_specified.openstack.object': 'image/cirros'}),
('flavor', 'flavor1'),
- ('nic', ['none']),
+ ('nics', ['none']),
('server_name', self.new_server.name),
]
# create a image_info as the side_effect of the fake image_list()
@@ -2421,6 +3001,136 @@ class TestServerCreate(TestServer):
self.assertEqual(self.columns, columns)
self.assertEqual(self.datalist(), data)
+ def test_server_create_with_swap(self):
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--swap', '1024',
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', self.flavor.id),
+ ('swap', 1024),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # CreateServer.take_action() returns two tuples
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'meta': None,
+ 'files': {},
+ 'reservation_id': None,
+ 'min_count': 1,
+ 'max_count': 1,
+ 'security_groups': [],
+ 'userdata': None,
+ 'key_name': None,
+ 'availability_zone': None,
+ 'admin_pass': None,
+ 'block_device_mapping_v2': [{
+ 'boot_index': -1,
+ 'source_type': 'blank',
+ 'destination_type': 'local',
+ 'guest_format': 'swap',
+ 'volume_size': 1024,
+ 'delete_on_termination': True,
+ }],
+ 'nics': [],
+ 'scheduler_hints': {},
+ 'config_drive': None,
+ }
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ self.image,
+ self.flavor,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+
+ def test_server_create_with_ephemeral(self):
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--ephemeral', 'size=1024,format=ext4',
+ self.new_server.name,
+ ]
+ verifylist = [
+ ('image', 'image1'),
+ ('flavor', self.flavor.id),
+ ('ephemerals', [{'size': '1024', 'format': 'ext4'}]),
+ ('server_name', self.new_server.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # CreateServer.take_action() returns two tuples
+ columns, data = self.cmd.take_action(parsed_args)
+
+ # Set expected values
+ kwargs = {
+ 'meta': None,
+ 'files': {},
+ 'reservation_id': None,
+ 'min_count': 1,
+ 'max_count': 1,
+ 'security_groups': [],
+ 'userdata': None,
+ 'key_name': None,
+ 'availability_zone': None,
+ 'admin_pass': None,
+ 'block_device_mapping_v2': [{
+ 'boot_index': -1,
+ 'source_type': 'blank',
+ 'destination_type': 'local',
+ 'guest_format': 'ext4',
+ 'volume_size': '1024',
+ 'delete_on_termination': True,
+ }],
+ 'nics': [],
+ 'scheduler_hints': {},
+ 'config_drive': None,
+ }
+ # ServerManager.create(name, image, flavor, **kwargs)
+ self.servers_mock.create.assert_called_with(
+ self.new_server.name,
+ self.image,
+ self.flavor,
+ **kwargs
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.datalist(), data)
+
+ def test_server_create_with_ephemeral_missing_key(self):
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--ephemeral', 'format=ext3',
+ self.new_server.name,
+ ]
+ self.assertRaises(
+ argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
+
+ def test_server_create_with_ephemeral_invalid_key(self):
+ arglist = [
+ '--image', 'image1',
+ '--flavor', self.flavor.id,
+ '--ephemeral', 'size=1024,foo=bar',
+ self.new_server.name,
+ ]
+ self.assertRaises(
+ argparse.ArgumentTypeError,
+ self.check_parser,
+ self.cmd, arglist, [])
+
def test_server_create_invalid_hint(self):
# Not a key-value pair
arglist = [
@@ -2913,6 +3623,28 @@ class TestServerDelete(TestServer):
self.servers_mock.delete.assert_has_calls(calls)
self.assertIsNone(result)
+ @mock.patch.object(common_utils, 'find_resource')
+ def test_server_delete_with_all_projects(self, mock_find_resource):
+ servers = self.setup_servers_mock(count=1)
+ mock_find_resource.side_effect = compute_fakes.FakeServer.get_servers(
+ servers, 0,
+ )
+
+ arglist = [
+ servers[0].id,
+ '--all-projects',
+ ]
+ verifylist = [
+ ('server', [servers[0].id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ mock_find_resource.assert_called_once_with(
+ mock.ANY, servers[0].id, all_tenants=True,
+ )
+
@mock.patch.object(common_utils, 'wait_for_delete', return_value=True)
def test_server_delete_wait_ok(self, mock_wait_for_delete):
servers = self.setup_servers_mock(count=1)
@@ -3858,8 +4590,8 @@ class TestServerMigrate(TestServer):
self.server.id,
]
verifylist = [
- ('live', None),
- ('block_migration', False),
+ ('live_migration', False),
+ ('block_migration', None),
('disk_overcommit', False),
('wait', False),
]
@@ -3879,10 +4611,9 @@ class TestServerMigrate(TestServer):
'--host', 'fakehost', self.server.id,
]
verifylist = [
- ('live', None),
('live_migration', False),
('host', 'fakehost'),
- ('block_migration', False),
+ ('block_migration', None),
('disk_overcommit', False),
('wait', False),
]
@@ -3903,7 +4634,7 @@ class TestServerMigrate(TestServer):
'--block-migration', self.server.id,
]
verifylist = [
- ('live', None),
+ ('live_migration', False),
('block_migration', True),
('disk_overcommit', False),
('wait', False),
@@ -3922,8 +4653,8 @@ class TestServerMigrate(TestServer):
'--disk-overcommit', self.server.id,
]
verifylist = [
- ('live', None),
- ('block_migration', False),
+ ('live_migration', False),
+ ('block_migration', None),
('disk_overcommit', True),
('wait', False),
]
@@ -3943,10 +4674,9 @@ class TestServerMigrate(TestServer):
'--host', 'fakehost', self.server.id,
]
verifylist = [
- ('live', None),
('live_migration', False),
('host', 'fakehost'),
- ('block_migration', False),
+ ('block_migration', None),
('disk_overcommit', False),
('wait', False),
]
@@ -3965,101 +4695,38 @@ class TestServerMigrate(TestServer):
self.assertNotCalled(self.servers_mock.migrate)
def test_server_live_migrate(self):
- arglist = [
- '--live', 'fakehost', self.server.id,
- ]
- verifylist = [
- ('live', 'fakehost'),
- ('live_migration', False),
- ('host', None),
- ('block_migration', False),
- ('disk_overcommit', False),
- ('wait', False),
- ]
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
- self.app.client_manager.compute.api_version = \
- api_versions.APIVersion('2.24')
-
- with mock.patch.object(self.cmd.log, 'warning') as mock_warning:
- result = self.cmd.take_action(parsed_args)
-
- self.servers_mock.get.assert_called_with(self.server.id)
- self.server.live_migrate.assert_called_with(block_migration=False,
- disk_over_commit=False,
- host='fakehost')
- self.assertNotCalled(self.servers_mock.migrate)
- self.assertIsNone(result)
- # A warning should have been logged for using --live.
- mock_warning.assert_called_once()
- self.assertIn('The --live option has been deprecated.',
- str(mock_warning.call_args[0][0]))
-
- def test_server_live_migrate_host_pre_2_30(self):
- # Tests that the --host option is not supported for --live-migration
- # before microversion 2.30 (the test defaults to 2.1).
- arglist = [
- '--live-migration', '--host', 'fakehost', self.server.id,
- ]
- verifylist = [
- ('live', None),
- ('live_migration', True),
- ('host', 'fakehost'),
- ('block_migration', False),
- ('disk_overcommit', False),
- ('wait', False),
- ]
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
- ex = self.assertRaises(exceptions.CommandError, self.cmd.take_action,
- parsed_args)
-
- # Make sure it's the error we expect.
- self.assertIn('--os-compute-api-version 2.30 or greater is required '
- 'when using --host', str(ex))
-
- self.servers_mock.get.assert_called_with(self.server.id)
- self.assertNotCalled(self.servers_mock.live_migrate)
- self.assertNotCalled(self.servers_mock.migrate)
-
- def test_server_live_migrate_no_host(self):
# Tests the --live-migration option without --host or --live.
arglist = [
'--live-migration', self.server.id,
]
verifylist = [
- ('live', None),
('live_migration', True),
('host', None),
- ('block_migration', False),
+ ('block_migration', None),
('disk_overcommit', False),
('wait', False),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- with mock.patch.object(self.cmd.log, 'warning') as mock_warning:
- result = self.cmd.take_action(parsed_args)
+ result = self.cmd.take_action(parsed_args)
self.servers_mock.get.assert_called_with(self.server.id)
- self.server.live_migrate.assert_called_with(block_migration=False,
- disk_over_commit=False,
- host=None)
+ self.server.live_migrate.assert_called_with(
+ block_migration=False,
+ disk_over_commit=False,
+ host=None)
self.assertNotCalled(self.servers_mock.migrate)
self.assertIsNone(result)
- # Since --live wasn't used a warning shouldn't have been logged.
- mock_warning.assert_not_called()
def test_server_live_migrate_with_host(self):
- # Tests the --live-migration option with --host but no --live.
# This requires --os-compute-api-version >= 2.30 so the test uses 2.30.
arglist = [
'--live-migration', '--host', 'fakehost', self.server.id,
]
verifylist = [
- ('live', None),
('live_migration', True),
('host', 'fakehost'),
- ('block_migration', False),
+ ('block_migration', None),
('disk_overcommit', False),
('wait', False),
]
@@ -4071,58 +4738,49 @@ class TestServerMigrate(TestServer):
result = self.cmd.take_action(parsed_args)
self.servers_mock.get.assert_called_with(self.server.id)
- # No disk_overcommit with microversion >= 2.25.
- self.server.live_migrate.assert_called_with(block_migration=False,
- host='fakehost')
+ # No disk_overcommit and block_migration defaults to auto with
+ # microversion >= 2.25
+ self.server.live_migrate.assert_called_with(
+ block_migration='auto', host='fakehost')
self.assertNotCalled(self.servers_mock.migrate)
self.assertIsNone(result)
- def test_server_live_migrate_without_host_override_live(self):
- # Tests the --live-migration option without --host and with --live.
- # The --live-migration option will take precedence and a warning is
- # logged for using --live.
+ def test_server_live_migrate_with_host_pre_v230(self):
+ # Tests that the --host option is not supported for --live-migration
+ # before microversion 2.30 (the test defaults to 2.1).
arglist = [
- '--live', 'fakehost', '--live-migration', self.server.id,
+ '--live-migration', '--host', 'fakehost', self.server.id,
]
verifylist = [
- ('live', 'fakehost'),
('live_migration', True),
- ('host', None),
- ('block_migration', False),
+ ('host', 'fakehost'),
+ ('block_migration', None),
('disk_overcommit', False),
('wait', False),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- with mock.patch.object(self.cmd.log, 'warning') as mock_warning:
- result = self.cmd.take_action(parsed_args)
+ ex = self.assertRaises(
+ exceptions.CommandError, self.cmd.take_action,
+ parsed_args)
+
+ # Make sure it's the error we expect.
+ self.assertIn(
+ '--os-compute-api-version 2.30 or greater is required '
+ 'when using --host', str(ex))
self.servers_mock.get.assert_called_with(self.server.id)
- self.server.live_migrate.assert_called_with(block_migration=False,
- disk_over_commit=False,
- host=None)
+ self.assertNotCalled(self.servers_mock.live_migrate)
self.assertNotCalled(self.servers_mock.migrate)
- self.assertIsNone(result)
- # A warning should have been logged for using --live.
- mock_warning.assert_called_once()
- self.assertIn('The --live option has been deprecated.',
- str(mock_warning.call_args[0][0]))
-
- def test_server_live_migrate_live_and_host_mutex(self):
- # Tests specifying both the --live and --host options which are in a
- # mutex group so argparse should fail.
- arglist = [
- '--live', 'fakehost', '--host', 'fakehost', self.server.id,
- ]
- self.assertRaises(utils.ParserException,
- self.check_parser, self.cmd, arglist, verify_args=[])
def test_server_block_live_migrate(self):
arglist = [
- '--live', 'fakehost', '--block-migration', self.server.id,
+ '--live-migration',
+ '--block-migration',
+ self.server.id,
]
verifylist = [
- ('live', 'fakehost'),
+ ('live_migration', True),
('block_migration', True),
('disk_overcommit', False),
('wait', False),
@@ -4135,19 +4793,22 @@ class TestServerMigrate(TestServer):
result = self.cmd.take_action(parsed_args)
self.servers_mock.get.assert_called_with(self.server.id)
- self.server.live_migrate.assert_called_with(block_migration=True,
- disk_over_commit=False,
- host='fakehost')
+ self.server.live_migrate.assert_called_with(
+ block_migration=True,
+ disk_over_commit=False,
+ host=None)
self.assertNotCalled(self.servers_mock.migrate)
self.assertIsNone(result)
def test_server_live_migrate_with_disk_overcommit(self):
arglist = [
- '--live', 'fakehost', '--disk-overcommit', self.server.id,
+ '--live-migration',
+ '--disk-overcommit',
+ self.server.id,
]
verifylist = [
- ('live', 'fakehost'),
- ('block_migration', False),
+ ('live_migration', True),
+ ('block_migration', None),
('disk_overcommit', True),
('wait', False),
]
@@ -4159,44 +4820,23 @@ class TestServerMigrate(TestServer):
result = self.cmd.take_action(parsed_args)
self.servers_mock.get.assert_called_with(self.server.id)
- self.server.live_migrate.assert_called_with(block_migration=False,
- disk_over_commit=True,
- host='fakehost')
+ self.server.live_migrate.assert_called_with(
+ block_migration=False,
+ disk_over_commit=True,
+ host=None)
self.assertNotCalled(self.servers_mock.migrate)
self.assertIsNone(result)
- def test_server_live_migrate_with_false_value_options(self):
+ def test_server_live_migrate_with_disk_overcommit_post_v224(self):
arglist = [
- '--live', 'fakehost', '--no-disk-overcommit',
- '--shared-migration', self.server.id,
- ]
- verifylist = [
- ('live', 'fakehost'),
- ('block_migration', False),
- ('disk_overcommit', False),
- ('wait', False),
- ]
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
- self.app.client_manager.compute.api_version = \
- api_versions.APIVersion('2.24')
-
- result = self.cmd.take_action(parsed_args)
-
- self.servers_mock.get.assert_called_with(self.server.id)
- self.server.live_migrate.assert_called_with(block_migration=False,
- disk_over_commit=False,
- host='fakehost')
- self.assertNotCalled(self.servers_mock.migrate)
- self.assertIsNone(result)
-
- def test_server_live_migrate_225(self):
- arglist = [
- '--live', 'fakehost', self.server.id,
+ '--live-migration',
+ '--disk-overcommit',
+ self.server.id,
]
verifylist = [
- ('live', 'fakehost'),
- ('block_migration', False),
+ ('live_migration', True),
+ ('block_migration', None),
+ ('disk_overcommit', True),
('wait', False),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -4204,13 +4844,21 @@ class TestServerMigrate(TestServer):
self.app.client_manager.compute.api_version = \
api_versions.APIVersion('2.25')
- result = self.cmd.take_action(parsed_args)
+ with mock.patch.object(self.cmd.log, 'warning') as mock_warning:
+ result = self.cmd.take_action(parsed_args)
self.servers_mock.get.assert_called_with(self.server.id)
- self.server.live_migrate.assert_called_with(block_migration=False,
- host='fakehost')
+ # There should be no 'disk_over_commit' value present
+ self.server.live_migrate.assert_called_with(
+ block_migration='auto',
+ host=None)
self.assertNotCalled(self.servers_mock.migrate)
self.assertIsNone(result)
+ # A warning should have been logged for using --disk-overcommit.
+ mock_warning.assert_called_once()
+ self.assertIn(
+ 'The --disk-overcommit and --no-disk-overcommit options ',
+ str(mock_warning.call_args[0][0]))
@mock.patch.object(common_utils, 'wait_for_status', return_value=True)
def test_server_migrate_with_wait(self, mock_wait_for_status):
@@ -4218,8 +4866,8 @@ class TestServerMigrate(TestServer):
'--wait', self.server.id,
]
verifylist = [
- ('live', None),
- ('block_migration', False),
+ ('live_migration', False),
+ ('block_migration', None),
('disk_overcommit', False),
('wait', True),
]
@@ -4238,8 +4886,8 @@ class TestServerMigrate(TestServer):
'--wait', self.server.id,
]
verifylist = [
- ('live', None),
- ('block_migration', False),
+ ('live_migration', False),
+ ('block_migration', None),
('disk_overcommit', False),
('wait', True),
]
@@ -4267,8 +4915,8 @@ class TestListMigration(TestServer):
self.server = compute_fakes.FakeServer.create_one_server()
self.servers_mock.get.return_value = self.server
- self.migrations = compute_fakes.FakeServerMigration\
- .create_server_migrations(count=3)
+ self.migrations = compute_fakes.FakeMigration.create_migrations(
+ count=3)
self.migrations_mock.list.return_value = self.migrations
self.data = (common_utils.get_item_properties(
@@ -4759,6 +5407,124 @@ class TestListMigrationV280(TestListMigration):
str(ex))
+class TestServerMigrationShow(TestServer):
+
+ def setUp(self):
+ super().setUp()
+
+ self.server = compute_fakes.FakeServer.create_one_server()
+ self.servers_mock.get.return_value = self.server
+
+ self.server_migration = compute_fakes.FakeServerMigration\
+ .create_one_server_migration()
+ self.server_migrations_mock.get.return_value = self.server_migration
+
+ self.columns = (
+ 'ID',
+ 'Server UUID',
+ 'Status',
+ 'Source Compute',
+ 'Source Node',
+ 'Dest Compute',
+ 'Dest Host',
+ 'Dest Node',
+ 'Memory Total Bytes',
+ 'Memory Processed Bytes',
+ 'Memory Remaining Bytes',
+ 'Disk Total Bytes',
+ 'Disk Processed Bytes',
+ 'Disk Remaining Bytes',
+ 'Created At',
+ 'Updated At',
+ )
+
+ self.data = (
+ self.server_migration.id,
+ self.server_migration.server_uuid,
+ self.server_migration.status,
+ self.server_migration.source_compute,
+ self.server_migration.source_node,
+ self.server_migration.dest_compute,
+ self.server_migration.dest_host,
+ self.server_migration.dest_node,
+ self.server_migration.memory_total_bytes,
+ self.server_migration.memory_processed_bytes,
+ self.server_migration.memory_remaining_bytes,
+ self.server_migration.disk_total_bytes,
+ self.server_migration.disk_processed_bytes,
+ self.server_migration.disk_remaining_bytes,
+ self.server_migration.created_at,
+ self.server_migration.updated_at,
+ )
+
+ # Get the command object to test
+ self.cmd = server.ShowMigration(self.app, None)
+
+ def _test_server_migration_show(self):
+ arglist = [
+ self.server.id,
+ '2', # arbitrary migration ID
+ ]
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ self.servers_mock.get.assert_called_with(self.server.id)
+ self.server_migrations_mock.get.assert_called_with(
+ self.server.id, '2',)
+
+ def test_server_migration_show(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.24')
+
+ self._test_server_migration_show()
+
+ def test_server_migration_show_v259(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.59')
+
+ self.columns += ('UUID',)
+ self.data += (self.server_migration.uuid,)
+
+ self._test_server_migration_show()
+
+ def test_server_migration_show_v280(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.80')
+
+ self.columns += ('UUID', 'User ID', 'Project ID')
+ self.data += (
+ self.server_migration.uuid,
+ self.server_migration.user_id,
+ self.server_migration.project_id,
+ )
+
+ self._test_server_migration_show()
+
+ def test_server_migration_show_pre_v224(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.23')
+
+ arglist = [
+ self.server.id,
+ '2', # arbitrary migration ID
+ ]
+ verifylist = []
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+ self.assertIn(
+ '--os-compute-api-version 2.24 or greater is required',
+ str(ex))
+
+
class TestServerMigrationAbort(TestServer):
def setUp(self):
@@ -6154,6 +6920,82 @@ class TestServerResizeConfirm(TestServer):
self.server.confirm_resize.assert_called_with()
+# TODO(stephenfin): Remove in OSC 7.0
+class TestServerMigrateConfirm(TestServer):
+
+ def setUp(self):
+ super().setUp()
+
+ methods = {
+ 'confirm_resize': None,
+ }
+ self.server = compute_fakes.FakeServer.create_one_server(
+ methods=methods)
+
+ # This is the return value for utils.find_resource()
+ self.servers_mock.get.return_value = self.server
+
+ self.servers_mock.confirm_resize.return_value = None
+
+ # Get the command object to test
+ self.cmd = server.MigrateConfirm(self.app, None)
+
+ def test_migrate_confirm(self):
+ arglist = [
+ self.server.id,
+ ]
+ verifylist = [
+ ('server', self.server.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ with mock.patch.object(self.cmd.log, 'warning') as mock_warning:
+ self.cmd.take_action(parsed_args)
+
+ self.servers_mock.get.assert_called_with(self.server.id)
+ self.server.confirm_resize.assert_called_with()
+
+ mock_warning.assert_called_once()
+ self.assertIn(
+ "The 'server migrate confirm' command has been deprecated",
+ str(mock_warning.call_args[0][0])
+ )
+
+
+class TestServerConfirmMigration(TestServerResizeConfirm):
+
+ def setUp(self):
+ super().setUp()
+
+ methods = {
+ 'confirm_resize': None,
+ }
+ self.server = compute_fakes.FakeServer.create_one_server(
+ methods=methods)
+
+ # This is the return value for utils.find_resource()
+ self.servers_mock.get.return_value = self.server
+
+ self.servers_mock.confirm_resize.return_value = None
+
+ # Get the command object to test
+ self.cmd = server.ConfirmMigration(self.app, None)
+
+ def test_migration_confirm(self):
+ arglist = [
+ self.server.id,
+ ]
+ verifylist = [
+ ('server', self.server.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ self.servers_mock.get.assert_called_with(self.server.id)
+ self.server.confirm_resize.assert_called_with()
+
+
class TestServerResizeRevert(TestServer):
def setUp(self):
@@ -6188,6 +7030,82 @@ class TestServerResizeRevert(TestServer):
self.server.revert_resize.assert_called_with()
+# TODO(stephenfin): Remove in OSC 7.0
+class TestServerMigrateRevert(TestServer):
+
+ def setUp(self):
+ super().setUp()
+
+ methods = {
+ 'revert_resize': None,
+ }
+ self.server = compute_fakes.FakeServer.create_one_server(
+ methods=methods)
+
+ # This is the return value for utils.find_resource()
+ self.servers_mock.get.return_value = self.server
+
+ self.servers_mock.revert_resize.return_value = None
+
+ # Get the command object to test
+ self.cmd = server.MigrateRevert(self.app, None)
+
+ def test_migrate_revert(self):
+ arglist = [
+ self.server.id,
+ ]
+ verifylist = [
+ ('server', self.server.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ with mock.patch.object(self.cmd.log, 'warning') as mock_warning:
+ self.cmd.take_action(parsed_args)
+
+ self.servers_mock.get.assert_called_with(self.server.id)
+ self.server.revert_resize.assert_called_with()
+
+ mock_warning.assert_called_once()
+ self.assertIn(
+ "The 'server migrate revert' command has been deprecated",
+ str(mock_warning.call_args[0][0])
+ )
+
+
+class TestServerRevertMigration(TestServer):
+
+ def setUp(self):
+ super().setUp()
+
+ methods = {
+ 'revert_resize': None,
+ }
+ self.server = compute_fakes.FakeServer.create_one_server(
+ methods=methods)
+
+ # This is the return value for utils.find_resource()
+ self.servers_mock.get.return_value = self.server
+
+ self.servers_mock.revert_resize.return_value = None
+
+ # Get the command object to test
+ self.cmd = server.RevertMigration(self.app, None)
+
+ def test_migration_revert(self):
+ arglist = [
+ self.server.id,
+ ]
+ verifylist = [
+ ('server', self.server.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ self.servers_mock.get.assert_called_with(self.server.id)
+ self.server.revert_resize.assert_called_with()
+
+
class TestServerRestore(TestServer):
def setUp(self):
@@ -6781,6 +7699,28 @@ class TestServerStart(TestServer):
def test_server_start_multi_servers(self):
self.run_method_with_servers('start', 3)
+ @mock.patch.object(common_utils, 'find_resource')
+ def test_server_start_with_all_projects(self, mock_find_resource):
+ servers = self.setup_servers_mock(count=1)
+ mock_find_resource.side_effect = compute_fakes.FakeServer.get_servers(
+ servers, 0,
+ )
+
+ arglist = [
+ servers[0].id,
+ '--all-projects',
+ ]
+ verifylist = [
+ ('server', [servers[0].id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ mock_find_resource.assert_called_once_with(
+ mock.ANY, servers[0].id, all_tenants=True,
+ )
+
class TestServerStop(TestServer):
@@ -6801,6 +7741,28 @@ class TestServerStop(TestServer):
def test_server_stop_multi_servers(self):
self.run_method_with_servers('stop', 3)
+ @mock.patch.object(common_utils, 'find_resource')
+ def test_server_start_with_all_projects(self, mock_find_resource):
+ servers = self.setup_servers_mock(count=1)
+ mock_find_resource.side_effect = compute_fakes.FakeServer.get_servers(
+ servers, 0,
+ )
+
+ arglist = [
+ servers[0].id,
+ '--all-projects',
+ ]
+ verifylist = [
+ ('server', [servers[0].id]),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ mock_find_resource.assert_called_once_with(
+ mock.ANY, servers[0].id, all_tenants=True,
+ )
+
class TestServerSuspend(TestServer):
diff --git a/openstackclient/tests/unit/compute/v2/test_server_event.py b/openstackclient/tests/unit/compute/v2/test_server_event.py
index 5c94891a..058a44d8 100644
--- a/openstackclient/tests/unit/compute/v2/test_server_event.py
+++ b/openstackclient/tests/unit/compute/v2/test_server_event.py
@@ -11,7 +11,12 @@
# 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 unittest import mock
+
+import iso8601
+from novaclient import api_versions
+from osc_lib import exceptions
from openstackclient.compute.v2 import server_event
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
@@ -113,6 +118,234 @@ class TestListServerEvent(TestServerEvent):
self.assertEqual(self.long_columns, columns)
self.assertEqual(self.long_data, tuple(data))
+ def test_server_event_list_with_changes_since(self):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.58')
+
+ arglist = [
+ '--changes-since', '2016-03-04T06:27:59Z',
+ self.fake_server.name,
+ ]
+ verifylist = [
+ ('server', self.fake_server.name),
+ ('changes_since', '2016-03-04T06:27:59Z'),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.servers_mock.get.assert_called_once_with(self.fake_server.name)
+ self.events_mock.list.assert_called_once_with(
+ self.fake_server.id, changes_since='2016-03-04T06:27:59Z')
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(tuple(self.data), tuple(data))
+
+ @mock.patch.object(iso8601, 'parse_date', side_effect=iso8601.ParseError)
+ def test_server_event_list_with_changes_since_invalid(
+ self, mock_parse_isotime,
+ ):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.58')
+
+ arglist = [
+ '--changes-since', 'Invalid time value',
+ self.fake_server.name,
+ ]
+ verifylist = [
+ ('server', self.fake_server.name),
+ ('changes_since', 'Invalid time value'),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+
+ self.assertIn(
+ 'Invalid changes-since value:', str(ex))
+ mock_parse_isotime.assert_called_once_with(
+ 'Invalid time value'
+ )
+
+ def test_server_event_list_with_changes_since_pre_v258(self):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.57')
+
+ arglist = [
+ '--changes-since', '2016-03-04T06:27:59Z',
+ self.fake_server.name,
+ ]
+ verifylist = [
+ ('server', self.fake_server.name),
+ ('changes_since', '2016-03-04T06:27:59Z'),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+
+ self.assertIn(
+ '--os-compute-api-version 2.58 or greater is required', str(ex))
+
+ def test_server_event_list_with_changes_before(self):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.66')
+
+ arglist = [
+ '--changes-before', '2016-03-04T06:27:59Z',
+ self.fake_server.name,
+ ]
+ verifylist = [
+ ('server', self.fake_server.name),
+ ('changes_before', '2016-03-04T06:27:59Z'),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.servers_mock.get.assert_called_once_with(self.fake_server.name)
+ self.events_mock.list.assert_called_once_with(
+ self.fake_server.id, changes_before='2016-03-04T06:27:59Z')
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(tuple(self.data), tuple(data))
+
+ @mock.patch.object(iso8601, 'parse_date', side_effect=iso8601.ParseError)
+ def test_server_event_list_with_changes_before_invalid(
+ self, mock_parse_isotime,
+ ):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.66')
+
+ arglist = [
+ '--changes-before', 'Invalid time value',
+ self.fake_server.name,
+ ]
+ verifylist = [
+ ('server', self.fake_server.name),
+ ('changes_before', 'Invalid time value'),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+
+ self.assertIn(
+ 'Invalid changes-before value:', str(ex))
+ mock_parse_isotime.assert_called_once_with(
+ 'Invalid time value'
+ )
+
+ def test_server_event_list_with_changes_before_pre_v266(self):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.65')
+
+ arglist = [
+ '--changes-before', '2016-03-04T06:27:59Z',
+ self.fake_server.name,
+ ]
+ verifylist = [
+ ('server', self.fake_server.name),
+ ('changes_before', '2016-03-04T06:27:59Z'),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+
+ self.assertIn(
+ '--os-compute-api-version 2.66 or greater is required', str(ex))
+
+ def test_server_event_list_with_limit(self):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.58')
+
+ arglist = [
+ '--limit', '1',
+ self.fake_server.name,
+ ]
+ verifylist = [
+ ('limit', 1),
+ ('server', self.fake_server.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.cmd.take_action(parsed_args)
+
+ self.events_mock.list.assert_called_once_with(
+ self.fake_server.id, limit=1)
+
+ def test_server_event_list_with_limit_pre_v258(self):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.57')
+
+ arglist = [
+ '--limit', '1',
+ self.fake_server.name,
+ ]
+ verifylist = [
+ ('limit', 1),
+ ('server', self.fake_server.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+
+ self.assertIn(
+ '--os-compute-api-version 2.58 or greater is required', str(ex))
+
+ def test_server_event_list_with_marker(self):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.58')
+
+ arglist = [
+ '--marker', 'test_event',
+ self.fake_server.name,
+ ]
+ verifylist = [
+ ('marker', 'test_event'),
+ ('server', self.fake_server.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.cmd.take_action(parsed_args)
+
+ self.events_mock.list.assert_called_once_with(
+ self.fake_server.id, marker='test_event')
+
+ def test_server_event_list_with_marker_pre_v258(self):
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.57')
+
+ arglist = [
+ '--marker', 'test_event',
+ self.fake_server.name,
+ ]
+ verifylist = [
+ ('marker', 'test_event'),
+ ('server', self.fake_server.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ ex = self.assertRaises(
+ exceptions.CommandError,
+ self.cmd.take_action,
+ parsed_args)
+
+ self.assertIn(
+ '--os-compute-api-version 2.58 or greater is required', str(ex))
+
class TestShowServerEvent(TestServerEvent):
diff --git a/openstackclient/tests/unit/compute/v2/test_server_group.py b/openstackclient/tests/unit/compute/v2/test_server_group.py
index 732c1881..3ed19e27 100644
--- a/openstackclient/tests/unit/compute/v2/test_server_group.py
+++ b/openstackclient/tests/unit/compute/v2/test_server_group.py
@@ -326,10 +326,13 @@ class TestServerGroupList(TestServerGroup):
verifylist = [
('all_projects', False),
('long', False),
+ ('limit', None),
+ ('offset', None),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
- self.server_groups_mock.list.assert_called_once_with(False)
+
+ self.server_groups_mock.list.assert_called_once_with()
self.assertCountEqual(self.list_columns, columns)
self.assertCountEqual(self.list_data, tuple(data))
@@ -342,14 +345,49 @@ class TestServerGroupList(TestServerGroup):
verifylist = [
('all_projects', True),
('long', True),
+ ('limit', None),
+ ('offset', None),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
- self.server_groups_mock.list.assert_called_once_with(True)
+ self.server_groups_mock.list.assert_called_once_with(
+ all_projects=True)
self.assertCountEqual(self.list_columns_long, columns)
self.assertCountEqual(self.list_data_long, tuple(data))
+ def test_server_group_list_with_limit(self):
+ arglist = [
+ '--limit', '1',
+ ]
+ verifylist = [
+ ('all_projects', False),
+ ('long', False),
+ ('limit', 1),
+ ('offset', None),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.cmd.take_action(parsed_args)
+
+ self.server_groups_mock.list.assert_called_once_with(limit=1)
+
+ def test_server_group_list_with_offset(self):
+ arglist = [
+ '--offset', '5',
+ ]
+ verifylist = [
+ ('all_projects', False),
+ ('long', False),
+ ('limit', None),
+ ('offset', 5),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.cmd.take_action(parsed_args)
+
+ self.server_groups_mock.list.assert_called_once_with(offset=5)
+
class TestServerGroupListV264(TestServerGroupV264):
@@ -400,7 +438,7 @@ class TestServerGroupListV264(TestServerGroupV264):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
- self.server_groups_mock.list.assert_called_once_with(False)
+ self.server_groups_mock.list.assert_called_once_with()
self.assertCountEqual(self.list_columns, columns)
self.assertCountEqual(self.list_data, tuple(data))
@@ -416,7 +454,8 @@ class TestServerGroupListV264(TestServerGroupV264):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
- self.server_groups_mock.list.assert_called_once_with(True)
+ self.server_groups_mock.list.assert_called_once_with(
+ all_projects=True)
self.assertCountEqual(self.list_columns_long, columns)
self.assertCountEqual(self.list_data_long, tuple(data))
diff --git a/openstackclient/tests/unit/network/v2/test_network_rbac.py b/openstackclient/tests/unit/network/v2/test_network_rbac.py
index d7c71ea7..08be64c5 100644
--- a/openstackclient/tests/unit/network/v2/test_network_rbac.py
+++ b/openstackclient/tests/unit/network/v2/test_network_rbac.py
@@ -42,6 +42,7 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
sg_object = network_fakes.FakeNetworkSecGroup.create_one_security_group()
as_object = network_fakes.FakeAddressScope.create_one_address_scope()
snp_object = network_fakes.FakeSubnetPool.create_one_subnet_pool()
+ ag_object = network_fakes.FakeAddressGroup.create_one_address_group()
project = identity_fakes_v3.FakeProject.create_one_project()
rbac_policy = network_fakes.FakeNetworkRBAC.create_one_network_rbac(
attrs={'tenant_id': project.id,
@@ -85,6 +86,8 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
return_value=self.as_object)
self.network.find_subnet_pool = mock.Mock(
return_value=self.snp_object)
+ self.network.find_address_group = mock.Mock(
+ return_value=self.ag_object)
self.projects_mock.get.return_value = self.project
def test_network_rbac_create_no_type(self):
@@ -236,7 +239,8 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
('qos_policy', "qos_object"),
('security_group', "sg_object"),
('subnetpool', "snp_object"),
- ('address_scope', "as_object")
+ ('address_scope', "as_object"),
+ ('address_group', "ag_object")
)
@ddt.unpack
def test_network_rbac_create_object(self, obj_type, obj_fake_attr):
diff --git a/openstackclient/tests/unit/network/v2/test_port.py b/openstackclient/tests/unit/network/v2/test_port.py
index c8bced71..8c5158d7 100644
--- a/openstackclient/tests/unit/network/v2/test_port.py
+++ b/openstackclient/tests/unit/network/v2/test_port.py
@@ -1250,6 +1250,26 @@ class TestListPort(TestPort):
self.assertEqual(self.columns, columns)
self.assertItemsEqual(self.data, list(data))
+ def test_port_list_name(self):
+ test_name = "fakename"
+ arglist = [
+ '--name', test_name,
+ ]
+ verifylist = [
+ ('name', test_name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = self.cmd.take_action(parsed_args)
+ filters = {
+ 'name': test_name,
+ 'fields': LIST_FIELDS_TO_RETRIEVE,
+ }
+
+ self.network.ports.assert_called_once_with(**filters)
+ self.assertEqual(self.columns, columns)
+ self.assertItemsEqual(self.data, list(data))
+
def test_list_with_tag_options(self):
arglist = [
'--tags', 'red,blue',
diff --git a/openstackclient/tests/unit/network/v2/test_subnet.py b/openstackclient/tests/unit/network/v2/test_subnet.py
index 1b4bfdad..6085cda8 100644
--- a/openstackclient/tests/unit/network/v2/test_subnet.py
+++ b/openstackclient/tests/unit/network/v2/test_subnet.py
@@ -1264,6 +1264,7 @@ class TestUnsetSubnet(TestSubnet):
'end': '8.8.8.170'}],
'service_types': ['network:router_gateway',
'network:floatingip_agent_gateway'],
+ 'gateway_ip': 'fe80::a00a:0:c0de:0:1',
'tags': ['green', 'red'], })
self.network.find_subnet = mock.Mock(return_value=self._testsubnet)
self.network.update_subnet = mock.Mock(return_value=None)
@@ -1277,6 +1278,7 @@ class TestUnsetSubnet(TestSubnet):
'--host-route', 'destination=10.30.30.30/24,gateway=10.30.30.1',
'--allocation-pool', 'start=8.8.8.100,end=8.8.8.150',
'--service-type', 'network:router_gateway',
+ '--gateway',
self._testsubnet.name,
]
verifylist = [
@@ -1286,6 +1288,7 @@ class TestUnsetSubnet(TestSubnet):
('allocation_pools', [{
'start': '8.8.8.100', 'end': '8.8.8.150'}]),
('service_types', ['network:router_gateway']),
+ ('gateway', True),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -1297,6 +1300,7 @@ class TestUnsetSubnet(TestSubnet):
"destination": "10.20.20.0/24", "nexthop": "10.20.20.1"}],
'allocation_pools': [{'start': '8.8.8.160', 'end': '8.8.8.170'}],
'service_types': ['network:floatingip_agent_gateway'],
+ 'gateway_ip': None,
}
self.network.update_subnet.assert_called_once_with(
self._testsubnet, **attrs)