Blame tests/unittests/test_rh_subscription.py

Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service a04d08
"""Tests for registering RHEL subscription via rh_subscription."""
Packit Service a04d08
Packit Service a04d08
import copy
Packit Service a04d08
import logging
Packit Service a04d08
Packit Service a04d08
from cloudinit.config import cc_rh_subscription
Packit Service 9bfd13
from cloudinit import subp
Packit Service a04d08
Packit Service a04d08
from cloudinit.tests.helpers import CiTestCase, mock
Packit Service a04d08
Packit Service a04d08
SUBMGR = cc_rh_subscription.SubscriptionManager
Packit Service a04d08
SUB_MAN_CLI = 'cloudinit.config.cc_rh_subscription._sub_man_cli'
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
@mock.patch(SUB_MAN_CLI)
Packit Service a04d08
class GoodTests(CiTestCase):
Packit Service a04d08
    with_logs = True
Packit Service a04d08
Packit Service a04d08
    def setUp(self):
Packit Service a04d08
        super(GoodTests, self).setUp()
Packit Service a04d08
        self.name = "cc_rh_subscription"
Packit Service a04d08
        self.cloud_init = None
Packit Service a04d08
        self.log = logging.getLogger("good_tests")
Packit Service a04d08
        self.args = []
Packit Service a04d08
        self.handle = cc_rh_subscription.handle
Packit Service a04d08
Packit Service a04d08
        self.config = {'rh_subscription':
Packit Service a04d08
                       {'username': 'scooby@do.com',
Packit Service a04d08
                        'password': 'scooby-snacks'
Packit Service a04d08
                        }}
Packit Service a04d08
        self.config_full = {'rh_subscription':
Packit Service a04d08
                            {'username': 'scooby@do.com',
Packit Service a04d08
                             'password': 'scooby-snacks',
Packit Service a04d08
                             'auto-attach': True,
Packit Service a04d08
                             'service-level': 'self-support',
Packit Service a04d08
                             'add-pool': ['pool1', 'pool2', 'pool3'],
Packit Service a04d08
                             'enable-repo': ['repo1', 'repo2', 'repo3'],
Packit Service a04d08
                             'disable-repo': ['repo4', 'repo5']
Packit Service a04d08
                             }}
Packit Service a04d08
Packit Service a04d08
    def test_already_registered(self, m_sman_cli):
Packit Service a04d08
        '''
Packit Service a04d08
        Emulates a system that is already registered. Ensure it gets
Packit Service a04d08
        a non-ProcessExecution error from is_registered()
Packit Service a04d08
        '''
Packit Service a04d08
        self.handle(self.name, self.config, self.cloud_init,
Packit Service a04d08
                    self.log, self.args)
Packit Service a04d08
        self.assertEqual(m_sman_cli.call_count, 1)
Packit Service a04d08
        self.assertIn('System is already registered', self.logs.getvalue())
Packit Service a04d08
Packit Service a04d08
    def test_simple_registration(self, m_sman_cli):
Packit Service a04d08
        '''
Packit Service a04d08
        Simple registration with username and password
Packit Service a04d08
        '''
Packit Service a04d08
        reg = "The system has been registered with ID:" \
Packit Service a04d08
              " 12345678-abde-abcde-1234-1234567890abc"
Packit Service 9bfd13
        m_sman_cli.side_effect = [subp.ProcessExecutionError, (reg, 'bar')]
Packit Service a04d08
        self.handle(self.name, self.config, self.cloud_init,
Packit Service a04d08
                    self.log, self.args)
Packit Service a04d08
        self.assertIn(mock.call(['identity']), m_sman_cli.call_args_list)
Packit Service a04d08
        self.assertIn(mock.call(['register', '--username=scooby@do.com',
Packit Service a04d08
                                 '--password=scooby-snacks'],
Packit Service a04d08
                                logstring_val=True),
Packit Service a04d08
                      m_sman_cli.call_args_list)
Packit Service a04d08
        self.assertIn('rh_subscription plugin completed successfully',
Packit Service a04d08
                      self.logs.getvalue())
Packit Service a04d08
        self.assertEqual(m_sman_cli.call_count, 2)
Packit Service a04d08
Packit Service a04d08
    @mock.patch.object(cc_rh_subscription.SubscriptionManager, "_getRepos")
Packit Service a04d08
    def test_update_repos_disable_with_none(self, m_get_repos, m_sman_cli):
Packit Service a04d08
        cfg = copy.deepcopy(self.config)
Packit Service a04d08
        m_get_repos.return_value = ([], ['repo1'])
Packit Service a04d08
        cfg['rh_subscription'].update(
Packit Service a04d08
            {'enable-repo': ['repo1'], 'disable-repo': None})
Packit Service a04d08
        mysm = cc_rh_subscription.SubscriptionManager(cfg)
Packit Service a04d08
        self.assertEqual(True, mysm.update_repos())
Packit Service a04d08
        m_get_repos.assert_called_with()
Packit Service a04d08
        self.assertEqual(m_sman_cli.call_args_list,
Packit Service a04d08
                         [mock.call(['repos', '--enable=repo1'])])
Packit Service a04d08
Packit Service a04d08
    def test_full_registration(self, m_sman_cli):
Packit Service a04d08
        '''
Packit Service a04d08
        Registration with auto-attach, service-level, adding pools,
Packit Service a04d08
        and enabling and disabling yum repos
Packit Service a04d08
        '''
Packit Service a04d08
        call_lists = []
Packit Service a04d08
        call_lists.append(['attach', '--pool=pool1', '--pool=pool3'])
Packit Service a04d08
        call_lists.append(['repos', '--disable=repo5', '--enable=repo2',
Packit Service a04d08
                           '--enable=repo3'])
Packit Service a04d08
        call_lists.append(['attach', '--auto', '--servicelevel=self-support'])
Packit Service a04d08
        reg = "The system has been registered with ID:" \
Packit Service a04d08
              " 12345678-abde-abcde-1234-1234567890abc"
Packit Service a04d08
        m_sman_cli.side_effect = [
Packit Service 9bfd13
            subp.ProcessExecutionError,
Packit Service a04d08
            (reg, 'bar'),
Packit Service a04d08
            ('Service level set to: self-support', ''),
Packit Service a04d08
            ('pool1\npool3\n', ''), ('pool2\n', ''), ('', ''),
Packit Service a04d08
            ('Repo ID: repo1\nRepo ID: repo5\n', ''),
Packit Service a04d08
            ('Repo ID: repo2\nRepo ID: repo3\nRepo ID: repo4', ''),
Packit Service a04d08
            ('', '')]
Packit Service a04d08
        self.handle(self.name, self.config_full, self.cloud_init,
Packit Service a04d08
                    self.log, self.args)
Packit Service a04d08
        self.assertEqual(m_sman_cli.call_count, 9)
Packit Service a04d08
        for call in call_lists:
Packit Service a04d08
            self.assertIn(mock.call(call), m_sman_cli.call_args_list)
Packit Service a04d08
        self.assertIn("rh_subscription plugin completed successfully",
Packit Service a04d08
                      self.logs.getvalue())
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
@mock.patch(SUB_MAN_CLI)
Packit Service a04d08
class TestBadInput(CiTestCase):
Packit Service a04d08
    with_logs = True
Packit Service a04d08
    name = "cc_rh_subscription"
Packit Service a04d08
    cloud_init = None
Packit Service a04d08
    log = logging.getLogger("bad_tests")
Packit Service a04d08
    args = []
Packit Service a04d08
    SM = cc_rh_subscription.SubscriptionManager
Packit Service a04d08
    reg = "The system has been registered with ID:" \
Packit Service a04d08
          " 12345678-abde-abcde-1234-1234567890abc"
Packit Service a04d08
Packit Service a04d08
    config_no_password = {'rh_subscription':
Packit Service a04d08
                          {'username': 'scooby@do.com'
Packit Service a04d08
                           }}
Packit Service a04d08
Packit Service a04d08
    config_no_key = {'rh_subscription':
Packit Service a04d08
                     {'activation-key': '1234abcde',
Packit Service a04d08
                      }}
Packit Service a04d08
Packit Service a04d08
    config_service = {'rh_subscription':
Packit Service a04d08
                      {'username': 'scooby@do.com',
Packit Service a04d08
                       'password': 'scooby-snacks',
Packit Service a04d08
                       'service-level': 'self-support'
Packit Service a04d08
                       }}
Packit Service a04d08
Packit Service a04d08
    config_badpool = {'rh_subscription':
Packit Service a04d08
                      {'username': 'scooby@do.com',
Packit Service a04d08
                       'password': 'scooby-snacks',
Packit Service a04d08
                       'add-pool': 'not_a_list'
Packit Service a04d08
                       }}
Packit Service a04d08
    config_badrepo = {'rh_subscription':
Packit Service a04d08
                      {'username': 'scooby@do.com',
Packit Service a04d08
                       'password': 'scooby-snacks',
Packit Service a04d08
                       'enable-repo': 'not_a_list'
Packit Service a04d08
                       }}
Packit Service a04d08
    config_badkey = {'rh_subscription':
Packit Service a04d08
                     {'activation-key': 'abcdef1234',
Packit Service a04d08
                      'fookey': 'bar',
Packit Service a04d08
                      'org': '123',
Packit Service a04d08
                      }}
Packit Service a04d08
Packit Service a04d08
    def setUp(self):
Packit Service a04d08
        super(TestBadInput, self).setUp()
Packit Service a04d08
        self.handle = cc_rh_subscription.handle
Packit Service a04d08
Packit Service a04d08
    def assert_logged_warnings(self, warnings):
Packit Service a04d08
        logs = self.logs.getvalue()
Packit Service a04d08
        missing = [w for w in warnings if "WARNING: " + w not in logs]
Packit Service a04d08
        self.assertEqual([], missing, "Missing expected warnings.")
Packit Service a04d08
Packit Service a04d08
    def test_no_password(self, m_sman_cli):
Packit Service a04d08
        '''Attempt to register without the password key/value.'''
Packit Service 9bfd13
        m_sman_cli.side_effect = [subp.ProcessExecutionError,
Packit Service a04d08
                                  (self.reg, 'bar')]
Packit Service a04d08
        self.handle(self.name, self.config_no_password, self.cloud_init,
Packit Service a04d08
                    self.log, self.args)
Packit Service a04d08
        self.assertEqual(m_sman_cli.call_count, 0)
Packit Service a04d08
Packit Service a04d08
    def test_no_org(self, m_sman_cli):
Packit Service a04d08
        '''Attempt to register without the org key/value.'''
Packit Service 9bfd13
        m_sman_cli.side_effect = [subp.ProcessExecutionError]
Packit Service a04d08
        self.handle(self.name, self.config_no_key, self.cloud_init,
Packit Service a04d08
                    self.log, self.args)
Packit Service a04d08
        m_sman_cli.assert_called_with(['identity'])
Packit Service a04d08
        self.assertEqual(m_sman_cli.call_count, 1)
Packit Service a04d08
        self.assert_logged_warnings((
Packit Service a04d08
            'Unable to register system due to incomplete information.',
Packit Service a04d08
            'Use either activationkey and org *or* userid and password',
Packit Service a04d08
            'Registration failed or did not run completely',
Packit Service a04d08
            'rh_subscription plugin did not complete successfully'))
Packit Service a04d08
Packit Service a04d08
    def test_service_level_without_auto(self, m_sman_cli):
Packit Service a04d08
        '''Attempt to register using service-level without auto-attach key.'''
Packit Service 9bfd13
        m_sman_cli.side_effect = [subp.ProcessExecutionError,
Packit Service a04d08
                                  (self.reg, 'bar')]
Packit Service a04d08
        self.handle(self.name, self.config_service, self.cloud_init,
Packit Service a04d08
                    self.log, self.args)
Packit Service a04d08
        self.assertEqual(m_sman_cli.call_count, 1)
Packit Service a04d08
        self.assert_logged_warnings((
Packit Service a04d08
            'The service-level key must be used in conjunction with ',
Packit Service a04d08
            'rh_subscription plugin did not complete successfully'))
Packit Service a04d08
Packit Service a04d08
    def test_pool_not_a_list(self, m_sman_cli):
Packit Service a04d08
        '''
Packit Service a04d08
        Register with pools that are not in the format of a list
Packit Service a04d08
        '''
Packit Service 9bfd13
        m_sman_cli.side_effect = [subp.ProcessExecutionError,
Packit Service a04d08
                                  (self.reg, 'bar')]
Packit Service a04d08
        self.handle(self.name, self.config_badpool, self.cloud_init,
Packit Service a04d08
                    self.log, self.args)
Packit Service a04d08
        self.assertEqual(m_sman_cli.call_count, 2)
Packit Service a04d08
        self.assert_logged_warnings((
Packit Service a04d08
            'Pools must in the format of a list',
Packit Service a04d08
            'rh_subscription plugin did not complete successfully'))
Packit Service a04d08
Packit Service a04d08
    def test_repo_not_a_list(self, m_sman_cli):
Packit Service a04d08
        '''
Packit Service a04d08
        Register with repos that are not in the format of a list
Packit Service a04d08
        '''
Packit Service 9bfd13
        m_sman_cli.side_effect = [subp.ProcessExecutionError,
Packit Service a04d08
                                  (self.reg, 'bar')]
Packit Service a04d08
        self.handle(self.name, self.config_badrepo, self.cloud_init,
Packit Service a04d08
                    self.log, self.args)
Packit Service a04d08
        self.assertEqual(m_sman_cli.call_count, 2)
Packit Service a04d08
        self.assert_logged_warnings((
Packit Service a04d08
            'Repo IDs must in the format of a list.',
Packit Service a04d08
            'Unable to add or remove repos',
Packit Service a04d08
            'rh_subscription plugin did not complete successfully'))
Packit Service a04d08
Packit Service a04d08
    def test_bad_key_value(self, m_sman_cli):
Packit Service a04d08
        '''
Packit Service a04d08
        Attempt to register with a key that we don't know
Packit Service a04d08
        '''
Packit Service 9bfd13
        m_sman_cli.side_effect = [subp.ProcessExecutionError,
Packit Service a04d08
                                  (self.reg, 'bar')]
Packit Service a04d08
        self.handle(self.name, self.config_badkey, self.cloud_init,
Packit Service a04d08
                    self.log, self.args)
Packit Service a04d08
        self.assertEqual(m_sman_cli.call_count, 1)
Packit Service a04d08
        self.assert_logged_warnings((
Packit Service a04d08
            'fookey is not a valid key for rh_subscription. Valid keys are:',
Packit Service a04d08
            'rh_subscription plugin did not complete successfully'))
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab