2323import os
2424import re
2525import sys
26- import pickle
2726import getpass
2827import hashlib
2928from copy import deepcopy
3029from enum import Enum
3130
3231from ruamel .yaml .comments import CommentedMap
3332
33+ import _errno as err
3434from tool import ConfigUtil , FileUtil , YamlLoader , OrderedDict , COMMAND_ENV
3535from _manager import Manager
36- from _repository import Repository
3736from _stdio import SafeStdio
3837from _environ import ENV_BASE_DIR
3938
@@ -360,6 +359,7 @@ def __init__(self, servers, name, version, tag, release, package_hash, parser=No
360359 self .origin_package_hash = package_hash
361360 self ._package_hash = package_hash
362361 self ._temp_conf = {}
362+ self ._all_default_conf = {}
363363 self ._default_conf = {}
364364 self ._global_conf = None
365365 self ._server_conf = {}
@@ -371,6 +371,8 @@ def __init__(self, servers, name, version, tag, release, package_hash, parser=No
371371 self ._include_file = None
372372 self ._origin_include_file = None
373373 self ._origin_include_config = None
374+ self ._unprocessed_global_conf = None
375+ self ._unprocessed_server_conf = {}
374376 self ._environments = None
375377 self ._origin_environments = {}
376378 self ._inner_config = {}
@@ -414,7 +416,14 @@ def __eq__(self, other):
414416 if not isinstance (other , self .__class__ ):
415417 return False
416418 # todo 检查 rsync include等
417- return self ._global_conf == other ._global_conf and self ._server_conf == other ._server_conf
419+ if self .servers != other .servers :
420+ return False
421+ if self .get_global_conf () != other .get_global_conf ():
422+ return False
423+ for server in self .servers :
424+ if self .get_server_conf (server ) != other .get_server_conf (server ):
425+ return False
426+ return True
418427
419428 def __deepcopy__ (self , memo ):
420429 cluster_config = self .__class__ (deepcopy (self .servers ), self .name , self .version , self .tag , self .package_hash , self .parser )
@@ -451,6 +460,8 @@ def depends(self):
451460 def _clear_cache_server (self ):
452461 for server in self ._cache_server :
453462 self ._cache_server [server ] = None
463+ if server in self ._unprocessed_server_conf :
464+ del self ._unprocessed_server_conf [server ]
454465
455466 def get_inner_config (self ):
456467 return self ._inner_config
@@ -485,11 +496,14 @@ def get_depend_servers(self, name):
485496 cluster_config = self ._depends [name ]
486497 return deepcopy (cluster_config .original_servers )
487498
488- def get_depend_config (self , name , server = None ):
499+ def get_depend_config (self , name , server = None , with_default = True ):
489500 if name not in self ._depends :
490501 return None
491502 cluster_config = self ._depends [name ]
492- config = cluster_config .get_server_conf_with_default (server ) if server else cluster_config .get_global_conf ()
503+ if with_default :
504+ config = cluster_config .get_server_conf_with_default (server ) if server else cluster_config .get_global_conf_with_default ()
505+ else :
506+ config = cluster_config .get_server_conf (server ) if server else cluster_config .get_global_conf ()
493507 return deepcopy (config )
494508
495509 def update_server_conf (self , server , key , value , save = True ):
@@ -514,15 +528,13 @@ def update_global_conf(self, key, value, save=True):
514528 if not self ._deploy_config .update_component_global_conf (self .name , key , value , save ):
515529 return False
516530 self ._update_global_conf (key , value )
517- for server in self ._cache_server :
518- if self ._cache_server [server ] is not None :
519- self ._cache_server [server ][key ] = value
520531 return True
521532
522533 def _update_global_conf (self , key , value ):
523534 self ._original_global_conf [key ] = value
524- if self ._global_conf :
525- self ._global_conf [key ] = value
535+ self ._global_conf = None
536+ self ._unprocessed_global_conf = None
537+ self ._clear_cache_server ()
526538
527539 def update_rsync_list (self , rsync_list , save = True ):
528540 if self ._deploy_config is None :
@@ -541,11 +553,13 @@ def update_environments(self, environments, save=True):
541553 self ._environments = None
542554 return True
543555
544- def get_unconfigured_require_item (self , server ):
556+ def get_unconfigured_require_item (self , server , skip_keys = [] ):
545557 items = []
546- config = self .get_server_conf (server )
558+ config = self ._get_unprocessed_server_conf (server )
547559 if config is not None :
548560 for key in self ._temp_conf :
561+ if key in skip_keys :
562+ continue
549563 if not self ._temp_conf [key ].require :
550564 continue
551565 if key in config :
@@ -556,11 +570,10 @@ def get_unconfigured_require_item(self, server):
556570 def get_server_conf_with_default (self , server ):
557571 if server not in self ._server_conf :
558572 return None
559- config = {}
560- for key in self ._temp_conf :
561- if self ._temp_conf [key ].default is not None :
562- config [key ] = self ._temp_conf [key ].default
563- config .update (self .get_server_conf (server ))
573+ config = deepcopy (self ._all_default_conf )
574+ server_config = self .get_server_conf (server )
575+ if server_config :
576+ config .update (server_config )
564577 return config
565578
566579 def get_need_redeploy_items (self , server ):
@@ -585,11 +598,15 @@ def get_need_restart_items(self, server):
585598
586599 def update_temp_conf (self , temp_conf ):
587600 self ._default_conf = {}
601+ self ._all_default_conf = {}
588602 self ._temp_conf = temp_conf
589603 for key in self ._temp_conf :
590604 if self ._temp_conf [key ].require and self ._temp_conf [key ].default is not None :
591605 self ._default_conf [key ] = self ._temp_conf [key ].default
606+ if self ._temp_conf [key ].default is not None :
607+ self ._all_default_conf [key ] = self ._temp_conf [key ].default
592608 self ._global_conf = None
609+ self ._unprocessed_global_conf = None
593610 self ._clear_cache_server ()
594611
595612 def _apply_temp_conf (self , conf ):
@@ -606,23 +623,44 @@ def get_temp_conf_item(self, key):
606623 return None
607624
608625 def check_param (self ):
609- error = []
626+ errors = []
627+ if self ._temp_conf :
628+ _ , g_errs = self .global_check_param ()
629+ errors += g_errs
630+ for server in self ._server_conf :
631+ s_errs , _ = self ._check_param (self ._server_conf [server ])
632+ errors += s_errs
633+ return not errors , set (errors )
634+
635+ def global_check_param (self ):
636+ errors = []
637+ if self ._temp_conf :
638+ errors , _ = self ._check_param (self ._get_unprocessed_global_conf ())
639+ return not errors , errors
640+
641+ def servers_check_param (self ):
642+ check_res = {}
610643 if self ._temp_conf :
611- error + = self ._check_param ( self . get_global_conf () )
644+ global_config = self ._get_unprocessed_global_conf ( )
612645 for server in self ._server_conf :
613- error += self ._check_param (self ._server_conf [server ])
614- return not error , set (error )
646+ config = deepcopy (self ._server_conf [server ])
647+ config .update (global_config )
648+ errors , items = self ._check_param (config )
649+ check_res [server ] = {'errors' : errors , 'items' : items }
650+ return check_res
615651
616652 def _check_param (self , config ):
617- error = []
653+ errors = []
654+ items = []
618655 for key in config :
619656 item = self ._temp_conf .get (key )
620657 if item :
621658 try :
622659 item .check_value (config [key ])
623660 except Exception as e :
624- error .append (str (e ))
625- return error
661+ errors .append (str (e ))
662+ items .append (item )
663+ return errors , items
626664
627665 def set_global_conf (self , conf ):
628666 if not isinstance (conf , dict ):
@@ -652,15 +690,24 @@ def add_server_conf(self, server, conf):
652690 self ._server_conf [server ] = conf
653691 self ._cache_server [server ] = None
654692
693+ def _get_unprocessed_global_conf (self ):
694+ if self ._unprocessed_global_conf is None :
695+ self ._unprocessed_global_conf = deepcopy (self ._default_conf )
696+ self ._unprocessed_global_conf .update (self ._get_include_config ('config' , {}))
697+ if self ._original_global_conf :
698+ self ._unprocessed_global_conf .update (self ._original_global_conf )
699+ return self ._unprocessed_global_conf
700+
655701 def get_global_conf (self ):
656702 if self ._global_conf is None :
657- self ._global_conf = deepcopy (self ._default_conf )
658- self ._global_conf .update (self ._get_include_config ('config' , {}))
659- if self ._original_global_conf :
660- self ._global_conf .update (self ._original_global_conf )
661- self ._global_conf = self ._apply_temp_conf (self ._global_conf )
703+ self ._global_conf = self ._apply_temp_conf (self ._get_unprocessed_global_conf ())
662704 return self ._global_conf
663705
706+ def get_global_conf_with_default (self ):
707+ config = deepcopy (self ._all_default_conf )
708+ config .update (self .get_global_conf ())
709+ return config
710+
664711 def _add_base_dir (self , path ):
665712 if not os .path .isabs (path ):
666713 if self ._base_dir :
@@ -758,22 +805,32 @@ def get_environments(self):
758805 self ._environments .update (self ._origin_environments )
759806 return self ._environments
760807
808+ def _get_unprocessed_server_conf (self , server ):
809+ if server not in self ._unprocessed_server_conf :
810+ conf = deepcopy (self ._inner_config .get (server .name , {}))
811+ conf .update (self ._get_unprocessed_global_conf ())
812+ conf .update (self ._server_conf [server ])
813+ self ._unprocessed_server_conf [server ] = conf
814+ return self ._unprocessed_server_conf [server ]
815+
761816 def get_server_conf (self , server ):
762817 if server not in self ._server_conf :
763818 return None
764819 if self ._cache_server [server ] is None :
765- conf = self ._apply_temp_conf (deepcopy (self ._inner_config .get (server .name , {})))
766- conf .update (self .get_global_conf ())
767- conf .update (self ._apply_temp_conf (self ._server_conf [server ]))
768- self ._cache_server [server ] = conf
820+ self ._cache_server [server ] = self ._apply_temp_conf (self ._get_unprocessed_server_conf (server ))
769821 return self ._cache_server [server ]
770822
771823 def get_original_global_conf (self ):
772- return self ._original_global_conf
824+ return deepcopy ( self ._original_global_conf )
773825
774826 def get_original_server_conf (self , server ):
775827 return self ._server_conf .get (server )
776828
829+ def get_original_server_conf_with_global (self , server ):
830+ config = self .get_original_global_conf ()
831+ config .update (self ._server_conf .get (server , {}))
832+ return config
833+
777834
778835class DeployStatus (Enum ):
779836
0 commit comments