class aliApiTools(): def __init__(self, ali_key, ali_secret): self.ali_key = ali_key self.ali_secret = ali_secret self.client = AcsClient( self.ali_key, self.ali_secret, ) def getAliRedisInstanceid(self, regionids): for regionid in regionids: self.client.set_region_id(regionid) # 设置初始页码 pageNumber = 1 request = DescribeInstancesRequest.DescribeInstancesRequest() request.set_accept_format('json') request.set_PageSize(10) request.set_PageNumber(pageNumber) # 发起API请求并显示返回值 response = self.client.do_action_with_exception(request) response_dict = json.loads(response) # 生成生成器 while response_dict['Instances']['KVStoreInstance']: yield response_dict['Instances']['KVStoreInstance'] pageNumber += 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response)
def test_acs_client(self): with self.assertRaises(ClientException) as ex: AcsClient() self.assertEqual(ex.exception.error_code, "SDK.InvalidCredential") self.assertEqual( ex.exception.message, "Need a ak&secret pair or public_key_id&private_key pair to auth.") client = AcsClient(ak="access_key_id", secret="access_key_secret") self.assertEqual(client.get_access_key(), "access_key_id") self.assertEqual(client.get_access_secret(), "access_key_secret") # region id self.assertEqual(client.get_region_id(), "cn-hangzhou") client.set_region_id('cn-shanghai') self.assertEqual(client.get_region_id(), "cn-shanghai") # auto retry self.assertTrue(client.is_auto_retry()) client.set_auto_retry(False) self.assertFalse(client.is_auto_retry()) # max retry num self.assertEqual(client.get_max_retry_num(), None) client.set_max_retry_num(10) self.assertEqual(client.get_max_retry_num(), 10) # user agent self.assertEqual(client.get_user_agent(), None) client.set_user_agent('new-user-agent') self.assertEqual(client.get_user_agent(), "new-user-agent") # port self.assertEqual(client.get_port(), 80) self.assertIsNone(client.get_location_service())
class ecsBandMonitor(object): def __init__(self, ali_key, ali_secret, region_id): self.ali_key = ali_key self.ali_secret = ali_secret self.client = AcsClient( self.ali_key, self.ali_secret, ) # 创建AcsClient实例 self.client.set_region_id(region_id) def getAliyunEcsInfo(self): # 获取ecs实例信息,利用迭代器,可直接遍历函数得到ecs实例信息 # for a in get_aliyun_ecs(ali_key, ali_secret, region_ids): # for ecs in a: # print(ecs['InstanceId'], ecs['HostName'], ecs['ZoneId'], ecs['PublicIpAddress']['IpAddress'], ecs['InnerIpAddress']['IpAddress'], ecs['StartTime']) # ecs instance各字段解释:https://help.aliyun.com/document_detail/25656.html?spm=a2c4g.11186623.2.2.a0TLxW#InstanceAttributesType # 设置初始页码 pageNumber = 1 # 创建request,并设置参数 request = DescribeInstancesRequest.DescribeInstancesRequest() request.set_accept_format('json') request.set_PageSize(10) request.set_PageNumber(pageNumber) # request.set_ response = self.client.do_action_with_exception(request) # 发起API请求并显示返回值 response_dict = json.loads(response) # 生成生成器 while response_dict['Instances']['Instance']: yield response_dict['Instances']['Instance'] pageNumber += 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) def get_ecs_monitor(self, instances_ids, period): # 实例化request request = QueryMetricLastRequest.QueryMetricLastRequest() # 组装request,接手json,监控流出流量,周期300s request.set_accept_format('json') request.set_Project('acs_ecs_dashboard') request.set_Metric('InternetOutRate') request.set_Period(period) request.set_Dimensions(instances_ids) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) infos = response_dict.get('Datapoints') return infos
class ecsBandMonitor(object): def __init__(self, ali_key, ali_secret, region_id): self.ali_key = ali_key self.ali_secret = ali_secret self.client = AcsClient( self.ali_key, self.ali_secret, ) # 创建AcsClient实例 self.client.set_region_id(region_id) def getAliyunEcsInfo(self): # 获取ecs实例信息,利用迭代器,可直接遍历函数得到ecs实例信息 # for a in get_aliyun_ecs(ali_key, ali_secret, region_ids): # for ecs in a: # print(ecs['InstanceId'], ecs['HostName'], ecs['ZoneId'], ecs['PublicIpAddress']['IpAddress'], ecs['InnerIpAddress']['IpAddress'], ecs['StartTime']) # ecs instance各字段解释:https://help.aliyun.com/document_detail/25656.html?spm=a2c4g.11186623.2.2.a0TLxW#InstanceAttributesType # 设置初始页码 pageNumber = 1 # 创建request,并设置参数 request = DescribeInstanceStatusRequest.DescribeInstanceStatusRequest() request.set_accept_format('json') request.set_PageSize(10) request.set_PageNumber(pageNumber) # request.set_ response = self.client.do_action_with_exception(request) # 发起API请求并显示返回值 response_dict = json.loads(response) # 生成生成器 while response_dict['InstanceStatuses']['InstanceStatus']: yield response_dict['InstanceStatuses']['InstanceStatus'] pageNumber += 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) def checkAliMonitorStatus(self, instance_id): # 实例化request request = NodeStatusRequest.NodeStatusRequest() # 组装request,接受json request.set_accept_format('json') request.set_InstanceId(instance_id) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) return response_dict
class aliRedisMonitor(object): def __init__(self, ali_key, ali_secret, region_id): self.ali_key = ali_key self.ali_secret = ali_secret self.client = AcsClient( self.ali_key, self.ali_secret, ) # 创建AcsClient实例 self.client.set_region_id(region_id) def get_aliredis_instanceid(self, regionids): for regionid in regionids: self.client.set_region_id(regionid) # 设置初始页码 pageNumber = 1 request = DescribeInstancesRequest.DescribeInstancesRequest() request.set_accept_format('json') request.set_PageSize(10) request.set_PageNumber(pageNumber) # 发起API请求并显示返回值 response = self.client.do_action_with_exception(request) response_dict = json.loads(response) # 生成生成器 while response_dict['Instances']['KVStoreInstance']: yield response_dict['Instances']['KVStoreInstance'] pageNumber += 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) def get_ali_monitor_info(self, instances_ids, metric, period): # 实例化request request = QueryMetricLastRequest.QueryMetricLastRequest() # 组装request,接手json,监控流出流量,周期300s request.set_accept_format('json') request.set_Project('acs_kvstore') request.set_Metric(metric) request.set_Period(period) request.set_Dimensions(instances_ids) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) infos = response_dict.get('Datapoints') return infos
def test_resolve_endpoint(self): client = AcsClient("id", "aks", region_id='', port=51352) req = RpcRequest('sts', '2020', 'test') req.endpoint = 'localhost' req.request_network = '' req.product_suffix = '' self.do_request(client, req) try: client._resolve_endpoint(req) except Exception as e: self.assertEqual("No such region ''. Please check your region ID.", e.message) client.set_region_id('cn@hangzhou') try: client._resolve_endpoint(req) except Exception as e: self.assertEqual( 'The parameter region_id not match with ^[a-zA-Z0-9_-]+$', e.message)
class aliRedisMonitor(object): def __init__(self, ali_key, ali_secret, region_id): self.ali_key = ali_key self.ali_secret = ali_secret self.client = AcsClient( self.ali_key, self.ali_secret, ) # 创建AcsClient实例 self.client.set_region_id(region_id) def get_ali_monitor_info(self, instances_ids, metric, period): # 实例化request request = QueryMetricLastRequest.QueryMetricLastRequest() # 组装request,接手json,监控流出流量,周期300s request.set_accept_format('json') request.set_Project('acs_kvstore') request.set_Metric(metric) request.set_Period(period) request.set_Dimensions(instances_ids) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) infos = response_dict.get('Datapoints') return infos
'username': envs['ACR_DOCKER_USERNAME'], 'password': envs['ACR_DOCKER_PASSWORD'] } client = docker.from_env() if not os.path.exists(filename): sys.exit(1) lines = [line.strip() for line in open(filename)] for line in lines: if line.startswith('#'): continue if line == '': continue try: repos = line.split(":") remote_repos = repolize(repos[0]) acr_repos = repolize(repos[1]) acr_repos.append('_'.join(remote_repos)) tag_regexp = repos[2] remote_tags = get_repo_tags(remote_repos, tag_regexp, sync_nums) acr_region = acr_repos[0].split('.')[1] apiClient.set_region_id(acr_region) acr_tags = get_acr_tags(acr_repos[1], acr_repos[2]) sync_tags = get_push_tags(acr_tags, remote_tags) sync_repo(client, '/'.join(remote_repos), '/'.join(acr_repos), sync_tags) except Exception: traceback.print_exc()
class AliSlbTools(object): def __init__(self, ali_key, ali_secret, region_id): self.ali_key = ali_key self.ali_secret = ali_secret self.client = AcsClient( self.ali_key, self.ali_secret, ) self.region_id = region_id self.client.set_region_id(self.region_id) def get_internet_type_slb(self, withbandwidth=False): pageNumber = 1 request = DescribeLoadBalancersRequest.DescribeLoadBalancersRequest() request.set_PageSize(10) request.set_PageNumber(pageNumber) request.set_accept_format('json') request.set_AddressType('internet') request.set_NetworkType('classic') request.set_LoadBalancerStatus('active') if withbandwidth: request.set_InternetChargeType('paybybandwidth') response = self.client.do_action_with_exception(request) response_dict = json.loads(response) # 生成生成器 while response_dict.get('LoadBalancers').get('LoadBalancer'): yield response_dict.get('LoadBalancers').get('LoadBalancer') pageNumber += 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) def get_slb_attr(self, slb_id): request = DescribeLoadBalancerAttributeRequest.DescribeLoadBalancerAttributeRequest( ) request.set_accept_format('json') request.set_LoadBalancerId(slb_id) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) return response_dict def get_slb_listener_ports(self, slb_id): res = self.get_slb_attr(slb_id) ports_and_protos = res.get('ListenerPortsAndProtocol').get( 'ListenerPortAndProtocol') port_infos = [] for port_and_proto in ports_and_protos: proto = port_and_proto.get('ListenerProtocol') port = port_and_proto.get('ListenerPort') info_dic = { 'proto': proto, 'port': port, } port_infos.append(info_dic) return port_infos def get_slb_tcp_attr(self, slb_id, port): request = DescribeLoadBalancerTCPListenerAttributeRequest.DescribeLoadBalancerTCPListenerAttributeRequest( ) request.set_accept_format('json') request.set_LoadBalancerId(slb_id) request.set_ListenerPort(port) try: response = self.client.do_action_with_exception(request) response_dict = json.loads(response) except Exception as err: return False return response_dict def get_slb_http_attr(self, slb_id, port): request = DescribeLoadBalancerHTTPListenerAttributeRequest.DescribeLoadBalancerHTTPListenerAttributeRequest( ) request.set_accept_format('json') request.set_LoadBalancerId(slb_id) request.set_ListenerPort(port) try: response = self.client.do_action_with_exception(request) response_dict = json.loads(response) except Exception as err: return False return response_dict def get_slb_https_attr(self, slb_id, port): request = DescribeLoadBalancerHTTPSListenerAttributeRequest.DescribeLoadBalancerHTTPSListenerAttributeRequest( ) request.set_accept_format('json') request.set_LoadBalancerId(slb_id) request.set_ListenerPort(port) try: response = self.client.do_action_with_exception(request) response_dict = json.loads(response) return response_dict except Exception as err: return False def get_slb_port_attr(self, slb_id, port, proto): if proto == 'tcp': return self.get_slb_tcp_attr(slb_id, port) elif proto == 'http': return self.get_slb_http_attr(slb_id, port) elif proto == 'https': return self.get_slb_https_attr(slb_id, port) else: return False
class aliEcsSnapshot(object): def __init__(self, ali_key, ali_secret, region_id): self.ali_key = ali_key self.ali_secret = ali_secret self.client = AcsClient( self.ali_key, self.ali_secret, ) self.region_id = region_id self.client.set_region_id(self.region_id) def get_instanceid(self, ip): request = DescribeInstancesRequest.DescribeInstancesRequest() request.set_InstanceNetworkType('classic') request.set_InnerIpAddresses(ip) response = self.client.do_action_with_exception(request) response_dic = json.loads(response) instance_id = response_dic.get('Instances').get('Instance')[0].get( 'InstanceId') return instance_id def get_disk_ids(self, instance_id): request = DescribeDisksRequest.DescribeDisksRequest() request.set_InstanceId(instance_id) request.set_DiskType('all') request.set_Status('In_use') request.set_PageSize(20) response = self.client.do_action_with_exception(request) response_dic = json.loads(response) disks = response_dic.get('Disks').get('Disk') disk_ids = [] for disk in disks: disk_ids.append(disk.get('DiskId')) return disk_ids def create_snapshot(self, disk_id, snap_name, tags, description): request = CreateSnapshotRequest.CreateSnapshotRequest() request.set_DiskId(disk_id) request.set_SnapshotName(snap_name) request.set_Tags(tags) request.set_Description(description) response = self.client.do_action_with_exception(request) response_dic = json.loads(response) return response_dic def find_snapshot(self, instance_id, disk_id_lst, page_size): request = DescribeSnapshotLinksRequest.DescribeSnapshotLinksRequest() request.set_InstanceId(instance_id) request.set_DiskIds(disk_id_lst) request.set_PageSize(page_size) pageNumber = 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) # 生成生成器 while response_dict: yield response_dict pageNumber += 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) def delete_snapshot(self, snap_id): self.client.set_region_id(self.region_id) request = DeleteSnapshotRequest.DeleteSnapshotRequest() request.set_SnapshotId(snap_id) response = self.client.do_action_with_exception(request) response = json.loads(response) return response
class AliApiTools(object): def __init__(self, ali_key, ali_secret): self.ali_key = ali_key self.ali_secret = ali_secret self.client = AcsClient( self.ali_key, self.ali_secret, ) def getAliyunEcsInfo(self, region_ids): """ 获取ecs实例信息,利用迭代器,可直接遍历函数得到ecs实例信息 调用方法 for a in get_aliyun_ecs(ali_key, ali_secret, region_ids): for ecs in a: print(ecs['InstanceId'], ecs['HostName'], ecs['ZoneId'], ecs['PublicIpAddress']['IpAddress'], ecs['InnerIpAddress']['IpAddress'], ecs['StartTime']) ecs instance各字段解释:https://help.aliyun.com/document_detail/25656.html?spm=a2c4g.11186623.2.2.a0TLxW#InstanceAttributesType """ # 创建AcsClient实例 for region_id in region_ids: self.client.set_region_id(region_id) # 设置初始页码 pageNumber = 1 # 创建request,并设置参数 request = ecsDescribeInstancesRequest.DescribeInstancesRequest() request.set_accept_format('json') request.set_PageSize(10) request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) # 发起API请求并显示返回值 response_dict = json.loads(response.decode('utf-8')) # 生成生成器 while response_dict['Instances']['Instance']: yield response_dict['Instances']['Instance'] pageNumber += 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response.decode('utf-8')) def getAliyunRedisInfo(self, region_ids): for region_id in region_ids: self.client.set_region_id(region_id) # 设置初始页码 pageNumber = 1 # 创建request,并设置参数 request = redisDescribeInstancesRequest.DescribeInstancesRequest() request.set_accept_format('json') request.set_PageSize(10) request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) # 发起API请求并显示返回值 response_dict = json.loads(response.decode('utf-8')) # 生成生成器 while response_dict['Instances']['KVStoreInstance']: yield response_dict['Instances']['KVStoreInstance'] pageNumber += 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response.decode('utf-8')) def get_ecs_overdue_sum(self, region): # 获取ecs实例即将过期个数(14天) overdue_ecs_sum = 0 for ecs_instances_info in client.getAliyunEcsInfo([region]): for ecs_info in ecs_instances_info: expired_time_str = ecs_info['ExpiredTime'] expired_date = int( time.mktime( time.strptime(expired_time_str, "%Y-%m-%dT%H:%MZ"))) remain_time = expired_date - int(time.time()) if remain_time < 691200: overdue_ecs_sum += 1 return overdue_ecs_sum def get_redis_overdue_sum(self, region): # 获取redis实例即将过期个数(14天) overdue_redis_sum = 0 for redis_instances_info in client.getAliyunRedisInfo([region]): for redis_info in redis_instances_info: expired_time_str = redis_info['EndTime'] expired_date = int( time.mktime( time.strptime(expired_time_str, "%Y-%m-%dT%H:%M:%SZ"))) remain_time = expired_date - int(time.time()) if remain_time < 691200: overdue_redis_sum += 1 return overdue_redis_sum @staticmethod def parse_args(): # 解析参数 parser = argparse.ArgumentParser( description="monitor overdue from aliyun") parser.add_argument( "-t", "--servertype", type=str, choices=["redis", "ecs"], required=True, help="阿里云服务类型", ) parser.add_argument( "-r", "--region", type=str, required=True, help="阿里云服务或ecs所在可用区,例如region", ) args = parser.parse_args() return args
class AliEcsTools(object): def __init__(self, ali_key, ali_secret, region_id): self.ali_key = ali_key self.ali_secret = ali_secret self.client = AcsClient( self.ali_key, self.ali_secret, ) self.region_id = region_id self.client.set_region_id(self.region_id) def get_disks(self, instance_id): request = DescribeDisksRequest.DescribeDisksRequest() request.set_InstanceId(instance_id) request.set_DiskType('all') request.set_Status('In_use') request.set_PageSize(20) response = self.client.do_action_with_exception(request) response_dic = json.loads(response) disks_info = response_dic.get('Disks').get('Disk') disk_lst = [] for disk in disks_info: disk_lst.append({'DiskId': disk.get('DiskId'), 'Device': disk.get('Device'), 'Type': disk.get('Type'), 'Size': disk.get('Size')}) return disk_lst def find_last_snapshot(self, disk_id): request = DescribeSnapshotsRequest.DescribeSnapshotsRequest() request.set_DiskId(disk_id) request.set_Status("accomplished") request.set_PageSize(10) pageNumber = 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) # 生成生成器 while response_dict.get('Snapshots').get('Snapshot'): yield response_dict.get('Snapshots').get('Snapshot') pageNumber += 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) def get_last_snap_id(self, disk_id): ts_cur = 0 last_snap_id = None for snaps in self.find_last_snapshot(disk_id): for snap in snaps: snap_id = snap.get('SnapshotId') ts = int(time.mktime(time.strptime(snap.get('CreationTime'), '%Y-%m-%dT%H:%M:%SZ'))) last_snap_id, ts_cur = (snap_id, ts) if ts > ts_cur else (last_snap_id, ts_cur) return last_snap_id def get_image(self, snap_id): # 拿到快照id,检查快照id状态 request = DescribeImagesRequest.DescribeImagesRequest() request.set_Status('Available') request.set_ImageOwnerAlias('self') request.set_PageNumber(1) request.set_PageSize(10) # 检查快照是否已经生成镜像,如果已经生成,则返回已生成的 request.set_SnapshotId(snap_id) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) images = response_dict.get('Images').get('Image') # 判断是否返回中有image,如果有则返回,如果没有则创建。 if images: return images[0].get('ImageId') # 没有,创建新的镜像,检查镜像状态,创建成功后,返回镜像id。 else: image_id = self.create_image(snap_id) while True: check_result = self.check_image_status(image_id) if not check_result: print('镜像不存在: {image_id}'.format(image_id=image_id)) exit(1) elif check_result != 'Available': print("等待镜像状态为:Available") time.sleep(3) elif check_result == 'Available': break else: print('check_image 检查结果异常:image_id'.format(image_id)) exit(1) return image_id def create_image(self, snap_id): # 拿到快照id,检查快照id状态 request = CreateImageRequest.CreateImageRequest() request.set_accept_format('json') request.set_SnapshotId(snap_id) request.set_ImageName( "auto_expansion_{date_time}".format(date_time=time.strftime('%Y-%m-%d_%H:%M', time.localtime(time.time())))) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) return response_dict.get('ImageId') def add_to_slb(self, svid, instance_ids, weight): request = AddVServerGroupBackendServersRequest.AddVServerGroupBackendServersRequest() request.set_VServerGroupId(svid) backend_servers = [{"ServerId": instance_id, "Port": "80", "Weight": weight, "Type": "ecs"} for instance_id in instance_ids] request.set_BackendServers(backend_servers) response = self.client.do_action_with_exception(request) print(response) def get_instance_info(self, instancd_ids): pageNumber = 1 request = DescribeInstancesRequest.DescribeInstancesRequest() request.set_InstanceIds(instancd_ids) request.set_accept_format('json') request.set_PageSize(10) request.set_PageNumber(pageNumber) # 发起API请求并显示返回值 response = self.client.do_action_with_exception(request) response_dict = json.loads(response) # 生成生成器 while response_dict['Instances']['Instance']: yield response_dict['Instances']['Instance'] pageNumber += 1 request.set_PageNumber(pageNumber) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) def join_security_group(self, instance_id, security_group_id): request = JoinSecurityGroupRequest.JoinSecurityGroupRequest() request.set_accept_format('json') request.set_InstanceId(instance_id) request.set_SecurityGroupId(security_group_id) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) return response_dict def check_image_status(self, image_id): request = DescribeImagesRequest.DescribeImagesRequest() request.set_accept_format('json') request.set_ImageId(image_id) request.set_ImageOwnerAlias('self') request.set_PageNumber(1) request.set_PageSize(10) response = self.client.do_action_with_exception(request) response_dict = json.loads(response) image = response_dict.get('Images').get('Image')[0] if image: status = image.get('Status') return status else: return False