Merge "base64 encode user_data sent to create server"
This commit is contained in:
commit
c547f1b47a
|
@ -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:
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue