Skip to content

Commit f9d9d83

Browse files
committed
Merge branch 'jira-wdt-904-isset' into 'main'
Use offline isSet method where relevant to get default values See merge request weblogic-cloud/weblogic-deploy-tooling!1737
2 parents c91fbc2 + 74c7df2 commit f9d9d83

30 files changed

+809
-365
lines changed

core/src/main/python/wlsdeploy/aliases/aliases.py

Lines changed: 107 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,16 +1113,17 @@ def get_model_uses_path_tokens_attribute_names(self, location, only_readable=Fal
11131113
# Although the wlst_attribute_value may be a password field, logging it is probably OK since the password is
11141114
# encrypted, just like it is in config.xml.
11151115
#
1116-
def get_model_attribute_name_and_value(self, location, wlst_attribute_name, wlst_attribute_value):
1116+
def get_model_attribute_name_and_value(self, location, wlst_attribute_name, wlst_attribute_value,
1117+
ignore_default_match=False):
11171118
"""
11181119
Returns the model attribute name and value for the specified WLST attribute name and value.
1119-
1120-
model_attribute_value will be set to None, if value assigned to wlst_attribute_value arg
1121-
is the default value for model_attribute_name.
1120+
By default, the model value returned will be None if it matches the default value.
1121+
If ignore_default_match is True, the model value will be returned regardless of the default value.
11221122
:param location: the location
11231123
:param wlst_attribute_name: the WLST attribute name
11241124
:param wlst_attribute_value: the WLST attribute value
1125-
:return: the name and value
1125+
:param ignore_default_match: if True, return the model value regardless of the default value
1126+
:return: the model attribute name and value
11261127
:raises: Tool type exception: if an error occurs
11271128
"""
11281129
_method_name = 'get_model_attribute_name_and_value'
@@ -1131,77 +1132,26 @@ def get_model_attribute_name_and_value(self, location, wlst_attribute_name, wlst
11311132

11321133
try:
11331134
model_attribute_name = None
1134-
# Assume wlst_attribute_value is the same as default value of model_attribute_name
11351135
model_attribute_value = None
11361136

11371137
attribute_info = self._alias_entries.get_alias_attribute_entry_by_wlst_name(location, wlst_attribute_name)
11381138
if attribute_info is not None and not self.__is_model_attribute_ignored(location, attribute_info):
1139-
data_type, preferred_type, delimiter = \
1140-
alias_utils.compute_read_data_type_for_wlst_and_delimiter_from_attribute_info(attribute_info,
1141-
wlst_attribute_value)
1142-
model_type = data_type
1143-
if preferred_type:
1144-
model_type = preferred_type
1145-
1146-
converted_value = alias_utils.convert_to_model_type(model_type, wlst_attribute_value,
1147-
delimiter=delimiter)
1148-
11491139
model_attribute_name = attribute_info[MODEL_NAME]
1150-
default_value = self._get_default_value_for_execution_mode(attribute_info)
11511140

1152-
#
1153-
# The logic below to compare the str() representation of the converted value and the default value
1154-
# only works for lists/maps if both the converted value and the default value are the same data type...
1155-
#
1156-
if (model_type in ALIAS_LIST_TYPES or model_type in ALIAS_MAP_TYPES) \
1157-
and not (default_value == '[]' or default_value is None):
1158-
# always the model delimiter
1159-
default_value = alias_utils.convert_to_type(model_type, default_value,
1160-
delimiter=MODEL_LIST_DELIMITER)
1161-
1162-
if attribute_info[WLST_TYPE] == STRING and default_value:
1163-
default_value = alias_utils.replace_tokens_in_path(location, default_value)
1164-
1165-
if model_type == 'password':
1166-
# WDT doesn't really understand PyArray so convert it to a string before proceeding.
1167-
if isinstance(wlst_attribute_value, array.array):
1168-
wlst_attribute_value = wlst_attribute_value.tostring()
1169-
1170-
if string_utils.is_empty(wlst_attribute_value) or converted_value == default_value:
1171-
model_attribute_value = None
1172-
else:
1173-
model_attribute_value = wlst_attribute_value
1174-
1175-
elif model_type == 'boolean':
1176-
# some boolean attributes have WLST value of null until they are set
1177-
wlst_boolean = _get_boolean_or_none(wlst_attribute_value) # from unconverted value
1178-
default_boolean = _get_boolean_or_none(default_value)
1179-
if wlst_boolean == default_boolean:
1180-
model_attribute_value = None
1181-
else:
1182-
model_attribute_value = converted_value
1141+
wlst_type, preferred_type, delimiter = \
1142+
alias_utils.compute_read_data_type_for_wlst_and_delimiter_from_attribute_info(
1143+
attribute_info, wlst_attribute_value)
11831144

1184-
elif (model_type in ALIAS_LIST_TYPES or data_type in ALIAS_MAP_TYPES) and \
1185-
(converted_value is None or len(converted_value) == 0):
1186-
if default_value == '[]' or default_value is None:
1187-
model_attribute_value = None
1188-
1189-
elif self._model_context is not None and USES_PATH_TOKENS in attribute_info:
1190-
if attribute_info[WLST_TYPE] == STRING:
1191-
model_attribute_value = self._model_context.tokenize_path(converted_value)
1192-
else:
1193-
model_attribute_value = self._model_context.tokenize_classpath(converted_value)
1194-
if model_attribute_value == default_value:
1195-
model_attribute_value = None
1145+
model_type = wlst_type
1146+
if preferred_type:
1147+
model_type = preferred_type
11961148

1197-
elif default_value is None:
1198-
model_attribute_value = converted_value
1149+
default_value = None
1150+
if not ignore_default_match:
1151+
default_value = self._get_model_attribute_default_value(location, attribute_info, model_type)
11991152

1200-
elif str_helper.to_string(converted_value) != str_helper.to_string(default_value):
1201-
if _strings_are_empty(converted_value, default_value):
1202-
model_attribute_value = None
1203-
else:
1204-
model_attribute_value = converted_value
1153+
model_attribute_value = self._get_model_attribute_value(
1154+
wlst_attribute_value, default_value, attribute_info, model_type, delimiter)
12051155

12061156
self._logger.exiting(class_name=self._class_name, method_name=_method_name,
12071157
result={model_attribute_name: model_attribute_value})
@@ -1211,6 +1161,82 @@ def get_model_attribute_name_and_value(self, location, wlst_attribute_name, wlst
12111161
self._raise_exception(ae, _method_name, 'WLSDPLY-19028', str_helper.to_string(location),
12121162
ae.getLocalizedMessage())
12131163

1164+
def _get_model_attribute_default_value(self, location, attribute_info, model_type):
1165+
"""
1166+
Returns the default value for the specified attribute_info and location.
1167+
The default value may need some adjustments to be used for comparison with the model value.
1168+
:param location: the location of the attribute
1169+
:param attribute_info: information about the attribute from the aliases
1170+
:param model_type: the model type to use for any conversion
1171+
:return: the default value
1172+
"""
1173+
default_value = self._get_default_value_for_execution_mode(attribute_info)
1174+
1175+
# The compare logic compares the str() representation of the converted value and the default value
1176+
# only works for lists/maps if both the converted value and the default value are the same data type...
1177+
if (model_type in ALIAS_LIST_TYPES or model_type in ALIAS_MAP_TYPES) \
1178+
and not (default_value == '[]' or default_value is None):
1179+
1180+
default_value = alias_utils.convert_to_type(
1181+
model_type, default_value, delimiter=MODEL_LIST_DELIMITER) # always the model delimiter
1182+
1183+
if attribute_info[WLST_TYPE] == STRING and default_value:
1184+
# the alias default may contain location tokens, such as "logs/%SERVERTEMPLATE%.log"
1185+
default_value = alias_utils.replace_tokens_in_path(location, default_value)
1186+
1187+
return default_value
1188+
1189+
def _get_model_attribute_value(self, wlst_value, default_value, attribute_info, model_type, delimiter):
1190+
"""
1191+
Returns the model attribute value for the specified WLST value and default value.
1192+
The model value returned will be None if it matches the default model value.
1193+
:param wlst_value: the attribute value from WLST
1194+
:param default_value: the default value to use for comparison
1195+
:param attribute_info: information about the attribute from the aliases
1196+
:param model_type: the model type to use for any conversion
1197+
:param delimiter: the delimiter used for parsing the WLST value
1198+
:return: the value for use in the model
1199+
"""
1200+
converted_value = alias_utils.convert_to_model_type(model_type, wlst_value, delimiter=delimiter)
1201+
1202+
# tokenize model paths, such as "@@ORACLE_HOME@@/directory"
1203+
1204+
if converted_value and (USES_PATH_TOKENS in attribute_info):
1205+
if attribute_info[WLST_TYPE] == STRING:
1206+
converted_value = self._model_context.tokenize_path(converted_value)
1207+
else:
1208+
converted_value = self._model_context.tokenize_classpath(converted_value)
1209+
1210+
# Compare model value with default
1211+
1212+
result_model_value = None
1213+
1214+
if model_type == 'boolean':
1215+
# some boolean attributes have WLST value of null until they are set
1216+
result_model_value = _get_boolean_or_none(wlst_value) # from unconverted value
1217+
default_boolean = _get_boolean_or_none(default_value)
1218+
if result_model_value == default_boolean:
1219+
result_model_value = None
1220+
else:
1221+
result_model_value = converted_value
1222+
1223+
elif (model_type in ALIAS_LIST_TYPES or model_type in ALIAS_MAP_TYPES) and \
1224+
(converted_value is None or len(converted_value) == 0):
1225+
# match empty lists or maps to default values "[]" or None
1226+
if default_value == '[]' or default_value is None:
1227+
result_model_value = None
1228+
1229+
elif default_value is None:
1230+
result_model_value = converted_value
1231+
1232+
elif str_helper.to_string(converted_value) != str_helper.to_string(default_value):
1233+
if _strings_are_empty(converted_value, default_value):
1234+
result_model_value = None
1235+
else:
1236+
result_model_value = converted_value
1237+
1238+
return result_model_value
1239+
12141240
def get_model_attribute_name(self, location, wlst_attribute_name, exclude_ignored=True):
12151241
"""
12161242
Returns the model attribute name for the specified WLST attribute name and value. If the model attribute name
@@ -1462,6 +1488,20 @@ def decrypt_password(self, text):
14621488

14631489
return rtnval
14641490

1491+
def get_production_default(self, location, model_attribute):
1492+
result = None
1493+
attribute_info = self._alias_entries.get_alias_attribute_entry_by_model_name(location, model_attribute)
1494+
if attribute_info is not None and PRODUCTION_DEFAULT in attribute_info:
1495+
result = attribute_info[PRODUCTION_DEFAULT]
1496+
return result
1497+
1498+
def get_secure_default(self, location, model_attribute):
1499+
result = None
1500+
attribute_info = self._alias_entries.get_alias_attribute_entry_by_model_name(location, model_attribute)
1501+
if attribute_info is not None and SECURE_DEFAULT in attribute_info:
1502+
result = attribute_info[SECURE_DEFAULT]
1503+
return result
1504+
14651505
def is_derived_default(self, location, model_attribute):
14661506
"""
14671507
Return whether the default is derived by WLST.

0 commit comments

Comments
 (0)