Skip to content

Commit 4dfd776

Browse files
committed
Issue#95 - Provide update of server group targeting
1 parent d958add commit 4dfd776

File tree

6 files changed

+263
-212
lines changed

6 files changed

+263
-212
lines changed

core/src/main/python/update.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@
3232
from wlsdeploy.exception import exception_helper
3333
from wlsdeploy.exception.expection_types import ExceptionType
3434
from wlsdeploy.logging.platform_logger import PlatformLogger
35+
from wlsdeploy.tool.create.domain_typedef import DomainTypedef
3536
from wlsdeploy.tool.deploy import deployer_utils
3637
from wlsdeploy.tool.deploy import model_deployer
3738
from wlsdeploy.tool.deploy.topology_updater import TopologyUpdater
3839
from wlsdeploy.tool.validate.validator import Validator
3940
from wlsdeploy.tool.util import filter_helper
4041
from wlsdeploy.tool.util.wlst_helper import WlstHelper
42+
from wlsdeploy.util import dictionary_utils
4143
from wlsdeploy.util import getcreds
4244
from wlsdeploy.util import variables
4345
from wlsdeploy.util.cla_utils import CommandLineArgUtil
@@ -91,10 +93,18 @@ def __process_args(args):
9193
__wlst_mode = __process_online_args(optional_arg_map)
9294
__process_encryption_args(optional_arg_map)
9395

96+
domain_type = dictionary_utils.get_element(optional_arg_map, CommandLineArgUtil.DOMAIN_TYPE_SWITCH)
97+
if domain_type is None:
98+
domain_type = 'WLS'
99+
domain_typedef = DomainTypedef(_program_name, domain_type)
100+
optional_arg_map[CommandLineArgUtil.DOMAIN_TYPEDEF] = domain_typedef
101+
94102
combined_arg_map = optional_arg_map.copy()
95103
combined_arg_map.update(required_arg_map)
96104

97-
return ModelContext(_program_name, combined_arg_map)
105+
model_context = ModelContext(_program_name, combined_arg_map)
106+
domain_typedef.set_model_context(model_context)
107+
return model_context
98108

99109

100110
def __verify_required_args_present(required_arg_map):

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

Lines changed: 0 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
33
The Universal Permissive License (UPL), Version 1.0
44
"""
5-
import copy
65

7-
from oracle.weblogic.deploy.util import PyOrderedDict as OrderedDict
86
from oracle.weblogic.deploy.util import WLSDeployArchive
97

108
from wlsdeploy.aliases.location_context import LocationContext
@@ -17,13 +15,8 @@
1715
from wlsdeploy.tool.util.wlst_helper import WlstHelper
1816
from wlsdeploy.util import dictionary_utils
1917
from wlsdeploy.util.model import Model
20-
from wlsdeploy.util import string_utils
2118
from wlsdeploy.util.weblogic_helper import WebLogicHelper
2219

23-
from wlsdeploy.aliases.model_constants import CLUSTER
24-
from wlsdeploy.aliases.model_constants import MODEL_LIST_DELIMITER
25-
from wlsdeploy.aliases.model_constants import SERVER
26-
2720

2821
class Creator(object):
2922
"""
@@ -389,7 +382,6 @@ def _create_subfolders(self, location, model_nodes):
389382
self.logger.exiting(class_name=self.__class_name, method_name=_method_name)
390383
return
391384

392-
393385
def _is_type_valid(self, location, type_name):
394386
"""
395387
Verify that the specified location in valid for the current WLS version.
@@ -447,139 +439,3 @@ def _format_model_path(self, location, name):
447439
path += '/'
448440
path += name
449441
return path
450-
451-
def _get_existing_server_names(self):
452-
"""
453-
Get the list of server names from WLST.
454-
:return: the list of server names
455-
:raises: CreateException: is an error occurs reading from the aliases or WLST
456-
"""
457-
_method_name = '_get_existing_server_names'
458-
459-
self.logger.entering(class_name=self.__class_name, method_name=_method_name)
460-
server_location = LocationContext().append_location(SERVER)
461-
server_list_path = self.alias_helper.get_wlst_list_path(server_location)
462-
result = self.wlst_helper.get_existing_object_list(server_list_path)
463-
self.logger.exiting(class_name=self.__class_name, method_name=_method_name, result=result)
464-
return result
465-
466-
def _get_clusters_and_members_map(self):
467-
"""
468-
Get a map keyed by cluster name with values that are a list of member server names
469-
:return: the cluster name to member server names map
470-
:raises: CreateException: is an error occurs reading from the aliases or WLST
471-
"""
472-
_method_name = '_get_clusters_and_members_map'
473-
474-
self.logger.entering(class_name=self.__class_name, method_name=_method_name)
475-
server_location = LocationContext().append_location(SERVER)
476-
server_list_path = self.alias_helper.get_wlst_list_path(server_location)
477-
server_names = self.wlst_helper.get_existing_object_list(server_list_path)
478-
server_token = self.alias_helper.get_name_token(server_location)
479-
cluster_map = OrderedDict()
480-
for server_name in server_names:
481-
server_location.add_name_token(server_token, server_name)
482-
server_attributes_path = self.alias_helper.get_wlst_attributes_path(server_location)
483-
self.wlst_helper.cd(server_attributes_path)
484-
485-
server_attributes_map = self.wlst_helper.lsa()
486-
cluster_name = dictionary_utils.get_element(server_attributes_map, CLUSTER)
487-
if string_utils.is_empty(cluster_name):
488-
# if server is not part of a cluster, continue with the next server
489-
continue
490-
491-
if cluster_name not in cluster_map:
492-
cluster_map[cluster_name] = list()
493-
cluster_map[cluster_name].append(server_name)
494-
495-
self.logger.exiting(class_name=self.__class_name, method_name=_method_name, result=cluster_map)
496-
return cluster_map
497-
498-
def _get_server_group_targeting_limits(self, server_group_targeting_limits, clusters_map):
499-
"""
500-
Get any server group targeting limits specified in the model, converting any cluster
501-
names to the list of members. This method assumes that the limits dictionary is not
502-
None or empty.
503-
:param server_group_targeting_limits: the raw server group targeting_limits from the model
504-
:param clusters_map: the map of cluster names to member server names
505-
:return: the map of server groups to server names to target
506-
"""
507-
_method_name = '_get_server_group_targeting_limits'
508-
509-
self.logger.entering(str(server_group_targeting_limits), str(clusters_map),
510-
class_name=self.__class_name, method_name=_method_name)
511-
sg_targeting_limits = copy.deepcopy(server_group_targeting_limits)
512-
for server_group_name, sg_targeting_limit in sg_targeting_limits.iteritems():
513-
if type(sg_targeting_limit) is str:
514-
if MODEL_LIST_DELIMITER in sg_targeting_limit:
515-
sg_targeting_limit = sg_targeting_limit.split(MODEL_LIST_DELIMITER)
516-
else:
517-
# convert a single value into a list of one...
518-
new_list = list()
519-
new_list.append(sg_targeting_limit)
520-
sg_targeting_limit = new_list
521-
522-
# Convert any references to a cluster name into the list of member server names
523-
new_list = list()
524-
for target_name in sg_targeting_limit:
525-
target_name = target_name.strip()
526-
if target_name in clusters_map:
527-
cluster_members = dictionary_utils.get_element(clusters_map, target_name)
528-
new_list.extend(cluster_members)
529-
else:
530-
# Assume it is a server name and add it to the new list
531-
new_list.append(target_name)
532-
sg_targeting_limits[server_group_name] = new_list
533-
534-
self.logger.exiting(class_name=self.__class_name, method_name=_method_name, result=sg_targeting_limits)
535-
return sg_targeting_limits
536-
537-
def _get_server_to_server_groups_map(self, admin_server_name, server_names, server_groups, sg_targeting_limits):
538-
"""
539-
Get the map of server names to the list of server groups to target to that server.
540-
:param admin_server_name: the admin server name
541-
:param server_names: the list of server names
542-
:param server_groups: the complete list of server groups that will, by default, be targeted to
543-
all managed servers unless the server is listed in the targeting limits map
544-
:param sg_targeting_limits: the targeting limits map
545-
:return: the map of server names to the list of server groups to target to that server
546-
"""
547-
_method_name = '_get_server_to_server_groups_map'
548-
549-
self.logger.entering(admin_server_name, str(server_names), str(server_groups), str(sg_targeting_limits),
550-
class_name=self.__class_name, method_name=_method_name)
551-
result = OrderedDict()
552-
for server_name in server_names:
553-
server_groups_for_server = self.__get_server_groups_for_server(server_name, sg_targeting_limits)
554-
if server_groups_for_server is not None:
555-
result[server_name] = server_groups_for_server
556-
elif server_name != admin_server_name:
557-
# By default, we only target managed servers unless explicitly listed in the targeting limits
558-
result[server_name] = list(server_groups)
559-
else:
560-
result[admin_server_name] = list()
561-
if admin_server_name not in result:
562-
result[admin_server_name] = list()
563-
self.logger.exiting(class_name=self.__class_name, method_name=_method_name, result=result)
564-
return result
565-
566-
def __get_server_groups_for_server(self, server_name, sg_targeting_limits):
567-
"""
568-
Get the servers groups to target for a given server name.
569-
:param server_name: the server name
570-
:param sg_targeting_limits: the targeting limits
571-
:return: the list of server groups to target to the specified server name, or None
572-
if the server name does not appear in the targeting limits
573-
"""
574-
_method_name = '__get_server_groups_for_server'
575-
576-
self.logger.entering(server_name, str(sg_targeting_limits),
577-
class_name=self.__class_name, method_name=_method_name)
578-
result = None
579-
for server_group, server_names_list in sg_targeting_limits.iteritems():
580-
if server_name in server_names_list:
581-
if result is None:
582-
result = list()
583-
result.append(server_group)
584-
self.logger.exiting(class_name=self.__class_name, method_name=_method_name, result=result)
585-
return result

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

Lines changed: 6 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
from wlsdeploy.aliases.model_constants import SECURITY
3333
from wlsdeploy.aliases.model_constants import SECURITY_CONFIGURATION
3434
from wlsdeploy.aliases.model_constants import SERVER
35-
from wlsdeploy.aliases.model_constants import SERVER_GROUP_TARGETING_LIMITS
3635
from wlsdeploy.aliases.model_constants import SERVER_START_MODE
3736
from wlsdeploy.aliases.model_constants import SERVER_TEMPLATE
3837
from wlsdeploy.aliases.model_constants import SET_OPTION_APP_DIR
@@ -50,6 +49,7 @@
5049
from wlsdeploy.tool.deploy import model_deployer
5150
from wlsdeploy.tool.util.archive_helper import ArchiveHelper
5251
from wlsdeploy.tool.util.library_helper import LibraryHelper
52+
from wlsdeploy.tool.util.target_helper import TargetHelper
5353
from wlsdeploy.tool.util.topology_helper import TopologyHelper
5454
from wlsdeploy.util import dictionary_utils
5555
from wlsdeploy.util import model as model_helper
@@ -106,6 +106,9 @@ def __init__(self, model_dictionary, model_context, aliases):
106106
self.library_helper = LibraryHelper(self.model, self.model_context, self.aliases, self._domain_home,
107107
ExceptionType.CREATE, self.logger)
108108

109+
self.target_helper = TargetHelper(self.model, self.model_context, self.aliases, ExceptionType.CREATE,
110+
self.logger)
111+
109112
#
110113
# Creating domains with the wls.jar template is busted for pre-12.1.2 domains with regards to the
111114
# names of the default authentication providers (both the DefaultAuthenticator and the
@@ -303,7 +306,7 @@ def __extend_domain(self, domain_home):
303306
self.__configure_fmw_infra_database()
304307

305308
server_groups_to_target = self._domain_typedef.get_server_groups_to_target()
306-
self.__target_server_groups_to_servers(server_groups_to_target)
309+
self.target_helper.target_server_groups_to_servers(server_groups_to_target)
307310

308311
self.logger.info('WLSDPLY-12209', self._domain_name,
309312
class_name=self.__class_name, method_name=_method_name)
@@ -345,7 +348,7 @@ def __create_domain_with_select_template(self, domain_home):
345348
self.__configure_fmw_infra_database()
346349

347350
server_groups_to_target = self._domain_typedef.get_server_groups_to_target()
348-
self.__target_server_groups_to_servers(server_groups_to_target)
351+
self.target_helper.target_server_groups_to_servers(server_groups_to_target)
349352

350353
self.logger.info('WLSDPLY-12206', self._domain_name, domain_home,
351354
class_name=self.__class_name, method_name=_method_name)
@@ -611,67 +614,6 @@ def __configure_fmw_infra_database(self):
611614
self.logger.exiting(class_name=self.__class_name, method_name=_method_name)
612615
return
613616

614-
def __target_server_groups_to_servers(self, server_groups_to_target):
615-
"""
616-
Target the server groups to the servers.
617-
:param server_groups_to_target: the list of server groups to target
618-
:raises: CreateException: if an error occurs
619-
"""
620-
_method_name = '__target_server_groups_to_servers'
621-
622-
self.logger.entering(server_groups_to_target, class_name=self.__class_name, method_name=_method_name)
623-
if len(server_groups_to_target) == 0:
624-
return
625-
626-
location = LocationContext()
627-
root_path = self.alias_helper.get_wlst_attributes_path(location)
628-
self.wlst_helper.cd(root_path)
629-
630-
# We need to get the effective list of servers for the domain. Since any servers
631-
# referenced in the model have already been created but the templates may have
632-
# defined new servers not listed in the model, get the list from WLST.
633-
server_names = self._get_existing_server_names()
634-
635-
# Get the clusters and and their members
636-
cluster_map = self._get_clusters_and_members_map()
637-
638-
# Get any limits that may have been defined in the model
639-
domain_info = self.model.get_model_domain_info()
640-
server_group_targeting_limits = \
641-
dictionary_utils.get_dictionary_element(domain_info, SERVER_GROUP_TARGETING_LIMITS)
642-
if len(server_group_targeting_limits) > 0:
643-
server_group_targeting_limits = \
644-
self._get_server_group_targeting_limits(server_group_targeting_limits, cluster_map)
645-
646-
# Get the map of server names to server groups to target
647-
server_to_server_groups_map = self._get_server_to_server_groups_map(self._admin_server_name,
648-
server_names,
649-
server_groups_to_target,
650-
server_group_targeting_limits)
651-
if len(server_names) > 1:
652-
for server, server_groups in server_to_server_groups_map.iteritems():
653-
if len(server_groups) > 0:
654-
server_name = self.wlst_helper.get_quoted_name_for_wlst(server)
655-
self.logger.info('WLSDPLY-12224', str(server_groups), server_name,
656-
class_name=self.__class_name, method_name=_method_name)
657-
self.wlst_helper.set_server_groups(server_name, server_groups)
658-
659-
elif len(server_group_targeting_limits) == 0:
660-
#
661-
# Domain has no managed servers and there were not targeting limits specified to target
662-
# server groups to the admin server so make sure that the server groups are targeted to
663-
# the admin server.
664-
#
665-
# This is really a best effort attempt. It works for JRF domains but it is certainly possible
666-
# that it may cause problems with other custom domain types. Of course, creating a domain with
667-
# no managed servers is not a primary use case of this tool so do it and hope for the best...
668-
#
669-
server_name = self.wlst_helper.get_quoted_name_for_wlst(server_names[0])
670-
self.wlst_helper.set_server_groups(server_name, server_groups_to_target)
671-
672-
self.logger.exiting(class_name=self.__class_name, method_name=_method_name)
673-
return
674-
675617
def __set_app_dir(self):
676618
"""
677619
Set the AppDir domain option.

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from wlsdeploy.tool.deploy import deployer_utils
1818
from wlsdeploy.tool.deploy.deployer import Deployer
1919
from wlsdeploy.tool.util.library_helper import LibraryHelper
20+
from wlsdeploy.tool.util.target_helper import TargetHelper
2021
from wlsdeploy.tool.util.topology_helper import TopologyHelper
2122
from wlsdeploy.util import dictionary_utils
2223

@@ -32,12 +33,17 @@ def __init__(self, model, model_context, aliases, wlst_mode=WlstModes.OFFLINE):
3233
self._topology = self.model.get_model_topology()
3334
self._resources = self.model.get_model_resources()
3435
self._topology_helper = TopologyHelper(self.aliases, ExceptionType.DEPLOY, self.logger)
36+
self._domain_typedef = self.model_context.get_domain_typedef()
37+
3538
self._security_provider_creator = SecurityProviderCreator(model.get_model(), model_context, aliases,
3639
ExceptionType.DEPLOY, self.logger)
3740

3841
self.library_helper = LibraryHelper(self.model, self.model_context, self.aliases,
3942
model_context.get_domain_home(), ExceptionType.DEPLOY, self.logger)
4043

44+
self.target_helper = TargetHelper(self.model, self.model_context, self.aliases, ExceptionType.DEPLOY,
45+
self.logger)
46+
4147
# Override
4248
def _add_named_elements(self, type_name, model_nodes, location):
4349
"""
@@ -86,7 +92,8 @@ def update(self):
8692
for folder_name in remaining:
8793
self._process_section(self._topology, folder_list, folder_name, location)
8894

89-
# TODO: update targeting
95+
server_groups_to_target = self._domain_typedef.get_server_groups_to_target()
96+
self.target_helper.target_server_groups_to_servers(server_groups_to_target)
9097

9198
# files referenced in attributes are extracted as attributes are processed
9299

core/src/main/python/wlsdeploy/tool/util/library_helper.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ def install_domain_libraries(self):
3636
:raises: BundleAwareException of the specified type: if an error occurs
3737
"""
3838
_method_name = 'install_domain_libraries'
39-
print('\n' + _method_name)
4039

4140
self.logger.entering(self.domain_home, class_name=self.__class_name, method_name=_method_name)
4241
domain_info_dict = self.model.get_model_domain_info()
@@ -63,7 +62,6 @@ def extract_classpath_libraries(self):
6362
:raises: BundleAwareException of the specified type: if an error occurs
6463
"""
6564
_method_name = 'extract_classpath_libraries'
66-
print('\n' + _method_name)
6765

6866
self.logger.entering(self.domain_home, class_name=self.__class_name, method_name=_method_name)
6967
if self.archive_helper is None:

0 commit comments

Comments
 (0)