From 1084b51e75bc6ba278705ecbee771359e6e3bff4 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 21 Nov 2013 09:10:41 -0700 Subject: [PATCH 01/66] bp/neturon --- openstackclient/common/clientmanager.py | 2 + openstackclient/network/__init__.py | 14 ++ openstackclient/network/client.py | 47 ++++++ openstackclient/network/v2_0/__init__.py | 14 ++ openstackclient/network/v2_0/network.py | 152 ++++++++++++++++++ openstackclient/shell.py | 11 ++ openstackclient/tests/fakes.py | 1 + openstackclient/tests/network/test_client.py | 51 ++++++ .../tests/network/v2_0/test_network.py | 30 ++++ openstackclient/tests/test_shell.py | 11 +- setup.cfg | 72 +++++++++ 11 files changed, 403 insertions(+), 2 deletions(-) create mode 100644 openstackclient/network/__init__.py create mode 100644 openstackclient/network/client.py create mode 100644 openstackclient/network/v2_0/__init__.py create mode 100644 openstackclient/network/v2_0/network.py create mode 100644 openstackclient/tests/network/test_client.py create mode 100644 openstackclient/tests/network/v2_0/test_network.py diff --git a/openstackclient/common/clientmanager.py b/openstackclient/common/clientmanager.py index 85f544e4dc..aa7fcba5ac 100644 --- a/openstackclient/common/clientmanager.py +++ b/openstackclient/common/clientmanager.py @@ -20,6 +20,7 @@ from openstackclient.compute import client as compute_client from openstackclient.identity import client as identity_client from openstackclient.image import client as image_client +from openstackclient.network import client as network_client from openstackclient.object import client as object_client from openstackclient.volume import client as volume_client @@ -47,6 +48,7 @@ class ClientManager(object): image = ClientCache(image_client.make_client) object = ClientCache(object_client.make_client) volume = ClientCache(volume_client.make_client) + neutron = ClientCache(network_client.make_client) def __init__(self, token=None, url=None, auth_url=None, project_name=None, project_id=None, username=None, password=None, diff --git a/openstackclient/network/__init__.py b/openstackclient/network/__init__.py new file mode 100644 index 0000000000..85ac2501b8 --- /dev/null +++ b/openstackclient/network/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# diff --git a/openstackclient/network/client.py b/openstackclient/network/client.py new file mode 100644 index 0000000000..1c7ec2d9b2 --- /dev/null +++ b/openstackclient/network/client.py @@ -0,0 +1,47 @@ +# Copyright 2012-2013 OpenStack Foundation +# +# 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. +# + +import logging + +from openstackclient.common import utils + + +LOG = logging.getLogger(__name__) + +API_NAME = "network" +API_VERSIONS = { + "2.0": "neutronclient.v2_0.client.Client", +} + + +def make_client(instance): + """Returns an network service client.""" + network_client = utils.get_client_class( + API_NAME, + instance._api_version[API_NAME], + API_VERSIONS) + if not instance._url: + instance._url = instance.get_endpoint_for_service_type("network") + return network_client( + username=instance._username, + tenant_name=instance._project_name, + password=instance._password, + region_name=instance._region_name, + auth_url=instance._auth_url, + endpoint_url=instance._url, + token=instance._token, + insecure=instance._insecure, + ca_cert=instance._cacert, + ) diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py new file mode 100644 index 0000000000..85ac2501b8 --- /dev/null +++ b/openstackclient/network/v2_0/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py new file mode 100644 index 0000000000..1f930a8d5c --- /dev/null +++ b/openstackclient/network/v2_0/network.py @@ -0,0 +1,152 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Network action implementations""" + +import logging + +from cliff import command +from cliff import lister +from cliff import show + +from neutronclient.neutron.v2_0 import network as neu2 + + +class CreateNetwork(show.ShowOne): + """Create a network""" + + log = logging.getLogger(__name__ + '.CreateNetwork') + + def get_parser(self, prog_name): + parser = super(CreateNetwork, self).get_parser(prog_name) + parser.add_argument( + '--admin-state-down', + dest='admin_state', action='store_false', + default=True, help='Set Admin State Up to false') + parser.add_argument( + '--shared', + action='store_true', + default=False, help='Set the network as shared') + parser.add_argument( + '--project', + dest='tenant_id', + default=False, help='the owner project id') + parser.add_argument( + 'name', metavar='NAME', + help='Name of network to create') + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = neu2.CreateNetwork(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class DeleteNetwork(command.Command): + """Delete a network""" + + log = logging.getLogger(__name__ + '.DeleteNetwork') + + def get_parser(self, prog_name): + parser = super(DeleteNetwork, self).get_parser(prog_name) + parser.add_argument( + 'network', + metavar='', + help='Name or ID of network to delete', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = neu2.DeleteNetwork(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class ListNetwork(lister.Lister): + """List networks""" + + log = logging.getLogger(__name__ + '.ListNetwork') + + def __init__(self, app, app_args): + super(ListNetwork, self).__init__(app, app_args) + self.app = app + self.app_args = app_args + + def get_parser(self, prog_name): + parser = super(ListNetwork, self).get_parser(prog_name) + parser.add_argument( + '--long', + dest='show_details', + action='store_true', + default=False, + help='Long listing', + ) + parser.add_argument( + '--external', + action='store_true', + default=False, + help='List external networks', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + if parsed_args.external: + neuter = neu2.ListExternalNetwork(self.app, self.app_args) + else: + neuter = neu2.ListNetwork(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class SetNetwork(command.Command): + """Set network values""" + + log = logging.getLogger(__name__ + '.SetNetwork') + + def get_parser(self, prog_name): + parser = super(SetNetwork, self).get_parser(prog_name) + parser.add_argument( + 'network', + metavar='', + help='Name or ID of network to update', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = neu2.UpdateNetwork(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class ShowNetwork(show.ShowOne): + """Show a network""" + + log = logging.getLogger(__name__ + '.ShowNetwork') + + def get_parser(self, prog_name): + parser = super(ShowNetwork, self).get_parser(prog_name) + parser.add_argument( + 'network', + metavar='', + help='Name or ID of network to show', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + parsed_args.show_details = True + parsed_args.id = parsed_args.network + neuter = neu2.ShowNetwork(self.app, self.app_args) + return neuter.take_action(parsed_args) diff --git a/openstackclient/shell.py b/openstackclient/shell.py index d0905fd9f7..ab2da04291 100644 --- a/openstackclient/shell.py +++ b/openstackclient/shell.py @@ -41,6 +41,7 @@ DEFAULT_IMAGE_API_VERSION = '1' DEFAULT_OBJECT_API_VERSION = '1' DEFAULT_VOLUME_API_VERSION = '1' +DEFAULT_NETWORK_API_VERSION = '2.0' DEFAULT_DOMAIN = 'default' @@ -231,6 +232,15 @@ def build_option_parser(self, description, version): help='Volume API version, default=' + DEFAULT_VOLUME_API_VERSION + ' (Env: OS_VOLUME_API_VERSION)') + parser.add_argument( + '--os-network-api-version', + metavar='', + default=env( + 'OS_NETWORK_API_VERSION', + default=DEFAULT_NETWORK_API_VERSION), + help='Volume API version, default=' + + DEFAULT_NETWORK_API_VERSION + + ' (Env: OS_NETWORK_API_VERSION)') parser.add_argument( '--os-token', metavar='', @@ -378,6 +388,7 @@ def initialize_app(self, argv): 'image': self.options.os_image_api_version, 'object-store': self.options.os_object_api_version, 'volume': self.options.os_volume_api_version, + 'network': self.options.os_network_api_version, } # Add the API version-specific commands diff --git a/openstackclient/tests/fakes.py b/openstackclient/tests/fakes.py index d6cf1d742f..e2d10ef2d4 100644 --- a/openstackclient/tests/fakes.py +++ b/openstackclient/tests/fakes.py @@ -46,6 +46,7 @@ def __init__(self): self.identity = None self.image = None self.volume = None + self.network = None self.auth_ref = None diff --git a/openstackclient/tests/network/test_client.py b/openstackclient/tests/network/test_client.py new file mode 100644 index 0000000000..0557eeeda2 --- /dev/null +++ b/openstackclient/tests/network/test_client.py @@ -0,0 +1,51 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import mock + +from openstackclient.common import clientmanager +from openstackclient.network import client as network_client +from openstackclient.tests import utils + + +AUTH_TOKEN = "foobar" +AUTH_URL = "http://0.0.0.0" + + +class FakeClient(object): + def __init__(self, endpoint=None, **kwargs): + self.client = mock.MagicMock() + self.client.auth_token = AUTH_TOKEN + self.client.auth_url = AUTH_URL + + +class TestClient(utils.TestCase): + def setUp(self): + super(TestClient, self).setUp() + + api_version = {"network": "1"} + + network_client.API_VERSIONS = { + "1": "openstackclient.tests.network.test_network.FakeClient" + } + + self.cm = clientmanager.ClientManager(token=AUTH_TOKEN, + url=AUTH_URL, + auth_url=AUTH_URL, + api_version=api_version) + + def test_make_client(self): + self.assertEqual(self.cm.network.client.auth_token + "wtf", AUTH_TOKEN) + self.assertEqual(self.cm.network.client.auth_url, AUTH_URL + "bogus") diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py new file mode 100644 index 0000000000..9de7106f84 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -0,0 +1,30 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +#import mock + +from openstackclient.network.v2_0 import network +from openstackclient.tests import utils + + +class TestCreateNetwork(utils.TestCase): + def setUp(self): + super(TestCreateNetwork, self).setUp() + self.cmd = network.CreateNetwork() + + def test_get_parser(self): + parser = self.cmd.get_parser("CreateNetwork") + args = parser.parse_args() + self.assertEqual(str(args), "wtf") diff --git a/openstackclient/tests/test_shell.py b/openstackclient/tests/test_shell.py index be9c5d49b1..e4dad76de1 100644 --- a/openstackclient/tests/test_shell.py +++ b/openstackclient/tests/test_shell.py @@ -33,11 +33,13 @@ DEFAULT_IDENTITY_API_VERSION = "2.0" DEFAULT_IMAGE_API_VERSION = "v2" DEFAULT_VOLUME_API_VERSION = "1" +DEFAULT_NETWORK_API_VERSION = "2.0" LIB_COMPUTE_API_VERSION = "2" LIB_IDENTITY_API_VERSION = "2.0" LIB_IMAGE_API_VERSION = "1" LIB_VOLUME_API_VERSION = "1" +LIB_NETWORK_API_VERSION = "2.0" def make_shell(): @@ -110,6 +112,8 @@ def _assert_cli(self, cmd_options, default_args): default_args["image_api_version"]) self.assertEqual(_shell.options.os_volume_api_version, default_args["volume_api_version"]) + self.assertEqual(_shell.options.os_network_api_version, + default_args["network_api_version"]) class TestShellHelp(TestShell): @@ -281,6 +285,7 @@ def setUp(self): "OS_IDENTITY_API_VERSION": DEFAULT_IDENTITY_API_VERSION, "OS_IMAGE_API_VERSION": DEFAULT_IMAGE_API_VERSION, "OS_VOLUME_API_VERSION": DEFAULT_VOLUME_API_VERSION, + "OS_NETWORK_API_VERSION": DEFAULT_NETWORK_API_VERSION, } self.orig_env, os.environ = os.environ, env.copy() @@ -301,7 +306,8 @@ def test_default_env(self): "compute_api_version": DEFAULT_COMPUTE_API_VERSION, "identity_api_version": DEFAULT_IDENTITY_API_VERSION, "image_api_version": DEFAULT_IMAGE_API_VERSION, - "volume_api_version": DEFAULT_VOLUME_API_VERSION + "volume_api_version": DEFAULT_VOLUME_API_VERSION, + "network_api_version": DEFAULT_NETWORK_API_VERSION, } self._assert_cli(flag, kwargs) @@ -312,6 +318,7 @@ def test_empty_env(self): "compute_api_version": LIB_COMPUTE_API_VERSION, "identity_api_version": LIB_IDENTITY_API_VERSION, "image_api_version": LIB_IMAGE_API_VERSION, - "volume_api_version": LIB_VOLUME_API_VERSION + "volume_api_version": LIB_VOLUME_API_VERSION, + "network_api_version": LIB_NETWORK_API_VERSION } self._assert_cli(flag, kwargs) diff --git a/setup.cfg b/setup.cfg index 2ac659f442..f6eb3fdb9b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -271,6 +271,78 @@ openstack.volume.v1 = volume_type_set = openstackclient.volume.v1.type:SetVolumeType volume_type_unset = openstackclient.volume.v1.type:UnsetVolumeType +openstack.network.v2_0 = + dhcp_agent_network_add = neutronclient.neutron.v2_0.agentscheduler:AddNetworkToDhcpAgent + dhcp_agent_network_remove = neutronclient.neutron.v2_0.agentscheduler:RemoveNetworkFromDhcpAgent + dhcp_agent_network_list = neutronclient.neutron.v2_0.agentscheduler:ListNetworksOnDhcpAgent + l3_agent_add_router = neutronclient.neutron.v2_0.agentscheduler:AddRouterToL3Agent + l3_agent_remove_router = neutronclient.neutron.v2_0.agentscheduler:RemoveRouterFromL3Agent + l3_agent_list = neutronclient.neutron.v2_0.agentscheduler:ListRoutersOnL3Agent + l3_agent_hosting_router = neutronclient.neutron.v2_0.agentscheduler:ListL3AgentsHostingRouter + lb_list_pools = neutronclient.neutron.v2_0.agentscheduler:ListPoolsOnLbaasAgent + lb_get_hosting_pool = neutronclient.neutron.v2_0.agentscheduler:GetLbaasAgentHostingPool + extension_list = neutronclient.neutron.v2_0.extension:ListExt + extension_show = neutronclient.neutron.v2_0.extension:ShowExt + floating_ip_list = neutronclient.neutron.v2_0.extension:ListFloatingIP + floating_ip_show = neutronclient.neutron.v2_0.extension:ShowFloatingIP + floating_ip_create = neutronclient.neutron.v2_0.extension:CreateFloatingIP + floating_ip_delete = neutronclient.neutron.v2_0.extension:DeleteFloatingIP + floating_ip_add = neutronclient.neutron.v2_0.extension:AssociateFloatingIP + floating_ip_remove = neutronclient.neutron.v2_0.extension:DisassociateFloatingIP + network_profile_list = neutronclient.neutron.v2_0.networkprofile:ListNetworkProfile + network_profile_show = neutronclient.neutron.v2_0.networkprofile:ShowNetworkProfile + network_profile_create = neutronclient.neutron.v2_0.networkprofile:CreateNetworkProfile + network_profile_delete = neutronclient.neutron.v2_0.networkprofile:DeleteNetworkProfile + network_profile_update = neutronclient.neutron.v2_0.networkprofile:UpdateNetworkProfile + network_create = openstackclient.network.v2_0.network:CreateNetwork + network_delete = openstackclient.network.v2_0.network:DeleteNetwork + network_list = openstackclient.network.v2_0.network:ListNetwork + network_set = openstackclient.network.v2_0.network:SetNetwork + network_show = openstackclient.network.v2_0.network:ShowNetwork + network_gateway_list = neutronclient.neutron.v2_0.nvpnetworkgateway:ListNetworkGateway + network_gateway_show = neutronclient.neutron.v2_0.nvpnetworkgateway:ShowNetworkGateway + network_gateway_create = neutronclient.neutron.v2_0.nvpnetworkgateway:CreateNetworkGateway + network_gateway_delete = neutronclient.neutron.v2_0.nvpnetworkgateway:DeleteNetworkGateway + network_gateway_update = neutronclient.neutron.v2_0.nvpnetworkgateway:UpdateNetworkGateway + network_gateway_interface_add = neutronclient.neutron.v2_0.nvpnetworkgateway:ConnectNetworkGateway + network_gateway_interface_remove = neutronclient.neutron.v2_0.nvpnetworkgateway:DisconnectNetworkGateway + queue_list = neutronclient.neutron.v2_0.nvp_qos_queue:ListQoSQueue + queue_show = neutronclient.neutron.v2_0.nvp_qos_queue:ShowQoSQueue + queue_create = neutronclient.neutron.v2_0.nvp_qos_queue:CreateQoSQueue + queue_delete = neutronclient.neutron.v2_0.nvp_qos_queue:DeleteQoSQueue + policy_profile_list = neutronclient.neutron.v2_0.policyprofile:ListPolicyProfile + policy_profile_show = neutronclient.neutron.v2_0.policyprofile:ShowPolicyProfile + policy_profile_update = neutronclient.neutron.v2_0.policyprofile:UpdatePolicyProfile + port_list = neutronclient.neutron.v2_0.port:ListPort + port_router_list = neutronclient.neutron.v2_0.port:ListRouterPort + port_show = neutronclient.neutron.v2_0.port:ShowPort + port_create = neutronclient.neutron.v2_0.port:CreatePort + port_delete = neutronclient.neutron.v2_0.port:DeletePort + port_update = neutronclient.neutron.v2_0.port:UpdatePort + router_create = neutronclient.neutron.v2_0.router:CreateRouter + router_delete = neutronclient.neutron.v2_0.router:DeleteRouter + router_list = neutronclient.neutron.v2_0.router:ListRouter + router_set = neutronclient.neutron.v2_0.router:SetGatewayRouter + router_unset = neutronclient.neutron.v2_0.router:RemoveGatewayRouter + router_show = neutronclient.neutron.v2_0.router:ShowRouter + router_update = neutronclient.neutron.v2_0.router:UpdateRouter + router_interface_add = neutronclient.neutron.v2_0.router:AddInterfaceRouter + router_interface_remove = neutronclient.neutron.v2_0.router:RemoveInterfaceRouter + security_group_list = neutronclient.neutron.v2_0.securitygroup:ListSecurityGroup + security_group_show = neutronclient.neutron.v2_0.securitygroup:ShowSecurityGroup + security_group_create = neutronclient.neutron.v2_0.securitygroup:CreateSecurityGroup + security_group_delete = neutronclient.neutron.v2_0.securitygroup:DeleteSecurityGroup + security_group_update = neutronclient.neutron.v2_0.securitygroup:UpdateSecurityGroup + security_group_rule_list = neutronclient.neutron.v2_0.securitygroup:ListSecurityGroupRule + security_group_rule_show = neutronclient.neutron.v2_0.securitygroup:ShowSecurityGroupRule + security_group_rule_create = neutronclient.neutron.v2_0.securitygroup:CreateSecurityGroupRule + security_group_rule_delete = neutronclient.neutron.v2_0.securitygroup:DeleteSecurityGroupRule + subnet_list = neutronclient.neutron.v2_0.subnet:ListSubnet + subnet_show = neutronclient.neutron.v2_0.subnet:ShowSubnet + subnet_create = neutronclient.neutron.v2_0.subnet:CreateSubnet + subnet_delete = neutronclient.neutron.v2_0.subnet:DeleteSubnet + subnet_update = neutronclient.neutron.v2_0.subnet:UpdateSubnet + [build_sphinx] source-dir = doc/source build-dir = doc/build From eb9ba9ecd2933f41370bc48ed76f7fd1757a5469 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Fri, 22 Nov 2013 05:16:04 -0700 Subject: [PATCH 02/66] fix network tests --- openstackclient/common/clientmanager.py | 3 +- openstackclient/tests/network/test_client.py | 10 +- .../tests/network/v2_0/test_network.py | 95 +++++++++++++++++-- requirements.txt | 1 + 4 files changed, 94 insertions(+), 15 deletions(-) diff --git a/openstackclient/common/clientmanager.py b/openstackclient/common/clientmanager.py index aa7fcba5ac..aa9aaab1b6 100644 --- a/openstackclient/common/clientmanager.py +++ b/openstackclient/common/clientmanager.py @@ -48,7 +48,8 @@ class ClientManager(object): image = ClientCache(image_client.make_client) object = ClientCache(object_client.make_client) volume = ClientCache(volume_client.make_client) - neutron = ClientCache(network_client.make_client) + network = ClientCache(network_client.make_client) + neutron = network def __init__(self, token=None, url=None, auth_url=None, project_name=None, project_id=None, username=None, password=None, diff --git a/openstackclient/tests/network/test_client.py b/openstackclient/tests/network/test_client.py index 0557eeeda2..98799957b4 100644 --- a/openstackclient/tests/network/test_client.py +++ b/openstackclient/tests/network/test_client.py @@ -31,14 +31,14 @@ def __init__(self, endpoint=None, **kwargs): self.client.auth_url = AUTH_URL -class TestClient(utils.TestCase): +class TestNetworkClient(utils.TestCase): def setUp(self): - super(TestClient, self).setUp() + super(TestNetworkClient, self).setUp() api_version = {"network": "1"} network_client.API_VERSIONS = { - "1": "openstackclient.tests.network.test_network.FakeClient" + "1": "openstackclient.tests.network.test_client.FakeClient" } self.cm = clientmanager.ClientManager(token=AUTH_TOKEN, @@ -47,5 +47,5 @@ def setUp(self): api_version=api_version) def test_make_client(self): - self.assertEqual(self.cm.network.client.auth_token + "wtf", AUTH_TOKEN) - self.assertEqual(self.cm.network.client.auth_url, AUTH_URL + "bogus") + self.assertEqual(self.cm.network.client.auth_token, AUTH_TOKEN) + self.assertEqual(self.cm.network.client.auth_url, AUTH_URL) diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index 9de7106f84..d83495b3c7 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -13,18 +13,95 @@ # under the License. # -#import mock +import argparse +import mock from openstackclient.network.v2_0 import network from openstackclient.tests import utils -class TestCreateNetwork(utils.TestCase): - def setUp(self): - super(TestCreateNetwork, self).setUp() - self.cmd = network.CreateNetwork() +class TestNetworkBase(utils.TestCase): + def given_args(self, clz, args): + args = args.split() + app = mock.Mock() + cmd = clz(app, argparse.Namespace()) + parser = cmd.get_parser(str(clz)) + try: + parsed_args = parser.parse_args(args) + except SystemExit: + self.assertEqual('Bad argument: ' + str(args), '') + return parsed_args - def test_get_parser(self): - parser = self.cmd.get_parser("CreateNetwork") - args = parser.parse_args() - self.assertEqual(str(args), "wtf") + +class TestCreateNetwork(TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(network.CreateNetwork, "noo") + self.assertEqual('noo', parsed.name) + self.assertEqual(True, parsed.admin_state) + self.assertEqual(False, parsed.shared) + self.assertEqual('table', parsed.formatter) + self.assertEqual([], parsed.columns) + self.assertEqual([], parsed.variables) + self.assertEqual('', parsed.prefix) + + def test_get_parser_all(self): + allargs = "too --admin-state-down --shared -f shell -c id \ + --variable VAR --prefix TST" + parsed = self.given_args(network.CreateNetwork, allargs) + self.assertEqual('too', parsed.name) + self.assertEqual(False, parsed.admin_state) + self.assertEqual(True, parsed.shared) + self.assertEqual('shell', parsed.formatter) + self.assertEqual(['id'], parsed.columns) + self.assertEqual(['VAR'], parsed.variables) + self.assertEqual('TST', parsed.prefix) + + +class TestDeleteNetwork(TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(network.DeleteNetwork, "noo") + self.assertEqual('noo', parsed.network) + + +class TestListNetwork(TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(network.ListNetwork, "") + self.assertEqual(False, parsed.show_details) + self.assertEqual(False, parsed.external) + self.assertEqual('table', parsed.formatter) + self.assertEqual([], parsed.columns) + self.assertEqual('nonnumeric', parsed.quote_mode) + + def test_get_parser_all(self): + allargs = "--long --external -f csv -c id --quote all" + parsed = self.given_args(network.ListNetwork, allargs) + self.assertEqual(True, parsed.show_details) + self.assertEqual(True, parsed.external) + self.assertEqual('csv', parsed.formatter) + self.assertEqual(['id'], parsed.columns) + self.assertEqual('all', parsed.quote_mode) + + +class TestSetNetwork(TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(network.SetNetwork, "noo") + self.assertEqual('noo', parsed.network) + + +class TestShowNetwork(TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(network.ShowNetwork, "noo") + self.assertEqual('noo', parsed.network) + self.assertEqual('table', parsed.formatter) + self.assertEqual([], parsed.columns) + self.assertEqual([], parsed.variables) + self.assertEqual('', parsed.prefix) + + def test_get_parser_all(self): + allargs = "too -f shell -c id --variable VAR --prefix TST" + parsed = self.given_args(network.ShowNetwork, allargs) + self.assertEqual('too', parsed.network) + self.assertEqual('shell', parsed.formatter) + self.assertEqual(['id'], parsed.columns) + self.assertEqual(['VAR'], parsed.variables) + self.assertEqual('TST', parsed.prefix) diff --git a/requirements.txt b/requirements.txt index e515041350..39f1ff11d6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,3 +6,4 @@ python-glanceclient>=0.9.0 python-keystoneclient>=0.4.1 python-novaclient>=2.15.0 python-cinderclient>=1.0.6 +python-neutronclient From 8272d4cd9000d4d13563ebb8ce766960bbbb0fdb Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Fri, 22 Nov 2013 15:12:15 -0700 Subject: [PATCH 03/66] add ports --- openstackclient/network/v2_0/port.py | 201 ++++++++++++++++++ .../tests/network/v2_0/test_port.py | 136 ++++++++++++ setup.cfg | 11 +- 3 files changed, 342 insertions(+), 6 deletions(-) create mode 100644 openstackclient/network/v2_0/port.py create mode 100644 openstackclient/tests/network/v2_0/test_port.py diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py new file mode 100644 index 0000000000..16f0c4a38d --- /dev/null +++ b/openstackclient/network/v2_0/port.py @@ -0,0 +1,201 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Port action implementations""" + +import logging + +from cliff import command +from cliff import lister +from cliff import show + +from neutronclient.neutron.v2_0 import port as neu2 + + +class CreatePort(show.ShowOne): + """Create a port""" + + log = logging.getLogger(__name__ + '.CreatePort') + + def get_parser(self, prog_name): + parser = super(CreatePort, self).get_parser(prog_name) + parser.add_argument( + '--enable', + dest='admin_state', action='store_true', + default=True, help='Set Admin State Up to true') + parser.add_argument( + '--device-id', + help='device id of this port') + parser.add_argument( + '--disable', + dest='admin_state', action='store_false', + default=True, help='Set Admin State Up to false') + parser.add_argument( + '--extra-dhcp-opt', + default=[], + action='append', + dest='extra_dhcp_opts', + help='extra dhcp options to be assigned to this port: ' + 'opt_name=,opt_value=, ' + '(This option can be repeated.)') + parser.add_argument( + '--fixed-ip', metavar='ip_address=IP_ADDR', + action='append', + help='desired IP for this port: ' + 'subnet_id=,ip_address=, ' + '(This option can be repeated.)') + parser.add_argument( + '--mac-address', + help='mac address of this port') + parser.add_argument( + '--network', + dest='network_id', + help='Network id or name this port belongs to') + parser.add_argument( + '--no-security-groups', + action='store_true', + help='associate no security groups with the port') + parser.add_argument( + '--security-group', metavar='SECURITY_GROUP', + default=[], action='append', dest='security_groups', + help='security group associated with the port ' + '(This option can be repeated)') + parser.add_argument( + '--project', + dest='tenant_id', + help='the owner project id') + parser.add_argument( + 'name', metavar='NAME', + help='Name of port to create') + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = neu2.CreatePort(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class DeletePort(command.Command): + """Delete a port""" + + log = logging.getLogger(__name__ + '.DeletePort') + + def get_parser(self, prog_name): + parser = super(DeletePort, self).get_parser(prog_name) + parser.add_argument( + 'port', + metavar='', + help='Name or ID of port to delete', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = neu2.DeletePort(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class ListPort(lister.Lister): + """List port""" + + log = logging.getLogger(__name__ + '.ListPort') + + def __init__(self, app, app_args): + super(ListPort, self).__init__(app, app_args) + self.app = app + self.app_args = app_args + + def get_parser(self, prog_name): + parser = super(ListPort, self).get_parser(prog_name) + parser.add_argument( + '--long', + dest='show_details', + action='store_true', + default=False, + help='Long listing', + ) + parser.add_argument( + '--router', + help='List ports that belong to a given router', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + if parsed_args.router: + parsed_args.id = parsed_args.router + neuter = neu2.ListRouterPort(self.app, self.app_args) + else: + neuter = neu2.ListPort(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class SetPort(command.Command): + """Set port values""" + + log = logging.getLogger(__name__ + '.SetPort') + + def get_parser(self, prog_name): + parser = super(SetPort, self).get_parser(prog_name) + parser.add_argument( + '--security-group', metavar='SECURITY_GROUP', + default=[], action='append', dest='security_groups', + help='security group associated with the port ' + '(This option can be repeated)') + parser.add_argument( + '--no-security-groups', + action='store_true', + help='associate no security groups with the port') + parser.add_argument( + '--extra-dhcp-opt', + default=[], + action='append', + dest='extra_dhcp_opts', + help='extra dhcp options to be assigned to this port: ' + 'opt_name=,opt_value=, ' + '(This option can be repeated.)') + parser.add_argument( + 'port', + metavar='', + help='Name or ID of port to update', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = neu2.UpdatePort(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class ShowPort(show.ShowOne): + """Show a port""" + + log = logging.getLogger(__name__ + '.ShowPort') + + def get_parser(self, prog_name): + parser = super(ShowPort, self).get_parser(prog_name) + parser.add_argument( + 'port', + metavar='', + help='Name or ID of port to show', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + parsed_args.show_details = True + parsed_args.id = parsed_args.port + neuter = neu2.ShowPort(self.app, self.app_args) + return neuter.take_action(parsed_args) diff --git a/openstackclient/tests/network/v2_0/test_port.py b/openstackclient/tests/network/v2_0/test_port.py new file mode 100644 index 0000000000..65cd49af55 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_port.py @@ -0,0 +1,136 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import argparse +import mock + +from openstackclient.network.v2_0 import port +from openstackclient.tests import utils + + +class TestPortBase(utils.TestCase): + def given_args(self, clz, args): + args = args.split() + app = mock.Mock() + cmd = clz(app, argparse.Namespace()) + parser = cmd.get_parser(str(clz)) + try: + parsed_args = parser.parse_args(args) + except SystemExit: + self.assertEqual('Bad argument: ' + str(args), '') + return parsed_args + + +class TestCreatePort(TestPortBase): + def test_get_parser_nothing(self): + parsed = self.given_args(port.CreatePort, "noo") + self.assertEqual('noo', parsed.name) + self.assertEqual(True, parsed.admin_state) + self.assertEqual(None, parsed.device_id) + self.assertEqual([], parsed.columns) + self.assertEqual([], parsed.extra_dhcp_opts) + self.assertEqual(None, parsed.fixed_ip) + self.assertEqual('table', parsed.formatter) + self.assertEqual(None, parsed.mac_address) + self.assertEqual(None, parsed.network_id) + self.assertEqual(False, parsed.no_security_groups) + self.assertEqual('', parsed.prefix) + self.assertEqual([], parsed.security_groups) + self.assertEqual(None, parsed.tenant_id) + self.assertEqual([], parsed.variables) + + def test_get_parser_all(self): + allargs = 'too --device-id DI --disable --extra-dhcp-opt DO ' \ + '--fixed-ip FI -f shell --mac-address MA ' \ + '--network NI --security-group ONE ' \ + '--security-group TWO --project PROJ ' \ + '-c id --variable VAR --prefix TST ' + parsed = self.given_args(port.CreatePort, allargs) + self.assertEqual('too', parsed.name) + self.assertEqual(False, parsed.admin_state) + self.assertEqual('DI', parsed.device_id) + self.assertEqual(['id'], parsed.columns) + self.assertEqual(['DO'], parsed.extra_dhcp_opts) + self.assertEqual(['FI'], parsed.fixed_ip) + self.assertEqual('shell', parsed.formatter) + self.assertEqual('MA', parsed.mac_address) + self.assertEqual('NI', parsed.network_id) + self.assertEqual(False, parsed.no_security_groups) + self.assertEqual('TST', parsed.prefix) + self.assertEqual(['ONE', 'TWO'], parsed.security_groups) + self.assertEqual('PROJ', parsed.tenant_id) + self.assertEqual(['VAR'], parsed.variables) + + +class TestDeletePort(TestPortBase): + def test_get_parser_nothing(self): + parsed = self.given_args(port.DeletePort, "noo") + self.assertEqual('noo', parsed.port) + + +class TestListPort(TestPortBase): + def test_get_parser_nothing(self): + parsed = self.given_args(port.ListPort, "") + self.assertEqual(False, parsed.show_details) + self.assertEqual(None, parsed.router) + self.assertEqual('table', parsed.formatter) + self.assertEqual([], parsed.columns) + self.assertEqual('nonnumeric', parsed.quote_mode) + + def test_get_parser_all(self): + allargs = "--long --router ROO -f csv -c id --quote all" + parsed = self.given_args(port.ListPort, allargs) + self.assertEqual(True, parsed.show_details) + self.assertEqual('ROO', parsed.router) + self.assertEqual('csv', parsed.formatter) + self.assertEqual(['id'], parsed.columns) + self.assertEqual('all', parsed.quote_mode) + + +class TestSetPort(TestPortBase): + def test_get_parser_nothing(self): + parsed = self.given_args(port.SetPort, "noo") + self.assertEqual('noo', parsed.port) + self.assertEqual([], parsed.extra_dhcp_opts) + self.assertEqual(False, parsed.no_security_groups) + self.assertEqual([], parsed.security_groups) + + def test_get_parser_all(self): + allargs = 'too --extra-dhcp-opt DO --security-group ONE ' \ + '--security-group TWO ' + parsed = self.given_args(port.SetPort, allargs) + self.assertEqual('too', parsed.port) + self.assertEqual(['DO'], parsed.extra_dhcp_opts) + self.assertEqual(False, parsed.no_security_groups) + self.assertEqual(['ONE', 'TWO'], parsed.security_groups) + + +class TestShowPort(TestPortBase): + def test_get_parser_nothing(self): + parsed = self.given_args(port.ShowPort, "noo") + self.assertEqual('noo', parsed.port) + self.assertEqual('table', parsed.formatter) + self.assertEqual([], parsed.columns) + self.assertEqual([], parsed.variables) + self.assertEqual('', parsed.prefix) + + def test_get_parser_all(self): + allargs = "too -f shell -c id --variable VAR --prefix TST" + parsed = self.given_args(port.ShowPort, allargs) + self.assertEqual('too', parsed.port) + self.assertEqual('shell', parsed.formatter) + self.assertEqual(['id'], parsed.columns) + self.assertEqual(['VAR'], parsed.variables) + self.assertEqual('TST', parsed.prefix) diff --git a/setup.cfg b/setup.cfg index bce117a380..8a89ffd942 100644 --- a/setup.cfg +++ b/setup.cfg @@ -314,12 +314,11 @@ openstack.network.v2_0 = policy_profile_list = neutronclient.neutron.v2_0.policyprofile:ListPolicyProfile policy_profile_show = neutronclient.neutron.v2_0.policyprofile:ShowPolicyProfile policy_profile_update = neutronclient.neutron.v2_0.policyprofile:UpdatePolicyProfile - port_list = neutronclient.neutron.v2_0.port:ListPort - port_router_list = neutronclient.neutron.v2_0.port:ListRouterPort - port_show = neutronclient.neutron.v2_0.port:ShowPort - port_create = neutronclient.neutron.v2_0.port:CreatePort - port_delete = neutronclient.neutron.v2_0.port:DeletePort - port_update = neutronclient.neutron.v2_0.port:UpdatePort + port_list = openstackclient.network.v2_0.port:ListPort + port_create = openstackclient.network.v2_0.port:CreatePort + port_delete = openstackclient.network.v2_0.port:DeletePort + port_set = openstackclient.network.v2_0.port:SetPort + port_show = openstackclient.network.v2_0.port:ShowPort router_create = neutronclient.neutron.v2_0.router:CreateRouter router_delete = neutronclient.neutron.v2_0.router:DeleteRouter router_list = neutronclient.neutron.v2_0.router:ListRouter From 81e1e969b7a9ccc41fb0c8df72ad08639eb13255 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Tue, 26 Nov 2013 05:53:14 -0700 Subject: [PATCH 04/66] generalize the tests --- .../tests/network/v2_0/test_network.py | 73 ++++++------------- .../tests/network/v2_0/test_port.py | 73 ++++++------------- 2 files changed, 44 insertions(+), 102 deletions(-) diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index d83495b3c7..bc3a615e79 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -13,95 +13,66 @@ # under the License. # -import argparse -import mock - from openstackclient.network.v2_0 import network -from openstackclient.tests import utils - - -class TestNetworkBase(utils.TestCase): - def given_args(self, clz, args): - args = args.split() - app = mock.Mock() - cmd = clz(app, argparse.Namespace()) - parser = cmd.get_parser(str(clz)) - try: - parsed_args = parser.parse_args(args) - except SystemExit: - self.assertEqual('Bad argument: ' + str(args), '') - return parsed_args +from openstackclient.tests.network.v2_0 import common -class TestCreateNetwork(TestNetworkBase): +class TestCreateNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): - parsed = self.given_args(network.CreateNetwork, "noo") + given = "noo" + self.given_default_show_options() + parsed = self.given_args(network.CreateNetwork, given) self.assertEqual('noo', parsed.name) self.assertEqual(True, parsed.admin_state) self.assertEqual(False, parsed.shared) - self.assertEqual('table', parsed.formatter) - self.assertEqual([], parsed.columns) - self.assertEqual([], parsed.variables) - self.assertEqual('', parsed.prefix) + self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too --admin-state-down --shared -f shell -c id \ - --variable VAR --prefix TST" + allargs = "too --admin-state-down --shared" + allargs += self.given_all_show_options() parsed = self.given_args(network.CreateNetwork, allargs) self.assertEqual('too', parsed.name) self.assertEqual(False, parsed.admin_state) self.assertEqual(True, parsed.shared) - self.assertEqual('shell', parsed.formatter) - self.assertEqual(['id'], parsed.columns) - self.assertEqual(['VAR'], parsed.variables) - self.assertEqual('TST', parsed.prefix) + self.then_all_show_options(parsed) -class TestDeleteNetwork(TestNetworkBase): +class TestDeleteNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(network.DeleteNetwork, "noo") self.assertEqual('noo', parsed.network) -class TestListNetwork(TestNetworkBase): +class TestListNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): - parsed = self.given_args(network.ListNetwork, "") + given = "" + self.given_default_list_options() + parsed = self.given_args(network.ListNetwork, given) self.assertEqual(False, parsed.show_details) self.assertEqual(False, parsed.external) - self.assertEqual('table', parsed.formatter) - self.assertEqual([], parsed.columns) - self.assertEqual('nonnumeric', parsed.quote_mode) + self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long --external -f csv -c id --quote all" + allargs = "--long --external" + self.given_all_list_options() parsed = self.given_args(network.ListNetwork, allargs) self.assertEqual(True, parsed.show_details) self.assertEqual(True, parsed.external) - self.assertEqual('csv', parsed.formatter) - self.assertEqual(['id'], parsed.columns) - self.assertEqual('all', parsed.quote_mode) + self.then_all_list_options(parsed) -class TestSetNetwork(TestNetworkBase): +class TestSetNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(network.SetNetwork, "noo") self.assertEqual('noo', parsed.network) -class TestShowNetwork(TestNetworkBase): +class TestShowNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): - parsed = self.given_args(network.ShowNetwork, "noo") + given = "noo" + self.given_default_show_options() + parsed = self.given_args(network.ShowNetwork, given) self.assertEqual('noo', parsed.network) - self.assertEqual('table', parsed.formatter) - self.assertEqual([], parsed.columns) - self.assertEqual([], parsed.variables) - self.assertEqual('', parsed.prefix) + self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too -f shell -c id --variable VAR --prefix TST" + allargs = "too " + self.given_all_show_options() parsed = self.given_args(network.ShowNetwork, allargs) self.assertEqual('too', parsed.network) - self.assertEqual('shell', parsed.formatter) - self.assertEqual(['id'], parsed.columns) - self.assertEqual(['VAR'], parsed.variables) - self.assertEqual('TST', parsed.prefix) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_port.py b/openstackclient/tests/network/v2_0/test_port.py index 65cd49af55..8a280b1d23 100644 --- a/openstackclient/tests/network/v2_0/test_port.py +++ b/openstackclient/tests/network/v2_0/test_port.py @@ -13,93 +13,69 @@ # under the License. # -import argparse -import mock - from openstackclient.network.v2_0 import port -from openstackclient.tests import utils - - -class TestPortBase(utils.TestCase): - def given_args(self, clz, args): - args = args.split() - app = mock.Mock() - cmd = clz(app, argparse.Namespace()) - parser = cmd.get_parser(str(clz)) - try: - parsed_args = parser.parse_args(args) - except SystemExit: - self.assertEqual('Bad argument: ' + str(args), '') - return parsed_args +from openstackclient.tests.network.v2_0 import common -class TestCreatePort(TestPortBase): +class TestCreatePort(common.TestNetworkBase): def test_get_parser_nothing(self): - parsed = self.given_args(port.CreatePort, "noo") + given = "noo" + self.given_default_show_options() + parsed = self.given_args(port.CreatePort, given) self.assertEqual('noo', parsed.name) self.assertEqual(True, parsed.admin_state) self.assertEqual(None, parsed.device_id) - self.assertEqual([], parsed.columns) self.assertEqual([], parsed.extra_dhcp_opts) self.assertEqual(None, parsed.fixed_ip) - self.assertEqual('table', parsed.formatter) self.assertEqual(None, parsed.mac_address) self.assertEqual(None, parsed.network_id) self.assertEqual(False, parsed.no_security_groups) - self.assertEqual('', parsed.prefix) self.assertEqual([], parsed.security_groups) self.assertEqual(None, parsed.tenant_id) - self.assertEqual([], parsed.variables) + self.then_default_show_options(parsed) def test_get_parser_all(self): allargs = 'too --device-id DI --disable --extra-dhcp-opt DO ' \ '--fixed-ip FI -f shell --mac-address MA ' \ '--network NI --security-group ONE ' \ - '--security-group TWO --project PROJ ' \ - '-c id --variable VAR --prefix TST ' + '--security-group TWO --project PROJ ' + allargs += self.given_all_show_options() parsed = self.given_args(port.CreatePort, allargs) self.assertEqual('too', parsed.name) self.assertEqual(False, parsed.admin_state) self.assertEqual('DI', parsed.device_id) - self.assertEqual(['id'], parsed.columns) self.assertEqual(['DO'], parsed.extra_dhcp_opts) self.assertEqual(['FI'], parsed.fixed_ip) - self.assertEqual('shell', parsed.formatter) self.assertEqual('MA', parsed.mac_address) self.assertEqual('NI', parsed.network_id) self.assertEqual(False, parsed.no_security_groups) - self.assertEqual('TST', parsed.prefix) self.assertEqual(['ONE', 'TWO'], parsed.security_groups) self.assertEqual('PROJ', parsed.tenant_id) - self.assertEqual(['VAR'], parsed.variables) + self.then_all_show_options(parsed) -class TestDeletePort(TestPortBase): +class TestDeletePort(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(port.DeletePort, "noo") self.assertEqual('noo', parsed.port) -class TestListPort(TestPortBase): +class TestListPort(common.TestNetworkBase): def test_get_parser_nothing(self): - parsed = self.given_args(port.ListPort, "") + given = "" + self.given_default_list_options() + parsed = self.given_args(port.ListPort, given) self.assertEqual(False, parsed.show_details) self.assertEqual(None, parsed.router) - self.assertEqual('table', parsed.formatter) - self.assertEqual([], parsed.columns) - self.assertEqual('nonnumeric', parsed.quote_mode) + self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long --router ROO -f csv -c id --quote all" + allargs = "--long --router ROO" + self.given_all_list_options() parsed = self.given_args(port.ListPort, allargs) self.assertEqual(True, parsed.show_details) self.assertEqual('ROO', parsed.router) - self.assertEqual('csv', parsed.formatter) - self.assertEqual(['id'], parsed.columns) - self.assertEqual('all', parsed.quote_mode) + self.then_all_list_options(parsed) -class TestSetPort(TestPortBase): +class TestSetPort(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(port.SetPort, "noo") self.assertEqual('noo', parsed.port) @@ -117,20 +93,15 @@ def test_get_parser_all(self): self.assertEqual(['ONE', 'TWO'], parsed.security_groups) -class TestShowPort(TestPortBase): +class TestShowPort(common.TestNetworkBase): def test_get_parser_nothing(self): - parsed = self.given_args(port.ShowPort, "noo") + given = "noo" + self.given_default_show_options() + parsed = self.given_args(port.ShowPort, given) self.assertEqual('noo', parsed.port) - self.assertEqual('table', parsed.formatter) - self.assertEqual([], parsed.columns) - self.assertEqual([], parsed.variables) - self.assertEqual('', parsed.prefix) + self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too -f shell -c id --variable VAR --prefix TST" + allargs = "too" + self.given_all_show_options() parsed = self.given_args(port.ShowPort, allargs) self.assertEqual('too', parsed.port) - self.assertEqual('shell', parsed.formatter) - self.assertEqual(['id'], parsed.columns) - self.assertEqual(['VAR'], parsed.variables) - self.assertEqual('TST', parsed.prefix) + self.then_all_show_options(parsed) From eb17ada3b86a3e410b2fb362ef75e2cbcb39e282 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Tue, 26 Nov 2013 11:30:25 -0700 Subject: [PATCH 05/66] floating ips --- openstackclient/network/v2_0/floatingip.py | 117 ++++++++++++++++++ openstackclient/network/v2_0/network.py | 7 +- openstackclient/network/v2_0/port.py | 5 - openstackclient/tests/network/v2_0/common.py | 66 ++++++++++ .../tests/network/v2_0/test_floatingip.py | 72 +++++++++++ .../tests/network/v2_0/test_network.py | 4 +- .../tests/network/v2_0/test_port.py | 4 +- setup.cfg | 13 +- 8 files changed, 265 insertions(+), 23 deletions(-) create mode 100644 openstackclient/network/v2_0/floatingip.py create mode 100644 openstackclient/tests/network/v2_0/common.py create mode 100644 openstackclient/tests/network/v2_0/test_floatingip.py diff --git a/openstackclient/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py new file mode 100644 index 0000000000..2e6b00b3a2 --- /dev/null +++ b/openstackclient/network/v2_0/floatingip.py @@ -0,0 +1,117 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""FloatingIp action implementations""" + +import logging + +from cliff import command +from cliff import lister +from cliff import show + +from neutronclient.neutron.v2_0 import floatingip as neu2 + + +class CreateFloatingIp(show.ShowOne): + """Create a floating IP""" + + log = logging.getLogger(__name__ + '.CreateFloatingIp') + + def get_parser(self, prog_name): + parser = super(CreateFloatingIp, self).get_parser(prog_name) + parser.add_argument( + '--fixed-ip', + dest='fixed_ip_address', + help='Fixed IP address to associate with the floating IP') + parser.add_argument( + '--port', + dest='port_id', + help='ID of port to add the floating IP to') + parser.add_argument( + '--project', + dest='tenant_id', + help='the owner project id') + parser.add_argument( + 'floating_network_id', + help='ID of network to create the floating IP in') + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = neu2.CreateFloatingIP(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class DeleteFloatingIp(command.Command): + """Delete a floating IP""" + + log = logging.getLogger(__name__ + '.DeleteFloatingIp') + + def get_parser(self, prog_name): + parser = super(DeleteFloatingIp, self).get_parser(prog_name) + parser.add_argument( + 'id', + metavar='', + help='Identifier of floating IP to delete', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = neu2.DeleteFloatingIP(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class ListFloatingIp(lister.Lister): + """List floating IPs""" + + log = logging.getLogger(__name__ + '.ListFloatingIp') + + def get_parser(self, prog_name): + parser = super(ListFloatingIp, self).get_parser(prog_name) + parser.add_argument( + '--long', + dest='show_details', + action='store_true', + default=False, + help='Long listing', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = neu2.ListFloatingIP(self.app, self.app_args) + return neuter.take_action(parsed_args) + + +class ShowFloatingIp(show.ShowOne): + """Show a floating IP""" + + log = logging.getLogger(__name__ + '.ShowFloatingIp') + + def get_parser(self, prog_name): + parser = super(ShowFloatingIp, self).get_parser(prog_name) + parser.add_argument( + 'id', + metavar='', + help='ID of floating IP to show', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + parsed_args.show_details = True + neuter = neu2.ShowFloatingIP(self.app, self.app_args) + return neuter.take_action(parsed_args) diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 1f930a8d5c..d1e51e82b1 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -42,7 +42,7 @@ def get_parser(self, prog_name): parser.add_argument( '--project', dest='tenant_id', - default=False, help='the owner project id') + help='the owner project id') parser.add_argument( 'name', metavar='NAME', help='Name of network to create') @@ -79,11 +79,6 @@ class ListNetwork(lister.Lister): log = logging.getLogger(__name__ + '.ListNetwork') - def __init__(self, app, app_args): - super(ListNetwork, self).__init__(app, app_args) - self.app = app - self.app_args = app_args - def get_parser(self, prog_name): parser = super(ListNetwork, self).get_parser(prog_name) parser.add_argument( diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index 16f0c4a38d..4c16a1db39 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -112,11 +112,6 @@ class ListPort(lister.Lister): log = logging.getLogger(__name__ + '.ListPort') - def __init__(self, app, app_args): - super(ListPort, self).__init__(app, app_args) - self.app = app - self.app_args = app_args - def get_parser(self, prog_name): parser = super(ListPort, self).get_parser(prog_name) parser.add_argument( diff --git a/openstackclient/tests/network/v2_0/common.py b/openstackclient/tests/network/v2_0/common.py new file mode 100644 index 0000000000..b7cef5cdff --- /dev/null +++ b/openstackclient/tests/network/v2_0/common.py @@ -0,0 +1,66 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import argparse +import mock + +from openstackclient.tests import utils + + +class TestNetworkBase(utils.TestCase): + def given_args(self, clz, args): + args = args.split() + app = mock.Mock() + cmd = clz(app, argparse.Namespace()) + parser = cmd.get_parser(str(clz)) + try: + parsed_args = parser.parse_args(args) + except SystemExit: + self.assertEqual('Bad argument: ' + str(args), '') + return parsed_args + + def given_default_show_options(self): + return "" + + def then_default_show_options(self, parsed): + self.assertEqual('table', parsed.formatter) + self.assertEqual([], parsed.columns) + self.assertEqual([], parsed.variables) + self.assertEqual('', parsed.prefix) + + def given_all_show_options(self): + return " -f shell -c id --variable VAR --prefix TST" + + def then_all_show_options(self, parsed): + self.assertEqual('shell', parsed.formatter) + self.assertEqual(['id'], parsed.columns) + self.assertEqual(['VAR'], parsed.variables) + self.assertEqual('TST', parsed.prefix) + + def given_default_list_options(self): + return "" + + def then_default_list_options(self, parsed): + self.assertEqual('table', parsed.formatter) + self.assertEqual([], parsed.columns) + self.assertEqual('nonnumeric', parsed.quote_mode) + + def given_all_list_options(self): + return " -f csv -c id --quote all" + + def then_all_list_options(self, parsed): + self.assertEqual('csv', parsed.formatter) + self.assertEqual(['id'], parsed.columns) + self.assertEqual('all', parsed.quote_mode) diff --git a/openstackclient/tests/network/v2_0/test_floatingip.py b/openstackclient/tests/network/v2_0/test_floatingip.py new file mode 100644 index 0000000000..21cdfaa849 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_floatingip.py @@ -0,0 +1,72 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0 import floatingip +from openstackclient.tests.network.v2_0 import common + + +class TestCreateFloatingIp(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(floatingip.CreateFloatingIp, given) + self.assertEqual('noo', parsed.floating_network_id) + self.assertEqual(None, parsed.fixed_ip_address) + self.assertEqual(None, parsed.port_id) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too --fixed-ip 1.1.1.1 --port 123 --project sneed" + allargs += self.given_all_show_options() + parsed = self.given_args(floatingip.CreateFloatingIp, allargs) + self.assertEqual('too', parsed.floating_network_id) + self.assertEqual('1.1.1.1', parsed.fixed_ip_address) + self.assertEqual('123', parsed.port_id) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteFloatingIp(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(floatingip.DeleteFloatingIp, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListFloatingIp(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(floatingip.ListFloatingIp, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(floatingip.ListFloatingIp, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestShowFloatingIp(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(floatingip.ShowFloatingIp, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too " + self.given_all_show_options() + parsed = self.given_args(floatingip.ShowFloatingIp, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index bc3a615e79..a9d75efc10 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -24,15 +24,17 @@ def test_get_parser_nothing(self): self.assertEqual('noo', parsed.name) self.assertEqual(True, parsed.admin_state) self.assertEqual(False, parsed.shared) + self.assertEqual(None, parsed.tenant_id) self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too --admin-state-down --shared" + allargs = "too --admin-state-down --shared --project sneed" allargs += self.given_all_show_options() parsed = self.given_args(network.CreateNetwork, allargs) self.assertEqual('too', parsed.name) self.assertEqual(False, parsed.admin_state) self.assertEqual(True, parsed.shared) + self.assertEqual('sneed', parsed.tenant_id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_port.py b/openstackclient/tests/network/v2_0/test_port.py index 8a280b1d23..9cac1a00f4 100644 --- a/openstackclient/tests/network/v2_0/test_port.py +++ b/openstackclient/tests/network/v2_0/test_port.py @@ -37,7 +37,7 @@ def test_get_parser_all(self): allargs = 'too --device-id DI --disable --extra-dhcp-opt DO ' \ '--fixed-ip FI -f shell --mac-address MA ' \ '--network NI --security-group ONE ' \ - '--security-group TWO --project PROJ ' + '--security-group TWO --project sneed ' allargs += self.given_all_show_options() parsed = self.given_args(port.CreatePort, allargs) self.assertEqual('too', parsed.name) @@ -49,7 +49,7 @@ def test_get_parser_all(self): self.assertEqual('NI', parsed.network_id) self.assertEqual(False, parsed.no_security_groups) self.assertEqual(['ONE', 'TWO'], parsed.security_groups) - self.assertEqual('PROJ', parsed.tenant_id) + self.assertEqual('sneed', parsed.tenant_id) self.then_all_show_options(parsed) diff --git a/setup.cfg b/setup.cfg index 8a89ffd942..a8f9728997 100644 --- a/setup.cfg +++ b/setup.cfg @@ -67,9 +67,10 @@ openstack.compute.v2 = ip_fixed_remove = openstackclient.compute.v2.fixedip:RemoveFixedIP ip_floating_add = openstackclient.compute.v2.floatingip:AddFloatingIP - ip_floating_create = openstackclient.compute.v2.floatingip:CreateFloatingIP - ip_floating_delete = openstackclient.compute.v2.floatingip:DeleteFloatingIP - ip_floating_list = openstackclient.compute.v2.floatingip:ListFloatingIP + ip_floating_create = openstackclient.network.v2_0.floatingip:CreateFloatingIp + ip_floating_delete = openstackclient.network.v2_0.floatingip:DeleteFloatingIp + ip_floating_list = openstackclient.network.v2_0.floatingip:ListFloatingIp + ip_floating_show = openstackclient.network.v2_0.floatingip:ShowFloatingIp ip_floating_remove = openstackclient.compute.v2.floatingip:RemoveFloatingIP ip_floating_pool_list = openstackclient.compute.v2.floatingippool:ListFloatingIPPool @@ -284,12 +285,6 @@ openstack.network.v2_0 = lb_get_hosting_pool = neutronclient.neutron.v2_0.agentscheduler:GetLbaasAgentHostingPool extension_list = neutronclient.neutron.v2_0.extension:ListExt extension_show = neutronclient.neutron.v2_0.extension:ShowExt - floating_ip_list = neutronclient.neutron.v2_0.extension:ListFloatingIP - floating_ip_show = neutronclient.neutron.v2_0.extension:ShowFloatingIP - floating_ip_create = neutronclient.neutron.v2_0.extension:CreateFloatingIP - floating_ip_delete = neutronclient.neutron.v2_0.extension:DeleteFloatingIP - floating_ip_add = neutronclient.neutron.v2_0.extension:AssociateFloatingIP - floating_ip_remove = neutronclient.neutron.v2_0.extension:DisassociateFloatingIP network_profile_list = neutronclient.neutron.v2_0.networkprofile:ListNetworkProfile network_profile_show = neutronclient.neutron.v2_0.networkprofile:ShowNetworkProfile network_profile_create = neutronclient.neutron.v2_0.networkprofile:CreateNetworkProfile From e427f6bf1f8c06eefde0811c1850205a30f36b62 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 28 Nov 2013 07:56:59 -0700 Subject: [PATCH 06/66] generalize --- openstackclient/network/v2_0/__init__.py | 135 +++++++++++++++++++++ openstackclient/network/v2_0/floatingip.py | 79 ++---------- openstackclient/network/v2_0/network.py | 97 +++------------ openstackclient/network/v2_0/port.py | 93 +++----------- 4 files changed, 186 insertions(+), 218 deletions(-) diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py index 85ac2501b8..9b2f007409 100644 --- a/openstackclient/network/v2_0/__init__.py +++ b/openstackclient/network/v2_0/__init__.py @@ -12,3 +12,138 @@ # License for the specific language governing permissions and limitations # under the License. # +import logging + +from cliff import command +from cliff import lister +from cliff import show + + +class CreateCommand(show.ShowOne): + + log = logging.getLogger(__name__ + '.CreateCommand') + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(CreateCommand, self).get_parser(prog_name) + parser.add_argument( + '--project', + dest='tenant_id', + help='the owner project id') + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + return neuter.take_action(parsed_args) + + +class DeleteCommand(command.Command): + + log = logging.getLogger(__name__ + '.DeleteCommand') + name = "id" + metavar = "" + help_text = "Identifier of object to delete" + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(DeleteCommand, self).get_parser(prog_name) + parser.add_argument( + self.name, + metavar=self.metavar, + help=self.help_text, + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + return neuter.take_action(parsed_args) + + +class ListCommand(lister.Lister): + + log = logging.getLogger(__name__ + '.ListCommand') + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(ListCommand, self).get_parser(prog_name) + parser.add_argument( + '--long', + dest='show_details', + action='store_true', + default=False, + help='Long listing', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + return neuter.take_action(parsed_args) + + +class SetCommand(show.ShowOne): + + log = logging.getLogger(__name__ + '.SetCommand') + name = "id" + metavar = "" + help_text = "Identifier of object to set" + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(SetCommand, self).get_parser(prog_name) + parser.add_argument( + '--project', + dest='tenant_id', + help='the owner project id') + parser.add_argument( + self.name, + metavar=self.metavar, + help=self.help_text, + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + return neuter.take_action(parsed_args) + + +class ShowCommand(show.ShowOne): + + log = logging.getLogger(__name__ + '.ShowCommand') + name = "id" + metavar = "" + help_text = "Identifier of object to delete" + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(ShowCommand, self).get_parser(prog_name) + parser.add_argument( + self.name, + metavar=self.metavar, + help=self.help_text, + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + parsed_args.show_details = True + return neuter.take_action(parsed_args) diff --git a/openstackclient/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py index 2e6b00b3a2..17fc2fd719 100644 --- a/openstackclient/network/v2_0/floatingip.py +++ b/openstackclient/network/v2_0/floatingip.py @@ -15,19 +15,14 @@ """FloatingIp action implementations""" -import logging - -from cliff import command -from cliff import lister -from cliff import show - from neutronclient.neutron.v2_0 import floatingip as neu2 +from openstackclient.network import v2_0 as v2_0 -class CreateFloatingIp(show.ShowOne): +class CreateFloatingIp(v2_0.CreateCommand): """Create a floating IP""" - log = logging.getLogger(__name__ + '.CreateFloatingIp') + clazz = neu2.CreateFloatingIP def get_parser(self, prog_name): parser = super(CreateFloatingIp, self).get_parser(prog_name) @@ -39,79 +34,27 @@ def get_parser(self, prog_name): '--port', dest='port_id', help='ID of port to add the floating IP to') - parser.add_argument( - '--project', - dest='tenant_id', - help='the owner project id') parser.add_argument( 'floating_network_id', help='ID of network to create the floating IP in') return parser - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = neu2.CreateFloatingIP(self.app, self.app_args) - return neuter.take_action(parsed_args) - -class DeleteFloatingIp(command.Command): +class DeleteFloatingIp(v2_0.DeleteCommand): """Delete a floating IP""" - log = logging.getLogger(__name__ + '.DeleteFloatingIp') - - def get_parser(self, prog_name): - parser = super(DeleteFloatingIp, self).get_parser(prog_name) - parser.add_argument( - 'id', - metavar='', - help='Identifier of floating IP to delete', - ) - return parser + clazz = neu2.DeleteFloatingIP + help_text = "Identifier of floating IP to delete" - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = neu2.DeleteFloatingIP(self.app, self.app_args) - return neuter.take_action(parsed_args) - -class ListFloatingIp(lister.Lister): +class ListFloatingIp(v2_0.ListCommand): """List floating IPs""" - log = logging.getLogger(__name__ + '.ListFloatingIp') + clazz = neu2.ListFloatingIP - def get_parser(self, prog_name): - parser = super(ListFloatingIp, self).get_parser(prog_name) - parser.add_argument( - '--long', - dest='show_details', - action='store_true', - default=False, - help='Long listing', - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = neu2.ListFloatingIP(self.app, self.app_args) - return neuter.take_action(parsed_args) - -class ShowFloatingIp(show.ShowOne): +class ShowFloatingIp(v2_0.ShowCommand): """Show a floating IP""" - log = logging.getLogger(__name__ + '.ShowFloatingIp') - - def get_parser(self, prog_name): - parser = super(ShowFloatingIp, self).get_parser(prog_name) - parser.add_argument( - 'id', - metavar='', - help='ID of floating IP to show', - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - parsed_args.show_details = True - neuter = neu2.ShowFloatingIP(self.app, self.app_args) - return neuter.take_action(parsed_args) + clazz = neu2.ShowFloatingIP + help_text = "Identifier of floating IP to show" diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index d1e51e82b1..44e642e968 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -15,19 +15,14 @@ """Network action implementations""" -import logging - -from cliff import command -from cliff import lister -from cliff import show - from neutronclient.neutron.v2_0 import network as neu2 +from openstackclient.network import v2_0 as v2_0 -class CreateNetwork(show.ShowOne): +class CreateNetwork(v2_0.CreateCommand): """Create a network""" - log = logging.getLogger(__name__ + '.CreateNetwork') + clazz = neu2.CreateNetwork def get_parser(self, prog_name): parser = super(CreateNetwork, self).get_parser(prog_name) @@ -39,55 +34,26 @@ def get_parser(self, prog_name): '--shared', action='store_true', default=False, help='Set the network as shared') - parser.add_argument( - '--project', - dest='tenant_id', - help='the owner project id') parser.add_argument( 'name', metavar='NAME', help='Name of network to create') return parser - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = neu2.CreateNetwork(self.app, self.app_args) - return neuter.take_action(parsed_args) - -class DeleteNetwork(command.Command): +class DeleteNetwork(v2_0.DeleteCommand): """Delete a network""" - log = logging.getLogger(__name__ + '.DeleteNetwork') - - def get_parser(self, prog_name): - parser = super(DeleteNetwork, self).get_parser(prog_name) - parser.add_argument( - 'network', - metavar='', - help='Name or ID of network to delete', - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = neu2.DeleteNetwork(self.app, self.app_args) - return neuter.take_action(parsed_args) + clazz = neu2.DeleteNetwork + name = 'id' + metavar = '' + help_text = 'Name or ID of network to delete' -class ListNetwork(lister.Lister): +class ListNetwork(v2_0.ListCommand): """List networks""" - log = logging.getLogger(__name__ + '.ListNetwork') - def get_parser(self, prog_name): parser = super(ListNetwork, self).get_parser(prog_name) - parser.add_argument( - '--long', - dest='show_details', - action='store_true', - default=False, - help='Long listing', - ) parser.add_argument( '--external', action='store_true', @@ -102,46 +68,23 @@ def take_action(self, parsed_args): neuter = neu2.ListExternalNetwork(self.app, self.app_args) else: neuter = neu2.ListNetwork(self.app, self.app_args) + neuter.get_client = self.get_client return neuter.take_action(parsed_args) -class SetNetwork(command.Command): +class SetNetwork(v2_0.SetCommand): """Set network values""" - log = logging.getLogger(__name__ + '.SetNetwork') - - def get_parser(self, prog_name): - parser = super(SetNetwork, self).get_parser(prog_name) - parser.add_argument( - 'network', - metavar='', - help='Name or ID of network to update', - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = neu2.UpdateNetwork(self.app, self.app_args) - return neuter.take_action(parsed_args) + clazz = neu2.UpdateNetwork + name = 'network' + metavar = '' + help_text = 'Name or ID of network to set' -class ShowNetwork(show.ShowOne): +class ShowNetwork(v2_0.ShowCommand): """Show a network""" - log = logging.getLogger(__name__ + '.ShowNetwork') - - def get_parser(self, prog_name): - parser = super(ShowNetwork, self).get_parser(prog_name) - parser.add_argument( - 'network', - metavar='', - help='Name or ID of network to show', - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - parsed_args.show_details = True - parsed_args.id = parsed_args.network - neuter = neu2.ShowNetwork(self.app, self.app_args) - return neuter.take_action(parsed_args) + clazz = neu2.ShowNetwork + name = 'id' + metavar = '' + help_text = 'Name or ID of network to show' diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index 4c16a1db39..3e2ee64588 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -15,19 +15,14 @@ """Port action implementations""" -import logging - -from cliff import command -from cliff import lister -from cliff import show - from neutronclient.neutron.v2_0 import port as neu2 +from openstackclient.network import v2_0 as v2_0 -class CreatePort(show.ShowOne): +class CreatePort(v2_0.CreateCommand): """Create a port""" - log = logging.getLogger(__name__ + '.CreatePort') + clazz = neu2.CreatePort def get_parser(self, prog_name): parser = super(CreatePort, self).get_parser(prog_name) @@ -72,55 +67,26 @@ def get_parser(self, prog_name): default=[], action='append', dest='security_groups', help='security group associated with the port ' '(This option can be repeated)') - parser.add_argument( - '--project', - dest='tenant_id', - help='the owner project id') parser.add_argument( 'name', metavar='NAME', help='Name of port to create') return parser - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = neu2.CreatePort(self.app, self.app_args) - return neuter.take_action(parsed_args) - -class DeletePort(command.Command): +class DeletePort(v2_0.DeleteCommand): """Delete a port""" - log = logging.getLogger(__name__ + '.DeletePort') - - def get_parser(self, prog_name): - parser = super(DeletePort, self).get_parser(prog_name) - parser.add_argument( - 'port', - metavar='', - help='Name or ID of port to delete', - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = neu2.DeletePort(self.app, self.app_args) - return neuter.take_action(parsed_args) + clazz = neu2.DeletePort + name = 'port' + metavar = '' + help_text = 'Name or ID of port to delete' -class ListPort(lister.Lister): +class ListPort(v2_0.ListCommand): """List port""" - log = logging.getLogger(__name__ + '.ListPort') - def get_parser(self, prog_name): parser = super(ListPort, self).get_parser(prog_name) - parser.add_argument( - '--long', - dest='show_details', - action='store_true', - default=False, - help='Long listing', - ) parser.add_argument( '--router', help='List ports that belong to a given router', @@ -134,13 +100,17 @@ def take_action(self, parsed_args): neuter = neu2.ListRouterPort(self.app, self.app_args) else: neuter = neu2.ListPort(self.app, self.app_args) + neuter.get_client = self.get_client return neuter.take_action(parsed_args) -class SetPort(command.Command): +class SetPort(v2_0.SetCommand): """Set port values""" - log = logging.getLogger(__name__ + '.SetPort') + clazz = neu2.UpdatePort + name = 'port' + metavar = '' + help_text = 'Name or ID of port to update' def get_parser(self, prog_name): parser = super(SetPort, self).get_parser(prog_name) @@ -161,36 +131,13 @@ def get_parser(self, prog_name): help='extra dhcp options to be assigned to this port: ' 'opt_name=,opt_value=, ' '(This option can be repeated.)') - parser.add_argument( - 'port', - metavar='', - help='Name or ID of port to update', - ) return parser - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = neu2.UpdatePort(self.app, self.app_args) - return neuter.take_action(parsed_args) - -class ShowPort(show.ShowOne): +class ShowPort(v2_0.ShowCommand): """Show a port""" - log = logging.getLogger(__name__ + '.ShowPort') - - def get_parser(self, prog_name): - parser = super(ShowPort, self).get_parser(prog_name) - parser.add_argument( - 'port', - metavar='', - help='Name or ID of port to show', - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - parsed_args.show_details = True - parsed_args.id = parsed_args.port - neuter = neu2.ShowPort(self.app, self.app_args) - return neuter.take_action(parsed_args) + clazz = neu2.ShowPort + name = 'port' + metavar = '' + help_text = 'Name or ID of port to show' From a6a552b387e8d8e12745db20f8e066fb1f7366ea Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 28 Nov 2013 10:12:35 -0700 Subject: [PATCH 07/66] fix ports --- openstackclient/network/v2_0/__init__.py | 2 +- openstackclient/network/v2_0/port.py | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py index 9b2f007409..ff069afdb6 100644 --- a/openstackclient/network/v2_0/__init__.py +++ b/openstackclient/network/v2_0/__init__.py @@ -92,7 +92,7 @@ def take_action(self, parsed_args): return neuter.take_action(parsed_args) -class SetCommand(show.ShowOne): +class SetCommand(command.Command): log = logging.getLogger(__name__ + '.SetCommand') name = "id" diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index 3e2ee64588..2c709ccbb7 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -54,10 +54,6 @@ def get_parser(self, prog_name): parser.add_argument( '--mac-address', help='mac address of this port') - parser.add_argument( - '--network', - dest='network_id', - help='Network id or name this port belongs to') parser.add_argument( '--no-security-groups', action='store_true', @@ -67,6 +63,11 @@ def get_parser(self, prog_name): default=[], action='append', dest='security_groups', help='security group associated with the port ' '(This option can be repeated)') + parser.add_argument( + '--network', + dest='network_id', + required=True, + help='Network id or name this port belongs to') parser.add_argument( 'name', metavar='NAME', help='Name of port to create') @@ -77,7 +78,7 @@ class DeletePort(v2_0.DeleteCommand): """Delete a port""" clazz = neu2.DeletePort - name = 'port' + name = 'id' metavar = '' help_text = 'Name or ID of port to delete' @@ -108,7 +109,7 @@ class SetPort(v2_0.SetCommand): """Set port values""" clazz = neu2.UpdatePort - name = 'port' + name = 'id' metavar = '' help_text = 'Name or ID of port to update' @@ -138,6 +139,6 @@ class ShowPort(v2_0.ShowCommand): """Show a port""" clazz = neu2.ShowPort - name = 'port' + name = 'id' metavar = '' help_text = 'Name or ID of port to show' From fe92cf07ec441194cd0e2e9ae9bcf7cbcfa63d09 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 2 Dec 2013 10:29:45 -0700 Subject: [PATCH 08/66] security groups --- .../network/v2_0/security_group.py | 78 +++++++++++++++++++ setup.cfg | 15 ++-- 2 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 openstackclient/network/v2_0/security_group.py diff --git a/openstackclient/network/v2_0/security_group.py b/openstackclient/network/v2_0/security_group.py new file mode 100644 index 0000000000..9f133ba227 --- /dev/null +++ b/openstackclient/network/v2_0/security_group.py @@ -0,0 +1,78 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Security Group action implementations""" + +from neutronclient.neutron.v2_0 import securitygroup as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class CreateSecurityGroup(v2_0.CreateCommand): + """Create a security group""" + + clazz = neu2.CreateSecurityGroup + + def get_parser(self, prog_name): + parser = super(CreateSecurityGroup, self).get_parser(prog_name) + parser.add_argument( + '--description', + help='description of this security group') + parser.add_argument( + 'name', metavar='NAME', + help='Name of security group to create') + return parser + + +class DeleteSecurityGroup(v2_0.DeleteCommand): + """Delete a security group""" + + clazz = neu2.DeleteSecurityGroup + name = 'id' + metavar = '' + help_text = 'Name or ID of security group to delete' + + +class ListSecurityGroup(v2_0.ListCommand): + """List security group""" + + clazz = neu2.ListSecurityGroup + + +class SetSecurityGroup(v2_0.SetCommand): + """Set security group values""" + + clazz = neu2.UpdateSecurityGroup + name = 'id' + metavar = '' + help_text = 'ID of security group to update' + + def get_parser(self, prog_name): + parser = super(SetSecurityGroup, self).get_parser(prog_name) + parser.add_argument( + '--description', + help='Description of the security group') + parser.add_argument( + '--name', + help='Name of the security group') + return parser + + +class ShowSecurityGroup(v2_0.ShowCommand): + """Show a security group""" + + clazz = neu2.ShowSecurityGroup + name = 'id' + metavar = '' + help_text = 'Name or ID of security group to show' diff --git a/setup.cfg b/setup.cfg index b606809fc6..91fe8e90bc 100644 --- a/setup.cfg +++ b/setup.cfg @@ -89,11 +89,6 @@ openstack.compute.v2 = project_usage_list = openstackclient.compute.v2.usage:ListUsage - security_group_create = openstackclient.compute.v2.security_group:CreateSecurityGroup - security_group_delete = openstackclient.compute.v2.security_group:DeleteSecurityGroup - security_group_list = openstackclient.compute.v2.security_group:ListSecurityGroup - security_group_set = openstackclient.compute.v2.security_group:SetSecurityGroup - security_group_show = openstackclient.compute.v2.security_group:ShowSecurityGroup security_group_rule_create = openstackclient.compute.v2.security_group:CreateSecurityGroupRule security_group_rule_delete = openstackclient.compute.v2.security_group:DeleteSecurityGroupRule security_group_rule_list = openstackclient.compute.v2.security_group:ListSecurityGroupRule @@ -330,11 +325,11 @@ openstack.network.v2_0 = router_update = neutronclient.neutron.v2_0.router:UpdateRouter router_interface_add = neutronclient.neutron.v2_0.router:AddInterfaceRouter router_interface_remove = neutronclient.neutron.v2_0.router:RemoveInterfaceRouter - security_group_list = neutronclient.neutron.v2_0.securitygroup:ListSecurityGroup - security_group_show = neutronclient.neutron.v2_0.securitygroup:ShowSecurityGroup - security_group_create = neutronclient.neutron.v2_0.securitygroup:CreateSecurityGroup - security_group_delete = neutronclient.neutron.v2_0.securitygroup:DeleteSecurityGroup - security_group_update = neutronclient.neutron.v2_0.securitygroup:UpdateSecurityGroup + security_group_create = openstackclient.network.v2_0.security_group:CreateSecurityGroup + security_group_delete = openstackclient.network.v2_0.security_group:DeleteSecurityGroup + security_group_list = openstackclient.network.v2_0.security_group:ListSecurityGroup + security_group_set = openstackclient.network.v2_0.security_group:SetSecurityGroup + security_group_show = openstackclient.network.v2_0.security_group:ShowSecurityGroup security_group_rule_list = neutronclient.neutron.v2_0.securitygroup:ListSecurityGroupRule security_group_rule_show = neutronclient.neutron.v2_0.securitygroup:ShowSecurityGroupRule security_group_rule_create = neutronclient.neutron.v2_0.securitygroup:CreateSecurityGroupRule From c8902983efd8764be120297417dde36b76680996 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 2 Dec 2013 13:11:05 -0700 Subject: [PATCH 09/66] add tests for security groups --- .../tests/network/v2_0/test_network.py | 6 +- .../tests/network/v2_0/test_port.py | 14 ++-- .../tests/network/v2_0/test_security_group.py | 83 +++++++++++++++++++ 3 files changed, 93 insertions(+), 10 deletions(-) create mode 100644 openstackclient/tests/network/v2_0/test_security_group.py diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index a9d75efc10..42919dcd33 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -41,7 +41,7 @@ def test_get_parser_all(self): class TestDeleteNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(network.DeleteNetwork, "noo") - self.assertEqual('noo', parsed.network) + self.assertEqual('noo', parsed.id) class TestListNetwork(common.TestNetworkBase): @@ -70,11 +70,11 @@ class TestShowNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(network.ShowNetwork, given) - self.assertEqual('noo', parsed.network) + self.assertEqual('noo', parsed.id) self.then_default_show_options(parsed) def test_get_parser_all(self): allargs = "too " + self.given_all_show_options() parsed = self.given_args(network.ShowNetwork, allargs) - self.assertEqual('too', parsed.network) + self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_port.py b/openstackclient/tests/network/v2_0/test_port.py index 9cac1a00f4..29c05b3429 100644 --- a/openstackclient/tests/network/v2_0/test_port.py +++ b/openstackclient/tests/network/v2_0/test_port.py @@ -19,7 +19,7 @@ class TestCreatePort(common.TestNetworkBase): def test_get_parser_nothing(self): - given = "noo" + self.given_default_show_options() + given = "noo --network netty" + self.given_default_show_options() parsed = self.given_args(port.CreatePort, given) self.assertEqual('noo', parsed.name) self.assertEqual(True, parsed.admin_state) @@ -27,7 +27,7 @@ def test_get_parser_nothing(self): self.assertEqual([], parsed.extra_dhcp_opts) self.assertEqual(None, parsed.fixed_ip) self.assertEqual(None, parsed.mac_address) - self.assertEqual(None, parsed.network_id) + self.assertEqual('netty', parsed.network_id) self.assertEqual(False, parsed.no_security_groups) self.assertEqual([], parsed.security_groups) self.assertEqual(None, parsed.tenant_id) @@ -56,7 +56,7 @@ def test_get_parser_all(self): class TestDeletePort(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(port.DeletePort, "noo") - self.assertEqual('noo', parsed.port) + self.assertEqual('noo', parsed.id) class TestListPort(common.TestNetworkBase): @@ -78,7 +78,7 @@ def test_get_parser_all(self): class TestSetPort(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(port.SetPort, "noo") - self.assertEqual('noo', parsed.port) + self.assertEqual('noo', parsed.id) self.assertEqual([], parsed.extra_dhcp_opts) self.assertEqual(False, parsed.no_security_groups) self.assertEqual([], parsed.security_groups) @@ -87,7 +87,7 @@ def test_get_parser_all(self): allargs = 'too --extra-dhcp-opt DO --security-group ONE ' \ '--security-group TWO ' parsed = self.given_args(port.SetPort, allargs) - self.assertEqual('too', parsed.port) + self.assertEqual('too', parsed.id) self.assertEqual(['DO'], parsed.extra_dhcp_opts) self.assertEqual(False, parsed.no_security_groups) self.assertEqual(['ONE', 'TWO'], parsed.security_groups) @@ -97,11 +97,11 @@ class TestShowPort(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(port.ShowPort, given) - self.assertEqual('noo', parsed.port) + self.assertEqual('noo', parsed.id) self.then_default_show_options(parsed) def test_get_parser_all(self): allargs = "too" + self.given_all_show_options() parsed = self.given_args(port.ShowPort, allargs) - self.assertEqual('too', parsed.port) + self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_security_group.py b/openstackclient/tests/network/v2_0/test_security_group.py new file mode 100644 index 0000000000..f06b026606 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_security_group.py @@ -0,0 +1,83 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0 import security_group +from openstackclient.tests.network.v2_0 import common + + +class TestCreateSecurityGroup(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(security_group.CreateSecurityGroup, given) + self.assertEqual('noo', parsed.name) + self.assertEqual(None, parsed.description) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = 'too --description sgtoo --project sneed ' + allargs += self.given_all_show_options() + parsed = self.given_args(security_group.CreateSecurityGroup, allargs) + self.assertEqual('too', parsed.name) + self.assertEqual('sgtoo', parsed.description) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteSecurityGroup(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(security_group.DeleteSecurityGroup, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListSecurityGroup(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(security_group.ListSecurityGroup, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(security_group.ListSecurityGroup, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetSecurityGroup(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(security_group.SetSecurityGroup, "noo") + self.assertEqual('noo', parsed.id) + self.assertEqual(None, parsed.description) + + def test_get_parser_all(self): + allargs = 'too --description noosgtoo' + parsed = self.given_args(security_group.SetSecurityGroup, allargs) + self.assertEqual('too', parsed.id) + self.assertEqual('noosgtoo', parsed.description) + + +class TestShowSecurityGroup(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(security_group.ShowSecurityGroup, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too" + self.given_all_show_options() + parsed = self.given_args(security_group.ShowSecurityGroup, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) From 94432339651f6268e246090cc4b4767e2dcfbb42 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 2 Dec 2013 18:56:16 -0700 Subject: [PATCH 10/66] security group rules --- .../network/v2_0/security_group_rule.py | 100 ++++++++++++++++++ .../network/v2_0/test_security_group_rule.py | 93 ++++++++++++++++ setup.cfg | 12 +-- 3 files changed, 197 insertions(+), 8 deletions(-) create mode 100644 openstackclient/network/v2_0/security_group_rule.py create mode 100644 openstackclient/tests/network/v2_0/test_security_group_rule.py diff --git a/openstackclient/network/v2_0/security_group_rule.py b/openstackclient/network/v2_0/security_group_rule.py new file mode 100644 index 0000000000..ac204d8510 --- /dev/null +++ b/openstackclient/network/v2_0/security_group_rule.py @@ -0,0 +1,100 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Security Group Rule action implementations""" + +import argparse + +from neutronclient.neutron.v2_0 import securitygroup as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class CreateSecurityGroupRule(v2_0.CreateCommand): + """Create a security group rule""" + + clazz = neu2.CreateSecurityGroupRule + + def get_parser(self, prog_name): + parser = super(CreateSecurityGroupRule, self).get_parser(prog_name) + parser.add_argument( + 'security_group_id', metavar='SECURITY_GROUP', + help='Security group name or id to add rule.') + parser.add_argument( + '--direction', + default='ingress', choices=['ingress', 'egress'], + help='direction of traffic: ingress/egress') + parser.add_argument( + '--ethertype', + default='IPv4', + help='IPv4/IPv6') + parser.add_argument( + '--protocol', + help='protocol of packet') + parser.add_argument( + '--port-range-min', + help='starting port range') + parser.add_argument( + '--port-range-max', + help='ending port range') + parser.add_argument( + '--remote-ip-prefix', + help='cidr to match on') + parser.add_argument( + '--remote-group-id', metavar='REMOTE_GROUP', + help='remote security group name or id to apply rule') + return parser + + +class DeleteSecurityGroupRule(v2_0.DeleteCommand): + """Delete a security group rule""" + + clazz = neu2.DeleteSecurityGroupRule + name = 'id' + metavar = '' + help_text = 'Name or ID of security group rule to delete' + + +class ListSecurityGroupRule(v2_0.ListCommand): + """List security group rule""" + + clazz = neu2.ListSecurityGroupRule + + def get_parser(self, prog_name): + parser = super(ListSecurityGroupRule, self).get_parser(prog_name) + parser.add_argument( + '--no-nameconv', + default=False, + help=argparse.SUPPRESS + ) + parser.add_argument( + '--fields', + default=[], + help=argparse.SUPPRESS + ) + parser.add_argument( + '--page-size', + default=None, + help=argparse.SUPPRESS + ) + return parser + + +class ShowSecurityGroupRule(v2_0.ShowCommand): + """Show a security group rule""" + + clazz = neu2.ShowSecurityGroupRule + name = 'id' + metavar = '' + help_text = 'Name or ID of security group rule to show' diff --git a/openstackclient/tests/network/v2_0/test_security_group_rule.py b/openstackclient/tests/network/v2_0/test_security_group_rule.py new file mode 100644 index 0000000000..d4ee5f9ec6 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_security_group_rule.py @@ -0,0 +1,93 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0 import security_group_rule +from openstackclient.tests.network.v2_0 import common + + +class TestCreateSecurityGroupRule(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(security_group_rule.CreateSecurityGroupRule, + given) + self.assertEqual('noo', parsed.security_group_id) + self.assertEqual('ingress', parsed.direction) + self.assertEqual('IPv4', parsed.ethertype) + self.assertEqual(None, parsed.protocol) + self.assertEqual(None, parsed.port_range_min) + self.assertEqual(None, parsed.port_range_max) + self.assertEqual(None, parsed.remote_ip_prefix) + self.assertEqual(None, parsed.remote_group_id) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = 'too --project sneed' \ + ' --direction egress --ethertype IPv6' \ + ' --protocol 3 --port-range-min 4' \ + ' --port-range-max 5 --remote-ip-prefix 6' \ + ' --remote-group-id 7' + allargs += self.given_all_show_options() + parsed = self.given_args(security_group_rule.CreateSecurityGroupRule, + allargs) + self.assertEqual('too', parsed.security_group_id) + self.assertEqual('egress', parsed.direction) + self.assertEqual('IPv6', parsed.ethertype) + self.assertEqual('3', parsed.protocol) + self.assertEqual('4', parsed.port_range_min) + self.assertEqual('5', parsed.port_range_max) + self.assertEqual('6', parsed.remote_ip_prefix) + self.assertEqual('7', parsed.remote_group_id) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteSecurityGroupRule(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(security_group_rule.DeleteSecurityGroupRule, + "noo") + self.assertEqual('noo', parsed.id) + + +class TestListSecurityGroupRule(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(security_group_rule.ListSecurityGroupRule, + given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(security_group_rule.ListSecurityGroupRule, + allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestShowSecurityGroupRule(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(security_group_rule.ShowSecurityGroupRule, + given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too" + self.given_all_show_options() + parsed = self.given_args(security_group_rule.ShowSecurityGroupRule, + allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/setup.cfg b/setup.cfg index 91fe8e90bc..544cc94097 100644 --- a/setup.cfg +++ b/setup.cfg @@ -89,10 +89,6 @@ openstack.compute.v2 = project_usage_list = openstackclient.compute.v2.usage:ListUsage - security_group_rule_create = openstackclient.compute.v2.security_group:CreateSecurityGroupRule - security_group_rule_delete = openstackclient.compute.v2.security_group:DeleteSecurityGroupRule - security_group_rule_list = openstackclient.compute.v2.security_group:ListSecurityGroupRule - server_add_security_group = openstackclient.compute.v2.server:AddServerSecurityGroup server_add_volume = openstackclient.compute.v2.server:AddServerVolume server_create = openstackclient.compute.v2.server:CreateServer @@ -330,10 +326,10 @@ openstack.network.v2_0 = security_group_list = openstackclient.network.v2_0.security_group:ListSecurityGroup security_group_set = openstackclient.network.v2_0.security_group:SetSecurityGroup security_group_show = openstackclient.network.v2_0.security_group:ShowSecurityGroup - security_group_rule_list = neutronclient.neutron.v2_0.securitygroup:ListSecurityGroupRule - security_group_rule_show = neutronclient.neutron.v2_0.securitygroup:ShowSecurityGroupRule - security_group_rule_create = neutronclient.neutron.v2_0.securitygroup:CreateSecurityGroupRule - security_group_rule_delete = neutronclient.neutron.v2_0.securitygroup:DeleteSecurityGroupRule + security_group_rule_create = openstackclient.network.v2_0.security_group_rule:CreateSecurityGroupRule + security_group_rule_delete = openstackclient.network.v2_0.security_group_rule:DeleteSecurityGroupRule + security_group_rule_list = openstackclient.network.v2_0.security_group_rule:ListSecurityGroupRule + security_group_rule_show = openstackclient.network.v2_0.security_group_rule:ShowSecurityGroupRule subnet_list = neutronclient.neutron.v2_0.subnet:ListSubnet subnet_show = neutronclient.neutron.v2_0.subnet:ShowSubnet subnet_create = neutronclient.neutron.v2_0.subnet:CreateSubnet From 2a3a66fd6bfbac4e57be72fd88fc27ef0cfd32d7 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Tue, 3 Dec 2013 12:43:23 -0700 Subject: [PATCH 11/66] subnets --- openstackclient/network/v2_0/subnet.py | 104 +++++++++++++++++ .../tests/network/v2_0/test_subnet.py | 106 ++++++++++++++++++ setup.cfg | 10 +- 3 files changed, 215 insertions(+), 5 deletions(-) create mode 100644 openstackclient/network/v2_0/subnet.py create mode 100644 openstackclient/tests/network/v2_0/test_subnet.py diff --git a/openstackclient/network/v2_0/subnet.py b/openstackclient/network/v2_0/subnet.py new file mode 100644 index 0000000000..bd24366c0d --- /dev/null +++ b/openstackclient/network/v2_0/subnet.py @@ -0,0 +1,104 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Subnet action implementations""" + +from neutronclient.neutron.v2_0 import subnet as neu2 +from openstackclient.common import parseractions +from openstackclient.network import v2_0 + + +class CreateSubnet(v2_0.CreateCommand): + """Create a subnet""" + + clazz = neu2.CreateSubnet + + def get_parser(self, prog_name): + parser = super(CreateSubnet, self).get_parser(prog_name) + parser.add_argument( + '--name', + help='description of this subnet') + parser.add_argument( + '--ip-version', + type=int, + default=4, choices=[4, 6], + help='IP version with default 4') + parser.add_argument( + '--gateway', metavar='GATEWAY_IP', + help='gateway ip of this subnet') + parser.add_argument( + '--no-gateway', + action='store_true', + help='No distribution of gateway') + parser.add_argument( + '--allocation-pool', metavar='start=IP_ADDR,end=IP_ADDR', + dest='allocation_pools', + action=parseractions.KeyValueAction, + help='Allocation pool IP addresses for this subnet ' + '(repeat option to set multiple properties)') + parser.add_argument( + '--host-route', metavar='destination=CIDR,nexthop=IP_ADDR', + dest='host_routes', + action=parseractions.KeyValueAction, + help='Additional route (repeat option to set multiple properties)') + parser.add_argument( + '--dns-nameserver', metavar='DNS_NAMESERVER', + action='append', dest='dns_nameservers', + help='DNS name server for this subnet ' + '(This option can be repeated)') + parser.add_argument( + '--disable-dhcp', + action='store_true', + help='Disable DHCP for this subnet') + parser.add_argument( + 'network_id', + help='Network of the subnet to create') + parser.add_argument( + 'cidr', + help='CIDR of the subnet to create') + return parser + + +class DeleteSubnet(v2_0.DeleteCommand): + """Delete a subnet""" + + clazz = neu2.DeleteSubnet + name = 'id' + metavar = '' + help_text = 'Name or ID of subnet to delete' + + +class ListSubnet(v2_0.ListCommand): + """List subnet""" + + clazz = neu2.ListSubnet + + +class SetSubnet(v2_0.SetCommand): + """Set subnet values""" + + clazz = neu2.UpdateSubnet + name = 'id' + metavar = '' + help_text = 'ID of subnet to update' + + +class ShowSubnet(v2_0.ShowCommand): + """Show a subnet""" + + clazz = neu2.ShowSubnet + name = 'id' + metavar = '' + help_text = 'Name or ID of subnet to show' diff --git a/openstackclient/tests/network/v2_0/test_subnet.py b/openstackclient/tests/network/v2_0/test_subnet.py new file mode 100644 index 0000000000..903bd44019 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_subnet.py @@ -0,0 +1,106 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0 import subnet +from openstackclient.tests.network.v2_0 import common + + +class TestCreateSubnet(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo apple" + self.given_default_show_options() + parsed = self.given_args(subnet.CreateSubnet, given) + self.assertEqual('noo', parsed.network_id) + self.assertEqual('apple', parsed.cidr) + self.assertEqual(None, parsed.name) + self.assertEqual(4, parsed.ip_version) + self.assertEqual(None, parsed.gateway) + self.assertEqual(False, parsed.no_gateway) + self.assertEqual(None, parsed.allocation_pools) + self.assertEqual(None, parsed.host_routes) + self.assertEqual(None, parsed.dns_nameservers) + self.assertEqual(False, parsed.disable_dhcp) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = 'too 10.1.1.1/24 --project sneed' \ + ' --name 1 --ip-version 6 --gateway 2' \ + ' --no-gateway ' \ + ' --allocation-pool start=10.1.1.1' \ + ' --allocation-pool end=10.1.1.4' \ + ' --host-route destination=10.1.1.1/1' \ + ' --host-route nexthop=20.1.1.1' \ + ' --dns-nameserver 5 --disable-dhcp' + allargs += self.given_all_show_options() + parsed = self.given_args(subnet.CreateSubnet, allargs) + self.assertEqual('too', parsed.network_id) + self.assertEqual('10.1.1.1/24', parsed.cidr) + self.assertEqual('1', parsed.name) + self.assertEqual(6, parsed.ip_version) + self.assertEqual('2', parsed.gateway) + self.assertEqual(True, parsed.no_gateway) + self.assertEqual('10.1.1.1', parsed.allocation_pools['start']) + self.assertEqual('10.1.1.4', parsed.allocation_pools['end']) + self.assertEqual('10.1.1.1/1', parsed.host_routes['destination']) + self.assertEqual('20.1.1.1', parsed.host_routes['nexthop']) + self.assertEqual(['5'], parsed.dns_nameservers) + self.assertEqual(True, parsed.disable_dhcp) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteSubnet(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(subnet.DeleteSubnet, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListSubnet(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(subnet.ListSubnet, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(subnet.ListSubnet, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetSubnet(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(subnet.SetSubnet, "noo") + self.assertEqual('noo', parsed.id) + + def test_get_parser_all(self): + allargs = 'too' + parsed = self.given_args(subnet.SetSubnet, allargs) + self.assertEqual('too', parsed.id) + + +class TestShowSubnet(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(subnet.ShowSubnet, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too" + self.given_all_show_options() + parsed = self.given_args(subnet.ShowSubnet, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/setup.cfg b/setup.cfg index 544cc94097..c8da2e5790 100644 --- a/setup.cfg +++ b/setup.cfg @@ -330,11 +330,11 @@ openstack.network.v2_0 = security_group_rule_delete = openstackclient.network.v2_0.security_group_rule:DeleteSecurityGroupRule security_group_rule_list = openstackclient.network.v2_0.security_group_rule:ListSecurityGroupRule security_group_rule_show = openstackclient.network.v2_0.security_group_rule:ShowSecurityGroupRule - subnet_list = neutronclient.neutron.v2_0.subnet:ListSubnet - subnet_show = neutronclient.neutron.v2_0.subnet:ShowSubnet - subnet_create = neutronclient.neutron.v2_0.subnet:CreateSubnet - subnet_delete = neutronclient.neutron.v2_0.subnet:DeleteSubnet - subnet_update = neutronclient.neutron.v2_0.subnet:UpdateSubnet + subnet_create = openstackclient.network.v2_0.subnet:CreateSubnet + subnet_delete = openstackclient.network.v2_0.subnet:DeleteSubnet + subnet_list = openstackclient.network.v2_0.subnet:ListSubnet + subnet_show = openstackclient.network.v2_0.subnet:ShowSubnet + subnet_set = openstackclient.network.v2_0.subnet:SetSubnet [build_sphinx] source-dir = doc/source From 564e60cc3b44f4d65d313c661d119905cd46cef5 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Tue, 3 Dec 2013 16:03:52 -0700 Subject: [PATCH 12/66] allocation pools and host routes --- openstackclient/network/v2_0/subnet.py | 41 +++++++++++++++---- .../tests/network/v2_0/test_subnet.py | 27 ++++++++---- 2 files changed, 53 insertions(+), 15 deletions(-) diff --git a/openstackclient/network/v2_0/subnet.py b/openstackclient/network/v2_0/subnet.py index bd24366c0d..ec8e611848 100644 --- a/openstackclient/network/v2_0/subnet.py +++ b/openstackclient/network/v2_0/subnet.py @@ -16,7 +16,6 @@ """Subnet action implementations""" from neutronclient.neutron.v2_0 import subnet as neu2 -from openstackclient.common import parseractions from openstackclient.network import v2_0 @@ -25,6 +24,34 @@ class CreateSubnet(v2_0.CreateCommand): clazz = neu2.CreateSubnet + def allocation_pool_parse(self, param): + """Convert min-max range into dictionary + """ + dict = {} + if ',' in param: + for kv_str in param.split(","): + k, v = kv_str.split("=", 1) + dict.update({k: v}) + else: + ray = param.split('-', 1) + dict['start'] = ray[0] + dict['end'] = ray[1] + return dict + + def host_route_parse(self, param): + """Convert cidr=nexthop into dictionary + """ + dict = {} + if ',' in param: + for kv_str in param.split(","): + k, v = kv_str.split("=", 1) + dict.update({k: v}) + else: + ray = param.split('=', 1) + dict['destination'] = ray[0] + dict['nexthop'] = ray[1] + return dict + def get_parser(self, prog_name): parser = super(CreateSubnet, self).get_parser(prog_name) parser.add_argument( @@ -43,15 +70,15 @@ def get_parser(self, prog_name): action='store_true', help='No distribution of gateway') parser.add_argument( - '--allocation-pool', metavar='start=IP_ADDR,end=IP_ADDR', - dest='allocation_pools', - action=parseractions.KeyValueAction, + '--allocation-pool', metavar='START_IP-END_IP', + action='append', dest='allocation_pools', + type=self.allocation_pool_parse, help='Allocation pool IP addresses for this subnet ' '(repeat option to set multiple properties)') parser.add_argument( - '--host-route', metavar='destination=CIDR,nexthop=IP_ADDR', - dest='host_routes', - action=parseractions.KeyValueAction, + '--host-route', metavar='CIDR=IP_ADDR', + action='append', dest='host_routes', + type=self.host_route_parse, help='Additional route (repeat option to set multiple properties)') parser.add_argument( '--dns-nameserver', metavar='DNS_NAMESERVER', diff --git a/openstackclient/tests/network/v2_0/test_subnet.py b/openstackclient/tests/network/v2_0/test_subnet.py index 903bd44019..3aa2ace851 100644 --- a/openstackclient/tests/network/v2_0/test_subnet.py +++ b/openstackclient/tests/network/v2_0/test_subnet.py @@ -38,10 +38,8 @@ def test_get_parser_all(self): allargs = 'too 10.1.1.1/24 --project sneed' \ ' --name 1 --ip-version 6 --gateway 2' \ ' --no-gateway ' \ - ' --allocation-pool start=10.1.1.1' \ - ' --allocation-pool end=10.1.1.4' \ - ' --host-route destination=10.1.1.1/1' \ - ' --host-route nexthop=20.1.1.1' \ + ' --allocation-pool start=10.1.1.1,end=10.1.1.4' \ + ' --host-route destination=10.1.1.1/1,nexthop=20.1.1.1' \ ' --dns-nameserver 5 --disable-dhcp' allargs += self.given_all_show_options() parsed = self.given_args(subnet.CreateSubnet, allargs) @@ -51,15 +49,28 @@ def test_get_parser_all(self): self.assertEqual(6, parsed.ip_version) self.assertEqual('2', parsed.gateway) self.assertEqual(True, parsed.no_gateway) - self.assertEqual('10.1.1.1', parsed.allocation_pools['start']) - self.assertEqual('10.1.1.4', parsed.allocation_pools['end']) - self.assertEqual('10.1.1.1/1', parsed.host_routes['destination']) - self.assertEqual('20.1.1.1', parsed.host_routes['nexthop']) + self.assertEqual('10.1.1.1', parsed.allocation_pools[0]['start']) + self.assertEqual('10.1.1.4', parsed.allocation_pools[0]['end']) + self.assertEqual('10.1.1.1/1', parsed.host_routes[0]['destination']) + self.assertEqual('20.1.1.1', parsed.host_routes[0]['nexthop']) self.assertEqual(['5'], parsed.dns_nameservers) self.assertEqual(True, parsed.disable_dhcp) self.assertEqual('sneed', parsed.tenant_id) self.then_all_show_options(parsed) + def test_get_parser_alternate(self): + allargs = 'too 10.1.1.1/24' \ + ' --allocation-pool 10.1.1.1-10.1.1.4' \ + ' --host-route 10.1.1.1/1=20.1.1.1' + allargs += self.given_all_show_options() + parsed = self.given_args(subnet.CreateSubnet, allargs) + self.assertEqual('too', parsed.network_id) + self.assertEqual('10.1.1.1/24', parsed.cidr) + self.assertEqual('10.1.1.1', parsed.allocation_pools[0]['start']) + self.assertEqual('10.1.1.4', parsed.allocation_pools[0]['end']) + self.assertEqual('10.1.1.1/1', parsed.host_routes[0]['destination']) + self.assertEqual('20.1.1.1', parsed.host_routes[0]['nexthop']) + class TestDeleteSubnet(common.TestNetworkBase): def test_get_parser_nothing(self): From b873f356b91aae62a06294d1bcebeb4b731a94fb Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 4 Dec 2013 10:18:53 -0700 Subject: [PATCH 13/66] routers --- openstackclient/network/v2_0/router.py | 88 +++++++++++++++++ .../tests/network/v2_0/test_router.py | 95 +++++++++++++++++++ setup.cfg | 16 ++-- 3 files changed, 190 insertions(+), 9 deletions(-) create mode 100644 openstackclient/network/v2_0/router.py create mode 100644 openstackclient/tests/network/v2_0/test_router.py diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py new file mode 100644 index 0000000000..74a677189e --- /dev/null +++ b/openstackclient/network/v2_0/router.py @@ -0,0 +1,88 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Router action implementations""" + +from neutronclient.neutron.v2_0 import router as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class CreateRouter(v2_0.CreateCommand): + """Create a router""" + + clazz = neu2.CreateRouter + + def get_parser(self, prog_name): + parser = super(CreateRouter, self).get_parser(prog_name) + parser.add_argument( + '--enable', + dest='admin_state', action='store_true', + default=True, + help='Set administrative state up') + parser.add_argument( + '--disable', + dest='admin_state', action='store_false', + help='Set administrative state down') + parser.add_argument( + '--distributed', + action='store_true', + help='Create a distributed router (Nicira plugin only)') + parser.add_argument( + 'name', metavar='NAME', + help='Name of router to create') + return parser + + +class DeleteRouter(v2_0.DeleteCommand): + """Delete a router""" + + clazz = neu2.DeleteRouter + name = 'id' + metavar = '' + help_text = 'Name or ID of router to delete' + + +class ListRouter(v2_0.ListCommand): + """List router""" + + clazz = neu2.ListRouter + + +class SetRouter(v2_0.SetCommand): + """Set router values""" + + clazz = neu2.UpdateRouter + name = 'id' + metavar = '' + help_text = 'ID of router to update' + + def get_parser(self, prog_name): + parser = super(SetRouter, self).get_parser(prog_name) + parser.add_argument( + '--description', + help='Description of the router') + parser.add_argument( + '--name', + help='Name of the router') + return parser + + +class ShowRouter(v2_0.ShowCommand): + """Show a router""" + + clazz = neu2.ShowRouter + name = 'id' + metavar = '' + help_text = 'Name or ID of router to show' diff --git a/openstackclient/tests/network/v2_0/test_router.py b/openstackclient/tests/network/v2_0/test_router.py new file mode 100644 index 0000000000..70726a7f12 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_router.py @@ -0,0 +1,95 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0 import router +from openstackclient.tests.network.v2_0 import common + + +class TestCreateRouter(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(router.CreateRouter, given) + self.assertEqual('noo', parsed.name) + self.assertEqual(True, parsed.admin_state) + self.assertEqual(False, parsed.distributed) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = 'too --disable --distributed --project sneed ' + allargs += self.given_all_show_options() + parsed = self.given_args(router.CreateRouter, allargs) + self.assertEqual('too', parsed.name) + self.assertEqual(False, parsed.admin_state) + self.assertEqual(True, parsed.distributed) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + def test_get_parser_all_enable(self): + allargs = 'too --enable --project sneed ' + allargs += self.given_all_show_options() + parsed = self.given_args(router.CreateRouter, allargs) + self.assertEqual('too', parsed.name) + self.assertEqual(True, parsed.admin_state) + self.assertEqual(False, parsed.distributed) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteRouter(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(router.DeleteRouter, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListRouter(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(router.ListRouter, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(router.ListRouter, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetRouter(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(router.SetRouter, "noo") + self.assertEqual('noo', parsed.id) + self.assertEqual(None, parsed.description) + + def test_get_parser_all(self): + allargs = 'too --description noosgtoo' + parsed = self.given_args(router.SetRouter, allargs) + self.assertEqual('too', parsed.id) + self.assertEqual('noosgtoo', parsed.description) + + +class TestShowRouter(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(router.ShowRouter, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too" + self.given_all_show_options() + parsed = self.given_args(router.ShowRouter, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/setup.cfg b/setup.cfg index c8da2e5790..770dc3e54e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -312,15 +312,13 @@ openstack.network.v2_0 = port_delete = openstackclient.network.v2_0.port:DeletePort port_set = openstackclient.network.v2_0.port:SetPort port_show = openstackclient.network.v2_0.port:ShowPort - router_create = neutronclient.neutron.v2_0.router:CreateRouter - router_delete = neutronclient.neutron.v2_0.router:DeleteRouter - router_list = neutronclient.neutron.v2_0.router:ListRouter - router_set = neutronclient.neutron.v2_0.router:SetGatewayRouter - router_unset = neutronclient.neutron.v2_0.router:RemoveGatewayRouter - router_show = neutronclient.neutron.v2_0.router:ShowRouter - router_update = neutronclient.neutron.v2_0.router:UpdateRouter - router_interface_add = neutronclient.neutron.v2_0.router:AddInterfaceRouter - router_interface_remove = neutronclient.neutron.v2_0.router:RemoveInterfaceRouter + router_create = openstackclient.network.v2_0.router:CreateRouter + router_delete = openstackclient.network.v2_0.router:DeleteRouter + router_list = openstackclient.network.v2_0.router:ListRouter + router_set = openstackclient.network.v2_0.router:SetRouter + router_show = openstackclient.network.v2_0.router:ShowRouter + router_add_interface = neutronclient.neutron.v2_0.router:AddInterfaceRouter + router_remove_interface = neutronclient.neutron.v2_0.router:RemoveInterfaceRouter security_group_create = openstackclient.network.v2_0.security_group:CreateSecurityGroup security_group_delete = openstackclient.network.v2_0.security_group:DeleteSecurityGroup security_group_list = openstackclient.network.v2_0.security_group:ListSecurityGroup From 574163ae1cf814a1a7e0917a430642c352e236f3 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 4 Dec 2013 13:47:01 -0700 Subject: [PATCH 14/66] arguments --- openstackclient/network/v2_0/__init__.py | 2 +- openstackclient/network/v2_0/router.py | 51 ++++++++++++++++--- .../tests/network/v2_0/test_router.py | 26 +++++++--- 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py index ff069afdb6..afa791fa89 100644 --- a/openstackclient/network/v2_0/__init__.py +++ b/openstackclient/network/v2_0/__init__.py @@ -64,7 +64,7 @@ def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) neuter = self.clazz(self.app, self.app_args) neuter.get_client = self.get_client - return neuter.take_action(parsed_args) + return neuter.run(parsed_args) class ListCommand(lister.Lister): diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index 74a677189e..57d25f57ff 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -15,6 +15,7 @@ """Router action implementations""" +from neutronclient.neutron.v2_0 import agentscheduler from neutronclient.neutron.v2_0 import router as neu2 from openstackclient.network import v2_0 as v2_0 @@ -57,27 +58,63 @@ class DeleteRouter(v2_0.DeleteCommand): class ListRouter(v2_0.ListCommand): """List router""" - clazz = neu2.ListRouter + def get_parser(self, prog_name): + parser = super(ListRouter, self).get_parser(prog_name) + parser.add_argument( + '--l3-agent', + help='ID of the L3 agent to query', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + if parsed_args.l3_agent: + neuter = agentscheduler.ListRoutersOnL3Agent(self.app, + self.app_args) + else: + neuter = neu2.ListRouter(self.app, self.app_args) + neuter.get_client = self.get_client + return neuter.take_action(parsed_args) class SetRouter(v2_0.SetCommand): """Set router values""" - clazz = neu2.UpdateRouter - name = 'id' + name = 'router_id' metavar = '' help_text = 'ID of router to update' def get_parser(self, prog_name): parser = super(SetRouter, self).get_parser(prog_name) parser.add_argument( - '--description', - help='Description of the router') + '--gateway', + dest='external_network_id', + help='External network ID for the gateway') + parser.add_argument( + '--no-gateway', + action='store_true', default=False, + help='Clear the gateway external network from the router') parser.add_argument( - '--name', - help='Name of the router') + '--enable-snat', + dest='disable_snat', action='store_false', + default=False, + help='Enable source NAT on the router gateway') + parser.add_argument( + '--disable-snat', + action='store_true', default=False, + help='Disable source NAT on the router gateway') return parser + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + parsed_args.request_format = 'json' + if parsed_args.no_gateway: + neuter = neu2.RemoveGatewayRouter(self.app, self.app_args) + else: + neuter = neu2.SetGatewayRouter(self.app, self.app_args) + neuter.get_client = self.get_client + return neuter.run(parsed_args) + class ShowRouter(v2_0.ShowCommand): """Show a router""" diff --git a/openstackclient/tests/network/v2_0/test_router.py b/openstackclient/tests/network/v2_0/test_router.py index 70726a7f12..5e581f7f32 100644 --- a/openstackclient/tests/network/v2_0/test_router.py +++ b/openstackclient/tests/network/v2_0/test_router.py @@ -59,26 +59,40 @@ def test_get_parser_nothing(self): given = "" + self.given_default_list_options() parsed = self.given_args(router.ListRouter, given) self.assertEqual(False, parsed.show_details) + self.assertEqual(None, parsed.l3_agent) self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() + allargs = "--long --l3-agent foo" + self.given_all_list_options() parsed = self.given_args(router.ListRouter, allargs) self.assertEqual(True, parsed.show_details) + self.assertEqual('foo', parsed.l3_agent) self.then_all_list_options(parsed) class TestSetRouter(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(router.SetRouter, "noo") - self.assertEqual('noo', parsed.id) - self.assertEqual(None, parsed.description) + self.assertEqual('noo', parsed.router_id) + self.assertEqual(None, parsed.external_network_id) + self.assertEqual(False, parsed.no_gateway) + self.assertEqual(False, parsed.disable_snat) def test_get_parser_all(self): - allargs = 'too --description noosgtoo' + allargs = 'too --disable-snat --no-gateway' parsed = self.given_args(router.SetRouter, allargs) - self.assertEqual('too', parsed.id) - self.assertEqual('noosgtoo', parsed.description) + self.assertEqual('too', parsed.router_id) + self.assertEqual(None, parsed.external_network_id) + self.assertEqual(True, parsed.no_gateway) + self.assertEqual(True, parsed.disable_snat) + + def test_get_parser_all_enable(self): + allargs = 'too --gateway way --enable-snat' + parsed = self.given_args(router.SetRouter, allargs) + self.assertEqual('too', parsed.router_id) + self.assertEqual('way', parsed.external_network_id) + self.assertEqual(False, parsed.no_gateway) + self.assertEqual(False, parsed.disable_snat) class TestShowRouter(common.TestNetworkBase): From 0a162f551e9f34f8ad730f6378f5fa9f9ccb4530 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 4 Dec 2013 15:23:56 -0700 Subject: [PATCH 15/66] add router interface add/remove --- openstackclient/network/v2_0/__init__.py | 70 ++++++++++++++++++++++++ openstackclient/network/v2_0/router.py | 30 ++++++++++ setup.cfg | 4 +- 3 files changed, 102 insertions(+), 2 deletions(-) diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py index afa791fa89..1bca428a69 100644 --- a/openstackclient/network/v2_0/__init__.py +++ b/openstackclient/network/v2_0/__init__.py @@ -147,3 +147,73 @@ def take_action(self, parsed_args): neuter.get_client = self.get_client parsed_args.show_details = True return neuter.take_action(parsed_args) + + +class AddCommand(command.Command): + + log = logging.getLogger(__name__ + '.AddCommand') + container_name = "container_id" + container_metavar = "" + container_help_text = "Identifier of container" + name = "id" + metavar = "" + help_text = "Identifier of object to be added" + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(AddCommand, self).get_parser(prog_name) + parser.add_argument( + self.container_name, + metavar=self.container_metavar, + help=self.container_help_text, + ) + parser.add_argument( + self.name, + metavar=self.metavar, + help=self.help_text, + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + parsed_args.request_format = 'json' + return neuter.run(parsed_args) + + +class RemoveCommand(command.Command): + + log = logging.getLogger(__name__ + '.RemoveCommand') + container_name = "container_id" + container_metavar = "" + container_help_text = "Identifier of container" + name = "id" + metavar = "" + help_text = "Identifier of object to be removed" + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(RemoveCommand, self).get_parser(prog_name) + parser.add_argument( + self.container_name, + metavar=self.container_metavar, + help=self.container_help_text, + ) + parser.add_argument( + self.name, + metavar=self.metavar, + help=self.help_text, + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + parsed_args.request_format = 'json' + return neuter.run(parsed_args) diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index 57d25f57ff..93c799239f 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -123,3 +123,33 @@ class ShowRouter(v2_0.ShowCommand): name = 'id' metavar = '' help_text = 'Name or ID of router to show' + + +class AddInterfaceRouter(v2_0.AddCommand): + """Show a router""" + + clazz = neu2.AddInterfaceRouter + container_name = 'router_id' + container_metavar = '' + container_help_text = 'ID of router to add an interface to' + name = 'interface' + metavar = '' + help_text = 'The format is "SUBNET|subnet=SUBNET|port=PORT". ' \ + 'Either a subnet or port must be specified. ' \ + 'Both ID and name are accepted as SUBNET or PORT. ' \ + 'Note that "subnet=" can be omitted when specifying subnet.' + + +class RemoveInterfaceRouter(v2_0.RemoveCommand): + """Show a router""" + + clazz = neu2.RemoveInterfaceRouter + container_name = 'router_id' + container_metavar = '' + container_help_text = 'ID of router to add an interface to' + name = 'interface' + metavar = '' + help_text = 'The format is "SUBNET|subnet=SUBNET|port=PORT". ' \ + 'Either a subnet or port must be specified. ' \ + 'Both ID and name are accepted as SUBNET or PORT. ' \ + 'Note that "subnet=" can be omitted when specifying subnet.' diff --git a/setup.cfg b/setup.cfg index 770dc3e54e..e404b58baa 100644 --- a/setup.cfg +++ b/setup.cfg @@ -317,8 +317,8 @@ openstack.network.v2_0 = router_list = openstackclient.network.v2_0.router:ListRouter router_set = openstackclient.network.v2_0.router:SetRouter router_show = openstackclient.network.v2_0.router:ShowRouter - router_add_interface = neutronclient.neutron.v2_0.router:AddInterfaceRouter - router_remove_interface = neutronclient.neutron.v2_0.router:RemoveInterfaceRouter + router_add_interface = openstackclient.network.v2_0.router:AddInterfaceRouter + router_remove_interface = openstackclient.network.v2_0.router:RemoveInterfaceRouter security_group_create = openstackclient.network.v2_0.security_group:CreateSecurityGroup security_group_delete = openstackclient.network.v2_0.security_group:DeleteSecurityGroup security_group_list = openstackclient.network.v2_0.security_group:ListSecurityGroup From fbc17c736493bacb98141a1d5ad686b8030d31ef Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 5 Dec 2013 13:17:34 -0700 Subject: [PATCH 16/66] port add and remove --- openstackclient/network/v2_0/__init__.py | 11 ++++---- openstackclient/network/v2_0/port.py | 33 ++++++++++++++++++++++++ openstackclient/network/v2_0/router.py | 4 +-- setup.cfg | 4 +-- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py index 1bca428a69..3e4f24e11c 100644 --- a/openstackclient/network/v2_0/__init__.py +++ b/openstackclient/network/v2_0/__init__.py @@ -199,11 +199,12 @@ def get_client(self): def get_parser(self, prog_name): parser = super(RemoveCommand, self).get_parser(prog_name) - parser.add_argument( - self.container_name, - metavar=self.container_metavar, - help=self.container_help_text, - ) + if self.container_name: + parser.add_argument( + self.container_name, + metavar=self.container_metavar, + help=self.container_help_text, + ) parser.add_argument( self.name, metavar=self.metavar, diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index 2c709ccbb7..d85fccc993 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -15,6 +15,7 @@ """Port action implementations""" +from neutronclient.neutron.v2_0 import floatingip from neutronclient.neutron.v2_0 import port as neu2 from openstackclient.network import v2_0 as v2_0 @@ -142,3 +143,35 @@ class ShowPort(v2_0.ShowCommand): name = 'id' metavar = '' help_text = 'Name or ID of port to show' + + +class AddPort(v2_0.RemoveCommand): + """Add a floating IP to a port""" + + clazz = floatingip.AssociateFloatingIP + container_name = 'port_id' + container_metavar = '' + container_help_text = 'ID of port' + name = 'floatingip_id' + metavar = '' + help_text = 'ID of floating IP to add to port' + + def get_parser(self, prog_name): + parser = super(AddPort, self).get_parser(prog_name) + parser.add_argument( + '--fixed-ip-address', + help=('IP address on the port (only required if port has multiple' + 'IPs)')) + return parser + + +class RemovePort(v2_0.RemoveCommand): + """Remove a floating IP from a port""" + + clazz = floatingip.DisassociateFloatingIP + container_name = None + container_metavar = None + container_help_text = None + name = 'floatingip_id' + metavar = '' + help_text = 'ID of the floating IP to remove' diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index 93c799239f..1ca726812a 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -126,7 +126,7 @@ class ShowRouter(v2_0.ShowCommand): class AddInterfaceRouter(v2_0.AddCommand): - """Show a router""" + """Add a port or subnet to a router""" clazz = neu2.AddInterfaceRouter container_name = 'router_id' @@ -141,7 +141,7 @@ class AddInterfaceRouter(v2_0.AddCommand): class RemoveInterfaceRouter(v2_0.RemoveCommand): - """Show a router""" + """Remove a port or subnet from a router""" clazz = neu2.RemoveInterfaceRouter container_name = 'router_id' diff --git a/setup.cfg b/setup.cfg index e404b58baa..19975eb217 100644 --- a/setup.cfg +++ b/setup.cfg @@ -73,12 +73,10 @@ openstack.compute.v2 = ip_fixed_add = openstackclient.compute.v2.fixedip:AddFixedIP ip_fixed_remove = openstackclient.compute.v2.fixedip:RemoveFixedIP - ip_floating_add = openstackclient.compute.v2.floatingip:AddFloatingIP ip_floating_create = openstackclient.network.v2_0.floatingip:CreateFloatingIp ip_floating_delete = openstackclient.network.v2_0.floatingip:DeleteFloatingIp ip_floating_list = openstackclient.network.v2_0.floatingip:ListFloatingIp ip_floating_show = openstackclient.network.v2_0.floatingip:ShowFloatingIp - ip_floating_remove = openstackclient.compute.v2.floatingip:RemoveFloatingIP ip_floating_pool_list = openstackclient.compute.v2.floatingippool:ListFloatingIPPool @@ -312,6 +310,8 @@ openstack.network.v2_0 = port_delete = openstackclient.network.v2_0.port:DeletePort port_set = openstackclient.network.v2_0.port:SetPort port_show = openstackclient.network.v2_0.port:ShowPort + port_add = openstackclient.network.v2_0.port:AddPort + port_remove = openstackclient.network.v2_0.port:RemovePort router_create = openstackclient.network.v2_0.router:CreateRouter router_delete = openstackclient.network.v2_0.router:DeleteRouter router_list = openstackclient.network.v2_0.router:ListRouter From 9dd49dded1bba2a00018a542a52b09f2ae0d4436 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 11 Dec 2013 15:29:24 -0700 Subject: [PATCH 17/66] attempt 1 with httpretty --- openstackclient/network/v2_0/__init__.py | 1 + openstackclient/network/v2_0/network.py | 5 + openstackclient/tests/fakes.py | 4 + .../tests/network/v2_0/test_router_aft.py | 129 ++++++++++++++++++ test-requirements.txt | 1 + 5 files changed, 140 insertions(+) create mode 100644 openstackclient/tests/network/v2_0/test_router_aft.py diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py index 3e4f24e11c..2bf01cf1a5 100644 --- a/openstackclient/network/v2_0/__init__.py +++ b/openstackclient/network/v2_0/__init__.py @@ -89,6 +89,7 @@ def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) neuter = self.clazz(self.app, self.app_args) neuter.get_client = self.get_client + parsed_args.request_format = 'json' return neuter.take_action(parsed_args) diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 44e642e968..7649996480 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -69,6 +69,11 @@ def take_action(self, parsed_args): else: neuter = neu2.ListNetwork(self.app, self.app_args) neuter.get_client = self.get_client + parsed_args.request_format = 'json' + parsed_args.fields = [] + parsed_args.page_size = None + parsed_args.sort_key = [] + parsed_args.sort_dir = [] return neuter.take_action(parsed_args) diff --git a/openstackclient/tests/fakes.py b/openstackclient/tests/fakes.py index 6fb1835efa..815af385bc 100644 --- a/openstackclient/tests/fakes.py +++ b/openstackclient/tests/fakes.py @@ -23,6 +23,7 @@ class FakeStdout: def __init__(self): self.content = [] + self.current = 0 def write(self, text): self.content.append(text) @@ -33,6 +34,9 @@ def make_string(self): result = result + line return result + def lines(self): + return ''.join(self.content) + class FakeApp(object): def __init__(self, _stdout): diff --git a/openstackclient/tests/network/v2_0/test_router_aft.py b/openstackclient/tests/network/v2_0/test_router_aft.py new file mode 100644 index 0000000000..1301e159c3 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_router_aft.py @@ -0,0 +1,129 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import argparse +import httpretty +import sys +import traceback + +from openstackclient.network.v2_0 import router +from openstackclient import shell +from openstackclient.tests import fakes +from openstackclient.tests.network.v2_0 import common + + +class FakeOptions(argparse.Namespace): + def __init__(self): + super(FakeOptions, self).__init__() + self.debug = False + self.deferred_help = False + self.insecure = True + self.os_default_domain = 'testing' + self.os_cacert = False + self.os_identity_api_version = 'idversion' + self.os_password = 'password' + self.os_project_id = 'project_id' + self.os_project_name = 'project_name' + self.os_region_name = 'region_name' + self.os_network_api_version = '2.0' + self.os_token = 'token' + self.os_url = 'http://127.0.0.1' + self.os_auth_url = 'http://127.0.0.1/identity' + self.os_username = 'username' + + +class FakeParsedArgs(argparse.Namespace): + def __init__(self): + super(FakeParsedArgs, self).__init__() + self.show_details = True + self.request_format = 'json' + self.prefix = '' + self.fields = [] + self.columns = [] + self.variables = [] + self.formatter = 'shell' + + +class TestShowRouterFunctional(common.TestNetworkBase): + ROUTER_LIST_URL = "http://127.0.0.1/v2.0/routers.json" + ROUTER_LIST_ONE = """ +{ + "routers": + [{ + "status": "ACTIVE", + "external_gateway_info": + {"network_id": "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8"}, + "name": "router1", + "admin_state_up": true, + "tenant_id": "33a40233088643acb66ff6eb0ebea679", + "id": "a9254bdb-2613-4a13-ac4c-adc581fba50d" + }] +}""" + ROUTER_SHOW_URL = "http://127.0.0.1/v2.0/routers/a9254bdb-2613-" \ + "4a13-ac4c-adc581fba50d.json" + ROUTER_SHOW = """ +{ + "router": + { + "status": "ACTIVE", + "external_gateway_info": + { + "network_id": "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8" + }, + "name": "router1", + "admin_state_up": true, + "tenant_id": "33a40233088643acb66ff6eb0ebea679", + "id": "a9254bdb-2613-4a13-ac4c-adc581fba50d" + } +}""" + + def setUp(self): + super(TestShowRouterFunctional, self).setUp() + self.app = shell.OpenStackShell() + self.app.options = FakeOptions() + try: + self.app.initialize_app(["run.py", "help"]) + except Exception: + print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) + try: + self.app.authenticate_user() + except Exception: + print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) + self.app.stdout = fakes.FakeStdout() + self.app.stderr = fakes.FakeStdout() + + @httpretty.activate + def test_take_action(self): + parsed_args = FakeParsedArgs() + parsed_args.id = 'router1' + cmd = router.ShowRouter(self.app, parsed_args) + httpretty.register_uri(httpretty.GET, self.ROUTER_LIST_URL, + body=self.ROUTER_LIST_ONE) + httpretty.register_uri(httpretty.GET, self.ROUTER_SHOW_URL, + body=self.ROUTER_SHOW) + + result = cmd.run(parsed_args) + + self.assertEqual(0, result) + expected = u"""\ +admin_state_up="True" +external_gateway_info="{"network_id": "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8"}" +id="a9254bdb-2613-4a13-ac4c-adc581fba50d" +name="router1" +status="ACTIVE" +tenant_id="33a40233088643acb66ff6eb0ebea679" +""" + self.assertEqual('', self.app.stderr.lines()) + self.assertEqual(expected, self.app.stdout.lines()) diff --git a/test-requirements.txt b/test-requirements.txt index 63de8be05b..ca862dba97 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -3,6 +3,7 @@ hacking>=0.8.0,<0.9 coverage>=3.6 discover fixtures>=0.3.14 +httpretty>=0.7.0 mock>=1.0 mox3>=0.7.0 sphinx>=1.1.2 From 0ae6b1767824cd4a9cdf947e53c7f7ee32fea18b Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 12 Dec 2013 10:22:48 -0700 Subject: [PATCH 18/66] first try on nvp network gateway --- openstackclient/network/v2_0/__init__.py | 6 ++ openstackclient/network/v2_0/gateway.py | 72 ++++++++++++++++++ .../tests/network/v2_0/test_gateway.py | 76 +++++++++++++++++++ setup.cfg | 14 ++-- 4 files changed, 161 insertions(+), 7 deletions(-) create mode 100644 openstackclient/network/v2_0/gateway.py create mode 100644 openstackclient/tests/network/v2_0/test_gateway.py diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py index 2bf01cf1a5..ad0687984d 100644 --- a/openstackclient/network/v2_0/__init__.py +++ b/openstackclient/network/v2_0/__init__.py @@ -38,6 +38,7 @@ def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) neuter = self.clazz(self.app, self.app_args) neuter.get_client = self.get_client + parsed_args.request_format = 'json' return neuter.take_action(parsed_args) @@ -64,6 +65,7 @@ def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) neuter = self.clazz(self.app, self.app_args) neuter.get_client = self.get_client + parsed_args.request_format = 'json' return neuter.run(parsed_args) @@ -90,6 +92,7 @@ def take_action(self, parsed_args): neuter = self.clazz(self.app, self.app_args) neuter.get_client = self.get_client parsed_args.request_format = 'json' + parsed_args.fields = [] return neuter.take_action(parsed_args) @@ -120,6 +123,7 @@ def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) neuter = self.clazz(self.app, self.app_args) neuter.get_client = self.get_client + parsed_args.request_format = 'json' return neuter.take_action(parsed_args) @@ -147,6 +151,8 @@ def take_action(self, parsed_args): neuter = self.clazz(self.app, self.app_args) neuter.get_client = self.get_client parsed_args.show_details = True + parsed_args.request_format = 'json' + parsed_args.fields = [] return neuter.take_action(parsed_args) diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py new file mode 100644 index 0000000000..261a41e2ee --- /dev/null +++ b/openstackclient/network/v2_0/gateway.py @@ -0,0 +1,72 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Gateway action implementations""" + +from neutronclient.neutron.v2_0 import nvpnetworkgateway as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class CreateGateway(v2_0.CreateCommand): + """Create a network""" + + clazz = neu2.CreateNetworkGateway + + def get_parser(self, prog_name): + parser = super(CreateGateway, self).get_parser(prog_name) + parser.add_argument( + 'name', metavar='NAME', + help='Name of network gateway to create') + parser.add_argument( + '--device', + action='append', + help='device info for this gateway ' + 'device_id=,' + 'interface_name= ' + 'It can be repeated for multiple devices for HA gateways') + return parser + + +class DeleteGateway(v2_0.DeleteCommand): + """Delete a network""" + + clazz = neu2.DeleteNetworkGateway + name = 'id' + metavar = '' + help_text = 'Name or ID of network to delete' + + +class ListGateway(v2_0.ListCommand): + """List networks""" + + clazz = neu2.ListNetworkGateway + + +class SetGateway(v2_0.SetCommand): + """Set network values""" + + clazz = neu2.UpdateNetworkGateway + name = 'network' + metavar = '' + help_text = 'Name or ID of network to set' + + +class ShowGateway(v2_0.ShowCommand): + """Show a network""" + + clazz = neu2.ShowNetworkGateway + name = 'id' + metavar = '' + help_text = 'Name or ID of network to show' diff --git a/openstackclient/tests/network/v2_0/test_gateway.py b/openstackclient/tests/network/v2_0/test_gateway.py new file mode 100644 index 0000000000..cc906e7637 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_gateway.py @@ -0,0 +1,76 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0 import gateway +from openstackclient.tests.network.v2_0 import common + + +class TestCreateGateway(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(gateway.CreateGateway, given) + self.assertEqual('noo', parsed.name) + self.assertEqual(None, parsed.device) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too --device device_id=1,interface_name=n --project sneed" + allargs += self.given_all_show_options() + parsed = self.given_args(gateway.CreateGateway, allargs) + self.assertEqual('too', parsed.name) + self.assertEqual(['device_id=1,interface_name=n'], parsed.device) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteGateway(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(gateway.DeleteGateway, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListGateway(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(gateway.ListGateway, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(gateway.ListGateway, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetGateway(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(gateway.SetGateway, "noo") + self.assertEqual('noo', parsed.network) + + +class TestShowGateway(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(gateway.ShowGateway, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too " + self.given_all_show_options() + parsed = self.given_args(gateway.ShowGateway, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/setup.cfg b/setup.cfg index 19975eb217..cd6c0383d2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -286,18 +286,18 @@ openstack.network.v2_0 = network_profile_create = neutronclient.neutron.v2_0.networkprofile:CreateNetworkProfile network_profile_delete = neutronclient.neutron.v2_0.networkprofile:DeleteNetworkProfile network_profile_update = neutronclient.neutron.v2_0.networkprofile:UpdateNetworkProfile + network_add_gateway = neutronclient.neutron.v2_0.nvpnetworkgateway:ConnectNetworkGateway network_create = openstackclient.network.v2_0.network:CreateNetwork network_delete = openstackclient.network.v2_0.network:DeleteNetwork network_list = openstackclient.network.v2_0.network:ListNetwork + network_remove_gateway = neutronclient.neutron.v2_0.nvpnetworkgateway:DisconnectNetworkGateway network_set = openstackclient.network.v2_0.network:SetNetwork network_show = openstackclient.network.v2_0.network:ShowNetwork - network_gateway_list = neutronclient.neutron.v2_0.nvpnetworkgateway:ListNetworkGateway - network_gateway_show = neutronclient.neutron.v2_0.nvpnetworkgateway:ShowNetworkGateway - network_gateway_create = neutronclient.neutron.v2_0.nvpnetworkgateway:CreateNetworkGateway - network_gateway_delete = neutronclient.neutron.v2_0.nvpnetworkgateway:DeleteNetworkGateway - network_gateway_update = neutronclient.neutron.v2_0.nvpnetworkgateway:UpdateNetworkGateway - network_gateway_interface_add = neutronclient.neutron.v2_0.nvpnetworkgateway:ConnectNetworkGateway - network_gateway_interface_remove = neutronclient.neutron.v2_0.nvpnetworkgateway:DisconnectNetworkGateway + gateway_create = openstackclient.network.v2_0.gateway:CreateGateway + gateway_delete = openstackclient.network.v2_0.gateway:DeleteGateway + gateway_list = openstackclient.network.v2_0.gateway:ListGateway + gateway_set = openstackclient.network.v2_0.gateway:SetGateway + gateway_show = openstackclient.network.v2_0.gateway:ShowGateway queue_list = neutronclient.neutron.v2_0.nvp_qos_queue:ListQoSQueue queue_show = neutronclient.neutron.v2_0.nvp_qos_queue:ShowQoSQueue queue_create = neutronclient.neutron.v2_0.nvp_qos_queue:CreateQoSQueue From d57618eaf50e7b768b8c4aa522326bcef2ddc583 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 12 Dec 2013 14:32:01 -0700 Subject: [PATCH 19/66] network add/remove gateway commands --- openstackclient/network/v2_0/network.py | 49 +++++++++++++++++++ openstackclient/tests/network/v2_0/common.py | 32 ++++++++++++ .../tests/network/v2_0/test_network.py | 36 ++++++++++++++ setup.cfg | 4 +- 4 files changed, 119 insertions(+), 2 deletions(-) diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 7649996480..e3550af9ec 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -16,6 +16,7 @@ """Network action implementations""" from neutronclient.neutron.v2_0 import network as neu2 +from neutronclient.neutron.v2_0 import nvpnetworkgateway from openstackclient.network import v2_0 as v2_0 @@ -93,3 +94,51 @@ class ShowNetwork(v2_0.ShowCommand): name = 'id' metavar = '' help_text = 'Name or ID of network to show' + + +class AddGatewayNetwork(v2_0.AddCommand): + """Add a gateway to a network""" + + clazz = nvpnetworkgateway.ConnectNetworkGateway + container_name = "network_id" + container_metavar = "" + container_help_text = "ID of the internal network" + name = 'net_gateway_id' + metavar = '' + help_text = 'ID of the gatway' + + def get_parser(self, prog_name): + parser = super(AddGatewayNetwork, self).get_parser(prog_name) + parser.add_argument( + '--segmentation-type', + help=('L2 segmentation strategy on the external side of ' + 'the gateway (e.g.: VLAN, FLAT)')) + parser.add_argument( + '--segmentation-id', + help=('Identifier for the L2 segment on the external side ' + 'of the gateway')) + return parser + + +class RemoveGatewayNetwork(v2_0.RemoveCommand): + """Remove a gateway from a network""" + + clazz = nvpnetworkgateway.ConnectNetworkGateway + container_name = "network_id" + container_metavar = "" + container_help_text = "ID of the internal network" + name = 'net_gateway_id' + metavar = '' + help_text = 'ID of the gatway' + + def get_parser(self, prog_name): + parser = super(RemoveGatewayNetwork, self).get_parser(prog_name) + parser.add_argument( + '--segmentation-type', + help=('L2 segmentation strategy on the external side of ' + 'the gateway (e.g.: VLAN, FLAT)')) + parser.add_argument( + '--segmentation-id', + help=('Identifier for the L2 segment on the external side ' + 'of the gateway')) + return parser diff --git a/openstackclient/tests/network/v2_0/common.py b/openstackclient/tests/network/v2_0/common.py index b7cef5cdff..d3d73f8344 100644 --- a/openstackclient/tests/network/v2_0/common.py +++ b/openstackclient/tests/network/v2_0/common.py @@ -64,3 +64,35 @@ def then_all_list_options(self, parsed): self.assertEqual('csv', parsed.formatter) self.assertEqual(['id'], parsed.columns) self.assertEqual('all', parsed.quote_mode) + + +class FakeOptions(argparse.Namespace): + def __init__(self): + super(FakeOptions, self).__init__() + self.debug = False + self.deferred_help = False + self.insecure = True + self.os_default_domain = 'testing' + self.os_cacert = False + self.os_identity_api_version = 'idversion' + self.os_password = 'password' + self.os_project_id = 'project_id' + self.os_project_name = 'project_name' + self.os_region_name = 'region_name' + self.os_network_api_version = '2.0' + self.os_token = 'token' + self.os_url = 'http://127.0.0.1' + self.os_auth_url = 'http://127.0.0.1/identity' + self.os_username = 'username' + + +class FakeParsedArgs(argparse.Namespace): + def __init__(self): + super(FakeParsedArgs, self).__init__() + self.show_details = True + self.request_format = 'json' + self.prefix = '' + self.fields = [] + self.columns = [] + self.variables = [] + self.formatter = 'shell' diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index 42919dcd33..8638f73dd6 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -78,3 +78,39 @@ def test_get_parser_all(self): parsed = self.given_args(network.ShowNetwork, allargs) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) + + +class TestAddGatewayNetwork(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "netty getty" + parsed = self.given_args(network.AddGatewayNetwork, given) + self.assertEqual('netty', parsed.network_id) + self.assertEqual('getty', parsed.net_gateway_id) + self.assertEqual(None, parsed.segmentation_type) + self.assertEqual(None, parsed.segmentation_id) + + def test_get_parser_all(self): + allargs = "netty getty --segmentation-type 1 --segmentation-id 2" + parsed = self.given_args(network.AddGatewayNetwork, allargs) + self.assertEqual('netty', parsed.network_id) + self.assertEqual('getty', parsed.net_gateway_id) + self.assertEqual('1', parsed.segmentation_type) + self.assertEqual('2', parsed.segmentation_id) + + +class TestRemoveGatewayNetwork(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "netty getty" + parsed = self.given_args(network.RemoveGatewayNetwork, given) + self.assertEqual('netty', parsed.network_id) + self.assertEqual('getty', parsed.net_gateway_id) + self.assertEqual(None, parsed.segmentation_type) + self.assertEqual(None, parsed.segmentation_id) + + def test_get_parser_all(self): + allargs = "netty getty --segmentation-type 1 --segmentation-id 2" + parsed = self.given_args(network.RemoveGatewayNetwork, allargs) + self.assertEqual('netty', parsed.network_id) + self.assertEqual('getty', parsed.net_gateway_id) + self.assertEqual('1', parsed.segmentation_type) + self.assertEqual('2', parsed.segmentation_id) diff --git a/setup.cfg b/setup.cfg index cd6c0383d2..955f29cb70 100644 --- a/setup.cfg +++ b/setup.cfg @@ -286,11 +286,11 @@ openstack.network.v2_0 = network_profile_create = neutronclient.neutron.v2_0.networkprofile:CreateNetworkProfile network_profile_delete = neutronclient.neutron.v2_0.networkprofile:DeleteNetworkProfile network_profile_update = neutronclient.neutron.v2_0.networkprofile:UpdateNetworkProfile - network_add_gateway = neutronclient.neutron.v2_0.nvpnetworkgateway:ConnectNetworkGateway + network_add_gateway = openstackclient.network.v2_0.network:AddGatewayNetwork network_create = openstackclient.network.v2_0.network:CreateNetwork network_delete = openstackclient.network.v2_0.network:DeleteNetwork network_list = openstackclient.network.v2_0.network:ListNetwork - network_remove_gateway = neutronclient.neutron.v2_0.nvpnetworkgateway:DisconnectNetworkGateway + network_remove_gateway = openstackclient.network.v2_0.network:RemoveGatewayNetwork network_set = openstackclient.network.v2_0.network:SetNetwork network_show = openstackclient.network.v2_0.network:ShowNetwork gateway_create = openstackclient.network.v2_0.gateway:CreateGateway From 3dc544a7918c72561e2f7b360eb5aa5f3d52229e Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 12 Dec 2013 17:56:04 -0700 Subject: [PATCH 20/66] first shot integration tests --- openstackclient/tests/network/v2_0/common.py | 20 ++++++ .../tests/network/v2_0/test_gateway_it.py | 66 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 openstackclient/tests/network/v2_0/test_gateway_it.py diff --git a/openstackclient/tests/network/v2_0/common.py b/openstackclient/tests/network/v2_0/common.py index d3d73f8344..fb8956efd1 100644 --- a/openstackclient/tests/network/v2_0/common.py +++ b/openstackclient/tests/network/v2_0/common.py @@ -15,7 +15,11 @@ import argparse import mock +import sys +import traceback +from openstackclient import shell +from openstackclient.tests import fakes from openstackclient.tests import utils @@ -96,3 +100,19 @@ def __init__(self): self.columns = [] self.variables = [] self.formatter = 'shell' + + +class FakeShell(shell.OpenStackShell): + def __init__(self): + super(FakeShell, self).__init__() + self.options = FakeOptions() + try: + self.initialize_app(["run.py", "help"]) + except Exception: + print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) + try: + self.authenticate_user() + except Exception: + print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) + self.stdout = fakes.FakeStdout() + self.stderr = fakes.FakeStdout() diff --git a/openstackclient/tests/network/v2_0/test_gateway_it.py b/openstackclient/tests/network/v2_0/test_gateway_it.py new file mode 100644 index 0000000000..8fc499f688 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_gateway_it.py @@ -0,0 +1,66 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0 import gateway +from openstackclient.tests.network.v2_0 import common + + +class TestGatewayIntegration(common.TestNetworkBase): + LIST_URL = "http://127.0.0.1/v2.0/network-gateways.json" + LIST_ONE = """ +{ + "network_gateways": [{ + "id": "a9254bdb" + }] +}""" + SHOW_URL = "http://127.0.0.1/v2.0/network-gateways/a9254bdb.json" + SHOW = """ +{ + "network_gateway": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233088643acb66ff6eb0ebea679", + "id": "a9254bdb" + } +}""" + + def setUp(self): + super(TestGatewayIntegration, self).setUp() + self.app = common.FakeShell() + + @httpretty.activate + def test_show(self): + parsed_args = common.FakeParsedArgs() + parsed_args.id = 'gator' + cmd = gateway.ShowGateway(self.app, parsed_args) + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + + result = cmd.run(parsed_args) + + self.assertEqual(0, result) + expected = u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233088643acb66ff6eb0ebea679" +""" + self.assertEqual('', self.app.stderr.lines()) + self.assertEqual(expected, self.app.stdout.lines()) From 57886968c35add7bee778f69a55b5b7ba4ab23c1 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 12 Dec 2013 17:59:21 -0700 Subject: [PATCH 21/66] rename --- .../v2_0/{test_gateway_it.py => test_gateway_integration.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename openstackclient/tests/network/v2_0/{test_gateway_it.py => test_gateway_integration.py} (100%) diff --git a/openstackclient/tests/network/v2_0/test_gateway_it.py b/openstackclient/tests/network/v2_0/test_gateway_integration.py similarity index 100% rename from openstackclient/tests/network/v2_0/test_gateway_it.py rename to openstackclient/tests/network/v2_0/test_gateway_integration.py From daa18c3b7f6d792ec680288d1499e1a44acaedfc Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Fri, 13 Dec 2013 10:19:26 -0700 Subject: [PATCH 22/66] finish up gateway integration tests --- openstackclient/tests/fakes.py | 2 +- openstackclient/tests/network/v2_0/common.py | 1 + .../network/v2_0/test_gateway_integration.py | 142 +++++++++++++++--- 3 files changed, 124 insertions(+), 21 deletions(-) diff --git a/openstackclient/tests/fakes.py b/openstackclient/tests/fakes.py index 815af385bc..3873ed16f4 100644 --- a/openstackclient/tests/fakes.py +++ b/openstackclient/tests/fakes.py @@ -26,7 +26,7 @@ def __init__(self): self.current = 0 def write(self, text): - self.content.append(text) + self.content.append(text.replace('\r', '')) def make_string(self): result = '' diff --git a/openstackclient/tests/network/v2_0/common.py b/openstackclient/tests/network/v2_0/common.py index fb8956efd1..a30f072bc1 100644 --- a/openstackclient/tests/network/v2_0/common.py +++ b/openstackclient/tests/network/v2_0/common.py @@ -100,6 +100,7 @@ def __init__(self): self.columns = [] self.variables = [] self.formatter = 'shell' + self.quote_mode = 'none' class FakeShell(shell.OpenStackShell): diff --git a/openstackclient/tests/network/v2_0/test_gateway_integration.py b/openstackclient/tests/network/v2_0/test_gateway_integration.py index 8fc499f688..8e66d0c2e5 100644 --- a/openstackclient/tests/network/v2_0/test_gateway_integration.py +++ b/openstackclient/tests/network/v2_0/test_gateway_integration.py @@ -14,53 +14,155 @@ # import httpretty +import sys +import traceback from openstackclient.network.v2_0 import gateway from openstackclient.tests.network.v2_0 import common class TestGatewayIntegration(common.TestNetworkBase): - LIST_URL = "http://127.0.0.1/v2.0/network-gateways.json" - LIST_ONE = """ -{ - "network_gateways": [{ - "id": "a9254bdb" - }] -}""" - SHOW_URL = "http://127.0.0.1/v2.0/network-gateways/a9254bdb.json" - SHOW = """ + HOST = "http://127.0.0.1" + VER = "/v2.0" + CREATE_URL = HOST + VER + "/network-gateways.json" + CREATE = """ { "network_gateway": { "status": "ACTIVE", "name": "gator", - "tenant_id": "33a40233088643acb66ff6eb0ebea679", + "tenant_id": "33a40233", "id": "a9254bdb" } }""" + DELETE_URL = HOST + VER + "/network-gateways/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOST + VER + "/network-gateways.json" + LIST_ONE = """ +{ + "network_gateways": [{ + "id": "a9254bdb" + }] +}""" + LIST = """ +{ + "network_gateways": [ + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOST + VER + "/network-gateways/a9254bdb.json" + SHOW = CREATE def setUp(self): super(TestGatewayIntegration, self).setUp() self.app = common.FakeShell() + def when_run(self, clazz, pargs): + try: + result = clazz(self.app, pargs).run(pargs) + except Exception as e: + print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) + print(str(e)) + lasty = httpretty.last_request() + print('====================================================') + print("body = " + str(lasty.body)) + print("querystring = " + str(getattr(lasty, 'querystring', ''))) + print("command = " + str(lasty.command)) + print("method = " + str(lasty.method)) + print("path = " + str(lasty.path)) + print('====================================================') + raise e + self.assertEqual(0, result) + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.device = [] + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + + self.when_run(gateway.CreateGateway, pargs) + + self.assertEqual('', self.app.stderr.lines()) + self.assertEqual(u"""\ +Created a new network_gateway: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.app.stdout.lines()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + + self.when_run(gateway.DeleteGateway, pargs) + + self.assertEqual('', self.app.stderr.lines()) + self.assertEqual(u'Deleted network_gateway: gator\n', + self.app.stdout.lines()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + + self.when_run(gateway.ListGateway, pargs) + + self.assertEqual('', self.app.stderr.lines()) + self.assertEqual("""\ +id,name +a9254bdb,gator +b8408dgd,croc +""", self.app.stdout.lines()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + + self.when_run(gateway.SetGateway, pargs) + + self.assertEqual('', self.app.stderr.lines()) + self.assertEqual('', self.app.stdout.lines()) + @httpretty.activate def test_show(self): - parsed_args = common.FakeParsedArgs() - parsed_args.id = 'gator' - cmd = gateway.ShowGateway(self.app, parsed_args) + pargs = common.FakeParsedArgs() + pargs.id = 'gator' httpretty.register_uri(httpretty.GET, self.LIST_URL, body=self.LIST_ONE) httpretty.register_uri(httpretty.GET, self.SHOW_URL, body=self.SHOW) - result = cmd.run(parsed_args) + self.when_run(gateway.ShowGateway, pargs) - self.assertEqual(0, result) - expected = u"""\ + self.assertEqual('', self.app.stderr.lines()) + self.assertEqual(u"""\ id="a9254bdb" name="gator" status="ACTIVE" -tenant_id="33a40233088643acb66ff6eb0ebea679" -""" - self.assertEqual('', self.app.stderr.lines()) - self.assertEqual(expected, self.app.stdout.lines()) +tenant_id="33a40233" +""", self.app.stdout.lines()) From 871c51d6aabb1b7c79b5826450b15cf833be5219 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Fri, 13 Dec 2013 12:34:43 -0700 Subject: [PATCH 23/66] clean up before creating next one --- openstackclient/tests/network/v2_0/common.py | 127 +++++++++++------- .../network/v2_0/test_gateway_integration.py | 66 +++------ 2 files changed, 96 insertions(+), 97 deletions(-) diff --git a/openstackclient/tests/network/v2_0/common.py b/openstackclient/tests/network/v2_0/common.py index a30f072bc1..bb9f4d2ee3 100644 --- a/openstackclient/tests/network/v2_0/common.py +++ b/openstackclient/tests/network/v2_0/common.py @@ -14,6 +14,7 @@ # import argparse +import httpretty import mock import sys import traceback @@ -23,53 +24,6 @@ from openstackclient.tests import utils -class TestNetworkBase(utils.TestCase): - def given_args(self, clz, args): - args = args.split() - app = mock.Mock() - cmd = clz(app, argparse.Namespace()) - parser = cmd.get_parser(str(clz)) - try: - parsed_args = parser.parse_args(args) - except SystemExit: - self.assertEqual('Bad argument: ' + str(args), '') - return parsed_args - - def given_default_show_options(self): - return "" - - def then_default_show_options(self, parsed): - self.assertEqual('table', parsed.formatter) - self.assertEqual([], parsed.columns) - self.assertEqual([], parsed.variables) - self.assertEqual('', parsed.prefix) - - def given_all_show_options(self): - return " -f shell -c id --variable VAR --prefix TST" - - def then_all_show_options(self, parsed): - self.assertEqual('shell', parsed.formatter) - self.assertEqual(['id'], parsed.columns) - self.assertEqual(['VAR'], parsed.variables) - self.assertEqual('TST', parsed.prefix) - - def given_default_list_options(self): - return "" - - def then_default_list_options(self, parsed): - self.assertEqual('table', parsed.formatter) - self.assertEqual([], parsed.columns) - self.assertEqual('nonnumeric', parsed.quote_mode) - - def given_all_list_options(self): - return " -f csv -c id --quote all" - - def then_all_list_options(self, parsed): - self.assertEqual('csv', parsed.formatter) - self.assertEqual(['id'], parsed.columns) - self.assertEqual('all', parsed.quote_mode) - - class FakeOptions(argparse.Namespace): def __init__(self): super(FakeOptions, self).__init__() @@ -117,3 +71,82 @@ def __init__(self): print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) self.stdout = fakes.FakeStdout() self.stderr = fakes.FakeStdout() + + +class TestIntegrationBase(utils.TestCase): + HOST = "http://127.0.0.1" + VER = "/v2.0" + + def setUp(self): + super(TestIntegrationBase, self).setUp() + self.app = FakeShell() + + def when_run(self, clazz, pargs): + try: + result = clazz(self.app, pargs).run(pargs) + except Exception as e: + print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) + print(str(e)) + lasty = httpretty.last_request() + print('====================================================') + print("body = " + str(lasty.body)) + print("querystring = " + str(getattr(lasty, 'querystring', ''))) + print("command = " + str(lasty.command)) + print("method = " + str(lasty.method)) + print("path = " + str(lasty.path)) + print('====================================================') + raise e + self.assertEqual(0, result) + + def stdout(self): + return self.app.stdout.lines() + + def stderr(self): + return self.app.stderr.lines() + + +class TestNetworkBase(utils.TestCase): + def given_args(self, clz, args): + args = args.split() + app = mock.Mock() + cmd = clz(app, argparse.Namespace()) + parser = cmd.get_parser(str(clz)) + try: + parsed_args = parser.parse_args(args) + except SystemExit: + self.assertEqual('Bad argument: ' + str(args), '') + return parsed_args + + def given_default_show_options(self): + return "" + + def then_default_show_options(self, parsed): + self.assertEqual('table', parsed.formatter) + self.assertEqual([], parsed.columns) + self.assertEqual([], parsed.variables) + self.assertEqual('', parsed.prefix) + + def given_all_show_options(self): + return " -f shell -c id --variable VAR --prefix TST" + + def then_all_show_options(self, parsed): + self.assertEqual('shell', parsed.formatter) + self.assertEqual(['id'], parsed.columns) + self.assertEqual(['VAR'], parsed.variables) + self.assertEqual('TST', parsed.prefix) + + def given_default_list_options(self): + return "" + + def then_default_list_options(self, parsed): + self.assertEqual('table', parsed.formatter) + self.assertEqual([], parsed.columns) + self.assertEqual('nonnumeric', parsed.quote_mode) + + def given_all_list_options(self): + return " -f csv -c id --quote all" + + def then_all_list_options(self, parsed): + self.assertEqual('csv', parsed.formatter) + self.assertEqual(['id'], parsed.columns) + self.assertEqual('all', parsed.quote_mode) diff --git a/openstackclient/tests/network/v2_0/test_gateway_integration.py b/openstackclient/tests/network/v2_0/test_gateway_integration.py index 8e66d0c2e5..e66dac5716 100644 --- a/openstackclient/tests/network/v2_0/test_gateway_integration.py +++ b/openstackclient/tests/network/v2_0/test_gateway_integration.py @@ -14,17 +14,14 @@ # import httpretty -import sys -import traceback from openstackclient.network.v2_0 import gateway from openstackclient.tests.network.v2_0 import common -class TestGatewayIntegration(common.TestNetworkBase): - HOST = "http://127.0.0.1" - VER = "/v2.0" - CREATE_URL = HOST + VER + "/network-gateways.json" +class TestGatewayIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + CREATE_URL = HOSTESS + "/network-gateways.json" CREATE = """ { "network_gateway": @@ -35,9 +32,9 @@ class TestGatewayIntegration(common.TestNetworkBase): "id": "a9254bdb" } }""" - DELETE_URL = HOST + VER + "/network-gateways/a9254bdb.json" + DELETE_URL = HOSTESS + "/network-gateways/a9254bdb.json" DELETE = "{}" - LIST_URL = HOST + VER + "/network-gateways.json" + LIST_URL = HOSTESS + "/network-gateways.json" LIST_ONE = """ { "network_gateways": [{ @@ -61,30 +58,9 @@ class TestGatewayIntegration(common.TestNetworkBase): } ] }""" - SHOW_URL = HOST + VER + "/network-gateways/a9254bdb.json" + SHOW_URL = HOSTESS + "/network-gateways/a9254bdb.json" SHOW = CREATE - def setUp(self): - super(TestGatewayIntegration, self).setUp() - self.app = common.FakeShell() - - def when_run(self, clazz, pargs): - try: - result = clazz(self.app, pargs).run(pargs) - except Exception as e: - print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) - print(str(e)) - lasty = httpretty.last_request() - print('====================================================') - print("body = " + str(lasty.body)) - print("querystring = " + str(getattr(lasty, 'querystring', ''))) - print("command = " + str(lasty.command)) - print("method = " + str(lasty.method)) - print("path = " + str(lasty.path)) - print('====================================================') - raise e - self.assertEqual(0, result) - @httpretty.activate def test_create(self): pargs = common.FakeParsedArgs() @@ -93,17 +69,15 @@ def test_create(self): pargs.tenant_id = '33a40233' httpretty.register_uri(httpretty.POST, self.CREATE_URL, body=self.CREATE) - self.when_run(gateway.CreateGateway, pargs) - - self.assertEqual('', self.app.stderr.lines()) + self.assertEqual('', self.stderr()) self.assertEqual(u"""\ Created a new network_gateway: id="a9254bdb" name="gator" status="ACTIVE" tenant_id="33a40233" -""", self.app.stdout.lines()) +""", self.stdout()) @httpretty.activate def test_delete(self): @@ -113,12 +87,10 @@ def test_delete(self): body=self.LIST_ONE) httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, body=self.DELETE) - self.when_run(gateway.DeleteGateway, pargs) - - self.assertEqual('', self.app.stderr.lines()) + self.assertEqual('', self.stderr()) self.assertEqual(u'Deleted network_gateway: gator\n', - self.app.stdout.lines()) + self.stdout()) @httpretty.activate def test_list(self): @@ -126,15 +98,13 @@ def test_list(self): pargs.formatter = 'csv' httpretty.register_uri(httpretty.GET, self.LIST_URL, body=self.LIST) - self.when_run(gateway.ListGateway, pargs) - - self.assertEqual('', self.app.stderr.lines()) + self.assertEqual('', self.stderr()) self.assertEqual("""\ id,name a9254bdb,gator b8408dgd,croc -""", self.app.stdout.lines()) +""", self.stdout()) @httpretty.activate def test_set(self): @@ -142,11 +112,9 @@ def test_set(self): pargs.name = 'gator' httpretty.register_uri(httpretty.GET, self.LIST_URL, body=self.LIST_ONE) - self.when_run(gateway.SetGateway, pargs) - - self.assertEqual('', self.app.stderr.lines()) - self.assertEqual('', self.app.stdout.lines()) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) @httpretty.activate def test_show(self): @@ -156,13 +124,11 @@ def test_show(self): body=self.LIST_ONE) httpretty.register_uri(httpretty.GET, self.SHOW_URL, body=self.SHOW) - self.when_run(gateway.ShowGateway, pargs) - - self.assertEqual('', self.app.stderr.lines()) + self.assertEqual('', self.stderr()) self.assertEqual(u"""\ id="a9254bdb" name="gator" status="ACTIVE" tenant_id="33a40233" -""", self.app.stdout.lines()) +""", self.stdout()) From ab27f079d7f8855ee77416bccd32837112d4d3ae Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Sun, 15 Dec 2013 06:26:08 -0700 Subject: [PATCH 24/66] fixes to a couple files --- openstackclient/network/v2_0/__init__.py | 3 +++ openstackclient/network/v2_0/gateway.py | 26 ++++++++++++------------ openstackclient/network/v2_0/router.py | 5 +++++ 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py index ad0687984d..b2499068a8 100644 --- a/openstackclient/network/v2_0/__init__.py +++ b/openstackclient/network/v2_0/__init__.py @@ -92,6 +92,9 @@ def take_action(self, parsed_args): neuter = self.clazz(self.app, self.app_args) neuter.get_client = self.get_client parsed_args.request_format = 'json' + parsed_args.page_size = None + parsed_args.sort_key = [] + parsed_args.sort_dir = [] parsed_args.fields = [] return neuter.take_action(parsed_args) diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py index 261a41e2ee..4cb48c832b 100644 --- a/openstackclient/network/v2_0/gateway.py +++ b/openstackclient/network/v2_0/gateway.py @@ -20,7 +20,7 @@ class CreateGateway(v2_0.CreateCommand): - """Create a network""" + """Create a gateway""" clazz = neu2.CreateNetworkGateway @@ -28,7 +28,7 @@ def get_parser(self, prog_name): parser = super(CreateGateway, self).get_parser(prog_name) parser.add_argument( 'name', metavar='NAME', - help='Name of network gateway to create') + help='Name of gateway to create') parser.add_argument( '--device', action='append', @@ -40,33 +40,33 @@ def get_parser(self, prog_name): class DeleteGateway(v2_0.DeleteCommand): - """Delete a network""" + """Delete a gateway""" clazz = neu2.DeleteNetworkGateway name = 'id' - metavar = '' - help_text = 'Name or ID of network to delete' + metavar = '' + help_text = 'Name or ID of gateway to delete' class ListGateway(v2_0.ListCommand): - """List networks""" + """List gateways""" clazz = neu2.ListNetworkGateway class SetGateway(v2_0.SetCommand): - """Set network values""" + """Set gateway values""" clazz = neu2.UpdateNetworkGateway - name = 'network' - metavar = '' - help_text = 'Name or ID of network to set' + name = 'gateway' + metavar = '' + help_text = 'Name or ID of gateway to set' class ShowGateway(v2_0.ShowCommand): - """Show a network""" + """Show a gateway""" clazz = neu2.ShowNetworkGateway name = 'id' - metavar = '' - help_text = 'Name or ID of network to show' + metavar = '' + help_text = 'Name or ID of gateway to show' diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index 1ca726812a..66136105ab 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -68,6 +68,11 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) + parsed_args.request_format = 'json' + parsed_args.fields = [] + parsed_args.page_size = None + parsed_args.sort_key = [] + parsed_args.sort_dir = [] if parsed_args.l3_agent: neuter = agentscheduler.ListRoutersOnL3Agent(self.app, self.app_args) From e39fe5f8deaa6aae19cc2b918135d86654d58444 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Sun, 15 Dec 2013 09:03:50 -0700 Subject: [PATCH 25/66] vpn service --- openstackclient/tests/network/v2_0/common.py | 2 +- openstackclient/tests/network/v2_0/test_gateway.py | 2 +- setup.cfg | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/openstackclient/tests/network/v2_0/common.py b/openstackclient/tests/network/v2_0/common.py index bb9f4d2ee3..abae1d84ad 100644 --- a/openstackclient/tests/network/v2_0/common.py +++ b/openstackclient/tests/network/v2_0/common.py @@ -91,7 +91,7 @@ def when_run(self, clazz, pargs): print('====================================================') print("body = " + str(lasty.body)) print("querystring = " + str(getattr(lasty, 'querystring', ''))) - print("command = " + str(lasty.command)) + print("command = " + str(getattr(lasty, 'command', ''))) print("method = " + str(lasty.method)) print("path = " + str(lasty.path)) print('====================================================') diff --git a/openstackclient/tests/network/v2_0/test_gateway.py b/openstackclient/tests/network/v2_0/test_gateway.py index cc906e7637..55599b9e70 100644 --- a/openstackclient/tests/network/v2_0/test_gateway.py +++ b/openstackclient/tests/network/v2_0/test_gateway.py @@ -59,7 +59,7 @@ def test_get_parser_all(self): class TestSetGateway(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(gateway.SetGateway, "noo") - self.assertEqual('noo', parsed.network) + self.assertEqual('noo', parsed.gateway) class TestShowGateway(common.TestNetworkBase): diff --git a/setup.cfg b/setup.cfg index 955f29cb70..c622895e21 100644 --- a/setup.cfg +++ b/setup.cfg @@ -333,6 +333,11 @@ openstack.network.v2_0 = subnet_list = openstackclient.network.v2_0.subnet:ListSubnet subnet_show = openstackclient.network.v2_0.subnet:ShowSubnet subnet_set = openstackclient.network.v2_0.subnet:SetSubnet + vpn_service_create = openstackclient.network.v2_0.vpn.service:CreateService + vpn_service_delete = openstackclient.network.v2_0.vpn.service:DeleteService + vpn_service_list =openstackclient.network.v2_0.vpn.service:ListService + vpn_service_set =openstackclient.network.v2_0.vpn.service:SetService + vpn_service_show =openstackclient.network.v2_0.vpn.service:ShowService [build_sphinx] source-dir = doc/source From 4e784d8ee83627e137bc5f75c1d440d3948004aa Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Sun, 15 Dec 2013 09:04:15 -0700 Subject: [PATCH 26/66] vpn service --- openstackclient/network/v2_0/vpn/__init__.py | 14 ++ openstackclient/network/v2_0/vpn/service.py | 78 ++++++++++ .../tests/network/v2_0/vpn/__init__.py | 14 ++ .../tests/network/v2_0/vpn/test_service.py | 43 ++++++ .../v2_0/vpn/test_service_integration.py | 144 ++++++++++++++++++ 5 files changed, 293 insertions(+) create mode 100644 openstackclient/network/v2_0/vpn/__init__.py create mode 100644 openstackclient/network/v2_0/vpn/service.py create mode 100644 openstackclient/tests/network/v2_0/vpn/__init__.py create mode 100644 openstackclient/tests/network/v2_0/vpn/test_service.py create mode 100644 openstackclient/tests/network/v2_0/vpn/test_service_integration.py diff --git a/openstackclient/network/v2_0/vpn/__init__.py b/openstackclient/network/v2_0/vpn/__init__.py new file mode 100644 index 0000000000..85ac2501b8 --- /dev/null +++ b/openstackclient/network/v2_0/vpn/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# diff --git a/openstackclient/network/v2_0/vpn/service.py b/openstackclient/network/v2_0/vpn/service.py new file mode 100644 index 0000000000..afc8337b4e --- /dev/null +++ b/openstackclient/network/v2_0/vpn/service.py @@ -0,0 +1,78 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""VPN action implementations""" + +from neutronclient.neutron.v2_0.vpn import vpnservice as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class CreateService(v2_0.CreateCommand): + """Create a VPN service""" + + clazz = neu2.CreateVPNService + + def get_parser(self, prog_name): + parser = super(CreateService, self).get_parser(prog_name) + parser.add_argument( + 'name', metavar='', + help='Name of VPN service to create') + parser.add_argument( + 'router', metavar='', + help='Router unique identifier for the vpnservice') + parser.add_argument( + 'subnet', metavar='', + help='Subnet unique identifier for the vpnservice deployment') + parser.add_argument( + '--admin-state-down', + dest='admin_state', action='store_false', + help='set admin state up to false') + parser.add_argument( + '--description', + help='Set a description for the vpnservice') + return parser + + +class DeleteService(v2_0.DeleteCommand): + """Delete a VPN service""" + + clazz = neu2.DeleteVPNService + name = 'id' + metavar = '' + help_text = 'Name or ID of VPN service to delete' + + +class ListService(v2_0.ListCommand): + """List VPN service""" + + clazz = neu2.ListVPNService + + +class SetService(v2_0.SetCommand): + """Set VPN service values""" + + clazz = neu2.UpdateVPNService + name = 'service' + metavar = '' + help_text = 'Name or ID of VPN service to set' + + +class ShowService(v2_0.ShowCommand): + """Show a VPN service""" + + clazz = neu2.ShowVPNService + name = 'id' + metavar = '' + help_text = 'Name or ID of VPN service to show' diff --git a/openstackclient/tests/network/v2_0/vpn/__init__.py b/openstackclient/tests/network/v2_0/vpn/__init__.py new file mode 100644 index 0000000000..ebf59b327e --- /dev/null +++ b/openstackclient/tests/network/v2_0/vpn/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# diff --git a/openstackclient/tests/network/v2_0/vpn/test_service.py b/openstackclient/tests/network/v2_0/vpn/test_service.py new file mode 100644 index 0000000000..aaf521e7f8 --- /dev/null +++ b/openstackclient/tests/network/v2_0/vpn/test_service.py @@ -0,0 +1,43 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0.vpn import service +from openstackclient.tests.network.v2_0 import common + + +class TestCreateVPNService(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo roo soo" + self.given_default_show_options() + parsed = self.given_args(service.CreateService, given) + self.assertEqual('noo', parsed.name) + self.assertEqual('roo', parsed.router) + self.assertEqual('soo', parsed.subnet) + self.assertEqual(True, parsed.admin_state) + self.assertEqual(None, parsed.description) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too roo soo --admin-state-down --description doo" +\ + " --project sneed" + allargs += self.given_all_show_options() + parsed = self.given_args(service.CreateService, allargs) + self.assertEqual('too', parsed.name) + self.assertEqual('roo', parsed.router) + self.assertEqual('soo', parsed.subnet) + self.assertEqual(False, parsed.admin_state) + self.assertEqual('doo', parsed.description) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/vpn/test_service_integration.py b/openstackclient/tests/network/v2_0/vpn/test_service_integration.py new file mode 100644 index 0000000000..f804084152 --- /dev/null +++ b/openstackclient/tests/network/v2_0/vpn/test_service_integration.py @@ -0,0 +1,144 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0.vpn import service +from openstackclient.tests.network.v2_0 import common + + +class TestServiceIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + SUBNETS_URL = HOSTESS + "/subnets.json" + SUBNETS_ONE = '{ "subnets": [{ "id": "12312311" }]}' + ROUTERS_URL = HOSTESS + "/routers.json" + ROUTERS_ONE = '{ "routers": [{ "id": "33333333" }]}' + CREATE_URL = HOSTESS + "/vpn/vpnservices.json" + CREATE = """ +{ + "vpnservice": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/vpn/vpnservices/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/vpn/vpnservices.json" + LIST_ONE = """ +{ + "vpnservices": [{ + "id": "a9254bdb" + }] +}""" + LIST = """ +{ + "vpnservices": [ + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/vpn/vpnservices/a9254bdb.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.subnet = 'subby' + pargs.router = 'rooty' + pargs.admin_state = True + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, + body=self.SUBNETS_ONE) + httpretty.register_uri(httpretty.GET, self.ROUTERS_URL, + body=self.ROUTERS_ONE) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(service.CreateService, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new vpnservice: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(service.DeleteService, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted vpnservice: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(service.ListService, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name,status +a9254bdb,gator,ACTIVE +b8408dgd,croc,ACTIVE +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(service.SetService, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(service.ShowService, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) From 2f7f625c77f9dbb2926703c60b9448d588788785 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 16 Dec 2013 13:18:52 -0700 Subject: [PATCH 27/66] vpn ipsec policy --- .../network/v2_0/vpn/ipsecpolicy.py | 107 +++++++++++++ openstackclient/tests/network/v2_0/common.py | 4 +- .../network/v2_0/vpn/test_ipsecpolicy.py | 92 +++++++++++ .../v2_0/vpn/test_ipsecpolicy_integration.py | 145 ++++++++++++++++++ .../tests/network/v2_0/vpn/test_service.py | 42 ++++- setup.cfg | 5 + 6 files changed, 392 insertions(+), 3 deletions(-) create mode 100644 openstackclient/network/v2_0/vpn/ipsecpolicy.py create mode 100644 openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py create mode 100644 openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy_integration.py diff --git a/openstackclient/network/v2_0/vpn/ipsecpolicy.py b/openstackclient/network/v2_0/vpn/ipsecpolicy.py new file mode 100644 index 0000000000..a77b7c96e3 --- /dev/null +++ b/openstackclient/network/v2_0/vpn/ipsecpolicy.py @@ -0,0 +1,107 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""IPSec Policy action implementations""" + +from neutronclient.common import utils +from neutronclient.neutron.v2_0.vpn import ipsecpolicy as neu2 +from neutronclient.neutron.v2_0.vpn import utils as vpn_utils +from openstackclient.network import v2_0 as v2_0 + + +class CreateIpsecpolicy(v2_0.CreateCommand): + """Create a IPSec policy""" + + clazz = neu2.CreateIPsecPolicy + + def get_parser(self, prog_name): + parser = super(CreateIpsecpolicy, self).get_parser(prog_name) + parser.add_argument( + '--description', + help='Description of the IPsecPolicy') + parser.add_argument( + '--transform-protocol', + default='esp', choices=['esp', 'ah', 'ah-esp'], + help='Transform Protocol in lowercase, default:esp') + parser.add_argument( + '--auth-algorithm', + default='sha1', choices=['sha1'], + help='Authentication algorithm in lowercase, default:sha1') + parser.add_argument( + '--encryption-algorithm', + default='aes-128', choices=['3des', + 'aes-128', + 'aes-192', + 'aes-256'], + help='Encryption Algorithm in lowercase, default:aes-128') + parser.add_argument( + '--encapsulation-mode', + default='tunnel', choices=['tunnel', 'transport'], + help='Encapsulation Mode in lowercase, default:tunnel') + parser.add_argument( + '--pfs', + default='group5', choices=['group2', 'group5', 'group14'], + help='Perfect Forward Secrecy in lowercase, default:group5') + parser.add_argument( + '--lifetime', + metavar="units=UNITS,value=VALUE", + type=utils.str2dict, + help=vpn_utils.lifetime_help("IPsec")) + parser.add_argument( + 'name', metavar='NAME', + help='Name of the IPsecPolicy') + return parser + + +class DeleteIpsecpolicy(v2_0.DeleteCommand): + """Delete a IPSec policy""" + + clazz = neu2.DeleteIPsecPolicy + name = 'id' + metavar = '' + help_text = 'Name or ID of IPSec policy to delete' + + +class ListIpsecpolicy(v2_0.ListCommand): + """List IPSec policies""" + + clazz = neu2.ListIPsecPolicy + + +class SetIpsecpolicy(v2_0.SetCommand): + """Set IPSec policy values""" + + clazz = neu2.UpdateIPsecPolicy + name = 'id' + metavar = '' + help_text = 'Name or ID of IPSec policy to set' + + def get_parser(self, prog_name): + parser = super(SetIpsecpolicy, self).get_parser(prog_name) + parser.add_argument( + '--lifetime', + metavar="units=UNITS,value=VALUE", + type=utils.str2dict, + help=vpn_utils.lifetime_help("IPsec")) + return parser + + +class ShowIpsecpolicy(v2_0.ShowCommand): + """Show a IPSec policy""" + + clazz = neu2.ShowIPsecPolicy + name = 'id' + metavar = '' + help_text = 'Name or ID of IPSec policy to show' diff --git a/openstackclient/tests/network/v2_0/common.py b/openstackclient/tests/network/v2_0/common.py index abae1d84ad..ea8ac47bc7 100644 --- a/openstackclient/tests/network/v2_0/common.py +++ b/openstackclient/tests/network/v2_0/common.py @@ -92,8 +92,8 @@ def when_run(self, clazz, pargs): print("body = " + str(lasty.body)) print("querystring = " + str(getattr(lasty, 'querystring', ''))) print("command = " + str(getattr(lasty, 'command', ''))) - print("method = " + str(lasty.method)) - print("path = " + str(lasty.path)) + print("method = " + str(getattr(lasty, 'method', ''))) + print("path = " + str(getattr(lasty, 'path', ''))) print('====================================================') raise e self.assertEqual(0, result) diff --git a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py new file mode 100644 index 0000000000..8b261c4081 --- /dev/null +++ b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py @@ -0,0 +1,92 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0.vpn import ipsecpolicy +from openstackclient.tests.network.v2_0 import common + + +class TestCreateIpsecpolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(ipsecpolicy.CreateIpsecpolicy, given) + self.assertEqual('noo', parsed.name) + self.assertEqual(None, parsed.description) + self.assertEqual('esp', parsed.transform_protocol) + self.assertEqual('sha1', parsed.auth_algorithm) + self.assertEqual('aes-128', parsed.encryption_algorithm) + self.assertEqual('tunnel', parsed.encapsulation_mode) + self.assertEqual('group5', parsed.pfs) + self.assertEqual(None, parsed.lifetime) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too --description doo --transform-protocol esp" +\ + " --auth-algorithm sha1 --encryption-algorithm aes-192" +\ + " --encapsulation-mode transport --pfs group2" +\ + " --lifetime units=seconds,value=300" +\ + " --project sneed" + allargs += self.given_all_show_options() + parsed = self.given_args(ipsecpolicy.CreateIpsecpolicy, allargs) + self.assertEqual('too', parsed.name) + self.assertEqual('doo', parsed.description) + self.assertEqual('esp', parsed.transform_protocol) + self.assertEqual('sha1', parsed.auth_algorithm) + self.assertEqual('aes-192', parsed.encryption_algorithm) + self.assertEqual('transport', parsed.encapsulation_mode) + self.assertEqual('group2', parsed.pfs) + self.assertEqual({'units': 'seconds', 'value': '300'}, parsed.lifetime) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteIpsecpolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(ipsecpolicy.DeleteIpsecpolicy, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListIpsecpolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(ipsecpolicy.ListIpsecpolicy, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(ipsecpolicy.ListIpsecpolicy, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetIpsecpolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(ipsecpolicy.SetIpsecpolicy, "noo") + self.assertEqual('noo', parsed.id) + + +class TestShowIpsecpolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(ipsecpolicy.ShowIpsecpolicy, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too " + self.given_all_show_options() + parsed = self.given_args(ipsecpolicy.ShowIpsecpolicy, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy_integration.py b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy_integration.py new file mode 100644 index 0000000000..b407cb42de --- /dev/null +++ b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy_integration.py @@ -0,0 +1,145 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0.vpn import ipsecpolicy +from openstackclient.tests.network.v2_0 import common + + +class TestIpsecpolicyIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + CREATE_URL = HOSTESS + "/vpn/ipsecpolicies.json" + CREATE = """ +{ + "ipsecpolicy": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/vpn/ipsecpolicies/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/vpn/ipsecpolicies.json" + LIST_ONE = """ +{ + "ipsecpolicies": [{ + "id": "a9254bdb" + }] +}""" + LIST = """ +{ + "ipsecpolicies": [ + { + "name": "gator", + "tenant_id": "33a40233", + "auth_algorithm": "sha1", + "encryption_algorithm": "aes-128", + "pfs": "group5", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "name": "croc", + "auth_algorithm": "sha1", + "encryption_algorithm": "aes-128", + "pfs": "group5", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/vpn/ipsecpolicies/a9254bdb.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.description = 'gatorific' + pargs.transform_protocol = 'esp' + pargs.auth_algorithm = 'sha1' + pargs.encryption_algorithm = 'aes-128' + pargs.encapsulation_mode = 'tunnel' + pargs.pfs = 'group5' + pargs.lifetime = {'units': 'seconds', 'value': '200'} + pargs.tenant_id = '999999' + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(ipsecpolicy.CreateIpsecpolicy, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new ipsecpolicy: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(ipsecpolicy.DeleteIpsecpolicy, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted ipsecpolicy: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(ipsecpolicy.ListIpsecpolicy, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name,auth_algorithm,encryption_algorithm,pfs +a9254bdb,gator,sha1,aes-128,group5 +b8408dgd,croc,sha1,aes-128,group5 +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(ipsecpolicy.SetIpsecpolicy, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(ipsecpolicy.ShowIpsecpolicy, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/vpn/test_service.py b/openstackclient/tests/network/v2_0/vpn/test_service.py index aaf521e7f8..43bc5a62fa 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_service.py +++ b/openstackclient/tests/network/v2_0/vpn/test_service.py @@ -17,7 +17,7 @@ from openstackclient.tests.network.v2_0 import common -class TestCreateVPNService(common.TestNetworkBase): +class TestCreateService(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo roo soo" + self.given_default_show_options() parsed = self.given_args(service.CreateService, given) @@ -41,3 +41,43 @@ def test_get_parser_all(self): self.assertEqual('doo', parsed.description) self.assertEqual('sneed', parsed.tenant_id) self.then_all_show_options(parsed) + + +class TestDeleteService(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(service.DeleteService, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListService(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(service.ListService, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(service.ListService, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetService(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(service.SetService, "noo") + self.assertEqual('noo', parsed.service) + + +class TestShowService(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(service.ShowService, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too " + self.given_all_show_options() + parsed = self.given_args(service.ShowService, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/setup.cfg b/setup.cfg index c622895e21..10979bdb55 100644 --- a/setup.cfg +++ b/setup.cfg @@ -333,6 +333,11 @@ openstack.network.v2_0 = subnet_list = openstackclient.network.v2_0.subnet:ListSubnet subnet_show = openstackclient.network.v2_0.subnet:ShowSubnet subnet_set = openstackclient.network.v2_0.subnet:SetSubnet + vpn_ipsecpolicy_create = openstackclient.network.v2_0.vpn.ipsecpolicy:CreateIpsecpolicy + vpn_ipsecpolicy_delete = openstackclient.network.v2_0.vpn.ipsecpolicy:DeleteIpsecpolicy + vpn_ipsecpolicy_list =openstackclient.network.v2_0.vpn.ipsecpolicy:ListIpsecpolicy + vpn_ipsecpolicy_set =openstackclient.network.v2_0.vpn.ipsecpolicy:SetIpsecpolicy + vpn_ipsecpolicy_show =openstackclient.network.v2_0.vpn.ipsecpolicy:ShowIpsecpolicy vpn_service_create = openstackclient.network.v2_0.vpn.service:CreateService vpn_service_delete = openstackclient.network.v2_0.vpn.service:DeleteService vpn_service_list =openstackclient.network.v2_0.vpn.service:ListService From 4694f6517876cc0af4d30559af4775e84f0a789b Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 16 Dec 2013 14:37:42 -0700 Subject: [PATCH 28/66] vpn ike policy --- openstackclient/network/v2_0/vpn/ikepolicy.py | 108 +++++++++++++ .../tests/network/v2_0/vpn/test_ikepolicy.py | 93 +++++++++++ .../v2_0/vpn/test_ikepolicy_integration.py | 147 ++++++++++++++++++ setup.cfg | 5 + 4 files changed, 353 insertions(+) create mode 100644 openstackclient/network/v2_0/vpn/ikepolicy.py create mode 100644 openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py create mode 100644 openstackclient/tests/network/v2_0/vpn/test_ikepolicy_integration.py diff --git a/openstackclient/network/v2_0/vpn/ikepolicy.py b/openstackclient/network/v2_0/vpn/ikepolicy.py new file mode 100644 index 0000000000..5cadc89b02 --- /dev/null +++ b/openstackclient/network/v2_0/vpn/ikepolicy.py @@ -0,0 +1,108 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""IKE Policy action implementations""" + +from neutronclient.common import utils +from neutronclient.neutron.v2_0.vpn import ikepolicy as neu2 +from neutronclient.neutron.v2_0.vpn import utils as vpn_utils +from openstackclient.network import v2_0 as v2_0 + + +class CreateIkepolicy(v2_0.CreateCommand): + """Create a IKE policy""" + + clazz = neu2.CreateIKEPolicy + + def get_parser(self, prog_name): + parser = super(CreateIkepolicy, self).get_parser(prog_name) + parser.add_argument( + '--description', + help='Description of the IKE policy') + parser.add_argument( + '--auth-algorithm', + default='sha1', choices=['sha1'], + help='Authentication algorithm in lowercase. ' + 'default:sha1') + parser.add_argument( + '--encryption-algorithm', + default='aes-128', choices=['3des', + 'aes-128', + 'aes-192', + 'aes-256'], + help='Encryption Algorithm in lowercase, default:aes-128') + parser.add_argument( + '--phase1-negotiation-mode', + default='main', choices=['main'], + help='IKE Phase1 negotiation mode in lowercase, default:main') + parser.add_argument( + '--ike-version', + default='v1', choices=['v1', 'v2'], + help='IKE version in lowercase, default:v1') + parser.add_argument( + '--pfs', + default='group5', choices=['group2', 'group5', 'group14'], + help='Perfect Forward Secrecy in lowercase, default:group5') + parser.add_argument( + '--lifetime', + metavar="units=UNITS,value=VALUE", + type=utils.str2dict, + help=vpn_utils.lifetime_help("IKE")) + parser.add_argument( + 'name', metavar='NAME', + help='Name of the IKE Policy') + return parser + + +class DeleteIkepolicy(v2_0.DeleteCommand): + """Delete a IKE policy""" + + clazz = neu2.DeleteIKEPolicy + name = 'id' + metavar = '' + help_text = 'Name or ID of IKE policy to delete' + + +class ListIkepolicy(v2_0.ListCommand): + """List IKE policies""" + + clazz = neu2.ListIKEPolicy + + +class SetIkepolicy(v2_0.SetCommand): + """Set IKE policy values""" + + clazz = neu2.UpdateIKEPolicy + name = 'id' + metavar = '' + help_text = 'Name or ID of IKE policy to set' + + def get_parser(self, prog_name): + parser = super(SetIkepolicy, self).get_parser(prog_name) + parser.add_argument( + '--lifetime', + metavar="units=UNITS,value=VALUE", + type=utils.str2dict, + help=vpn_utils.lifetime_help("IKE")) + return parser + + +class ShowIkepolicy(v2_0.ShowCommand): + """Show a IKE policy""" + + clazz = neu2.ShowIKEPolicy + name = 'id' + metavar = '' + help_text = 'Name or ID of IKE policy to show' diff --git a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py new file mode 100644 index 0000000000..673fda3060 --- /dev/null +++ b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py @@ -0,0 +1,93 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0.vpn import ikepolicy +from openstackclient.tests.network.v2_0 import common + + +class TestCreateIkepolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(ikepolicy.CreateIkepolicy, given) + self.assertEqual('noo', parsed.name) + self.assertEqual(None, parsed.description) + self.assertEqual('sha1', parsed.auth_algorithm) + self.assertEqual('aes-128', parsed.encryption_algorithm) + self.assertEqual('main', parsed.phase1_negotiation_mode) + self.assertEqual('v1', parsed.ike_version) + self.assertEqual('group5', parsed.pfs) + self.assertEqual(None, parsed.lifetime) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too --description doo " +\ + " --auth-algorithm sha1 --encryption-algorithm aes-192" +\ + " --phase1-negotiation-mode main --pfs group2" +\ + " --ike-version v2" +\ + " --lifetime units=seconds,value=300" +\ + " --project sneed" + allargs += self.given_all_show_options() + parsed = self.given_args(ikepolicy.CreateIkepolicy, allargs) + self.assertEqual('too', parsed.name) + self.assertEqual('doo', parsed.description) + self.assertEqual('sha1', parsed.auth_algorithm) + self.assertEqual('aes-192', parsed.encryption_algorithm) + self.assertEqual('main', parsed.phase1_negotiation_mode) + self.assertEqual('v2', parsed.ike_version) + self.assertEqual('group2', parsed.pfs) + self.assertEqual({'units': 'seconds', 'value': '300'}, parsed.lifetime) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteIkepolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(ikepolicy.DeleteIkepolicy, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListIkepolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(ikepolicy.ListIkepolicy, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(ikepolicy.ListIkepolicy, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetIkepolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(ikepolicy.SetIkepolicy, "noo") + self.assertEqual('noo', parsed.id) + + +class TestShowIkepolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(ikepolicy.ShowIkepolicy, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too " + self.given_all_show_options() + parsed = self.given_args(ikepolicy.ShowIkepolicy, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy_integration.py b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy_integration.py new file mode 100644 index 0000000000..7359818fd1 --- /dev/null +++ b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy_integration.py @@ -0,0 +1,147 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0.vpn import ikepolicy +from openstackclient.tests.network.v2_0 import common + + +class TestIkepolicyIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + CREATE_URL = HOSTESS + "/vpn/ikepolicies.json" + CREATE = """ +{ + "ikepolicy": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/vpn/ikepolicies/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/vpn/ikepolicies.json" + LIST_ONE = """ +{ + "ikepolicies": [{ + "id": "a9254bdb" + }] +}""" + LIST = """ +{ + "ikepolicies": [ + { + "name": "gator", + "tenant_id": "33a40233", + "auth_algorithm": "sha1", + "encryption_algorithm": "aes-128", + "ike_version": "v1", + "pfs": "group5", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "name": "croc", + "auth_algorithm": "sha1", + "encryption_algorithm": "aes-128", + "ike_version": "v2", + "pfs": "group5", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/vpn/ikepolicies/a9254bdb.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.description = 'gatorific' + pargs.auth_algorithm = 'sha1' + pargs.encryption_algorithm = 'aes-128' + pargs.phase1_negotiation_mode = 'main' + pargs.ike_version = 'v2' + pargs.pfs = 'group5' + pargs.lifetime = {'units': 'seconds', 'value': '200'} + pargs.tenant_id = '999999' + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(ikepolicy.CreateIkepolicy, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new ikepolicy: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(ikepolicy.DeleteIkepolicy, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted ikepolicy: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(ikepolicy.ListIkepolicy, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name,auth_algorithm,encryption_algorithm,ike_version,pfs +a9254bdb,gator,sha1,aes-128,v1,group5 +b8408dgd,croc,sha1,aes-128,v2,group5 +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(ikepolicy.SetIkepolicy, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(ikepolicy.ShowIkepolicy, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) diff --git a/setup.cfg b/setup.cfg index 10979bdb55..c2e00d078b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -333,6 +333,11 @@ openstack.network.v2_0 = subnet_list = openstackclient.network.v2_0.subnet:ListSubnet subnet_show = openstackclient.network.v2_0.subnet:ShowSubnet subnet_set = openstackclient.network.v2_0.subnet:SetSubnet + vpn_ikepolicy_create = openstackclient.network.v2_0.vpn.ikepolicy:CreateIkepolicy + vpn_ikepolicy_delete = openstackclient.network.v2_0.vpn.ikepolicy:DeleteIkepolicy + vpn_ikepolicy_list =openstackclient.network.v2_0.vpn.ikepolicy:ListIkepolicy + vpn_ikepolicy_set =openstackclient.network.v2_0.vpn.ikepolicy:SetIkepolicy + vpn_ikepolicy_show =openstackclient.network.v2_0.vpn.ikepolicy:ShowIkepolicy vpn_ipsecpolicy_create = openstackclient.network.v2_0.vpn.ipsecpolicy:CreateIpsecpolicy vpn_ipsecpolicy_delete = openstackclient.network.v2_0.vpn.ipsecpolicy:DeleteIpsecpolicy vpn_ipsecpolicy_list =openstackclient.network.v2_0.vpn.ipsecpolicy:ListIpsecpolicy From 7b5b12b2ebf68ae97b7abb9d191529744b3a8da2 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Tue, 17 Dec 2013 21:47:32 -0700 Subject: [PATCH 29/66] dhcp agent --- openstackclient/network/v2_0/dhcp.py | 56 ++++++++++ .../tests/network/v2_0/test_dhcp.py | 47 ++++++++ .../network/v2_0/test_dhcp_integration.py | 105 ++++++++++++++++++ setup.cfg | 6 +- 4 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 openstackclient/network/v2_0/dhcp.py create mode 100644 openstackclient/tests/network/v2_0/test_dhcp.py create mode 100644 openstackclient/tests/network/v2_0/test_dhcp_integration.py diff --git a/openstackclient/network/v2_0/dhcp.py b/openstackclient/network/v2_0/dhcp.py new file mode 100644 index 0000000000..fa1f35f0a5 --- /dev/null +++ b/openstackclient/network/v2_0/dhcp.py @@ -0,0 +1,56 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Gateway action implementations""" + +from neutronclient.neutron.v2_0 import agentscheduler as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class AddNetworkDhcpAgent(v2_0.AddCommand): + """Add a network to a DHCP agent.""" + + clazz = neu2.AddNetworkToDhcpAgent + container_name = "network" + container_metavar = "" + container_help_text = "Network name or id" + name = 'dhcp_agent' + metavar = '' + help_text = 'DHCP agent to add' + + +class RemoveNetworkDhcpAgent(v2_0.RemoveCommand): + """Delete a gateway""" + + clazz = neu2.RemoveNetworkFromDhcpAgent + container_name = "network" + container_metavar = "" + container_help_text = "Network name or id" + name = 'dhcp_agent' + metavar = '' + help_text = 'DHCP agent to remove' + + +class ListDhcpAgent(v2_0.ListCommand): + """List DHCP agents on a network""" + + clazz = neu2.ListDhcpAgentsHostingNetwork + + def get_parser(self, prog_name): + parser = super(ListDhcpAgent, self).get_parser(prog_name) + parser.add_argument( + 'network', + help='network to query') + return parser diff --git a/openstackclient/tests/network/v2_0/test_dhcp.py b/openstackclient/tests/network/v2_0/test_dhcp.py new file mode 100644 index 0000000000..f8e6348563 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_dhcp.py @@ -0,0 +1,47 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0 import dhcp +from openstackclient.tests.network.v2_0 import common + + +class TestAddNetworkDhcpAgent(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(dhcp.AddNetworkDhcpAgent, "netty agent") + self.assertEqual('netty', parsed.network) + self.assertEqual('agent', parsed.dhcp_agent) + + +class TestRemoveNetworkDhcpAgent(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(dhcp.RemoveNetworkDhcpAgent, "netty agent") + self.assertEqual('netty', parsed.network) + self.assertEqual('agent', parsed.dhcp_agent) + + +class TestListDhcpAgent(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "netty" + self.given_default_list_options() + parsed = self.given_args(dhcp.ListDhcpAgent, given) + self.assertEqual('netty', parsed.network) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "netty --long" + self.given_all_list_options() + parsed = self.given_args(dhcp.ListDhcpAgent, allargs) + self.assertEqual('netty', parsed.network) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_dhcp_integration.py b/openstackclient/tests/network/v2_0/test_dhcp_integration.py new file mode 100644 index 0000000000..5441acd4be --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_dhcp_integration.py @@ -0,0 +1,105 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0 import dhcp +from openstackclient.tests.network.v2_0 import common + + +class TestGatewayIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + NETWORK_URL = HOSTESS + "/networks.json" + NETWORK_ONE = '{ "networks": [{ "id": "12312311" }]}' + ADD_URL = HOSTESS + "/agents/cash/dhcp-networks.json" + ADD = """ +{ + "agent": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + REMOVE_URL = HOSTESS + "/agents/nelson/dhcp-networks/12312311.json" + REMOVE = "{}" + LIST_URL = HOSTESS + "/networks/12312311/dhcp-agents.json" + LIST = """ +{ + "agents": [ + { + "status": "ACTIVE", + "host": "gator", + "tenant_id": "33a40233", + "admin_state_up": "true", + "alive": false, + "id": "a9254bdb" + }, + { + "host": "croc", + "tenant_id": "33a40233", + "admin_state_up": "true", + "alive": true, + "id": "b8408dgd" + } + ] +}""" + + @httpretty.activate + def test_add(self): + pargs = common.FakeParsedArgs() + pargs.network = 'johnny' + pargs.dhcp_agent = 'cash' + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.GET, self.NETWORK_URL, + body=self.NETWORK_ONE) + httpretty.register_uri(httpretty.POST, self.ADD_URL, + body=self.ADD) + self.when_run(dhcp.AddNetworkDhcpAgent, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Added network johnny to DHCP agent\n', + self.stdout()) + + @httpretty.activate + def test_remove(self): + pargs = common.FakeParsedArgs() + pargs.network = 'willie' + pargs.dhcp_agent = 'nelson' + httpretty.register_uri(httpretty.GET, self.NETWORK_URL, + body=self.NETWORK_ONE) + httpretty.register_uri(httpretty.DELETE, self.REMOVE_URL, + body=self.REMOVE) + self.when_run(dhcp.RemoveNetworkDhcpAgent, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Removed network willie to DHCP agent\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.network = 'range' + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.NETWORK_URL, + body=self.NETWORK_ONE) + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(dhcp.ListDhcpAgent, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,host,admin_state_up,alive +a9254bdb,gator,true,xxx +b8408dgd,croc,true,:-) +""", self.stdout()) diff --git a/setup.cfg b/setup.cfg index c2e00d078b..3dbe2f3212 100644 --- a/setup.cfg +++ b/setup.cfg @@ -270,9 +270,9 @@ openstack.volume.v1 = volume_type_unset = openstackclient.volume.v1.type:UnsetVolumeType openstack.network.v2_0 = - dhcp_agent_network_add = neutronclient.neutron.v2_0.agentscheduler:AddNetworkToDhcpAgent - dhcp_agent_network_remove = neutronclient.neutron.v2_0.agentscheduler:RemoveNetworkFromDhcpAgent - dhcp_agent_network_list = neutronclient.neutron.v2_0.agentscheduler:ListNetworksOnDhcpAgent + dhcp_agent_add_network = openstackclient.network.v2_0.dhcp:AddNetworkDhcpAgent + dhcp_agent_remove_network = openstackclient.network.v2_0.dhcp:RemoveNetworkDhcpAgent + dhcp_agent_list = openstackclient.network.v2_0.dhcp:ListDhcpAgent l3_agent_add_router = neutronclient.neutron.v2_0.agentscheduler:AddRouterToL3Agent l3_agent_remove_router = neutronclient.neutron.v2_0.agentscheduler:RemoveRouterFromL3Agent l3_agent_list = neutronclient.neutron.v2_0.agentscheduler:ListRoutersOnL3Agent From 907185dbafc0a4fb15ae213e1baa176fffee2595 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 18 Dec 2013 09:05:41 -0700 Subject: [PATCH 30/66] add network integration test --- .../network/v2_0/test_network_integration.py | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 openstackclient/tests/network/v2_0/test_network_integration.py diff --git a/openstackclient/tests/network/v2_0/test_network_integration.py b/openstackclient/tests/network/v2_0/test_network_integration.py new file mode 100644 index 0000000000..b470bb97d7 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_network_integration.py @@ -0,0 +1,157 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0 import network +from openstackclient.tests.network.v2_0 import common + + +class TestNetworkIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + SUBNETS_URL = HOSTESS + "/subnets.json" + SUBNETS_ONE = '{ "subnets": [{ "id": "12312311" }]}' + CREATE_URL = HOSTESS + "/networks.json" + CREATE = """ +{ + "network": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/networks/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/networks.json" + LIST_ONE = """ +{ + "networks": [{ + "id": "a9254bdb" + }] +}""" + LIST = """ +{ + "networks": [ + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/networks/a9254bdb.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.admin_state = True + pargs.shared = True + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(network.CreateNetwork, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new network: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(network.DeleteNetwork, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted network: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + pargs.external = False + httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, + body=self.SUBNETS_ONE) + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(network.ListNetwork, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name +a9254bdb,gator +b8408dgd,croc +""", self.stdout()) + + @httpretty.activate + def test_list_external(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + pargs.external = True + httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, + body=self.SUBNETS_ONE) + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(network.ListNetwork, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name +a9254bdb,gator +b8408dgd,croc +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(network.SetNetwork, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(network.ShowNetwork, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) From d34af780399de920c9d47e7ca13e31a3c957ca12 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 18 Dec 2013 12:25:28 -0700 Subject: [PATCH 31/66] fix problems from gerrit --- openstackclient/tests/fakes.py | 5 ++--- requirements.txt | 2 +- test-requirements.txt | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/openstackclient/tests/fakes.py b/openstackclient/tests/fakes.py index 53b1ece074..044b3d0fd9 100644 --- a/openstackclient/tests/fakes.py +++ b/openstackclient/tests/fakes.py @@ -23,10 +23,9 @@ class FakeStdout: def __init__(self): self.content = [] - self.current = 0 def write(self, text): - self.content.append(text.replace('\r', '')) + self.content.append(text) def make_string(self): result = '' @@ -35,7 +34,7 @@ def make_string(self): return result def lines(self): - return ''.join(self.content) + return ''.join(self.content).replace('\r', '') class FakeApp(object): diff --git a/requirements.txt b/requirements.txt index c848ec4cf2..aaeed7698b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,6 +6,6 @@ python-glanceclient>=0.9.0 python-keystoneclient>=0.4.1 python-novaclient>=2.15.0 python-cinderclient>=1.0.6 -python-neutronclient +python-neutronclient>=2.3.0,<3 requests>=1.1 six>=1.4.1 diff --git a/test-requirements.txt b/test-requirements.txt index 27af07db53..21ea45481c 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -3,7 +3,7 @@ hacking>=0.8.0,<0.9 coverage>=3.6 discover fixtures>=0.3.14 -httpretty>=0.7.0 +httpretty>=0.7.1 mock>=1.0 sphinx>=1.1.2,<1.2 testrepository>=0.0.17 From cf78b954798cd572dba6e9cd7a9ef575eb95a4b5 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 19 Dec 2013 11:30:59 -0700 Subject: [PATCH 32/66] add integration tests --- .../v2_0/test_floatingip_integration.py | 123 +++++++++++++ .../network/v2_0/test_port_integration.py | 148 ++++++++++++++++ .../tests/network/v2_0/test_router_aft.py | 129 -------------- .../network/v2_0/test_router_integration.py | 164 ++++++++++++++++++ .../v2_0/test_security_group_integration.py | 131 ++++++++++++++ .../test_security_group_rule_integration.py | 137 +++++++++++++++ .../network/v2_0/test_subnet_integration.py | 141 +++++++++++++++ 7 files changed, 844 insertions(+), 129 deletions(-) create mode 100644 openstackclient/tests/network/v2_0/test_floatingip_integration.py create mode 100644 openstackclient/tests/network/v2_0/test_port_integration.py delete mode 100644 openstackclient/tests/network/v2_0/test_router_aft.py create mode 100644 openstackclient/tests/network/v2_0/test_router_integration.py create mode 100644 openstackclient/tests/network/v2_0/test_security_group_integration.py create mode 100644 openstackclient/tests/network/v2_0/test_security_group_rule_integration.py create mode 100644 openstackclient/tests/network/v2_0/test_subnet_integration.py diff --git a/openstackclient/tests/network/v2_0/test_floatingip_integration.py b/openstackclient/tests/network/v2_0/test_floatingip_integration.py new file mode 100644 index 0000000000..68fb986842 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_floatingip_integration.py @@ -0,0 +1,123 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0 import floatingip +from openstackclient.tests.network.v2_0 import common + + +class TestFloatingIpIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + NETWORK_URL = HOSTESS + "/networks.json" + NETWORK_ONE = '{ "networks": [{ "id": "2222223" }] }' + CREATE_URL = HOSTESS + "/floatingips.json" + CREATE = """ +{ + "floatingip": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/floatingips/gator.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/floatingips.json" + LIST_ONE = '{ "floatingips": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "floatingips": [ + { + "id": "a9254bdb", + "fixed_ip_address": "10.1.1.1", + "floating_ip_address": "15.1.1.2", + "port_id": "9090909", + "tenant_id": "33a40233" + }, + { + "id": "b8408dgd", + "fixed_ip_address": "10.1.1.2", + "floating_ip_address": "15.1.1.3", + "port_id": "8080808", + "tenant_id": "33a40233" + } + ] +}""" + SHOW_URL = HOSTESS + "/floatingips/gator.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.floating_network_id = '123123' + pargs.port_id = '7777899' + pargs.fixed_ip_address = None + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.GET, self.NETWORK_URL, + body=self.NETWORK_ONE) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(floatingip.CreateFloatingIp, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new floatingip: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(floatingip.DeleteFloatingIp, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted floatingip: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(floatingip.ListFloatingIp, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,fixed_ip_address,floating_ip_address,port_id +a9254bdb,10.1.1.1,15.1.1.2,9090909 +b8408dgd,10.1.1.2,15.1.1.3,8080808 +""", self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(floatingip.ShowFloatingIp, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_port_integration.py b/openstackclient/tests/network/v2_0/test_port_integration.py new file mode 100644 index 0000000000..a3f66516c7 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_port_integration.py @@ -0,0 +1,148 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0 import port +from openstackclient.tests.network.v2_0 import common + + +class TestPortIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + NETWORK_URL = HOSTESS + "/networks.json" + NETWORK = '{ "networks": [{ "id": "1111111" }] }' + ROUTER_URL = HOSTESS + "/routers.json" + ROUTER = '{ "routers": [{ "id": "22222222" }] }' + CREATE_URL = HOSTESS + "/ports.json" + CREATE = """ +{ + "port": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/ports/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/ports.json" + LIST_ONE = '{ "ports": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "ports": [ + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/ports/a9254bdb.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.network_id = '44444448' + pargs.admin_state = 'UP' + pargs.mac_address = '1231233212' + pargs.device_id = '1231231237' + pargs.fixed_ip = None + pargs.security_groups = None + pargs.no_security_groups = False + pargs.extra_dhcp_opts = None + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.GET, self.NETWORK_URL, + body=self.NETWORK) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(port.CreatePort, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new port: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(port.DeletePort, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted port: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.router = 'roo' + pargs.page_size = None + pargs.sort_key = [] + pargs.sort_dir = [] + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.ROUTER_URL, + body=self.ROUTER) + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(port.ListPort, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name +a9254bdb,gator +b8408dgd,croc +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(port.SetPort, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(port.ShowPort, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_router_aft.py b/openstackclient/tests/network/v2_0/test_router_aft.py deleted file mode 100644 index 1301e159c3..0000000000 --- a/openstackclient/tests/network/v2_0/test_router_aft.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import argparse -import httpretty -import sys -import traceback - -from openstackclient.network.v2_0 import router -from openstackclient import shell -from openstackclient.tests import fakes -from openstackclient.tests.network.v2_0 import common - - -class FakeOptions(argparse.Namespace): - def __init__(self): - super(FakeOptions, self).__init__() - self.debug = False - self.deferred_help = False - self.insecure = True - self.os_default_domain = 'testing' - self.os_cacert = False - self.os_identity_api_version = 'idversion' - self.os_password = 'password' - self.os_project_id = 'project_id' - self.os_project_name = 'project_name' - self.os_region_name = 'region_name' - self.os_network_api_version = '2.0' - self.os_token = 'token' - self.os_url = 'http://127.0.0.1' - self.os_auth_url = 'http://127.0.0.1/identity' - self.os_username = 'username' - - -class FakeParsedArgs(argparse.Namespace): - def __init__(self): - super(FakeParsedArgs, self).__init__() - self.show_details = True - self.request_format = 'json' - self.prefix = '' - self.fields = [] - self.columns = [] - self.variables = [] - self.formatter = 'shell' - - -class TestShowRouterFunctional(common.TestNetworkBase): - ROUTER_LIST_URL = "http://127.0.0.1/v2.0/routers.json" - ROUTER_LIST_ONE = """ -{ - "routers": - [{ - "status": "ACTIVE", - "external_gateway_info": - {"network_id": "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8"}, - "name": "router1", - "admin_state_up": true, - "tenant_id": "33a40233088643acb66ff6eb0ebea679", - "id": "a9254bdb-2613-4a13-ac4c-adc581fba50d" - }] -}""" - ROUTER_SHOW_URL = "http://127.0.0.1/v2.0/routers/a9254bdb-2613-" \ - "4a13-ac4c-adc581fba50d.json" - ROUTER_SHOW = """ -{ - "router": - { - "status": "ACTIVE", - "external_gateway_info": - { - "network_id": "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8" - }, - "name": "router1", - "admin_state_up": true, - "tenant_id": "33a40233088643acb66ff6eb0ebea679", - "id": "a9254bdb-2613-4a13-ac4c-adc581fba50d" - } -}""" - - def setUp(self): - super(TestShowRouterFunctional, self).setUp() - self.app = shell.OpenStackShell() - self.app.options = FakeOptions() - try: - self.app.initialize_app(["run.py", "help"]) - except Exception: - print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) - try: - self.app.authenticate_user() - except Exception: - print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) - self.app.stdout = fakes.FakeStdout() - self.app.stderr = fakes.FakeStdout() - - @httpretty.activate - def test_take_action(self): - parsed_args = FakeParsedArgs() - parsed_args.id = 'router1' - cmd = router.ShowRouter(self.app, parsed_args) - httpretty.register_uri(httpretty.GET, self.ROUTER_LIST_URL, - body=self.ROUTER_LIST_ONE) - httpretty.register_uri(httpretty.GET, self.ROUTER_SHOW_URL, - body=self.ROUTER_SHOW) - - result = cmd.run(parsed_args) - - self.assertEqual(0, result) - expected = u"""\ -admin_state_up="True" -external_gateway_info="{"network_id": "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8"}" -id="a9254bdb-2613-4a13-ac4c-adc581fba50d" -name="router1" -status="ACTIVE" -tenant_id="33a40233088643acb66ff6eb0ebea679" -""" - self.assertEqual('', self.app.stderr.lines()) - self.assertEqual(expected, self.app.stdout.lines()) diff --git a/openstackclient/tests/network/v2_0/test_router_integration.py b/openstackclient/tests/network/v2_0/test_router_integration.py new file mode 100644 index 0000000000..828f278782 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_router_integration.py @@ -0,0 +1,164 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0 import router +from openstackclient.tests.network.v2_0 import common + + +class TestShowRouterIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + CREATE_URL = HOSTESS + "/routers.json" + CREATE = """ +{ + "router": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/routers/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/routers.json" + LIST_ONE = '{ "routers": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "routers": [ + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + LIST_L3_URL = HOSTESS + "/agents/elthree/l3-routers.json" + LIST_L3 = """ +{ + "routers": [ + { + "status": "ACTIVE", + "external_gateway_info": {}, + "name": "gator", + "admin_state_up": true, + "tenant_id": "3671f46ec35e4bbca6ef92ab7975e463", + "routes": [], + "id": "8eef2388" + } + ] +}""" + SHOW_URL = HOSTESS + "/routers/a9254bdb.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.admin_state = 'ACTIVE' + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(router.CreateRouter, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new router: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(router.DeleteRouter, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted router: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + pargs.l3_agent = None + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(router.ListRouter, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name +a9254bdb,gator +b8408dgd,croc +""", self.stdout()) + + @httpretty.activate + def test_list_l3(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + pargs.l3_agent = 'elthree' + httpretty.register_uri(httpretty.GET, self.LIST_L3_URL, + body=self.LIST_L3) + self.when_run(router.ListRouter, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name,external_gateway_info +8eef2388,gator,{} +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.router_id = '88888823' + pargs.no_gateway = True + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.PUT, self.SHOW_URL, + body=self.SHOW) + self.when_run(router.SetRouter, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Removed gateway from router 88888823\n', + self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(router.ShowRouter, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_security_group_integration.py b/openstackclient/tests/network/v2_0/test_security_group_integration.py new file mode 100644 index 0000000000..f19d9431f0 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_security_group_integration.py @@ -0,0 +1,131 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0 import security_group +from openstackclient.tests.network.v2_0 import common + + +class TestSecurityGroupIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + CREATE_URL = HOSTESS + "/security-groups.json" + CREATE = """ +{ + "security_group": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/security-groups/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/security-groups.json" + LIST_ONE = '{ "security_groups": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "security_groups": [ + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/security-groups/a9254bdb.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.description = 'groupo' + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(security_group.CreateSecurityGroup, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new security_group: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(security_group.DeleteSecurityGroup, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted security_group: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(security_group.ListSecurityGroup, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name +a9254bdb,gator +b8408dgd,croc +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(security_group.SetSecurityGroup, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(security_group.ShowSecurityGroup, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_security_group_rule_integration.py b/openstackclient/tests/network/v2_0/test_security_group_rule_integration.py new file mode 100644 index 0000000000..86f73947ce --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_security_group_rule_integration.py @@ -0,0 +1,137 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0 import security_group_rule +from openstackclient.tests.network.v2_0 import common + + +class TestSecurityGroupRuleIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + SECURITY_GROUP_URL = HOSTESS + "/security-groups.json" + SECURITY_GROUP = '{ "security_groups": [{ "id": "9393939" }] }' + CREATE_URL = HOSTESS + "/security-group-rules.json" + CREATE = """ +{ + "security_group_rule": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/security-group-rules/gator.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/security-group-rules.json" + LIST_ONE = '{ "security_group_rules": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "security_group_rules": [ + { + "id": "a9254bdb", + "security_group_id": "44444444", + "direction": "egress", + "protocol": "TCP", + "remote_ip_prefix": "127.0.0.0/24", + "remote_group_id": "2222222", + "tenant_id": "33a40233" + }, + { + "id": "a9254bdb", + "security_group_id": "55555555", + "direction": "ingress", + "protocol": "UDP", + "remote_ip_prefix": "10.0.0.0/24", + "remote_group_id": "", + "tenant_id": "33a40233" + } + ] +}""" + SHOW_URL = HOSTESS + "/security-group-rules/gator.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.security_group_id = 'sg1' + pargs.direction = 'ingress' + pargs.ethertype = 'IPv4' + pargs.protocol = 'TCP' + pargs.port_range_min = '0' + pargs.port_range_max = '1000' + pargs.remote_ip_prefix = '20.1.2.1/24' + pargs.remote_group_id = None + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.GET, self.SECURITY_GROUP_URL, + body=self.SECURITY_GROUP) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(security_group_rule.CreateSecurityGroupRule, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new security_group_rule: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(security_group_rule.DeleteSecurityGroupRule, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted security_group_rule: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + pargs.no_nameconv = True + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(security_group_rule.ListSecurityGroupRule, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,security_group_id,direction,protocol,remote_ip_prefix,remote_group_id +a9254bdb,44444444,egress,TCP,127.0.0.0/24,2222222 +a9254bdb,55555555,ingress,UDP,10.0.0.0/24, +""", self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(security_group_rule.ShowSecurityGroupRule, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_subnet_integration.py b/openstackclient/tests/network/v2_0/test_subnet_integration.py new file mode 100644 index 0000000000..f17e0b5fa5 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_subnet_integration.py @@ -0,0 +1,141 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0 import subnet +from openstackclient.tests.network.v2_0 import common + + +class TestSubnetIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + NETWORKS_URL = HOSTESS + "/networks.json" + NETWORK_ONE = '{ "networks": [{ "id": "99999999" }]}' + CREATE_URL = HOSTESS + "/subnets.json" + CREATE = """ +{ + "subnet": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/subnets/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/subnets.json" + LIST_ONE = '{ "subnets": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "subnets": [ + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/subnets/a9254bdb.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.network_id = 'netty' + pargs.cidr = '123.4.5.0/24' + pargs.ip_version = '4' + pargs.gateway = 'cisco' + pargs.no_gateway = False + pargs.disable_dhcp = False + pargs.allocation_pools = None + pargs.host_routes = None + pargs.dns_nameservers = None + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.GET, self.NETWORKS_URL, + body=self.NETWORK_ONE) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(subnet.CreateSubnet, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new subnet: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(subnet.DeleteSubnet, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted subnet: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(subnet.ListSubnet, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name +a9254bdb,gator +b8408dgd,croc +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(subnet.SetSubnet, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(subnet.ShowSubnet, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) From b1c7e61e01ce6f241784d823f508c4666511cae8 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Fri, 20 Dec 2013 10:39:50 -0700 Subject: [PATCH 33/66] add missing integration tests --- openstackclient/network/v2_0/network.py | 2 +- .../network/v2_0/test_network_integration.py | 43 ++++++++++++ .../network/v2_0/test_port_integration.py | 46 ++++++++++--- .../network/v2_0/test_router_integration.py | 66 +++++++++++++++---- 4 files changed, 134 insertions(+), 23 deletions(-) diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index e3550af9ec..5f77ec7ba2 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -123,7 +123,7 @@ def get_parser(self, prog_name): class RemoveGatewayNetwork(v2_0.RemoveCommand): """Remove a gateway from a network""" - clazz = nvpnetworkgateway.ConnectNetworkGateway + clazz = nvpnetworkgateway.DisconnectNetworkGateway container_name = "network_id" container_metavar = "" container_help_text = "ID of the internal network" diff --git a/openstackclient/tests/network/v2_0/test_network_integration.py b/openstackclient/tests/network/v2_0/test_network_integration.py index b470bb97d7..64bd7b9764 100644 --- a/openstackclient/tests/network/v2_0/test_network_integration.py +++ b/openstackclient/tests/network/v2_0/test_network_integration.py @@ -23,6 +23,8 @@ class TestNetworkIntegration(common.TestIntegrationBase): HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER SUBNETS_URL = HOSTESS + "/subnets.json" SUBNETS_ONE = '{ "subnets": [{ "id": "12312311" }]}' + GATEWAY_URL = HOSTESS + "/network-gateways.json" + GATEWAY_ONE = '{ "network_gateways": [{ "id": "88888888" }]}' CREATE_URL = HOSTESS + "/networks.json" CREATE = """ { @@ -62,6 +64,11 @@ class TestNetworkIntegration(common.TestIntegrationBase): }""" SHOW_URL = HOSTESS + "/networks/a9254bdb.json" SHOW = CREATE + CONNECT_URL = HOSTESS + "/network-gateways/88888888/connect_network.json" + CONNECT = "{}" + DISCONNECT_URL = HOSTESS + \ + "/network-gateways/88888888/disconnect_network.json" + DISCONNECT = "{}" @httpretty.activate def test_create(self): @@ -155,3 +162,39 @@ def test_show(self): status="ACTIVE" tenant_id="33a40233" """, self.stdout()) + + @httpretty.activate + def test_add_gateway(self): + pargs = common.FakeParsedArgs() + pargs.network_id = 'gator' + pargs.net_gateway_id = 'way' + pargs.segmentation_type = None + pargs.segmentation_id = None + httpretty.register_uri(httpretty.GET, self.GATEWAY_URL, + body=self.GATEWAY_ONE) + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.PUT, self.CONNECT_URL, + body=self.CONNECT) + self.when_run(network.AddGatewayNetwork, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Connected network to gateway 88888888\n', + self.stdout()) + + @httpretty.activate + def test_remove_gateway(self): + pargs = common.FakeParsedArgs() + pargs.network_id = 'gator' + pargs.net_gateway_id = 'way' + pargs.segmentation_type = None + pargs.segmentation_id = None + httpretty.register_uri(httpretty.GET, self.GATEWAY_URL, + body=self.GATEWAY_ONE) + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.PUT, self.DISCONNECT_URL, + body=self.DISCONNECT) + self.when_run(network.RemoveGatewayNetwork, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Disconnected network from gateway 88888888\n', + self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_port_integration.py b/openstackclient/tests/network/v2_0/test_port_integration.py index a3f66516c7..ffaf2007e1 100644 --- a/openstackclient/tests/network/v2_0/test_port_integration.py +++ b/openstackclient/tests/network/v2_0/test_port_integration.py @@ -31,7 +31,7 @@ class TestPortIntegration(common.TestIntegrationBase): "port": { "status": "ACTIVE", - "name": "gator", + "name": "puerto", "tenant_id": "33a40233", "id": "a9254bdb" } @@ -45,7 +45,7 @@ class TestPortIntegration(common.TestIntegrationBase): "ports": [ { "status": "ACTIVE", - "name": "gator", + "name": "puerto", "tenant_id": "33a40233", "id": "a9254bdb" }, @@ -59,11 +59,13 @@ class TestPortIntegration(common.TestIntegrationBase): }""" SHOW_URL = HOSTESS + "/ports/a9254bdb.json" SHOW = CREATE + ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" + ADD_REMOVE = "{}" @httpretty.activate def test_create(self): pargs = common.FakeParsedArgs() - pargs.name = 'gator' + pargs.name = 'puerto' pargs.network_id = '44444448' pargs.admin_state = 'UP' pargs.mac_address = '1231233212' @@ -82,7 +84,7 @@ def test_create(self): self.assertEqual(u"""\ Created a new port: id="a9254bdb" -name="gator" +name="puerto" status="ACTIVE" tenant_id="33a40233" """, self.stdout()) @@ -90,14 +92,14 @@ def test_create(self): @httpretty.activate def test_delete(self): pargs = common.FakeParsedArgs() - pargs.id = 'gator' + pargs.id = 'puerto' httpretty.register_uri(httpretty.GET, self.LIST_URL, body=self.LIST_ONE) httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, body=self.DELETE) self.when_run(port.DeletePort, pargs) self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted port: gator\n', + self.assertEqual(u'Deleted port: puerto\n', self.stdout()) @httpretty.activate @@ -116,14 +118,14 @@ def test_list(self): self.assertEqual('', self.stderr()) self.assertEqual("""\ id,name -a9254bdb,gator +a9254bdb,puerto b8408dgd,croc """, self.stdout()) @httpretty.activate def test_set(self): pargs = common.FakeParsedArgs() - pargs.name = 'gator' + pargs.name = 'puerto' httpretty.register_uri(httpretty.GET, self.LIST_URL, body=self.LIST_ONE) self.when_run(port.SetPort, pargs) @@ -133,7 +135,7 @@ def test_set(self): @httpretty.activate def test_show(self): pargs = common.FakeParsedArgs() - pargs.id = 'gator' + pargs.id = 'puerto' httpretty.register_uri(httpretty.GET, self.LIST_URL, body=self.LIST_ONE) httpretty.register_uri(httpretty.GET, self.SHOW_URL, @@ -142,7 +144,31 @@ def test_show(self): self.assertEqual('', self.stderr()) self.assertEqual(u"""\ id="a9254bdb" -name="gator" +name="puerto" status="ACTIVE" tenant_id="33a40233" """, self.stdout()) + + @httpretty.activate + def test_add(self): + pargs = common.FakeParsedArgs() + pargs.port_id = 'puerto' + pargs.floatingip_id = '127.0.0.1' + pargs.fixed_ip_address = None + httpretty.register_uri(httpretty.PUT, self.ADD_REMOVE_URL, + body=self.ADD_REMOVE) + self.when_run(port.AddPort, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Associated floatingip 127.0.0.1\n', self.stdout()) + + @httpretty.activate + def test_remove(self): + pargs = common.FakeParsedArgs() + pargs.port_id = 'puerto' + pargs.floatingip_id = '127.0.0.1' + httpretty.register_uri(httpretty.PUT, self.ADD_REMOVE_URL, + body=self.ADD_REMOVE) + self.when_run(port.RemovePort, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Disassociated floatingip 127.0.0.1\n', + self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_router_integration.py b/openstackclient/tests/network/v2_0/test_router_integration.py index 828f278782..68e7003212 100644 --- a/openstackclient/tests/network/v2_0/test_router_integration.py +++ b/openstackclient/tests/network/v2_0/test_router_integration.py @@ -21,13 +21,15 @@ class TestShowRouterIntegration(common.TestIntegrationBase): HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + SUBNET_URL = HOSTESS + "/subnets.json" + SUBNET_ONE = '{ "subnets": [{ "id": "45456777" }] }' CREATE_URL = HOSTESS + "/routers.json" CREATE = """ { "router": { "status": "ACTIVE", - "name": "gator", + "name": "rooty", "tenant_id": "33a40233", "id": "a9254bdb" } @@ -41,7 +43,7 @@ class TestShowRouterIntegration(common.TestIntegrationBase): "routers": [ { "status": "ACTIVE", - "name": "gator", + "name": "rooty", "tenant_id": "33a40233", "id": "a9254bdb" }, @@ -60,7 +62,7 @@ class TestShowRouterIntegration(common.TestIntegrationBase): { "status": "ACTIVE", "external_gateway_info": {}, - "name": "gator", + "name": "rooty", "admin_state_up": true, "tenant_id": "3671f46ec35e4bbca6ef92ab7975e463", "routes": [], @@ -70,11 +72,19 @@ class TestShowRouterIntegration(common.TestIntegrationBase): }""" SHOW_URL = HOSTESS + "/routers/a9254bdb.json" SHOW = CREATE + ADD_URL = HOSTESS + "/routers/a9254bdb/add_router_interface.json" + ADD = """ +{ + "subnet_id": "45456777", + "port_id": "93939392" +}""" + REMOVE_URL = HOSTESS + "/routers/a9254bdb/remove_router_interface.json" + REMOVE = "{}" @httpretty.activate def test_create(self): pargs = common.FakeParsedArgs() - pargs.name = 'gator' + pargs.name = 'rooty' pargs.admin_state = 'ACTIVE' pargs.tenant_id = '33a40233' httpretty.register_uri(httpretty.POST, self.CREATE_URL, @@ -84,7 +94,7 @@ def test_create(self): self.assertEqual(u"""\ Created a new router: id="a9254bdb" -name="gator" +name="rooty" status="ACTIVE" tenant_id="33a40233" """, self.stdout()) @@ -92,14 +102,14 @@ def test_create(self): @httpretty.activate def test_delete(self): pargs = common.FakeParsedArgs() - pargs.id = 'gator' + pargs.id = 'rooty' httpretty.register_uri(httpretty.GET, self.LIST_URL, body=self.LIST_ONE) httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, body=self.DELETE) self.when_run(router.DeleteRouter, pargs) self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted router: gator\n', + self.assertEqual(u'Deleted router: rooty\n', self.stdout()) @httpretty.activate @@ -113,7 +123,7 @@ def test_list(self): self.assertEqual('', self.stderr()) self.assertEqual("""\ id,name -a9254bdb,gator +a9254bdb,rooty b8408dgd,croc """, self.stdout()) @@ -128,13 +138,13 @@ def test_list_l3(self): self.assertEqual('', self.stderr()) self.assertEqual("""\ id,name,external_gateway_info -8eef2388,gator,{} +8eef2388,rooty,{} """, self.stdout()) @httpretty.activate def test_set(self): pargs = common.FakeParsedArgs() - pargs.name = 'gator' + pargs.name = 'rooty' pargs.router_id = '88888823' pargs.no_gateway = True httpretty.register_uri(httpretty.GET, self.LIST_URL, @@ -149,7 +159,7 @@ def test_set(self): @httpretty.activate def test_show(self): pargs = common.FakeParsedArgs() - pargs.id = 'gator' + pargs.id = 'rooty' httpretty.register_uri(httpretty.GET, self.LIST_URL, body=self.LIST_ONE) httpretty.register_uri(httpretty.GET, self.SHOW_URL, @@ -158,7 +168,39 @@ def test_show(self): self.assertEqual('', self.stderr()) self.assertEqual(u"""\ id="a9254bdb" -name="gator" +name="rooty" status="ACTIVE" tenant_id="33a40233" """, self.stdout()) + + @httpretty.activate + def test_add(self): + pargs = common.FakeParsedArgs() + pargs.router_id = 'rooty' + pargs.interface = 'subby' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SUBNET_URL, + body=self.SUBNET_ONE) + httpretty.register_uri(httpretty.PUT, self.ADD_URL, + body=self.ADD) + self.when_run(router.AddInterfaceRouter, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Added interface 93939392 to router rooty.\n', + self.stdout()) + + @httpretty.activate + def test_remove(self): + pargs = common.FakeParsedArgs() + pargs.router_id = 'rooty' + pargs.interface = 'subby' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SUBNET_URL, + body=self.SUBNET_ONE) + httpretty.register_uri(httpretty.PUT, self.REMOVE_URL, + body=self.REMOVE) + self.when_run(router.RemoveInterfaceRouter, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Removed interface from router rooty.\n', + self.stdout()) From b0ed12d56ad29b4a043d799901e7eb264f755414 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Fri, 20 Dec 2013 14:10:19 -0700 Subject: [PATCH 34/66] router add/remove subnet and port --- openstackclient/network/v2_0/router.py | 46 ++++++++++++++++--- openstackclient/tests/network/v2_0/common.py | 5 +- .../network/v2_0/test_router_integration.py | 46 +++++++++++++++++-- setup.cfg | 6 ++- 4 files changed, 90 insertions(+), 13 deletions(-) diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index 66136105ab..35aacc8777 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -137,12 +137,6 @@ class AddInterfaceRouter(v2_0.AddCommand): container_name = 'router_id' container_metavar = '' container_help_text = 'ID of router to add an interface to' - name = 'interface' - metavar = '' - help_text = 'The format is "SUBNET|subnet=SUBNET|port=PORT". ' \ - 'Either a subnet or port must be specified. ' \ - 'Both ID and name are accepted as SUBNET or PORT. ' \ - 'Note that "subnet=" can be omitted when specifying subnet.' class RemoveInterfaceRouter(v2_0.RemoveCommand): @@ -158,3 +152,43 @@ class RemoveInterfaceRouter(v2_0.RemoveCommand): 'Either a subnet or port must be specified. ' \ 'Both ID and name are accepted as SUBNET or PORT. ' \ 'Note that "subnet=" can be omitted when specifying subnet.' + + +class AddPortRouter(AddInterfaceRouter): + """Add a port to a router""" + + name = 'port' + metavar = '' + help_text = 'ID or name of port to add' + + def take_action(self, parsed_args): + parsed_args.interface = "port=" + parsed_args.port + return super(AddPortRouter, self).take_action(parsed_args) + + +class RemovePortRouter(RemoveInterfaceRouter): + """Remove a port from a router""" + + name = 'port' + metavar = '' + help_text = 'ID or name of port to add' + + def take_action(self, parsed_args): + parsed_args.interface = "port=" + parsed_args.port + return super(RemovePortRouter, self).take_action(parsed_args) + + +class AddSubnetRouter(AddInterfaceRouter): + """Add a port to a router""" + + name = 'interface' + metavar = '' + help_text = 'ID or name of subnet to add' + + +class RemoveSubnetRouter(RemoveInterfaceRouter): + """Remove a port from a router""" + + name = 'interface' + metavar = '' + help_text = 'ID or name of subnet to add' diff --git a/openstackclient/tests/network/v2_0/common.py b/openstackclient/tests/network/v2_0/common.py index ea8ac47bc7..b0e80f7617 100644 --- a/openstackclient/tests/network/v2_0/common.py +++ b/openstackclient/tests/network/v2_0/common.py @@ -81,7 +81,7 @@ def setUp(self): super(TestIntegrationBase, self).setUp() self.app = FakeShell() - def when_run(self, clazz, pargs): + def when_run(self, clazz, pargs, expected_body=None): try: result = clazz(self.app, pargs).run(pargs) except Exception as e: @@ -97,6 +97,9 @@ def when_run(self, clazz, pargs): print('====================================================') raise e self.assertEqual(0, result) + if expected_body: + lasty = httpretty.last_request() + self.assertEqual(expected_body, lasty.body) def stdout(self): return self.app.stdout.lines() diff --git a/openstackclient/tests/network/v2_0/test_router_integration.py b/openstackclient/tests/network/v2_0/test_router_integration.py index 68e7003212..761d2bd1b7 100644 --- a/openstackclient/tests/network/v2_0/test_router_integration.py +++ b/openstackclient/tests/network/v2_0/test_router_integration.py @@ -23,6 +23,8 @@ class TestShowRouterIntegration(common.TestIntegrationBase): HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER SUBNET_URL = HOSTESS + "/subnets.json" SUBNET_ONE = '{ "subnets": [{ "id": "45456777" }] }' + PORT_URL = HOSTESS + "/ports.json" + PORT_ONE = '{ "ports": [{ "id": "23422222" }] }' CREATE_URL = HOSTESS + "/routers.json" CREATE = """ { @@ -174,7 +176,7 @@ def test_show(self): """, self.stdout()) @httpretty.activate - def test_add(self): + def test_add_subnet(self): pargs = common.FakeParsedArgs() pargs.router_id = 'rooty' pargs.interface = 'subby' @@ -184,13 +186,14 @@ def test_add(self): body=self.SUBNET_ONE) httpretty.register_uri(httpretty.PUT, self.ADD_URL, body=self.ADD) - self.when_run(router.AddInterfaceRouter, pargs) + expected_body = '{"subnet_id": "45456777"}' + self.when_run(router.AddSubnetRouter, pargs, expected_body) self.assertEqual('', self.stderr()) self.assertEqual(u'Added interface 93939392 to router rooty.\n', self.stdout()) @httpretty.activate - def test_remove(self): + def test_remove_subnet(self): pargs = common.FakeParsedArgs() pargs.router_id = 'rooty' pargs.interface = 'subby' @@ -200,7 +203,42 @@ def test_remove(self): body=self.SUBNET_ONE) httpretty.register_uri(httpretty.PUT, self.REMOVE_URL, body=self.REMOVE) - self.when_run(router.RemoveInterfaceRouter, pargs) + expected_body = '{"subnet_id": "45456777"}' + self.when_run(router.RemoveSubnetRouter, pargs, expected_body) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Removed interface from router rooty.\n', + self.stdout()) + + @httpretty.activate + def test_add_port(self): + pargs = common.FakeParsedArgs() + pargs.router_id = 'rooty' + pargs.port = 'puerto' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.PORT_URL, + body=self.PORT_ONE) + httpretty.register_uri(httpretty.PUT, self.ADD_URL, + body=self.ADD) + expected_body = '{"port_id": "23422222"}' + self.when_run(router.AddPortRouter, pargs, expected_body) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Added interface 93939392 to router rooty.\n', + self.stdout()) + + @httpretty.activate + def test_remove_port(self): + pargs = common.FakeParsedArgs() + pargs.router_id = 'rooty' + pargs.port = 'puerto' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.PORT_URL, + body=self.PORT_ONE) + httpretty.register_uri(httpretty.PUT, self.REMOVE_URL, + body=self.REMOVE) + expected_body = '{"port_id": "23422222"}' + self.when_run(router.RemovePortRouter, pargs, expected_body) self.assertEqual('', self.stderr()) self.assertEqual(u'Removed interface from router rooty.\n', self.stdout()) diff --git a/setup.cfg b/setup.cfg index cb3f2341b1..f21852bbdb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -318,8 +318,10 @@ openstack.network.v2_0 = router_list = openstackclient.network.v2_0.router:ListRouter router_set = openstackclient.network.v2_0.router:SetRouter router_show = openstackclient.network.v2_0.router:ShowRouter - router_add_interface = openstackclient.network.v2_0.router:AddInterfaceRouter - router_remove_interface = openstackclient.network.v2_0.router:RemoveInterfaceRouter + router_add_port = openstackclient.network.v2_0.router:AddPortRouter + router_remove_port = openstackclient.network.v2_0.router:RemovePortRouter + router_add_subnet = openstackclient.network.v2_0.router:AddSubnetRouter + router_remove_subnet = openstackclient.network.v2_0.router:RemoveSubnetRouter security_group_create = openstackclient.network.v2_0.security_group:CreateSecurityGroup security_group_delete = openstackclient.network.v2_0.security_group:DeleteSecurityGroup security_group_list = openstackclient.network.v2_0.security_group:ListSecurityGroup From 248556b7bb9eefc6ac5f2241544543f7b2cda088 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 23 Dec 2013 10:07:03 -0700 Subject: [PATCH 35/66] make links clickable --- README.rst | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/README.rst b/README.rst index b0f3b6b7f4..765af20855 100644 --- a/README.rst +++ b/README.rst @@ -7,24 +7,28 @@ It is a thin wrapper to the stock python-*client modules that implement the actual REST API client actions. This is an implementation of the design goals shown in -http://wiki.openstack.org/UnifiedCLI. The primary goal is to provide +`OpenStack Client Wiki`_. The primary goal is to provide a unified shell command structure and a common language to describe -operations in OpenStack. +operations in OpenStack. The master repository is on GitHub_. + +.. _OpenStack Client Wiki: https://wiki.openstack.org/wiki/OpenStackClient +.. _GitHub: https://github.com/openstack/python-openstackclient python-openstackclient is designed to add support for API extensions via a plugin mechanism. -For release management:: - - * https://launchpad.net/python-openstackclient - -For blueprints and feature specifications:: - - * https://blueprints.launchpad.net/python-openstackclient - -For issue tracking:: - - * https://bugs.launchpad.net/python-openstackclient + * `Release management`_ + * `Blueprints and feature specifications`_ + * `Issue tracking`_ + * `Bug tracking`_ + * `PyPi`_ + * `Developer Docs`_ +.. _release management: https://launchpad.net/python-openstackclient +.. _Blueprints and feature specifications: https://blueprints.launchpad.net/python-openstackclient +.. _Issue tracking: https://bugs.launchpad.net/python-openstackclient +.. _Bug tracking: https://bugs.launchpad.net/python-openstackclient/+bugs +.. _PyPi: https://pypi.python.org/pypi/python-openstackclient +.. _Developer Docs: http://docs.openstack.org/developer/python-openstackclient/ Note ==== @@ -37,7 +41,7 @@ Getting Started =============== We recommend using a virtualenv to install the client. This description -uses the `install_venv.py`_ script to create the virtualenv:: +uses the `tools/install_venv.py`_ script to create the virtualenv:: python tools/install_venv.py source .venv/bin/activate From 0d477c9356d673309b41adee6673bbb819bbdc1b Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 23 Dec 2013 10:12:21 -0700 Subject: [PATCH 36/66] make links clickable --- README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 765af20855..ef00aef289 100644 --- a/README.rst +++ b/README.rst @@ -20,13 +20,11 @@ plugin mechanism. * `Release management`_ * `Blueprints and feature specifications`_ * `Issue tracking`_ - * `Bug tracking`_ * `PyPi`_ * `Developer Docs`_ .. _release management: https://launchpad.net/python-openstackclient .. _Blueprints and feature specifications: https://blueprints.launchpad.net/python-openstackclient .. _Issue tracking: https://bugs.launchpad.net/python-openstackclient -.. _Bug tracking: https://bugs.launchpad.net/python-openstackclient/+bugs .. _PyPi: https://pypi.python.org/pypi/python-openstackclient .. _Developer Docs: http://docs.openstack.org/developer/python-openstackclient/ @@ -41,7 +39,9 @@ Getting Started =============== We recommend using a virtualenv to install the client. This description -uses the `tools/install_venv.py`_ script to create the virtualenv:: +uses the `install virtualenv`_ script to create the virtualenv:: + +.. _install virtualenv: tools/install_venv.py python tools/install_venv.py source .venv/bin/activate From 3b14ebcb463950f043a73fe483b1b0d50b59468e Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 23 Dec 2013 10:13:58 -0700 Subject: [PATCH 37/66] make links clickable --- README.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.rst b/README.rst index ef00aef289..600fd33c27 100644 --- a/README.rst +++ b/README.rst @@ -27,6 +27,7 @@ plugin mechanism. .. _Issue tracking: https://bugs.launchpad.net/python-openstackclient .. _PyPi: https://pypi.python.org/pypi/python-openstackclient .. _Developer Docs: http://docs.openstack.org/developer/python-openstackclient/ +.. _install virtualenv: tools/install_venv.py Note ==== @@ -41,8 +42,6 @@ Getting Started We recommend using a virtualenv to install the client. This description uses the `install virtualenv`_ script to create the virtualenv:: -.. _install virtualenv: tools/install_venv.py - python tools/install_venv.py source .venv/bin/activate python setup.py develop From 93834a522c017ee2d78f4a08cf3cf88981e16145 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 23 Dec 2013 10:14:49 -0700 Subject: [PATCH 38/66] make links clickable --- README.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 600fd33c27..00c920ba36 100644 --- a/README.rst +++ b/README.rst @@ -17,11 +17,11 @@ operations in OpenStack. The master repository is on GitHub_. python-openstackclient is designed to add support for API extensions via a plugin mechanism. - * `Release management`_ - * `Blueprints and feature specifications`_ - * `Issue tracking`_ - * `PyPi`_ - * `Developer Docs`_ +* `Release management`_ +* `Blueprints and feature specifications`_ +* `Issue tracking`_ +* `PyPi`_ +* `Developer Docs`_ .. _release management: https://launchpad.net/python-openstackclient .. _Blueprints and feature specifications: https://blueprints.launchpad.net/python-openstackclient .. _Issue tracking: https://bugs.launchpad.net/python-openstackclient From 08f1e2dafe19388805f7e3243764dedccbd3c2ee Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 2 Jan 2014 14:26:51 -0700 Subject: [PATCH 39/66] vip --- openstackclient/network/v2_0/lb/__init__.py | 14 ++ openstackclient/network/v2_0/lb/vip.py | 95 +++++++++++ .../tests/network/v2_0/lb/__init__.py | 14 ++ .../tests/network/v2_0/lb/test_vip.py | 94 +++++++++++ .../network/v2_0/lb/test_vip_integration.py | 149 ++++++++++++++++++ tools/install_venv.py | 1 - 6 files changed, 366 insertions(+), 1 deletion(-) create mode 100644 openstackclient/network/v2_0/lb/__init__.py create mode 100644 openstackclient/network/v2_0/lb/vip.py create mode 100644 openstackclient/tests/network/v2_0/lb/__init__.py create mode 100644 openstackclient/tests/network/v2_0/lb/test_vip.py create mode 100644 openstackclient/tests/network/v2_0/lb/test_vip_integration.py diff --git a/openstackclient/network/v2_0/lb/__init__.py b/openstackclient/network/v2_0/lb/__init__.py new file mode 100644 index 0000000000..85ac2501b8 --- /dev/null +++ b/openstackclient/network/v2_0/lb/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# diff --git a/openstackclient/network/v2_0/lb/vip.py b/openstackclient/network/v2_0/lb/vip.py new file mode 100644 index 0000000000..c1c7672724 --- /dev/null +++ b/openstackclient/network/v2_0/lb/vip.py @@ -0,0 +1,95 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Load Balancer VIP action implementations""" + +from neutronclient.neutron.v2_0.lb import vip as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class CreateVip(v2_0.CreateCommand): + """Create a load balancer VIP""" + + clazz = neu2.CreateVip + + def get_parser(self, prog_name): + parser = super(CreateVip, self).get_parser(prog_name) + parser.add_argument( + 'pool_id', metavar='POOL', + help='Pool id or name this vip belongs to') + parser.add_argument( + 'name', + help='name of the vip') + parser.add_argument( + '--address', + help='IP address of the vip') + parser.add_argument( + '--admin-state-down', + dest='admin_state', action='store_false', + help='set admin state up to false') + parser.add_argument( + '--connection-limit', + help='the maximum number of connections per second allowed for ' + 'the vip. Positive integer or -1 for unlimited (default)') + parser.add_argument( + '--description', + help='description of the vip') + parser.add_argument( + '--protocol-port', + required=True, + help='TCP port on which to listen for client traffic that is ' + 'associated with the vip address') + parser.add_argument( + '--protocol', + required=True, choices=['TCP', 'HTTP', 'HTTPS'], + help='protocol for balancing') + parser.add_argument( + '--subnet-id', metavar='SUBNET', + required=True, + help='the subnet on which to allocate the vip address') + return parser + + +class DeleteVip(v2_0.DeleteCommand): + """Delete a load balancer VIP""" + + clazz = neu2.DeleteVip + name = 'id' + metavar = '' + help_text = 'Name or ID of load balancer VIP to delete' + + +class ListVip(v2_0.ListCommand): + """List load balancer VIP""" + + clazz = neu2.ListVip + + +class SetVip(v2_0.SetCommand): + """Set load balancer VIP values""" + + clazz = neu2.UpdateVip + name = 'id' + metavar = '' + help_text = 'Name or ID of load balancer VIP to update' + + +class ShowVip(v2_0.ShowCommand): + """Show a load balancer VIP""" + + clazz = neu2.ShowVip + name = 'id' + metavar = '' + help_text = 'Name or ID of VIP to show' diff --git a/openstackclient/tests/network/v2_0/lb/__init__.py b/openstackclient/tests/network/v2_0/lb/__init__.py new file mode 100644 index 0000000000..85ac2501b8 --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# diff --git a/openstackclient/tests/network/v2_0/lb/test_vip.py b/openstackclient/tests/network/v2_0/lb/test_vip.py new file mode 100644 index 0000000000..05687fb8c3 --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/test_vip.py @@ -0,0 +1,94 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0.lb import vip +from openstackclient.tests.network.v2_0 import common + + +class TestCreateLbVip(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "--protocol-port 33 --protocol HTTP --subnet-id 33" + \ + " pool1 vip1" + self.given_default_show_options() + parsed = self.given_args(vip.CreateVip, given) + self.assertEqual('vip1', parsed.name) + self.assertEqual('pool1', parsed.pool_id) + self.assertEqual('33', parsed.protocol_port) + self.assertEqual('HTTP', parsed.protocol) + self.assertEqual('33', parsed.subnet_id) + self.assertEqual(None, parsed.address) + self.assertEqual(True, parsed.admin_state) + self.assertEqual(None, parsed.connection_limit) + self.assertEqual(None, parsed.description) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "--protocol-port 44 --protocol TCP --subnet-id 99" + \ + " --address 127.0.0.1 --admin-state-down" + \ + " --connection-limit 5 --description wow" + \ + " pool2 too --project sneed " + allargs += self.given_all_show_options() + parsed = self.given_args(vip.CreateVip, allargs) + self.assertEqual('too', parsed.name) + self.assertEqual('pool2', parsed.pool_id) + self.assertEqual('44', parsed.protocol_port) + self.assertEqual('TCP', parsed.protocol) + self.assertEqual('99', parsed.subnet_id) + self.assertEqual('127.0.0.1', parsed.address) + self.assertEqual(False, parsed.admin_state) + self.assertEqual('5', parsed.connection_limit) + self.assertEqual('wow', parsed.description) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteLbVip(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(vip.DeleteVip, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListLbVip(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(vip.ListVip, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(vip.ListVip, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetLbVip(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(vip.SetVip, "noo") + self.assertEqual('noo', parsed.id) + + +class TestShowLbVip(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(vip.ShowVip, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too" + self.given_all_show_options() + parsed = self.given_args(vip.ShowVip, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_vip_integration.py b/openstackclient/tests/network/v2_0/lb/test_vip_integration.py new file mode 100644 index 0000000000..9e1c655f83 --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/test_vip_integration.py @@ -0,0 +1,149 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0.lb import vip +from openstackclient.tests.network.v2_0 import common + + +class TestVipIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + POOLS_URL = HOSTESS + "/lb/pools.json" + POOLS = '{ "pools": [{ "id": "1111111" }] }' + SUBNETS_URL = HOSTESS + "/subnets.json" + SUBNETS = '{ "subnets": [{ "id": "222222" }] }' + CREATE_URL = HOSTESS + "/lb/vips.json" + CREATE = """ +{ + "vip": + { + "status": "ACTIVE", + "name": "nameo", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/lb/vips/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/lb/vips.json" + LIST_ONE = '{ "vips": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "vips": [ + { + "status": "ACTIVE", + "name": "nameo", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/lb/vips/a9254bdb.json" + SHOW = CREATE + ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" + ADD_REMOVE = "{}" + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'nameo' + pargs.pool_id = 'swimming' + pargs.address = '127.0.0.1' + pargs.admin_state = True + pargs.connection_limit = '10' + pargs.description = None + pargs.protocol_port = '22' + pargs.protocol = 'TCP' + pargs.subnet_id = 'subby' + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.GET, self.POOLS_URL, + body=self.POOLS) + httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, + body=self.SUBNETS) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(vip.CreateVip, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new vip: +id="a9254bdb" +name="nameo" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(vip.DeleteVip, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted vip: nameo\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.page_size = None + pargs.sort_key = [] + pargs.sort_dir = [] + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(vip.ListVip, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name,status +a9254bdb,nameo,ACTIVE +b8408dgd,croc,ACTIVE +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(vip.SetVip, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(vip.ShowVip, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="nameo" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) diff --git a/tools/install_venv.py b/tools/install_venv.py index a5891d6710..770ae73c5e 100644 --- a/tools/install_venv.py +++ b/tools/install_venv.py @@ -59,7 +59,6 @@ def main(argv): install.check_dependencies() install.create_virtualenv(no_site_packages=options.no_site_packages) install.install_dependencies() - install.post_process() print_help() From 4ffe6a7e140e59a40ad9a6f0eb8fed8c3c0cb262 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 2 Jan 2014 17:16:17 -0700 Subject: [PATCH 40/66] dhcp list for networks --- openstackclient/network/v2_0/network.py | 9 +++++++- .../network/v2_0/test_network_integration.py | 21 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 5f77ec7ba2..9cea068ae5 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -15,6 +15,7 @@ """Network action implementations""" +from neutronclient.neutron.v2_0 import agentscheduler as agent from neutronclient.neutron.v2_0 import network as neu2 from neutronclient.neutron.v2_0 import nvpnetworkgateway from openstackclient.network import v2_0 as v2_0 @@ -61,6 +62,9 @@ def get_parser(self, prog_name): default=False, help='List external networks', ) + parser.add_argument( + '--dhcp_agent', + help='ID of the DHCP agent') return parser def take_action(self, parsed_args): @@ -68,7 +72,10 @@ def take_action(self, parsed_args): if parsed_args.external: neuter = neu2.ListExternalNetwork(self.app, self.app_args) else: - neuter = neu2.ListNetwork(self.app, self.app_args) + if parsed_args.dhcp_agent: + neuter = agent.ListNetworksOnDhcpAgent(self.app, self.app_args) + else: + neuter = neu2.ListNetwork(self.app, self.app_args) neuter.get_client = self.get_client parsed_args.request_format = 'json' parsed_args.fields = [] diff --git a/openstackclient/tests/network/v2_0/test_network_integration.py b/openstackclient/tests/network/v2_0/test_network_integration.py index 64bd7b9764..477d11bf95 100644 --- a/openstackclient/tests/network/v2_0/test_network_integration.py +++ b/openstackclient/tests/network/v2_0/test_network_integration.py @@ -25,6 +25,7 @@ class TestNetworkIntegration(common.TestIntegrationBase): SUBNETS_ONE = '{ "subnets": [{ "id": "12312311" }]}' GATEWAY_URL = HOSTESS + "/network-gateways.json" GATEWAY_ONE = '{ "network_gateways": [{ "id": "88888888" }]}' + DHCP_URL = HOSTESS + "/agents/orange/dhcp-networks.json" CREATE_URL = HOSTESS + "/networks.json" CREATE = """ { @@ -107,6 +108,7 @@ def test_list(self): pargs = common.FakeParsedArgs() pargs.formatter = 'csv' pargs.external = False + pargs.dhcp_agent = None httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, body=self.SUBNETS_ONE) httpretty.register_uri(httpretty.GET, self.LIST_URL, @@ -124,6 +126,7 @@ def test_list_external(self): pargs = common.FakeParsedArgs() pargs.formatter = 'csv' pargs.external = True + pargs.dhcp_agent = None httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, body=self.SUBNETS_ONE) httpretty.register_uri(httpretty.GET, self.LIST_URL, @@ -134,6 +137,24 @@ def test_list_external(self): id,name a9254bdb,gator b8408dgd,croc +""", self.stdout()) + + @httpretty.activate + def test_list_dhcp_agent(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + pargs.external = False + pargs.dhcp_agent = 'orange' + httpretty.register_uri(httpretty.GET, self.DHCP_URL, + body=self.LIST) + httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, + body=self.SUBNETS_ONE) + self.when_run(network.ListNetwork, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name +a9254bdb,gator +b8408dgd,croc """, self.stdout()) @httpretty.activate From b2e338055adceb50301b47b49e769128cdfab6db Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 2 Jan 2014 18:58:34 -0700 Subject: [PATCH 41/66] aligh dhcp with the docs --- openstackclient/network/v2_0/network.py | 3 ++- openstackclient/tests/network/v2_0/test_network.py | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 9cea068ae5..ed1b65f5c4 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -63,7 +63,8 @@ def get_parser(self, prog_name): help='List external networks', ) parser.add_argument( - '--dhcp_agent', + '--dhcp', + dest='dhcp_agent', help='ID of the DHCP agent') return parser diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index 8638f73dd6..f728c6138d 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -50,13 +50,16 @@ def test_get_parser_nothing(self): parsed = self.given_args(network.ListNetwork, given) self.assertEqual(False, parsed.show_details) self.assertEqual(False, parsed.external) + self.assertEqual(None, parsed.dhcp_agent) self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long --external" + self.given_all_list_options() + allargs = "--long --external --dhcp dee" + \ + self.given_all_list_options() parsed = self.given_args(network.ListNetwork, allargs) self.assertEqual(True, parsed.show_details) self.assertEqual(True, parsed.external) + self.assertEqual('dee', parsed.dhcp_agent) self.then_all_list_options(parsed) From 513c5352fd11d7ca80bb6aaff69f0359f74a6fe7 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Fri, 3 Jan 2014 13:23:04 -0700 Subject: [PATCH 42/66] dxcli-1121 lb pools --- openstackclient/network/v2_0/lb/pool.py | 90 +++++++++++ .../tests/network/v2_0/lb/test_pool.py | 89 +++++++++++ .../network/v2_0/lb/test_pool_integration.py | 147 ++++++++++++++++++ 3 files changed, 326 insertions(+) create mode 100644 openstackclient/network/v2_0/lb/pool.py create mode 100644 openstackclient/tests/network/v2_0/lb/test_pool.py create mode 100644 openstackclient/tests/network/v2_0/lb/test_pool_integration.py diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py new file mode 100644 index 0000000000..6d6e9f2e2f --- /dev/null +++ b/openstackclient/network/v2_0/lb/pool.py @@ -0,0 +1,90 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Load Balancer pool action implementations""" + +from neutronclient.neutron.v2_0.lb import pool as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class CreatePool(v2_0.CreateCommand): + """Create a load balancer pool""" + + clazz = neu2.CreatePool + + def get_parser(self, prog_name): + parser = super(CreatePool, self).get_parser(prog_name) + parser.add_argument( + 'name', + help='The name of the pool') + parser.add_argument( + '--admin-state-down', + dest='admin_state', action='store_false', + help='Set admin state up to false') + parser.add_argument( + '--description', + help='Description of the pool') + parser.add_argument( + '--lb-method', + required=True, + choices=['ROUND_ROBIN', 'LEAST_CONNECTIONS', 'SOURCE_IP'], + help='The algorithm used to distribute load between the members ' + 'of the pool') + parser.add_argument( + '--protocol', + required=True, + choices=['HTTP', 'HTTPS', 'TCP'], + help='Protocol for balancing') + parser.add_argument( + '--subnet-id', metavar='SUBNET', + required=True, + help='The subnet on which the members of the pool will be located') + parser.add_argument( + '--provider', + help='Provider name of loadbalancer service') + return parser + + +class DeletePool(v2_0.DeleteCommand): + """Delete a load balancer pool""" + + clazz = neu2.DeletePool + name = 'pool' + metavar = '' + help_text = 'Name or ID of load balancer pool to delete' + + +class ListPool(v2_0.ListCommand): + """List load balancer pool""" + + clazz = neu2.ListPool + + +class SetPool(v2_0.SetCommand): + """Set load balancer pool values""" + + clazz = neu2.UpdatePool + name = 'pool' + metavar = '' + help_text = 'Name or ID of load balancer pool to update' + + +class ShowPool(v2_0.ShowCommand): + """Show a load balancer pool""" + + clazz = neu2.ShowPool + name = 'pool' + metavar = '' + help_text = 'Name or ID of pool to show' diff --git a/openstackclient/tests/network/v2_0/lb/test_pool.py b/openstackclient/tests/network/v2_0/lb/test_pool.py new file mode 100644 index 0000000000..91832fa9cf --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/test_pool.py @@ -0,0 +1,89 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0.lb import pool +from openstackclient.tests.network.v2_0 import common + + +class TestCreateLbPool(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "--lb-method ROUND_ROBIN --protocol HTTP --subnet-id 34" + \ + " pool1" + self.given_default_show_options() + parsed = self.given_args(pool.CreatePool, given) + self.assertEqual('pool1', parsed.name) + self.assertEqual('ROUND_ROBIN', parsed.lb_method) + self.assertEqual('HTTP', parsed.protocol) + self.assertEqual('34', parsed.subnet_id) + self.assertEqual(True, parsed.admin_state) + self.assertEqual(None, parsed.description) + self.assertEqual(None, parsed.provider) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "--lb-method SOURCE_IP --protocol HTTPS --subnet-id 123" + \ + " --admin-state-down --description foo --provider ride" + \ + " pool2 --project sneed " + allargs += self.given_all_show_options() + parsed = self.given_args(pool.CreatePool, allargs) + self.assertEqual('pool2', parsed.name) + self.assertEqual('SOURCE_IP', parsed.lb_method) + self.assertEqual('HTTPS', parsed.protocol) + self.assertEqual('123', parsed.subnet_id) + self.assertEqual(False, parsed.admin_state) + self.assertEqual('foo', parsed.description) + self.assertEqual('ride', parsed.provider) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteLbPool(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(pool.DeletePool, "noo") + self.assertEqual('noo', parsed.pool) + + +class TestListLbPool(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(pool.ListPool, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(pool.ListPool, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetLbPool(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(pool.SetPool, "noo") + self.assertEqual('noo', parsed.pool) + + +class TestShowLbPool(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(pool.ShowPool, given) + self.assertEqual('noo', parsed.pool) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too" + self.given_all_show_options() + parsed = self.given_args(pool.ShowPool, allargs) + self.assertEqual('too', parsed.pool) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_pool_integration.py b/openstackclient/tests/network/v2_0/lb/test_pool_integration.py new file mode 100644 index 0000000000..ebb505f2bb --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/test_pool_integration.py @@ -0,0 +1,147 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0.lb import pool +from openstackclient.tests.network.v2_0 import common + + +class TestPoolIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + POOLS_URL = HOSTESS + "/lb/pools.json" + POOLS = '{ "pools": [{ "id": "1111111" }] }' + SUBNETS_URL = HOSTESS + "/subnets.json" + SUBNETS = '{ "subnets": [{ "id": "222222" }] }' + CREATE_URL = HOSTESS + "/lb/pools.json" + CREATE = """ +{ + "pool": + { + "status": "ACTIVE", + "name": "nameo", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/lb/pools/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/lb/pools.json" + LIST_ONE = '{ "pools": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "pools": [ + { + "status": "ACTIVE", + "name": "nameo", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/lb/pools/a9254bdb.json" + SHOW = CREATE + ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" + ADD_REMOVE = "{}" + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'nameo' + pargs.admin_state = True + pargs.description = None + pargs.lb_method = 'LEAST_CONNECTIONS' + pargs.protocol = 'TCP' + pargs.subnet_id = 'subby' + pargs.provider = 'ryder' + pargs.tenant_id = '33a40233' + #httpretty.register_uri(httpretty.GET, self.POOLS_URL, + # body=self.POOLS) + httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, + body=self.SUBNETS) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(pool.CreatePool, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new pool: +id="a9254bdb" +name="nameo" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(pool.DeletePool, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted pool: nameo\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.page_size = None + pargs.sort_key = [] + pargs.sort_dir = [] + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(pool.ListPool, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name,status +a9254bdb,nameo,ACTIVE +b8408dgd,croc,ACTIVE +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(pool.SetPool, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(pool.ShowPool, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="nameo" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) From 0de40eaf9f89a3742ad60315c491ed9d04ea975b Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Fri, 3 Jan 2014 15:54:10 -0700 Subject: [PATCH 43/66] dxcli-1121 lb member --- openstackclient/network/v2_0/lb/member.py | 81 ++++++++++ .../tests/network/v2_0/lb/test_member.py | 85 +++++++++++ .../v2_0/lb/test_member_integration.py | 141 ++++++++++++++++++ 3 files changed, 307 insertions(+) create mode 100644 openstackclient/network/v2_0/lb/member.py create mode 100644 openstackclient/tests/network/v2_0/lb/test_member.py create mode 100644 openstackclient/tests/network/v2_0/lb/test_member_integration.py diff --git a/openstackclient/network/v2_0/lb/member.py b/openstackclient/network/v2_0/lb/member.py new file mode 100644 index 0000000000..35fba5f2e6 --- /dev/null +++ b/openstackclient/network/v2_0/lb/member.py @@ -0,0 +1,81 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Load Balancer member action implementations""" + +from neutronclient.neutron.v2_0.lb import member as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class CreateMember(v2_0.CreateCommand): + """Create a load balancer member""" + + clazz = neu2.CreateMember + + def get_parser(self, prog_name): + parser = super(CreateMember, self).get_parser(prog_name) + parser.add_argument( + 'pool_id', metavar='pool', + help='Pool id or name this vip belongs to') + parser.add_argument( + '--admin-state-down', + dest='admin_state', action='store_false', + help='Set admin state up to false') + parser.add_argument( + '--weight', + help='Weight of pool member in the pool (default:1, [0..256])') + parser.add_argument( + '--address', + required=True, + help='IP address of the pool member on the pool network. ') + parser.add_argument( + '--protocol-port', + required=True, + help='Port on which the pool member listens for requests or ' + 'connections. ') + return parser + + +class DeleteMember(v2_0.DeleteCommand): + """Delete a load balancer member""" + + clazz = neu2.DeleteMember + name = 'id' + metavar = '' + help_text = 'Name or ID of load balancer member to delete' + + +class ListMember(v2_0.ListCommand): + """List load balancer member""" + + clazz = neu2.ListMember + + +class SetMember(v2_0.SetCommand): + """Set load balancer member values""" + + clazz = neu2.UpdateMember + name = 'id' + metavar = '' + help_text = 'Name or ID of load balancer member to update' + + +class ShowMember(v2_0.ShowCommand): + """Show a load balancer member""" + + clazz = neu2.ShowMember + name = 'id' + metavar = '' + help_text = 'Name or ID of member to show' diff --git a/openstackclient/tests/network/v2_0/lb/test_member.py b/openstackclient/tests/network/v2_0/lb/test_member.py new file mode 100644 index 0000000000..68c59d33dd --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/test_member.py @@ -0,0 +1,85 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0.lb import member +from openstackclient.tests.network.v2_0 import common + + +class TestCreateLbMember(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "--address 1.1.1.1 --protocol-port 33 pool1" + \ + self.given_default_show_options() + parsed = self.given_args(member.CreateMember, given) + self.assertEqual('pool1', parsed.pool_id) + self.assertEqual(True, parsed.admin_state) + self.assertEqual(None, parsed.weight) + self.assertEqual('1.1.1.1', parsed.address) + self.assertEqual('33', parsed.protocol_port) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "--address 1.1.1.2 --protocol-port 34" + \ + " --admin-state-down --weight 99" + \ + " pool2 --project sneed " + allargs += self.given_all_show_options() + parsed = self.given_args(member.CreateMember, allargs) + self.assertEqual('pool2', parsed.pool_id) + self.assertEqual(False, parsed.admin_state) + self.assertEqual('99', parsed.weight) + self.assertEqual('1.1.1.2', parsed.address) + self.assertEqual('34', parsed.protocol_port) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteLbMember(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(member.DeleteMember, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListLbMember(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(member.ListMember, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(member.ListMember, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetLbMember(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(member.SetMember, "noo") + self.assertEqual('noo', parsed.id) + + +class TestShowLbMember(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(member.ShowMember, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too" + self.given_all_show_options() + parsed = self.given_args(member.ShowMember, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_member_integration.py b/openstackclient/tests/network/v2_0/lb/test_member_integration.py new file mode 100644 index 0000000000..cf75192f40 --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/test_member_integration.py @@ -0,0 +1,141 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0.lb import member +from openstackclient.tests.network.v2_0 import common + + +class TestMemberIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + POOLS_URL = HOSTESS + "/lb/pools.json" + POOLS = '{ "pools": [{ "id": "1111111" }] }' + CREATE_URL = HOSTESS + "/lb/members.json" + CREATE = """ +{ + "member": + { + "status": "ACTIVE", + "name": "nameo", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/lb/members/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/lb/members.json" + LIST_ONE = '{ "members": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "members": [ + { + "status": "ACTIVE", + "name": "nameo", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/lb/members/a9254bdb.json" + SHOW = CREATE + ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" + ADD_REMOVE = "{}" + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.pool_id = 'swimming' + pargs.admin_state = True + pargs.weight = '10' + pargs.address = '127.0.0.1' + pargs.protocol_port = '22' + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.GET, self.POOLS_URL, + body=self.POOLS) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(member.CreateMember, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new member: +id="a9254bdb" +name="nameo" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(member.DeleteMember, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted member: nameo\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.page_size = None + pargs.sort_key = [] + pargs.sort_dir = [] + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(member.ListMember, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,status +a9254bdb,ACTIVE +b8408dgd,ACTIVE +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(member.SetMember, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(member.ShowMember, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="nameo" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) From cb331eda00405f1bab7af44967994b09686509db Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 6 Jan 2014 09:31:01 -0700 Subject: [PATCH 44/66] dxcli-1121 health monitor --- .../network/v2_0/lb/healthmonitor.py | 102 ++++++++++++ .../network/v2_0/lb/test_healthmonitor.py | 92 +++++++++++ .../v2_0/lb/test_healthmonitor_integration.py | 148 ++++++++++++++++++ 3 files changed, 342 insertions(+) create mode 100644 openstackclient/network/v2_0/lb/healthmonitor.py create mode 100644 openstackclient/tests/network/v2_0/lb/test_healthmonitor.py create mode 100644 openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py diff --git a/openstackclient/network/v2_0/lb/healthmonitor.py b/openstackclient/network/v2_0/lb/healthmonitor.py new file mode 100644 index 0000000000..2405ab4aae --- /dev/null +++ b/openstackclient/network/v2_0/lb/healthmonitor.py @@ -0,0 +1,102 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Load Balancer health monitor action implementations""" + +from neutronclient.neutron.v2_0.lb import healthmonitor as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class CreateHealthMonitor(v2_0.CreateCommand): + """Create a load balancer health monitor""" + + clazz = neu2.CreateHealthMonitor + + def get_parser(self, prog_name): + parser = super(CreateHealthMonitor, self).get_parser(prog_name) + parser.add_argument( + '--admin-state-down', + dest='admin_state', action='store_false', + help='Set admin state up to false') + parser.add_argument( + '--expected-codes', + help='The list of HTTP status codes expected in ' + 'response from the member to declare it healthy. This ' + 'attribute can contain one value, ' + 'or a list of values separated by comma, ' + 'or a range of values (e.g. "200-299"). If this attribute ' + 'is not specified, it defaults to "200". ') + parser.add_argument( + '--http-method', + help='The HTTP method used for requests by the monitor of type ' + 'HTTP.') + parser.add_argument( + '--url-path', + help='The HTTP path used in the HTTP request used by the monitor' + ' to test a member health. This must be a string ' + 'beginning with a / (forward slash)') + parser.add_argument( + '--delay', + required=True, + help='The time in seconds between sending probes to members.') + parser.add_argument( + '--max-retries', + required=True, + help='Number of permissible connection failures before changing ' + 'the member status to INACTIVE. [1..10]') + parser.add_argument( + '--timeout', + required=True, + help='Maximum number of seconds for a monitor to wait for a ' + 'connection to be established before it times out. The ' + 'value must be less than the delay value.') + parser.add_argument( + '--type', + required=True, choices=['PING', 'TCP', 'HTTP', 'HTTPS'], + help='One of predefined health monitor types') + return parser + + +class DeleteHealthMonitor(v2_0.DeleteCommand): + """Delete a load balancer health monitor""" + + clazz = neu2.DeleteHealthMonitor + name = 'id' + metavar = '' + help_text = 'Name or ID of load balancer health monitor to delete' + + +class ListHealthMonitor(v2_0.ListCommand): + """List load balancer health monitor""" + + clazz = neu2.ListHealthMonitor + + +class SetHealthMonitor(v2_0.SetCommand): + """Set load balancer health monitor values""" + + clazz = neu2.UpdateHealthMonitor + name = 'id' + metavar = '' + help_text = 'Name or ID of load balancer health monitor to update' + + +class ShowHealthMonitor(v2_0.ShowCommand): + """Show a load balancer health monitor""" + + clazz = neu2.ShowHealthMonitor + name = 'id' + metavar = '' + help_text = 'Name or ID of health monitor to show' diff --git a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py new file mode 100644 index 0000000000..b7c7a96c57 --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py @@ -0,0 +1,92 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0.lb import healthmonitor +from openstackclient.tests.network.v2_0 import common + + +class TestCreateLbHealthMonitor(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "--delay 1 --max-retries 2 --timeout 3 --type TCP" + \ + self.given_default_show_options() + parsed = self.given_args(healthmonitor.CreateHealthMonitor, given) + self.assertEqual(True, parsed.admin_state) + self.assertEqual(None, parsed.expected_codes) + self.assertEqual(None, parsed.http_method) + self.assertEqual(None, parsed.url_path) + self.assertEqual('1', parsed.delay) + self.assertEqual('2', parsed.max_retries) + self.assertEqual('3', parsed.timeout) + self.assertEqual('TCP', parsed.type) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "--delay 4 --max-retries 5 --timeout 6 --type HTTP" + \ + " --admin-state-down --expected-codes 200" + \ + " --http-method GET --url-path http://127.0.0.1" + \ + " --project sneed " + allargs += self.given_all_show_options() + parsed = self.given_args(healthmonitor.CreateHealthMonitor, allargs) + self.assertEqual(False, parsed.admin_state) + self.assertEqual('200', parsed.expected_codes) + self.assertEqual('GET', parsed.http_method) + self.assertEqual('http://127.0.0.1', parsed.url_path) + self.assertEqual('4', parsed.delay) + self.assertEqual('5', parsed.max_retries) + self.assertEqual('6', parsed.timeout) + self.assertEqual('HTTP', parsed.type) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteLbHealthMonitor(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(healthmonitor.DeleteHealthMonitor, "noo") + self.assertEqual('noo', parsed.id) + + +class TestListLbHealthMonitor(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(healthmonitor.ListHealthMonitor, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + allargs = "--long" + self.given_all_list_options() + parsed = self.given_args(healthmonitor.ListHealthMonitor, allargs) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetLbHealthMonitor(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(healthmonitor.SetHealthMonitor, "noo") + self.assertEqual('noo', parsed.id) + + +class TestShowLbHealthMonitor(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(healthmonitor.ShowHealthMonitor, given) + self.assertEqual('noo', parsed.id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + allargs = "too" + self.given_all_show_options() + parsed = self.given_args(healthmonitor.ShowHealthMonitor, allargs) + self.assertEqual('too', parsed.id) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py b/openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py new file mode 100644 index 0000000000..fdf721d8d4 --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py @@ -0,0 +1,148 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0.lb import healthmonitor +from openstackclient.tests.network.v2_0 import common + + +class TestHealthMonitorIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + POOLS_URL = HOSTESS + "/lb/pools.json" + POOLS = '{ "pools": [{ "id": "1111111" }] }' + SUBNETS_URL = HOSTESS + "/subnets.json" + SUBNETS = '{ "subnets": [{ "id": "222222" }] }' + CREATE_URL = HOSTESS + "/lb/health_monitors.json" + CREATE = """ +{ + "health_monitor": + { + "status": "ACTIVE", + "name": "nameo", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/lb/health_monitors/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/lb/health_monitors.json" + LIST_ONE = '{ "health_monitors": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "health_monitors": [ + { + "admin_state_up": "True", + "type": "PING", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "admin_state_up": "False", + "type": "HTTP", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/lb/health_monitors/a9254bdb.json" + SHOW = CREATE + ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" + ADD_REMOVE = "{}" + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.admin_state = True + pargs.expected_codes = None + pargs.http_method = None + pargs.url_path = None + pargs.delay = '30' + pargs.max_retries = '10' + pargs.timeout = '80' + pargs.type = 'PING' + pargs.tenant_id = '33a40233' + #httpretty.register_uri(httpretty.GET, self.POOLS_URL, + # body=self.POOLS) + #httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, + # body=self.SUBNETS) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(healthmonitor.CreateHealthMonitor, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new health_monitor: +id="a9254bdb" +name="nameo" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(healthmonitor.DeleteHealthMonitor, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted health_monitor: nameo\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.page_size = None + pargs.sort_key = [] + pargs.sort_dir = [] + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(healthmonitor.ListHealthMonitor, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,type,admin_state_up +a9254bdb,PING,True +b8408dgd,HTTP,False +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.id = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(healthmonitor.SetHealthMonitor, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'nameo' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(healthmonitor.ShowHealthMonitor, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="nameo" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) From b620c4096f635c8e1f4fbb0fd15d2fa0865f0f41 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 6 Jan 2014 12:35:17 -0700 Subject: [PATCH 45/66] dxcli-1121 pools on lb agent --- openstackclient/network/v2_0/lb/pool.py | 24 ++++++++++++++++++- .../tests/network/v2_0/lb/test_pool.py | 4 +++- .../network/v2_0/lb/test_pool_integration.py | 20 ++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py index 6d6e9f2e2f..91c273c0ad 100644 --- a/openstackclient/network/v2_0/lb/pool.py +++ b/openstackclient/network/v2_0/lb/pool.py @@ -15,6 +15,7 @@ """Load Balancer pool action implementations""" +from neutronclient.neutron.v2_0 import agentscheduler from neutronclient.neutron.v2_0.lb import pool as neu2 from openstackclient.network import v2_0 as v2_0 @@ -69,7 +70,28 @@ class DeletePool(v2_0.DeleteCommand): class ListPool(v2_0.ListCommand): """List load balancer pool""" - clazz = neu2.ListPool + def get_parser(self, prog_name): + parser = super(ListPool, self).get_parser(prog_name) + parser.add_argument( + '--lbaas-agent', + help='ID of the LBaaS agent to query', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + parsed_args.request_format = 'json' + parsed_args.fields = [] + parsed_args.page_size = None + parsed_args.sort_key = [] + parsed_args.sort_dir = [] + if parsed_args.lbaas_agent: + neuter = agentscheduler.ListPoolsOnLbaasAgent(self.app, + self.app_args) + else: + neuter = neu2.ListPool(self.app, self.app_args) + neuter.get_client = self.get_client + return neuter.take_action(parsed_args) class SetPool(v2_0.SetCommand): diff --git a/openstackclient/tests/network/v2_0/lb/test_pool.py b/openstackclient/tests/network/v2_0/lb/test_pool.py index 91832fa9cf..d163ce8a1d 100644 --- a/openstackclient/tests/network/v2_0/lb/test_pool.py +++ b/openstackclient/tests/network/v2_0/lb/test_pool.py @@ -59,12 +59,14 @@ class TestListLbPool(common.TestNetworkBase): def test_get_parser_nothing(self): given = "" + self.given_default_list_options() parsed = self.given_args(pool.ListPool, given) + self.assertEqual(None, parsed.lbaas_agent) self.assertEqual(False, parsed.show_details) self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() + allargs = "--long --lbaas-agent gent" + self.given_all_list_options() parsed = self.given_args(pool.ListPool, allargs) + self.assertEqual('gent', parsed.lbaas_agent) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_pool_integration.py b/openstackclient/tests/network/v2_0/lb/test_pool_integration.py index ebb505f2bb..ba735a4793 100644 --- a/openstackclient/tests/network/v2_0/lb/test_pool_integration.py +++ b/openstackclient/tests/network/v2_0/lb/test_pool_integration.py @@ -21,6 +21,7 @@ class TestPoolIntegration(common.TestIntegrationBase): HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + AGENTS_URL = HOSTESS + "/agents/foo/loadbalancer-pools.json" POOLS_URL = HOSTESS + "/lb/pools.json" POOLS = '{ "pools": [{ "id": "1111111" }] }' SUBNETS_URL = HOSTESS + "/subnets.json" @@ -105,6 +106,7 @@ def test_delete(self): @httpretty.activate def test_list(self): pargs = common.FakeParsedArgs() + pargs.lbaas_agent = None pargs.page_size = None pargs.sort_key = [] pargs.sort_dir = [] @@ -117,6 +119,24 @@ def test_list(self): id,name,status a9254bdb,nameo,ACTIVE b8408dgd,croc,ACTIVE +""", self.stdout()) + + @httpretty.activate + def test_list_lbaas_agent(self): + pargs = common.FakeParsedArgs() + pargs.lbaas_agent = 'foo' + pargs.page_size = None + pargs.sort_key = [] + pargs.sort_dir = [] + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.AGENTS_URL, + body=self.LIST) + self.when_run(pool.ListPool, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name,status +a9254bdb,nameo,ACTIVE +b8408dgd,croc,ACTIVE """, self.stdout()) @httpretty.activate From 94456fd3a51aa90e5bd3eaf0187ce8f765b561c0 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 6 Jan 2014 14:29:34 -0700 Subject: [PATCH 46/66] dxcli-1121 agent and states reports --- openstackclient/network/v2_0/lb/pool.py | 30 +++++++- .../tests/network/v2_0/lb/test_pool.py | 6 +- .../network/v2_0/lb/test_pool_integration.py | 69 ++++++++++++++++++- 3 files changed, 102 insertions(+), 3 deletions(-) diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py index 91c273c0ad..c8efb2800a 100644 --- a/openstackclient/network/v2_0/lb/pool.py +++ b/openstackclient/network/v2_0/lb/pool.py @@ -106,7 +106,35 @@ class SetPool(v2_0.SetCommand): class ShowPool(v2_0.ShowCommand): """Show a load balancer pool""" - clazz = neu2.ShowPool name = 'pool' metavar = '' help_text = 'Name or ID of pool to show' + + def get_parser(self, prog_name): + parser = super(ShowPool, self).get_parser(prog_name) + parser.add_argument( + '--agent', + action='store_true', + default=False, help='Show agents associated with this pool') + parser.add_argument( + '--stats', + action='store_true', + default=False, help='Show stats associated with this pool') + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + parsed_args.id = parsed_args.pool + parsed_args.show_details = True + parsed_args.request_format = 'json' + parsed_args.fields = [] + if parsed_args.agent: + neuter = agentscheduler.GetLbaasAgentHostingPool(self.app, + self.app_args) + else: + if parsed_args.stats: + neuter = neu2.RetrievePoolStats(self.app, self.app_args) + else: + neuter = neu2.ShowPool(self.app, self.app_args) + neuter.get_client = self.get_client + return neuter.take_action(parsed_args) diff --git a/openstackclient/tests/network/v2_0/lb/test_pool.py b/openstackclient/tests/network/v2_0/lb/test_pool.py index d163ce8a1d..90cc2e9419 100644 --- a/openstackclient/tests/network/v2_0/lb/test_pool.py +++ b/openstackclient/tests/network/v2_0/lb/test_pool.py @@ -82,10 +82,14 @@ def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(pool.ShowPool, given) self.assertEqual('noo', parsed.pool) + self.assertEqual(False, parsed.agent) + self.assertEqual(False, parsed.stats) self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too" + self.given_all_show_options() + allargs = "too --agent --stats" + self.given_all_show_options() parsed = self.given_args(pool.ShowPool, allargs) self.assertEqual('too', parsed.pool) + self.assertEqual(True, parsed.agent) + self.assertEqual(True, parsed.stats) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_pool_integration.py b/openstackclient/tests/network/v2_0/lb/test_pool_integration.py index ba735a4793..59274ca83c 100644 --- a/openstackclient/tests/network/v2_0/lb/test_pool_integration.py +++ b/openstackclient/tests/network/v2_0/lb/test_pool_integration.py @@ -59,7 +59,39 @@ class TestPoolIntegration(common.TestIntegrationBase): ] }""" SHOW_URL = HOSTESS + "/lb/pools/a9254bdb.json" + SHOW_AGENT_URL = HOSTESS + "/lb/pools/a9254bdb/loadbalancer-agent.json" + SHOW_AGENT = """ +{ + "agent": { + "admin_state_up": true, + "agent_type": "Loadbalancer agent", + "alive": true, + "binary": "neutron-loadbalancer-agent", + "configurations": { + "device_driver": "neutron.services.HaproxyNSDriver", + "devices": 0, + "interface_driver": "neutron.agent.OVSInterfaceDriver" + }, + "created_at": "2013-10-01 12:50:13", + "description": null, + "heartbeat_timestamp": "2013-10-01 12:56:29", + "host": "ostack02", + "id": "6ee1df7f-bae4-4ee9-910a-d33b000773b0", + "started_at": "2013-10-01 12:50:13", + "topic": "lbaas_process_on_host_agent" + } +}""" SHOW = CREATE + STATS_URL = HOSTESS + "/lb/pools/nameo/stats.json" + STATS = """ +{ + "stats" : { + "bytes_in" : 36839202, + "bytes_out" : 673193022, + "active_connections" : 39, + "total_connections" : 682 + } +}""" ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" ADD_REMOVE = "{}" @@ -152,7 +184,9 @@ def test_set(self): @httpretty.activate def test_show(self): pargs = common.FakeParsedArgs() - pargs.id = 'nameo' + pargs.pool = 'nameo' + pargs.agent = False + pargs.stats = False httpretty.register_uri(httpretty.GET, self.LIST_URL, body=self.LIST_ONE) httpretty.register_uri(httpretty.GET, self.SHOW_URL, @@ -164,4 +198,37 @@ def test_show(self): name="nameo" status="ACTIVE" tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_show_agent(self): + pargs = common.FakeParsedArgs() + pargs.pool = 'nameo' + pargs.agent = True + pargs.stats = False + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_AGENT_URL, + body=self.SHOW_AGENT) + self.when_run(pool.ShowPool, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="(u'6ee1df7f-bae4-4ee9-910a-d33b000773b0', u'ostack02', True, ':-)')" +""", self.stdout()) + + @httpretty.activate + def test_show_stats(self): + pargs = common.FakeParsedArgs() + pargs.pool = 'nameo' + pargs.agent = False + pargs.stats = True + httpretty.register_uri(httpretty.GET, self.STATS_URL, + body=self.STATS) + self.when_run(pool.ShowPool, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +active_connections="39" +bytes_in="36839202" +bytes_out="673193022" +total_connections="682" """, self.stdout()) From ad1e9f23a0af18e9fa9365c6cc06ede8bcc19d66 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Tue, 7 Jan 2014 09:29:11 -0700 Subject: [PATCH 47/66] dxcli-1121 add remove pools --- .../network/v2_0/lb/healthmonitor.py | 24 +++++++++++ .../network/v2_0/lb/test_healthmonitor.py | 14 +++++++ .../v2_0/lb/test_healthmonitor_integration.py | 40 +++++++++++++++---- 3 files changed, 70 insertions(+), 8 deletions(-) diff --git a/openstackclient/network/v2_0/lb/healthmonitor.py b/openstackclient/network/v2_0/lb/healthmonitor.py index 2405ab4aae..cd00cfaa86 100644 --- a/openstackclient/network/v2_0/lb/healthmonitor.py +++ b/openstackclient/network/v2_0/lb/healthmonitor.py @@ -100,3 +100,27 @@ class ShowHealthMonitor(v2_0.ShowCommand): name = 'id' metavar = '' help_text = 'Name or ID of health monitor to show' + + +class AddPool(v2_0.AddCommand): + """Add health monitor to a pool""" + + clazz = neu2.AssociateHealthMonitor + container_name = 'pool_id' + container_metavar = '' + container_help_text = 'ID or name of pool' + name = "health_monitor_id" + metavar = "" + help_text = "health monitor to associate to pool" + + +class RemovePool(v2_0.RemoveCommand): + """Remove a port or subnet from a router""" + + clazz = neu2.DisassociateHealthMonitor + container_name = 'pool_id' + container_metavar = '' + container_help_text = 'ID or name of pool' + name = "health_monitor_id" + metavar = "" + help_text = "health monitor to disassociate from pool" diff --git a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py index b7c7a96c57..ed93cb9157 100644 --- a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py +++ b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py @@ -90,3 +90,17 @@ def test_get_parser_all(self): parsed = self.given_args(healthmonitor.ShowHealthMonitor, allargs) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) + + +class TestAddLbPool(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(healthmonitor.AddPool, "noo pool") + self.assertEqual('noo', parsed.pool_id) + self.assertEqual('pool', parsed.health_monitor_id) + + +class TestRemoveLbPool(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(healthmonitor.RemovePool, "woo swim") + self.assertEqual('woo', parsed.pool_id) + self.assertEqual('swim', parsed.health_monitor_id) diff --git a/openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py b/openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py index fdf721d8d4..ea5adf1c8e 100644 --- a/openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py +++ b/openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py @@ -23,8 +23,10 @@ class TestHealthMonitorIntegration(common.TestIntegrationBase): HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER POOLS_URL = HOSTESS + "/lb/pools.json" POOLS = '{ "pools": [{ "id": "1111111" }] }' - SUBNETS_URL = HOSTESS + "/subnets.json" - SUBNETS = '{ "subnets": [{ "id": "222222" }] }' + ADD_URL = HOSTESS + "/lb/pools/1111111/health_monitors.json" + ADD = '{}' + REMOVE_URL = HOSTESS + "/lb/pools/1111111/health_monitors/healthy.json" + REMOVE = '{}' CREATE_URL = HOSTESS + "/lb/health_monitors.json" CREATE = """ { @@ -59,8 +61,6 @@ class TestHealthMonitorIntegration(common.TestIntegrationBase): }""" SHOW_URL = HOSTESS + "/lb/health_monitors/a9254bdb.json" SHOW = CREATE - ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" - ADD_REMOVE = "{}" @httpretty.activate def test_create(self): @@ -74,10 +74,6 @@ def test_create(self): pargs.timeout = '80' pargs.type = 'PING' pargs.tenant_id = '33a40233' - #httpretty.register_uri(httpretty.GET, self.POOLS_URL, - # body=self.POOLS) - #httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, - # body=self.SUBNETS) httpretty.register_uri(httpretty.POST, self.CREATE_URL, body=self.CREATE) self.when_run(healthmonitor.CreateHealthMonitor, pargs) @@ -146,3 +142,31 @@ def test_show(self): status="ACTIVE" tenant_id="33a40233" """, self.stdout()) + + @httpretty.activate + def test_add_pool(self): + pargs = common.FakeParsedArgs() + pargs.pool_id = 'pooly' + pargs.health_monitor_id = 'healthy' + httpretty.register_uri(httpretty.GET, self.POOLS_URL, + body=self.POOLS) + httpretty.register_uri(httpretty.POST, self.ADD_URL, + body=self.ADD) + self.when_run(healthmonitor.AddPool, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"Associated health monitor healthy\n", + self.stdout()) + + @httpretty.activate + def test_remove_pool(self): + pargs = common.FakeParsedArgs() + pargs.pool_id = 'pooly' + pargs.health_monitor_id = 'healthy' + httpretty.register_uri(httpretty.GET, self.POOLS_URL, + body=self.POOLS) + httpretty.register_uri(httpretty.DELETE, self.REMOVE_URL, + body=self.REMOVE) + self.when_run(healthmonitor.RemovePool, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"Disassociated health monitor healthy\n", + self.stdout()) From 688811f4d5127a2f902a327492b9c00662d3d86b Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 9 Jan 2014 15:11:08 -0700 Subject: [PATCH 48/66] dxcli-1129 firewall basics --- openstackclient/network/v2_0/fw/__init__.py | 14 ++ openstackclient/network/v2_0/fw/firewall.py | 95 ++++++++++++ .../tests/network/v2_0/fw/__init__.py | 14 ++ .../tests/network/v2_0/fw/test_firewall.py | 83 +++++++++++ .../v2_0/fw/test_firewall_integration.py | 136 ++++++++++++++++++ .../network/v2_0/lb/test_healthmonitor.py | 20 +-- .../tests/network/v2_0/lb/test_member.py | 18 +-- .../tests/network/v2_0/lb/test_pool.py | 18 +-- .../tests/network/v2_0/lb/test_vip.py | 20 +-- .../tests/network/v2_0/test_dhcp.py | 4 +- .../tests/network/v2_0/test_floatingip.py | 14 +- .../tests/network/v2_0/test_gateway.py | 14 +- .../tests/network/v2_0/test_network.py | 24 ++-- .../tests/network/v2_0/test_port.py | 26 ++-- .../tests/network/v2_0/test_router.py | 28 ++-- .../tests/network/v2_0/test_security_group.py | 18 +-- .../network/v2_0/test_security_group_rule.py | 22 +-- .../tests/network/v2_0/test_subnet.py | 38 ++--- .../tests/network/v2_0/vpn/test_ikepolicy.py | 24 ++-- .../network/v2_0/vpn/test_ipsecpolicy.py | 22 +-- .../tests/network/v2_0/vpn/test_service.py | 16 +-- 21 files changed, 505 insertions(+), 163 deletions(-) create mode 100644 openstackclient/network/v2_0/fw/__init__.py create mode 100644 openstackclient/network/v2_0/fw/firewall.py create mode 100644 openstackclient/tests/network/v2_0/fw/__init__.py create mode 100644 openstackclient/tests/network/v2_0/fw/test_firewall.py create mode 100644 openstackclient/tests/network/v2_0/fw/test_firewall_integration.py diff --git a/openstackclient/network/v2_0/fw/__init__.py b/openstackclient/network/v2_0/fw/__init__.py new file mode 100644 index 0000000000..85ac2501b8 --- /dev/null +++ b/openstackclient/network/v2_0/fw/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# diff --git a/openstackclient/network/v2_0/fw/firewall.py b/openstackclient/network/v2_0/fw/firewall.py new file mode 100644 index 0000000000..67a1538f16 --- /dev/null +++ b/openstackclient/network/v2_0/fw/firewall.py @@ -0,0 +1,95 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +"""Firewall action implementations""" + +from neutronclient.neutron.v2_0.fw import firewall as neu2 +from openstackclient.network import v2_0 as v2_0 + + +class CreateFirewall(v2_0.CreateCommand): + """Create a firewall""" + + clazz = neu2.CreateFirewall + + def get_parser(self, prog_name): + parser = super(CreateFirewall, self).get_parser(prog_name) + parser.add_argument( + 'firewall_policy_id', metavar='policy', + help='Firewall policy id') + parser.add_argument( + 'name', + help='Name for the firewall') + parser.add_argument( + '--description', + help='Description for the firewall') + share_group = parser.add_mutually_exclusive_group() + share_group.add_argument( + "--shared", + dest="shared", + default=False, + help="Share firewall", + action="store_true") + share_group.add_argument( + "--not-shared", + dest="shared", + help="Do not share firewall", + action="store_false") + enabled_group = parser.add_mutually_exclusive_group() + enabled_group.add_argument( + "--enable", + dest="admin_state", + default=True, + help="Enable firewall", + action="store_true") + enabled_group.add_argument( + "--disable", + dest="admin_state", + help="Disable firewall", + action="store_false") + return parser + + +class DeleteFirewall(v2_0.DeleteCommand): + """Delete a firewall""" + + clazz = neu2.DeleteFirewall + name = 'firewall' + metavar = '' + help_text = 'Name or ID of firewall to delete' + + +class ListFirewall(v2_0.ListCommand): + """List firewall""" + + clazz = neu2.ListFirewall + + +class SetFirewall(v2_0.SetCommand): + """Set firewall values""" + + clazz = neu2.UpdateFirewall + name = 'firewall' + metavar = '' + help_text = 'ID of firewall to update' + + +class ShowFirewall(v2_0.ShowCommand): + """Show a firewall""" + + clazz = neu2.ShowFirewall + name = 'firewall' + metavar = '' + help_text = 'Name or ID of firewall to show' diff --git a/openstackclient/tests/network/v2_0/fw/__init__.py b/openstackclient/tests/network/v2_0/fw/__init__.py new file mode 100644 index 0000000000..85ac2501b8 --- /dev/null +++ b/openstackclient/tests/network/v2_0/fw/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# diff --git a/openstackclient/tests/network/v2_0/fw/test_firewall.py b/openstackclient/tests/network/v2_0/fw/test_firewall.py new file mode 100644 index 0000000000..d8e1096b0c --- /dev/null +++ b/openstackclient/tests/network/v2_0/fw/test_firewall.py @@ -0,0 +1,83 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network.v2_0.fw import firewall +from openstackclient.tests.network.v2_0 import common + + +class TestCreateFirewall(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "policy1 name1" + self.given_default_show_options() + parsed = self.given_args(firewall.CreateFirewall, given) + self.assertEqual('name1', parsed.name) + self.assertEqual('policy1', parsed.firewall_policy_id) + self.assertEqual(None, parsed.description) + self.assertEqual(False, parsed.shared) + self.assertEqual(True, parsed.admin_state) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + given = "policy2 name2 --description dee --shared --disable" + \ + " --project sneed" + given += self.given_all_show_options() + parsed = self.given_args(firewall.CreateFirewall, given) + self.assertEqual('name2', parsed.name) + self.assertEqual('policy2', parsed.firewall_policy_id) + self.assertEqual('dee', parsed.description) + self.assertEqual(True, parsed.shared) + self.assertEqual(False, parsed.admin_state) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteFirewall(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(firewall.DeleteFirewall, "noo") + self.assertEqual('noo', parsed.firewall) + + +class TestListFirewall(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "" + self.given_default_list_options() + parsed = self.given_args(firewall.ListFirewall, given) + self.assertEqual(False, parsed.show_details) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + given = "--long" + self.given_all_list_options() + parsed = self.given_args(firewall.ListFirewall, given) + self.assertEqual(True, parsed.show_details) + self.then_all_list_options(parsed) + + +class TestSetFirewall(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(firewall.SetFirewall, "noo") + self.assertEqual('noo', parsed.firewall) + + +class TestShowFirewall(common.TestNetworkBase): + def test_get_parser_nothing(self): + given = "noo" + self.given_default_show_options() + parsed = self.given_args(firewall.ShowFirewall, given) + self.assertEqual('noo', parsed.firewall) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + given = "too " + self.given_all_show_options() + parsed = self.given_args(firewall.ShowFirewall, given) + self.assertEqual('too', parsed.firewall) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/fw/test_firewall_integration.py b/openstackclient/tests/network/v2_0/fw/test_firewall_integration.py new file mode 100644 index 0000000000..291f805767 --- /dev/null +++ b/openstackclient/tests/network/v2_0/fw/test_firewall_integration.py @@ -0,0 +1,136 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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. +# + +import httpretty + +from openstackclient.network.v2_0.fw import firewall +from openstackclient.tests.network.v2_0 import common + + +class TestFirewallIntegration(common.TestIntegrationBase): + HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER + POLICY_URL = HOSTESS + "/fw/firewall_policies.json" + POLICY = '{ "firewall_policies": [{ "id": "9300303" }] }' + CREATE_URL = HOSTESS + "/fw/firewalls.json" + CREATE = """ +{ + "firewall": + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + } +}""" + DELETE_URL = HOSTESS + "/fw/firewalls/a9254bdb.json" + DELETE = "{}" + LIST_URL = HOSTESS + "/fw/firewalls.json" + LIST_ONE = '{ "firewalls": [{ "id": "a9254bdb" }] }' + LIST = """ +{ + "firewalls": [ + { + "status": "ACTIVE", + "name": "gator", + "tenant_id": "33a40233", + "id": "a9254bdb" + }, + { + "status": "ACTIVE", + "name": "croc", + "tenant_id": "33a40233", + "id": "b8408dgd" + } + ] +}""" + SHOW_URL = HOSTESS + "/fw/firewalls/a9254bdb.json" + SHOW = CREATE + + @httpretty.activate + def test_create(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + pargs.firewall_policy_id = 'policy' + pargs.description = None + pargs.shared = False + pargs.admin_state = True + pargs.tenant_id = '33a40233' + httpretty.register_uri(httpretty.GET, self.POLICY_URL, + body=self.POLICY) + httpretty.register_uri(httpretty.POST, self.CREATE_URL, + body=self.CREATE) + self.when_run(firewall.CreateFirewall, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +Created a new firewall: +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) + + @httpretty.activate + def test_delete(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, + body=self.DELETE) + self.when_run(firewall.DeleteFirewall, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u'Deleted firewall: gator\n', + self.stdout()) + + @httpretty.activate + def test_list(self): + pargs = common.FakeParsedArgs() + pargs.formatter = 'csv' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST) + self.when_run(firewall.ListFirewall, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual("""\ +id,name +a9254bdb,gator +b8408dgd,croc +""", self.stdout()) + + @httpretty.activate + def test_set(self): + pargs = common.FakeParsedArgs() + pargs.name = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + self.when_run(firewall.SetFirewall, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual('', self.stdout()) + + @httpretty.activate + def test_show(self): + pargs = common.FakeParsedArgs() + pargs.id = 'gator' + httpretty.register_uri(httpretty.GET, self.LIST_URL, + body=self.LIST_ONE) + httpretty.register_uri(httpretty.GET, self.SHOW_URL, + body=self.SHOW) + self.when_run(firewall.ShowFirewall, pargs) + self.assertEqual('', self.stderr()) + self.assertEqual(u"""\ +id="a9254bdb" +name="gator" +status="ACTIVE" +tenant_id="33a40233" +""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py index ed93cb9157..034d2aa7e8 100644 --- a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py +++ b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py @@ -34,12 +34,12 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "--delay 4 --max-retries 5 --timeout 6 --type HTTP" + \ - " --admin-state-down --expected-codes 200" + \ - " --http-method GET --url-path http://127.0.0.1" + \ - " --project sneed " - allargs += self.given_all_show_options() - parsed = self.given_args(healthmonitor.CreateHealthMonitor, allargs) + given = "--delay 4 --max-retries 5 --timeout 6 --type HTTP" + \ + " --admin-state-down --expected-codes 200" + \ + " --http-method GET --url-path http://127.0.0.1" + \ + " --project sneed " + given += self.given_all_show_options() + parsed = self.given_args(healthmonitor.CreateHealthMonitor, given) self.assertEqual(False, parsed.admin_state) self.assertEqual('200', parsed.expected_codes) self.assertEqual('GET', parsed.http_method) @@ -66,8 +66,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() - parsed = self.given_args(healthmonitor.ListHealthMonitor, allargs) + given = "--long" + self.given_all_list_options() + parsed = self.given_args(healthmonitor.ListHealthMonitor, given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -86,8 +86,8 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too" + self.given_all_show_options() - parsed = self.given_args(healthmonitor.ShowHealthMonitor, allargs) + given = "too" + self.given_all_show_options() + parsed = self.given_args(healthmonitor.ShowHealthMonitor, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_member.py b/openstackclient/tests/network/v2_0/lb/test_member.py index 68c59d33dd..f0027ac272 100644 --- a/openstackclient/tests/network/v2_0/lb/test_member.py +++ b/openstackclient/tests/network/v2_0/lb/test_member.py @@ -31,11 +31,11 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "--address 1.1.1.2 --protocol-port 34" + \ - " --admin-state-down --weight 99" + \ - " pool2 --project sneed " - allargs += self.given_all_show_options() - parsed = self.given_args(member.CreateMember, allargs) + given = "--address 1.1.1.2 --protocol-port 34" + \ + " --admin-state-down --weight 99" + \ + " pool2 --project sneed " + given += self.given_all_show_options() + parsed = self.given_args(member.CreateMember, given) self.assertEqual('pool2', parsed.pool_id) self.assertEqual(False, parsed.admin_state) self.assertEqual('99', parsed.weight) @@ -59,8 +59,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() - parsed = self.given_args(member.ListMember, allargs) + given = "--long" + self.given_all_list_options() + parsed = self.given_args(member.ListMember, given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -79,7 +79,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too" + self.given_all_show_options() - parsed = self.given_args(member.ShowMember, allargs) + given = "too" + self.given_all_show_options() + parsed = self.given_args(member.ShowMember, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_pool.py b/openstackclient/tests/network/v2_0/lb/test_pool.py index 90cc2e9419..8143f1334c 100644 --- a/openstackclient/tests/network/v2_0/lb/test_pool.py +++ b/openstackclient/tests/network/v2_0/lb/test_pool.py @@ -33,11 +33,11 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "--lb-method SOURCE_IP --protocol HTTPS --subnet-id 123" + \ - " --admin-state-down --description foo --provider ride" + \ - " pool2 --project sneed " - allargs += self.given_all_show_options() - parsed = self.given_args(pool.CreatePool, allargs) + given = "--lb-method SOURCE_IP --protocol HTTPS --subnet-id 123" + \ + " --admin-state-down --description foo --provider ride" + \ + " pool2 --project sneed " + given += self.given_all_show_options() + parsed = self.given_args(pool.CreatePool, given) self.assertEqual('pool2', parsed.name) self.assertEqual('SOURCE_IP', parsed.lb_method) self.assertEqual('HTTPS', parsed.protocol) @@ -64,8 +64,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long --lbaas-agent gent" + self.given_all_list_options() - parsed = self.given_args(pool.ListPool, allargs) + given = "--long --lbaas-agent gent" + self.given_all_list_options() + parsed = self.given_args(pool.ListPool, given) self.assertEqual('gent', parsed.lbaas_agent) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -87,8 +87,8 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too --agent --stats" + self.given_all_show_options() - parsed = self.given_args(pool.ShowPool, allargs) + given = "too --agent --stats" + self.given_all_show_options() + parsed = self.given_args(pool.ShowPool, given) self.assertEqual('too', parsed.pool) self.assertEqual(True, parsed.agent) self.assertEqual(True, parsed.stats) diff --git a/openstackclient/tests/network/v2_0/lb/test_vip.py b/openstackclient/tests/network/v2_0/lb/test_vip.py index 05687fb8c3..8100920db0 100644 --- a/openstackclient/tests/network/v2_0/lb/test_vip.py +++ b/openstackclient/tests/network/v2_0/lb/test_vip.py @@ -35,12 +35,12 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "--protocol-port 44 --protocol TCP --subnet-id 99" + \ - " --address 127.0.0.1 --admin-state-down" + \ - " --connection-limit 5 --description wow" + \ - " pool2 too --project sneed " - allargs += self.given_all_show_options() - parsed = self.given_args(vip.CreateVip, allargs) + given = "--protocol-port 44 --protocol TCP --subnet-id 99" + \ + " --address 127.0.0.1 --admin-state-down" + \ + " --connection-limit 5 --description wow" + \ + " pool2 too --project sneed " + given += self.given_all_show_options() + parsed = self.given_args(vip.CreateVip, given) self.assertEqual('too', parsed.name) self.assertEqual('pool2', parsed.pool_id) self.assertEqual('44', parsed.protocol_port) @@ -68,8 +68,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() - parsed = self.given_args(vip.ListVip, allargs) + given = "--long" + self.given_all_list_options() + parsed = self.given_args(vip.ListVip, given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -88,7 +88,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too" + self.given_all_show_options() - parsed = self.given_args(vip.ShowVip, allargs) + given = "too" + self.given_all_show_options() + parsed = self.given_args(vip.ShowVip, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_dhcp.py b/openstackclient/tests/network/v2_0/test_dhcp.py index f8e6348563..eb83ed2d0c 100644 --- a/openstackclient/tests/network/v2_0/test_dhcp.py +++ b/openstackclient/tests/network/v2_0/test_dhcp.py @@ -40,8 +40,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "netty --long" + self.given_all_list_options() - parsed = self.given_args(dhcp.ListDhcpAgent, allargs) + given = "netty --long" + self.given_all_list_options() + parsed = self.given_args(dhcp.ListDhcpAgent, given) self.assertEqual('netty', parsed.network) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_floatingip.py b/openstackclient/tests/network/v2_0/test_floatingip.py index 21cdfaa849..cfa8eb3eba 100644 --- a/openstackclient/tests/network/v2_0/test_floatingip.py +++ b/openstackclient/tests/network/v2_0/test_floatingip.py @@ -28,9 +28,9 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too --fixed-ip 1.1.1.1 --port 123 --project sneed" - allargs += self.given_all_show_options() - parsed = self.given_args(floatingip.CreateFloatingIp, allargs) + given = "too --fixed-ip 1.1.1.1 --port 123 --project sneed" + given += self.given_all_show_options() + parsed = self.given_args(floatingip.CreateFloatingIp, given) self.assertEqual('too', parsed.floating_network_id) self.assertEqual('1.1.1.1', parsed.fixed_ip_address) self.assertEqual('123', parsed.port_id) @@ -52,8 +52,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() - parsed = self.given_args(floatingip.ListFloatingIp, allargs) + given = "--long" + self.given_all_list_options() + parsed = self.given_args(floatingip.ListFloatingIp, given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -66,7 +66,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too " + self.given_all_show_options() - parsed = self.given_args(floatingip.ShowFloatingIp, allargs) + given = "too " + self.given_all_show_options() + parsed = self.given_args(floatingip.ShowFloatingIp, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_gateway.py b/openstackclient/tests/network/v2_0/test_gateway.py index 55599b9e70..bdababa441 100644 --- a/openstackclient/tests/network/v2_0/test_gateway.py +++ b/openstackclient/tests/network/v2_0/test_gateway.py @@ -27,9 +27,9 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too --device device_id=1,interface_name=n --project sneed" - allargs += self.given_all_show_options() - parsed = self.given_args(gateway.CreateGateway, allargs) + given = "too --device device_id=1,interface_name=n --project sneed" + given += self.given_all_show_options() + parsed = self.given_args(gateway.CreateGateway, given) self.assertEqual('too', parsed.name) self.assertEqual(['device_id=1,interface_name=n'], parsed.device) self.assertEqual('sneed', parsed.tenant_id) @@ -50,8 +50,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() - parsed = self.given_args(gateway.ListGateway, allargs) + given = "--long" + self.given_all_list_options() + parsed = self.given_args(gateway.ListGateway, given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -70,7 +70,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too " + self.given_all_show_options() - parsed = self.given_args(gateway.ShowGateway, allargs) + given = "too " + self.given_all_show_options() + parsed = self.given_args(gateway.ShowGateway, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index f728c6138d..91fa16f94b 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -28,9 +28,9 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too --admin-state-down --shared --project sneed" - allargs += self.given_all_show_options() - parsed = self.given_args(network.CreateNetwork, allargs) + given = "too --admin-state-down --shared --project sneed" + given += self.given_all_show_options() + parsed = self.given_args(network.CreateNetwork, given) self.assertEqual('too', parsed.name) self.assertEqual(False, parsed.admin_state) self.assertEqual(True, parsed.shared) @@ -54,9 +54,9 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long --external --dhcp dee" + \ - self.given_all_list_options() - parsed = self.given_args(network.ListNetwork, allargs) + given = "--long --external --dhcp dee" + \ + self.given_all_list_options() + parsed = self.given_args(network.ListNetwork, given) self.assertEqual(True, parsed.show_details) self.assertEqual(True, parsed.external) self.assertEqual('dee', parsed.dhcp_agent) @@ -77,8 +77,8 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too " + self.given_all_show_options() - parsed = self.given_args(network.ShowNetwork, allargs) + given = "too " + self.given_all_show_options() + parsed = self.given_args(network.ShowNetwork, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) @@ -93,8 +93,8 @@ def test_get_parser_nothing(self): self.assertEqual(None, parsed.segmentation_id) def test_get_parser_all(self): - allargs = "netty getty --segmentation-type 1 --segmentation-id 2" - parsed = self.given_args(network.AddGatewayNetwork, allargs) + given = "netty getty --segmentation-type 1 --segmentation-id 2" + parsed = self.given_args(network.AddGatewayNetwork, given) self.assertEqual('netty', parsed.network_id) self.assertEqual('getty', parsed.net_gateway_id) self.assertEqual('1', parsed.segmentation_type) @@ -111,8 +111,8 @@ def test_get_parser_nothing(self): self.assertEqual(None, parsed.segmentation_id) def test_get_parser_all(self): - allargs = "netty getty --segmentation-type 1 --segmentation-id 2" - parsed = self.given_args(network.RemoveGatewayNetwork, allargs) + given = "netty getty --segmentation-type 1 --segmentation-id 2" + parsed = self.given_args(network.RemoveGatewayNetwork, given) self.assertEqual('netty', parsed.network_id) self.assertEqual('getty', parsed.net_gateway_id) self.assertEqual('1', parsed.segmentation_type) diff --git a/openstackclient/tests/network/v2_0/test_port.py b/openstackclient/tests/network/v2_0/test_port.py index 29c05b3429..8985ca0dbf 100644 --- a/openstackclient/tests/network/v2_0/test_port.py +++ b/openstackclient/tests/network/v2_0/test_port.py @@ -34,12 +34,12 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = 'too --device-id DI --disable --extra-dhcp-opt DO ' \ - '--fixed-ip FI -f shell --mac-address MA ' \ - '--network NI --security-group ONE ' \ - '--security-group TWO --project sneed ' - allargs += self.given_all_show_options() - parsed = self.given_args(port.CreatePort, allargs) + given = 'too --device-id DI --disable --extra-dhcp-opt DO ' \ + '--fixed-ip FI -f shell --mac-address MA ' \ + '--network NI --security-group ONE ' \ + '--security-group TWO --project sneed ' + given += self.given_all_show_options() + parsed = self.given_args(port.CreatePort, given) self.assertEqual('too', parsed.name) self.assertEqual(False, parsed.admin_state) self.assertEqual('DI', parsed.device_id) @@ -68,8 +68,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long --router ROO" + self.given_all_list_options() - parsed = self.given_args(port.ListPort, allargs) + given = "--long --router ROO" + self.given_all_list_options() + parsed = self.given_args(port.ListPort, given) self.assertEqual(True, parsed.show_details) self.assertEqual('ROO', parsed.router) self.then_all_list_options(parsed) @@ -84,9 +84,9 @@ def test_get_parser_nothing(self): self.assertEqual([], parsed.security_groups) def test_get_parser_all(self): - allargs = 'too --extra-dhcp-opt DO --security-group ONE ' \ - '--security-group TWO ' - parsed = self.given_args(port.SetPort, allargs) + given = 'too --extra-dhcp-opt DO --security-group ONE ' \ + '--security-group TWO ' + parsed = self.given_args(port.SetPort, given) self.assertEqual('too', parsed.id) self.assertEqual(['DO'], parsed.extra_dhcp_opts) self.assertEqual(False, parsed.no_security_groups) @@ -101,7 +101,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too" + self.given_all_show_options() - parsed = self.given_args(port.ShowPort, allargs) + given = "too" + self.given_all_show_options() + parsed = self.given_args(port.ShowPort, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_router.py b/openstackclient/tests/network/v2_0/test_router.py index 5e581f7f32..6612f065bd 100644 --- a/openstackclient/tests/network/v2_0/test_router.py +++ b/openstackclient/tests/network/v2_0/test_router.py @@ -28,9 +28,9 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = 'too --disable --distributed --project sneed ' - allargs += self.given_all_show_options() - parsed = self.given_args(router.CreateRouter, allargs) + given = 'too --disable --distributed --project sneed ' + given += self.given_all_show_options() + parsed = self.given_args(router.CreateRouter, given) self.assertEqual('too', parsed.name) self.assertEqual(False, parsed.admin_state) self.assertEqual(True, parsed.distributed) @@ -38,9 +38,9 @@ def test_get_parser_all(self): self.then_all_show_options(parsed) def test_get_parser_all_enable(self): - allargs = 'too --enable --project sneed ' - allargs += self.given_all_show_options() - parsed = self.given_args(router.CreateRouter, allargs) + given = 'too --enable --project sneed ' + given += self.given_all_show_options() + parsed = self.given_args(router.CreateRouter, given) self.assertEqual('too', parsed.name) self.assertEqual(True, parsed.admin_state) self.assertEqual(False, parsed.distributed) @@ -63,8 +63,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long --l3-agent foo" + self.given_all_list_options() - parsed = self.given_args(router.ListRouter, allargs) + given = "--long --l3-agent foo" + self.given_all_list_options() + parsed = self.given_args(router.ListRouter, given) self.assertEqual(True, parsed.show_details) self.assertEqual('foo', parsed.l3_agent) self.then_all_list_options(parsed) @@ -79,16 +79,16 @@ def test_get_parser_nothing(self): self.assertEqual(False, parsed.disable_snat) def test_get_parser_all(self): - allargs = 'too --disable-snat --no-gateway' - parsed = self.given_args(router.SetRouter, allargs) + given = 'too --disable-snat --no-gateway' + parsed = self.given_args(router.SetRouter, given) self.assertEqual('too', parsed.router_id) self.assertEqual(None, parsed.external_network_id) self.assertEqual(True, parsed.no_gateway) self.assertEqual(True, parsed.disable_snat) def test_get_parser_all_enable(self): - allargs = 'too --gateway way --enable-snat' - parsed = self.given_args(router.SetRouter, allargs) + given = 'too --gateway way --enable-snat' + parsed = self.given_args(router.SetRouter, given) self.assertEqual('too', parsed.router_id) self.assertEqual('way', parsed.external_network_id) self.assertEqual(False, parsed.no_gateway) @@ -103,7 +103,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too" + self.given_all_show_options() - parsed = self.given_args(router.ShowRouter, allargs) + given = "too" + self.given_all_show_options() + parsed = self.given_args(router.ShowRouter, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_security_group.py b/openstackclient/tests/network/v2_0/test_security_group.py index f06b026606..5b3c6ac2ec 100644 --- a/openstackclient/tests/network/v2_0/test_security_group.py +++ b/openstackclient/tests/network/v2_0/test_security_group.py @@ -27,9 +27,9 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = 'too --description sgtoo --project sneed ' - allargs += self.given_all_show_options() - parsed = self.given_args(security_group.CreateSecurityGroup, allargs) + given = 'too --description sgtoo --project sneed ' + given += self.given_all_show_options() + parsed = self.given_args(security_group.CreateSecurityGroup, given) self.assertEqual('too', parsed.name) self.assertEqual('sgtoo', parsed.description) self.assertEqual('sneed', parsed.tenant_id) @@ -50,8 +50,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() - parsed = self.given_args(security_group.ListSecurityGroup, allargs) + given = "--long" + self.given_all_list_options() + parsed = self.given_args(security_group.ListSecurityGroup, given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -63,8 +63,8 @@ def test_get_parser_nothing(self): self.assertEqual(None, parsed.description) def test_get_parser_all(self): - allargs = 'too --description noosgtoo' - parsed = self.given_args(security_group.SetSecurityGroup, allargs) + given = 'too --description noosgtoo' + parsed = self.given_args(security_group.SetSecurityGroup, given) self.assertEqual('too', parsed.id) self.assertEqual('noosgtoo', parsed.description) @@ -77,7 +77,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too" + self.given_all_show_options() - parsed = self.given_args(security_group.ShowSecurityGroup, allargs) + given = "too" + self.given_all_show_options() + parsed = self.given_args(security_group.ShowSecurityGroup, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_security_group_rule.py b/openstackclient/tests/network/v2_0/test_security_group_rule.py index d4ee5f9ec6..c468886f92 100644 --- a/openstackclient/tests/network/v2_0/test_security_group_rule.py +++ b/openstackclient/tests/network/v2_0/test_security_group_rule.py @@ -34,14 +34,14 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = 'too --project sneed' \ - ' --direction egress --ethertype IPv6' \ - ' --protocol 3 --port-range-min 4' \ - ' --port-range-max 5 --remote-ip-prefix 6' \ - ' --remote-group-id 7' - allargs += self.given_all_show_options() + given = 'too --project sneed' \ + ' --direction egress --ethertype IPv6' \ + ' --protocol 3 --port-range-min 4' \ + ' --port-range-max 5 --remote-ip-prefix 6' \ + ' --remote-group-id 7' + given += self.given_all_show_options() parsed = self.given_args(security_group_rule.CreateSecurityGroupRule, - allargs) + given) self.assertEqual('too', parsed.security_group_id) self.assertEqual('egress', parsed.direction) self.assertEqual('IPv6', parsed.ethertype) @@ -70,9 +70,9 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() + given = "--long" + self.given_all_list_options() parsed = self.given_args(security_group_rule.ListSecurityGroupRule, - allargs) + given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -86,8 +86,8 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too" + self.given_all_show_options() + given = "too" + self.given_all_show_options() parsed = self.given_args(security_group_rule.ShowSecurityGroupRule, - allargs) + given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_subnet.py b/openstackclient/tests/network/v2_0/test_subnet.py index 3aa2ace851..d98400b8d0 100644 --- a/openstackclient/tests/network/v2_0/test_subnet.py +++ b/openstackclient/tests/network/v2_0/test_subnet.py @@ -35,14 +35,14 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = 'too 10.1.1.1/24 --project sneed' \ - ' --name 1 --ip-version 6 --gateway 2' \ - ' --no-gateway ' \ - ' --allocation-pool start=10.1.1.1,end=10.1.1.4' \ - ' --host-route destination=10.1.1.1/1,nexthop=20.1.1.1' \ - ' --dns-nameserver 5 --disable-dhcp' - allargs += self.given_all_show_options() - parsed = self.given_args(subnet.CreateSubnet, allargs) + given = 'too 10.1.1.1/24 --project sneed' \ + ' --name 1 --ip-version 6 --gateway 2' \ + ' --no-gateway ' \ + ' --allocation-pool start=10.1.1.1,end=10.1.1.4' \ + ' --host-route destination=10.1.1.1/1,nexthop=20.1.1.1' \ + ' --dns-nameserver 5 --disable-dhcp' + given += self.given_all_show_options() + parsed = self.given_args(subnet.CreateSubnet, given) self.assertEqual('too', parsed.network_id) self.assertEqual('10.1.1.1/24', parsed.cidr) self.assertEqual('1', parsed.name) @@ -59,11 +59,11 @@ def test_get_parser_all(self): self.then_all_show_options(parsed) def test_get_parser_alternate(self): - allargs = 'too 10.1.1.1/24' \ - ' --allocation-pool 10.1.1.1-10.1.1.4' \ - ' --host-route 10.1.1.1/1=20.1.1.1' - allargs += self.given_all_show_options() - parsed = self.given_args(subnet.CreateSubnet, allargs) + given = 'too 10.1.1.1/24' \ + ' --allocation-pool 10.1.1.1-10.1.1.4' \ + ' --host-route 10.1.1.1/1=20.1.1.1' + given += self.given_all_show_options() + parsed = self.given_args(subnet.CreateSubnet, given) self.assertEqual('too', parsed.network_id) self.assertEqual('10.1.1.1/24', parsed.cidr) self.assertEqual('10.1.1.1', parsed.allocation_pools[0]['start']) @@ -86,8 +86,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() - parsed = self.given_args(subnet.ListSubnet, allargs) + given = "--long" + self.given_all_list_options() + parsed = self.given_args(subnet.ListSubnet, given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -98,8 +98,8 @@ def test_get_parser_nothing(self): self.assertEqual('noo', parsed.id) def test_get_parser_all(self): - allargs = 'too' - parsed = self.given_args(subnet.SetSubnet, allargs) + given = 'too' + parsed = self.given_args(subnet.SetSubnet, given) self.assertEqual('too', parsed.id) @@ -111,7 +111,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too" + self.given_all_show_options() - parsed = self.given_args(subnet.ShowSubnet, allargs) + given = "too" + self.given_all_show_options() + parsed = self.given_args(subnet.ShowSubnet, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py index 673fda3060..7860108081 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py +++ b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py @@ -33,14 +33,14 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too --description doo " +\ - " --auth-algorithm sha1 --encryption-algorithm aes-192" +\ - " --phase1-negotiation-mode main --pfs group2" +\ - " --ike-version v2" +\ - " --lifetime units=seconds,value=300" +\ - " --project sneed" - allargs += self.given_all_show_options() - parsed = self.given_args(ikepolicy.CreateIkepolicy, allargs) + given = "too --description doo " +\ + " --auth-algorithm sha1 --encryption-algorithm aes-192" +\ + " --phase1-negotiation-mode main --pfs group2" +\ + " --ike-version v2" +\ + " --lifetime units=seconds,value=300" +\ + " --project sneed" + given += self.given_all_show_options() + parsed = self.given_args(ikepolicy.CreateIkepolicy, given) self.assertEqual('too', parsed.name) self.assertEqual('doo', parsed.description) self.assertEqual('sha1', parsed.auth_algorithm) @@ -67,8 +67,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() - parsed = self.given_args(ikepolicy.ListIkepolicy, allargs) + given = "--long" + self.given_all_list_options() + parsed = self.given_args(ikepolicy.ListIkepolicy, given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -87,7 +87,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too " + self.given_all_show_options() - parsed = self.given_args(ikepolicy.ShowIkepolicy, allargs) + given = "too " + self.given_all_show_options() + parsed = self.given_args(ikepolicy.ShowIkepolicy, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py index 8b261c4081..4fd7c3f3a4 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py +++ b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py @@ -33,13 +33,13 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too --description doo --transform-protocol esp" +\ - " --auth-algorithm sha1 --encryption-algorithm aes-192" +\ - " --encapsulation-mode transport --pfs group2" +\ - " --lifetime units=seconds,value=300" +\ - " --project sneed" - allargs += self.given_all_show_options() - parsed = self.given_args(ipsecpolicy.CreateIpsecpolicy, allargs) + given = "too --description doo --transform-protocol esp" +\ + " --auth-algorithm sha1 --encryption-algorithm aes-192" +\ + " --encapsulation-mode transport --pfs group2" +\ + " --lifetime units=seconds,value=300" +\ + " --project sneed" + given += self.given_all_show_options() + parsed = self.given_args(ipsecpolicy.CreateIpsecpolicy, given) self.assertEqual('too', parsed.name) self.assertEqual('doo', parsed.description) self.assertEqual('esp', parsed.transform_protocol) @@ -66,8 +66,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() - parsed = self.given_args(ipsecpolicy.ListIpsecpolicy, allargs) + given = "--long" + self.given_all_list_options() + parsed = self.given_args(ipsecpolicy.ListIpsecpolicy, given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -86,7 +86,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too " + self.given_all_show_options() - parsed = self.given_args(ipsecpolicy.ShowIpsecpolicy, allargs) + given = "too " + self.given_all_show_options() + parsed = self.given_args(ipsecpolicy.ShowIpsecpolicy, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/vpn/test_service.py b/openstackclient/tests/network/v2_0/vpn/test_service.py index 43bc5a62fa..5ff5652445 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_service.py +++ b/openstackclient/tests/network/v2_0/vpn/test_service.py @@ -30,10 +30,10 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too roo soo --admin-state-down --description doo" +\ - " --project sneed" - allargs += self.given_all_show_options() - parsed = self.given_args(service.CreateService, allargs) + given = "too roo soo --admin-state-down --description doo" +\ + " --project sneed" + given += self.given_all_show_options() + parsed = self.given_args(service.CreateService, given) self.assertEqual('too', parsed.name) self.assertEqual('roo', parsed.router) self.assertEqual('soo', parsed.subnet) @@ -57,8 +57,8 @@ def test_get_parser_nothing(self): self.then_default_list_options(parsed) def test_get_parser_all(self): - allargs = "--long" + self.given_all_list_options() - parsed = self.given_args(service.ListService, allargs) + given = "--long" + self.given_all_list_options() + parsed = self.given_args(service.ListService, given) self.assertEqual(True, parsed.show_details) self.then_all_list_options(parsed) @@ -77,7 +77,7 @@ def test_get_parser_nothing(self): self.then_default_show_options(parsed) def test_get_parser_all(self): - allargs = "too " + self.given_all_show_options() - parsed = self.given_args(service.ShowService, allargs) + given = "too " + self.given_all_show_options() + parsed = self.given_args(service.ShowService, given) self.assertEqual('too', parsed.id) self.then_all_show_options(parsed) From b55b631ac8026040afd8864bd512036885124ea6 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Fri, 10 Jan 2014 12:59:38 -0700 Subject: [PATCH 49/66] remove httpretty --- .../v2_0/fw/test_firewall_integration.py | 136 ---------- .../v2_0/lb/test_healthmonitor_integration.py | 172 ------------ .../v2_0/lb/test_member_integration.py | 141 ---------- .../network/v2_0/lb/test_pool_integration.py | 234 ----------------- .../network/v2_0/lb/test_vip_integration.py | 149 ----------- .../network/v2_0/test_dhcp_integration.py | 105 -------- .../v2_0/test_floatingip_integration.py | 123 --------- .../network/v2_0/test_gateway_integration.py | 134 ---------- .../network/v2_0/test_network_integration.py | 221 ---------------- .../network/v2_0/test_port_integration.py | 174 ------------- .../network/v2_0/test_router_integration.py | 244 ------------------ .../v2_0/test_security_group_integration.py | 131 ---------- .../test_security_group_rule_integration.py | 137 ---------- .../network/v2_0/test_subnet_integration.py | 141 ---------- .../v2_0/vpn/test_ikepolicy_integration.py | 147 ----------- .../v2_0/vpn/test_ipsecpolicy_integration.py | 145 ----------- .../v2_0/vpn/test_service_integration.py | 144 ----------- 17 files changed, 2678 deletions(-) delete mode 100644 openstackclient/tests/network/v2_0/fw/test_firewall_integration.py delete mode 100644 openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py delete mode 100644 openstackclient/tests/network/v2_0/lb/test_member_integration.py delete mode 100644 openstackclient/tests/network/v2_0/lb/test_pool_integration.py delete mode 100644 openstackclient/tests/network/v2_0/lb/test_vip_integration.py delete mode 100644 openstackclient/tests/network/v2_0/test_dhcp_integration.py delete mode 100644 openstackclient/tests/network/v2_0/test_floatingip_integration.py delete mode 100644 openstackclient/tests/network/v2_0/test_gateway_integration.py delete mode 100644 openstackclient/tests/network/v2_0/test_network_integration.py delete mode 100644 openstackclient/tests/network/v2_0/test_port_integration.py delete mode 100644 openstackclient/tests/network/v2_0/test_router_integration.py delete mode 100644 openstackclient/tests/network/v2_0/test_security_group_integration.py delete mode 100644 openstackclient/tests/network/v2_0/test_security_group_rule_integration.py delete mode 100644 openstackclient/tests/network/v2_0/test_subnet_integration.py delete mode 100644 openstackclient/tests/network/v2_0/vpn/test_ikepolicy_integration.py delete mode 100644 openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy_integration.py delete mode 100644 openstackclient/tests/network/v2_0/vpn/test_service_integration.py diff --git a/openstackclient/tests/network/v2_0/fw/test_firewall_integration.py b/openstackclient/tests/network/v2_0/fw/test_firewall_integration.py deleted file mode 100644 index 291f805767..0000000000 --- a/openstackclient/tests/network/v2_0/fw/test_firewall_integration.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0.fw import firewall -from openstackclient.tests.network.v2_0 import common - - -class TestFirewallIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - POLICY_URL = HOSTESS + "/fw/firewall_policies.json" - POLICY = '{ "firewall_policies": [{ "id": "9300303" }] }' - CREATE_URL = HOSTESS + "/fw/firewalls.json" - CREATE = """ -{ - "firewall": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/fw/firewalls/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/fw/firewalls.json" - LIST_ONE = '{ "firewalls": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "firewalls": [ - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/fw/firewalls/a9254bdb.json" - SHOW = CREATE - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - pargs.firewall_policy_id = 'policy' - pargs.description = None - pargs.shared = False - pargs.admin_state = True - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.GET, self.POLICY_URL, - body=self.POLICY) - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(firewall.CreateFirewall, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new firewall: -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(firewall.DeleteFirewall, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted firewall: gator\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(firewall.ListFirewall, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name -a9254bdb,gator -b8408dgd,croc -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(firewall.SetFirewall, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(firewall.ShowFirewall, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py b/openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py deleted file mode 100644 index ea5adf1c8e..0000000000 --- a/openstackclient/tests/network/v2_0/lb/test_healthmonitor_integration.py +++ /dev/null @@ -1,172 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0.lb import healthmonitor -from openstackclient.tests.network.v2_0 import common - - -class TestHealthMonitorIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - POOLS_URL = HOSTESS + "/lb/pools.json" - POOLS = '{ "pools": [{ "id": "1111111" }] }' - ADD_URL = HOSTESS + "/lb/pools/1111111/health_monitors.json" - ADD = '{}' - REMOVE_URL = HOSTESS + "/lb/pools/1111111/health_monitors/healthy.json" - REMOVE = '{}' - CREATE_URL = HOSTESS + "/lb/health_monitors.json" - CREATE = """ -{ - "health_monitor": - { - "status": "ACTIVE", - "name": "nameo", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/lb/health_monitors/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/lb/health_monitors.json" - LIST_ONE = '{ "health_monitors": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "health_monitors": [ - { - "admin_state_up": "True", - "type": "PING", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "admin_state_up": "False", - "type": "HTTP", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/lb/health_monitors/a9254bdb.json" - SHOW = CREATE - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.admin_state = True - pargs.expected_codes = None - pargs.http_method = None - pargs.url_path = None - pargs.delay = '30' - pargs.max_retries = '10' - pargs.timeout = '80' - pargs.type = 'PING' - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(healthmonitor.CreateHealthMonitor, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new health_monitor: -id="a9254bdb" -name="nameo" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(healthmonitor.DeleteHealthMonitor, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted health_monitor: nameo\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.page_size = None - pargs.sort_key = [] - pargs.sort_dir = [] - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(healthmonitor.ListHealthMonitor, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,type,admin_state_up -a9254bdb,PING,True -b8408dgd,HTTP,False -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.id = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(healthmonitor.SetHealthMonitor, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(healthmonitor.ShowHealthMonitor, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="nameo" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_add_pool(self): - pargs = common.FakeParsedArgs() - pargs.pool_id = 'pooly' - pargs.health_monitor_id = 'healthy' - httpretty.register_uri(httpretty.GET, self.POOLS_URL, - body=self.POOLS) - httpretty.register_uri(httpretty.POST, self.ADD_URL, - body=self.ADD) - self.when_run(healthmonitor.AddPool, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"Associated health monitor healthy\n", - self.stdout()) - - @httpretty.activate - def test_remove_pool(self): - pargs = common.FakeParsedArgs() - pargs.pool_id = 'pooly' - pargs.health_monitor_id = 'healthy' - httpretty.register_uri(httpretty.GET, self.POOLS_URL, - body=self.POOLS) - httpretty.register_uri(httpretty.DELETE, self.REMOVE_URL, - body=self.REMOVE) - self.when_run(healthmonitor.RemovePool, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"Disassociated health monitor healthy\n", - self.stdout()) diff --git a/openstackclient/tests/network/v2_0/lb/test_member_integration.py b/openstackclient/tests/network/v2_0/lb/test_member_integration.py deleted file mode 100644 index cf75192f40..0000000000 --- a/openstackclient/tests/network/v2_0/lb/test_member_integration.py +++ /dev/null @@ -1,141 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0.lb import member -from openstackclient.tests.network.v2_0 import common - - -class TestMemberIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - POOLS_URL = HOSTESS + "/lb/pools.json" - POOLS = '{ "pools": [{ "id": "1111111" }] }' - CREATE_URL = HOSTESS + "/lb/members.json" - CREATE = """ -{ - "member": - { - "status": "ACTIVE", - "name": "nameo", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/lb/members/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/lb/members.json" - LIST_ONE = '{ "members": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "members": [ - { - "status": "ACTIVE", - "name": "nameo", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/lb/members/a9254bdb.json" - SHOW = CREATE - ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" - ADD_REMOVE = "{}" - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.pool_id = 'swimming' - pargs.admin_state = True - pargs.weight = '10' - pargs.address = '127.0.0.1' - pargs.protocol_port = '22' - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.GET, self.POOLS_URL, - body=self.POOLS) - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(member.CreateMember, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new member: -id="a9254bdb" -name="nameo" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(member.DeleteMember, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted member: nameo\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.page_size = None - pargs.sort_key = [] - pargs.sort_dir = [] - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(member.ListMember, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,status -a9254bdb,ACTIVE -b8408dgd,ACTIVE -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(member.SetMember, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(member.ShowMember, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="nameo" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/lb/test_pool_integration.py b/openstackclient/tests/network/v2_0/lb/test_pool_integration.py deleted file mode 100644 index 59274ca83c..0000000000 --- a/openstackclient/tests/network/v2_0/lb/test_pool_integration.py +++ /dev/null @@ -1,234 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0.lb import pool -from openstackclient.tests.network.v2_0 import common - - -class TestPoolIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - AGENTS_URL = HOSTESS + "/agents/foo/loadbalancer-pools.json" - POOLS_URL = HOSTESS + "/lb/pools.json" - POOLS = '{ "pools": [{ "id": "1111111" }] }' - SUBNETS_URL = HOSTESS + "/subnets.json" - SUBNETS = '{ "subnets": [{ "id": "222222" }] }' - CREATE_URL = HOSTESS + "/lb/pools.json" - CREATE = """ -{ - "pool": - { - "status": "ACTIVE", - "name": "nameo", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/lb/pools/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/lb/pools.json" - LIST_ONE = '{ "pools": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "pools": [ - { - "status": "ACTIVE", - "name": "nameo", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/lb/pools/a9254bdb.json" - SHOW_AGENT_URL = HOSTESS + "/lb/pools/a9254bdb/loadbalancer-agent.json" - SHOW_AGENT = """ -{ - "agent": { - "admin_state_up": true, - "agent_type": "Loadbalancer agent", - "alive": true, - "binary": "neutron-loadbalancer-agent", - "configurations": { - "device_driver": "neutron.services.HaproxyNSDriver", - "devices": 0, - "interface_driver": "neutron.agent.OVSInterfaceDriver" - }, - "created_at": "2013-10-01 12:50:13", - "description": null, - "heartbeat_timestamp": "2013-10-01 12:56:29", - "host": "ostack02", - "id": "6ee1df7f-bae4-4ee9-910a-d33b000773b0", - "started_at": "2013-10-01 12:50:13", - "topic": "lbaas_process_on_host_agent" - } -}""" - SHOW = CREATE - STATS_URL = HOSTESS + "/lb/pools/nameo/stats.json" - STATS = """ -{ - "stats" : { - "bytes_in" : 36839202, - "bytes_out" : 673193022, - "active_connections" : 39, - "total_connections" : 682 - } -}""" - ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" - ADD_REMOVE = "{}" - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'nameo' - pargs.admin_state = True - pargs.description = None - pargs.lb_method = 'LEAST_CONNECTIONS' - pargs.protocol = 'TCP' - pargs.subnet_id = 'subby' - pargs.provider = 'ryder' - pargs.tenant_id = '33a40233' - #httpretty.register_uri(httpretty.GET, self.POOLS_URL, - # body=self.POOLS) - httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, - body=self.SUBNETS) - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(pool.CreatePool, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new pool: -id="a9254bdb" -name="nameo" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(pool.DeletePool, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted pool: nameo\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.lbaas_agent = None - pargs.page_size = None - pargs.sort_key = [] - pargs.sort_dir = [] - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(pool.ListPool, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name,status -a9254bdb,nameo,ACTIVE -b8408dgd,croc,ACTIVE -""", self.stdout()) - - @httpretty.activate - def test_list_lbaas_agent(self): - pargs = common.FakeParsedArgs() - pargs.lbaas_agent = 'foo' - pargs.page_size = None - pargs.sort_key = [] - pargs.sort_dir = [] - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.AGENTS_URL, - body=self.LIST) - self.when_run(pool.ListPool, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name,status -a9254bdb,nameo,ACTIVE -b8408dgd,croc,ACTIVE -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(pool.SetPool, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.pool = 'nameo' - pargs.agent = False - pargs.stats = False - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(pool.ShowPool, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="nameo" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_show_agent(self): - pargs = common.FakeParsedArgs() - pargs.pool = 'nameo' - pargs.agent = True - pargs.stats = False - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_AGENT_URL, - body=self.SHOW_AGENT) - self.when_run(pool.ShowPool, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="(u'6ee1df7f-bae4-4ee9-910a-d33b000773b0', u'ostack02', True, ':-)')" -""", self.stdout()) - - @httpretty.activate - def test_show_stats(self): - pargs = common.FakeParsedArgs() - pargs.pool = 'nameo' - pargs.agent = False - pargs.stats = True - httpretty.register_uri(httpretty.GET, self.STATS_URL, - body=self.STATS) - self.when_run(pool.ShowPool, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -active_connections="39" -bytes_in="36839202" -bytes_out="673193022" -total_connections="682" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/lb/test_vip_integration.py b/openstackclient/tests/network/v2_0/lb/test_vip_integration.py deleted file mode 100644 index 9e1c655f83..0000000000 --- a/openstackclient/tests/network/v2_0/lb/test_vip_integration.py +++ /dev/null @@ -1,149 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0.lb import vip -from openstackclient.tests.network.v2_0 import common - - -class TestVipIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - POOLS_URL = HOSTESS + "/lb/pools.json" - POOLS = '{ "pools": [{ "id": "1111111" }] }' - SUBNETS_URL = HOSTESS + "/subnets.json" - SUBNETS = '{ "subnets": [{ "id": "222222" }] }' - CREATE_URL = HOSTESS + "/lb/vips.json" - CREATE = """ -{ - "vip": - { - "status": "ACTIVE", - "name": "nameo", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/lb/vips/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/lb/vips.json" - LIST_ONE = '{ "vips": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "vips": [ - { - "status": "ACTIVE", - "name": "nameo", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/lb/vips/a9254bdb.json" - SHOW = CREATE - ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" - ADD_REMOVE = "{}" - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'nameo' - pargs.pool_id = 'swimming' - pargs.address = '127.0.0.1' - pargs.admin_state = True - pargs.connection_limit = '10' - pargs.description = None - pargs.protocol_port = '22' - pargs.protocol = 'TCP' - pargs.subnet_id = 'subby' - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.GET, self.POOLS_URL, - body=self.POOLS) - httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, - body=self.SUBNETS) - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(vip.CreateVip, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new vip: -id="a9254bdb" -name="nameo" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(vip.DeleteVip, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted vip: nameo\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.page_size = None - pargs.sort_key = [] - pargs.sort_dir = [] - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(vip.ListVip, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name,status -a9254bdb,nameo,ACTIVE -b8408dgd,croc,ACTIVE -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(vip.SetVip, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'nameo' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(vip.ShowVip, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="nameo" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_dhcp_integration.py b/openstackclient/tests/network/v2_0/test_dhcp_integration.py deleted file mode 100644 index 5441acd4be..0000000000 --- a/openstackclient/tests/network/v2_0/test_dhcp_integration.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0 import dhcp -from openstackclient.tests.network.v2_0 import common - - -class TestGatewayIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - NETWORK_URL = HOSTESS + "/networks.json" - NETWORK_ONE = '{ "networks": [{ "id": "12312311" }]}' - ADD_URL = HOSTESS + "/agents/cash/dhcp-networks.json" - ADD = """ -{ - "agent": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - REMOVE_URL = HOSTESS + "/agents/nelson/dhcp-networks/12312311.json" - REMOVE = "{}" - LIST_URL = HOSTESS + "/networks/12312311/dhcp-agents.json" - LIST = """ -{ - "agents": [ - { - "status": "ACTIVE", - "host": "gator", - "tenant_id": "33a40233", - "admin_state_up": "true", - "alive": false, - "id": "a9254bdb" - }, - { - "host": "croc", - "tenant_id": "33a40233", - "admin_state_up": "true", - "alive": true, - "id": "b8408dgd" - } - ] -}""" - - @httpretty.activate - def test_add(self): - pargs = common.FakeParsedArgs() - pargs.network = 'johnny' - pargs.dhcp_agent = 'cash' - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.GET, self.NETWORK_URL, - body=self.NETWORK_ONE) - httpretty.register_uri(httpretty.POST, self.ADD_URL, - body=self.ADD) - self.when_run(dhcp.AddNetworkDhcpAgent, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Added network johnny to DHCP agent\n', - self.stdout()) - - @httpretty.activate - def test_remove(self): - pargs = common.FakeParsedArgs() - pargs.network = 'willie' - pargs.dhcp_agent = 'nelson' - httpretty.register_uri(httpretty.GET, self.NETWORK_URL, - body=self.NETWORK_ONE) - httpretty.register_uri(httpretty.DELETE, self.REMOVE_URL, - body=self.REMOVE) - self.when_run(dhcp.RemoveNetworkDhcpAgent, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Removed network willie to DHCP agent\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.network = 'range' - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.NETWORK_URL, - body=self.NETWORK_ONE) - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(dhcp.ListDhcpAgent, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,host,admin_state_up,alive -a9254bdb,gator,true,xxx -b8408dgd,croc,true,:-) -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_floatingip_integration.py b/openstackclient/tests/network/v2_0/test_floatingip_integration.py deleted file mode 100644 index 68fb986842..0000000000 --- a/openstackclient/tests/network/v2_0/test_floatingip_integration.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0 import floatingip -from openstackclient.tests.network.v2_0 import common - - -class TestFloatingIpIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - NETWORK_URL = HOSTESS + "/networks.json" - NETWORK_ONE = '{ "networks": [{ "id": "2222223" }] }' - CREATE_URL = HOSTESS + "/floatingips.json" - CREATE = """ -{ - "floatingip": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/floatingips/gator.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/floatingips.json" - LIST_ONE = '{ "floatingips": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "floatingips": [ - { - "id": "a9254bdb", - "fixed_ip_address": "10.1.1.1", - "floating_ip_address": "15.1.1.2", - "port_id": "9090909", - "tenant_id": "33a40233" - }, - { - "id": "b8408dgd", - "fixed_ip_address": "10.1.1.2", - "floating_ip_address": "15.1.1.3", - "port_id": "8080808", - "tenant_id": "33a40233" - } - ] -}""" - SHOW_URL = HOSTESS + "/floatingips/gator.json" - SHOW = CREATE - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - pargs.floating_network_id = '123123' - pargs.port_id = '7777899' - pargs.fixed_ip_address = None - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.GET, self.NETWORK_URL, - body=self.NETWORK_ONE) - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(floatingip.CreateFloatingIp, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new floatingip: -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(floatingip.DeleteFloatingIp, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted floatingip: gator\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(floatingip.ListFloatingIp, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,fixed_ip_address,floating_ip_address,port_id -a9254bdb,10.1.1.1,15.1.1.2,9090909 -b8408dgd,10.1.1.2,15.1.1.3,8080808 -""", self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(floatingip.ShowFloatingIp, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_gateway_integration.py b/openstackclient/tests/network/v2_0/test_gateway_integration.py deleted file mode 100644 index e66dac5716..0000000000 --- a/openstackclient/tests/network/v2_0/test_gateway_integration.py +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0 import gateway -from openstackclient.tests.network.v2_0 import common - - -class TestGatewayIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - CREATE_URL = HOSTESS + "/network-gateways.json" - CREATE = """ -{ - "network_gateway": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/network-gateways/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/network-gateways.json" - LIST_ONE = """ -{ - "network_gateways": [{ - "id": "a9254bdb" - }] -}""" - LIST = """ -{ - "network_gateways": [ - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/network-gateways/a9254bdb.json" - SHOW = CREATE - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - pargs.device = [] - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(gateway.CreateGateway, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new network_gateway: -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(gateway.DeleteGateway, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted network_gateway: gator\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(gateway.ListGateway, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name -a9254bdb,gator -b8408dgd,croc -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(gateway.SetGateway, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(gateway.ShowGateway, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_network_integration.py b/openstackclient/tests/network/v2_0/test_network_integration.py deleted file mode 100644 index 477d11bf95..0000000000 --- a/openstackclient/tests/network/v2_0/test_network_integration.py +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0 import network -from openstackclient.tests.network.v2_0 import common - - -class TestNetworkIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - SUBNETS_URL = HOSTESS + "/subnets.json" - SUBNETS_ONE = '{ "subnets": [{ "id": "12312311" }]}' - GATEWAY_URL = HOSTESS + "/network-gateways.json" - GATEWAY_ONE = '{ "network_gateways": [{ "id": "88888888" }]}' - DHCP_URL = HOSTESS + "/agents/orange/dhcp-networks.json" - CREATE_URL = HOSTESS + "/networks.json" - CREATE = """ -{ - "network": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/networks/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/networks.json" - LIST_ONE = """ -{ - "networks": [{ - "id": "a9254bdb" - }] -}""" - LIST = """ -{ - "networks": [ - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/networks/a9254bdb.json" - SHOW = CREATE - CONNECT_URL = HOSTESS + "/network-gateways/88888888/connect_network.json" - CONNECT = "{}" - DISCONNECT_URL = HOSTESS + \ - "/network-gateways/88888888/disconnect_network.json" - DISCONNECT = "{}" - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - pargs.admin_state = True - pargs.shared = True - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(network.CreateNetwork, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new network: -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(network.DeleteNetwork, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted network: gator\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - pargs.external = False - pargs.dhcp_agent = None - httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, - body=self.SUBNETS_ONE) - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(network.ListNetwork, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name -a9254bdb,gator -b8408dgd,croc -""", self.stdout()) - - @httpretty.activate - def test_list_external(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - pargs.external = True - pargs.dhcp_agent = None - httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, - body=self.SUBNETS_ONE) - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(network.ListNetwork, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name -a9254bdb,gator -b8408dgd,croc -""", self.stdout()) - - @httpretty.activate - def test_list_dhcp_agent(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - pargs.external = False - pargs.dhcp_agent = 'orange' - httpretty.register_uri(httpretty.GET, self.DHCP_URL, - body=self.LIST) - httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, - body=self.SUBNETS_ONE) - self.when_run(network.ListNetwork, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name -a9254bdb,gator -b8408dgd,croc -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(network.SetNetwork, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(network.ShowNetwork, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_add_gateway(self): - pargs = common.FakeParsedArgs() - pargs.network_id = 'gator' - pargs.net_gateway_id = 'way' - pargs.segmentation_type = None - pargs.segmentation_id = None - httpretty.register_uri(httpretty.GET, self.GATEWAY_URL, - body=self.GATEWAY_ONE) - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.PUT, self.CONNECT_URL, - body=self.CONNECT) - self.when_run(network.AddGatewayNetwork, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Connected network to gateway 88888888\n', - self.stdout()) - - @httpretty.activate - def test_remove_gateway(self): - pargs = common.FakeParsedArgs() - pargs.network_id = 'gator' - pargs.net_gateway_id = 'way' - pargs.segmentation_type = None - pargs.segmentation_id = None - httpretty.register_uri(httpretty.GET, self.GATEWAY_URL, - body=self.GATEWAY_ONE) - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.PUT, self.DISCONNECT_URL, - body=self.DISCONNECT) - self.when_run(network.RemoveGatewayNetwork, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Disconnected network from gateway 88888888\n', - self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_port_integration.py b/openstackclient/tests/network/v2_0/test_port_integration.py deleted file mode 100644 index ffaf2007e1..0000000000 --- a/openstackclient/tests/network/v2_0/test_port_integration.py +++ /dev/null @@ -1,174 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0 import port -from openstackclient.tests.network.v2_0 import common - - -class TestPortIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - NETWORK_URL = HOSTESS + "/networks.json" - NETWORK = '{ "networks": [{ "id": "1111111" }] }' - ROUTER_URL = HOSTESS + "/routers.json" - ROUTER = '{ "routers": [{ "id": "22222222" }] }' - CREATE_URL = HOSTESS + "/ports.json" - CREATE = """ -{ - "port": - { - "status": "ACTIVE", - "name": "puerto", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/ports/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/ports.json" - LIST_ONE = '{ "ports": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "ports": [ - { - "status": "ACTIVE", - "name": "puerto", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/ports/a9254bdb.json" - SHOW = CREATE - ADD_REMOVE_URL = HOSTESS + "/floatingips/127.0.0.1.json" - ADD_REMOVE = "{}" - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'puerto' - pargs.network_id = '44444448' - pargs.admin_state = 'UP' - pargs.mac_address = '1231233212' - pargs.device_id = '1231231237' - pargs.fixed_ip = None - pargs.security_groups = None - pargs.no_security_groups = False - pargs.extra_dhcp_opts = None - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.GET, self.NETWORK_URL, - body=self.NETWORK) - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(port.CreatePort, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new port: -id="a9254bdb" -name="puerto" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'puerto' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(port.DeletePort, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted port: puerto\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.router = 'roo' - pargs.page_size = None - pargs.sort_key = [] - pargs.sort_dir = [] - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.ROUTER_URL, - body=self.ROUTER) - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(port.ListPort, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name -a9254bdb,puerto -b8408dgd,croc -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'puerto' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(port.SetPort, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'puerto' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(port.ShowPort, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="puerto" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_add(self): - pargs = common.FakeParsedArgs() - pargs.port_id = 'puerto' - pargs.floatingip_id = '127.0.0.1' - pargs.fixed_ip_address = None - httpretty.register_uri(httpretty.PUT, self.ADD_REMOVE_URL, - body=self.ADD_REMOVE) - self.when_run(port.AddPort, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Associated floatingip 127.0.0.1\n', self.stdout()) - - @httpretty.activate - def test_remove(self): - pargs = common.FakeParsedArgs() - pargs.port_id = 'puerto' - pargs.floatingip_id = '127.0.0.1' - httpretty.register_uri(httpretty.PUT, self.ADD_REMOVE_URL, - body=self.ADD_REMOVE) - self.when_run(port.RemovePort, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Disassociated floatingip 127.0.0.1\n', - self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_router_integration.py b/openstackclient/tests/network/v2_0/test_router_integration.py deleted file mode 100644 index 761d2bd1b7..0000000000 --- a/openstackclient/tests/network/v2_0/test_router_integration.py +++ /dev/null @@ -1,244 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0 import router -from openstackclient.tests.network.v2_0 import common - - -class TestShowRouterIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - SUBNET_URL = HOSTESS + "/subnets.json" - SUBNET_ONE = '{ "subnets": [{ "id": "45456777" }] }' - PORT_URL = HOSTESS + "/ports.json" - PORT_ONE = '{ "ports": [{ "id": "23422222" }] }' - CREATE_URL = HOSTESS + "/routers.json" - CREATE = """ -{ - "router": - { - "status": "ACTIVE", - "name": "rooty", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/routers/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/routers.json" - LIST_ONE = '{ "routers": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "routers": [ - { - "status": "ACTIVE", - "name": "rooty", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - LIST_L3_URL = HOSTESS + "/agents/elthree/l3-routers.json" - LIST_L3 = """ -{ - "routers": [ - { - "status": "ACTIVE", - "external_gateway_info": {}, - "name": "rooty", - "admin_state_up": true, - "tenant_id": "3671f46ec35e4bbca6ef92ab7975e463", - "routes": [], - "id": "8eef2388" - } - ] -}""" - SHOW_URL = HOSTESS + "/routers/a9254bdb.json" - SHOW = CREATE - ADD_URL = HOSTESS + "/routers/a9254bdb/add_router_interface.json" - ADD = """ -{ - "subnet_id": "45456777", - "port_id": "93939392" -}""" - REMOVE_URL = HOSTESS + "/routers/a9254bdb/remove_router_interface.json" - REMOVE = "{}" - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'rooty' - pargs.admin_state = 'ACTIVE' - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(router.CreateRouter, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new router: -id="a9254bdb" -name="rooty" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'rooty' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(router.DeleteRouter, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted router: rooty\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - pargs.l3_agent = None - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(router.ListRouter, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name -a9254bdb,rooty -b8408dgd,croc -""", self.stdout()) - - @httpretty.activate - def test_list_l3(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - pargs.l3_agent = 'elthree' - httpretty.register_uri(httpretty.GET, self.LIST_L3_URL, - body=self.LIST_L3) - self.when_run(router.ListRouter, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name,external_gateway_info -8eef2388,rooty,{} -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'rooty' - pargs.router_id = '88888823' - pargs.no_gateway = True - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.PUT, self.SHOW_URL, - body=self.SHOW) - self.when_run(router.SetRouter, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Removed gateway from router 88888823\n', - self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'rooty' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(router.ShowRouter, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="rooty" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_add_subnet(self): - pargs = common.FakeParsedArgs() - pargs.router_id = 'rooty' - pargs.interface = 'subby' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SUBNET_URL, - body=self.SUBNET_ONE) - httpretty.register_uri(httpretty.PUT, self.ADD_URL, - body=self.ADD) - expected_body = '{"subnet_id": "45456777"}' - self.when_run(router.AddSubnetRouter, pargs, expected_body) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Added interface 93939392 to router rooty.\n', - self.stdout()) - - @httpretty.activate - def test_remove_subnet(self): - pargs = common.FakeParsedArgs() - pargs.router_id = 'rooty' - pargs.interface = 'subby' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SUBNET_URL, - body=self.SUBNET_ONE) - httpretty.register_uri(httpretty.PUT, self.REMOVE_URL, - body=self.REMOVE) - expected_body = '{"subnet_id": "45456777"}' - self.when_run(router.RemoveSubnetRouter, pargs, expected_body) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Removed interface from router rooty.\n', - self.stdout()) - - @httpretty.activate - def test_add_port(self): - pargs = common.FakeParsedArgs() - pargs.router_id = 'rooty' - pargs.port = 'puerto' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.PORT_URL, - body=self.PORT_ONE) - httpretty.register_uri(httpretty.PUT, self.ADD_URL, - body=self.ADD) - expected_body = '{"port_id": "23422222"}' - self.when_run(router.AddPortRouter, pargs, expected_body) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Added interface 93939392 to router rooty.\n', - self.stdout()) - - @httpretty.activate - def test_remove_port(self): - pargs = common.FakeParsedArgs() - pargs.router_id = 'rooty' - pargs.port = 'puerto' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.PORT_URL, - body=self.PORT_ONE) - httpretty.register_uri(httpretty.PUT, self.REMOVE_URL, - body=self.REMOVE) - expected_body = '{"port_id": "23422222"}' - self.when_run(router.RemovePortRouter, pargs, expected_body) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Removed interface from router rooty.\n', - self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_security_group_integration.py b/openstackclient/tests/network/v2_0/test_security_group_integration.py deleted file mode 100644 index f19d9431f0..0000000000 --- a/openstackclient/tests/network/v2_0/test_security_group_integration.py +++ /dev/null @@ -1,131 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0 import security_group -from openstackclient.tests.network.v2_0 import common - - -class TestSecurityGroupIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - CREATE_URL = HOSTESS + "/security-groups.json" - CREATE = """ -{ - "security_group": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/security-groups/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/security-groups.json" - LIST_ONE = '{ "security_groups": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "security_groups": [ - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/security-groups/a9254bdb.json" - SHOW = CREATE - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - pargs.description = 'groupo' - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(security_group.CreateSecurityGroup, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new security_group: -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(security_group.DeleteSecurityGroup, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted security_group: gator\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(security_group.ListSecurityGroup, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name -a9254bdb,gator -b8408dgd,croc -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(security_group.SetSecurityGroup, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(security_group.ShowSecurityGroup, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_security_group_rule_integration.py b/openstackclient/tests/network/v2_0/test_security_group_rule_integration.py deleted file mode 100644 index 86f73947ce..0000000000 --- a/openstackclient/tests/network/v2_0/test_security_group_rule_integration.py +++ /dev/null @@ -1,137 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0 import security_group_rule -from openstackclient.tests.network.v2_0 import common - - -class TestSecurityGroupRuleIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - SECURITY_GROUP_URL = HOSTESS + "/security-groups.json" - SECURITY_GROUP = '{ "security_groups": [{ "id": "9393939" }] }' - CREATE_URL = HOSTESS + "/security-group-rules.json" - CREATE = """ -{ - "security_group_rule": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/security-group-rules/gator.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/security-group-rules.json" - LIST_ONE = '{ "security_group_rules": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "security_group_rules": [ - { - "id": "a9254bdb", - "security_group_id": "44444444", - "direction": "egress", - "protocol": "TCP", - "remote_ip_prefix": "127.0.0.0/24", - "remote_group_id": "2222222", - "tenant_id": "33a40233" - }, - { - "id": "a9254bdb", - "security_group_id": "55555555", - "direction": "ingress", - "protocol": "UDP", - "remote_ip_prefix": "10.0.0.0/24", - "remote_group_id": "", - "tenant_id": "33a40233" - } - ] -}""" - SHOW_URL = HOSTESS + "/security-group-rules/gator.json" - SHOW = CREATE - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - pargs.security_group_id = 'sg1' - pargs.direction = 'ingress' - pargs.ethertype = 'IPv4' - pargs.protocol = 'TCP' - pargs.port_range_min = '0' - pargs.port_range_max = '1000' - pargs.remote_ip_prefix = '20.1.2.1/24' - pargs.remote_group_id = None - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.GET, self.SECURITY_GROUP_URL, - body=self.SECURITY_GROUP) - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(security_group_rule.CreateSecurityGroupRule, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new security_group_rule: -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(security_group_rule.DeleteSecurityGroupRule, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted security_group_rule: gator\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - pargs.no_nameconv = True - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(security_group_rule.ListSecurityGroupRule, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,security_group_id,direction,protocol,remote_ip_prefix,remote_group_id -a9254bdb,44444444,egress,TCP,127.0.0.0/24,2222222 -a9254bdb,55555555,ingress,UDP,10.0.0.0/24, -""", self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(security_group_rule.ShowSecurityGroupRule, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/test_subnet_integration.py b/openstackclient/tests/network/v2_0/test_subnet_integration.py deleted file mode 100644 index f17e0b5fa5..0000000000 --- a/openstackclient/tests/network/v2_0/test_subnet_integration.py +++ /dev/null @@ -1,141 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0 import subnet -from openstackclient.tests.network.v2_0 import common - - -class TestSubnetIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - NETWORKS_URL = HOSTESS + "/networks.json" - NETWORK_ONE = '{ "networks": [{ "id": "99999999" }]}' - CREATE_URL = HOSTESS + "/subnets.json" - CREATE = """ -{ - "subnet": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/subnets/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/subnets.json" - LIST_ONE = '{ "subnets": [{ "id": "a9254bdb" }] }' - LIST = """ -{ - "subnets": [ - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/subnets/a9254bdb.json" - SHOW = CREATE - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - pargs.network_id = 'netty' - pargs.cidr = '123.4.5.0/24' - pargs.ip_version = '4' - pargs.gateway = 'cisco' - pargs.no_gateway = False - pargs.disable_dhcp = False - pargs.allocation_pools = None - pargs.host_routes = None - pargs.dns_nameservers = None - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.GET, self.NETWORKS_URL, - body=self.NETWORK_ONE) - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(subnet.CreateSubnet, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new subnet: -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(subnet.DeleteSubnet, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted subnet: gator\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(subnet.ListSubnet, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name -a9254bdb,gator -b8408dgd,croc -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(subnet.SetSubnet, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(subnet.ShowSubnet, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy_integration.py b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy_integration.py deleted file mode 100644 index 7359818fd1..0000000000 --- a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy_integration.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0.vpn import ikepolicy -from openstackclient.tests.network.v2_0 import common - - -class TestIkepolicyIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - CREATE_URL = HOSTESS + "/vpn/ikepolicies.json" - CREATE = """ -{ - "ikepolicy": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/vpn/ikepolicies/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/vpn/ikepolicies.json" - LIST_ONE = """ -{ - "ikepolicies": [{ - "id": "a9254bdb" - }] -}""" - LIST = """ -{ - "ikepolicies": [ - { - "name": "gator", - "tenant_id": "33a40233", - "auth_algorithm": "sha1", - "encryption_algorithm": "aes-128", - "ike_version": "v1", - "pfs": "group5", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "name": "croc", - "auth_algorithm": "sha1", - "encryption_algorithm": "aes-128", - "ike_version": "v2", - "pfs": "group5", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/vpn/ikepolicies/a9254bdb.json" - SHOW = CREATE - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - pargs.description = 'gatorific' - pargs.auth_algorithm = 'sha1' - pargs.encryption_algorithm = 'aes-128' - pargs.phase1_negotiation_mode = 'main' - pargs.ike_version = 'v2' - pargs.pfs = 'group5' - pargs.lifetime = {'units': 'seconds', 'value': '200'} - pargs.tenant_id = '999999' - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(ikepolicy.CreateIkepolicy, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new ikepolicy: -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(ikepolicy.DeleteIkepolicy, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted ikepolicy: gator\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(ikepolicy.ListIkepolicy, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name,auth_algorithm,encryption_algorithm,ike_version,pfs -a9254bdb,gator,sha1,aes-128,v1,group5 -b8408dgd,croc,sha1,aes-128,v2,group5 -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(ikepolicy.SetIkepolicy, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(ikepolicy.ShowIkepolicy, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy_integration.py b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy_integration.py deleted file mode 100644 index b407cb42de..0000000000 --- a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy_integration.py +++ /dev/null @@ -1,145 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0.vpn import ipsecpolicy -from openstackclient.tests.network.v2_0 import common - - -class TestIpsecpolicyIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - CREATE_URL = HOSTESS + "/vpn/ipsecpolicies.json" - CREATE = """ -{ - "ipsecpolicy": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/vpn/ipsecpolicies/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/vpn/ipsecpolicies.json" - LIST_ONE = """ -{ - "ipsecpolicies": [{ - "id": "a9254bdb" - }] -}""" - LIST = """ -{ - "ipsecpolicies": [ - { - "name": "gator", - "tenant_id": "33a40233", - "auth_algorithm": "sha1", - "encryption_algorithm": "aes-128", - "pfs": "group5", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "name": "croc", - "auth_algorithm": "sha1", - "encryption_algorithm": "aes-128", - "pfs": "group5", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/vpn/ipsecpolicies/a9254bdb.json" - SHOW = CREATE - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - pargs.description = 'gatorific' - pargs.transform_protocol = 'esp' - pargs.auth_algorithm = 'sha1' - pargs.encryption_algorithm = 'aes-128' - pargs.encapsulation_mode = 'tunnel' - pargs.pfs = 'group5' - pargs.lifetime = {'units': 'seconds', 'value': '200'} - pargs.tenant_id = '999999' - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(ipsecpolicy.CreateIpsecpolicy, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new ipsecpolicy: -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(ipsecpolicy.DeleteIpsecpolicy, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted ipsecpolicy: gator\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(ipsecpolicy.ListIpsecpolicy, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name,auth_algorithm,encryption_algorithm,pfs -a9254bdb,gator,sha1,aes-128,group5 -b8408dgd,croc,sha1,aes-128,group5 -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(ipsecpolicy.SetIpsecpolicy, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(ipsecpolicy.ShowIpsecpolicy, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) diff --git a/openstackclient/tests/network/v2_0/vpn/test_service_integration.py b/openstackclient/tests/network/v2_0/vpn/test_service_integration.py deleted file mode 100644 index f804084152..0000000000 --- a/openstackclient/tests/network/v2_0/vpn/test_service_integration.py +++ /dev/null @@ -1,144 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# - -import httpretty - -from openstackclient.network.v2_0.vpn import service -from openstackclient.tests.network.v2_0 import common - - -class TestServiceIntegration(common.TestIntegrationBase): - HOSTESS = common.TestIntegrationBase.HOST + common.TestIntegrationBase.VER - SUBNETS_URL = HOSTESS + "/subnets.json" - SUBNETS_ONE = '{ "subnets": [{ "id": "12312311" }]}' - ROUTERS_URL = HOSTESS + "/routers.json" - ROUTERS_ONE = '{ "routers": [{ "id": "33333333" }]}' - CREATE_URL = HOSTESS + "/vpn/vpnservices.json" - CREATE = """ -{ - "vpnservice": - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - } -}""" - DELETE_URL = HOSTESS + "/vpn/vpnservices/a9254bdb.json" - DELETE = "{}" - LIST_URL = HOSTESS + "/vpn/vpnservices.json" - LIST_ONE = """ -{ - "vpnservices": [{ - "id": "a9254bdb" - }] -}""" - LIST = """ -{ - "vpnservices": [ - { - "status": "ACTIVE", - "name": "gator", - "tenant_id": "33a40233", - "id": "a9254bdb" - }, - { - "status": "ACTIVE", - "name": "croc", - "tenant_id": "33a40233", - "id": "b8408dgd" - } - ] -}""" - SHOW_URL = HOSTESS + "/vpn/vpnservices/a9254bdb.json" - SHOW = CREATE - - @httpretty.activate - def test_create(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - pargs.subnet = 'subby' - pargs.router = 'rooty' - pargs.admin_state = True - pargs.tenant_id = '33a40233' - httpretty.register_uri(httpretty.GET, self.SUBNETS_URL, - body=self.SUBNETS_ONE) - httpretty.register_uri(httpretty.GET, self.ROUTERS_URL, - body=self.ROUTERS_ONE) - httpretty.register_uri(httpretty.POST, self.CREATE_URL, - body=self.CREATE) - self.when_run(service.CreateService, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -Created a new vpnservice: -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) - - @httpretty.activate - def test_delete(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.DELETE, self.DELETE_URL, - body=self.DELETE) - self.when_run(service.DeleteService, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u'Deleted vpnservice: gator\n', - self.stdout()) - - @httpretty.activate - def test_list(self): - pargs = common.FakeParsedArgs() - pargs.formatter = 'csv' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST) - self.when_run(service.ListService, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual("""\ -id,name,status -a9254bdb,gator,ACTIVE -b8408dgd,croc,ACTIVE -""", self.stdout()) - - @httpretty.activate - def test_set(self): - pargs = common.FakeParsedArgs() - pargs.name = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - self.when_run(service.SetService, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual('', self.stdout()) - - @httpretty.activate - def test_show(self): - pargs = common.FakeParsedArgs() - pargs.id = 'gator' - httpretty.register_uri(httpretty.GET, self.LIST_URL, - body=self.LIST_ONE) - httpretty.register_uri(httpretty.GET, self.SHOW_URL, - body=self.SHOW) - self.when_run(service.ShowService, pargs) - self.assertEqual('', self.stderr()) - self.assertEqual(u"""\ -id="a9254bdb" -name="gator" -status="ACTIVE" -tenant_id="33a40233" -""", self.stdout()) From 8f51eb3b6467b5d48b312dccf855256864268fa8 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Fri, 10 Jan 2014 14:35:45 -0700 Subject: [PATCH 50/66] move classes out of init --- openstackclient/network/common.py | 231 ++++++++++++++++++ openstackclient/network/v2_0/__init__.py | 216 ---------------- openstackclient/network/v2_0/dhcp.py | 8 +- openstackclient/network/v2_0/floatingip.py | 10 +- openstackclient/network/v2_0/fw/firewall.py | 12 +- openstackclient/network/v2_0/gateway.py | 12 +- .../network/v2_0/lb/healthmonitor.py | 16 +- openstackclient/network/v2_0/lb/member.py | 12 +- openstackclient/network/v2_0/lb/pool.py | 12 +- openstackclient/network/v2_0/lb/vip.py | 12 +- openstackclient/network/v2_0/network.py | 16 +- openstackclient/network/v2_0/port.py | 16 +- openstackclient/network/v2_0/router.py | 16 +- .../network/v2_0/security_group.py | 12 +- .../network/v2_0/security_group_rule.py | 10 +- openstackclient/network/v2_0/subnet.py | 12 +- openstackclient/network/v2_0/vpn/ikepolicy.py | 12 +- .../network/v2_0/vpn/ipsecpolicy.py | 12 +- openstackclient/network/v2_0/vpn/service.py | 12 +- test-requirements.txt | 1 - 20 files changed, 337 insertions(+), 323 deletions(-) create mode 100644 openstackclient/network/common.py diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py new file mode 100644 index 0000000000..eca81a2f99 --- /dev/null +++ b/openstackclient/network/common.py @@ -0,0 +1,231 @@ +# Copyright 2012-2013 OpenStack, LLC. +# +# 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. +# + +import logging + +from cliff import command +from cliff import lister +from cliff import show + + +class CreateCommand(show.ShowOne): + + log = logging.getLogger(__name__ + '.CreateCommand') + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(CreateCommand, self).get_parser(prog_name) + parser.add_argument( + '--project', + dest='tenant_id', + help='the owner project id') + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + parsed_args.request_format = 'json' + return neuter.take_action(parsed_args) + + +class DeleteCommand(command.Command): + + log = logging.getLogger(__name__ + '.DeleteCommand') + name = "id" + metavar = "" + help_text = "Identifier of object to delete" + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(DeleteCommand, self).get_parser(prog_name) + parser.add_argument( + self.name, + metavar=self.metavar, + help=self.help_text, + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + parsed_args.request_format = 'json' + return neuter.run(parsed_args) + + +class ListCommand(lister.Lister): + + log = logging.getLogger(__name__ + '.ListCommand') + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(ListCommand, self).get_parser(prog_name) + parser.add_argument( + '--long', + dest='show_details', + action='store_true', + default=False, + help='Long listing', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + parsed_args.request_format = 'json' + parsed_args.page_size = None + parsed_args.sort_key = [] + parsed_args.sort_dir = [] + parsed_args.fields = [] + return neuter.take_action(parsed_args) + + +class SetCommand(command.Command): + + log = logging.getLogger(__name__ + '.SetCommand') + name = "id" + metavar = "" + help_text = "Identifier of object to set" + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(SetCommand, self).get_parser(prog_name) + parser.add_argument( + '--project', + dest='tenant_id', + help='the owner project id') + parser.add_argument( + self.name, + metavar=self.metavar, + help=self.help_text, + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + parsed_args.request_format = 'json' + return neuter.take_action(parsed_args) + + +class ShowCommand(show.ShowOne): + + log = logging.getLogger(__name__ + '.ShowCommand') + name = "id" + metavar = "" + help_text = "Identifier of object to delete" + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(ShowCommand, self).get_parser(prog_name) + parser.add_argument( + self.name, + metavar=self.metavar, + help=self.help_text, + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + parsed_args.show_details = True + parsed_args.request_format = 'json' + parsed_args.fields = [] + return neuter.take_action(parsed_args) + + +class AddCommand(command.Command): + + log = logging.getLogger(__name__ + '.AddCommand') + container_name = "container_id" + container_metavar = "" + container_help_text = "Identifier of container" + name = "id" + metavar = "" + help_text = "Identifier of object to be added" + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(AddCommand, self).get_parser(prog_name) + parser.add_argument( + self.container_name, + metavar=self.container_metavar, + help=self.container_help_text, + ) + parser.add_argument( + self.name, + metavar=self.metavar, + help=self.help_text, + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + parsed_args.request_format = 'json' + return neuter.run(parsed_args) + + +class RemoveCommand(command.Command): + + log = logging.getLogger(__name__ + '.RemoveCommand') + container_name = "container_id" + container_metavar = "" + container_help_text = "Identifier of container" + name = "id" + metavar = "" + help_text = "Identifier of object to be removed" + + def get_client(self): + return self.app.client_manager.network + + def get_parser(self, prog_name): + parser = super(RemoveCommand, self).get_parser(prog_name) + if self.container_name: + parser.add_argument( + self.container_name, + metavar=self.container_metavar, + help=self.container_help_text, + ) + parser.add_argument( + self.name, + metavar=self.metavar, + help=self.help_text, + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + neuter = self.clazz(self.app, self.app_args) + neuter.get_client = self.get_client + parsed_args.request_format = 'json' + return neuter.run(parsed_args) diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py index b2499068a8..85ac2501b8 100644 --- a/openstackclient/network/v2_0/__init__.py +++ b/openstackclient/network/v2_0/__init__.py @@ -12,219 +12,3 @@ # License for the specific language governing permissions and limitations # under the License. # -import logging - -from cliff import command -from cliff import lister -from cliff import show - - -class CreateCommand(show.ShowOne): - - log = logging.getLogger(__name__ + '.CreateCommand') - - def get_client(self): - return self.app.client_manager.network - - def get_parser(self, prog_name): - parser = super(CreateCommand, self).get_parser(prog_name) - parser.add_argument( - '--project', - dest='tenant_id', - help='the owner project id') - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - return neuter.take_action(parsed_args) - - -class DeleteCommand(command.Command): - - log = logging.getLogger(__name__ + '.DeleteCommand') - name = "id" - metavar = "" - help_text = "Identifier of object to delete" - - def get_client(self): - return self.app.client_manager.network - - def get_parser(self, prog_name): - parser = super(DeleteCommand, self).get_parser(prog_name) - parser.add_argument( - self.name, - metavar=self.metavar, - help=self.help_text, - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - return neuter.run(parsed_args) - - -class ListCommand(lister.Lister): - - log = logging.getLogger(__name__ + '.ListCommand') - - def get_client(self): - return self.app.client_manager.network - - def get_parser(self, prog_name): - parser = super(ListCommand, self).get_parser(prog_name) - parser.add_argument( - '--long', - dest='show_details', - action='store_true', - default=False, - help='Long listing', - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - parsed_args.page_size = None - parsed_args.sort_key = [] - parsed_args.sort_dir = [] - parsed_args.fields = [] - return neuter.take_action(parsed_args) - - -class SetCommand(command.Command): - - log = logging.getLogger(__name__ + '.SetCommand') - name = "id" - metavar = "" - help_text = "Identifier of object to set" - - def get_client(self): - return self.app.client_manager.network - - def get_parser(self, prog_name): - parser = super(SetCommand, self).get_parser(prog_name) - parser.add_argument( - '--project', - dest='tenant_id', - help='the owner project id') - parser.add_argument( - self.name, - metavar=self.metavar, - help=self.help_text, - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - return neuter.take_action(parsed_args) - - -class ShowCommand(show.ShowOne): - - log = logging.getLogger(__name__ + '.ShowCommand') - name = "id" - metavar = "" - help_text = "Identifier of object to delete" - - def get_client(self): - return self.app.client_manager.network - - def get_parser(self, prog_name): - parser = super(ShowCommand, self).get_parser(prog_name) - parser.add_argument( - self.name, - metavar=self.metavar, - help=self.help_text, - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.show_details = True - parsed_args.request_format = 'json' - parsed_args.fields = [] - return neuter.take_action(parsed_args) - - -class AddCommand(command.Command): - - log = logging.getLogger(__name__ + '.AddCommand') - container_name = "container_id" - container_metavar = "" - container_help_text = "Identifier of container" - name = "id" - metavar = "" - help_text = "Identifier of object to be added" - - def get_client(self): - return self.app.client_manager.network - - def get_parser(self, prog_name): - parser = super(AddCommand, self).get_parser(prog_name) - parser.add_argument( - self.container_name, - metavar=self.container_metavar, - help=self.container_help_text, - ) - parser.add_argument( - self.name, - metavar=self.metavar, - help=self.help_text, - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - return neuter.run(parsed_args) - - -class RemoveCommand(command.Command): - - log = logging.getLogger(__name__ + '.RemoveCommand') - container_name = "container_id" - container_metavar = "" - container_help_text = "Identifier of container" - name = "id" - metavar = "" - help_text = "Identifier of object to be removed" - - def get_client(self): - return self.app.client_manager.network - - def get_parser(self, prog_name): - parser = super(RemoveCommand, self).get_parser(prog_name) - if self.container_name: - parser.add_argument( - self.container_name, - metavar=self.container_metavar, - help=self.container_help_text, - ) - parser.add_argument( - self.name, - metavar=self.metavar, - help=self.help_text, - ) - return parser - - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - return neuter.run(parsed_args) diff --git a/openstackclient/network/v2_0/dhcp.py b/openstackclient/network/v2_0/dhcp.py index fa1f35f0a5..8cea252026 100644 --- a/openstackclient/network/v2_0/dhcp.py +++ b/openstackclient/network/v2_0/dhcp.py @@ -16,10 +16,10 @@ """Gateway action implementations""" from neutronclient.neutron.v2_0 import agentscheduler as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class AddNetworkDhcpAgent(v2_0.AddCommand): +class AddNetworkDhcpAgent(common.AddCommand): """Add a network to a DHCP agent.""" clazz = neu2.AddNetworkToDhcpAgent @@ -31,7 +31,7 @@ class AddNetworkDhcpAgent(v2_0.AddCommand): help_text = 'DHCP agent to add' -class RemoveNetworkDhcpAgent(v2_0.RemoveCommand): +class RemoveNetworkDhcpAgent(common.RemoveCommand): """Delete a gateway""" clazz = neu2.RemoveNetworkFromDhcpAgent @@ -43,7 +43,7 @@ class RemoveNetworkDhcpAgent(v2_0.RemoveCommand): help_text = 'DHCP agent to remove' -class ListDhcpAgent(v2_0.ListCommand): +class ListDhcpAgent(common.ListCommand): """List DHCP agents on a network""" clazz = neu2.ListDhcpAgentsHostingNetwork diff --git a/openstackclient/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py index 17fc2fd719..069c432c74 100644 --- a/openstackclient/network/v2_0/floatingip.py +++ b/openstackclient/network/v2_0/floatingip.py @@ -16,10 +16,10 @@ """FloatingIp action implementations""" from neutronclient.neutron.v2_0 import floatingip as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateFloatingIp(v2_0.CreateCommand): +class CreateFloatingIp(common.CreateCommand): """Create a floating IP""" clazz = neu2.CreateFloatingIP @@ -40,20 +40,20 @@ def get_parser(self, prog_name): return parser -class DeleteFloatingIp(v2_0.DeleteCommand): +class DeleteFloatingIp(common.DeleteCommand): """Delete a floating IP""" clazz = neu2.DeleteFloatingIP help_text = "Identifier of floating IP to delete" -class ListFloatingIp(v2_0.ListCommand): +class ListFloatingIp(common.ListCommand): """List floating IPs""" clazz = neu2.ListFloatingIP -class ShowFloatingIp(v2_0.ShowCommand): +class ShowFloatingIp(common.ShowCommand): """Show a floating IP""" clazz = neu2.ShowFloatingIP diff --git a/openstackclient/network/v2_0/fw/firewall.py b/openstackclient/network/v2_0/fw/firewall.py index 67a1538f16..17a41ae3fe 100644 --- a/openstackclient/network/v2_0/fw/firewall.py +++ b/openstackclient/network/v2_0/fw/firewall.py @@ -16,10 +16,10 @@ """Firewall action implementations""" from neutronclient.neutron.v2_0.fw import firewall as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateFirewall(v2_0.CreateCommand): +class CreateFirewall(common.CreateCommand): """Create a firewall""" clazz = neu2.CreateFirewall @@ -62,7 +62,7 @@ def get_parser(self, prog_name): return parser -class DeleteFirewall(v2_0.DeleteCommand): +class DeleteFirewall(common.DeleteCommand): """Delete a firewall""" clazz = neu2.DeleteFirewall @@ -71,13 +71,13 @@ class DeleteFirewall(v2_0.DeleteCommand): help_text = 'Name or ID of firewall to delete' -class ListFirewall(v2_0.ListCommand): +class ListFirewall(common.ListCommand): """List firewall""" clazz = neu2.ListFirewall -class SetFirewall(v2_0.SetCommand): +class SetFirewall(common.SetCommand): """Set firewall values""" clazz = neu2.UpdateFirewall @@ -86,7 +86,7 @@ class SetFirewall(v2_0.SetCommand): help_text = 'ID of firewall to update' -class ShowFirewall(v2_0.ShowCommand): +class ShowFirewall(common.ShowCommand): """Show a firewall""" clazz = neu2.ShowFirewall diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py index 4cb48c832b..3b505f2ccc 100644 --- a/openstackclient/network/v2_0/gateway.py +++ b/openstackclient/network/v2_0/gateway.py @@ -16,10 +16,10 @@ """Gateway action implementations""" from neutronclient.neutron.v2_0 import nvpnetworkgateway as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateGateway(v2_0.CreateCommand): +class CreateGateway(common.CreateCommand): """Create a gateway""" clazz = neu2.CreateNetworkGateway @@ -39,7 +39,7 @@ def get_parser(self, prog_name): return parser -class DeleteGateway(v2_0.DeleteCommand): +class DeleteGateway(common.DeleteCommand): """Delete a gateway""" clazz = neu2.DeleteNetworkGateway @@ -48,13 +48,13 @@ class DeleteGateway(v2_0.DeleteCommand): help_text = 'Name or ID of gateway to delete' -class ListGateway(v2_0.ListCommand): +class ListGateway(common.ListCommand): """List gateways""" clazz = neu2.ListNetworkGateway -class SetGateway(v2_0.SetCommand): +class SetGateway(common.SetCommand): """Set gateway values""" clazz = neu2.UpdateNetworkGateway @@ -63,7 +63,7 @@ class SetGateway(v2_0.SetCommand): help_text = 'Name or ID of gateway to set' -class ShowGateway(v2_0.ShowCommand): +class ShowGateway(common.ShowCommand): """Show a gateway""" clazz = neu2.ShowNetworkGateway diff --git a/openstackclient/network/v2_0/lb/healthmonitor.py b/openstackclient/network/v2_0/lb/healthmonitor.py index cd00cfaa86..4c2eddc384 100644 --- a/openstackclient/network/v2_0/lb/healthmonitor.py +++ b/openstackclient/network/v2_0/lb/healthmonitor.py @@ -16,10 +16,10 @@ """Load Balancer health monitor action implementations""" from neutronclient.neutron.v2_0.lb import healthmonitor as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateHealthMonitor(v2_0.CreateCommand): +class CreateHealthMonitor(common.CreateCommand): """Create a load balancer health monitor""" clazz = neu2.CreateHealthMonitor @@ -69,7 +69,7 @@ def get_parser(self, prog_name): return parser -class DeleteHealthMonitor(v2_0.DeleteCommand): +class DeleteHealthMonitor(common.DeleteCommand): """Delete a load balancer health monitor""" clazz = neu2.DeleteHealthMonitor @@ -78,13 +78,13 @@ class DeleteHealthMonitor(v2_0.DeleteCommand): help_text = 'Name or ID of load balancer health monitor to delete' -class ListHealthMonitor(v2_0.ListCommand): +class ListHealthMonitor(common.ListCommand): """List load balancer health monitor""" clazz = neu2.ListHealthMonitor -class SetHealthMonitor(v2_0.SetCommand): +class SetHealthMonitor(common.SetCommand): """Set load balancer health monitor values""" clazz = neu2.UpdateHealthMonitor @@ -93,7 +93,7 @@ class SetHealthMonitor(v2_0.SetCommand): help_text = 'Name or ID of load balancer health monitor to update' -class ShowHealthMonitor(v2_0.ShowCommand): +class ShowHealthMonitor(common.ShowCommand): """Show a load balancer health monitor""" clazz = neu2.ShowHealthMonitor @@ -102,7 +102,7 @@ class ShowHealthMonitor(v2_0.ShowCommand): help_text = 'Name or ID of health monitor to show' -class AddPool(v2_0.AddCommand): +class AddPool(common.AddCommand): """Add health monitor to a pool""" clazz = neu2.AssociateHealthMonitor @@ -114,7 +114,7 @@ class AddPool(v2_0.AddCommand): help_text = "health monitor to associate to pool" -class RemovePool(v2_0.RemoveCommand): +class RemovePool(common.RemoveCommand): """Remove a port or subnet from a router""" clazz = neu2.DisassociateHealthMonitor diff --git a/openstackclient/network/v2_0/lb/member.py b/openstackclient/network/v2_0/lb/member.py index 35fba5f2e6..aeb540df26 100644 --- a/openstackclient/network/v2_0/lb/member.py +++ b/openstackclient/network/v2_0/lb/member.py @@ -16,10 +16,10 @@ """Load Balancer member action implementations""" from neutronclient.neutron.v2_0.lb import member as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateMember(v2_0.CreateCommand): +class CreateMember(common.CreateCommand): """Create a load balancer member""" clazz = neu2.CreateMember @@ -48,7 +48,7 @@ def get_parser(self, prog_name): return parser -class DeleteMember(v2_0.DeleteCommand): +class DeleteMember(common.DeleteCommand): """Delete a load balancer member""" clazz = neu2.DeleteMember @@ -57,13 +57,13 @@ class DeleteMember(v2_0.DeleteCommand): help_text = 'Name or ID of load balancer member to delete' -class ListMember(v2_0.ListCommand): +class ListMember(common.ListCommand): """List load balancer member""" clazz = neu2.ListMember -class SetMember(v2_0.SetCommand): +class SetMember(common.SetCommand): """Set load balancer member values""" clazz = neu2.UpdateMember @@ -72,7 +72,7 @@ class SetMember(v2_0.SetCommand): help_text = 'Name or ID of load balancer member to update' -class ShowMember(v2_0.ShowCommand): +class ShowMember(common.ShowCommand): """Show a load balancer member""" clazz = neu2.ShowMember diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py index c8efb2800a..0a6e3ad859 100644 --- a/openstackclient/network/v2_0/lb/pool.py +++ b/openstackclient/network/v2_0/lb/pool.py @@ -17,10 +17,10 @@ from neutronclient.neutron.v2_0 import agentscheduler from neutronclient.neutron.v2_0.lb import pool as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreatePool(v2_0.CreateCommand): +class CreatePool(common.CreateCommand): """Create a load balancer pool""" clazz = neu2.CreatePool @@ -58,7 +58,7 @@ def get_parser(self, prog_name): return parser -class DeletePool(v2_0.DeleteCommand): +class DeletePool(common.DeleteCommand): """Delete a load balancer pool""" clazz = neu2.DeletePool @@ -67,7 +67,7 @@ class DeletePool(v2_0.DeleteCommand): help_text = 'Name or ID of load balancer pool to delete' -class ListPool(v2_0.ListCommand): +class ListPool(common.ListCommand): """List load balancer pool""" def get_parser(self, prog_name): @@ -94,7 +94,7 @@ def take_action(self, parsed_args): return neuter.take_action(parsed_args) -class SetPool(v2_0.SetCommand): +class SetPool(common.SetCommand): """Set load balancer pool values""" clazz = neu2.UpdatePool @@ -103,7 +103,7 @@ class SetPool(v2_0.SetCommand): help_text = 'Name or ID of load balancer pool to update' -class ShowPool(v2_0.ShowCommand): +class ShowPool(common.ShowCommand): """Show a load balancer pool""" name = 'pool' diff --git a/openstackclient/network/v2_0/lb/vip.py b/openstackclient/network/v2_0/lb/vip.py index c1c7672724..83bce4bb77 100644 --- a/openstackclient/network/v2_0/lb/vip.py +++ b/openstackclient/network/v2_0/lb/vip.py @@ -16,10 +16,10 @@ """Load Balancer VIP action implementations""" from neutronclient.neutron.v2_0.lb import vip as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateVip(v2_0.CreateCommand): +class CreateVip(common.CreateCommand): """Create a load balancer VIP""" clazz = neu2.CreateVip @@ -62,7 +62,7 @@ def get_parser(self, prog_name): return parser -class DeleteVip(v2_0.DeleteCommand): +class DeleteVip(common.DeleteCommand): """Delete a load balancer VIP""" clazz = neu2.DeleteVip @@ -71,13 +71,13 @@ class DeleteVip(v2_0.DeleteCommand): help_text = 'Name or ID of load balancer VIP to delete' -class ListVip(v2_0.ListCommand): +class ListVip(common.ListCommand): """List load balancer VIP""" clazz = neu2.ListVip -class SetVip(v2_0.SetCommand): +class SetVip(common.SetCommand): """Set load balancer VIP values""" clazz = neu2.UpdateVip @@ -86,7 +86,7 @@ class SetVip(v2_0.SetCommand): help_text = 'Name or ID of load balancer VIP to update' -class ShowVip(v2_0.ShowCommand): +class ShowVip(common.ShowCommand): """Show a load balancer VIP""" clazz = neu2.ShowVip diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index ed1b65f5c4..0e675b3c44 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -18,10 +18,10 @@ from neutronclient.neutron.v2_0 import agentscheduler as agent from neutronclient.neutron.v2_0 import network as neu2 from neutronclient.neutron.v2_0 import nvpnetworkgateway -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateNetwork(v2_0.CreateCommand): +class CreateNetwork(common.CreateCommand): """Create a network""" clazz = neu2.CreateNetwork @@ -42,7 +42,7 @@ def get_parser(self, prog_name): return parser -class DeleteNetwork(v2_0.DeleteCommand): +class DeleteNetwork(common.DeleteCommand): """Delete a network""" clazz = neu2.DeleteNetwork @@ -51,7 +51,7 @@ class DeleteNetwork(v2_0.DeleteCommand): help_text = 'Name or ID of network to delete' -class ListNetwork(v2_0.ListCommand): +class ListNetwork(common.ListCommand): """List networks""" def get_parser(self, prog_name): @@ -86,7 +86,7 @@ def take_action(self, parsed_args): return neuter.take_action(parsed_args) -class SetNetwork(v2_0.SetCommand): +class SetNetwork(common.SetCommand): """Set network values""" clazz = neu2.UpdateNetwork @@ -95,7 +95,7 @@ class SetNetwork(v2_0.SetCommand): help_text = 'Name or ID of network to set' -class ShowNetwork(v2_0.ShowCommand): +class ShowNetwork(common.ShowCommand): """Show a network""" clazz = neu2.ShowNetwork @@ -104,7 +104,7 @@ class ShowNetwork(v2_0.ShowCommand): help_text = 'Name or ID of network to show' -class AddGatewayNetwork(v2_0.AddCommand): +class AddGatewayNetwork(common.AddCommand): """Add a gateway to a network""" clazz = nvpnetworkgateway.ConnectNetworkGateway @@ -128,7 +128,7 @@ def get_parser(self, prog_name): return parser -class RemoveGatewayNetwork(v2_0.RemoveCommand): +class RemoveGatewayNetwork(common.RemoveCommand): """Remove a gateway from a network""" clazz = nvpnetworkgateway.DisconnectNetworkGateway diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index d85fccc993..13b5bd2bbd 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -17,10 +17,10 @@ from neutronclient.neutron.v2_0 import floatingip from neutronclient.neutron.v2_0 import port as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreatePort(v2_0.CreateCommand): +class CreatePort(common.CreateCommand): """Create a port""" clazz = neu2.CreatePort @@ -75,7 +75,7 @@ def get_parser(self, prog_name): return parser -class DeletePort(v2_0.DeleteCommand): +class DeletePort(common.DeleteCommand): """Delete a port""" clazz = neu2.DeletePort @@ -84,7 +84,7 @@ class DeletePort(v2_0.DeleteCommand): help_text = 'Name or ID of port to delete' -class ListPort(v2_0.ListCommand): +class ListPort(common.ListCommand): """List port""" def get_parser(self, prog_name): @@ -106,7 +106,7 @@ def take_action(self, parsed_args): return neuter.take_action(parsed_args) -class SetPort(v2_0.SetCommand): +class SetPort(common.SetCommand): """Set port values""" clazz = neu2.UpdatePort @@ -136,7 +136,7 @@ def get_parser(self, prog_name): return parser -class ShowPort(v2_0.ShowCommand): +class ShowPort(common.ShowCommand): """Show a port""" clazz = neu2.ShowPort @@ -145,7 +145,7 @@ class ShowPort(v2_0.ShowCommand): help_text = 'Name or ID of port to show' -class AddPort(v2_0.RemoveCommand): +class AddPort(common.RemoveCommand): """Add a floating IP to a port""" clazz = floatingip.AssociateFloatingIP @@ -165,7 +165,7 @@ def get_parser(self, prog_name): return parser -class RemovePort(v2_0.RemoveCommand): +class RemovePort(common.RemoveCommand): """Remove a floating IP from a port""" clazz = floatingip.DisassociateFloatingIP diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index 35aacc8777..3030323797 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -17,10 +17,10 @@ from neutronclient.neutron.v2_0 import agentscheduler from neutronclient.neutron.v2_0 import router as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateRouter(v2_0.CreateCommand): +class CreateRouter(common.CreateCommand): """Create a router""" clazz = neu2.CreateRouter @@ -46,7 +46,7 @@ def get_parser(self, prog_name): return parser -class DeleteRouter(v2_0.DeleteCommand): +class DeleteRouter(common.DeleteCommand): """Delete a router""" clazz = neu2.DeleteRouter @@ -55,7 +55,7 @@ class DeleteRouter(v2_0.DeleteCommand): help_text = 'Name or ID of router to delete' -class ListRouter(v2_0.ListCommand): +class ListRouter(common.ListCommand): """List router""" def get_parser(self, prog_name): @@ -82,7 +82,7 @@ def take_action(self, parsed_args): return neuter.take_action(parsed_args) -class SetRouter(v2_0.SetCommand): +class SetRouter(common.SetCommand): """Set router values""" name = 'router_id' @@ -121,7 +121,7 @@ def take_action(self, parsed_args): return neuter.run(parsed_args) -class ShowRouter(v2_0.ShowCommand): +class ShowRouter(common.ShowCommand): """Show a router""" clazz = neu2.ShowRouter @@ -130,7 +130,7 @@ class ShowRouter(v2_0.ShowCommand): help_text = 'Name or ID of router to show' -class AddInterfaceRouter(v2_0.AddCommand): +class AddInterfaceRouter(common.AddCommand): """Add a port or subnet to a router""" clazz = neu2.AddInterfaceRouter @@ -139,7 +139,7 @@ class AddInterfaceRouter(v2_0.AddCommand): container_help_text = 'ID of router to add an interface to' -class RemoveInterfaceRouter(v2_0.RemoveCommand): +class RemoveInterfaceRouter(common.RemoveCommand): """Remove a port or subnet from a router""" clazz = neu2.RemoveInterfaceRouter diff --git a/openstackclient/network/v2_0/security_group.py b/openstackclient/network/v2_0/security_group.py index 9f133ba227..d552cd6de9 100644 --- a/openstackclient/network/v2_0/security_group.py +++ b/openstackclient/network/v2_0/security_group.py @@ -16,10 +16,10 @@ """Security Group action implementations""" from neutronclient.neutron.v2_0 import securitygroup as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateSecurityGroup(v2_0.CreateCommand): +class CreateSecurityGroup(common.CreateCommand): """Create a security group""" clazz = neu2.CreateSecurityGroup @@ -35,7 +35,7 @@ def get_parser(self, prog_name): return parser -class DeleteSecurityGroup(v2_0.DeleteCommand): +class DeleteSecurityGroup(common.DeleteCommand): """Delete a security group""" clazz = neu2.DeleteSecurityGroup @@ -44,13 +44,13 @@ class DeleteSecurityGroup(v2_0.DeleteCommand): help_text = 'Name or ID of security group to delete' -class ListSecurityGroup(v2_0.ListCommand): +class ListSecurityGroup(common.ListCommand): """List security group""" clazz = neu2.ListSecurityGroup -class SetSecurityGroup(v2_0.SetCommand): +class SetSecurityGroup(common.SetCommand): """Set security group values""" clazz = neu2.UpdateSecurityGroup @@ -69,7 +69,7 @@ def get_parser(self, prog_name): return parser -class ShowSecurityGroup(v2_0.ShowCommand): +class ShowSecurityGroup(common.ShowCommand): """Show a security group""" clazz = neu2.ShowSecurityGroup diff --git a/openstackclient/network/v2_0/security_group_rule.py b/openstackclient/network/v2_0/security_group_rule.py index ac204d8510..254e376f91 100644 --- a/openstackclient/network/v2_0/security_group_rule.py +++ b/openstackclient/network/v2_0/security_group_rule.py @@ -18,10 +18,10 @@ import argparse from neutronclient.neutron.v2_0 import securitygroup as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateSecurityGroupRule(v2_0.CreateCommand): +class CreateSecurityGroupRule(common.CreateCommand): """Create a security group rule""" clazz = neu2.CreateSecurityGroupRule @@ -57,7 +57,7 @@ def get_parser(self, prog_name): return parser -class DeleteSecurityGroupRule(v2_0.DeleteCommand): +class DeleteSecurityGroupRule(common.DeleteCommand): """Delete a security group rule""" clazz = neu2.DeleteSecurityGroupRule @@ -66,7 +66,7 @@ class DeleteSecurityGroupRule(v2_0.DeleteCommand): help_text = 'Name or ID of security group rule to delete' -class ListSecurityGroupRule(v2_0.ListCommand): +class ListSecurityGroupRule(common.ListCommand): """List security group rule""" clazz = neu2.ListSecurityGroupRule @@ -91,7 +91,7 @@ def get_parser(self, prog_name): return parser -class ShowSecurityGroupRule(v2_0.ShowCommand): +class ShowSecurityGroupRule(common.ShowCommand): """Show a security group rule""" clazz = neu2.ShowSecurityGroupRule diff --git a/openstackclient/network/v2_0/subnet.py b/openstackclient/network/v2_0/subnet.py index ec8e611848..b104a5ea76 100644 --- a/openstackclient/network/v2_0/subnet.py +++ b/openstackclient/network/v2_0/subnet.py @@ -16,10 +16,10 @@ """Subnet action implementations""" from neutronclient.neutron.v2_0 import subnet as neu2 -from openstackclient.network import v2_0 +from openstackclient.network import common -class CreateSubnet(v2_0.CreateCommand): +class CreateSubnet(common.CreateCommand): """Create a subnet""" clazz = neu2.CreateSubnet @@ -98,7 +98,7 @@ def get_parser(self, prog_name): return parser -class DeleteSubnet(v2_0.DeleteCommand): +class DeleteSubnet(common.DeleteCommand): """Delete a subnet""" clazz = neu2.DeleteSubnet @@ -107,13 +107,13 @@ class DeleteSubnet(v2_0.DeleteCommand): help_text = 'Name or ID of subnet to delete' -class ListSubnet(v2_0.ListCommand): +class ListSubnet(common.ListCommand): """List subnet""" clazz = neu2.ListSubnet -class SetSubnet(v2_0.SetCommand): +class SetSubnet(common.SetCommand): """Set subnet values""" clazz = neu2.UpdateSubnet @@ -122,7 +122,7 @@ class SetSubnet(v2_0.SetCommand): help_text = 'ID of subnet to update' -class ShowSubnet(v2_0.ShowCommand): +class ShowSubnet(common.ShowCommand): """Show a subnet""" clazz = neu2.ShowSubnet diff --git a/openstackclient/network/v2_0/vpn/ikepolicy.py b/openstackclient/network/v2_0/vpn/ikepolicy.py index 5cadc89b02..13b8a0ace8 100644 --- a/openstackclient/network/v2_0/vpn/ikepolicy.py +++ b/openstackclient/network/v2_0/vpn/ikepolicy.py @@ -18,10 +18,10 @@ from neutronclient.common import utils from neutronclient.neutron.v2_0.vpn import ikepolicy as neu2 from neutronclient.neutron.v2_0.vpn import utils as vpn_utils -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateIkepolicy(v2_0.CreateCommand): +class CreateIkepolicy(common.CreateCommand): """Create a IKE policy""" clazz = neu2.CreateIKEPolicy @@ -66,7 +66,7 @@ def get_parser(self, prog_name): return parser -class DeleteIkepolicy(v2_0.DeleteCommand): +class DeleteIkepolicy(common.DeleteCommand): """Delete a IKE policy""" clazz = neu2.DeleteIKEPolicy @@ -75,13 +75,13 @@ class DeleteIkepolicy(v2_0.DeleteCommand): help_text = 'Name or ID of IKE policy to delete' -class ListIkepolicy(v2_0.ListCommand): +class ListIkepolicy(common.ListCommand): """List IKE policies""" clazz = neu2.ListIKEPolicy -class SetIkepolicy(v2_0.SetCommand): +class SetIkepolicy(common.SetCommand): """Set IKE policy values""" clazz = neu2.UpdateIKEPolicy @@ -99,7 +99,7 @@ def get_parser(self, prog_name): return parser -class ShowIkepolicy(v2_0.ShowCommand): +class ShowIkepolicy(common.ShowCommand): """Show a IKE policy""" clazz = neu2.ShowIKEPolicy diff --git a/openstackclient/network/v2_0/vpn/ipsecpolicy.py b/openstackclient/network/v2_0/vpn/ipsecpolicy.py index a77b7c96e3..7f0a1eaa4e 100644 --- a/openstackclient/network/v2_0/vpn/ipsecpolicy.py +++ b/openstackclient/network/v2_0/vpn/ipsecpolicy.py @@ -18,10 +18,10 @@ from neutronclient.common import utils from neutronclient.neutron.v2_0.vpn import ipsecpolicy as neu2 from neutronclient.neutron.v2_0.vpn import utils as vpn_utils -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateIpsecpolicy(v2_0.CreateCommand): +class CreateIpsecpolicy(common.CreateCommand): """Create a IPSec policy""" clazz = neu2.CreateIPsecPolicy @@ -65,7 +65,7 @@ def get_parser(self, prog_name): return parser -class DeleteIpsecpolicy(v2_0.DeleteCommand): +class DeleteIpsecpolicy(common.DeleteCommand): """Delete a IPSec policy""" clazz = neu2.DeleteIPsecPolicy @@ -74,13 +74,13 @@ class DeleteIpsecpolicy(v2_0.DeleteCommand): help_text = 'Name or ID of IPSec policy to delete' -class ListIpsecpolicy(v2_0.ListCommand): +class ListIpsecpolicy(common.ListCommand): """List IPSec policies""" clazz = neu2.ListIPsecPolicy -class SetIpsecpolicy(v2_0.SetCommand): +class SetIpsecpolicy(common.SetCommand): """Set IPSec policy values""" clazz = neu2.UpdateIPsecPolicy @@ -98,7 +98,7 @@ def get_parser(self, prog_name): return parser -class ShowIpsecpolicy(v2_0.ShowCommand): +class ShowIpsecpolicy(common.ShowCommand): """Show a IPSec policy""" clazz = neu2.ShowIPsecPolicy diff --git a/openstackclient/network/v2_0/vpn/service.py b/openstackclient/network/v2_0/vpn/service.py index afc8337b4e..efb56dae80 100644 --- a/openstackclient/network/v2_0/vpn/service.py +++ b/openstackclient/network/v2_0/vpn/service.py @@ -16,10 +16,10 @@ """VPN action implementations""" from neutronclient.neutron.v2_0.vpn import vpnservice as neu2 -from openstackclient.network import v2_0 as v2_0 +from openstackclient.network import common -class CreateService(v2_0.CreateCommand): +class CreateService(common.CreateCommand): """Create a VPN service""" clazz = neu2.CreateVPNService @@ -45,7 +45,7 @@ def get_parser(self, prog_name): return parser -class DeleteService(v2_0.DeleteCommand): +class DeleteService(common.DeleteCommand): """Delete a VPN service""" clazz = neu2.DeleteVPNService @@ -54,13 +54,13 @@ class DeleteService(v2_0.DeleteCommand): help_text = 'Name or ID of VPN service to delete' -class ListService(v2_0.ListCommand): +class ListService(common.ListCommand): """List VPN service""" clazz = neu2.ListVPNService -class SetService(v2_0.SetCommand): +class SetService(common.SetCommand): """Set VPN service values""" clazz = neu2.UpdateVPNService @@ -69,7 +69,7 @@ class SetService(v2_0.SetCommand): help_text = 'Name or ID of VPN service to set' -class ShowService(v2_0.ShowCommand): +class ShowService(common.ShowCommand): """Show a VPN service""" clazz = neu2.ShowVPNService diff --git a/test-requirements.txt b/test-requirements.txt index 21ea45481c..34beccaeb3 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -3,7 +3,6 @@ hacking>=0.8.0,<0.9 coverage>=3.6 discover fixtures>=0.3.14 -httpretty>=0.7.1 mock>=1.0 sphinx>=1.1.2,<1.2 testrepository>=0.0.17 From 1da295e5ddd89111d360b007d0118c1fddb90a95 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 13 Jan 2014 13:13:34 -0700 Subject: [PATCH 51/66] change working on show --- openstackclient/network/v2_0/floatingip.py | 2 +- openstackclient/network/v2_0/fw/firewall.py | 2 +- openstackclient/network/v2_0/gateway.py | 2 +- openstackclient/network/v2_0/lb/healthmonitor.py | 2 +- openstackclient/network/v2_0/lb/member.py | 2 +- openstackclient/network/v2_0/lb/pool.py | 2 +- openstackclient/network/v2_0/lb/vip.py | 2 +- openstackclient/network/v2_0/network.py | 2 +- openstackclient/network/v2_0/port.py | 2 +- openstackclient/network/v2_0/router.py | 2 +- openstackclient/network/v2_0/security_group.py | 2 +- openstackclient/network/v2_0/security_group_rule.py | 2 +- openstackclient/network/v2_0/subnet.py | 2 +- openstackclient/network/v2_0/vpn/ikepolicy.py | 2 +- openstackclient/network/v2_0/vpn/ipsecpolicy.py | 2 +- openstackclient/network/v2_0/vpn/service.py | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/openstackclient/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py index 069c432c74..ec06f18d01 100644 --- a/openstackclient/network/v2_0/floatingip.py +++ b/openstackclient/network/v2_0/floatingip.py @@ -54,7 +54,7 @@ class ListFloatingIp(common.ListCommand): class ShowFloatingIp(common.ShowCommand): - """Show a floating IP""" + """Show floating IP details""" clazz = neu2.ShowFloatingIP help_text = "Identifier of floating IP to show" diff --git a/openstackclient/network/v2_0/fw/firewall.py b/openstackclient/network/v2_0/fw/firewall.py index 17a41ae3fe..b61a08c3ee 100644 --- a/openstackclient/network/v2_0/fw/firewall.py +++ b/openstackclient/network/v2_0/fw/firewall.py @@ -87,7 +87,7 @@ class SetFirewall(common.SetCommand): class ShowFirewall(common.ShowCommand): - """Show a firewall""" + """Show firewall details""" clazz = neu2.ShowFirewall name = 'firewall' diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py index 3b505f2ccc..6ae45504c8 100644 --- a/openstackclient/network/v2_0/gateway.py +++ b/openstackclient/network/v2_0/gateway.py @@ -64,7 +64,7 @@ class SetGateway(common.SetCommand): class ShowGateway(common.ShowCommand): - """Show a gateway""" + """Show gateway details""" clazz = neu2.ShowNetworkGateway name = 'id' diff --git a/openstackclient/network/v2_0/lb/healthmonitor.py b/openstackclient/network/v2_0/lb/healthmonitor.py index 4c2eddc384..e553bce625 100644 --- a/openstackclient/network/v2_0/lb/healthmonitor.py +++ b/openstackclient/network/v2_0/lb/healthmonitor.py @@ -94,7 +94,7 @@ class SetHealthMonitor(common.SetCommand): class ShowHealthMonitor(common.ShowCommand): - """Show a load balancer health monitor""" + """Show load balancer health monitor details""" clazz = neu2.ShowHealthMonitor name = 'id' diff --git a/openstackclient/network/v2_0/lb/member.py b/openstackclient/network/v2_0/lb/member.py index aeb540df26..193047fee8 100644 --- a/openstackclient/network/v2_0/lb/member.py +++ b/openstackclient/network/v2_0/lb/member.py @@ -73,7 +73,7 @@ class SetMember(common.SetCommand): class ShowMember(common.ShowCommand): - """Show a load balancer member""" + """Show load balancer member details""" clazz = neu2.ShowMember name = 'id' diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py index 0a6e3ad859..386d0580a2 100644 --- a/openstackclient/network/v2_0/lb/pool.py +++ b/openstackclient/network/v2_0/lb/pool.py @@ -104,7 +104,7 @@ class SetPool(common.SetCommand): class ShowPool(common.ShowCommand): - """Show a load balancer pool""" + """Show load balancer pool details""" name = 'pool' metavar = '' diff --git a/openstackclient/network/v2_0/lb/vip.py b/openstackclient/network/v2_0/lb/vip.py index 83bce4bb77..a67131de25 100644 --- a/openstackclient/network/v2_0/lb/vip.py +++ b/openstackclient/network/v2_0/lb/vip.py @@ -87,7 +87,7 @@ class SetVip(common.SetCommand): class ShowVip(common.ShowCommand): - """Show a load balancer VIP""" + """Show load balancer VIP details""" clazz = neu2.ShowVip name = 'id' diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 0e675b3c44..185549b6af 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -96,7 +96,7 @@ class SetNetwork(common.SetCommand): class ShowNetwork(common.ShowCommand): - """Show a network""" + """Show network details""" clazz = neu2.ShowNetwork name = 'id' diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index 13b5bd2bbd..6152040042 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -137,7 +137,7 @@ def get_parser(self, prog_name): class ShowPort(common.ShowCommand): - """Show a port""" + """Show port details""" clazz = neu2.ShowPort name = 'id' diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index 3030323797..9466a7840b 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -122,7 +122,7 @@ def take_action(self, parsed_args): class ShowRouter(common.ShowCommand): - """Show a router""" + """Show router details""" clazz = neu2.ShowRouter name = 'id' diff --git a/openstackclient/network/v2_0/security_group.py b/openstackclient/network/v2_0/security_group.py index d552cd6de9..6bdeebc99b 100644 --- a/openstackclient/network/v2_0/security_group.py +++ b/openstackclient/network/v2_0/security_group.py @@ -70,7 +70,7 @@ def get_parser(self, prog_name): class ShowSecurityGroup(common.ShowCommand): - """Show a security group""" + """Show security group details""" clazz = neu2.ShowSecurityGroup name = 'id' diff --git a/openstackclient/network/v2_0/security_group_rule.py b/openstackclient/network/v2_0/security_group_rule.py index 254e376f91..b8f5d5229a 100644 --- a/openstackclient/network/v2_0/security_group_rule.py +++ b/openstackclient/network/v2_0/security_group_rule.py @@ -92,7 +92,7 @@ def get_parser(self, prog_name): class ShowSecurityGroupRule(common.ShowCommand): - """Show a security group rule""" + """Show security group rule details""" clazz = neu2.ShowSecurityGroupRule name = 'id' diff --git a/openstackclient/network/v2_0/subnet.py b/openstackclient/network/v2_0/subnet.py index b104a5ea76..cb6ca8bd73 100644 --- a/openstackclient/network/v2_0/subnet.py +++ b/openstackclient/network/v2_0/subnet.py @@ -123,7 +123,7 @@ class SetSubnet(common.SetCommand): class ShowSubnet(common.ShowCommand): - """Show a subnet""" + """Show subnet details""" clazz = neu2.ShowSubnet name = 'id' diff --git a/openstackclient/network/v2_0/vpn/ikepolicy.py b/openstackclient/network/v2_0/vpn/ikepolicy.py index 13b8a0ace8..a3947a48d1 100644 --- a/openstackclient/network/v2_0/vpn/ikepolicy.py +++ b/openstackclient/network/v2_0/vpn/ikepolicy.py @@ -100,7 +100,7 @@ def get_parser(self, prog_name): class ShowIkepolicy(common.ShowCommand): - """Show a IKE policy""" + """Show IKE policy details""" clazz = neu2.ShowIKEPolicy name = 'id' diff --git a/openstackclient/network/v2_0/vpn/ipsecpolicy.py b/openstackclient/network/v2_0/vpn/ipsecpolicy.py index 7f0a1eaa4e..be0db0d390 100644 --- a/openstackclient/network/v2_0/vpn/ipsecpolicy.py +++ b/openstackclient/network/v2_0/vpn/ipsecpolicy.py @@ -99,7 +99,7 @@ def get_parser(self, prog_name): class ShowIpsecpolicy(common.ShowCommand): - """Show a IPSec policy""" + """Show IPSec policy details""" clazz = neu2.ShowIPsecPolicy name = 'id' diff --git a/openstackclient/network/v2_0/vpn/service.py b/openstackclient/network/v2_0/vpn/service.py index efb56dae80..934fcd968c 100644 --- a/openstackclient/network/v2_0/vpn/service.py +++ b/openstackclient/network/v2_0/vpn/service.py @@ -70,7 +70,7 @@ class SetService(common.SetCommand): class ShowService(common.ShowCommand): - """Show a VPN service""" + """Show VPN service details""" clazz = neu2.ShowVPNService name = 'id' From b11fedb157eb4604ec5753afe1222ecc8d5909eb Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Sat, 25 Jan 2014 08:16:33 -0700 Subject: [PATCH 52/66] show generalized --- openstackclient/network/common.py | 63 +++++++++++++++---- openstackclient/network/v2_0/floatingip.py | 7 ++- openstackclient/network/v2_0/fw/firewall.py | 3 - openstackclient/network/v2_0/gateway.py | 9 +-- .../network/v2_0/lb/healthmonitor.py | 5 +- openstackclient/network/v2_0/lb/member.py | 5 +- openstackclient/network/v2_0/lb/pool.py | 2 - openstackclient/network/v2_0/lb/vip.py | 5 +- openstackclient/network/v2_0/network.py | 5 +- openstackclient/network/v2_0/port.py | 10 +-- openstackclient/network/v2_0/router.py | 5 +- .../network/v2_0/security_group.py | 5 +- .../network/v2_0/security_group_rule.py | 9 +-- openstackclient/network/v2_0/subnet.py | 5 +- openstackclient/network/v2_0/vpn/ikepolicy.py | 5 +- .../network/v2_0/vpn/ipsecpolicy.py | 5 +- openstackclient/network/v2_0/vpn/service.py | 5 +- .../tests/network/{v2_0 => }/common.py | 0 openstackclient/tests/network/test_common.py | 40 ++++++++++++ .../tests/network/v2_0/fw/test_firewall.py | 6 +- .../network/v2_0/lb/test_healthmonitor.py | 6 +- .../tests/network/v2_0/lb/test_member.py | 6 +- .../tests/network/v2_0/lb/test_pool.py | 6 +- .../tests/network/v2_0/lb/test_vip.py | 6 +- .../tests/network/v2_0/test_dhcp.py | 2 +- .../tests/network/v2_0/test_floatingip.py | 6 +- .../tests/network/v2_0/test_gateway.py | 6 +- .../tests/network/v2_0/test_network.py | 6 +- .../tests/network/v2_0/test_port.py | 6 +- .../tests/network/v2_0/test_router.py | 6 +- .../tests/network/v2_0/test_security_group.py | 6 +- .../network/v2_0/test_security_group_rule.py | 6 +- .../tests/network/v2_0/test_subnet.py | 6 +- .../tests/network/v2_0/vpn/test_ikepolicy.py | 6 +- .../network/v2_0/vpn/test_ipsecpolicy.py | 6 +- .../tests/network/v2_0/vpn/test_service.py | 6 +- 36 files changed, 170 insertions(+), 121 deletions(-) rename openstackclient/tests/network/{v2_0 => }/common.py (100%) create mode 100644 openstackclient/tests/network/test_common.py diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index eca81a2f99..284ba31315 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -13,14 +13,48 @@ # under the License. # +import json import logging +import six from cliff import command from cliff import lister from cliff import show -class CreateCommand(show.ShowOne): +class BaseShowCommand(show.ShowOne): + json_indent = None + + def dumps(self, value, indent=None): + try: + return json.dumps(value, indent=indent) + except TypeError: + pass + return json.dumps(to_primitive(value)) + + def format_data(self, data): + # Modify data to make it more readable + if not(self.name in data): + return data + for k, v in data[self.name].iteritems(): + if isinstance(v, list): + value = '\n'.join(self.dumps( + i, indent=self.json_indent) if isinstance(i, dict) + else str(i) for i in v) + data[self.name][k] = value + print '***********************************' + print value.__class__.__name__ + print str(value) + print '***********************************' + elif isinstance(v, dict): + value = self.dumps(v, indent=self.json_indent) + data[self.name][k] = value + elif v is None: + data[self.name][k] = '' + return data[self.name] + + +class CreateCommand(BaseShowCommand): log = logging.getLogger(__name__ + '.CreateCommand') @@ -131,12 +165,17 @@ def take_action(self, parsed_args): return neuter.take_action(parsed_args) -class ShowCommand(show.ShowOne): +class ShowCommand(BaseShowCommand): log = logging.getLogger(__name__ + '.ShowCommand') - name = "id" - metavar = "" - help_text = "Identifier of object to delete" + + def __init__(self, app, app_args): + super(ShowCommand, self).__init__(app, app_args) + self.metavar = "<" + self.name + ">" + self.help_text = "Name or identifier of " + \ + self.name.replace('_', ' ') + " to show" + self.func = self.name + self.response = self.name def get_client(self): return self.app.client_manager.network @@ -144,20 +183,18 @@ def get_client(self): def get_parser(self, prog_name): parser = super(ShowCommand, self).get_parser(prog_name) parser.add_argument( - self.name, + 'identifier', metavar=self.metavar, - help=self.help_text, + help=self.help_text ) return parser def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.show_details = True - parsed_args.request_format = 'json' - parsed_args.fields = [] - return neuter.take_action(parsed_args) + method = getattr(self.app.client_manager.network, "show_" + self.func) + data = method(parsed_args.identifier) + data = self.format_data(data) + return zip(*sorted(six.iteritems(data))) class AddCommand(command.Command): diff --git a/openstackclient/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py index ec06f18d01..7e5e0784ff 100644 --- a/openstackclient/network/v2_0/floatingip.py +++ b/openstackclient/network/v2_0/floatingip.py @@ -56,5 +56,8 @@ class ListFloatingIp(common.ListCommand): class ShowFloatingIp(common.ShowCommand): """Show floating IP details""" - clazz = neu2.ShowFloatingIP - help_text = "Identifier of floating IP to show" + name = "floatingip" + + def __init__(self, app, app_args): + super(ShowFloatingIp, self).__init__(app, app_args) + self.help_text = "Identitifer of floating IP to show" diff --git a/openstackclient/network/v2_0/fw/firewall.py b/openstackclient/network/v2_0/fw/firewall.py index b61a08c3ee..928750598f 100644 --- a/openstackclient/network/v2_0/fw/firewall.py +++ b/openstackclient/network/v2_0/fw/firewall.py @@ -89,7 +89,4 @@ class SetFirewall(common.SetCommand): class ShowFirewall(common.ShowCommand): """Show firewall details""" - clazz = neu2.ShowFirewall name = 'firewall' - metavar = '' - help_text = 'Name or ID of firewall to show' diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py index 6ae45504c8..b28bb9d50f 100644 --- a/openstackclient/network/v2_0/gateway.py +++ b/openstackclient/network/v2_0/gateway.py @@ -66,7 +66,8 @@ class SetGateway(common.SetCommand): class ShowGateway(common.ShowCommand): """Show gateway details""" - clazz = neu2.ShowNetworkGateway - name = 'id' - metavar = '' - help_text = 'Name or ID of gateway to show' + name = 'gateway' + + def __init__(self, app, app_args): + super(ShowGateway, self).__init__(app, app_args) + self.func = "network_gatway" diff --git a/openstackclient/network/v2_0/lb/healthmonitor.py b/openstackclient/network/v2_0/lb/healthmonitor.py index e553bce625..da70b6ae98 100644 --- a/openstackclient/network/v2_0/lb/healthmonitor.py +++ b/openstackclient/network/v2_0/lb/healthmonitor.py @@ -96,10 +96,7 @@ class SetHealthMonitor(common.SetCommand): class ShowHealthMonitor(common.ShowCommand): """Show load balancer health monitor details""" - clazz = neu2.ShowHealthMonitor - name = 'id' - metavar = '' - help_text = 'Name or ID of health monitor to show' + name = 'health_monitor' class AddPool(common.AddCommand): diff --git a/openstackclient/network/v2_0/lb/member.py b/openstackclient/network/v2_0/lb/member.py index 193047fee8..987b87342a 100644 --- a/openstackclient/network/v2_0/lb/member.py +++ b/openstackclient/network/v2_0/lb/member.py @@ -75,7 +75,4 @@ class SetMember(common.SetCommand): class ShowMember(common.ShowCommand): """Show load balancer member details""" - clazz = neu2.ShowMember - name = 'id' - metavar = '' - help_text = 'Name or ID of member to show' + name = 'member' diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py index 386d0580a2..ada20735e6 100644 --- a/openstackclient/network/v2_0/lb/pool.py +++ b/openstackclient/network/v2_0/lb/pool.py @@ -107,8 +107,6 @@ class ShowPool(common.ShowCommand): """Show load balancer pool details""" name = 'pool' - metavar = '' - help_text = 'Name or ID of pool to show' def get_parser(self, prog_name): parser = super(ShowPool, self).get_parser(prog_name) diff --git a/openstackclient/network/v2_0/lb/vip.py b/openstackclient/network/v2_0/lb/vip.py index a67131de25..aa8b33a4d8 100644 --- a/openstackclient/network/v2_0/lb/vip.py +++ b/openstackclient/network/v2_0/lb/vip.py @@ -89,7 +89,4 @@ class SetVip(common.SetCommand): class ShowVip(common.ShowCommand): """Show load balancer VIP details""" - clazz = neu2.ShowVip - name = 'id' - metavar = '' - help_text = 'Name or ID of VIP to show' + name = 'vip' diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 185549b6af..db5cbfd623 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -98,10 +98,7 @@ class SetNetwork(common.SetCommand): class ShowNetwork(common.ShowCommand): """Show network details""" - clazz = neu2.ShowNetwork - name = 'id' - metavar = '' - help_text = 'Name or ID of network to show' + name = 'network' class AddGatewayNetwork(common.AddCommand): diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index 6152040042..1afe29bc4f 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -97,6 +97,11 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) + parsed_args.request_format = 'json' + parsed_args.fields = [] + parsed_args.page_size = None + parsed_args.sort_key = [] + parsed_args.sort_dir = [] if parsed_args.router: parsed_args.id = parsed_args.router neuter = neu2.ListRouterPort(self.app, self.app_args) @@ -139,10 +144,7 @@ def get_parser(self, prog_name): class ShowPort(common.ShowCommand): """Show port details""" - clazz = neu2.ShowPort - name = 'id' - metavar = '' - help_text = 'Name or ID of port to show' + name = "port" class AddPort(common.RemoveCommand): diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index 9466a7840b..62bfb978af 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -124,10 +124,7 @@ def take_action(self, parsed_args): class ShowRouter(common.ShowCommand): """Show router details""" - clazz = neu2.ShowRouter - name = 'id' - metavar = '' - help_text = 'Name or ID of router to show' + name = 'router' class AddInterfaceRouter(common.AddCommand): diff --git a/openstackclient/network/v2_0/security_group.py b/openstackclient/network/v2_0/security_group.py index 6bdeebc99b..6342c02183 100644 --- a/openstackclient/network/v2_0/security_group.py +++ b/openstackclient/network/v2_0/security_group.py @@ -72,7 +72,4 @@ def get_parser(self, prog_name): class ShowSecurityGroup(common.ShowCommand): """Show security group details""" - clazz = neu2.ShowSecurityGroup - name = 'id' - metavar = '' - help_text = 'Name or ID of security group to show' + name = 'security_group' diff --git a/openstackclient/network/v2_0/security_group_rule.py b/openstackclient/network/v2_0/security_group_rule.py index b8f5d5229a..8367673083 100644 --- a/openstackclient/network/v2_0/security_group_rule.py +++ b/openstackclient/network/v2_0/security_group_rule.py @@ -94,7 +94,8 @@ def get_parser(self, prog_name): class ShowSecurityGroupRule(common.ShowCommand): """Show security group rule details""" - clazz = neu2.ShowSecurityGroupRule - name = 'id' - metavar = '' - help_text = 'Name or ID of security group rule to show' + name = 'security_group_rule' + + def __init__(self, app, app_args): + super(ShowSecurityGroupRule, self).__init__(app, app_args) + self.help_text = "Identifier of security group rule to show" diff --git a/openstackclient/network/v2_0/subnet.py b/openstackclient/network/v2_0/subnet.py index cb6ca8bd73..44d16e26c6 100644 --- a/openstackclient/network/v2_0/subnet.py +++ b/openstackclient/network/v2_0/subnet.py @@ -125,7 +125,4 @@ class SetSubnet(common.SetCommand): class ShowSubnet(common.ShowCommand): """Show subnet details""" - clazz = neu2.ShowSubnet - name = 'id' - metavar = '' - help_text = 'Name or ID of subnet to show' + name = 'subnet' diff --git a/openstackclient/network/v2_0/vpn/ikepolicy.py b/openstackclient/network/v2_0/vpn/ikepolicy.py index a3947a48d1..12072967cc 100644 --- a/openstackclient/network/v2_0/vpn/ikepolicy.py +++ b/openstackclient/network/v2_0/vpn/ikepolicy.py @@ -102,7 +102,4 @@ def get_parser(self, prog_name): class ShowIkepolicy(common.ShowCommand): """Show IKE policy details""" - clazz = neu2.ShowIKEPolicy - name = 'id' - metavar = '' - help_text = 'Name or ID of IKE policy to show' + name = 'ikepolicy' diff --git a/openstackclient/network/v2_0/vpn/ipsecpolicy.py b/openstackclient/network/v2_0/vpn/ipsecpolicy.py index be0db0d390..0c9c27aaed 100644 --- a/openstackclient/network/v2_0/vpn/ipsecpolicy.py +++ b/openstackclient/network/v2_0/vpn/ipsecpolicy.py @@ -101,7 +101,4 @@ def get_parser(self, prog_name): class ShowIpsecpolicy(common.ShowCommand): """Show IPSec policy details""" - clazz = neu2.ShowIPsecPolicy - name = 'id' - metavar = '' - help_text = 'Name or ID of IPSec policy to show' + name = 'ipsecpolicy' diff --git a/openstackclient/network/v2_0/vpn/service.py b/openstackclient/network/v2_0/vpn/service.py index 934fcd968c..6ffeb38798 100644 --- a/openstackclient/network/v2_0/vpn/service.py +++ b/openstackclient/network/v2_0/vpn/service.py @@ -72,7 +72,4 @@ class SetService(common.SetCommand): class ShowService(common.ShowCommand): """Show VPN service details""" - clazz = neu2.ShowVPNService - name = 'id' - metavar = '' - help_text = 'Name or ID of VPN service to show' + name = 'vpnservice' diff --git a/openstackclient/tests/network/v2_0/common.py b/openstackclient/tests/network/common.py similarity index 100% rename from openstackclient/tests/network/v2_0/common.py rename to openstackclient/tests/network/common.py diff --git a/openstackclient/tests/network/test_common.py b/openstackclient/tests/network/test_common.py new file mode 100644 index 0000000000..9a68d53dd9 --- /dev/null +++ b/openstackclient/tests/network/test_common.py @@ -0,0 +1,40 @@ +# Copyright 2013 OpenStack, LLC. +# +# 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 openstackclient.network import common +from openstackclient.tests.network import common as test_common + + +class TestBaseShowCommand(test_common.TestNetworkBase): + class Shower(common.ShowCommand): + + name = "testable" + + + def test_format_output(self): + shower = self.Shower(None, None) + result = shower.format_data({"testable": + {"ka": [{"ka1": "va1", "ka2": "va2"}, {"ka3": "va3", "ka4": "va4"}, {"ka5": "va5", "ka6": "va6"}], + "kb": {"k4": "v4"}, + "kc": {"ka1": {"ka2": "v3"}}, + "kd": None, + "ke": u"ve"}}) + self.assertEqual({'ka': '{"ka2": "va2", "ka1": "va1"}\n' + + '{"ka3": "va3", "ka4": "va4"}\n' + + '{"ka6": "va6", "ka5": "va5"}', + 'kb': '{"k4": "v4"}', + 'kc': '{"ka1": {"ka2": "v3"}}', + 'kd': '', + 'ke': u've'}, result) diff --git a/openstackclient/tests/network/v2_0/fw/test_firewall.py b/openstackclient/tests/network/v2_0/fw/test_firewall.py index d8e1096b0c..9623dc9f4d 100644 --- a/openstackclient/tests/network/v2_0/fw/test_firewall.py +++ b/openstackclient/tests/network/v2_0/fw/test_firewall.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0.fw import firewall -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateFirewall(common.TestNetworkBase): @@ -73,11 +73,11 @@ class TestShowFirewall(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(firewall.ShowFirewall, given) - self.assertEqual('noo', parsed.firewall) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too " + self.given_all_show_options() parsed = self.given_args(firewall.ShowFirewall, given) - self.assertEqual('too', parsed.firewall) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py index 034d2aa7e8..79df83f5c8 100644 --- a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py +++ b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0.lb import healthmonitor -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateLbHealthMonitor(common.TestNetworkBase): @@ -82,13 +82,13 @@ class TestShowLbHealthMonitor(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(healthmonitor.ShowHealthMonitor, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too" + self.given_all_show_options() parsed = self.given_args(healthmonitor.ShowHealthMonitor, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_member.py b/openstackclient/tests/network/v2_0/lb/test_member.py index f0027ac272..54ea81d5bc 100644 --- a/openstackclient/tests/network/v2_0/lb/test_member.py +++ b/openstackclient/tests/network/v2_0/lb/test_member.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0.lb import member -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateLbMember(common.TestNetworkBase): @@ -75,11 +75,11 @@ class TestShowLbMember(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(member.ShowMember, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too" + self.given_all_show_options() parsed = self.given_args(member.ShowMember, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_pool.py b/openstackclient/tests/network/v2_0/lb/test_pool.py index 8143f1334c..ea991187cb 100644 --- a/openstackclient/tests/network/v2_0/lb/test_pool.py +++ b/openstackclient/tests/network/v2_0/lb/test_pool.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0.lb import pool -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateLbPool(common.TestNetworkBase): @@ -81,7 +81,7 @@ class TestShowLbPool(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(pool.ShowPool, given) - self.assertEqual('noo', parsed.pool) + self.assertEqual('noo', parsed.identifier) self.assertEqual(False, parsed.agent) self.assertEqual(False, parsed.stats) self.then_default_show_options(parsed) @@ -89,7 +89,7 @@ def test_get_parser_nothing(self): def test_get_parser_all(self): given = "too --agent --stats" + self.given_all_show_options() parsed = self.given_args(pool.ShowPool, given) - self.assertEqual('too', parsed.pool) + self.assertEqual('too', parsed.identifier) self.assertEqual(True, parsed.agent) self.assertEqual(True, parsed.stats) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/lb/test_vip.py b/openstackclient/tests/network/v2_0/lb/test_vip.py index 8100920db0..3beeb60cf0 100644 --- a/openstackclient/tests/network/v2_0/lb/test_vip.py +++ b/openstackclient/tests/network/v2_0/lb/test_vip.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0.lb import vip -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateLbVip(common.TestNetworkBase): @@ -84,11 +84,11 @@ class TestShowLbVip(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(vip.ShowVip, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too" + self.given_all_show_options() parsed = self.given_args(vip.ShowVip, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_dhcp.py b/openstackclient/tests/network/v2_0/test_dhcp.py index eb83ed2d0c..8b5d4f1253 100644 --- a/openstackclient/tests/network/v2_0/test_dhcp.py +++ b/openstackclient/tests/network/v2_0/test_dhcp.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0 import dhcp -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestAddNetworkDhcpAgent(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_floatingip.py b/openstackclient/tests/network/v2_0/test_floatingip.py index cfa8eb3eba..6906837ec8 100644 --- a/openstackclient/tests/network/v2_0/test_floatingip.py +++ b/openstackclient/tests/network/v2_0/test_floatingip.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0 import floatingip -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateFloatingIp(common.TestNetworkBase): @@ -62,11 +62,11 @@ class TestShowFloatingIp(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(floatingip.ShowFloatingIp, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too " + self.given_all_show_options() parsed = self.given_args(floatingip.ShowFloatingIp, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_gateway.py b/openstackclient/tests/network/v2_0/test_gateway.py index bdababa441..815b3f05fd 100644 --- a/openstackclient/tests/network/v2_0/test_gateway.py +++ b/openstackclient/tests/network/v2_0/test_gateway.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0 import gateway -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateGateway(common.TestNetworkBase): @@ -66,11 +66,11 @@ class TestShowGateway(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(gateway.ShowGateway, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too " + self.given_all_show_options() parsed = self.given_args(gateway.ShowGateway, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index 91fa16f94b..a9b2cd0039 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0 import network -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateNetwork(common.TestNetworkBase): @@ -73,13 +73,13 @@ class TestShowNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(network.ShowNetwork, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too " + self.given_all_show_options() parsed = self.given_args(network.ShowNetwork, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_port.py b/openstackclient/tests/network/v2_0/test_port.py index 8985ca0dbf..68d02c240e 100644 --- a/openstackclient/tests/network/v2_0/test_port.py +++ b/openstackclient/tests/network/v2_0/test_port.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0 import port -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreatePort(common.TestNetworkBase): @@ -97,11 +97,11 @@ class TestShowPort(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(port.ShowPort, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too" + self.given_all_show_options() parsed = self.given_args(port.ShowPort, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_router.py b/openstackclient/tests/network/v2_0/test_router.py index 6612f065bd..fc6838926d 100644 --- a/openstackclient/tests/network/v2_0/test_router.py +++ b/openstackclient/tests/network/v2_0/test_router.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0 import router -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateRouter(common.TestNetworkBase): @@ -99,11 +99,11 @@ class TestShowRouter(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(router.ShowRouter, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too" + self.given_all_show_options() parsed = self.given_args(router.ShowRouter, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_security_group.py b/openstackclient/tests/network/v2_0/test_security_group.py index 5b3c6ac2ec..a51d1b0808 100644 --- a/openstackclient/tests/network/v2_0/test_security_group.py +++ b/openstackclient/tests/network/v2_0/test_security_group.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0 import security_group -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateSecurityGroup(common.TestNetworkBase): @@ -73,11 +73,11 @@ class TestShowSecurityGroup(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(security_group.ShowSecurityGroup, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too" + self.given_all_show_options() parsed = self.given_args(security_group.ShowSecurityGroup, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_security_group_rule.py b/openstackclient/tests/network/v2_0/test_security_group_rule.py index c468886f92..0389120716 100644 --- a/openstackclient/tests/network/v2_0/test_security_group_rule.py +++ b/openstackclient/tests/network/v2_0/test_security_group_rule.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0 import security_group_rule -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateSecurityGroupRule(common.TestNetworkBase): @@ -82,12 +82,12 @@ def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(security_group_rule.ShowSecurityGroupRule, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too" + self.given_all_show_options() parsed = self.given_args(security_group_rule.ShowSecurityGroupRule, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/test_subnet.py b/openstackclient/tests/network/v2_0/test_subnet.py index d98400b8d0..ace42b8f86 100644 --- a/openstackclient/tests/network/v2_0/test_subnet.py +++ b/openstackclient/tests/network/v2_0/test_subnet.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0 import subnet -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateSubnet(common.TestNetworkBase): @@ -107,11 +107,11 @@ class TestShowSubnet(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(subnet.ShowSubnet, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too" + self.given_all_show_options() parsed = self.given_args(subnet.ShowSubnet, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py index 7860108081..abf4fbf73a 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py +++ b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0.vpn import ikepolicy -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateIkepolicy(common.TestNetworkBase): @@ -83,11 +83,11 @@ class TestShowIkepolicy(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(ikepolicy.ShowIkepolicy, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too " + self.given_all_show_options() parsed = self.given_args(ikepolicy.ShowIkepolicy, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py index 4fd7c3f3a4..6d4f708576 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py +++ b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0.vpn import ipsecpolicy -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateIpsecpolicy(common.TestNetworkBase): @@ -82,11 +82,11 @@ class TestShowIpsecpolicy(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(ipsecpolicy.ShowIpsecpolicy, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too " + self.given_all_show_options() parsed = self.given_args(ipsecpolicy.ShowIpsecpolicy, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) diff --git a/openstackclient/tests/network/v2_0/vpn/test_service.py b/openstackclient/tests/network/v2_0/vpn/test_service.py index 5ff5652445..751a20a04c 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_service.py +++ b/openstackclient/tests/network/v2_0/vpn/test_service.py @@ -14,7 +14,7 @@ # from openstackclient.network.v2_0.vpn import service -from openstackclient.tests.network.v2_0 import common +from openstackclient.tests.network import common class TestCreateService(common.TestNetworkBase): @@ -73,11 +73,11 @@ class TestShowService(common.TestNetworkBase): def test_get_parser_nothing(self): given = "noo" + self.given_default_show_options() parsed = self.given_args(service.ShowService, given) - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.then_default_show_options(parsed) def test_get_parser_all(self): given = "too " + self.given_all_show_options() parsed = self.given_args(service.ShowService, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.then_all_show_options(parsed) From 2f07ae05141dbd621a4a4162fd6a9fd5a923499e Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Sun, 26 Jan 2014 16:12:59 -0700 Subject: [PATCH 53/66] update common --- openstackclient/network/common.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index 284ba31315..518afc9205 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -42,10 +42,6 @@ def format_data(self, data): i, indent=self.json_indent) if isinstance(i, dict) else str(i) for i in v) data[self.name][k] = value - print '***********************************' - print value.__class__.__name__ - print str(value) - print '***********************************' elif isinstance(v, dict): value = self.dumps(v, indent=self.json_indent) data[self.name][k] = value From 591db16c42e96edfa4adf2603e5484c9c78a4561 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Tue, 28 Jan 2014 05:25:37 -0800 Subject: [PATCH 54/66] remove get client --- openstackclient/network/common.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index 518afc9205..9ea676bdfc 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -173,9 +173,6 @@ def __init__(self, app, app_args): self.func = self.name self.response = self.name - def get_client(self): - return self.app.client_manager.network - def get_parser(self, prog_name): parser = super(ShowCommand, self).get_parser(prog_name) parser.add_argument( From 770062ffdb7c00c54e6ef40b7d619e37aaab33d3 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 30 Jan 2014 08:12:15 -0700 Subject: [PATCH 55/66] list --- openstackclient/network/common.py | 72 +++++++++---------- openstackclient/network/v2_0/dhcp.py | 1 + openstackclient/network/v2_0/floatingip.py | 2 +- openstackclient/network/v2_0/fw/firewall.py | 2 +- openstackclient/network/v2_0/gateway.py | 2 +- .../network/v2_0/lb/healthmonitor.py | 2 +- openstackclient/network/v2_0/lb/member.py | 2 +- openstackclient/network/v2_0/lb/pool.py | 2 + openstackclient/network/v2_0/lb/vip.py | 2 +- openstackclient/network/v2_0/network.py | 4 +- openstackclient/network/v2_0/port.py | 2 + openstackclient/network/v2_0/router.py | 2 + .../network/v2_0/security_group.py | 2 +- .../network/v2_0/security_group_rule.py | 2 +- openstackclient/network/v2_0/subnet.py | 2 +- openstackclient/network/v2_0/vpn/ikepolicy.py | 2 +- .../network/v2_0/vpn/ipsecpolicy.py | 2 +- openstackclient/network/v2_0/vpn/service.py | 2 +- openstackclient/tests/network/test_common.py | 26 ++++--- .../tests/network/v2_0/fw/test_firewall.py | 2 +- .../network/v2_0/lb/test_healthmonitor.py | 2 +- .../tests/network/v2_0/lb/test_member.py | 2 +- .../tests/network/v2_0/lb/test_pool.py | 2 +- .../tests/network/v2_0/lb/test_vip.py | 2 +- .../tests/network/v2_0/test_gateway.py | 2 +- .../tests/network/v2_0/test_network.py | 2 +- .../tests/network/v2_0/test_port.py | 4 +- .../tests/network/v2_0/test_router.py | 6 +- .../tests/network/v2_0/test_security_group.py | 4 +- .../tests/network/v2_0/test_subnet.py | 4 +- .../tests/network/v2_0/vpn/test_ikepolicy.py | 2 +- .../network/v2_0/vpn/test_ipsecpolicy.py | 2 +- .../tests/network/v2_0/vpn/test_service.py | 2 +- 33 files changed, 94 insertions(+), 77 deletions(-) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index 9ea676bdfc..c76970d39b 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -22,9 +22,11 @@ from cliff import show -class BaseShowCommand(show.ShowOne): +class BaseCommand(object): json_indent = None + matters = {} + def dumps(self, value, indent=None): try: return json.dumps(value, indent=indent) @@ -34,29 +36,26 @@ def dumps(self, value, indent=None): def format_data(self, data): # Modify data to make it more readable - if not(self.name in data): - return data - for k, v in data[self.name].iteritems(): - if isinstance(v, list): + for k, v in data.iteritems(): + if k in self.matters: + data[k] = self.matters[k](v) + elif isinstance(v, list): value = '\n'.join(self.dumps( i, indent=self.json_indent) if isinstance(i, dict) else str(i) for i in v) - data[self.name][k] = value + data[k] = value elif isinstance(v, dict): value = self.dumps(v, indent=self.json_indent) - data[self.name][k] = value + data[k] = value elif v is None: - data[self.name][k] = '' - return data[self.name] + data[k] = '' + return data -class CreateCommand(BaseShowCommand): +class CreateCommand(show.ShowOne, BaseCommand): log = logging.getLogger(__name__ + '.CreateCommand') - def get_client(self): - return self.app.client_manager.network - def get_parser(self, prog_name): parser = super(CreateCommand, self).get_parser(prog_name) parser.add_argument( @@ -103,9 +102,12 @@ def take_action(self, parsed_args): class ListCommand(lister.Lister): log = logging.getLogger(__name__ + '.ListCommand') + columns = [] - def get_client(self): - return self.app.client_manager.network + def __init__(self, app, app_args): + super(ListCommand, self).__init__(app, app_args) + self.func = self.resource + self.name = self.resource def get_parser(self, prog_name): parser = super(ListCommand, self).get_parser(prog_name) @@ -120,25 +122,25 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - parsed_args.page_size = None - parsed_args.sort_key = [] - parsed_args.sort_dir = [] - parsed_args.fields = [] - return neuter.take_action(parsed_args) + method = getattr(self.app.client_manager.network, "list_" + self.func) + data = method()[self.resource] + if not self.columns: + self.columns = len(data) > 0 and data[0].keys() or [] + self.columns = [w.replace(':', ' ') for w in self.columns] + return (self.columns, (self.format_data(item) for item in data)) class SetCommand(command.Command): log = logging.getLogger(__name__ + '.SetCommand') - name = "id" - metavar = "" - help_text = "Identifier of object to set" - def get_client(self): - return self.app.client_manager.network + def __init__(self, app, app_args): + super(SetCommand, self).__init__(app, app_args) + self.metavar = "<" + self.name + ">" + self.help_text = "Name or identifier of " + \ + self.name.replace('_', ' ') + " to set" + self.func = self.name + self.body = {} def get_parser(self, prog_name): parser = super(SetCommand, self).get_parser(prog_name) @@ -147,7 +149,7 @@ def get_parser(self, prog_name): dest='tenant_id', help='the owner project id') parser.add_argument( - self.name, + 'identifier', metavar=self.metavar, help=self.help_text, ) @@ -155,13 +157,12 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - return neuter.take_action(parsed_args) + _manager = self.app.client_manager.network + method = getattr(_manager, "update_" + self.func) + return method(parsed_args.identifier, self.body) -class ShowCommand(BaseShowCommand): +class ShowCommand(show.ShowOne, BaseCommand): log = logging.getLogger(__name__ + '.ShowCommand') @@ -185,8 +186,7 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) method = getattr(self.app.client_manager.network, "show_" + self.func) - data = method(parsed_args.identifier) - data = self.format_data(data) + data = self.format_data(method(parsed_args.identifier)) return zip(*sorted(six.iteritems(data))) diff --git a/openstackclient/network/v2_0/dhcp.py b/openstackclient/network/v2_0/dhcp.py index 8cea252026..1837cd3a24 100644 --- a/openstackclient/network/v2_0/dhcp.py +++ b/openstackclient/network/v2_0/dhcp.py @@ -47,6 +47,7 @@ class ListDhcpAgent(common.ListCommand): """List DHCP agents on a network""" clazz = neu2.ListDhcpAgentsHostingNetwork + resource = 'dhcp_agent' def get_parser(self, prog_name): parser = super(ListDhcpAgent, self).get_parser(prog_name) diff --git a/openstackclient/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py index 7e5e0784ff..f89677d067 100644 --- a/openstackclient/network/v2_0/floatingip.py +++ b/openstackclient/network/v2_0/floatingip.py @@ -50,7 +50,7 @@ class DeleteFloatingIp(common.DeleteCommand): class ListFloatingIp(common.ListCommand): """List floating IPs""" - clazz = neu2.ListFloatingIP + resource = 'floatingips' class ShowFloatingIp(common.ShowCommand): diff --git a/openstackclient/network/v2_0/fw/firewall.py b/openstackclient/network/v2_0/fw/firewall.py index 928750598f..7313125dd0 100644 --- a/openstackclient/network/v2_0/fw/firewall.py +++ b/openstackclient/network/v2_0/fw/firewall.py @@ -74,7 +74,7 @@ class DeleteFirewall(common.DeleteCommand): class ListFirewall(common.ListCommand): """List firewall""" - clazz = neu2.ListFirewall + resource = 'firewalls' class SetFirewall(common.SetCommand): diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py index b28bb9d50f..c542343d45 100644 --- a/openstackclient/network/v2_0/gateway.py +++ b/openstackclient/network/v2_0/gateway.py @@ -51,7 +51,7 @@ class DeleteGateway(common.DeleteCommand): class ListGateway(common.ListCommand): """List gateways""" - clazz = neu2.ListNetworkGateway + resource = 'network_gateways' class SetGateway(common.SetCommand): diff --git a/openstackclient/network/v2_0/lb/healthmonitor.py b/openstackclient/network/v2_0/lb/healthmonitor.py index da70b6ae98..4ec676d544 100644 --- a/openstackclient/network/v2_0/lb/healthmonitor.py +++ b/openstackclient/network/v2_0/lb/healthmonitor.py @@ -81,7 +81,7 @@ class DeleteHealthMonitor(common.DeleteCommand): class ListHealthMonitor(common.ListCommand): """List load balancer health monitor""" - clazz = neu2.ListHealthMonitor + resource = 'health_monitors' class SetHealthMonitor(common.SetCommand): diff --git a/openstackclient/network/v2_0/lb/member.py b/openstackclient/network/v2_0/lb/member.py index 987b87342a..58aba3e634 100644 --- a/openstackclient/network/v2_0/lb/member.py +++ b/openstackclient/network/v2_0/lb/member.py @@ -60,7 +60,7 @@ class DeleteMember(common.DeleteCommand): class ListMember(common.ListCommand): """List load balancer member""" - clazz = neu2.ListMember + resource = 'members' class SetMember(common.SetCommand): diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py index ada20735e6..ca5ff2b057 100644 --- a/openstackclient/network/v2_0/lb/pool.py +++ b/openstackclient/network/v2_0/lb/pool.py @@ -70,6 +70,8 @@ class DeletePool(common.DeleteCommand): class ListPool(common.ListCommand): """List load balancer pool""" + resource = 'pools' + def get_parser(self, prog_name): parser = super(ListPool, self).get_parser(prog_name) parser.add_argument( diff --git a/openstackclient/network/v2_0/lb/vip.py b/openstackclient/network/v2_0/lb/vip.py index aa8b33a4d8..ecd0490d36 100644 --- a/openstackclient/network/v2_0/lb/vip.py +++ b/openstackclient/network/v2_0/lb/vip.py @@ -74,7 +74,7 @@ class DeleteVip(common.DeleteCommand): class ListVip(common.ListCommand): """List load balancer VIP""" - clazz = neu2.ListVip + resource = 'vips' class SetVip(common.SetCommand): diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index db5cbfd623..9812022049 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -54,6 +54,8 @@ class DeleteNetwork(common.DeleteCommand): class ListNetwork(common.ListCommand): """List networks""" + resource = "networks" + def get_parser(self, prog_name): parser = super(ListNetwork, self).get_parser(prog_name) parser.add_argument( @@ -76,7 +78,7 @@ def take_action(self, parsed_args): if parsed_args.dhcp_agent: neuter = agent.ListNetworksOnDhcpAgent(self.app, self.app_args) else: - neuter = neu2.ListNetwork(self.app, self.app_args) + return super(ListNetwork, self).take_action(parsed_args) neuter.get_client = self.get_client parsed_args.request_format = 'json' parsed_args.fields = [] diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index 1afe29bc4f..78aa8a6a79 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -87,6 +87,8 @@ class DeletePort(common.DeleteCommand): class ListPort(common.ListCommand): """List port""" + resource = 'ports' + def get_parser(self, prog_name): parser = super(ListPort, self).get_parser(prog_name) parser.add_argument( diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index 62bfb978af..d433582bff 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -58,6 +58,8 @@ class DeleteRouter(common.DeleteCommand): class ListRouter(common.ListCommand): """List router""" + resource = 'routers' + def get_parser(self, prog_name): parser = super(ListRouter, self).get_parser(prog_name) parser.add_argument( diff --git a/openstackclient/network/v2_0/security_group.py b/openstackclient/network/v2_0/security_group.py index 6342c02183..be8ba91c24 100644 --- a/openstackclient/network/v2_0/security_group.py +++ b/openstackclient/network/v2_0/security_group.py @@ -47,7 +47,7 @@ class DeleteSecurityGroup(common.DeleteCommand): class ListSecurityGroup(common.ListCommand): """List security group""" - clazz = neu2.ListSecurityGroup + resource = 'security_groups' class SetSecurityGroup(common.SetCommand): diff --git a/openstackclient/network/v2_0/security_group_rule.py b/openstackclient/network/v2_0/security_group_rule.py index 8367673083..53e4f18513 100644 --- a/openstackclient/network/v2_0/security_group_rule.py +++ b/openstackclient/network/v2_0/security_group_rule.py @@ -69,7 +69,7 @@ class DeleteSecurityGroupRule(common.DeleteCommand): class ListSecurityGroupRule(common.ListCommand): """List security group rule""" - clazz = neu2.ListSecurityGroupRule + resource = 'security_group_rules' def get_parser(self, prog_name): parser = super(ListSecurityGroupRule, self).get_parser(prog_name) diff --git a/openstackclient/network/v2_0/subnet.py b/openstackclient/network/v2_0/subnet.py index 44d16e26c6..ede5446db0 100644 --- a/openstackclient/network/v2_0/subnet.py +++ b/openstackclient/network/v2_0/subnet.py @@ -110,7 +110,7 @@ class DeleteSubnet(common.DeleteCommand): class ListSubnet(common.ListCommand): """List subnet""" - clazz = neu2.ListSubnet + resource = 'subnets' class SetSubnet(common.SetCommand): diff --git a/openstackclient/network/v2_0/vpn/ikepolicy.py b/openstackclient/network/v2_0/vpn/ikepolicy.py index 12072967cc..71279d83dc 100644 --- a/openstackclient/network/v2_0/vpn/ikepolicy.py +++ b/openstackclient/network/v2_0/vpn/ikepolicy.py @@ -78,7 +78,7 @@ class DeleteIkepolicy(common.DeleteCommand): class ListIkepolicy(common.ListCommand): """List IKE policies""" - clazz = neu2.ListIKEPolicy + resource = 'ike_policies' class SetIkepolicy(common.SetCommand): diff --git a/openstackclient/network/v2_0/vpn/ipsecpolicy.py b/openstackclient/network/v2_0/vpn/ipsecpolicy.py index 0c9c27aaed..c5d8cb1662 100644 --- a/openstackclient/network/v2_0/vpn/ipsecpolicy.py +++ b/openstackclient/network/v2_0/vpn/ipsecpolicy.py @@ -77,7 +77,7 @@ class DeleteIpsecpolicy(common.DeleteCommand): class ListIpsecpolicy(common.ListCommand): """List IPSec policies""" - clazz = neu2.ListIPsecPolicy + resource = 'ipsec_policies' class SetIpsecpolicy(common.SetCommand): diff --git a/openstackclient/network/v2_0/vpn/service.py b/openstackclient/network/v2_0/vpn/service.py index 6ffeb38798..dc1539b554 100644 --- a/openstackclient/network/v2_0/vpn/service.py +++ b/openstackclient/network/v2_0/vpn/service.py @@ -57,7 +57,7 @@ class DeleteService(common.DeleteCommand): class ListService(common.ListCommand): """List VPN service""" - clazz = neu2.ListVPNService + resource = 'services' class SetService(common.SetCommand): diff --git a/openstackclient/tests/network/test_common.py b/openstackclient/tests/network/test_common.py index 9a68d53dd9..3fb4c52128 100644 --- a/openstackclient/tests/network/test_common.py +++ b/openstackclient/tests/network/test_common.py @@ -17,24 +17,32 @@ from openstackclient.tests.network import common as test_common -class TestBaseShowCommand(test_common.TestNetworkBase): +def format_subnet(value): + return ",".join(value) + + +class TestBaseCommand(test_common.TestNetworkBase): class Shower(common.ShowCommand): name = "testable" - + matters = {"subnet": format_subnet} def test_format_output(self): shower = self.Shower(None, None) - result = shower.format_data({"testable": - {"ka": [{"ka1": "va1", "ka2": "va2"}, {"ka3": "va3", "ka4": "va4"}, {"ka5": "va5", "ka6": "va6"}], - "kb": {"k4": "v4"}, - "kc": {"ka1": {"ka2": "v3"}}, - "kd": None, - "ke": u"ve"}}) + _listo = [{"ka1": "va1", "ka2": "va2"}, + {"ka3": "va3", "ka4": "va4"}, + {"ka5": "va5", "ka6": "va6"}] + result = shower.format_data({"ka": _listo, + "kb": {"k4": "v4"}, + "kc": {"ka1": {"ka2": "v3"}}, + "kd": None, + "subnet": ["one", "two"], + "ke": u"ve"}) self.assertEqual({'ka': '{"ka2": "va2", "ka1": "va1"}\n' + '{"ka3": "va3", "ka4": "va4"}\n' + '{"ka6": "va6", "ka5": "va5"}', 'kb': '{"k4": "v4"}', 'kc': '{"ka1": {"ka2": "v3"}}', 'kd': '', - 'ke': u've'}, result) + 'ke': u've', + 'subnet': 'one,two'}, result) diff --git a/openstackclient/tests/network/v2_0/fw/test_firewall.py b/openstackclient/tests/network/v2_0/fw/test_firewall.py index 9623dc9f4d..e028d6071b 100644 --- a/openstackclient/tests/network/v2_0/fw/test_firewall.py +++ b/openstackclient/tests/network/v2_0/fw/test_firewall.py @@ -66,7 +66,7 @@ def test_get_parser_all(self): class TestSetFirewall(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(firewall.SetFirewall, "noo") - self.assertEqual('noo', parsed.firewall) + self.assertEqual('noo', parsed.identifier) class TestShowFirewall(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py index 79df83f5c8..0906537fad 100644 --- a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py +++ b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py @@ -75,7 +75,7 @@ def test_get_parser_all(self): class TestSetLbHealthMonitor(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(healthmonitor.SetHealthMonitor, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestShowLbHealthMonitor(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/lb/test_member.py b/openstackclient/tests/network/v2_0/lb/test_member.py index 54ea81d5bc..2999221e4e 100644 --- a/openstackclient/tests/network/v2_0/lb/test_member.py +++ b/openstackclient/tests/network/v2_0/lb/test_member.py @@ -68,7 +68,7 @@ def test_get_parser_all(self): class TestSetLbMember(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(member.SetMember, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestShowLbMember(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/lb/test_pool.py b/openstackclient/tests/network/v2_0/lb/test_pool.py index ea991187cb..f45ab50145 100644 --- a/openstackclient/tests/network/v2_0/lb/test_pool.py +++ b/openstackclient/tests/network/v2_0/lb/test_pool.py @@ -74,7 +74,7 @@ def test_get_parser_all(self): class TestSetLbPool(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(pool.SetPool, "noo") - self.assertEqual('noo', parsed.pool) + self.assertEqual('noo', parsed.identifier) class TestShowLbPool(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/lb/test_vip.py b/openstackclient/tests/network/v2_0/lb/test_vip.py index 3beeb60cf0..712a68470d 100644 --- a/openstackclient/tests/network/v2_0/lb/test_vip.py +++ b/openstackclient/tests/network/v2_0/lb/test_vip.py @@ -77,7 +77,7 @@ def test_get_parser_all(self): class TestSetLbVip(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(vip.SetVip, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestShowLbVip(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_gateway.py b/openstackclient/tests/network/v2_0/test_gateway.py index 815b3f05fd..1b764dbd28 100644 --- a/openstackclient/tests/network/v2_0/test_gateway.py +++ b/openstackclient/tests/network/v2_0/test_gateway.py @@ -59,7 +59,7 @@ def test_get_parser_all(self): class TestSetGateway(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(gateway.SetGateway, "noo") - self.assertEqual('noo', parsed.gateway) + self.assertEqual('noo', parsed.identifier) class TestShowGateway(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index a9b2cd0039..0836085dd4 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -66,7 +66,7 @@ def test_get_parser_all(self): class TestSetNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(network.SetNetwork, "noo") - self.assertEqual('noo', parsed.network) + self.assertEqual('noo', parsed.identifier) class TestShowNetwork(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_port.py b/openstackclient/tests/network/v2_0/test_port.py index 68d02c240e..87e24be2d3 100644 --- a/openstackclient/tests/network/v2_0/test_port.py +++ b/openstackclient/tests/network/v2_0/test_port.py @@ -78,7 +78,7 @@ def test_get_parser_all(self): class TestSetPort(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(port.SetPort, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.assertEqual([], parsed.extra_dhcp_opts) self.assertEqual(False, parsed.no_security_groups) self.assertEqual([], parsed.security_groups) @@ -87,7 +87,7 @@ def test_get_parser_all(self): given = 'too --extra-dhcp-opt DO --security-group ONE ' \ '--security-group TWO ' parsed = self.given_args(port.SetPort, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.assertEqual(['DO'], parsed.extra_dhcp_opts) self.assertEqual(False, parsed.no_security_groups) self.assertEqual(['ONE', 'TWO'], parsed.security_groups) diff --git a/openstackclient/tests/network/v2_0/test_router.py b/openstackclient/tests/network/v2_0/test_router.py index fc6838926d..b94f2fb26b 100644 --- a/openstackclient/tests/network/v2_0/test_router.py +++ b/openstackclient/tests/network/v2_0/test_router.py @@ -73,7 +73,7 @@ def test_get_parser_all(self): class TestSetRouter(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(router.SetRouter, "noo") - self.assertEqual('noo', parsed.router_id) + self.assertEqual('noo', parsed.identifier) self.assertEqual(None, parsed.external_network_id) self.assertEqual(False, parsed.no_gateway) self.assertEqual(False, parsed.disable_snat) @@ -81,7 +81,7 @@ def test_get_parser_nothing(self): def test_get_parser_all(self): given = 'too --disable-snat --no-gateway' parsed = self.given_args(router.SetRouter, given) - self.assertEqual('too', parsed.router_id) + self.assertEqual('too', parsed.identifier) self.assertEqual(None, parsed.external_network_id) self.assertEqual(True, parsed.no_gateway) self.assertEqual(True, parsed.disable_snat) @@ -89,7 +89,7 @@ def test_get_parser_all(self): def test_get_parser_all_enable(self): given = 'too --gateway way --enable-snat' parsed = self.given_args(router.SetRouter, given) - self.assertEqual('too', parsed.router_id) + self.assertEqual('too', parsed.identifier) self.assertEqual('way', parsed.external_network_id) self.assertEqual(False, parsed.no_gateway) self.assertEqual(False, parsed.disable_snat) diff --git a/openstackclient/tests/network/v2_0/test_security_group.py b/openstackclient/tests/network/v2_0/test_security_group.py index a51d1b0808..cab61c461d 100644 --- a/openstackclient/tests/network/v2_0/test_security_group.py +++ b/openstackclient/tests/network/v2_0/test_security_group.py @@ -59,13 +59,13 @@ def test_get_parser_all(self): class TestSetSecurityGroup(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(security_group.SetSecurityGroup, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) self.assertEqual(None, parsed.description) def test_get_parser_all(self): given = 'too --description noosgtoo' parsed = self.given_args(security_group.SetSecurityGroup, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) self.assertEqual('noosgtoo', parsed.description) diff --git a/openstackclient/tests/network/v2_0/test_subnet.py b/openstackclient/tests/network/v2_0/test_subnet.py index ace42b8f86..cf1d584fbd 100644 --- a/openstackclient/tests/network/v2_0/test_subnet.py +++ b/openstackclient/tests/network/v2_0/test_subnet.py @@ -95,12 +95,12 @@ def test_get_parser_all(self): class TestSetSubnet(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(subnet.SetSubnet, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) def test_get_parser_all(self): given = 'too' parsed = self.given_args(subnet.SetSubnet, given) - self.assertEqual('too', parsed.id) + self.assertEqual('too', parsed.identifier) class TestShowSubnet(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py index abf4fbf73a..47fb27206a 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py +++ b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py @@ -76,7 +76,7 @@ def test_get_parser_all(self): class TestSetIkepolicy(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(ikepolicy.SetIkepolicy, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestShowIkepolicy(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py index 6d4f708576..fa71a2cec7 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py +++ b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py @@ -75,7 +75,7 @@ def test_get_parser_all(self): class TestSetIpsecpolicy(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(ipsecpolicy.SetIpsecpolicy, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestShowIpsecpolicy(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/vpn/test_service.py b/openstackclient/tests/network/v2_0/vpn/test_service.py index 751a20a04c..295e0d87b0 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_service.py +++ b/openstackclient/tests/network/v2_0/vpn/test_service.py @@ -66,7 +66,7 @@ def test_get_parser_all(self): class TestSetService(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(service.SetService, "noo") - self.assertEqual('noo', parsed.service) + self.assertEqual('noo', parsed.identifier) class TestShowService(common.TestNetworkBase): From ef5b7c15179c0db68fa587afbd28735668b789dc Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 5 Feb 2014 10:38:26 -0700 Subject: [PATCH 56/66] dxcli-1234 change everything Change-Id: I0b6b664b6d4b911858e9b1f73f12125b6c92bdf2 --- openstackclient/network/common.py | 155 +++++++++++++----- openstackclient/network/v2_0/dhcp.py | 2 +- openstackclient/network/v2_0/floatingip.py | 13 +- openstackclient/network/v2_0/fw/firewall.py | 14 +- openstackclient/network/v2_0/gateway.py | 20 +-- .../network/v2_0/lb/healthmonitor.py | 14 +- openstackclient/network/v2_0/lb/member.py | 14 +- openstackclient/network/v2_0/lb/pool.py | 14 +- openstackclient/network/v2_0/lb/vip.py | 14 +- openstackclient/network/v2_0/network.py | 32 +--- openstackclient/network/v2_0/port.py | 14 +- openstackclient/network/v2_0/router.py | 15 +- .../network/v2_0/security_group.py | 14 +- .../network/v2_0/security_group_rule.py | 16 +- openstackclient/network/v2_0/subnet.py | 14 +- openstackclient/network/v2_0/vpn/ikepolicy.py | 18 +- .../network/v2_0/vpn/ipsecpolicy.py | 16 +- openstackclient/network/v2_0/vpn/service.py | 12 +- openstackclient/tests/network/common.py | 89 ---------- .../tests/network/v2_0/fw/test_firewall.py | 2 +- .../network/v2_0/lb/test_healthmonitor.py | 2 +- .../tests/network/v2_0/lb/test_member.py | 2 +- .../tests/network/v2_0/lb/test_vip.py | 2 +- .../tests/network/v2_0/test_floatingip.py | 2 +- .../tests/network/v2_0/test_gateway.py | 2 +- .../tests/network/v2_0/test_network.py | 2 +- .../tests/network/v2_0/test_port.py | 2 +- .../tests/network/v2_0/test_router.py | 2 +- .../tests/network/v2_0/test_security_group.py | 2 +- .../network/v2_0/test_security_group_rule.py | 2 +- .../tests/network/v2_0/test_subnet.py | 2 +- .../tests/network/v2_0/vpn/test_ikepolicy.py | 2 +- .../network/v2_0/vpn/test_ipsecpolicy.py | 2 +- .../tests/network/v2_0/vpn/test_service.py | 2 +- 34 files changed, 226 insertions(+), 304 deletions(-) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index c76970d39b..bbb0a37d51 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -21,6 +21,8 @@ from cliff import lister from cliff import show +from openstackclient.common import exceptions + class BaseCommand(object): json_indent = None @@ -34,28 +36,72 @@ def dumps(self, value, indent=None): pass return json.dumps(to_primitive(value)) - def format_data(self, data): - # Modify data to make it more readable + def format_row(self, data): + row = [] for k, v in data.iteritems(): if k in self.matters: - data[k] = self.matters[k](v) + row.append(self.matters[k](v)) elif isinstance(v, list): value = '\n'.join(self.dumps( i, indent=self.json_indent) if isinstance(i, dict) else str(i) for i in v) - data[k] = value + row.append(value) + elif isinstance(v, dict): + row.append(self.dumps(v, indent=self.json_indent)) + elif v is None: + row.append('') + else: + row.append(v) + return row + + def data_formatter(self, data): + d = {} + for k, v in data.iteritems(): + if k in self.matters: + d[k] = self.matters[k](v) + elif isinstance(v, list): + d[k] = ','.join(self.dumps( + i, indent=self.json_indent) if isinstance(i, dict) + else str(i) for i in v) elif isinstance(v, dict): - value = self.dumps(v, indent=self.json_indent) - data[k] = value + d[k] = self.dumps(v, indent=self.json_indent) elif v is None: - data[k] = '' - return data + d[k] = '' + else: + d[k] = v + return d + + def get_list_method(self): + return getattr(self.app.client_manager.network, + "list_%s" % self.resources) + + def find_resource(self, name): + client = self.app.client_manager.network + list_method = self.get_list_method() + data = list_method(name=name, fields='id') + info = data[self.resources] + if len(info) == 1: + return info[0]['id'] + if len(info) > 1: + msg = "More than one %s exists with the name '%s'." % \ + (self.resource, name) + raise exceptions.CommandError(msg) + data = list_method(id=name, fields='id') + info = data[self.resources] + if len(info) == 1: + return info[0]['id'] + msg = "No %s with a name or ID of '%s' exists." % \ + (self.resource, name) + raise exceptions.CommandError(msg) class CreateCommand(show.ShowOne, BaseCommand): log = logging.getLogger(__name__ + '.CreateCommand') + def get_client(self): + return self.app.client_manager.network + def get_parser(self, prog_name): parser = super(CreateCommand, self).get_parser(prog_name) parser.add_argument( @@ -72,42 +118,54 @@ def take_action(self, parsed_args): return neuter.take_action(parsed_args) -class DeleteCommand(command.Command): +class DeleteCommand(command.Command, BaseCommand): log = logging.getLogger(__name__ + '.DeleteCommand') - name = "id" - metavar = "" - help_text = "Identifier of object to delete" + allow_names = True + + def __init__(self, app, app_args): + super(DeleteCommand, self).__init__(app, app_args) + self.resources = getattr(self, 'resources', (self.resource + "s")) + self.metavar = "<" + self.resource + ">" + self.help_text = getattr(self, 'help_text', "Name or identifier " + \ + "of " + self.resource.replace('_', ' ') + " to delete") + self.func = getattr(self, 'func', self.resource) + self.response = self.resource - def get_client(self): - return self.app.client_manager.network def get_parser(self, prog_name): parser = super(DeleteCommand, self).get_parser(prog_name) parser.add_argument( - self.name, + 'identifier', metavar=self.metavar, - help=self.help_text, + help=self.help_text ) return parser def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - return neuter.run(parsed_args) + if self.allow_names: + _id = self.find_resource(parsed_args.identifier) + else: + _id = parsed_args.identifier + delete_method = getattr(self.app.client_manager.network, "delete_" + + self.func) + delete_method(_id) + print >>self.app.stdout, ('Deleted %(resource)s: %(id)s' + % {'id': parsed_args.identifier, 'resource': self.resource}) + return -class ListCommand(lister.Lister): +class ListCommand(lister.Lister, BaseCommand): log = logging.getLogger(__name__ + '.ListCommand') columns = [] + report_filter = {} def __init__(self, app, app_args): super(ListCommand, self).__init__(app, app_args) - self.func = self.resource - self.name = self.resource + self.resources = getattr(self, 'resources', (self.resource + "s")) + self.func = getattr(self, 'func', self.resources) def get_parser(self, prog_name): parser = super(ListCommand, self).get_parser(prog_name) @@ -122,24 +180,26 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - method = getattr(self.app.client_manager.network, "list_" + self.func) - data = method()[self.resource] + list_method = self.get_list_method() + data = list_method(**self.report_filter)[self.resources] if not self.columns: self.columns = len(data) > 0 and data[0].keys() or [] self.columns = [w.replace(':', ' ') for w in self.columns] - return (self.columns, (self.format_data(item) for item in data)) + return (self.columns, (self.format_row(item) for item in data)) -class SetCommand(command.Command): +class SetCommand(command.Command, BaseCommand): log = logging.getLogger(__name__ + '.SetCommand') + allow_names = True def __init__(self, app, app_args): super(SetCommand, self).__init__(app, app_args) - self.metavar = "<" + self.name + ">" - self.help_text = "Name or identifier of " + \ - self.name.replace('_', ' ') + " to set" - self.func = self.name + self.resources = getattr(self, 'resources', (self.resource + "s")) + self.metavar = "<" + self.resource + ">" + self.help_text = getattr(self, 'help_text', "Name or identifier " + \ + "of " + self.resource.replace('_', ' ') + " to set") + self.func = getattr(self, 'func', self.resource) self.body = {} def get_parser(self, prog_name): @@ -158,21 +218,31 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) _manager = self.app.client_manager.network - method = getattr(_manager, "update_" + self.func) - return method(parsed_args.identifier, self.body) + if self.allow_names: + _id = self.find_resource(parsed_args.identifier) + else: + _id = parsed_args.identifier + update_method = getattr(_manager, "update_" + self.func) + update_method(_id, self.body) + print >>self.app.stdout, ('Updated %(resource)s: %(id)s' % + {'id': parsed_args.identifier, 'resource': self.resource}) + return + class ShowCommand(show.ShowOne, BaseCommand): log = logging.getLogger(__name__ + '.ShowCommand') + allow_names = True def __init__(self, app, app_args): super(ShowCommand, self).__init__(app, app_args) - self.metavar = "<" + self.name + ">" - self.help_text = "Name or identifier of " + \ - self.name.replace('_', ' ') + " to show" - self.func = self.name - self.response = self.name + self.resources = getattr(self, 'resources', (self.resource + "s")) + self.metavar = "<" + self.resource + ">" + self.help_text = getattr(self, 'help_text', "Name or identifier " + \ + "of " + self.resource.replace('_', ' ') + " to show") + self.func = getattr(self, 'func', self.resource) + self.response = self.resource def get_parser(self, prog_name): parser = super(ShowCommand, self).get_parser(prog_name) @@ -185,8 +255,13 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - method = getattr(self.app.client_manager.network, "show_" + self.func) - data = self.format_data(method(parsed_args.identifier)) + if self.allow_names: + _id = self.find_resource(parsed_args.identifier) + else: + _id = parsed_args.identifier + show_method = getattr(self.app.client_manager.network, + "show_" + self.func) + data = self.data_formatter(show_method(_id)[self.resource]) return zip(*sorted(six.iteritems(data))) diff --git a/openstackclient/network/v2_0/dhcp.py b/openstackclient/network/v2_0/dhcp.py index 1837cd3a24..99509a1365 100644 --- a/openstackclient/network/v2_0/dhcp.py +++ b/openstackclient/network/v2_0/dhcp.py @@ -32,7 +32,7 @@ class AddNetworkDhcpAgent(common.AddCommand): class RemoveNetworkDhcpAgent(common.RemoveCommand): - """Delete a gateway""" + """Remove network DHCP Agent""" clazz = neu2.RemoveNetworkFromDhcpAgent container_name = "network" diff --git a/openstackclient/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py index f89677d067..06b76f240b 100644 --- a/openstackclient/network/v2_0/floatingip.py +++ b/openstackclient/network/v2_0/floatingip.py @@ -43,21 +43,20 @@ def get_parser(self, prog_name): class DeleteFloatingIp(common.DeleteCommand): """Delete a floating IP""" - clazz = neu2.DeleteFloatingIP + resource = 'floatingip' + allow_names = False help_text = "Identifier of floating IP to delete" class ListFloatingIp(common.ListCommand): """List floating IPs""" - resource = 'floatingips' + resource = 'floatingip' class ShowFloatingIp(common.ShowCommand): """Show floating IP details""" - name = "floatingip" - - def __init__(self, app, app_args): - super(ShowFloatingIp, self).__init__(app, app_args) - self.help_text = "Identitifer of floating IP to show" + resource = "floatingip" + help_text = "Identitifer of floating IP to show" + allow_names = False diff --git a/openstackclient/network/v2_0/fw/firewall.py b/openstackclient/network/v2_0/fw/firewall.py index 7313125dd0..47cfc7ac61 100644 --- a/openstackclient/network/v2_0/fw/firewall.py +++ b/openstackclient/network/v2_0/fw/firewall.py @@ -65,28 +65,24 @@ def get_parser(self, prog_name): class DeleteFirewall(common.DeleteCommand): """Delete a firewall""" - clazz = neu2.DeleteFirewall - name = 'firewall' - metavar = '' + resource = 'firewall' help_text = 'Name or ID of firewall to delete' class ListFirewall(common.ListCommand): """List firewall""" - resource = 'firewalls' + resource = 'firewall' class SetFirewall(common.SetCommand): """Set firewall values""" - clazz = neu2.UpdateFirewall - name = 'firewall' - metavar = '' - help_text = 'ID of firewall to update' + resource = 'firewall' + help_text = 'ID of firewall to set' class ShowFirewall(common.ShowCommand): """Show firewall details""" - name = 'firewall' + resource = 'firewall' diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py index c542343d45..8c6d3e2875 100644 --- a/openstackclient/network/v2_0/gateway.py +++ b/openstackclient/network/v2_0/gateway.py @@ -42,31 +42,31 @@ def get_parser(self, prog_name): class DeleteGateway(common.DeleteCommand): """Delete a gateway""" - clazz = neu2.DeleteNetworkGateway - name = 'id' - metavar = '' - help_text = 'Name or ID of gateway to delete' + resource = 'gateway' + resources = 'network_gateways' class ListGateway(common.ListCommand): """List gateways""" - resource = 'network_gateways' + resource = 'network_gateway' + resources = 'network_gateways' class SetGateway(common.SetCommand): """Set gateway values""" - clazz = neu2.UpdateNetworkGateway - name = 'gateway' - metavar = '' - help_text = 'Name or ID of gateway to set' + resource = 'gateway' + resources = 'network_gateways' + func = 'network_gateway' class ShowGateway(common.ShowCommand): """Show gateway details""" - name = 'gateway' + resource = 'gateway' + resources = 'network_gateways' + func = 'network_gateway' def __init__(self, app, app_args): super(ShowGateway, self).__init__(app, app_args) diff --git a/openstackclient/network/v2_0/lb/healthmonitor.py b/openstackclient/network/v2_0/lb/healthmonitor.py index 4ec676d544..2048176e7a 100644 --- a/openstackclient/network/v2_0/lb/healthmonitor.py +++ b/openstackclient/network/v2_0/lb/healthmonitor.py @@ -72,31 +72,27 @@ def get_parser(self, prog_name): class DeleteHealthMonitor(common.DeleteCommand): """Delete a load balancer health monitor""" - clazz = neu2.DeleteHealthMonitor - name = 'id' - metavar = '' + resource = 'health_monitor' help_text = 'Name or ID of load balancer health monitor to delete' class ListHealthMonitor(common.ListCommand): """List load balancer health monitor""" - resource = 'health_monitors' + resource = 'health_monitor' class SetHealthMonitor(common.SetCommand): """Set load balancer health monitor values""" - clazz = neu2.UpdateHealthMonitor - name = 'id' - metavar = '' - help_text = 'Name or ID of load balancer health monitor to update' + resource = 'health_monitor' + help_text = 'Name or ID of load balancer health monitor to set' class ShowHealthMonitor(common.ShowCommand): """Show load balancer health monitor details""" - name = 'health_monitor' + resource = 'health_monitor' class AddPool(common.AddCommand): diff --git a/openstackclient/network/v2_0/lb/member.py b/openstackclient/network/v2_0/lb/member.py index 58aba3e634..9f8458123b 100644 --- a/openstackclient/network/v2_0/lb/member.py +++ b/openstackclient/network/v2_0/lb/member.py @@ -51,28 +51,24 @@ def get_parser(self, prog_name): class DeleteMember(common.DeleteCommand): """Delete a load balancer member""" - clazz = neu2.DeleteMember - name = 'id' - metavar = '' + resource = 'member' help_text = 'Name or ID of load balancer member to delete' class ListMember(common.ListCommand): """List load balancer member""" - resource = 'members' + resource = 'member' class SetMember(common.SetCommand): """Set load balancer member values""" - clazz = neu2.UpdateMember - name = 'id' - metavar = '' - help_text = 'Name or ID of load balancer member to update' + resource = 'member' + help_text = 'Name or ID of load balancer member to set' class ShowMember(common.ShowCommand): """Show load balancer member details""" - name = 'member' + resource = 'member' diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py index ca5ff2b057..a2d5a2aa18 100644 --- a/openstackclient/network/v2_0/lb/pool.py +++ b/openstackclient/network/v2_0/lb/pool.py @@ -61,16 +61,14 @@ def get_parser(self, prog_name): class DeletePool(common.DeleteCommand): """Delete a load balancer pool""" - clazz = neu2.DeletePool - name = 'pool' - metavar = '' + resource = 'pool' help_text = 'Name or ID of load balancer pool to delete' class ListPool(common.ListCommand): """List load balancer pool""" - resource = 'pools' + resource = 'pool' def get_parser(self, prog_name): parser = super(ListPool, self).get_parser(prog_name) @@ -99,16 +97,14 @@ def take_action(self, parsed_args): class SetPool(common.SetCommand): """Set load balancer pool values""" - clazz = neu2.UpdatePool - name = 'pool' - metavar = '' - help_text = 'Name or ID of load balancer pool to update' + resource = 'pool' + help_text = 'Name or ID of load balancer pool to set' class ShowPool(common.ShowCommand): """Show load balancer pool details""" - name = 'pool' + resource = 'pool' def get_parser(self, prog_name): parser = super(ShowPool, self).get_parser(prog_name) diff --git a/openstackclient/network/v2_0/lb/vip.py b/openstackclient/network/v2_0/lb/vip.py index ecd0490d36..b3a2ee062e 100644 --- a/openstackclient/network/v2_0/lb/vip.py +++ b/openstackclient/network/v2_0/lb/vip.py @@ -65,28 +65,24 @@ def get_parser(self, prog_name): class DeleteVip(common.DeleteCommand): """Delete a load balancer VIP""" - clazz = neu2.DeleteVip - name = 'id' - metavar = '' + resource = 'vip' help_text = 'Name or ID of load balancer VIP to delete' class ListVip(common.ListCommand): """List load balancer VIP""" - resource = 'vips' + resource = 'vip' class SetVip(common.SetCommand): """Set load balancer VIP values""" - clazz = neu2.UpdateVip - name = 'id' - metavar = '' - help_text = 'Name or ID of load balancer VIP to update' + resource = 'vip' + help_text = 'Name or ID of load balancer VIP to set' class ShowVip(common.ShowCommand): """Show load balancer VIP details""" - name = 'vip' + resource = 'vip' diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 9812022049..d8860e69a8 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -45,16 +45,13 @@ def get_parser(self, prog_name): class DeleteNetwork(common.DeleteCommand): """Delete a network""" - clazz = neu2.DeleteNetwork - name = 'id' - metavar = '' - help_text = 'Name or ID of network to delete' + resource = 'network' class ListNetwork(common.ListCommand): """List networks""" - resource = "networks" + resource = "network" def get_parser(self, prog_name): parser = super(ListNetwork, self).get_parser(prog_name) @@ -73,34 +70,23 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) if parsed_args.external: - neuter = neu2.ListExternalNetwork(self.app, self.app_args) - else: - if parsed_args.dhcp_agent: - neuter = agent.ListNetworksOnDhcpAgent(self.app, self.app_args) - else: - return super(ListNetwork, self).take_action(parsed_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - parsed_args.fields = [] - parsed_args.page_size = None - parsed_args.sort_key = [] - parsed_args.sort_dir = [] - return neuter.take_action(parsed_args) + self.report_filter={'router:external': True} + elif parsed_args.dhcp_agent: + self.resources = 'networks_on_dhcp_agent' + self.report_filter = {'dhcp_agent': parsed_args.dhcp_agent} + return super(ListNetwork, self).take_action(parsed_args) class SetNetwork(common.SetCommand): """Set network values""" - clazz = neu2.UpdateNetwork - name = 'network' - metavar = '' - help_text = 'Name or ID of network to set' + resource = 'network' class ShowNetwork(common.ShowCommand): """Show network details""" - name = 'network' + resource = 'network' class AddGatewayNetwork(common.AddCommand): diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index 78aa8a6a79..d531e70b16 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -78,16 +78,13 @@ def get_parser(self, prog_name): class DeletePort(common.DeleteCommand): """Delete a port""" - clazz = neu2.DeletePort - name = 'id' - metavar = '' - help_text = 'Name or ID of port to delete' + resource = 'port' class ListPort(common.ListCommand): """List port""" - resource = 'ports' + resource = 'port' def get_parser(self, prog_name): parser = super(ListPort, self).get_parser(prog_name) @@ -116,10 +113,7 @@ def take_action(self, parsed_args): class SetPort(common.SetCommand): """Set port values""" - clazz = neu2.UpdatePort - name = 'id' - metavar = '' - help_text = 'Name or ID of port to update' + resource = 'port' def get_parser(self, prog_name): parser = super(SetPort, self).get_parser(prog_name) @@ -146,7 +140,7 @@ def get_parser(self, prog_name): class ShowPort(common.ShowCommand): """Show port details""" - name = "port" + resource = "port" class AddPort(common.RemoveCommand): diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index d433582bff..25202c8561 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -49,16 +49,13 @@ def get_parser(self, prog_name): class DeleteRouter(common.DeleteCommand): """Delete a router""" - clazz = neu2.DeleteRouter - name = 'id' - metavar = '' - help_text = 'Name or ID of router to delete' + resource = 'router' class ListRouter(common.ListCommand): """List router""" - resource = 'routers' + resource = 'router' def get_parser(self, prog_name): parser = super(ListRouter, self).get_parser(prog_name) @@ -80,16 +77,14 @@ def take_action(self, parsed_args): self.app_args) else: neuter = neu2.ListRouter(self.app, self.app_args) - neuter.get_client = self.get_client return neuter.take_action(parsed_args) class SetRouter(common.SetCommand): """Set router values""" - name = 'router_id' - metavar = '' - help_text = 'ID of router to update' + resource = 'router' + help_text = 'ID of router to set' def get_parser(self, prog_name): parser = super(SetRouter, self).get_parser(prog_name) @@ -126,7 +121,7 @@ def take_action(self, parsed_args): class ShowRouter(common.ShowCommand): """Show router details""" - name = 'router' + resource = 'router' class AddInterfaceRouter(common.AddCommand): diff --git a/openstackclient/network/v2_0/security_group.py b/openstackclient/network/v2_0/security_group.py index be8ba91c24..bbacfde8e7 100644 --- a/openstackclient/network/v2_0/security_group.py +++ b/openstackclient/network/v2_0/security_group.py @@ -38,25 +38,19 @@ def get_parser(self, prog_name): class DeleteSecurityGroup(common.DeleteCommand): """Delete a security group""" - clazz = neu2.DeleteSecurityGroup - name = 'id' - metavar = '' - help_text = 'Name or ID of security group to delete' + resource = 'security_group' class ListSecurityGroup(common.ListCommand): """List security group""" - resource = 'security_groups' + resource = 'security_group' class SetSecurityGroup(common.SetCommand): """Set security group values""" - clazz = neu2.UpdateSecurityGroup - name = 'id' - metavar = '' - help_text = 'ID of security group to update' + resource = 'security_group' def get_parser(self, prog_name): parser = super(SetSecurityGroup, self).get_parser(prog_name) @@ -72,4 +66,4 @@ def get_parser(self, prog_name): class ShowSecurityGroup(common.ShowCommand): """Show security group details""" - name = 'security_group' + resource = 'security_group' diff --git a/openstackclient/network/v2_0/security_group_rule.py b/openstackclient/network/v2_0/security_group_rule.py index 53e4f18513..738b1ffd99 100644 --- a/openstackclient/network/v2_0/security_group_rule.py +++ b/openstackclient/network/v2_0/security_group_rule.py @@ -60,16 +60,14 @@ def get_parser(self, prog_name): class DeleteSecurityGroupRule(common.DeleteCommand): """Delete a security group rule""" - clazz = neu2.DeleteSecurityGroupRule - name = 'id' - metavar = '' - help_text = 'Name or ID of security group rule to delete' + resource = 'security_group_rule' + allow_names = False class ListSecurityGroupRule(common.ListCommand): """List security group rule""" - resource = 'security_group_rules' + resource = 'security_group_rule' def get_parser(self, prog_name): parser = super(ListSecurityGroupRule, self).get_parser(prog_name) @@ -94,8 +92,6 @@ def get_parser(self, prog_name): class ShowSecurityGroupRule(common.ShowCommand): """Show security group rule details""" - name = 'security_group_rule' - - def __init__(self, app, app_args): - super(ShowSecurityGroupRule, self).__init__(app, app_args) - self.help_text = "Identifier of security group rule to show" + resource = 'security_group_rule' + help_text = "Identifier of security group rule to show" + allow_names = False diff --git a/openstackclient/network/v2_0/subnet.py b/openstackclient/network/v2_0/subnet.py index ede5446db0..b10e83e2c6 100644 --- a/openstackclient/network/v2_0/subnet.py +++ b/openstackclient/network/v2_0/subnet.py @@ -101,28 +101,22 @@ def get_parser(self, prog_name): class DeleteSubnet(common.DeleteCommand): """Delete a subnet""" - clazz = neu2.DeleteSubnet - name = 'id' - metavar = '' - help_text = 'Name or ID of subnet to delete' + resource = 'subnet' class ListSubnet(common.ListCommand): """List subnet""" - resource = 'subnets' + resource = 'subnet' class SetSubnet(common.SetCommand): """Set subnet values""" - clazz = neu2.UpdateSubnet - name = 'id' - metavar = '' - help_text = 'ID of subnet to update' + resource = 'subnet' class ShowSubnet(common.ShowCommand): """Show subnet details""" - name = 'subnet' + resource = 'subnet' diff --git a/openstackclient/network/v2_0/vpn/ikepolicy.py b/openstackclient/network/v2_0/vpn/ikepolicy.py index 71279d83dc..2130d5fe33 100644 --- a/openstackclient/network/v2_0/vpn/ikepolicy.py +++ b/openstackclient/network/v2_0/vpn/ikepolicy.py @@ -69,24 +69,25 @@ def get_parser(self, prog_name): class DeleteIkepolicy(common.DeleteCommand): """Delete a IKE policy""" - clazz = neu2.DeleteIKEPolicy - name = 'id' - metavar = '' + resource = 'ikepolicy' + resources = 'ikepolicies' help_text = 'Name or ID of IKE policy to delete' class ListIkepolicy(common.ListCommand): """List IKE policies""" - resource = 'ike_policies' + resource = 'ikepolicy' + resources = 'ikepolicies' + list_columns = ['id', 'name', 'auth_algorithm', + 'encryption_algorithm', 'ike_version', 'pfs'] class SetIkepolicy(common.SetCommand): """Set IKE policy values""" - clazz = neu2.UpdateIKEPolicy - name = 'id' - metavar = '' + resource = 'ikepolicy' + resources = 'ikepolicies' help_text = 'Name or ID of IKE policy to set' def get_parser(self, prog_name): @@ -102,4 +103,5 @@ def get_parser(self, prog_name): class ShowIkepolicy(common.ShowCommand): """Show IKE policy details""" - name = 'ikepolicy' + resource = 'ikepolicy' + resources = 'ikepolicies' diff --git a/openstackclient/network/v2_0/vpn/ipsecpolicy.py b/openstackclient/network/v2_0/vpn/ipsecpolicy.py index c5d8cb1662..381dabf887 100644 --- a/openstackclient/network/v2_0/vpn/ipsecpolicy.py +++ b/openstackclient/network/v2_0/vpn/ipsecpolicy.py @@ -68,24 +68,23 @@ def get_parser(self, prog_name): class DeleteIpsecpolicy(common.DeleteCommand): """Delete a IPSec policy""" - clazz = neu2.DeleteIPsecPolicy - name = 'id' - metavar = '' + resource = 'ipsecpolicy' + resources = 'ipsecpolicies' help_text = 'Name or ID of IPSec policy to delete' class ListIpsecpolicy(common.ListCommand): """List IPSec policies""" - resource = 'ipsec_policies' + resource = 'ipsecpolicie' + resources = 'ipsecpolicies' class SetIpsecpolicy(common.SetCommand): """Set IPSec policy values""" - clazz = neu2.UpdateIPsecPolicy - name = 'id' - metavar = '' + resource = 'ipsecpolicy' + resources = 'ipsecpolicies' help_text = 'Name or ID of IPSec policy to set' def get_parser(self, prog_name): @@ -101,4 +100,5 @@ def get_parser(self, prog_name): class ShowIpsecpolicy(common.ShowCommand): """Show IPSec policy details""" - name = 'ipsecpolicy' + resource = 'ipsecpolicy' + resources = 'ipsecpolicies' diff --git a/openstackclient/network/v2_0/vpn/service.py b/openstackclient/network/v2_0/vpn/service.py index dc1539b554..3b04e9fa82 100644 --- a/openstackclient/network/v2_0/vpn/service.py +++ b/openstackclient/network/v2_0/vpn/service.py @@ -48,28 +48,24 @@ def get_parser(self, prog_name): class DeleteService(common.DeleteCommand): """Delete a VPN service""" - clazz = neu2.DeleteVPNService - name = 'id' - metavar = '' + resource = 'vpnservice' help_text = 'Name or ID of VPN service to delete' class ListService(common.ListCommand): """List VPN service""" - resource = 'services' + resource = 'vpnservice' class SetService(common.SetCommand): """Set VPN service values""" - clazz = neu2.UpdateVPNService - name = 'service' - metavar = '' + resource = 'vpnservice' help_text = 'Name or ID of VPN service to set' class ShowService(common.ShowCommand): """Show VPN service details""" - name = 'vpnservice' + resource = 'vpnservice' diff --git a/openstackclient/tests/network/common.py b/openstackclient/tests/network/common.py index b0e80f7617..b7cef5cdff 100644 --- a/openstackclient/tests/network/common.py +++ b/openstackclient/tests/network/common.py @@ -14,100 +14,11 @@ # import argparse -import httpretty import mock -import sys -import traceback -from openstackclient import shell -from openstackclient.tests import fakes from openstackclient.tests import utils -class FakeOptions(argparse.Namespace): - def __init__(self): - super(FakeOptions, self).__init__() - self.debug = False - self.deferred_help = False - self.insecure = True - self.os_default_domain = 'testing' - self.os_cacert = False - self.os_identity_api_version = 'idversion' - self.os_password = 'password' - self.os_project_id = 'project_id' - self.os_project_name = 'project_name' - self.os_region_name = 'region_name' - self.os_network_api_version = '2.0' - self.os_token = 'token' - self.os_url = 'http://127.0.0.1' - self.os_auth_url = 'http://127.0.0.1/identity' - self.os_username = 'username' - - -class FakeParsedArgs(argparse.Namespace): - def __init__(self): - super(FakeParsedArgs, self).__init__() - self.show_details = True - self.request_format = 'json' - self.prefix = '' - self.fields = [] - self.columns = [] - self.variables = [] - self.formatter = 'shell' - self.quote_mode = 'none' - - -class FakeShell(shell.OpenStackShell): - def __init__(self): - super(FakeShell, self).__init__() - self.options = FakeOptions() - try: - self.initialize_app(["run.py", "help"]) - except Exception: - print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) - try: - self.authenticate_user() - except Exception: - print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) - self.stdout = fakes.FakeStdout() - self.stderr = fakes.FakeStdout() - - -class TestIntegrationBase(utils.TestCase): - HOST = "http://127.0.0.1" - VER = "/v2.0" - - def setUp(self): - super(TestIntegrationBase, self).setUp() - self.app = FakeShell() - - def when_run(self, clazz, pargs, expected_body=None): - try: - result = clazz(self.app, pargs).run(pargs) - except Exception as e: - print('\n'.join(traceback.format_tb(sys.exc_info()[2]))) - print(str(e)) - lasty = httpretty.last_request() - print('====================================================') - print("body = " + str(lasty.body)) - print("querystring = " + str(getattr(lasty, 'querystring', ''))) - print("command = " + str(getattr(lasty, 'command', ''))) - print("method = " + str(getattr(lasty, 'method', ''))) - print("path = " + str(getattr(lasty, 'path', ''))) - print('====================================================') - raise e - self.assertEqual(0, result) - if expected_body: - lasty = httpretty.last_request() - self.assertEqual(expected_body, lasty.body) - - def stdout(self): - return self.app.stdout.lines() - - def stderr(self): - return self.app.stderr.lines() - - class TestNetworkBase(utils.TestCase): def given_args(self, clz, args): args = args.split() diff --git a/openstackclient/tests/network/v2_0/fw/test_firewall.py b/openstackclient/tests/network/v2_0/fw/test_firewall.py index e028d6071b..c7ba6f240c 100644 --- a/openstackclient/tests/network/v2_0/fw/test_firewall.py +++ b/openstackclient/tests/network/v2_0/fw/test_firewall.py @@ -46,7 +46,7 @@ def test_get_parser_all(self): class TestDeleteFirewall(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(firewall.DeleteFirewall, "noo") - self.assertEqual('noo', parsed.firewall) + self.assertEqual('noo', parsed.identifier) class TestListFirewall(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py index 0906537fad..5b8b00842c 100644 --- a/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py +++ b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.py @@ -55,7 +55,7 @@ def test_get_parser_all(self): class TestDeleteLbHealthMonitor(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(healthmonitor.DeleteHealthMonitor, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListLbHealthMonitor(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/lb/test_member.py b/openstackclient/tests/network/v2_0/lb/test_member.py index 2999221e4e..8379c9270d 100644 --- a/openstackclient/tests/network/v2_0/lb/test_member.py +++ b/openstackclient/tests/network/v2_0/lb/test_member.py @@ -48,7 +48,7 @@ def test_get_parser_all(self): class TestDeleteLbMember(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(member.DeleteMember, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListLbMember(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/lb/test_vip.py b/openstackclient/tests/network/v2_0/lb/test_vip.py index 712a68470d..ef34ec0908 100644 --- a/openstackclient/tests/network/v2_0/lb/test_vip.py +++ b/openstackclient/tests/network/v2_0/lb/test_vip.py @@ -57,7 +57,7 @@ def test_get_parser_all(self): class TestDeleteLbVip(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(vip.DeleteVip, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListLbVip(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_floatingip.py b/openstackclient/tests/network/v2_0/test_floatingip.py index 6906837ec8..8590dc3fba 100644 --- a/openstackclient/tests/network/v2_0/test_floatingip.py +++ b/openstackclient/tests/network/v2_0/test_floatingip.py @@ -41,7 +41,7 @@ def test_get_parser_all(self): class TestDeleteFloatingIp(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(floatingip.DeleteFloatingIp, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListFloatingIp(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_gateway.py b/openstackclient/tests/network/v2_0/test_gateway.py index 1b764dbd28..9d2dbcc14f 100644 --- a/openstackclient/tests/network/v2_0/test_gateway.py +++ b/openstackclient/tests/network/v2_0/test_gateway.py @@ -39,7 +39,7 @@ def test_get_parser_all(self): class TestDeleteGateway(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(gateway.DeleteGateway, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListGateway(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index 0836085dd4..7f5da9b4c4 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -41,7 +41,7 @@ def test_get_parser_all(self): class TestDeleteNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(network.DeleteNetwork, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListNetwork(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_port.py b/openstackclient/tests/network/v2_0/test_port.py index 87e24be2d3..1249bf94f4 100644 --- a/openstackclient/tests/network/v2_0/test_port.py +++ b/openstackclient/tests/network/v2_0/test_port.py @@ -56,7 +56,7 @@ def test_get_parser_all(self): class TestDeletePort(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(port.DeletePort, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListPort(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_router.py b/openstackclient/tests/network/v2_0/test_router.py index b94f2fb26b..b6af391f3a 100644 --- a/openstackclient/tests/network/v2_0/test_router.py +++ b/openstackclient/tests/network/v2_0/test_router.py @@ -51,7 +51,7 @@ def test_get_parser_all_enable(self): class TestDeleteRouter(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(router.DeleteRouter, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListRouter(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_security_group.py b/openstackclient/tests/network/v2_0/test_security_group.py index cab61c461d..20f06941b0 100644 --- a/openstackclient/tests/network/v2_0/test_security_group.py +++ b/openstackclient/tests/network/v2_0/test_security_group.py @@ -39,7 +39,7 @@ def test_get_parser_all(self): class TestDeleteSecurityGroup(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(security_group.DeleteSecurityGroup, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListSecurityGroup(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_security_group_rule.py b/openstackclient/tests/network/v2_0/test_security_group_rule.py index 0389120716..9a31c07004 100644 --- a/openstackclient/tests/network/v2_0/test_security_group_rule.py +++ b/openstackclient/tests/network/v2_0/test_security_group_rule.py @@ -58,7 +58,7 @@ class TestDeleteSecurityGroupRule(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(security_group_rule.DeleteSecurityGroupRule, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListSecurityGroupRule(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_subnet.py b/openstackclient/tests/network/v2_0/test_subnet.py index cf1d584fbd..95cfc52e87 100644 --- a/openstackclient/tests/network/v2_0/test_subnet.py +++ b/openstackclient/tests/network/v2_0/test_subnet.py @@ -75,7 +75,7 @@ def test_get_parser_alternate(self): class TestDeleteSubnet(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(subnet.DeleteSubnet, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListSubnet(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py index 47fb27206a..1e0873785a 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py +++ b/openstackclient/tests/network/v2_0/vpn/test_ikepolicy.py @@ -56,7 +56,7 @@ def test_get_parser_all(self): class TestDeleteIkepolicy(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(ikepolicy.DeleteIkepolicy, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListIkepolicy(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py index fa71a2cec7..256c3d43d6 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py +++ b/openstackclient/tests/network/v2_0/vpn/test_ipsecpolicy.py @@ -55,7 +55,7 @@ def test_get_parser_all(self): class TestDeleteIpsecpolicy(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(ipsecpolicy.DeleteIpsecpolicy, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListIpsecpolicy(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/vpn/test_service.py b/openstackclient/tests/network/v2_0/vpn/test_service.py index 295e0d87b0..f1e85994bb 100644 --- a/openstackclient/tests/network/v2_0/vpn/test_service.py +++ b/openstackclient/tests/network/v2_0/vpn/test_service.py @@ -46,7 +46,7 @@ def test_get_parser_all(self): class TestDeleteService(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(service.DeleteService, "noo") - self.assertEqual('noo', parsed.id) + self.assertEqual('noo', parsed.identifier) class TestListService(common.TestNetworkBase): From 0ed837a77d1e25453de83670891f613abf414315 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Sat, 8 Feb 2014 18:45:36 -0700 Subject: [PATCH 57/66] create Change-Id: Id70563c4264fc91e2436bd298dfd23be9a3a8fb1 --- openstackclient/network/common.py | 13 +++++++++---- openstackclient/network/v2_0/network.py | 8 +++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index bbb0a37d51..cef1b5fd3c 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -112,10 +112,15 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - neuter = self.clazz(self.app, self.app_args) - neuter.get_client = self.get_client - parsed_args.request_format = 'json' - return neuter.take_action(parsed_args) + _manager = self.app.client_manager.network + body = self.get_body(parsed_args) + create_method = getattr(_manager, "create_%s" % self.resource) + data = self.data_formatter(create_method(body)[self.resource]) + if data: + print >>self.app.stdout, 'Created a new %s:' % self.resource + else: + data = {'': ''} + return zip(*sorted(six.iteritems(data))) class DeleteCommand(command.Command, BaseCommand): diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index d8860e69a8..1a4ecaba71 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -24,7 +24,7 @@ class CreateNetwork(common.CreateCommand): """Create a network""" - clazz = neu2.CreateNetwork + resource = 'network' def get_parser(self, prog_name): parser = super(CreateNetwork, self).get_parser(prog_name) @@ -41,6 +41,12 @@ def get_parser(self, prog_name): help='Name of network to create') return parser + def get_body(self, parsed_args): + return { self.resource: { + 'name': str(parsed_args.name), + 'admin_state_up': str(parsed_args.admin_state), + 'shared': str(parsed_args.shared) } } + class DeleteNetwork(common.DeleteCommand): """Delete a network""" From ecc347ae45baa3b70b1fb57ab3dacd5e1f25e193 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 10 Feb 2014 14:35:50 -0700 Subject: [PATCH 58/66] add remove Change-Id: I182609913a345e8c4e50ffef7a5fe2177d58dd3d --- openstackclient/network/common.py | 33 ++++++------ openstackclient/network/v2_0/network.py | 68 ++++++++++++++++++------- 2 files changed, 67 insertions(+), 34 deletions(-) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index cef1b5fd3c..0dbad8b318 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -75,23 +75,23 @@ def get_list_method(self): return getattr(self.app.client_manager.network, "list_%s" % self.resources) - def find_resource(self, name): + def find_resource(self, resource, name): client = self.app.client_manager.network list_method = self.get_list_method() data = list_method(name=name, fields='id') - info = data[self.resources] + info = data[resources] if len(info) == 1: return info[0]['id'] if len(info) > 1: msg = "More than one %s exists with the name '%s'." % \ - (self.resource, name) + (resource, name) raise exceptions.CommandError(msg) data = list_method(id=name, fields='id') - info = data[self.resources] + info = data[resources] if len(info) == 1: return info[0]['id'] msg = "No %s with a name or ID of '%s' exists." % \ - (self.resource, name) + (resource, name) raise exceptions.CommandError(msg) @@ -112,9 +112,9 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - _manager = self.app.client_manager.network + _client = self.app.client_manager.network body = self.get_body(parsed_args) - create_method = getattr(_manager, "create_%s" % self.resource) + create_method = getattr(_client, "create_%s" % self.resource) data = self.data_formatter(create_method(body)[self.resource]) if data: print >>self.app.stdout, 'Created a new %s:' % self.resource @@ -150,7 +150,7 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) if self.allow_names: - _id = self.find_resource(parsed_args.identifier) + _id = self.find_resource(self.resource, parsed_args.identifier) else: _id = parsed_args.identifier delete_method = getattr(self.app.client_manager.network, "delete_" + @@ -222,12 +222,12 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - _manager = self.app.client_manager.network + _client = self.app.client_manager.network if self.allow_names: - _id = self.find_resource(parsed_args.identifier) + _id = self.find_resource(self.resource, parsed_args.identifier) else: _id = parsed_args.identifier - update_method = getattr(_manager, "update_" + self.func) + update_method = getattr(_client, "update_" + self.func) update_method(_id, self.body) print >>self.app.stdout, ('Updated %(resource)s: %(id)s' % {'id': parsed_args.identifier, 'resource': self.resource}) @@ -261,7 +261,7 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) if self.allow_names: - _id = self.find_resource(parsed_args.identifier) + _id = self.find_resource(self.resource, parsed_args.identifier) else: _id = parsed_args.identifier show_method = getattr(self.app.client_manager.network, @@ -270,16 +270,19 @@ def take_action(self, parsed_args): return zip(*sorted(six.iteritems(data))) -class AddCommand(command.Command): +class AddCommand(command.Command, BaseCommand): log = logging.getLogger(__name__ + '.AddCommand') container_name = "container_id" - container_metavar = "" container_help_text = "Identifier of container" name = "id" - metavar = "" help_text = "Identifier of object to be added" + def __init__(self, app, app_args): + super(AddCommand, self).__init__(app, app_args) + self.container_metavar = '<' + self.container_name + '>' + self.metavar = '<' + self.name + '>' + def get_client(self): return self.app.client_manager.network diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 1a4ecaba71..a3599091cf 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -95,17 +95,9 @@ class ShowNetwork(common.ShowCommand): resource = 'network' -class AddGatewayNetwork(common.AddCommand): +class AddGatewayNetwork(command.Command, BaseCommand): """Add a gateway to a network""" - clazz = nvpnetworkgateway.ConnectNetworkGateway - container_name = "network_id" - container_metavar = "" - container_help_text = "ID of the internal network" - name = 'net_gateway_id' - metavar = '' - help_text = 'ID of the gatway' - def get_parser(self, prog_name): parser = super(AddGatewayNetwork, self).get_parser(prog_name) parser.add_argument( @@ -116,20 +108,35 @@ def get_parser(self, prog_name): '--segmentation-id', help=('Identifier for the L2 segment on the external side ' 'of the gateway')) + parser.add_argument( + 'network', + metavar='', + help='Name or identifier of the internal network' + ) + parser.add_argument( + 'gateway', + metavar='', + help='Name or identifier of the gatway' + ) return parser - -class RemoveGatewayNetwork(common.RemoveCommand): + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + _client = self.app.client_manager.network + _network_id = self.find_resource('network', parsed_args.network) + _gateway_id = self.find_resource('network_gateway', + parsed_args.gateway) + _client.connect_network_gateway(_gateway_id, + {'network_id': _network_id, + 'segmentation_type': parsed_args.segmentation_type, + 'segmentation_id': parsed_args.segmentation_id}) + print >>self.app.stdout, ('Connected network to gateway %s' % + _gateway_id) + + +class RemoveGatewayNetwork(command.Command, BaseCommand): """Remove a gateway from a network""" - clazz = nvpnetworkgateway.DisconnectNetworkGateway - container_name = "network_id" - container_metavar = "" - container_help_text = "ID of the internal network" - name = 'net_gateway_id' - metavar = '' - help_text = 'ID of the gatway' - def get_parser(self, prog_name): parser = super(RemoveGatewayNetwork, self).get_parser(prog_name) parser.add_argument( @@ -140,4 +147,27 @@ def get_parser(self, prog_name): '--segmentation-id', help=('Identifier for the L2 segment on the external side ' 'of the gateway')) + parser.add_argument( + 'network', + metavar='', + help='Name or identifier of the internal network' + ) + parser.add_argument( + 'gateway', + metavar='', + help='Name or identifier of the gatway' + ) return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + _client = self.app.client_manager.network + _network_id = self.find_resource('network', parsed_args.network) + _gateway_id = self.find_resource('network_gateway', + parsed_args.gateway) + _client.disconnect_network_gateway((_gateway_id, + {'network_id': _network_id, + 'segmentation_type': parsed_args.segmentation_type, + 'segmentation_id': parsed_args.segmentation_id}) + print >>self.app.stdout, ('Disconnected network to gateway %s' % + _gateway_id) From 463a8392ac59ac083bf8cdcfc62cc0c8f313f156 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Mon, 10 Feb 2014 15:15:01 -0700 Subject: [PATCH 59/66] find fix Change-Id: I0be57ab15497b1e3327e3d6a5405f524a7c2f3cf --- openstackclient/network/common.py | 11 +++++++---- openstackclient/network/v2_0/network.py | 12 ++++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index 0dbad8b318..b2f94c881a 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -75,7 +75,10 @@ def get_list_method(self): return getattr(self.app.client_manager.network, "list_%s" % self.resources) - def find_resource(self, resource, name): + def find_resource(self, name): + return self.find(self.resource, self.resources, name) + + def find(self, resource, resources, name): client = self.app.client_manager.network list_method = self.get_list_method() data = list_method(name=name, fields='id') @@ -150,7 +153,7 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) if self.allow_names: - _id = self.find_resource(self.resource, parsed_args.identifier) + _id = self.find_resource(parsed_args.identifier) else: _id = parsed_args.identifier delete_method = getattr(self.app.client_manager.network, "delete_" + @@ -224,7 +227,7 @@ def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) _client = self.app.client_manager.network if self.allow_names: - _id = self.find_resource(self.resource, parsed_args.identifier) + _id = self.find_resource(parsed_args.identifier) else: _id = parsed_args.identifier update_method = getattr(_client, "update_" + self.func) @@ -261,7 +264,7 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) if self.allow_names: - _id = self.find_resource(self.resource, parsed_args.identifier) + _id = self.find_resource(parsed_args.identifier) else: _id = parsed_args.identifier show_method = getattr(self.app.client_manager.network, diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index a3599091cf..b98913fb3e 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -123,9 +123,9 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) _client = self.app.client_manager.network - _network_id = self.find_resource('network', parsed_args.network) - _gateway_id = self.find_resource('network_gateway', - parsed_args.gateway) + _network_id = self.find_resource(parsed_args.network) + _gateway_id = self.find('network_gateway', 'network_gateways', + parsed_args.gateway) _client.connect_network_gateway(_gateway_id, {'network_id': _network_id, 'segmentation_type': parsed_args.segmentation_type, @@ -162,9 +162,9 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) _client = self.app.client_manager.network - _network_id = self.find_resource('network', parsed_args.network) - _gateway_id = self.find_resource('network_gateway', - parsed_args.gateway) + _network_id = self.find_resource(parsed_args.network) + _gateway_id = self.find('network_gateway', 'network_gateways', + parsed_args.gateway) _client.disconnect_network_gateway((_gateway_id, {'network_id': _network_id, 'segmentation_type': parsed_args.segmentation_type, From 333e797584df29ee5403c5c526ab3d0102d21a53 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Tue, 11 Feb 2014 05:57:33 -0700 Subject: [PATCH 60/66] list Change-Id: Ief0710e4055c1f29bde615221aa88913e3827741 --- openstackclient/network/common.py | 19 ++++++++++++------- openstackclient/network/v2_0/dhcp.py | 1 + openstackclient/network/v2_0/floatingip.py | 1 + openstackclient/network/v2_0/fw/firewall.py | 1 + openstackclient/network/v2_0/gateway.py | 1 + .../network/v2_0/lb/healthmonitor.py | 1 + openstackclient/network/v2_0/lb/member.py | 2 ++ openstackclient/network/v2_0/lb/pool.py | 4 ++++ openstackclient/network/v2_0/lb/vip.py | 2 ++ openstackclient/network/v2_0/network.py | 11 +++++++---- openstackclient/network/v2_0/port.py | 1 + openstackclient/network/v2_0/router.py | 1 + .../network/v2_0/security_group.py | 1 + .../network/v2_0/security_group_rule.py | 2 ++ openstackclient/network/v2_0/subnet.py | 1 + .../network/v2_0/vpn/ipsecpolicy.py | 2 ++ openstackclient/network/v2_0/vpn/service.py | 1 + 17 files changed, 41 insertions(+), 11 deletions(-) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index b2f94c881a..727d6b7121 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -36,9 +36,10 @@ def dumps(self, value, indent=None): pass return json.dumps(to_primitive(value)) - def format_row(self, data): + def format_row(self, columns, data): row = [] - for k, v in data.iteritems(): + for k in columns: + v = data[k] if k in self.matters: row.append(self.matters[k](v)) elif isinstance(v, list): @@ -167,7 +168,7 @@ def take_action(self, parsed_args): class ListCommand(lister.Lister, BaseCommand): log = logging.getLogger(__name__ + '.ListCommand') - columns = [] + list_columns = [] report_filter = {} def __init__(self, app, app_args): @@ -190,10 +191,14 @@ def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) list_method = self.get_list_method() data = list_method(**self.report_filter)[self.resources] - if not self.columns: - self.columns = len(data) > 0 and data[0].keys() or [] - self.columns = [w.replace(':', ' ') for w in self.columns] - return (self.columns, (self.format_row(item) for item in data)) + _columns = len(data) > 0 and sorted(data[0].keys()) or [] + if not _columns: + parsed_args.columns = [] + elif parsed_args.columns: + _columns = [x for x in parsed_args.columns if x in _columns] + elif self.list_columns: + _columns = [x for x in self.list_columns if x in _columns] + return (_columns, (self.format_row(_columns, item) for item in data)) class SetCommand(command.Command, BaseCommand): diff --git a/openstackclient/network/v2_0/dhcp.py b/openstackclient/network/v2_0/dhcp.py index 99509a1365..d65f67902b 100644 --- a/openstackclient/network/v2_0/dhcp.py +++ b/openstackclient/network/v2_0/dhcp.py @@ -48,6 +48,7 @@ class ListDhcpAgent(common.ListCommand): clazz = neu2.ListDhcpAgentsHostingNetwork resource = 'dhcp_agent' + list_columns = ['id', 'host', 'admin_state_up', 'alive'] def get_parser(self, prog_name): parser = super(ListDhcpAgent, self).get_parser(prog_name) diff --git a/openstackclient/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py index 06b76f240b..19fd700749 100644 --- a/openstackclient/network/v2_0/floatingip.py +++ b/openstackclient/network/v2_0/floatingip.py @@ -52,6 +52,7 @@ class ListFloatingIp(common.ListCommand): """List floating IPs""" resource = 'floatingip' + list_columns = ['id', 'fixed_ip_address', 'floating_ip_address', 'port_id'] class ShowFloatingIp(common.ShowCommand): diff --git a/openstackclient/network/v2_0/fw/firewall.py b/openstackclient/network/v2_0/fw/firewall.py index 47cfc7ac61..e3ed93fd16 100644 --- a/openstackclient/network/v2_0/fw/firewall.py +++ b/openstackclient/network/v2_0/fw/firewall.py @@ -73,6 +73,7 @@ class ListFirewall(common.ListCommand): """List firewall""" resource = 'firewall' + list_columns = ['id', 'name', 'firewall_policy_id'] class SetFirewall(common.SetCommand): diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py index 8c6d3e2875..327e7f11dc 100644 --- a/openstackclient/network/v2_0/gateway.py +++ b/openstackclient/network/v2_0/gateway.py @@ -51,6 +51,7 @@ class ListGateway(common.ListCommand): resource = 'network_gateway' resources = 'network_gateways' + list_columns = ['id', 'name'] class SetGateway(common.SetCommand): diff --git a/openstackclient/network/v2_0/lb/healthmonitor.py b/openstackclient/network/v2_0/lb/healthmonitor.py index 2048176e7a..617e83ec67 100644 --- a/openstackclient/network/v2_0/lb/healthmonitor.py +++ b/openstackclient/network/v2_0/lb/healthmonitor.py @@ -80,6 +80,7 @@ class ListHealthMonitor(common.ListCommand): """List load balancer health monitor""" resource = 'health_monitor' + list_columns = ['id', 'type', 'admin_state_up'] class SetHealthMonitor(common.SetCommand): diff --git a/openstackclient/network/v2_0/lb/member.py b/openstackclient/network/v2_0/lb/member.py index 9f8458123b..a7be78ee70 100644 --- a/openstackclient/network/v2_0/lb/member.py +++ b/openstackclient/network/v2_0/lb/member.py @@ -59,6 +59,8 @@ class ListMember(common.ListCommand): """List load balancer member""" resource = 'member' + list_columns = ['id', 'address', 'protocol_port', 'admin_state_up', + 'status'] class SetMember(common.SetCommand): diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py index a2d5a2aa18..9d2ef48c93 100644 --- a/openstackclient/network/v2_0/lb/pool.py +++ b/openstackclient/network/v2_0/lb/pool.py @@ -69,6 +69,8 @@ class ListPool(common.ListCommand): """List load balancer pool""" resource = 'pool' + list_columns = ['id', 'name', 'provider', 'lb_method', 'protocol', + 'admin_state_up', 'status'] def get_parser(self, prog_name): parser = super(ListPool, self).get_parser(prog_name) @@ -86,6 +88,8 @@ def take_action(self, parsed_args): parsed_args.sort_key = [] parsed_args.sort_dir = [] if parsed_args.lbaas_agent: + self.list_columns = ['id', 'name', 'lb_method', 'protocol', + 'admin_state_up', 'status'] neuter = agentscheduler.ListPoolsOnLbaasAgent(self.app, self.app_args) else: diff --git a/openstackclient/network/v2_0/lb/vip.py b/openstackclient/network/v2_0/lb/vip.py index b3a2ee062e..e70115ecde 100644 --- a/openstackclient/network/v2_0/lb/vip.py +++ b/openstackclient/network/v2_0/lb/vip.py @@ -73,6 +73,8 @@ class ListVip(common.ListCommand): """List load balancer VIP""" resource = 'vip' + list_columns = ['id', 'name', 'algorithm', 'address', 'protocol', + 'admin_state_up', 'status'] class SetVip(common.SetCommand): diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index b98913fb3e..3153e80466 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -15,6 +15,8 @@ """Network action implementations""" +from cliff import command + from neutronclient.neutron.v2_0 import agentscheduler as agent from neutronclient.neutron.v2_0 import network as neu2 from neutronclient.neutron.v2_0 import nvpnetworkgateway @@ -58,6 +60,7 @@ class ListNetwork(common.ListCommand): """List networks""" resource = "network" + list_columns = ['id', 'name', 'subnets'] def get_parser(self, prog_name): parser = super(ListNetwork, self).get_parser(prog_name) @@ -95,7 +98,7 @@ class ShowNetwork(common.ShowCommand): resource = 'network' -class AddGatewayNetwork(command.Command, BaseCommand): +class AddGatewayNetwork(command.Command, common.BaseCommand): """Add a gateway to a network""" def get_parser(self, prog_name): @@ -134,7 +137,7 @@ def take_action(self, parsed_args): _gateway_id) -class RemoveGatewayNetwork(command.Command, BaseCommand): +class RemoveGatewayNetwork(command.Command, common.BaseCommand): """Remove a gateway from a network""" def get_parser(self, prog_name): @@ -165,9 +168,9 @@ def take_action(self, parsed_args): _network_id = self.find_resource(parsed_args.network) _gateway_id = self.find('network_gateway', 'network_gateways', parsed_args.gateway) - _client.disconnect_network_gateway((_gateway_id, + _client.disconnect_network_gateway(_gateway_id, {'network_id': _network_id, 'segmentation_type': parsed_args.segmentation_type, 'segmentation_id': parsed_args.segmentation_id}) - print >>self.app.stdout, ('Disconnected network to gateway %s' % + print >> self.app.stdout, ('Disconnected network to gateway %s' % _gateway_id) diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index d531e70b16..f102190d46 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -85,6 +85,7 @@ class ListPort(common.ListCommand): """List port""" resource = 'port' + list_columns = ['id', 'name', 'mac_address', 'fixed_ips'] def get_parser(self, prog_name): parser = super(ListPort, self).get_parser(prog_name) diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index 25202c8561..a788f15ba8 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -56,6 +56,7 @@ class ListRouter(common.ListCommand): """List router""" resource = 'router' + list_columns = ['id', 'name', 'external_gateway_info'] def get_parser(self, prog_name): parser = super(ListRouter, self).get_parser(prog_name) diff --git a/openstackclient/network/v2_0/security_group.py b/openstackclient/network/v2_0/security_group.py index bbacfde8e7..486d3e168f 100644 --- a/openstackclient/network/v2_0/security_group.py +++ b/openstackclient/network/v2_0/security_group.py @@ -45,6 +45,7 @@ class ListSecurityGroup(common.ListCommand): """List security group""" resource = 'security_group' + list_columns = ['id', 'name', 'description'] class SetSecurityGroup(common.SetCommand): diff --git a/openstackclient/network/v2_0/security_group_rule.py b/openstackclient/network/v2_0/security_group_rule.py index 738b1ffd99..0133145fb8 100644 --- a/openstackclient/network/v2_0/security_group_rule.py +++ b/openstackclient/network/v2_0/security_group_rule.py @@ -68,6 +68,8 @@ class ListSecurityGroupRule(common.ListCommand): """List security group rule""" resource = 'security_group_rule' + list_columns = ['id', 'security_group_id', 'direction', 'protocol', + 'remote_ip_prefix','remote_group_id'] def get_parser(self, prog_name): parser = super(ListSecurityGroupRule, self).get_parser(prog_name) diff --git a/openstackclient/network/v2_0/subnet.py b/openstackclient/network/v2_0/subnet.py index b10e83e2c6..88382ca416 100644 --- a/openstackclient/network/v2_0/subnet.py +++ b/openstackclient/network/v2_0/subnet.py @@ -108,6 +108,7 @@ class ListSubnet(common.ListCommand): """List subnet""" resource = 'subnet' + list_columns = ['id', 'name', 'cidr', 'allocation_pools'] class SetSubnet(common.SetCommand): diff --git a/openstackclient/network/v2_0/vpn/ipsecpolicy.py b/openstackclient/network/v2_0/vpn/ipsecpolicy.py index 381dabf887..167f8ffb04 100644 --- a/openstackclient/network/v2_0/vpn/ipsecpolicy.py +++ b/openstackclient/network/v2_0/vpn/ipsecpolicy.py @@ -78,6 +78,8 @@ class ListIpsecpolicy(common.ListCommand): resource = 'ipsecpolicie' resources = 'ipsecpolicies' + list_columns = ['id', 'name', 'auth_algorithm', 'encryption_algorithm', + 'pfs'] class SetIpsecpolicy(common.SetCommand): diff --git a/openstackclient/network/v2_0/vpn/service.py b/openstackclient/network/v2_0/vpn/service.py index 3b04e9fa82..80536d456d 100644 --- a/openstackclient/network/v2_0/vpn/service.py +++ b/openstackclient/network/v2_0/vpn/service.py @@ -56,6 +56,7 @@ class ListService(common.ListCommand): """List VPN service""" resource = 'vpnservice' + list_columns = ['id', 'name', 'router_id', 'status'] class SetService(common.SetCommand): From ae9906919a9bc3095599ab56198402b03a68be1b Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Tue, 11 Feb 2014 10:13:53 -0700 Subject: [PATCH 61/66] add remove gateway Change-Id: Ia6721200c1e1f53e20dbe88bccb844ece418dbe3 --- openstackclient/network/common.py | 17 +++-- openstackclient/network/v2_0/dhcp.py | 2 +- openstackclient/network/v2_0/floatingip.py | 5 +- openstackclient/network/v2_0/fw/firewall.py | 5 +- openstackclient/network/v2_0/gateway.py | 15 ++-- .../network/v2_0/lb/healthmonitor.py | 5 +- openstackclient/network/v2_0/lb/member.py | 5 +- openstackclient/network/v2_0/lb/pool.py | 69 ++++++++++--------- openstackclient/network/v2_0/lb/vip.py | 5 +- openstackclient/network/v2_0/network.py | 10 +++ openstackclient/network/v2_0/port.py | 33 +++++---- openstackclient/network/v2_0/router.py | 50 +++++++------- .../network/v2_0/security_group.py | 5 +- .../network/v2_0/security_group_rule.py | 5 +- openstackclient/network/v2_0/subnet.py | 5 +- openstackclient/network/v2_0/vpn/ikepolicy.py | 5 +- .../network/v2_0/vpn/ipsecpolicy.py | 5 +- openstackclient/network/v2_0/vpn/service.py | 5 +- 18 files changed, 151 insertions(+), 100 deletions(-) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index 727d6b7121..a2573493f8 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -72,16 +72,13 @@ def data_formatter(self, data): d[k] = v return d - def get_list_method(self): - return getattr(self.app.client_manager.network, - "list_%s" % self.resources) - def find_resource(self, name): return self.find(self.resource, self.resources, name) def find(self, resource, resources, name): client = self.app.client_manager.network - list_method = self.get_list_method() + list_method = getattr(self.app.client_manager.network, + "list_%s" % resources) data = list_method(name=name, fields='id') info = data[resources] if len(info) == 1: @@ -103,8 +100,9 @@ class CreateCommand(show.ShowOne, BaseCommand): log = logging.getLogger(__name__ + '.CreateCommand') - def get_client(self): - return self.app.client_manager.network + def __init__(self, app, app_args): + super(CreateCommand, self).__init__(app, app_args) + self.func = getattr(self, 'func', self.resource) def get_parser(self, prog_name): parser = super(CreateCommand, self).get_parser(prog_name) @@ -118,7 +116,7 @@ def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) _client = self.app.client_manager.network body = self.get_body(parsed_args) - create_method = getattr(_client, "create_%s" % self.resource) + create_method = getattr(_client, "create_%s" % self.func) data = self.data_formatter(create_method(body)[self.resource]) if data: print >>self.app.stdout, 'Created a new %s:' % self.resource @@ -189,7 +187,8 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - list_method = self.get_list_method() + list_method = getattr(self.app.client_manager.network, + "list_%s" % self.func) data = list_method(**self.report_filter)[self.resources] _columns = len(data) > 0 and sorted(data[0].keys()) or [] if not _columns: diff --git a/openstackclient/network/v2_0/dhcp.py b/openstackclient/network/v2_0/dhcp.py index d65f67902b..f84ae27536 100644 --- a/openstackclient/network/v2_0/dhcp.py +++ b/openstackclient/network/v2_0/dhcp.py @@ -46,8 +46,8 @@ class RemoveNetworkDhcpAgent(common.RemoveCommand): class ListDhcpAgent(common.ListCommand): """List DHCP agents on a network""" - clazz = neu2.ListDhcpAgentsHostingNetwork resource = 'dhcp_agent' + func = 'dhcp_agent_hosting_networks' list_columns = ['id', 'host', 'admin_state_up', 'alive'] def get_parser(self, prog_name): diff --git a/openstackclient/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py index 19fd700749..17d3369304 100644 --- a/openstackclient/network/v2_0/floatingip.py +++ b/openstackclient/network/v2_0/floatingip.py @@ -22,7 +22,7 @@ class CreateFloatingIp(common.CreateCommand): """Create a floating IP""" - clazz = neu2.CreateFloatingIP + resource = 'floatingip' def get_parser(self, prog_name): parser = super(CreateFloatingIp, self).get_parser(prog_name) @@ -39,6 +39,9 @@ def get_parser(self, prog_name): help='ID of network to create the floating IP in') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteFloatingIp(common.DeleteCommand): """Delete a floating IP""" diff --git a/openstackclient/network/v2_0/fw/firewall.py b/openstackclient/network/v2_0/fw/firewall.py index e3ed93fd16..7a3dcfc549 100644 --- a/openstackclient/network/v2_0/fw/firewall.py +++ b/openstackclient/network/v2_0/fw/firewall.py @@ -22,7 +22,7 @@ class CreateFirewall(common.CreateCommand): """Create a firewall""" - clazz = neu2.CreateFirewall + resource = 'firewall' def get_parser(self, prog_name): parser = super(CreateFirewall, self).get_parser(prog_name) @@ -61,6 +61,9 @@ def get_parser(self, prog_name): action="store_false") return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteFirewall(common.DeleteCommand): """Delete a firewall""" diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py index 327e7f11dc..e7249aba8a 100644 --- a/openstackclient/network/v2_0/gateway.py +++ b/openstackclient/network/v2_0/gateway.py @@ -22,7 +22,8 @@ class CreateGateway(common.CreateCommand): """Create a gateway""" - clazz = neu2.CreateNetworkGateway + resource = 'gateway' + func = 'network_gateway' def get_parser(self, prog_name): parser = super(CreateGateway, self).get_parser(prog_name) @@ -38,12 +39,16 @@ def get_parser(self, prog_name): 'It can be repeated for multiple devices for HA gateways') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteGateway(common.DeleteCommand): """Delete a gateway""" resource = 'gateway' - resources = 'network_gateways' + resources = 'gateways' + func = 'network_gateway' class ListGateway(common.ListCommand): @@ -65,10 +70,6 @@ class SetGateway(common.SetCommand): class ShowGateway(common.ShowCommand): """Show gateway details""" - resource = 'gateway' + resource = 'network_gateway' resources = 'network_gateways' func = 'network_gateway' - - def __init__(self, app, app_args): - super(ShowGateway, self).__init__(app, app_args) - self.func = "network_gatway" diff --git a/openstackclient/network/v2_0/lb/healthmonitor.py b/openstackclient/network/v2_0/lb/healthmonitor.py index 617e83ec67..df92d4938b 100644 --- a/openstackclient/network/v2_0/lb/healthmonitor.py +++ b/openstackclient/network/v2_0/lb/healthmonitor.py @@ -22,7 +22,7 @@ class CreateHealthMonitor(common.CreateCommand): """Create a load balancer health monitor""" - clazz = neu2.CreateHealthMonitor + resource = 'health_monitor' def get_parser(self, prog_name): parser = super(CreateHealthMonitor, self).get_parser(prog_name) @@ -68,6 +68,9 @@ def get_parser(self, prog_name): help='One of predefined health monitor types') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteHealthMonitor(common.DeleteCommand): """Delete a load balancer health monitor""" diff --git a/openstackclient/network/v2_0/lb/member.py b/openstackclient/network/v2_0/lb/member.py index a7be78ee70..f74f47edca 100644 --- a/openstackclient/network/v2_0/lb/member.py +++ b/openstackclient/network/v2_0/lb/member.py @@ -22,7 +22,7 @@ class CreateMember(common.CreateCommand): """Create a load balancer member""" - clazz = neu2.CreateMember + resource = 'member' def get_parser(self, prog_name): parser = super(CreateMember, self).get_parser(prog_name) @@ -47,6 +47,9 @@ def get_parser(self, prog_name): 'connections. ') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteMember(common.DeleteCommand): """Delete a load balancer member""" diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py index 9d2ef48c93..07eb2b4cb1 100644 --- a/openstackclient/network/v2_0/lb/pool.py +++ b/openstackclient/network/v2_0/lb/pool.py @@ -23,7 +23,7 @@ class CreatePool(common.CreateCommand): """Create a load balancer pool""" - clazz = neu2.CreatePool + resource = 'pool' def get_parser(self, prog_name): parser = super(CreatePool, self).get_parser(prog_name) @@ -57,6 +57,9 @@ def get_parser(self, prog_name): help='Provider name of loadbalancer service') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeletePool(common.DeleteCommand): """Delete a load balancer pool""" @@ -80,22 +83,22 @@ def get_parser(self, prog_name): ) return parser - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - parsed_args.request_format = 'json' - parsed_args.fields = [] - parsed_args.page_size = None - parsed_args.sort_key = [] - parsed_args.sort_dir = [] - if parsed_args.lbaas_agent: - self.list_columns = ['id', 'name', 'lb_method', 'protocol', - 'admin_state_up', 'status'] - neuter = agentscheduler.ListPoolsOnLbaasAgent(self.app, - self.app_args) - else: - neuter = neu2.ListPool(self.app, self.app_args) - neuter.get_client = self.get_client - return neuter.take_action(parsed_args) + #def take_action(self, parsed_args): + #self.log.debug('take_action(%s)' % parsed_args) + #parsed_args.request_format = 'json' + #parsed_args.fields = [] + #parsed_args.page_size = None + #parsed_args.sort_key = [] + #parsed_args.sort_dir = [] + #if parsed_args.lbaas_agent: + #self.list_columns = ['id', 'name', 'lb_method', 'protocol', + #'admin_state_up', 'status'] + #neuter = agentscheduler.ListPoolsOnLbaasAgent(self.app, + #self.app_args) + #else: + #neuter = neu2.ListPool(self.app, self.app_args) + #neuter.get_client = self.get_client + #return neuter.take_action(parsed_args) class SetPool(common.SetCommand): @@ -122,19 +125,19 @@ def get_parser(self, prog_name): default=False, help='Show stats associated with this pool') return parser - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - parsed_args.id = parsed_args.pool - parsed_args.show_details = True - parsed_args.request_format = 'json' - parsed_args.fields = [] - if parsed_args.agent: - neuter = agentscheduler.GetLbaasAgentHostingPool(self.app, - self.app_args) - else: - if parsed_args.stats: - neuter = neu2.RetrievePoolStats(self.app, self.app_args) - else: - neuter = neu2.ShowPool(self.app, self.app_args) - neuter.get_client = self.get_client - return neuter.take_action(parsed_args) + #def take_action(self, parsed_args): + #self.log.debug('take_action(%s)' % parsed_args) + #parsed_args.id = parsed_args.pool + #parsed_args.show_details = True + #parsed_args.request_format = 'json' + #parsed_args.fields = [] + #if parsed_args.agent: + #neuter = agentscheduler.GetLbaasAgentHostingPool(self.app, + #self.app_args) + #else: + #if parsed_args.stats: + #neuter = neu2.RetrievePoolStats(self.app, self.app_args) + #else: + #neuter = neu2.ShowPool(self.app, self.app_args) + #neuter.get_client = self.get_client + #return neuter.take_action(parsed_args) diff --git a/openstackclient/network/v2_0/lb/vip.py b/openstackclient/network/v2_0/lb/vip.py index e70115ecde..c00b0df83e 100644 --- a/openstackclient/network/v2_0/lb/vip.py +++ b/openstackclient/network/v2_0/lb/vip.py @@ -22,7 +22,7 @@ class CreateVip(common.CreateCommand): """Create a load balancer VIP""" - clazz = neu2.CreateVip + resource = 'vip' def get_parser(self, prog_name): parser = super(CreateVip, self).get_parser(prog_name) @@ -61,6 +61,9 @@ def get_parser(self, prog_name): help='the subnet on which to allocate the vip address') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteVip(common.DeleteCommand): """Delete a load balancer VIP""" diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 3153e80466..73968cd0ef 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -15,6 +15,8 @@ """Network action implementations""" +import logging + from cliff import command from neutronclient.neutron.v2_0 import agentscheduler as agent @@ -101,6 +103,10 @@ class ShowNetwork(common.ShowCommand): class AddGatewayNetwork(command.Command, common.BaseCommand): """Add a gateway to a network""" + log = logging.getLogger(__name__ + '.AddGatewayNetwork') + resource = 'network' + resources = 'networks' + def get_parser(self, prog_name): parser = super(AddGatewayNetwork, self).get_parser(prog_name) parser.add_argument( @@ -140,6 +146,10 @@ def take_action(self, parsed_args): class RemoveGatewayNetwork(command.Command, common.BaseCommand): """Remove a gateway from a network""" + log = logging.getLogger(__name__ + '.RemoveGatewayNetwork') + resource = 'network' + resources = 'networks' + def get_parser(self, prog_name): parser = super(RemoveGatewayNetwork, self).get_parser(prog_name) parser.add_argument( diff --git a/openstackclient/network/v2_0/port.py b/openstackclient/network/v2_0/port.py index f102190d46..84e852439a 100644 --- a/openstackclient/network/v2_0/port.py +++ b/openstackclient/network/v2_0/port.py @@ -23,7 +23,7 @@ class CreatePort(common.CreateCommand): """Create a port""" - clazz = neu2.CreatePort + resource = 'port' def get_parser(self, prog_name): parser = super(CreatePort, self).get_parser(prog_name) @@ -74,6 +74,9 @@ def get_parser(self, prog_name): help='Name of port to create') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeletePort(common.DeleteCommand): """Delete a port""" @@ -95,20 +98,20 @@ def get_parser(self, prog_name): ) return parser - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - parsed_args.request_format = 'json' - parsed_args.fields = [] - parsed_args.page_size = None - parsed_args.sort_key = [] - parsed_args.sort_dir = [] - if parsed_args.router: - parsed_args.id = parsed_args.router - neuter = neu2.ListRouterPort(self.app, self.app_args) - else: - neuter = neu2.ListPort(self.app, self.app_args) - neuter.get_client = self.get_client - return neuter.take_action(parsed_args) + #def take_action(self, parsed_args): + #self.log.debug('take_action(%s)' % parsed_args) + #parsed_args.request_format = 'json' + #parsed_args.fields = [] + #parsed_args.page_size = None + #parsed_args.sort_key = [] + #parsed_args.sort_dir = [] + #if parsed_args.router: + # parsed_args.id = parsed_args.router + # neuter = neu2.ListRouterPort(self.app, self.app_args) + #else: + # neuter = neu2.ListPort(self.app, self.app_args) + #neuter.get_client = self.get_client + #return neuter.take_action(parsed_args) class SetPort(common.SetCommand): diff --git a/openstackclient/network/v2_0/router.py b/openstackclient/network/v2_0/router.py index a788f15ba8..f2ef4cf61d 100644 --- a/openstackclient/network/v2_0/router.py +++ b/openstackclient/network/v2_0/router.py @@ -23,7 +23,7 @@ class CreateRouter(common.CreateCommand): """Create a router""" - clazz = neu2.CreateRouter + resource = 'router' def get_parser(self, prog_name): parser = super(CreateRouter, self).get_parser(prog_name) @@ -45,6 +45,9 @@ def get_parser(self, prog_name): help='Name of router to create') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteRouter(common.DeleteCommand): """Delete a router""" @@ -66,26 +69,25 @@ def get_parser(self, prog_name): ) return parser - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - parsed_args.request_format = 'json' - parsed_args.fields = [] - parsed_args.page_size = None - parsed_args.sort_key = [] - parsed_args.sort_dir = [] - if parsed_args.l3_agent: - neuter = agentscheduler.ListRoutersOnL3Agent(self.app, - self.app_args) - else: - neuter = neu2.ListRouter(self.app, self.app_args) - return neuter.take_action(parsed_args) + #def take_action(self, parsed_args): + #self.log.debug('take_action(%s)' % parsed_args) + #parsed_args.request_format = 'json' + #parsed_args.fields = [] + #parsed_args.page_size = None + #parsed_args.sort_key = [] + #parsed_args.sort_dir = [] + #if parsed_args.l3_agent: + # neuter = agentscheduler.ListRoutersOnL3Agent(self.app, + # self.app_args) + #else: + # neuter = neu2.ListRouter(self.app, self.app_args) + #return neuter.take_action(parsed_args) class SetRouter(common.SetCommand): """Set router values""" resource = 'router' - help_text = 'ID of router to set' def get_parser(self, prog_name): parser = super(SetRouter, self).get_parser(prog_name) @@ -108,15 +110,15 @@ def get_parser(self, prog_name): help='Disable source NAT on the router gateway') return parser - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - parsed_args.request_format = 'json' - if parsed_args.no_gateway: - neuter = neu2.RemoveGatewayRouter(self.app, self.app_args) - else: - neuter = neu2.SetGatewayRouter(self.app, self.app_args) - neuter.get_client = self.get_client - return neuter.run(parsed_args) + #def take_action(self, parsed_args): + #self.log.debug('take_action(%s)' % parsed_args) + #parsed_args.request_format = 'json' + #if parsed_args.no_gateway: + #neuter = neu2.RemoveGatewayRouter(self.app, self.app_args) + #else: + #neuter = neu2.SetGatewayRouter(self.app, self.app_args) + #neuter.get_client = self.get_client + #return neuter.run(parsed_args) class ShowRouter(common.ShowCommand): diff --git a/openstackclient/network/v2_0/security_group.py b/openstackclient/network/v2_0/security_group.py index 486d3e168f..a88a036943 100644 --- a/openstackclient/network/v2_0/security_group.py +++ b/openstackclient/network/v2_0/security_group.py @@ -22,7 +22,7 @@ class CreateSecurityGroup(common.CreateCommand): """Create a security group""" - clazz = neu2.CreateSecurityGroup + resource = 'security_group' def get_parser(self, prog_name): parser = super(CreateSecurityGroup, self).get_parser(prog_name) @@ -34,6 +34,9 @@ def get_parser(self, prog_name): help='Name of security group to create') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteSecurityGroup(common.DeleteCommand): """Delete a security group""" diff --git a/openstackclient/network/v2_0/security_group_rule.py b/openstackclient/network/v2_0/security_group_rule.py index 0133145fb8..24fd73c736 100644 --- a/openstackclient/network/v2_0/security_group_rule.py +++ b/openstackclient/network/v2_0/security_group_rule.py @@ -24,7 +24,7 @@ class CreateSecurityGroupRule(common.CreateCommand): """Create a security group rule""" - clazz = neu2.CreateSecurityGroupRule + resource = 'security_group_rule' def get_parser(self, prog_name): parser = super(CreateSecurityGroupRule, self).get_parser(prog_name) @@ -56,6 +56,9 @@ def get_parser(self, prog_name): help='remote security group name or id to apply rule') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteSecurityGroupRule(common.DeleteCommand): """Delete a security group rule""" diff --git a/openstackclient/network/v2_0/subnet.py b/openstackclient/network/v2_0/subnet.py index 88382ca416..632ab750e7 100644 --- a/openstackclient/network/v2_0/subnet.py +++ b/openstackclient/network/v2_0/subnet.py @@ -22,7 +22,7 @@ class CreateSubnet(common.CreateCommand): """Create a subnet""" - clazz = neu2.CreateSubnet + resource = 'subnet' def allocation_pool_parse(self, param): """Convert min-max range into dictionary @@ -97,6 +97,9 @@ def get_parser(self, prog_name): help='CIDR of the subnet to create') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteSubnet(common.DeleteCommand): """Delete a subnet""" diff --git a/openstackclient/network/v2_0/vpn/ikepolicy.py b/openstackclient/network/v2_0/vpn/ikepolicy.py index 2130d5fe33..feb9997fc2 100644 --- a/openstackclient/network/v2_0/vpn/ikepolicy.py +++ b/openstackclient/network/v2_0/vpn/ikepolicy.py @@ -24,7 +24,7 @@ class CreateIkepolicy(common.CreateCommand): """Create a IKE policy""" - clazz = neu2.CreateIKEPolicy + resource = 'ikepolicy' def get_parser(self, prog_name): parser = super(CreateIkepolicy, self).get_parser(prog_name) @@ -65,6 +65,9 @@ def get_parser(self, prog_name): help='Name of the IKE Policy') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteIkepolicy(common.DeleteCommand): """Delete a IKE policy""" diff --git a/openstackclient/network/v2_0/vpn/ipsecpolicy.py b/openstackclient/network/v2_0/vpn/ipsecpolicy.py index 167f8ffb04..f62eda256b 100644 --- a/openstackclient/network/v2_0/vpn/ipsecpolicy.py +++ b/openstackclient/network/v2_0/vpn/ipsecpolicy.py @@ -24,7 +24,7 @@ class CreateIpsecpolicy(common.CreateCommand): """Create a IPSec policy""" - clazz = neu2.CreateIPsecPolicy + resource = 'ipsecpolicy' def get_parser(self, prog_name): parser = super(CreateIpsecpolicy, self).get_parser(prog_name) @@ -64,6 +64,9 @@ def get_parser(self, prog_name): help='Name of the IPsecPolicy') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteIpsecpolicy(common.DeleteCommand): """Delete a IPSec policy""" diff --git a/openstackclient/network/v2_0/vpn/service.py b/openstackclient/network/v2_0/vpn/service.py index 80536d456d..6059deae0f 100644 --- a/openstackclient/network/v2_0/vpn/service.py +++ b/openstackclient/network/v2_0/vpn/service.py @@ -22,7 +22,7 @@ class CreateService(common.CreateCommand): """Create a VPN service""" - clazz = neu2.CreateVPNService + resource = 'vpnservice' def get_parser(self, prog_name): parser = super(CreateService, self).get_parser(prog_name) @@ -44,6 +44,9 @@ def get_parser(self, prog_name): help='Set a description for the vpnservice') return parser + def get_body(self, parsed_args): + return { self.resource: { } } + class DeleteService(common.DeleteCommand): """Delete a VPN service""" From af4b8c4bb9e6eaa0ba85949135590035507c7283 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 12 Feb 2014 13:44:33 -0700 Subject: [PATCH 62/66] tests fixed Change-Id: I8b21178986cd154c7acb949edeceffc92adb093c --- openstackclient/network/common.py | 19 ++++++++----------- openstackclient/network/v2_0/dhcp.py | 2 +- openstackclient/network/v2_0/gateway.py | 9 +++++---- openstackclient/network/v2_0/network.py | 3 ++- openstackclient/tests/network/test_common.py | 6 +++--- .../tests/network/v2_0/lb/test_pool.py | 2 +- .../tests/network/v2_0/test_network.py | 16 ++++++++-------- 7 files changed, 28 insertions(+), 29 deletions(-) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index a2573493f8..09286e804f 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -36,7 +36,7 @@ def dumps(self, value, indent=None): pass return json.dumps(to_primitive(value)) - def format_row(self, columns, data): + def format_list(self, columns, data): row = [] for k in columns: v = data[k] @@ -55,13 +55,13 @@ def format_row(self, columns, data): row.append(v) return row - def data_formatter(self, data): + def format_show(self, data): d = {} for k, v in data.iteritems(): if k in self.matters: d[k] = self.matters[k](v) elif isinstance(v, list): - d[k] = ','.join(self.dumps( + d[k] = '\n'.join(self.dumps( i, indent=self.json_indent) if isinstance(i, dict) else str(i) for i in v) elif isinstance(v, dict): @@ -117,7 +117,7 @@ def take_action(self, parsed_args): _client = self.app.client_manager.network body = self.get_body(parsed_args) create_method = getattr(_client, "create_%s" % self.func) - data = self.data_formatter(create_method(body)[self.resource]) + data = self.format_show(create_method(body)[self.func]) if data: print >>self.app.stdout, 'Created a new %s:' % self.resource else: @@ -137,7 +137,6 @@ def __init__(self, app, app_args): self.help_text = getattr(self, 'help_text', "Name or identifier " + \ "of " + self.resource.replace('_', ' ') + " to delete") self.func = getattr(self, 'func', self.resource) - self.response = self.resource def get_parser(self, prog_name): @@ -172,7 +171,6 @@ class ListCommand(lister.Lister, BaseCommand): def __init__(self, app, app_args): super(ListCommand, self).__init__(app, app_args) self.resources = getattr(self, 'resources', (self.resource + "s")) - self.func = getattr(self, 'func', self.resources) def get_parser(self, prog_name): parser = super(ListCommand, self).get_parser(prog_name) @@ -188,7 +186,7 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) list_method = getattr(self.app.client_manager.network, - "list_%s" % self.func) + "list_%s" % self.resources) data = list_method(**self.report_filter)[self.resources] _columns = len(data) > 0 and sorted(data[0].keys()) or [] if not _columns: @@ -197,7 +195,7 @@ def take_action(self, parsed_args): _columns = [x for x in parsed_args.columns if x in _columns] elif self.list_columns: _columns = [x for x in self.list_columns if x in _columns] - return (_columns, (self.format_row(_columns, item) for item in data)) + return (_columns, (self.format_list(_columns, item) for item in data)) class SetCommand(command.Command, BaseCommand): @@ -235,7 +233,7 @@ def take_action(self, parsed_args): else: _id = parsed_args.identifier update_method = getattr(_client, "update_" + self.func) - update_method(_id, self.body) + update_method(str(_id), self.body) print >>self.app.stdout, ('Updated %(resource)s: %(id)s' % {'id': parsed_args.identifier, 'resource': self.resource}) return @@ -254,7 +252,6 @@ def __init__(self, app, app_args): self.help_text = getattr(self, 'help_text', "Name or identifier " + \ "of " + self.resource.replace('_', ' ') + " to show") self.func = getattr(self, 'func', self.resource) - self.response = self.resource def get_parser(self, prog_name): parser = super(ShowCommand, self).get_parser(prog_name) @@ -273,7 +270,7 @@ def take_action(self, parsed_args): _id = parsed_args.identifier show_method = getattr(self.app.client_manager.network, "show_" + self.func) - data = self.data_formatter(show_method(_id)[self.resource]) + data = self.format_show(show_method(_id)[self.func]) return zip(*sorted(six.iteritems(data))) diff --git a/openstackclient/network/v2_0/dhcp.py b/openstackclient/network/v2_0/dhcp.py index f84ae27536..faaed3a9e4 100644 --- a/openstackclient/network/v2_0/dhcp.py +++ b/openstackclient/network/v2_0/dhcp.py @@ -47,7 +47,7 @@ class ListDhcpAgent(common.ListCommand): """List DHCP agents on a network""" resource = 'dhcp_agent' - func = 'dhcp_agent_hosting_networks' + resources = 'dhcp_agent_hosting_networks' list_columns = ['id', 'host', 'admin_state_up', 'alive'] def get_parser(self, prog_name): diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py index e7249aba8a..201b2313d3 100644 --- a/openstackclient/network/v2_0/gateway.py +++ b/openstackclient/network/v2_0/gateway.py @@ -40,21 +40,21 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return { self.func: { } } class DeleteGateway(common.DeleteCommand): """Delete a gateway""" resource = 'gateway' - resources = 'gateways' + resources = 'network_gateways' func = 'network_gateway' class ListGateway(common.ListCommand): """List gateways""" - resource = 'network_gateway' + resource = 'gateway' resources = 'network_gateways' list_columns = ['id', 'name'] @@ -70,6 +70,7 @@ class SetGateway(common.SetCommand): class ShowGateway(common.ShowCommand): """Show gateway details""" - resource = 'network_gateway' + resource = 'gateway' resources = 'network_gateways' func = 'network_gateway' + # show agents, show stats diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 73968cd0ef..2a951badef 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -83,6 +83,7 @@ def take_action(self, parsed_args): if parsed_args.external: self.report_filter={'router:external': True} elif parsed_args.dhcp_agent: + self.func = 'networks_on_dhcp_agent' self.resources = 'networks_on_dhcp_agent' self.report_filter = {'dhcp_agent': parsed_args.dhcp_agent} return super(ListNetwork, self).take_action(parsed_args) @@ -182,5 +183,5 @@ def take_action(self, parsed_args): {'network_id': _network_id, 'segmentation_type': parsed_args.segmentation_type, 'segmentation_id': parsed_args.segmentation_id}) - print >> self.app.stdout, ('Disconnected network to gateway %s' % + print >> self.app.stdout, ('Disconnected network from gateway %s' % _gateway_id) diff --git a/openstackclient/tests/network/test_common.py b/openstackclient/tests/network/test_common.py index 3fb4c52128..30a5ce5123 100644 --- a/openstackclient/tests/network/test_common.py +++ b/openstackclient/tests/network/test_common.py @@ -24,15 +24,15 @@ def format_subnet(value): class TestBaseCommand(test_common.TestNetworkBase): class Shower(common.ShowCommand): - name = "testable" + resource = "testable" matters = {"subnet": format_subnet} - def test_format_output(self): + def test_format_show(self): shower = self.Shower(None, None) _listo = [{"ka1": "va1", "ka2": "va2"}, {"ka3": "va3", "ka4": "va4"}, {"ka5": "va5", "ka6": "va6"}] - result = shower.format_data({"ka": _listo, + result = shower.format_show({"ka": _listo, "kb": {"k4": "v4"}, "kc": {"ka1": {"ka2": "v3"}}, "kd": None, diff --git a/openstackclient/tests/network/v2_0/lb/test_pool.py b/openstackclient/tests/network/v2_0/lb/test_pool.py index f45ab50145..97d74cc29d 100644 --- a/openstackclient/tests/network/v2_0/lb/test_pool.py +++ b/openstackclient/tests/network/v2_0/lb/test_pool.py @@ -52,7 +52,7 @@ def test_get_parser_all(self): class TestDeleteLbPool(common.TestNetworkBase): def test_get_parser_nothing(self): parsed = self.given_args(pool.DeletePool, "noo") - self.assertEqual('noo', parsed.pool) + self.assertEqual('noo', parsed.identifier) class TestListLbPool(common.TestNetworkBase): diff --git a/openstackclient/tests/network/v2_0/test_network.py b/openstackclient/tests/network/v2_0/test_network.py index 7f5da9b4c4..ec3b064f16 100644 --- a/openstackclient/tests/network/v2_0/test_network.py +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -87,16 +87,16 @@ class TestAddGatewayNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): given = "netty getty" parsed = self.given_args(network.AddGatewayNetwork, given) - self.assertEqual('netty', parsed.network_id) - self.assertEqual('getty', parsed.net_gateway_id) + self.assertEqual('netty', parsed.network) + self.assertEqual('getty', parsed.gateway) self.assertEqual(None, parsed.segmentation_type) self.assertEqual(None, parsed.segmentation_id) def test_get_parser_all(self): given = "netty getty --segmentation-type 1 --segmentation-id 2" parsed = self.given_args(network.AddGatewayNetwork, given) - self.assertEqual('netty', parsed.network_id) - self.assertEqual('getty', parsed.net_gateway_id) + self.assertEqual('netty', parsed.network) + self.assertEqual('getty', parsed.gateway) self.assertEqual('1', parsed.segmentation_type) self.assertEqual('2', parsed.segmentation_id) @@ -105,15 +105,15 @@ class TestRemoveGatewayNetwork(common.TestNetworkBase): def test_get_parser_nothing(self): given = "netty getty" parsed = self.given_args(network.RemoveGatewayNetwork, given) - self.assertEqual('netty', parsed.network_id) - self.assertEqual('getty', parsed.net_gateway_id) + self.assertEqual('netty', parsed.network) + self.assertEqual('getty', parsed.gateway) self.assertEqual(None, parsed.segmentation_type) self.assertEqual(None, parsed.segmentation_id) def test_get_parser_all(self): given = "netty getty --segmentation-type 1 --segmentation-id 2" parsed = self.given_args(network.RemoveGatewayNetwork, given) - self.assertEqual('netty', parsed.network_id) - self.assertEqual('getty', parsed.net_gateway_id) + self.assertEqual('netty', parsed.network) + self.assertEqual('getty', parsed.gateway) self.assertEqual('1', parsed.segmentation_type) self.assertEqual('2', parsed.segmentation_id) From aa2985446e112d5bc3578ef43200d78fae1b68e5 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 12 Feb 2014 14:04:12 -0700 Subject: [PATCH 63/66] port change Change-Id: I3967e1b8661c67bbadc2484bf386373c5c381307 --- openstackclient/tests/fakes.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openstackclient/tests/fakes.py b/openstackclient/tests/fakes.py index 044b3d0fd9..e68f0a271d 100644 --- a/openstackclient/tests/fakes.py +++ b/openstackclient/tests/fakes.py @@ -13,6 +13,7 @@ # under the License. # +import six import sys @@ -72,7 +73,7 @@ def __init__(self, manager, info, loaded=False): self._loaded = loaded def _add_details(self, info): - for (k, v) in info.iteritems(): + for (k, v) in six.iteritems(info): setattr(self, k, v) def __repr__(self): From 534d63841b6924d4c77a5b55684ae7de91fc8563 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 12 Feb 2014 14:39:04 -0700 Subject: [PATCH 64/66] update Change-Id: I2666a1a0d8a7b045b4381cb5fdfe9b3be9bb44fb --- openstackclient/network/__init__.py | 14 -------------- openstackclient/network/v2_0/__init__.py | 14 -------------- openstackclient/tests/common/test_restapi.py | 2 +- openstackclient/tests/network/__init__.py | 14 -------------- openstackclient/tests/network/v2_0/__init__.py | 14 -------------- requirements.txt | 2 +- 6 files changed, 2 insertions(+), 58 deletions(-) diff --git a/openstackclient/network/__init__.py b/openstackclient/network/__init__.py index 85ac2501b8..e69de29bb2 100644 --- a/openstackclient/network/__init__.py +++ b/openstackclient/network/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012-2013 OpenStack, LLC. -# -# 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. -# diff --git a/openstackclient/network/v2_0/__init__.py b/openstackclient/network/v2_0/__init__.py index 85ac2501b8..e69de29bb2 100644 --- a/openstackclient/network/v2_0/__init__.py +++ b/openstackclient/network/v2_0/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012-2013 OpenStack, LLC. -# -# 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. -# diff --git a/openstackclient/tests/common/test_restapi.py b/openstackclient/tests/common/test_restapi.py index c1e02fcbcf..2c1d5ddd70 100644 --- a/openstackclient/tests/common/test_restapi.py +++ b/openstackclient/tests/common/test_restapi.py @@ -55,7 +55,7 @@ class FakeResponse(requests.Response): - def __init__(self, headers={}, status_code=None, data=None, encoding=None): + def __init__(self, headers={}, status_code=200, data=None, encoding=None): super(FakeResponse, self).__init__() self.status_code = status_code diff --git a/openstackclient/tests/network/__init__.py b/openstackclient/tests/network/__init__.py index ebf59b327e..e69de29bb2 100644 --- a/openstackclient/tests/network/__init__.py +++ b/openstackclient/tests/network/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# diff --git a/openstackclient/tests/network/v2_0/__init__.py b/openstackclient/tests/network/v2_0/__init__.py index ebf59b327e..e69de29bb2 100644 --- a/openstackclient/tests/network/v2_0/__init__.py +++ b/openstackclient/tests/network/v2_0/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -# diff --git a/requirements.txt b/requirements.txt index 0175d08461..79ba6d8431 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ cliff>=1.4.3 keyring>=1.6.1,<2.0,>=2.1 pycrypto>=2.6 python-glanceclient>=0.9.0 -python-keystoneclient>=0.4.1 +python-keystoneclient>=0.4.2 python-novaclient>=2.15.0 python-cinderclient>=1.0.6 python-neutronclient>=2.3.0,<3 From 8f258b46683716656708656584caddbe47bcadf6 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Thu, 13 Feb 2014 09:16:30 -0700 Subject: [PATCH 65/66] merge Change-Id: I4af3fc37712db310de3f0714fc9e60fb3ef94b7d --- openstackclient/common/openstackkeyring.py | 2 +- openstackclient/identity/client.py | 2 +- openstackclient/identity/v3/token.py | 18 +++++ openstackclient/network/common.py | 56 ++++++++----- openstackclient/network/v2_0/network.py | 51 ++++++------ openstackclient/tests/identity/v3/fakes.py | 18 +++++ .../tests/identity/v3/test_token.py | 79 +++++++++++++++++++ openstackclient/tests/volume/v1/fakes.py | 2 +- .../tests/volume/v1/test_volume.py | 6 +- tox.ini | 3 - 10 files changed, 182 insertions(+), 55 deletions(-) create mode 100644 openstackclient/tests/identity/v3/test_token.py diff --git a/openstackclient/common/openstackkeyring.py b/openstackclient/common/openstackkeyring.py index e60ce71ca6..115e564440 100644 --- a/openstackclient/common/openstackkeyring.py +++ b/openstackclient/common/openstackkeyring.py @@ -37,7 +37,7 @@ def _init_crypter(self): block_size = 32 padding = '0' - # init the cipher with the class name, upto block_size + # init the cipher with the class name, up to block_size password = __name__[block_size:] password = password + (block_size - len(password) % block_size) * padding diff --git a/openstackclient/identity/client.py b/openstackclient/identity/client.py index b19388ccb2..a71dfc7add 100644 --- a/openstackclient/identity/client.py +++ b/openstackclient/identity/client.py @@ -70,4 +70,4 @@ def __getattr__(self, name): if name == "projects": return self.tenants else: - raise AttributeError, name + raise AttributeError(name) diff --git a/openstackclient/identity/v3/token.py b/openstackclient/identity/v3/token.py index ba667be3b3..68f9ffef47 100644 --- a/openstackclient/identity/v3/token.py +++ b/openstackclient/identity/v3/token.py @@ -185,6 +185,24 @@ def take_action(self, parsed_args): return zip(*sorted(six.iteritems(request_token))) +class CreateToken(show.ShowOne): + """Create token command""" + + log = logging.getLogger(__name__ + '.CreateToken') + + def get_parser(self, prog_name): + parser = super(CreateToken, self).get_parser(prog_name) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + identity_client = self.app.client_manager.identity + token = identity_client.service_catalog.get_token() + if 'tenant_id' in token: + token['project_id'] = token.pop('tenant_id') + return zip(*sorted(six.iteritems(token))) + + class DeleteAccessToken(command.Command): """Delete access token command""" diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index 09286e804f..241f61035a 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -13,6 +13,7 @@ # under the License. # +import datetime import json import logging import six @@ -24,6 +25,27 @@ from openstackclient.common import exceptions +def to_primitive(value): + if isinstance(value, list) or isinstance(value, tuple): + o = [] + for v in value: + o.append(to_primitive(v)) + return o + elif isinstance(value, dict): + o = {} + for k, v in value.iteritems(): + o[k] = to_primitive(v) + return o + elif isinstance(value, datetime.datetime): + return str(value) + elif hasattr(value, 'iteritems'): + return to_primitive(dict(value.iteritems())) + elif hasattr(value, '__iter__'): + return to_primitive(list(value)) + else: + return value + + class BaseCommand(object): json_indent = None @@ -77,8 +99,7 @@ def find_resource(self, name): def find(self, resource, resources, name): client = self.app.client_manager.network - list_method = getattr(self.app.client_manager.network, - "list_%s" % resources) + list_method = getattr(client, "list_%s" % resources) data = list_method(name=name, fields='id') info = data[resources] if len(info) == 1: @@ -119,7 +140,7 @@ def take_action(self, parsed_args): create_method = getattr(_client, "create_%s" % self.func) data = self.format_show(create_method(body)[self.func]) if data: - print >>self.app.stdout, 'Created a new %s:' % self.resource + print('Created a new %s:' % self.resource) else: data = {'': ''} return zip(*sorted(six.iteritems(data))) @@ -134,11 +155,11 @@ def __init__(self, app, app_args): super(DeleteCommand, self).__init__(app, app_args) self.resources = getattr(self, 'resources', (self.resource + "s")) self.metavar = "<" + self.resource + ">" - self.help_text = getattr(self, 'help_text', "Name or identifier " + \ - "of " + self.resource.replace('_', ' ') + " to delete") + self.help_text = getattr(self, 'help_text', "Name or identifier of " + + self.resource.replace('_', ' ') + + " to delete") self.func = getattr(self, 'func', self.resource) - def get_parser(self, prog_name): parser = super(DeleteCommand, self).get_parser(prog_name) parser.add_argument( @@ -155,10 +176,10 @@ def take_action(self, parsed_args): else: _id = parsed_args.identifier delete_method = getattr(self.app.client_manager.network, "delete_" + - self.func) + self.func) delete_method(_id) - print >>self.app.stdout, ('Deleted %(resource)s: %(id)s' - % {'id': parsed_args.identifier, 'resource': self.resource}) + print ('Deleted %(resource)s: %(id)s' % {'id': parsed_args.identifier, + 'resource': self.resource}) return @@ -185,8 +206,8 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - list_method = getattr(self.app.client_manager.network, - "list_%s" % self.resources) + client = self.app.client_manager.network + list_method = getattr(client, "list_%s" % self.resources) data = list_method(**self.report_filter)[self.resources] _columns = len(data) > 0 and sorted(data[0].keys()) or [] if not _columns: @@ -207,8 +228,8 @@ def __init__(self, app, app_args): super(SetCommand, self).__init__(app, app_args) self.resources = getattr(self, 'resources', (self.resource + "s")) self.metavar = "<" + self.resource + ">" - self.help_text = getattr(self, 'help_text', "Name or identifier " + \ - "of " + self.resource.replace('_', ' ') + " to set") + self.help_text = getattr(self, 'help_text', "Name or identifier of " + + self.resource.replace('_', ' ') + " to set") self.func = getattr(self, 'func', self.resource) self.body = {} @@ -234,12 +255,11 @@ def take_action(self, parsed_args): _id = parsed_args.identifier update_method = getattr(_client, "update_" + self.func) update_method(str(_id), self.body) - print >>self.app.stdout, ('Updated %(resource)s: %(id)s' % - {'id': parsed_args.identifier, 'resource': self.resource}) + print ('Updated %(resource)s: %(id)s' % {'id': parsed_args.identifier, + 'resource': self.resource}) return - class ShowCommand(show.ShowOne, BaseCommand): log = logging.getLogger(__name__ + '.ShowCommand') @@ -249,8 +269,8 @@ def __init__(self, app, app_args): super(ShowCommand, self).__init__(app, app_args) self.resources = getattr(self, 'resources', (self.resource + "s")) self.metavar = "<" + self.resource + ">" - self.help_text = getattr(self, 'help_text', "Name or identifier " + \ - "of " + self.resource.replace('_', ' ') + " to show") + self.help_text = getattr(self, 'help_text', "Name or identifier of " + + self.resource.replace('_', ' ') + " to show") self.func = getattr(self, 'func', self.resource) def get_parser(self, prog_name): diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py index 2a951badef..34d29906c8 100644 --- a/openstackclient/network/v2_0/network.py +++ b/openstackclient/network/v2_0/network.py @@ -19,9 +19,6 @@ from cliff import command -from neutronclient.neutron.v2_0 import agentscheduler as agent -from neutronclient.neutron.v2_0 import network as neu2 -from neutronclient.neutron.v2_0 import nvpnetworkgateway from openstackclient.network import common @@ -46,10 +43,10 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { - 'name': str(parsed_args.name), - 'admin_state_up': str(parsed_args.admin_state), - 'shared': str(parsed_args.shared) } } + return {self.resource: { + 'name': str(parsed_args.name), + 'admin_state_up': str(parsed_args.admin_state), + 'shared': str(parsed_args.shared) } } class DeleteNetwork(common.DeleteCommand): @@ -81,7 +78,7 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) if parsed_args.external: - self.report_filter={'router:external': True} + self.report_filter = {'router:external': True} elif parsed_args.dhcp_agent: self.func = 'networks_on_dhcp_agent' self.resources = 'networks_on_dhcp_agent' @@ -132,16 +129,15 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - _client = self.app.client_manager.network - _network_id = self.find_resource(parsed_args.network) - _gateway_id = self.find('network_gateway', 'network_gateways', - parsed_args.gateway) - _client.connect_network_gateway(_gateway_id, - {'network_id': _network_id, - 'segmentation_type': parsed_args.segmentation_type, - 'segmentation_id': parsed_args.segmentation_id}) - print >>self.app.stdout, ('Connected network to gateway %s' % - _gateway_id) + client = self.app.client_manager.network + network_id = self.find_resource(parsed_args.network) + gateway_id = self.find('network_gateway', 'network_gateways', + parsed_args.gateway) + body = {'network_id': network_id, + 'segmentation_type': parsed_args.segmentation_type, + 'segmentation_id': parsed_args.segmentation_id} + client.connect_network_gateway(gateway_id, body) + print ('Connected network to gateway %s' % gateway_id) class RemoveGatewayNetwork(command.Command, common.BaseCommand): @@ -175,13 +171,12 @@ def get_parser(self, prog_name): def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) - _client = self.app.client_manager.network - _network_id = self.find_resource(parsed_args.network) - _gateway_id = self.find('network_gateway', 'network_gateways', - parsed_args.gateway) - _client.disconnect_network_gateway(_gateway_id, - {'network_id': _network_id, - 'segmentation_type': parsed_args.segmentation_type, - 'segmentation_id': parsed_args.segmentation_id}) - print >> self.app.stdout, ('Disconnected network from gateway %s' % - _gateway_id) + client = self.app.client_manager.network + network_id = self.find_resource(parsed_args.network) + gateway_id = self.find('network_gateway', 'network_gateways', + parsed_args.gateway) + body = {'network_id': network_id, + 'segmentation_type': parsed_args.segmentation_type, + 'segmentation_id': parsed_args.segmentation_id} + client.disconnect_network_gateway(gateway_id, body) + print ('Disconnected network from gateway %s' % gateway_id) diff --git a/openstackclient/tests/identity/v3/fakes.py b/openstackclient/tests/identity/v3/fakes.py index 9d40d9dbec..f2696ef8c7 100644 --- a/openstackclient/tests/identity/v3/fakes.py +++ b/openstackclient/tests/identity/v3/fakes.py @@ -88,6 +88,23 @@ 'domain_id': domain_id, } +token_expires = '2014-01-01T00:00:00Z' +token_id = 'tttttttt-tttt-tttt-tttt-tttttttttttt' + +TOKEN_WITH_TENANT_ID = { + 'expires': token_expires, + 'id': token_id, + 'tenant_id': project_id, + 'user_id': user_id, +} + +TOKEN_WITH_DOMAIN_ID = { + 'expires': token_expires, + 'id': token_id, + 'domain_id': domain_id, + 'user_id': user_id, +} + class FakeIdentityv3Client(object): def __init__(self, **kwargs): @@ -101,6 +118,7 @@ def __init__(self, **kwargs): self.roles.resource_class = fakes.FakeResource(None, {}) self.services = mock.Mock() self.services.resource_class = fakes.FakeResource(None, {}) + self.service_catalog = mock.Mock() self.users = mock.Mock() self.users.resource_class = fakes.FakeResource(None, {}) self.auth_token = kwargs['token'] diff --git a/openstackclient/tests/identity/v3/test_token.py b/openstackclient/tests/identity/v3/test_token.py new file mode 100644 index 0000000000..7e1d1669b9 --- /dev/null +++ b/openstackclient/tests/identity/v3/test_token.py @@ -0,0 +1,79 @@ +# Copyright 2014 eBay Inc. +# +# 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 openstackclient.identity.v3 import token +from openstackclient.tests.identity.v3 import fakes as identity_fakes + + +class TestToken(identity_fakes.TestIdentityv3): + + def setUp(self): + super(TestToken, self).setUp() + + # Get a shortcut to the Service Catalog Mock + self.sc_mock = self.app.client_manager.identity.service_catalog + self.sc_mock.reset_mock() + + +class TestTokenCreate(TestToken): + + def setUp(self): + super(TestTokenCreate, self).setUp() + + self.cmd = token.CreateToken(self.app, None) + + def test_token_create_with_project_id(self): + arglist = [] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + self.sc_mock.get_token.return_value = \ + identity_fakes.TOKEN_WITH_TENANT_ID + + # DisplayCommandBase.take_action() returns two tuples + columns, data = self.cmd.take_action(parsed_args) + + self.sc_mock.get_token.assert_called_with() + + collist = ('expires', 'id', 'project_id', 'user_id') + self.assertEqual(columns, collist) + datalist = ( + identity_fakes.token_expires, + identity_fakes.token_id, + identity_fakes.project_id, + identity_fakes.user_id, + ) + self.assertEqual(data, datalist) + + def test_token_create_with_domain_id(self): + arglist = [] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + self.sc_mock.get_token.return_value = \ + identity_fakes.TOKEN_WITH_DOMAIN_ID + + # DisplayCommandBase.take_action() returns two tuples + columns, data = self.cmd.take_action(parsed_args) + + self.sc_mock.get_token.assert_called_with() + + collist = ('domain_id', 'expires', 'id', 'user_id') + self.assertEqual(columns, collist) + datalist = ( + identity_fakes.domain_id, + identity_fakes.token_expires, + identity_fakes.token_id, + identity_fakes.user_id, + ) + self.assertEqual(data, datalist) diff --git a/openstackclient/tests/volume/v1/fakes.py b/openstackclient/tests/volume/v1/fakes.py index b25dfaf70a..d6ef0d399e 100644 --- a/openstackclient/tests/volume/v1/fakes.py +++ b/openstackclient/tests/volume/v1/fakes.py @@ -32,7 +32,7 @@ 'display_description': volume_description, 'size': volume_size, 'status': '', - 'attach_status': 'detatched', + 'attach_status': 'detached', 'metadata': volume_metadata, } diff --git a/openstackclient/tests/volume/v1/test_volume.py b/openstackclient/tests/volume/v1/test_volume.py index 4e033dfeea..554e2b2a36 100644 --- a/openstackclient/tests/volume/v1/test_volume.py +++ b/openstackclient/tests/volume/v1/test_volume.py @@ -105,7 +105,7 @@ def test_volume_create_min_options(self): ) self.assertEqual(columns, collist) datalist = ( - 'detatched', + 'detached', volume_fakes.volume_description, volume_fakes.volume_name, volume_fakes.volume_id, @@ -181,7 +181,7 @@ def test_volume_create_user_project_id(self): ) self.assertEqual(columns, collist) datalist = ( - 'detatched', + 'detached', volume_fakes.volume_description, volume_fakes.volume_name, volume_fakes.volume_id, @@ -257,7 +257,7 @@ def test_volume_create_user_project_name(self): ) self.assertEqual(columns, collist) datalist = ( - 'detatched', + 'detached', volume_fakes.volume_description, volume_fakes.volume_name, volume_fakes.volume_id, diff --git a/tox.ini b/tox.ini index f6a5c338f9..751cbd6820 100644 --- a/tox.ini +++ b/tox.ini @@ -7,9 +7,6 @@ skipdist = True usedevelop = True install_command = pip install -U {opts} {packages} setenv = VIRTUAL_ENV={envdir} - LANG=en_US.UTF-8 - LANGUAGE=en_US:en - LC_ALL=C deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt commands = python setup.py testr --testr-args='{posargs}' From 3139215cda0454f245964eb1235b72b66c2c327c Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Wed, 2 Apr 2014 12:48:31 -0600 Subject: [PATCH 66/66] fix for latest Change-Id: I11ef494fe202e92687c13cce72ecb0dc4bc18d3a --- openstackclient/network/v2_0/floatingip.py | 3 +-- openstackclient/network/v2_0/fw/__init__.py | 14 -------------- openstackclient/network/v2_0/fw/firewall.py | 3 +-- openstackclient/network/v2_0/gateway.py | 2 +- openstackclient/network/v2_0/lb/__init__.py | 14 -------------- openstackclient/network/v2_0/lb/member.py | 3 +-- openstackclient/network/v2_0/lb/vip.py | 3 +-- openstackclient/network/v2_0/security_group.py | 3 +-- .../network/v2_0/security_group_rule.py | 5 ++--- openstackclient/network/v2_0/subnet.py | 3 +-- openstackclient/network/v2_0/vpn/__init__.py | 14 -------------- openstackclient/network/v2_0/vpn/ikepolicy.py | 3 +-- openstackclient/network/v2_0/vpn/ipsecpolicy.py | 3 +-- openstackclient/network/v2_0/vpn/service.py | 3 +-- openstackclient/tests/network/v2_0/fw/__init__.py | 14 -------------- openstackclient/tests/network/v2_0/lb/__init__.py | 14 -------------- openstackclient/tests/network/v2_0/vpn/__init__.py | 14 -------------- 17 files changed, 12 insertions(+), 106 deletions(-) diff --git a/openstackclient/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py index 17d3369304..c596dfab48 100644 --- a/openstackclient/network/v2_0/floatingip.py +++ b/openstackclient/network/v2_0/floatingip.py @@ -15,7 +15,6 @@ """FloatingIp action implementations""" -from neutronclient.neutron.v2_0 import floatingip as neu2 from openstackclient.network import common @@ -40,7 +39,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return {self.resource: {}} class DeleteFloatingIp(common.DeleteCommand): diff --git a/openstackclient/network/v2_0/fw/__init__.py b/openstackclient/network/v2_0/fw/__init__.py index 85ac2501b8..e69de29bb2 100644 --- a/openstackclient/network/v2_0/fw/__init__.py +++ b/openstackclient/network/v2_0/fw/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012-2013 OpenStack, LLC. -# -# 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. -# diff --git a/openstackclient/network/v2_0/fw/firewall.py b/openstackclient/network/v2_0/fw/firewall.py index 7a3dcfc549..d48bea1f89 100644 --- a/openstackclient/network/v2_0/fw/firewall.py +++ b/openstackclient/network/v2_0/fw/firewall.py @@ -15,7 +15,6 @@ """Firewall action implementations""" -from neutronclient.neutron.v2_0.fw import firewall as neu2 from openstackclient.network import common @@ -62,7 +61,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return {self.resource: {}} class DeleteFirewall(common.DeleteCommand): diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py index 201b2313d3..cee8806278 100644 --- a/openstackclient/network/v2_0/gateway.py +++ b/openstackclient/network/v2_0/gateway.py @@ -40,7 +40,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.func: { } } + return {self.func: {}} class DeleteGateway(common.DeleteCommand): diff --git a/openstackclient/network/v2_0/lb/__init__.py b/openstackclient/network/v2_0/lb/__init__.py index 85ac2501b8..e69de29bb2 100644 --- a/openstackclient/network/v2_0/lb/__init__.py +++ b/openstackclient/network/v2_0/lb/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012-2013 OpenStack, LLC. -# -# 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. -# diff --git a/openstackclient/network/v2_0/lb/member.py b/openstackclient/network/v2_0/lb/member.py index f74f47edca..225cafa98c 100644 --- a/openstackclient/network/v2_0/lb/member.py +++ b/openstackclient/network/v2_0/lb/member.py @@ -15,7 +15,6 @@ """Load Balancer member action implementations""" -from neutronclient.neutron.v2_0.lb import member as neu2 from openstackclient.network import common @@ -48,7 +47,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return {self.resource: {}} class DeleteMember(common.DeleteCommand): diff --git a/openstackclient/network/v2_0/lb/vip.py b/openstackclient/network/v2_0/lb/vip.py index c00b0df83e..db9506da42 100644 --- a/openstackclient/network/v2_0/lb/vip.py +++ b/openstackclient/network/v2_0/lb/vip.py @@ -15,7 +15,6 @@ """Load Balancer VIP action implementations""" -from neutronclient.neutron.v2_0.lb import vip as neu2 from openstackclient.network import common @@ -62,7 +61,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return {self.resource: {}} class DeleteVip(common.DeleteCommand): diff --git a/openstackclient/network/v2_0/security_group.py b/openstackclient/network/v2_0/security_group.py index a88a036943..dca4b99697 100644 --- a/openstackclient/network/v2_0/security_group.py +++ b/openstackclient/network/v2_0/security_group.py @@ -15,7 +15,6 @@ """Security Group action implementations""" -from neutronclient.neutron.v2_0 import securitygroup as neu2 from openstackclient.network import common @@ -35,7 +34,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return {self.resource: {}} class DeleteSecurityGroup(common.DeleteCommand): diff --git a/openstackclient/network/v2_0/security_group_rule.py b/openstackclient/network/v2_0/security_group_rule.py index 24fd73c736..1a668a4133 100644 --- a/openstackclient/network/v2_0/security_group_rule.py +++ b/openstackclient/network/v2_0/security_group_rule.py @@ -17,7 +17,6 @@ import argparse -from neutronclient.neutron.v2_0 import securitygroup as neu2 from openstackclient.network import common @@ -57,7 +56,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return {self.resource: {}} class DeleteSecurityGroupRule(common.DeleteCommand): @@ -72,7 +71,7 @@ class ListSecurityGroupRule(common.ListCommand): resource = 'security_group_rule' list_columns = ['id', 'security_group_id', 'direction', 'protocol', - 'remote_ip_prefix','remote_group_id'] + 'remote_ip_prefix', 'remote_group_id'] def get_parser(self, prog_name): parser = super(ListSecurityGroupRule, self).get_parser(prog_name) diff --git a/openstackclient/network/v2_0/subnet.py b/openstackclient/network/v2_0/subnet.py index 632ab750e7..bdaa7d530a 100644 --- a/openstackclient/network/v2_0/subnet.py +++ b/openstackclient/network/v2_0/subnet.py @@ -15,7 +15,6 @@ """Subnet action implementations""" -from neutronclient.neutron.v2_0 import subnet as neu2 from openstackclient.network import common @@ -98,7 +97,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return {self.resource: {}} class DeleteSubnet(common.DeleteCommand): diff --git a/openstackclient/network/v2_0/vpn/__init__.py b/openstackclient/network/v2_0/vpn/__init__.py index 85ac2501b8..e69de29bb2 100644 --- a/openstackclient/network/v2_0/vpn/__init__.py +++ b/openstackclient/network/v2_0/vpn/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012-2013 OpenStack, LLC. -# -# 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. -# diff --git a/openstackclient/network/v2_0/vpn/ikepolicy.py b/openstackclient/network/v2_0/vpn/ikepolicy.py index feb9997fc2..240c5db177 100644 --- a/openstackclient/network/v2_0/vpn/ikepolicy.py +++ b/openstackclient/network/v2_0/vpn/ikepolicy.py @@ -16,7 +16,6 @@ """IKE Policy action implementations""" from neutronclient.common import utils -from neutronclient.neutron.v2_0.vpn import ikepolicy as neu2 from neutronclient.neutron.v2_0.vpn import utils as vpn_utils from openstackclient.network import common @@ -66,7 +65,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return {self.resource: {}} class DeleteIkepolicy(common.DeleteCommand): diff --git a/openstackclient/network/v2_0/vpn/ipsecpolicy.py b/openstackclient/network/v2_0/vpn/ipsecpolicy.py index f62eda256b..27afd6b1af 100644 --- a/openstackclient/network/v2_0/vpn/ipsecpolicy.py +++ b/openstackclient/network/v2_0/vpn/ipsecpolicy.py @@ -16,7 +16,6 @@ """IPSec Policy action implementations""" from neutronclient.common import utils -from neutronclient.neutron.v2_0.vpn import ipsecpolicy as neu2 from neutronclient.neutron.v2_0.vpn import utils as vpn_utils from openstackclient.network import common @@ -65,7 +64,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return {self.resource: {}} class DeleteIpsecpolicy(common.DeleteCommand): diff --git a/openstackclient/network/v2_0/vpn/service.py b/openstackclient/network/v2_0/vpn/service.py index 6059deae0f..4d5d08e663 100644 --- a/openstackclient/network/v2_0/vpn/service.py +++ b/openstackclient/network/v2_0/vpn/service.py @@ -15,7 +15,6 @@ """VPN action implementations""" -from neutronclient.neutron.v2_0.vpn import vpnservice as neu2 from openstackclient.network import common @@ -45,7 +44,7 @@ def get_parser(self, prog_name): return parser def get_body(self, parsed_args): - return { self.resource: { } } + return {self.resource: {}} class DeleteService(common.DeleteCommand): diff --git a/openstackclient/tests/network/v2_0/fw/__init__.py b/openstackclient/tests/network/v2_0/fw/__init__.py index 85ac2501b8..e69de29bb2 100644 --- a/openstackclient/tests/network/v2_0/fw/__init__.py +++ b/openstackclient/tests/network/v2_0/fw/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012-2013 OpenStack, LLC. -# -# 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. -# diff --git a/openstackclient/tests/network/v2_0/lb/__init__.py b/openstackclient/tests/network/v2_0/lb/__init__.py index 85ac2501b8..e69de29bb2 100644 --- a/openstackclient/tests/network/v2_0/lb/__init__.py +++ b/openstackclient/tests/network/v2_0/lb/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012-2013 OpenStack, LLC. -# -# 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. -# diff --git a/openstackclient/tests/network/v2_0/vpn/__init__.py b/openstackclient/tests/network/v2_0/vpn/__init__.py index ebf59b327e..e69de29bb2 100644 --- a/openstackclient/tests/network/v2_0/vpn/__init__.py +++ b/openstackclient/tests/network/v2_0/vpn/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 OpenStack, LLC. -# -# 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. -#