Allow specifying of a global --password option

This fixes bz#1108742 by providing a new global parameter
"--default-password", that will be the default for all other password
parameters if set. Each individual password parameter can override the
default global, and if none are set, a random password will be used as
before.

As part of the change, process_param_value() has been updated, to avoid
leaking passwords when they are modified by a processor function.

Change-Id: Ic5947567599c8b221b7a9e60acb4708429507741
This commit is contained in:
Javier Pena 2014-09-17 16:15:03 +02:00
parent a45eaf6128
commit 512bdce979
18 changed files with 181 additions and 62 deletions

View File

@ -43,7 +43,10 @@ Global Options
Set to 'y' if you would like Packstack to install the OpenStack Client packages. An admin "rc" file will also be installed ['y', 'n'].
**CONFIG_NTP_SERVERS**
Comma separated list of NTP servers. Leave plain if Packstack should not install ntpd on instances..
Comma separated list of NTP servers. Leave plain if Packstack should not install ntpd on instances.
**CONFIG_DEFAULT_PASSWORD**
A default password to be used on all services, databases, keys, etc. It will be overriden by any explicitly set password. Leave plain to not set a default password.
**CONFIG_NAGIOS_INSTALL**
Set to 'y' if you would like Packstack to install Nagios to monitor openstack hosts ['y', 'n'].

View File

@ -85,5 +85,5 @@ ERR_FAILURE="General failure"
ERR_NO_ANSWER_FILE="Error: Could not find file %s"
ERR_ONLY_1_FLAG="Error: The %s flag is mutually exclusive to all other command line options"
ERR_REMOVE_REMOTE_VAR="Error: Failed to remove directory %s on %s, it contains sensitive data and should be removed"
ERR_REMOVE_TMP_FILE="Error: Failed to remove temporary file %s, it contains sensitive data and should be removed"
#

View File

@ -2,6 +2,7 @@
import netaddr
import os
import uuid
from .utils import ScriptRunner, force_ip
from .exceptions import ParamProcessingError, NetworkError
@ -11,7 +12,7 @@ __all__ = ('ParamProcessingError', 'process_cidr', 'process_host',
'process_ssh_key')
def process_cidr(param, process_args=None):
def process_cidr(param, param_name, process_args=None):
"""
Corrects given CIDR if necessary.
"""
@ -24,7 +25,7 @@ def process_cidr(param, process_args=None):
raise ParamProcessingError(str(ex))
def process_host(param, process_args=None):
def process_host(param, param_name, process_args=None):
"""
Tries to change given parameter to IP address, if it is in hostname
format
@ -37,7 +38,7 @@ def process_host(param, process_args=None):
raise ParamProcessingError(str(ex))
def process_ssh_key(param, process_args=None):
def process_ssh_key(param, param_name, process_args=None):
"""
Generates SSH key if given key in param doesn't exist. In case param
is an empty string it generates default SSH key ($HOME/.ssh/id_rsa).
@ -63,7 +64,7 @@ def process_ssh_key(param, process_args=None):
return param
def process_add_quotes_around_values(param, process_args=None):
def process_add_quotes_around_values(param, param_name, process_args=None):
"""
Add a single quote character around each element of a comma
separated list of values
@ -77,3 +78,33 @@ def process_add_quotes_around_values(param, process_args=None):
params_list[index] = elem
param = ','.join(params_list)
return param
def process_password(param, param_name, process_args=None):
"""
Process passwords, checking the following:
1- If there is a user-entered password, use it
2- Otherwise, check for a global default password, and use it if available
3- As a last resort, generate a random password
"""
if not hasattr(process_password,"pw_dict"):
process_password.pw_dict = {}
if param == "PW_PLACEHOLDER":
if process_args["CONFIG_DEFAULT_PASSWORD"] != "":
param = process_args["CONFIG_DEFAULT_PASSWORD"]
else:
# We need to make sure we store the random password we provide
# and return it once we are asked for it again
if param_name.endswith("_CONFIRMED"):
unconfirmed_param = param_name[:-10]
if unconfirmed_param in process_password.pw_dict:
param = process_password.pw_dict[unconfirmed_param]
else:
param = uuid.uuid4().hex[:16]
process_password.pw_dict[unconfirmed_param] = param
elif not param_name in process_password.pw_dict:
param = uuid.uuid4().hex[:16]
process_password.pw_dict[param_name] = param
else:
param = process_password.pw_dict[param_name]
return param

View File

@ -30,7 +30,7 @@ commandLineValues = {}
# List to hold all values to be masked in logging (i.e. passwords and sensitive data)
#TODO: read default values from conf_param?
masked_value_set = set()
tmpfiles = []
def initLogging (debug):
global logFile
@ -147,8 +147,7 @@ def input_param(param):
confirmedParamName = param.CONF_NAME + "_CONFIRMED"
confirmedParam.CONF_NAME = confirmedParamName
confirmedParam.PROMPT = output_messages.INFO_CONF_PARAMS_PASSWD_CONFIRM_PROMPT
confirmedParam.VALIDATORS = [validators.validate_not_empty]
# Now get both values from user (with existing validations
# Now get both values from user (with existing validations)
while True:
_getInputFromUser(param)
_getInputFromUser(confirmedParam)
@ -274,10 +273,11 @@ def process_param_value(param, value):
logging.debug("Processing value of parameter "
"%s." % param.CONF_NAME)
try:
new_value = proc_func(_value, controller.CONF)
new_value = proc_func(_value, param.CONF_NAME, controller.CONF)
if new_value != _value:
msg = output_messages.INFO_CHANGED_VALUE
print msg % (_value, new_value)
if param.MASK_INPUT == False:
msg = output_messages.INFO_CHANGED_VALUE
print msg % (_value, new_value)
_value = new_value
else:
logging.debug("Processor returned the original "
@ -429,6 +429,19 @@ def _getanswerfilepath():
controller.MESSAGES.append(msg)
return path
def _gettmpanswerfilepath():
path = None
msg = "Could not find a suitable path on which to create the temporary answerfile"
ts = datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
p = os.path.expanduser("~/")
if os.access(p, os.W_OK):
path = os.path.abspath(os.path.join(p, "tmp-packstack-answers-%s.txt"%ts))
tmpfiles.append(path)
return path
def _handleInteractiveParams():
try:
logging.debug("Groups: %s" % ', '.join([x.GROUP_NAME for x in controller.getAllGroups()]))
@ -474,13 +487,8 @@ def _handleInteractiveParams():
else:
logging.debug("no post condition check for group %s" % group.GROUP_NAME)
path = _getanswerfilepath()
_displaySummary()
if path:
generateAnswerFile(path)
except KeyboardInterrupt:
logging.error("keyboard interrupt caught")
raise Exception(output_messages.ERR_EXP_KEYBOARD_INTERRUPT)
@ -589,6 +597,11 @@ def _main(configFile=None):
# Get parameters
_handleParams(configFile)
# Generate answer file
path = _getanswerfilepath()
if path:
generateAnswerFile(path)
# Update masked_value_list with user input values
_updateMaskedValueSet()
@ -634,6 +647,20 @@ def remove_remote_var_dirs():
logging.exception(e)
controller.MESSAGES.append(utils.color_text(msg, 'red'))
def remove_temp_files():
"""
Removes any temporary files generated during
configuration
"""
for myfile in tmpfiles:
try:
os.unlink(myfile)
except Exception as e:
msg = output_messages.ERR_REMOVE_TMP_FILE % (myfile)
logging.error(msg)
logging.exception(e)
controller.MESSAGES.append(utils.color_text(msg, 'red'))
def generateAnswerFile(outputFile, overrides={}):
sep = os.linesep
@ -688,7 +715,7 @@ def single_step_aio_install(options):
single_step_install(options)
def single_step_install(options):
answerfilepath = _getanswerfilepath()
answerfilepath = _gettmpanswerfilepath()
if not answerfilepath:
_printAdditionalMessages()
return
@ -892,6 +919,12 @@ def main():
if options.gen_answer_file:
# Make sure only --gen-answer-file was supplied
validateSingleFlag(options, "gen_answer_file")
answerfilepath = _gettmpanswerfilepath()
if not answerfilepath:
_printAdditionalMessages()
return
generateAnswerFile(answerfilepath)
_handleParams(answerfilepath)
generateAnswerFile(options.gen_answer_file)
# Are we installing an all in one
elif options.allinone:
@ -926,6 +959,7 @@ def main():
finally:
remove_remote_var_dirs()
remove_temp_files()
# Always print user params to log
_printAdditionalMessages()

View File

@ -9,6 +9,7 @@ import uuid
import os
from packstack.installer import validators
from packstack.installer import processors
from packstack.installer import basedefs
from packstack.installer import utils
@ -95,12 +96,13 @@ def initConfig(controller):
"PROMPT": "Enter the password for NSS certificate database",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:32],
"MASK_INPUT": False,
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_AMQP_NSS_CERTDB_PW",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"NEED_CONFIRM": True,
"CONDITION": False},
{"CMD_OPTION": "amqp-ssl-port",
@ -186,12 +188,13 @@ def initConfig(controller):
"PROMPT": "Enter the password for user authentication",
"OPTION_LIST": ["y", "n"],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"MASK_INPUT": False,
"PROCESSORS": [processors.process_password],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"MASK_INPUT": True,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_AMQP_AUTH_PASSWORD",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"NEED_CONFIRM": True,
"CONDITION": False},
]
group = {"GROUP_NAME": "AMQPAUTH",

View File

@ -10,6 +10,7 @@ import uuid
from packstack.installer import utils
from packstack.installer import validators
from packstack.installer import processors
from packstack.modules.shortcuts import get_mq
from packstack.modules.ospluginutils import (getManifestTemplate,
appendManifestFile)
@ -44,10 +45,11 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Ceilometer Keystone access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
],

View File

@ -43,11 +43,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Cinder DB access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_CINDER_DB_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
@ -57,11 +58,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Cinder Keystone access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_CINDER_KS_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},

View File

@ -8,6 +8,7 @@ import uuid
import logging
from packstack.installer import validators
from packstack.installer import processors
from packstack.installer import basedefs
from packstack.installer import utils
from packstack.installer.utils import split_hosts
@ -29,11 +30,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Glance DB access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"PROCESSORS": [processors.process_password],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_GLANCE_DB_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
@ -43,11 +45,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Glance Keystone access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"PROCESSORS": [processors.process_password],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_GLANCE_KS_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
]

View File

@ -10,6 +10,7 @@ import os
from packstack.installer import utils
from packstack.installer import validators
from packstack.installer import processors
from packstack.modules.shortcuts import get_mq
from packstack.modules.ospluginutils import (getManifestTemplate,
@ -31,11 +32,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Heat MySQL user",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_HEAT_DB_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
@ -60,11 +62,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Heat Keystone access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_HEAT_KS_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
@ -142,12 +145,13 @@ def initConfig(controller):
"PROMPT": "Enter password for Keystone domain admin user for Heat",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"MASK_INPUT": False,
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_HEAT_DOMAIN_PASSWORD",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"NEED_CONFIRM": True,
"CONDITION": False},
]
group = {"GROUP_NAME": "Heat",

View File

@ -8,6 +8,7 @@ import logging
import uuid
from packstack.installer import validators
from packstack.installer import processors
from packstack.installer import basedefs
from packstack.installer import utils
@ -28,11 +29,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Keystone DB access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"PROCESSORS": [processors.process_password],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_KEYSTONE_DB_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
@ -54,7 +56,8 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Keystone admin user",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_KEYSTONE_ADMIN_PW",
@ -67,7 +70,8 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Keystone demo user",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_KEYSTONE_DEMO_PW",

View File

@ -8,6 +8,7 @@ import uuid
import logging
from packstack.installer import validators
from packstack.installer import processors
from packstack.installer import utils
from packstack.installer.utils import split_hosts
from packstack.modules.common import filtered_hosts
@ -59,7 +60,8 @@ def initConfig(controller):
"PROMPT": "Enter the password for the MariaDB admin user",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"PROCESSORS": [processors.process_password],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"MASK_INPUT": True,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_MARIADB_PW",

View File

@ -8,6 +8,7 @@ import uuid
import logging
from packstack.installer import validators
from packstack.installer import processors
from packstack.installer import basedefs, output_messages
from packstack.installer import utils
@ -29,7 +30,8 @@ def initConfig(controller):
"PROMPT": "Enter the password for the nagiosadmin user",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"PROCESSORS": [processors.process_password],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"MASK_INPUT": True,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_NAGIOS_PW",

View File

@ -12,6 +12,7 @@ import uuid
from packstack.installer import utils
from packstack.installer import exceptions
from packstack.installer import validators
from packstack.installer import processors
from packstack.installer import output_messages
from packstack.installer.utils import split_hosts
@ -36,11 +37,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for Neutron Keystone access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_NEUTRON_KS_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
@ -49,11 +51,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for Neutron DB access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_NEUTRON_DB_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
@ -93,11 +96,12 @@ def initConfig(controller):
"PROMPT": "Enter Neutron metadata agent password",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_NEUTRON_METADATA_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},

View File

@ -39,11 +39,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Nova DB access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_NOVA_DB_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
@ -53,11 +54,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Nova Keystone access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_NOVA_KS_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},

View File

@ -53,6 +53,25 @@ def initConfig(controller):
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "default-password",
"USAGE": (
"Set a default password everywhere. The default password "
"will be overriden by whatever password is set for each "
"individual service or user."
),
"PROMPT": (
"Enter a default password to be used. Leave blank for a "
"randomly generated one."
),
"OPTION_LIST": [],
"DEFAULT_VALUE": '',
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_DEFAULT_PASSWORD",
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},
{"CMD_OPTION": "mariadb-install",
"USAGE": (
"Set to 'y' if you would like Packstack to install MariaDB"

View File

@ -9,6 +9,7 @@ import uuid
from packstack.installer import utils
from packstack.installer import validators
from packstack.installer import processors
from packstack.modules.common import is_all_in_one
from packstack.modules.ospluginutils import (appendManifestFile,
@ -81,7 +82,8 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Tempest Provisioning user",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_PROVISION_TEMPEST_USER_PW",

View File

@ -11,6 +11,7 @@ import logging
import netaddr
from packstack.installer import validators
from packstack.installer import processors
from packstack.installer.exceptions import ParamValidationError
from packstack.installer import basedefs
from packstack.installer import utils
@ -34,11 +35,12 @@ def initConfig(controller):
"PROMPT": "Enter the password for the Swift Keystone access",
"OPTION_LIST": [],
"VALIDATORS": [validators.validate_not_empty],
"DEFAULT_VALUE": uuid.uuid4().hex[:16],
"DEFAULT_VALUE": "PW_PLACEHOLDER",
"PROCESSORS": [processors.process_password],
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SWIFT_KS_PW",
"USE_DEFAULT": True,
"USE_DEFAULT": False,
"NEED_CONFIRM": True,
"CONDITION": False},

View File

@ -27,13 +27,13 @@ from ..test_base import PackstackTestCaseMixin
class ProcessorsTestCase(PackstackTestCaseMixin, TestCase):
def test_process_host(self):
"""Test packstack.installer.processors.process_host"""
proc_local = process_host('localhost',
proc_local = process_host('localhost', 'HOSTNAME',
process_args={'allow_localhost': True})
self.assertIn(proc_local, ['127.0.0.1', '::1'])
def test_process_ssh_key(self):
"""Test packstack.installer.processors.process_ssh_key"""
path = process_ssh_key(os.path.join(self.tempdir, 'id_rsa'))
path = process_ssh_key(os.path.join(self.tempdir, 'id_rsa'), 'SSH_KEY')
# test if key was created
self.assertEquals(True, bool(path))
# test if key exists