summaryrefslogtreecommitdiff
path: root/openstackclient/network
diff options
context:
space:
mode:
authorAnkur Gupta <ankur.gupta@intel.com>2016-10-12 22:39:35 -0500
committerAkihiro Motoki <amotoki@gmail.com>2017-07-11 08:17:09 +0000
commit18c532377a2f6d87adef80465fea7ed50d5a17d1 (patch)
treebb153cbaf3a07fff1bfc9bc5437ea0cb9d87a694 /openstackclient/network
parentfaf6e16120206de763c1570698f71114307dab98 (diff)
downloadpython-openstackclient-18c532377a2f6d87adef80465fea7ed50d5a17d1.tar.gz
Network L3 Router Commands for OSC
Implements: blueprint network-l3-commands Co-Authored-By: Akihiro Motoki <amotoki@gmail.com> Change-Id: Ia24d76227e164062e89a74c1621b8acb830b26cf
Diffstat (limited to 'openstackclient/network')
-rw-r--r--openstackclient/network/v2/network_agent.py121
-rw-r--r--openstackclient/network/v2/router.py32
2 files changed, 127 insertions, 26 deletions
diff --git a/openstackclient/network/v2/network_agent.py b/openstackclient/network/v2/network_agent.py
index 1334f77e..ed4970a4 100644
--- a/openstackclient/network/v2/network_agent.py
+++ b/openstackclient/network/v2/network_agent.py
@@ -26,10 +26,16 @@ from openstackclient.network import sdk_utils
LOG = logging.getLogger(__name__)
+def _format_alive(alive):
+ return ":-)" if alive else "XXX"
+
+
def _format_admin_state(state):
return 'UP' if state else 'DOWN'
_formatters = {
+ 'is_alive': _format_alive,
+ 'alive': _format_alive,
'admin_state_up': _format_admin_state,
'is_admin_state_up': _format_admin_state,
'configurations': utils.format_dict,
@@ -60,7 +66,7 @@ class AddNetworkToAgent(command.Command):
parser.add_argument(
'network',
metavar='<network>',
- help=_('Network to be added to an agent (ID or name)'))
+ help=_('Network to be added to an agent (name or ID)'))
return parser
@@ -78,6 +84,37 @@ class AddNetworkToAgent(command.Command):
exceptions.CommandError(msg)
+class AddRouterToAgent(command.Command):
+ _description = _("Add router to an agent")
+
+ def get_parser(self, prog_name):
+ parser = super(AddRouterToAgent, self).get_parser(prog_name)
+ parser.add_argument(
+ '--l3',
+ action='store_true',
+ help=_('Add router to an L3 agent')
+ )
+ parser.add_argument(
+ 'agent_id',
+ metavar='<agent-id>',
+ help=_("Agent to which a router is added (ID only)")
+ )
+ parser.add_argument(
+ 'router',
+ metavar='<router>',
+ help=_("Router to be added to an agent (name or ID)")
+ )
+
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ agent = client.get_agent(parsed_args.agent_id)
+ router = client.find_router(parsed_args.router, ignore_missing=False)
+ if parsed_args.l3:
+ client.add_router_to_agent(agent, router)
+
+
class DeleteNetworkAgent(command.Command):
_description = _("Delete network agent(s)")
@@ -135,11 +172,24 @@ class ListNetworkAgent(command.Lister):
metavar='<host>',
help=_("List only agents running on the specified host")
)
- parser.add_argument(
+ agent_type_group = parser.add_mutually_exclusive_group()
+ agent_type_group.add_argument(
'--network',
metavar='<network>',
help=_('List agents hosting a network (name or ID)')
)
+ agent_type_group.add_argument(
+ '--router',
+ metavar='<router>',
+ help=_('List agents hosting this router (name or ID)')
+ )
+ parser.add_argument(
+ '--long',
+ action='store_true',
+ default=False,
+ help=_("List additional fields in output")
+ )
+
return parser
def take_action(self, parsed_args):
@@ -178,28 +228,18 @@ class ListNetworkAgent(command.Lister):
}
filters = {}
+
if parsed_args.network is not None:
- columns = (
- 'id',
- 'host',
- 'is_admin_state_up',
- 'is_alive',
- )
- column_headers = (
- 'ID',
- 'Host',
- 'Admin State Up',
- 'Alive',
- )
network = client.find_network(
parsed_args.network, ignore_missing=False)
data = client.network_hosting_dhcp_agents(network)
-
- return (column_headers,
- (utils.get_item_properties(
- s, columns,
- formatters=_formatters,
- ) for s in data))
+ elif parsed_args.router is not None:
+ if parsed_args.long:
+ columns += ('ha_state',)
+ column_headers += ('HA State',)
+ router = client.find_router(parsed_args.router,
+ ignore_missing=False)
+ data = client.routers_hosting_l3_agents(router)
else:
if parsed_args.agent_type is not None:
filters['agent_type'] = key_value[parsed_args.agent_type]
@@ -207,10 +247,10 @@ class ListNetworkAgent(command.Lister):
filters['host'] = parsed_args.host
data = client.agents(**filters)
- return (column_headers,
- (utils.get_item_properties(
- s, columns, formatters=_formatters,
- ) for s in data))
+ return (column_headers,
+ (utils.get_item_properties(
+ s, columns, formatters=_formatters,
+ ) for s in data))
class RemoveNetworkFromAgent(command.Command):
@@ -229,7 +269,7 @@ class RemoveNetworkFromAgent(command.Command):
parser.add_argument(
'network',
metavar='<network>',
- help=_('Network to be removed from an agent (ID or name)'))
+ help=_('Network to be removed from an agent (name or ID)'))
return parser
def take_action(self, parsed_args):
@@ -246,6 +286,37 @@ class RemoveNetworkFromAgent(command.Command):
exceptions.CommandError(msg)
+class RemoveRouterFromAgent(command.Command):
+ _description = _("Remove router from an agent")
+
+ def get_parser(self, prog_name):
+ parser = super(RemoveRouterFromAgent, self).get_parser(prog_name)
+ parser.add_argument(
+ '--l3',
+ action='store_true',
+ help=_('Remove router from an L3 agent')
+ )
+ parser.add_argument(
+ 'agent_id',
+ metavar='<agent-id>',
+ help=_("Agent from which router will be removed (ID only)")
+ )
+ parser.add_argument(
+ 'router',
+ metavar='<router>',
+ help=_("Router to be removed from an agent (name or ID)")
+ )
+
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ agent = client.get_agent(parsed_args.agent_id)
+ router = client.find_router(parsed_args.router, ignore_missing=False)
+ if parsed_args.l3:
+ client.remove_router_from_agent(agent, router)
+
+
# TODO(huanxuan): Use the SDK resource mapped attribute names once the
# OSC minimum requirements include SDK 1.0.
class SetNetworkAgent(command.Command):
diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py
index 0da91baa..8db0c439 100644
--- a/openstackclient/network/v2/router.py
+++ b/openstackclient/network/v2/router.py
@@ -305,11 +305,18 @@ class ListRouter(command.Lister):
help=_("List routers according to their project (name or ID)")
)
identity_common.add_project_domain_option_to_parser(parser)
+ parser.add_argument(
+ '--agent',
+ metavar='<agent-id>',
+ help=_("List routers hosted by an agent (ID only)")
+ )
+
return parser
def take_action(self, parsed_args):
identity_client = self.app.client_manager.identity
client = self.app.client_manager.network
+
columns = (
'id',
'name',
@@ -349,6 +356,16 @@ class ListRouter(command.Lister):
).id
args['tenant_id'] = project_id
args['project_id'] = project_id
+
+ if parsed_args.agent is not None:
+ agent = client.get_agent(parsed_args.agent)
+ data = client.agent_hosted_routers(agent)
+ # NOTE: Networking API does not support filtering by parameters,
+ # so we need filtering in the client side.
+ data = [d for d in data if self._filter_match(d, args)]
+ else:
+ data = client.routers(**args)
+
if parsed_args.long:
columns = columns + (
'routes',
@@ -368,13 +385,26 @@ class ListRouter(command.Lister):
'Availability zones',
)
- data = client.routers(**args)
return (column_headers,
(utils.get_item_properties(
s, columns,
formatters=_formatters,
) for s in data))
+ @staticmethod
+ def _filter_match(data, conditions):
+ for key, value in conditions.items():
+ try:
+ if getattr(data, key) != value:
+ return False
+ except AttributeError:
+ # Some filter attributes like tenant_id or admin_state_up
+ # are backward compatibility in older OpenStack SDK support.
+ # They does not exist in the latest release.
+ # In this case we just skip checking such filter condition.
+ continue
+ return True
+
class RemovePortFromRouter(command.Command):
_description = _("Remove a port from a router")