Support dry-run option for auto-allocated-topology
Add the ability to pass fields with the auto-allocated-topology-show command to support the dry-run validation option of the API. With dry-run the CLI result is "Pass" or the error message from the response. Rename the client binding from show_ to get_. Also provide a client binding for validating the auto-allocation requirements. Partially-Implements: blueprint get-me-a-network DocImpact: Add info about dry-run to the auto-allocate section in the networking guide. Change-Id: Ieba6f3cde23a8a93067b8239b096d5103f6a3128
This commit is contained in:
parent
928ed81773
commit
d3f13f4c20
neutronclient
@ -19,6 +19,7 @@ from cliff import show
|
|||||||
from oslo_serialization import jsonutils
|
from oslo_serialization import jsonutils
|
||||||
|
|
||||||
from neutronclient._i18n import _
|
from neutronclient._i18n import _
|
||||||
|
from neutronclient.common import exceptions
|
||||||
from neutronclient.neutron import v2_0
|
from neutronclient.neutron import v2_0
|
||||||
|
|
||||||
|
|
||||||
@ -29,6 +30,11 @@ class ShowAutoAllocatedTopology(v2_0.NeutronCommand, show.ShowOne):
|
|||||||
|
|
||||||
def get_parser(self, prog_name):
|
def get_parser(self, prog_name):
|
||||||
parser = super(ShowAutoAllocatedTopology, self).get_parser(prog_name)
|
parser = super(ShowAutoAllocatedTopology, self).get_parser(prog_name)
|
||||||
|
parser.add_argument(
|
||||||
|
'--dry-run',
|
||||||
|
help=_('Validate the requirements for auto-allocated-topology. '
|
||||||
|
'(Does not return a topology.)'),
|
||||||
|
action='store_true')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--tenant-id', metavar='tenant-id',
|
'--tenant-id', metavar='tenant-id',
|
||||||
help=_('The owner tenant ID.'))
|
help=_('The owner tenant ID.'))
|
||||||
@ -44,8 +50,16 @@ class ShowAutoAllocatedTopology(v2_0.NeutronCommand, show.ShowOne):
|
|||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
client = self.get_client()
|
client = self.get_client()
|
||||||
|
extra_values = v2_0.parse_args_to_dict(self.values_specs)
|
||||||
|
if extra_values:
|
||||||
|
raise exceptions.CommandError(
|
||||||
|
_("Invalid argument(s): --%s") % ', --'.join(extra_values))
|
||||||
tenant_id = parsed_args.tenant_id or parsed_args.pos_tenant_id
|
tenant_id = parsed_args.tenant_id or parsed_args.pos_tenant_id
|
||||||
data = client.show_auto_allocated_topology(tenant_id)
|
if parsed_args.dry_run:
|
||||||
|
data = client.validate_auto_allocated_topology_requirements(
|
||||||
|
tenant_id)
|
||||||
|
else:
|
||||||
|
data = client.get_auto_allocated_topology(tenant_id)
|
||||||
if self.resource in data:
|
if self.resource in data:
|
||||||
for k, v in data[self.resource].items():
|
for k, v in data[self.resource].items():
|
||||||
if isinstance(v, list):
|
if isinstance(v, list):
|
||||||
@ -58,6 +72,8 @@ class ShowAutoAllocatedTopology(v2_0.NeutronCommand, show.ShowOne):
|
|||||||
else:
|
else:
|
||||||
value += str(_item)
|
value += str(_item)
|
||||||
data[self.resource][k] = value
|
data[self.resource][k] = value
|
||||||
|
elif v == "dry-run=pass":
|
||||||
|
return ("dry-run",), ("pass",)
|
||||||
elif v is None:
|
elif v is None:
|
||||||
data[self.resource][k] = ''
|
data[self.resource][k] = ''
|
||||||
return zip(*sorted(data[self.resource].items()))
|
return zip(*sorted(data[self.resource].items()))
|
||||||
|
@ -39,3 +39,17 @@ class TestAutoAllocatedTopologyJSON(test_cli20.CLITestV20Base):
|
|||||||
cmd = aat.ShowAutoAllocatedTopology(test_cli20.MyApp(sys.stdout), None)
|
cmd = aat.ShowAutoAllocatedTopology(test_cli20.MyApp(sys.stdout), None)
|
||||||
args = []
|
args = []
|
||||||
self._test_show_resource(resource, cmd, "None", args)
|
self._test_show_resource(resource, cmd, "None", args)
|
||||||
|
|
||||||
|
def test_show_auto_allocated_topology_dry_run_as_tenant(self):
|
||||||
|
resource = 'auto_allocated_topology'
|
||||||
|
cmd = aat.ShowAutoAllocatedTopology(test_cli20.MyApp(sys.stdout), None)
|
||||||
|
args = ['--dry-run']
|
||||||
|
self._test_show_resource(resource, cmd, "None", args,
|
||||||
|
fields=('dry-run',))
|
||||||
|
|
||||||
|
def test_show_auto_allocated_topology_dry_run_as_admin(self):
|
||||||
|
resource = 'auto_allocated_topology'
|
||||||
|
cmd = aat.ShowAutoAllocatedTopology(test_cli20.MyApp(sys.stdout), None)
|
||||||
|
args = ['--dry-run', 'some-tenant']
|
||||||
|
self._test_show_resource(resource, cmd, "some-tenant", args,
|
||||||
|
fields=('dry-run',))
|
||||||
|
@ -1902,12 +1902,16 @@ class Client(ClientBase):
|
|||||||
retrieve_all, **_params)
|
retrieve_all, **_params)
|
||||||
|
|
||||||
@APIParamsCall
|
@APIParamsCall
|
||||||
def show_auto_allocated_topology(self, tenant_id, **_params):
|
def get_auto_allocated_topology(self, tenant_id, **_params):
|
||||||
"""Fetch information about a tenant's auto-allocated topology."""
|
"""Fetch information about a tenant's auto-allocated topology."""
|
||||||
return self.get(
|
return self.get(
|
||||||
self.auto_allocated_topology_path % tenant_id,
|
self.auto_allocated_topology_path % tenant_id,
|
||||||
params=_params)
|
params=_params)
|
||||||
|
|
||||||
|
def validate_auto_allocated_topology_requirements(self, tenant_id):
|
||||||
|
"""Validate requirements for getting an auto-allocated topology."""
|
||||||
|
return self.get_auto_allocated_topology(tenant_id, fields=['dry-run'])
|
||||||
|
|
||||||
@APIParamsCall
|
@APIParamsCall
|
||||||
def list_bgp_speakers(self, retrieve_all=True, **_params):
|
def list_bgp_speakers(self, retrieve_all=True, **_params):
|
||||||
"""Fetches a list of all BGP speakers for a tenant."""
|
"""Fetches a list of all BGP speakers for a tenant."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user