diff --git a/internal/web/actions/default/clusters/cluster/createNode.go b/internal/web/actions/default/clusters/cluster/createNode.go index 15f3343a..8d844e14 100644 --- a/internal/web/actions/default/clusters/cluster/createNode.go +++ b/internal/web/actions/default/clusters/cluster/createNode.go @@ -11,7 +11,7 @@ import ( "strconv" ) -// 创建节点 +// CreateNodeAction 创建节点 type CreateNodeAction struct { actionutils.ParentAction } @@ -57,8 +57,10 @@ func (this *CreateNodeAction) RunGet(params struct { } for _, route := range routesResp.Routes { dnsRouteMaps = append(dnsRouteMaps, maps.Map{ - "name": route.Name, - "code": route.Code, + "domainId": domainId, + "domainName": clusterDNSResp.Domain.Name, + "name": route.Name, + "code": route.Code, }) } } diff --git a/internal/web/actions/default/clusters/cluster/node/detail.go b/internal/web/actions/default/clusters/cluster/node/detail.go index d5f7b398..4f49d8b5 100644 --- a/internal/web/actions/default/clusters/cluster/node/detail.go +++ b/internal/web/actions/default/clusters/cluster/node/detail.go @@ -3,6 +3,7 @@ package node import ( "encoding/json" "fmt" + "github.com/TeaOSLab/EdgeAdmin/internal/utils" "github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/grants/grantutils" @@ -37,6 +38,7 @@ func (this *DetailAction) RunGet(params struct { return } + // 主集群 var clusterMap maps.Map = nil if node.NodeCluster != nil { clusterId := node.NodeCluster.Id @@ -55,6 +57,16 @@ func (this *DetailAction) RunGet(params struct { } } + // 从集群 + var secondaryClustersMaps = []maps.Map{} + for _, cluster := range node.SecondaryNodeClusters { + secondaryClustersMaps = append(secondaryClustersMaps, maps.Map{ + "id": cluster.Id, + "name": cluster.Name, + "isOn": cluster.IsOn, + }) + } + // IP地址 ipAddressesResp, err := this.RPC().NodeIPAddressRPC().FindAllEnabledIPAddressesWithNodeId(this.AdminContext(), &pb.FindAllEnabledIPAddressesWithNodeIdRequest{ NodeId: params.NodeId, @@ -64,6 +76,7 @@ func (this *DetailAction) RunGet(params struct { this.ErrorPage(err) return } + var ipAddresses = ipAddressesResp.Addresses ipAddressMaps := []maps.Map{} for _, addr := range ipAddressesResp.Addresses { ipAddressMaps = append(ipAddressMaps, maps.Map{ @@ -75,33 +88,56 @@ func (this *DetailAction) RunGet(params struct { } // DNS相关 - dnsInfoResp, err := this.RPC().NodeRPC().FindEnabledNodeDNS(this.AdminContext(), &pb.FindEnabledNodeDNSRequest{NodeId: params.NodeId}) - if err != nil { - this.ErrorPage(err) - return - } - dnsRouteMaps := []maps.Map{} - recordName := "" - recordValue := "" - if dnsInfoResp.Node != nil { - recordName = dnsInfoResp.Node.NodeClusterDNSName + "." + dnsInfoResp.Node.DnsDomainName - recordValue = dnsInfoResp.Node.IpAddr - for _, dnsInfo := range dnsInfoResp.Node.Routes { - dnsRouteMaps = append(dnsRouteMaps, maps.Map{ - "name": dnsInfo.Name, - "code": dnsInfo.Code, - }) + var clusters = []*pb.NodeCluster{node.NodeCluster} + clusters = append(clusters, node.SecondaryNodeClusters...) + var recordMaps = []maps.Map{} + var routeMaps = []maps.Map{} + for _, cluster := range clusters { + dnsInfoResp, err := this.RPC().NodeRPC().FindEnabledNodeDNS(this.AdminContext(), &pb.FindEnabledNodeDNSRequest{ + NodeId: params.NodeId, + NodeClusterId: cluster.Id, + }) + if err != nil { + this.ErrorPage(err) + return + } + var dnsInfo = dnsInfoResp.Node + if len(dnsInfo.DnsDomainName) == 0 || len(dnsInfo.NodeClusterDNSName) == 0 { + continue + } + var domainName = dnsInfo.DnsDomainName + + // 默认线路 + if len(dnsInfo.Routes) == 0 { + dnsInfo.Routes = append(dnsInfo.Routes, &pb.DNSRoute{}) + } else { + for _, route := range dnsInfo.Routes { + routeMaps = append(routeMaps, maps.Map{ + "domainName": domainName, + "code": route.Code, + "name": route.Name, + }) + } + } + + for _, addr := range ipAddresses { + if !addr.CanAccess { + continue + } + for _, route := range dnsInfo.Routes { + var recordType = "A" + if utils.IsIPv6(addr.Ip) { + recordType = "AAAA" + } + recordMaps = append(recordMaps, maps.Map{ + "name": dnsInfo.NodeClusterDNSName + "." + domainName, + "type": recordType, + "route": route.Name, + "value": addr.Ip, + }) + } } } - if len(dnsRouteMaps) == 0 { - dnsRouteMaps = append(dnsRouteMaps, maps.Map{ - "name": "", - "code": "", - }) - } - this.Data["dnsRoutes"] = dnsRouteMaps - this.Data["dnsRecordName"] = recordName - this.Data["dnsRecordValue"] = recordValue // 登录信息 var loginMap maps.Map = nil @@ -217,17 +253,20 @@ func (this *DetailAction) RunGet(params struct { } this.Data["node"] = maps.Map{ - "id": node.Id, - "name": node.Name, - "ipAddresses": ipAddressMaps, - "cluster": clusterMap, - "login": loginMap, - "installDir": node.InstallDir, - "isInstalled": node.IsInstalled, - "uniqueId": node.UniqueId, - "secret": node.Secret, - "maxCPU": node.MaxCPU, - "isOn": node.IsOn, + "id": node.Id, + "name": node.Name, + "ipAddresses": ipAddressMaps, + "cluster": clusterMap, + "secondaryClusters": secondaryClustersMaps, + "login": loginMap, + "installDir": node.InstallDir, + "isInstalled": node.IsInstalled, + "uniqueId": node.UniqueId, + "secret": node.Secret, + "maxCPU": node.MaxCPU, + "isOn": node.IsOn, + "records": recordMaps, + "routes": routeMaps, "status": maps.Map{ "isActive": status.IsActive, diff --git a/internal/web/actions/default/clusters/cluster/node/update.go b/internal/web/actions/default/clusters/cluster/node/update.go index 583b5967..b3bc8e87 100644 --- a/internal/web/actions/default/clusters/cluster/node/update.go +++ b/internal/web/actions/default/clusters/cluster/node/update.go @@ -66,44 +66,64 @@ func (this *UpdateAction) RunGet(params struct { } // DNS相关 - dnsInfoResp, err := this.RPC().NodeRPC().FindEnabledNodeDNS(this.AdminContext(), &pb.FindEnabledNodeDNSRequest{NodeId: params.NodeId}) - if err != nil { - this.ErrorPage(err) - return - } - nodeDNS := dnsInfoResp.Node - dnsRouteMaps := []maps.Map{} - if nodeDNS != nil { - for _, dnsInfo := range nodeDNS.Routes { - dnsRouteMaps = append(dnsRouteMaps, maps.Map{ - "name": dnsInfo.Name, - "code": dnsInfo.Code, - }) + var clusters = []*pb.NodeCluster{node.NodeCluster} + clusters = append(clusters, node.SecondaryNodeClusters...) + var allDNSRouteMaps = map[int64][]maps.Map{} // domain id => routes + var routeMaps = map[int64][]maps.Map{} // domain id => routes + for _, cluster := range clusters { + dnsInfoResp, err := this.RPC().NodeRPC().FindEnabledNodeDNS(this.AdminContext(), &pb.FindEnabledNodeDNSRequest{ + NodeId: params.NodeId, + NodeClusterId: cluster.Id, + }) + if err != nil { + this.ErrorPage(err) + return } - } - this.Data["dnsRoutes"] = dnsRouteMaps - this.Data["allDNSRoutes"] = []maps.Map{} - if nodeDNS != nil { - this.Data["dnsDomainId"] = nodeDNS.DnsDomainId - } else { - this.Data["dnsDomainId"] = 0 - } - if nodeDNS != nil && nodeDNS.DnsDomainId > 0 { - routesMaps := []maps.Map{} + var dnsInfo = dnsInfoResp.Node + if dnsInfo.DnsDomainId <= 0 || len(dnsInfo.DnsDomainName) == 0 { + continue + } + var domainId = dnsInfo.DnsDomainId + var domainName = dnsInfo.DnsDomainName + if len(dnsInfo.Routes) > 0 { + for _, route := range dnsInfo.Routes { + routeMaps[domainId] = append(routeMaps[domainId], maps.Map{ + "domainId": domainId, + "domainName": domainName, + "code": route.Code, + "name": route.Name, + }) + } + } + + // 所有线路选项 routesResp, err := this.RPC().DNSDomainRPC().FindAllDNSDomainRoutes(this.AdminContext(), &pb.FindAllDNSDomainRoutesRequest{DnsDomainId: dnsInfoResp.Node.DnsDomainId}) if err != nil { this.ErrorPage(err) return } for _, route := range routesResp.Routes { - routesMaps = append(routesMaps, maps.Map{ - "name": route.Name, - "code": route.Code, + allDNSRouteMaps[domainId] = append(allDNSRouteMaps[domainId], maps.Map{ + "domainId": domainId, + "domainName": domainName, + "name": route.Name, + "code": route.Code, }) } - this.Data["allDNSRoutes"] = routesMaps } + var domainRoutes = []maps.Map{} + for _, m := range routeMaps { + domainRoutes = append(domainRoutes, m...) + } + this.Data["dnsRoutes"] = domainRoutes + + var allDomainRoutes = []maps.Map{} + for _, m := range allDNSRouteMaps { + allDomainRoutes = append(allDomainRoutes, m...) + } + this.Data["allDNSRoutes"] = allDomainRoutes + // 登录信息 var loginMap maps.Map = nil if node.Login != nil { @@ -188,7 +208,7 @@ func (this *UpdateAction) RunGet(params struct { } } - this.Data["node"] = maps.Map{ + var m = maps.Map{ "id": node.Id, "name": node.Name, "ipAddresses": ipAddressMaps, @@ -202,23 +222,29 @@ func (this *UpdateAction) RunGet(params struct { "maxCacheMemoryCapacity": maxCacheMemoryCapacity, } - // 所有集群 - resp, err := this.RPC().NodeClusterRPC().FindAllEnabledNodeClusters(this.AdminContext(), &pb.FindAllEnabledNodeClustersRequest{}) - if err != nil { - this.ErrorPage(err) + if node.NodeCluster != nil { + m["primaryCluster"] = maps.Map{ + "id": node.NodeCluster.Id, + "name": node.NodeCluster.Name, + } + } else { + m["primaryCluster"] = nil } - if err != nil { - this.ErrorPage(err) - return + + if len(node.SecondaryNodeClusters) > 0 { + var secondaryClusterMaps = []maps.Map{} + for _, cluster := range node.SecondaryNodeClusters { + secondaryClusterMaps = append(secondaryClusterMaps, maps.Map{ + "id": cluster.Id, + "name": cluster.Name, + }) + } + m["secondaryClusters"] = secondaryClusterMaps + } else { + m["secondaryClusters"] = []interface{}{} } - clusterMaps := []maps.Map{} - for _, cluster := range resp.NodeClusters { - clusterMaps = append(clusterMaps, maps.Map{ - "id": cluster.Id, - "name": cluster.Name, - }) - } - this.Data["clusters"] = clusterMaps + + this.Data["node"] = m this.Show() } @@ -230,7 +256,8 @@ func (this *UpdateAction) RunPost(params struct { RegionId int64 Name string IPAddressesJSON []byte `alias:"ipAddressesJSON"` - ClusterId int64 + PrimaryClusterId int64 + SecondaryClusterIds []byte GrantId int64 SshHost string SshPort int @@ -256,8 +283,17 @@ func (this *UpdateAction) RunPost(params struct { Require("请输入节点名称") // TODO 检查cluster - if params.ClusterId <= 0 { - this.Fail("请选择所在集群") + if params.PrimaryClusterId <= 0 { + this.Fail("请选择节点所在主集群") + } + + var secondaryClusterIds = []int64{} + if len(params.SecondaryClusterIds) > 0 { + err := json.Unmarshal(params.SecondaryClusterIds, &secondaryClusterIds) + if err != nil { + this.ErrorPage(err) + return + } } // IP地址 @@ -325,18 +361,19 @@ func (this *UpdateAction) RunPost(params struct { // 保存 _, err := this.RPC().NodeRPC().UpdateNode(this.AdminContext(), &pb.UpdateNodeRequest{ - NodeId: params.NodeId, - NodeGroupId: params.GroupId, - NodeRegionId: params.RegionId, - Name: params.Name, - NodeClusterId: params.ClusterId, - NodeLogin: loginInfo, - MaxCPU: params.MaxCPU, - IsOn: params.IsOn, - DnsDomainId: params.DnsDomainId, - DnsRoutes: dnsRouteCodes, - MaxCacheDiskCapacity: pbMaxCacheDiskCapacity, - MaxCacheMemoryCapacity: pbMaxCacheMemoryCapacity, + NodeId: params.NodeId, + NodeGroupId: params.GroupId, + NodeRegionId: params.RegionId, + Name: params.Name, + NodeClusterId: params.PrimaryClusterId, + SecondaryNodeClusterIds: secondaryClusterIds, + NodeLogin: loginInfo, + MaxCPU: params.MaxCPU, + IsOn: params.IsOn, + DnsDomainId: params.DnsDomainId, + DnsRoutes: dnsRouteCodes, + MaxCacheDiskCapacity: pbMaxCacheDiskCapacity, + MaxCacheMemoryCapacity: pbMaxCacheMemoryCapacity, }) if err != nil { this.ErrorPage(err) diff --git a/internal/web/actions/default/clusters/cluster/nodes.go b/internal/web/actions/default/clusters/cluster/nodes.go index bf64b49b..9e884f4b 100644 --- a/internal/web/actions/default/clusters/cluster/nodes.go +++ b/internal/web/actions/default/clusters/cluster/nodes.go @@ -156,6 +156,16 @@ func (this *NodesAction) RunGet(params struct { dnsRouteNames = append(dnsRouteNames, route.Name) } + // 从集群 + var secondaryClusterMaps []maps.Map + for _, secondaryCluster := range node.SecondaryNodeClusters { + secondaryClusterMaps = append(secondaryClusterMaps, maps.Map{ + "id": secondaryCluster.Id, + "name": secondaryCluster.Name, + "isOn": secondaryCluster.IsOn, + }) + } + nodeMaps = append(nodeMaps, maps.Map{ "id": node.Id, "name": node.Name, @@ -183,11 +193,12 @@ func (this *NodesAction) RunGet(params struct { "id": node.NodeCluster.Id, "name": node.NodeCluster.Name, }, - "isSynced": isSynced, - "ipAddresses": ipAddresses, - "group": groupMap, - "region": regionMap, - "dnsRouteNames": dnsRouteNames, + "secondaryClusters": secondaryClusterMaps, + "isSynced": isSynced, + "ipAddresses": ipAddresses, + "group": groupMap, + "region": regionMap, + "dnsRouteNames": dnsRouteNames, }) } this.Data["nodes"] = nodeMaps diff --git a/internal/web/actions/default/clusters/cluster/settings/dns/index.go b/internal/web/actions/default/clusters/cluster/settings/dns/index.go index 89625f1d..5069518f 100644 --- a/internal/web/actions/default/clusters/cluster/settings/dns/index.go +++ b/internal/web/actions/default/clusters/cluster/settings/dns/index.go @@ -63,6 +63,14 @@ func (this *IndexAction) RunPost(params struct { // 创建日志 defer this.CreateLog(oplogs.LevelInfo, "修改集群 %d DNS设置", params.ClusterId) + if params.DnsDomainId <= 0 { + this.Fail("请选择集群的主域名") + } + + params.Must. + Field("dnsName", params.DnsName). + Require("请输入DNS子域名") + // 检查DNS名称 if len(params.DnsName) > 0 { if !domainutils.ValidateDomainFormat(params.DnsName) { diff --git a/internal/web/actions/default/clusters/index.go b/internal/web/actions/default/clusters/index.go index 93de9088..f639aa21 100644 --- a/internal/web/actions/default/clusters/index.go +++ b/internal/web/actions/default/clusters/index.go @@ -235,6 +235,16 @@ func (this *IndexAction) searchNodes(keyword string) { dnsRouteNames = append(dnsRouteNames, route.Name) } + // 从集群 + var secondaryClusterMaps []maps.Map + for _, secondaryCluster := range node.SecondaryNodeClusters { + secondaryClusterMaps = append(secondaryClusterMaps, maps.Map{ + "id": secondaryCluster.Id, + "name": secondaryCluster.Name, + "isOn": secondaryCluster.IsOn, + }) + } + nodeMaps = append(nodeMaps, maps.Map{ "id": node.Id, "name": node.Name, @@ -260,11 +270,12 @@ func (this *IndexAction) searchNodes(keyword string) { "id": node.NodeCluster.Id, "name": node.NodeCluster.Name, }, - "isSynced": isSynced, - "ipAddresses": ipAddresses, - "group": groupMap, - "region": regionMap, - "dnsRouteNames": dnsRouteNames, + "secondaryClusters": secondaryClusterMaps, + "isSynced": isSynced, + "ipAddresses": ipAddresses, + "group": groupMap, + "region": regionMap, + "dnsRouteNames": dnsRouteNames, }) } this.Data["nodes"] = nodeMaps diff --git a/internal/web/actions/default/clusters/init.go b/internal/web/actions/default/clusters/init.go index d4fe830b..d42f2332 100644 --- a/internal/web/actions/default/clusters/init.go +++ b/internal/web/actions/default/clusters/init.go @@ -20,6 +20,7 @@ func init() { EndHelpers(). Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeCommon)). Post("/options", new(OptionsAction)). + GetPost("/selectPopup", new(SelectPopupAction)). EndAll() }) diff --git a/internal/web/actions/default/clusters/selectPopup.go b/internal/web/actions/default/clusters/selectPopup.go new file mode 100644 index 00000000..970ed9a5 --- /dev/null +++ b/internal/web/actions/default/clusters/selectPopup.go @@ -0,0 +1,64 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package clusters + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/utils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/lists" + "github.com/iwind/TeaGo/maps" +) + +type SelectPopupAction struct { + actionutils.ParentAction +} + +func (this *SelectPopupAction) Init() { + this.Nav("", "", "") +} + +func (this *SelectPopupAction) RunGet(params struct { + SelectedClusterIds string +}) { + var selectedIds = utils.SplitNumbers(params.SelectedClusterIds) + + countResp, err := this.RPC().NodeClusterRPC().CountAllEnabledNodeClusters(this.AdminContext(), &pb.CountAllEnabledNodeClustersRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + var count = countResp.Count + var page = this.NewPage(count) + this.Data["page"] = page.AsHTML() + + clustersResp, err := this.RPC().NodeClusterRPC().ListEnabledNodeClusters(this.AdminContext(), &pb.ListEnabledNodeClustersRequest{ + Offset: page.Offset, + Size: page.Size, + }) + if err != nil { + this.ErrorPage(err) + return + } + var clusterMaps = []maps.Map{} + for _, cluster := range clustersResp.NodeClusters { + // 节点数 + countNodesResp, err := this.RPC().NodeRPC().CountAllEnabledNodesMatch(this.AdminContext(), &pb.CountAllEnabledNodesMatchRequest{NodeClusterId: cluster.Id}) + if err != nil { + this.ErrorPage(err) + return + } + var countNodes = countNodesResp.Count + + clusterMaps = append(clusterMaps, maps.Map{ + "id": cluster.Id, + "name": cluster.Name, + "isOn": cluster.IsOn, + "countNodes": countNodes, + "isSelected": lists.ContainsInt64(selectedIds, cluster.Id), + }) + } + this.Data["clusters"] = clusterMaps + + this.Show() +} diff --git a/internal/web/actions/default/dns/domains/clustersPopup.go b/internal/web/actions/default/dns/domains/clustersPopup.go index 7edfebf6..0699166e 100644 --- a/internal/web/actions/default/dns/domains/clustersPopup.go +++ b/internal/web/actions/default/dns/domains/clustersPopup.go @@ -43,16 +43,21 @@ func (this *ClustersPopupAction) RunGet(params struct { for _, cluster := range clustersResp.NodeClusters { isOk := false if len(cluster.Name) > 0 { - checkResp, err := this.RPC().DNSDomainRPC().ExistDNSDomainRecord(this.AdminContext(), &pb.ExistDNSDomainRecordRequest{ - DnsDomainId: params.DomainId, - Name: cluster.DnsName, - Type: "A", - }) - if err != nil { - this.ErrorPage(err) - return + for _, recordType := range []string{"A", "AAAA"} { + checkResp, err := this.RPC().DNSDomainRPC().ExistDNSDomainRecord(this.AdminContext(), &pb.ExistDNSDomainRecordRequest{ + DnsDomainId: params.DomainId, + Name: cluster.DnsName, + Type: recordType, + }) + if err != nil { + this.ErrorPage(err) + return + } + if checkResp.IsOk { + isOk = true + break + } } - isOk = checkResp.IsOk } clusterMaps = append(clusterMaps, maps.Map{ diff --git a/internal/web/actions/default/dns/domains/domainutils/utils.go b/internal/web/actions/default/dns/domains/domainutils/utils.go index 4660c1a8..de0bb7ca 100644 --- a/internal/web/actions/default/dns/domains/domainutils/utils.go +++ b/internal/web/actions/default/dns/domains/domainutils/utils.go @@ -33,12 +33,17 @@ func ValidateDomainFormat(domain string) bool { } // ConvertRoutesToMaps 转换线路列表 -func ConvertRoutesToMaps(routes []*pb.DNSRoute) []maps.Map { +func ConvertRoutesToMaps(info *pb.NodeDNSInfo) []maps.Map { + if info == nil { + return []maps.Map{} + } result := []maps.Map{} - for _, route := range routes { + for _, route := range info.Routes { result = append(result, maps.Map{ - "name": route.Name, - "code": route.Code, + "name": route.Name, + "code": route.Code, + "domainId": info.DnsDomainId, + "domainName": info.DnsDomainName, }) } return result diff --git a/internal/web/actions/default/dns/domains/nodesPopup.go b/internal/web/actions/default/dns/domains/nodesPopup.go index b0a2cf4f..dd14749b 100644 --- a/internal/web/actions/default/dns/domains/nodesPopup.go +++ b/internal/web/actions/default/dns/domains/nodesPopup.go @@ -1,6 +1,7 @@ package domains import ( + "github.com/TeaOSLab/EdgeAdmin/internal/utils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/maps" @@ -55,10 +56,14 @@ func (this *NodesPopupAction) RunGet(params struct { // 检查是否有域名解析记录 isOk := false if len(route.Name) > 0 && len(node.IpAddr) > 0 && len(cluster.DnsName) > 0 { + var recordType = "A" + if utils.IsIPv6(node.IpAddr) { + recordType = "AAAA" + } checkResp, err := this.RPC().DNSDomainRPC().ExistDNSDomainRecord(this.AdminContext(), &pb.ExistDNSDomainRecordRequest{ DnsDomainId: params.DomainId, Name: cluster.DnsName, - Type: "A", + Type: recordType, Route: route.Code, Value: node.IpAddr, }) diff --git a/internal/web/actions/default/dns/issues/updateNodePopup.go b/internal/web/actions/default/dns/issues/updateNodePopup.go index d3944f3f..0615bbfe 100644 --- a/internal/web/actions/default/dns/issues/updateNodePopup.go +++ b/internal/web/actions/default/dns/issues/updateNodePopup.go @@ -20,11 +20,15 @@ func (this *UpdateNodePopupAction) Init() { } func (this *UpdateNodePopupAction) RunGet(params struct { - NodeId int64 + ClusterId int64 + NodeId int64 }) { this.Data["nodeId"] = params.NodeId - dnsInfoResp, err := this.RPC().NodeRPC().FindEnabledNodeDNS(this.AdminContext(), &pb.FindEnabledNodeDNSRequest{NodeId: params.NodeId}) + dnsInfoResp, err := this.RPC().NodeRPC().FindEnabledNodeDNS(this.AdminContext(), &pb.FindEnabledNodeDNSRequest{ + NodeId: params.NodeId, + NodeClusterId: params.ClusterId, + }) if err != nil { this.ErrorPage(err) return @@ -35,7 +39,7 @@ func (this *UpdateNodePopupAction) RunGet(params struct { return } this.Data["ipAddr"] = dnsInfo.IpAddr - this.Data["routes"] = domainutils.ConvertRoutesToMaps(dnsInfo.Routes) + this.Data["routes"] = domainutils.ConvertRoutesToMaps(dnsInfo) this.Data["domainId"] = dnsInfo.DnsDomainId this.Data["domainName"] = dnsInfo.DnsDomainName @@ -50,13 +54,17 @@ func (this *UpdateNodePopupAction) RunGet(params struct { if len(routesResp.Routes) > 0 { for _, route := range routesResp.Routes { allRouteMaps = append(allRouteMaps, maps.Map{ - "name": route.Name, - "code": route.Code, + "name": route.Name, + "code": route.Code, + "domainName": dnsInfo.DnsDomainName, + "domainId": dnsInfo.DnsDomainId, }) } // 筛选 - this.Data["routes"] = domainutils.ConvertRoutesToMaps(domainutils.FilterRoutes(dnsInfo.Routes, routesResp.Routes)) + var routes = domainutils.FilterRoutes(dnsInfo.Routes, routesResp.Routes) + dnsInfo.Routes = routes + this.Data["routes"] = domainutils.ConvertRoutesToMaps(dnsInfo) } } this.Data["allRoutes"] = allRouteMaps diff --git a/internal/web/actions/default/nodes/delete.go b/internal/web/actions/default/nodes/delete.go index b18d1265..1a4422b5 100644 --- a/internal/web/actions/default/nodes/delete.go +++ b/internal/web/actions/default/nodes/delete.go @@ -10,12 +10,16 @@ type DeleteAction struct { } func (this *DeleteAction) RunPost(params struct { - NodeId int64 + ClusterId int64 + NodeId int64 }) { // 创建日志 - defer this.CreateLogInfo("删除节点", params.NodeId) + defer this.CreateLogInfo("从集群 %d 中删除节点 %d", params.ClusterId, params.NodeId) - _, err := this.RPC().NodeRPC().DeleteNode(this.AdminContext(), &pb.DeleteNodeRequest{NodeId: params.NodeId}) + _, err := this.RPC().NodeRPC().DeleteNodeFromNodeCluster(this.AdminContext(), &pb.DeleteNodeFromNodeClusterRequest{ + NodeId: params.NodeId, + NodeClusterId: params.ClusterId, + }) if err != nil { this.ErrorPage(err) return diff --git a/web/public/js/components/cluster/cluster-selector.js b/web/public/js/components/cluster/cluster-selector.js index 17faf648..6aa492f7 100644 --- a/web/public/js/components/cluster/cluster-selector.js +++ b/web/public/js/components/cluster/cluster-selector.js @@ -1,3 +1,4 @@ +// 单个集群选择 Vue.component("cluster-selector", { mounted: function () { let that = this diff --git a/web/public/js/components/cluster/node-clusters-labels.js b/web/public/js/components/cluster/node-clusters-labels.js new file mode 100644 index 00000000..53c233ab --- /dev/null +++ b/web/public/js/components/cluster/node-clusters-labels.js @@ -0,0 +1,28 @@ +// 显示节点的多个集群 +Vue.component("node-clusters-labels", { + props: ["v-primary-cluster", "v-secondary-clusters", "size"], + data: function () { + let cluster = this.vPrimaryCluster + let secondaryClusters = this.vSecondaryClusters + if (secondaryClusters == null) { + secondaryClusters = [] + } + + let labelSize = this.size + if (labelSize == null) { + labelSize = "small" + } + if (labelSize == "tiny") { + labelSize += " olive" + } + return { + cluster: cluster, + secondaryClusters: secondaryClusters, + labelSize: labelSize + } + }, + template: `
+ {{cluster.name}} + {{c.name}} +
` +}) \ No newline at end of file diff --git a/web/public/js/components/cluster/node-clusters-selector.js b/web/public/js/components/cluster/node-clusters-selector.js new file mode 100644 index 00000000..d4e4845c --- /dev/null +++ b/web/public/js/components/cluster/node-clusters-selector.js @@ -0,0 +1,98 @@ +// 一个节点的多个集群选择器 +Vue.component("node-clusters-selector", { + props: ["v-primary-cluster", "v-secondary-clusters"], + data: function () { + let primaryCluster = this.vPrimaryCluster + + let secondaryClusters = this.vSecondaryClusters + if (secondaryClusters == null) { + secondaryClusters = [] + } + + return { + primaryClusterId: (primaryCluster == null) ? 0 : primaryCluster.id, + secondaryClusterIds: secondaryClusters.map(function (v) { + return v.id + }), + + primaryCluster: primaryCluster, + secondaryClusters: secondaryClusters + } + }, + methods: { + addPrimary: function () { + let that = this + let selectedClusterIds = [this.primaryClusterId].concat(this.secondaryClusterIds) + teaweb.popup("/clusters/selectPopup?selectedClusterIds=" + selectedClusterIds.join(",") + "&mode=single", { + height: "38em", + width: "50em", + callback: function (resp) { + if (resp.data.cluster != null) { + that.primaryCluster = resp.data.cluster + that.primaryClusterId = that.primaryCluster.id + that.notifyChange() + } + } + }) + }, + removePrimary: function () { + this.primaryClusterId = 0 + this.primaryCluster = null + this.notifyChange() + }, + addSecondary: function () { + let that = this + let selectedClusterIds = [this.primaryClusterId].concat(this.secondaryClusterIds) + teaweb.popup("/clusters/selectPopup?selectedClusterIds=" + selectedClusterIds.join(",") + "&mode=multiple", { + height: "38em", + width: "50em", + callback: function (resp) { + if (resp.data.cluster != null) { + that.secondaryClusterIds.push(resp.data.cluster.id) + that.secondaryClusters.push(resp.data.cluster) + that.notifyChange() + } + } + }) + }, + removeSecondary: function (index) { + this.secondaryClusterIds.$remove(index) + this.secondaryClusters.$remove(index) + this.notifyChange() + }, + notifyChange: function () { + this.$emit("change", { + clusterId: this.primaryClusterId + }) + } + }, + template: `
+ + + + + + + + + + + +
主集群 +
+
{{primaryCluster.name}}  
+
+
+ +
+

多个集群配置有冲突时,优先使用主集群配置。

+
从集群 +
+
{{cluster.name}}  
+
+
+ +
+
+
` +}) \ No newline at end of file diff --git a/web/public/js/components/dns/dns-route-selector.js b/web/public/js/components/dns/dns-route-selector.js index bf6cdde0..3dc0a333 100644 --- a/web/public/js/components/dns/dns-route-selector.js +++ b/web/public/js/components/dns/dns-route-selector.js @@ -8,7 +8,7 @@ Vue.component("dns-route-selector", { return { routes: routes, routeCodes: routes.$map(function (k, v) { - return v.code + return v.code + "@" + v.domainId }), isAdding: false, routeCode: "" @@ -31,7 +31,7 @@ Vue.component("dns-route-selector", { } let that = this let route = this.vAllRoutes.$find(function (k, v) { - return v.code == that.routeCode + return v.code + "@" + v.domainId == that.routeCode }) if (route == null) { return @@ -53,8 +53,8 @@ Vue.component("dns-route-selector", { template: `
- - {{route.name}} + + {{route.name}} ({{route.domainName}})
@@ -64,7 +64,7 @@ Vue.component("dns-route-selector", {
diff --git a/web/public/js/utils.js b/web/public/js/utils.js index b73737e5..b1bfe307 100644 --- a/web/public/js/utils.js +++ b/web/public/js/utils.js @@ -317,6 +317,27 @@ window.teaweb = { Swal.fire(config); }, + toast: function (message, timeout, callback) { + if (timeout == null) { + timeout = 2000 + } + var width = "20em"; + if (message.length > 30) { + width = "30em"; + } + Swal.fire({ + text: message, + icon: "info", + width: width, + timer: timeout, + showConfirmButton: false, + onAfterClose: function () { + if (typeof callback == "function") { + callback() + } + } + }); + }, successToast: function (message, timeout, callback) { if (timeout == null) { timeout = 2000 diff --git a/web/views/@default/@layout.css.map b/web/views/@default/@layout.css.map index 1fb7349e..985b1413 100644 --- a/web/views/@default/@layout.css.map +++ b/web/views/@default/@layout.css.map @@ -1 +1 @@ -{"version":3,"sources":["@left_menu.less","@layout.less"],"names":[],"mappings":"AAAA;EACC,UAAA;EACA,eAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,4BAAA;;AAPD,SASC;EACC,qBAAA;;AAVF,SASC,MAGC;EACC,gBAAA;EACA,kBAAA;EACA,4BAAA;;AAfH,SASC,MAGC,MAKC;EACC,kBAAA;EACA,QAAA;EACA,OAAA;EACA,kBAAA;;AArBJ,SASC,MAgBC,MAAK;EACJ,wCAAA;EACA,cAAA;EACA,iBAAA;EACA,wBAAA;EACA,2BAAA;;AA9BH,SASC,MAwBC,MAAK,GACJ;EACC,8BAAA;;AAnCJ,SASC,MA8BC,MAAK,IACJ,KACC;EACC,kBAAA;EACA,mBAAA;EACA,YAAA;EACA,cAAA;EACA,YAAA;EACA,kBAAA;EACA,gBAAA;;AAhDL,SASC,MA6CC;EACC,6BAAA;EACA,0BAAA;EACA,8BAAA;;AAQH,SAAS;EACR,UAAA;;AAGD,SAAS;EACR,YAAA;;AAGD,SAAS;EACR,WAAA;;AAGD,SAAS;EACR,QAAA;;AAGD;EACC,eAAA;EACA,UAAA;EACA,aAAA;EACA,QAAA;EACA,UAAA;EACA,kBAAA;EACA,mBAAA;EACA,gBAAA;;AAGD,UAAU;EACT,WAAA;EACA,YAAA;;AAGD,UAAU;EACT,UAAA;;AAGD,UAAU;EACT,QAAA;;AAKD,KAAK,eAAgB;EACpB,aAAA;;;ACzGD;EACC,WAAA;;AAGD;EACC,aAAA;;AAGD;EACC,qBAAA;;AAGD,CAAC;AAAW,CAAC,SAAS;AAAQ,CAAC,SAAS;AAAS,IAAI;EACpD,sBAAA;;AAGD,CAAC;AAAU,IAAI;AAAU,IAAI;EAC5B,cAAA;;AAGD,IAAI;AAAO,KAAK;AAAO,CAAC;EACvB,sBAAA;;AAGD,CAAC;EACA,iBAAA;;AAGD,IAAI;AAAM,GAAG;EACZ,cAAA;;AAGD,IAAI;EACH,cAAA;;AAGD,IAAI;EACH,cAAA;;AAGD,GAAG,IAAI;EACN,mBAAmB,8CAAnB;;AAGD;EACC,uBAAA;;AAGD;EACC,eAAA;EACA,gBAAA;;AAGD,UAAU;EACT,WAAA;;AAGD,MAAM;EACL,sBAAA;;AAGD,MAAM;EACL,sBAAA;;AAGD,MAAM;EACL,sBAAA;;AAGD,MAAM;EACL,wBAAA;;AAGD,MAAO;AAAI,MAAO;EACjB,2BAAA;;AAGD,MAAO,GAAE,OAAQ;EAChB,+BAAA;;AAGD,CAAC;AAAU,GAAG;EACb,yBAAA;EACA,kBAAA;EACA,cAAA;;AAGD,CAAC,QAAS;AAAI,GAAG,QAAS;EACzB,6BAAA;;AAGD;EACC,mBAAA;EACA,2BAAA;EACA,gBAAA;EACA,uBAAA;;AAGD,GAAG;AAAS,CAAC;EACZ,eAAA;;;AAID,GAAG;EACF,UAAA;;AAGD,GAAG;EACF,YAAA;;AAGD,GAAG;EACF,UAAA;;AAGD,GAAG;EACF,WAAA;;;AAID,UACC,IAAG;EACF,uBAAA;EACA,2BAAA;;AAmBF,mBAfqC;EACpC,UAAW,IAAG;IACb,uBAAA;;EAGD,UAAW,IAAG,KAAM;IACnB,gBAAA;IACA,qBAAA;;;AAQF,UAAW,IAAG,QAAQ,KAAK,KAAM;EAChC,gBAAA;;AAGD,UACC,IAAG,KACF,MACC;EACC,aAAA;;AAJJ,UACC,IAAG,KAOF,MAAK,OAAQ;EACZ,cAAA;EACA,eAAA;EACA,mBAAA;EACA,iBAAA;EACA,WAAA;;AASD,mBANqC;EAinBtC,UAhoBA,IAAG,KAgBD,MAAK,OAAQ;IACZ,aAAA;;;AAlBJ,UACC,IAAG,KAqBF,WACC;EACC,8BAAA;;AAxBJ,UACC,IAAG,KAqBF,WACC,MAGC;EACC,kBAAA;EACA,WAAA;EACA,WAAA;;AAUF,mBANqC;EAgmBvC,UAhoBA,IAAG,KAqBF,WAYE;IACC,4BAAA;;;AAnCL,UACC,IAAG,KAqBF,WAiBC,MAAK;EACJ,oCAAA;;;AAOJ,MAAM;EACL,aAAA;;;AAID;EACC;IACC,YAAA;;EAED;IACC,YAAA;;;AAIF;EACC;IACC,WAAW,SAAX;;EAED;IACC,WAAW,cAAX;;;AAIF,IAAK,IAAG,KAAM,MAAM;EACnB,4BAAA;;AAGD,IAAK,IAAG,KAAM,MAAK,IAAI,QAAS,KAAI;EACnC,+BAAA;;AAGD,IAAI,SAAU;EACb,aAAA;;AAGD,IAAI,SAAU;EACb,SAAA;;;AAID;EACC,2BAAA;EACA,eAAA;EACA,WAAA;EACA,aAAA;EACA,gBAAA;EACA,oBAAA;;AAND,QAQC,IAAG;EACF,uBAAA;EACA,wBAAA;EACA,cAAA;EACA,gBAAA;EACA,oBAAA;EACA,8BAAA;;AAdF,QAiBC;EACC,kBAAA;EACA,gBAAA;EACA,mBAAA;;AApBF,QAuBC,MACC,YACC;EACC,aAAA;;AA1BJ,QA+BC,MAAK,MACJ,YACC;EACC,eAAA;;AAlCJ,QAuCC,MAAK;EACJ,qBAAA;;AAIF,QAAQ;EACP,8BAAA;;AAGD,QAAQ;EACP,8BAAA;;AAGD,QAAQ;EACP,8BAAA;;AAGD,QAAQ;EACP,WAAA;;;AAKD;EACC,eAAA;EACA,UAAA;EACA,WAAA;EACA,QAAA;EACA,YAAA;EACA,iBAAA;;AAGD,mBAAoB;EACnB,wBAAA;EACA,2BAAA;EACA,2BAAA;;AAGD,mBAAoB,MAAM;EACzB,kBAAA;;AAGD,mBAAoB;EACnB,wBAAA;EACA,2BAAA;;AAUD,mBAPqC;EACpC;IACC,SAAA;;;;AAKF;EACC,kBAAA;EACA,UAAA;EACA,UAAA;EACA,mBAAA;EACA,kBAAA;EACA,UAAA;;AASD,mBANqC;EACpC;IACC,SAAA;;;AAIF,KAAK;EACJ,SAAA;;AAGD,KAAK;EACJ,UAAA;;AASD,mBANqC;EACpC,KAAK;IACJ,SAAA;;;AAIF,KAAM,MAAM,GAAE;EACb,WAAA;;AAGD,KAAM,MAAM,GAAE;EACb,WAAA;;AAGD,KAAM,MAAM;EACX,mBAAA;;AAGD,KAAM,MAAM,GAAE;EACb,yCAAA;;AAGD,KAAM,MAAM,GAAE;EACb,mBAAA;;AAGD,KAAM,MAAM,GAAE;EACb,sBAAA;;AAGD,KAAM,MAAM,GAAE,aAAc;EAC3B,mBAAA;;AAGD,KAAM,MAAM,GAAG;EACd,mBAAA;EACA,kBAAA;EACA,gBAAA;;AAGD,KAAM;EACL,mBAAA;EACA,0BAAA;EACA,kBAAA;;AAGD,KAAM,GAAG;EACR,gBAAA;;AAGD,KAAM,GAAG,KAAI;EACZ,cAAA;;AAGD,KAAM,GAAG;EACR,gBAAA;EACA,0BAAA;EACA,UAAA;;AAGD,KAAM;EACL,mBAAA;;AAGD,KAAM,GAAG,KAAI;EACZ,gBAAA;;AAGD,KAAM,QAAO;EACZ,gBAAA;EACA,cAAA;EACA,gBAAA;;AAGD;EACC,eAAA;;EAEA,QAAA;EACA,SAAA;EACA,gBAAA;EACA,WAAA;;AAND,UAQC;EACC,oBAAA;EACA,2BAAA;;AAIF,UAAU;EACT,8BAAA;;AADD,UAAU,OAET;EACC,8BAAA;;AAIF,UAAU;EACT,8BAAA;;AADD,UAAU,OAET;EACC,8BAAA;;AAIF,UAAU;EACT,8BAAA;;AADD,UAAU,OAET;EACC,8BAAA;;AAIF,UAAU;EACT,UAAA;;AAGD,KACC;EACC,0BAAA;EACA,2BAAA;EACA,gBAAA;EACA,kBAAA;;AALF,KACC,UAMC;EACC,uBAAA;;AARH,KACC,UAMC,MAGC;EACC,kBAAA;;AAXJ,KACC,UAMC,MAOC;EACC,gBAAA;EACA,mBAAA;;AAhBJ,KACC,UAMC,MAYC;EACC,kBAAA;;AApBJ,KACC,UAuBC,MAAK;EACJ,8BAAA;;AAzBH,KA6BC,UAAS;EACR,WAAA;;AAKF,KAAM;EACL,eAAA;EACA,YAAA;EACA,WAAA;EACA,cAAA;EACA,kBAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;;;AAID,KAAK;EACJ,gBAAA;;AAGD,KAAK,KAAK;EACT,UAAA;EACA,WAAA;;;AAID;EACC,eAAA;EACA,SAAA;EACA,gBAAA;EACA,WAAA;EACA,WAAA;EACA,2BAAA;EACA,WAAA;EACA,gBAAA;;AAGD,OAAO;EACN,WAAA;;AAGD,OAAQ;EACP,gBAAA;;AAGD,OAAQ,EAAE;EACT,aAAA;;AAGD,OAAQ,EAAC,MAAO;AAAM,OAAQ,EAAC,OAAQ;EACtC,aAAA;;AAGD,OAAQ,EAAC,MAAO;AAAM,OAAQ,EAAC,OAAQ;EACtC,cAAA;;AAGD,OAAQ,KAAK;EACZ,UAAA;EACA,SAAA;;AAGD;EACC,eAAA;EACA,eAAA;EACA,OAAA;EACA,MAAA;EACA,QAAA;EACA,8BAAA;EACA,aAAA;;AAGD,iBAAkB;EACjB,WAAA;EACA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,iBAAA;EACA,kBAAA;;AAGD,iBAAkB,QAAQ;EACzB,WAAA;;AAGD,iBAAkB,QAAQ;EACzB,kBAAA;EACA,YAAA;EACA,UAAA;;AAWD,mBARqC;EACpC,iBAAkB;IACjB,cAAA;IACA,WAAA;;;;AAKF;EACC,wBAAA;;;AAID,iBAAkB;EACjB,2BAAA;;AAGD,iBAAkB,MAAK;EACtB,UAAA;;AAGD,iBAAkB,MAAM;EACvB,2BAAA;;AAGD,MAAM;EACL,sBAAA;;;AAWD,mBAPqC;EACpC,OAAO,IAAI;IACV,sBAAA;;;AAKF,KAAK;EACJ,0BAAA;;AAGD,KAAK;EACJ,yBAAA;;;AAID,WAAY,MAAK;EAChB,wBAAA;EACA,2BAAA;;AAGD,WAAY;EACX,wBAAA;EACA,2BAAA;;AAGD,YAAa,MAAK;EACjB,wBAAA;EACA,2BAAA;;AAGD,YAAa,MAAK,KAAM;EACvB,kBAAA;;AAGD,YAAa;EACZ,wBAAA;;AAGD,KAAM;EACL,aAAA;;;AAID,IAAI;AAAQ,GAAG;EACd,yBAAA;;AAGD,GAAG;EACF,8BAAA;;;AAID,SAAU,MAAM;AAAG,SAAU;EAC5B,2BAAA;;;AAQD;EACC,eAAA;EAEA,2BAAA;;AAHD,KAKC;EACC,qBAAA;EACA,mBAAA;EACA,WAAA;EACA,iBAAA;EACA,SAAA;EACA,gBAAA;EACA,sBAAA;EACA,cAAA;;AAbF,KAgBC,EAAC;EACA,8BAAA;EACA,YAAA;;AAlBF,KAqBC,EAAC;EACA,gBAAA;;;AAKF;EACC,kBAAA;;AAGD;AAAc,YAAY;EACzB,SAAA;;AAGD,cAAc;AAAQ,aAAa;EAClC,iCAAA;;AAGD;AAAgB;EACf,iCAAA;;AAGD;EACC,2BAAA;;;AAID;EACC,2BAAA;EACA,YAAA;;AAGD;EACC,YAAA;;AAGD,KAAK;EACJ,eAAA;;AAGD,MAAM;EACL,4BAAA;EACA,+BAAA;EACA,cAAA;EACA,gBAAA;;AAID;EACC,qBAAA;;AAGD,EAAG,OAAM;EACR,+BAAA;;AAID;EACC,qBAAA;;AAID,gBACC;EACC,sBAAA;EACA,uBAAA;;AAHF,gBAMC;EACC,UAAA;EACA,6BAAA;;AARF,gBAWC,uBAAsB;EACrB,kBAAA;;AAKF;EACC,gBAAA;;AAGD,WAAW;EACV,UAAA;;AAID,KAAK;EACJ,oCAAA","file":"@layout.css"} \ No newline at end of file +{"version":3,"sources":["@left_menu.less","@layout.less"],"names":[],"mappings":"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","file":"@layout.css"} \ No newline at end of file diff --git a/web/views/@default/@layout.less b/web/views/@default/@layout.less index 9cbb9155..9acab1b1 100644 --- a/web/views/@default/@layout.less +++ b/web/views/@default/@layout.less @@ -440,6 +440,7 @@ body.expanded .main { .main-menu.theme1 { background: #14539A !important; + .menu { background: #14539A !important; } @@ -447,6 +448,7 @@ body.expanded .main { .main-menu.theme2 { background: #276AC6 !important; + .menu { background: #276AC6 !important; } @@ -454,6 +456,7 @@ body.expanded .main { .main-menu.theme3 { background: #007D9C !important; + .menu { background: #007D9C !important; } diff --git a/web/views/@default/clusters/cluster/node/@node_menu.html b/web/views/@default/clusters/cluster/node/@node_menu.html index 5be7aee6..f67820fd 100644 --- a/web/views/@default/clusters/cluster/node/@node_menu.html +++ b/web/views/@default/clusters/cluster/node/@node_menu.html @@ -1,5 +1,5 @@ - 节点列表 + 节点列表 | "{{node.name}}"节点详情 @@ -7,6 +7,6 @@ 节点详情 阈值设置 运行日志 + 安装节点 修改设置 - 安装节点 \ No newline at end of file diff --git a/web/views/@default/clusters/cluster/node/detail.html b/web/views/@default/clusters/cluster/node/detail.html index 3bfb72a3..0ff967a3 100644 --- a/web/views/@default/clusters/cluster/node/detail.html +++ b/web/views/@default/clusters/cluster/node/detail.html @@ -12,6 +12,12 @@ 状态 + + 所属集群 + + + + IP地址 @@ -29,38 +35,34 @@
- + DNS线路 - {{route.name}} + {{route.name}} ({{route.domainName}}) - + DNS记录 - - - - - - + + + + + + - - - - - - - - + + + + + + +
记录名记录类型线路记录值
记录名记录类型线路记录值
{{dnsRecordName}} - AAAA - A - - {{route.name}} - 默认 - {{address.ip}}
{{record.name}}{{record.type}} + {{record.route}} + 默认 + {{record.value}}

通过设置A记录可以将集群上的服务请求转发到不同线路的节点上。

diff --git a/web/views/@default/clusters/cluster/node/update.html b/web/views/@default/clusters/cluster/node/update.html index 9df2c4ca..9eba3067 100644 --- a/web/views/@default/clusters/cluster/node/update.html +++ b/web/views/@default/clusters/cluster/node/update.html @@ -13,6 +13,12 @@ + + 所属集群 + + + + IP地址 * @@ -20,22 +26,13 @@

用于访问节点和域名解析等。

- + DNS线路 -

当前节点对应的DNS线路,可用线路是根据集群设置的域名获取的,注意DNS服务商可能对这些线路有其他限制。

- - 所属集群 - - - - 所属区域 diff --git a/web/views/@default/clusters/cluster/node/update.js b/web/views/@default/clusters/cluster/node/update.js index 4a336bd6..458d10fd 100644 --- a/web/views/@default/clusters/cluster/node/update.js +++ b/web/views/@default/clusters/cluster/node/update.js @@ -1,27 +1,32 @@ Tea.context(function () { - this.clusterId = 0; + this.clusterId = 0 if (this.node.cluster != null && this.node.cluster.id > 0) { - this.clusterId = this.node.cluster.id; + this.clusterId = this.node.cluster.id } - this.success = NotifySuccess("保存成功", "/clusters/cluster/node?clusterId=" + this.clusterId + "&nodeId=" + this.node.id); + this.success = function () { + let that = this + teaweb.success("保存成功", function () { + window.location = "/clusters/cluster/node/detail?clusterId=" + that.clusterId + "&nodeId=" + that.node.id + }) + } // IP地址相关 - this.ipAddresses = this.node.ipAddresses; + this.ipAddresses = this.node.ipAddresses // 认证相关 - this.grant = null; + this.grant = null - this.sshHost = ""; - this.sshPort = ""; - this.loginId = 0; + this.sshHost = "" + this.sshPort = "" + this.loginId = 0 if (this.node.login != null) { - this.loginId = this.node.login.id; + this.loginId = this.node.login.id if (this.node.login.params != null) { - this.sshHost = this.node.login.params.host; + this.sshHost = this.node.login.params.host if (this.node.login.params.port > 0) { - this.sshPort = this.node.login.params.port; + this.sshPort = this.node.login.params.port } } @@ -31,7 +36,11 @@ Tea.context(function () { name: this.node.login.grant.name, method: this.node.login.grant.method, methodName: this.node.login.grant.methodName - }; + } } } -}); \ No newline at end of file + + this.changeClusters = function (info) { + this.clusterId = info.clusterId + } +}) \ No newline at end of file diff --git a/web/views/@default/clusters/cluster/nodes.html b/web/views/@default/clusters/cluster/nodes.html index 89f852e5..e40aadd7 100644 --- a/web/views/@default/clusters/cluster/nodes.html +++ b/web/views/@default/clusters/cluster/nodes.html @@ -68,10 +68,13 @@ {{node.name}}
- 区域:{{node.region.name}} + 区域:{{node.region.name}}
- 分组:{{node.group.name}} + 分组:{{node.group.name}} +
+
+
diff --git a/web/views/@default/clusters/cluster/nodes.js b/web/views/@default/clusters/cluster/nodes.js index 6e626ee5..640fc18c 100644 --- a/web/views/@default/clusters/cluster/nodes.js +++ b/web/views/@default/clusters/cluster/nodes.js @@ -2,9 +2,10 @@ Tea.context(function () { this.teaweb = teaweb this.deleteNode = function (nodeId) { - teaweb.confirm("确定要删除这个节点吗?", function () { + teaweb.confirm("确定要从当前集群中删除这个节点吗?", function () { this.$post("/nodes/delete") .params({ + clusterId: this.clusterId, nodeId: nodeId }) .refresh(); diff --git a/web/views/@default/clusters/cluster/settings/dns/index.html b/web/views/@default/clusters/cluster/settings/dns/index.html index 01d20ab1..ea0e3a8e 100644 --- a/web/views/@default/clusters/cluster/settings/dns/index.html +++ b/web/views/@default/clusters/cluster/settings/dns/index.html @@ -9,14 +9,14 @@ - + - +
选择主域名选择主域名 *

用于生成集群节点和网站服务的DNS解析记录。

DNS子域名DNS子域名 *
diff --git a/web/views/@default/clusters/create.css b/web/views/@default/clusters/create.css new file mode 100644 index 00000000..b817efb2 --- /dev/null +++ b/web/views/@default/clusters/create.css @@ -0,0 +1,4 @@ +h4 span { + font-size: 0.8em; +} +/*# sourceMappingURL=create.css.map */ \ No newline at end of file diff --git a/web/views/@default/clusters/create.css.map b/web/views/@default/clusters/create.css.map new file mode 100644 index 00000000..0c12d393 --- /dev/null +++ b/web/views/@default/clusters/create.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["create.less"],"names":[],"mappings":"AAAA,EAAG;EACF,gBAAA","file":"create.css"} \ No newline at end of file diff --git a/web/views/@default/clusters/create.html b/web/views/@default/clusters/create.html index b1336370..add5dcd8 100644 --- a/web/views/@default/clusters/create.html +++ b/web/views/@default/clusters/create.html @@ -13,17 +13,19 @@
默认缓存设置 * +

此全局设置不会强制应用到每个网站服务。

默认WAF设置 * +

此全局设置不会强制应用到每个网站服务。

-

节点安装选项

+

节点安装选项  (可选)

@@ -49,7 +51,7 @@
默认SSH登录方式
-

DNS设置选项

+

DNS设置选项  (可选)

diff --git a/web/views/@default/clusters/create.less b/web/views/@default/clusters/create.less new file mode 100644 index 00000000..a28c88b2 --- /dev/null +++ b/web/views/@default/clusters/create.less @@ -0,0 +1,3 @@ +h4 span { + font-size: 0.8em; +} \ No newline at end of file diff --git a/web/views/@default/clusters/index.html b/web/views/@default/clusters/index.html index 57c4fdc4..676b7c35 100644 --- a/web/views/@default/clusters/index.html +++ b/web/views/@default/clusters/index.html @@ -93,7 +93,7 @@ @@ -108,18 +108,18 @@
选择主域名
{{node.name}}
- 集群:{{node.cluster.name}} +
diff --git a/web/views/@default/clusters/selectPopup.html b/web/views/@default/clusters/selectPopup.html new file mode 100644 index 00000000..1f0c7941 --- /dev/null +++ b/web/views/@default/clusters/selectPopup.html @@ -0,0 +1,25 @@ +{$layout "layout_popup"} + +

选择集群

+ + + + + + + + + + + + + + + + +
集群名称节点数状态操作
{{cluster.name}}{{cluster.countNodes}} + 已选择 + 选择 +
+ +
\ No newline at end of file diff --git a/web/views/@default/clusters/selectPopup.js b/web/views/@default/clusters/selectPopup.js new file mode 100644 index 00000000..2ec2edf8 --- /dev/null +++ b/web/views/@default/clusters/selectPopup.js @@ -0,0 +1,11 @@ +Tea.context(function () { + this.select = function (cluster) { + NotifyPopup({ + code: 200, + message: "", + data: { + cluster: cluster + } + }) + } +}) \ No newline at end of file diff --git a/web/views/@default/dns/clusters/cluster.html b/web/views/@default/dns/clusters/cluster.html index 692611f2..d995d9e4 100644 --- a/web/views/@default/dns/clusters/cluster.html +++ b/web/views/@default/dns/clusters/cluster.html @@ -71,7 +71,7 @@ 修复
- 修复 + 修复
{{node.ipAddr}} - 没有设置 + 没有设置 {{node.route.name}} - 没有设置 + 没有设置 已解析 未解析 - 修改 + 修改
diff --git a/web/views/@default/dns/clusters/cluster.js b/web/views/@default/dns/clusters/cluster.js index ec504718..c78a78f7 100644 --- a/web/views/@default/dns/clusters/cluster.js +++ b/web/views/@default/dns/clusters/cluster.js @@ -10,8 +10,8 @@ Tea.context(function () { }) } - this.updateNode = function (nodeId) { - teaweb.popup("/dns/issues/updateNodePopup?nodeId=" + nodeId, { + this.updateNode = function (clusterId, nodeId) { + teaweb.popup("/dns/issues/updateNodePopup?clusterId=" + clusterId + "&nodeId=" + nodeId, { height: "26em", callback: function () { teaweb.success("保存成功", function () { diff --git a/web/views/@default/dns/issues/index.html b/web/views/@default/dns/issues/index.html index ba486e57..8baf2846 100644 --- a/web/views/@default/dns/issues/index.html +++ b/web/views/@default/dns/issues/index.html @@ -43,7 +43,7 @@ 修复
- 修复 + 修复
diff --git a/web/views/@default/dns/issues/index.js b/web/views/@default/dns/issues/index.js index abc6488e..02a449f6 100644 --- a/web/views/@default/dns/issues/index.js +++ b/web/views/@default/dns/issues/index.js @@ -17,9 +17,9 @@ Tea.context(function () { }) } - this.updateNode = function (nodeId) { + this.updateNode = function (clusterId, nodeId) { let that = this - teaweb.popup("/dns/issues/updateNodePopup?nodeId=" + nodeId, { + teaweb.popup("/dns/issues/updateNodePopup?clusterId=" + clusterId + "&nodeId=" + nodeId, { callback: function () { teaweb.success("保存成功", function () { that.reload()