Added Deployment Files
[eliot.git] / blueprints / common / eliot-ui / be / src / eliotk8sclient / src / main / java / com / eliot / eliotbe / eliotk8sclient / deploy / kubernetes / KubernetesDeploy.java
diff --git a/blueprints/common/eliot-ui/be/src/eliotk8sclient/src/main/java/com/eliot/eliotbe/eliotk8sclient/deploy/kubernetes/KubernetesDeploy.java b/blueprints/common/eliot-ui/be/src/eliotk8sclient/src/main/java/com/eliot/eliotbe/eliotk8sclient/deploy/kubernetes/KubernetesDeploy.java
new file mode 100644 (file)
index 0000000..73df718
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2020 Huawei Technologies Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.eliot.eliotbe.eliotk8sclient.deploy.kubernetes;
+
+import com.eliot.eliotbe.eliotk8sclient.deploy.GenericDeploy;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import io.kubernetes.client.models.*;
+import io.kubernetes.client.util.Yaml;
+import org.jose4j.json.internal.json_simple.JSONObject;
+import org.jose4j.json.internal.json_simple.parser.JSONParser;
+import org.jose4j.json.internal.json_simple.parser.ParseException;
+import com.eliot.eliotbe.eliotk8sclient.common.AppConstants;
+import com.eliot.eliotbe.eliotk8sclient.deploy.GenericDeploy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.*;
+
+public class KubernetesDeploy extends GenericDeploy {
+    private static final Logger logger = LoggerFactory.getLogger(KubernetesDeploy.class);
+
+    private static final Map<String,Class<?>> kindClassMap = new HashMap<String, Class<?>>() {
+        private static final long serialVersionUID = 3033314593899228898L;
+        {
+            put("Pod",V1Pod.class);
+            put("Deployment",V1Deployment.class);
+            put("PersistentVolume",V1PersistentVolume.class);
+            put("PersistentVolumeClaim",V1PersistentVolumeClaim.class);
+            put("Service",V1Service.class);
+        }
+    };
+    /**
+     * deploy.
+     * @param packagepath packagepath
+     * @return
+     */
+    public String deploy(String dstYamlFilePath) {
+        //String dstYamlFilePath = findDeploymentYamlPath(packagepath);
+        if (StringUtils.isEmpty(dstYamlFilePath)) {
+            logger.error("not found deploy yaml file.");
+            return AppConstants.EMPTY_STRING;
+        }
+        String yamlContent = readYamlFile(dstYamlFilePath);
+        String yamlStr = null;
+        try {
+            logger.info("before kube config installation ");
+            yamlStr = deployByYaml(yamlContent,dstYamlFilePath);
+        } catch (IOException e) {
+            logger.error("invoke method deployYaml fail : {}",e.getMessage());
+            return AppConstants.EMPTY_STRING;
+        }
+        return yamlStr;
+    }
+
+     private String findDeploymentYamlPath(String packagepath) {
+        List<String> result = new ArrayList<>();
+        search(".*\\.yaml", new File(packagepath), result);
+        String dstYamlFilePath = null;
+        for (String path : result) {
+            if (path.contains("Deployment")) {
+                dstYamlFilePath = path;
+            }
+        }
+        return dstYamlFilePath;
+    }
+
+    protected String readYamlFile(String pathname) {
+        File file = new File(pathname);
+        StringBuilder fileContents = new StringBuilder((int) file.length());
+        Scanner scanner;
+        try {
+            scanner = new Scanner(file, "UTF-8");
+        } catch (FileNotFoundException e) {
+            logger.error("read yaml file fail : {}",e.getMessage());
+            return "";
+        }
+
+        String lineSeparator = System.getProperty("line.separator");
+        try {
+            while (scanner.hasNextLine()) {
+                fileContents.append(scanner.nextLine() + lineSeparator);
+            }
+            return fileContents.toString();
+        } finally {
+            scanner.close();
+        }
+    }
+
+    protected void addModelMap(String apiVersion, String kind) {
+        if (kindClassMap.containsKey(kind)) {
+            Yaml.addModelMap(apiVersion, kind, kindClassMap.get(kind));
+            logger.info("after addModelMap for {}",kindClassMap.get(kind).getName());
+            return;
+        }
+        logger.error("not found kind : {}",kind);
+    }
+
+    private String deployByYaml(String yamlContent, String dstYamlFilePath) throws IOException {
+        logger.info("Inside updateDeploymentYaml to install pod and service");
+        ObjectMapper yamlReader = new ObjectMapper(new YAMLFactory());
+        for (String ret : yamlContent.split("---")) {
+            if (StringUtils.isEmpty(ret)) {
+                continue;
+            }
+            Object obj = yamlReader.readValue(ret, Object.class);
+            String data = new ObjectMapper().writeValueAsString(obj);
+            try {
+                JSONObject json = (JSONObject) new JSONParser().parse(data);
+                if (json.get("kind") == null) {
+                    continue;
+                }
+                String kind = json.get("kind").toString();
+                String apiVersion = json.get("apiVersion").toString();
+                addModelMap(apiVersion,kind);
+            } catch (ParseException e) {
+                logger.error("parse data fail : {}",e.getMessage());
+            }
+        }
+        IDeploy deployment = DeployFactory.create();
+        return deployment.deploy(dstYamlFilePath);
+    }
+}