diff options
| author | Sergii Golovatiuk <sgolovatiuk@mirantis.com> | 2016-07-14 16:58:56 +0200 | 
|---|---|---|
| committer | Sergii Golovatiuk <sgolovatiuk@mirantis.com> | 2016-07-14 16:58:56 +0200 | 
| commit | 200e811268b7c17e814cfb6b7ef3f603c0590abc (patch) | |
| tree | f767381cae14c9d66e7e224e4863f1910e1e3293 | |
| parent | b3193a4b5204d12825d8317bf0f8c3577c1d8153 (diff) | |
| download | vyos-cloud-init-200e811268b7c17e814cfb6b7ef3f603c0590abc.tar.gz vyos-cloud-init-200e811268b7c17e814cfb6b7ef3f603c0590abc.zip  | |
Change StringIO to BytesIO in cc_mcollective.py
* StringIO from six doesn't act as 'binary stream' in Python 3.
This patch changes StringIO to BytesIO to have code compatible with
Python 3 and Python 2.
* Add try/except for IOError in case when server.cfg doesn't exists. This is
necessary for unit tests or cases when server.cfg is not included to package
* Add UnitTest for cc_mcollective.py
LP: #1597699
| -rw-r--r-- | cloudinit/config/cc_mcollective.py | 72 | ||||
| -rw-r--r-- | tests/unittests/test_handler/test_handler_mcollective.py | 60 | 
2 files changed, 103 insertions, 29 deletions
diff --git a/cloudinit/config/cc_mcollective.py b/cloudinit/config/cc_mcollective.py index 425420ae..47320d5d 100644 --- a/cloudinit/config/cc_mcollective.py +++ b/cloudinit/config/cc_mcollective.py @@ -20,54 +20,49 @@  #    along with this program.  If not, see <http://www.gnu.org/licenses/>.  import six -from six import StringIO +from six import BytesIO  # Used since this can maintain comments  # and doesn't need a top level section  from configobj import ConfigObj  from cloudinit import util +from cloudinit import log as logging  PUBCERT_FILE = "/etc/mcollective/ssl/server-public.pem"  PRICERT_FILE = "/etc/mcollective/ssl/server-private.pem"  SERVER_CFG = '/etc/mcollective/server.cfg' +LOG = logging.getLogger(__name__) -def handle(name, cfg, cloud, log, _args): - -    # If there isn't a mcollective key in the configuration don't do anything -    if 'mcollective' not in cfg: -        log.debug(("Skipping module named %s, " -                   "no 'mcollective' key in configuration"), name) -        return - -    mcollective_cfg = cfg['mcollective'] - -    # Start by installing the mcollective package ... -    cloud.distro.install_packages(("mcollective",)) -    # ... and then update the mcollective configuration -    if 'conf' in mcollective_cfg: -        # Read server.cfg values from the -        # original file in order to be able to mix the rest up -        mcollective_config = ConfigObj(SERVER_CFG) -        # See: http://tiny.cc/jh9agw -        for (cfg_name, cfg) in mcollective_cfg['conf'].items(): +def configure(config): +    # Read server.cfg values from the +    # original file in order to be able to mix the rest up +    try: +        mcollective_config = ConfigObj(SERVER_CFG, file_error=True) +    except IOError: +        LOG.warn("Did not find file %s", SERVER_CFG) +        mcollective_config = ConfigObj(config) +    else: +        for (cfg_name, cfg) in config.items():              if cfg_name == 'public-cert':                  util.write_file(PUBCERT_FILE, cfg, mode=0o644) -                mcollective_config['plugin.ssl_server_public'] = PUBCERT_FILE +                mcollective_config[ +                    'plugin.ssl_server_public'] = PUBCERT_FILE                  mcollective_config['securityprovider'] = 'ssl'              elif cfg_name == 'private-cert':                  util.write_file(PRICERT_FILE, cfg, mode=0o600) -                mcollective_config['plugin.ssl_server_private'] = PRICERT_FILE +                mcollective_config[ +                    'plugin.ssl_server_private'] = PRICERT_FILE                  mcollective_config['securityprovider'] = 'ssl'              else:                  if isinstance(cfg, six.string_types):                      # Just set it in the 'main' section                      mcollective_config[cfg_name] = cfg                  elif isinstance(cfg, (dict)): -                    # Iterate through the config items, create a section -                    # if it is needed and then add/or create items as needed +                    # Iterate through the config items, create a section if +                    # it is needed and then add/or create items as needed                      if cfg_name not in mcollective_config.sections:                          mcollective_config[cfg_name] = {}                      for (o, v) in cfg.items(): @@ -78,11 +73,30 @@ def handle(name, cfg, cloud, log, _args):          # We got all our config as wanted we'll rename          # the previous server.cfg and create our new one          util.rename(SERVER_CFG, "%s.old" % (SERVER_CFG)) -        # Now we got the whole file, write to disk... -        contents = StringIO() -        mcollective_config.write(contents) -        contents = contents.getvalue() -        util.write_file(SERVER_CFG, contents, mode=0o644) + +    # Now we got the whole file, write to disk... +    contents = BytesIO() +    mcollective_config.write(contents) +    contents = contents.getvalue() +    util.write_file(SERVER_CFG, contents, mode=0o644) + + +def handle(name, cfg, cloud, log, _args): + +    # If there isn't a mcollective key in the configuration don't do anything +    if 'mcollective' not in cfg: +        log.debug(("Skipping module named %s, " +                   "no 'mcollective' key in configuration"), name) +        return + +    mcollective_cfg = cfg['mcollective'] + +    # Start by installing the mcollective package ... +    cloud.distro.install_packages(("mcollective",)) + +    # ... and then update the mcollective configuration +    if 'conf' in mcollective_cfg: +        configure(config=mcollective_cfg['conf'])      # Start mcollective      util.subp(['service', 'mcollective', 'start'], capture=False) diff --git a/tests/unittests/test_handler/test_handler_mcollective.py b/tests/unittests/test_handler/test_handler_mcollective.py new file mode 100644 index 00000000..0e3fcc8c --- /dev/null +++ b/tests/unittests/test_handler/test_handler_mcollective.py @@ -0,0 +1,60 @@ +from cloudinit.config import cc_mcollective +from cloudinit import util + +from .. import helpers + +import configobj +import logging +import shutil +from six import BytesIO +import tempfile + +LOG = logging.getLogger(__name__) + + +class TestConfig(helpers.FilesystemMockingTestCase): +    def setUp(self): +        super(TestConfig, self).setUp() +        self.tmp = tempfile.mkdtemp() +        self.addCleanup(shutil.rmtree, self.tmp) + +    def test_basic_config(self): +        cfg = { +            'mcollective': { +                'conf': { +                    'loglevel': 'debug', +                    'connector': 'rabbitmq', +                    'logfile': '/var/log/mcollective.log', +                    'ttl': '4294957', +                    'collectives': 'mcollective', +                    'main_collective': 'mcollective', +                    'securityprovider': 'psk', +                    'daemonize': '1', +                    'factsource': 'yaml', +                    'direct_addressing': '1', +                    'plugin.psk': 'unset', +                    'libdir': '/usr/share/mcollective/plugins', +                    'identity': '1', +                }, +            }, +        } +        self.patchUtils(self.tmp) +        cc_mcollective.configure(cfg['mcollective']['conf']) +        contents = util.load_file("/etc/mcollective/server.cfg", decode=False) +        contents = configobj.ConfigObj(BytesIO(contents)) +        expected = { +                'loglevel': 'debug', +                'connector': 'rabbitmq', +                'logfile': '/var/log/mcollective.log', +                'ttl': '4294957', +                'collectives': 'mcollective', +                'main_collective': 'mcollective', +                'securityprovider': 'psk', +                'daemonize': '1', +                'factsource': 'yaml', +                'direct_addressing': '1', +                'plugin.psk': 'unset', +                'libdir': '/usr/share/mcollective/plugins', +                'identity': '1', +                } +        self.assertEqual(expected, dict(contents))  | 
