Skip to content

Commit

Permalink
Encode user data to utf-8 when creating a server
Browse files Browse the repository at this point in the history
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
  • Loading branch information
vuntz committed Sep 28, 2012
1 parent cdebf72 commit 81c01e5
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
2 changes: 2 additions & 0 deletions novaclient/v1_1/base.py
Expand Up @@ -72,6 +72,8 @@ def _boot(self, resource_url, response_key, name, image, flavor,
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
Expand Down
34 changes: 34 additions & 0 deletions tests/v1_1/test_servers.py
@@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-

import StringIO

from novaclient import exceptions
Expand Down Expand Up @@ -59,6 +61,38 @@ def test_create_server_userdata_file_object(self):
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)

Expand Down

0 comments on commit 81c01e5

Please sign in to comment.