2
2
Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
3
3
The Universal Permissive License (UPL), Version 1.0
4
4
"""
5
+ import copy
6
+
7
+ from oracle .weblogic .deploy .util import PyOrderedDict as OrderedDict
5
8
from oracle .weblogic .deploy .util import WLSDeployArchive
6
9
7
10
from wlsdeploy .aliases .location_context import LocationContext
13
16
from wlsdeploy .tool .util .attribute_setter import AttributeSetter
14
17
from wlsdeploy .tool .util .wlst_helper import WlstHelper
15
18
from wlsdeploy .util import dictionary_utils
19
+ from wlsdeploy .util .model import Model
20
+ from wlsdeploy .util import string_utils
16
21
from wlsdeploy .util .weblogic_helper import WebLogicHelper
17
22
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
+
18
27
19
28
class Creator (object ):
20
29
"""
@@ -27,7 +36,7 @@ def __init__(self, model, model_context, aliases):
27
36
self .aliases = aliases
28
37
self .alias_helper = AliasHelper (self .aliases , self .logger , ExceptionType .CREATE )
29
38
self .wlst_helper = WlstHelper (self .logger , ExceptionType .CREATE )
30
- self .model = model
39
+ self .model = Model ( model )
31
40
self .model_context = model_context
32
41
self .wls_helper = WebLogicHelper (self .logger )
33
42
self .attribute_setter = AttributeSetter (self .aliases , self .logger , ExceptionType .CREATE )
@@ -436,3 +445,139 @@ def _format_model_path(self, location, name):
436
445
path += '/'
437
446
path += name
438
447
return path
448
+
449
+ def _get_existing_server_names (self ):
450
+ """
451
+ Get the list of server names from WLST.
452
+ :return: the list of server names
453
+ :raises: CreateException: is an error occurs reading from the aliases or WLST
454
+ """
455
+ _method_name = '_get_existing_server_names'
456
+
457
+ self .logger .entering (class_name = self .__class_name , method_name = _method_name )
458
+ server_location = LocationContext ().append_location (SERVER )
459
+ server_list_path = self .alias_helper .get_wlst_list_path (server_location )
460
+ result = self .wlst_helper .get_existing_object_list (server_list_path )
461
+ self .logger .exiting (class_name = self .__class_name , method_name = _method_name , result = result )
462
+ return result
463
+
464
+ def _get_clusters_and_members_map (self ):
465
+ """
466
+ Get a map keyed by cluster name with values that are a list of member server names
467
+ :return: the cluster name to member server names map
468
+ :raises: CreateException: is an error occurs reading from the aliases or WLST
469
+ """
470
+ _method_name = '_get_clusters_and_members_map'
471
+
472
+ self .logger .entering (class_name = self .__class_name , method_name = _method_name )
473
+ server_location = LocationContext ().append_location (SERVER )
474
+ server_list_path = self .alias_helper .get_wlst_list_path (server_location )
475
+ server_names = self .wlst_helper .get_existing_object_list (server_list_path )
476
+ server_token = self .alias_helper .get_name_token (server_location )
477
+ cluster_map = OrderedDict ()
478
+ for server_name in server_names :
479
+ server_location .add_name_token (server_token , server_name )
480
+ server_attributes_path = self .alias_helper .get_wlst_attributes_path (server_location )
481
+ self .wlst_helper .cd (server_attributes_path )
482
+
483
+ server_attributes_map = self .wlst_helper .lsa ()
484
+ cluster_name = dictionary_utils .get_element (server_attributes_map , CLUSTER )
485
+ if string_utils .is_empty (cluster_name ):
486
+ # if server is not part of a cluster, continue with the next server
487
+ continue
488
+
489
+ if cluster_name not in cluster_map :
490
+ cluster_map [cluster_name ] = list ()
491
+ cluster_map [cluster_name ].append (server_name )
492
+
493
+ self .logger .exiting (class_name = self .__class_name , method_name = _method_name , result = cluster_map )
494
+ return cluster_map
495
+
496
+ def _get_server_group_targeting_limits (self , server_group_targeting_limits , clusters_map ):
497
+ """
498
+ Get any server group targeting limits specified in the model, converting any cluster
499
+ names to the list of members. This method assumes that the limits dictionary is not
500
+ None or empty.
501
+ :param server_group_targeting_limits: the raw server group targeting_limits from the model
502
+ :param clusters_map: the map of cluster names to member server names
503
+ :return: the map of server groups to server names to target
504
+ """
505
+ _method_name = '_get_server_group_targeting_limits'
506
+
507
+ self .logger .entering (str (server_group_targeting_limits ), str (clusters_map ),
508
+ class_name = self .__class_name , method_name = _method_name )
509
+ sg_targeting_limits = copy .deepcopy (server_group_targeting_limits )
510
+ for server_group_name , sg_targeting_limit in sg_targeting_limits .iteritems ():
511
+ if type (sg_targeting_limit ) is str :
512
+ if MODEL_LIST_DELIMITER in sg_targeting_limit :
513
+ sg_targeting_limit = sg_targeting_limit .split (MODEL_LIST_DELIMITER )
514
+ else :
515
+ # convert a single value into a list of one...
516
+ new_list = list ()
517
+ new_list .append (sg_targeting_limit )
518
+ sg_targeting_limit = new_list
519
+
520
+ # Convert any references to a cluster name into the list of member server names
521
+ new_list = list ()
522
+ for target_name in sg_targeting_limit :
523
+ target_name = target_name .strip ()
524
+ if target_name in clusters_map :
525
+ cluster_members = dictionary_utils .get_element (clusters_map , target_name )
526
+ new_list .extend (cluster_members )
527
+ else :
528
+ # Assume it is a server name and add it to the new list
529
+ new_list .append (target_name )
530
+ sg_targeting_limits [server_group_name ] = new_list
531
+
532
+ self .logger .exiting (class_name = self .__class_name , method_name = _method_name , result = sg_targeting_limits )
533
+ return sg_targeting_limits
534
+
535
+ def _get_server_to_server_groups_map (self , admin_server_name , server_names , server_groups , sg_targeting_limits ):
536
+ """
537
+ Get the map of server names to the list of server groups to target to that server.
538
+ :param admin_server_name: the admin server name
539
+ :param server_names: the list of server names
540
+ :param server_groups: the complete list of server groups that will, by default, be targeted to
541
+ all managed servers unless the server is listed in the targeting limits map
542
+ :param sg_targeting_limits: the targeting limits map
543
+ :return: the map of server names to the list of server groups to target to that server
544
+ """
545
+ _method_name = '_get_server_to_server_groups_map'
546
+
547
+ self .logger .entering (admin_server_name , str (server_names ), str (server_groups ), str (sg_targeting_limits ),
548
+ class_name = self .__class_name , method_name = _method_name )
549
+ result = OrderedDict ()
550
+ for server_name in server_names :
551
+ server_groups_for_server = self .__get_server_groups_for_server (server_name , sg_targeting_limits )
552
+ if server_groups_for_server is not None :
553
+ result [server_name ] = server_groups_for_server
554
+ elif server_name != admin_server_name :
555
+ # By default, we only target managed servers unless explicitly listed in the targeting limits
556
+ result [server_name ] = list (server_groups )
557
+ else :
558
+ result [admin_server_name ] = list ()
559
+ if admin_server_name not in result :
560
+ result [admin_server_name ] = list ()
561
+ self .logger .exiting (class_name = self .__class_name , method_name = _method_name , result = result )
562
+ return result
563
+
564
+ def __get_server_groups_for_server (self , server_name , sg_targeting_limits ):
565
+ """
566
+ Get the servers groups to target for a given server name.
567
+ :param server_name: the server name
568
+ :param sg_targeting_limits: the targeting limits
569
+ :return: the list of server groups to target to the specified server name, or None
570
+ if the server name does not appear in the targeting limits
571
+ """
572
+ _method_name = '__get_server_groups_for_server'
573
+
574
+ self .logger .entering (server_name , str (sg_targeting_limits ),
575
+ class_name = self .__class_name , method_name = _method_name )
576
+ result = None
577
+ for server_group , server_names_list in sg_targeting_limits .iteritems ():
578
+ if server_name in server_names_list :
579
+ if result is None :
580
+ result = list ()
581
+ result .append (server_group )
582
+ self .logger .exiting (class_name = self .__class_name , method_name = _method_name , result = result )
583
+ return result
0 commit comments