package com.muyu.vehicleGateway;

import com.aliyun.tea.TeaException;
import lombok.extern.log4j.Log4j2;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

/**
 * 创建阿里云ECS实例
 * @className Sample
 * @author LiHD
 * @date 2024/9/28 19:02
 */
@Component
@Log4j2
public class CreateInstance implements ApplicationRunner{

    /**
     * <b>description</b> :
     * <p>使用AK&amp;SK初始化账号Client</p>
     * @return Client
     *
     * @throws Exception
     */
    public static com.aliyun.ecs20140526.Client createClient() throws Exception {
        // 工程代码泄露可能会导致 AccessKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考。
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 必填，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId("LTAI5tM4LSerzWQ9wUPXgybq")
                // 必填，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret("hkiPr0QwkKMZauhXucgg1SDriXUW0Q");
        // Endpoint 请参考 https://api.aliyun.com/product/Ecs
        config.endpoint = "ecs.cn-beijing.aliyuncs.com";
        return new com.aliyun.ecs20140526.Client(config);
    }

    /**
     * 本程序的入口点
     * 主要功能是创建阿里云ECS实例
     *
     * @throws Exception 如果执行过程中发生错误则抛出异常
     */
    public static void sample() throws Exception {

        // 创建阿里云ECS客户端
        com.aliyun.ecs20140526.Client client = CreateInstance.createClient();

        // 配置系统盘参数
        com.aliyun.ecs20140526.models.RunInstancesRequest.RunInstancesRequestSystemDisk systemDisk = new com.aliyun.ecs20140526.models.RunInstancesRequest.RunInstancesRequestSystemDisk()
                .setSize("40") // 设置系统盘大小为40GB
                .setCategory("cloud_essd"); // 设置系统盘类型为cloud_essd

        // 创建创建实例请求对象并设置参数
        com.aliyun.ecs20140526.models.RunInstancesRequest runInstancesRequest = new com.aliyun.ecs20140526.models.RunInstancesRequest()
                .setRegionId("cn-beijing") // 设置地域ID
                .setImageId("m-2ze801i45fclmf1qwes5") // 设置镜像ID
                .setInstanceType("ecs.e-c1m1.large") // 设置实例类型
                .setSecurityGroupId("sg-2ze63acc0bas9vjm5gtv") // 设置安全组ID
                .setVSwitchId("vsw-2ze028qk4xpwk3i0ggket") // 设置虚拟交换机ID
                .setInstanceName("server-mqtt") // 设置实例名称
                .setInstanceChargeType("PostPaid") // 设置实例付费类型为后付费按量付费
                .setSystemDisk(systemDisk) // 设置系统盘配置
                .setHostName("root") // 设置主机名
                .setPassword("Lhd.123456") // 设置实例密码
                .setAmount(1) // 设置创建实例的数量
                .setInternetChargeType("PayByTraffic")  // 设置互联网计费类型为按流量计费
                .setInternetMaxBandwidthOut(5);  // 设置最大出带宽为5Mbps

        // 创建运行时选项对象
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();

        // 尝试执行创建实例请求
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.runInstancesWithOptions(runInstancesRequest, runtime);
        } 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);
        }
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("开始执行创建实例方法");
        sample();
        log.info("创建实例方法执行完毕");
    }
}
