44"""
55
66import copy
7- import oracle . weblogic . deploy . util . StringUtils as StringUtils
7+
88import oracle .weblogic .deploy .util .PyOrderedDict as OrderedDict
99import wlsdeploy .util .dictionary_utils as dictionary_utils
1010
1616from wlsdeploy .aliases .model_constants import MODEL_LIST_DELIMITER
1717from wlsdeploy .aliases .model_constants import SERVER
1818from wlsdeploy .aliases .model_constants import SERVER_GROUP_TARGETING_LIMITS
19- from wlsdeploy .exception import exception_helper
2019from wlsdeploy .tool .util .alias_helper import AliasHelper
2120from wlsdeploy .tool .util .wlst_helper import WlstHelper
2221from wlsdeploy .util import string_utils
@@ -140,32 +139,52 @@ def target_server_groups_to_servers(self, server_groups_to_target):
140139 method_name = _method_name )
141140
142141 final_assignment_map = dict ()
143- if len (server_names ) > 0 :
142+ dynamic_cluster_assigns = dict ()
143+ # Target servers and dynamic clusters to the server group resources
144+ if len (server_names ) > 0 or len (dynamic_cluster_names ) > 0 :
144145 for server , server_groups in server_to_server_groups_map .iteritems ():
145- if server in server_names and len (server_groups ) > 0 :
146- final_assignment_map [server ] = server_groups
147-
148- elif len (server_names ) == 0 and len (dynamic_cluster_names ) == 0 :
149- #
150- # Domain has no managed servers and there were not targeting limits specified to target
151- # server groups to the admin server so make sure that the server groups are targeted to
152- # the admin server.
153- #
154- # This is really a best effort attempt. It works for JRF domains but it is certainly possible
155- # that it may cause problems with other custom domain types. Of course, creating a domain with
156- # no managed servers is not a primary use case of this tool so do it and hope for the best...
157- #
158- final_assignment_map [server_names [0 ]] = server_groups_to_target
159-
160- # Target any dynamic clusters to the server group resources
161- dynamic_cluster_assigns = None
162- if len (dynamic_cluster_names ) > 0 :
163- dynamic_cluster_assigns = dict ()
164- for name in dynamic_cluster_names :
165- if name in server_to_server_groups_map :
166- dynamic_cluster_assigns [name ] = server_to_server_groups_map [name ]
167-
168- self .logger .exiting (result = str (dynamic_cluster_assigns ), class_name = self .__class_name , method_name = _method_name )
146+ if len (server_groups ) > 0 :
147+ if server in server_names :
148+ final_assignment_map [server ] = server_groups
149+ elif server in dynamic_cluster_names :
150+ dynamic_cluster_assigns [server ] = server_groups
151+
152+ #
153+ # Domain has not targeted the server groups to managed servers (configured), or the
154+ # domain has no managed servers (configured) but has user server groups. The resources for the
155+ # user server groups must be targeted before the write/update domain or the write/update will fail.
156+ # Thus assign the user server groups to the admin server.
157+ #
158+ # Because of the interaction of the working context in the different wlst helpers, the dynamic
159+ # clusters will be applied to the resources separately and after the write/update domain.
160+ #
161+ # (From original blurb)
162+ # This is really a best effort attempt. It works for JRF domains but it is certainly possible
163+ # that it may cause problems with other custom domain types. Of course, creating a domain with
164+ # no managed servers is not a primary use case of this tool so do it and hope for the best...
165+ #
166+ # (New comment)
167+ # As we have added the intricacies of the dynamic clusters, if the targeting is to dynamic
168+ # clusters only, the set server groups with the admin server will get through the write/update domain
169+ # and the applyJRF with the dynamic cluster should theoretically unset the AdminServer on the user server
170+ # groups. It works with JRF type domains.
171+
172+ if len (server_groups_to_target ) > 0 :
173+ if len (final_assignment_map ) == 0 :
174+ # This is a quickie to fix the issue where server groups are not targeted because no configured
175+ # managed servers exist in the domain
176+ final_assignment_map [server_names [0 ]] = server_groups_to_target
177+ else :
178+ # If a server group or groups is not targeted in the assignments, log it to stdout
179+ no_targets = [server_target for server_target in server_groups_to_target if server_target not in
180+ [server_target for row in final_assignment_map .itervalues () for
181+ server_target in server_groups_to_target if server_target in row ]]
182+ if len (no_targets ) > 0 :
183+ self .logger .info ('WLSDPLY-12248' , no_targets ,
184+ class_name = self .__class_name , method_name = _method_name )
185+
186+ self .logger .exiting (result = str (dynamic_cluster_assigns ),
187+ class_name = self .__class_name , method_name = _method_name )
169188 return final_assignment_map , dynamic_cluster_assigns
170189
171190 def target_server_groups (self , server_assigns ):
@@ -200,15 +219,14 @@ def target_server_groups_to_dynamic_clusters(self, dynamic_cluster_assigns):
200219 domain_typedef = self .model_context .get_domain_typedef ()
201220
202221 if len (dynamic_cluster_assigns ) > 0 :
222+ self .logger .info ('WLSDPLY-12247' , class_name = self .__class_name , method_name = _method_name )
203223 # TBD assign server group resources to cluster. The JRF resources could still be applied separately
204224 # using this technique - or remove this technique and replace with the resource targeting
205225 if domain_typedef .has_jrf_resources ():
206226 self ._target_jrf_resources (dynamic_cluster_assigns )
207227 else :
208- ex = exception_helper .create_exception (self .exception_type , 'WLSDPLY-12238' ,
209- domain_typedef .get_domain_type ())
210- self .logger .throwing (ex , class_name = self .__class_name , method_name = _method_name )
211- raise ex
228+ self .logger .warning ('WLSDPLY-12238' , domain_typedef .get_domain_type (),
229+ class_name = self .__class_name , method_name = _method_name )
212230
213231 self .logger .exiting (class_name = self .__class_name , method_name = _method_name )
214232 return
@@ -357,7 +375,7 @@ def _get_server_group_targeting_limits(self, server_group_targeting_limits, clus
357375 if DYNAMIC_SERVERS in cluster_members :
358376 # This will need special handling to target server group resources
359377 cluster_members .remove (DYNAMIC_SERVERS )
360- cluster_members .add (target_name )
378+ cluster_members .append (target_name )
361379 new_list .extend (cluster_members )
362380 else :
363381 # Assume it is a server name and add it to the new list
@@ -385,28 +403,47 @@ def _get_server_to_server_groups_map(self, admin_server_name, server_names, dyna
385403 self .logger .entering (admin_server_name , str (server_names ), str (server_groups ), str (sg_targeting_limits ),
386404 class_name = self .__class_name , method_name = _method_name )
387405 result = OrderedDict ()
406+ revised_server_groups = self ._revised_list_server_groups (server_groups , sg_targeting_limits )
388407 for server_name in server_names :
389408 server_groups_for_server = self .__get_server_groups_for_entity (server_name , sg_targeting_limits )
390- if server_groups_for_server is not None :
409+ if len ( server_groups_for_server ) > 0 :
391410 result [server_name ] = server_groups_for_server
392411 elif server_name != admin_server_name :
393412 # By default, we only target managed servers unless explicitly listed in the targeting limits
394- result [server_name ] = list (server_groups )
413+ result [server_name ] = list (revised_server_groups )
395414 else :
396415 result [admin_server_name ] = list ()
397416 for cluster_name in dynamic_cluster_names :
398- server_groups_for_cluster = self .__get_server_groups_for_entity (cluster_name , sg_targeting_limits )
399- if server_groups_for_cluster is not None :
417+ server_groups_for_cluster = \
418+ self .__get_server_groups_for_entity (cluster_name , sg_targeting_limits )
419+ if len (server_groups_for_cluster ) > 0 :
400420 result [cluster_name ] = server_groups_for_cluster
401421 else :
402- result [cluster_name ] = list (server_groups )
422+ result [cluster_name ] = list (revised_server_groups )
403423 self .logger .finer ('WLSDPLY-12239' , result [cluster_name ], cluster_name ,
404424 class_name = self .__class_name , method_name = _method_name )
405425 if admin_server_name not in result :
406426 result [admin_server_name ] = list ()
407427 self .logger .exiting (class_name = self .__class_name , method_name = _method_name , result = result )
408428 return result
409429
430+ def _revised_list_server_groups (self , server_groups , sg_targeting_limits ):
431+ """
432+ Remove all server groups that are explicitly targeted to a cluster, server set or stand-alone
433+ managed server.
434+ :param server_groups: list of server groups applied by the extension templates
435+ :param sg_targeting_limits: list of targeting from the domainInfo section
436+ :return: server group list with the specific targeted server groups removed
437+ """
438+ _method_name = '_revised_list_server_groups'
439+ self .logger .entering (sg_targeting_limits , class_name = self .__class_name , method_name = _method_name )
440+ result = list ()
441+ targeted_server_groups = sg_targeting_limits .keys ()
442+ for server_group in server_groups :
443+ if server_group not in targeted_server_groups :
444+ result .append (server_group )
445+ return result
446+
410447 def __get_server_groups_for_entity (self , entity_name , sg_targeting_limits ):
411448 """
412449 Get the servers groups to target for a given server or dynamic cluster name.
@@ -416,14 +453,11 @@ def __get_server_groups_for_entity(self, entity_name, sg_targeting_limits):
416453 if the entity name does not appear in the targeting limits
417454 """
418455 _method_name = '__get_server_groups_for_entity'
419-
420- result = None
456+ result = list ()
421457 for server_group , entity_names_list in sg_targeting_limits .iteritems ():
422458 if entity_name in entity_names_list :
423- if result is None :
424- result = list ()
425459 result .append (server_group )
426- if result is not None :
460+ if len ( result ) > 0 :
427461 self .logger .fine ('WLSDPLY-12243' , entity_name , result , class_name = self .__class_name ,
428462 method_name = _method_name )
429463 return result
0 commit comments