#!/u:sr/bin/env python
#coding=utf-8
#edite  panwang
import docker
import sys
import  requests
import json
import queue
import threading
from aliyunsdkcore import client
from aliyunsdkcore.request import CommonRequest
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkslb.request.v20140515.DescribeLoadBalancerAttributeRequest import DescribeLoadBalancerAttributeRequest
from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import DescribeNetworkInterfacesRequest

import time


AccessKey = 'LTAIuPbTPL3LDDKN'
AccessSecret = 'ORcNedKwWuwVtcq4IRFtUDZgS0b1le'
RegionId = 'cn-hangzhou'
clt = client.AcsClient (AccessKey, AccessSecret, RegionId)

#id_2 = "lb-bp1qk9mkvjtundlzz7owm"
#id_3 = "lb-bp1by407qxe4y7bkvye27"
#id_4 = "lb-bp1akia6vlguiwg4znaq8"


# slbIds = ["lb-bp1qk9mkvjtundlzz7owm", "lb-bp1by407qxe4y7bkvye27", "lb-bp1akia6vlguiwg4znaq8"]
slbIds = ["lb-bp1qk9mkvjtundlzz7owm", "lb-bp1by407qxe4y7bkvye27", "lb-bp1akia6vlguiwg4znaq8", "lb-bp1y63rnrb2e64whryghz"]
#健康检查
def  checkHealth(ipadd):
    while  True:
        health_url = 'http://%s:8080/longvideoapi/test' %(ipadd)
        header = {"Content-Type":"application/json"}
        try:
            health_code = requests.get(health_url).status_code
        except  Exception  as  e:
           continue
        if  health_code == 200:
            return  False

#服务更新完之后逐步修改服务器的权重值，直接加载100会出现502。权重值每次增加10，每2s修改一次
def setInstanceWeightProcess(instance_id):
    for  i in range(1,6):
        weight = i*20
        for slbId in slbIds:
            setWeight(slbId, instance_id, weight)
        time.sleep(5)

#设置权重 instance_id :服务器id，weight：权重值
def setWeight(slb_id,instance_id ,weight):

    BackendServers = [{"ServerId": instance_id, "Weight": weight}]

    request = CommonRequest ()
    request.set_accept_format ('json')
    request.set_domain ('slb.aliyuncs.com')
    request.set_version ('2014-05-15')
    request.set_method ('POST')
    request.set_action_name ('SetBackendServers')
    request.add_query_param ('BackendServers', BackendServers)
    request.add_query_param ('LoadBalancerId', slb_id)
    try:
        response = clt.do_action (request)
    except Exception as e:
        raise e
        sys.exit()#容器启动失败立即退出更新
#获取slb下所有服务器信息
def  getInstanceId(slb_id):
    request = DescribeLoadBalancerAttributeRequest()
    request.set_accept_format('json')
    request.set_LoadBalancerId(slb_id)
    try:
        response = clt.do_action_with_exception(request)
    except Exception as e:
        raise e
        sys.exit()#容器启动失败立即退出更新
    return json.loads (response)

#获取实例IP地址
def  getIpadd(instance_id):
    request = DescribeNetworkInterfacesRequest()
    request.set_accept_format('json')
    request.set_InstanceId(instance_id)
    try:
        response = clt.do_action_with_exception(request)
        request_content = json.loads(response)
        IpAddr  = request_content['NetworkInterfaceSets']['NetworkInterfaceSet'][0]['PrivateIpAddress']
    except Exception as e:
        raise e
        sys.exit()#容器启动失败立即退出更新
    return  IpAddr

#更新服务
def  restart(instance_id):
    time.sleep(10)
    global success_count
    apps = 'vlogapi'
    ipadd = getIpadd(instance_id)
    print("服务器信息：" + "%s/%s" %(instance_id, ipadd))
    client = docker.DockerClient(base_url='tcp://%s:2375'  %(ipadd),timeout=60 )

    try:
            #重启
        id = client.containers.get(apps)
        id.restart()
        checkHealth(ipadd)
        print("%s ：权重修改中......" %(ipadd))

        setInstanceWeightProcess(instance_id)
        success_count = success_count + 1
        print("重启进度" + "%s/%s"  %(success_count, total))
    except Exception as e:
        raise e
        sys.exit()#容器启动失败立即退出更新

if __name__ == '__main__':


    #更新完成计数
    success_count = 0
    threads = []
    thread_num = 1
    res = getInstanceId (slbIds[0])
    #slb下服务器总数
    total = len(res["BackendServers"]["BackendServer"])

    if res["BackendServers"]["BackendServer"]:
        for i in range ((len (res["BackendServers"]["BackendServer"]))):
            instance_id = res["BackendServers"]["BackendServer"][i]["ServerId"]

            for slbId in slbIds:
                setWeight(slbId, instance_id, 0)
            restart(instance_id)




