← Back to team overview

cloud-init-dev team mailing list archive

[Merge] lp:~kiril-vladimiroff/cloud-init/cloudsigma-base64-userdata into lp:cloud-init

 

Kiril Vladimiroff has proposed merging lp:~kiril-vladimiroff/cloud-init/cloudsigma-base64-userdata into lp:cloud-init.

Requested reviews:
  cloud init development team (cloud-init-dev)

For more details, see:
https://code.launchpad.net/~kiril-vladimiroff/cloud-init/cloudsigma-base64-userdata/+merge/207114

Read encoded with base64 user data in the CloudSigma datasource.

This allows users of CloudSigma's VM to encode their user data with base64.
In order to do that they have to add the ``cloudinit-user-data`` field to
the ``base64_fields``. The latter is a comma-separated field with
all the meta fields whit base64 encoded values.

-- 
https://code.launchpad.net/~kiril-vladimiroff/cloud-init/cloudsigma-base64-userdata/+merge/207114
Your team cloud init development team is requested to review the proposed merge of lp:~kiril-vladimiroff/cloud-init/cloudsigma-base64-userdata into lp:cloud-init.
=== modified file 'cloudinit/sources/DataSourceCloudSigma.py'
--- cloudinit/sources/DataSourceCloudSigma.py	2014-02-18 16:58:12 +0000
+++ cloudinit/sources/DataSourceCloudSigma.py	2014-02-19 08:53:16 +0000
@@ -15,6 +15,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/>.
+from base64 import b64decode
 import re
 
 from cloudinit import log as logging
@@ -61,7 +62,11 @@
         if dsmode == "disabled" or dsmode != self.dsmode:
             return False
 
+        base64_fields = server_meta.get('base64_fields', '').split(',')
         self.userdata_raw = server_meta.get('cloudinit-user-data', "")
+        if 'cloudinit-user-data' in base64_fields:
+            self.userdata_raw = b64decode(self.userdata_raw)
+
         self.metadata = server_context
         self.ssh_public_key = server_meta['ssh_public_key']
 

=== modified file 'doc/sources/cloudsigma/README.rst'
--- doc/sources/cloudsigma/README.rst	2014-02-13 15:39:39 +0000
+++ doc/sources/cloudsigma/README.rst	2014-02-19 08:53:16 +0000
@@ -23,6 +23,10 @@
 header could be omitted. However since this is a raw-text field you could provide any of the valid
 `config formats`_.
 
+You have the option to encode your user-data using Base64. In order to do that you have to add the
+``cloudinit-user-data`` field to the ``base64_fields``. The latter is a comma-separated field with
+all the meta fields whit base64 encoded values.
+
 If your user-data does not need an internet connection you can create a
 `meta field`_ in the `server context`_ ``cloudinit-dsmode`` and set "local" as value.
 If this field does not exist the default value is "net".

=== modified file 'tests/unittests/test_datasource/test_cloudsigma.py'
--- tests/unittests/test_datasource/test_cloudsigma.py	2014-02-12 10:14:49 +0000
+++ tests/unittests/test_datasource/test_cloudsigma.py	2014-02-19 08:53:16 +0000
@@ -1,4 +1,5 @@
 # coding: utf-8
+import copy
 from unittest import TestCase
 
 from cloudinit.cs_utils import Cepko
@@ -24,7 +25,8 @@
 
 
 class CepkoMock(Cepko):
-    result = SERVER_CONTEXT
+    def __init__(self, mocked_context):
+        self.result = mocked_context
 
     def all(self):
         return self
@@ -33,7 +35,7 @@
 class DataSourceCloudSigmaTest(TestCase):
     def setUp(self):
         self.datasource = DataSourceCloudSigma.DataSourceCloudSigma("", "", "")
-        self.datasource.cepko = CepkoMock()
+        self.datasource.cepko = CepkoMock(SERVER_CONTEXT)
         self.datasource.get_data()
 
     def test_get_hostname(self):
@@ -57,3 +59,12 @@
     def test_user_data(self):
         self.assertEqual(self.datasource.userdata_raw,
                          SERVER_CONTEXT['meta']['cloudinit-user-data'])
+
+    def test_encoded_user_data(self):
+        encoded_context = copy.deepcopy(SERVER_CONTEXT)
+        encoded_context['meta']['base64_fields'] = 'cloudinit-user-data'
+        encoded_context['meta']['cloudinit-user-data'] = 'aGkgd29ybGQK'
+        self.datasource.cepko = CepkoMock(encoded_context)
+        self.datasource.get_data()
+
+        self.assertEqual(self.datasource.userdata_raw, b'hi world\n')


Follow ups