 119d2fae25
			
		
	
	119d2fae25
	
	
	
		
			
			New implementation of the project cleanup based on the sdk.project_cleanup. It is implemented as an additional OSC operation and will ideally obsolete the `openstack project purge` giving flexibility to extend services support, parallelization, filters, etc. Change-Id: Ie08877f182379f73e5ec5ad4daaf84b3092c829c
		
			
				
	
	
		
			184 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			6.1 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.
 | |
| 
 | |
| from io import StringIO
 | |
| from unittest import mock
 | |
| 
 | |
| from openstackclient.common import project_cleanup
 | |
| from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
 | |
| from openstackclient.tests.unit import utils as tests_utils
 | |
| 
 | |
| 
 | |
| class TestProjectCleanupBase(tests_utils.TestCommand):
 | |
| 
 | |
|     def setUp(self):
 | |
|         super(TestProjectCleanupBase, self).setUp()
 | |
| 
 | |
|         self.app.client_manager.sdk_connection = mock.Mock()
 | |
| 
 | |
| 
 | |
| class TestProjectCleanup(TestProjectCleanupBase):
 | |
| 
 | |
|     project = identity_fakes.FakeProject.create_one_project()
 | |
| 
 | |
|     def setUp(self):
 | |
|         super(TestProjectCleanup, self).setUp()
 | |
|         self.cmd = project_cleanup.ProjectCleanup(self.app, None)
 | |
| 
 | |
|         self.project_cleanup_mock = mock.Mock()
 | |
|         self.sdk_connect_as_project_mock = \
 | |
|             mock.Mock(return_value=self.app.client_manager.sdk_connection)
 | |
|         self.app.client_manager.sdk_connection.project_cleanup = \
 | |
|             self.project_cleanup_mock
 | |
|         self.app.client_manager.sdk_connection.identity.find_project = \
 | |
|             mock.Mock(return_value=self.project)
 | |
|         self.app.client_manager.sdk_connection.connect_as_project = \
 | |
|             self.sdk_connect_as_project_mock
 | |
| 
 | |
|     def test_project_no_options(self):
 | |
|         arglist = []
 | |
|         verifylist = []
 | |
| 
 | |
|         self.assertRaises(tests_utils.ParserException, self.check_parser,
 | |
|                           self.cmd, arglist, verifylist)
 | |
| 
 | |
|     def test_project_cleanup_with_filters(self):
 | |
|         arglist = [
 | |
|             '--project', self.project.id,
 | |
|             '--created-before', '2200-01-01',
 | |
|             '--updated-before', '2200-01-02'
 | |
|         ]
 | |
|         verifylist = [
 | |
|             ('dry_run', False),
 | |
|             ('auth_project', False),
 | |
|             ('project', self.project.id),
 | |
|             ('created_before', '2200-01-01'),
 | |
|             ('updated_before', '2200-01-02')
 | |
|         ]
 | |
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | |
|         result = None
 | |
| 
 | |
|         with mock.patch('sys.stdin', StringIO('y')):
 | |
|             result = self.cmd.take_action(parsed_args)
 | |
| 
 | |
|         self.sdk_connect_as_project_mock.assert_called_with(
 | |
|             self.project)
 | |
|         filters = {
 | |
|             'created_at': '2200-01-01',
 | |
|             'updated_at': '2200-01-02'
 | |
|         }
 | |
| 
 | |
|         calls = [
 | |
|             mock.call(dry_run=True, status_queue=mock.ANY, filters=filters),
 | |
|             mock.call(dry_run=False, status_queue=mock.ANY, filters=filters)
 | |
|         ]
 | |
|         self.project_cleanup_mock.assert_has_calls(calls)
 | |
| 
 | |
|         self.assertIsNone(result)
 | |
| 
 | |
|     def test_project_cleanup_with_project(self):
 | |
|         arglist = [
 | |
|             '--project', self.project.id,
 | |
|         ]
 | |
|         verifylist = [
 | |
|             ('dry_run', False),
 | |
|             ('auth_project', False),
 | |
|             ('project', self.project.id),
 | |
|         ]
 | |
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | |
|         result = None
 | |
| 
 | |
|         with mock.patch('sys.stdin', StringIO('y')):
 | |
|             result = self.cmd.take_action(parsed_args)
 | |
| 
 | |
|         self.sdk_connect_as_project_mock.assert_called_with(
 | |
|             self.project)
 | |
|         calls = [
 | |
|             mock.call(dry_run=True, status_queue=mock.ANY, filters={}),
 | |
|             mock.call(dry_run=False, status_queue=mock.ANY, filters={})
 | |
|         ]
 | |
|         self.project_cleanup_mock.assert_has_calls(calls)
 | |
| 
 | |
|         self.assertIsNone(result)
 | |
| 
 | |
|     def test_project_cleanup_with_project_abort(self):
 | |
|         arglist = [
 | |
|             '--project', self.project.id,
 | |
|         ]
 | |
|         verifylist = [
 | |
|             ('dry_run', False),
 | |
|             ('auth_project', False),
 | |
|             ('project', self.project.id),
 | |
|         ]
 | |
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | |
|         result = None
 | |
| 
 | |
|         with mock.patch('sys.stdin', StringIO('n')):
 | |
|             result = self.cmd.take_action(parsed_args)
 | |
| 
 | |
|         self.sdk_connect_as_project_mock.assert_called_with(
 | |
|             self.project)
 | |
|         calls = [
 | |
|             mock.call(dry_run=True, status_queue=mock.ANY, filters={}),
 | |
|         ]
 | |
|         self.project_cleanup_mock.assert_has_calls(calls)
 | |
| 
 | |
|         self.assertIsNone(result)
 | |
| 
 | |
|     def test_project_cleanup_with_dry_run(self):
 | |
|         arglist = [
 | |
|             '--dry-run',
 | |
|             '--project', self.project.id,
 | |
|         ]
 | |
|         verifylist = [
 | |
|             ('dry_run', True),
 | |
|             ('auth_project', False),
 | |
|             ('project', self.project.id),
 | |
|         ]
 | |
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | |
|         result = None
 | |
| 
 | |
|         result = self.cmd.take_action(parsed_args)
 | |
| 
 | |
|         self.sdk_connect_as_project_mock.assert_called_with(
 | |
|             self.project)
 | |
|         self.project_cleanup_mock.assert_called_once_with(
 | |
|             dry_run=True, status_queue=mock.ANY, filters={})
 | |
| 
 | |
|         self.assertIsNone(result)
 | |
| 
 | |
|     def test_project_cleanup_with_auth_project(self):
 | |
|         self.app.client_manager.auth_ref = mock.Mock()
 | |
|         self.app.client_manager.auth_ref.project_id = self.project.id
 | |
|         arglist = [
 | |
|             '--auth-project',
 | |
|         ]
 | |
|         verifylist = [
 | |
|             ('dry_run', False),
 | |
|             ('auth_project', True),
 | |
|             ('project', None),
 | |
|         ]
 | |
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | |
|         result = None
 | |
| 
 | |
|         with mock.patch('sys.stdin', StringIO('y')):
 | |
|             result = self.cmd.take_action(parsed_args)
 | |
| 
 | |
|         self.sdk_connect_as_project_mock.assert_not_called()
 | |
|         calls = [
 | |
|             mock.call(dry_run=True, status_queue=mock.ANY, filters={}),
 | |
|             mock.call(dry_run=False, status_queue=mock.ANY, filters={})
 | |
|         ]
 | |
|         self.project_cleanup_mock.assert_has_calls(calls)
 | |
| 
 | |
|         self.assertIsNone(result)
 |