From a09e8be6e914184da528f5fc49f3bd23b34bf5e6 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Wed, 18 Nov 2020 10:07:29 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8F=98=E6=9B=B4=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=E8=87=AA=E5=8A=A8=E5=90=8C=E6=AD=A5=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E9=9C=80=E8=A6=81=E6=89=8B=E5=B7=A5=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/events/events.go | 8 +++ internal/events/utils.go | 27 ++++++++++ internal/events/utils_test.go | 16 ++++++ internal/nodes/admin_node.go | 4 ++ internal/tasks/task_sync_cluster.go | 65 ++++++++++++++++++++++++ internal/tasks/task_sync_cluster_test.go | 12 +++++ internal/web/helpers/user_must_auth.go | 2 +- internal/web/import.go | 1 + web/views/@default/@layout.html | 1 - web/views/@default/@layout.js | 42 --------------- 10 files changed, 134 insertions(+), 44 deletions(-) create mode 100644 internal/events/events.go create mode 100644 internal/events/utils.go create mode 100644 internal/events/utils_test.go create mode 100644 internal/tasks/task_sync_cluster.go create mode 100644 internal/tasks/task_sync_cluster_test.go diff --git a/internal/events/events.go b/internal/events/events.go new file mode 100644 index 00000000..2b2f827e --- /dev/null +++ b/internal/events/events.go @@ -0,0 +1,8 @@ +package events + +type Event = string + +const ( + EventStart Event = "start" // start loading + EventQuit Event = "quit" // quit node gracefully +) diff --git a/internal/events/utils.go b/internal/events/utils.go new file mode 100644 index 00000000..8c45e95c --- /dev/null +++ b/internal/events/utils.go @@ -0,0 +1,27 @@ +package events + +import "sync" + +var eventsMap = map[string][]func(){} // event => []callbacks +var locker = sync.Mutex{} + +// 增加事件回调 +func On(event string, callback func()) { + locker.Lock() + defer locker.Unlock() + + callbacks, _ := eventsMap[event] + callbacks = append(callbacks, callback) + eventsMap[event] = callbacks +} + +// 通知事件 +func Notify(event string) { + locker.Lock() + callbacks, _ := eventsMap[event] + locker.Unlock() + + for _, callback := range callbacks { + callback() + } +} diff --git a/internal/events/utils_test.go b/internal/events/utils_test.go new file mode 100644 index 00000000..4cb41e36 --- /dev/null +++ b/internal/events/utils_test.go @@ -0,0 +1,16 @@ +package events + +import "testing" + +func TestOn(t *testing.T) { + On("hello", func() { + t.Log("world") + }) + On("hello", func() { + t.Log("world2") + }) + On("hello2", func() { + t.Log("world2") + }) + Notify("hello") +} diff --git a/internal/nodes/admin_node.go b/internal/nodes/admin_node.go index 132ec31c..854c5946 100644 --- a/internal/nodes/admin_node.go +++ b/internal/nodes/admin_node.go @@ -3,6 +3,7 @@ package nodes import ( "github.com/TeaOSLab/EdgeAdmin/internal/configs" "github.com/TeaOSLab/EdgeAdmin/internal/errors" + "github.com/TeaOSLab/EdgeAdmin/internal/events" "github.com/iwind/TeaGo" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/logs" @@ -50,6 +51,9 @@ func (this *AdminNode) Run() { } }() + // 触发事件 + events.Notify(events.EventStart) + // 启动API节点 this.startAPINode() diff --git a/internal/tasks/task_sync_cluster.go b/internal/tasks/task_sync_cluster.go new file mode 100644 index 00000000..69fdb680 --- /dev/null +++ b/internal/tasks/task_sync_cluster.go @@ -0,0 +1,65 @@ +package tasks + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/events" + "github.com/TeaOSLab/EdgeAdmin/internal/rpc" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/nodes/nodeutils" + "github.com/TeaOSLab/EdgeCommon/pkg/messageconfigs" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + _ "github.com/iwind/TeaGo/bootstrap" + "github.com/iwind/TeaGo/logs" + "time" +) + +func init() { + events.On(events.EventStart, func() { + task := NewSyncClusterTask() + go task.Start() + }) +} + +// 自动同步集群任务 +type SyncClusterTask struct { +} + +func NewSyncClusterTask() *SyncClusterTask { + return &SyncClusterTask{} +} + +func (this *SyncClusterTask) Start() { + ticker := time.NewTicker(3 * time.Second) + for range ticker.C { + err := this.loop() + if err != nil { + logs.Println("[TASK][SYNC_CLUSTER]" + err.Error()) + } + } +} + +func (this *SyncClusterTask) loop() error { + rpcClient, err := rpc.SharedRPC() + if err != nil { + return err + } + ctx := rpcClient.Context(1) + resp, err := rpcClient.NodeClusterRPC().FindAllChangedNodeClusters(ctx, &pb.FindAllChangedNodeClustersRequest{}) + if err != nil { + return err + } + + for _, cluster := range resp.Clusters { + _, err := rpcClient.NodeRPC().SyncNodesVersionWithCluster(ctx, &pb.SyncNodesVersionWithClusterRequest{ + ClusterId: cluster.Id, + }) + if err != nil { + return err + } + + // 发送通知 + _, err = nodeutils.SendMessageToCluster(ctx, cluster.Id, messageconfigs.MessageCodeConfigChanged, &messageconfigs.ConfigChangedMessage{}, 10) + if err != nil { + return err + } + } + return nil +} diff --git a/internal/tasks/task_sync_cluster_test.go b/internal/tasks/task_sync_cluster_test.go new file mode 100644 index 00000000..5881337c --- /dev/null +++ b/internal/tasks/task_sync_cluster_test.go @@ -0,0 +1,12 @@ +package tasks + +import "testing" + +func TestSyncClusterTask_loop(t *testing.T) { + task := NewSyncClusterTask() + err := task.loop() + if err != nil { + t.Fatal(err) + } + t.Log("ok") +} diff --git a/internal/web/helpers/user_must_auth.go b/internal/web/helpers/user_must_auth.go index d2db6bb1..fa528a95 100644 --- a/internal/web/helpers/user_must_auth.go +++ b/internal/web/helpers/user_must_auth.go @@ -86,7 +86,7 @@ func (this *UserMustAuth) BeforeAction(actionPtr actions.ActionWrapper, paramNam "icon": "clone outsize", "subItems": []maps.Map{ { - "name": "通用组件", + "name": "通用设置", "url": "/servers/components", "code": "components", }, diff --git a/internal/web/import.go b/internal/web/import.go index c963a78a..3b98fb4c 100644 --- a/internal/web/import.go +++ b/internal/web/import.go @@ -1,6 +1,7 @@ package web import ( + _ "github.com/TeaOSLab/EdgeAdmin/internal/tasks" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/about" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/api" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/api/node" diff --git a/web/views/@default/@layout.html b/web/views/@default/@layout.html index f8d72a0b..0d0089d0 100644 --- a/web/views/@default/@layout.html +++ b/web/views/@default/@layout.html @@ -27,7 +27,6 @@