#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package CheckServerID # # @todo:¿ç·þÏà¹Ø»î¶¯ÅäÖ÷þÎñÆ÷ID¼ì²é # @author hxp # @date 2026-02-11 # @version 1.0 # # ÏêϸÃèÊö: ¿ç·þÏà¹Ø»î¶¯ÅäÖ÷þÎñÆ÷ID¼ì²é # #------------------------------------------------------------------------------- #"""Version = 2026-02-11 17:30""" #------------------------------------------------------------------------------- def CheckServerIDInList(serverID, serverIDList): """¼ì²éserverIDÊÇ·ñÔÚserverIDListÖУ¬serverIDList°üº¬Çø¼äºÍµ¥¸öID""" if serverIDList is None: return False if not serverIDList: return True for serverIDInfo in serverIDList: if (isinstance(serverIDInfo, (list, tuple)) and len(serverIDInfo) == 2 and serverIDInfo[0] <= serverID <= serverIDInfo[1]) \ or (isinstance(serverIDInfo, int) and serverIDInfo == serverID): return True return False def CheckCrossZoneCfg(curCrossZoneCfgDict, updCrossZoneCfgDict): '''¼ì²é´ý¸üеķÖÇøÅäÖÃÊÇ·ñ·ûºÏ¹æÔò£¬²»·ûºÏµÄ»°±£ÁôÔ­ÅäÖ㬲»¸üР@param curCrossZoneCfgDict: µ±Ç°¿ç·þ·ÖÇøÅäÖà {crossServerID:{zoneID:[[serverIDA, toServerIDB], serverID, ...], ...}, ...} @param updCrossZoneCfgDict: Òª¸üеĿç·þ·ÖÇøÅäÖà {crossServerID:{zoneID:[[serverIDA, toServerIDB], serverID, ...], ...}, ...} @return: (isOK, errMsg) isOKΪTrue±íʾ·ûºÏ¹æÔò£¬errMsgΪ´íÎóÐÅÏ¢ ''' #if curCrossZoneCfgDict == updCrossZoneCfgDict: # return False, "¿ç·þ¹«»á»¥Í¨·ÖÇøÅäÖò»±ä²»´¦Àí" # 1. ¼ì²é¸ñʽÊÇ·ñÕýÈ· is_ok, err_msg = _validate_format(updCrossZoneCfgDict) if not is_ok: return False, err_msg # 2. ¼ì²ézoneIDÈ«¾ÖΨһ is_ok, err_msg = _check_zone_id_unique(updCrossZoneCfgDict) if not is_ok: return False, err_msg # 3. ¼ì²éserverIDÈ«¾ÖΨһ£¨²»½»²æ£© is_ok, err_msg = _check_server_id_unique(updCrossZoneCfgDict) if not is_ok: return False, err_msg # 4. ¼ì²é²»ÄÜɾ³ýÒÑ´æÔÚµÄcrossServerID is_ok, err_msg = _check_no_delete_cross_server_id(curCrossZoneCfgDict, updCrossZoneCfgDict) if not is_ok: return False, err_msg # 5. ¼ì²éÒÑÅäÖõÄserverIDÇø¼ä²»Äܲð·Ö is_ok, err_msg = _check_old_server_ranges_not_split(curCrossZoneCfgDict, updCrossZoneCfgDict) if not is_ok: return False, err_msg # 6. ¼ì²é²»ÄÜ¿çcrossServerIDºÏ²¢ is_ok, err_msg = _check_no_cross_server_merge(curCrossZoneCfgDict, updCrossZoneCfgDict) if not is_ok: return False, err_msg # 7. ¼ì²é²»ÄÜ¿çcrossServerIDÓн»²æ is_ok, err_msg = _check_cross_server_overlap(updCrossZoneCfgDict) if not is_ok: return False, err_msg return True, "" def _validate_format(cfgDict): """ÑéÖ¤ÅäÖøñʽÊÇ·ñÕýÈ·""" if not isinstance(cfgDict, dict): return False, "ÅäÖñØÐëÊÇ×ÖµäÀàÐÍ" for crossServerID, zones in cfgDict.items(): if not isinstance(zones, dict): return False, "crossServerID=%sµÄ·ÖÇøÅäÖñØÐëÊÇ×ÖµäÀàÐÍ" % crossServerID for zoneID, serverList in zones.items(): if not isinstance(serverList, list): return False, "crossServerID=%s,zoneID=%sµÄ·þÎñÆ÷ÁÐ±í±ØÐëÊÇÁбíÀàÐÍ" % (crossServerID, zoneID) for item in serverList: if isinstance(item, list): # Çø¼ä¸ñʽ [start, end] if len(item) != 2: return False, "crossServerID=%s,zoneID=%sµÄÇø¼ä¸ñʽ´íÎ󣬱ØÐëÊÇ[start, end]¸ñʽ" % (crossServerID, zoneID) if not isinstance(item[0], int) or not isinstance(item[1], int): return False, "crossServerID=%s,zoneID=%sµÄÇø¼äÖµ±ØÐëÊÇÕûÊý" % (crossServerID, zoneID) if item[0] > item[1]: return False, "crossServerID=%s,zoneID=%sµÄÇø¼äÆðʼֵ²»ÄÜ´óÓÚ½áÊøÖµ" % (crossServerID, zoneID) elif not isinstance(item, int): return False, "crossServerID=%s,zoneID=%sµÄ·þÎñÆ÷ID±ØÐëÊÇÕûÊý" % (crossServerID, zoneID) return True, "" def _check_zone_id_unique(cfgDict): """¼ì²ézoneIDÊÇ·ñÈ«¾ÖΨһ""" zone_id_map = {} for crossServerID, zones in cfgDict.items(): for zoneID in zones.keys(): if zoneID in zone_id_map: err_msg = "zoneID±ØÐëÈ«¾ÖΨһ£¡zoneID=%sÖØ¸´³öÏÖÔÚcrossServerID=%sºÍcrossServerID=%s" % ( zoneID, zone_id_map[zoneID], crossServerID) return False, err_msg zone_id_map[zoneID] = crossServerID return True, "" def _get_server_ranges(serverList): """´Ó·þÎñÆ÷ÁбíÖÐÌáÈ¡Çø¼ä""" ranges = [] for item in serverList: if isinstance(item, list): ranges.append((item[0], item[1])) return ranges def _check_range_overlap(range1, range2): """¼ì²éÁ½¸öÇø¼äÊÇ·ñÓÐÖØµþ""" a1, a2 = range1 b1, b2 = range2 return not (a2 < b1 or a1 > b2) def _check_server_id_unique(cfgDict): """¼ì²éserverIDÊÇ·ñÈ«¾ÖΨһ£¨²»½»²æ£©""" all_server_ranges = [] all_server_ids = set() # ÊÕ¼¯ËùÓÐserverIDºÍÇø¼ä for crossServerID, zones in cfgDict.items(): for zoneID, serverList in zones.items(): # ÌáÈ¡Çø¼ä ranges = _get_server_ranges(serverList) for r in ranges: all_server_ranges.append((crossServerID, zoneID, r)) # ÌáÈ¡µ¥¶ÀµÄ·þÎñÆ÷ID for item in serverList: if isinstance(item, int): if item in all_server_ids: # ÕÒµ½Õâ¸öserverID³öÏÖÔÚÄÄÀï for csid, zid, rng in all_server_ranges: if rng[0] <= item <= rng[1]: err_msg = "serverID±ØÐëÈ«¾ÖΨһ£¡serverID=%sÔÚcrossServerID=%s,zoneID=%sÇø¼ä[%s,%s]ÄÚÓëcrossServerID=%s,zoneID=%sÖØ¸´" % ( item, csid, zid, rng[0], rng[1], crossServerID, zoneID) return False, err_msg # Èç¹û²»ÔÚÇø¼äÄÚ£¬ÄǾÍÊǵ¥¶ÀµÄIDÖØ¸´ err_msg = "serverID±ØÐëÈ«¾ÖΨһ£¡serverID=%sÔÚcrossServerID=%s,zoneID=%sÖÐÓëÆäËûµØ·½Öظ´" % ( item, crossServerID, zoneID) return False, err_msg all_server_ids.add(item) # ¼ì²éÇø¼äÖ®¼äµÄ½»²æ for i in range(len(all_server_ranges)): csid1, zid1, r1 = all_server_ranges[i] for j in range(i + 1, len(all_server_ranges)): csid2, zid2, r2 = all_server_ranges[j] if _check_range_overlap(r1, r2): err_msg = "serverIDÇø¼ä²»Äܽ»²æ£¡crossServerID=%s,zoneID=%sÇø¼ä[%s,%s]ÓëcrossServerID=%s,zoneID=%sÇø¼ä[%s,%s]Óн»²æ" % ( csid1, zid1, r1[0], r1[1], csid2, zid2, r2[0], r2[1]) return False, err_msg # ¼ì²éµ¥¶À·þÎñÆ÷IDÊÇ·ñÔÚÇø¼äÄÚ for server_id in all_server_ids: for csid, zid, rng in all_server_ranges: if rng[0] <= server_id <= rng[1]: err_msg = "serverID±ØÐëÈ«¾ÖΨһ£¡serverID=%sÔÚcrossServerID=%s,zoneID=%sÇø¼ä[%s,%s]" % ( server_id, csid, zid, rng[0], rng[1]) return False, err_msg return True, "" def _check_no_delete_cross_server_id(curCrossZoneCfgDict, updCrossZoneCfgDict): """¼ì²é²»ÄÜɾ³ýÒÑ´æÔÚµÄcrossServerID""" old_cross_servers = set(curCrossZoneCfgDict.keys()) new_cross_servers = set(updCrossZoneCfgDict.keys()) # ¼ì²éɾ³ýµÄcrossServerID removed_cross_servers = old_cross_servers - new_cross_servers if removed_cross_servers: err_msg = "²»ÄÜɾ³ýÒÑ´æÔÚµÄcrossServerID£¡É¾³ýµÄcrossServerID£º%s" % ", ".join(str(s) for s in removed_cross_servers) return False, err_msg return True, "" def _get_all_server_ids_from_zone(serverList): """´Ó·ÖÇøÅäÖÃÖлñÈ¡ËùÓзþÎñÆ÷ID£¨Õ¹¿ªÇø¼ä£©""" server_ids = set() for item in serverList: if isinstance(item, list): # Çø¼ä start, end = item for server_id in range(start, end + 1): server_ids.add(server_id) else: # µ¥¶À·þÎñÆ÷ID server_ids.add(item) return server_ids def _check_old_server_ranges_not_split(curCrossZoneCfgDict, updCrossZoneCfgDict): """¼ì²éÒÑÅäÖõÄserverIDÇø¼ä²»Äܲð·Ö""" # ¹¹½¨¾ÉÅäÖÃÖÐËùÓзþÎñÆ÷IDµ½(crossServerID, zoneID)µÄÓ³Éä old_server_to_location = {} for crossServerID, zones in curCrossZoneCfgDict.items(): for zoneID, serverList in zones.items(): server_ids = _get_all_server_ids_from_zone(serverList) for server_id in server_ids: old_server_to_location[server_id] = (crossServerID, zoneID) # ¶ÔÓÚ¾ÉÅäÖÃÖеÄÿ¸ö·þÎñÆ÷ID£¬¼ì²éÔÚÐÂÅäÖÃÖÐÊÇ·ñ»¹ÔÚͬһ¸öcrossServerIDÏ # ²¢ÇÒ¼ì²éͬһ¸ö¾ÉzoneIDµÄ·þÎñÆ÷IDÊÇ·ñ»¹ÔÚͬһ¸öÐÂzoneIDÖÐ old_zone_to_new_zone = {} for crossServerID, zones in curCrossZoneCfgDict.items(): for zoneID, serverList in zones.items(): # »ñÈ¡Õâ¸ö¾ÉzoneIDµÄËùÓзþÎñÆ÷ID old_server_ids = _get_all_server_ids_from_zone(serverList) # ÕÒµ½ÕâЩ·þÎñÆ÷IDÔÚÐÂÅäÖÃÖеÄλÖà new_locations = set() for server_id in old_server_ids: # ÔÚÐÂÅäÖÃÖвéÕÒÕâ¸ö·þÎñÆ÷ID found = False for new_crossServerID, new_zones in updCrossZoneCfgDict.items(): for new_zoneID, new_serverList in new_zones.items(): if CheckServerIDInList(server_id, new_serverList): new_locations.add((new_crossServerID, new_zoneID)) found = True break if found: break if not found: # ·þÎñÆ÷IDÏûʧÁË£¨²»ÔÊÐí£© err_msg = "ÒÑÅäÖõÄserverID²»ÄÜɾ³ý£¡serverID=%sÔ­±¾ÔÚcrossServerID=%s,zoneID=%s" % ( server_id, crossServerID, zoneID) return False, err_msg # Èç¹û¾ÉzoneIDµÄ·þÎñÆ÷ID³öÏÖÔÚ¶à¸öÐÂλÖã¬ËµÃ÷±»²ð·ÖÁË if len(new_locations) > 1: locations_str = ["crossServerID=%s,zoneID=%s" % (csid, zid) for csid, zid in new_locations] err_msg = "ÒÑÅäÖõÄserverIDÇø¼ä²»Äܲð·Ö£¡Ô­crossServerID=%s,zoneID=%sµÄ·þÎñÆ÷±»²ð·Öµ½£º%s" % ( crossServerID, zoneID, "¡¢".join(locations_str)) return False, err_msg # ¼Ç¼¾ÉzoneIDµ½ÐÂzoneIDµÄÓ³É䣨Èç¹û´æÔÚ£© if new_locations: old_zone_to_new_zone[(crossServerID, zoneID)] = list(new_locations)[0] return True, "" def _check_no_cross_server_merge(curCrossZoneCfgDict, updCrossZoneCfgDict): """¼ì²é²»ÄÜ¿çcrossServerIDºÏ²¢""" # ¹¹½¨¾ÉÅäÖÃÖÐËùÓзþÎñÆ÷IDµ½crossServerIDµÄÓ³Éä old_server_to_cross_server = {} for crossServerID, zones in curCrossZoneCfgDict.items(): for zoneID, serverList in zones.items(): server_ids = _get_all_server_ids_from_zone(serverList) for server_id in server_ids: old_server_to_cross_server[server_id] = crossServerID # ¼ì²éÐÂÅäÖÃÖÐÊÇ·ñÓзþÎñÆ÷ID±»·ÖÅäµ½Á˲»Í¬µÄcrossServerID for crossServerID, zones in updCrossZoneCfgDict.items(): for zoneID, serverList in zones.items(): server_ids = _get_all_server_ids_from_zone(serverList) for server_id in server_ids: if server_id in old_server_to_cross_server: old_cross_server = old_server_to_cross_server[server_id] if old_cross_server != crossServerID: # ÕÒµ½¾ßÌåµÄ·þÎñÆ÷ID err_msg = "²»ÄÜ¿çcrossServerIDºÏ²¢£¡serverID=%sÔ­±¾ÔÚcrossServerID=%s£¬ÏÖÔÚ±»·ÖÅäµ½crossServerID=%s,zoneID=%s" % ( server_id, old_cross_server, crossServerID, zoneID) return False, err_msg return True, "" def _check_cross_server_overlap(cfgDict): """¼ì²é²»Í¬crossServerIDÖ®¼äÊÇ·ñÓн»²æ""" cross_server_items = list(cfgDict.items()) for i in range(len(cross_server_items)): cross_server_id1, zones1 = cross_server_items[i] for j in range(i + 1, len(cross_server_items)): cross_server_id2, zones2 = cross_server_items[j] # ¼ì²éÁ½¸öcrossServerIDÖ®¼äµÄserverIDÊÇ·ñ½»²æ for zoneID1, serverList1 in zones1.items(): server_ids1 = _get_all_server_ids_from_zone(serverList1) for zoneID2, serverList2 in zones2.items(): server_ids2 = _get_all_server_ids_from_zone(serverList2) # ¼ì²éÊÇ·ñÓн»¼¯ if server_ids1.intersection(server_ids2): # ÕÒµ½¾ßÌåµÄ½»¼¯ intersection = server_ids1.intersection(server_ids2) sample_id = list(intersection)[0] err_msg = "²»Í¬crossServerIDÖ®¼äserverID²»Äܽ»²æ£¡serverID=%sͬʱ³öÏÖÔÚcrossServerID=%s,zoneID=%sºÍcrossServerID=%s,zoneID=%s" % ( sample_id, cross_server_id1, zoneID1, cross_server_id2, zoneID2) return False, err_msg return True, "" # ²âÊÔÓÃÀý if __name__ == "__main__": # ԭʼÅäÖà curCrossZoneCfgDict = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } print "=" * 80 print "¿ªÊ¼²âÊÔËùÓв»ºÏ·¨Çé¿ö" print "=" * 80 # ²âÊÔCheckServerIDInListº¯Êý print "\n1. ²âÊÔCheckServerIDInListº¯Êý:" test_list = [[1, 50], 1001, [101, 200]] print " 25ÔÚÁбíÖÐ:", CheckServerIDInList(25, test_list) # True print " 1001ÔÚÁбíÖÐ:", CheckServerIDInList(1001, test_list) # True print " 150ÔÚÁбíÖÐ:", CheckServerIDInList(150, test_list) # True print " 75ÔÚÁбíÖÐ:", CheckServerIDInList(75, test_list) # False # ²âÊÔÓÃÀý1: ¸ñʽ´íÎó - ·Ç×ÖµäÀàÐÍ print "\n" + "=" * 80 print "²âÊÔ1: ¸ñʽ´íÎó - ·Ç×ÖµäÀàÐÍ" upd1 = "²»ÊÇ×ÖµäÀàÐÍ" is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd1) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý2: ¸ñʽ´íÎó - Çø¼ä¸ñʽ´íÎó print "\n" + "=" * 80 print "²âÊÔ2: ¸ñʽ´íÎó - Çø¼ä¸ñʽ´íÎ󣨲»ÊÇ[start,end]¸ñʽ£©" upd2 = { 10000: { 1: [[1, 50, 60], 1001], # Çø¼äÓÐÈý¸öÔªËØ 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd2) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý3: ¸ñʽ´íÎó - Çø¼äÆðʼֵ´óÓÚ½áÊøÖµ print "\n" + "=" * 80 print "²âÊÔ3: ¸ñʽ´íÎó - Çø¼äÆðʼֵ´óÓÚ½áÊøÖµ" upd3 = { 10000: { 1: [[50, 1], 1001], # 50>1 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd3) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý4: ¸ñʽ´íÎó - ·þÎñÆ÷ID²»ÊÇÕûÊý print "\n" + "=" * 80 print "²âÊÔ4: ¸ñʽ´íÎó - ·þÎñÆ÷ID²»ÊÇÕûÊý" upd4 = { 10000: { 1: [[1, 50], "1001"], # 1001ÊÇ×Ö·û´® 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd4) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý5: zoneIDÈ«¾ÖÖØ¸´ print "\n" + "=" * 80 print "²âÊÔ5: zoneIDÈ«¾ÖÖØ¸´" upd5 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 1: [[201, 300], 1004], # zoneID=1ÖØ¸´ 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd5) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý6: serverIDÖØ¸´ - µ¥¶ÀµÄ·þÎñÆ÷IDÖØ¸´ print "\n" + "=" * 80 print "²âÊÔ6: serverIDÖØ¸´ - µ¥¶ÀµÄ·þÎñÆ÷IDÖØ¸´" upd6 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1001], # 1001ÖØ¸´ 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd6) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý7: serverIDÖØ¸´ - Çø¼ä°üº¬µ¥¶ÀµÄ·þÎñÆ÷ID print "\n" + "=" * 80 print "²âÊÔ7: serverIDÖØ¸´ - Çø¼ä°üº¬µ¥¶ÀµÄ·þÎñÆ÷ID" upd7 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[100, 200], 1003] # Çø¼ä°üº¬100£¬¶ø100ÔÚ[51,100]Çø¼äÄÚ }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd7) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý8: serverIDÖØ¸´ - Çø¼ä½»²æ print "\n" + "=" * 80 print "²âÊÔ8: serverIDÖØ¸´ - Çø¼ä½»²æ" upd8 = { 10000: { 1: [[1, 60], 1001], # [1,60]Óë[51,100]½»²æ 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd8) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý9: serverIDÖØ¸´ - Çø¼äÍêÈ«ÖØµþ print "\n" + "=" * 80 print "²âÊÔ9: serverIDÖØ¸´ - Çø¼äÍêÈ«ÖØµþ" upd9 = { 10000: { 1: [[1, 50], 1001], 2: [[1, 50], 1002], # ÍêÈ«ÏàͬµÄÇø¼ä 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd9) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý10: serverIDÖØ¸´ - Çø¼ä°üº¬ÁíÒ»¸öÇø¼ä print "\n" + "=" * 80 print "²âÊÔ10: serverIDÖØ¸´ - Çø¼ä°üº¬ÁíÒ»¸öÇø¼ä" upd10 = { 10000: { 1: [[1, 100], 1001], # [1,100]°üº¬[51,100] 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd10) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý11: ɾ³ýÒÑ´æÔÚµÄcrossServerID print "\n" + "=" * 80 print "²âÊÔ11: ɾ³ýÒÑ´æÔÚµÄcrossServerID" upd11 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[101, 200], 1003] } # ɾ³ýÁË10001 } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd11) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý12: ÒÑÅäÖõÄserverIDÇø¼ä±»²ð·Ö print "\n" + "=" * 80 print "²âÊÔ12: ÒÑÅäÖõÄserverIDÇø¼ä±»²ð·Ö" upd12 = { 10000: { 1: [[1, 25], 1001], # ²ð·ÖÔ­[1,50]Çø¼ä 2: [[26, 100], 1002], # °üº¬[26,50]ºÍ[51,100] 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd12) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý13: ÒÑÅäÖõÄserverIDÇø¼ä±»²ð·Öµ½²»Í¬crossServerID print "\n" + "=" * 80 print "²âÊÔ13: ÒÑÅäÖõÄserverIDÇø¼ä±»²ð·Öµ½²»Í¬crossServerID" upd13 = { 10000: { 1: [[1, 25], 1001], # ²ð·ÖÔ­[1,50]Çø¼ä 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[26, 50], 1004], # Ô­[1,50]µÄÁíÒ»²¿·Ö 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd13) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý14: ÒÑÅäÖõÄserverID±»É¾³ý print "\n" + "=" * 80 print "²âÊÔ14: ÒÑÅäÖõÄserverID±»É¾³ý" upd14 = { 10000: { 1: [[1, 49], 1001], # ɾ³ýÁËserverID=50 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd14) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý15: ¿çcrossServerIDºÏ²¢ print "\n" + "=" * 80 print "²âÊÔ15: ¿çcrossServerIDºÏ²¢" upd15 = { 10000: { 1: [[1, 50], 1001, 1004], # 1004Ô­±¾ÔÚ10001ÖÐ 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300]], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd15) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý16: ¿çcrossServerIDºÏ²¢Çø¼ä print "\n" + "=" * 80 print "²âÊÔ16: ¿çcrossServerIDºÏ²¢Çø¼ä" upd16 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[101, 200], 1003], 6: [[201, 250]] # ²¿·ÖÔ­10001µÄÇø¼ä }, 10001: { 4: [[251, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd16) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý17: ¿çcrossServerID½»²æ print "\n" + "=" * 80 print "²âÊÔ17: ¿çcrossServerID½»²æ" upd17 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[150, 250], 1004], # [150,250]Óë[101,200]½»²æ 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd17) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý18: ¿çcrossServerID½»²æ£¨ÐÂÇø¼ä£© print "\n" + "=" * 80 print "²âÊÔ18: ¿çcrossServerID½»²æ£¨ÐÂÇø¼ä£©" upd18 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[101, 200], 1003], 6: [[290, 310]] # Óë[201,300]½»²æ }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd18) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý19: serverIDÖØ¸´ - µ¥¶ÀIDÔÚÇø¼äÄÚ£¨¿çcrossServerID£© print "\n" + "=" * 80 print "²âÊÔ19: serverIDÖØ¸´ - µ¥¶ÀIDÔÚÇø¼äÄÚ£¨¿çcrossServerID£©" upd19 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]], 6: [150] # 150ÔÚ10000µÄ[101,200]Çø¼äÄÚ } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd19) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý20: ÒÑÅäÖõÄserverID±»Òƶ¯µ½²»Í¬µÄcrossServerID print "\n" + "=" * 80 print "²âÊÔ20: ÒÑÅäÖõÄserverID±»Òƶ¯µ½²»Í¬µÄcrossServerID" upd20 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300]], 5: [[9000, 9999]] }, 10002: { 6: [[1, 10]] # ½«Ô­10000µÄ[1,10]ÒÆ¶¯µ½ÐµÄcrossServerID } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd20) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý21: ÒÑÅäÖõÄserverID±»²ð·Öµ½²»Í¬µÄzoneID print "\n" + "=" * 80 print "²âÊÔ21: ÒÑÅäÖõÄserverID±»²ð·Öµ½²»Í¬µÄzoneID" upd21 = { 10000: { 1: [[1, 30], 1001], 2: [[31, 100], 1002], # [31,50]Ô­±¾ÔÚzoneID=1 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd21) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØFalse # ²âÊÔÓÃÀý22: ºÏ·¨µÄÅäÖà - ͬcrossServerIDϺϲ¢ print "\n" + "=" * 80 print "²âÊÔ22: ºÏ·¨µÄÅäÖà - ͬcrossServerIDϺϲ¢" upd22 = { 10000: { 1: [[1, 100], 1001, 1002], # ºÏ²¢1ºÍ2Çø 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd22) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØTrue # ²âÊÔÓÃÀý23: ºÏ·¨µÄÅäÖà - À©ÈÝÐÂÇø¼ä print "\n" + "=" * 80 print "²âÊÔ23: ºÏ·¨µÄÅäÖà - À©ÈÝ" upd23 = { 10000: { 1: [[1, 50], [500, 600], 1001, 2001], # Ôö¼ÓÐÂÇø¼ä 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], [601, 700], 1004, 2004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd23) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØTrue # ²âÊÔÓÃÀý24: ºÏ·¨µÄÅäÖà - Ôö¼ÓеÄcrossServerID print "\n" + "=" * 80 print "²âÊÔ24: ºÏ·¨µÄÅäÖà - Ôö¼ÓеÄcrossServerID" upd24 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] }, 10002: { # ÐÂÔöµÄcrossServerID 6: [[10000, 20000]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd24) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØTrue # ²âÊÔÓÃÀý25: ºÏ·¨µÄÅäÖà - Ôö¼ÓеÄzoneID print "\n" + "=" * 80 print "²âÊÔ25: ºÏ·¨µÄÅäÖà - Ôö¼ÓеÄzoneID" upd25 = { 10000: { 1: [[1, 50], 1001], 2: [[51, 100], 1002], 3: [[101, 200], 1003], 7: [[301, 400]] # ÐÂÔözoneID }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd25) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØTrue # ²âÊÔÓÃÀý26: ºÏ·¨µÄÅäÖà - ɾ³ýzoneID£¨Í¬crossServerIDÏ£© print "\n" + "=" * 80 print "²âÊÔ26: ºÏ·¨µÄÅäÖà - ɾ³ýzoneID£¨Í¬crossServerIDÏ£©" upd26 = { 10000: { 1: [[1, 100], 1001, 1002], # ºÏ²¢1ºÍ2Çø£¬É¾³ýÁËzoneID=2 3: [[101, 200], 1003] }, 10001: { 4: [[201, 300], 1004], 5: [[9000, 9999]] } } is_ok, err_msg = CheckCrossZoneCfg(curCrossZoneCfgDict, upd26) print " ½á¹û:", is_ok, "´íÎóÐÅÏ¢:", err_msg # Ó¦¸Ã·µ»ØTrue print "\n" + "=" * 80 print "ËùÓвâÊÔÓÃÀýÖ´ÐÐÍê±Ï" print "=" * 80