예제 #1
0
 def __init__(self, publicIp):
     Aliyunsdk.__init__(self)
     self.publicIp = publicIp
     self.resultFormat = resultFormat
     self.request = DescribeInstancesRequest()
     self.request.set_accept_format(self.resultFormat)
     self.request.set_PublicIpAddresses([self.publicIp])
예제 #2
0
파일: ecsidtoip.py 프로젝트: yh777/aliyun
 def __init__(self, ecsid):
     Aliyunsdk.__init__(self)
     self.ecsid = ecsid
     self.resultFormat = resultFormat
     self.request = DescribeInstancesRequest()
     self.request.set_accept_format(self.resultFormat)
     self.request.set_InstanceIds([self.ecsid])
예제 #3
0
class EcsIpToId(Aliyunsdk):
    """
     为构造函数提供ECS IP,
     执行run方法得到ECS 内网IP,ID,名称及区域
    """
    def __init__(self, publicIp):
        Aliyunsdk.__init__(self)
        self.publicIp = publicIp
        self.resultFormat = resultFormat
        self.request = DescribeInstancesRequest()
        self.request.set_accept_format(self.resultFormat)
        self.request.set_PublicIpAddresses([self.publicIp])

    def handling(self):
        try:
            self.ecsid = self.result['Instances']['Instance'][0]['InstanceId']
            self.innerIp = self.result['Instances']['Instance'][0][
                'InnerIpAddress']['IpAddress'][0]
            self.instanceName = self.result['Instances']['Instance'][0][
                'InstanceName']
            self.regionId = self.result['Instances']['Instance'][0]['RegionId']
            Aliyunsdk.handling(self)
        except IndexError:
            print('IP:  %s is not exist' % self.publicIp)
            os._exit(17)
    def _check_instances_status(self, instance_ids):
        """
        每3秒中检查一次实例的状态,超时时间设为3分钟.
        :param instance_ids 需要检查的实例ID
        :return:
        """
        start = time.time()
        while True:
            request = DescribeInstancesRequest()
            request.set_InstanceIds(json.dumps(instance_ids))
            body = self.client.do_action_with_exception(request)
            data = json.loads(body)
            for instance in data['Instances']['Instance']:
                if RUNNING_STATUS in instance['Status']:
                    instance_ids.remove(instance['InstanceId'])
                    print('Instance boot successfully: {}'.format(
                        instance['InstanceId']))

            if not instance_ids:
                print('Instances all boot successfully')
                break

            if time.time() - start > CHECK_TIMEOUT:
                print('Instances boot failed within {timeout}s: {ids}'.format(
                    timeout=CHECK_TIMEOUT, ids=', '.join(instance_ids)))
                break

            time.sleep(CHECK_INTERVAL)
예제 #5
0
def update_ecs_status():
    resp = {}
    host_list = Host.objects.all()
    request = DescribeInstancesRequest()

    # Get all host from Host model
    yjh_clt = client.AcsClient(yjh_credentials.AK, yjh_credentials.SK,
                               'cn-shenzhen')
    tbus_clt = client.AcsClient(tbus_credentials.AK, tbus_credentials.SK,
                                'cn-shenzhen')
    for host in host_list:
        if host.org.code == 'YJH':
            clt = yjh_clt
        elif host.org.code == 'TBUS':
            clt = tbus_clt
        else:
            # skip BIZ org
            continue
        request.set_InstanceName(host.hostname)
        response = _send_request(request, clt)
        if response is not None:
            try:
                instance_detail = response.get('Instances').get('Instance')[0]
                status = instance_detail.get('Status')
                expire_time = instance_detail.get('ExpiredTime')
                resp[host.hostname] = [status, expire_time]
                host.status = status.lower()
                host.expiration_date = parser.parse(expire_time)
                host.save()
            except IndexError:
                raise IndexError(
                    'response is empty, please check host and org')
    return resp
예제 #6
0
    def check_instance_status(self, instance_id):
        """
        获取instance_id 和 instance状态
        :return:
        """
        start = time.time()
        host_list = []

        while True:
            request = DescribeInstancesRequest()
            request.set_InstanceIds(json.dumps(instance_id))
            body = self.client.do_action_with_exception(request)
            data = json.loads(body)
            for instance in data['Instances']['Instance']:
                if RUNNING_STATUS in instance['Status']:
                    instance_id.remove(instance['InstanceId'])
                    print('Instance boot successfully: {}'.format(
                        instance['InstanceId']))
                    host_list.append({"host": instance['VpcAttributes']['PrivateIpAddress']['IpAddress'][0],
                                           "password": self.password, "hostname": instance['InstanceName']})

            if not instance_id:
                print('Instances all boot successfully')
                break

            # 大于3分钟退出
            if time.time() - start > CHECK_TIMEOUT:
                print('Instances boot failed within {timeout}s: {ids}'
                      .format(timeout=CHECK_TIMEOUT, ids=', '.join(instance_id)))
                break

            # 每三秒钟检查一次
            time.sleep(CHECK_INTERVAL)
            # 输出主机连接信息
        return host_list
예제 #7
0
 def get_all_vm_list(self):
     request = DescribeInstancesRequest()
     request.set_PageSize(100)
     request.set_PageNumber(1)
     try:
         response = self.client.do_action_with_exception(request)
         print(str(response, encoding='utf-8'))
         response = json.loads(self.client.do_action_with_exception(request), encoding='utf-8')
         # print(response)
         print(response['PageNumber'])
         print(response['TotalCount'])
         print(response['PageSize'])
         page_num=int(response['PageNumber'])
         total_count=int(response['TotalCount'])
         page_size=int(response['PageSize'])
         if total_count <= page_size:
             self.get_vm_list(response['Instances']['Instance'])
         else:
             import math
             for page in range(1,math.floor(total_count/page_size)+1):
                 request.set_PageSize(page_size)
                 request.set_PageNumber(page+1)
                 response = self.client.do_action_with_exception(request)
                 print(str(response, encoding='utf-8'))
                 response = json.loads(self.client.do_action_with_exception(request), encoding='utf-8')
                 self.get_vm_list(response['Instances']['Instance'])
         return response
     except ServerException as e:
         print(e)
     except ClientException as e:
         print(e)
예제 #8
0
 def get_ip(self, instance_list):
     request = DescribeInstancesRequest()
     request.set_accept_format('json')
     ip_list = []
     if len(instance_list) <= 10:
         for i in range(len(instance_list)):
             request.set_InstanceIds([instance_list[i]])
             response = self.client.do_action_with_exception(request)
             response = json.loads(response)
             ip_list.append(
                 response["Instances"]["Instance"][0]["VpcAttributes"]
                 ["PrivateIpAddress"]['IpAddress'][0])
     else:
         iteration = len(instance_list) // 10
         for i in range(iteration):
             for j in range(10):
                 request.set_InstanceIds([instance_list[i * 10 + j]])
                 response = self.client.do_action_with_exception(request)
                 response = json.loads(response)
                 ip_list.append(
                     response["Instances"]["Instance"][0]["VpcAttributes"]
                     ["PrivateIpAddress"]['IpAddress'][0])
         if len(instance_list) - iteration * 10 != 0:
             for j in range(len(instance_list) - iteration * 10):
                 request.set_InstanceIds(
                     [instance_list[iteration * 10 + j]])
                 response = self.client.do_action_with_exception(request)
                 response = json.loads(response)
                 ip_list.append(
                     response["Instances"]["Instance"][0]["VpcAttributes"]
                     ["PrivateIpAddress"]['IpAddress'][0])
     return ip_list
예제 #9
0
파일: ecsidtoip.py 프로젝트: yh777/aliyun
class EcsIdToIp(Aliyunsdk):
    """
     为构造函数提供ECS ID,
     执行run方法得到ECS 内网IP,外网IP,名称及区域
    """
    def __init__(self, ecsid):
        Aliyunsdk.__init__(self)
        self.ecsid = ecsid
        self.resultFormat = resultFormat
        self.request = DescribeInstancesRequest()
        self.request.set_accept_format(self.resultFormat)
        self.request.set_InstanceIds([self.ecsid])

    def handling(self):
        try:
            self.publicIp = self.result['Instances']['Instance'][0][
                'PublicIpAddress']['IpAddress'][0]  #外网IP
            self.innerIp = self.result['Instances']['Instance'][0][
                'InnerIpAddress']['IpAddress'][0]  #内网IP
            self.instanceName = self.result['Instances']['Instance'][0][
                'InstanceName']  #名称
            self.regionId = self.result['Instances']['Instance'][0][
                'RegionId']  #区域
            Aliyunsdk.handling(self)
        except IndexError:
            print('ID: %s is not exist' % self.ecsid)
            os._exit(17)
예제 #10
0
    def describe_instances(self, instance_ids=None):
        """
        描述实例
        :param instance_ids: 实例ID列表
        :return: 实例信息列表
        """
        instances = []
        page_size = 10
        page_number = 1
        total_count = None

        request = DescribeInstancesRequest()
        request.set_InstanceIds(json.dumps(instance_ids or self.instance_ids))
        request.set_PageNumber(page_number)
        request.set_PageSize(page_size)

        while total_count is None or page_number * page_size < total_count:
            body = self.client.do_action_with_exception(request)
            data = json.loads(body)
            instances.extend(data['Instances']['Instance'])
            total_count = data['TotalCount']
            page_number += 1
            request.set_PageNumber(page_number)

        return instances
예제 #11
0
 def list_instances(self, **params):
     ecs_instances = []
     request = DescribeInstancesRequest()
     request._params = params
     response = self._send_request(request)
     if response :
         ecs_instances.extend(response.get("Instances", []).get("Instance", []))
     return ecs_instances
예제 #12
0
def describe(instance_id_list):
    request = DescribeInstancesRequest()
    request.set_accept_format("json")

    response = client.do_action_with_exception(request)
    res = json.loads(response)
    instance = res["Instances"]["Instance"]
    return instance
예제 #13
0
 def refresh(self):
     request = DescribeInstancesRequest()
     request.set_InstanceIds(json.dumps([self.instance_id]))
     items = _get_response(self._client, request, {}, 'Instances.Instance')
     if not items:
         raise ClientException(errors.ERROR_INVALID_SERVER_RESPONSE,
                               "Failed to find instance data from DescribeInstances response. "
                               "InstanceId = {0}".format(self.instance_id))
     self._assign_attributes(items[0])
예제 #14
0
def get_status(conn, instance_id):
    request = DescribeInstancesRequest()
    request.set_InstanceIds(json.dumps([instance_id]))
    response = _send_request(conn, request)
    instance_status = None
    if response is not None:
        instance_list = response.get('Instances').get('Instance')
        for item in instance_list:
            instance_status = item.get('Status')
    return instance_status
 def __init__(self):
     """初始化构造函数"""
     self.client = AcsClient('<your_access_key>', '<your_access_secret>',
                             'cn-beijing')
     self.req = DescribeInstancesRequest()
     self.PageSize = 100
     # 指定要写入的配置文件名称
     self.file = "/usr/local/prometheus/targets/nodes/ecs_node.yaml"
     # 指定要备份的目录位置
     self.bak = "/usr/local/prometheus/targets/nodes/"
 def status_verify(self, instance):
     request = DescribeInstancesRequest()
     request.set_InstanceIds(json.dumps([instance.instance_id]))
     response = self.client.do_action_with_exception(request)
     obj = json.loads(response.decode('utf-8'))['Instances']['Instance'][0]
     for key, value in iteritems(obj):
         attr_name = self._convert_camel_to_snake(key)
         self.assertTrue(hasattr(instance, attr_name),
                         "instance has no " + attr_name)
         self.assertEqual(obj[key], getattr(instance, attr_name))
예제 #17
0
 def _get_instance_status_by_id(self, instance_id):
     request = DescribeInstancesRequest()
     request.set_InstanceIds(json.dumps([instance_id]))
     response = self._send_request(request)
     instance_detail = None
     if response is not None:
         instance_list = response.get('Instances').get('Instance')
         for item in instance_list:
             return item.get('Status')
     else:
         return None
예제 #18
0
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') == "Starting":
                running_count += 1
        return running_count
예제 #19
0
파일: aliyun_api.py 프로젝트: kimkcn/cannon
    def get_ecsinstance_info(self, format, page, limit, instanceid):
        from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
        request = DescribeInstancesRequest()

        request.set_accept_format(format)
        request.set_InstanceIds([instanceid])
        request.set_PageNumber(page)
        request.set_PageSize(limit)
        try:
            response = self.client.do_action_with_exception(request)
        except:
            return False
        return response
예제 #20
0
def describe_instance_detail(instance_id):
    """
    describe instance detail
    :param instance_id: instance id of the ecs instance, like 'i-***'.
    :return:
    """
    request = DescribeInstancesRequest()
    request.set_InstanceIds(json.dumps([instance_id]))
    response = _send_request(request)
    if response is not None:
        instance_list = response.get('Instances').get('Instance')
        if len(instance_list) > 0:
            return instance_list[0]
예제 #21
0
def get_instance_detail_by_id(instance_id, status='Stopped'):
    logging.info("Check instance %s status is %s", instance_id, status)
    request = DescribeInstancesRequest()
    request.set_InstanceIds(json.dumps([instance_id]))
    response = _send_request(request)
    instance_detail = None
    if response is not None:
        instance_list = response.get('Instances').get('Instance')
        for item in instance_list:
            if item.get('Status') == status:
                instance_detail = item
                break
        return instance_detail
예제 #22
0
def get_nodes_list(conn, options):
    result = {}
    request = DescribeInstancesRequest()
    request.set_PageSize(100)
    response = _send_request(conn, request)
    instance_status = None
    if response is not None:
        instance_list = response.get('Instances').get('Instance')
        for item in instance_list:
            instance_id = item.get('InstanceId')
            instance_name = item.get('InstanceName')
            result[instance_id] = (instance_name, None)
    return result
예제 #23
0
def get_ali_ecs_info():
    Page_Number = get_page_numbers()
    start_step = 1
    end_step = Page_Number + 1

    for number in range(start_step, end_step):
        client = AcsClient(accessKeyId, accessSecret, regionId)
        request = DescribeInstancesRequest()
        request.set_accept_format('json')
        PageSize = Page_Size
        request.set_PageNumber(number)
        request.set_PageSize(PageSize)
        response = client.do_action_with_exception(request)
        res = json.loads(str(response, encoding='utf-8'))
        # print(res["Instances"]["Instance"][0].keys())
        instance_id = res["Instances"]["Instance"][0]["InstanceId"]
        # print(instance_id)
        disks_info = get_instance_disk_info(instance_id)
        for instance in res["Instances"]["Instance"]:
            instance['disk_infos'] = disks_info
            data.append(instance)
    # print(len(data))
    # instance_number = len(data)
    # return instance_number
    return data
예제 #24
0
 def describe_instances(self):
     """
     获取实例信息
     :return: 实例信息列表
     """
     offset = 0
     total_count = len(self.instance_ids)
     instances = []
     while offset < total_count:
         ids = self.instance_ids[offset:min(offset +
                                            self.page_size, total_count)]
         request = DescribeInstancesRequest()
         request.set_PageSize(self.page_size)
         request.set_InstanceChargeType(self.instance_charge_type)
         request.set_InstanceIds(ids)
         body = self.client.do_action_with_exception(request)
         data = json.loads(body)
         ins = data['Instances']['Instance']
         ret_instance_ids = [instance['InstanceId'] for instance in ins]
         invalid_instance_ids = set(ids) - set(ret_instance_ids)
         if invalid_instance_ids:
             raise InvalidInstanceId('Fail. Invalid InstanceIds: {}'.format(
                 ', '.join(invalid_instance_ids)))
         instances.extend(ins)
         offset += self.page_size
     return instances
예제 #25
0
 def _get_instance_info(self, region):
     c = client.AcsClient(self._AK, self._AKS, region)
     req = DescribeInstancesRequest()
     req.set_PageSize(100)
     req.set_accept_format('json')
     page_number = 0
     try:
         response = c.do_action(req)
         instances = json.loads(response)
         total = instances['TotalCount']
         page_size = instances['PageSize']
         if total / page_size > total // page_size:
             page_number = total // page_size + 1
         else:
             page_number = total // page_size
     except Exception as e:
         print e
     for p_n in range(1, page_number + 1):
         req.set_PageNumber(p_n)
         response = c.do_action(req)
         instances = json.loads(response)
         for host_info in instances['Instances']['Instance']:
             region_id = host_info['RegionId']
             eip = host_info['EipAddress']['IpAddress']
             pip = host_info['PublicIpAddress']['IpAddress']
             instance_name = host_info['InstanceName']
             instance_id = host_info['InstanceId']
             host_name = host_info['HostName']
             if eip != "":
                 self._instances.append(
                     [region_id, instance_name, eip, instance_id])
             elif len(pip) >= 1:
                 self._instances.append(
                     [region_id, instance_name, pip[0], instance_id])
    def test_no_retry(self):

        client = AcsClient(self.access_key_id, self.access_key_secret, self.region_id,
                           auto_retry=False)
        request = DescribeInstancesRequest()
        request.set_endpoint("somewhere.you.will.never.get")
        with patch.object(client, "_handle_single_request",
                          wraps=client._handle_single_request) as monkey:
            try:
                client.do_action_with_exception(request)
                assert False
            except ClientException as e:
                self.assertEqual(error_code.SDK_HTTP_ERROR, e.get_error_code())
        self.assertEqual(1, monkey.call_count)
예제 #27
0
def get_nodes_list(conn, options):
    logging.debug("start to get nodes list")
    result = {}
    request = DescribeInstancesRequest()
    request.set_PageSize(100)
    response = _send_request(conn, request)
    if response is not None:
        instance_list = response.get('Instances').get('Instance')
        for item in instance_list:
            instance_id = item.get('InstanceId')
            instance_name = item.get('InstanceName')
            result[instance_id] = (instance_name, None)
    logging.debug("get nodes list: %s" % result)
    return result
예제 #28
0
def get_ecs_instances():
    client = AcsClient(
       ECS_ACCESS_KEY_ID,
       ECS_ACCESS_SECRET,
       ECS_REGION_ID
    );

    #ecs实例空字典
    instances = {}
    page_size = 10
    page_number = 1
    total_count = None

    request = DescribeInstancesRequest()
    request.set_PageNumber(page_number)
    request.set_PageSize(page_size)

    #以{privateIP:InstanceName}的形式将实例的名字和私网ip添加到ecs实例字典里
    while total_count is None or page_number * page_size < (total_count + page_size)  :
        body = client.do_action_with_exception(request)
        data = json.loads(body)
        for instance in data['Instances']['Instance']:
            instances.update( {  instance['VpcAttributes']['PrivateIpAddress']['IpAddress'][0] : instance['InstanceName'] })
        total_count = data['TotalCount']
        page_number += 1
        request.set_PageNumber(page_number)
    print("获取阿里云ecs数据....共获取 %s 条数据。" %(len(instances)) )
    return instances
예제 #29
0
파일: alislb.py 프로젝트: evilsword/aliyun
def get_ecs_instance(ip):
    request = DescribeInstancesRequest()
    request.set_accept_format('json')
    request.add_query_param('RegionId','cn-beijing')
    request.add_query_param('PrivateIpAddresses',[str(ip)])
    request.set_PageSize(100)
    try:
        response = client.do_action_with_exception(request)
        info = json.loads(response)['Instances']['Instance']
        if info:
            return [instance_info['InstanceId'] for instance_info in info]
        #print(info)
    except Exception as e:
        print "Get Inner IP Address Faild."
        sys.exit()
예제 #30
0
 def get_ecs(self):
     """
     获取所有区域ECS信息
     :return:
     """
     instances = []
     region_ids = self.DescribeRegions()
     for region_id in region_ids.keys():
         client = AcsClient(self.AccessKeyId, self.AccessKeySecret, region_id, connect_timeout=30)
         request = DescribeInstancesRequest()
         request.set_accept_format('json')
         response = client.do_action_with_exception(request)
         res = json.loads(str(response, encoding='utf-8'))
         instances += res['Instances']['Instance']
     return instances