2902 lines
100 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Copyright (c) 2014 Baidu.com, Inc. All Rights Reserved
#
# 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 RDS.
"""
from __future__ import unicode_literals
import copy
import json
import logging
import random
import string
import uuid
from baidubce import bce_base_client
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.rds import rds_model
from baidubce.utils import aes128_encrypt_16char_key
from baidubce.utils import required
from baidubce import compat
_logger = logging.getLogger(__name__)
FETCH_MODE_SYNC = b"sync"
FETCH_MODE_ASYNC = b"async"
ENCRYPTION_ALGORITHM = "AES256"
default_billing_to_purchase_created = rds_model.Billing('Postpaid')
default_billing_to_purchase_reserved = rds_model.Billing()
class RDSClient(bce_base_client.BceBaseClient):
"""
Rds base sdk client
"""
prefix = b'/v1'
prefix_v2 = b'/v2'
def __init__(self, config=None):
bce_base_client.BceBaseClient.__init__(self, config)
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
# 1. instance manager
def _send_request(self, http_method, path,
body=None, headers=None, params=None,
config=None, body_parser=None, prefix=None):
config = self._merge_config(config)
if body_parser is None:
body_parser = handler.parse_json
if prefix is None:
prefix = RDSClient.prefix
return bce_http_client.send_request(
config, bce_v1_signer.sign, [handler.parse_error, body_parser],
http_method, prefix + path, body, headers, params)
@required(engine=(str), engine_version=(str), category=(str),
cpuCount=int, memory_capacity=int, volume_capacity=int, disk_io_type=(str),
purchase_count=int, zone_names=list, vpc_id=(str),
subnets=list)
def create_instance(self, engine, engine_version, category, cpu_count, memory_capacity, volume_capacity,
disk_io_type, is_direct_pay=None, initial_data_reference=None, bgw_group_id=None,
bgw_group_exclusive=None, character_set_name=None, lower_case_table_names=None,
parameter_template_id=None, data=None, instance_name=None, vpc_id=None, subnets=None,
tags=None, purchase_count=1, zone_names=None, auto_renew_time_unit='month',
auto_renew_time=None, billing=None, config=None, client_token=None):
"""
Create instance with specific config
:param purchase_count:
Instance count
:type purchase_count: int
:param instance_name:
Instance name
:type instance_name: string
:param engine:
database engine
:type engine: string
:param engine_version:
database version
:type engine_version: string or unicode
:param category: Singleton or Standard
:type category: string
:param cpu_count: Number of CPUs
:type cpu_count: int
:param memory_capacity:
memory sizeunit:GB
:type memory_capacity: int
:param volume_capacity:
disk sizeunit:GB
:type volume_capacity: int
:param disk_io_type:
normal_io; cloud_high; cloud_nor; cloud_enha
:type disk_io_type: string
:param zone_names:
Subnet Name Collection
:type zone_names: list
:param vpc_id:
the vpc short id
:type vpc_id: string
:param is_direct_pay:
Whether to make direct payment, default to false.
Variable configuration orders set to direct payment will
be directly deducted without the need for payment logic
:type is_direct_pay: bool
:param initial_data_reference:
:type initial_data_reference: rds_instance_model.InitialDataReference
:param subnets:
list of model.SubnetMap
:type subnets: list
:param tags:
tag object of collection
:type tags: list
:param bgw_group_id:
If bgwGroupExclusive is true,
if a dedicated cluster ID is specified when creating an instance,
BLB will be assigned to the specified dedicated cluster.
If not passed, it will be assigned by default
:type bgw_group_id: string
:param bgw_group_exclusive:
Load balancing cluster attributes,
true indicates specifying a dedicated cluster,
false indicates using a shared cluster
:type bgw_group_exclusive: bool
:param character_set_name:
the Specify the instance character set,
which includes options such as "utf8mb4",
"latin1", "gbk", and "utf8". The default is "utf8"
(currently only supports MySQL primary instances)
:type character_set_name: string
:param lower_case_table_names:
Is the table name case sensitive. The default is 0,
indicating case sensitivity and case sensitivity;
Pass 1 to indicate case insensitivity
:type lower_case_table_names: int
:param parameter_template_id:
parameter template id
:type parameter_template_id: string
:param auto_renew_time_unit:
Renew monthly or yearly,value in ['month','year]
:type auto_renew_time_unit: str
:param auto_renew_time:
If billing is Prepay, the automatic renewal time is 1-9
when auto_renew_time_unit is 'month' and 1-3 when auto_renew_time_unit is 'year'
:type auto_renew_time: int
:param initial_data_reference:
:type initial_data_reference: instance_model.InitialDataReference
:param data:
Parameter Object of lit
:type data: list
:param billing: default billing is Prepay 1 month
:type billing: rds_instance_model.Billing
:param config: None
:type config: BceClientConfiguration
:return: Object
{
"instance_ids": ["rds-sgrw14145"]
}
:rtype: baidubce.bce_response.BceResponse
"""
if billing is None:
billing = rds_model.Billing()
if zone_names is None:
zone_names = []
if subnets is None:
subnets = []
if tags is None:
tags = []
if data is None:
data = []
body = {
'billing': billing.__dict__,
'purchaseCount': purchase_count,
'instanceName': instance_name,
'engine': engine,
'engineVersion': engine_version,
'category': category,
'cpuCount': cpu_count,
'memoryCapacity': memory_capacity,
'volumeCapacity': volume_capacity,
'diskIoType': disk_io_type,
'zoneNames': zone_names,
'vpcId': vpc_id,
'isDirectPay': is_direct_pay,
'subnets': subnets,
'tags': tags,
'bgwGroupId': bgw_group_id,
'bgwGroupExclusive': bgw_group_exclusive,
'characterSetName': character_set_name,
'lowerCaseTableNames': lower_case_table_names,
'parameterTemplateId': parameter_template_id,
'autoRenewTimeUnit': auto_renew_time_unit,
'autoRenewTime': auto_renew_time,
'initialDataReference': initial_data_reference,
'data': data
}
path = b'/instance'
params = {}
if client_token is None:
params['clientToken'] = generate_client_token()
else:
params['clientToken'] = client_token
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_methods.POST, path, json.dumps(body),
headers=headers, params=params, config=config)
@required(instance_name=(str), source_instance_id=(str), zone_names=list, vpc_id=(str),
is_direct_pay=bool, subnets=list, tags=list, billing=rds_model.Billing)
def create_read_instance(self, source_instance_id, cpu_count, memory_capacity, volume_capacity,
instance_name=None, vpc_id=None, subnets=None, tags=None, zone_names=None,
disk_io_type=None, is_direct_pay=None, billing=None,
config=None):
"""
Create instance with specific config
:param source_instance_id:
The Source instance count
:type source_instance_id: string
:param instance_name:
The Instance name
:type instance_name: string
:param cpu_count: cpu core number
:type cpu_count: int
:param memory_capacity:
The memory size ,unit:GB
:type memory_capacity: int
:param volume_capacity:
The disk sizeunit:GB
:type volume_capacity: int
:param disk_io_type:
normal_io; cloud_high; cloud_nor; cloud_enha
:type disk_io_type: string
:param zone_names:
zone name of arraylist
:type zone_names: list
:param vpc_id:
VPC short ID
:type vpc_id: string
:param is_direct_pay:
:type is_direct_pay: bool
:param subnets:
list of model.SubnetMap
:type subnets: list
:param tags:
:type tags: list
:param billing: default billing is Prepay 1 month
:type billing: rds_instance_model.Billing
:param config: None
:type config: BceClientConfiguration
:return: Object
{
"instance_ids": ["rds-sgrw14145"]
}
:rtype: baidubce.bce_response.BceResponse
"""
if billing is None:
billing = rds_model.Billing()
if zone_names is None:
zone_names = []
if subnets is None:
subnets = []
if tags is None:
tags = []
data = {
'billing': billing.__dict__,
'sourceInstanceId': source_instance_id,
'instanceName': instance_name,
'cpuCount': cpu_count,
'memoryCapacity': memory_capacity,
'volumeCapacity': volume_capacity,
'zoneNames': zone_names,
'vpcId': vpc_id,
'diskIoType': disk_io_type,
'isDirectPay': is_direct_pay,
'subnets': subnets,
'tags': tags
}
path = b'/instance'
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_methods.POST, path,
params={"clientToken": uuid.uuid4(), "readReplica": ""},
headers=headers,
body=json.dumps(data, cls=rds_model.JsonWrapper, indent=4),
config=config)
@required(instance_name=(str), source_instance_id=(str), node_amount=int, zone_names=list,
vpc_id=(str), is_direct_pay=bool, subnets=list, tags=list, billing=rds_model.Billing)
def create_proxy_instance(self, source_instance_id, node_amount, instance_name=None,
vpc_id=None, subnets=None, tags=None, zone_names=None,
is_direct_pay=None, billing=None, config=None):
"""
Create instance with specific config
:param source_instance_id:
Source instance count
:type source_instance_id: string
:param instance_name:
Instance name
:type instance_name: string
:param node_amount:
number of node
:type node_amount: int
:param zone_names:
zone name of arraylist
:type zone_names: list
:param vpc_id:
:type vpc_id: string
:param is_direct_pay:
Whether to make direct payment, default to false.
Variable configuration orders set to direct payment will
be directly deducted without the need for payment logic
:type is_direct_pay: bool
:param subnets: list of model.SubnetMap
:type subnets: list
:param tags:
tag object of arraylist
:type tags: list
:param billing: default billing is Prepay 1 month
:type billing: instance_model.Billing
:param config: None
:type config: BceClientConfiguration
:return: Object
{
"instance_ids": ["rds-sgrw14145"]
}
:rtype: baidubce.bce_response.BceResponse
"""
if billing is None:
billing = rds_model.Billing()
if zone_names is None:
zone_names = []
if subnets is None:
subnets = []
if tags is None:
tags = []
data = {
'billing': billing.__dict__,
'sourceInstanceId': source_instance_id,
'instanceName': instance_name,
'nodeAmount': node_amount,
'zoneNames': zone_names,
'vpcId': vpc_id,
'isDirectPay': is_direct_pay,
'subnets': subnets,
'tags': tags
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_methods.POST,
b'/instance',
params={"clientToken": uuid.uuid4(), "rdsproxy": ""}, headers=headers,
body=json.dumps(data, cls=rds_model.JsonWrapper, indent=4),
config=config)
@required(instance_id=(str))
def get_instance_detail(self, instance_id, config=None):
"""
Get instance detail
:param instance_id:
The ID of instance
:type instance_id: string or unicode
:param config: None
:type config: BceClientConfiguration
:return:
{
"instanceId": "rds-mut9rhom8p3m",
"instanceName": "mysql56",
"memoryCapacity": 0.25,
"volumeCapacity": 5,
"nodeAmount": 2,
"usedStorage": 0.5672,
"engine": "mysql",
"engineVersion": "5.6",
"characterSetName": "utf8mb4",
"instanceStatus": "Available",
"publicAccessStatus": "Closed",
"instanceCreateTime": "2016-04-26T06:46:30Z",
"instanceExpireTime": "2016-05-26T06:46:11Z",
"endpoint": {
"address": "<address>",
"port": 3306,
"vnetIp": "<vnetIp>",
"inetIp": "<inetIp>"
},
"instanceType": "Master",
"zoneNames": ["cn-bj-a"],
"vpcId": "v-kj3nc8fs",
"backupPolicy": {
"backupDays": "0,1,2,3,4,5,6",
"backupTime": "17:00:00Z",
"persistent": false,
"expireInDays": 0,
"freeSpace": 5
},
"topology": {
"rdsproxy": [],
"master": [
"rds-mut9rhog"
],
"readReplica": [
"rds-m2s2du6j",
"rds-m4bkxb0i"
]
},
"syncMode": "Async",
"paymentTiming": "Prepaid"
}
"""
template = b'/instance/{instance_id}'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = template.decode().format(instance_id=instance_id).encode()
return self._send_request(http_methods.GET,
formatted_url,
params=None,
body=None,
config=config)
def list_instances(self, marker=None, max_keys=1000, config=None):
"""
Get instances in current region
:param marker:
To search for the instance id, fill in -1 from the first page
:type marker: str
:param max_keys:
max count per page,deafult is 1000
:type marker: int
:param config:
:return:
"""
params = {}
if marker is not None:
params[b'marker'] = marker
if max_keys is not None:
params[b'maxKeys'] = max_keys
return self._send_request(http_methods.GET,
path=b'/instance',
params=params,
config=config)
@required(instance_id=(str), cpu_count=int, memory_capacity=int, volume_capacity=int, node_amount=int,
is_direct_pay=bool, is_enhanced=bool, effective_time=(str))
def resize_instance(self, instance_id, cpu_count=None, memory_capacity=None, volume_capacity=None,
node_amount=None, is_direct_pay=None, is_enhanced=None, effective_time=None,
disk_io_type=None, force_hot_upgrade=None, master_azone=None, backup_azone=None,
subnet_id=None, edge_subnet_id=None, config=None):
"""
Create instance with specific config
:param cpu_count:
CPU cores number,Unit:Pieces
:type cpu_count: int
:param memory_capacity:
memory size,Unit:GB
:type memory_capacity: int
:param volume_capacity:
disk sizeUnit:GB
:type volume_capacity: int
:param node_amount:
number of nodes
:type node_amount: int
:param is_direct_pay:
Whether to make direct payment, default to false.
Variable configuration orders set to direct payment will
be directly deducted without the need for payment logic
:type is_direct_pay: bool
:param effective_time:
The operation execution method has two values: timewindow
and immediate. Among them, timewindow represents execution
within the time window, and immediate represents immediate
execution. The default is immediate. The default time window
for the instance is from 05:00 to 06:00. Please refer to the
instance details for details
:type effective_time: string
:param disk_io_type:
normal_io; cloud_high; cloud_nor; cloud_enha
:type disk_io_type: string
:param force_hot_upgrade:
:type force_hot_upgrade: int
:param master_azone:
When changing the configuration, it is necessary to change
the available area of the main database. This parameter
needs to be passed a value, such as cn-bj-a.
Do not transfer default to the current main database az
:type master_azone: string
:param subnet_id:
Subnet ID, default to empty
:type subnet_id: string
:param backup_azone:
When changing the configuration, it is necessary to change
the available area of the backup database. This parameter
needs to be passed a value, such as cn-bj-a. Do not transfer,
default to retrieve the current backup database az
:type backup_azone: string
:param edge_subnet_id:
Parameter Edge Subnet ID
:type edge_subnet_id: string
:param config: None
:type config: BceClientConfiguration
:return: Object
{
"instance_ids": ["rds-sgrw14145"]
}
:rtype: baidubce.bce_response.BceResponse
"""
data = {
'cpuCount': cpu_count,
'memoryCapacity': memory_capacity,
'volumeCapacity': volume_capacity,
'nodeAmount': node_amount,
'isDirectPay': is_direct_pay,
'isEnhanced': is_enhanced,
'effectiveTime': effective_time,
'diskIoType': disk_io_type,
'forceHotUpgrade': force_hot_upgrade,
'masterAzone': master_azone,
'backupAzone': backup_azone,
'subnetId': subnet_id,
'edgeSubnetId': edge_subnet_id
}
path = b'/instance/{instance_id}'
formatted_url = path.decode().format(instance_id=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return rds_model.CreateInstanceResponse(
self._send_request(http_methods.PUT,
path=formatted_url,
body=json.dumps(data),
headers=headers,
params={"resize": ""},
config=config))
@required(instance_ids=(str))
def delete_instance(self, instance_ids, config=None):
"""
Delete instance
:param instance_ids:
The ID of instance
:type instance_ids: string or unicode
:param config:
None
:type config: BceClientConfiguration
:return:
"""
path = b'/instance'
return self._send_request(http_method=http_methods.DELETE,
path=path,
params={"instanceIds": instance_ids},
config=config)
@required(instance_id=(str))
def reboot_instance(self, instance_id, config=None):
"""
Reboot instance
:param instance_id:
the ID of instance
:type instance_id: string
:param config:
:type config: BceClientConfiguration
:return:
"""
template = b'/instance/{instance_id}'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = template.decode().format(instance_id=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
headers=headers,
params={"reboot": ""},
config=config)
@required(instance_id=(str), instance_name=(str))
def rename_instance(self, instance_id, instance_name, config=None):
"""
Rename instance
:param instance_id:
the ID of instance
:type instance_id: str
:param instance_name:
name
:type instance_name: str
:param config:
:return:
"""
data = {
'instanceName': instance_name
}
template = b'/instance/{instance_id}'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = template.decode().format(instance_id=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
params={"rename": ""},
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_id=(str), sync_mode=(str))
def modify_sync_mode_instance(self, instance_id, sync_mode, config=None):
"""
ModifySyncMode instance
:param instance_id:
the ID of instance
:type instance_id: str
:param sync_mode:
Async/Semi_sync
:type sync_mode: str
:param config:
:return:
"""
data = {
'syncMode': sync_mode
}
template = b'/instance/{instance_id}'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = template.decode().format(instance_id=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
params={"modifySyncMode": ""},
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_id=(str), sync_mode=(str))
def modify_endpoint_instance(self, instance_id, address, config=None):
"""
ModifyEndpoint instance
:param instance_id:
the ID of instance
:type instance_id: string
:param address:
Fill in the domain name
:type address: string
:param config:
:type config: BceClientConfiguration
:return:
"""
data = {
'address': address
}
template = b'/instance/{instance_id}'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = template.decode().format(instance_id=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
params={"modifyEndpoint": ""},
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_id=(str), public_access=bool)
def modify_public_access_instance(self, instance_id, public_access, config=None):
"""
ModifyPublicAccess instance
:param instance_id:
the ID of instance
:type instance_id: string
:param public_access:
ture/false
:type public_access: bool
:param config:
:type config: BceClientConfiguration
:return:
"""
data = {
'publicAccess': public_access
}
template = b'/instance/{instance_id}'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = template.decode().format(instance_id=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
params={"modifyPublicAccess": ""},
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_ids=list, auto_renew_time_unit=(str), auto_renew_time=int)
def auto_renew_instance(self, instance_ids=None, auto_renew_time_unit=None, auto_renew_time=None, config=None):
"""
AutoRenew instance
:param instance_ids:
the ID of instance
:type instance_ids: list
:param auto_renew_time_unit:
Renewal period, in months
:type auto_renew_time_unit: str
:param auto_renew_time:
Renewal duration
:type auto_renew_time: int
:param config:
:return:
"""
if instance_ids is None:
instance_ids = []
data = {
'instanceIds': instance_ids,
'autoRenewTimeUnit': auto_renew_time_unit,
'autoRenewTime': auto_renew_time
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=b'/instance',
params={"autoRenew": ""},
headers=headers,
body=json.dumps(data),
config=config)
def zone(self, config=None):
"""
Get zone list
:param config:
:type config: BceClientConfiguration
:return:
"""
return self._send_request(
http_method=http_methods.GET,
path=b'/zone',
config=config)
def subnet(self, vpc_id=None, zone_name=None, config=None):
"""
get Subnet list
:param config:
:type config: BceClientConfiguration
:return:
"""
return self._send_request(http_method=http_methods.GET,
path=b'/subnet',
params={"vpcId": vpc_id, "zoneName": zone_name},
config=config)
def price_instance(self, duration, number, product_type, instance=None, config=None):
"""
Gets the specified instance price
:param duration:
The purchase duration does not need to be set when the payment
method is post-payment, but must be set when pre-payment.
The default time unit is month.
:type duration: int
:param number:
Number of purchases. The default value is 1.
:type number: int
:param product_type:
prepay/postpay
:type product_type: string
:param instance: Inquiry parameter object
:type instance: rds_instance_model.Instance
:param config:
:type config: BceClientConfiguration
:return:
"""
data = {
'instance': instance.__dict__,
'duration': duration,
'number': number,
'productType': product_type
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_methods.POST,
path=b'/instance/price',
headers=headers,
body=json.dumps(data, cls=rds_model.JsonWrapper, indent=4),
config=config)
@required(order_id=(str))
def order_status(self, order_id, config=None):
"""
Get order status
:param order_id:
the ID of order
:type order_id: string
:param config:
:type config: BceClientConfiguration
:return:
"""
template = b'/instance/order/{order_id}'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = template.decode().format(order_id=order_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
@required(duration=int, instance_ids=list)
def renew_instance(self, duration, instance_ids, config=None):
"""
Used to renew existing prepaid instances.
If the prepaid instance is in the recycle bin,
it will be restored from the recycle bin after renewal.
:param duration:
Renewal period, unit is month
:type duration: int
:param instance_ids:
An instance array of renewal instances
:type instance_ids: list of string
:param config:
:return:
"""
data = {
"duration": duration,
"instanceIds": instance_ids
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=b'/instance/renew',
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_id=(str), maintain_start_time=(str), maintain_duration=int)
def maintaintime_instance(self, instance_id, maintain_start_time, maintain_duration, config=None):
"""
Update the time window of the instance.
The default time window of the instance is 05:00 to 06:00
:param instance_id:
The ID of instance
:type instance_id: string
:param maintain_start_time:
Start time of the instance maintenance time window,
local time, for example, 17:00:00
:type maintain_start_time: string
:param maintain_duration:
The duration of the instance maintenance time window,
expressed in hours, for example,
Each hour is a time rangeThe start time and duration cannot span one day
:type maintain_duration: int
:param config:
:type config: BceClientConfiguration
:return:
"""
data = {
"maintainDuration": maintain_duration,
"maintainStartTime": maintain_start_time
}
template = b'/instance/{instance_id}/maintaintime'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = template.decode().format(instance_id=instance_id).encode()
headers={b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
headers=headers,
body=json.dumps(data),
config=config)
# 2. database manager
@required(instance_id=(str), data=(dict))
def create_database(self, instance_id, data, config=None):
"""
create a database on the specified instance
:param instance_id:
The specified instance ID
:type instance_id: str
:param data:
This data is an AccountPrivilege array object
:type data: list
:param config: baidubce.BceClientConfiguration
:type config: baidubce.BceClientConfiguration
:return: void
:@rtype: void
"""
path = b'/instance/{instance_id}/databases'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = path.decode().format(instance_id=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=formatted_url,
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_id=(str))
def query_database_list(self, instance_id, config=None):
"""
query database information to return as a list
:param instance_id:
The instance id that needs to be queried
:type instance_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return: json
:type: string
"""
path = b'/instance/{instance_id}/databases'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = path.decode().format(instance_id=instance_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
@required(instance_id=(str), db_name=(str), remark=(str))
def update_database_remark(self, instance_id, db_name=None, remark=None, config=None):
"""
update the database remark on the specified instance
:param instance_id:
The specified instance ID
:type instance_id: str
:param db_name:
The specified database name
:type instance_id: str
:param remark:
need to update remark
:type instance_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return: void
"""
headers = {b'Content-Type': b'application/json'}
data = {"remark": remark}
path = b'/instance/{instance_id}/databases/{db_name}/remark'
formatted_url = path.decode().format(instance_id=instance_id, db_name=db_name).encode()
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_id=(str), db_port=(int))
def update_database_port(self, instance_id, db_port=None, config=None):
"""
Update the database port on the specified instance
:param instance_id:
The specified instance ID
:type instance_id: str
:param db_port:
need to update port
:type db_port: int
:param config: config
:type config: baidubce.BceClientConfiguration
:return: void
:rtype: void
"""
data = {"entryPort": db_port}
headers = {b'Content-Type': b'application/json'}
path = b'/instance/{instance_id}/port'
formatted_url = path.decode().format(instance_id=instance_id).encode()
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
body=json.dumps(data),
headers=headers,
config=config)
@required(instance_id=(str), db_name=(str))
def delete_database(self, instance_id, db_name=None, config=None):
"""
Delete the database on the specified instance
:param instance_id:
The specified instance ID
:rtype: str
:param db_name:
need to update db_name
:rtype: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return: void
:rtype: void
"""
path=b'/instance/{instance_id}/databases/{db_name}'
# 注意由于模板是bytes类型你需要将变量也转换为bytes类型以匹配
formatted_url = path.decode().format(instance_id=instance_id, db_name=db_name).encode()
return self._send_request(http_method=http_methods.DELETE,
path=formatted_url,
config=config)
# 3. backup manager
@required(instance_id=(str), backup_id=(str))
def backup_detail(self, instance_id, backup_id, config=None):
"""
this is open api backup detail
:param instance_id:
The Specify the instance short id,for example: rds-rWLm6n4e
:type instance_id: str
:param backup_id:
The Specify the backup id,for example: 1702325499881950802
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
"""
path = b'/instance/{instanceId}/backup/{backupId}'
formatted_url = path.decode().format(instanceId=instance_id, backupId=backup_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
body=None,
config=config)
@required(instance_id=(str))
def backup_list(self, instance_id, marker=None, max_keys=None, config=None):
"""
this is open api backup list
:param instance_id:
The Specify the instance short id,for example: rds-rWLm6n4e
:type instance_id: str
:param marker:
The backup snapshot ID that needs to be searched
:type marker: str or None
:param max_keys:
Number of entries per page, default to 10
:type max_keys: int
:param config:config
:type config: baidubce.BceClientConfiguration
:return:
:rtype rds_backup_policy_model.BackUpList
"""
if marker is None:
marker = '-1'
if max_keys is None:
max_keys = 1000
params = {
"marker": marker,
"maxKeys": max_keys
}
path = b'/instance/{instanceId}/backup'
formatted_url = path.decode().format(instanceId=instance_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
params=params,
config=config)
@required(instance_id=(str), backup_days=(str),
backup_time=(str), persistent=(bool))
def modify_backup_policy(self, instance_id, backup_days, backup_time, persistent, expire_in_days=None,
config=None):
"""
this is open api modify backup policy
:param instance_id:
The Specify the instance short id,for example: rds-rWLm6n4e
:type instance_id: str
:param backup_days:
Backup time day separated by a comma in English,
with Sunday as the first day, with a value of 0
Example: "0,1,2,3,5,6"(mandatory)
:type backup_days: str
:param backup_time:
Backup start time, the time here is in UTC yyyy-mm-ddThh:mmZ format,
:type backup_time: str
:param persistent:
Is backup data persistence enabled,ture or false
:type persistent: bool
:param expire_in_days:
Persistence days, ranging from 1-730 days;
If not enabled, it is 0 or left blank
:type expire_in_days: int
:param config:config
:type config: baidubce.BceClientConfiguration
:return: void
"""
path = b'/instance/{instanceId}'
formatted_url = path.decode().format(instanceId=instance_id).encode()
data = {
"backupDays": backup_days,
"backupTime": backup_time,
"persistent": persistent
}
if expire_in_days is not None:
data['expireInDays'] = int(expire_in_days)
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
headers = headers,
params={"modifyBackupPolicy": ""},
body=json.dumps(data),
config=config)
@required(instance_id=(str), effective_time=(str), data_backup_type=(str),
data_backup_objects=(list))
def full_backup(self, instance_id, effective_time=None, data_backup_type=None,
data_backup_objects=None, config=None):
"""
Fully backup the database and data tables on the backup instance
:param instance_id:
The Specify the instance short id,for example: rds-rWLm6n4e
:type instance_id: str
:param effective_time:
Window field. The operation execution method has two values:
timewindow and immediate. Among them, timewindow represents
execution within the time window,and immediate represents
immediate execution.The default is immediate. The default
time window for the instance is from 05:00 to 06:00
type effective_time: str
:param data_backup_type:
Backup type, supports physical/snapshot, with a value of snapshot.
If the disk type is SSD, snapshot backup is not supported
type data_backup_type: str
:param data_backup_objects:
Tables/tables that require backup or restoring library/table objects
:type data_backup_objects: list
:param config:config
:type config: baidubce.BceClientConfiguration
:return:
"""
data = {}
if effective_time is not None:
data['effectiveTime'] = effective_time
elif data_backup_type is not None:
data['dataBackupType'] = data_backup_type
elif data_backup_objects is not None:
data['dataBackupObjects'] = data_backup_objects
path = b'/instance/{instanceId}/backup'
formatted_url = path.decode().format(instanceId=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=formatted_url,
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_id=(str), snapsho_id=(str))
def delete_specified_backup(self, instance_id, snapshot_id, config=None):
"""
delete specified backup sdk client
:param instance_id:
The Specify the instance short id,for example: rds-rWLm6n4e
:type instance_id: str
:param snapshot_id:
Delete the specified backup snapshot id, for example: 1701950306675099301
:type snapshot_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
"""
path = b'/instance/{instanceId}/backup/{snapshotId}'
formatted_url = path.decode().format(instanceId=instance_id, snapshotId=snapshot_id).encode()
return self._send_request(http_method=http_methods.DELETE,
path=formatted_url,
config=config)
@required(instance_id=(str), date_time=(str))
def binlog_list(self, instance_id, date_time, config=None):
"""
Get the binlog list on the instance sdk client
:param instance_id:
The Specify the instance short id,for example: rds-rWLm6n4e
:type instance_id: str
:param date_time:
The time to obtain the binglog list, here is UTC time. Users need to
calculate the UTC time themselves and fill it inThe time to obtain
the binglog list, here is UTC time. Users need to calculate the UTC
time themselves and fill it in,The format is YYYY-MM-DDThh:mm:ss:z
:type date_time: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
"""
path = b'/instance/{instanceId}/binlogs/{datetime}'
formatted_url = path.decode().format(instanceId=instance_id, datetime=date_time).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
@required(instance_id=(str), binlog_id=(str),
download_valid_time_in_sec=(str))
def binlog_detail(self, instance_id, binlog_id, download_valid_time_in_sec, config=None):
"""
obtain bean log details based on instance id
:param instance_id:
The Specify the instance short id,for example: rds-rWLm6n4e
:type binlog_id: str
:param download_valid_time_in_sec:
download effective time/S
:type download_valid_time_in_sec: int
:param config: config
:type config: baidubce.BceClientConfiguration
:return: BinlogDetail
:return: string
"""
path = b'/instance/{instance_id}/binlogs/{binlog_id}/{downloadValidTimeInSec}'
formatted_url = path.decode().format(instance_id=instance_id, binlog_id=binlog_id,
downloadValidTimeInSec=download_valid_time_in_sec).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url, config=config)
# 4. hot instance group manager
def force_change_instance(self, group_id, leader_id, force=None, max_behind=None, config=None):
"""
Specify a hot active instance to forcibly switch to the main role
:param group_id:
The instance group id
to the primary role
:type group_id: str
:param leader_id:
The instance ID in the instance group that needs to switch
to the primary role
:type leader_id: str or None
:param force:
Used in fault state,0- Non fault (used in non fault state) 1-
Fault
:type force: int or None
:param max_behind:
Maximum allowable backup behind_Master value (0 indicates
that the data from the backup database and the faulty main
database must be completely consistent. It is recommended
that the business gradually increase from 0 until the
maximum tolerance value is reached.When force=0, this
parameter does not take effect)
:type force: int or None
:param config:config
:type config: baidubce.BceClientConfiguration or None
:return: json str
:type: josn
"""
data = {
"leaderId": leader_id,
"force": force,
"maxBehind": max_behind
}
path = b'/instance/group/{groupId}/forceChange'
formatted_url = path.decode().format(groupId=group_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
body=json.dumps(data),
headers=headers,
config=config)
def group_batch_join(self, follower_ids, name, leader_id, config=None):
"""
Interface Description
1.This interface is used to batch add instances to the hot instance
group sdk client.
matters needing attention
1.To join a hot instance group, the following prerequisites must be met
2.The active instance group only supports MYSQL version 5.6/5.7
3.The synchronization mode of the main instance must be asynchronous
synchronization
4.The primary instance must have GTID enabled
5.The location of the primary instance ID must be consistent with the
current requested location
6.Batch added leader nodes cannot be within the current instance group
:param follower_ids:
slave instance short ID array
:type follower_ids: list
:param name:
Name of joining the instance group
:type name: str
:param leader_id:
Leader instance short ID
:type leader_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return: void
:type: void
"""
data = {
"followerIds": follower_ids,
"name": name,
"leaderId": leader_id
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=b'/instance/group/batchjoin',
headers=headers,
body=json.dumps(data),
config=config)
def create_group(self, name, leader_id, config=None):
"""
Create a hot instance group
:param name:
Instance Group Name
:type name: str
:param leader_id:
Need to create an instance ID as a leader node
:type leader_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return: void
:type: void
"""
data = {
"name": name,
"leaderId": leader_id
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=b'/instance/group',
headers=headers,
body=json.dumps(data),
config=config)
def group_list(self, order=None, order_by=None, page_no=None, page_size=None, filter_map_str=None,
days_to_expiration=None, config=None):
"""
Get a list of hot instance groups
:param order: asc/desc
:type order: str
:param order_by: sort field
:type order_by: str
:param page_no:
Current number of pages,
:type page_no: int
:param page_size:
Number of entries per page
:type page_size: int
:param filter_map_str:
Filtering that includesthree aspects: groupId, groupName, and instanceStatus
# filter_map_str = "{\"groupId\":\"rdcqzga9i4s\"}"
# filter_map_str = "{\"groupName\":\"acount-test\"}"
# filter_map_str = "{\"instanceStatus\":\"topoModifying\"}"
:param days_to_expiration:
Deadline, default to -1
:type days_to_expiration: int
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
params = {b"manner": b"page"}
if order is not None:
params[b"order"] = order
if order_by is not None:
params[b"orderBy"] = order_by
if page_no is not None:
params[b"pageNo"] = page_no
if page_size is not None:
params[b"pageSize"] = page_size
if filter_map_str is not None:
params[b"filterMapStr"] = filter_map_str
if days_to_expiration is not None:
params[b"daysToExpiration"] = days_to_expiration
return self._send_request(http_method=http_methods.GET,
path=b'/instance/group',
params=params, config=config)
def detail_group(self, group_id, config=None):
"""
Query details of hot instance groups
:param group_id:
ID of the hot instance group
:type group_id: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:json str
:GroupDetailResponse
"""
path = b'/instance/group/{groupId}'
formatted_url = path.decode().format(groupId=group_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
def check_gtid_group(self, instance_id, config=None):
"""
This interface is used for instance group pre-check (GTID check).
:param instance_id:
the Specifies the instance ID
:type instance_id: str
:param config:config
:type config: baidubce.BceClientConfiguration
:return result: true or false
:rtype result: rds_hot_active_instance_group_model.GroupCheckGtidResponse
"""
data = {
"instanceId": instance_id
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=b'/instance/group/checkGtid',
headers=headers,
body=json.dumps(data),
config=config)
def check_ping_group(self, source_id, target_id, config=None):
"""
This interface is used for instance group pre-check
(instance connectivity check). The region of the
current request must be the same as the region
where the sourceId resides.
:param source_id:
Source instance id
:type source_id: str
:param target_id:
Target instance id
:type source_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return result: true or false
:rtype result: rds_hot_active_instance_group_model.GroupCheckPingResponse
"""
data = {
"sourceId": source_id,
"targetId": target_id
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=b'/instance/group/checkPing',
headers=headers,
body=json.dumps(data),
config=config)
def check_data_group(self, instance_id, config=None):
"""
this interface is used for instance group pre-check
(data check). The region of the incoming instance
instanceId must be the same as that of the current
request.
:param instance_id:
the Specifies the instance ID
:type instance_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return result : true or false
:rtype result: rds_hot_active_instance_group_model.GroupCheckDataResponse
"""
data = {
"instanceId": instance_id
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=b'/instance/group/checkData',
headers=headers,
body=json.dumps(data),
config=config)
def add_instance_to_group(self, group_id, follower_id, config=None):
"""
adding an instance group refers to adding an existing
instance group. The instance to be added cannot be
an existing hot live instance group
:param group_id:
The Specify the ID of the created Heat instance group
:type group_id: str
:param follower_id:
The ID of the instance to be added
:type follower_id: str
:param config:config
:type config: baidubce.BceClientConfiguration
:return result:true or false
:rtype result :bool
"""
data = {
"followerId": follower_id
}
path=b'/instance/group/{groupId}/instance'
formatted_url = path.decode().format(groupId=group_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=formatted_url,
body=json.dumps(data),
headers=headers,
config=config)
def modify_instances_group_name(self, group_id, group_name, config=None):
"""
modify instances group name
:param group_id:
The Specifies the ID of the hot instance group
:type group_id: str
:param group_name:
Name of the Heat instance group that you want to modify
:type group_name: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
"""
data = {
"name": group_name
}
path = b'/instance/group/{groupId}/name'
formatted_url = path.decode().format(groupId=group_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=formatted_url,
body=json.dumps(data),
headers=headers,
config=config)
def delete_instances_group(self, group_id, config=None):
"""
delete a specified instance group. Only one leader instance can be deleted
:param group_id:
id of the instance group to be deleted
:type group_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
"""
path=b'/instance/group/{groupId}'
formatted_url = path.decode().format(groupId=group_id).encode()
return self._send_request(http_method=http_methods.DELETE,
path=formatted_url,
config=config)
def master_role_change(self, group_id, leader_id, config=None):
"""
To switch the instance of the instance group to the primary role
:param group_id:
The Specifies the ID of the hot instance group
: type group_id: str
:param leader_id:
Switch the instance of the master role
type leader_id: str
:param config: config
type config: baidubce.BceClientConfiguration
:return:
:rtype:
"""
data = {
"leaderId": leader_id
}
path=b'/instance/group/{groupId}/instance'
formatted_url = path.decode().format(groupId=group_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
body=json.dumps(data),
headers=headers,
config=config)
def quit_instances_group(self, group_id, instance_id, config=None):
"""
To exit the hot instance group, the region of the incoming
instance instanceId must be the same as that of the current
request
:param group_id:
id of the group from which you want to exit the
hot instance group
:type group_id: str
:param instance_id:
id of the hot instance group from which you want
to exit
:type instance_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
:rtype:
"""
path=b'/instance/group/{groupId}/instance/{instanceId}'
formatted_url = path.decode().format(groupId=group_id, instanceId=instance_id).encode()
return self._send_request(http_method=http_methods.DELETE,
path=formatted_url,
config=config)
def check_min_version(self, leader_id, follower_id, config=None):
"""
pre-check the minor version of the instance added to the
hot live group
:param leader_id:
The specifies the id of the leader instance
:type leader_id: str
:param follower_id:
The specifies the follower instance id
:type follower_id: str
:param config:config
:type config: baidubce.BceClientConfiguration
:return result: true or false
:rtype result: bool
"""
data = {
"leaderId": leader_id,
"followerId": follower_id
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=b'/instance/group/checkVersion',
headers=headers,
body=json.dumps(data),
config=config)
# 5. log manager
@required(instance_id=(str))
def slow_log_detail(self, instance_id, start_time=None, end_time=None, page_no=None, page_size=None,
db_name=None, host_ip=None, user_name=None, sql=None, config=None):
"""
get slow log detail
:param instance_id:
id of the slow log instance
:type instance_id: str
:param start_time:
Slow log start time. The format is yyyy-mm-ddThh:mm:ssZ,
for example,2014-07-30T15:06:00Z.
:type start_time: str
:param end_time:
Slow log end time. The format is yyyy-mm-ddThh:mm:ssZ,
for example,2014-08-20T18:06:00Z.
:type end_time: str
:param page_no:
Current page count, not from the first page
:type page_no: int
:param page_size:
Number of items per page. 10 items per page is recommended
:type page_size: int
:param db_name: database name list
:type db_name: list
:param host_ip: ip address listipv4
:type host_ip: list
:param user_name: username list
:type user_name: list
:param sql: sql statement
:type sql: str
:param config:
:return:
"""
data = {}
if start_time is not None:
data['startTime'] = start_time
if end_time is not None:
data['endTime'] = end_time
if page_no is not None:
data['pageNo'] = page_no
if page_size is not None:
data['pageSize'] = page_size
if db_name is not None:
data['dbName'] = db_name
if host_ip is not None:
data['hostIp'] = host_ip
if user_name is not None:
data['userName'] = user_name
if sql is not None:
data['sql'] = sql
path=b'/instance/{instanceId}/slowlogs/details'
formatted_url = path.decode().format(instanceId=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=formatted_url,
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_id=(str))
def error_log_detail(self, instance_id, start_time=None, end_time=None, page_no=None, page_size=None,
key_word=None, config=None):
"""
get error log detail
:param instance_id:
id of the slow log instance
:type instance_id: str
:param start_time:
Error log start time. The format is yyyy-mm-ddThh:mm:ssZ,
for example,2014-07-30T15:06:00Z.
:type start_time: str
:param end_time:
Error log end time. The format is yyyy-mm-ddThh:mm:ssZ,
for example,2014-07-30T15:06:00Z.
:type end_time: str
:param page_no:
Current page count, not from the first page
:type page_no: int
:param page_size:
Number of items per page. 10 items per page is recommended
:type page_size: int
:param key_word:
Search keywords
:type key_word: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:rtype: baidubce.services.rds.model.ErrorLogDetail
"""
data = {}
if start_time is not None:
data['startTime'] = start_time
if end_time is not None:
data['endTime'] = end_time
if page_no is not None:
data['pageNo'] = page_no
if page_size is not None:
data['pageSize'] = page_size
if key_word is not None:
data['keyWord'] = key_word
path=b'/instance/{instanceId}/errorlogs/details'
formatted_url = path.decode().format(instanceId=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=formatted_url,
body=json.dumps(data),
headers=headers,
config=config)
@required(instance_id=(str), log_id=(str), download_valid_time_in_sec=(int))
def slow_log_download_detail(self, instance_id, log_id, download_valid_time_in_sec, config=None):
"""
slow log download detail
:param instance_id:
The specify instance id
:type instance_id: str
:param log_id:
The slow log id
:param download_valid_time_in_sec: 1800
:type download_valid_time_in_sec: int
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
path = b'/instance/{instanceId}/slowlogs/download_url/{logId}/{downloadValidTimeInSec}'
formatted_url = path.decode().format(instanceId=instance_id, logId=log_id,
downloadValidTimeInSec=download_valid_time_in_sec).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
@required(instance_id=(str), log_id=(str), download_valid_time_in_sec=(str))
def error_log_download_detail(self, instance_id, log_id, download_valid_time_in_sec, config=None):
"""
error log download detail
:param instance_id:
The specify instance id
:type instance_id: str
:param log_id:
The error log id
:type log_id: str
:param download_valid_time_in_sec: 1800
:type download_valid_time_in_sec: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:type: baidubce.services.rds.model.DownLoadDetail
"""
path=b'/instance/{instanceId}/errorlogs/download_url/{logId}/{downloadValidTimeInSec}'
formatted_url = path.decode().format(instanceId=instance_id, logId=log_id,
downloadValidTimeInSec=download_valid_time_in_sec).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
# 6.recycle manager
def recycler_list(self, marker=None, max_keys=None, config=None):
"""
Get instances recycler list
:param marker: Find the instance id in the recycle bin list
:type marker: str or None
:param max_keys: the current number
:type max_keys: int or None
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
params = {}
if marker is not None:
params[b'marker'] = marker
if max_keys is not None:
params[b'maxKeys'] = max_keys
return self._send_request(http_methods.GET,
path=b'/instance/recycler/list',
params=params,
config=config)
@required(instance_ids=list)
def recycler_recover(self, instance_ids, config=None):
"""
Get instances recycler recover
:param instance_ids:
List of instance ids in the recycle bin
:type instance_ids: list
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
data = {
'instanceIds': instance_ids
}
headers={b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.PUT,
path=b'/instance/recycler/recover',
body=json.dumps(data),
headers=headers,
config=config)
@required(instance_id=(str))
def delete_recycler(self, instance_id, config=None):
"""
Delete the instance from the recycle bin
:param instance_id: the instance id in recycle bin
:type instance_id: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
path=b'/instance/recycler/{instanceId}'
formatted_url = path.decode().format(instanceId=instance_id).encode()
return self._send_request(http_method=http_methods.DELETE,
path=formatted_url,
config=config)
# 7.task manager
def task_instance(self, page_size=None, page_no=None, end_time=None, instance_id=None,
instance_name=None, task_id=None, task_type=None, task_status=None,
start_time=None, config=None):
"""
task list
:param instance_id: the specified instance id
:type instance_id: string
:param page_size: the number of items per page
:type page_size: int or None
:param page_no: the current page no
:type page_no: int or None
:param end_time: the task executor end time
:type end_time: string or None
:param instance_name: the specified instance name
:type instance_name: string or None
:param task_id: the specified task id
:type task_id: string or None
:param task_type: Task type, value: resize/switch/reboot/changeAzone
:type task_type: string or None
:param task_status: Task status, value, created/running/success/failed/cancelled
:type task_status: string or None
:param start_time: Task executor start time
:type start_time: string or None
:param config:
:return:
"""
data = {}
if page_no is not None:
data['pageNo'] = page_no
if page_size is not None:
data['pageSize'] = page_size
if end_time is not None:
data['endTime'] = end_time
if instance_id is not None:
data['instanceId'] = instance_id
if instance_name is not None:
data['instanceName'] = instance_name
if task_id is not None:
data['taskId'] = task_id
if task_type is not None:
data['taskType'] = task_type
if task_status is not None:
data['taskStatus'] = task_status
if start_time is not None:
data['startTime'] = start_time
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=b'/instance/task',
headers=headers,
body=json.dumps(data),
config=config)
# 8.param manager
@required(instance_id=str)
def parameter_list(self, instance_id, keyword=None, config=None):
"""
Gets a list of parameters for the specified instance
:param instance_id:
the specified instance id
:type instance_id: str
:param keyword:
the keyword of parameter
:type keyword: str or None
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
"""
path=b'/instance/{instanceId}/parameter'
formatted_url = path.decode().format(instanceId=instance_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
params={'keyword': keyword},
config=config)
@required(instance_id=(str), e_tag=(str), effective_time=(str), parameters=(list))
def modify_config_parameter(self, instance_id, e_tag, effective_time, parameters,
config=None):
"""
Modifying config parameters for the specified instance
:param instance_id:
The specified instance id
:type instance_id: str
:param e_tag:
The new version, for example, v1,
is obtained from the details list
:type e_tag: str
:param effective_time:
Actual validity mode: immediate or
maintenance time (timewindow)
:type effective_time: str
:param parameters:
Parameter list to be modified
:type parameters: list
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
"""
headers = {b'Content-Type': b'application/json', b'x-bce-if-match': e_tag}
data = {
"effectiveTime": effective_time,
"parameters": parameters
}
path=b'/instance/{instanceId}/parameter'
formatted_url = path.decode().format(instanceId=instance_id).encode()
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
body=json.dumps(data),
headers=headers,
config=config)
@required(instance_id=(str))
def query_modify_parameter_history_List(self, instance_id, config=None):
"""
query modify parameter history list
:param instance_id:
The specified instance id
:type instance_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
"""
path=b'/instance/{instanceId}/parameter/history'
formatted_url = path.decode().format(instanceId=instance_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
def query_parameter_template_list(self, page_no=None, page_size=None, template_type=None,
db_type=None, db_version=None, config=None):
"""
query parameter template
:param page_no:
The current page number,default is 1
:type page_no: int
:param page_size:
The number of records per page,default is 10
:type page_no: int
:param template_type:
The template type can be user or system.
The default value is user. user: Returns
a list of custom parameters. system:
Returns the system parameter list.
:type template_type: string
:param db_type:
Tthe Database type
:type db_type: string
:param db_version:
The Database version
:type db_version: string
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
params = {}
if page_no is not None:
params['pageNo'] = page_no
if page_size is not None:
params['pageSize'] = page_size
if template_type is not None:
params['type'] = template_type
if db_type is not None:
params['dbType'] = db_type
if db_version is not None:
params['dbVersion'] = db_version
return self._send_request(http_method=http_methods.GET,
path=b'/instance/paraTemplate',
params=params,
config=config)
@required(template_id=(str))
def query_parameter_template_detail(self, template_id, config=None):
"""
query parameter template detail
:param template_id:
The id of parameter template
:type template_id: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
path=b'/instance/paraTemplate/template/detail/{templateId}'
formatted_url = path.decode().format(templateId=template_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
@required(template_id=(str), name=(str), desc=(str))
def copy_parameter_template(self, template_id, name, desc, config=None):
"""
copy parameter template
:param name:
The name of parameter template
:type name: str
:param desc:
The description of parameter template
:type desc: str
:param template_id:
The id of parameter template
:type template_id: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
data = {
'name': name,
'desc': desc,
"templateId": template_id
}
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=b'/instance/paraTemplate/duplicate/template',
headers=headers,
body=json.dumps(data),
config=config)
# security manager
@required(instance_id=(str))
def get_white_list(self, instance_id, config=None):
"""
query whit list
:param instance_id: the specified instance id
:type instance_id: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
path=b'/instance/{instanceId}/securityIp'
formatted_url = path.decode().format(instanceId=instance_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
@required(instance_id=(str), security_ips=(list), e_tag=(str))
def update_white_list(self, instance_id, security_ips, e_tag, config=None):
"""
update whit list
:param instance_id: the specified instance id
:type instance_id: str
:param security_ips:
Set the IP addresses of the whitelist, separated by commas (,)
for example: [ "xx.xx.xx.xx","xx.xx.xx.xx" ]
:type security_ips: list
:param e_tag:
The ETag value is obtained by querying the interface
:type e_tag: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
path=b'/instance/{instanceId}/securityIp'
formatted_url = path.decode().format(instanceId=instance_id).encode()
data = {"securityIps": security_ips}
headers = {b'Content-Type': b'application/json', b'x-bce-if-match': e_tag}
return self._send_request(http_method=http_methods.PUT,
path=formatted_url,
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_id=(str))
def get_ssl_status(self, instance_id, config=None):
"""
Enable and disable ssl
:param instance_id:
the specified instance id
:type instance_id: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
path=b'/instance/ssl/{instanceId}'
formatted_url = path.decode().format(instanceId=instance_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
def obtain_ssl_ca(self, config=None):
"""
Obtaining a ca Certificate
:param config:
type config: baidubce.BceClientConfiguration
:return:
"""
return self._send_request(http_method=http_methods.GET,
path=b'/instance/ssl/static/ca',
config=config)
# read only manager
@required(instance_id=(str), vpc_id=(str), subnet_id=(str))
def create_readonly_group(self, instance_id, vpc_id, subnet_id, ro_group_name=None,
enable_delay_off=None, least_app_amount=None,
balance_reload=None, bgw_group_exclusive=None,
bgw_groupId=None, entry_port=None, vnet_ip=None,
delay_threshold=None, config=None):
"""
create readonly group
:param instance_id:
the specified instance id
:type instance_id: str
:param vpc_id:
the specified vpc id
:type vpc_id: str
:param subnet_id:
the specified subnet id
:type subnet_id: str
:param ro_group_name:
the created ro group name
:type ro_group_name: str or None
:param enable_delay_off:
Whether to enable deferred culling.
The default value is off. When enabled,
read-only instances in a group that experience
latency and reach a threshold are removed from
the group if the minimum number of retained instances is met
:type enable_delay_off: bool(True/False) or None
:param least_app_amount:
Minimum number of reserved instances in a group.
The value is an integer ranging from 0 to 5. Default is 1
:type least_app_amount: int or None
:param balance_reload:
Whether to enable the reload balancing switch.
The default value is disabled. After this function
is enabled, old connections are disconnected when
the weight of read-only instances in a group is changed
:type balance_reload: bool(True/False)
:param bgw_group_exclusive:
The value is assigned to a shared cluster or a dedicated
cluster. The default value is false
:type bgw_group_exclusive: bool(True/False) or None
:param bgw_groupId:
Cluster ID, if passed, to which cluster to assign the blb;
If no dedicated cluster is transmitted, use the dedicated
cluster with the least default configuration.
If no dedicated cluster is transmitted, use the shared
cluster with the least default configuration.
:type bgw_groupId: str or None
:param entry_port:
Service port. The default value MySQL is 3306
:type entry_port: int or None
:param vnet_ip:
The IP address of the virtual network, for example 10.254.38.96
:type vnet_ip: str or None
:param delay_threshold:
The value is an integer greater than or equal to 0. Default is 10
:type delay_threshold: int or None
:param config:
:type config: baidubce.BceClientConfiguration or None
:return:
"""
data = {"vpcId": vpc_id, "subnetId": subnet_id}
if ro_group_name is not None:
data["roGroupName"] = ro_group_name
if enable_delay_off is not None:
data["enableDelayOff"] = enable_delay_off
if bgw_groupId is not None:
data["bgwGroupId"] = bgw_groupId
if entry_port is not None:
data["entryPort"] = int(entry_port)
if vnet_ip is not None:
data["vnetIp"] = vnet_ip
if least_app_amount is None:
data["leastAppAmount"] = 1
else:
data["leastAppAmount"] = int(least_app_amount)
if bgw_group_exclusive is None:
data["bgwGroupExclusive"] = False
else:
data["bgwGroupExclusive"] = bgw_group_exclusive
if delay_threshold is None:
data["delayThreshold"] = 10
else:
data["delayThreshold"] = int(delay_threshold)
if balance_reload is None:
data["balanceReload"] = False
else:
data["balanceReload"] = bool(balance_reload)
path = b'/rds/{sourceAppId}/rogroup'
formatted_url = path.decode().format(sourceAppId=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.POST,
path=formatted_url,
body=json.dumps(data),
headers=headers,
config=config)
@required(instance_id=(str), ro_group_id=(str))
def readonly_group_detail(self, instance_id, ro_group_id, config=None):
"""
get readonly group detail
:param instance_id:
the specified instance id
:type instance_id: str
:param ro_group_id:
the specified ro group id
:type ro_group_id: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
path = b'/rds/{sourceAppId}/rogroup/detail/{roGroupId}'
formatted_url = path.decode().format(sourceAppId=instance_id, roGroupId=ro_group_id).encode()
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
@required(instance_id=(str))
def master_instance_associated_readonly_List(self, instance_id, config=None):
"""
Displays the list of read-only groups associated
with the primary instance.
:param instance_id:
the specified instance id
:type instance_id: str
:param config:
:type config: baidubce.BceClientConfiguration
@return:
"""
path = b'/rds/{sourceAppId}/rogroup/list'
formatted_url = path.decode().format(sourceAppId=instance_id).encode()
headers = {b'Content-Type': b'application/json'}
return self._send_request(http_method=http_methods.GET,
path=formatted_url,
config=config)
@required(instance_id=(str), ro_group_id=(str), read_replica_list=(list))
def join_readonly_group(self, instance_id, ro_group_id, read_replica_list, config=None):
"""
You can add read-only instances to a read-only group
individually or add a maximum of four word read groups in a batch.
:param instance_id:
the specified source isntance id
:type instance_id: str
:param ro_group_id:
the specified ro group id
:type ro_group_id: str
:param read_replica_list:
the specified read replica list include more read app
:type read_replica_list: list
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
data = {"readReplicaList": read_replica_list}
path = b'/rds/{sourceAppId}/rogroup/{roGroupId}/join'
formatted_url = path.decode().format(sourceAppId=instance_id, roGroupId=ro_group_id).encode()
headers = {b'Content-Type': b'application/json'}
self._send_request(http_method=http_methods.PUT,
path=formatted_url,
headers=headers,
body=json.dumps(data),
config=config)
@required(instance_id=(str), ro_group_id=(str))
def readonly_group_load_balance(self, source_app_id, ro_group_id, config=None):
"""
Load balancing is restarted for the read-only group
:param source_app_id:
The specified source isntance id
:type source_app_id: str
:param ro_group_id:
The specified ro group id
:type ro_group_id: str
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
"""
path = b'/rds/{sourceAppId}/rogroup/{roGroupId}/reload'
formatted_url = path.decode().format(sourceAppId=source_app_id, roGroupId=ro_group_id).encode()
headers = {b'Content-Type': b'application/json'}
self._send_request(http_method=http_methods.PUT,
path=formatted_url,
headers=headers,
config=config)
@required(source_app_id=(str), ro_group_id=(str))
def batch_modify_readonly_group_properties(self, source_app_id, ro_group_id, ro_group_name=None,
enable_delay_off=None, delay_threshold=None,
balance_reload=None, least_app_amount=None,
read_replica_list=None, config=None):
"""
batch modify readonly group properties
:param source_app_id:
The specified source instance id
:type source_app_id: str
:param ro_group_id:
The specified ro group id
:type ro_group_id: str
:param ro_group_name:
Name of the read-only group that you want to change
:type ro_group_name: str or None
:param enable_delay_off:
Delay auto-delete switch of read-only groupstrue / false
:type enable_delay_off: bool or None
:param delay_threshold:
Delay threshold. The value must be an integer greater than
or equal to 0, ranging from 1 to 2147483646
:type delay_threshold: int or None
:param balance_reload:
Re-load balancing switch of the read-only group, true / false
:type balance_reload: bool or None
:param least_app_amount:
Minimum number of reserved instances in a group.
The value is an integer ranging from 0 to 5. Default is 1
:type least_app_amount: int or None
:param read_replica_list:
List of read-only instances for which you want to change the
weight Recommended range: 1-100
:type read_replica_list: list or None
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
data = {}
if source_app_id is not None:
data["sourceAppId"] = source_app_id
if ro_group_id is not None:
data["roGroupId"] = ro_group_id
if ro_group_name is not None:
data["roGroupName"] = ro_group_name
if enable_delay_off is not None:
data["enableDelayOff"] = enable_delay_off
if delay_threshold is not None:
data["delayThreshold"] = int(delay_threshold)
if balance_reload is not None:
data["balanceReload"] = bool(balance_reload)
if least_app_amount is not None:
data["leastAppAmount"] = int(least_app_amount)
if read_replica_list is not None:
data["readReplicaList"] = read_replica_list
path = b'/rds/{sourceAppId}/rogroup/{roGroupId}/updateRoGroupProperty'
formatted_url = path.decode().format(sourceAppId=source_app_id, roGroupId=ro_group_id).encode()
headers = {b'Content-Type': b'application/json'}
self._send_request(http_method=http_methods.PUT,
path=formatted_url,
body=json.dumps(data),
headers=headers,
config=config)
@required(source_app_id=(str), ro_group_id=(str), publicly_accessible=(bool))
def update_publicly_accessible(self, source_app_id, ro_group_id, publicly_accessible, config=None):
"""
Enable or disable a public network
:param source_app_id:
The specified source isntance id
:type source_app_id: str
:param ro_group_id:
The specified readonly group id
:type ro_group_id: str
:param publicly_accessible:
ture / false
:type publicly_accessible: bool
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
data = {"publiclyAccessible": publicly_accessible}
path = b'/rds/{sourceAppId}/rogroup/{roGroupId}/updatePubliclyAccessible'
formatted_url = path.decode().format(sourceAppId=source_app_id, roGroupId=ro_group_id).encode()
headers = {b'Content-Type': b'application/json'}
self._send_request(http_method=http_methods.PUT,
path=formatted_url,
body=json.dumps(data),
headers=headers,
config=config)
@required(source_app_id=(str), ro_group_id=(str))
def update_endpoint(self, source_app_id, ro_group_id, endpoint, ro_group_name=None,
least_app_amount=None, delay_threshold=None, config=None):
"""
update endpoint information
:param source_app_id:
The specified source isntance id
:type source_app_id: str
:param ro_group_id:
The specified read-only group id
:type ro_group_id: str
:param endpoint:
The specified endpoint object
:type endpoint: baidubce.services.rds.request_param.Endpoint
:param ro_group_name:
The update readonly group name
:type ro_group_name: str or None
:param least_app_amount:
Change the minimum number of reserved instances in a group
update ranging from 0 to 5. Default is 1
:type least_app_amount: int or None
:param delay_threshold:
Enable or disable intra-group balance recovery
:type delay_threshold: int or None
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
data = {"endpoint": endpoint.to_json()}
if ro_group_name is not None:
data["roGroupName"] = ro_group_name
if least_app_amount is not None:
data["leastAppAmount"] = int(least_app_amount)
if delay_threshold is not None:
data["delayThreshold"] = int(delay_threshold)
path = b'/rds/{sourceAppId}/rogroup/{roGroupId}/updateEndpoint'
formatted_url = path.decode().format(sourceAppId=source_app_id, roGroupId=ro_group_id).encode()
headers = {b'Content-Type': b'application/json'}
self._send_request(http_method=http_methods.PUT,
path=formatted_url,
headers=headers,
body=json.dumps(data),
config=config)
@required(source_app_id=(str), ro_group_id=(str), read_replica_list=(list))
def level_readonly_group(self, source_app_id, ro_group_id, read_replica_list, config=None):
"""
level readonly group
:param source_app_id:
The specified source instance id
:type source_app_id: str
:param ro_group_id:
The level read-only group id
:type ro_group_id: str
:param read_replica_list:
The level read-only group read-only instance list
:type read_replica_list: list
:param config: config
:type config: baidubce.BceClientConfiguration
:return:
"""
data = {"readReplicaList": read_replica_list}
path = b'/rds/{sourceAppId}/rogroup/{roGroupId}/leave'
formatted_url = path.decode().format(sourceAppId=source_app_id, roGroupId=ro_group_id).encode()
headers = {b'Content-Type': b'application/json'}
self._send_request(http_method=http_methods.PUT,
path=formatted_url,
headers=headers,
body=json.dumps(data),
config=config)
@required(source_app_id=(str), ro_group_id=(str))
def delete_readonly_group(self, source_app_id, ro_group_id, config=None):
"""
delete readonly group
:param source_app_id:
The specified source instance id
:type source_app_id: str
:param ro_group_id:
The specified read-only group id
:type ro_group_id: str
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
path = b'/rds/{sourceAppId}/rogroup/{roGroupId}'
formatted_url = path.decode().format(sourceAppId=source_app_id, roGroupId=ro_group_id).encode()
self._send_request(http_method=http_methods.DELETE,
path=formatted_url,
config=config)
def generate_client_token_by_uuid():
"""
The default method to generate the random string for client_token
if the optional parameter client_token is not specified by the user.
:return:
:rtype string
"""
return str(uuid.uuid4())
generate_client_token = generate_client_token_by_uuid