diff --git a/common/model/model.go b/common/model/model.go index ad72b17..c5b9d64 100644 --- a/common/model/model.go +++ b/common/model/model.go @@ -31,10 +31,11 @@ type BaseStatus struct { // BizOperationResponse represents the response from a business operation type BizOperationResponse struct { - Command string `json:"command"` // Operation command executed - BizName string `json:"bizName"` // ClusterName of the business - BizVersion string `json:"bizVersion"` // Version of the business - Response ark_service.ArkResponse[ark.ArkResponseData] `json:"response"` // Response from ark service + Command string `json:"command"` // Operation command executed + BizName string `json:"bizName"` // ClusterName of the business + BizVersion string `json:"bizVersion"` // Version of the business + BizModelVersion string `json:"bizModelVersion"` // Pod key (podKey) used for aligning module state with Kubernetes pod state to prevent old uninstall requests from removing new modules. Format: {bizName}-{template}-{randomString} (e.g., biz1-web-single-host-786dfc476f-x2hwk) + Response ark_service.ArkResponse[ark.ArkResponseData] `json:"response"` // Response from ark service } type BatchInstallBizResponse struct { diff --git a/go.mod b/go.mod index ee405a2..2176bdc 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,8 @@ require ( github.com/go-logr/logr v1.4.2 github.com/go-resty/resty/v2 v2.11.0 github.com/google/uuid v1.6.0 - github.com/koupleless/arkctl v0.2.4-0.20250106035535-5ed5cb871995 - github.com/koupleless/virtual-kubelet v0.3.10 + github.com/koupleless/arkctl v0.2.5 + github.com/koupleless/virtual-kubelet v0.3.11 github.com/onsi/ginkgo/v2 v2.19.0 github.com/onsi/gomega v1.33.1 github.com/sirupsen/logrus v1.9.3 diff --git a/go.sum b/go.sum index 8ec6b1f..0339361 100644 --- a/go.sum +++ b/go.sum @@ -100,10 +100,10 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/koupleless/arkctl v0.2.4-0.20250106035535-5ed5cb871995 h1:dkBdI/WczkOJ4LaoZteX3uz8r+WKxBqYQjpzwyVDvyw= -github.com/koupleless/arkctl v0.2.4-0.20250106035535-5ed5cb871995/go.mod h1:nbnAiPEv7x/ZDQ+QsjFWkqwxMDofGmqnFPHa3XpXHyE= -github.com/koupleless/virtual-kubelet v0.3.10 h1:2hCYTHrsfQRe8jTwYGvFz+Ag4kpEn2wkcxfT4tLpoPg= -github.com/koupleless/virtual-kubelet v0.3.10/go.mod h1:V/RjXRvoSNr55I9KMV+tgtOp6duxxBMcwyDTH04XiX0= +github.com/koupleless/arkctl v0.2.5 h1:gj3bcR/DjT/ycKzr7humewSW8ylmxaaQA+d+Jqi/lic= +github.com/koupleless/arkctl v0.2.5/go.mod h1:nbnAiPEv7x/ZDQ+QsjFWkqwxMDofGmqnFPHa3XpXHyE= +github.com/koupleless/virtual-kubelet v0.3.11 h1:BtzRKH0VkZAzjQ/eTHrJx8ozwiP1m4kHUfXXNPeeZL4= +github.com/koupleless/virtual-kubelet v0.3.11/go.mod h1:aLcqqggbasS6ZkYz0svcvhb+AQrEGw7nyPsKfCCF2aU= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= diff --git a/module_tunnels/koupleless_http_tunnel/http_tunnel.go b/module_tunnels/koupleless_http_tunnel/http_tunnel.go index 2368fb1..f7854dc 100644 --- a/module_tunnels/koupleless_http_tunnel/http_tunnel.go +++ b/module_tunnels/koupleless_http_tunnel/http_tunnel.go @@ -325,8 +325,7 @@ func (h *HttpTunnel) QueryAllBizStatusData(nodeName string) error { } // StartBiz starts a container on the node -func (h *HttpTunnel) StartBiz(nodeName, _ string, container *corev1.Container) error { - +func (h *HttpTunnel) StartBiz(nodeName, podKey string, container *corev1.Container) error { nodeID := utils2.ExtractNodeIDFromNodeName(nodeName) h.Lock() baseStatus, ok := h.nodeIdToBaseStatusMap[nodeID] @@ -336,14 +335,16 @@ func (h *HttpTunnel) StartBiz(nodeName, _ string, container *corev1.Container) e } bizModel := utils.TranslateCoreV1ContainerToBizModel(container) - logger := zaplogger.FromContext(h.ctx).WithValues("bizName", bizModel.BizName, "bizVersion", bizModel.BizVersion) + bizModel.BizModelVersion = podKey + logger := zaplogger.FromContext(h.ctx).WithValues("bizName", bizModel.BizName, "bizVersion", bizModel.BizVersion, "bizModelVersion", bizModel.BizModelVersion) logger.Info("InstallModule") // install current version bizOperationResponse := model.BizOperationResponse{ - Command: model.CommandInstallBiz, - BizName: bizModel.BizName, - BizVersion: bizModel.BizVersion, + Command: model.CommandInstallBiz, + BizName: bizModel.BizName, + BizVersion: bizModel.BizVersion, + BizModelVersion: podKey, } response, err := h.arkService.InstallBiz(h.ctx, ark_service.InstallBizRequest{ @@ -358,7 +359,7 @@ func (h *HttpTunnel) StartBiz(nodeName, _ string, container *corev1.Container) e } // StopBiz shuts down a container on the node -func (h *HttpTunnel) StopBiz(nodeName, _ string, container *corev1.Container) error { +func (h *HttpTunnel) StopBiz(nodeName, podKey string, container *corev1.Container) error { nodeID := utils2.ExtractNodeIDFromNodeName(nodeName) h.Lock() baseStatus, ok := h.nodeIdToBaseStatusMap[nodeID] @@ -368,13 +369,15 @@ func (h *HttpTunnel) StopBiz(nodeName, _ string, container *corev1.Container) er } bizModel := utils.TranslateCoreV1ContainerToBizModel(container) - logger := zaplogger.FromContext(h.ctx).WithValues("bizName", bizModel.BizName, "bizVersion", bizModel.BizVersion) + bizModel.BizModelVersion = podKey + logger := zaplogger.FromContext(h.ctx).WithValues("bizName", bizModel.BizName, "bizVersion", bizModel.BizVersion, "bizModelVersion", bizModel.BizModelVersion) logger.Info("UninstallModule") bizOperationResponse := model.BizOperationResponse{ - Command: model.CommandUnInstallBiz, - BizName: bizModel.BizName, - BizVersion: bizModel.BizVersion, + Command: model.CommandUnInstallBiz, + BizName: bizModel.BizName, + BizVersion: bizModel.BizVersion, + BizModelVersion: podKey, } response, err := h.arkService.UninstallBiz(h.ctx, ark_service.UninstallBizRequest{ diff --git a/module_tunnels/koupleless_mqtt_tunnel/mqtt_tunnel.go b/module_tunnels/koupleless_mqtt_tunnel/mqtt_tunnel.go index 979775d..02a85de 100644 --- a/module_tunnels/koupleless_mqtt_tunnel/mqtt_tunnel.go +++ b/module_tunnels/koupleless_mqtt_tunnel/mqtt_tunnel.go @@ -5,12 +5,17 @@ import ( "encoding/json" "errors" "fmt" + "strings" + "sync" + "time" + paho "github.com/eclipse/paho.mqtt.golang" "github.com/koupleless/arkctl/v1/service/ark" "github.com/koupleless/module_controller/common/model" "github.com/koupleless/module_controller/common/utils" "github.com/koupleless/module_controller/common/zaplogger" "github.com/koupleless/module_controller/controller/module_deployment_controller" + "github.com/koupleless/module_controller/module_tunnels/koupleless_http_tunnel/ark_service" "github.com/koupleless/module_controller/module_tunnels/koupleless_mqtt_tunnel/mqtt" utils2 "github.com/koupleless/virtual-kubelet/common/utils" vkModel "github.com/koupleless/virtual-kubelet/model" @@ -18,9 +23,6 @@ import ( "github.com/virtual-kubelet/virtual-kubelet/log" corev1 "k8s.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/client" - "strings" - "sync" - "time" ) var _ tunnel.Tunnel = &MqttTunnel{} @@ -429,19 +431,25 @@ func (mqttTunnel *MqttTunnel) QueryAllBizStatusData(nodeName string) error { return mqttTunnel.mqttClient.Pub(utils.FormatArkletCommandTopic(mqttTunnel.env, nodeID, model.CommandQueryAllBiz), mqtt.Qos0, []byte("{}")) } -func (mqttTunnel *MqttTunnel) StartBiz(nodeName, _ string, container *corev1.Container) error { +func (mqttTunnel *MqttTunnel) StartBiz(nodeName, podKey string, container *corev1.Container) error { bizModel := utils.TranslateCoreV1ContainerToBizModel(container) - zlogger := zaplogger.FromContext(mqttTunnel.ctx).WithValues("bizName", bizModel.BizName, "bizVersion", bizModel.BizVersion) + bizModel.BizModelVersion = podKey + zlogger := zaplogger.FromContext(mqttTunnel.ctx).WithValues("bizName", bizModel.BizName, "bizVersion", bizModel.BizVersion, "bizModelVersion", bizModel.BizModelVersion) zlogger.Info("InstallModule") - installBizRequestBytes, _ := json.Marshal(bizModel) + installBizRequestBytes, _ := json.Marshal(ark_service.InstallBizRequest{ + BizModel: bizModel, + }) nodeID := utils2.ExtractNodeIDFromNodeName(nodeName) return mqttTunnel.mqttClient.Pub(utils.FormatArkletCommandTopic(mqttTunnel.env, nodeID, model.CommandInstallBiz), mqtt.Qos0, installBizRequestBytes) } -func (mqttTunnel *MqttTunnel) StopBiz(nodeName, _ string, container *corev1.Container) error { +func (mqttTunnel *MqttTunnel) StopBiz(nodeName, podKey string, container *corev1.Container) error { bizModel := utils.TranslateCoreV1ContainerToBizModel(container) - unInstallBizRequestBytes, _ := json.Marshal(bizModel) - zlogger := zaplogger.FromContext(mqttTunnel.ctx).WithValues("bizName", bizModel.BizName, "bizVersion", bizModel.BizVersion) + bizModel.BizModelVersion = podKey + unInstallBizRequestBytes, _ := json.Marshal(ark_service.UninstallBizRequest{ + BizModel: bizModel, + }) + zlogger := zaplogger.FromContext(mqttTunnel.ctx).WithValues("bizName", bizModel.BizName, "bizVersion", bizModel.BizVersion, "bizModelVersion", bizModel.BizModelVersion) zlogger.Info("UninstallModule") nodeID := utils2.ExtractNodeIDFromNodeName(nodeName) return mqttTunnel.mqttClient.Pub(utils.FormatArkletCommandTopic(mqttTunnel.env, nodeID, model.CommandUnInstallBiz), mqtt.Qos0, unInstallBizRequestBytes)