Merge "Add save_admin_pass property to CloudServer"
This commit is contained in:
commit
4c94cdc3f1
|
@ -19,6 +19,7 @@ import paramiko
|
||||||
|
|
||||||
from heat.common import exception
|
from heat.common import exception
|
||||||
from heat.db.sqlalchemy import api as db_api
|
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 nova_utils
|
||||||
from heat.engine.resources import server
|
from heat.engine.resources import server
|
||||||
from heat.openstack.common.gettextutils import _
|
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_FAILED = 'FAILED'
|
||||||
RC_STATUS_UNPROCESSABLE = 'UNPROCESSABLE'
|
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 = copy.deepcopy(server.Server.attributes_schema)
|
||||||
attributes_schema.update(
|
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
|
# Server will not have an adminPass attribute if Nova's
|
||||||
# "enable_instance_password" config option is turned off
|
# "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,
|
db_api.resource_data_set(self, self.ADMIN_PASS,
|
||||||
server.adminPass,
|
server.adminPass,
|
||||||
redact=True)
|
redact=True)
|
||||||
|
|
|
@ -959,6 +959,7 @@ class CloudServersTest(HeatTestCase):
|
||||||
stack_name = 'admin_pass_s'
|
stack_name = 'admin_pass_s'
|
||||||
(t, stack) = self._setup_test_stack(stack_name)
|
(t, stack) = self._setup_test_stack(stack_name)
|
||||||
|
|
||||||
|
t['Resources']['WebServer']['Properties']['save_admin_pass'] = True
|
||||||
server = cloud_server.CloudServer('WebServer',
|
server = cloud_server.CloudServer('WebServer',
|
||||||
t['Resources']['WebServer'], stack)
|
t['Resources']['WebServer'], stack)
|
||||||
server._sftp_files = mock.Mock()
|
server._sftp_files = mock.Mock()
|
||||||
|
@ -973,6 +974,58 @@ class CloudServersTest(HeatTestCase):
|
||||||
'autogenerated', redact=True)
|
'autogenerated', redact=True)
|
||||||
self.assertIn(expected_call, mock_data_set.call_args_list)
|
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(clients.OpenStackClients, 'nova')
|
||||||
@mock.patch.object(cloud_server.db_api, 'resource_data_set')
|
@mock.patch.object(cloud_server.db_api, 'resource_data_set')
|
||||||
def test_create_without_adminPass_attribute(self,
|
def test_create_without_adminPass_attribute(self,
|
||||||
|
|
Loading…
Reference in New Issue