Skip to content

Commit 4c9ed91

Browse files
authored
Tokenize user credentials in model, associate with passwords for secrets (#723)
* Issue #465 - Rename credential cache used in discover; add some python doc comments * Issue #465 - Use credential injector with tokenizing method; fix jython 2.7 issues in mail properties * Issue #465 - Allow for nested mail session * Issue #465 - Avoid overwriting credentials that are tokenized, including secrets * Issue #465 - Use secret names in credential injector cache; use credential injector for prepareModel; build secrets script from credential cache * Issue #465 - Revised method signatures; refactored prepareModel methods * Issue #465 - Use correct secret name for admin credentials; check domainInfo credentials * Issue #465 - Clear IDE warnings in variable-injector * Issue #465 - Substitute admin credentials correctly; use consistent check for secret credentials * Issue #465 - Avoid prepareModel warning with multiple models * Issue #465 - Use update mode in variable injector to support multiple models * Issue #465 - Filter injected WLS credentials from secrets script * Issue #465 - Convert secret name for SecurityConfig.NodeManager attributes * Issue #465 - Use placeholders for config overrides secrets; use constants for secret keys
1 parent 8887f41 commit 4c9ed91

24 files changed

+509
-437
lines changed

core/src/main/python/discover.py

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
from wlsdeploy.tool.discover.topology_discoverer import TopologyDiscoverer
4040
from wlsdeploy.tool.util import filter_helper
4141
from wlsdeploy.tool.util import model_context_helper
42+
from wlsdeploy.tool.util.credential_injector import CredentialInjector
4243
from wlsdeploy.tool.util.variable_injector import VariableInjector
4344
from wlsdeploy.tool.util import wlst_helper
4445
from wlsdeploy.tool.util.wlst_helper import WlstHelper
@@ -164,12 +165,12 @@ def __process_java_home(optional_arg_map):
164165
class_name=_class_name, method_name=_method_name)
165166

166167

167-
def __discover(model_context, aliases, injector, helper):
168+
def __discover(model_context, aliases, credential_injector, helper):
168169
"""
169170
Populate the model from the domain.
170171
:param model_context: the model context
171172
:param aliases: aliases instance for discover
172-
:param injector: variable injector instance
173+
:param credential_injector: credential injector instance
173174
:param helper: wlst_helper instance
174175
:return: the fully-populated model
175176
:raises DiscoverException: if an error occurred while discover the domain
@@ -181,14 +182,14 @@ def __discover(model_context, aliases, injector, helper):
181182
try:
182183
_add_domain_name(base_location, aliases, helper)
183184
DomainInfoDiscoverer(model_context, model.get_model_domain_info(), base_location, wlst_mode=__wlst_mode,
184-
aliases=aliases, variable_injector=injector).discover()
185+
aliases=aliases, credential_injector=credential_injector).discover()
185186
TopologyDiscoverer(model_context, model.get_model_topology(), base_location, wlst_mode=__wlst_mode,
186-
aliases=aliases, variable_injector=injector).discover()
187+
aliases=aliases, credential_injector=credential_injector).discover()
187188
ResourcesDiscoverer(model_context, model.get_model_resources(), base_location, wlst_mode=__wlst_mode,
188-
aliases=aliases, variable_injector=injector).discover()
189+
aliases=aliases, credential_injector=credential_injector).discover()
189190
DeploymentsDiscoverer(model_context, model.get_model_app_deployments(), base_location, wlst_mode=__wlst_mode,
190-
aliases=aliases, variable_injector=injector).discover()
191-
__discover_multi_tenant(model, model_context, base_location, aliases, injector)
191+
aliases=aliases, credential_injector=credential_injector).discover()
192+
__discover_multi_tenant(model, model_context, base_location, aliases, credential_injector)
192193
except AliasException, ae:
193194
wls_version = WebLogicHelper(__logger).get_actual_weblogic_version()
194195
wlst_mode = WlstModes.from_value(__wlst_mode)
@@ -228,7 +229,7 @@ def __discover_multi_tenant(model, model_context, base_location, aliases, inject
228229
:raises DiscoverException: if an error occurs during discovery
229230
"""
230231
MultiTenantDiscoverer(model, model_context, base_location,
231-
wlst_mode=__wlst_mode, aliases=aliases, variable_injector=injector).discover()
232+
wlst_mode=__wlst_mode, aliases=aliases, credential_injector=injector).discover()
232233
return
233234

234235

@@ -391,38 +392,45 @@ def __persist_model(model, model_context):
391392
return
392393

393394

394-
def __check_and_customize_model(model, model_context, aliases, password_injector):
395+
def __check_and_customize_model(model, model_context, aliases, credential_injector):
395396
"""
396397
Customize the model dictionary before persisting. Validate the model after customization for informational
397398
purposes. Any validation errors will not stop the discovered model to be persisted.
398399
:param model: completely discovered model, before any tokenization
399400
:param model_context: configuration from command-line
400401
:param aliases: used for validation if model changes are made
401-
:param password_injector: injector created to collect and tokenize passwords, possibly None
402+
:param credential_injector: injector created to collect and tokenize credentials, possibly None
402403
"""
403404
_method_name = '__check_and_customize_model'
404405
__logger.entering(class_name=_class_name, method_name=_method_name)
405406

406407
if filter_helper.apply_filters(model.get_model(), "discover", model_context):
407408
__logger.info('WLSDPLY-06014', _class_name=_class_name, method_name=_method_name)
408409

409-
cache = None
410-
if password_injector is not None:
411-
cache = password_injector.get_variable_cache()
410+
# target config always present in model context, default config if not declared
411+
target_configuration = model_context.get_target_configuration()
412412

413-
# Generate k8s create secret script, possibly using lax validation method
414-
if model_context.is_targetted_config():
415-
validation_method = model_context.get_target_configuration().get_validation_method()
416-
model_context.set_validation_method(validation_method)
417-
target_configuration_helper.generate_k8s_script(model_context, cache, model.get_model())
413+
# if target config declared, use the validation method it contains (lax, etc.)
414+
if model_context.is_targetted_config():
415+
validation_method = target_configuration.get_validation_method()
416+
model_context.set_validation_method(validation_method)
417+
418+
credential_cache = None
419+
if credential_injector is not None:
420+
credential_cache = credential_injector.get_variable_cache()
421+
422+
# Generate k8s create secret script
423+
if target_configuration.uses_credential_secrets():
424+
target_configuration_helper.generate_k8s_script(model_context, credential_cache, model.get_model())
418425

419-
# if target handles password substitution, clear property cache to keep out of variables file.
420-
if model_context.get_target_configuration().manages_credentials():
421-
cache.clear()
426+
# if target handles credential configuration, clear property cache to keep out of variables file.
427+
if model_context.get_target_configuration().manages_credentials():
428+
credential_cache.clear()
422429

423-
# Apply the injectors specified in model_variable_injector.json, or in the target configuration
430+
# Apply the injectors specified in model_variable_injector.json, or in the target configuration.
431+
# Include the variable mappings that were collected in credential_cache.
424432
variable_injector = VariableInjector(_program_name, model.get_model(), model_context,
425-
WebLogicHelper(__logger).get_actual_weblogic_version(), cache)
433+
WebLogicHelper(__logger).get_actual_weblogic_version(), credential_cache)
426434

427435
inserted, variable_model, variable_file_name = variable_injector.inject_variables_keyword_file()
428436

@@ -490,23 +498,23 @@ def main(args):
490498

491499
aliases = Aliases(model_context, wlst_mode=__wlst_mode, exception_type=ExceptionType.DISCOVER)
492500
model = None
493-
discover_injector = None
501+
credential_injector = None
494502
if model_context.get_variable_file() is not None:
495-
discover_injector = VariableInjector(_program_name, dict(), model_context,
496-
WebLogicHelper(__logger).get_actual_weblogic_version())
503+
credential_injector = CredentialInjector(_program_name, dict(), model_context,
504+
WebLogicHelper(__logger).get_actual_weblogic_version())
497505

498506
__logger.info('WLSDPLY-06025', class_name=_class_name, method_name=_method_name)
499507
else:
500508
__logger.info('WLSDPLY-06024', class_name=_class_name, method_name=_method_name)
501509

502510
try:
503-
model = __discover(model_context, aliases, discover_injector, helper)
511+
model = __discover(model_context, aliases, credential_injector, helper)
504512

505513
if model_context.is_targetted_config():
506514
# do this before variables have been inserted into model
507515
target_configuration_helper.create_additional_output(model, model_context, aliases, ExceptionType.DISCOVER)
508516

509-
model = __check_and_customize_model(model, model_context, aliases, discover_injector)
517+
model = __check_and_customize_model(model, model_context, aliases, credential_injector)
510518

511519
except DiscoverException, ex:
512520
__logger.severe('WLSDPLY-06011', _program_name, model_context.get_domain_name(),

0 commit comments

Comments
 (0)