From 90720a02fb3c8cc388c82eee0971173c3087ca38 Mon Sep 17 00:00:00 2001 From: khemendra kumar Date: Tue, 2 Feb 2021 16:00:59 +0530 Subject: [PATCH] ROBO Example: Backup BE code Signed-off-by: khemendra kumar Change-Id: I9127ed8ed008cc058308c41b13f2cac008edce96 --- example-apps/ROBO/backup_BE/backup_be.iml | 2 + example-apps/ROBO/backup_BE/pom.xml | 139 +++++++++++++++++++++ .../edgegallery/example_app/backupApplication.java | 41 ++++++ .../edgegallery/example_app/common/Constants.java | 5 + .../example_app/controller/backupController.java | 88 +++++++++++++ .../example_app/controller/k8sController.java | 93 ++++++++++++++ .../example_app/model/EALTEdgeBackup.java | 24 ++++ .../example_app/model/EALTEdgeBackupRestore.java | 21 ++++ .../example_app/model/EALTEdgePodsPvcs.java | 21 ++++ .../example_app/model/EALTEdgeRestore.java | 22 ++++ .../org/edgegallery/example_app/model/Pod.java | 96 ++++++++++++++ .../org/edgegallery/example_app/model/Pvcs.java | 96 ++++++++++++++ .../example_app/service/backupService.java | 44 +++++++ .../example_app/service/backupServiceHandler.java | 55 ++++++++ .../example_app/service/createParam.java | 49 ++++++++ .../example_app/service/createParamRestore.java | 40 ++++++ .../example_app/service/deleteNamespace.java | 8 ++ .../example_app/service/deleteNamespaceImp.java | 27 ++++ .../example_app/service/podService.java | 42 +++++++ .../example_app/service/pvcService.java | 52 ++++++++ .../example_app/service/restoreService.java | 43 +++++++ .../edgegallery/example_app/util/ShellCommand.java | 52 ++++++++ .../src/main/resources/application.properties | 1 + 23 files changed, 1061 insertions(+) create mode 100644 example-apps/ROBO/backup_BE/backup_be.iml create mode 100644 example-apps/ROBO/backup_BE/pom.xml create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/backupApplication.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/common/Constants.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/controller/backupController.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/controller/k8sController.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeBackup.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeBackupRestore.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgePodsPvcs.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeRestore.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/Pod.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/Pvcs.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/backupService.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/backupServiceHandler.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/createParam.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/createParamRestore.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/deleteNamespace.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/deleteNamespaceImp.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/podService.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/pvcService.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/restoreService.java create mode 100644 example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/util/ShellCommand.java create mode 100755 example-apps/ROBO/backup_BE/src/main/resources/application.properties diff --git a/example-apps/ROBO/backup_BE/backup_be.iml b/example-apps/ROBO/backup_BE/backup_be.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/example-apps/ROBO/backup_BE/backup_be.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/example-apps/ROBO/backup_BE/pom.xml b/example-apps/ROBO/backup_BE/pom.xml new file mode 100644 index 0000000..2563951 --- /dev/null +++ b/example-apps/ROBO/backup_BE/pom.xml @@ -0,0 +1,139 @@ + + + 4.0.0 + + org.example + backup_be + 1.0-SNAPSHOT + + 1.8 + 1.8 + + jar + + org.springframework.boot + spring-boot-starter-parent + 2.3.0.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework + spring-core + 5.2.12.RELEASE + + + org.apache.logging.log4j + log4j-core + 2.13.2 + + + org.apache.logging.log4j + log4j-api + 2.13.2 + + + commons-logging + commons-logging + 1.1.1 + + + + io.kubernetes + client-java-api + 5.0.0 + + + io.kubernetes + client-java + 5.0.0 + compile + + + org.springframework.boot + spring-boot + 2.3.8.RELEASE + + + org.springframework.boot + spring-boot-autoconfigure + 2.3.8.RELEASE + + + org.springframework + spring-web + 5.2.12.RELEASE + + + javax.validation + validation-api + 2.0.1.Final + + + javax.ws.rs + javax.ws.rs-api + 2.1.1 + + + org.hibernate.validator + hibernate-validator + 6.1.5.Final + + + org.slf4j + slf4j-api + 1.7.5 + + + org.slf4j + slf4j-log4j12 + 1.7.5 + + + org.projectlombok + lombok + 1.18.10 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.3.8.RELEASE + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + + true + lib/ + org.edgegallery.example_app.backupApplication + + + + + + + + \ No newline at end of file diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/backupApplication.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/backupApplication.java new file mode 100644 index 0000000..6a83a72 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/backupApplication.java @@ -0,0 +1,41 @@ +package org.edgegallery.example_app; + + +import io.kubernetes.client.ApiException; +import io.kubernetes.client.Configuration; +import io.kubernetes.client.apis.CoreV1Api; +import io.kubernetes.client.models.V1PersistentVolumeClaim; +import io.kubernetes.client.models.V1PersistentVolumeClaimList; +import io.kubernetes.client.util.ClientBuilder; +import io.kubernetes.client.util.KubeConfig; +import java.util.ArrayList; +import java.util.List; +import org.edgegallery.example_app.model.Pvcs; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import io.kubernetes.client.ApiClient; +import org.springframework.context.annotation.Bean; +import java.io.FileReader; +import java.io.IOException; + +@SpringBootApplication +public class backupApplication { + + @Bean + public static void apiclient() throws IOException { + // file path to your KubeConfig + String homePath = System.getenv("HOME"); + String kubeConfigPath = homePath + "/.kube/config"; + + // loading the out-of-cluster config, a kubeconfig from file-system + ApiClient client = + ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build(); + + // set the global default api-client to the in-cluster one from above + Configuration.setDefaultApiClient(client); + } + + public static void main(String[] args) throws IOException { + SpringApplication.run(backupApplication.class, args); + } +} \ No newline at end of file diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/common/Constants.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/common/Constants.java new file mode 100644 index 0000000..6564e99 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/common/Constants.java @@ -0,0 +1,5 @@ +package org.edgegallery.example_app.common; + +public class Constants { + public static final String NAME_REGEX = "^[a-zA-Z0-9]*$|^[a-zA-Z0-9][a-zA-Z0-9_\\-]*[a-zA-Z0-9]$"; +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/controller/backupController.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/controller/backupController.java new file mode 100644 index 0000000..bba8503 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/controller/backupController.java @@ -0,0 +1,88 @@ +package org.edgegallery.example_app.controller; + +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import javax.ws.rs.core.MediaType; +import org.hibernate.validator.constraints.Length; +import org.edgegallery.example_app.model.EALTEdgeBackupRestore; +import org.edgegallery.example_app.service.backupServiceHandler; +import org.edgegallery.example_app.service.createParam; +import org.edgegallery.example_app.service.createParamRestore; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; + +@CrossOrigin +@Controller +@RequestMapping("/v1/robo") +@Validated +public class backupController { + private static final int MAX_COMMON_STRING_LENGTH = 255; + + private static final int MAX_DETAILS_STRING_LENGTH = 1024; + + @Autowired + private backupServiceHandler BackupServiceHandler; + + @GetMapping(value = "/backups-restores", produces = MediaType.APPLICATION_JSON) + @ApiOperation(value = "get backup and restore tables.", response = EALTEdgeBackupRestore.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 404, message = "microservice not found", response = String.class), + @ApiResponse(code = 415, message = "Unprocessable " + "MicroServiceInfo Entity ", + response = String.class), + @ApiResponse(code = 500, message = "resource grant " + "error", response = String.class) + }) + public ResponseEntity getBackupRestoreDetails() { + return BackupServiceHandler.getBackupRestoreDetails(); + } + + @PostMapping(value = "/backup", produces = MediaType.APPLICATION_JSON) + @ApiOperation(value = "create backup.", response = String.class) + @ApiResponses(value = { + @ApiResponse(code = 404, message = "microservice not found", response = String.class), + @ApiResponse(code = 415, message = "Unprocessable " + "MicroServiceInfo Entity ", + response = String.class), + @ApiResponse(code = 500, message = "resource grant " + "error", response = String.class) + }) + public ResponseEntity getBackupRestoreDetails(@ApiParam(value = "create backup instance") + @Valid @RequestBody createParam CreateParam) { + BackupServiceHandler.createBackup(CreateParam.getBackupName(), CreateParam.getNamespace()); + return ResponseEntity.ok("create backup success."); + } + + +/* @PostMapping(value = "/v1/robo/backup", produces = MediaType.APPLICATION_JSON) + public ResponseEntity getBackupRestoreDetails( @ApiParam(value = "create backup instance") + @Valid @RequestBody createParam CreateParam) { + BackupServiceHandler.createBackup(CreateParam.getBackupName(), CreateParam.getNamespace()); + return ResponseEntity.ok("create backup success."); + }*/ + + @PostMapping(value = "/restore", produces = MediaType.APPLICATION_JSON) + @ApiOperation(value = "create restore.", response = String.class) + @ApiResponses(value = { + @ApiResponse(code = 404, message = "microservice not found", response = String.class), + @ApiResponse(code = 415, message = "Unprocessable " + "MicroServiceInfo Entity ", + response = String.class), + @ApiResponse(code = 500, message = "resource grant " + "error", response = String.class) + }) + public ResponseEntity createRestore(@ApiParam(value = "create restore instance") + @Valid @RequestBody createParamRestore CreateParam) { + BackupServiceHandler.createRestore(CreateParam.getRestoreName(), CreateParam.getBackupName()); + return ResponseEntity.ok("create restore success."); + } +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/controller/k8sController.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/controller/k8sController.java new file mode 100644 index 0000000..cbe169f --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/controller/k8sController.java @@ -0,0 +1,93 @@ +package org.edgegallery.example_app.controller; + +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import javax.ws.rs.core.MediaType; +import org.edgegallery.example_app.model.*; +import io.kubernetes.client.ApiException; +import io.kubernetes.client.apis.CoreV1Api; +import io.kubernetes.client.models.*; +import org.checkerframework.common.reflection.qual.GetMethod; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.edgegallery.example_app.service.podService; +import org.edgegallery.example_app.service.pvcService; +import org.edgegallery.example_app.service.deleteNamespace; + + +import java.util.ArrayList; +import java.util.List; + +@CrossOrigin +@Controller +@RequestMapping("/v1/robo") +@Validated +public class k8sController { + + @Autowired + EALTEdgePodsPvcs eALTEdgePodsPvcs; + + @Autowired + pvcService PvcService; + + @Autowired + podService PodService; + + private final deleteNamespace DeleteNamespace; + + @Autowired + public k8sController(deleteNamespace DeleteNamespace) { + this.DeleteNamespace = DeleteNamespace; + } + + @GetMapping(path = "/apps-pvcs") + @ApiOperation(value = "get pod and pvcs tables.", response = EALTEdgePodsPvcs.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 404, message = "microservice not found", response = String.class), + @ApiResponse(code = 415, message = "Unprocessable " + "MicroServiceInfo Entity ", + response = String.class), + @ApiResponse(code = 500, message = "resource grant " + "error", response = String.class) + }) + public ResponseEntity getAllPodPvcList() throws ApiException { + + List podlistElement; + podlistElement = PodService.getPodsList(); + if (podlistElement.isEmpty()) { + System.out.println("Pod list is null"); + } + + List pvcslistElement; + pvcslistElement = PvcService.getPvcsList(); + if (pvcslistElement.isEmpty()) { + System.out.println("Pvcs list is null"); + } + + eALTEdgePodsPvcs.setAppsData(podlistElement); + eALTEdgePodsPvcs.setPvcData(pvcslistElement); + + return new ResponseEntity(eALTEdgePodsPvcs, HttpStatus.OK); + } + + @GetMapping(path = "/disaster") + @ApiOperation(value = "delete namespace. in k8s", response = String.class, + responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 404, message = "microservice not found", response = String.class), + @ApiResponse(code = 415, message = "Unprocessable " + "MicroServiceInfo Entity ", + response = String.class), + @ApiResponse(code = 500, message = "resource grant " + "error", response = String.class) + }) + public ResponseEntity createDisaster() throws ApiException { + + DeleteNamespace.deleteNS(); + System.out.println("k8s 1 api is ok"); + + return ResponseEntity.ok("success"); + } +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeBackup.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeBackup.java new file mode 100644 index 0000000..11a399c --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeBackup.java @@ -0,0 +1,24 @@ +package org.edgegallery.example_app.model; + + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class EALTEdgeBackup { + private String name; + private String status; + private String errors; + private String warnings; + private String created; + private String expires; + private String storage; + private String location; + private String selector; +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeBackupRestore.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeBackupRestore.java new file mode 100644 index 0000000..b1b6ae1 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeBackupRestore.java @@ -0,0 +1,21 @@ +package org.edgegallery.example_app.model; + +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.stereotype.Service; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Service +public class EALTEdgeBackupRestore { + + private List backupsData; + private List restoresData; + +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgePodsPvcs.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgePodsPvcs.java new file mode 100644 index 0000000..0d3a2c2 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgePodsPvcs.java @@ -0,0 +1,21 @@ +package org.edgegallery.example_app.model; + +import java.util.ArrayList; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.stereotype.Service; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Service +public class EALTEdgePodsPvcs { + + private List appsData; + private List pvcData; +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeRestore.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeRestore.java new file mode 100644 index 0000000..178f73b --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeRestore.java @@ -0,0 +1,22 @@ +package org.edgegallery.example_app.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class EALTEdgeRestore { + private String name; + private String backup; + private String status; + private String started; + private String completed; + private String errors; + private String warnings; + private String created; + private String selector; +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/Pod.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/Pod.java new file mode 100644 index 0000000..0aa454f --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/Pod.java @@ -0,0 +1,96 @@ +package org.edgegallery.example_app.model; + +public class Pod { + private String namespace; + private String name; + private String ready; + private String status; + private String restarts; + private String age; + private String ip; + private String node; + private String nominated; + private String readiness; + + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getReady() { + return ready; + } + + public void setReady(String ready) { + this.ready = ready; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getRestarts() { + return restarts; + } + + public void setRestarts(String restarts) { + this.restarts = restarts; + } + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getNode() { + return node; + } + + public void setNode(String node) { + this.node = node; + } + + public String getNominated() { + return nominated; + } + + public void setNominated(String nominated) { + this.nominated = nominated; + } + + public String getReadiness() { + return readiness; + } + + public void setReadiness(String readiness) { + this.readiness = readiness; + } + +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/Pvcs.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/Pvcs.java new file mode 100644 index 0000000..75b3011 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/Pvcs.java @@ -0,0 +1,96 @@ +package org.edgegallery.example_app.model; + +public class Pvcs { + private String namespace; + private String name; + private String ready; + private String status; + private String restarts; + private String age; + private String ip; + private String node; + private String nominated; + private String readiness; + + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getReady() { + return ready; + } + + public void setReady(String ready) { + this.ready = ready; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getRestarts() { + return restarts; + } + + public void setRestarts(String restarts) { + this.restarts = restarts; + } + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getNode() { + return node; + } + + public void setNode(String node) { + this.node = node; + } + + public String getNominated() { + return nominated; + } + + public void setNominated(String nominated) { + this.nominated = nominated; + } + + public String getReadiness() { + return readiness; + } + + public void setReadiness(String readiness) { + this.readiness = readiness; + } + +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/backupService.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/backupService.java new file mode 100644 index 0000000..60aebf7 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/backupService.java @@ -0,0 +1,44 @@ +package org.edgegallery.example_app.service; + +import java.util.ArrayList; +import java.util.List; +import org.edgegallery.example_app.model.EALTEdgeBackup; +import org.springframework.beans.factory.annotation.Autowired; +import org.edgegallery.example_app.util.ShellCommand; +import org.springframework.stereotype.Service; + +@Service +public class backupService { + + @Autowired + private ShellCommand ShellCommands; + + public String create_backup(String backupname, String namespace) { + String command = "velero backup create " + backupname + " --include-namespaces " + namespace; + + String output = ShellCommands.executeCommand(command); + + System.out.println(output); + return "success"; + } + + public List getBackupTables() { + + EALTEdgeBackup backup = new EALTEdgeBackup(); + String command = "velero get backups"; + + String output = ShellCommands.executeCommand(command); + + //System.out.println(output); + List backupsList = new ArrayList(); + + String list = ShellCommands.parseResult(output); + + //TODO: after parse the result, need to fill info in backup node in list + backup.setName("backup1"); + + backupsList.add(backup); + + return backupsList; + } +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/backupServiceHandler.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/backupServiceHandler.java new file mode 100644 index 0000000..2c4642d --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/backupServiceHandler.java @@ -0,0 +1,55 @@ +package org.edgegallery.example_app.service; + +import java.util.ArrayList; +import java.util.List; +import org.edgegallery.example_app.model.EALTEdgeBackup; +import org.edgegallery.example_app.model.EALTEdgeBackupRestore; +import org.edgegallery.example_app.model.EALTEdgeRestore; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +@Service +public class backupServiceHandler { + + @Autowired + private backupService BackupService; + + @Autowired + private restoreService RestoreService; + /** + * get back/restore tables. + * @return + */ + public ResponseEntity getBackupRestoreDetails() { + + EALTEdgeBackupRestore eALTEdgeBackupRestore = new EALTEdgeBackupRestore(); + + List backupsList = BackupService.getBackupTables(); + List restoresList = RestoreService.getRestoreTables(); + + eALTEdgeBackupRestore.setBackupsData(backupsList); + eALTEdgeBackupRestore.setRestoresData(restoresList); + return ResponseEntity.ok(eALTEdgeBackupRestore); + } + + /** + * create restore tables. + * @param restoreName restore name. + * @param backupName backup name. + * @return + */ + public String createRestore(String restoreName, String backupName){ + return RestoreService.create_restore(restoreName, backupName); + } + + /** + * create backup tables. + * @param backupName restore name. + * @param namespaces backup name. + * @return + */ + public String createBackup(String backupName, String namespaces){ + return BackupService.create_backup(backupName, namespaces); + } +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/createParam.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/createParam.java new file mode 100644 index 0000000..2bf8244 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/createParam.java @@ -0,0 +1,49 @@ +package org.edgegallery.example_app.service; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import org.springframework.validation.annotation.Validated; + +import static org.edgegallery.example_app.common.Constants.NAME_REGEX; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.validation.annotation.Validated; + +/** + * Create instance input schema. + */ +@Validated +@Getter +@Setter +@ToString +@NoArgsConstructor +@AllArgsConstructor +public class createParam { + + @NotEmpty(message = "backup name is mandatory") + @Size(max = 64) + @Pattern(regexp = NAME_REGEX) + private String backupName; + + @NotEmpty(message = "namespace is mandatory") + @Size(max = 64) + @Pattern(regexp = NAME_REGEX) + private String namespace; + +/* public String getBackupName() { + return backupName; + } + + public void setBackupName(String backupName) { + this.backupName = backupName; + }*/ +} + diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/createParamRestore.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/createParamRestore.java new file mode 100644 index 0000000..19a52d2 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/createParamRestore.java @@ -0,0 +1,40 @@ +package org.edgegallery.example_app.service; + + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import org.springframework.validation.annotation.Validated; + +import static org.edgegallery.example_app.common.Constants.NAME_REGEX; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.validation.annotation.Validated; + +/** + * Create instance input schema. + */ +@Validated +@Getter +@Setter +@ToString +@NoArgsConstructor +@AllArgsConstructor +public class createParamRestore { + @NotEmpty(message = "namespace name is mandatory") + @Size(max = 64) + @Pattern(regexp = NAME_REGEX) + private String restoreName; + + @NotEmpty(message = "backup name is mandatory") + @Size(max = 64) + @Pattern(regexp = NAME_REGEX) + private String backupName; +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/deleteNamespace.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/deleteNamespace.java new file mode 100644 index 0000000..313484e --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/deleteNamespace.java @@ -0,0 +1,8 @@ +package org.edgegallery.example_app.service; + +import io.kubernetes.client.ApiException; + +public interface deleteNamespace { + + String deleteNS() throws ApiException; +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/deleteNamespaceImp.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/deleteNamespaceImp.java new file mode 100644 index 0000000..ac70683 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/deleteNamespaceImp.java @@ -0,0 +1,27 @@ +package org.edgegallery.example_app.service; + +import io.kubernetes.client.ApiException; +import io.kubernetes.client.apis.CoreV1Api; +import io.kubernetes.client.models.V1PodList; +import io.kubernetes.client.models.V1Status; +import org.springframework.stereotype.Service; +import io.kubernetes.client.models.V1DeleteOptions; + +@Service +public class deleteNamespaceImp implements deleteNamespace { + + @Override + public String deleteNS() throws ApiException { + String namespace = "test"; + CoreV1Api api = new CoreV1Api(); + + // invokes the CoreV1Api client + //TODO: this API delete the namespace but it crash after execute. need to check some example for this API to + // cnfirm the para + api.deleteNamespace(namespace, null, new V1DeleteOptions(),null,null,null,null); + + System.out.println("k8s api is ok"); + + return "success"; + } +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/podService.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/podService.java new file mode 100644 index 0000000..1f28fdd --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/podService.java @@ -0,0 +1,42 @@ +package org.edgegallery.example_app.service; + +import io.kubernetes.client.ApiException; +import io.kubernetes.client.apis.CoreV1Api; +import io.kubernetes.client.models.V1Pod; +import io.kubernetes.client.models.V1PodList; +import java.util.ArrayList; +import java.util.List; +import org.edgegallery.example_app.model.Pod; +import org.springframework.stereotype.Service; + +@Service +public class podService { + + public List getPodsList() throws ApiException { + + Pod podDetail; + + // the CoreV1Api loads default api-client from global configuration. + CoreV1Api api = new CoreV1Api(); + + // invokes the CoreV1Api client + + V1PodList eliotPods = api.listPodForAllNamespaces(null, null, + null, null, null, null, null, null, null); + + List podlistElement = new ArrayList(); + + for (V1Pod item : eliotPods.getItems()) { + podDetail = new Pod(); + podDetail.setNamespace(item.getMetadata().getNamespace()); + podDetail.setName(item.getMetadata().getName()); + podDetail.setStatus(item.getStatus().getPhase()); + podDetail.setIp(item.getStatus().getPodIP()); + podDetail.setNode(item.getSpec().getNodeName()); + podDetail.setReadiness("null"); + podlistElement.add(podDetail); + } + + return podlistElement; + } +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/pvcService.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/pvcService.java new file mode 100644 index 0000000..0a05a79 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/pvcService.java @@ -0,0 +1,52 @@ +package org.edgegallery.example_app.service; + +import io.kubernetes.client.ApiException; +import io.kubernetes.client.apis.CoreV1Api; +import io.kubernetes.client.models.V1PersistentVolumeClaim; +import io.kubernetes.client.models.V1PersistentVolumeClaimList; + +import java.util.ArrayList; +import java.util.List; +import org.edgegallery.example_app.model.Pvcs; +import org.springframework.stereotype.Service; + +@Service +public class pvcService { + private Pvcs pvcsDetail; + + public List getPvcsList() { + String namespace = "default"; + CoreV1Api api = new CoreV1Api(); + V1PersistentVolumeClaimList list = null; + try { + /* list = api.listNamespacedPersistentVolumeClaim(namespace, null, null, null, + null, null, null, null, null, + null);*/ + list = api.listPersistentVolumeClaimForAllNamespaces(null, null, null, + null,null,null,null,null,null); + } catch (ApiException apie) { + System.err.println("Exception when calling CoreV1Api#listNamespacedPersistentVolumeClaim"); + apie.printStackTrace(); + System.exit(1); + } + + if (list == null) { + System.out.println("Inside- pvcs obj is null"); + } + List pvcslistElement = new ArrayList(); + + for (V1PersistentVolumeClaim item : list.getItems()) { + pvcsDetail = new Pvcs(); + pvcsDetail.setNamespace(item.getMetadata().getNamespace()); + pvcsDetail.setName(item.getMetadata().getName()); + pvcsDetail.setStatus(item.getStatus().getPhase()); + //pvcsDetail.setIp(item.getStatus().getPodIP()); + //pvcsDetail.setNode(item.getSpec().getNodeName()); + pvcsDetail.setReadiness("null"); + pvcslistElement.add(pvcsDetail); + } + + return pvcslistElement; + } + +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/restoreService.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/restoreService.java new file mode 100644 index 0000000..f340e96 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/restoreService.java @@ -0,0 +1,43 @@ +package org.edgegallery.example_app.service; + +import java.util.ArrayList; +import java.util.List; +import org.edgegallery.example_app.model.EALTEdgeBackup; +import org.edgegallery.example_app.model.EALTEdgeRestore; +import org.edgegallery.example_app.util.ShellCommand; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class restoreService { + + @Autowired + ShellCommand shellCommand; + + public String create_restore(String restorename, String backupname) { + String command = "velero restore create " + restorename + " --from-backup " + backupname; + + String output = shellCommand.executeCommand(command); + + System.out.println(output); + return "success"; + } + + public List getRestoreTables() { + EALTEdgeRestore restoreDetails = new EALTEdgeRestore(); + String command = "velero get restores"; + + String output = shellCommand.executeCommand(command); + + //System.out.println(output); + List restoresList = new ArrayList(); + + String list = shellCommand.parseResult(output); + + //TODO: after parse the result, need to fill info in backup node in list + restoreDetails.setName("restore1"); + + restoresList.add(restoreDetails); + return restoresList; + } +} diff --git a/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/util/ShellCommand.java b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/util/ShellCommand.java new file mode 100644 index 0000000..cc53aa5 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/util/ShellCommand.java @@ -0,0 +1,52 @@ +package org.edgegallery.example_app.util; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class ShellCommand { + + public String executeCommand(String command) { + + StringBuffer output = new StringBuffer(); + + Process p; + try { + p = Runtime.getRuntime().exec(command); + p.waitFor(); + BufferedReader reader = + new BufferedReader(new InputStreamReader(p.getInputStream())); + + String line = ""; + while ((line = reader.readLine())!= null) { + output.append(line + "\n"); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return output.toString(); + + } + + //parse velero cmd and get details + public String parseResult(String msg){ + List itemsList = new ArrayList(); + + /* + if (msg == null || msg.equals("")) + return itemsList; + + matcher = pattern.matcher(msg); + while (matcher.find()) { + ipList.add(matcher.group(0)); + } + return ipList; +*/ + return "success"; + } +} \ No newline at end of file diff --git a/example-apps/ROBO/backup_BE/src/main/resources/application.properties b/example-apps/ROBO/backup_BE/src/main/resources/application.properties new file mode 100755 index 0000000..91f7491 --- /dev/null +++ b/example-apps/ROBO/backup_BE/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port = 8090 \ No newline at end of file -- 2.16.6