diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/unittests/test_rh_subscription.py | 231 | 
1 files changed, 231 insertions, 0 deletions
| diff --git a/tests/unittests/test_rh_subscription.py b/tests/unittests/test_rh_subscription.py new file mode 100644 index 00000000..ba9181ec --- /dev/null +++ b/tests/unittests/test_rh_subscription.py @@ -0,0 +1,231 @@ +from cloudinit import util +from cloudinit.config import cc_rh_subscription +import logging +import mock +import unittest + + +class GoodTests(unittest.TestCase): +    def setUp(self): +        super(GoodTests, self).setUp() +        self.name = "cc_rh_subscription" +        self.cloud_init = None +        self.log = logging.getLogger("good_tests") +        self.args = [] +        self.handle = cc_rh_subscription.handle +        self.SM = cc_rh_subscription.SubscriptionManager + +        self.config = {'rh_subscription': +                       {'username': 'scooby@do.com', +                        'password': 'scooby-snacks' +                        }} +        self.config_full = {'rh_subscription': +                            {'username': 'scooby@do.com', +                             'password': 'scooby-snacks', +                             'auto-attach': True, +                             'service-level': 'self-support', +                             'add-pool': ['pool1', 'pool2', 'pool3'], +                             'enable-repo': ['repo1', 'repo2', 'repo3'], +                             'disable-repo': ['repo4', 'repo5'] +                             }} + +    def test_already_registered(self): +        ''' +        Emulates a system that is already registered. Ensure it gets +        a non-ProcessExecution error from is_registered() +        ''' +        good_message = 'System is already registered' +        with mock.patch.object(cc_rh_subscription.SubscriptionManager, +                               '_sub_man_cli') as mockobj: +            self.log.info = mock.MagicMock(wraps=self.log.info) +            self.handle(self.name, self.config, self.cloud_init, +                        self.log, self.args) +            self.assertEqual(mockobj.call_count, 1) +            self.log.info.assert_called_with(good_message) + +    def test_simple_registration(self): +        ''' +        Simple registration with username and password +        ''' +        good_message = 'rh_subscription plugin completed successfully' +        self.log.info = mock.MagicMock(wraps=self.log.info) +        reg = "The system has been registered with ID:" \ +              " 12345678-abde-abcde-1234-1234567890abc" +        self.SM._sub_man_cli = mock.MagicMock( +            side_effect=[util.ProcessExecutionError, (reg, 'bar')]) +        self.handle(self.name, self.config, self.cloud_init, +                    self.log, self.args) +        self.SM._sub_man_cli.assert_called_with_once(['subscription-manager', +                                                      'identity']) +        self.SM._sub_man_cli.assert_called_with_once( +            ['subscription-manager', 'register', '--username=scooby@do.com', +             '--password=scooby-snacks'], logstring_val=True) + +        self.log.info.assert_called_with(good_message) +        self.assertEqual(self.SM._sub_man_cli.call_count, 2) + +    def test_full_registration(self): +        ''' +        Registration with auto-attach, service-level, adding pools, +        and enabling and disabling yum repos +        ''' +        pool_message = 'Pool pool2 is not available' +        repo_message1 = 'Repo repo1 is already enabled' +        repo_message2 = 'Enabled the following repos: repo2, repo3' +        good_message = 'rh_subscription plugin completed successfully' +        self.log.warn = mock.MagicMock(wraps=self.log.warn) +        self.log.debug = mock.MagicMock(wraps=self.log.debug) +        reg = "The system has been registered with ID:" \ +              " 12345678-abde-abcde-1234-1234567890abc" +        self.SM._sub_man_cli = mock.MagicMock( +            side_effect=[util.ProcessExecutionError, (reg, 'bar'), +                         ('Service level set to: self-support', ''), +                         ('pool1\npool3\n', ''), ('pool2\n', ''), ('', ''), +                         ('Repo ID: repo1\nRepo ID: repo5\n', ''), +                         ('Repo ID: repo2\nRepo ID: repo3\nRepo ID: ' +                          'repo4', ''), +                         ('', '')]) +        self.handle(self.name, self.config_full, self.cloud_init, +                    self.log, self.args) +        self.log.warn.assert_any_call(pool_message) +        self.log.debug.assert_any_call(repo_message1) +        self.log.debug.assert_any_call(repo_message2) +        self.log.info.assert_any_call(good_message) +        self.SM._sub_man_cli.assert_called_with_once(['subscription-manager', +                                                      'attach', '-pool=pool1', +                                                      '--pool=pool33']) +        self.assertEqual(self.SM._sub_man_cli.call_count, 9) + + +class BadTests(unittest.TestCase): +    def setUp(self): +        super(BadTests, self).setUp() +        self.name = "cc_rh_subscription" +        self.cloud_init = None +        self.log = logging.getLogger("bad_tests") +        self.orig = self.log +        self.args = [] +        self.handle = cc_rh_subscription.handle +        self.SM = cc_rh_subscription.SubscriptionManager +        self.reg = "The system has been registered with ID:" \ +                   " 12345678-abde-abcde-1234-1234567890abc" + +        self.config_no_password = {'rh_subscription': +                                   {'username': 'scooby@do.com' +                                    }} + +        self.config_no_key = {'rh_subscription': +                              {'activation-key': '1234abcde', +                               }} + +        self.config_service = {'rh_subscription': +                               {'username': 'scooby@do.com', +                                'password': 'scooby-snacks', +                                'service-level': 'self-support' +                                }} + +        self.config_badpool = {'rh_subscription': +                               {'username': 'scooby@do.com', +                                'password': 'scooby-snacks', +                                'add-pool': 'not_a_list' +                                }} +        self.config_badrepo = {'rh_subscription': +                               {'username': 'scooby@do.com', +                                'password': 'scooby-snacks', +                                'enable-repo': 'not_a_list' +                                }} +        self.config_badkey = {'rh_subscription': +                              {'activation_key': 'abcdef1234', +                               'org': '123', +                               }} + +    def test_no_password(self): +        ''' +        Attempt to register without the password key/value +        ''' +        self.missing_info(self.config_no_password) + +    def test_no_org(self): +        ''' +        Attempt to register without the org key/value +        ''' +        self.missing_info(self.config_no_key) + +    def test_service_level_without_auto(self): +        ''' +        Attempt to register using service-level without the auto-attach key +        ''' +        good_message = 'The service-level key must be used in conjunction'\ +                       ' with the auto-attach key.  Please re-run with '\ +                       'auto-attach: True' + +        self.log.warn = mock.MagicMock(wraps=self.log.warn) +        self.SM._sub_man_cli = mock.MagicMock( +            side_effect=[util.ProcessExecutionError, (self.reg, 'bar')]) +        self.handle(self.name, self.config_service, self.cloud_init, +                    self.log, self.args) +        self.log.warn.assert_any_call(good_message) +        self.assertRaises(cc_rh_subscription.SubscriptionError) +        self.assertEqual(self.SM._sub_man_cli.call_count, 1) + +    def test_pool_not_a_list(self): +        ''' +        Register with pools that are not in the format of a list +        ''' +        good_message = "Pools must in the format of a list" +        self.log.warn = mock.MagicMock(wraps=self.log.warn) +        self.SM._sub_man_cli = mock.MagicMock( +            side_effect=[util.ProcessExecutionError, (self.reg, 'bar')]) +        self.handle(self.name, self.config_badpool, self.cloud_init, +                    self.log, self.args) +        self.log.warn.assert_any_call(good_message) +        self.assertRaises(cc_rh_subscription.SubscriptionError) +        self.assertEqual(self.SM._sub_man_cli.call_count, 2) + +    def test_repo_not_a_list(self): +        ''' +        Register with repos that are not in the format of a list +        ''' +        good_message = "Repo IDs must in the format of a list." +        self.log.warn = mock.MagicMock(wraps=self.log.warn) +        self.SM._sub_man_cli = mock.MagicMock( +            side_effect=[util.ProcessExecutionError, (self.reg, 'bar')]) +        self.handle(self.name, self.config_badrepo, self.cloud_init, +                    self.log, self.args) +        self.log.warn.assert_any_call(good_message) +        self.assertRaises(cc_rh_subscription.SubscriptionError) +        self.assertEqual(self.SM._sub_man_cli.call_count, 2) + +    def test_bad_key_value(self): +        ''' +        Attempt to register with a key that we don't know +        ''' +        good_message = 'activation_key is not a valid key for rh_subscription.'\ +                       ' Valid keys are: org, activation-key, username, '\ +                       'password, disable-repo, enable-repo, add-pool,'\ +                       ' rhsm-baseurl, server-hostname, auto-attach, '\ +                       'service-level' +        self.log.warn = mock.MagicMock(wraps=self.log.warn) +        self.SM._sub_man_cli = mock.MagicMock( +            side_effect=[util.ProcessExecutionError, (self.reg, 'bar')]) +        self.handle(self.name, self.config_badkey, self.cloud_init, +                    self.log, self.args) +        self.assertRaises(cc_rh_subscription.SubscriptionError) +        self.log.warn.assert_any_call(good_message) +        self.assertEqual(self.SM._sub_man_cli.call_count, 1) + +    def missing_info(self, config): +        ''' +        Helper def for tests that having missing information +        ''' +        good_message = "Unable to register system due to incomplete "\ +                       "information." +        self.log.warn = mock.MagicMock(wraps=self.log.warn) +        self.SM._sub_man_cli = mock.MagicMock( +            side_effect=[util.ProcessExecutionError]) +        self.handle(self.name, config, self.cloud_init, +                    self.log, self.args) +        self.SM._sub_man_cli.assert_called_with(['subscription-manager', +                                                 'identity']) +        self.log.warn.assert_any_call(good_message) +        self.assertEqual(self.SM._sub_man_cli.call_count, 1) | 
