--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4" />
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.example</groupId>
+ <artifactId>backup_be</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <properties>
+ <maven.compiler.source>1.8</maven.compiler.source>
+ <maven.compiler.target>1.8</maven.compiler.target>
+ </properties>
+ <packaging>jar</packaging>
+ <parent>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-parent</artifactId>
+ <version>2.3.0.RELEASE</version>
+ <relativePath/> <!-- lookup parent from repository -->
+ </parent>
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ <version>5.2.12.RELEASE</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ <version>2.13.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-api</artifactId>
+ <version>2.13.2</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.1.1</version>
+ </dependency>
+<!-- <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <version>5.2.12.RELEASE</version>
+ </dependency>-->
+ <dependency>
+ <groupId>io.kubernetes</groupId>
+ <artifactId>client-java-api</artifactId>
+ <version>5.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>io.kubernetes</groupId>
+ <artifactId>client-java</artifactId>
+ <version>5.0.0</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot</artifactId>
+ <version>2.3.8.RELEASE</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-autoconfigure</artifactId>
+ <version>2.3.8.RELEASE</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-web</artifactId>
+ <version>5.2.12.RELEASE</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.validation</groupId>
+ <artifactId>validation-api</artifactId>
+ <version>2.0.1.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>javax.ws.rs-api</artifactId>
+ <version>2.1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate.validator</groupId>
+ <artifactId>hibernate-validator</artifactId>
+ <version>6.1.5.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.7.5</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>1.7.5</version>
+ </dependency>
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <version>1.18.10</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <version>2.3.8.RELEASE</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.8.1</version>
+ </plugin>
+ <plugin>
+ <!-- Build an executable JAR -->
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>3.2.0</version>
+ <configuration>
+ <archive>
+ <manifest>
+ <addClasspath>true</addClasspath>
+ <classpathPrefix>lib/</classpathPrefix>
+ <mainClass>org.edgegallery.example_app.backupApplication</mainClass>
+ </manifest>
+ </archive>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
\ No newline at end of file
--- /dev/null
+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
--- /dev/null
+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]$";
+}
--- /dev/null
+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<EALTEdgeBackupRestore> 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<String> 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<String> 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<String> createRestore(@ApiParam(value = "create restore instance")
+ @Valid @RequestBody createParamRestore CreateParam) {
+ BackupServiceHandler.createRestore(CreateParam.getRestoreName(), CreateParam.getBackupName());
+ return ResponseEntity.ok("create restore success.");
+ }
+}
--- /dev/null
+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<EALTEdgePodsPvcs> getAllPodPvcList() throws ApiException {
+
+ List<Pod> podlistElement;
+ podlistElement = PodService.getPodsList();
+ if (podlistElement.isEmpty()) {
+ System.out.println("Pod list is null");
+ }
+
+ List<Pvcs> pvcslistElement;
+ pvcslistElement = PvcService.getPvcsList();
+ if (pvcslistElement.isEmpty()) {
+ System.out.println("Pvcs list is null");
+ }
+
+ eALTEdgePodsPvcs.setAppsData(podlistElement);
+ eALTEdgePodsPvcs.setPvcData(pvcslistElement);
+
+ return new ResponseEntity<EALTEdgePodsPvcs>(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<String> createDisaster() throws ApiException {
+
+ DeleteNamespace.deleteNS();
+ System.out.println("k8s 1 api is ok");
+
+ return ResponseEntity.ok("success");
+ }
+}
--- /dev/null
+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;
+}
--- /dev/null
+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<EALTEdgeBackup> backupsData;
+ private List<EALTEdgeRestore> restoresData;
+
+}
--- /dev/null
+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<Pod> appsData;
+ private List<Pvcs> pvcData;
+}
--- /dev/null
+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;
+}
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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<EALTEdgeBackup> getBackupTables() {
+
+ EALTEdgeBackup backup = new EALTEdgeBackup();
+ String command = "velero get backups";
+
+ String output = ShellCommands.executeCommand(command);
+
+ //System.out.println(output);
+ List<EALTEdgeBackup> backupsList = new ArrayList<EALTEdgeBackup>();
+
+ 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;
+ }
+}
--- /dev/null
+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<EALTEdgeBackupRestore> getBackupRestoreDetails() {
+
+ EALTEdgeBackupRestore eALTEdgeBackupRestore = new EALTEdgeBackupRestore();
+
+ List<EALTEdgeBackup> backupsList = BackupService.getBackupTables();
+ List<EALTEdgeRestore> 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);
+ }
+}
--- /dev/null
+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;
+ }*/
+}
+
--- /dev/null
+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;
+}
--- /dev/null
+package org.edgegallery.example_app.service;
+
+import io.kubernetes.client.ApiException;
+
+public interface deleteNamespace {
+
+ String deleteNS() throws ApiException;
+}
--- /dev/null
+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";
+ }
+}
--- /dev/null
+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<Pod> 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<Pod> podlistElement = new ArrayList<Pod>();
+
+ 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;
+ }
+}
--- /dev/null
+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<Pvcs> 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<Pvcs> pvcslistElement = new ArrayList<Pvcs>();
+
+ 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;
+ }
+
+}
--- /dev/null
+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<EALTEdgeRestore> getRestoreTables() {
+ EALTEdgeRestore restoreDetails = new EALTEdgeRestore();
+ String command = "velero get restores";
+
+ String output = shellCommand.executeCommand(command);
+
+ //System.out.println(output);
+ List<EALTEdgeRestore> restoresList = new ArrayList<EALTEdgeRestore>();
+
+ 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;
+ }
+}
--- /dev/null
+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<String> itemsList = new ArrayList<String>();
+
+ /*
+ 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
--- /dev/null
+server.port = 8090
\ No newline at end of file