summaryrefslogtreecommitdiff
path: root/quantumclient
diff options
context:
space:
mode:
Diffstat (limited to 'quantumclient')
-rw-r--r--quantumclient/quantum/v2_0/__init__.py17
-rw-r--r--quantumclient/quantum/v2_0/agentscheduler.py233
-rw-r--r--quantumclient/shell.py21
-rw-r--r--quantumclient/v2_0/client.py68
4 files changed, 334 insertions, 5 deletions
diff --git a/quantumclient/quantum/v2_0/__init__.py b/quantumclient/quantum/v2_0/__init__.py
index cba5ca1..cbf87b0 100644
--- a/quantumclient/quantum/v2_0/__init__.py
+++ b/quantumclient/quantum/v2_0/__init__.py
@@ -408,16 +408,21 @@ class ListCommand(QuantumCommand, lister.Lister):
api = 'network'
resource = None
log = None
- _formatters = None
+ _formatters = {}
list_columns = []
+ unknown_parts_flag = True
def get_parser(self, prog_name):
parser = super(ListCommand, self).get_parser(prog_name)
add_show_list_common_argument(parser)
+ if self.unknown_parts_flag:
+ add_extra_argument(parser, 'filter_specs', 'filters options')
return parser
def args2search_opts(self, parsed_args):
search_opts = {}
+ if self.unknown_parts_flag:
+ search_opts = parse_args_to_dict(parsed_args.filter_specs)
fields = parsed_args.fields
if parsed_args.fields:
search_opts.update({'fields': fields})
@@ -425,6 +430,12 @@ class ListCommand(QuantumCommand, lister.Lister):
search_opts.update({'verbose': 'True'})
return search_opts
+ def call_server(self, quantum_client, search_opts, parsed_args):
+ obj_lister = getattr(quantum_client,
+ "list_%ss" % self.resource)
+ data = obj_lister(**search_opts)
+ return data
+
def retrieve_list(self, parsed_args):
"""Retrieve a list of resources from Quantum server"""
quantum_client = self.get_client()
@@ -434,9 +445,7 @@ class ListCommand(QuantumCommand, lister.Lister):
self.values_specs)
search_opts = self.args2search_opts(parsed_args)
search_opts.update(_extra_values)
- obj_lister = getattr(quantum_client,
- "list_%ss" % self.resource)
- data = obj_lister(**search_opts)
+ data = self.call_server(quantum_client, search_opts, parsed_args)
collection = self.resource + "s"
return data.get(collection, [])
diff --git a/quantumclient/quantum/v2_0/agentscheduler.py b/quantumclient/quantum/v2_0/agentscheduler.py
new file mode 100644
index 0000000..3e8e8e2
--- /dev/null
+++ b/quantumclient/quantum/v2_0/agentscheduler.py
@@ -0,0 +1,233 @@
+# Copyright 2013 OpenStack LLC.
+# All Rights Reserved
+#
+# 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.
+#
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import logging
+
+from quantumclient.quantum import v2_0 as quantumV20
+from quantumclient.quantum.v2_0 import network
+from quantumclient.quantum.v2_0 import router
+PERFECT_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f"
+
+
+class AddNetworkToDhcpAgent(quantumV20.QuantumCommand):
+ """Add a network to a DHCP agent."""
+
+ log = logging.getLogger(__name__ + '.AddNetworkToDhcpAgent')
+
+ def get_parser(self, prog_name):
+ parser = super(AddNetworkToDhcpAgent, self).get_parser(prog_name)
+ parser.add_argument(
+ 'dhcp_agent',
+ help='ID of the DHCP agent')
+ parser.add_argument(
+ 'network',
+ help='network to add')
+ return parser
+
+ def run(self, parsed_args):
+ self.log.debug('run(%s)' % parsed_args)
+ quantum_client = self.get_client()
+ quantum_client.format = parsed_args.request_format
+ _net_id = quantumV20.find_resourceid_by_name_or_id(
+ quantum_client, 'network', parsed_args.network)
+ quantum_client.add_network_to_dhcp_agent(parsed_args.dhcp_agent,
+ {'network_id': _net_id})
+ print >>self.app.stdout, (
+ _('Added network %s to DHCP agent') % parsed_args.network)
+
+
+class RemoveNetworkFromDhcpAgent(quantumV20.QuantumCommand):
+ """Remove a network from a DHCP agent."""
+ log = logging.getLogger(__name__ + '.RemoveNetworkFromDhcpAgent')
+
+ def get_parser(self, prog_name):
+ parser = super(RemoveNetworkFromDhcpAgent, self).get_parser(prog_name)
+ parser.add_argument(
+ 'dhcp_agent',
+ help='ID of the DHCP agent')
+ parser.add_argument(
+ 'network',
+ help='network to remove')
+ return parser
+
+ def run(self, parsed_args):
+ self.log.debug('run(%s)' % parsed_args)
+ quantum_client = self.get_client()
+ quantum_client.format = parsed_args.request_format
+ _net_id = quantumV20.find_resourceid_by_name_or_id(
+ quantum_client, 'network', parsed_args.network)
+ quantum_client.remove_network_from_dhcp_agent(
+ parsed_args.dhcp_agent, _net_id)
+ print >>self.app.stdout, (
+ _('Removed network %s to DHCP agent') % parsed_args.network)
+
+
+class ListNetworksOnDhcpAgent(network.ListNetwork):
+ """List the networks on a DHCP agent."""
+
+ log = logging.getLogger(__name__ + '.ListNetworksOnDhcpAgent')
+ unknown_parts_flag = False
+
+ def get_parser(self, prog_name):
+ parser = super(ListNetworksOnDhcpAgent,
+ self).get_parser(prog_name)
+ parser.add_argument(
+ 'dhcp_agent',
+ help='ID of the DHCP agent')
+ return parser
+
+ def call_server(self, quantum_client, search_opts, parsed_args):
+ data = quantum_client.list_networks_on_dhcp_agent(
+ parsed_args.dhcp_agent, **search_opts)
+ return data
+
+
+class ListDhcpAgentsHostingNetwork(quantumV20.ListCommand):
+ """List DHCP agents hosting a network."""
+
+ resource = 'agent'
+ _formatters = {}
+ log = logging.getLogger(__name__ + '.ListDhcpAgentsHostingNetwork')
+ list_columns = ['id', 'host', 'admin_state_up', 'alive']
+ unknown_parts_flag = False
+
+ def get_parser(self, prog_name):
+ parser = super(ListDhcpAgentsHostingNetwork,
+ self).get_parser(prog_name)
+ parser.add_argument(
+ 'network',
+ help='network to query')
+ return parser
+
+ def extend_list(self, data, parsed_args):
+ for agent in data:
+ agent['alive'] = ":-)" if agent['alive'] else 'xxx'
+
+ def call_server(self, quantum_client, search_opts, parsed_args):
+ _id = quantumV20.find_resourceid_by_name_or_id(quantum_client,
+ 'network',
+ parsed_args.network)
+ search_opts['network'] = _id
+ data = quantum_client.list_dhcp_agent_hosting_networks(**search_opts)
+ return data
+
+
+class AddRouterToL3Agent(quantumV20.QuantumCommand):
+ """Add a router to a L3 agent."""
+
+ log = logging.getLogger(__name__ + '.AddRouterToL3Agent')
+
+ def get_parser(self, prog_name):
+ parser = super(AddRouterToL3Agent, self).get_parser(prog_name)
+ parser.add_argument(
+ 'l3_agent',
+ help='ID of the L3 agent')
+ parser.add_argument(
+ 'router',
+ help='router to add')
+ return parser
+
+ def run(self, parsed_args):
+ self.log.debug('run(%s)' % parsed_args)
+ quantum_client = self.get_client()
+ quantum_client.format = parsed_args.request_format
+ _id = quantumV20.find_resourceid_by_name_or_id(
+ quantum_client, 'router', parsed_args.router)
+ quantum_client.add_router_to_l3_agent(parsed_args.l3_agent,
+ {'router_id': _id})
+ print >>self.app.stdout, (
+ _('Added router %s to L3 agent') % parsed_args.router)
+
+
+class RemoveRouterFromL3Agent(quantumV20.QuantumCommand):
+ """Remove a router from a L3 agent."""
+
+ log = logging.getLogger(__name__ + '.RemoveRouterFromL3Agent')
+
+ def get_parser(self, prog_name):
+ parser = super(RemoveRouterFromL3Agent, self).get_parser(prog_name)
+ parser.add_argument(
+ 'l3_agent',
+ help='ID of the L3 agent')
+ parser.add_argument(
+ 'router',
+ help='router to remove')
+ return parser
+
+ def run(self, parsed_args):
+ self.log.debug('run(%s)' % parsed_args)
+ quantum_client = self.get_client()
+ quantum_client.format = parsed_args.request_format
+ _id = quantumV20.find_resourceid_by_name_or_id(
+ quantum_client, 'router', parsed_args.router)
+ quantum_client.remove_router_from_l3_agent(
+ parsed_args.l3_agent, _id)
+ print >>self.app.stdout, (
+ _('Removed Router %s to L3 agent') % parsed_args.router)
+
+
+class ListRoutersOnL3Agent(quantumV20.ListCommand):
+ """List the routers on a L3 agent."""
+
+ log = logging.getLogger(__name__ + '.ListRoutersOnL3Agent')
+ _formatters = {'external_gateway_info':
+ router._format_external_gateway_info}
+ list_columns = ['id', 'name', 'external_gateway_info']
+ resource = 'router'
+ unknown_parts_flag = False
+
+ def get_parser(self, prog_name):
+ parser = super(ListRoutersOnL3Agent,
+ self).get_parser(prog_name)
+ parser.add_argument(
+ 'l3_agent',
+ help='ID of the L3 agent to query')
+ return parser
+
+ def call_server(self, quantum_client, search_opts, parsed_args):
+ data = quantum_client.list_routers_on_l3_agent(
+ parsed_args.l3_agent, **search_opts)
+ return data
+
+
+class ListL3AgentsHostingRouter(quantumV20.ListCommand):
+ """List L3 agents hosting a router."""
+
+ resource = 'agent'
+ _formatters = {}
+ log = logging.getLogger(__name__ + '.ListL3AgentsHostingRouter')
+ list_columns = ['id', 'host', 'admin_state_up', 'alive', 'default']
+ unknown_parts_flag = False
+
+ def get_parser(self, prog_name):
+ parser = super(ListL3AgentsHostingRouter,
+ self).get_parser(prog_name)
+ parser.add_argument('router',
+ help='router to query')
+ return parser
+
+ def extend_list(self, data, parsed_args):
+ for agent in data:
+ agent['alive'] = ":-)" if agent['alive'] else 'xxx'
+
+ def call_server(self, quantum_client, search_opts, parsed_args):
+ _id = quantumV20.find_resourceid_by_name_or_id(quantum_client,
+ 'router',
+ parsed_args.router)
+ search_opts['router'] = _id
+ data = quantum_client.list_l3_agent_hosting_routers(**search_opts)
+ return data
diff --git a/quantumclient/shell.py b/quantumclient/shell.py
index feb6941..b12e00e 100644
--- a/quantumclient/shell.py
+++ b/quantumclient/shell.py
@@ -234,7 +234,26 @@ COMMAND_V2 = {
'quantumclient.quantum.v2_0.nvpnetworkgateway.ConnectNetworkGateway'),
'net-gateway-disconnect': utils.import_class(
'quantumclient.quantum.v2_0.nvpnetworkgateway.'
- 'DisconnectNetworkGateway')
+ 'DisconnectNetworkGateway'),
+ 'dhcp-agent-network-add': utils.import_class(
+ 'quantumclient.quantum.v2_0.agentscheduler.AddNetworkToDhcpAgent'),
+ 'dhcp-agent-network-remove': utils.import_class(
+ 'quantumclient.quantum.v2_0.agentscheduler.'
+ 'RemoveNetworkFromDhcpAgent'),
+ 'net-list-on-dhcp-agent': utils.import_class(
+ 'quantumclient.quantum.v2_0.agentscheduler.'
+ 'ListNetworksOnDhcpAgent'),
+ 'dhcp-agent-list-hosting-net': utils.import_class(
+ 'quantumclient.quantum.v2_0.agentscheduler.'
+ 'ListDhcpAgentsHostingNetwork'),
+ 'l3-agent-router-add': utils.import_class(
+ 'quantumclient.quantum.v2_0.agentscheduler.AddRouterToL3Agent'),
+ 'l3-agent-router-remove': utils.import_class(
+ 'quantumclient.quantum.v2_0.agentscheduler.RemoveRouterFromL3Agent'),
+ 'router-list-on-l3-agent': utils.import_class(
+ 'quantumclient.quantum.v2_0.agentscheduler.ListRoutersOnL3Agent'),
+ 'l3-agent-list-hosting-router': utils.import_class(
+ 'quantumclient.quantum.v2_0.agentscheduler.ListL3AgentsHostingRouter'),
}
COMMANDS = {'2.0': COMMAND_V2}
diff --git a/quantumclient/v2_0/client.py b/quantumclient/v2_0/client.py
index 3ee26e9..aa40a76 100644
--- a/quantumclient/v2_0/client.py
+++ b/quantumclient/v2_0/client.py
@@ -177,6 +177,10 @@ class Client(object):
network_gateways_path = "/network-gateways"
network_gateway_path = "/network-gateways/%s"
+ DHCP_NETS = '/dhcp-networks'
+ DHCP_AGENTS = '/dhcp-agents'
+ L3_ROUTERS = '/l3-routers'
+ L3_AGENTS = '/l3-agents'
# API has no way to report plurals, so we have to hard code them
EXTED_PLURALS = {'routers': 'router',
'floatingips': 'floatingip',
@@ -788,6 +792,70 @@ class Client(object):
base_uri = self.network_gateway_path % gateway_id
return self.put("%s/disconnect_network" % base_uri, body=body)
+ @APIParamsCall
+ def list_dhcp_agent_hosting_networks(self, network, **_params):
+ """
+ Fetches a list of dhcp agents hosting a network.
+ """
+ return self.get((self.network_path + self.DHCP_AGENTS) % network,
+ params=_params)
+
+ @APIParamsCall
+ def list_networks_on_dhcp_agent(self, dhcp_agent, **_params):
+ """
+ Fetches a list of dhcp agents hosting a network.
+ """
+ return self.get((self.agent_path + self.DHCP_NETS) % dhcp_agent,
+ params=_params)
+
+ @APIParamsCall
+ def add_network_to_dhcp_agent(self, dhcp_agent, body=None):
+ """
+ Adds a network to dhcp agent.
+ """
+ return self.post((self.agent_path + self.DHCP_NETS) % dhcp_agent,
+ body=body)
+
+ @APIParamsCall
+ def remove_network_from_dhcp_agent(self, dhcp_agent, network_id):
+ """
+ Remove a network from dhcp agent.
+ """
+ return self.delete((self.agent_path + self.DHCP_NETS + "/%s") % (
+ dhcp_agent, network_id))
+
+ @APIParamsCall
+ def list_l3_agent_hosting_routers(self, router, **_params):
+ """
+ Fetches a list of L3 agents hosting a router.
+ """
+ return self.get((self.router_path + self.L3_AGENTS) % router,
+ params=_params)
+
+ @APIParamsCall
+ def list_routers_on_l3_agent(self, l3_agent, **_params):
+ """
+ Fetches a list of L3 agents hosting a router.
+ """
+ return self.get((self.agent_path + self.L3_ROUTERS) % l3_agent,
+ params=_params)
+
+ @APIParamsCall
+ def add_router_to_l3_agent(self, l3_agent, body):
+ """
+ Adds a router to L3 agent.
+ """
+ return self.post((self.agent_path + self.L3_ROUTERS) % l3_agent,
+ body=body)
+
+ @APIParamsCall
+ def remove_router_from_l3_agent(self, l3_agent, router_id):
+ """
+ Remove a router from l3 agent.
+ """
+ return self.delete((self.agent_path + self.L3_ROUTERS + "/%s") % (
+ l3_agent, router_id))
+
def __init__(self, **kwargs):
""" Initialize a new client for the Quantum v2.0 API. """
super(Client, self).__init__()