diff options
-rw-r--r-- | apex/tests/test_apex_undercloud.py | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/apex/tests/test_apex_undercloud.py b/apex/tests/test_apex_undercloud.py new file mode 100644 index 00000000..9458bf9f --- /dev/null +++ b/apex/tests/test_apex_undercloud.py @@ -0,0 +1,196 @@ +############################################################################## +# Copyright (c) 2016 Dan Radez (dradez@redhat.com) (Red Hat) +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +import libvirt +import os +import subprocess +import unittest + +from mock import patch +from mock import MagicMock + +from apex.common import constants +from apex.undercloud.undercloud import Undercloud +from apex.undercloud.undercloud import ApexUndercloudException + +from nose.tools import ( + assert_regexp_matches, + assert_raises, + assert_true, + assert_equal) + + +class TestUndercloud(unittest.TestCase): + @classmethod + def setup_class(cls): + """This method is run once for each class before any tests are run""" + + @classmethod + def teardown_class(cls): + """This method is run once for each class _after_ all tests are run""" + + def setup(self): + """This method is run once before _each_ test method is executed""" + + def teardown(self): + """This method is run once after _each_ test method is executed""" + + @patch.object(Undercloud, '_get_vm', return_value=None) + @patch.object(Undercloud, 'create') + def test_init(self, mock_get_vm, mock_create): + Undercloud('img_path', 'tplt_path') + mock_create.assert_called() + + @patch.object(Undercloud, '_get_vm', return_value=object()) + @patch.object(Undercloud, 'create') + def test_init_uc_exists(self, mock_get_vm, mock_create): + assert_raises(ApexUndercloudException, + Undercloud, 'img_path', 'tplt_path') + + @patch('apex.undercloud.undercloud.libvirt.open') + @patch.object(Undercloud, 'create') + def test_get_vm_exists(self, mock_create, mock_libvirt): + assert_raises(ApexUndercloudException, + Undercloud, 'img_path', 'tplt_path') + + @patch('apex.undercloud.undercloud.libvirt.open') + @patch.object(Undercloud, 'create') + def test_get_vm_not_exists(self, mock_create, mock_libvirt): + conn = mock_libvirt.return_value + conn.lookupByName.side_effect = libvirt.libvirtError('defmsg') + Undercloud('img_path', 'tplt_path') + + @patch('apex.undercloud.undercloud.vm_lib') + @patch.object(Undercloud, 'inject_auth', return_value=None) + @patch.object(Undercloud, 'setup_volumes', return_value=None) + @patch.object(Undercloud, '_get_vm', return_value=None) + def test_create(self, mock_get_vm, mock_setup_vols, + mock_inject_auth, mock_vm_lib): + Undercloud('img_path', 'tplt_path', external_network=True) + mock_inject_auth.assert_called() + mock_setup_vols.assert_called() + mock_inject_auth.assert_called() + + @patch.object(Undercloud, '_get_vm', return_value=None) + @patch.object(Undercloud, 'create') + def test_set_ip(self, mock_get_vm, mock_create): + uc = Undercloud('img_path', 'tplt_path', external_network=True) + uc.vm = MagicMock() + if_addrs = {'item1': {'addrs': [{'type': libvirt.VIR_IP_ADDR_TYPE_IPV4, + 'addr': 'ipaddress'}]}, + 'item2': {'addrs': [{'type': libvirt.VIR_IP_ADDR_TYPE_IPV4, + 'addr': 'ipaddress'}]}} + uc.vm.interfaceAddresses.return_value = if_addrs + assert_true(uc._set_ip()) + + @patch('apex.undercloud.undercloud.time.sleep') + @patch.object(Undercloud, '_set_ip', return_value=False) + @patch.object(Undercloud, '_get_vm', return_value=None) + @patch.object(Undercloud, 'create') + def test_start(self, mock_create, mock_get_vm, + mock_set_ip, mock_time): + uc = Undercloud('img_path', 'tplt_path', external_network=True) + uc.vm = MagicMock() + uc.vm.isActive.return_value = False + mock_set_ip.return_value = True + uc.start() + + @patch('apex.undercloud.undercloud.time.sleep') + @patch.object(Undercloud, '_set_ip', return_value=False) + @patch.object(Undercloud, '_get_vm', return_value=None) + @patch.object(Undercloud, 'create') + def test_start_no_ip(self, mock_create, mock_get_vm, + mock_set_ip, mock_time): + uc = Undercloud('img_path', 'tplt_path', external_network=True) + uc.vm = MagicMock() + uc.vm.isActive.return_value = True + mock_set_ip.return_value = False + assert_raises(ApexUndercloudException, uc.start) + + @patch('apex.undercloud.undercloud.utils') + @patch.object(Undercloud, 'generate_config', return_value={}) + @patch.object(Undercloud, '_get_vm', return_value=None) + @patch.object(Undercloud, 'create') + def test_configure(self, mock_create, mock_get_vm, + mock_generate_config, mock_utils): + uc = Undercloud('img_path', 'tplt_path', external_network=True) + ns = MagicMock() + uc.configure(ns, 'playbook', '/tmp/dir') + + @patch('apex.undercloud.undercloud.utils') + @patch.object(Undercloud, 'generate_config', return_value={}) + @patch.object(Undercloud, '_get_vm', return_value=None) + @patch.object(Undercloud, 'create') + def test_configure_raises(self, mock_create, mock_get_vm, + mock_generate_config, mock_utils): + uc = Undercloud('img_path', 'tplt_path', external_network=True) + ns = MagicMock() + subps_err = subprocess.CalledProcessError(1, 'cmd') + mock_utils.run_ansible.side_effect = subps_err + assert_raises(ApexUndercloudException, + uc.configure, ns, 'playbook', '/tmp/dir') + + @patch('apex.undercloud.undercloud.os.remove') + @patch('apex.undercloud.undercloud.os.path') + @patch('apex.undercloud.undercloud.shutil') + @patch.object(Undercloud, '_get_vm', return_value=None) + @patch.object(Undercloud, 'create') + def test_setup_vols(self, mock_get_vm, mock_create, + mock_shutil, mock_os_path, mock_os_remove): + uc = Undercloud('img_path', 'tplt_path', external_network=True) + mock_os_path.isfile.return_value = True + mock_os_path.exists.return_value = True + uc.setup_volumes() + for img_file in ('overcloud-full.vmlinuz', 'overcloud-full.initrd', + 'undercloud.qcow2'): + src_img = os.path.join(uc.image_path, img_file) + dest_img = os.path.join(constants.LIBVIRT_VOLUME_PATH, img_file) + mock_shutil.copyfile.assert_called_with(src_img, dest_img) + + @patch('apex.undercloud.undercloud.os.path') + @patch.object(Undercloud, '_get_vm', return_value=None) + @patch.object(Undercloud, 'create') + def test_setup_vols_raises(self, mock_get_vm, mock_create, mock_os_path): + uc = Undercloud('img_path', 'tplt_path', external_network=True) + mock_os_path.isfile.return_value = False + assert_raises(ApexUndercloudException, uc.setup_volumes) + + @patch('apex.undercloud.undercloud.virt_utils') + @patch.object(Undercloud, '_get_vm', return_value=None) + @patch.object(Undercloud, 'create') + def test_inject_auth(self, mock_get_vm, mock_create, mock_vutils): + uc = Undercloud('img_path', 'tplt_path', external_network=True) + uc.root_pw = 'test' + uc.inject_auth() + test_ops = [{'--root-password': 'password:test'}, + {'--run-command': 'mkdir -p /root/.ssh'}, + {'--upload': + '/root/.ssh/id_rsa.pub:/root/.ssh/authorized_keys'}, + {'--run-command': 'chmod 600 /root/.ssh/authorized_keys'}, + {'--run-command': 'restorecon /root/.ssh/authorized_keys'}, + {'--run-command': + 'cp /root/.ssh/authorized_keys /home/stack/.ssh/'}, + {'--run-command': + 'chown stack:stack /home/stack/.ssh/authorized_keys'}, + {'--run-command': + 'chmod 600 /home/stack/.ssh/authorized_keys'}] + mock_vutils.virt_customize.assert_called_with(test_ops, uc.volume) + + @patch.object(Undercloud, '_get_vm', return_value=None) + @patch.object(Undercloud, 'create') + def test_generate_config(self, mock_get_vm, mock_create): + ns_net = MagicMock() + ns_net.__getitem__.side_effect = \ + lambda i: '1234/24' if i is 'cidr' else MagicMock() + ns = {'apex': MagicMock(), + 'dns-domain': 'dns', + 'networks': {'admin': ns_net, + 'external': [ns_net]}} + + Undercloud('img_path', 'tplt_path').generate_config(ns) |