summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/server.py28
-rw-r--r--openstackclient/tests/functional/network/v2/test_floating_ip.py120
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py54
3 files changed, 145 insertions, 57 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 9ba91812..538c9c4f 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -2811,12 +2811,32 @@ class UnshelveServer(command.Command):
nargs='+',
help=_('Server(s) to unshelve (name or ID)'),
)
+ parser.add_argument(
+ '--availability-zone',
+ default=None,
+ help=_('Name of the availability zone in which to unshelve a '
+ 'SHELVED_OFFLOADED server (supported by '
+ '--os-compute-api-version 2.77 or above)'),
+ )
return parser
def take_action(self, parsed_args):
compute_client = self.app.client_manager.compute
+ support_az = compute_client.api_version >= api_versions.APIVersion(
+ '2.77')
+ if not support_az and parsed_args.availability_zone:
+ msg = _("--os-compute-api-version 2.77 or greater is required "
+ "to support the '--availability-zone' option.")
+ raise exceptions.CommandError(msg)
+
for server in parsed_args.server:
- utils.find_resource(
- compute_client.servers,
- server,
- ).unshelve()
+ if support_az:
+ utils.find_resource(
+ compute_client.servers,
+ server
+ ).unshelve(availability_zone=parsed_args.availability_zone)
+ else:
+ utils.find_resource(
+ compute_client.servers,
+ server,
+ ).unshelve()
diff --git a/openstackclient/tests/functional/network/v2/test_floating_ip.py b/openstackclient/tests/functional/network/v2/test_floating_ip.py
index f189c2da..9d109f87 100644
--- a/openstackclient/tests/functional/network/v2/test_floating_ip.py
+++ b/openstackclient/tests/functional/network/v2/test_floating_ip.py
@@ -24,12 +24,9 @@ class FloatingIpTests(common.NetworkTests):
def setUpClass(cls):
common.NetworkTests.setUpClass()
if cls.haz_network:
+ # Create common networks that all tests share
cls.EXTERNAL_NETWORK_NAME = uuid.uuid4().hex
- cls.EXTERNAL_SUBNET_NAME = uuid.uuid4().hex
cls.PRIVATE_NETWORK_NAME = uuid.uuid4().hex
- cls.PRIVATE_SUBNET_NAME = uuid.uuid4().hex
- cls.ROUTER = uuid.uuid4().hex
- cls.PORT_NAME = uuid.uuid4().hex
# Create a network for the floating ip
json_output = json.loads(cls.openstack(
@@ -46,57 +43,11 @@ class FloatingIpTests(common.NetworkTests):
))
cls.private_network_id = json_output["id"]
- # Try random subnet range for subnet creating
- # Because we can not determine ahead of time what subnets are
- # already in use, possibly by another test running in parallel,
- # try 4 times
- for i in range(4):
- # Make a random subnet
- cls.external_subnet = ".".join(map(
- str,
- (random.randint(0, 223) for _ in range(3))
- )) + ".0/26"
- cls.private_subnet = ".".join(map(
- str,
- (random.randint(0, 223) for _ in range(3))
- )) + ".0/26"
- try:
- # Create a subnet for the network
- json_output = json.loads(cls.openstack(
- 'subnet create -f json ' +
- '--network ' + cls.EXTERNAL_NETWORK_NAME + ' ' +
- '--subnet-range ' + cls.external_subnet + ' ' +
- cls.EXTERNAL_SUBNET_NAME
- ))
- cls.external_subnet_id = json_output["id"]
- # Create a subnet for the private network
- json_output = json.loads(cls.openstack(
- 'subnet create -f json ' +
- '--network ' + cls.PRIVATE_NETWORK_NAME + ' ' +
- '--subnet-range ' + cls.private_subnet + ' ' +
- cls.PRIVATE_SUBNET_NAME
- ))
- cls.private_subnet_id = json_output["id"]
- except Exception:
- if (i == 3):
- # raise the exception at the last time
- raise
- pass
- else:
- # break and no longer retry if create successfully
- break
-
@classmethod
def tearDownClass(cls):
try:
if cls.haz_network:
del_output = cls.openstack(
- 'subnet delete ' +
- cls.EXTERNAL_SUBNET_NAME + ' ' +
- cls.PRIVATE_SUBNET_NAME
- )
- cls.assertOutput('', del_output)
- del_output = cls.openstack(
'network delete ' +
cls.EXTERNAL_NETWORK_NAME + ' ' +
cls.PRIVATE_NETWORK_NAME
@@ -114,11 +65,50 @@ class FloatingIpTests(common.NetworkTests):
# Verify setup
self.assertIsNotNone(self.external_network_id)
self.assertIsNotNone(self.private_network_id)
- self.assertIsNotNone(self.external_subnet_id)
- self.assertIsNotNone(self.private_subnet_id)
+
+ def _create_subnet(self, network_name, subnet_name):
+ subnet_id = None
+
+ # Try random subnet range for subnet creating
+ # Because we can not determine ahead of time what subnets are
+ # already in use, possibly by another test running in parallel,
+ # try 4 times
+ for i in range(4):
+ # Make a random subnet
+ subnet = ".".join(map(
+ str,
+ (random.randint(0, 223) for _ in range(3))
+ )) + ".0/26"
+ try:
+ # Create a subnet for the network
+ json_output = json.loads(self.openstack(
+ 'subnet create -f json ' +
+ '--network ' + network_name + ' ' +
+ '--subnet-range ' + subnet + ' ' +
+ subnet_name
+ ))
+ self.assertIsNotNone(json_output["id"])
+ subnet_id = json_output["id"]
+ except Exception:
+ if (i == 3):
+ # raise the exception at the last time
+ raise
+ pass
+ else:
+ # break and no longer retry if create successfully
+ break
+ return subnet_id
def test_floating_ip_delete(self):
"""Test create, delete multiple"""
+
+ # Subnets must exist even if not directly referenced here
+ ext_subnet_id = self._create_subnet(
+ self.EXTERNAL_NETWORK_NAME,
+ "ext-test-delete"
+ )
+ self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id)
+
json_output = json.loads(self.openstack(
'floating ip create -f json ' +
'--description aaaa ' +
@@ -151,6 +141,14 @@ class FloatingIpTests(common.NetworkTests):
def test_floating_ip_list(self):
"""Test create defaults, list filters, delete"""
+
+ # Subnets must exist even if not directly referenced here
+ ext_subnet_id = self._create_subnet(
+ self.EXTERNAL_NETWORK_NAME,
+ "ext-test-delete"
+ )
+ self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id)
+
json_output = json.loads(self.openstack(
'floating ip create -f json ' +
'--description aaaa ' +
@@ -237,6 +235,22 @@ class FloatingIpTests(common.NetworkTests):
def test_floating_ip_set_and_unset_port(self):
"""Test Floating IP Set and Unset port"""
+
+ # Subnets must exist even if not directly referenced here
+ ext_subnet_id = self._create_subnet(
+ self.EXTERNAL_NETWORK_NAME,
+ "ext-test-delete"
+ )
+ self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id)
+ priv_subnet_id = self._create_subnet(
+ self.PRIVATE_NETWORK_NAME,
+ "priv-test-delete"
+ )
+ self.addCleanup(self.openstack, 'subnet delete ' + priv_subnet_id)
+
+ self.ROUTER = uuid.uuid4().hex
+ self.PORT_NAME = uuid.uuid4().hex
+
json_output = json.loads(self.openstack(
'floating ip create -f json ' +
'--description aaaa ' +
@@ -253,7 +267,7 @@ class FloatingIpTests(common.NetworkTests):
json_output = json.loads(self.openstack(
'port create -f json ' +
'--network ' + self.PRIVATE_NETWORK_NAME + ' ' +
- '--fixed-ip subnet=' + self.PRIVATE_SUBNET_NAME + ' ' +
+ '--fixed-ip subnet=' + priv_subnet_id + ' ' +
self.PORT_NAME
))
self.assertIsNotNone(json_output["id"])
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index 0793116a..5c98188a 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -109,6 +109,10 @@ class TestServer(compute_fakes.TestComputev2):
version = self.app.client_manager.compute.api_version
if version >= api_versions.APIVersion('2.73'):
method.assert_called_with(reason=None)
+ elif method_name == 'unshelve':
+ version = self.app.client_manager.compute.api_version
+ if version >= api_versions.APIVersion('2.77'):
+ method.assert_called_with(availability_zone=None)
else:
method.assert_called_with()
else:
@@ -4777,6 +4781,56 @@ class TestServerUnshelve(TestServer):
def test_unshelve_multi_servers(self):
self.run_method_with_servers('unshelve', 3)
+ def test_unshelve_server_with_specified_az(self):
+ server = compute_fakes.FakeServer.create_one_server()
+ arglist = [
+ server.id,
+ '--availability-zone', "foo-az",
+ ]
+ verifylist = [
+ ('availability_zone', "foo-az"),
+ ('server', [server.id])
+ ]
+ 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.77 or greater is required', str(ex))
+
+
+class TestServerUnshelveV277(TestServerUnshelve):
+
+ def setUp(self):
+ super(TestServerUnshelveV277, self).setUp()
+
+ self.server = compute_fakes.FakeServer.create_one_server(
+ methods=self.methods)
+
+ # This is the return value for utils.find_resource()
+ self.servers_mock.get.return_value = self.server
+
+ # Get the command object to test
+ self.cmd = server.UnshelveServer(self.app, None)
+
+ def test_specified_az_to_unshelve_with_v277(self):
+ self.app.client_manager.compute.api_version = api_versions.APIVersion(
+ '2.77')
+
+ arglist = [
+ '--availability-zone', "foo-az",
+ self.server.id,
+ ]
+ verifylist = [
+ ('availability_zone', "foo-az"),
+ ('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.unshelve.assert_called_with(availability_zone="foo-az")
+
class TestServerGeneral(TestServer):
OLD = {