From 68c007e836384635d843bbc61174fae5b09ccd1c Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期六, 06 一月 2024 17:08:07 +0800
Subject: [PATCH] 增加对crm,wms,srm的部署支持

---
 src/k8s/create_srm.go |  208 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 208 insertions(+), 0 deletions(-)

diff --git a/src/k8s/create_srm.go b/src/k8s/create_srm.go
new file mode 100644
index 0000000..e612e14
--- /dev/null
+++ b/src/k8s/create_srm.go
@@ -0,0 +1,208 @@
+package k8s
+
+import (
+	"context"
+	"fmt"
+	appsv1 "k8s.io/api/apps/v1"
+	apiv1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/intstr"
+	"log"
+	"strconv"
+)
+
+type SrmCreate struct{}
+
+func (c *SrmCreate) CreateDeploymentAndService(config Config, extendEnv map[string]string) error {
+	fmt.Println("\033[1;37;40mCreating resources in Namespace:", config.NameSpace, "\033[0m")
+
+	// 妫�娴嬪苟鍒犻櫎宸插瓨鍦ㄧ殑 Deployment 鍜� Service
+	err := CheckAndDeleteResources(config.Client, config.NameSpace, config.DeploymentName, config.ServiceName)
+	if err != nil {
+		return err
+	}
+
+	config.HttpPort, err = getRandomNodePort(config.Client)
+	if err != nil {
+		return err
+	}
+
+	// 鍒涘缓 Deployment
+	err = c.CreateDeployment(config, extendEnv)
+	if err != nil {
+		return err
+	}
+
+	log.Printf("Waiting for Deployment %s to be ready...\n", config.DeploymentName)
+	// 鍒涘缓 Service
+	err = c.CreateService(config)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (c *SrmCreate) CreateEnv(config Config, pairs map[string]string) []apiv1.EnvVar {
+	envs := []apiv1.EnvVar{
+		{
+			Name: "DB_HOST",
+			ValueFrom: &apiv1.EnvVarSource{
+				FieldRef: &apiv1.ObjectFieldSelector{
+					APIVersion: "v1",
+					FieldPath:  "status.hostIP",
+				},
+			},
+		},
+		{
+			Name:  "DB_NAME",
+			Value: config.NameSpace,
+		},
+		{
+			Name:  "DB_PORT",
+			Value: strconv.Itoa(6446),
+		},
+		{
+			Name:  "DB_USER",
+			Value: config.NameSpace,
+		},
+		{
+			Name:  "DB_PASSWD",
+			Value: config.NameSpace + "@Basic2023",
+		},
+	}
+
+	if config.ALHost != "" {
+		envs = append(envs, apiv1.EnvVar{
+			Name:  "AL_HOST",
+			Value: config.ALHost,
+		})
+	}
+
+	if config.NodeID != "" {
+		envs = append(envs, apiv1.EnvVar{
+			Name:  "NODE_ID",
+			Value: config.NodeID,
+		})
+	}
+
+	if len(pairs) > 0 {
+		for name, value := range pairs {
+			envs = append(envs, apiv1.EnvVar{
+				Name:  name,
+				Value: value,
+			})
+		}
+	}
+	for name, value := range pairs {
+		envs = append(envs, apiv1.EnvVar{
+			Name:  name,
+			Value: value,
+		})
+	}
+	return envs
+}
+func (c *SrmCreate) CreateDeployment(config Config, extendEnv map[string]string) error {
+	fmt.Println("\033[1;37;40mCreating Deployment:", config.DeploymentName, "\033[0m")
+	fmt.Printf("Srm CreateDeployment config:%+v\n", config)
+	envs := c.CreateEnv(config, extendEnv)
+	deployment := &appsv1.Deployment{
+		ObjectMeta: metav1.ObjectMeta{
+			Name: config.DeploymentName,
+		},
+		Spec: appsv1.DeploymentSpec{
+			Replicas: &replicas,
+			Selector: &metav1.LabelSelector{
+				MatchLabels: map[string]string{
+					"cid": c.GetCid(config),
+				},
+			},
+			Template: apiv1.PodTemplateSpec{
+				ObjectMeta: metav1.ObjectMeta{
+					Labels: map[string]string{
+						"cid": c.GetCid(config),
+					},
+				},
+				Spec: apiv1.PodSpec{
+					TopologySpreadConstraints: []apiv1.TopologySpreadConstraint{
+						{
+							MaxSkew:           1,
+							TopologyKey:       "kubernetes.io/hostname",
+							WhenUnsatisfiable: apiv1.DoNotSchedule,
+							LabelSelector: &metav1.LabelSelector{
+								MatchLabels: map[string]string{
+									"cid": c.GetCid(config),
+								},
+							},
+						},
+					},
+					Containers: []apiv1.Container{
+						{
+							Name:            config.DeploymentName,
+							Image:           config.Image,
+							Env:             envs,
+							ImagePullPolicy: apiv1.PullIfNotPresent, // 璁剧疆闀滃儚鎷夊彇绛栫暐涓� Always
+						},
+					},
+				},
+			},
+		},
+	}
+
+	_, err := config.Client.AppsV1().Deployments(config.NameSpace).Create(context.TODO(), deployment, metav1.CreateOptions{})
+	if err != nil {
+		if !errors.IsAlreadyExists(err) {
+			return fmt.Errorf("failed to create Deployment: %v", err)
+		}
+		fmt.Printf("Deployment %s already exists in Namespace %s\n", config.DeploymentName, config.NameSpace)
+	} else {
+		fmt.Printf("Deployment %s created in Namespace %s\n", config.DeploymentName, config.NameSpace)
+	}
+
+	return nil
+}
+
+// createService 鍒涘缓鎸囧畾鐨� Service
+func (c *SrmCreate) CreateService(config Config) error {
+	fmt.Println("\033[1;37;40mCreating Service:", config.ServiceName, "\033[0m")
+
+	service := &apiv1.Service{
+		ObjectMeta: metav1.ObjectMeta{
+			Name: config.ServiceName,
+		},
+		Spec: apiv1.ServiceSpec{
+			Selector: map[string]string{
+				"cid": c.GetCid(config),
+			},
+			Type: apiv1.ServiceTypeNodePort,
+			Ports: []apiv1.ServicePort{
+				{
+					Name:       "http",
+					Protocol:   apiv1.ProtocolTCP,
+					Port:       port,                      // 闆嗙兢鍐呴儴璁块棶绔彛
+					TargetPort: intstr.FromInt(int(port)), // 瀹瑰櫒瀵瑰绔彛
+					NodePort:   config.HttpPort,           // 澶栭儴璁块棶绔彛
+				},
+			},
+			SessionAffinity: apiv1.ServiceAffinityClientIP,
+		},
+	}
+
+	_, err := config.Client.CoreV1().Services(config.NameSpace).Create(context.TODO(), service, metav1.CreateOptions{})
+
+	if err != nil {
+		if !errors.IsAlreadyExists(err) {
+			return fmt.Errorf("failed to create Service: %v", err)
+		}
+		log.Printf("Service %s already exists in Namespace %s\n", config.ServiceName, config.NameSpace)
+	} else {
+		log.Printf("Service %s created in Namespace %s\n", config.ServiceName, config.NameSpace)
+	}
+
+	return nil
+}
+
+func (c *SrmCreate) GetCid(config Config) string {
+	return fmt.Sprintf("%v-%v", config.NameSpace, "srm")
+}

--
Gitblit v1.8.0