diff options
Diffstat (limited to 'tests/unittests/test_handler')
25 files changed, 199 insertions, 698 deletions
| diff --git a/tests/unittests/test_handler/test_handler_apt_configure_sources_list_v1.py b/tests/unittests/test_handler/test_handler_apt_configure_sources_list_v1.py index 23bd6e10..69009a44 100644 --- a/tests/unittests/test_handler/test_handler_apt_configure_sources_list_v1.py +++ b/tests/unittests/test_handler/test_handler_apt_configure_sources_list_v1.py @@ -7,11 +7,7 @@ import logging  import os  import shutil  import tempfile - -try: -    from unittest import mock -except ImportError: -    import mock +from unittest import mock  from cloudinit import cloud  from cloudinit import distros @@ -78,7 +74,7 @@ class TestAptSourceConfigSourceList(t_help.FilesystemMockingTestCase):          get_rel = rpatcher.start()          get_rel.return_value = {'codename': "fakerelease"}          self.addCleanup(rpatcher.stop) -        apatcher = mock.patch("cloudinit.util.get_architecture") +        apatcher = mock.patch("cloudinit.util.get_dpkg_architecture")          get_arch = apatcher.start()          get_arch.return_value = 'amd64'          self.addCleanup(apatcher.stop) diff --git a/tests/unittests/test_handler/test_handler_apt_configure_sources_list_v3.py b/tests/unittests/test_handler/test_handler_apt_configure_sources_list_v3.py index f7608c28..0aa3d51a 100644 --- a/tests/unittests/test_handler/test_handler_apt_configure_sources_list_v3.py +++ b/tests/unittests/test_handler/test_handler_apt_configure_sources_list_v3.py @@ -7,12 +7,8 @@ import logging  import os  import shutil  import tempfile - -try: -    from unittest import mock -except ImportError: -    import mock -from mock import call +from unittest import mock +from unittest.mock import call  from cloudinit import cloud  from cloudinit import distros @@ -106,7 +102,7 @@ class TestAptSourceConfigSourceList(t_help.FilesystemMockingTestCase):          get_rel = rpatcher.start()          get_rel.return_value = {'codename': "fakerel"}          self.addCleanup(rpatcher.stop) -        apatcher = mock.patch("cloudinit.util.get_architecture") +        apatcher = mock.patch("cloudinit.util.get_dpkg_architecture")          get_arch = apatcher.start()          get_arch.return_value = 'amd64'          self.addCleanup(apatcher.stop) diff --git a/tests/unittests/test_handler/test_handler_apt_source_v1.py b/tests/unittests/test_handler/test_handler_apt_source_v1.py index a3132fbd..866752ef 100644 --- a/tests/unittests/test_handler/test_handler_apt_source_v1.py +++ b/tests/unittests/test_handler/test_handler_apt_source_v1.py @@ -9,12 +9,8 @@ import os  import re  import shutil  import tempfile - -try: -    from unittest import mock -except ImportError: -    import mock -from mock import call +from unittest import mock +from unittest.mock import call  from cloudinit.config import cc_apt_configure  from cloudinit import gpg @@ -77,7 +73,7 @@ class TestAptSourceConfig(TestCase):          get_rel = rpatcher.start()          get_rel.return_value = {'codename': self.release}          self.addCleanup(rpatcher.stop) -        apatcher = mock.patch("cloudinit.util.get_architecture") +        apatcher = mock.patch("cloudinit.util.get_dpkg_architecture")          get_arch = apatcher.start()          get_arch.return_value = 'amd64'          self.addCleanup(apatcher.stop) diff --git a/tests/unittests/test_handler/test_handler_apt_source_v3.py b/tests/unittests/test_handler/test_handler_apt_source_v3.py index 90fe6eed..90949b6d 100644 --- a/tests/unittests/test_handler/test_handler_apt_source_v3.py +++ b/tests/unittests/test_handler/test_handler_apt_source_v3.py @@ -11,13 +11,8 @@ import shutil  import socket  import tempfile -from unittest import TestCase - -try: -    from unittest import mock -except ImportError: -    import mock -from mock import call +from unittest import TestCase, mock +from unittest.mock import call  from cloudinit import cloud  from cloudinit import distros @@ -453,14 +448,14 @@ class TestAptSourceConfig(t_help.FilesystemMockingTestCase):          self.assertFalse(os.path.isfile(self.aptlistfile2))          self.assertFalse(os.path.isfile(self.aptlistfile3)) -    @mock.patch("cloudinit.config.cc_apt_configure.util.get_architecture") -    def test_apt_v3_list_rename(self, m_get_architecture): +    @mock.patch("cloudinit.config.cc_apt_configure.util.get_dpkg_architecture") +    def test_apt_v3_list_rename(self, m_get_dpkg_architecture):          """test_apt_v3_list_rename - Test find mirror and apt list renaming"""          pre = "/var/lib/apt/lists"          # filenames are archive dependent          arch = 's390x' -        m_get_architecture.return_value = arch +        m_get_dpkg_architecture.return_value = arch          component = "ubuntu-ports"          archive = "ports.ubuntu.com" @@ -487,16 +482,17 @@ class TestAptSourceConfig(t_help.FilesystemMockingTestCase):          with mock.patch.object(os, 'rename') as mockren:              with mock.patch.object(glob, 'glob',                                     return_value=[fromfn]): -                cc_apt_configure.rename_apt_lists(mirrors, TARGET) +                cc_apt_configure.rename_apt_lists(mirrors, TARGET, arch)          mockren.assert_any_call(fromfn, tofn) -    @mock.patch("cloudinit.config.cc_apt_configure.util.get_architecture") -    def test_apt_v3_list_rename_non_slash(self, m_get_architecture): +    @mock.patch("cloudinit.config.cc_apt_configure.util.get_dpkg_architecture") +    def test_apt_v3_list_rename_non_slash(self, m_get_dpkg_architecture):          target = os.path.join(self.tmp, "rename_non_slash")          apt_lists_d = os.path.join(target, "./" + cc_apt_configure.APT_LISTS) -        m_get_architecture.return_value = 'amd64' +        arch = 'amd64' +        m_get_dpkg_architecture.return_value = arch          mirror_path = "some/random/path/"          primary = "http://test.ubuntu.com/" + mirror_path @@ -532,7 +528,7 @@ class TestAptSourceConfig(t_help.FilesystemMockingTestCase):              fpath = os.path.join(apt_lists_d, opre + suff)              util.write_file(fpath, content=fpath) -        cc_apt_configure.rename_apt_lists(mirrors, target) +        cc_apt_configure.rename_apt_lists(mirrors, target, arch)          found = sorted(os.listdir(apt_lists_d))          self.assertEqual(expected, found) @@ -625,10 +621,12 @@ class TestAptSourceConfig(t_help.FilesystemMockingTestCase):          self.assertEqual(mirrors['SECURITY'],                           smir) -    @mock.patch("cloudinit.config.cc_apt_configure.util.get_architecture") -    def test_apt_v3_get_def_mir_non_intel_no_arch(self, m_get_architecture): +    @mock.patch("cloudinit.config.cc_apt_configure.util.get_dpkg_architecture") +    def test_apt_v3_get_def_mir_non_intel_no_arch( +        self, m_get_dpkg_architecture +    ):          arch = 'ppc64el' -        m_get_architecture.return_value = arch +        m_get_dpkg_architecture.return_value = arch          expected = {'PRIMARY': 'http://ports.ubuntu.com/ubuntu-ports',                      'SECURITY': 'http://ports.ubuntu.com/ubuntu-ports'}          self.assertEqual(expected, cc_apt_configure.get_default_mirrors()) @@ -998,6 +996,17 @@ deb http://ubuntu.com/ubuntu/ xenial-proposed main""")  class TestDebconfSelections(TestCase): +    @mock.patch("cloudinit.config.cc_apt_configure.util.subp") +    def test_set_sel_appends_newline_if_absent(self, m_subp): +        """Automatically append a newline to debconf-set-selections config.""" +        selections = b'some/setting boolean true' +        cc_apt_configure.debconf_set_selections(selections=selections) +        cc_apt_configure.debconf_set_selections(selections=selections + b'\n') +        m_call = mock.call( +            ['debconf-set-selections'], data=selections + b'\n', capture=True, +            target=None) +        self.assertEqual([m_call, m_call], m_subp.call_args_list) +      @mock.patch("cloudinit.config.cc_apt_configure.debconf_set_selections")      def test_no_set_sel_if_none_to_set(self, m_set_sel):          cc_apt_configure.apply_debconf_selections({'foo': 'bar'}) diff --git a/tests/unittests/test_handler/test_handler_ca_certs.py b/tests/unittests/test_handler/test_handler_ca_certs.py index 06e14db0..5b4105dd 100644 --- a/tests/unittests/test_handler/test_handler_ca_certs.py +++ b/tests/unittests/test_handler/test_handler_ca_certs.py @@ -11,12 +11,9 @@ import logging  import shutil  import tempfile  import unittest +from unittest import mock  try: -    from unittest import mock -except ImportError: -    import mock -try:      from contextlib import ExitStack  except ImportError:      from contextlib2 import ExitStack diff --git a/tests/unittests/test_handler/test_handler_chef.py b/tests/unittests/test_handler/test_handler_chef.py index b16532ea..2dab3a54 100644 --- a/tests/unittests/test_handler/test_handler_chef.py +++ b/tests/unittests/test_handler/test_handler_chef.py @@ -4,7 +4,6 @@ import httpretty  import json  import logging  import os -import six  from cloudinit import cloud  from cloudinit.config import cc_chef @@ -145,6 +144,7 @@ class TestChef(FilesystemMockingTestCase):          file_backup_path       "/var/backups/chef"          pid_file               "/var/run/chef/client.pid"          Chef::Log::Formatter.show_time = true +        encrypted_data_bag_secret  "/etc/chef/encrypted_data_bag_secret"          """          tpl_file = util.load_file('templates/chef_client.rb.tmpl')          self.patchUtils(self.tmp) @@ -157,6 +157,8 @@ class TestChef(FilesystemMockingTestCase):                  'validation_name': 'bob',                  'validation_key': "/etc/chef/vkey.pem",                  'validation_cert': "this is my cert", +                'encrypted_data_bag_secret': +                    '/etc/chef/encrypted_data_bag_secret'              },          }          cc_chef.handle('chef', cfg, self.fetch_cloud('ubuntu'), LOG, []) @@ -175,7 +177,7 @@ class TestChef(FilesystemMockingTestCase):                  continue              # the value from the cfg overrides that in the default              val = cfg['chef'].get(k, v) -            if isinstance(val, six.string_types): +            if isinstance(val, str):                  self.assertIn(val, c)          c = util.load_file(cc_chef.CHEF_FB_PATH)          self.assertEqual({}, json.loads(c)) diff --git a/tests/unittests/test_handler/test_handler_disk_setup.py b/tests/unittests/test_handler/test_handler_disk_setup.py index 5afcacaf..0e51f17a 100644 --- a/tests/unittests/test_handler/test_handler_disk_setup.py +++ b/tests/unittests/test_handler/test_handler_disk_setup.py @@ -222,4 +222,22 @@ class TestMkfsCommandHandling(CiTestCase):               '-L', 'without_cmd', '-F', 'are', 'added'],              shell=False) +    @mock.patch('cloudinit.config.cc_disk_setup.util.which') +    def test_mkswap(self, m_which, subp, *args): +        """mkfs observes extra_opts and overwrite settings when cmd is not +        present.""" +        m_which.side_effect = iter([None, '/sbin/mkswap']) +        cc_disk_setup.mkfs({ +            'filesystem': 'swap', +            'device': '/dev/xdb1', +            'label': 'swap', +            'overwrite': True, +        }) + +        self.assertEqual([mock.call('mkfs.swap'), mock.call('mkswap')], +                         m_which.call_args_list) +        subp.assert_called_once_with( +            ['/sbin/mkswap', '/dev/xdb1', '-L', 'swap', '-f'], shell=False) + +#  # vi: ts=4 expandtab diff --git a/tests/unittests/test_handler/test_handler_growpart.py b/tests/unittests/test_handler/test_handler_growpart.py index a3e46351..43b53745 100644 --- a/tests/unittests/test_handler/test_handler_growpart.py +++ b/tests/unittests/test_handler/test_handler_growpart.py @@ -11,12 +11,9 @@ import logging  import os  import re  import unittest +from unittest import mock  try: -    from unittest import mock -except ImportError: -    import mock -try:      from contextlib import ExitStack  except ImportError:      from contextlib2 import ExitStack @@ -52,6 +49,18 @@ growpart disk partition        Resize partition 1 on /dev/sda  """ +HELP_GPART = """ +usage: gpart add -t type [-a alignment] [-b start] <SNIP> geom +       gpart backup geom +       gpart bootcode [-b bootcode] [-p partcode -i index] [-f flags] geom +<SNIP> +       gpart resize -i index [-a alignment] [-s size] [-f flags] geom +       gpart restore [-lF] [-f flags] provider [...] +       gpart recover [-f flags] geom +       gpart help +<SNIP> +""" +  class TestDisabled(unittest.TestCase):      def setUp(self): @@ -97,8 +106,9 @@ class TestConfig(TestCase):              self.handle(self.name, config, self.cloud_init, self.log,                          self.args) -            mockobj.assert_called_once_with( -                ['growpart', '--help'], env={'LANG': 'C'}) +            mockobj.assert_has_calls([ +                mock.call(['growpart', '--help'], env={'LANG': 'C'}), +                mock.call(['gpart', 'help'], env={'LANG': 'C'}, rcs=[0, 1])])      @mock.patch.dict("os.environ", clear=True)      def test_no_resizers_mode_growpart_is_exception(self): @@ -124,6 +134,18 @@ class TestConfig(TestCase):              mockobj.assert_called_once_with(                  ['growpart', '--help'], env={'LANG': 'C'}) +    @mock.patch.dict("os.environ", clear=True) +    def test_mode_auto_falls_back_to_gpart(self): +        with mock.patch.object( +                util, 'subp', +                return_value=("", HELP_GPART)) as mockobj: +            ret = cc_growpart.resizer_factory(mode="auto") +            self.assertIsInstance(ret, cc_growpart.ResizeGpart) + +            mockobj.assert_has_calls([ +                mock.call(['growpart', '--help'], env={'LANG': 'C'}), +                mock.call(['gpart', 'help'], env={'LANG': 'C'}, rcs=[0, 1])]) +      def test_handle_with_no_growpart_entry(self):          # if no 'growpart' entry in config, then mode=auto should be used diff --git a/tests/unittests/test_handler/test_handler_locale.py b/tests/unittests/test_handler/test_handler_locale.py index e29a06f9..2b22559f 100644 --- a/tests/unittests/test_handler/test_handler_locale.py +++ b/tests/unittests/test_handler/test_handler_locale.py @@ -17,13 +17,12 @@ from cloudinit.tests import helpers as t_help  from configobj import ConfigObj -from six import BytesIO -  import logging -import mock  import os  import shutil  import tempfile +from io import BytesIO +from unittest import mock  LOG = logging.getLogger(__name__) diff --git a/tests/unittests/test_handler/test_handler_lxd.py b/tests/unittests/test_handler/test_handler_lxd.py index 2478ebc4..40b521e5 100644 --- a/tests/unittests/test_handler/test_handler_lxd.py +++ b/tests/unittests/test_handler/test_handler_lxd.py @@ -5,10 +5,7 @@ from cloudinit.sources import DataSourceNoCloud  from cloudinit import (distros, helpers, cloud)  from cloudinit.tests import helpers as t_help -try: -    from unittest import mock -except ImportError: -    import mock +from unittest import mock  class TestLxd(t_help.CiTestCase): @@ -62,7 +59,7 @@ class TestLxd(t_help.CiTestCase):          cc_lxd.handle('cc_lxd', self.lxd_cfg, cc, self.logger, [])          self.assertFalse(m_maybe_clean.called)          install_pkg = cc.distro.install_packages.call_args_list[0][0][0] -        self.assertEqual(sorted(install_pkg), ['lxd', 'zfs']) +        self.assertEqual(sorted(install_pkg), ['lxd', 'zfsutils-linux'])      @mock.patch("cloudinit.config.cc_lxd.maybe_cleanup_default")      @mock.patch("cloudinit.config.cc_lxd.util") diff --git a/tests/unittests/test_handler/test_handler_mcollective.py b/tests/unittests/test_handler/test_handler_mcollective.py index 7eec7352..c013a538 100644 --- a/tests/unittests/test_handler/test_handler_mcollective.py +++ b/tests/unittests/test_handler/test_handler_mcollective.py @@ -10,8 +10,8 @@ import configobj  import logging  import os  import shutil -from six import BytesIO  import tempfile +from io import BytesIO  LOG = logging.getLogger(__name__) diff --git a/tests/unittests/test_handler/test_handler_mounts.py b/tests/unittests/test_handler/test_handler_mounts.py index 8fea6c2a..05ac183e 100644 --- a/tests/unittests/test_handler/test_handler_mounts.py +++ b/tests/unittests/test_handler/test_handler_mounts.py @@ -1,16 +1,12 @@  # This file is part of cloud-init. See LICENSE file for license information.  import os.path +from unittest import mock  from cloudinit.config import cc_mounts  from cloudinit.tests import helpers as test_helpers -try: -    from unittest import mock -except ImportError: -    import mock -  class TestSanitizeDevname(test_helpers.FilesystemMockingTestCase): @@ -154,7 +150,15 @@ class TestFstabHandling(test_helpers.FilesystemMockingTestCase):                         return_value=True)          self.add_patch('cloudinit.config.cc_mounts.util.subp', -                       'mock_util_subp') +                       'm_util_subp') + +        self.add_patch('cloudinit.config.cc_mounts.util.mounts', +                       'mock_util_mounts', +                       return_value={ +                           '/dev/sda1': {'fstype': 'ext4', +                                         'mountpoint': '/', +                                         'opts': 'rw,relatime,discard' +                                         }})          self.mock_cloud = mock.Mock()          self.mock_log = mock.Mock() @@ -173,6 +177,18 @@ class TestFstabHandling(test_helpers.FilesystemMockingTestCase):          return dev +    def test_swap_integrity(self): +        '''Ensure that the swap file is correctly created and can +        swapon successfully. Fixing the corner case of: +        kernel: swapon: swapfile has holes''' + +        fstab = '/swap.img swap swap defaults 0 0\n' + +        with open(cc_mounts.FSTAB_PATH, 'w') as fd: +            fd.write(fstab) +        cc = {'swap': ['filename: /swap.img', 'size: 512', 'maxsize: 512']} +        cc_mounts.handle(None, cc, self.mock_cloud, self.mock_log, []) +      def test_fstab_no_swap_device(self):          '''Ensure that cloud-init adds a discovered swap partition          to /etc/fstab.''' @@ -230,4 +246,24 @@ class TestFstabHandling(test_helpers.FilesystemMockingTestCase):              fstab_new_content = fd.read()              self.assertEqual(fstab_expected_content, fstab_new_content) +    def test_no_change_fstab_sets_needs_mount_all(self): +        '''verify unchanged fstab entries are mounted if not call mount -a''' +        fstab_original_content = ( +            'LABEL=cloudimg-rootfs / ext4 defaults 0 0\n' +            'LABEL=UEFI /boot/efi vfat defaults 0 0\n' +            '/dev/vdb /mnt auto defaults,noexec,comment=cloudconfig 0 2\n' +        ) +        fstab_expected_content = fstab_original_content +        cc = {'mounts': [ +                 ['/dev/vdb', '/mnt', 'auto', 'defaults,noexec']]} +        with open(cc_mounts.FSTAB_PATH, 'w') as fd: +            fd.write(fstab_original_content) +        with open(cc_mounts.FSTAB_PATH, 'r') as fd: +            fstab_new_content = fd.read() +            self.assertEqual(fstab_expected_content, fstab_new_content) +        cc_mounts.handle(None, cc, self.mock_cloud, self.mock_log, []) +        self.m_util_subp.assert_has_calls([ +            mock.call(['mount', '-a']), +            mock.call(['systemctl', 'daemon-reload'])]) +  # vi: ts=4 expandtab diff --git a/tests/unittests/test_handler/test_handler_ntp.py b/tests/unittests/test_handler/test_handler_ntp.py index 0f22e579..463d892a 100644 --- a/tests/unittests/test_handler/test_handler_ntp.py +++ b/tests/unittests/test_handler/test_handler_ntp.py @@ -268,17 +268,22 @@ class TestNtp(FilesystemMockingTestCase):                                                   template_fn=template_fn)                  content = util.load_file(confpath)                  if client in ['ntp', 'chrony']: -                    expected_servers = '\n'.join([ -                        'server {0} iburst'.format(srv) for srv in servers]) +                    content_lines = content.splitlines() +                    expected_servers = [ +                        'server {0} iburst'.format(srv) for srv in servers]                      print('distro=%s client=%s' % (distro, client)) -                    self.assertIn(expected_servers, content, -                                  ('failed to render {0} conf' -                                   ' for distro:{1}'.format(client, distro))) -                    expected_pools = '\n'.join([ -                        'pool {0} iburst'.format(pool) for pool in pools]) -                    self.assertIn(expected_pools, content, -                                  ('failed to render {0} conf' -                                   ' for distro:{1}'.format(client, distro))) +                    for sline in expected_servers: +                        self.assertIn(sline, content_lines, +                                      ('failed to render {0} conf' +                                       ' for distro:{1}'.format(client, +                                                                distro))) +                    expected_pools = [ +                        'pool {0} iburst'.format(pool) for pool in pools] +                    for pline in expected_pools: +                        self.assertIn(pline, content_lines, +                                      ('failed to render {0} conf' +                                       ' for distro:{1}'.format(client, +                                                                distro)))                  elif client == 'systemd-timesyncd':                      expected_content = (                          "# cloud-init generated file\n" + diff --git a/tests/unittests/test_handler/test_handler_power_state.py b/tests/unittests/test_handler/test_handler_power_state.py index 3c726422..0d8d17b9 100644 --- a/tests/unittests/test_handler/test_handler_power_state.py +++ b/tests/unittests/test_handler/test_handler_power_state.py @@ -90,7 +90,7 @@ class TestCheckCondition(t_help.TestCase):          mocklog = mock.Mock()          self.assertEqual(              psc.check_condition(self.cmd_with_exit(2), mocklog), False) -        self.assertEqual(mocklog.warn.call_count, 1) +        self.assertEqual(mocklog.warning.call_count, 1)  def check_lps_ret(psc_return, mode=None): diff --git a/tests/unittests/test_handler/test_handler_puppet.py b/tests/unittests/test_handler/test_handler_puppet.py index 0b6e3b58..1494177d 100644 --- a/tests/unittests/test_handler/test_handler_puppet.py +++ b/tests/unittests/test_handler/test_handler_puppet.py @@ -6,6 +6,7 @@ from cloudinit import (distros, helpers, cloud, util)  from cloudinit.tests.helpers import CiTestCase, mock  import logging +import textwrap  LOG = logging.getLogger(__name__) @@ -64,6 +65,7 @@ class TestPuppetHandle(CiTestCase):          super(TestPuppetHandle, self).setUp()          self.new_root = self.tmp_dir()          self.conf = self.tmp_path('puppet.conf') +        self.csr_attributes_path = self.tmp_path('csr_attributes.yaml')      def _get_cloud(self, distro):          paths = helpers.Paths({'templates_dir': self.new_root}) @@ -140,3 +142,35 @@ class TestPuppetHandle(CiTestCase):          content = util.load_file(self.conf)          expected = '[agent]\nserver = puppetmaster.example.org\nother = 3\n\n'          self.assertEqual(expected, content) + +    @mock.patch('cloudinit.config.cc_puppet.util.subp') +    def test_handler_puppet_writes_csr_attributes_file(self, m_subp, m_auto): +        """When csr_attributes is provided +            creates file in PUPPET_CSR_ATTRIBUTES_PATH.""" +        mycloud = self._get_cloud('ubuntu') +        mycloud.distro = mock.MagicMock() +        cfg = { +            'puppet': { +              'csr_attributes': { +                'custom_attributes': { +                  '1.2.840.113549.1.9.7': '342thbjkt82094y0ut' +                                          'hhor289jnqthpc2290'}, +                'extension_requests': { +                  'pp_uuid': 'ED803750-E3C7-44F5-BB08-41A04433FE2E', +                  'pp_image_name': 'my_ami_image', +                  'pp_preshared_key': '342thbjkt82094y0uthhor289jnqthpc2290'} +                }}} +        csr_attributes = 'cloudinit.config.cc_puppet.' \ +                         'PUPPET_CSR_ATTRIBUTES_PATH' +        with mock.patch(csr_attributes, self.csr_attributes_path): +            cc_puppet.handle('notimportant', cfg, mycloud, LOG, None) +        content = util.load_file(self.csr_attributes_path) +        expected = textwrap.dedent("""\ +            custom_attributes: +              1.2.840.113549.1.9.7: 342thbjkt82094y0uthhor289jnqthpc2290 +            extension_requests: +              pp_image_name: my_ami_image +              pp_preshared_key: 342thbjkt82094y0uthhor289jnqthpc2290 +              pp_uuid: ED803750-E3C7-44F5-BB08-41A04433FE2E +            """) +        self.assertEqual(expected, content) diff --git a/tests/unittests/test_handler/test_handler_resizefs.py b/tests/unittests/test_handler/test_handler_resizefs.py index 35187847..db9a0414 100644 --- a/tests/unittests/test_handler/test_handler_resizefs.py +++ b/tests/unittests/test_handler/test_handler_resizefs.py @@ -147,7 +147,7 @@ class TestResizefs(CiTestCase):      def test_resize_ufs_cmd_return(self):          mount_point = '/'          devpth = '/dev/sda2' -        self.assertEqual(('growfs', '-y', devpth), +        self.assertEqual(('growfs', '-y', mount_point),                           _resize_ufs(mount_point, devpth))      @mock.patch('cloudinit.util.is_container', return_value=False) diff --git a/tests/unittests/test_handler/test_handler_seed_random.py b/tests/unittests/test_handler/test_handler_seed_random.py index f60dedc2..abecc53b 100644 --- a/tests/unittests/test_handler/test_handler_seed_random.py +++ b/tests/unittests/test_handler/test_handler_seed_random.py @@ -12,8 +12,7 @@ from cloudinit.config import cc_seed_random  import gzip  import tempfile - -from six import BytesIO +from io import BytesIO  from cloudinit import cloud  from cloudinit import distros diff --git a/tests/unittests/test_handler/test_handler_set_hostname.py b/tests/unittests/test_handler/test_handler_set_hostname.py index d09ec23a..58abf51a 100644 --- a/tests/unittests/test_handler/test_handler_set_hostname.py +++ b/tests/unittests/test_handler/test_handler_set_hostname.py @@ -13,8 +13,8 @@ from configobj import ConfigObj  import logging  import os  import shutil -from six import BytesIO  import tempfile +from io import BytesIO  LOG = logging.getLogger(__name__) diff --git a/tests/unittests/test_handler/test_handler_snappy.py b/tests/unittests/test_handler/test_handler_snappy.py deleted file mode 100644 index 76b79c29..00000000 --- a/tests/unittests/test_handler/test_handler_snappy.py +++ /dev/null @@ -1,601 +0,0 @@ -# This file is part of cloud-init. See LICENSE file for license information. - -from cloudinit.config.cc_snappy import ( -    makeop, get_package_ops, render_snap_op) -from cloudinit.config.cc_snap_config import ( -    add_assertions, add_snap_user, ASSERTIONS_FILE) -from cloudinit import (distros, helpers, cloud, util) -from cloudinit.config.cc_snap_config import handle as snap_handle -from cloudinit.sources import DataSourceNone -from cloudinit.tests.helpers import FilesystemMockingTestCase, mock - -from cloudinit.tests import helpers as t_help - -import logging -import os -import shutil -import tempfile -import textwrap -import yaml - -LOG = logging.getLogger(__name__) -ALLOWED = (dict, list, int, str) - - -class TestInstallPackages(t_help.TestCase): -    def setUp(self): -        super(TestInstallPackages, self).setUp() -        self.unapply = [] - -        # by default 'which' has nothing in its path -        self.apply_patches([(util, 'subp', self._subp)]) -        self.subp_called = [] -        self.snapcmds = [] -        self.tmp = tempfile.mkdtemp(prefix="TestInstallPackages") - -    def tearDown(self): -        apply_patches([i for i in reversed(self.unapply)]) -        shutil.rmtree(self.tmp) - -    def apply_patches(self, patches): -        ret = apply_patches(patches) -        self.unapply += ret - -    def populate_tmp(self, files): -        return t_help.populate_dir(self.tmp, files) - -    def _subp(self, *args, **kwargs): -        # supports subp calling with cmd as args or kwargs -        if 'args' not in kwargs: -            kwargs['args'] = args[0] -        self.subp_called.append(kwargs) -        args = kwargs['args'] -        # here we basically parse the snappy command invoked -        # and append to snapcmds a list of (mode, pkg, config) -        if args[0:2] == ['snappy', 'config']: -            if args[3] == "-": -                config = kwargs.get('data', '') -            else: -                with open(args[3], "rb") as fp: -                    config = yaml.safe_load(fp.read()) -            self.snapcmds.append(['config', args[2], config]) -        elif args[0:2] == ['snappy', 'install']: -            config = None -            pkg = None -            for arg in args[2:]: -                if arg.startswith("-"): -                    continue -                if not pkg: -                    pkg = arg -                elif not config: -                    cfgfile = arg -                    if cfgfile == "-": -                        config = kwargs.get('data', '') -                    elif cfgfile: -                        with open(cfgfile, "rb") as fp: -                            config = yaml.safe_load(fp.read()) -            self.snapcmds.append(['install', pkg, config]) - -    def test_package_ops_1(self): -        ret = get_package_ops( -            packages=['pkg1', 'pkg2', 'pkg3'], -            configs={'pkg2': b'mycfg2'}, installed=[]) -        self.assertEqual( -            ret, [makeop('install', 'pkg1', None, None), -                  makeop('install', 'pkg2', b'mycfg2', None), -                  makeop('install', 'pkg3', None, None)]) - -    def test_package_ops_config_only(self): -        ret = get_package_ops( -            packages=None, -            configs={'pkg2': b'mycfg2'}, installed=['pkg1', 'pkg2']) -        self.assertEqual( -            ret, [makeop('config', 'pkg2', b'mycfg2')]) - -    def test_package_ops_install_and_config(self): -        ret = get_package_ops( -            packages=['pkg3', 'pkg2'], -            configs={'pkg2': b'mycfg2', 'xinstalled': b'xcfg'}, -            installed=['xinstalled']) -        self.assertEqual( -            ret, [makeop('install', 'pkg3'), -                  makeop('install', 'pkg2', b'mycfg2'), -                  makeop('config', 'xinstalled', b'xcfg')]) - -    def test_package_ops_install_long_config_short(self): -        # a package can be installed by full name, but have config by short -        cfg = {'k1': 'k2'} -        ret = get_package_ops( -            packages=['config-example.canonical'], -            configs={'config-example': cfg}, installed=[]) -        self.assertEqual( -            ret, [makeop('install', 'config-example.canonical', cfg)]) - -    def test_package_ops_with_file(self): -        self.populate_tmp( -            {"snapf1.snap": b"foo1", "snapf1.config": b"snapf1cfg", -             "snapf2.snap": b"foo2", "foo.bar": "ignored"}) -        ret = get_package_ops( -            packages=['pkg1'], configs={}, installed=[], fspath=self.tmp) -        self.assertEqual( -            ret, -            [makeop_tmpd(self.tmp, 'install', 'snapf1', path="snapf1.snap", -                         cfgfile="snapf1.config"), -             makeop_tmpd(self.tmp, 'install', 'snapf2', path="snapf2.snap"), -             makeop('install', 'pkg1')]) - -    def test_package_ops_common_filename(self): -        # fish package name from filename -        # package names likely look like: pkgname.namespace_version_arch.snap - -        # find filenames -        self.populate_tmp( -            {"pkg-ws.smoser_0.3.4_all.snap": "pkg-ws-snapdata", -             "pkg-ws.config": "pkg-ws-config", -             "pkg1.smoser_1.2.3_all.snap": "pkg1.snapdata", -             "pkg1.smoser.config": "pkg1.smoser.config-data", -             "pkg1.config": "pkg1.config-data", -             "pkg2.smoser_0.0_amd64.snap": "pkg2-snapdata", -             "pkg2.smoser_0.0_amd64.config": "pkg2.config"}) - -        ret = get_package_ops( -            packages=[], configs={}, installed=[], fspath=self.tmp) -        self.assertEqual( -            ret, -            [makeop_tmpd(self.tmp, 'install', 'pkg-ws.smoser', -                         path="pkg-ws.smoser_0.3.4_all.snap", -                         cfgfile="pkg-ws.config"), -             makeop_tmpd(self.tmp, 'install', 'pkg1.smoser', -                         path="pkg1.smoser_1.2.3_all.snap", -                         cfgfile="pkg1.smoser.config"), -             makeop_tmpd(self.tmp, 'install', 'pkg2.smoser', -                         path="pkg2.smoser_0.0_amd64.snap", -                         cfgfile="pkg2.smoser_0.0_amd64.config"), -             ]) - -    def test_package_ops_config_overrides_file(self): -        # config data overrides local file .config -        self.populate_tmp( -            {"snapf1.snap": b"foo1", "snapf1.config": b"snapf1cfg"}) -        ret = get_package_ops( -            packages=[], configs={'snapf1': 'snapf1cfg-config'}, -            installed=[], fspath=self.tmp) -        self.assertEqual( -            ret, [makeop_tmpd(self.tmp, 'install', 'snapf1', -                              path="snapf1.snap", config="snapf1cfg-config")]) - -    def test_package_ops_namespacing(self): -        cfgs = { -            'config-example': {'k1': 'v1'}, -            'pkg1': {'p1': 'p2'}, -            'ubuntu-core': {'c1': 'c2'}, -            'notinstalled.smoser': {'s1': 's2'}, -        } -        ret = get_package_ops( -            packages=['config-example.canonical'], configs=cfgs, -            installed=['config-example.smoser', 'pkg1.canonical', -                       'ubuntu-core']) - -        expected_configs = [ -            makeop('config', 'pkg1', config=cfgs['pkg1']), -            makeop('config', 'ubuntu-core', config=cfgs['ubuntu-core'])] -        expected_installs = [ -            makeop('install', 'config-example.canonical', -                   config=cfgs['config-example'])] - -        installs = [i for i in ret if i['op'] == 'install'] -        configs = [c for c in ret if c['op'] == 'config'] - -        self.assertEqual(installs, expected_installs) -        # configs are not ordered -        self.assertEqual(len(configs), len(expected_configs)) -        self.assertTrue(all(found in expected_configs for found in configs)) - -    def test_render_op_localsnap(self): -        self.populate_tmp({"snapf1.snap": b"foo1"}) -        op = makeop_tmpd(self.tmp, 'install', 'snapf1', -                         path='snapf1.snap') -        render_snap_op(**op) -        self.assertEqual( -            self.snapcmds, [['install', op['path'], None]]) - -    def test_render_op_localsnap_localconfig(self): -        self.populate_tmp( -            {"snapf1.snap": b"foo1", 'snapf1.config': b'snapf1cfg'}) -        op = makeop_tmpd(self.tmp, 'install', 'snapf1', -                         path='snapf1.snap', cfgfile='snapf1.config') -        render_snap_op(**op) -        self.assertEqual( -            self.snapcmds, [['install', op['path'], 'snapf1cfg']]) - -    def test_render_op_snap(self): -        op = makeop('install', 'snapf1') -        render_snap_op(**op) -        self.assertEqual( -            self.snapcmds, [['install', 'snapf1', None]]) - -    def test_render_op_snap_config(self): -        mycfg = {'key1': 'value1'} -        name = "snapf1" -        op = makeop('install', name, config=mycfg) -        render_snap_op(**op) -        self.assertEqual( -            self.snapcmds, [['install', name, {'config': {name: mycfg}}]]) - -    def test_render_op_config_bytes(self): -        name = "snapf1" -        mycfg = b'myconfig' -        op = makeop('config', name, config=mycfg) -        render_snap_op(**op) -        self.assertEqual( -            self.snapcmds, [['config', 'snapf1', {'config': {name: mycfg}}]]) - -    def test_render_op_config_string(self): -        name = 'snapf1' -        mycfg = 'myconfig: foo\nhisconfig: bar\n' -        op = makeop('config', name, config=mycfg) -        render_snap_op(**op) -        self.assertEqual( -            self.snapcmds, [['config', 'snapf1', {'config': {name: mycfg}}]]) - -    def test_render_op_config_dict(self): -        # config entry for package can be a dict, not a string blob -        mycfg = {'foo': 'bar'} -        name = 'snapf1' -        op = makeop('config', name, config=mycfg) -        render_snap_op(**op) -        # snapcmds is a list of 3-entry lists. data_found will be the -        # blob of data in the file in 'snappy install --config=<file>' -        data_found = self.snapcmds[0][2] -        self.assertEqual(mycfg, data_found['config'][name]) - -    def test_render_op_config_list(self): -        # config entry for package can be a list, not a string blob -        mycfg = ['foo', 'bar', 'wark', {'f1': 'b1'}] -        name = "snapf1" -        op = makeop('config', name, config=mycfg) -        render_snap_op(**op) -        data_found = self.snapcmds[0][2] -        self.assertEqual(mycfg, data_found['config'][name]) - -    def test_render_op_config_int(self): -        # config entry for package can be a list, not a string blob -        mycfg = 1 -        name = 'snapf1' -        op = makeop('config', name, config=mycfg) -        render_snap_op(**op) -        data_found = self.snapcmds[0][2] -        self.assertEqual(mycfg, data_found['config'][name]) - -    def test_render_long_configs_short(self): -        # install a namespaced package should have un-namespaced config -        mycfg = {'k1': 'k2'} -        name = 'snapf1' -        op = makeop('install', name + ".smoser", config=mycfg) -        render_snap_op(**op) -        data_found = self.snapcmds[0][2] -        self.assertEqual(mycfg, data_found['config'][name]) - -    def test_render_does_not_pad_cfgfile(self): -        # package_ops with cfgfile should not modify --file= content. -        mydata = "foo1: bar1\nk: [l1, l2, l3]\n" -        self.populate_tmp( -            {"snapf1.snap": b"foo1", "snapf1.config": mydata.encode()}) -        ret = get_package_ops( -            packages=[], configs={}, installed=[], fspath=self.tmp) -        self.assertEqual( -            ret, -            [makeop_tmpd(self.tmp, 'install', 'snapf1', path="snapf1.snap", -                         cfgfile="snapf1.config")]) - -        # now the op was ok, but test that render didn't mess it up. -        render_snap_op(**ret[0]) -        data_found = self.snapcmds[0][2] -        # the data found gets loaded in the snapcmd interpretation -        # so this comparison is a bit lossy, but input to snappy config -        # is expected to be yaml loadable, so it should be OK. -        self.assertEqual(yaml.safe_load(mydata), data_found) - - -class TestSnapConfig(FilesystemMockingTestCase): - -    SYSTEM_USER_ASSERTION = textwrap.dedent(""" -    type: system-user -    authority-id: LqvZQdfyfGlYvtep4W6Oj6pFXP9t1Ksp -    brand-id: LqvZQdfyfGlYvtep4W6Oj6pFXP9t1Ksp -    email: foo@bar.com -    password: $6$E5YiAuMIPAwX58jG$miomhVNui/vf7f/3ctB/f0RWSKFxG0YXzrJ9rtJ1ikvzt -    series: -      - 16 -    since: 2016-09-10T16:34:00+03:00 -    until: 2017-11-10T16:34:00+03:00 -    username: baz -    sign-key-sha3-384: RuVvnp4n52GilycjfbbTCI3_L8Y6QlIE75wxMc0KzGV3AUQqVd9GuXoj - -    AcLBXAQAAQoABgUCV/UU1wAKCRBKnlMoJQLkZVeLD/9/+hIeVywtzsDA3oxl+P+u9D13y9s6svP -    Jd6Wnf4FTw6sq1GjBE4ZA7lrwSaRCUJ9Vcsvf2q9OGPY7mOb2TBxaDe0PbUMjrSrqllSSQwhpNI -    zG+NxkkKuxsUmLzFa+k9m6cyojNbw5LFhQZBQCGlr3JYqC0tIREq/UsZxj+90TUC87lDJwkU8GF -    s4CR+rejZj4itIcDcVxCSnJH6hv6j2JrJskJmvObqTnoOlcab+JXdamXqbldSP3UIhWoyVjqzkj -    +to7mXgx+cCUA9+ngNCcfUG+1huGGTWXPCYkZ78HvErcRlIdeo4d3xwtz1cl/w3vYnq9og1XwsP -    Yfetr3boig2qs1Y+j/LpsfYBYncgWjeDfAB9ZZaqQz/oc8n87tIPZDJHrusTlBfop8CqcM4xsKS -    d+wnEY8e/F24mdSOYmS1vQCIDiRU3MKb6x138Ud6oHXFlRBbBJqMMctPqWDunWzb5QJ7YR0I39q -    BrnEqv5NE0G7w6HOJ1LSPG5Hae3P4T2ea+ATgkb03RPr3KnXnzXg4TtBbW1nytdlgoNc/BafE1H -    f3NThcq9gwX4xWZ2PAWnqVPYdDMyCtzW3Ck+o6sIzx+dh4gDLPHIi/6TPe/pUuMop9CBpWwez7V -    v1z+1+URx6Xlq3Jq18y5pZ6fY3IDJ6km2nQPMzcm4Q==""") - -    ACCOUNT_ASSERTION = textwrap.dedent(""" -    type: account-key -    authority-id: canonical -    revision: 2 -    public-key-sha3-384: BWDEoaqyr25nF5SNCvEv2v7QnM9QsfCc0PBMYD_i2NGSQ32EF2d4D0 -    account-id: canonical -    name: store -    since: 2016-04-01T00:00:00.0Z -    body-length: 717 -    sign-key-sha3-384: -CvQKAwRQ5h3Ffn10FILJoEZUXOv6km9FwA80-Rcj-f-6jadQ89VRswH - -    AcbBTQRWhcGAARAA0KKYYQWuHOrsFVi4p4l7ZzSvX7kLgJFFeFgOkzdWKBTHEnsMKjl5mefFe9j -    qe8NlmJdfY7BenP7XeBtwKp700H/t9lLrZbpTNAPHXYxEWFJp5bPqIcJYBZ+29oLVLN1Tc5X482 -    vCiDqL8+pPYqBrK2fNlyPlNNSum9wI70rDDL4r6FVvr+osTnGejibdV8JphWX+lrSQDnRSdM8KJ -    UM43vTgLGTi9W54oRhsA2OFexRfRksTrnqGoonCjqX5wO3OFSaMDzMsO2MJ/hPfLgDqw53qjzuK -    Iec9OL3k5basvu2cj5u9tKwVFDsCKK2GbKUsWWpx2KTpOifmhmiAbzkTHbH9KaoMS7p0kJwhTQG -    o9aJ9VMTWHJc/NCBx7eu451u6d46sBPCXS/OMUh2766fQmoRtO1OwCTxsRKG2kkjbMn54UdFULl -    VfzvyghMNRKIezsEkmM8wueTqGUGZWa6CEZqZKwhe/PROxOPYzqtDH18XZknbU1n5lNb7vNfem9 -    2ai+3+JyFnW9UhfvpVF7gzAgdyCqNli4C6BIN43uwoS8HkykocZS/+Gv52aUQ/NZ8BKOHLw+7an -    Q0o8W9ltSLZbEMxFIPSN0stiZlkXAp6DLyvh1Y4wXSynDjUondTpej2fSvSlCz/W5v5V7qA4nIc -    vUvV7RjVzv17ut0AEQEAAQ== - -    AcLDXAQAAQoABgUCV83k9QAKCRDUpVvql9g3IBT8IACKZ7XpiBZ3W4lqbPssY6On81WmxQLtvsM -    WTp6zZpl/wWOSt2vMNUk9pvcmrNq1jG9CuhDfWFLGXEjcrrmVkN3YuCOajMSPFCGrxsIBLSRt/b -    nrKykdLAAzMfG8rP1d82bjFFiIieE+urQ0Kcv09Jtdvavq3JT1Tek5mFyyfhHNlQEKOzWqmRWiL -    3c3VOZUs1ZD8TSlnuq/x+5T0X0YtOyGjSlVxk7UybbyMNd6MZfNaMpIG4x+mxD3KHFtBAC7O6kL -    eX3i6j5nCY5UABfA3DZEAkWP4zlmdBEOvZ9t293NaDdOpzsUHRkoi0Zez/9BHQ/kwx/uNc2WqrY -    inCmu16JGNeXqsyinnLl7Ghn2RwhvDMlLxF6RTx8xdx1yk6p3PBTwhZMUvuZGjUtN/AG8BmVJQ1 -    rsGSRkkSywvnhVJRB2sudnrMBmNS2goJbzSbmJnOlBrd2WsV0T9SgNMWZBiov3LvU4o2SmAb6b+ -    rYwh8H5QHcuuYJuxDjFhPswIp6Wes5T6hUicf3SWtObcDS4HSkVS4ImBjjX9YgCuFy7QdnooOWE -    aPvkRw3XCVeYq0K6w9GRsk1YFErD4XmXXZjDYY650MX9v42Sz5MmphHV8jdIY5ssbadwFSe2rCQ -    6UX08zy7RsIb19hTndE6ncvSNDChUR9eEnCm73eYaWTWTnq1cxdVP/s52r8uss++OYOkPWqh5nO -    haRn7INjH/yZX4qXjNXlTjo0PnHH0q08vNKDwLhxS+D9du+70FeacXFyLIbcWllSbJ7DmbumGpF -    yYbtj3FDDPzachFQdIG3lSt+cSUGeyfSs6wVtc3cIPka/2Urx7RprfmoWSI6+a5NcLdj0u2z8O9 -    HxeIgxDpg/3gT8ZIuFKePMcLDM19Fh/p0ysCsX+84B9chNWtsMSmIaE57V+959MVtsLu7SLb9gi -    skrju0pQCwsu2wHMLTNd1f3PTHmrr49hxetTus07HSQUApMtAGKzQilF5zqFjbyaTd4xgQbd+PK -    CjFyzQTDOcUhXpuUGt/IzlqiFfsCsmbj2K4KdSNYMlqIgZ3Azu8KvZLIhsyN7v5vNIZSPfEbjde -    ClU9r0VRiJmtYBUjcSghD9LWn+yRLwOxhfQVjm0cBwIt5R/yPF/qC76yIVuWUtM5Y2/zJR1J8OF -    qWchvlImHtvDzS9FQeLyzJAOjvZ2CnWp2gILgUz0WQdOk1Dq8ax7KS9BQ42zxw9EZAEPw3PEFqR -    IQsRTONp+iVS8YxSmoYZjDlCgRMWUmawez/Fv5b9Fb/XkO5Eq4e+KfrpUujXItaipb+tV8h5v3t -    oG3Ie3WOHrVjCLXIdYslpL1O4nadqR6Xv58pHj6k""") - -    test_assertions = [ACCOUNT_ASSERTION, SYSTEM_USER_ASSERTION] - -    def setUp(self): -        super(TestSnapConfig, self).setUp() -        self.subp = util.subp -        self.new_root = tempfile.mkdtemp() -        self.addCleanup(shutil.rmtree, self.new_root) - -    def _get_cloud(self, distro, metadata=None): -        self.patchUtils(self.new_root) -        paths = helpers.Paths({}) -        cls = distros.fetch(distro) -        mydist = cls(distro, {}, paths) -        myds = DataSourceNone.DataSourceNone({}, mydist, paths) -        if metadata: -            myds.metadata.update(metadata) -        return cloud.Cloud(myds, paths, {}, mydist, None) - -    @mock.patch('cloudinit.util.write_file') -    @mock.patch('cloudinit.util.subp') -    def test_snap_config_add_assertions(self, msubp, mwrite): -        add_assertions(self.test_assertions) - -        combined = "\n".join(self.test_assertions) -        mwrite.assert_any_call(ASSERTIONS_FILE, combined.encode('utf-8')) -        msubp.assert_called_with(['snap', 'ack', ASSERTIONS_FILE], -                                 capture=True) - -    def test_snap_config_add_assertions_empty(self): -        self.assertRaises(ValueError, add_assertions, []) - -    def test_add_assertions_nonlist(self): -        self.assertRaises(ValueError, add_assertions, {}) - -    @mock.patch('cloudinit.util.write_file') -    @mock.patch('cloudinit.util.subp') -    def test_snap_config_add_assertions_ack_fails(self, msubp, mwrite): -        msubp.side_effect = [util.ProcessExecutionError("Invalid assertion")] -        self.assertRaises(util.ProcessExecutionError, add_assertions, -                          self.test_assertions) - -    @mock.patch('cloudinit.config.cc_snap_config.add_assertions') -    @mock.patch('cloudinit.config.cc_snap_config.util') -    def test_snap_config_handle_no_config(self, mock_util, mock_add): -        cfg = {} -        cc = self._get_cloud('ubuntu') -        cc.distro = mock.MagicMock() -        cc.distro.name = 'ubuntu' -        mock_util.which.return_value = None -        snap_handle('snap_config', cfg, cc, LOG, None) -        mock_add.assert_not_called() - -    def test_snap_config_add_snap_user_no_config(self): -        usercfg = add_snap_user(cfg=None) -        self.assertIsNone(usercfg) - -    def test_snap_config_add_snap_user_not_dict(self): -        cfg = ['foobar'] -        self.assertRaises(ValueError, add_snap_user, cfg) - -    def test_snap_config_add_snap_user_no_email(self): -        cfg = {'assertions': [], 'known': True} -        usercfg = add_snap_user(cfg=cfg) -        self.assertIsNone(usercfg) - -    @mock.patch('cloudinit.config.cc_snap_config.util') -    def test_snap_config_add_snap_user_email_only(self, mock_util): -        email = 'janet@planetjanet.org' -        cfg = {'email': email} -        mock_util.which.return_value = None -        mock_util.system_is_snappy.return_value = True -        mock_util.subp.side_effect = [ -            ("false\n", ""),  # snap managed -        ] - -        usercfg = add_snap_user(cfg=cfg) - -        self.assertEqual(usercfg, {'snapuser': email, 'known': False}) - -    @mock.patch('cloudinit.config.cc_snap_config.util') -    def test_snap_config_add_snap_user_email_known(self, mock_util): -        email = 'janet@planetjanet.org' -        known = True -        cfg = {'email': email, 'known': known} -        mock_util.which.return_value = None -        mock_util.system_is_snappy.return_value = True -        mock_util.subp.side_effect = [ -            ("false\n", ""),  # snap managed -            (self.SYSTEM_USER_ASSERTION, ""),  # snap known system-user -        ] - -        usercfg = add_snap_user(cfg=cfg) - -        self.assertEqual(usercfg, {'snapuser': email, 'known': known}) - -    @mock.patch('cloudinit.config.cc_snap_config.add_assertions') -    @mock.patch('cloudinit.config.cc_snap_config.util') -    def test_snap_config_handle_system_not_snappy(self, mock_util, mock_add): -        cfg = {'snappy': {'assertions': self.test_assertions}} -        cc = self._get_cloud('ubuntu') -        cc.distro = mock.MagicMock() -        cc.distro.name = 'ubuntu' -        mock_util.which.return_value = None -        mock_util.system_is_snappy.return_value = False - -        snap_handle('snap_config', cfg, cc, LOG, None) - -        mock_add.assert_not_called() - -    @mock.patch('cloudinit.config.cc_snap_config.add_assertions') -    @mock.patch('cloudinit.config.cc_snap_config.util') -    def test_snap_config_handle_snapuser(self, mock_util, mock_add): -        email = 'janet@planetjanet.org' -        cfg = { -            'snappy': { -                'assertions': self.test_assertions, -                'email': email, -            } -        } -        cc = self._get_cloud('ubuntu') -        cc.distro = mock.MagicMock() -        cc.distro.name = 'ubuntu' -        mock_util.which.return_value = None -        mock_util.system_is_snappy.return_value = True -        mock_util.subp.side_effect = [ -            ("false\n", ""),  # snap managed -        ] - -        snap_handle('snap_config', cfg, cc, LOG, None) - -        mock_add.assert_called_with(self.test_assertions) -        usercfg = {'snapuser': email, 'known': False} -        cc.distro.create_user.assert_called_with(email, **usercfg) - -    @mock.patch('cloudinit.config.cc_snap_config.add_assertions') -    @mock.patch('cloudinit.config.cc_snap_config.util') -    def test_snap_config_handle_snapuser_known(self, mock_util, mock_add): -        email = 'janet@planetjanet.org' -        cfg = { -            'snappy': { -                'assertions': self.test_assertions, -                'email': email, -                'known': True, -            } -        } -        cc = self._get_cloud('ubuntu') -        cc.distro = mock.MagicMock() -        cc.distro.name = 'ubuntu' -        mock_util.which.return_value = None -        mock_util.system_is_snappy.return_value = True -        mock_util.subp.side_effect = [ -            ("false\n", ""),  # snap managed -            (self.SYSTEM_USER_ASSERTION, ""),  # snap known system-user -        ] - -        snap_handle('snap_config', cfg, cc, LOG, None) - -        mock_add.assert_called_with(self.test_assertions) -        usercfg = {'snapuser': email, 'known': True} -        cc.distro.create_user.assert_called_with(email, **usercfg) - -    @mock.patch('cloudinit.config.cc_snap_config.add_assertions') -    @mock.patch('cloudinit.config.cc_snap_config.util') -    def test_snap_config_handle_snapuser_known_managed(self, mock_util, -                                                       mock_add): -        email = 'janet@planetjanet.org' -        cfg = { -            'snappy': { -                'assertions': self.test_assertions, -                'email': email, -                'known': True, -            } -        } -        cc = self._get_cloud('ubuntu') -        cc.distro = mock.MagicMock() -        cc.distro.name = 'ubuntu' -        mock_util.which.return_value = None -        mock_util.system_is_snappy.return_value = True -        mock_util.subp.side_effect = [ -            ("true\n", ""),  # snap managed -        ] - -        snap_handle('snap_config', cfg, cc, LOG, None) - -        mock_add.assert_called_with(self.test_assertions) -        cc.distro.create_user.assert_not_called() - -    @mock.patch('cloudinit.config.cc_snap_config.add_assertions') -    @mock.patch('cloudinit.config.cc_snap_config.util') -    def test_snap_config_handle_snapuser_known_no_assertion(self, mock_util, -                                                            mock_add): -        email = 'janet@planetjanet.org' -        cfg = { -            'snappy': { -                'assertions': [self.ACCOUNT_ASSERTION], -                'email': email, -                'known': True, -            } -        } -        cc = self._get_cloud('ubuntu') -        cc.distro = mock.MagicMock() -        cc.distro.name = 'ubuntu' -        mock_util.which.return_value = None -        mock_util.system_is_snappy.return_value = True -        mock_util.subp.side_effect = [ -            ("true\n", ""),  # snap managed -            ("", ""),        # snap known system-user -        ] - -        snap_handle('snap_config', cfg, cc, LOG, None) - -        mock_add.assert_called_with([self.ACCOUNT_ASSERTION]) -        cc.distro.create_user.assert_not_called() - - -def makeop_tmpd(tmpd, op, name, config=None, path=None, cfgfile=None): -    if cfgfile: -        cfgfile = os.path.sep.join([tmpd, cfgfile]) -    if path: -        path = os.path.sep.join([tmpd, path]) -    return(makeop(op=op, name=name, config=config, path=path, cfgfile=cfgfile)) - - -def apply_patches(patches): -    ret = [] -    for (ref, name, replace) in patches: -        if replace is None: -            continue -        orig = getattr(ref, name) -        setattr(ref, name, replace) -        ret.append((ref, name, orig)) -    return ret - -# vi: ts=4 expandtab diff --git a/tests/unittests/test_handler/test_handler_spacewalk.py b/tests/unittests/test_handler/test_handler_spacewalk.py index ddbf4a79..410e6f77 100644 --- a/tests/unittests/test_handler/test_handler_spacewalk.py +++ b/tests/unittests/test_handler/test_handler_spacewalk.py @@ -6,11 +6,7 @@ from cloudinit import util  from cloudinit.tests import helpers  import logging - -try: -    from unittest import mock -except ImportError: -    import mock +from unittest import mock  LOG = logging.getLogger(__name__) diff --git a/tests/unittests/test_handler/test_handler_timezone.py b/tests/unittests/test_handler/test_handler_timezone.py index 27eedded..50c45363 100644 --- a/tests/unittests/test_handler/test_handler_timezone.py +++ b/tests/unittests/test_handler/test_handler_timezone.py @@ -18,8 +18,8 @@ from cloudinit.tests import helpers as t_help  from configobj import ConfigObj  import logging  import shutil -from six import BytesIO  import tempfile +from io import BytesIO  LOG = logging.getLogger(__name__) diff --git a/tests/unittests/test_handler/test_handler_write_files.py b/tests/unittests/test_handler/test_handler_write_files.py index bc8756ca..ed0a4da2 100644 --- a/tests/unittests/test_handler/test_handler_write_files.py +++ b/tests/unittests/test_handler/test_handler_write_files.py @@ -1,17 +1,16 @@  # This file is part of cloud-init. See LICENSE file for license information. -from cloudinit.config.cc_write_files import write_files, decode_perms -from cloudinit import log as logging -from cloudinit import util - -from cloudinit.tests.helpers import CiTestCase, FilesystemMockingTestCase -  import base64  import gzip +import io  import shutil -import six  import tempfile +from cloudinit import log as logging +from cloudinit import util +from cloudinit.config.cc_write_files import write_files, decode_perms +from cloudinit.tests.helpers import CiTestCase, FilesystemMockingTestCase +  LOG = logging.getLogger(__name__)  YAML_TEXT = """ @@ -138,7 +137,7 @@ class TestDecodePerms(CiTestCase):  def _gzip_bytes(data): -    buf = six.BytesIO() +    buf = io.BytesIO()      fp = None      try:          fp = gzip.GzipFile(fileobj=buf, mode="wb") diff --git a/tests/unittests/test_handler/test_handler_yum_add_repo.py b/tests/unittests/test_handler/test_handler_yum_add_repo.py index b90a3af3..0675bd8f 100644 --- a/tests/unittests/test_handler/test_handler_yum_add_repo.py +++ b/tests/unittests/test_handler/test_handler_yum_add_repo.py @@ -7,8 +7,8 @@ from cloudinit.tests import helpers  import logging  import shutil -from six import StringIO  import tempfile +from io import StringIO  LOG = logging.getLogger(__name__) diff --git a/tests/unittests/test_handler/test_handler_zypper_add_repo.py b/tests/unittests/test_handler/test_handler_zypper_add_repo.py index 72ab6c08..9685ff28 100644 --- a/tests/unittests/test_handler/test_handler_zypper_add_repo.py +++ b/tests/unittests/test_handler/test_handler_zypper_add_repo.py @@ -2,6 +2,7 @@  import glob  import os +from io import StringIO  from cloudinit.config import cc_zypper_add_repo  from cloudinit import util @@ -10,7 +11,6 @@ from cloudinit.tests import helpers  from cloudinit.tests.helpers import mock  import logging -from six import StringIO  LOG = logging.getLogger(__name__) diff --git a/tests/unittests/test_handler/test_schema.py b/tests/unittests/test_handler/test_schema.py index 1bad07f6..987a89c9 100644 --- a/tests/unittests/test_handler/test_schema.py +++ b/tests/unittests/test_handler/test_schema.py @@ -10,7 +10,7 @@ from cloudinit.tests.helpers import CiTestCase, mock, skipUnlessJsonSchema  from copy import copy  import os -from six import StringIO +from io import StringIO  from textwrap import dedent  from yaml import safe_load @@ -28,6 +28,7 @@ class GetSchemaTest(CiTestCase):                  'cc_runcmd',                  'cc_snap',                  'cc_ubuntu_advantage', +                'cc_ubuntu_drivers',                  'cc_zypper_add_repo'              ],              [subschema['id'] for subschema in schema['allOf']]) | 
