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/__init__.py b/openstackclient/network/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openstackclient/network/client.py b/openstackclient/network/client.py new file mode 100644 index 0000000000..7252fd8244 --- /dev/null +++ b/openstackclient/network/client.py @@ -0,0 +1,63 @@ +# 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__) + +DEFAULT_NETWORK_API_VERSION = '2.0' +API_VERSION_OPTION = 'os_network_api_version' +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, + ) + + +def build_option_parser(parser): + """Hook to add global options""" + parser.add_argument( + '--os-network-api-version', + metavar='', + default=utils.env( + 'OS_NETWORK_API_VERSION', + default=DEFAULT_NETWORK_API_VERSION), + help='Network API version, default=' + + DEFAULT_NETWORK_API_VERSION + + ' (Env: OS_NETWORK_API_VERSION)') + return parser diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py new file mode 100644 index 0000000000..241f61035a --- /dev/null +++ b/openstackclient/network/common.py @@ -0,0 +1,368 @@ +# 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 datetime +import json +import logging +import six + +from cliff import command +from cliff import lister +from cliff import show + +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 + + matters = {} + + def dumps(self, value, indent=None): + try: + return json.dumps(value, indent=indent) + except TypeError: + pass + return json.dumps(to_primitive(value)) + + def format_list(self, columns, data): + row = [] + for k in columns: + v = data[k] + if k in self.matters: + 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) + 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 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] = '\n'.join(self.dumps( + i, indent=self.json_indent) if isinstance(i, dict) + else str(i) for i in v) + elif isinstance(v, dict): + d[k] = self.dumps(v, indent=self.json_indent) + elif v is None: + d[k] = '' + else: + d[k] = v + return d + + 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 = getattr(client, "list_%s" % resources) + data = list_method(name=name, fields='id') + 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'." % \ + (resource, name) + raise exceptions.CommandError(msg) + data = list_method(id=name, fields='id') + info = data[resources] + if len(info) == 1: + return info[0]['id'] + msg = "No %s with a name or ID of '%s' exists." % \ + (resource, name) + raise exceptions.CommandError(msg) + + +class CreateCommand(show.ShowOne, BaseCommand): + + log = logging.getLogger(__name__ + '.CreateCommand') + + 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) + 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) + _client = self.app.client_manager.network + body = self.get_body(parsed_args) + create_method = getattr(_client, "create_%s" % self.func) + data = self.format_show(create_method(body)[self.func]) + if data: + print('Created a new %s:' % self.resource) + else: + data = {'': ''} + return zip(*sorted(six.iteritems(data))) + + +class DeleteCommand(command.Command, BaseCommand): + + log = logging.getLogger(__name__ + '.DeleteCommand') + 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) + + def get_parser(self, prog_name): + parser = super(DeleteCommand, self).get_parser(prog_name) + parser.add_argument( + 'identifier', + metavar=self.metavar, + help=self.help_text + ) + return parser + + 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) + else: + _id = parsed_args.identifier + delete_method = getattr(self.app.client_manager.network, "delete_" + + self.func) + delete_method(_id) + print ('Deleted %(resource)s: %(id)s' % {'id': parsed_args.identifier, + 'resource': self.resource}) + return + + +class ListCommand(lister.Lister, BaseCommand): + + log = logging.getLogger(__name__ + '.ListCommand') + list_columns = [] + report_filter = {} + + def __init__(self, app, app_args): + super(ListCommand, self).__init__(app, app_args) + self.resources = getattr(self, 'resources', (self.resource + "s")) + + 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) + 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: + 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_list(_columns, item) for item in data)) + + +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.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): + parser = super(SetCommand, self).get_parser(prog_name) + parser.add_argument( + '--project', + dest='tenant_id', + help='the owner project id') + parser.add_argument( + 'identifier', + metavar=self.metavar, + help=self.help_text, + ) + return parser + + 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(parsed_args.identifier) + else: + _id = parsed_args.identifier + update_method = getattr(_client, "update_" + self.func) + update_method(str(_id), self.body) + print ('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.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) + + def get_parser(self, prog_name): + parser = super(ShowCommand, self).get_parser(prog_name) + parser.add_argument( + 'identifier', + metavar=self.metavar, + help=self.help_text + ) + return parser + + 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) + else: + _id = parsed_args.identifier + show_method = getattr(self.app.client_manager.network, + "show_" + self.func) + data = self.format_show(show_method(_id)[self.func]) + return zip(*sorted(six.iteritems(data))) + + +class AddCommand(command.Command, BaseCommand): + + log = logging.getLogger(__name__ + '.AddCommand') + container_name = "container_id" + container_help_text = "Identifier of container" + name = "id" + 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 + + 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 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openstackclient/network/v2_0/dhcp.py b/openstackclient/network/v2_0/dhcp.py new file mode 100644 index 0000000000..faaed3a9e4 --- /dev/null +++ b/openstackclient/network/v2_0/dhcp.py @@ -0,0 +1,58 @@ +# 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 common + + +class AddNetworkDhcpAgent(common.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(common.RemoveCommand): + """Remove network DHCP Agent""" + + 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(common.ListCommand): + """List DHCP agents on a network""" + + resource = 'dhcp_agent' + resources = 'dhcp_agent_hosting_networks' + list_columns = ['id', 'host', 'admin_state_up', 'alive'] + + 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/network/v2_0/floatingip.py b/openstackclient/network/v2_0/floatingip.py new file mode 100644 index 0000000000..c596dfab48 --- /dev/null +++ b/openstackclient/network/v2_0/floatingip.py @@ -0,0 +1,65 @@ +# 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""" + +from openstackclient.network import common + + +class CreateFloatingIp(common.CreateCommand): + """Create a floating IP""" + + resource = 'floatingip' + + 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( + 'floating_network_id', + 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""" + + resource = 'floatingip' + allow_names = False + help_text = "Identifier of floating IP to delete" + + +class ListFloatingIp(common.ListCommand): + """List floating IPs""" + + resource = 'floatingip' + list_columns = ['id', 'fixed_ip_address', 'floating_ip_address', 'port_id'] + + +class ShowFloatingIp(common.ShowCommand): + """Show floating IP details""" + + resource = "floatingip" + help_text = "Identitifer of floating IP to show" + allow_names = False diff --git a/openstackclient/network/v2_0/fw/__init__.py b/openstackclient/network/v2_0/fw/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openstackclient/network/v2_0/fw/firewall.py b/openstackclient/network/v2_0/fw/firewall.py new file mode 100644 index 0000000000..d48bea1f89 --- /dev/null +++ b/openstackclient/network/v2_0/fw/firewall.py @@ -0,0 +1,91 @@ +# 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 openstackclient.network import common + + +class CreateFirewall(common.CreateCommand): + """Create a firewall""" + + resource = 'firewall' + + 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 + + def get_body(self, parsed_args): + return {self.resource: {}} + + +class DeleteFirewall(common.DeleteCommand): + """Delete a firewall""" + + resource = 'firewall' + help_text = 'Name or ID of firewall to delete' + + +class ListFirewall(common.ListCommand): + """List firewall""" + + resource = 'firewall' + list_columns = ['id', 'name', 'firewall_policy_id'] + + +class SetFirewall(common.SetCommand): + """Set firewall values""" + + resource = 'firewall' + help_text = 'ID of firewall to set' + + +class ShowFirewall(common.ShowCommand): + """Show firewall details""" + + resource = 'firewall' diff --git a/openstackclient/network/v2_0/gateway.py b/openstackclient/network/v2_0/gateway.py new file mode 100644 index 0000000000..cee8806278 --- /dev/null +++ b/openstackclient/network/v2_0/gateway.py @@ -0,0 +1,76 @@ +# 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 common + + +class CreateGateway(common.CreateCommand): + """Create a gateway""" + + resource = 'gateway' + func = 'network_gateway' + + def get_parser(self, prog_name): + parser = super(CreateGateway, self).get_parser(prog_name) + parser.add_argument( + 'name', metavar='NAME', + help='Name of 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 + + def get_body(self, parsed_args): + return {self.func: {}} + + +class DeleteGateway(common.DeleteCommand): + """Delete a gateway""" + + resource = 'gateway' + resources = 'network_gateways' + func = 'network_gateway' + + +class ListGateway(common.ListCommand): + """List gateways""" + + resource = 'gateway' + resources = 'network_gateways' + list_columns = ['id', 'name'] + + +class SetGateway(common.SetCommand): + """Set gateway values""" + + resource = 'gateway' + resources = 'network_gateways' + func = 'network_gateway' + + +class ShowGateway(common.ShowCommand): + """Show gateway details""" + + resource = 'gateway' + resources = 'network_gateways' + func = 'network_gateway' + # show agents, show stats diff --git a/openstackclient/network/v2_0/lb/__init__.py b/openstackclient/network/v2_0/lb/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openstackclient/network/v2_0/lb/healthmonitor.py b/openstackclient/network/v2_0/lb/healthmonitor.py new file mode 100644 index 0000000000..df92d4938b --- /dev/null +++ b/openstackclient/network/v2_0/lb/healthmonitor.py @@ -0,0 +1,123 @@ +# 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 common + + +class CreateHealthMonitor(common.CreateCommand): + """Create a load balancer health monitor""" + + resource = 'health_monitor' + + 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 + + def get_body(self, parsed_args): + return { self.resource: { } } + + +class DeleteHealthMonitor(common.DeleteCommand): + """Delete a load balancer health monitor""" + + 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_monitor' + list_columns = ['id', 'type', 'admin_state_up'] + + +class SetHealthMonitor(common.SetCommand): + """Set load balancer health monitor values""" + + 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""" + + resource = 'health_monitor' + + +class AddPool(common.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(common.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/network/v2_0/lb/member.py b/openstackclient/network/v2_0/lb/member.py new file mode 100644 index 0000000000..225cafa98c --- /dev/null +++ b/openstackclient/network/v2_0/lb/member.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. +# + +"""Load Balancer member action implementations""" + +from openstackclient.network import common + + +class CreateMember(common.CreateCommand): + """Create a load balancer member""" + + resource = 'member' + + 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 + + def get_body(self, parsed_args): + return {self.resource: {}} + + +class DeleteMember(common.DeleteCommand): + """Delete a load balancer member""" + + resource = 'member' + help_text = 'Name or ID of load balancer member to delete' + + +class ListMember(common.ListCommand): + """List load balancer member""" + + resource = 'member' + list_columns = ['id', 'address', 'protocol_port', 'admin_state_up', + 'status'] + + +class SetMember(common.SetCommand): + """Set load balancer member values""" + + resource = 'member' + help_text = 'Name or ID of load balancer member to set' + + +class ShowMember(common.ShowCommand): + """Show load balancer member details""" + + resource = 'member' diff --git a/openstackclient/network/v2_0/lb/pool.py b/openstackclient/network/v2_0/lb/pool.py new file mode 100644 index 0000000000..07eb2b4cb1 --- /dev/null +++ b/openstackclient/network/v2_0/lb/pool.py @@ -0,0 +1,143 @@ +# 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 import agentscheduler +from neutronclient.neutron.v2_0.lb import pool as neu2 +from openstackclient.network import common + + +class CreatePool(common.CreateCommand): + """Create a load balancer pool""" + + resource = 'pool' + + 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 + + def get_body(self, parsed_args): + return { self.resource: { } } + + +class DeletePool(common.DeleteCommand): + """Delete a load balancer pool""" + + resource = 'pool' + help_text = 'Name or ID of load balancer pool to delete' + + +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) + 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: + #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): + """Set load balancer pool values""" + + resource = 'pool' + help_text = 'Name or ID of load balancer pool to set' + + +class ShowPool(common.ShowCommand): + """Show load balancer pool details""" + + resource = 'pool' + + 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/network/v2_0/lb/vip.py b/openstackclient/network/v2_0/lb/vip.py new file mode 100644 index 0000000000..db9506da42 --- /dev/null +++ b/openstackclient/network/v2_0/lb/vip.py @@ -0,0 +1,92 @@ +# 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 openstackclient.network import common + + +class CreateVip(common.CreateCommand): + """Create a load balancer VIP""" + + resource = 'vip' + + 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 + + def get_body(self, parsed_args): + return {self.resource: {}} + + +class DeleteVip(common.DeleteCommand): + """Delete a load balancer VIP""" + + resource = 'vip' + help_text = 'Name or ID of load balancer VIP to delete' + + +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): + """Set load balancer VIP values""" + + resource = 'vip' + help_text = 'Name or ID of load balancer VIP to set' + + +class ShowVip(common.ShowCommand): + """Show load balancer VIP details""" + + resource = 'vip' diff --git a/openstackclient/network/v2_0/network.py b/openstackclient/network/v2_0/network.py new file mode 100644 index 0000000000..34d29906c8 --- /dev/null +++ b/openstackclient/network/v2_0/network.py @@ -0,0 +1,182 @@ +# 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 openstackclient.network import common + + +class CreateNetwork(common.CreateCommand): + """Create a network""" + + resource = 'network' + + 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( + 'name', metavar='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""" + + resource = 'network' + + +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) + parser.add_argument( + '--external', + action='store_true', + default=False, + help='List external networks', + ) + parser.add_argument( + '--dhcp', + dest='dhcp_agent', + help='ID of the DHCP agent') + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % 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) + + +class SetNetwork(common.SetCommand): + """Set network values""" + + resource = 'network' + + +class ShowNetwork(common.ShowCommand): + """Show network details""" + + resource = 'network' + + +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( + '--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')) + 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(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): + """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( + '--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')) + 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(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/network/v2_0/port.py b/openstackclient/network/v2_0/port.py new file mode 100644 index 0000000000..84e852439a --- /dev/null +++ b/openstackclient/network/v2_0/port.py @@ -0,0 +1,179 @@ +# 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""" + +from neutronclient.neutron.v2_0 import floatingip +from neutronclient.neutron.v2_0 import port as neu2 +from openstackclient.network import common + + +class CreatePort(common.CreateCommand): + """Create a port""" + + resource = 'port' + + 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( + '--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( + '--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') + return parser + + def get_body(self, parsed_args): + return { self.resource: { } } + + +class DeletePort(common.DeleteCommand): + """Delete a port""" + + resource = 'port' + + +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) + 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) + #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): + """Set port values""" + + resource = 'port' + + 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.)') + return parser + + +class ShowPort(common.ShowCommand): + """Show port details""" + + resource = "port" + + +class AddPort(common.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(common.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 new file mode 100644 index 0000000000..f2ef4cf61d --- /dev/null +++ b/openstackclient/network/v2_0/router.py @@ -0,0 +1,191 @@ +# 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 agentscheduler +from neutronclient.neutron.v2_0 import router as neu2 +from openstackclient.network import common + + +class CreateRouter(common.CreateCommand): + """Create a router""" + + resource = 'router' + + 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 + + def get_body(self, parsed_args): + return { self.resource: { } } + + +class DeleteRouter(common.DeleteCommand): + """Delete a router""" + + resource = 'router' + + +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) + 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) + #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' + + def get_parser(self, prog_name): + parser = super(SetRouter, self).get_parser(prog_name) + parser.add_argument( + '--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( + '--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(common.ShowCommand): + """Show router details""" + + resource = 'router' + + +class AddInterfaceRouter(common.AddCommand): + """Add a port or subnet to a router""" + + clazz = neu2.AddInterfaceRouter + container_name = 'router_id' + container_metavar = '' + container_help_text = 'ID of router to add an interface to' + + +class RemoveInterfaceRouter(common.RemoveCommand): + """Remove a port or subnet from 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.' + + +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/network/v2_0/security_group.py b/openstackclient/network/v2_0/security_group.py new file mode 100644 index 0000000000..dca4b99697 --- /dev/null +++ b/openstackclient/network/v2_0/security_group.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. +# + +"""Security Group action implementations""" + +from openstackclient.network import common + + +class CreateSecurityGroup(common.CreateCommand): + """Create a security group""" + + resource = 'security_group' + + 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 + + def get_body(self, parsed_args): + return {self.resource: {}} + + +class DeleteSecurityGroup(common.DeleteCommand): + """Delete a security group""" + + resource = 'security_group' + + +class ListSecurityGroup(common.ListCommand): + """List security group""" + + resource = 'security_group' + list_columns = ['id', 'name', 'description'] + + +class SetSecurityGroup(common.SetCommand): + """Set security group values""" + + resource = 'security_group' + + 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(common.ShowCommand): + """Show security group details""" + + resource = 'security_group' 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..1a668a4133 --- /dev/null +++ b/openstackclient/network/v2_0/security_group_rule.py @@ -0,0 +1,101 @@ +# 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 openstackclient.network import common + + +class CreateSecurityGroupRule(common.CreateCommand): + """Create a security group rule""" + + resource = 'security_group_rule' + + 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 + + def get_body(self, parsed_args): + return {self.resource: {}} + + +class DeleteSecurityGroupRule(common.DeleteCommand): + """Delete a security group rule""" + + resource = 'security_group_rule' + allow_names = False + + +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) + 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(common.ShowCommand): + """Show security group rule details""" + + 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 new file mode 100644 index 0000000000..bdaa7d530a --- /dev/null +++ b/openstackclient/network/v2_0/subnet.py @@ -0,0 +1,125 @@ +# 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 openstackclient.network import common + + +class CreateSubnet(common.CreateCommand): + """Create a subnet""" + + resource = 'subnet' + + 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( + '--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-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='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', + 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 + + def get_body(self, parsed_args): + return {self.resource: {}} + + +class DeleteSubnet(common.DeleteCommand): + """Delete a subnet""" + + resource = 'subnet' + + +class ListSubnet(common.ListCommand): + """List subnet""" + + resource = 'subnet' + list_columns = ['id', 'name', 'cidr', 'allocation_pools'] + + +class SetSubnet(common.SetCommand): + """Set subnet values""" + + resource = 'subnet' + + +class ShowSubnet(common.ShowCommand): + """Show subnet details""" + + resource = 'subnet' diff --git a/openstackclient/network/v2_0/vpn/__init__.py b/openstackclient/network/v2_0/vpn/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openstackclient/network/v2_0/vpn/ikepolicy.py b/openstackclient/network/v2_0/vpn/ikepolicy.py new file mode 100644 index 0000000000..240c5db177 --- /dev/null +++ b/openstackclient/network/v2_0/vpn/ikepolicy.py @@ -0,0 +1,109 @@ +# 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 utils as vpn_utils +from openstackclient.network import common + + +class CreateIkepolicy(common.CreateCommand): + """Create a IKE policy""" + + resource = 'ikepolicy' + + 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 + + def get_body(self, parsed_args): + return {self.resource: {}} + + +class DeleteIkepolicy(common.DeleteCommand): + """Delete a IKE policy""" + + resource = 'ikepolicy' + resources = 'ikepolicies' + help_text = 'Name or ID of IKE policy to delete' + + +class ListIkepolicy(common.ListCommand): + """List 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""" + + resource = 'ikepolicy' + resources = 'ikepolicies' + 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(common.ShowCommand): + """Show IKE policy details""" + + resource = 'ikepolicy' + resources = 'ikepolicies' diff --git a/openstackclient/network/v2_0/vpn/ipsecpolicy.py b/openstackclient/network/v2_0/vpn/ipsecpolicy.py new file mode 100644 index 0000000000..27afd6b1af --- /dev/null +++ b/openstackclient/network/v2_0/vpn/ipsecpolicy.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. +# + +"""IPSec Policy action implementations""" + +from neutronclient.common import utils +from neutronclient.neutron.v2_0.vpn import utils as vpn_utils +from openstackclient.network import common + + +class CreateIpsecpolicy(common.CreateCommand): + """Create a IPSec policy""" + + resource = 'ipsecpolicy' + + 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 + + def get_body(self, parsed_args): + return {self.resource: {}} + + +class DeleteIpsecpolicy(common.DeleteCommand): + """Delete a IPSec policy""" + + resource = 'ipsecpolicy' + resources = 'ipsecpolicies' + help_text = 'Name or ID of IPSec policy to delete' + + +class ListIpsecpolicy(common.ListCommand): + """List IPSec policies""" + + resource = 'ipsecpolicie' + resources = 'ipsecpolicies' + list_columns = ['id', 'name', 'auth_algorithm', 'encryption_algorithm', + 'pfs'] + + +class SetIpsecpolicy(common.SetCommand): + """Set IPSec policy values""" + + resource = 'ipsecpolicy' + resources = 'ipsecpolicies' + 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(common.ShowCommand): + """Show IPSec policy details""" + + resource = 'ipsecpolicy' + resources = 'ipsecpolicies' diff --git a/openstackclient/network/v2_0/vpn/service.py b/openstackclient/network/v2_0/vpn/service.py new file mode 100644 index 0000000000..4d5d08e663 --- /dev/null +++ b/openstackclient/network/v2_0/vpn/service.py @@ -0,0 +1,74 @@ +# 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 openstackclient.network import common + + +class CreateService(common.CreateCommand): + """Create a VPN service""" + + resource = 'vpnservice' + + 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 + + def get_body(self, parsed_args): + return {self.resource: {}} + + +class DeleteService(common.DeleteCommand): + """Delete a VPN service""" + + resource = 'vpnservice' + help_text = 'Name or ID of VPN service to delete' + + +class ListService(common.ListCommand): + """List VPN service""" + + resource = 'vpnservice' + list_columns = ['id', 'name', 'router_id', 'status'] + + +class SetService(common.SetCommand): + """Set VPN service values""" + + resource = 'vpnservice' + help_text = 'Name or ID of VPN service to set' + + +class ShowService(common.ShowCommand): + """Show VPN service details""" + + resource = 'vpnservice' 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/fakes.py b/openstackclient/tests/fakes.py index 01214243b8..e68f0a271d 100644 --- a/openstackclient/tests/fakes.py +++ b/openstackclient/tests/fakes.py @@ -13,6 +13,7 @@ # under the License. # +import six import sys @@ -33,6 +34,9 @@ def make_string(self): result = result + line return result + def lines(self): + return ''.join(self.content).replace('\r', '') + class FakeApp(object): def __init__(self, _stdout): @@ -51,6 +55,7 @@ def __init__(self): self.image = None self.object = None self.volume = None + self.network = None self.auth_ref = None @@ -68,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): 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/network/__init__.py b/openstackclient/tests/network/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openstackclient/tests/network/common.py b/openstackclient/tests/network/common.py new file mode 100644 index 0000000000..b7cef5cdff --- /dev/null +++ b/openstackclient/tests/network/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/test_common.py b/openstackclient/tests/network/test_common.py new file mode 100644 index 0000000000..30a5ce5123 --- /dev/null +++ b/openstackclient/tests/network/test_common.py @@ -0,0 +1,48 @@ +# 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 + + +def format_subnet(value): + return ",".join(value) + + +class TestBaseCommand(test_common.TestNetworkBase): + class Shower(common.ShowCommand): + + resource = "testable" + matters = {"subnet": format_subnet} + + 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_show({"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', + 'subnet': 'one,two'}, result) diff --git a/openstackclient/tests/network/v2_0/__init__.py b/openstackclient/tests/network/v2_0/__init__.py new file mode 100644 index 0000000000..e69de29bb2 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..e69de29bb2 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..c7ba6f240c --- /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 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.identifier) + + +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.identifier) + + +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.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.identifier) + self.then_all_show_options(parsed) 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..e69de29bb2 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..5b8b00842c --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/test_healthmonitor.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.lb import healthmonitor +from openstackclient.tests.network 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): + 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) + 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.identifier) + + +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): + 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) + + +class TestSetLbHealthMonitor(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(healthmonitor.SetHealthMonitor, "noo") + self.assertEqual('noo', parsed.identifier) + + +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.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.identifier) + 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_member.py b/openstackclient/tests/network/v2_0/lb/test_member.py new file mode 100644 index 0000000000..8379c9270d --- /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 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): + 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) + 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.identifier) + + +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): + 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) + + +class TestSetLbMember(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(member.SetMember, "noo") + self.assertEqual('noo', parsed.identifier) + + +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.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.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 new file mode 100644 index 0000000000..97d74cc29d --- /dev/null +++ b/openstackclient/tests/network/v2_0/lb/test_pool.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.lb import pool +from openstackclient.tests.network 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): + 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) + 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.identifier) + + +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): + 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) + + +class TestSetLbPool(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(pool.SetPool, "noo") + self.assertEqual('noo', parsed.identifier) + + +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.identifier) + self.assertEqual(False, parsed.agent) + self.assertEqual(False, parsed.stats) + self.then_default_show_options(parsed) + + 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.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 new file mode 100644 index 0000000000..ef34ec0908 --- /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 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): + 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) + 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.identifier) + + +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): + 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) + + +class TestSetLbVip(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(vip.SetVip, "noo") + self.assertEqual('noo', parsed.identifier) + + +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.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.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 new file mode 100644 index 0000000000..8b5d4f1253 --- /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 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): + 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 new file mode 100644 index 0000000000..8590dc3fba --- /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 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): + 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) + 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.identifier) + + +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): + 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) + + +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.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.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 new file mode 100644 index 0000000000..9d2dbcc14f --- /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 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): + 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) + 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.identifier) + + +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): + 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) + + +class TestSetGateway(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(gateway.SetGateway, "noo") + self.assertEqual('noo', parsed.identifier) + + +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.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.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 new file mode 100644 index 0000000000..ec3b064f16 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_network.py @@ -0,0 +1,119 @@ +# 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 network +from openstackclient.tests.network import common + + +class TestCreateNetwork(common.TestNetworkBase): + def test_get_parser_nothing(self): + 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(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + 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) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeleteNetwork(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(network.DeleteNetwork, "noo") + self.assertEqual('noo', parsed.identifier) + + +class TestListNetwork(common.TestNetworkBase): + def test_get_parser_nothing(self): + 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(None, parsed.dhcp_agent) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + 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) + self.then_all_list_options(parsed) + + +class TestSetNetwork(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(network.SetNetwork, "noo") + self.assertEqual('noo', parsed.identifier) + + +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.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.identifier) + 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) + 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) + self.assertEqual('getty', parsed.gateway) + 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) + 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) + self.assertEqual('getty', parsed.gateway) + self.assertEqual('1', parsed.segmentation_type) + self.assertEqual('2', parsed.segmentation_id) 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..1249bf94f4 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_port.py @@ -0,0 +1,107 @@ +# 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 port +from openstackclient.tests.network import common + + +class TestCreatePort(common.TestNetworkBase): + def test_get_parser_nothing(self): + 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) + self.assertEqual(None, parsed.device_id) + self.assertEqual([], parsed.extra_dhcp_opts) + self.assertEqual(None, parsed.fixed_ip) + self.assertEqual(None, parsed.mac_address) + self.assertEqual('netty', parsed.network_id) + self.assertEqual(False, parsed.no_security_groups) + self.assertEqual([], parsed.security_groups) + self.assertEqual(None, parsed.tenant_id) + self.then_default_show_options(parsed) + + def test_get_parser_all(self): + 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) + self.assertEqual(['DO'], parsed.extra_dhcp_opts) + self.assertEqual(['FI'], parsed.fixed_ip) + self.assertEqual('MA', parsed.mac_address) + self.assertEqual('NI', parsed.network_id) + self.assertEqual(False, parsed.no_security_groups) + self.assertEqual(['ONE', 'TWO'], parsed.security_groups) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + +class TestDeletePort(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(port.DeletePort, "noo") + self.assertEqual('noo', parsed.identifier) + + +class TestListPort(common.TestNetworkBase): + def test_get_parser_nothing(self): + 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.then_default_list_options(parsed) + + def test_get_parser_all(self): + 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) + + +class TestSetPort(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(port.SetPort, "noo") + self.assertEqual('noo', parsed.identifier) + self.assertEqual([], parsed.extra_dhcp_opts) + self.assertEqual(False, parsed.no_security_groups) + self.assertEqual([], parsed.security_groups) + + 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.identifier) + self.assertEqual(['DO'], parsed.extra_dhcp_opts) + self.assertEqual(False, parsed.no_security_groups) + self.assertEqual(['ONE', 'TWO'], parsed.security_groups) + + +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.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.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 new file mode 100644 index 0000000000..b6af391f3a --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_router.py @@ -0,0 +1,109 @@ +# 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 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): + 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) + self.assertEqual('sneed', parsed.tenant_id) + self.then_all_show_options(parsed) + + def test_get_parser_all_enable(self): + 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) + 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.identifier) + + +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.assertEqual(None, parsed.l3_agent) + self.then_default_list_options(parsed) + + def test_get_parser_all(self): + 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) + + +class TestSetRouter(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(router.SetRouter, "noo") + self.assertEqual('noo', parsed.identifier) + 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): + given = 'too --disable-snat --no-gateway' + parsed = self.given_args(router.SetRouter, given) + self.assertEqual('too', parsed.identifier) + 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): + given = 'too --gateway way --enable-snat' + parsed = self.given_args(router.SetRouter, given) + self.assertEqual('too', parsed.identifier) + self.assertEqual('way', parsed.external_network_id) + self.assertEqual(False, parsed.no_gateway) + self.assertEqual(False, parsed.disable_snat) + + +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.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.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 new file mode 100644 index 0000000000..20f06941b0 --- /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 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): + 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) + 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.identifier) + + +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): + 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) + + +class TestSetSecurityGroup(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(security_group.SetSecurityGroup, "noo") + 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.identifier) + 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.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.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 new file mode 100644 index 0000000000..9a31c07004 --- /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 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): + 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, + given) + 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.identifier) + + +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): + given = "--long" + self.given_all_list_options() + parsed = self.given_args(security_group_rule.ListSecurityGroupRule, + given) + 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.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.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 new file mode 100644 index 0000000000..95cfc52e87 --- /dev/null +++ b/openstackclient/tests/network/v2_0/test_subnet.py @@ -0,0 +1,117 @@ +# 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 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): + 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) + 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[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): + 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']) + 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): + parsed = self.given_args(subnet.DeleteSubnet, "noo") + self.assertEqual('noo', parsed.identifier) + + +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): + 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) + + +class TestSetSubnet(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(subnet.SetSubnet, "noo") + self.assertEqual('noo', parsed.identifier) + + def test_get_parser_all(self): + given = 'too' + parsed = self.given_args(subnet.SetSubnet, given) + self.assertEqual('too', parsed.identifier) + + +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.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.identifier) + self.then_all_show_options(parsed) 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..e69de29bb2 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..1e0873785a --- /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 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): + 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) + 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.identifier) + + +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): + 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) + + +class TestSetIkepolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(ikepolicy.SetIkepolicy, "noo") + self.assertEqual('noo', parsed.identifier) + + +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.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.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 new file mode 100644 index 0000000000..256c3d43d6 --- /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 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): + 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) + 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.identifier) + + +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): + 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) + + +class TestSetIpsecpolicy(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(ipsecpolicy.SetIpsecpolicy, "noo") + self.assertEqual('noo', parsed.identifier) + + +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.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.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 new file mode 100644 index 0000000000..f1e85994bb --- /dev/null +++ b/openstackclient/tests/network/v2_0/vpn/test_service.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.vpn import service +from openstackclient.tests.network import common + + +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) + 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): + 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) + self.assertEqual(False, parsed.admin_state) + 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.identifier) + + +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): + 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) + + +class TestSetService(common.TestNetworkBase): + def test_get_parser_nothing(self): + parsed = self.given_args(service.SetService, "noo") + self.assertEqual('noo', parsed.identifier) + + +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.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.identifier) + self.then_all_show_options(parsed) diff --git a/openstackclient/tests/test_shell.py b/openstackclient/tests/test_shell.py index 9253f701fe..2ee8503a97 100644 --- a/openstackclient/tests/test_shell.py +++ b/openstackclient/tests/test_shell.py @@ -39,11 +39,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(): @@ -128,6 +130,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): @@ -455,6 +459,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() @@ -475,7 +480,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) @@ -486,6 +492,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/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/requirements.txt b/requirements.txt index 6f9742edf0..79ba6d8431 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,8 +3,9 @@ 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 requests>=1.1 six>=1.4.1 diff --git a/setup.cfg b/setup.cfg index 434b7f70a3..6dc2159463 100644 --- a/setup.cfg +++ b/setup.cfg @@ -33,6 +33,7 @@ openstack.cli.extension = image = openstackclient.image.client object_store = openstackclient.object.client volume = openstackclient.volume.client + network = openstackclient.network.client openstack.common = limits_show = openstackclient.common.limits:ShowLimits @@ -73,11 +74,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.compute.v2.floatingip:CreateFloatingIP - ip_floating_delete = openstackclient.compute.v2.floatingip:DeleteFloatingIP - ip_floating_list = openstackclient.compute.v2.floatingip:ListFloatingIP - ip_floating_remove = openstackclient.compute.v2.floatingip:RemoveFloatingIP + 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_pool_list = openstackclient.compute.v2.floatingippool:ListFloatingIPPool @@ -88,15 +88,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 - server_add_security_group = openstackclient.compute.v2.server:AddServerSecurityGroup server_add_volume = openstackclient.compute.v2.server:AddServerVolume server_create = openstackclient.compute.v2.server:CreateServer @@ -281,6 +272,88 @@ 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_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 + 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 + 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_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 = 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 + 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 + 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 = 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 + 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 + router_set = openstackclient.network.v2_0.router:SetRouter + router_show = openstackclient.network.v2_0.router:ShowRouter + 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 + security_group_set = openstackclient.network.v2_0.security_group:SetSecurityGroup + security_group_show = openstackclient.network.v2_0.security_group:ShowSecurityGroup + 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_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 + 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 + 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 + 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 build-dir = doc/build 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}'