diff options
Diffstat (limited to 'cloudinit/cmd/devel/tests/test_logs.py')
| -rw-r--r-- | cloudinit/cmd/devel/tests/test_logs.py | 43 | 
1 files changed, 37 insertions, 6 deletions
| diff --git a/cloudinit/cmd/devel/tests/test_logs.py b/cloudinit/cmd/devel/tests/test_logs.py index 98b47560..4951797b 100644 --- a/cloudinit/cmd/devel/tests/test_logs.py +++ b/cloudinit/cmd/devel/tests/test_logs.py @@ -1,13 +1,17 @@  # This file is part of cloud-init. See LICENSE file for license information. -from cloudinit.cmd.devel import logs -from cloudinit.util import ensure_dir, load_file, subp, write_file -from cloudinit.tests.helpers import FilesystemMockingTestCase, wrap_and_call  from datetime import datetime -import mock  import os +from six import StringIO + +from cloudinit.cmd.devel import logs +from cloudinit.sources import INSTANCE_JSON_SENSITIVE_FILE +from cloudinit.tests.helpers import ( +    FilesystemMockingTestCase, mock, wrap_and_call) +from cloudinit.util import ensure_dir, load_file, subp, write_file +@mock.patch('cloudinit.cmd.devel.logs.os.getuid')  class TestCollectLogs(FilesystemMockingTestCase):      def setUp(self): @@ -15,14 +19,29 @@ class TestCollectLogs(FilesystemMockingTestCase):          self.new_root = self.tmp_dir()          self.run_dir = self.tmp_path('run', self.new_root) -    def test_collect_logs_creates_tarfile(self): +    def test_collect_logs_with_userdata_requires_root_user(self, m_getuid): +        """collect-logs errors when non-root user collects userdata .""" +        m_getuid.return_value = 100  # non-root +        output_tarfile = self.tmp_path('logs.tgz') +        with mock.patch('sys.stderr', new_callable=StringIO) as m_stderr: +            self.assertEqual( +                1, logs.collect_logs(output_tarfile, include_userdata=True)) +        self.assertEqual( +            'To include userdata, root user is required.' +            ' Try sudo cloud-init collect-logs\n', +            m_stderr.getvalue()) + +    def test_collect_logs_creates_tarfile(self, m_getuid):          """collect-logs creates a tarfile with all related cloud-init info.""" +        m_getuid.return_value = 100          log1 = self.tmp_path('cloud-init.log', self.new_root)          write_file(log1, 'cloud-init-log')          log2 = self.tmp_path('cloud-init-output.log', self.new_root)          write_file(log2, 'cloud-init-output-log')          ensure_dir(self.run_dir)          write_file(self.tmp_path('results.json', self.run_dir), 'results') +        write_file(self.tmp_path(INSTANCE_JSON_SENSITIVE_FILE, self.run_dir), +                   'sensitive')          output_tarfile = self.tmp_path('logs.tgz')          date = datetime.utcnow().date().strftime('%Y-%m-%d') @@ -59,6 +78,11 @@ class TestCollectLogs(FilesystemMockingTestCase):          # unpack the tarfile and check file contents          subp(['tar', 'zxvf', output_tarfile, '-C', self.new_root])          out_logdir = self.tmp_path(date_logdir, self.new_root) +        self.assertFalse( +            os.path.exists( +                os.path.join(out_logdir, 'run', 'cloud-init', +                             INSTANCE_JSON_SENSITIVE_FILE)), +            'Unexpected file found: %s' % INSTANCE_JSON_SENSITIVE_FILE)          self.assertEqual(              '0.7fake\n',              load_file(os.path.join(out_logdir, 'dpkg-version'))) @@ -82,8 +106,9 @@ class TestCollectLogs(FilesystemMockingTestCase):                  os.path.join(out_logdir, 'run', 'cloud-init', 'results.json')))          fake_stderr.write.assert_any_call('Wrote %s\n' % output_tarfile) -    def test_collect_logs_includes_optional_userdata(self): +    def test_collect_logs_includes_optional_userdata(self, m_getuid):          """collect-logs include userdata when --include-userdata is set.""" +        m_getuid.return_value = 0          log1 = self.tmp_path('cloud-init.log', self.new_root)          write_file(log1, 'cloud-init-log')          log2 = self.tmp_path('cloud-init-output.log', self.new_root) @@ -92,6 +117,8 @@ class TestCollectLogs(FilesystemMockingTestCase):          write_file(userdata, 'user-data')          ensure_dir(self.run_dir)          write_file(self.tmp_path('results.json', self.run_dir), 'results') +        write_file(self.tmp_path(INSTANCE_JSON_SENSITIVE_FILE, self.run_dir), +                   'sensitive')          output_tarfile = self.tmp_path('logs.tgz')          date = datetime.utcnow().date().strftime('%Y-%m-%d') @@ -132,4 +159,8 @@ class TestCollectLogs(FilesystemMockingTestCase):          self.assertEqual(              'user-data',              load_file(os.path.join(out_logdir, 'user-data.txt'))) +        self.assertEqual( +            'sensitive', +            load_file(os.path.join(out_logdir, 'run', 'cloud-init', +                                   INSTANCE_JSON_SENSITIVE_FILE)))          fake_stderr.write.assert_any_call('Wrote %s\n' % output_tarfile) | 
