mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	配置变更的时候自动同步,不再需要手工点击同步
This commit is contained in:
		
							
								
								
									
										8
									
								
								internal/events/events.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								internal/events/events.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					package events
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Event = string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						EventStart Event = "start" // start loading
 | 
				
			||||||
 | 
						EventQuit  Event = "quit"  // quit node gracefully
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										27
									
								
								internal/events/utils.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								internal/events/utils.go
									
									
									
									
									
										Normal file
									
								
							@@ -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()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										16
									
								
								internal/events/utils_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								internal/events/utils_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -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")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -3,6 +3,7 @@ package nodes
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAdmin/internal/configs"
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/configs"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAdmin/internal/errors"
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/errors"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/events"
 | 
				
			||||||
	"github.com/iwind/TeaGo"
 | 
						"github.com/iwind/TeaGo"
 | 
				
			||||||
	"github.com/iwind/TeaGo/Tea"
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
	"github.com/iwind/TeaGo/logs"
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
@@ -50,6 +51,9 @@ func (this *AdminNode) Run() {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 触发事件
 | 
				
			||||||
 | 
						events.Notify(events.EventStart)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 启动API节点
 | 
						// 启动API节点
 | 
				
			||||||
	this.startAPINode()
 | 
						this.startAPINode()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										65
									
								
								internal/tasks/task_sync_cluster.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								internal/tasks/task_sync_cluster.go
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								internal/tasks/task_sync_cluster_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								internal/tasks/task_sync_cluster_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -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")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -86,7 +86,7 @@ func (this *UserMustAuth) BeforeAction(actionPtr actions.ActionWrapper, paramNam
 | 
				
			|||||||
			"icon": "clone outsize",
 | 
								"icon": "clone outsize",
 | 
				
			||||||
			"subItems": []maps.Map{
 | 
								"subItems": []maps.Map{
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					"name": "通用组件",
 | 
										"name": "通用设置",
 | 
				
			||||||
					"url":  "/servers/components",
 | 
										"url":  "/servers/components",
 | 
				
			||||||
					"code": "components",
 | 
										"code": "components",
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package web
 | 
					package web
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/tasks"
 | 
				
			||||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/about"
 | 
						_ "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"
 | 
				
			||||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/api/node"
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/api/node"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,6 @@
 | 
				
			|||||||
		</a>
 | 
							</a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <div class="right menu">
 | 
					        <div class="right menu">
 | 
				
			||||||
			<a href="" class="item" v-if="globalChangedClusters.length > 0" @click.prevent="syncClustersConfigs()"><span class="blink"><i class="icon refresh"></i></span>{{globalChangedClusters.length}}个集群服务变更</a>
 | 
					 | 
				
			||||||
			<a href="/messages" class="item" :class="{active:teaMenu == 'message'}"><span :class="{'blink':globalMessageBadge > 0}"><i class="icon bell"></i>消息({{globalMessageBadge}}) </span></a>
 | 
								<a href="/messages" class="item" :class="{active:teaMenu == 'message'}"><span :class="{'blink':globalMessageBadge > 0}"><i class="icon bell"></i>消息({{globalMessageBadge}}) </span></a>
 | 
				
			||||||
			<a href="/settings/profile" class="item"  :class="{active: teaMenu == 'settings'}">
 | 
								<a href="/settings/profile" class="item"  :class="{active: teaMenu == 'settings'}">
 | 
				
			||||||
				<i class="icon user" v-if="teaUserAvatar.length == 0"></i>
 | 
									<i class="icon user" v-if="teaUserAvatar.length == 0"></i>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,5 @@
 | 
				
			|||||||
Tea.context(function () {
 | 
					Tea.context(function () {
 | 
				
			||||||
	this.moreOptionsVisible = false
 | 
						this.moreOptionsVisible = false
 | 
				
			||||||
	this.globalChangedClusters = []
 | 
					 | 
				
			||||||
	this.globalMessageBadge = 0
 | 
						this.globalMessageBadge = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (typeof this.leftMenuItemIsDisabled == "undefined") {
 | 
						if (typeof this.leftMenuItemIsDisabled == "undefined") {
 | 
				
			||||||
@@ -12,9 +11,6 @@ Tea.context(function () {
 | 
				
			|||||||
			this.$refs.focus.focus()
 | 
								this.$refs.focus.focus()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// 检查变更
 | 
					 | 
				
			||||||
		this.checkClusterChanges()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// 检查消息
 | 
							// 检查消息
 | 
				
			||||||
		this.checkMessages()
 | 
							this.checkMessages()
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
@@ -37,32 +33,6 @@ Tea.context(function () {
 | 
				
			|||||||
		menu.isActive = !menu.isActive
 | 
							menu.isActive = !menu.isActive
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * 检查集群变更
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	this.checkClusterChanges = function () {
 | 
					 | 
				
			||||||
		this.$post("/clusters/checkChange")
 | 
					 | 
				
			||||||
			.params({
 | 
					 | 
				
			||||||
				isNotifying: (this.globalChangedClusters.length > 0) ? 1 : 0
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
			.timeout(60)
 | 
					 | 
				
			||||||
			.success(function (resp) {
 | 
					 | 
				
			||||||
				this.globalChangedClusters = resp.data.clusters;
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
			.fail(function () {
 | 
					 | 
				
			||||||
				this.globalChangedClusters = [];
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
			.done(function () {
 | 
					 | 
				
			||||||
				let delay = 3000
 | 
					 | 
				
			||||||
				if (this.globalChangedClusters.length > 0) {
 | 
					 | 
				
			||||||
					delay = 30000
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				this.$delay(function () {
 | 
					 | 
				
			||||||
					this.checkClusterChanges()
 | 
					 | 
				
			||||||
				}, delay)
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * 检查消息
 | 
						 * 检查消息
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
@@ -83,18 +53,6 @@ Tea.context(function () {
 | 
				
			|||||||
			})
 | 
								})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * 同步集群配置
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	this.syncClustersConfigs = function () {
 | 
					 | 
				
			||||||
		teaweb.confirm("html:有若干个集群配置已变更!<br/>确定要同步配置到边缘节点吗?", function () {
 | 
					 | 
				
			||||||
			this.$post("/clusters/sync")
 | 
					 | 
				
			||||||
				.success(function () {
 | 
					 | 
				
			||||||
					this.globalChangedClusters = [];
 | 
					 | 
				
			||||||
				})
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * 底部伸展框
 | 
						 * 底部伸展框
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user