浏览代码

feat:重启移动云主机

caoliqin 5 天之前
父节点
当前提交
608a6bbc85

+ 9 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwUserController.java

@@ -756,4 +756,13 @@ public class QwUserController extends BaseController
        }
         return R.ok();
     }
+
+    /**
+     * 重启云主机
+     * @return
+     */
+    @PutMapping("/restartHost")
+    public R restartCloudHost(@RequestParam String serverIp) {
+        return qwUserService.restartCloudHost(serverIp);
+    }
 }

+ 7 - 0
fs-service/pom.xml

@@ -284,6 +284,13 @@
             <version>1.0</version>
         </dependency>
 
+        <!-- 移动云ECS SDK -->
+        <dependency>
+            <groupId>com.ecloud.sdk</groupId>
+            <artifactId>ecloud-sdk-ecs</artifactId>
+            <version>1.1.26</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 29 - 0
fs-service/src/main/java/com/cloud/host/CloudHostConfig.java

@@ -0,0 +1,29 @@
+package com.cloud.host;
+
+import com.ecloud.sdk.config.Config;
+import com.ecloud.sdk.ecs.v1.Client;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class CloudHostConfig {
+    /**
+     * 使用AK&SK初始化账号Client
+     *
+     * @param accessKey
+     * @param secretKey
+     * @param poolId
+     * @return Client
+     */
+    public static Client createClient(String accessKey, String secretKey, String poolId) {
+        Config config = new Config();
+        config.setAccessKey(accessKey);
+        config.setSecretKey(secretKey);
+        config.setPoolId(poolId);
+        // 默认连接超时时间为60秒
+        config.setConnectTimeout(60);
+        // 默认响应超时时间为120秒
+        config.setReadTimeout(120);
+        return new Client(config);
+    }
+
+}

+ 77 - 0
fs-service/src/main/java/com/cloud/host/PoolInfoEnum.java

@@ -0,0 +1,77 @@
+package com.cloud.host;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.stream.Stream;
+
+@Getter
+@AllArgsConstructor
+public enum PoolInfoEnum {
+
+    CENTRAL_NODE("中心节点", "CIDC-CORE-00"),
+    YUNNAN_KUNMING("云南-昆明", "CIDC-RP-04"),
+    HUADONG_SUZHOU("华东-苏州", "CIDC-RP-25"),
+    HUANAN_GUANGZHOU3("华南-广州3", "CIDC-RP-26"),
+    XINAN_CHENGDU("西南-成都", "CIDC-RP-27"),
+    HUAZHONG_ZHENGZHOU1("华中-郑州1", "CIDC-RP-28"),
+    HUABEI_BEIJING3("华北-北京3", "CIDC-RP-29"),
+    HUAZHONG_CHANGSHA2("华中-长沙2", "CIDC-RP-30"),
+    HUADONG_JINAN("华东-济南", "CIDC-RP-31"),
+    XIBEI_XIAN("西北-西安", "CIDC-RP-32"),
+    HUADONG_SHANGHAI1("华东-上海1", "CIDC-RP-33"),
+    XINAN_CHONGQING("西南-重庆", "CIDC-RP-34"),
+    HUADONG_HANGZHOU("华东-杭州", "CIDC-RP-35"),
+    TIANJIN_TIANJIN("天津-天津", "CIDC-RP-36"),
+    JILIN_CHANGCHUN("吉林-长春", "CIDC-RP-37"),
+    HUBEI_XIANGYANG("湖北-襄阳", "CIDC-RP-38"),
+    JIANGXI_NANCHANG("江西-南昌", "CIDC-RP-39"),
+    GANSU_LANZHOU("甘肃-兰州", "CIDC-RP-40"),
+    SHANXI_TAIYUAN("山西-太原", "CIDC-RP-41"),
+    LIAONING_SHENYANG("辽宁-沈阳", "CIDC-RP-42"),
+    YUNNAN_KUNMING2("云南-昆明2", "CIDC-RP-43"),
+    HEBEI_SHIJIAZHUANG("河北-石家庄", "CIDC-RP-44"),
+    FUJIAN_XIAMEN("福建-厦门", "CIDC-RP-45"),
+    GUANGXI_NANNING("广西-南宁", "CIDC-RP-46"),
+    ANHUI_HUAINAN("安徽-淮南", "CIDC-RP-47"),
+    HUABEI_HUHEHAOTE("华北-呼和浩特", "CIDC-RP-48"),
+    XINAN_GUIYANG("西南-贵阳", "CIDC-RP-49"),
+    HAINAN_HAIKOU("海南-海口", "CIDC-RP-53"),
+    XINJIANG_CHANGJI("新疆-昌吉", "CIDC-RP-54"),
+    HEILONGJIANG_HAERBIN("黑龙江-哈尔滨", "CIDC-RP-55"),
+    NINGXIA_ZHONGWEI("宁夏-中卫", "CIDC-RP-60"),
+    QINGHAI_HAIDONG("青海-海东", "CIDC-RP-61"),
+    XIZANG_LASA("西藏-拉萨", "CIDC-RP-62"),
+    GUANGXI_NANNING3("广西-南宁3", "CIDC-RP-65");
+
+    private String poolName;
+    private String poolId;
+
+    /**
+     * 通过poolId精准获取poolName
+     *
+     * @param poolId 池ID
+     * @return poolName,如果未找到返回null
+     */
+    public static String getPoolNameByPoolId(String poolId) {
+        return Stream.of(values())
+                .filter(pool -> pool.getPoolId().equals(poolId))
+                .map(PoolInfoEnum::getPoolName)
+                .findFirst()
+                .orElse(null);
+    }
+
+    /**
+     * 通过城市名称匹配获取poolId
+     *
+     * @param cityName 城市名称
+     * @return poolId,如果未找到返回null
+     */
+    public static String getPoolIdByCityName(String cityName) {
+        return Stream.of(values())
+                .filter(pool -> pool.getPoolName().contains(cityName))
+                .map(PoolInfoEnum::getPoolId)
+                .findFirst()
+                .orElse(null);
+    }
+}

+ 2 - 0
fs-service/src/main/java/com/fs/qw/result/QwFsServerBindResult.java

@@ -7,6 +7,8 @@ public class QwFsServerBindResult {
     public String msg;
     public int code;
     public Data data;
+    private String serverId;
+    private String address;
 
     public static class Data {
         public String ipAddress;

+ 7 - 0
fs-service/src/main/java/com/fs/qw/service/IQwUserService.java

@@ -164,4 +164,11 @@ public interface IQwUserService
     R delQwIpad(QwLoginHookParam loginParam);
 
     List<QwWorkTask> selectQwWorkTaskList(SelectQwWorkTaskListParam param);
+
+    /**
+     * 重启云主机
+     * @param IP 服务器ip
+     * @return
+     */
+    R restartCloudHost(String IP);
 }

+ 49 - 1
fs-service/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java

@@ -3,6 +3,12 @@ package com.fs.qw.service.impl;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.http.HttpRequest;
 import com.alibaba.fastjson.JSON;
+import com.cloud.host.CloudHostConfig;
+import com.cloud.host.PoolInfoEnum;
+import com.ecloud.sdk.ecs.v1.Client;
+import com.ecloud.sdk.ecs.v1.model.VmRebootPath;
+import com.ecloud.sdk.ecs.v1.model.VmRebootRequest;
+import com.ecloud.sdk.ecs.v1.model.VmRebootResponse;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.company.domain.CompanyUser;
@@ -34,7 +40,9 @@ import com.fs.qwApi.service.QwApiService;
 import com.fs.voice.utils.StringUtil;
 import com.fs.wxwork.dto.*;
 import com.fs.wxwork.service.WxWorkService;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
+import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.EnableAsync;
@@ -62,7 +70,7 @@ import java.util.stream.Collectors;
 @EnableAsync
 public class QwUserServiceImpl implements IQwUserService
 {
-    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(QwUserServiceImpl.class);
+    private static final Logger logger = LoggerFactory.getLogger(QwUserServiceImpl.class);
     @Autowired
     QwApiService qwApiService;
     @Autowired
@@ -1305,6 +1313,46 @@ public class QwUserServiceImpl implements IQwUserService
 
         return R.ok(status.toString());
     }
+
+    @Override
+    public R restartCloudHost(String IP) {
+        String serverId = "";
+//        String poolId = "";
+        try {
+            String bodyData = HttpRequest.get("http://watch.ylrzcloud.com/prod-api/server/getServerId?ipAddress="+IP)
+                    .execute().body();
+            QwFsServerBindResult qwFsServerBindResult = JSON.parseObject(bodyData, QwFsServerBindResult.class);
+            serverId = qwFsServerBindResult.getServerId();
+//            poolId = PoolInfoEnum.getPoolIdByCityName(qwFsServerBindResult.getAddress());
+        } catch (Exception e){
+            e.printStackTrace();
+            logger.error("获取主机信息异常,服务器IP:{}", IP);
+        }
+
+        if(StringUtils.isNotEmpty(serverId) && StringUtils.isNotEmpty("CIDC-RP-34")){
+            // todo 暂时写死,下周一等接口返回后,从接口中取
+            String accessKey = "cba4f39ddfe04f06b4c939dfdf2f8186";
+            String secretKey = "2d6fd124ce6a44a48eb654238f536404";
+            String poolId = "CIDC-RP-34";
+
+            Client client = CloudHostConfig.createClient(accessKey, secretKey, poolId);
+            VmRebootRequest.Builder requestBuilder = VmRebootRequest.builder();
+            VmRebootPath vmRebootPath = VmRebootPath.builder().serverId(serverId).build();
+            requestBuilder.vmRebootPath(vmRebootPath);
+            VmRebootRequest request = requestBuilder.build();
+            VmRebootResponse result = client.vmReboot(request);
+            System.out.println(result);
+
+            if(!VmRebootResponse.StateEnum.OK.equals(result.getState())){
+                return R.error(501,"重启主机异常").put("errMsg", result);
+            }
+
+            return R.ok();
+        } else {
+            return R.error(400,"重启云主机异常,获取serverId或poolId异常");
+        }
+    }
+
     /**
      *  获取文件名
      */

+ 7 - 0
pom.xml

@@ -31,12 +31,19 @@
         <velocity.version>1.7</velocity.version>
         <jwt.version>0.9.1</jwt.version>
         <org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
+        <gson-version>2.10</gson-version>
     </properties>
 
     <!-- 依赖声明 -->
     <dependencyManagement>
         <dependencies>
 
+            <dependency>
+                <groupId>com.google.code.gson</groupId>
+                <artifactId>gson</artifactId>
+                <version>${gson-version}</version>
+            </dependency>
+
             <!-- SpringBoot的依赖配置-->
             <dependency>
                 <groupId>org.springframework.boot</groupId>