Fix validation of server personality property

During validation, the software config content will not be
available via get_attr function. Hence we will end up calling
encode on a NoneType object.

Try to encode to utf-8 only if content is available.

Change-Id: I3e7dc4a9fcbd95482df880a7454fa5a09d6af68f
Closes-Bug: #1528463
This commit is contained in:
H S, Rakesh 2015-12-22 07:20:21 +00:00 committed by Rakesh H S
parent 100f9153b7
commit 054f680739
2 changed files with 37 additions and 1 deletions

View File

@ -1288,7 +1288,8 @@ class Server(stack_user.StackUser, sh.SchedulerHintsMixin,
"file size (%(max_size)s bytes).") %
{'path': path,
'max_size': limits['maxPersonalitySize']})
self._check_maximum(len(bytes(contents.encode('utf-8'))),
self._check_maximum(len(bytes(contents.encode('utf-8'))
) if contents is not None else 0,
limits['maxPersonalitySize'], msg)
def _delete_temp_url(self):

View File

@ -123,6 +123,23 @@ resources:
- network: 4321
"""
server_with_sw_config_personality = """
heat_template_version: 2014-10-16
resources:
swconfig:
type: OS::Heat::SoftwareConfig
properties:
config: |
#!/bin/bash
echo -e "test"
server:
type: OS::Nova::Server
properties:
image: F17-x86_64-gold
flavor: m1.small
personality: { /tmp/test: { get_attr: [swconfig, config]}}
"""
class ServersTest(common.HeatTestCase):
def setUp(self):
@ -3000,6 +3017,24 @@ class ServersTest(common.HeatTestCase):
'file size (10240 bytes).', six.text_type(exc))
self.m.VerifyAll()
def test_server_validate_personality_get_attr_return_none(self):
stack_name = 'srv_val'
(tmpl, stack) = self._setup_test_stack(
stack_name, server_with_sw_config_personality)
resource_defns = tmpl.resource_definitions(stack)
server = servers.Server('server_create_image_err',
resource_defns['server'], stack)
self.m.StubOutWithMock(self.fc.limits, 'get')
self.fc.limits.get().MultipleTimes().AndReturn(self.limits)
self.m.StubOutWithMock(nova.NovaClientPlugin, '_create')
nova.NovaClientPlugin._create().AndReturn(self.fc)
self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
self.m.ReplayAll()
self.assertIsNone(server.validate())
self.m.VerifyAll()
def test_resolve_attribute_server_not_found(self):
return_server = self.fc.servers.list()[1]
server = self._create_test_server(return_server,