yn/src/main/java/com/muyu/common/config/CreateAnConfig.java

330 lines
17 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.muyu.common.config;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.tea.TeaModel;
import com.aliyun.teaopenapi.models.Config;
import com.muyu.common.contents.CreateContents;
import com.muyu.common.domain.CreateVo;
import com.muyu.common.domain.DeleteServer;
import com.muyu.common.domain.Icreate;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author yn
* @description 实例创建-查询-删除
* @date 2024-04-12 15:10
*/
@Component
public class CreateAnConfig {
/**
* Initialization 初始化公共请求参数
*/
public static Client Initialization(String regionId) throws Exception {
Config config = new Config();
// 您的AccessKey ID
config.accessKeyId = CreateContents.ACCESSKEYIDDATA;
// 您的AccessKey Secret
config.accessKeySecret = CreateContents.ACCESSKEYSECRETDATA;
// 您的可用区ID
config.regionId = regionId;
return new Client(config);
}
static int i = 1;
public static void main(String[] args_) throws Exception {
System.setOut(new java.io.PrintStream(System.out, true, "UTF-8"));
List<String> args = java.util.Arrays.asList(args_);
Client client = ClientConfig.createClient();
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
.setRegionId("cn-shanghai")
.setInstanceName("Test-server")
.setPageSize(10);
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtime);
DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances();
List<DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance> instance = instances.getInstance();
instance.stream().forEach(item->{
System.out.println("实例{" + i + "}的ID:" + item.getInstanceId());
System.out.println("名称:" + item.getInstanceName());
System.out.println("地域ID:" + item.getRegionId());
System.out.println("状态:" + item.getStatus());
System.out.println("类型:" + item.getInstanceType());
System.out.println("CPU核心数:" + item.getCpu());
System.out.println("内存大小:" + item.getMemory() + "MB");
System.out.println("磁盘大小:" + item.getLocalStorageCapacity() + "G");
System.out.println("操作系统:" + item.getOSName());
System.out.println("网络类型:" + item.getInstanceNetworkType());
System.out.println("公网出带宽值:" + item.getInternetMaxBandwidthOut() + "Mbit/s");
System.out.println("公网入带宽值:" + item.getInternetMaxBandwidthIn() + "Mbit/s");
System.out.println("公网IP:" + item.getPublicIpAddress().getIpAddress());
System.out.println("私网IP:" + item.getVpcAttributes().getPrivateIpAddress().ipAddress);
System.out.println("专有网络VPCID:" + item.getVpcAttributes().getVpcId());
System.out.println("安全组ID:" + item.getSecurityGroupIds().getSecurityGroupId());
System.out.println("创建时间:" + item.getCreationTime());
System.out.println("到期时间:" + item.getExpiredTime());
System.out.println("是否可以回收:" + (item.getRecyclable()?"是":"否") + "\n\n");
i++;
});
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
/**
* 查询实例方法
* @throws Exception
*/
public static void findByCreate(CreateVo createVo) throws Exception {
//java.util.List<String> args = java.util.Arrays.asList(args_);
// 地域Id
//String regionId = "cn-shanghai";
String regionId = createVo.getRedionId();
// 要查询的资源类型。取值范围:
// Zone可用区。
// IoOptimizedI/O 优化。
// InstanceType实例规格。
// SystemDisk系统盘。
// DataDisk数据盘。
// Network网络类型。
// ddh专有宿主机。
//String destinationResource = "InstanceType";
String destinationResource = createVo.getDestinationResource();
// 是否为I/O优化实例
// optimizedI/O优化
// none非IO优化
//String ioOptimized = "optimized";
String ioOptimized = createVo.getIoOptimized();
// 实例规格
//说明: 如果您指定了InstanceType则无法指定Cores或者Memory。
//String instanceType = "ecs.u1-c1m1.large";
String instanceType = createVo.getInstanceType();
Client client = CreateAnConfig.Initialization(regionId);
// 查询指定地域下所有可用区的库存供应情况
CreateAnConfig.DescribeAvailableResource(client, regionId, destinationResource, ioOptimized, instanceType);
}
/**
* DescribeAvailableResource 查询指定地域下所有可用区的库存供应情况
*/
public static void DescribeAvailableResource(Client client, String regionId, String destinationResource, String ioOptimized, String instanceType) throws Exception {
System.setOut(new java.io.PrintStream(System.out, true, "UTF-8"));
DescribeAvailableResourceRequest request = new DescribeAvailableResourceRequest()
.setRegionId(regionId)
.setDestinationResource(destinationResource)
.setIoOptimized(ioOptimized)
.setInstanceType(instanceType);
try {
com.aliyun.teaconsole.Client.log("--------------------查询" + regionId + "地域下所有可用区的" + instanceType + "库存供应情况:--------------------");
DescribeAvailableResourceResponse responces = client.describeAvailableResource(request);
com.aliyun.teaconsole.Client.log("--------------------查询结果:" + com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(responces.body.availableZones)) + "--------------------");
} catch (TeaException error) {
com.aliyun.teaconsole.Client.log("--------------------查询失败:" + com.aliyun.teautil.Common.toJSONString(error.code) + "--------------------");
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
com.aliyun.teaconsole.Client.log("--------------------查询失败:" + com.aliyun.teautil.Common.toJSONString(error.code) + "--------------------");
}
}
/**
* 创建实例方法
* @param icreate
* @throws Exception
*/
public static String createAnServer(Icreate icreate) throws Exception {
// java.util.List<String> args = java.util.Arrays.asList(args_);
// 地域Id
//String regionId = "cn-shanghai";
String regionId = icreate.getRehionId();
// 镜像 ID启动实例时选择的镜像资源。
// String imageId = "m-uf6elrscl3c9wk6o762l";
String imageId = icreate.getImageId();
// 实例规格
//String instanceType = "ecs.u1-c1m1.large";
String instanceType = icreate.getInstanceType();
// 新创建实例所属于的安全组 ID。
//String securityGroupId = "sg-uf6bj6vxp8ruhvffdsau";
String securityGroupId = icreate.getSecurityGroupId();
// 虚拟交换机 ID。
//String vSwitchId = "vsw-uf66jtgij0ptqxf1ix6l7 ";
String vSwitchId = icreate.getVSwitchId();
// 公网出带宽最大值,单位为 Mbit/s。取值范围0~100。 默认值0。
//Integer internetMaxBandwidthOut = Integer.parseInt("2");
Integer internetMaxBandwidthOut = Integer.parseInt(icreate.getInternetMaxBandwidthOut());
// 网络计费类型。取值范围:
// PayByBandwidth: 按固定带宽计费。
// PayByTraffic: 按使用流量计费。
// 默认值PayByTraffic。
//String internetChargeType = "PayByTraffic";
String internetChargeType = icreate.getInternetChargeType();
// 系统盘大小
//String size = "20";
String size = icreate.getSize();
// 系统盘的云盘种类
//String category = "cloud_essd";
String category = icreate.getCategory();
// ECS实例的计费方式
// PrePaid包年包月
// PostPaid按量付费
//String instanceChargeType = "PostPaid";
String instanceChargeType = icreate.getInstanceChargeType();
Client client = CreateAnConfig.Initialization(regionId);
// 批量创建实例
String instances = CreateAnConfig.RunInstances(client, regionId, imageId, instanceType, securityGroupId, vSwitchId, internetMaxBandwidthOut, internetChargeType, size, category, instanceChargeType);
return instances;
}
/**
* RunInstances 通过备选实例规格创建ECS实例最佳实践
* 该场景中在调用RunInstances创建ECS实例时判断是否发生库存不足等错误如果发生错误将调用DescribeRecommendInstanceType查询备选实例然后通过备选实例规格重新创建ECS实例。
*/
public static String RunInstances(Client client, String regionId, String imageId, String instanceType, String securityGroupId, String vSwitchId, Integer internetMaxBandwidthOut, String internetChargeType, String size, String category, String instanceChargeType) throws Exception {
System.setOut(new java.io.PrintStream(System.out, true, "UTF-8"));
RunInstancesRequest request1 = new RunInstancesRequest()
.setRegionId(regionId)
.setImageId(imageId)
.setInstanceType(instanceType)
.setSecurityGroupId(securityGroupId)
.setVSwitchId(vSwitchId)
.setInstanceName("Myname")
.setDescription("Myprocure")
.setInternetMaxBandwidthOut(internetMaxBandwidthOut)
.setInternetChargeType(internetChargeType)
.setInstanceChargeType(instanceChargeType)
// 批量创建五台ECS实例如果不设置该参数默认创建一台ECS实例。
// amount = 5,
// 如果缺少库存可以接受的最低创建数量。
// minAmount = 2,
// 打开预检参数功能不会实际创建ECS实例只检查参数正确性、用户权限或者ECS库存等问题。
// 实际情况下设置了DryRun参数后Amount必须为1MinAmount必须为空您可以根据实际需求修改代码。
.setDryRun(false)
.setSystemDisk(new RunInstancesRequest.RunInstancesRequestSystemDisk()
.setSize(size)
.setCategory(category));
RunInstancesResponse responces = client.runInstances(request1);
try {
com.aliyun.teaconsole.Client.log("--------------------批量创建实例开始--------------------");
com.aliyun.teaconsole.Client.log("--------------------创建实例成功实例ID:" + com.aliyun.teautil.Common.toJSONString(responces.body.instanceIdSets.instanceIdSet) + "--------------------");
} catch (TeaException error) {
com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + error+ "--------------------");
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" +error + "--------------------");
}
return com.aliyun.teautil.Common.toJSONString(responces.body.instanceIdSets.instanceIdSet);
}
public static DescribeInstancesResponse DescribeInstances(Client client, String regionId, String instanceIds, String instanceName) throws Exception {
DescribeInstancesRequest req = new DescribeInstancesRequest()
.setRegionId(regionId)
.setInstanceName(instanceName);
if (!com.aliyun.teautil.Common.empty(instanceIds)) {
req.instanceIds = com.aliyun.teautil.Common.toJSONString(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50));
}
DescribeInstancesResponse resp = client.describeInstances(req);
com.aliyun.teaconsole.Client.log("--------------------查询需要删除的实例--------------------");
return resp;
}
public static void ModifyInstanceAttribute(Client client, String instatnceId) throws Exception {
ModifyInstanceAttributeRequest req = new ModifyInstanceAttributeRequest()
.setInstanceId(instatnceId)
.setDeletionProtection(false);
client.modifyInstanceAttribute(req);
com.aliyun.teaconsole.Client.log("--------------------" + instatnceId + "释放保护取消成功--------------------");
}
public static void DeleteInstances(Client client, String regionId, String instanceIds, String force) throws Exception {
DeleteInstancesRequest req = new DeleteInstancesRequest()
.setRegionId(regionId)
.setInstanceId(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50))
.setForce(com.aliyun.teautil.Common.equalString(force, "true"));
DeleteInstancesResponse resp = client.deleteInstances(req);
com.aliyun.teaconsole.Client.log("--------------------实例释放成功--------------------");
com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(com.aliyun.teautil.Common.toMap(resp)));
}
/**
* 批量删除实力
* @param deleteServer
* @throws Exception
*/
public static void DeleServerCreateAn(DeleteServer deleteServer) throws Exception {
// 区域ID
//String regionId = "cn-shanghai";
String regionId = deleteServer.getRegionId();
// 多个实例ID用英文逗号分隔
//String instanceIds = "i-uf6h4s0jtpvobykd7vzc";
String instanceIds = deleteServer.getInstanceIds();
// 实例名称,支持使用通配符*进行模糊搜索
//String instanceName = "MyFirstEcsInstance";
String instanceName = deleteServer.getInstanceName();
// 强制删除有删除保护的机器
//String deleteProtected = "true";
String deleteProtected = deleteServer.getDeleteProtected();
// 强制删除运行中的机器
//String force = "true";
String force = deleteServer.getForce();
Client client = CreateAnConfig.Initialization(regionId);
if (com.aliyun.teautil.Common.equalString(deleteProtected, force)) {
DescribeInstancesResponse describeInstancesResp = CreateAnConfig.DescribeInstances(client, regionId, instanceIds, instanceName);
instanceIds = "";
for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : describeInstancesResp.body.instances.instance) {
instanceIds = "" + instance.instanceId + "," + instanceIds + "";
if (instance.deletionProtection) {
CreateAnConfig.ModifyInstanceAttribute(client, instance.instanceId);
}
}
instanceIds = com.aliyun.darabonbastring.Client.subString(instanceIds, 0, -1);
}
if (com.aliyun.teautil.Common.empty(instanceIds)) {
com.aliyun.teaconsole.Client.log("--------------------无有效实例可删除--------------------");
return ;
}
CreateAnConfig.DeleteInstances(client, regionId, instanceIds, force);
}
}