Skip to content

Commit 3c45afa

Browse files
delay delete until after set server groups (WDT-790) (#808)
1 parent 5b00a44 commit 3c45afa

File tree

6 files changed

+113
-60
lines changed

6 files changed

+113
-60
lines changed

core/src/main/python/update.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,10 @@ def __update_online(model, model_context, aliases):
138138

139139
__logger.info("WLSDPLY-09007", admin_url, method_name=_method_name, class_name=_class_name)
140140

141+
topology_updater = TopologyUpdater(model, model_context, aliases, wlst_mode=WlstModes.ONLINE)
141142
try:
142-
topology_updater = TopologyUpdater(model, model_context, aliases, wlst_mode=WlstModes.ONLINE)
143-
topology_updater.update()
144-
model_deployer.deploy_resources(model, model_context, aliases, wlst_mode=__wlst_mode)
143+
topology_updater.update_machines_clusters_and_servers(delete_now=False)
144+
topology_updater.warn_set_server_groups()
145145
except DeployException, de:
146146
__release_edit_session_and_disconnect()
147147
raise de
@@ -160,6 +160,13 @@ def __update_online(model, model_context, aliases):
160160
except BundleAwareException, ex:
161161
raise ex
162162

163+
try:
164+
topology_updater.update()
165+
model_deployer.deploy_resources(model, model_context, aliases, wlst_mode=__wlst_mode)
166+
except DeployException, de:
167+
__release_edit_session_and_disconnect()
168+
raise de
169+
163170
exit_code = __check_update_require_domain_restart(model_context)
164171
# if user requested rollback if restart required stops
165172

@@ -225,10 +232,15 @@ def __update_offline(model, model_context, aliases):
225232
__wlst_helper.read_domain(domain_home)
226233

227234
topology_updater = TopologyUpdater(model, model_context, aliases, wlst_mode=WlstModes.OFFLINE)
228-
topology_updater.update()
235+
# deleting servers that are added by templates before set server groups causes mayhem
236+
topology_updater.update_machines_clusters_and_servers(delete_now=False)
237+
238+
__update_offline_domain()
229239

230240
topology_updater.set_server_groups()
231241

242+
topology_updater.update()
243+
232244
# Add resources after server groups are established to prevent auto-renaming
233245
model_deployer.deploy_model_offline(model, model_context, aliases, wlst_mode=__wlst_mode)
234246
if model_context.get_update_rcu_schema_pass() is True:

core/src/main/python/wlsdeploy/tool/create/creator.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def __init__(self, model, model_context, aliases, exception_type=ExceptionType.C
4545
self.files_to_extract_from_archive = list()
4646
return
4747

48-
def _create_named_mbeans(self, type_name, model_nodes, base_location, log_created=False):
48+
def _create_named_mbeans(self, type_name, model_nodes, base_location, log_created=False, delete_now=True):
4949
"""
5050
Create the specified type of MBeans that support multiple instances in the specified location.
5151
:param type_name: the model folder type
@@ -71,7 +71,8 @@ def _create_named_mbeans(self, type_name, model_nodes, base_location, log_create
7171
for model_name in model_nodes.keys():
7272
name = self.wlst_helper.get_quoted_name_for_wlst(model_name)
7373
if model_helper.is_delete_name(name):
74-
deployer_utils.delete_named_element(location, name, existing_folder_names, self.aliases)
74+
if delete_now:
75+
deployer_utils.delete_named_element(location, name, existing_folder_names, self.aliases)
7576
continue
7677

7778
if token_name is not None:

core/src/main/python/wlsdeploy/tool/create/domain_creator.py

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def create(self):
187187
return
188188

189189
# Override
190-
def _create_named_mbeans(self, type_name, model_nodes, base_location, log_created=False):
190+
def _create_named_mbeans(self, type_name, model_nodes, base_location, log_created=False, delete_now=True):
191191
"""
192192
Override default behavior to create placeholders for referenced Coherence clusters.
193193
:param type_name: the model folder type
@@ -199,7 +199,7 @@ def _create_named_mbeans(self, type_name, model_nodes, base_location, log_create
199199
self.topology_helper.check_coherence_cluster_references(type_name, model_nodes)
200200
# continue with regular processing
201201

202-
Creator._create_named_mbeans(self, type_name, model_nodes, base_location, log_created=log_created)
202+
Creator._create_named_mbeans(self, type_name, model_nodes, base_location, log_created=log_created, delete_now=delete_now)
203203

204204
# Override
205205
def _create_mbean(self, type_name, model_nodes, base_location, log_created=False):
@@ -469,7 +469,7 @@ def __extend_domain(self, domain_home):
469469
self.wlst_helper.add_template(custom_template)
470470

471471
topology_folder_list = self.aliases.get_model_topology_top_level_folder_names()
472-
self.__apply_base_domain_config(topology_folder_list)
472+
self.__create_machines_clusters_and_servers(delete_now=False)
473473
self.__configure_fmw_infra_database()
474474

475475
if self.wls_helper.is_set_server_groups_supported():
@@ -485,6 +485,7 @@ def __extend_domain(self, domain_home):
485485
self.logger.info('WLSDPLY-12209', self._domain_name,
486486
class_name=self.__class_name, method_name=_method_name)
487487

488+
self.__apply_base_domain_config(topology_folder_list)
488489
self.logger.exiting(class_name=self.__class_name, method_name=_method_name)
489490
return
490491

@@ -538,7 +539,11 @@ def __extend_domain_with_select_template(self, domain_home):
538539
self.__configure_fmw_infra_database()
539540
self.__configure_opss_secrets()
540541
topology_folder_list = self.aliases.get_model_topology_top_level_folder_names()
541-
self.__apply_base_domain_config(topology_folder_list)
542+
543+
self.__create_security_folder()
544+
topology_folder_list.remove(SECURITY)
545+
546+
self.__create_machines_clusters_and_servers(delete_now=False)
542547

543548
server_groups_to_target = self._domain_typedef.get_server_groups_to_target()
544549
dynamic_cluster_server_groups_to_target = self._domain_typedef.get_dynamic_cluster_server_groups()
@@ -552,6 +557,8 @@ def __extend_domain_with_select_template(self, domain_home):
552557
if len(dynamic_assigns) > 0:
553558
self.target_helper.target_dynamic_server_groups(dynamic_assigns)
554559

560+
self.__apply_base_domain_config(topology_folder_list)
561+
555562
self.logger.info('WLSDPLY-12205', self._domain_name, domain_home,
556563
class_name=self.__class_name, method_name=_method_name)
557564
self.wlst_helper.write_domain(domain_home)
@@ -568,7 +575,8 @@ def __set_server_groups(self):
568575
if self.wls_helper.is_set_server_groups_supported():
569576
# 12c versions set server groups directly
570577
server_groups_to_target = self._domain_typedef.get_server_groups_to_target()
571-
server_assigns, dynamic_assigns = self.target_helper.target_server_groups_to_servers(server_groups_to_target)
578+
server_assigns, dynamic_assigns = \
579+
self.target_helper.target_server_groups_to_servers(server_groups_to_target)
572580
if len(server_assigns) > 0:
573581
self.target_helper.target_server_groups(server_assigns)
574582

@@ -603,26 +611,19 @@ def __apply_base_domain_config(self, topology_folder_list):
603611
domain_name_token = self.aliases.get_name_token(location)
604612
location.add_name_token(domain_name_token, self._domain_name)
605613

606-
self.__create_security_folder(location)
607-
topology_folder_list.remove(SECURITY)
608-
609614
topology_folder_list.remove(SECURITY_CONFIGURATION)
610615

611616
self.__create_mbeans_used_by_topology_mbeans(location, topology_folder_list)
612617

613-
self.__create_machines(location)
618+
self.__create_machines_clusters_and_servers()
614619
topology_folder_list.remove(MACHINE)
615620
topology_folder_list.remove(UNIX_MACHINE)
616-
617-
self.__create_clusters_and_servers(location)
618621
topology_folder_list.remove(CLUSTER)
619622
if SERVER_TEMPLATE in topology_folder_list:
620623
topology_folder_list.remove(SERVER_TEMPLATE)
621624
topology_folder_list.remove(SERVER)
622-
623-
self.__create_migratable_targets(location)
624625
topology_folder_list.remove(MIGRATABLE_TARGET)
625-
626+
#
626627
self.__create_other_domain_artifacts(location, topology_folder_list)
627628

628629
self.logger.exiting(class_name=self.__class_name, method_name=_method_name)
@@ -667,14 +668,16 @@ def __create_mbeans_used_by_topology_mbeans(self, location, topology_folder_list
667668
self.__create_xml_registry(location)
668669
topology_folder_list.remove(XML_REGISTRY)
669670

670-
def __create_security_folder(self, location):
671+
def __create_security_folder(self):
671672
"""
672673
Create the /Security folder objects, if any.
673-
:param location: the location to use
674674
:raises: CreateException: if an error occurs
675675
"""
676676
_method_name = '__create_security_folder'
677677

678+
location = LocationContext()
679+
domain_name_token = self.aliases.get_name_token(location)
680+
location.add_name_token(domain_name_token, self._domain_name)
678681
self.logger.entering(str(location), class_name=self.__class_name, method_name=_method_name)
679682
security_nodes = dictionary_utils.get_dictionary_element(self._topology, SECURITY)
680683
if len(security_nodes) > 0:
@@ -765,16 +768,20 @@ def __create_machines(self, location):
765768
self.logger.exiting(class_name=self.__class_name, method_name=_method_name)
766769
return
767770

768-
def __create_clusters_and_servers(self, location):
771+
def __create_machines_clusters_and_servers(self, delete_now=True):
769772
"""
770773
Create the /Cluster, /ServerTemplate, and /Server folder objects.
771-
:param location: the location to use
774+
:param delete_now: Flag determing whether the delete of the elements will be delayed
772775
:raises: CreateException: if an error occurs
773776
"""
774-
_method_name = '__create_clusters_and_servers'
777+
_method_name = '__create_machines_clusters_and_servers'
775778

779+
location = LocationContext()
780+
domain_name_token = self.aliases.get_name_token(location)
781+
location.add_name_token(domain_name_token, self._domain_name)
776782
self.logger.entering(str(location), class_name=self.__class_name, method_name=_method_name)
777783

784+
self.__create_machines(location)
778785
#
779786
# In order for source domain provisioning to work with dynamic clusters, we have to provision
780787
# the ServerTemplates. There is a cyclical dependency between Server Template and Clusters so we
@@ -788,14 +795,15 @@ def __create_clusters_and_servers(self, location):
788795
jdbc_names = self.topology_helper.create_placeholder_jdbc_resources(resources_dict)
789796
cluster_nodes = dictionary_utils.get_dictionary_element(self._topology, CLUSTER)
790797
if len(cluster_nodes) > 0:
791-
self._create_named_mbeans(CLUSTER, cluster_nodes, location, log_created=True)
798+
self._create_named_mbeans(CLUSTER, cluster_nodes, location, log_created=True, delete_now=delete_now)
792799

793800
#
794801
# Now, fully populate the ServerTemplates, if any.
795802
#
796803
server_template_nodes = dictionary_utils.get_dictionary_element(self._topology, SERVER_TEMPLATE)
797804
if len(server_template_nodes) > 0:
798-
self._create_named_mbeans(SERVER_TEMPLATE, server_template_nodes, location, log_created=True)
805+
self._create_named_mbeans(SERVER_TEMPLATE, server_template_nodes, location, log_created=True,
806+
delete_now=delete_now)
799807

800808
#
801809
# Finally, create/update the servers.
@@ -804,18 +812,19 @@ def __create_clusters_and_servers(self, location):
804812
# There may be a dependency to other servers when the server is in a cluster
805813
self.topology_helper.create_placeholder_servers_in_cluster(self._topology)
806814
if len(server_nodes) > 0:
807-
self._create_named_mbeans(SERVER, server_nodes, location, log_created=True)
815+
self._create_named_mbeans(SERVER, server_nodes, location, log_created=True, delete_now=delete_now)
808816

809817
# targets may have been inadvertently assigned when clusters were added
810818
self.topology_helper.clear_jdbc_placeholder_targeting(jdbc_names)
811-
819+
self.__create_migratable_targets(location, delete_now=delete_now)
812820
self.logger.exiting(class_name=self.__class_name, method_name=_method_name)
813821
return
814822

815-
def __create_migratable_targets(self, location):
823+
def __create_migratable_targets(self, location, delete_now=True):
816824
"""
817825
Create the /MigratableTarget folder objects, if any.
818826
:param location: the location to use
827+
:param delete_now: Flag to determine if the delete of elements will be delayed
819828
:raises: CreateException: if an error occurs
820829
"""
821830
_method_name = '__create_migratable_targets'
@@ -824,7 +833,8 @@ def __create_migratable_targets(self, location):
824833
migratable_target_nodes = dictionary_utils.get_dictionary_element(self._topology, MIGRATABLE_TARGET)
825834

826835
if len(migratable_target_nodes) > 0:
827-
self._create_named_mbeans(MIGRATABLE_TARGET, migratable_target_nodes, location, log_created=True)
836+
self._create_named_mbeans(MIGRATABLE_TARGET, migratable_target_nodes, location, log_created=True,
837+
delete_now=delete_now)
828838

829839
self.logger.exiting(class_name=self.__class_name, method_name=_method_name)
830840
return
@@ -872,7 +882,7 @@ def __set_atp_connection_property(self, root_location, property_name, property_v
872882

873883
wlst_name, wlst_value = \
874884
self.aliases.get_wlst_attribute_name_and_value(root_location, DRIVER_PARAMS_PROPERTY_VALUE,
875-
property_value)
885+
property_value)
876886
self.wlst_helper.set(wlst_name, wlst_value)
877887

878888
root_location.remove_name_token(property_name)
@@ -931,7 +941,7 @@ def __configure_fmw_infra_database(self):
931941

932942
wlst_name, wlst_value = \
933943
self.aliases.get_wlst_attribute_name_and_value(location, PASSWORD_ENCRYPTED,
934-
rcu_schema_pwd, masked=True)
944+
rcu_schema_pwd, masked=True)
935945
self.wlst_helper.set_if_needed(wlst_name, wlst_value, masked=True)
936946

937947
location.append_location(JDBC_DRIVER_PARAMS_PROPERTIES)
@@ -946,7 +956,7 @@ def __configure_fmw_infra_database(self):
946956
stb_user = orig_user.replace('DEV', rcu_prefix)
947957
wlst_name, wlst_value = \
948958
self.aliases.get_wlst_attribute_name_and_value(location, DRIVER_PARAMS_PROPERTY_VALUE,
949-
stb_user)
959+
stb_user)
950960
self.wlst_helper.set_if_needed(wlst_name, wlst_value)
951961

952962
# need to set other properties
@@ -993,7 +1003,7 @@ def __configure_fmw_infra_database(self):
9931003

9941004
wlst_name, wlst_value = \
9951005
self.aliases.get_wlst_attribute_name_and_value(location, PASSWORD_ENCRYPTED,
996-
rcu_schema_pwd, masked=True)
1006+
rcu_schema_pwd, masked=True)
9971007
self.wlst_helper.set_if_needed(wlst_name, wlst_value, masked=True)
9981008

9991009
location.append_location(JDBC_DRIVER_PARAMS_PROPERTIES)
@@ -1222,7 +1232,8 @@ def __create_credential_mappings(self):
12221232
"""
12231233
Create credential mappings from model elements.
12241234
"""
1225-
default_nodes = dictionary_utils.get_dictionary_element(self._domain_info, WLS_USER_PASSWORD_CREDENTIAL_MAPPINGS)
1235+
default_nodes = dictionary_utils.get_dictionary_element(self._domain_info,
1236+
WLS_USER_PASSWORD_CREDENTIAL_MAPPINGS)
12261237
if default_nodes:
12271238
credential_map_helper = CredentialMapHelper(self.model_context, ExceptionType.CREATE)
12281239
credential_map_helper.create_default_init_file(default_nodes)

core/src/main/python/wlsdeploy/tool/deploy/deployer.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,15 @@ def __init__(self, model, model_context, aliases, wlst_mode=WlstModes.OFFLINE):
5555
exception_helper.ExceptionType.DEPLOY)
5656
return
5757

58-
def _add_named_elements(self, type_name, model_nodes, location):
58+
def _add_named_elements(self, type_name, model_nodes, location, delete_now=True):
5959
"""
6060
Add each named element from the specified nodes in WLST and set its attributes.
6161
Sub-folders are processed in a generic manner if present.
6262
It is assumed that there are no attributes or sub-folders with special processing.
6363
:param type_name: the type name of the child nodes
6464
:param model_nodes: the child nodes of a model element
6565
:param location: the location where elements should be added
66+
:param delete_now: Flag to determine whether to delay delete of element
6667
"""
6768
_method_name = '_add_named_elements'
6869

@@ -80,7 +81,8 @@ def _add_named_elements(self, type_name, model_nodes, location):
8081
token = self.aliases.get_name_token(location)
8182
for name in model_nodes:
8283
if model_helper.is_delete_name(name):
83-
deployer_utils.delete_named_element(location, name, existing_names, self.aliases)
84+
if delete_now:
85+
deployer_utils.delete_named_element(location, name, existing_names, self.aliases)
8486
continue
8587

8688
is_add = name not in existing_names

core/src/main/python/wlsdeploy/tool/deploy/deployer_utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ def delete_named_element(location, delete_name, existing_names, aliases):
269269
type_path = aliases.get_wlst_create_path(location)
270270
_wlst_helper.cd(type_path)
271271
_wlst_helper.delete(name, type_name)
272+
existing_names.remove(name)
272273

273274

274275
def ensure_no_uncommitted_changes_or_edit_sessions(ignoreEditSessionCheck=False):

0 commit comments

Comments
 (0)