# Copyright (c) 2018 Tencent Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import re import warnings from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException from tencentcloud.common.profile.http_profile import HttpProfile class ClientProfile(object): unsignedPayload = False def __init__(self, signMethod=None, httpProfile=None, language="zh-CN", disable_region_breaker=True, region_breaker_profile=None, request_client=None, retryer=None): """SDK profile. :param signMethod: The signature method, valid choice: HmacSHA1, HmacSHA256, TC3-HMAC-SHA256 :type signMethod: str :param httpProfile: The http profile :type httpProfile: :class:`HttpProfile` :param language: Valid choice: en-US, zh-CN. :type language: str :param disable_region_breaker: Switch of region breaker. :type disable_region_breaker: bool :param region_breaker_profile: The region breaker profile. :type region_breaker_profile: :class:`RegionBreakerProfile` :param request_client: Custom request client. :type request_client: str """ self.httpProfile = HttpProfile() if httpProfile is None else httpProfile self.signMethod = "TC3-HMAC-SHA256" if signMethod is None else signMethod valid_language = ["zh-CN", "en-US"] if language not in valid_language: raise TencentCloudSDKException("ClientError", "Language invalid, choices: %s" % valid_language) self.language = language self.disable_region_breaker = disable_region_breaker self.region_breaker_profile = region_breaker_profile if not self.disable_region_breaker and self.region_breaker_profile is None: self.region_breaker_profile = RegionBreakerProfile() self.request_client = None if isinstance(request_client, str) and re.match("^[0-9a-zA-Z-_,;.]+$", request_client): if len(request_client) > 128: warnings.warn("the length of RequestClient should be with in 128 characters, it will be truncated") self.request_client = request_client[:128] elif request_client is not None: warnings.warn("RequestClient not match the regexp: ^[0-9a-zA-Z-_,;.]+$, ignored") self.retryer = retryer class RegionBreakerProfile(object): def __init__(self, backup_endpoint="ap-guangzhou.tencentcloudapi.com", max_fail_num=5, max_fail_percent=0.75, window_interval=60 * 5, timeout=60, max_requests=5): """RegionBreaker profile. :param backup_endpoint: Backup region of endpoint, default ap-guangzhou.tencentcloudapi.com. :type backup_endpoint: str :param max_fail_num: Max failure to trigger breaker, default 5. :type max_fail_num: int :param max_fail_percent: Max failure percent to trigger breaker, default 0.75. :type max_fail_percent: float :param window_interval: Decides when to reset counter if the state is StateClosed, default 5 minutes. :type window_interval: int :param timeout: Decides when to turn StateOpen to StateHalfOpen, default 1 minutes. :type timeout: int :param max_requests: Decides when to turn StateHalfOpen to StateClosed, default 5 successful requests. :type timeout: int """ self.backup_endpoint = backup_endpoint if not self.check_endpoint(): raise TencentCloudSDKException("ClientError", "the format of `backup_endpoint` must be tencentcloudapi.com " "or ${region}.tencentcloudapi.com") self.max_fail_num = max_fail_num self.max_fail_percent = max_fail_percent if self.max_fail_percent < 0 or self.max_fail_percent > 1: raise TencentCloudSDKException("ClientError", "max fail percent must be set between 0 and 1") self.window_interval = window_interval self.timeout = timeout self.max_requests = max_requests def check_endpoint(self): endpoint_split = self.backup_endpoint.split(".") if len(endpoint_split) != 3 and len(endpoint_split) != 2: return False if endpoint_split[-2] != "tencentcloudapi" or endpoint_split[-1] != "com": return False if len(endpoint_split) == 3: region = endpoint_split[0] if len(region.split("-")) != 2: return False return True
Memory