File encode-user-data-utf8.patch of Package python-novaclient
commit 81c01e535cecc54c2e6e847000638b52fec506af
Author: Vincent Untz <vuntz@suse.com>
Date: Fri Sep 28 11:48:38 2012 +0200
Encode user data to utf-8 when creating a server
This is needed for data that we don't read from IO directly, since we're
base64-encoding the user data, and this requires ther user data to not
be of the unicode type.
We're being tolerant, as we'll accept user data that is already in a str
object.
Fixes: bug 1049161
Change-Id: I4320670de564c8029c7aef14da2492c6f8752efe
diff --git a/novaclient/v1_1/base.py b/novaclient/v1_1/base.py
index 43e54cd..85d7141 100644
--- a/novaclient/v1_1/base.py
+++ b/novaclient/v1_1/base.py
@@ -72,6 +72,8 @@ class BootingManagerWithFind(base.ManagerWithFind):
if userdata:
if hasattr(userdata, 'read'):
userdata = userdata.read()
+ elif isinstance(userdata, unicode):
+ userdata = userdata.encode('utf-8')
body["server"]["user_data"] = base64.b64encode(userdata)
if meta:
body["server"]["metadata"] = meta
diff --git a/tests/v1_1/test_servers.py b/tests/v1_1/test_servers.py
index 6111514..c4c5305 100644
--- a/tests/v1_1/test_servers.py
+++ b/tests/v1_1/test_servers.py
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
import StringIO
from novaclient import exceptions
@@ -59,6 +61,38 @@ class ServersTest(utils.TestCase):
cs.assert_called('POST', '/servers')
self.assertTrue(isinstance(s, servers.Server))
+ def test_create_server_userdata_unicode(self):
+ s = cs.servers.create(
+ name="My server",
+ image=1,
+ flavor=1,
+ meta={'foo': 'bar'},
+ userdata=u'こんにちは',
+ key_name="fakekey",
+ files={
+ '/etc/passwd': 'some data', # a file
+ '/tmp/foo.txt': StringIO.StringIO('data'), # a stream
+ },
+ )
+ cs.assert_called('POST', '/servers')
+ self.assertTrue(isinstance(s, servers.Server))
+
+ def test_create_server_userdata_utf8(self):
+ s = cs.servers.create(
+ name="My server",
+ image=1,
+ flavor=1,
+ meta={'foo': 'bar'},
+ userdata='こんにちは',
+ key_name="fakekey",
+ files={
+ '/etc/passwd': 'some data', # a file
+ '/tmp/foo.txt': StringIO.StringIO('data'), # a stream
+ },
+ )
+ cs.assert_called('POST', '/servers')
+ self.assertTrue(isinstance(s, servers.Server))
+
def test_update_server(self):
s = cs.servers.get(1234)