footmark/slb/connection.py (643 lines of code) (raw):
# encoding: utf-8
"""
Represents a connection to the SLB service.
"""
import json
from footmark.connection import ACSQueryConnection
from footmark.slb.regioninfo import RegionInfo
from footmark.exception import SLBResponseError
from footmark.slb.slb import BackendServer, LoadBalancerListener
from footmark.slb.load_balancer import LoadBalancer
from footmark.slb.vserver_group import VServerGroup
# from aliyunsdkslb.request.v20140515.AddBackendServersRequest import
class SLBConnection(ACSQueryConnection):
SDKVersion = '2014-05-15'
DefaultRegionId = 'cn-hangzhou'
DefaultRegionName = '杭州'.encode("UTF-8")
ResponseError = SLBResponseError
def __init__(self, acs_access_key_id=None, acs_secret_access_key=None,
region=None, sdk_version=None, security_token=None, ecs_role_name=None, user_agent=None):
"""
Init method to create a new connection to SLB.
"""
if not region:
region = RegionInfo(self, self.DefaultRegionName,
self.DefaultRegionId)
self.region = region
if sdk_version:
self.SDKVersion = sdk_version
self.SLBSDK = 'aliyunsdkslb.request.v' + self.SDKVersion.replace('-', '')
super(SLBConnection, self).__init__(acs_access_key_id,
acs_secret_access_key,
self.region, self.SLBSDK, security_token, user_agent=user_agent,
ecs_role_name=ecs_role_name)
def format_slb_request_kwargs(self, **kwargs):
for key, value in list(kwargs.items()):
# Format Vswitch to VSwitch
if key == 'Action':
if str(value).find("Vserver"):
kwargs[key] = str(value).replace("Vserver", "VServer")
return kwargs
def create_load_balancer(self, **kwargs):
slb_id = self.get_object_new(self.build_request_params(self.format_request_kwargs(**kwargs)), LoadBalancer).load_balancer_id
return self.describe_load_balancer_attribute(**{'load_balancer_id': slb_id})
def describe_load_balancers(self, **kwargs):
"""
Describe Load Balancers
:type load_balancer_id: string
:param load_balancer_id: id of the load balancer
:type load_balancer_name: string
:param load_balancer_name: name of the load balancer
:return: load balance in dictionary format if found else None
"""
resp = self.get_list_new(self.build_request_params(self.format_request_kwargs(**kwargs)), ['LoadBalancers', LoadBalancer])
return resp
def describe_load_balancer_attribute(self, **kwargs):
"""
Describe attributes of Load Balancer
:type load_balancer_id: string
:param load_balancer_id: id of the load balancer
:return: load balance attributes in dictionary format if found else None
"""
return self.get_object_new(self.build_request_params(self.format_request_kwargs(**kwargs)), LoadBalancer)
def modify_load_balancer_internet_spec(self, **kwargs):
"""
Modify internet specifications of existing LoadBalancer, like internet_charge_type or bandwidth
:type load_balancer_id: str
:param load_balancer_id: The unique ID of an Server Load Balancer instance
:type internet_charge_type: str
:param internet_charge_type: Charging mode for the public network instance
:type bandwidth: int
:param bandwidth: Bandwidth peak of the public network instance charged per fixed bandwidth
:return: returns the request_id of request
"""
return self.get_status_new(self.build_request_params(self.format_request_kwargs(**kwargs)))
def set_load_balancer_status(self, **kwargs):
"""
Method added to Set Load Balancer Status
:type load_balancer_id: List
:param load_balancer_id: ID of server load balancer
:type load_balancer_status: String
:param load_balancer_status: Status of an Server Load Balancer instance
Value: inactive | active
:return: return name of the operating interface, which is
specified in the system
"""
return self.get_status_new(self.build_request_params(self.format_request_kwargs(**kwargs)))
def create_vserver_group(self, **kwargs):
"""
create vserver group
:type vserver_group_id: string
:param vserver_group_id: Unique identifier for the virtual server group
:type load_balancer_id: string
:param load_balancer_id: Unique identifier for load balancer
:type backend_servers: list
:param backend_servers:Backend server list
:return: return the vserver group object
"""
group_id = self.get_object_new(self.build_request_params(self.format_slb_request_kwargs(**self.format_request_kwargs(**kwargs))), VServerGroup).vserver_group_id
return self.describe_vserver_group_attribute(**{'vserver_group_id': group_id})
def describe_vserver_groups(self, **kwargs):
"""
describe vserver group
:type vserver_group_id: string
:param vserver_group_id: Unique identifier for the virtual server group
:return: return the vserver group object
"""
groups = []
resp = self.get_list_new(self.build_request_params(self.format_slb_request_kwargs(**self.format_request_kwargs(**kwargs))), ['VServerGroups',VServerGroup])
if len(resp) > 0:
for b in resp:
groups.append(self.describe_vserver_group_attribute(**{'vserver_group_id': b.vserver_group_id}))
return groups
def describe_vserver_group_attribute(self, **kwargs):
"""
describe vserver group
:type vserver_group_id: string
:param vserver_group_id: Unique identifier for the virtual server group
:return: return the vserver group object
"""
return self.get_object_new(self.build_request_params(self.format_slb_request_kwargs(**self.format_request_kwargs(**kwargs))), VServerGroup)
def set_vserver_group_attribute(self, **kwargs):
"""
set vserver group attribute
:type vserver_group_id: string
:param vserver_group_id: Unique identifier for the virtual server group
:type load_balancer_id: string
:param load_balancer_id: Unique identifier for load balancer
:type backend_servers: list
:param backend_servers:Backend server list
:return: return the vserver group object
"""
return self.get_status_new(self.build_request_params(self.format_slb_request_kwargs(**self.format_request_kwargs(**kwargs))))
def add_vserver_group_backend_servers(self, **kwargs):
"""
add vserver group backend servers
:type vserver_group_id: string
:param vserver_group_id: Unique identifier for the virtual server group
:type backend_servers: list
:param backend_servers:Backend server list
:return: return the vserver group object
"""
return self.get_status_new(self.build_request_params(self.format_slb_request_kwargs(**self.format_request_kwargs(**kwargs))))
def remove_vserver_group_backend_servers(self, **kwargs):
"""
remove vserver group backend servers
:type vserver_group_id: string
:param vserver_group_id: Unique identifier for the virtual server group
:type backend_servers: list
:param backend_servers:Backend server list
:return: return the vserver group object
"""
return self.get_status_new(self.build_request_params(self.format_slb_request_kwargs(**self.format_request_kwargs(**kwargs))))
def modify_vserver_group_backend_servers(self, **kwargs):
"""
modify vserver group backend servers
:type vserver_group_id: string
:param vserver_group_id: Unique identifier for the virtual server group
:type old_backend_servers: list
:param old_backend_servers:Old backend server list
:type new_backend_servers: list
:param new_backend_servers:new backend server list
:return: return the vserver group object
"""
return self.get_status_new(self.build_request_params(self.format_slb_request_kwargs(**self.format_request_kwargs(**kwargs))))
def delete_vserver_group(self, **kwargs):
"""
delete vserver group
:type load_balancer_id: string
:param vserver_group_id: Unique identifier for the virtual server group
:return: return bool
"""
return self.get_status_new(self.build_request_params(self.format_slb_request_kwargs(**self.format_request_kwargs(**kwargs))))
def add_listeners(self, load_balancer_id, purge_listener=None, listeners=None):
"""
Add Listeners to existing ServerLoadBalancer
:type load_balancer_id: str
:param load_balancer_id: Id of ServerLoadBalancer
:type purge_listener: bool
:param purge_listener: Whether to remove existing Listener or not
:type listeners: dict
:param listeners: List of ports/protocols for this SLB to listen on
:return: returns RequestId id of request
"""
params = {}
results = []
deleted_listener = []
changed = False
try:
# find out all listeners of the load balancer
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
slb_details = self.get_status('DescribeLoadBalancerAttribute', params)
# if purge_listener is true then delete existing listeners
if purge_listener:
if slb_details:
if len(slb_details['ListenerPortsAndProtocal']['ListenerPortAndProtocal']) > 0:
for slb_listener in slb_details['ListenerPortsAndProtocal']['ListenerPortAndProtocal']:
params = {}
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, slb_listener['ListenerPort'], 'ListenerPort')
response = self.get_status('DeleteLoadBalancerListener', params)
deleted_listener.append(response)
changed = True
# add listeners to load balancer
if listeners:
for listener in listeners:
if listener:
if 'protocol' in listener:
protocol = str(listener['protocol']).lower()
# Add HTTP Listener to Load Balancer
if protocol in ['http']:
listener_result = self.create_load_balancer_http_listener(load_balancer_id, listener)
if listener_result:
results.append({"http_listener_result": listener_result[1]})
# modify changed param according to listener result
if changed is False:
changed = listener_result[0]
# Add HTTPS Listener to Load Balancer
elif protocol in ['https']:
listener_result = self.create_load_balancer_https_listener(load_balancer_id, listener)
if listener_result:
results.append({"https_listener_result": listener_result[1]})
# modify changed param according to listener result
if changed is False:
changed = listener_result[0]
# Add TCP Listener to Load Balancer
elif protocol in ['tcp']:
listener_result = self.create_load_balancer_tcp_listener(load_balancer_id, listener)
if listener_result:
results.append({"tcp_listener_result": listener_result[1]})
# modify changed param according to listener result
if changed is False:
changed = listener_result[0]
# Add UDP Listener to Load Balancer
elif protocol in ['udp']:
listener_result = self.create_load_balancer_udp_listener(load_balancer_id, listener)
if listener_result:
results.append({"udp_listener_result": listener_result[1]})
# modify changed param according to listener result
if changed is False:
changed = listener_result[0]
else:
results.append({"Error Message": "Invalid Listener Protocol " + listener['protocol']})
except Exception as ex:
error_code = ex.error_code
error_msg = ex.message
results.append({"Error Code": error_code, "Error Message": error_msg})
return changed, results
def create_load_balancer_listener(self, load_balancer_id,\
protocol,\
listener_port,\
backend_server_port,\
bandwidth=None,\
sticky_session='',\
health_check='',\
scheduler='',\
sticky_session_type='',\
cookie_timeout=None,\
cookie='',\
health_check_domain='',\
health_check_uri='',\
health_check_connect_port=None,\
healthy_threshold=None,\
unhealthy_threshold=None,\
health_check_timeout=None,\
health_check_interval=None,\
health_check_http_code='',\
vserver_group_id='',\
gzip='',\
server_certificate_id='',\
master_slave_server_group_id='',\
persistence_timeout=None,\
health_check_connect_timeout=None,\
xforwarded_for = 'on',\
ca_certificate_id=''):
"""
Create HTTP Listener; create Listeners based on the HTTP protocol for the Server Load Balancer instance,
including policies and health check configurations based on the HTTP protocol
:type load_balancer_id: string
:param load_balancer_id: load balance id
:type listener_port: int
:param listener_port: Server Load Balancer instance frontend port. Value: 1-65535
:type backend_server_port: int
:param backend_server_port: Server Load Balancer instance backend port. Value: 1-65535
:type bandwidth: int
:param bandwidth: Listener bandwidth. Value: -1 / 1-1000 Mbps
:type sticky_session: string
:param sticky_session: Whether to open the Gzip compression
:type protocol: string
:param protocol: type of listener to create
:type health_check: string
:param health_check: Whether to enable health check
:type health_check: string
:param health_check: Whether to enable health check
:type: scheduler: string
:param: scheduler: Scheduling algorithm. Value: wrr / wlc / rr Default value: wrr
:type: sticky_session_type: string
:param: sticky_session_type: Mode for handling the cookie.
:type: cookie_timeout: int
:param: cookie_timeout: Cookie timeout.
:type: cookie: string
:param: cookie: The cookie configured on the server
:type: health_check_domain: string
:param: health_check_domain: Domain name used for health check.
:type: health_check_uri: string
:param: health_check_uri: URI used for health check
:type: health_check_connect_port: int
:param: health_check_connect_port: Port used for health check.
:type: healthy_threshold: int
:param: healthy_threshold: Threshold determining the result of the health check is success.
:type: unhealthy_threshold: int
:param: unhealthy_threshold: Threshold determining the result of the health check is fail.
:type: health_check_timeout: int
:param: health_check_timeout: Maximum timeout of each health check response.
:type: health_check_http_code: string
:param: health_check_http_code: Regular health check HTTP status code. Multiple codes are segmented by ",".
:type: health_check_interval: int
:param: health_check_interval: Time interval of health checks.
:type: vserver_group_id: string
:param: vserver_group_id: Virtual server group ID.
:type: gzip: string
:param: gzip: whether open Gzip compression
:type: server_certificate_id: string
:param: server_certificate_id: Server certificate ID.
:type: master_slave_server_group_id: string
:param: master_slave_server_group_id: Master standby server group ID
:type: persistence_timeout: string
:param: persistence_timeout: Timeout time for connection persistence.
:type: health_check_connect_timeout: int
:param: health_check_connect_timeout: Health check connection timeout.
:type: xforwarded_for: int
:param: xforwarded_for: Whether open access to the actual IP of visitors through X-Forwarded-For
:type: ca_certificate_id: string
:param: ca_certificate_id: CA certificate ID
:return: returns request status
"""
params = {}
results = []
changed = False
listener_type_dic = dict(http="CreateLoadBalancerHTTPListener",\
https= "CreateLoadBalancerHTTPSListener",\
tcp="CreateLoadBalancerTCPListener",\
udp="CreateLoadBalancerUDPListener")
key = listener_type_dic.get(protocol, '')
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, listener_port, 'ListenerPort')
self.build_list_params(params, backend_server_port, 'BackendServerPort')
if bandwidth:
self.build_list_params(params, bandwidth, 'Bandwidth')
if sticky_session:
self.build_list_params(params, sticky_session, 'StickySession')
if health_check:
self.build_list_params(params, health_check, 'HealthCheck')
if scheduler:
self.build_list_params(params, scheduler, 'Scheduler')
if gzip:
self.build_list_params(params, gzip, 'Gzip')
if server_certificate_id:
self.build_list_params(params, server_certificate_id, 'ServerCertificateId')
if xforwarded_for:
self.build_list_params(params, 'on', 'XForwardedFor')
if sticky_session_type:
self.build_list_params(params, sticky_session_type, 'StickySessionType')
if cookie_timeout:
self.build_list_params(params, cookie_timeout, 'CookieTimeout')
if cookie:
self.build_list_params(params, cookie, 'Cookie')
if health_check_domain:
self.build_list_params(params, health_check_domain, 'HealthCheckDomain')
if health_check_uri:
self.build_list_params(params, health_check_uri, 'HealthCheckURI')
if health_check_connect_port:
self.build_list_params(params, health_check_connect_port, 'HealthCheckConnectPort')
if healthy_threshold:
self.build_list_params(params, healthy_threshold, 'HealthyThreshold')
if unhealthy_threshold:
self.build_list_params(params, unhealthy_threshold, 'UnhealthyThreshold')
if health_check_timeout:
self.build_list_params(params, health_check_timeout, 'HealthCheckTimeout')
if health_check_interval:
self.build_list_params(params, health_check_interval, 'HealthCheckInterval')
if health_check_http_code:
self.build_list_params(params, health_check_http_code, 'HealthCheckHttpCode')
if vserver_group_id:
self.build_list_params(params, vserver_group_id, 'VServerGroupId')
if master_slave_server_group_id:
self.build_list_params(params, master_slave_server_group_id, 'MasterSlaveServerGroupId')
if persistence_timeout:
self.build_list_params(params, persistence_timeout, 'PersistenceTimeout')
if health_check_connect_timeout:
self.build_list_params(params, health_check_connect_timeout, 'HealthCheckConnectTimeout')
if ca_certificate_id:
self.build_list_params(params, ca_certificate_id, 'CACertificateId')
if self.get_status(key, params):
return self.start_load_balancer_listener(load_balancer_id, listener_port)
return False
def set_listener_access_control_status(self, load_balancer_id, listener_port, access_control_status):
"""
set listener access control status
:type load_balancer_id: string
:param load_balancer_id: Load balancer instance id
:type listener_port: int
:param listener_port: Load balancer instance frontend port. Value: 1-65535
:type access_control_status: string
:param load_balancer_id: Whether or not access control is enabled. open_white_list indicates the white list access control function is enabled.
:return: returns bool
"""
params = {}
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, listener_port, 'ListenerPort')
self.build_list_params(params, access_control_status, 'AccessControlStatus')
return self.get_status('SetListenerAccessControlStatus', params)
def set_listener_attribute(self, load_balancer_id,\
listener_port,\
bandwidth,\
protocol,\
sticky_session='',\
health_check='',\
scheduler='',\
sticky_session_type='',\
cookie_timeout=None,\
cookie='',\
health_check_domain='',\
health_check_uri='',\
health_check_connect_port=None,\
healthy_threshold=None,\
unhealthy_threshold=None,\
health_check_timeout=None,\
health_check_interval=None,\
health_check_http_code='',\
vserver_group_id='',\
gzip='',\
server_certificate_id='',\
master_slave_server_group_id='',\
persistence_timeout=None,\
health_check_connect_timeout=None,\
ca_certificate_id='',\
syn_proxy='',\
health_check_type='',\
vserver_group='',\
master_slave_server_group='',
xforwarded_for='on'):
"""
set listener attribute
:type load_balancer_id: string
:param load_balancer_id: load balance id
:type listener_port: int
:param listener_port: Server Load Balancer instance frontend port. Value: 1-65535
:type bandwidth: int
:param bandwidth: Listener bandwidth. Value: -1 / 1-1000 Mbps
:type sticky_session: string
:param sticky_session: Whether to open the Gzip compression
:type protocol: string
:param protocol: type of listener to create
:type health_check: string
:param health_check: Whether to enable health check
:type: scheduler: string
:param: scheduler: Scheduling algorithm. Value: wrr / wlc / rr Default value: wrr
:type: sticky_session_type: string
:param: sticky_session_type: Mode for handling the cookie.
:type: cookie_timeout: int
:param: cookie_timeout: Cookie timeout.
:type: cookie: string
:param: cookie: The cookie configured on the server
:type: health_check_domain: string
:param: health_check_domain: Domain name used for health check.
:type: health_check_uri: string
:param: health_check_uri: URI used for health check
:type: health_check_connect_port: int
:param: health_check_connect_port: Port used for health check.
:type: healthy_threshold: int
:param: healthy_threshold: Threshold determining the result of the health check is success.
:type: unhealthy_threshold: int
:param: unhealthy_threshold: Threshold determining the result of the health check is fail.
:type: health_check_timeout: int
:param: health_check_timeout: Maximum timeout of each health check response.
:type: health_check_http_code: string
:param: health_check_http_code: Regular health check HTTP status code. Multiple codes are segmented by ",".
:type: health_check_interval: int
:param: health_check_interval: Time interval of health checks.
:type: vserver_group_id: string
:param: vserver_group_id: Virtual server group ID.
:type: gzip: string
:param: gzip: whether open Gzip compression
:type: server_certificate_id: string
:param: server_certificate_id: Server certificate ID.
:type: master_slave_server_group_id: string
:param: master_slave_server_group_id: Master standby server group ID
:type: persistence_timeout: string
:param: persistence_timeout: Timeout time for connection persistence.
:type: health_check_connect_timeout: int
:param: health_check_connect_timeout: Health check connection timeout.
:type: xforwarded_for: int
:param: xforwarded_for: Whether open access to the actual IP of visitors through X-Forwarded-For
:type: ca_certificate_id: string
:param: ca_certificate_id: CA certificate ID
:type: syn_proxy: string
:param: syn_proxy: CA certificate ID
:type: health_check_type: string
:param: health_check_type: health check type
:type: vserver_group: string
:param: vserver_group: Whether to use a virtual server group
:type: master_slave_server_group: string
:param: master_slave_server_group: Whether to use the primary and secondary server groups
:return: returns request status
"""
params = {}
listener_type_dic = dict(http="SetLoadBalancerHTTPListenerAttribute",\
https= "SetLoadBalancerHTTPSListenerAttribute",\
tcp="SetLoadBalancerTCPListenerAttribute",\
udp="SetLoadBalancerUDPListenerAttribute")
key = listener_type_dic.get(protocol, '')
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, listener_port, 'ListenerPort')
self.build_list_params(params, bandwidth, 'Bandwidth')
if listener_port:
self.build_list_params(params, listener_port, 'ListenerPort')
if health_check:
self.build_list_params(params, health_check, 'HealthCheck')
if sticky_session:
self.build_list_params(params, sticky_session, 'StickySession')
if server_certificate_id:
self.build_list_params(params, server_certificate_id, 'ServerCertificateId')
if scheduler:
self.build_list_params(params, scheduler, 'Scheduler')
if xforwarded_for:
self.build_list_params(params, 'on', 'XForwardedFor')
if sticky_session_type:
self.build_list_params(params, sticky_session_type, 'StickySessionType')
if cookie_timeout:
self.build_list_params(params, cookie_timeout, 'CookieTimeout')
if cookie:
self.build_list_params(params, cookie, 'Cookie')
if health_check_domain:
self.build_list_params(params, health_check_domain, 'HealthCheckDomain')
if health_check_uri:
self.build_list_params(params, health_check_uri, 'HealthCheckURI')
if health_check_connect_port:
self.build_list_params(params, health_check_connect_port, 'HealthCheckConnectPort')
if healthy_threshold:
self.build_list_params(params, healthy_threshold, 'HealthyThreshold')
if unhealthy_threshold:
self.build_list_params(params, unhealthy_threshold, 'UnhealthyThreshold')
if health_check_timeout:
self.build_list_params(params, health_check_timeout, 'HealthCheckTimeout')
if health_check_interval:
self.build_list_params(params, health_check_interval, 'HealthCheckInterval')
if health_check_http_code:
self.build_list_params(params, health_check_http_code, 'HealthCheckHttpCode')
if vserver_group:
self.build_list_params(params, vserver_group, 'VServerGroup')
if vserver_group_id:
self.build_list_params(params, vserver_group_id, 'VServerGroupId')
if master_slave_server_group_id:
self.build_list_params(params, master_slave_server_group_id, 'MasterSlaveServerGroupId')
if master_slave_server_group:
self.build_list_params(params, master_slave_server_group, 'MasterSlaveServerGroup')
if ca_certificate_id:
self.build_list_params(params, ca_certificate_id, 'CACertificateId')
if syn_proxy:
self.build_list_params(params, syn_proxy, 'SynProxy')
if health_check_type:
self.build_list_params(params, health_check_type, 'HealthCheckType')
if gzip:
self.build_list_params(params, gzip, 'Gzip')
if persistence_timeout:
self.build_list_params(params, persistence_timeout, 'PersistenceTimeout')
if health_check_connect_timeout:
self.build_list_params(params, health_check_connect_timeout, 'HealthCheckConnectTimeout')
return self.get_status(key, params)
def delete_load_balancer_listener(self, load_balancer_id, listener_port):
"""
delete load balance listener
:type load_balancer_id: string
:param load_balancer_id: Load balancer instance id
:type listener_port: string
:param listener_port: Load balancer instance frontend port. Value: 1-65535
:return: returns bool
"""
params = {}
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, listener_port, 'ListenerPort')
return self.get_status('DeleteLoadBalancerListener', params)
def start_load_balancer_listener(self, load_balancer_id, listener_port):
"""
start load balance listener
:type load_balancer_id: string
:param load_balancer_id: Load balancer instance id
:type listener_port: string
:param listener_port: Load balancer instance frontend port. Value: 1-65535
:return: returns bool
"""
params = {}
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, listener_port, 'ListenerPort')
return self.get_status('StartLoadBalancerListener', params)
def stop_load_balancer_listener(self, load_balancer_id, listener_port):
"""
stop load balance listener
:type load_balancer_id: string
:param load_balancer_id: Load balancer instance id
:type listener_port: string
:param listener_port: Load balancer instance frontend port. Value: 1-65535
:return: returns bool
"""
params = {}
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, listener_port, 'ListenerPort')
return self.get_status('StopLoadBalancerListener', params)
def add_listener_white_list_item(self, load_balancer_id, listener_port, source_items):
"""
add load balance listener white list item
:type load_balancer_id: string
:param load_balancer_id: Load balancer instance id
:type listener_port: string
:param listener_port: Load balancer instance frontend port. Value: 1-65535
:type source_items: string
:param source_items: Access control list
:return: returns bool
"""
params = {}
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, listener_port, 'ListenerPort')
self.build_list_params(params, source_items, 'SourceItems')
return self.get_status('AddListenerWhiteListItem', params)
def remove_listener_white_list_item(self, load_balancer_id, listener_port, source_items):
"""
remove load balance listener white list item
:type load_balancer_id: string
:param load_balancer_id: Load balancer instance id
:type listener_port: string
:param listener_port: Load balancer instance frontend port. Value: 1-65535
:type source_items: string
:param source_items: Access control list
:return: returns bool
"""
params = {}
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, listener_port, 'ListenerPort')
self.build_list_params(params, source_items, 'SourceItems')
return self.get_status('RemoveListenerWhiteListItem', params)
def describe_load_balancer_listener_attribute(self, load_balancer_id, listener_port, protocol):
"""
describe load balancer listener attribute
:type load_balancer_id: string
:param load_balancer_id: Load balancer instance id
:type listener_port: string
:param listener_port: Load balancer instance frontend port. Value: 1-65535
:return: obj: object of listener
"""
action = "DescribeLoadBalancer"
if protocol is None or len(str(protocol))<=0:
lb = self.describe_load_balancer_attribute(load_balancer_id)
if lb is None:
return None
for pp in lb.listener_ports_and_protocol.get("listener_port_and_protocol"):
if pp.get("listener_port") == listener_port:
protocol = pp.get("listener_protocol")
break
action += str.upper(protocol) + "ListenerAttribute"
params = {}
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, listener_port, 'ListenerPort')
try:
obj = self.get_object(action, params, LoadBalancerListener)
except Exception as e:
obj = None
return obj
def add_backend_servers(self, load_balancer_id, backend_servers=None):
"""
Add BackendServer to existing LoadBalancer
:type load_balancer_id: str
:param load_balancer_id: ID of server load balancer
:type backend_servers: list
:param backend_servers: list of dictionary containing server Id and weight of backend server instance
:return: return changed status, current_backend_servers and message with descriptive information
"""
params = {}
results = []
current_backend_servers = []
changed = False
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
backend_servers_list = []
for backend_server in backend_servers:
backend_servers_list.append({"ServerId": backend_server['server_id'],
"Weight": str(backend_server['weight'])})
backend_servers_json = json.dumps(backend_servers_list)
self.build_list_params(params, backend_servers_json, 'BackendServers')
return self.get_list('AddBackendServers', params, ["BackendServers", BackendServer])
def purge_add_backend_server(self, load_balancer_id, instance_ids=None, purge_instance_ids=None):
"""
Remove existing Instances or Backend Server and Add new instances or Backend Server to Load Balancer
:type load_balancer_id: str
:param load_balancer_id: Id of ServerLoadBalancer
:type instance_ids:list
:param instance_ids: Id of Instances or Backend Server
:type purge_instance_ids: bool
:param purge_instance_ids: Whether to remove existing Instances or Backend Servers
:return: Returns Id of newly added Load Balancer
"""
params = {}
results = []
instances = []
changed = False
try:
# List all Backend Servers
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
response = self.get_status('DescribeLoadBalancerAttribute', params)
for instance in response['BackendServers']['BackendServer']:
# append id of all Backend Servers to list
instances.append(str(instance['ServerId']))
# Remove instances only when purge_instance_ids is True
if len(instances) > 0 and (purge_instance_ids is True):
# Remove all Backend Servers
response = self.remove_backend_servers(load_balancer_id=load_balancer_id, backend_server_ids=instances)
if 'error' in (''.join(str(response))).lower():
results.append(response[2])
else:
results.append(response[2][0])
changed = True
# Add Backend Server to Load Balancer
if instance_ids:
if len(instance_ids) > 0:
backend_servers = []
for backend_server_id in instance_ids:
backend_servers.append({"server_id": backend_server_id, "weight": 100})
response = self.add_backend_servers(load_balancer_id, backend_servers)
if 'error' in (''.join(str(response))).lower():
results.append({"backend_server_result": response[2]})
else:
results.append({"backend_server_result": response[1][0]})
changed = True
except Exception as ex:
error_code = ex.error_code
error_msg = ex.message
results.append({"Error Code": error_code, "Error Message": error_msg})
return changed, results
def remove_backend_servers(self, load_balancer_id=None, backend_server_ids=None):
"""
:type load_balancer_id: str
:param load_balancer_id: ID of server load balancer
:type backend_server_ids: list
:param backend_server_ids: list of IDs of backend server instance
:return: return changed status, current_backend_servers and message with descriptive information
"""
params = {}
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
backend_servers_json = json.dumps(backend_server_ids)
self.build_list_params(params, backend_servers_json, 'BackendServers')
return self.get_list('RemoveBackendServers', params, ["BackendServers", BackendServer])
def set_backend_servers(self, load_balancer_id=None, backend_servers=None):
"""
Set Backend Server to Load Balancer
:type load_balancer_id: str
:param load_balancer_id: ID of server load balancer
:type backend_servers: list
:param backend_servers: list of dictionary containing server Id and weight of backend server instance
:return: return changed status, current_backend_servers and message with descriptive information
"""
params = {}
results = []
current_backend_servers = []
changed = False
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
backend_servers_list = []
for backend_server in backend_servers:
backend_servers_list.append({"ServerId": backend_server['server_id'],
"Weight": str(backend_server['weight'])})
backend_servers_json = json.dumps(backend_servers_list)
self.build_list_params(params, backend_servers_json, 'BackendServers')
return self.get_list('SetBackendServers', params, ["BackendServers", BackendServer])
def describe_backend_servers_health_status(self, load_balancer_id=None, port=None):
"""
:type load_balancer_id: str
:param load_balancer_id: ID of server load balancer
:type port: list
:param port: list of Ports used by the Server Load Balancer instance frontend for health check
:return: return backend servers with health status and message with descriptive information
"""
params = {}
results = []
backend_servers_health_status = []
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
if port:
self.build_list_params(params, port, 'ListenerPort')
return self.get_list('DescribeHealthStatus', params, ["BackendServers", BackendServer])
def set_load_balancer_name(self, load_balancer_id, load_balancer_name):
"""
Set name or alias to the ServerLoadBalancer
Method added to Set Load Balancer Name
:type load_balancer_id: str
:param load_balancer_id: ID of a Server Load Balancer instance
:type load_balancer_id: str
:param load_balancer_name: Displayed name of an Server Load Balancer instance. When the parameter is not
specified, an instance name is allocated by the system by default.
:return: returns the request_id of request
"""
changed = False
results = []
params = {}
self.build_list_params(params, load_balancer_id, 'LoadBalancerId')
self.build_list_params(params, load_balancer_name, 'LoadBalancerName')
return self.get_status('SetLoadBalancerName', params)
def delete_load_balancer(self, slb_id):
"""
Method added to Delete Load Balancer
:type slb_id: string
:param slb_id: Id of the server load balancer
:return: Return status of Operation
"""
results = []
params = {}
self.build_list_params(params, slb_id, 'LoadBalancerId')
return self.get_status('DeleteLoadBalancer', params)
def add_vservergroup_backend_server(self, vserver_group_id, backend_servers):
"""
Add a back-end server in a virtual server group, add a set of back-end servers to a specific virtual server
group in the SLB,
and return a list of back-end servers in that virtual server group.
:type vserver_group_id: string
:param vserver_group_id: The unique identifier for the virtual server group
:param backend_servers: - List of hash/dictionary of backend servers to add in
- '[{"key":"value", "key":"value"}]', keys allowed:
- server_id (required:true, description: Unique id of Instance to add)
- port (required:true, description: The back-end server using the port, range: 1-65535)
- weight (required:true; default: 100, description: Weight of the backend server, in the range of 1-100 )
:return: VServerGroupId String The unique identifier for the virtual server group
BackendServers List Array format, returns the operation is successful,
the virtual server group all the back-end server list, the list of elements in the structure see
BackendServer
"""
params = {}
changed = False
results = []
backend_serverlist = []
if vserver_group_id:
self.build_list_params(params, vserver_group_id, 'VServerGroupId')
if backend_servers:
for servers in backend_servers:
backend_serverlist.append({'ServerId': servers['server_id'],
'Port': servers['port'],
'Weight': servers['weight']})
self.build_list_params(params, json.dumps(backend_serverlist), 'BackendServers')
try:
results = self.get_status('AddVServerGroupBackendServers', params)
changed = True
except Exception as ex:
error_code = str(ex.error_code)
error_msg = str(ex.message)
results.append("Error Code:" + error_code + " ,Error Message:" + error_msg)
return changed, results
def remove_vserver_group_backend_server(self, vserver_group_id, purge_backend_servers):
"""
Method to Remove Vserver Group Backend server
:type vserver_group_id: string
:param vserver_group_id: Virtual server group Id
:type purge_backend_servers: List of hash/dictionary
:param purge_backend_servers:
- List of hash/dictionary of backend servers to remove
- '[{"key":"value", "key":"value"}]', keys allowed:
- server_id (required:true, description: Unique id of Instance to remove)
- port (required:true, description: The back-end server using the port, range: 1-65535)
:return: it return public parameters with ,VServerGroupId The unique identifier for the virtual server.
and BackendServers Array format, list of back-end servers in the virtual server group.
The structure of the elements in the list is detailed in BackendServer
"""
params = {}
results = []
changed = False
backend_serverlist = []
if vserver_group_id:
self.build_list_params(params, vserver_group_id, 'VServerGroupId')
if purge_backend_servers:
for servers in purge_backend_servers:
backend_serverlist.append({'ServerId': servers['server_id'], 'Port': servers['port']})
self.build_list_params(params, json.dumps(backend_serverlist), 'BackendServers')
try:
results = self.get_status('RemoveVServerGroupBackendServers', params)
changed = True
except Exception as ex:
error_code = str(ex.error_code)
error_msg = str(ex.message)
results.append({"Error Code": error_code, "Error Message": error_msg})
return changed, results
def modify_vserver_group_backend_server(self, vserver_group_id, purge_backend_servers, backend_servers):
'''
Modify VServer Group Backend Server
:type vserver_group_id: string
:param vserver_group_id:Virtual server group Id
:type purge_backend_servers: List of hash/dictionary
:param purge_backend_servers:
- List of hash/dictionary of backend servers to add in
- '[{"key":"value", "key":"value"}]', keys allowed:
- server_id (required:true, description: Unique id of Instance to add)
- port (required:true, description: The back-end server using the port, range: 1-65535)
:type backend_servers: List of hash/dictionary
:param backend_servers:
- List of hash/dictionary of backend servers to add in
- '[{"key":"value", "key":"value"}]', keys allowed:
- server_id (required:true, description: Unique id of Instance to add)
- port (required:true, description: The back-end server using the port, range: 1-65535)
- weight (required:true; default: 100, description: Weight of the backend server, in the range of 1-100 )
:return: Change the virtual back-end servers in the server group, in a particular SLB virtual server
group by adding / deleting the back-end server to replace the current server group, the group returned
to the virtual server back-end server list.
'''
params = {}
results = []
set_results = []
add_results = []
set_server_attribute = []
add_backend_server = []
delete_backend_servers = []
delete_backend_servers_id = []
filter_backend_servers_id = []
final_backend_servers_id = []
changed = False
serverid_param = 'server_id'
try:
self.build_list_params(params, vserver_group_id, 'VServerGroupId')
result_all_backend_servers = self.get_status('DescribeVServerGroupAttribute', params)
all_backend_servers = result_all_backend_servers['BackendServers']['BackendServer']
if all_backend_servers:
for purge_backend_server in purge_backend_servers:
for all_backend_server in all_backend_servers:
if purge_backend_server[serverid_param] in all_backend_server['ServerId']:
delete_backend_servers.append(purge_backend_server)
delete_backend_servers_id.append(purge_backend_server[serverid_param])
break
for backend_server in backend_servers:
flag = False
for all_backend_server in all_backend_servers:
if backend_server[serverid_param] == all_backend_server['ServerId'] \
and backend_server[serverid_param] not in delete_backend_servers_id:
set_server_attribute.append(backend_server)
flag = True
break
if not flag:
add_backend_server.append(backend_server)
else:
add_backend_server.append(backend_servers[0])
if delete_backend_servers:
changed, result = self.remove_vserver_group_backend_server(vserver_group_id, delete_backend_servers)
if set_server_attribute:
changed, set_results = self.set_vservergroup_attribute(vserver_group_id, vserver_group_name=None,
backend_servers=set_server_attribute)
if add_backend_server:
changed, add_results = self.add_vservergroup_backend_server(vserver_group_id, add_backend_server)
changed = True
if set_results:
results = set_results
filter_backend_servers_id = set_results['BackendServers']['BackendServer']
if add_results:
results = add_results
filter_backend_servers_id += add_results['BackendServers']['BackendServer']
for backend_server in backend_servers:
flag = False
for filter_backend_servers in filter_backend_servers_id:
if filter_backend_servers["ServerId"] == backend_server[serverid_param] and\
filter_backend_servers["Port"] == backend_server["port"] and not flag:
flag = True
final_backend_servers_id.append(filter_backend_servers)
if final_backend_servers_id:
results['BackendServers']['BackendServer'] = final_backend_servers_id
if 'VServerGroupName' in results:
del results['VServerGroupName']
except Exception as ex:
error_code = str(ex.error_code)
error_msg = str(ex.message)
results.append({"Error Code": error_code, "Error Message": error_msg})
return changed, results
def describe_vservergroup_backendserver(self, vserver_group_id, backend_servers):
"""
describe vserver group backend server
:type vserver_group_id: string
:param vserver_group_id: The unique identifier for the virtual server group
:type backend_servers: List of hash/dictionary
:param backend_servers:
- List of hash/dictionary of backend servers to add in
- '[{"key":"value", "key":"value"}]', keys allowed:
- server_id (required:true, description: Unique id of Instance to add)
- port (required:true, description: The back-end server using the port, range: 1-65535)
- weight (required:true; default: 100, description: Weight of the backend server, in the range of 1-100 )
:return: VServerGroupId String The unique identifier for the virtual server group
BackendServers List Array format, returns the operation is successful,
the virtual server group all the back-end server list, the list of elements in the structure
see BackendServer
"""
changed_flag = True
results = []
try:
changed_vsg, result_vsgs = self.describe_vservergroup_attributes(vserver_group_id=vserver_group_id)
if result_vsgs and changed_vsg:
for backend_server in backend_servers:
final_check =False
for result_vsg in result_vsgs["BackendServers"]["BackendServer"]:
if backend_server["server_id"] == result_vsg["ServerId"] and backend_server["port"] \
== result_vsg["Port"]:
final_check = True
break
if not final_check:
results.append(str(backend_server["server_id"])+" ECS with "
"the port "+str(backend_server["port"])+" not "
"match to perform operation")
changed_flag = False
else:
changed_flag = False
results = result_vsgs
except Exception as ex:
error_code = str(ex.error_code)
error_msg = str(ex.message)
results.append("Error Code:" + error_code + " ,Error Message:" + error_msg)
return changed_flag, results
def describe_vservergroup_backendserver_to_add(self, vserver_group_id, backend_servers):
"""
describe vserver group backend server to add
and return a list of back-end servers in that virtual server group.
:type vserver_group_id: string
:param vserver_group_id: The unique identifier for the virtual server group
:type backend_servers: List of hash/dictionary
:param backend_servers:
- List of hash/dictionary of backend servers to add in
- '[{"key":"value", "key":"value"}]', keys allowed:
- server_id (required:true, description: Unique id of Instance to add)
- port (required:true, description: The back-end server using the port, range: 1-65535)
- weight (required:true; default: 100, description: Weight of the backend server, in the range of 1-100 )
:return: VServerGroupId String The unique identifier for the virtual server group
BackendServers List Array format, returns the operation is successful,
the virtual server group all the back-end server list, the list of elements in the structure
see BackendServer
"""
changed_flag = True
results = []
try:
changed_vsg, result_vsgs = self.describe_vservergroup_attributes(vserver_group_id=vserver_group_id)
if result_vsgs and changed_vsg:
for backend_server in backend_servers:
changed_flag = True
for result_vsg in result_vsgs["BackendServers"]["BackendServer"]:
if (str(backend_server["server_id"]) == str(result_vsg["ServerId"])) \
and (str(backend_server["port"]) == str(result_vsg["Port"])):
changed_flag = False
break
if changed_flag is False:
results.append(str(backend_server["server_id"])+" "
"ECS with port "+str(backend_server["port"])+" "
"is already present")
else:
changed_flag =False
results = result_vsgs
except Exception as ex:
error_code = str(ex.error_code)
error_msg = str(ex.message)
results.append("Error Code:" + error_code + " ,Error Message:" + error_msg)
return changed_flag, results
def list_tag_resources(self, **kwargs):
res = {}
tags = self.get_list_new(self.build_request_params(self.format_request_kwargs(**kwargs)), ['TagResources', LoadBalancer])
for tag in tags:
res[tag.tag_key] = tag.tag_value
return res
def tag_resources(self, **kwargs):
tmp = {}
if kwargs['tags']:
for key, value in list(kwargs['tags'].items()):
if key in list(self.list_tag_resources(**kwargs).keys()) and value == self.list_tag_resources(**kwargs)[key]:
continue
tmp[key] = value
if tmp:
kwargs['tags'] = tmp
return self.get_status_new(self.build_request_params(self.format_request_kwargs(**kwargs)))
return None
def untag_resources(self, **kwargs):
tmp = []
if kwargs['tags']:
for key, value in list(kwargs['tags'].items()):
if key not in list(self.list_tag_resources(**kwargs).keys()):
continue
tmp.append(key)
if tmp:
kwargs['tag_keys'] = tmp
return self.get_status_new(self.build_request_params(self.format_request_kwargs(**kwargs)))
return False