Blame tests/unittests/test_handler/test_handler_puppet.py

Packit bc9a3a
# This file is part of cloud-init. See LICENSE file for license information.
Packit bc9a3a
Packit bc9a3a
from cloudinit.config import cc_puppet
Packit bc9a3a
from cloudinit.sources import DataSourceNone
Packit bc9a3a
from cloudinit import (distros, helpers, cloud, util)
Packit bc9a3a
from cloudinit.tests.helpers import CiTestCase, mock
Packit bc9a3a
Packit bc9a3a
import logging
Packit bc9a3a
import textwrap
Packit bc9a3a
Packit bc9a3a
Packit bc9a3a
LOG = logging.getLogger(__name__)
Packit bc9a3a
Packit bc9a3a
Packit bc9a3a
@mock.patch('cloudinit.config.cc_puppet.util')
Packit bc9a3a
@mock.patch('cloudinit.config.cc_puppet.os')
Packit bc9a3a
class TestAutostartPuppet(CiTestCase):
Packit bc9a3a
Packit bc9a3a
    with_logs = True
Packit bc9a3a
Packit bc9a3a
    def test_wb_autostart_puppet_updates_puppet_default(self, m_os, m_util):
Packit bc9a3a
        """Update /etc/default/puppet to autostart if it exists."""
Packit bc9a3a
Packit bc9a3a
        def _fake_exists(path):
Packit bc9a3a
            return path == '/etc/default/puppet'
Packit bc9a3a
Packit bc9a3a
        m_os.path.exists.side_effect = _fake_exists
Packit bc9a3a
        cc_puppet._autostart_puppet(LOG)
Packit bc9a3a
        self.assertEqual(
Packit bc9a3a
            [mock.call(['sed', '-i', '-e', 's/^START=.*/START=yes/',
Packit bc9a3a
                        '/etc/default/puppet'], capture=False)],
Packit bc9a3a
            m_util.subp.call_args_list)
Packit bc9a3a
Packit bc9a3a
    def test_wb_autostart_pupppet_enables_puppet_systemctl(self, m_os, m_util):
Packit bc9a3a
        """If systemctl is present, enable puppet via systemctl."""
Packit bc9a3a
Packit bc9a3a
        def _fake_exists(path):
Packit bc9a3a
            return path == '/bin/systemctl'
Packit bc9a3a
Packit bc9a3a
        m_os.path.exists.side_effect = _fake_exists
Packit bc9a3a
        cc_puppet._autostart_puppet(LOG)
Packit bc9a3a
        expected_calls = [mock.call(
Packit bc9a3a
            ['/bin/systemctl', 'enable', 'puppet.service'], capture=False)]
Packit bc9a3a
        self.assertEqual(expected_calls, m_util.subp.call_args_list)
Packit bc9a3a
Packit bc9a3a
    def test_wb_autostart_pupppet_enables_puppet_chkconfig(self, m_os, m_util):
Packit bc9a3a
        """If chkconfig is present, enable puppet via checkcfg."""
Packit bc9a3a
Packit bc9a3a
        def _fake_exists(path):
Packit bc9a3a
            return path == '/sbin/chkconfig'
Packit bc9a3a
Packit bc9a3a
        m_os.path.exists.side_effect = _fake_exists
Packit bc9a3a
        cc_puppet._autostart_puppet(LOG)
Packit bc9a3a
        expected_calls = [mock.call(
Packit bc9a3a
            ['/sbin/chkconfig', 'puppet', 'on'], capture=False)]
Packit bc9a3a
        self.assertEqual(expected_calls, m_util.subp.call_args_list)
Packit bc9a3a
Packit bc9a3a
Packit bc9a3a
@mock.patch('cloudinit.config.cc_puppet._autostart_puppet')
Packit bc9a3a
class TestPuppetHandle(CiTestCase):
Packit bc9a3a
Packit bc9a3a
    with_logs = True
Packit bc9a3a
Packit bc9a3a
    def setUp(self):
Packit bc9a3a
        super(TestPuppetHandle, self).setUp()
Packit bc9a3a
        self.new_root = self.tmp_dir()
Packit bc9a3a
        self.conf = self.tmp_path('puppet.conf')
Packit bc9a3a
        self.csr_attributes_path = self.tmp_path('csr_attributes.yaml')
Packit bc9a3a
Packit bc9a3a
    def _get_cloud(self, distro):
Packit bc9a3a
        paths = helpers.Paths({'templates_dir': self.new_root})
Packit bc9a3a
        cls = distros.fetch(distro)
Packit bc9a3a
        mydist = cls(distro, {}, paths)
Packit bc9a3a
        myds = DataSourceNone.DataSourceNone({}, mydist, paths)
Packit bc9a3a
        return cloud.Cloud(myds, paths, {}, mydist, None)
Packit bc9a3a
Packit bc9a3a
    def test_handler_skips_missing_puppet_key_in_cloudconfig(self, m_auto):
Packit bc9a3a
        """Cloud-config containing no 'puppet' key is skipped."""
Packit bc9a3a
        mycloud = self._get_cloud('ubuntu')
Packit bc9a3a
        cfg = {}
Packit bc9a3a
        cc_puppet.handle('notimportant', cfg, mycloud, LOG, None)
Packit bc9a3a
        self.assertIn(
Packit bc9a3a
            "no 'puppet' configuration found", self.logs.getvalue())
Packit bc9a3a
        self.assertEqual(0, m_auto.call_count)
Packit bc9a3a
Packit bc9a3a
    @mock.patch('cloudinit.config.cc_puppet.util.subp')
Packit bc9a3a
    def test_handler_puppet_config_starts_puppet_service(self, m_subp, m_auto):
Packit bc9a3a
        """Cloud-config 'puppet' configuration starts puppet."""
Packit bc9a3a
        mycloud = self._get_cloud('ubuntu')
Packit bc9a3a
        cfg = {'puppet': {'install': False}}
Packit bc9a3a
        cc_puppet.handle('notimportant', cfg, mycloud, LOG, None)
Packit bc9a3a
        self.assertEqual(1, m_auto.call_count)
Packit bc9a3a
        self.assertEqual(
Packit bc9a3a
            [mock.call(['service', 'puppet', 'start'], capture=False)],
Packit bc9a3a
            m_subp.call_args_list)
Packit bc9a3a
Packit bc9a3a
    @mock.patch('cloudinit.config.cc_puppet.util.subp')
Packit bc9a3a
    def test_handler_empty_puppet_config_installs_puppet(self, m_subp, m_auto):
Packit bc9a3a
        """Cloud-config empty 'puppet' configuration installs latest puppet."""
Packit bc9a3a
        mycloud = self._get_cloud('ubuntu')
Packit bc9a3a
        mycloud.distro = mock.MagicMock()
Packit bc9a3a
        cfg = {'puppet': {}}
Packit bc9a3a
        cc_puppet.handle('notimportant', cfg, mycloud, LOG, None)
Packit bc9a3a
        self.assertEqual(
Packit bc9a3a
            [mock.call(('puppet', None))],
Packit bc9a3a
            mycloud.distro.install_packages.call_args_list)
Packit bc9a3a
Packit bc9a3a
    @mock.patch('cloudinit.config.cc_puppet.util.subp')
Packit bc9a3a
    def test_handler_puppet_config_installs_puppet_on_true(self, m_subp, _):
Packit bc9a3a
        """Cloud-config with 'puppet' key installs when 'install' is True."""
Packit bc9a3a
        mycloud = self._get_cloud('ubuntu')
Packit bc9a3a
        mycloud.distro = mock.MagicMock()
Packit bc9a3a
        cfg = {'puppet': {'install': True}}
Packit bc9a3a
        cc_puppet.handle('notimportant', cfg, mycloud, LOG, None)
Packit bc9a3a
        self.assertEqual(
Packit bc9a3a
            [mock.call(('puppet', None))],
Packit bc9a3a
            mycloud.distro.install_packages.call_args_list)
Packit bc9a3a
Packit bc9a3a
    @mock.patch('cloudinit.config.cc_puppet.util.subp')
Packit bc9a3a
    def test_handler_puppet_config_installs_puppet_version(self, m_subp, _):
Packit bc9a3a
        """Cloud-config 'puppet' configuration can specify a version."""
Packit bc9a3a
        mycloud = self._get_cloud('ubuntu')
Packit bc9a3a
        mycloud.distro = mock.MagicMock()
Packit bc9a3a
        cfg = {'puppet': {'version': '3.8'}}
Packit bc9a3a
        cc_puppet.handle('notimportant', cfg, mycloud, LOG, None)
Packit bc9a3a
        self.assertEqual(
Packit bc9a3a
            [mock.call(('puppet', '3.8'))],
Packit bc9a3a
            mycloud.distro.install_packages.call_args_list)
Packit bc9a3a
Packit bc9a3a
    @mock.patch('cloudinit.config.cc_puppet.util.subp')
Packit bc9a3a
    def test_handler_puppet_config_updates_puppet_conf(self, m_subp, m_auto):
Packit bc9a3a
        """When 'conf' is provided update values in PUPPET_CONF_PATH."""
Packit bc9a3a
        mycloud = self._get_cloud('ubuntu')
Packit bc9a3a
        cfg = {
Packit bc9a3a
            'puppet': {
Packit bc9a3a
                'conf': {'agent': {'server': 'puppetmaster.example.org'}}}}
Packit bc9a3a
        util.write_file(self.conf, '[agent]\nserver = origpuppet\nother = 3')
Packit bc9a3a
        puppet_conf_path = 'cloudinit.config.cc_puppet.PUPPET_CONF_PATH'
Packit bc9a3a
        mycloud.distro = mock.MagicMock()
Packit bc9a3a
        with mock.patch(puppet_conf_path, self.conf):
Packit bc9a3a
            cc_puppet.handle('notimportant', cfg, mycloud, LOG, None)
Packit bc9a3a
        content = util.load_file(self.conf)
Packit bc9a3a
        expected = '[agent]\nserver = puppetmaster.example.org\nother = 3\n\n'
Packit bc9a3a
        self.assertEqual(expected, content)
Packit bc9a3a
Packit bc9a3a
    @mock.patch('cloudinit.config.cc_puppet.util.subp')
Packit bc9a3a
    def test_handler_puppet_writes_csr_attributes_file(self, m_subp, m_auto):
Packit bc9a3a
        """When csr_attributes is provided
Packit bc9a3a
            creates file in PUPPET_CSR_ATTRIBUTES_PATH."""
Packit bc9a3a
        mycloud = self._get_cloud('ubuntu')
Packit bc9a3a
        mycloud.distro = mock.MagicMock()
Packit bc9a3a
        cfg = {
Packit bc9a3a
            'puppet': {
Packit bc9a3a
              'csr_attributes': {
Packit bc9a3a
                'custom_attributes': {
Packit bc9a3a
                  '1.2.840.113549.1.9.7': '342thbjkt82094y0ut'
Packit bc9a3a
                                          'hhor289jnqthpc2290'},
Packit bc9a3a
                'extension_requests': {
Packit bc9a3a
                  'pp_uuid': 'ED803750-E3C7-44F5-BB08-41A04433FE2E',
Packit bc9a3a
                  'pp_image_name': 'my_ami_image',
Packit bc9a3a
                  'pp_preshared_key': '342thbjkt82094y0uthhor289jnqthpc2290'}
Packit bc9a3a
                }}}
Packit bc9a3a
        csr_attributes = 'cloudinit.config.cc_puppet.' \
Packit bc9a3a
                         'PUPPET_CSR_ATTRIBUTES_PATH'
Packit bc9a3a
        with mock.patch(csr_attributes, self.csr_attributes_path):
Packit bc9a3a
            cc_puppet.handle('notimportant', cfg, mycloud, LOG, None)
Packit bc9a3a
        content = util.load_file(self.csr_attributes_path)
Packit bc9a3a
        expected = textwrap.dedent("""\
Packit bc9a3a
            custom_attributes:
Packit bc9a3a
              1.2.840.113549.1.9.7: 342thbjkt82094y0uthhor289jnqthpc2290
Packit bc9a3a
            extension_requests:
Packit bc9a3a
              pp_image_name: my_ami_image
Packit bc9a3a
              pp_preshared_key: 342thbjkt82094y0uthhor289jnqthpc2290
Packit bc9a3a
              pp_uuid: ED803750-E3C7-44F5-BB08-41A04433FE2E
Packit bc9a3a
            """)
Packit bc9a3a
        self.assertEqual(expected, content)