diff options
author | gongysh <gongysh@linux.vnet.ibm.com> | 2013-02-06 18:29:43 +0800 |
---|---|---|
committer | gongysh <gongysh@linux.vnet.ibm.com> | 2013-02-28 08:11:07 +0800 |
commit | b204b1b5967725456a6aec680e896f928aca57db (patch) | |
tree | ae47368320a21415f62399bd1650ed02461e2fc9 | |
parent | 94a60cfe5b0db53099bbcc39997c5656679333e4 (diff) | |
download | python-neutronclient-b204b1b5967725456a6aec680e896f928aca57db.tar.gz |
Client for agent scheduler extension
blueprint quantum-scheduler
Change-Id: I5bad096d4892ebf1d309fc0a625dca4b2407bc94
-rw-r--r-- | quantumclient/quantum/v2_0/__init__.py | 17 | ||||
-rw-r--r-- | quantumclient/quantum/v2_0/agentscheduler.py | 233 | ||||
-rw-r--r-- | quantumclient/shell.py | 21 | ||||
-rw-r--r-- | quantumclient/v2_0/client.py | 68 |
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__() |