From a7975c42003d7df2af91154007435cd5f8560f24 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Wed, 26 Oct 2022 13:24:30 +0300 Subject: [PATCH] compute: Add '--no-network', '--auto-network' flags These are aliases for '--nic none' and '--nic auto', respectively. Change-Id: I7b4f7e5c3769a813bd8b2b9cd6090c6fe501e13d Signed-off-by: Stephen Finucane --- openstackclient/compute/v2/server.py | 110 ++++++++++++++---- .../tests/unit/compute/v2/test_server.py | 58 ++++++--- ...o-no-network-options-f4ddb2bb7544d2f5.yaml | 6 + 3 files changed, 136 insertions(+), 38 deletions(-) create mode 100644 releasenotes/notes/auto-no-network-options-f4ddb2bb7544d2f5.yaml diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 1d0c03a270..39b2bdc81e 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -409,8 +409,8 @@ class AddPort(command.Command): '--tag', metavar='', help=_( - "Tag for the attached interface. " - "(Supported by API versions '2.49' - '2.latest')" + 'Tag for the attached interface ' + '(supported by --os-compute-api-version 2.49 or later)' ) ) return parser @@ -652,29 +652,68 @@ class AddServerVolume(command.ShowOne): ) -# TODO(stephenfin): Replace with 'MultiKeyValueAction' when we no longer -# support '--nic=auto' and '--nic=none' +class NoneNICAction(argparse.Action): + + def __init__(self, option_strings, dest, help=None): + super().__init__( + option_strings=option_strings, + dest=dest, + nargs=0, + default=[], + required=False, + help=help, + ) + + def __call__(self, parser, namespace, values, option_string=None): + # Make sure we have an empty dict rather than None + if getattr(namespace, self.dest, None) is None: + setattr(namespace, self.dest, []) + + getattr(namespace, self.dest).append('none') + + +class AutoNICAction(argparse.Action): + + def __init__(self, option_strings, dest, help=None): + super().__init__( + option_strings=option_strings, + dest=dest, + nargs=0, + default=[], + required=False, + help=help, + ) + + def __call__(self, parser, namespace, values, option_string=None): + # Make sure we have an empty dict rather than None + if getattr(namespace, self.dest, None) is None: + setattr(namespace, self.dest, []) + + getattr(namespace, self.dest).append('auto') + + class NICAction(argparse.Action): def __init__( self, option_strings, dest, - nargs=None, - const=None, - default=None, - type=None, - choices=None, - required=False, help=None, metavar=None, key=None, ): self.key = key super().__init__( - option_strings=option_strings, dest=dest, nargs=nargs, const=const, - default=default, type=type, choices=choices, required=required, - help=help, metavar=metavar, + option_strings=option_strings, + dest=dest, + nargs=None, + const=None, + default=[], + type=None, + choices=None, + required=False, + help=help, + metavar=metavar, ) def __call__(self, parser, namespace, values, option_string=None): @@ -707,7 +746,7 @@ class NICAction(argparse.Action): } for kv_str in values.split(','): - k, sep, v = kv_str.partition("=") + k, sep, v = kv_str.partition('=') if k not in list(info) + ['tag'] or not v: msg = _( @@ -998,28 +1037,23 @@ class CreateServer(command.ShowOne): ) parser.add_argument( '--network', - metavar="", + metavar='', dest='nics', - default=[], action=NICAction, key='net-id', - # NOTE(RuiChen): Add '\n' to the end of line to improve formatting; - # see cliff's _SmartHelpFormatter for more details. help=_( "Create a NIC on the server and connect it to network. " "Specify option multiple times to create multiple NICs. " "This is a wrapper for the '--nic net-id=' " "parameter that provides simple syntax for the standard " "use case of connecting a new server to a given network. " - "For more advanced use cases, refer to the '--nic' " - "parameter." + "For more advanced use cases, refer to the '--nic' parameter." ), ) parser.add_argument( '--port', - metavar="", + metavar='', dest='nics', - default=[], action=NICAction, key='port-id', help=_( @@ -1031,13 +1065,41 @@ class CreateServer(command.ShowOne): "more advanced use cases, refer to the '--nic' parameter." ), ) + parser.add_argument( + '--no-network', + dest='nics', + action=NoneNICAction, + help=_( + "Do not attach a network to the server. " + "This is a wrapper for the '--nic none' option that provides " + "a simple syntax for disabling network connectivity for a new " + "server. " + "For more advanced use cases, refer to the '--nic' parameter. " + "(supported by --os-compute-api-version 2.37 or above)" + ), + ) + parser.add_argument( + '--auto-network', + dest='nics', + action=AutoNICAction, + help=_( + "Automatically allocate a network to the server. " + "This is the default network allocation policy. " + "This is a wrapper for the '--nic auto' option that provides " + "a simple syntax for enabling automatic configuration of " + "network connectivity for a new server. " + "For more advanced use cases, refer to the '--nic' parameter. " + "(supported by --os-compute-api-version 2.37 or above)" + ), + ) parser.add_argument( '--nic', metavar="", - action=NICAction, dest='nics', - default=[], + action=NICAction, + # NOTE(RuiChen): Add '\n' to the end of line to improve formatting; + # see cliff's _SmartHelpFormatter for more details. help=_( "Create a NIC on the server.\n" "NIC in the format:\n" diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 2e64e071e5..f4fd44b17b 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -1900,13 +1900,7 @@ class TestServerCreate(TestServer): self.assertRaises( exceptions.CommandError, self.cmd.take_action, parsed_args) - def test_server_create_with_auto_network(self): - arglist = [ - '--image', 'image1', - '--flavor', 'flavor1', - '--nic', 'auto', - self.new_server.name, - ] + def _test_server_create_with_auto_network(self, arglist): verifylist = [ ('image', 'image1'), ('flavor', 'flavor1'), @@ -1946,6 +1940,27 @@ class TestServerCreate(TestServer): self.assertEqual(self.columns, columns) self.assertEqual(self.datalist(), data) + # NOTE(stephenfin): '--auto-network' is an alias for '--nic auto' so the + # tests are nearly identical + + def test_server_create_with_auto_network_legacy(self): + arglist = [ + '--image', 'image1', + '--flavor', 'flavor1', + '--nic', 'auto', + self.new_server.name, + ] + self._test_server_create_with_auto_network(arglist) + + def test_server_create_with_auto_network(self): + arglist = [ + '--image', 'image1', + '--flavor', 'flavor1', + '--auto-network', + self.new_server.name, + ] + self._test_server_create_with_auto_network(arglist) + def test_server_create_with_auto_network_default_v2_37(self): """Tests creating a server without specifying --nic using 2.37.""" arglist = [ @@ -1996,13 +2011,7 @@ class TestServerCreate(TestServer): self.assertEqual(self.columns, columns) self.assertEqual(self.datalist(), data) - def test_server_create_with_none_network(self): - arglist = [ - '--image', 'image1', - '--flavor', 'flavor1', - '--nic', 'none', - self.new_server.name, - ] + def _test_server_create_with_none_network(self, arglist): verifylist = [ ('image', 'image1'), ('flavor', 'flavor1'), @@ -2042,6 +2051,27 @@ class TestServerCreate(TestServer): self.assertEqual(self.columns, columns) self.assertEqual(self.datalist(), data) + # NOTE(stephenfin): '--no-network' is an alias for '--nic none' so the + # tests are nearly identical + + def test_server_create_with_none_network_legacy(self): + arglist = [ + '--image', 'image1', + '--flavor', 'flavor1', + '--nic', 'none', + self.new_server.name, + ] + self._test_server_create_with_none_network(arglist) + + def test_server_create_with_none_network(self): + arglist = [ + '--image', 'image1', + '--flavor', 'flavor1', + '--no-network', + self.new_server.name, + ] + self._test_server_create_with_none_network(arglist) + def test_server_create_with_conflict_network_options(self): arglist = [ '--image', 'image1', diff --git a/releasenotes/notes/auto-no-network-options-f4ddb2bb7544d2f5.yaml b/releasenotes/notes/auto-no-network-options-f4ddb2bb7544d2f5.yaml new file mode 100644 index 0000000000..3123d775a7 --- /dev/null +++ b/releasenotes/notes/auto-no-network-options-f4ddb2bb7544d2f5.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + The ``server create`` command now accepts two new options, ``--no-network`` + and ``--auto-network``. These are aliases for ``--nic none`` and + ``--nic auto``, respectively.