From e9021c213b0f98195920e63aa573c040d5a3cf6d Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Sun, 14 Apr 2013 17:02:45 -0500 Subject: [PATCH] Add fixed-ip and floating-ip commands Adds: * fixed-ip commands: add, remove * floating-ip commands: add, create, delete, list, remove * floating-ip-poo command: list Also uses NAME_ATTR in the Resource class if present to determine the attribute to be used for searching in utils.find_resource() Change-Id: Ifd8fa60f880fc4050dea182ac24553cc2c4bff15 --- openstackclient/common/utils.py | 9 +- openstackclient/compute/v2/fixedip.py | 87 ++++++++++ openstackclient/compute/v2/floatingip.py | 160 +++++++++++++++++++ openstackclient/compute/v2/floatingippool.py | 43 +++++ setup.py | 17 ++ 5 files changed, 315 insertions(+), 1 deletion(-) create mode 100644 openstackclient/compute/v2/fixedip.py create mode 100644 openstackclient/compute/v2/floatingip.py create mode 100644 openstackclient/compute/v2/floatingippool.py diff --git a/openstackclient/common/utils.py b/openstackclient/common/utils.py index 76532fcb0..8a7926754 100644 --- a/openstackclient/common/utils.py +++ b/openstackclient/common/utils.py @@ -38,9 +38,16 @@ def find_resource(manager, name_or_id): except (ValueError, exceptions.NotFound): pass + kwargs = {} + if 'NAME_ATTR' in manager.resource_class.__dict__: + # novaclient does this for oddball resources + kwargs[manager.resource_class.NAME_ATTR] = name_or_id + else: + kwargs['name'] = name_or_id + # finally try to find entity by name try: - return manager.find(name=name_or_id) + return manager.find(**kwargs) # FIXME(dtroyer): The exception to catch here is dependent on which # client library the manager passed in belongs to. # Eventually this should be pulled from a common set diff --git a/openstackclient/compute/v2/fixedip.py b/openstackclient/compute/v2/fixedip.py new file mode 100644 index 000000000..d0687fd71 --- /dev/null +++ b/openstackclient/compute/v2/fixedip.py @@ -0,0 +1,87 @@ +# Copyright 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. +# + +"""Fixed IP action implementations""" + +import logging + +from cliff import command + +from openstackclient.common import utils + + +class AddFixedIP(command.Command): + """Add fixed-ip command""" + + api = "compute" + log = logging.getLogger(__name__ + ".AddFixedIP") + + def get_parser(self, prog_name): + parser = super(AddFixedIP, self).get_parser(prog_name) + parser.add_argument( + "network", + metavar="", + help="Name of the network to fetch an IP address from", + ) + parser.add_argument( + "server", + metavar="", + help="Name of the server to receive the IP address", + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)" % parsed_args) + compute_client = self.app.client_manager.compute + + network = utils.find_resource( + compute_client.networks, parsed_args.network) + + server = utils.find_resource( + compute_client.servers, parsed_args.server) + + server.add_fixed_ip(network.id) + return + + +class RemoveFixedIP(command.Command): + """Remove fixed-ip command""" + + api = "compute" + log = logging.getLogger(__name__ + ".RemoveFixedIP") + + def get_parser(self, prog_name): + parser = super(RemoveFixedIP, self).get_parser(prog_name) + parser.add_argument( + "ip_address", + metavar="", + help="IP address to remove from server", + ) + parser.add_argument( + "server", + metavar="", + help="Name of the server to remove the IP address from", + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)" % parsed_args) + compute_client = self.app.client_manager.compute + + server = utils.find_resource( + compute_client.servers, parsed_args.server) + + server.remove_fixed_ip(parsed_args.ip_address) + return diff --git a/openstackclient/compute/v2/floatingip.py b/openstackclient/compute/v2/floatingip.py new file mode 100644 index 000000000..5a4b5f9a5 --- /dev/null +++ b/openstackclient/compute/v2/floatingip.py @@ -0,0 +1,160 @@ +# Copyright 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. +# + +"""Floating IP action implementations""" + +import logging + +from cliff import command +from cliff import lister +from cliff import show + +from openstackclient.common import utils + + +class AddFloatingIP(command.Command): + """Add floating-ip command""" + + api = "compute" + log = logging.getLogger(__name__ + ".AddFloatingIP") + + def get_parser(self, prog_name): + parser = super(AddFloatingIP, self).get_parser(prog_name) + parser.add_argument( + "ip_address", + metavar="", + help="IP address to add to server", + ) + parser.add_argument( + "server", + metavar="", + help="Name of the server to receive the IP address", + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)" % parsed_args) + compute_client = self.app.client_manager.compute + + server = utils.find_resource( + compute_client.servers, parsed_args.server) + + server.add_floating_ip(parsed_args.ip_address) + return + + +class CreateFloatingIP(show.ShowOne): + """Create floating-ip command""" + + api = 'compute' + log = logging.getLogger(__name__ + '.CreateFloatingIP') + + def get_parser(self, prog_name): + parser = super(CreateFloatingIP, self).get_parser(prog_name) + parser.add_argument( + 'pool', + metavar='', + help='Pool to fetch floating IP from', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + compute_client = self.app.client_manager.compute + floating_ip = compute_client.floating_ips.create(parsed_args.pool) + + info = {} + info.update(floating_ip._info) + return zip(*sorted(info.iteritems())) + + +class DeleteFloatingIP(command.Command): + """Delete floating-ip command""" + + api = 'compute' + log = logging.getLogger(__name__ + '.DeleteFloatingIP') + + def get_parser(self, prog_name): + parser = super(DeleteFloatingIP, self).get_parser(prog_name) + parser.add_argument( + "ip_address", + metavar="", + help="IP address to add to server", + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + compute_client = self.app.client_manager.compute + + floating_ip = utils.find_resource( + compute_client.floating_ips, + parsed_args.ip_address, + ) + + compute_client.floating_ips.delete(floating_ip) + return + + +class ListFloatingIP(lister.Lister): + """List floating-ip command""" + + api = 'compute' + log = logging.getLogger(__name__ + '.ListFloatingIP') + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + compute_client = self.app.client_manager.compute + + columns = ('ID', 'Pool', 'IP', 'Fixed IP', 'Instance ID') + + data = compute_client.floating_ips.list() + + return (columns, + (utils.get_item_properties( + s, columns, + formatters={}, + ) for s in data)) + + +class RemoveFloatingIP(command.Command): + """Remove floating-ip command""" + + api = "compute" + log = logging.getLogger(__name__ + ".RemoveFloatingIP") + + def get_parser(self, prog_name): + parser = super(RemoveFloatingIP, self).get_parser(prog_name) + parser.add_argument( + "ip_address", + metavar="", + help="IP address to remove from server", + ) + parser.add_argument( + "server", + metavar="", + help="Name of the server to remove the IP address from", + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)" % parsed_args) + compute_client = self.app.client_manager.compute + + server = utils.find_resource( + compute_client.servers, parsed_args.server) + + server.remove_floating_ip(parsed_args.ip_address) + return diff --git a/openstackclient/compute/v2/floatingippool.py b/openstackclient/compute/v2/floatingippool.py new file mode 100644 index 000000000..54814e046 --- /dev/null +++ b/openstackclient/compute/v2/floatingippool.py @@ -0,0 +1,43 @@ +# Copyright 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. +# + +"""Floating IP Pool action implementations""" + +import logging + +from cliff import lister + +from openstackclient.common import utils + + +class ListFloatingIPPool(lister.Lister): + """List floating-ip-pool command""" + + api = 'compute' + log = logging.getLogger(__name__ + '.ListFloatingIPPool') + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + compute_client = self.app.client_manager.compute + + columns = ('Name',) + + data = compute_client.floating_ip_pools.list() + + return (columns, + (utils.get_item_properties( + s, columns, + formatters={}, + ) for s in data)) diff --git a/setup.py b/setup.py index 9666cf95f..d59141787 100644 --- a/setup.py +++ b/setup.py @@ -189,11 +189,28 @@ setuptools.setup( 'set_compute-service=' 'openstackclient.compute.v2.service:SetService', + 'add_fixed-ip=openstackclient.compute.v2.fixedip:AddFixedIP', + 'remove_fixed-ip=openstackclient.compute.v2.fixedip:RemoveFixedIP', + 'create_flavor=openstackclient.compute.v2.flavor:CreateFlavor', 'delete_flavor=openstackclient.compute.v2.flavor:DeleteFlavor', 'list_flavor=openstackclient.compute.v2.flavor:ListFlavor', 'show_flavor=openstackclient.compute.v2.flavor:ShowFlavor', + 'add_floating-ip=' + 'openstackclient.compute.v2.floatingip:AddFloatingIP', + 'create_floating-ip=' + 'openstackclient.compute.v2.floatingip:CreateFloatingIP', + 'delete_floating-ip=' + 'openstackclient.compute.v2.floatingip:DeleteFloatingIP', + 'list_floating-ip=' + 'openstackclient.compute.v2.floatingip:ListFloatingIP', + 'remove_floating-ip=' + 'openstackclient.compute.v2.floatingip:RemoveFloatingIP', + + 'list_floating-ip-pool=' + 'openstackclient.compute.v2.floatingippool:ListFloatingIPPool', + 'list_host=openstackclient.compute.v2.host:ListHost', 'show_host=openstackclient.compute.v2.host:ShowHost',