694 lines
22 KiB
Python

# Copyright 2014 Baidu, Inc.
#
# 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.
"""
This module provides a client class for BES.
"""
import copy
import json
import logging
import sys
from baidubce import bce_base_client
from baidubce import compat
from baidubce.auth import bce_v1_signer
from baidubce.http import bce_http_client
from baidubce.http import handler
from baidubce.http import http_methods
from baidubce.services.bes import bes_model
from baidubce.utils import required
_logger = logging.getLogger(__name__)
if sys.version_info[0] == 2:
value_type = (str, unicode)
else:
value_type = (str, bytes)
class BesClient(bce_base_client.BceBaseClient):
"""
Bes sdk client
"""
prefix = b'/api/bes/cluster'
def __init__(self, config=None):
bce_base_client.BceBaseClient.__init__(self, config)
@required(name=value_type,
password=value_type,
modules=list,
version=value_type,
is_old_package=bool,
available_zone=value_type,
security_group_id=value_type,
subnet_uuid=value_type,
vpc_id=value_type,
billing=bes_model.Billing)
def create_cluster(self,
name,
password,
modules,
version,
is_old_package,
available_zone,
security_group_id,
subnet_uuid,
vpc_id,
billing,
client_token=None):
"""
Create cluster
:param name: The parameter to specify es cluster name.
:type name: string
:param password: The parameter to specify password for manage cluster.
:type password: string
:param modules: The parameter to specify modules for cluster.
:type modules: array
:param version: The parameter to specify es cluster version.
:type version: string
:param is_old_package: The parameter to specify is old package
:type is_old_package: bool
:param available_zone: he parameter to specify security zone.
:type available_zone: string
:param security_group_id: The parameter to specify id of the securityGroup.
:type security_group_id: string
:param subnet_uuid: The parameter to specify id of the subnet.
:type subnet_uuid: string
:param vpc_id: The parameter to specify id of the vpc.
:type vpc_id: string
:param billing: The parameter to specify id of billing info.
:type billing: xxx
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/create'
params = None
# if client_token is None:
# params['clientToken'] = generate_client_token()
# else:
# params['clientToken'] = client_token
if client_token is not None:
params = {
'clientToken': client_token
}
module_json_array = []
for module in modules:
module_json_array.append(module.__dict__)
body = {
'name': name,
'password': password,
'modules': module_json_array,
'version': version,
'isOldPackage': is_old_package,
'availableZone': available_zone,
'securityGroupId': security_group_id,
'subnetUuid': subnet_uuid,
'vpcId': vpc_id,
'billing': billing.__dict__
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(name=value_type,
payment_type=value_type,
cluster_id=value_type,
region=value_type,
modules=list)
def resize_cluster(self,
name,
payment_type,
cluster_id,
region,
modules,
client_token=None):
"""
resize cluster
:param name: The parameter to specify es cluster name.
:type name: string
:param payment_type: The parameter to specify mode of payment.
:type payment_type: string
:param cluster_id: The parameter to specify cluster id.
:type cluster_id: array
:param region: The parameter to specify region.
:type region: string
:param modules: The parameter to specify the type of es cluster node resource.
:type modules: list
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/resize'
params = {
'orderType': "RESIZE"
}
# if client_token is None:
# params['clientToken'] = generate_client_token()
# else:
# params['clientToken'] = client_token
# if client_token is not None:
# params = {
# 'clientToken': client_token
# }
module_json_array = []
for module in modules:
module_json_array.append(module.__dict__)
body = {
'name': name,
'paymentType': payment_type,
'modules': module_json_array,
'clusterId': cluster_id,
'region': region
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(page_no=int,
page_size=int)
def get_cluster_list(self,
page_no,
page_size,
client_token=None):
"""
get es cluster list
:param page_no: The parameter to specify cluster list pageNo.
:type page_no: int
:param page_size: The parameter to specify cluster list pageSize.
:type page_size: int
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/list'
params = None
# if client_token is None:
# params['clientToken'] = generate_client_token()
# else:
# params['clientToken'] = client_token
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'pageNo': page_no,
'pageSize': page_size
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(cluster_id=value_type)
def get_cluster_detail(self,
cluster_id,
client_token=None):
"""
get cluster detail info
:param cluster_id: The parameter to specify cluster id.
:type cluster_id: string
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/detail'
params = None
# if client_token is None:
# params['clientToken'] = generate_client_token()
# else:
# params['clientToken'] = client_token
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'clusterId': cluster_id
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(cluster_id=value_type)
def start_cluster(self,
cluster_id,
client_token=None):
"""
start es cluster
:param cluster_id: The parameter to specify cluster id.
:type cluster_id: string
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/start'
params = None
# if client_token is None:
# params['clientToken'] = generate_client_token()
# else:
# params['clientToken'] = client_token
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'clusterId': cluster_id
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(cluster_id=value_type)
def stop_cluster(self,
cluster_id,
client_token=None):
"""
stop es cluster
:param cluster_id: The parameter to specify cluster id.
:type cluster_id: string
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/stop'
params = None
# if client_token is None:
# params['clientToken'] = generate_client_token()
# else:
# params['clientToken'] = client_token
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'clusterId': cluster_id
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(cluster_id=value_type)
def delete_cluster(self,
cluster_id,
client_token=None):
"""
delete es cluster
:param cluster_id: The parameter to specify cluster id.
:type cluster_id: string
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/delete'
params = None
# if client_token is None:
# params['clientToken'] = generate_client_token()
# else:
# params['clientToken'] = client_token
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'clusterId': cluster_id
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(cluster_id=value_type,
instance_id=value_type)
def start_instance(self,
cluster_id,
instance_id,
client_token=None):
"""
start instance of es cluster
:param cluster_id: The parameter to specify cluster id.
:type cluster_id: string
:param instance_id: The parameter to specify cluster id.
:type instance_id: string
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/instance/start'
params = None
# if client_token is None:
# params['clientToken'] = generate_client_token()
# else:
# params['clientToken'] = client_token
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'clusterId': cluster_id,
'instanceId': instance_id,
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(cluster_id=value_type,
instance_id=value_type)
def stop_instance(self,
cluster_id,
instance_id,
client_token=None):
"""
stop instance of es cluster
:param cluster_id: The parameter to specify cluster id.
:type cluster_id: string
:param instance_id: The parameter to specify cluster id.
:type instance_id: string
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/instance/stop'
params = None
# if client_token is None:
# params['clientToken'] = generate_client_token()
# else:
# params['clientToken'] = client_token
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'clusterId': cluster_id,
'instanceId': instance_id,
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(order=value_type,
order_by=value_type,
page_no=int,
page_size=int,
days_to_expiration=int)
def get_renew_list(self,
order,
order_by,
page_no,
page_size,
days_to_expiration,
client_token=None):
"""
get es cluster renew list
:param order: The parameter to specify order rule.
:type order: string
:param order_by: The parameter to specify order field.
:type order_by: string
:param page_no: The parameter to specify renew cluster list pageNo.
:type page_no: int
:param page_size: The parameter to specify renew cluster list pageSize.
:type page_size: int
:param days_to_expiration: The parameter to specify how many days expire.
:type days_to_expiration: int
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/renew/list'
params = None
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'pageNo': page_no,
'pageSize': page_size,
'daysToExpiration': days_to_expiration,
'order': order,
'orderBy': order_by
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(order=value_type,
cluster_id=value_type,
time=int)
def renew_cluster(self,
cluster_id,
time,
client_token=None):
"""
renew es cluster
:param cluster_id: The parameter to specify order cluster id.
:type cluster_id: string
:param time: The parameter to specify renew time, unit month.
:type time: int
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/renew'
params = None
params = {
'orderType': "RENEW"
}
if client_token is not None:
params['clientToken'] = client_token
body = {
'serviceType': 'BES',
'time': time,
'clusterId': cluster_id
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(cluster_ids=list,
user_id=value_type,
region=value_type,
service_type=value_type,
service_ids=list,
renew_time_unit=value_type,
renew_time=int)
def create_auto_renew_rule(self,
cluster_ids,
user_id,
region,
renew_time_unit,
renew_time,
client_token=None):
"""
create cluster auto renew rule
:param cluster_ids: The parameter to cluster id list.
:type cluster_ids: list
:param user_id: The parameter to specify account id.
:type user_id: string
:param region: The parameter to specify region.
:type region: string
:param renew_time_unit: The parameter to specify renew time unit.
:type renew_time_unit: string
:param renew_time: The parameter to specify renew time.
:type renew_time: int
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/auto_renew_rule/create'
params = None
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'clusterIds': cluster_ids,
'userId': user_id,
'region': region,
'serviceType': 'BES',
'renewTimeUnit': renew_time_unit,
"renewTime": renew_time
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
def get_auto_renew_rule_list(self,
client_token=None):
"""
get cluster auto renew rule list
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/auto_renew_rule/list'
params = None
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'serviceType': 'BES',
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(cluster_id=value_type,
account_id=value_type,
renew_time_unit=value_type,
renew_time=int)
def update_auto_renew_rule(self,
cluster_id,
renew_time_unit,
renew_time,
client_token=None):
"""
update cluster auto renew rule
:param cluster_id: The parameter to cluster id list.
:type cluster_id: string
:param renew_time_unit: The parameter to specify renew time unit.
:type renew_time_unit: string
:param renew_time: The parameter to specify renew time.
:type renew_time: int
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/auto_renew_rule/update'
params = None
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'clusterId': cluster_id,
'renewTimeUnit': renew_time_unit,
"renewTime": renew_time
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
@required(cluster_id=value_type)
def delete_auto_renew_rule(self,
cluster_id,
client_token=None):
"""
delete cluster auto renew rule
:param cluster_id: The parameter to cluster id list.
:type cluster_id: string
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/auto_renew_rule/delete'
params = None
if client_token is not None:
params = {
'clientToken': client_token
}
body = {
'clusterId': cluster_id
}
region = self.config.region
headers = {b'x-Region': region,
b'content-type': b'application/json;charset=UTF-8'}
return self._send_request(http_methods.POST, path, params=params, body=json.dumps(body), headers=headers)
def _merge_config(self, config=None):
if config is None:
return self.config
else:
new_config = copy.copy(self.config)
new_config.merge_non_none_values(config)
return new_config
def _send_request(self, http_method, path,
body=None, headers=None, params=None,
config=None, body_parser=None):
config = self._merge_config(config)
if body_parser is None:
body_parser = handler.parse_json
config.endpoint = compat.convert_to_bytes(config.endpoint)
# return bce_http_client.send_request(
# config, sign_wrapper([b'host', b'x-bce-date']), [handler.parse_error, body_parser],
# http_method, compat.convert_to_bytes(BesClient.prefix + path), body, headers, params)
return bce_http_client.send_request(
config, bce_v1_signer.sign, [handler.parse_error, body_parser],
http_method, BesClient.prefix + path, body, headers, params)