diff --git a/internal/web/actions/default/clusters/regions/index.go b/internal/web/actions/default/clusters/regions/index.go index 976f56b7..94c87e98 100644 --- a/internal/web/actions/default/clusters/regions/index.go +++ b/internal/web/actions/default/clusters/regions/index.go @@ -11,7 +11,7 @@ type IndexAction struct { } func (this *IndexAction) Init() { - this.Nav("", "", "region") + this.Nav("", "", "index") } func (this *IndexAction) RunGet(params struct{}) { @@ -20,7 +20,7 @@ func (this *IndexAction) RunGet(params struct{}) { this.ErrorPage(err) return } - regionMaps := []maps.Map{} + var regionMaps = []maps.Map{} for _, region := range regionsResp.NodeRegions { countNodesResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithNodeRegionId(this.AdminContext(), &pb.CountAllEnabledNodesWithNodeRegionIdRequest{NodeRegionId: region.Id}) if err != nil { diff --git a/internal/web/actions/default/clusters/regions/init.go b/internal/web/actions/default/clusters/regions/init.go index 3408aad4..47ce4ceb 100644 --- a/internal/web/actions/default/clusters/regions/init.go +++ b/internal/web/actions/default/clusters/regions/init.go @@ -18,7 +18,13 @@ func init() { GetPost("/updatePopup", new(UpdatePopupAction)). Post("/delete", new(DeleteAction)). Post("/sort", new(SortAction)). + Get("/nodes", new(NodesAction)). + GetPost("/updateNodeRegionPopup", new(UpdateNodeRegionPopupAction)). + + // GetPost("/selectPopup", new(SelectPopupAction)). + + // EndAll() }) } diff --git a/internal/web/actions/default/clusters/regions/nodes.go b/internal/web/actions/default/clusters/regions/nodes.go new file mode 100644 index 00000000..eee347a9 --- /dev/null +++ b/internal/web/actions/default/clusters/regions/nodes.go @@ -0,0 +1,92 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package regions + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" +) + +type NodesAction struct { + actionutils.ParentAction +} + +func (this *NodesAction) Init() { + this.Nav("", "", "node") +} + +func (this *NodesAction) RunGet(params struct { + RegionId int64 +}) { + this.Data["regionId"] = params.RegionId + + // 所有区域 + regionsResp, err := this.RPC().NodeRegionRPC().FindAllAvailableNodeRegions(this.AdminContext(), &pb.FindAllAvailableNodeRegionsRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + var regionMaps = []maps.Map{} + for _, region := range regionsResp.NodeRegions { + regionMaps = append(regionMaps, maps.Map{ + "id": region.Id, + "name": region.Name, + }) + } + this.Data["regions"] = regionMaps + + // 节点数量 + countResp, err := this.RPC().NodeRPC().CountAllNodeRegionInfo(this.AdminContext(), &pb.CountAllNodeRegionInfoRequest{NodeRegionId: params.RegionId}) + if err != nil { + this.ErrorPage(err) + return + } + var page = this.NewPage(countResp.Count) + this.Data["page"] = page.AsHTML() + + // 节点列表 + var hasNodesWithoutRegion = false + nodesResp, err := this.RPC().NodeRPC().ListNodeRegionInfo(this.AdminContext(), &pb.ListNodeRegionInfoRequest{ + NodeRegionId: params.RegionId, + Offset: page.Offset, + Size: page.Size, + }) + if err != nil { + this.ErrorPage(err) + return + } + var nodeMaps = []maps.Map{} + for _, node := range nodesResp.InfoList { + // region + var regionMap maps.Map + if node.NodeRegion != nil { + regionMap = maps.Map{ + "id": node.NodeRegion.Id, + "name": node.NodeRegion.Name, + } + } else { + hasNodesWithoutRegion = true + } + + // cluster + var clusterMap maps.Map + if node.NodeCluster != nil { + clusterMap = maps.Map{ + "id": node.NodeCluster.Id, + "name": node.NodeCluster.Name, + } + } + + nodeMaps = append(nodeMaps, maps.Map{ + "id": node.Id, + "name": node.Name, + "region": regionMap, + "cluster": clusterMap, + }) + } + this.Data["nodes"] = nodeMaps + this.Data["hasNodesWithoutRegion"] = hasNodesWithoutRegion + + this.Show() +} diff --git a/internal/web/actions/default/clusters/regions/updateNodeRegionPopup.go b/internal/web/actions/default/clusters/regions/updateNodeRegionPopup.go new file mode 100644 index 00000000..38fb9def --- /dev/null +++ b/internal/web/actions/default/clusters/regions/updateNodeRegionPopup.go @@ -0,0 +1,97 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package regions + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/maps" +) + +type UpdateNodeRegionPopupAction struct { + actionutils.ParentAction +} + +func (this *UpdateNodeRegionPopupAction) Init() { + this.Nav("", "", "") +} + +func (this *UpdateNodeRegionPopupAction) RunGet(params struct { + NodeId int64 + RegionId int64 +}) { + // node + nodeResp, err := this.RPC().NodeRPC().FindEnabledNode(this.AdminContext(), &pb.FindEnabledNodeRequest{NodeId: params.NodeId}) + if err != nil { + this.ErrorPage(err) + return + } + var node = nodeResp.Node + if node == nil { + this.NotFound("node", params.NodeId) + return + } + this.Data["node"] = maps.Map{ + "id": node.Id, + "name": node.Name, + } + + // region + this.Data["region"] = maps.Map{ + "id": 0, + "name": "", + } + if params.RegionId > 0 { + regionResp, err := this.RPC().NodeRegionRPC().FindEnabledNodeRegion(this.AdminContext(), &pb.FindEnabledNodeRegionRequest{NodeRegionId: params.RegionId}) + if err != nil { + this.ErrorPage(err) + return + } + var region = regionResp.NodeRegion + if region != nil { + this.Data["region"] = maps.Map{ + "id": region.Id, + "name": region.Name, + } + } + } + + // all regions + regionsResp, err := this.RPC().NodeRegionRPC().FindAllAvailableNodeRegions(this.AdminContext(), &pb.FindAllAvailableNodeRegionsRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + var regionMaps = []maps.Map{} + for _, region := range regionsResp.NodeRegions { + regionMaps = append(regionMaps, maps.Map{ + "id": region.Id, + "name": region.Name, + }) + } + this.Data["regions"] = regionMaps + + this.Show() +} + +func (this *UpdateNodeRegionPopupAction) RunPost(params struct { + NodeId int64 + RegionId int64 + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + defer this.CreateLogInfo("修改节点 %d 区域到 %d", params.RegionId) + + _, err := this.RPC().NodeRPC().UpdateNodeRegionInfo(this.AdminContext(), &pb.UpdateNodeRegionInfoRequest{ + NodeId: params.NodeId, + NodeRegionId: params.RegionId, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/web/views/@default/clusters/regions/@menu.html b/web/views/@default/clusters/regions/@menu.html new file mode 100644 index 00000000..88ee5ed9 --- /dev/null +++ b/web/views/@default/clusters/regions/@menu.html @@ -0,0 +1,4 @@ + + 区域 + 节点 + \ No newline at end of file diff --git a/web/views/@default/clusters/regions/index.html b/web/views/@default/clusters/regions/index.html index 5b43c635..dfdf60d1 100644 --- a/web/views/@default/clusters/regions/index.html +++ b/web/views/@default/clusters/regions/index.html @@ -1,4 +1,5 @@ {$layout} +{$template "menu"} [创建区域] @@ -20,7 +21,9 @@ - {{region.name}} + + {{region.name}} + {{region.description}} - diff --git a/web/views/@default/clusters/regions/nodes.html b/web/views/@default/clusters/regions/nodes.html new file mode 100644 index 00000000..7acd5207 --- /dev/null +++ b/web/views/@default/clusters/regions/nodes.html @@ -0,0 +1,58 @@ +{$layout} +{$template "menu"} + +
+
+
+
+ +
+
+ +   + [清除条件] +
+
+
+ +
+

当前区域下暂时还没有节点。

+
+ +
+
+ + + + + + + + + + + + + + + +
节点集群区域操作
+ {{node.name}} + + {{node.cluster.name}} + - + + {{node.region.name}} + 尚未设置 + + 设置 + 修改 +
+ +

已经将未设置区域的节点排在了表格最前面。

+ + +
\ No newline at end of file diff --git a/web/views/@default/clusters/regions/nodes.js b/web/views/@default/clusters/regions/nodes.js new file mode 100644 index 00000000..69164c4a --- /dev/null +++ b/web/views/@default/clusters/regions/nodes.js @@ -0,0 +1,12 @@ +Tea.context(function () { + this.updateNodeRegion = function (node) { + let nodeId = node.id + let regionId = (node.region ? node.region.id : 0) + + teaweb.popup(Tea.url(".updateNodeRegionPopup", { nodeId: nodeId, regionId: regionId }), { + callback: function () { + teaweb.successRefresh("保存成功") + } + }) + } +}) \ No newline at end of file diff --git a/web/views/@default/clusters/regions/updateNodeRegionPopup.html b/web/views/@default/clusters/regions/updateNodeRegionPopup.html new file mode 100644 index 00000000..68a7654a --- /dev/null +++ b/web/views/@default/clusters/regions/updateNodeRegionPopup.html @@ -0,0 +1,28 @@ +{$layout "layout_popup"} + +

修改节点区域

+

设置节点区域

+ +
+ + + + + + + + + + + + + +
节点{{node.name}}
区域 * + +
+ +
+