| ######### |
| # Copyright (c) 2016 GigaSpaces Technologies Ltd. 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 os |
| from os import path |
| import tempfile |
| import shutil |
| |
| import unittest |
| import mock |
| |
| from cloudify.test_utils import workflow_test |
| from nova_plugin.keypair import creation_validation |
| from cloudify.exceptions import NonRecoverableError |
| |
| PRIVATE_KEY_NAME = 'private_key' |
| |
| |
| class TestValidation(unittest.TestCase): |
| |
| blueprint_path = path.join('resources', |
| 'test-keypair-validation-blueprint.yaml') |
| |
| def setUp(self): |
| _, fp = tempfile.mkstemp() |
| self.private_key = fp |
| _, fp = tempfile.mkstemp() |
| self.not_readable_private_key = fp |
| os.chmod(self.not_readable_private_key, 0o200) |
| self.temp_dir = tempfile.mkdtemp() |
| self.not_writable_temp_dir_r = tempfile.mkdtemp() |
| os.chmod(self.not_writable_temp_dir_r, 0o400) |
| self.not_writable_temp_dir_rx = tempfile.mkdtemp() |
| os.chmod(self.not_writable_temp_dir_rx, 0o500) |
| self.not_writable_temp_dir_rw = tempfile.mkdtemp() |
| os.chmod(self.not_writable_temp_dir_rw, 0o600) |
| |
| def tearDown(self): |
| if self.private_key: |
| os.remove(self.private_key) |
| |
| if self.not_readable_private_key: |
| os.remove(self.not_readable_private_key) |
| |
| shutil.rmtree(self.not_writable_temp_dir_r, ignore_errors=True) |
| shutil.rmtree(self.not_writable_temp_dir_rx, ignore_errors=True) |
| shutil.rmtree(self.not_writable_temp_dir_rw, ignore_errors=True) |
| shutil.rmtree(self.temp_dir, ignore_errors=True) |
| |
| def new_keypair_create(self, *args, **kwargs): |
| creation_validation(*args, **kwargs) |
| |
| def new_keypair_create_with_exception(self, *args, **kwargs): |
| self.assertRaises(NonRecoverableError, creation_validation, |
| *args, **kwargs) |
| |
| def get_keypair_inputs_private_key(self, is_external, **kwargs): |
| return { |
| 'private_key': self.private_key, |
| 'is_keypair_external': is_external |
| } |
| |
| def get_keypair_inputs_not_readable_private_key(self, |
| is_external, **kwargs): |
| return { |
| 'private_key': self.not_readable_private_key, |
| 'is_keypair_external': is_external |
| } |
| |
| def get_keypair_inputs_not_writable_dir_r(self, is_external, **kwargs): |
| return { |
| 'private_key': path.join(self.not_writable_temp_dir_r, |
| PRIVATE_KEY_NAME), |
| 'is_keypair_external': is_external |
| } |
| |
| def get_keypair_inputs_not_writable_dir_rx(self, is_external, **kwargs): |
| return { |
| 'private_key': path.join(self.not_writable_temp_dir_rx, |
| PRIVATE_KEY_NAME), |
| 'is_keypair_external': is_external |
| } |
| |
| def get_keypair_inputs_not_writable_dir_rw(self, is_external, **kwargs): |
| return { |
| 'private_key': path.join(self.not_writable_temp_dir_rw, |
| PRIVATE_KEY_NAME), |
| 'is_keypair_external': is_external |
| } |
| |
| def get_keypair_inputs_temp_dir(self, is_external, **kwargs): |
| return { |
| 'private_key': path.join(self.temp_dir, PRIVATE_KEY_NAME), |
| 'is_keypair_external': is_external |
| } |
| |
| @workflow_test(blueprint_path, inputs={ |
| 'private_key': '', |
| 'is_keypair_external': False |
| }) |
| @mock.patch('nova_plugin.keypair.validate_resource') |
| def test_keypair_valid_config(self, cfy_local, *args): |
| |
| with mock.patch('nova_plugin.keypair.create', |
| new=self.new_keypair_create): |
| cfy_local.execute('install', task_retries=0) |
| |
| @workflow_test(blueprint_path, inputs='get_keypair_inputs_private_key', |
| input_func_kwargs={'is_external': True}) |
| @mock.patch('nova_plugin.keypair.validate_resource') |
| def test_keypair_valid_config_external(self, cfy_local, *args): |
| |
| with mock.patch('nova_plugin.keypair.create', |
| new=self.new_keypair_create): |
| cfy_local.execute('install', task_retries=0) |
| |
| @workflow_test(blueprint_path, inputs='get_keypair_inputs_temp_dir', |
| input_func_kwargs={'is_external': True}) |
| @mock.patch('nova_plugin.keypair.validate_resource') |
| def test_keypair_no_private_key(self, cfy_local, *args): |
| |
| with mock.patch('nova_plugin.keypair.create', |
| new=self.new_keypair_create_with_exception): |
| cfy_local.execute('install', task_retries=0) |
| |
| @workflow_test(blueprint_path, inputs='get_keypair_inputs_private_key', |
| input_func_kwargs={'is_external': False}) |
| @mock.patch('nova_plugin.keypair.validate_resource') |
| def test_keypair_local_and_exists(self, cfy_local, *args): |
| |
| with mock.patch('nova_plugin.keypair.create', |
| new=self.new_keypair_create_with_exception): |
| cfy_local.execute('install', task_retries=0) |
| |
| @workflow_test(blueprint_path, inputs='get_keypair_inputs_temp_dir', |
| input_func_kwargs={'is_external': False}) |
| @mock.patch('nova_plugin.keypair.validate_resource') |
| def test_keypair_local_temp_dir(self, cfy_local, *args): |
| |
| with mock.patch('nova_plugin.keypair.create', |
| new=self.new_keypair_create): |
| cfy_local.execute('install', task_retries=0) |
| |
| @workflow_test(blueprint_path, |
| inputs='get_keypair_inputs_not_writable_dir_r', |
| input_func_kwargs={'is_external': False}) |
| @mock.patch('nova_plugin.keypair.validate_resource') |
| def test_keypair_local_non_writable_dir_r(self, cfy_local, *args): |
| |
| with mock.patch('nova_plugin.keypair.create', |
| new=self.new_keypair_create_with_exception): |
| cfy_local.execute('install', task_retries=0) |
| |
| @workflow_test(blueprint_path, |
| inputs='get_keypair_inputs_not_writable_dir_rx', |
| input_func_kwargs={'is_external': False}) |
| @mock.patch('nova_plugin.keypair.validate_resource') |
| def test_keypair_local_non_writable_dir_rx(self, cfy_local, *args): |
| |
| with mock.patch('nova_plugin.keypair.create', |
| new=self.new_keypair_create_with_exception): |
| cfy_local.execute('install', task_retries=0) |
| |
| @workflow_test(blueprint_path, |
| inputs='get_keypair_inputs_not_writable_dir_rw', |
| input_func_kwargs={'is_external': False}) |
| @mock.patch('nova_plugin.keypair.validate_resource') |
| def test_keypair_local_non_writable_dir_rw(self, cfy_local, *args): |
| |
| with mock.patch('nova_plugin.keypair.create', |
| new=self.new_keypair_create_with_exception): |
| cfy_local.execute('install', task_retries=0) |
| |
| @workflow_test(blueprint_path, |
| inputs='get_keypair_inputs_not_readable_private_key', |
| input_func_kwargs={'is_external': True}) |
| @mock.patch('nova_plugin.keypair.validate_resource') |
| def test_keypair_not_readable_private_key(self, cfy_local, *args): |
| |
| with mock.patch('nova_plugin.keypair.create', |
| new=self.new_keypair_create_with_exception): |
| cfy_local.execute('install', task_retries=0) |