439 lines
14 KiB
Python

# 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 HAVIP.
"""
import copy
import json
import logging
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.utils import required
from baidubce import compat
_logger = logging.getLogger(__name__)
class HavipClient(bce_base_client.BceBaseClient):
"""
Route base sdk client
"""
prefix = b'/v1'
def __init__(self, config=None):
bce_base_client.BceBaseClient.__init__(self, config)
def _merge_config(self, config=None):
"""
:param config:
:type config: baidubce.BceClientConfiguration
:return:
"""
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
if headers is None:
headers = {b'Accept': b'*/*', b'Content-Type': b'application/json;charset=utf-8'}
return bce_http_client.send_request(
config, bce_v1_signer.sign, [handler.parse_error, body_parser],
http_method, HavipClient.prefix + path, body, headers, params)
@required(name=(bytes, str),
subnet_id=(bytes, str),
private_ip_address=(bytes, str),
description=(bytes, str))
def create_havip(self, name, subnet_id, private_ip_address,
description="", client_token=None, version=None,
config=None):
"""
Create a havip with the specified options.
:param name:
The name of havip.
:type name: string
:param subnet_id:
The subnet ID to which the havip belongs.
:type subnet_id: string
:param private_ip_address:
The private_ip_address of the havip
:type private_ip_address: string
:param description:
The option param to describe the havip.
:type description: string
:param client_token:
If the clientToken is not specified by the user, a random String
generated by default algorithm will be used.
:type client_token: string
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/havip'
params = {}
if client_token is None:
params[b'clientToken'] = generate_client_token()
else:
params[b'clientToken'] = client_token
body = {
'name': compat.convert_to_string(name),
'subnetId': compat.convert_to_string(subnet_id),
'privateIpAddress': compat.convert_to_string(private_ip_address),
'description': compat.convert_to_string(description)
}
return self._send_request(http_methods.POST, path, body=json.dumps(body), params=params,
config=config)
@required(vpc_id=(bytes, str))
def get_havip_detail_list(self, vpc_id=None, config=None):
"""
Get the detail information of havip list.
:param vpc_id:
the vpc id to which the havip belongs
:type vpc_id: string
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/havip'
params = {}
if vpc_id is not None:
params[b'vpcId'] = vpc_id
return self._send_request(http_methods.GET, path, params=params, config=config)
@required(havip_id=(bytes, str))
def delete_havip(self, havip_id, client_token=None, config=None):
"""
Delete the specific havip.
:param havip_id:
The id of the specified havip.
:type havip_id: string
:param client_token:
If the clientToken is not specified by the user, a random String
generated by default algorithm will be used.
:type client_token: string
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/havip/%s' % compat.convert_to_bytes(havip_id)
params = {}
if client_token is None:
params[b'clientToken'] = generate_client_token()
else:
params[b'clientToken'] = client_token
return self._send_request(http_methods.DELETE, path, params=params, config=config)
@required(name=(bytes, str),
havip_id=(bytes, str),
description=(bytes, str))
def update_havip(self, name, havip_id, description="", version=None,
client_token=None,
config=None):
"""
Update a havip with the specified options.
:param name:
The name of the havip to be updated.
:type route_rule_id: string
:param havip_id:
The id of the specified havip.
:type havip_id: string
:param description:
The option param to describe the route rule.
:type description: string
:param action:
Action.
:type action: string, default: modifyAttribute
:param version:
API version.
:type version: string
:param client_token:
If the clientToken is not specified by the user, a random String
generated by default algorithm will be used.
:type client_token: string
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/havip/%s' % compat.convert_to_bytes(havip_id)
params = {
b'modifyAttribute': None
}
if client_token is None:
params[b'clientToken'] = generate_client_token()
else:
params[b'clientToken'] = client_token
body = {
'name': compat.convert_to_string(name),
'havip_id': compat.convert_to_string(havip_id),
'description': compat.convert_to_string(description)
}
return self._send_request(http_methods.PUT, path, body=json.dumps(body), params=params, config=config)
@required(havip_id=(bytes, str))
def get_havip_detail(self, havip_id, config=None):
"""
Get the detail information of a specific havip.
:param havip_id:
The id of the havip.
:type havip_id: string
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/havip/%s' % compat.convert_to_bytes(havip_id)
params = {}
return self._send_request(http_methods.GET, path, params=params, config=config)
@required(instance_ids=[(bytes, str)],
instance_type=(bytes, str),
havip_id=(bytes, str))
def havip_attach_instance(self, instance_ids, instance_type, havip_id, config=None, client_token=None):
"""
Get the detail information of havip list.
:param instance_ids:
the instance ids of havip binding
:type instance_ids: list
:param instance_type:
Binding instance type
:type instance_type: string
:param havip_id:
The id of the specified havip.
:type havip_id: string
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/havip/%s' % compat.convert_to_bytes(havip_id)
params = {
b'attach': None
}
if client_token is None:
params[b'clientToken'] = generate_client_token()
else:
params[b'clientToken'] = client_token
body = {
'instanceIds': compat.convert_to_string(instance_ids),
'instanceType': compat.convert_to_string(instance_type),
'haVipId': compat.convert_to_string(havip_id),
}
return self._send_request(http_methods.GET, path, params=params, config=config)
@required(instance_ids=[(bytes, str)],
instance_type=(bytes, str),
havip_id=(bytes, str))
def havip_detach_instance(self, instance_ids, instance_type, havip_id, client_token=None, config=None):
"""
havip detach instance.
:param instance_ids:
the instance ids of havip binding
:type instance_ids: list
:param instance_type:
Binding instance type
:type instance_type: string
:param havip_id:
The id of the specified havip.
:type havip_id: string
:param client_token:
If the clientToken is not specified by the user, a random String
generated by default algorithm will be used.
:type client_token: string
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/havip/%s' % compat.convert_to_bytes(havip_id)
params = {b'detach': None}
if client_token is None:
params[b'clientToken'] = generate_client_token()
else:
params[b'clientToken'] = client_token
body = {
'instance_ids': compat.convert_to_string(instance_ids),
'instance_type': compat.convert_to_string(instance_type),
'havip_id': compat.convert_to_string(havip_id)
}
return self._send_request(http_methods.DELETE, path, params=params, config=config)
@required(havip_id=(bytes, str),
public_ip_address=(bytes, str))
def havip_bind_public_ip(self, havip_id, public_ip_address, version=None,
client_token=None, config=None):
"""
havip bind public_ip.
:param havip_id:
The id of the specified havip.
:type havip_id: string
:param public_ip_address:
The option param to describe public_ip.
:type description: string
:param version:
API version.
:type version: string
:param client_token:
If the clientToken is not specified by the user, a random String
generated by default algorithm will be used.
:type client_token: string
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/havip/%s' % compat.convert_to_bytes(havip_id)
params = {
b'bindPublicIp': None
}
if client_token is None:
params[b'clientToken'] = generate_client_token()
else:
params[b'clientToken'] = client_token
body = {
'haVipId': compat.convert_to_string(havip_id),
'publicIpAddress': compat.convert_to_string(public_ip_address),
}
return self._send_request(http_methods.PUT, path, body=json.dumps(body), params=params, config=config)
@required(havip_id=(bytes, str))
def havip_unbind_public_ip(self, havip_id, version=None, client_token=None, config=None):
"""
havip unbind public_ip.
:param havip_id:
The id of the specified havip.
:type havip_id: string
:param version:
API version.
:type version: string
:param client_token:
If the clientToken is not specified by the user, a random String
generated by default algorithm will be used.
:type client_token: string
:param config:
:type config: baidubce.BceClientConfiguration
:return:
:rtype baidubce.bce_response.BceResponse
"""
path = b'/havip/%s' % compat.convert_to_bytes(havip_id)
params = {
b'unbindPublicIp': None
}
if client_token is None:
params[b'clientToken'] = generate_client_token()
else:
params[b'clientToken'] = client_token
body = {
'havip_id': compat.convert_to_string(havip_id),
}
return self._send_request(http_methods.PUT, path, body=json.dumps(body), params=params, 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