diff options
| -rw-r--r-- | ChangeLog | 2 | ||||
| -rw-r--r-- | cloudinit/sources/DataSourceOpenNebula.py | 13 | ||||
| -rw-r--r-- | tests/unittests/test_datasource/test_opennebula.py | 26 | 
3 files changed, 39 insertions, 2 deletions
| @@ -39,6 +39,8 @@     other programs (LP: #1284439)   - Azure: if a reboot causes ephemeral storage to be re-provisioned     Then we need to re-format it. (LP: #1292648) + - OpenNebula: support base64 encoded user-data +   [Enol Fernandez, Peter Kotcauer]  0.7.4:   - fix issue mounting 'ephemeral0' if ephemeral0 was an alias for a     partitioned block device with target filesystem on ephemeral0.1. diff --git a/cloudinit/sources/DataSourceOpenNebula.py b/cloudinit/sources/DataSourceOpenNebula.py index b0464cbb..34557f8b 100644 --- a/cloudinit/sources/DataSourceOpenNebula.py +++ b/cloudinit/sources/DataSourceOpenNebula.py @@ -4,11 +4,13 @@  #    Copyright (C) 2012 Yahoo! Inc.  #    Copyright (C) 2012-2013 CERIT Scientific Cloud  #    Copyright (C) 2012-2013 OpenNebula.org +#    Copyright (C) 2014 Consejo Superior de Investigaciones Cientificas  #  #    Author: Scott Moser <scott.moser@canonical.com>  #    Author: Joshua Harlow <harlowja@yahoo-inc.com>  #    Author: Vlastimil Holer <xholer@mail.muni.cz>  #    Author: Javier Fontan <jfontan@opennebula.org> +#    Author: Enol Fernandez <enolfc@ifca.unican.es>  #  #    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 @@ -22,6 +24,7 @@  #    You should have received a copy of the GNU General Public License  #    along with this program.  If not, see <http://www.gnu.org/licenses/>. +import base64  import os  import pwd  import re @@ -417,6 +420,16 @@ def read_context_disk_dir(source_dir, asuser=None):      elif "USERDATA" in context:          results['userdata'] = context["USERDATA"] +    # b64decode user data if necessary (default) +    if 'userdata' in results: +        encoding = context.get('USERDATA_ENCODING', +                               context.get('USER_DATA_ENCODING')) +        if encoding == "base64": +            try: +                results['userdata'] = base64.b64decode(results['userdata']) +            except TypeError: +                LOG.warn("Failed base64 decoding of userdata") +      # generate static /etc/network/interfaces      # only if there are any required context variables      # http://opennebula.org/documentation:rel3.8:cong#network_configuration diff --git a/tests/unittests/test_datasource/test_opennebula.py b/tests/unittests/test_datasource/test_opennebula.py index 6fc5b2ac..ec6b752b 100644 --- a/tests/unittests/test_datasource/test_opennebula.py +++ b/tests/unittests/test_datasource/test_opennebula.py @@ -4,6 +4,7 @@ from cloudinit import util  from mocker import MockerTestCase  from tests.unittests.helpers import populate_dir +from base64 import b64encode  import os  import pwd @@ -164,10 +165,31 @@ class TestOpenNebulaDataSource(MockerTestCase):              public_keys.append(SSH_KEY % (c + 1,)) -    def test_user_data(self): +    def test_user_data_plain(self):          for k in ('USER_DATA', 'USERDATA'):              my_d = os.path.join(self.tmp, k) -            populate_context_dir(my_d, {k: USER_DATA}) +            populate_context_dir(my_d, {k: USER_DATA, +                                        'USERDATA_ENCODING': ''}) +            results = ds.read_context_disk_dir(my_d) + +            self.assertTrue('userdata' in results) +            self.assertEqual(USER_DATA, results['userdata']) + +    def test_user_data_encoding_required_for_decode(self): +        b64userdata = b64encode(USER_DATA) +        for k in ('USER_DATA', 'USERDATA'): +            my_d = os.path.join(self.tmp, k) +            populate_context_dir(my_d, {k: b64userdata}) +            results = ds.read_context_disk_dir(my_d) + +            self.assertTrue('userdata' in results) +            self.assertEqual(b64userdata, results['userdata']) + +    def test_user_data_base64_encoding(self): +        for k in ('USER_DATA', 'USERDATA'): +            my_d = os.path.join(self.tmp, k) +            populate_context_dir(my_d, {k: b64encode(USER_DATA), +                                        'USERDATA_ENCODING': 'base64'})              results = ds.read_context_disk_dir(my_d)              self.assertTrue('userdata' in results) | 
