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 __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])
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)
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
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
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)
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
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)
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
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
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
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])
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))
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
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
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
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]
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
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
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
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
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)
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
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
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()
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