Merge "base64 encode user_data sent to create server"

This commit is contained in:
Jenkins 2017-06-19 20:55:29 +00:00 committed by Gerrit Code Review
commit c547f1b47a
2 changed files with 59 additions and 1 deletions

View File

@ -10,6 +10,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import base64
import collections
import functools
import hashlib
@ -5431,6 +5432,20 @@ class OpenStackCloud(
self.list_volumes.invalidate(self)
return kwargs
def _encode_server_userdata(self, userdata):
if hasattr(userdata, 'read'):
userdata = userdata.read()
if not isinstance(userdata, six.binary_type):
# If the userdata passed in is bytes, just send it unmodified
if not isinstance(text, six.string_types):
raise TypeError("%s can't be encoded" % type(text))
# If it's not bytes, make it bytes
userdata = userdata.encode('utf-8', 'strict')
# Once we have base64 bytes, make them into a utf-8 string for REST
return base64.b64encode(userdata).decode('utf-8')
@_utils.valid_kwargs(
'meta', 'files', 'userdata',
'reservation_id', 'return_raw', 'min_count',
@ -5535,10 +5550,13 @@ class OpenStackCloud(
kwargs['security_groups'] = []
for group in security_groups:
kwargs['security_groups'].append(dict(name=group))
if 'userdata' in kwargs:
user_data = kwargs.pop('userdata')
if user_data:
kwargs['user_data'] = self._encode_server_userdata(user_data)
for (desired, given) in (
('OS-DCF:diskConfig', 'disk_config'),
('metadata', 'meta'),
('user_data', 'userdata'),
('adminPass', 'admin_pass')):
value = kwargs.pop(given, None)
if value:

View File

@ -16,6 +16,7 @@ test_create_server
Tests for the `create_server` command.
"""
import base64
import uuid
import mock
@ -293,6 +294,45 @@ class TestCreateServer(base.RequestsMockTestCase):
)
self.assert_calls()
def test_create_server_user_data_base64(self):
"""
Test that a server passed user-data sends it base64 encoded.
"""
user_data = self.getUniqueString('user_data')
user_data_b64 = base64.b64encode(user_data).decode('utf-8')
fake_server = fakes.make_fake_server('1234', '', 'BUILD')
fake_server['user_data'] = user_data
self.register_uris([
dict(method='GET',
uri=self.get_mock_url(
'network', 'public', append=['v2.0', 'networks.json']),
json={'networks': []}),
dict(method='POST',
uri=self.get_mock_url(
'compute', 'public', append=['servers']),
json={'server': fake_server},
validate=dict(
json={'server': {
u'flavorRef': u'flavor-id',
u'imageRef': u'image-id',
u'max_count': 1,
u'min_count': 1,
u'user_data': user_data_b64,
u'name': u'server-name'}})),
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', '1234']),
json={'server': fake_server}),
])
self.cloud.create_server(
name='server-name', image=dict(id='image-id'),
flavor=dict(id='flavor-id'),
userdata=user_data, wait=False)
self.assert_calls()
@mock.patch.object(shade.OpenStackCloud, "get_active_server")
@mock.patch.object(shade.OpenStackCloud, "get_server")
def test_wait_for_server(self, mock_get_server, mock_get_active_server):