88fbd3870c
The addition of the 'neutron purge' command allows cloud admins to conveniently delete multiple neutron resources associated with a given tenant. The command will delete all supported resources provided that they can be deleted (not in use, etc) and feedback the amount of each resource deleted to the user. A completion percentage is also given to keep the user informed of progress. Currently supports deletion of: Networks Subnets (implicitly) Routers Ports (including router interfaces) Floating IPs Security Groups This feature can be easily extended to support more resource types in the future. DocImpact: Update API documentation to describe neutron-purge usage Change-Id: I5a366d3537191045eb53f9cccd8cd0f7ce54a63b Closes-Bug: 1511574 Partially-Implements: blueprint tenant-delete
101 lines
3.9 KiB
Python
101 lines
3.9 KiB
Python
# Copyright 2016 Cisco Systems
|
|
# 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.
|
|
#
|
|
|
|
import sys
|
|
|
|
from neutronclient.neutron.v2_0 import purge
|
|
from neutronclient.tests.unit import test_cli20
|
|
|
|
|
|
class CLITestV20Purge(test_cli20.CLITestV20Base):
|
|
|
|
def setUp(self):
|
|
super(CLITestV20Purge, self).setUp()
|
|
self.resource_types = ['floatingip', 'port', 'router',
|
|
'network', 'security_group']
|
|
|
|
def _generate_resources_dict(self, value=0):
|
|
resources_dict = {}
|
|
resources_dict['true'] = value
|
|
for resource_type in self.resource_types:
|
|
resources_dict[resource_type] = value
|
|
return resources_dict
|
|
|
|
def _verify_suffix(self, resources, message):
|
|
for resource, value in resources.items():
|
|
if value > 0:
|
|
suffix = list('%(value)d %(resource)s' %
|
|
{'value': value, 'resource': resource})
|
|
if value != 1:
|
|
suffix.append('s')
|
|
suffix = ''.join(suffix)
|
|
self.assertIn(suffix, message)
|
|
else:
|
|
self.assertNotIn(resource, message)
|
|
|
|
def _verify_message(self, message, deleted, failed):
|
|
message = message.split('.')
|
|
success_prefix = "Deleted "
|
|
failure_prefix = "The following resources could not be deleted: "
|
|
if not deleted['true']:
|
|
for msg in message:
|
|
self.assertNotIn(success_prefix, msg)
|
|
message = message[0]
|
|
if not failed['true']:
|
|
expected = 'Tenant has no supported resources'
|
|
self.assertEqual(expected, message)
|
|
else:
|
|
self.assertIn(failure_prefix, message)
|
|
self._verify_suffix(failed, message)
|
|
else:
|
|
resources_deleted = message[0]
|
|
self.assertIn(success_prefix, resources_deleted)
|
|
self._verify_suffix(deleted, resources_deleted)
|
|
if failed['true']:
|
|
resources_failed = message[1]
|
|
self.assertIn(failure_prefix, resources_failed)
|
|
self._verify_suffix(failed, resources_failed)
|
|
else:
|
|
for msg in message:
|
|
self.assertNotIn(failure_prefix, msg)
|
|
|
|
def _verify_result(self, my_purge, deleted, failed):
|
|
message = my_purge._build_message(deleted, failed, failed['true'])
|
|
self._verify_message(message, deleted, failed)
|
|
|
|
def test_build_message(self):
|
|
my_purge = purge.Purge(test_cli20.MyApp(sys.stdout), None)
|
|
|
|
# Verify message when tenant has no supported resources
|
|
deleted = self._generate_resources_dict()
|
|
failed = self._generate_resources_dict()
|
|
self._verify_result(my_purge, deleted, failed)
|
|
|
|
# Verify message when tenant has supported resources,
|
|
# and they are all deleteable
|
|
deleted = self._generate_resources_dict(1)
|
|
self._verify_result(my_purge, deleted, failed)
|
|
|
|
# Verify message when tenant has supported resources,
|
|
# and some are not deleteable
|
|
failed = self._generate_resources_dict(1)
|
|
self._verify_result(my_purge, deleted, failed)
|
|
|
|
# Verify message when tenant has supported resources,
|
|
# and all are not deleteable
|
|
deleted = self._generate_resources_dict()
|
|
self._verify_result(my_purge, deleted, failed)
|