Load undercloud DB password to a mistral environment

This patch adds a new variable to the mistral
environment 'tripleo.undercloud-config' allowing
to retrieve the root password for the MySQL
databases. Now this variable can be accessed from any
Mistral workflow.
Also, this patch adds the ability of checking if
the variables are not loaded properly due to
an upgrade, in that case we update the Mistral
environment to have all the variables in place.

Change-Id: I822c3d96b5805909656d8e92e963b851f3bd77de
This commit is contained in:
Carlos Camacho 2017-11-07 10:43:59 +00:00
parent e01745d3d8
commit be3bd48214
2 changed files with 68 additions and 17 deletions

View File

@ -949,26 +949,45 @@ class TestPostConfig(base.BaseTestCase):
ks_exceptions.NotFound)
env = {
"UNDERCLOUD_DB_PASSWORD": "root-db-pass",
"UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD": "snmpd-pass"
}
json_string = '{"undercloud_ceilometer_snmpd_password": "snmpd-pass"}'
undercloud._create_mistral_config_environment(env, mock_mistral)
json_string = {
"undercloud_db_password": "root-db-pass",
"undercloud_ceilometer_snmpd_password": "snmpd-pass"
}
undercloud._create_mistral_config_environment(json.loads(
json.dumps(env, sort_keys=True)), mock_mistral)
mock_mistral.environments.create.assert_called_once_with(
name="tripleo.undercloud-config",
variables=json_string)
name='tripleo.undercloud-config',
description='Undercloud configuration parameters',
variables=json.dumps(json_string, sort_keys=True))
def test_create_config_environment_existing(self):
mock_mistral = mock.Mock()
environment = collections.namedtuple('environment', ['name'])
mock_mistral.environments.get.return_value = environment(
name='overcloud')
env = {
"UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD": "snmpd-pass"
environment = collections.namedtuple('environment',
['name', 'variables'])
json_string = {
"undercloud_db_password": "root-db-pass",
"undercloud_ceilometer_snmpd_password": "snmpd-pass"
}
undercloud._create_mistral_config_environment(env, mock_mistral)
mock_mistral.environments.get.return_value = environment(
name='tripleo.undercloud-config',
variables=json.loads(json.dumps(json_string, sort_keys=True))
)
env = {
"UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD": "snmpd-pass",
"UNDERCLOUD_DB_PASSWORD": "root-db-pass"
}
undercloud._create_mistral_config_environment(json.loads(
json.dumps(env, sort_keys=True)), mock_mistral)
mock_mistral.executions.create.assert_not_called()
def test_prepare_ssh_environment(self):

View File

@ -1583,19 +1583,51 @@ def _clean_os_collect_config():
def _create_mistral_config_environment(instack_env, mistral):
# Store the snmpd password in a Mistral environment so it can be accessed
# Store all the required passwords from the Undercloud
# in a Mistral environment so they can be accessed
# by the Mistral actions.
snmpd_password = instack_env["UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD"]
env_name = "tripleo.undercloud-config"
config_data = {
'undercloud_ceilometer_snmpd_password':
instack_env['UNDERCLOUD_CEILOMETER_SNMPD_PASSWORD'],
'undercloud_db_password':
instack_env['UNDERCLOUD_DB_PASSWORD']
}
env_name = 'tripleo.undercloud-config'
try:
mistral.environments.get(env_name)
env_data = mistral.environments.get(env_name).variables
except ks_exceptions.NotFound:
# If the environment is not created, we need to
# create it with the information in config_data
mistral.environments.create(
name=env_name,
variables=json.dumps({
"undercloud_ceilometer_snmpd_password": snmpd_password
}))
description='Undercloud configuration parameters',
variables=json.dumps(config_data, sort_keys=True)
)
return
# If we are upgrading from an environment without
# variables defined in config_data, we need to update
# the environment variables.
for var, value in iter(config_data.items()):
if var in env_data:
if env_data[var] != config_data[var]:
# Value in config_data is different
# need to update
env_data[var] = value
else:
# The value in config_data
# is new, we need to add it
env_data[var] = value
# Here we update the current environment
# with the variables updated
mistral.environments.update(
name=env_name,
description='Undercloud configuration parameters',
variables=json.dumps(env_data, sort_keys=True)
)
def _wait_for_mistral_execution(timeout_at, mistral, execution, message='',