# #!/usr/bin/env python
# #coding=utf-8
#
import  json
import logging
import time
import requests
import  sys
from aliyunsdkcore import client
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.CreateInstanceRequest import CreateInstanceRequest
from aliyunsdkecs.request.v20140526.StartInstanceRequest import StartInstanceRequest
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkecs.request.v20140526.RunInstancesRequest import RunInstancesRequest
from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import DescribeNetworkInterfacesRequest
from aliyunsdkslb.request.v20140515.AddBackendServersRequest import AddBackendServersRequest
from aliyunsdkecs.request.v20140526.RunCommandRequest import RunCommandRequest


logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S')
ak_id = "LTAI4GBWbFvvXoXsSVBe1o9f"
ak_secret = "kRAikWitb4kDxaAyBqNrmLmllMEDO3"
region_id = "cn-hangzhou"
clt = client.AcsClient(ak_id, ak_secret, region_id)
instance_type = "ecs.c6.2xlarge"
vswitch_id = "vsw-bp19lpjwtc6j0p0m9mdc2"
image_id = "m-bp15xqcuacm4zw2h2gi6"
security_group_id = "sg-bp1irhrkr4vfj272hk4y"
amount = int(sys.argv[1])
AccessKey = 'LTAIuPbTPL3LDDKN'
AccessSecret = 'ORcNedKwWuwVtcq4IRFtUDZgS0b1le'
RegionId = 'cn-hangzhou'
disk_size = "200"
instance_name = "ESS-longvideoapi-[1,2]"
zone_id = "cn-hangzhou-h"
disk_category = "cloud_efficiency"
key_pair_name = "stuuudy"
#slb_id = "lb-bp1r9duz4k7z0riz9zs3n"
#longvideoapi
slb_id = "lb-bp1d6hp2ctotgt870miav"

client = AcsClient (AccessKey, AccessSecret, RegionId)


def addBackendServers(slb_id,instance_id):
    request = AddBackendServersRequest()
    request.set_accept_format('json')
    ipaddr = getIpaddr(instance_id)
    request.set_LoadBalancerId(slb_id)

    request.set_BackendServers([{"ServerId": instance_id, "Weight": "100", "Type": "ecs", "ServerIp": ipaddr}])
    response = client.do_action_with_exception(request)
    logging.info(response)

def getIpaddr(instance_id):
  request = DescribeNetworkInterfacesRequest()
  request.set_accept_format('json')
  request.set_InstanceId(instance_id)
  response = clt.do_action_with_exception(request)
  request_content = json.loads(response)
  ipaddr = request_content['NetworkInterfaceSets']['NetworkInterfaceSet'][0]['PrivateIpAddress']
  return  ipaddr

def healthCheck(instance_id):
  ipaddr = getIpaddr(instance_id)
  while True:
      health_url = 'http://%s:8182/longvideoapi/test' %(ipaddr)
      http_code = requests.get(health_url).status_code
      if  http_code == 200:
          break
      else:
          time.sleep(2)
  addBackendServers(slb_id,instance_id)




# 创建ECS实例并启动。
def create_multiple_instances():
    request = build_request()
    request.set_Amount(amount)
    _execute_request(request)


def _execute_request(request):
    response = _send_request(request)
    if response.get('Code') is None:
        instance_ids = response.get('InstanceIdSets').get('InstanceIdSet')
        running_amount = 0
        while running_amount < amount:
            time.sleep(10)
            running_amount = check_instance_running(instance_ids)


    print(" %s is running" %(instance_ids))
    time.sleep(60)
    runCommand(instance_ids)
    for  instance_id  in  instance_ids:
      healthCheck(instance_id)


def check_instance_running(instance_ids):
    request = DescribeInstancesRequest()
    request.set_InstanceIds(json.dumps(instance_ids))
    response = _send_request(request)
    if response.get('Code') is None:
        instances_list = response.get('Instances').get('Instance')
        running_count = 0
        for instance_detail in instances_list:
            if instance_detail.get('Status') == "Running":
                running_count += 1
        return running_count
#购买服务器参数配置
def build_request():
    request = RunInstancesRequest()
    request.set_ImageId(image_id)
    request.set_VSwitchId(vswitch_id)
    request.set_SecurityGroupId(security_group_id)
    request.set_ZoneId(zone_id)
    request.set_InstanceType(instance_type)
    # request.set_UserData(init_data)
    request.set_InstanceName(instance_name)
    request.set_SystemDiskSize(disk_size)
    request.set_SystemDiskCategory(disk_category)
    request.set_KeyPairName(key_pair_name)
    request.set_Tags([
      {
        "Key": "ecs",
        "Value": "longvideoapi.prod"
      }
    ])
    return request

#批量执行shell脚本
def  runCommand(instance_ids):
  request = RunCommandRequest()
  request.set_accept_format('json')

  request.set_Type("RunShellScript")
  request.set_CommandContent("sh /home/sh/start.sh")
  request.set_InstanceIds(instance_ids)

  response = clt.do_action_with_exception(request)
  logging.info(response)
# 发送API请求
def _send_request(request):
    request.set_accept_format('json')
    try:
        response_str = clt.do_action(request)
        logging.info(response_str)
        response_detail = json.loads(response_str)
        return response_detail
    except Exception as e:
        logging.error(e)

if __name__ == '__main__':
    print ("Start Create Instances")
    # 创建ECS实例并启动。
    create_multiple_instances()