cloud-init-dev team mailing list archive
-
cloud-init-dev team
-
Mailing list archive
-
Message #00423
[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