summaryrefslogtreecommitdiff
path: root/openstackclient/network
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/network')
-rw-r--r--openstackclient/network/common.py62
-rw-r--r--openstackclient/network/v2/network.py65
-rw-r--r--openstackclient/network/v2/port.py56
-rw-r--r--openstackclient/network/v2/router.py19
-rw-r--r--openstackclient/network/v2/security_group.py40
5 files changed, 211 insertions, 31 deletions
diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py
new file mode 100644
index 00000000..c539dd05
--- /dev/null
+++ b/openstackclient/network/common.py
@@ -0,0 +1,62 @@
+# 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 abc
+import six
+
+from openstackclient.common import command
+
+
+@six.add_metaclass(abc.ABCMeta)
+class NetworkAndComputeCommand(command.Command):
+ """Network and Compute Command"""
+
+ def take_action(self, parsed_args):
+ if self.app.client_manager.is_network_endpoint_enabled():
+ return self.take_action_network(self.app.client_manager.network,
+ parsed_args)
+ else:
+ return self.take_action_compute(self.app.client_manager.compute,
+ parsed_args)
+
+ def get_parser(self, prog_name):
+ self.log.debug('get_parser(%s)', prog_name)
+ parser = super(NetworkAndComputeCommand, self).get_parser(prog_name)
+ parser = self.update_parser_common(parser)
+ self.log.debug('common parser: %s', parser)
+ if self.app.client_manager.is_network_endpoint_enabled():
+ return self.update_parser_network(parser)
+ else:
+ return self.update_parser_compute(parser)
+
+ def update_parser_common(self, parser):
+ """Default is no updates to parser."""
+ return parser
+
+ def update_parser_network(self, parser):
+ """Default is no updates to parser."""
+ return parser
+
+ def update_parser_compute(self, parser):
+ """Default is no updates to parser."""
+ return parser
+
+ @abc.abstractmethod
+ def take_action_network(self, client, parsed_args):
+ """Override to do something useful."""
+ pass
+
+ @abc.abstractmethod
+ def take_action_compute(self, client, parsed_args):
+ """Override to do something useful."""
+ pass
diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py
index fc94fd82..61237219 100644
--- a/openstackclient/network/v2/network.py
+++ b/openstackclient/network/v2/network.py
@@ -47,6 +47,33 @@ def _get_columns(item):
return tuple(sorted(columns))
+def _get_attrs(client_manager, parsed_args):
+ attrs = {}
+ if parsed_args.name is not None:
+ attrs['name'] = str(parsed_args.name)
+ if parsed_args.admin_state is not None:
+ attrs['admin_state_up'] = parsed_args.admin_state
+ if parsed_args.shared is not None:
+ attrs['shared'] = parsed_args.shared
+
+ # "network set" command doesn't support setting project.
+ if 'project' in parsed_args and parsed_args.project is not None:
+ identity_client = client_manager.identity
+ project_id = identity_common.find_project(
+ identity_client,
+ parsed_args.project,
+ parsed_args.project_domain,
+ ).id
+ attrs['tenant_id'] = project_id
+
+ # "network set" command doesn't support setting availability zone hints.
+ if 'availability_zone_hints' in parsed_args and \
+ parsed_args.availability_zone_hints is not None:
+ attrs['availability_zone_hints'] = parsed_args.availability_zone_hints
+
+ return attrs
+
+
class CreateNetwork(command.ShowOne):
"""Create new network"""
@@ -105,31 +132,14 @@ class CreateNetwork(command.ShowOne):
def take_action(self, parsed_args):
client = self.app.client_manager.network
- body = self.get_body(parsed_args)
- obj = client.create_network(**body)
+
+ attrs = _get_attrs(self.app.client_manager, parsed_args)
+ obj = client.create_network(**attrs)
columns = _get_columns(obj)
+
data = utils.get_item_properties(obj, columns, formatters=_formatters)
return (columns, data)
- def get_body(self, parsed_args):
- body = {'name': str(parsed_args.name),
- 'admin_state_up': parsed_args.admin_state}
- if parsed_args.shared is not None:
- body['shared'] = parsed_args.shared
- if parsed_args.project is not None:
- identity_client = self.app.client_manager.identity
- project_id = identity_common.find_project(
- identity_client,
- parsed_args.project,
- parsed_args.project_domain,
- ).id
- body['tenant_id'] = project_id
- if parsed_args.availability_zone_hints is not None:
- body['availability_zone_hints'] = \
- parsed_args.availability_zone_hints
-
- return body
-
class DeleteNetwork(command.Command):
"""Delete network(s)"""
@@ -271,18 +281,13 @@ class SetNetwork(command.Command):
client = self.app.client_manager.network
obj = client.find_network(parsed_args.identifier, ignore_missing=False)
- if parsed_args.name is not None:
- obj.name = str(parsed_args.name)
- if parsed_args.admin_state is not None:
- obj.admin_state_up = parsed_args.admin_state
- if parsed_args.shared is not None:
- obj.shared = parsed_args.shared
-
- if not obj.is_dirty:
+ attrs = _get_attrs(self.app.client_manager, parsed_args)
+ if attrs == {}:
msg = "Nothing specified to be set"
raise exceptions.CommandError(msg)
- client.update_network(obj)
+ client.update_network(obj, **attrs)
+ return
class ShowNetwork(command.ShowOne):
diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py
index 0d5b183e..46cb031f 100644
--- a/openstackclient/network/v2/port.py
+++ b/openstackclient/network/v2/port.py
@@ -14,6 +14,42 @@
"""Port action implementations"""
from openstackclient.common import command
+from openstackclient.common import utils
+
+
+def _format_admin_state(state):
+ return 'UP' if state else 'DOWN'
+
+
+_formatters = {
+ 'admin_state_up': _format_admin_state,
+ 'allowed_address_pairs': utils.format_list_of_dicts,
+ 'binding_profile': utils.format_dict,
+ 'binding_vif_details': utils.format_dict,
+ 'dns_assignment': utils.format_list_of_dicts,
+ 'extra_dhcp_opts': utils.format_list_of_dicts,
+ 'fixed_ips': utils.format_list_of_dicts,
+ 'security_groups': utils.format_list,
+}
+
+
+def _get_columns(item):
+ columns = item.keys()
+ if 'tenant_id' in columns:
+ columns.remove('tenant_id')
+ columns.append('project_id')
+ binding_columns = [
+ 'binding:host_id',
+ 'binding:profile',
+ 'binding:vif_details',
+ 'binding:vif_type',
+ 'binding:vnic_type',
+ ]
+ for binding_column in binding_columns:
+ if binding_column in columns:
+ columns.remove(binding_column)
+ columns.append(binding_column.replace('binding:', 'binding_', 1))
+ return sorted(columns)
class DeletePort(command.Command):
@@ -35,3 +71,23 @@ class DeletePort(command.Command):
for port in parsed_args.port:
res = client.find_port(port)
client.delete_port(res)
+
+
+class ShowPort(command.ShowOne):
+ """Display port details"""
+
+ def get_parser(self, prog_name):
+ parser = super(ShowPort, self).get_parser(prog_name)
+ parser.add_argument(
+ 'port',
+ metavar="<port>",
+ help="Port to display (name or ID)"
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ obj = client.find_port(parsed_args.port, ignore_missing=False)
+ columns = _get_columns(obj)
+ data = utils.get_item_properties(obj, columns, formatters=_formatters)
+ return (tuple(columns), data)
diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py
index 6c8acb63..60db816a 100644
--- a/openstackclient/network/v2/router.py
+++ b/openstackclient/network/v2/router.py
@@ -35,6 +35,8 @@ def _format_external_gateway_info(info):
_formatters = {
'admin_state_up': _format_admin_state,
'external_gateway_info': _format_external_gateway_info,
+ 'availability_zones': utils.format_list,
+ 'availability_zone_hints': utils.format_list,
}
@@ -46,6 +48,9 @@ def _get_attrs(client_manager, parsed_args):
attrs['admin_state_up'] = parsed_args.admin_state_up
if parsed_args.distributed is not None:
attrs['distributed'] = parsed_args.distributed
+ if ('availability_zone_hints' in parsed_args
+ and parsed_args.availability_zone_hints is not None):
+ attrs['availability_zone_hints'] = parsed_args.availability_zone_hints
# "router set" command doesn't support setting project.
if 'project' in parsed_args and parsed_args.project is not None:
identity_client = client_manager.identity
@@ -96,9 +101,19 @@ class CreateRouter(command.ShowOne):
)
parser.add_argument(
'--project',
- metavar='<poroject>',
+ metavar='<project>',
help="Owner's project (name or ID)",
)
+ parser.add_argument(
+ '--availability-zone-hint',
+ metavar='<availability-zone>',
+ action='append',
+ dest='availability_zone_hints',
+ help='Availability Zone in which to create this router '
+ '(requires the Router Availability Zone extension, '
+ 'this option can be repeated).',
+ )
+
identity_common.add_project_domain_option_to_parser(parser)
return parser
@@ -176,10 +191,12 @@ class ListRouter(command.Lister):
columns = columns + (
'routes',
'external_gateway_info',
+ 'availability_zones'
)
column_headers = column_headers + (
'Routes',
'External gateway info',
+ 'Availability zones'
)
data = client.routers()
diff --git a/openstackclient/network/v2/security_group.py b/openstackclient/network/v2/security_group.py
new file mode 100644
index 00000000..4e122f21
--- /dev/null
+++ b/openstackclient/network/v2/security_group.py
@@ -0,0 +1,40 @@
+# 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.common import utils
+from openstackclient.network import common
+
+
+class DeleteSecurityGroup(common.NetworkAndComputeCommand):
+ """Delete a security group"""
+
+ def update_parser_common(self, parser):
+ parser.add_argument(
+ 'group',
+ metavar='<group>',
+ help='Security group to delete (name or ID)',
+ )
+ return parser
+
+ def take_action_network(self, client, parsed_args):
+ obj = client.find_security_group(parsed_args.group)
+ client.delete_security_group(obj)
+
+ def take_action_compute(self, client, parsed_args):
+ data = utils.find_resource(
+ client.security_groups,
+ parsed_args.group,
+ )
+ client.security_groups.delete(data.id)