diff options
| -rw-r--r-- | cloudinit/config/cc_spacewalk.py | 85 | ||||
| -rw-r--r-- | tests/unittests/test_handler/test_handler_spacewalk.py | 42 | 
2 files changed, 127 insertions, 0 deletions
| diff --git a/cloudinit/config/cc_spacewalk.py b/cloudinit/config/cc_spacewalk.py new file mode 100644 index 00000000..f3c1a664 --- /dev/null +++ b/cloudinit/config/cc_spacewalk.py @@ -0,0 +1,85 @@ +# vi: ts=4 expandtab +# +#    This program is free software: you can redistribute it and/or modify +#    it under the terms of the GNU General Public License version 3, as +#    published by the Free Software Foundation. +# +#    This program is distributed in the hope that it will be useful, +#    but WITHOUT ANY WARRANTY; without even the implied warranty of +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#    GNU General Public License for more details. +# +#    You should have received a copy of the GNU General Public License +#    along with this program.  If not, see <http://www.gnu.org/licenses/>. + +""" +**Summary:** helper to setup https://fedorahosted.org/spacewalk/ + +**Description:** This module will enable for configuring the needed +actions to setup spacewalk on redhat based systems. + +It can be configured with the following option structure:: + +    spacewalk: +       server: spacewalk api server (required) +""" + +from cloudinit import util + + +distros = ['redhat', 'fedora'] +required_packages = ['rhn-setup'] +def_ca_cert_path = "/usr/share/rhn/RHN-ORG-TRUSTED-SSL-CERT" + + +def is_registered(): +    # Check to see if already registered and don't bother; this is +    # apparently done by trying to sync and if that fails then we +    # assume we aren't registered; which is sorta ghetto... +    already_registered = False +    try: +        util.subp(['rhn-profile-sync', '--verbose'], capture=False) +        already_registered = True +    except util.ProcessExecutionError as e: +        if e.exit_code != 1: +            raise +    return already_registered + + +def do_register(server, profile_name, +                ca_cert_path=def_ca_cert_path, +                proxy=None, log=None, +                activation_key=None): +    if log is not None: +        log.info("Registering using `rhnreg_ks` profile '%s'" +                 " into server '%s'", profile_name, server) +    cmd = ['rhnreg_ks'] +    cmd.extend(['--serverUrl', 'https://%s/XMLRPC' % server]) +    cmd.extend(['--profilename', str(profile_name)]) +    if proxy: +        cmd.extend(["--proxy", str(proxy)]) +    if ca_cert_path: +        cmd.extend(['--sslCACert', str(ca_cert_path)]) +    if activation_key: +        cmd.extend(['--activationkey', str(activation_key)]) +    util.subp(cmd, capture=False) + + +def handle(name, cfg, cloud, log, _args): +    if 'spacewalk' not in cfg: +        log.debug(("Skipping module named %s," +                   " no 'spacewalk' key in configuration"), name) +        return +    cfg = cfg['spacewalk'] +    spacewalk_server = cfg.get('server') +    if spacewalk_server: +        # Need to have this installed before further things will work. +        cloud.distro.install_packages(required_packages) +        if not is_registered(): +            do_register(spacewalk_server, +                        cloud.datasource.get_hostname(fqdn=True), +                        proxy=cfg.get("proxy"), log=log, +                        activation_key=cfg.get('activation_key')) +    else: +        log.debug("Skipping module named %s, 'spacewalk/server' key" +                  " was not found in configuration", name) diff --git a/tests/unittests/test_handler/test_handler_spacewalk.py b/tests/unittests/test_handler/test_handler_spacewalk.py new file mode 100644 index 00000000..44f95e4c --- /dev/null +++ b/tests/unittests/test_handler/test_handler_spacewalk.py @@ -0,0 +1,42 @@ +from cloudinit.config import cc_spacewalk +from cloudinit import util + +from .. import helpers + +import logging + +try: +    from unittest import mock +except ImportError: +    import mock + +LOG = logging.getLogger(__name__) + + +class TestSpacewalk(helpers.TestCase): +    space_cfg = { +        'spacewalk': { +            'server': 'localhost', +            'profile_name': 'test', +        } +    } + +    @mock.patch("cloudinit.config.cc_spacewalk.util.subp") +    def test_not_is_registered(self, mock_util_subp): +        mock_util_subp.side_effect = util.ProcessExecutionError(exit_code=1) +        self.assertFalse(cc_spacewalk.is_registered()) + +    @mock.patch("cloudinit.config.cc_spacewalk.util.subp") +    def test_is_registered(self, mock_util_subp): +        mock_util_subp.side_effect = None +        self.assertTrue(cc_spacewalk.is_registered()) + +    @mock.patch("cloudinit.config.cc_spacewalk.util.subp") +    def test_do_register(self, mock_util_subp): +        cc_spacewalk.do_register(**self.space_cfg['spacewalk']) +        mock_util_subp.assert_called_with([ +            'rhnreg_ks', +            '--serverUrl', 'https://localhost/XMLRPC', +            '--profilename', 'test', +            '--sslCACert', cc_spacewalk.def_ca_cert_path, +        ], capture=False) | 
