Browse Source

Merge branch 'feat/basic_k8s_function' of LiuYiYe/DevManage into master

LiuYiYe 4 years ago
parent
commit
3d6bd86f09

+ 11 - 0
pom.xml

@@ -49,6 +49,17 @@
 			<version>3.18.3</version>
 		</dependency>
 
+		<dependency>
+			<groupId>com.fasterxml.jackson.datatype</groupId>
+			<artifactId>jackson-datatype-joda</artifactId>
+			<version>2.13.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>cn.seecoder</groupId>
+			<artifactId>seecoder-devcloud-api</artifactId>
+			<version>0.1.0</version>
+		</dependency>
 
 		<dependency>
 			<groupId>org.projectlombok</groupId>

+ 30 - 0
src/main/java/cn/seecoder/devmanage/controller/DeploymentController.java

@@ -0,0 +1,30 @@
+package cn.seecoder.devmanage.controller;
+
+import cn.seecoder.api.k8s.DeploymentApi;
+import cn.seecoder.api.k8s.model.Deployment;
+import cn.seecoder.api.k8s.model.K8sObjectRequest;
+import cn.seecoder.common.util.SpringUtil;
+import cn.seecoder.devmanage.log.LocalLogger;
+import cn.seecoder.devmanage.model.vo.Response;
+import cn.seecoder.devmanage.service.DeploymentService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/deployment")
+public class DeploymentController {
+    private final DeploymentService deploymentService;
+    private final LocalLogger localLogger;
+
+    @GetMapping
+    public ResponseEntity<Response<List<Deployment>>> getDeployments(@RequestParam String namespace, @RequestParam(required = false) String name) {
+        return ResponseEntity.ok().body(Response.buildSuccess(deploymentService.getDeployments(namespace, name)));
+    }
+}

+ 60 - 3
src/main/java/cn/seecoder/devmanage/controller/HelloController.java

@@ -1,5 +1,13 @@
 package cn.seecoder.devmanage.controller;
 
+import cn.seecoder.api.k8s.DeploymentApi;
+import cn.seecoder.api.k8s.LimitRangeApi;
+import cn.seecoder.api.k8s.PodApi;
+import cn.seecoder.api.k8s.model.Deployment;
+import cn.seecoder.api.k8s.model.K8sObjectRequest;
+import cn.seecoder.api.k8s.model.LimitRange;
+import cn.seecoder.api.k8s.model.Pod;
+import cn.seecoder.common.util.SpringUtil;
 import cn.seecoder.devmanage.model.po.LocalLog;
 import cn.seecoder.devmanage.model.vo.LocalLogVo;
 import cn.seecoder.devmanage.model.vo.Response;
@@ -7,9 +15,10 @@ import cn.seecoder.devmanage.service.HelloService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Profile;
 import org.springframework.http.ResponseEntity;
-import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * For test purpose only.
  * This controller does not go valid in production.
@@ -24,7 +33,7 @@ public class HelloController {
 
     @GetMapping("/hello")
     public ResponseEntity<Response<String>> hello() {
-        return ResponseEntity.accepted().body(Response.buildSuccess("Hello Seecoder"));
+        return ResponseEntity.ok().body(Response.buildSuccess("Hello Seecoder"));
     }
 
     @PutMapping("/log")
@@ -35,7 +44,55 @@ public class HelloController {
                     Response.buildFailure(400, "Error: invalid date format.", null)
             );
         } else {
-            return ResponseEntity.accepted().body(Response.buildSuccess(new LocalLogVo(localLog)));
+            return ResponseEntity.ok().body(Response.buildSuccess(new LocalLogVo(localLog)));
         }
     }
+
+    @GetMapping("/deployment")
+    public ResponseEntity<Response<List<Deployment>>> getDeploymentByCondition(@RequestParam String namespace, @RequestParam(required = false) String name) {
+        DeploymentApi deploymentApi = SpringUtil.getBean(DeploymentApi.class);
+        K8sObjectRequest mysqlRequest = K8sObjectRequest.builder().namespace(namespace).name(name).build();
+        List<Deployment> deployments = deploymentApi.getByCondition(mysqlRequest);
+        return ResponseEntity.ok().body(Response.buildSuccess(deployments));
+    }
+
+    @GetMapping("/limit")
+    public ResponseEntity<Response<List<LimitRange>>> getLimitRangeByCondition(@RequestParam String namespace, @RequestParam(required = false) String name) {
+        LimitRangeApi limitRangeApi = SpringUtil.getBean(LimitRangeApi.class);
+        K8sObjectRequest limitRequest = K8sObjectRequest.builder().namespace(namespace).name(name).build();
+        System.out.println(limitRequest);
+        List<LimitRange> limitRanges = limitRangeApi.getByCondition(limitRequest);
+        return ResponseEntity.ok().body(Response.buildSuccess(limitRanges));
+    }
+
+//    @GetMapping("/limit")
+//    public ResponseEntity<Response<V1LimitRangeList>> getLimitRangeByCondition(@RequestParam String namespace) {
+//        try {
+//            CoreV1Api coreV1Api = SpringUtil.getBean(CoreV1Api.class);
+//            V1LimitRangeList objList = coreV1Api.listNamespacedLimitRange(
+//                    namespace,
+//                    PRETTY_FORMAT,
+//                    null,
+//                    null,
+//                    null,
+//                    new LabelSelector().toJsonString(),
+//                    null,
+//                    null,
+//                    null,
+//                    null);
+//            return ResponseEntity.ok().body(Response.buildSuccess(objList));
+//        } catch (ApiException e) {
+//            e.printStackTrace();
+//            return ResponseEntity.internalServerError()
+//                    .body(Response.buildFailure(500, "Server Api Exception", null));
+//        }
+//    }
+
+    @GetMapping("/pod")
+    public ResponseEntity<Response<List<Pod>>> getPodByCondition(@RequestParam String namespace, @RequestParam(required = false) String name) {
+        PodApi podApi = SpringUtil.getBean(PodApi.class);
+        K8sObjectRequest podRequest = K8sObjectRequest.builder().namespace(namespace).name(name).build();
+        List<Pod> pods = podApi.getByCondition(podRequest);
+        return ResponseEntity.ok().body(Response.buildSuccess(pods));
+    }
 }

+ 50 - 0
src/main/java/cn/seecoder/devmanage/controller/LimitRangeController.java

@@ -0,0 +1,50 @@
+package cn.seecoder.devmanage.controller;
+
+import cn.seecoder.api.k8s.exception.K8sApiException;
+import cn.seecoder.api.k8s.model.LimitRange;
+import cn.seecoder.devmanage.log.LocalLogger;
+import cn.seecoder.devmanage.model.vo.Response;
+import cn.seecoder.devmanage.service.LimitRangeService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static cn.seecoder.api.k8s.exception.K8sApiException.NOT_FOUND;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/limit")
+public class LimitRangeController {
+    private final LimitRangeService limitRangeService;
+    private final LocalLogger localLogger;
+
+    @GetMapping
+    public ResponseEntity<Response<List<LimitRange>>> getLimitRanges(@RequestParam String namespace, @RequestParam(required = false) String name) {
+        return ResponseEntity.ok().body(Response.buildSuccess(limitRangeService.getLimitRanges(namespace, name)));
+    }
+
+    @PutMapping
+    public ResponseEntity<Response<LimitRange>> updateLimitRange(@RequestBody LimitRange limitRange) {
+        try {
+            LimitRange res = limitRangeService.updateLimitRange(limitRange);
+            localLogger.recordSuccess(String.format("Update LimitRange. (namespace: %s, name: %s)",
+                    limitRange.getNamespace(), limitRange.getName()));
+            return ResponseEntity.ok().body(Response.buildSuccess(res));
+        } catch (K8sApiException e) {
+            localLogger.recordFailure(String.format("Update LimitRange failed due to: %s. (namespace: %s, name: %s)",
+                    e.getDescription(), limitRange.getNamespace(), limitRange.getName()));
+            if (e.getCode() == NOT_FOUND) {
+                return ResponseEntity.badRequest().body(Response.buildFailure(400, e.getDescription(), null));
+            } else {
+                // case when e.getCode() == SYSTEM_ERROR
+                return ResponseEntity.internalServerError().body(Response.buildFailure(500, e.getDescription(), null));
+            }
+        } catch (Exception e) {
+            localLogger.recordFailure(String.format("Update LimitRange failed due to: unknown error. (namespace: %s, name: %s)",
+                    limitRange.getNamespace(), limitRange.getName()));
+            return ResponseEntity.internalServerError().body(Response.buildFailure(500, e.getMessage(), null));
+        }
+    }
+}

+ 27 - 0
src/main/java/cn/seecoder/devmanage/controller/PodController.java

@@ -0,0 +1,27 @@
+package cn.seecoder.devmanage.controller;
+
+import cn.seecoder.api.k8s.model.Pod;
+import cn.seecoder.devmanage.log.LocalLogger;
+import cn.seecoder.devmanage.model.vo.Response;
+import cn.seecoder.devmanage.service.PodService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/pod")
+public class PodController {
+    private final PodService podService;
+    private final LocalLogger localLogger;
+
+    @GetMapping
+    public ResponseEntity<Response<List<Pod>>> getPods(@RequestParam String namespace, @RequestParam(required = false) String name) {
+        return ResponseEntity.ok().body(Response.buildSuccess(podService.getPods(namespace, name)));
+    }
+}

+ 9 - 4
src/main/java/cn/seecoder/devmanage/log/LocalLogger.java

@@ -2,14 +2,12 @@ package cn.seecoder.devmanage.log;
 
 import cn.seecoder.devmanage.model.po.LocalLog;
 import cn.seecoder.devmanage.repository.LocalLogRepository;
-import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-
 import javax.annotation.PostConstruct;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -34,9 +32,16 @@ public class LocalLogger {
     }
 
     @Transactional
-    public void record(String message) {
+    public void recordSuccess(String message) {
+        String currentUser = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        LocalLog localLog = new LocalLog(currentUser, message, System.currentTimeMillis(), true);
+        localLogRepository.save(localLog);
+    }
+
+    @Transactional
+    public void recordFailure(String message) {
         String currentUser = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
-        LocalLog localLog = new LocalLog(currentUser, message, System.currentTimeMillis());
+        LocalLog localLog = new LocalLog(currentUser, message, System.currentTimeMillis(), false);
         localLogRepository.save(localLog);
     }
 

+ 4 - 1
src/main/java/cn/seecoder/devmanage/model/po/LocalLog.java

@@ -20,13 +20,16 @@ public class LocalLog {
     private String message;
     @Column(nullable = false)
     private Long timestamp;
+    @Column(nullable = false)
+    private Boolean success;
 
     public LocalLog() {
     }
 
-    public LocalLog(String operator, String message, Long timestamp) {
+    public LocalLog(String operator, String message, Long timestamp, Boolean success) {
         this.operator = operator;
         this.message = message;
         this.timestamp = timestamp;
+        this.success = success;
     }
 }

+ 2 - 0
src/main/java/cn/seecoder/devmanage/model/vo/LocalLogVo.java

@@ -9,6 +9,7 @@ public class LocalLogVo {
     private String operator;
     private String message;
     private String time;
+    private Boolean success;
 
     public LocalLogVo() {
     }
@@ -17,5 +18,6 @@ public class LocalLogVo {
         operator = localLog.getOperator();
         message = localLog.getMessage();
         time = LocalLogger.convertTime(localLog.getTimestamp());
+        success = localLog.getSuccess();
     }
 }

+ 9 - 0
src/main/java/cn/seecoder/devmanage/service/DeploymentService.java

@@ -0,0 +1,9 @@
+package cn.seecoder.devmanage.service;
+
+import cn.seecoder.api.k8s.model.Deployment;
+
+import java.util.List;
+
+public interface DeploymentService {
+    List<Deployment> getDeployments(String namespace, String name);
+}

+ 13 - 0
src/main/java/cn/seecoder/devmanage/service/LimitRangeService.java

@@ -0,0 +1,13 @@
+package cn.seecoder.devmanage.service;
+
+import cn.seecoder.api.k8s.model.LimitRange;
+
+import java.util.List;
+
+public interface LimitRangeService {
+    List<LimitRange> getLimitRanges(String namespace, String name);
+    LimitRange createLimitRange(LimitRange limitRange);
+    LimitRange createDefaultLimitRange(String namespace, String name);
+    LimitRange updateLimitRange(LimitRange limitRange);
+    void deleteLimitRange(String namespace, String name);
+}

+ 9 - 0
src/main/java/cn/seecoder/devmanage/service/PodService.java

@@ -0,0 +1,9 @@
+package cn.seecoder.devmanage.service;
+
+import cn.seecoder.api.k8s.model.Pod;
+
+import java.util.List;
+
+public interface PodService {
+    List<Pod> getPods(String namespace, String name);
+}

+ 23 - 0
src/main/java/cn/seecoder/devmanage/service/impl/DeploymentServiceImpl.java

@@ -0,0 +1,23 @@
+package cn.seecoder.devmanage.service.impl;
+
+import cn.seecoder.api.k8s.DeploymentApi;
+import cn.seecoder.api.k8s.model.Deployment;
+import cn.seecoder.api.k8s.model.K8sObjectRequest;
+import cn.seecoder.common.util.SpringUtil;
+import cn.seecoder.devmanage.service.DeploymentService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class DeploymentServiceImpl implements DeploymentService {
+
+    @Override
+    public List<Deployment> getDeployments(String namespace, String name) {
+        DeploymentApi deploymentApi = SpringUtil.getBean(DeploymentApi.class);
+        K8sObjectRequest deploymentRequest = K8sObjectRequest.builder().namespace(namespace).name(name).build();
+        return deploymentApi.getByCondition(deploymentRequest);
+    }
+}

+ 9 - 8
src/main/java/cn/seecoder/devmanage/service/impl/HelloServiceImpl.java

@@ -22,13 +22,14 @@ public class HelloServiceImpl implements HelloService {
     @Transactional
     @Override
     public LocalLog putLog(LocalLogVo localLogVo) {
-        try {
-            LocalLog localLog = new LocalLog(localLogVo.getOperator(),
-                    localLogVo.getMessage(),
-                    LocalLogger.convertTime(localLogVo.getTime()));
-            return localLogRepository.save(localLog);
-        } catch (ParseException e) {
-            return null;
-        }
+//        try {
+//            LocalLog localLog = new LocalLog(localLogVo.getOperator(),
+//                    localLogVo.getMessage(),
+//                    LocalLogger.convertTime(localLogVo.getTime()));
+//            return localLogRepository.save(localLog);
+//        } catch (ParseException e) {
+//            return null;
+//        }
+        return null;
     }
 }

+ 50 - 0
src/main/java/cn/seecoder/devmanage/service/impl/LimitRangeServiceImpl.java

@@ -0,0 +1,50 @@
+package cn.seecoder.devmanage.service.impl;
+
+import cn.seecoder.api.k8s.LimitRangeApi;
+import cn.seecoder.api.k8s.model.K8sObjectRequest;
+import cn.seecoder.api.k8s.model.LimitRange;
+import cn.seecoder.common.util.SpringUtil;
+import cn.seecoder.devmanage.service.LimitRangeService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class LimitRangeServiceImpl implements LimitRangeService {
+
+    @Override
+    public List<LimitRange> getLimitRanges(String namespace, String name) {
+        LimitRangeApi limitRangeApi = SpringUtil.getBean(LimitRangeApi.class);
+        K8sObjectRequest limitRequest = K8sObjectRequest.builder().namespace(namespace).name(name).build();
+        return limitRangeApi.getByCondition(limitRequest);
+    }
+
+    @Override
+    public LimitRange createLimitRange(LimitRange limitRange) {
+        LimitRangeApi limitRangeApi = SpringUtil.getBean(LimitRangeApi.class);
+        return limitRangeApi.create(limitRange);
+    }
+
+    @Override
+    public LimitRange createDefaultLimitRange(String namespace, String name) {
+        LimitRangeApi limitRangeApi = SpringUtil.getBean(LimitRangeApi.class);
+        LimitRange limitRange = new LimitRange();
+        limitRange.setNamespace(namespace);
+        limitRange.setName(name);
+        return limitRangeApi.create(limitRange);
+    }
+
+    @Override
+    public LimitRange updateLimitRange(LimitRange limitRange) {
+        LimitRangeApi limitRangeApi = SpringUtil.getBean(LimitRangeApi.class);
+        return limitRangeApi.update(limitRange);
+    }
+
+    @Override
+    public void deleteLimitRange(String namespace, String name) {
+        LimitRangeApi limitRangeApi = SpringUtil.getBean(LimitRangeApi.class);
+        limitRangeApi.delete(LimitRange.builder().namespace(namespace).name(name).build());
+    }
+}

+ 23 - 0
src/main/java/cn/seecoder/devmanage/service/impl/PodServiceImpl.java

@@ -0,0 +1,23 @@
+package cn.seecoder.devmanage.service.impl;
+
+import cn.seecoder.api.k8s.PodApi;
+import cn.seecoder.api.k8s.model.K8sObjectRequest;
+import cn.seecoder.api.k8s.model.Pod;
+import cn.seecoder.common.util.SpringUtil;
+import cn.seecoder.devmanage.service.PodService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class PodServiceImpl implements PodService {
+
+    @Override
+    public List<Pod> getPods(String namespace, String name) {
+        PodApi podApi = SpringUtil.getBean(PodApi.class);
+        K8sObjectRequest podRequest = K8sObjectRequest.builder().namespace(namespace).name(name).build();
+        return podApi.getByCondition(podRequest);
+    }
+}

+ 24 - 2
src/main/resources/application-lyy.yaml

@@ -10,7 +10,29 @@ spring:
     show-sql: true
 seecoder:
   jwt:
-    secret: testsecret
+    secret: 127e5883-6e59-4868-becf-7fc0617194f2
+  k8s:
+    api-server: https://101.133.232.246:6443
+    token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJzZWVjIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNlZWMtYWRtaW4tdG9rZW4tZ3hra2wiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2VlYy1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImMxYWFiNzcyLTI2Y2YtMTFlYi04ZmJjLTAwMTYzZTIzMzQzMyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpzZWVjOnNlZWMtYWRtaW4ifQ.Y6T5sz8FTNIzDhTacpAZvQ0iP2LZhqeMmagw3SiRiAvIVNHjPZK5QdLu1xFiz7UZRcCxh7FpUtBsKDSU9RBwQEJtt-8ZVDr-RAMwuj4c1tRimAmKDm6FiQ-Fl6eLx-3dyC6-bwgJS2rr3miFPRX-E-mqpBsBqwuughaqek6OG7dXf5tiulE7gpEXrGs2DZU8B8Fwmp_5SBz7Kpxg6AdKbCka2quNOofq_pymButwGJl8aZuZtmpeHHkydfHDrxzjiDb_41Cpx8byPnDvf-y7-zsn7eR1K55PrmQYl0Ye6mAUm9prSE8xpSgyWzW_jpfuH_aMod7E7D8syvB00GE-IA
+    validateSSL: false
+    debugging: false
+    ingressHostSuffix: .devcloud.seec.seecoder.cn
+  gitlab:
+    host: https://seecoder-gitlab-gitlab.seec.seecoder.cn
+    webhookProxy: https://devcloud.seec.seecoder.cn
+    token: wXDeETv2Kmt-JhiApJ9H
+  git:
+    username: root
+    password: NJU67software
+  docker:
+    host: unix:///var/run/docker.sock
+    registry: 127.0.0.1:6000
+    registryUsername: admin
+    registryPassword: NJU67nexus
+    tls: false
 locallogger:
   timezone:
-    offset: "+8"
+    offset: "+8"
+logging:
+  level:
+    root: info