Merge "Add save_admin_pass property to CloudServer"

This commit is contained in:
Jenkins 2014-04-08 06:48:40 +00:00 committed by Gerrit Code Review
commit 4c94cdc3f1
2 changed files with 70 additions and 1 deletions

View File

@ -19,6 +19,7 @@ import paramiko
from heat.common import exception
from heat.db.sqlalchemy import api as db_api
from heat.engine import properties
from heat.engine.resources import nova_utils
from heat.engine.resources import server
from heat.openstack.common.gettextutils import _
@ -113,6 +114,20 @@ bash -x /var/lib/cloud/data/cfn-userdata > /root/cfn-userdata.log 2>&1 ||
RC_STATUS_FAILED = 'FAILED'
RC_STATUS_UNPROCESSABLE = 'UNPROCESSABLE'
# Admin Pass Properties
SAVE_ADMIN_PASS = 'save_admin_pass'
properties_schema = copy.deepcopy(server.Server.properties_schema)
properties_schema.update(
{
SAVE_ADMIN_PASS: properties.Schema(
properties.Schema.BOOLEAN,
_('True if the system should remember the admin password; '
'False otherwise.'),
default=False
),
}
)
attributes_schema = copy.deepcopy(server.Server.attributes_schema)
attributes_schema.update(
{
@ -470,7 +485,8 @@ bash -x /var/lib/cloud/data/cfn-userdata > /root/cfn-userdata.log 2>&1 ||
# Server will not have an adminPass attribute if Nova's
# "enable_instance_password" config option is turned off
if hasattr(server, 'adminPass') and server.adminPass:
if (self.properties.get(self.SAVE_ADMIN_PASS) and
hasattr(server, 'adminPass') and server.adminPass):
db_api.resource_data_set(self, self.ADMIN_PASS,
server.adminPass,
redact=True)

View File

@ -959,6 +959,7 @@ class CloudServersTest(HeatTestCase):
stack_name = 'admin_pass_s'
(t, stack) = self._setup_test_stack(stack_name)
t['Resources']['WebServer']['Properties']['save_admin_pass'] = True
server = cloud_server.CloudServer('WebServer',
t['Resources']['WebServer'], stack)
server._sftp_files = mock.Mock()
@ -973,6 +974,58 @@ class CloudServersTest(HeatTestCase):
'autogenerated', redact=True)
self.assertIn(expected_call, mock_data_set.call_args_list)
@mock.patch.object(clients.OpenStackClients, 'nova')
@mock.patch.object(cloud_server.db_api, 'resource_data_set')
def test_create_save_admin_pass_is_false(self,
mock_data_set,
mock_nova):
self._mock_metadata_os_distro()
return_server = self.fc.servers.list()[1]
return_server.adminPass = 'autogenerated'
stack_name = 'admin_pass_s'
(t, stack) = self._setup_test_stack(stack_name)
t['Resources']['WebServer']['Properties']['save_admin_pass'] = False
server = cloud_server.CloudServer('WebServer',
t['Resources']['WebServer'], stack)
server._sftp_files = mock.Mock()
server._run_ssh_command = mock.Mock(return_value=0)
mock_nova.return_value = self.fc
server.t = server.stack.resolve_runtime_data(server.t)
self.fc.servers.create = mock.Mock(return_value=return_server)
scheduler.TaskRunner(server.create)()
expected_call = mock.call(mock.ANY, server.ADMIN_PASS,
mock.ANY, mock.ANY)
self.assertNotIn(expected_call, mock_data_set.call_args_list)
@mock.patch.object(clients.OpenStackClients, 'nova')
@mock.patch.object(cloud_server.db_api, 'resource_data_set')
def test_create_save_admin_pass_defaults_to_false(self,
mock_data_set,
mock_nova):
self._mock_metadata_os_distro()
return_server = self.fc.servers.list()[1]
return_server.adminPass = 'autogenerated'
stack_name = 'admin_pass_s'
(t, stack) = self._setup_test_stack(stack_name)
t['Resources']['WebServer']['Properties']['save_admin_pass'] = None
server = cloud_server.CloudServer('WebServer',
t['Resources']['WebServer'], stack)
server._sftp_files = mock.Mock()
server._run_ssh_command = mock.Mock(return_value=0)
mock_nova.return_value = self.fc
server.t = server.stack.resolve_runtime_data(server.t)
self.fc.servers.create = mock.Mock(return_value=return_server)
scheduler.TaskRunner(server.create)()
expected_call = mock.call(mock.ANY, server.ADMIN_PASS,
mock.ANY, mock.ANY)
self.assertNotIn(expected_call, mock_data_set.call_args_list)
@mock.patch.object(clients.OpenStackClients, 'nova')
@mock.patch.object(cloud_server.db_api, 'resource_data_set')
def test_create_without_adminPass_attribute(self,