Huanxuan Ao 8e2f49fbf2 Support bulk deletion for commands that exist in both network and compute.
Some delete commands in networkv2 are exist in both network
and compute, They can use NetworkAndComputeDeleteclass to
supprot bulk deletion and error handling and the codes are
similar, so I change them all in this patch. The changed
commands including:
1.floating ip delete
2.security group delete
3.security group rule delete
Also, I update unit tests and docs for these commands in this patch.

Change-Id: I6c94c3d10ba579ddd9b14d17673c821e3481fd8a
Partially-Implements: blueprint multi-argument-network
2016-06-15 17:23:39 +08:00

214 lines
6.5 KiB
Python

# 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.
#
"""IP Floating action implementations"""
from osc_lib import utils
from openstackclient.i18n import _
from openstackclient.network import common
def _get_columns(item):
columns = list(item.keys())
if 'tenant_id' in columns:
columns.remove('tenant_id')
columns.append('project_id')
return tuple(sorted(columns))
def _get_attrs(client_manager, parsed_args):
attrs = {}
network_client = client_manager.network
if parsed_args.network is not None:
network = network_client.find_network(parsed_args.network,
ignore_missing=False)
attrs['floating_network_id'] = network.id
if parsed_args.subnet is not None:
subnet = network_client.find_subnet(parsed_args.subnet,
ignore_missing=False)
attrs['subnet_id'] = subnet.id
if parsed_args.port is not None:
port = network_client.find_port(parsed_args.port,
ignore_missing=False)
attrs['port_id'] = port.id
if parsed_args.floating_ip_address is not None:
attrs['floating_ip_address'] = parsed_args.floating_ip_address
if parsed_args.fixed_ip_address is not None:
attrs['fixed_ip_address'] = parsed_args.fixed_ip_address
return attrs
class CreateFloatingIP(common.NetworkAndComputeShowOne):
"""Create floating IP"""
def update_parser_common(self, parser):
# In Compute v2 network, floating IPs could be allocated from floating
# IP pools, which are actually external networks. So deprecate the
# parameter "pool", and use "network" instead.
parser.add_argument(
'network',
metavar='<network>',
help=_("Network to allocate floating IP from (name or ID)")
)
return parser
def update_parser_network(self, parser):
parser.add_argument(
'--subnet',
metavar='<subnet>',
help=_("Subnet on which you want to create the floating IP "
"(name or ID)")
)
parser.add_argument(
'--port',
metavar='<port>',
help=_("Port to be associated with the floating IP "
"(name or ID)")
)
parser.add_argument(
'--floating-ip-address',
metavar='<floating-ip-address>',
dest='floating_ip_address',
help=_("Floating IP address")
)
parser.add_argument(
'--fixed-ip-address',
metavar='<fixed-ip-address>',
dest='fixed_ip_address',
help=_("Fixed IP address mapped to the floating IP")
)
return parser
def take_action_network(self, client, parsed_args):
attrs = _get_attrs(self.app.client_manager, parsed_args)
obj = client.create_ip(**attrs)
columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
return (columns, data)
def take_action_compute(self, client, parsed_args):
obj = client.floating_ips.create(parsed_args.network)
columns = _get_columns(obj._info)
data = utils.get_dict_properties(obj._info, columns)
return (columns, data)
class DeleteFloatingIP(common.NetworkAndComputeDelete):
"""Delete floating IP(s)"""
# Used by base class to find resources in parsed_args.
resource = 'floating_ip'
r = None
def update_parser_common(self, parser):
parser.add_argument(
'floating_ip',
metavar="<floating-ip>",
nargs="+",
help=_("Floating IP(s) to delete (IP address or ID)")
)
return parser
def take_action_network(self, client, parsed_args):
obj = client.find_ip(self.r, ignore_missing=False)
client.delete_ip(obj)
def take_action_compute(self, client, parsed_args):
obj = utils.find_resource(client.floating_ips, self.r)
client.floating_ips.delete(obj.id)
class ListFloatingIP(common.NetworkAndComputeLister):
"""List floating IP(s)"""
def take_action_network(self, client, parsed_args):
columns = (
'id',
'floating_ip_address',
'fixed_ip_address',
'port_id',
)
headers = (
'ID',
'Floating IP Address',
'Fixed IP Address',
'Port',
)
query = {}
data = client.ips(**query)
return (headers,
(utils.get_item_properties(
s, columns,
formatters={},
) for s in data))
def take_action_compute(self, client, parsed_args):
columns = (
'ID',
'IP',
'Fixed IP',
'Instance ID',
'Pool',
)
headers = (
'ID',
'Floating IP Address',
'Fixed IP Address',
'Server',
'Pool',
)
data = client.floating_ips.list()
return (headers,
(utils.get_item_properties(
s, columns,
formatters={},
) for s in data))
class ShowFloatingIP(common.NetworkAndComputeShowOne):
"""Show floating IP details"""
def update_parser_common(self, parser):
parser.add_argument(
'floating_ip',
metavar="<floating-ip>",
help=_("Floating IP to display (IP address or ID)")
)
return parser
def take_action_network(self, client, parsed_args):
obj = client.find_ip(parsed_args.floating_ip, ignore_missing=False)
columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
return (columns, data)
def take_action_compute(self, client, parsed_args):
obj = utils.find_resource(
client.floating_ips,
parsed_args.floating_ip,
)
columns = _get_columns(obj._info)
data = utils.get_dict_properties(obj._info, columns)
return (columns, data)