ROBO Example: Backup BE code 78/4078/1
authorkhemendra kumar <khemendra.kumar@huawei.com>
Tue, 2 Feb 2021 10:30:59 +0000 (16:00 +0530)
committerkhemendra kumar <khemendra.kumar@huawei.com>
Tue, 2 Feb 2021 10:30:59 +0000 (16:00 +0530)
Signed-off-by: khemendra kumar <khemendra.kumar@huawei.com>
Change-Id: I9127ed8ed008cc058308c41b13f2cac008edce96

23 files changed:
example-apps/ROBO/backup_BE/backup_be.iml [new file with mode: 0644]
example-apps/ROBO/backup_BE/pom.xml [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/backupApplication.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/common/Constants.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/controller/backupController.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/controller/k8sController.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeBackup.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeBackupRestore.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgePodsPvcs.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/EALTEdgeRestore.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/Pod.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/model/Pvcs.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/backupService.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/backupServiceHandler.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/createParam.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/createParamRestore.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/deleteNamespace.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/deleteNamespaceImp.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/podService.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/pvcService.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/service/restoreService.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/java/org/edgegallery/example_app/util/ShellCommand.java [new file with mode: 0644]
example-apps/ROBO/backup_BE/src/main/resources/application.properties [new file with mode: 0755]

diff --git a/example-apps/ROBO/backup_BE/backup_be.iml b/example-apps/ROBO/backup_BE/backup_be.iml
new file mode 100644 (file)
index 0000000..78b2cc5
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4" />
\ 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 (file)
index 0000000..2563951
--- /dev/null
@@ -0,0 +1,139 @@
+<?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
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 (file)
index 0000000..6a83a72
--- /dev/null
@@ -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 (file)
index 0000000..6564e99
--- /dev/null
@@ -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 (file)
index 0000000..bba8503
--- /dev/null
@@ -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<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.");
+    }
+}
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 (file)
index 0000000..cbe169f
--- /dev/null
@@ -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<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");
+    }
+}
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 (file)
index 0000000..11a399c
--- /dev/null
@@ -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 (file)
index 0000000..b1b6ae1
--- /dev/null
@@ -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<EALTEdgeBackup> backupsData;
+    private List<EALTEdgeRestore> 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 (file)
index 0000000..0d3a2c2
--- /dev/null
@@ -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<Pod> appsData;
+    private List<Pvcs> 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 (file)
index 0000000..178f73b
--- /dev/null
@@ -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 (file)
index 0000000..0aa454f
--- /dev/null
@@ -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 (file)
index 0000000..75b3011
--- /dev/null
@@ -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 (file)
index 0000000..60aebf7
--- /dev/null
@@ -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<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;
+    }
+}
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 (file)
index 0000000..2c4642d
--- /dev/null
@@ -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<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);
+    }
+}
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 (file)
index 0000000..2bf8244
--- /dev/null
@@ -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 (file)
index 0000000..19a52d2
--- /dev/null
@@ -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 (file)
index 0000000..313484e
--- /dev/null
@@ -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 (file)
index 0000000..ac70683
--- /dev/null
@@ -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 (file)
index 0000000..1f28fdd
--- /dev/null
@@ -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<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;
+    }
+}
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 (file)
index 0000000..0a05a79
--- /dev/null
@@ -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<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;
+    }
+
+}
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 (file)
index 0000000..f340e96
--- /dev/null
@@ -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<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;
+    }
+}
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 (file)
index 0000000..cc53aa5
--- /dev/null
@@ -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<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
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 (executable)
index 0000000..91f7491
--- /dev/null
@@ -0,0 +1 @@
+server.port = 8090
\ No newline at end of file