common/python/maxcompute_tea_openapi/client.py (537 lines of code) (raw):
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import time
from Tea.exceptions import TeaException, UnretryableException
from Tea.request import TeaRequest
from Tea.core import TeaCore
from Tea.model import TeaModel
from typing import Dict, Any
from alibabacloud_credentials.client import Client as CredentialClient
from maxcompute_tea_openapi import models as openapi_models
from alibabacloud_tea_util.client import Client as UtilClient
from alibabacloud_credentials import models as credential_models
from alibabacloud_tea_util import models as util_models
from maxcompute_tea_util.client import Client as McUtilClient
class Client:
_endpoint: str = None
_project: str = None
_region_id: str = None
_protocol: str = None
_method: str = None
_user_agent: str = None
_read_timeout: int = None
_connect_timeout: int = None
_credential: CredentialClient = None
_signature_version: str = None
_headers: Dict[str, str] = None
_suffix: str = None
_global_parameters: openapi_models.GlobalParameters = None
def __init__(
self,
config: openapi_models.Config,
):
"""
Init client with Config
@param config: config contains the necessary information to create a client
"""
if UtilClient.is_unset(config):
raise TeaException({
'code': 'ParameterMissing',
'message': "'config' can not be unset"
})
if not UtilClient.empty(config.access_key_id) and not UtilClient.empty(config.access_key_secret):
if not UtilClient.empty(config.security_token):
config.type = 'sts'
else:
config.type = 'access_key'
credential_config = credential_models.Config(
access_key_id=config.access_key_id,
type=config.type,
access_key_secret=config.access_key_secret
)
credential_config.security_token = config.security_token
self._credential = CredentialClient(credential_config)
elif not UtilClient.empty(config.bearer_token):
cc = credential_models.Config(
type='bearer',
bearer_token=config.bearer_token
)
self._credential = CredentialClient(cc)
elif not UtilClient.is_unset(config.credential):
self._credential = config.credential
self._project = config.project
self._endpoint = config.endpoint
self._protocol = config.protocol
self._method = config.method
self._region_id = config.region_id
self._user_agent = config.user_agent
self._read_timeout = config.read_timeout
self._connect_timeout = config.connect_timeout
self._signature_version = config.signature_version
self._global_parameters = config.global_parameters
self._suffix = config.suffix
def do_request(
self,
params: openapi_models.Params,
request: openapi_models.OpenApiRequest,
runtime: util_models.RuntimeOptions,
) -> dict:
"""
Encapsulate the request and invoke the network
@param action: api name
@param version: product version
@param protocol: http or https
@param method: e.g. GET
@param auth_type: authorization type e.g. AK
@param body_type: response body type e.g. String
@param request: object of OpenApiRequest
@param runtime: which controls some details of call api, such as retry times
@return: the response
"""
params.validate()
request.validate()
runtime.validate()
_runtime = {
'timeouted': 'retry',
'readTimeout': UtilClient.default_number(runtime.read_timeout, self._read_timeout),
'connectTimeout': UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
'retry': {
'retryable': runtime.autoretry,
'maxAttempts': UtilClient.default_number(runtime.max_attempts, 3)
},
'backoff': {
'policy': UtilClient.default_string(runtime.backoff_policy, 'no'),
'period': UtilClient.default_number(runtime.backoff_period, 1)
},
'ignoreSSL': runtime.ignore_ssl
}
_last_request = None
_last_exception = None
_now = time.time()
_retry_times = 0
while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
if _retry_times > 0:
_backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
if _backoff_time > 0:
TeaCore.sleep(_backoff_time)
_retry_times = _retry_times + 1
try:
_request = TeaRequest()
_request.protocol = UtilClient.default_string(self._protocol, params.protocol)
_request.method = params.method
if not UtilClient.is_unset(self._suffix):
_request.pathname = f'/{self._suffix}{params.pathname}'
else:
_request.pathname = params.pathname
global_queries = {}
global_headers = {}
if not UtilClient.is_unset(self._global_parameters):
global_params = self._global_parameters
if not UtilClient.is_unset(global_params.queries):
global_queries = global_params.queries
if not UtilClient.is_unset(global_params.headers):
global_headers = global_params.headers
extends_headers = {}
extends_queries = {}
if not UtilClient.is_unset(runtime.extends_parameters):
extends_parameters = runtime.extends_parameters
if not UtilClient.is_unset(extends_parameters.headers):
extends_headers = extends_parameters.headers
if not UtilClient.is_unset(extends_parameters.queries):
extends_queries = extends_parameters.queries
_request.query = TeaCore.merge(global_queries,
extends_queries,
request.query)
# endpoint is setted in product client
_request.headers = TeaCore.merge({
'host': self._endpoint,
'user-agent': self.get_user_agent(),
'x-odps-user-agent': self.get_user_agent(),
'Date': McUtilClient.get_api_timestamp()
}, global_headers,
extends_headers,
request.headers)
if not UtilClient.is_unset(request.stream):
tmp = UtilClient.read_as_bytes(request.stream)
_request.body = tmp
if not UtilClient.is_unset(request.body):
json_obj = UtilClient.to_jsonstring(request.body)
_request.body = json_obj
_request.headers['content-type'] = 'application/json; charset=utf-8'
canonical_string = McUtilClient.build_canonical_string(params.method, params.pathname, _request.query, _request.headers)
if not UtilClient.equal_string(params.auth_type, 'Anonymous'):
if UtilClient.is_unset(self._credential):
raise TeaException({
'code': f'InvalidCredentials',
'message': f'Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.'
})
credential_model = self._credential.get_credential()
auth_type = credential_model.type
if UtilClient.equal_string(auth_type, 'bearer'):
bearer_token = credential_model.bearer_token
_request.headers['x-odps-bearer-token'] = bearer_token
else:
access_key_id = credential_model.access_key_id
access_key_secret = credential_model.access_key_secret
security_token = credential_model.security_token
_request.headers['Authorization'] = McUtilClient.get_signature(canonical_string, access_key_id, access_key_secret)
if not UtilClient.empty(security_token):
_request.headers['authorization-sts-token'] = security_token
_last_request = _request
_response = TeaCore.do_action(_request, _runtime)
if UtilClient.equal_number(_response.status_code, 204):
return {
'headers': _response.headers
}
if UtilClient.is_4xx(_response.status_code) or UtilClient.is_5xx(_response.status_code):
err = {}
response_body = UtilClient.read_as_string(_response.body)
try:
_res = UtilClient.parse_json(response_body)
err = UtilClient.assert_as_map(_res)
except Exception as error:
err = {}
err['Code'] = 'Unknown'
err['Message'] = response_body
request_id = McUtilClient.to_string(self.default_any(_response.headers.get('x-odps-request-id'), _response.headers.get('X-Odps-Request-Id')))
err['statusCode'] = _response.status_code
raise TeaException({
'code': f"{self.default_any(err.get('Code'), err.get('code'))}",
'message': f"code: {_response.status_code}, {self.default_any(err.get('Message'), err.get('message'))} request id: {request_id}",
'data': err,
'description': f"{self.default_any(err.get('Description'), err.get('description'))}",
'accessDeniedDetail': self.default_any(err.get('AccessDeniedDetail'), err.get('accessDeniedDetail'))
})
if UtilClient.equal_string(params.body_type, 'binary'):
resp = {
'body': _response.body,
'headers': _response.headers,
'statusCode': _response.status_code
}
return resp
elif UtilClient.equal_string(params.body_type, 'byte'):
byt = UtilClient.read_as_bytes(_response.body)
return {
'body': byt,
'headers': _response.headers,
'statusCode': _response.status_code
}
elif UtilClient.equal_string(params.body_type, 'string'):
str = UtilClient.read_as_string(_response.body)
return {
'body': str,
'headers': _response.headers,
'statusCode': _response.status_code
}
elif UtilClient.equal_string(params.body_type, 'json'):
obj = UtilClient.read_as_json(_response.body)
res = UtilClient.assert_as_map(obj)
return res
elif UtilClient.equal_string(params.body_type, 'array'):
arr = UtilClient.read_as_json(_response.body)
return {
'body': arr,
'headers': _response.headers,
'statusCode': _response.status_code
}
else:
anything = UtilClient.read_as_string(_response.body)
return {
'body': anything,
'headers': _response.headers,
'statusCode': _response.status_code
}
except Exception as e:
if TeaCore.is_retryable(e):
_last_exception = e
continue
raise e
raise UnretryableException(_last_request, _last_exception)
async def do_request_async(
self,
params: openapi_models.Params,
request: openapi_models.OpenApiRequest,
runtime: util_models.RuntimeOptions,
) -> dict:
"""
Encapsulate the request and invoke the network
@param action: api name
@param version: product version
@param protocol: http or https
@param method: e.g. GET
@param auth_type: authorization type e.g. AK
@param body_type: response body type e.g. String
@param request: object of OpenApiRequest
@param runtime: which controls some details of call api, such as retry times
@return: the response
"""
params.validate()
request.validate()
runtime.validate()
_runtime = {
'timeouted': 'retry',
'readTimeout': UtilClient.default_number(runtime.read_timeout, self._read_timeout),
'connectTimeout': UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
'retry': {
'retryable': runtime.autoretry,
'maxAttempts': UtilClient.default_number(runtime.max_attempts, 3)
},
'backoff': {
'policy': UtilClient.default_string(runtime.backoff_policy, 'no'),
'period': UtilClient.default_number(runtime.backoff_period, 1)
},
'ignoreSSL': runtime.ignore_ssl
}
_last_request = None
_last_exception = None
_now = time.time()
_retry_times = 0
while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
if _retry_times > 0:
_backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
if _backoff_time > 0:
TeaCore.sleep(_backoff_time)
_retry_times = _retry_times + 1
try:
_request = TeaRequest()
_request.protocol = UtilClient.default_string(self._protocol, params.protocol)
_request.method = params.method
if not UtilClient.is_unset(self._suffix):
_request.pathname = f'/{self._suffix}{params.pathname}'
else:
_request.pathname = params.pathname
global_queries = {}
global_headers = {}
if not UtilClient.is_unset(self._global_parameters):
global_params = self._global_parameters
if not UtilClient.is_unset(global_params.queries):
global_queries = global_params.queries
if not UtilClient.is_unset(global_params.headers):
global_headers = global_params.headers
extends_headers = {}
extends_queries = {}
if not UtilClient.is_unset(runtime.extends_parameters):
extends_parameters = runtime.extends_parameters
if not UtilClient.is_unset(extends_parameters.headers):
extends_headers = extends_parameters.headers
if not UtilClient.is_unset(extends_parameters.queries):
extends_queries = extends_parameters.queries
_request.query = TeaCore.merge(global_queries,
extends_queries,
request.query)
# endpoint is setted in product client
_request.headers = TeaCore.merge({
'host': self._endpoint,
'user-agent': self.get_user_agent(),
'x-odps-user-agent': self.get_user_agent(),
'Date': McUtilClient.get_api_timestamp()
}, global_headers,
extends_headers,
request.headers)
if not UtilClient.is_unset(request.stream):
tmp = await UtilClient.read_as_bytes_async(request.stream)
_request.body = tmp
if not UtilClient.is_unset(request.body):
json_obj = UtilClient.to_jsonstring(request.body)
_request.body = json_obj
_request.headers['content-type'] = 'application/json; charset=utf-8'
canonical_string = McUtilClient.build_canonical_string(params.method, params.pathname, _request.query, _request.headers)
if not UtilClient.equal_string(params.auth_type, 'Anonymous'):
if UtilClient.is_unset(self._credential):
raise TeaException({
'code': f'InvalidCredentials',
'message': f'Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.'
})
credential_model = await self._credential.get_credential_async()
auth_type = credential_model.type
if UtilClient.equal_string(auth_type, 'bearer'):
bearer_token = credential_model.bearer_token
_request.headers['x-odps-bearer-token'] = bearer_token
else:
access_key_id = credential_model.access_key_id
access_key_secret = credential_model.access_key_secret
security_token = credential_model.security_token
_request.headers['Authorization'] = McUtilClient.get_signature(canonical_string, access_key_id, access_key_secret)
if not UtilClient.empty(security_token):
_request.headers['authorization-sts-token'] = security_token
_last_request = _request
_response = await TeaCore.async_do_action(_request, _runtime)
if UtilClient.equal_number(_response.status_code, 204):
return {
'headers': _response.headers
}
if UtilClient.is_4xx(_response.status_code) or UtilClient.is_5xx(_response.status_code):
err = {}
response_body = await UtilClient.read_as_string_async(_response.body)
try:
_res = UtilClient.parse_json(response_body)
err = UtilClient.assert_as_map(_res)
except Exception as error:
err = {}
err['Code'] = 'Unknown'
err['Message'] = response_body
request_id = McUtilClient.to_string(self.default_any(_response.headers.get('x-odps-request-id'), _response.headers.get('X-Odps-Request-Id')))
err['statusCode'] = _response.status_code
raise TeaException({
'code': f"{self.default_any(err.get('Code'), err.get('code'))}",
'message': f"code: {_response.status_code}, {self.default_any(err.get('Message'), err.get('message'))} request id: {request_id}",
'data': err,
'description': f"{self.default_any(err.get('Description'), err.get('description'))}",
'accessDeniedDetail': self.default_any(err.get('AccessDeniedDetail'), err.get('accessDeniedDetail'))
})
if UtilClient.equal_string(params.body_type, 'binary'):
resp = {
'body': _response.body,
'headers': _response.headers,
'statusCode': _response.status_code
}
return resp
elif UtilClient.equal_string(params.body_type, 'byte'):
byt = await UtilClient.read_as_bytes_async(_response.body)
return {
'body': byt,
'headers': _response.headers,
'statusCode': _response.status_code
}
elif UtilClient.equal_string(params.body_type, 'string'):
str = await UtilClient.read_as_string_async(_response.body)
return {
'body': str,
'headers': _response.headers,
'statusCode': _response.status_code
}
elif UtilClient.equal_string(params.body_type, 'json'):
obj = await UtilClient.read_as_json_async(_response.body)
res = UtilClient.assert_as_map(obj)
return res
elif UtilClient.equal_string(params.body_type, 'array'):
arr = await UtilClient.read_as_json_async(_response.body)
return {
'body': arr,
'headers': _response.headers,
'statusCode': _response.status_code
}
else:
anything = await UtilClient.read_as_string_async(_response.body)
return {
'body': anything,
'headers': _response.headers,
'statusCode': _response.status_code
}
except Exception as e:
if TeaCore.is_retryable(e):
_last_exception = e
continue
raise e
raise UnretryableException(_last_request, _last_exception)
def request_with_model(
self,
model: TeaModel,
method: str,
path: str,
runtime: util_models.RuntimeOptions,
) -> dict:
UtilClient.validate_model(model)
req = openapi_models.OpenApiRequest(
body=UtilClient.to_map(model)
)
openapi_params = openapi_models.Params(
pathname=path,
method=method,
body_type='json'
)
return self.call_api(openapi_params, req, runtime)
async def request_with_model_async(
self,
model: TeaModel,
method: str,
path: str,
runtime: util_models.RuntimeOptions,
) -> dict:
UtilClient.validate_model(model)
req = openapi_models.OpenApiRequest(
body=UtilClient.to_map(model)
)
openapi_params = openapi_models.Params(
pathname=path,
method=method,
body_type='json'
)
return await self.call_api_async(openapi_params, req, runtime)
def request_without_model(
self,
model: TeaModel,
method: str,
path: str,
runtime: util_models.RuntimeOptions,
) -> dict:
UtilClient.validate_model(model)
req = openapi_models.OpenApiRequest(
body=UtilClient.to_map(model)
)
openapi_params = openapi_models.Params(
pathname=path,
method=method,
body_type='none'
)
return self.call_api(openapi_params, req, runtime)
async def request_without_model_async(
self,
model: TeaModel,
method: str,
path: str,
runtime: util_models.RuntimeOptions,
) -> dict:
UtilClient.validate_model(model)
req = openapi_models.OpenApiRequest(
body=UtilClient.to_map(model)
)
openapi_params = openapi_models.Params(
pathname=path,
method=method,
body_type='none'
)
return await self.call_api_async(openapi_params, req, runtime)
def call_api(
self,
params: openapi_models.Params,
request: openapi_models.OpenApiRequest,
runtime: util_models.RuntimeOptions,
) -> dict:
if UtilClient.is_unset(params):
raise TeaException({
'code': 'ParameterMissing',
'message': "'params' can not be unset"
})
return self.do_request(params, request, runtime)
async def call_api_async(
self,
params: openapi_models.Params,
request: openapi_models.OpenApiRequest,
runtime: util_models.RuntimeOptions,
) -> dict:
if UtilClient.is_unset(params):
raise TeaException({
'code': 'ParameterMissing',
'message': "'params' can not be unset"
})
return await self.do_request_async(params, request, runtime)
def get_user_agent(self) -> str:
"""
Get user agent
@return: user agent
"""
user_agent = UtilClient.get_user_agent(self._user_agent)
return user_agent
def get_access_key_id(self) -> str:
"""
Get accesskey id by using credential
@return: accesskey id
"""
if UtilClient.is_unset(self._credential):
return ''
access_key_id = self._credential.get_access_key_id()
return access_key_id
async def get_access_key_id_async(self) -> str:
"""
Get accesskey id by using credential
@return: accesskey id
"""
if UtilClient.is_unset(self._credential):
return ''
access_key_id = await self._credential.get_access_key_id_async()
return access_key_id
def get_access_key_secret(self) -> str:
"""
Get accesskey secret by using credential
@return: accesskey secret
"""
if UtilClient.is_unset(self._credential):
return ''
secret = self._credential.get_access_key_secret()
return secret
async def get_access_key_secret_async(self) -> str:
"""
Get accesskey secret by using credential
@return: accesskey secret
"""
if UtilClient.is_unset(self._credential):
return ''
secret = await self._credential.get_access_key_secret_async()
return secret
def get_security_token(self) -> str:
"""
Get security token by using credential
@return: security token
"""
if UtilClient.is_unset(self._credential):
return ''
token = self._credential.get_security_token()
return token
async def get_security_token_async(self) -> str:
"""
Get security token by using credential
@return: security token
"""
if UtilClient.is_unset(self._credential):
return ''
token = await self._credential.get_security_token_async()
return token
def get_bearer_token(self) -> str:
"""
Get bearer token by credential
@return: bearer token
"""
if UtilClient.is_unset(self._credential):
return ''
token = self._credential.get_bearer_token()
return token
async def get_bearer_token_async(self) -> str:
"""
Get bearer token by credential
@return: bearer token
"""
if UtilClient.is_unset(self._credential):
return ''
token = self._credential.get_bearer_token()
return token
@staticmethod
def default_any(
input_value: Any,
default_value: Any,
) -> Any:
"""
If inputValue is not null, return it or return defaultValue
@param input_value: users input value
@param default_value: default value
@return: the final result
"""
if UtilClient.is_unset(input_value):
return default_value
return input_value