diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index db45ac7f..abf30325 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -82,6 +82,10 @@ func (this *RPCClient) NodeClusterRPC() pb.NodeClusterServiceClient { return pb.NewNodeClusterServiceClient(this.pickConn()) } +func (this *RPCClient) NodeGroupRPC() pb.NodeGroupServiceClient { + return pb.NewNodeGroupServiceClient(this.pickConn()) +} + func (this *RPCClient) NodeIPAddressRPC() pb.NodeIPAddressServiceClient { return pb.NewNodeIPAddressServiceClient(this.pickConn()) } diff --git a/internal/web/actions/default/clusters/cluster/groups/createPopup.go b/internal/web/actions/default/clusters/cluster/groups/createPopup.go new file mode 100644 index 00000000..bb5bf73e --- /dev/null +++ b/internal/web/actions/default/clusters/cluster/groups/createPopup.go @@ -0,0 +1,44 @@ +package groups + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" +) + +type CreatePopupAction struct { + actionutils.ParentAction +} + +func (this *CreatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreatePopupAction) RunGet(params struct{}) { + this.Show() +} + +func (this *CreatePopupAction) RunPost(params struct { + ClusterId int64 + Name string + + Must *actions.Must +}) { + if params.ClusterId <= 0 { + this.Fail("请选择集群") + } + + params.Must. + Field("name", params.Name). + Require("请输入分组名称") + _, err := this.RPC().NodeGroupRPC().CreateNodeGroup(this.AdminContext(), &pb.CreateNodeGroupRequest{ + ClusterId: params.ClusterId, + Name: params.Name, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/clusters/cluster/groups/delete.go b/internal/web/actions/default/clusters/cluster/groups/delete.go new file mode 100644 index 00000000..3fd04763 --- /dev/null +++ b/internal/web/actions/default/clusters/cluster/groups/delete.go @@ -0,0 +1,33 @@ +package groups + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type DeleteAction struct { + actionutils.ParentAction +} + +func (this *DeleteAction) RunPost(params struct { + GroupId int64 +}) { + // 检查是否正在使用 + countResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithGroupId(this.AdminContext(), &pb.CountAllEnabledNodesWithGroupIdRequest{GroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + + if countResp.Count > 0 { + this.Fail("此分组正在被使用不能删除,请修改节点后再删除") + } + + _, err = this.RPC().NodeGroupRPC().DeleteNodeGroup(this.AdminContext(), &pb.DeleteNodeGroupRequest{GroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/clusters/cluster/groups/index.go b/internal/web/actions/default/clusters/cluster/groups/index.go new file mode 100644 index 00000000..2e54ce78 --- /dev/null +++ b/internal/web/actions/default/clusters/cluster/groups/index.go @@ -0,0 +1,47 @@ +package groups + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "node", "group") + this.SecondMenu("nodes") +} + +func (this *IndexAction) RunGet(params struct { + ClusterId int64 +}) { + groupsResp, err := this.RPC().NodeGroupRPC().FindAllEnabledNodeGroupsWithClusterId(this.AdminContext(), &pb.FindAllEnabledNodeGroupsWithClusterIdRequest{ + ClusterId: params.ClusterId, + }) + if err != nil { + this.ErrorPage(err) + return + } + + groupMaps := []maps.Map{} + for _, group := range groupsResp.Groups { + countResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithGroupId(this.AdminContext(), &pb.CountAllEnabledNodesWithGroupIdRequest{GroupId: group.Id}) + if err != nil { + this.ErrorPage(err) + return + } + countNodes := countResp.Count + + groupMaps = append(groupMaps, maps.Map{ + "id": group.Id, + "name": group.Name, + "countNodes": countNodes, + }) + } + this.Data["groups"] = groupMaps + + this.Show() +} diff --git a/internal/web/actions/default/clusters/cluster/groups/sort.go b/internal/web/actions/default/clusters/cluster/groups/sort.go new file mode 100644 index 00000000..b673f81d --- /dev/null +++ b/internal/web/actions/default/clusters/cluster/groups/sort.go @@ -0,0 +1,22 @@ +package groups + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type SortAction struct { + actionutils.ParentAction +} + +func (this *SortAction) RunPost(params struct { + GroupIds []int64 +}) { + _, err := this.RPC().NodeGroupRPC().UpdateNodeGroupOrders(this.AdminContext(), &pb.UpdateNodeGroupOrdersRequest{GroupIds: params.GroupIds}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/clusters/cluster/groups/updatePopup.go b/internal/web/actions/default/clusters/cluster/groups/updatePopup.go new file mode 100644 index 00000000..4a48c172 --- /dev/null +++ b/internal/web/actions/default/clusters/cluster/groups/updatePopup.go @@ -0,0 +1,59 @@ +package groups + +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 UpdatePopupAction struct { + actionutils.ParentAction +} + +func (this *UpdatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *UpdatePopupAction) RunGet(params struct { + GroupId int64 +}) { + groupResp, err := this.RPC().NodeGroupRPC().FindEnabledNodeGroup(this.AdminContext(), &pb.FindEnabledNodeGroupRequest{GroupId: params.GroupId}) + if err != nil { + this.ErrorPage(err) + return + } + group := groupResp.Group + if group == nil { + this.NotFound("nodeGroup", params.GroupId) + return + } + + this.Data["group"] = maps.Map{ + "id": group.Id, + "name": group.Name, + } + + this.Show() +} + +func (this *UpdatePopupAction) RunPost(params struct { + GroupId int64 + Name string + + Must *actions.Must +}) { + params.Must. + Field("name", params.Name). + Require("请输入分组名称") + _, err := this.RPC().NodeGroupRPC().UpdateNodeGroup(this.AdminContext(), &pb.UpdateNodeGroupRequest{ + GroupId: params.GroupId, + Name: params.Name, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/clusters/cluster/index.go b/internal/web/actions/default/clusters/cluster/index.go index 8d806bd7..9a0b2f3b 100644 --- a/internal/web/actions/default/clusters/cluster/index.go +++ b/internal/web/actions/default/clusters/cluster/index.go @@ -25,14 +25,17 @@ func (this *IndexAction) RunGet(params struct { ClusterId int64 InstalledState int ActiveState int + Keyword string }) { this.Data["installState"] = params.InstalledState this.Data["activeState"] = params.ActiveState + this.Data["keyword"] = params.Keyword countResp, err := this.RPC().NodeRPC().CountAllEnabledNodesMatch(this.AdminContext(), &pb.CountAllEnabledNodesMatchRequest{ ClusterId: params.ClusterId, InstallState: types.Int32(params.InstalledState), ActiveState: types.Int32(params.ActiveState), + Keyword: params.Keyword, }) if err != nil { this.ErrorPage(err) @@ -48,6 +51,7 @@ func (this *IndexAction) RunGet(params struct { ClusterId: params.ClusterId, InstallState: types.Int32(params.InstalledState), ActiveState: types.Int32(params.ActiveState), + Keyword: params.Keyword, }) nodeMaps := []maps.Map{} for _, node := range nodesResp.Nodes { diff --git a/internal/web/actions/default/clusters/cluster/init.go b/internal/web/actions/default/clusters/cluster/init.go index a8a8c56d..7465317e 100644 --- a/internal/web/actions/default/clusters/cluster/init.go +++ b/internal/web/actions/default/clusters/cluster/init.go @@ -1,6 +1,7 @@ package cluster import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/groups" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/node" clusters "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/clusterutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" @@ -34,6 +35,14 @@ func init() { Get("/node/logs", new(node.LogsAction)). Post("/node/start", new(node.StartAction)). Post("/node/stop", new(node.StopAction)). + + // 分组相关 + Get("/groups", new(groups.IndexAction)). + GetPost("/groups/createPopup", new(groups.CreatePopupAction)). + GetPost("/groups/updatePopup", new(groups.UpdatePopupAction)). + Post("/groups/delete", new(groups.DeleteAction)). + Post("/groups/sort", new(groups.SortAction)). + EndAll() }) } diff --git a/internal/web/actions/default/clusters/cluster/upgradeRemote.go b/internal/web/actions/default/clusters/cluster/upgradeRemote.go index 6a0574b3..c7d58c04 100644 --- a/internal/web/actions/default/clusters/cluster/upgradeRemote.go +++ b/internal/web/actions/default/clusters/cluster/upgradeRemote.go @@ -13,7 +13,8 @@ type UpgradeRemoteAction struct { } func (this *UpgradeRemoteAction) Init() { - this.Nav("", "", "") + this.Nav("", "node", "install") + this.SecondMenu("nodes") } func (this *UpgradeRemoteAction) RunGet(params struct { diff --git a/web/views/@default/clusters/cluster/@menu.html b/web/views/@default/clusters/cluster/@menu.html index fdbf1e34..76659ff6 100644 --- a/web/views/@default/clusters/cluster/@menu.html +++ b/web/views/@default/clusters/cluster/@menu.html @@ -2,4 +2,5 @@ 节点列表 创建节点 安装升级 + 节点分组 \ No newline at end of file diff --git a/web/views/@default/clusters/cluster/groups/createPopup.html b/web/views/@default/clusters/cluster/groups/createPopup.html new file mode 100644 index 00000000..64a2c5c7 --- /dev/null +++ b/web/views/@default/clusters/cluster/groups/createPopup.html @@ -0,0 +1,15 @@ +{$layout "layout_popup"} + +

创建分组

+
+ + + + + + +
分组名称 * + +
+ +
\ No newline at end of file diff --git a/web/views/@default/clusters/cluster/groups/createPopup.js b/web/views/@default/clusters/cluster/groups/createPopup.js new file mode 100644 index 00000000..c8fe9515 --- /dev/null +++ b/web/views/@default/clusters/cluster/groups/createPopup.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyPopup +}) \ No newline at end of file diff --git a/web/views/@default/clusters/cluster/groups/index.html b/web/views/@default/clusters/cluster/groups/index.html new file mode 100644 index 00000000..5e1b7d60 --- /dev/null +++ b/web/views/@default/clusters/cluster/groups/index.html @@ -0,0 +1,36 @@ +{$layout} +{$template "../menu"} + + + [创建分组] + + +

暂时还没有分组。

+
+
+ + + + + + + + + + + + + + + + + +
分组名称节点数操作
{{group.name}} + {{group.countNodes}} + 0 + + 修改   删除 +
+
+ +

可以拖动左侧的排序。

\ No newline at end of file diff --git a/web/views/@default/clusters/cluster/groups/index.js b/web/views/@default/clusters/cluster/groups/index.js new file mode 100644 index 00000000..1da619f8 --- /dev/null +++ b/web/views/@default/clusters/cluster/groups/index.js @@ -0,0 +1,53 @@ +Tea.context(function () { + this.$delay(function () { + let that = this + sortTable(function () { + let groupIds = [] + document.querySelectorAll("*[data-group-id]").forEach(function (element) { + groupIds.push(element.getAttribute("data-group-id")) + }) + that.$post("/clusters/cluster/groups/sort") + .params({ + groupIds: groupIds + }) + .success(function () { + teaweb.successToast("保存成功") + }) + }) + }) + + this.createGroup = function () { + teaweb.popup("/clusters/cluster/groups/createPopup?clusterId=" + this.clusterId, { + callback: function () { + teaweb.success("保存成功", function () { + teaweb.reload() + }) + } + }) + } + + this.updateGroup = function (groupId) { + teaweb.popup("/clusters/cluster/groups/updatePopup?groupId=" + groupId, { + callback: function () { + teaweb.success("保存成功", function () { + teaweb.reload() + }) + } + }) + } + + this.deleteGroup = function (groupId) { + let that = this + teaweb.confirm("确定要删除这个分组吗?", function () { + that.$post("/clusters/cluster/groups/delete") + .params({ + groupId: groupId + }) + .success(function () { + teaweb.success("删除成功", function () { + teaweb.reload() + }) + }) + }) + } +}) \ No newline at end of file diff --git a/web/views/@default/clusters/cluster/groups/updatePopup.html b/web/views/@default/clusters/cluster/groups/updatePopup.html new file mode 100644 index 00000000..8286cbb4 --- /dev/null +++ b/web/views/@default/clusters/cluster/groups/updatePopup.html @@ -0,0 +1,15 @@ +{$layout "layout_popup"} + +

修改分组

+
+ + + + + + +
分组名称 * + +
+ +
\ No newline at end of file diff --git a/web/views/@default/clusters/cluster/groups/updatePopup.js b/web/views/@default/clusters/cluster/groups/updatePopup.js new file mode 100644 index 00000000..c8fe9515 --- /dev/null +++ b/web/views/@default/clusters/cluster/groups/updatePopup.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyPopup +}) \ No newline at end of file diff --git a/web/views/@default/clusters/cluster/index.html b/web/views/@default/clusters/cluster/index.html index 8abda889..d21bdb82 100644 --- a/web/views/@default/clusters/cluster/index.html +++ b/web/views/@default/clusters/cluster/index.html @@ -25,6 +25,9 @@ +
+ +
diff --git a/web/views/@default/clusters/cluster/node/install.html b/web/views/@default/clusters/cluster/node/install.html index d132693f..c078a87b 100644 --- a/web/views/@default/clusters/cluster/node/install.html +++ b/web/views/@default/clusters/cluster/node/install.html @@ -10,7 +10,7 @@
-

方法1:自动安装

+

方法1:通过SSH自动安装