mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-07 02:20:24 +08:00
单个节点支持多个DNS线路
This commit is contained in:
@@ -19,7 +19,7 @@ func (this *DNSDomain) DecodeRoutes() ([]*dnsclients.Route, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否包含某个线路
|
// 检查是否包含某个线路
|
||||||
func (this *DNSDomain) ContainsRoute(route string) (bool, error) {
|
func (this *DNSDomain) ContainsRouteCode(route string) (bool, error) {
|
||||||
routes, err := this.DecodeRoutes()
|
routes, err := this.DecodeRoutes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
|
|||||||
@@ -458,11 +458,11 @@ func (this *NodeClusterDAO) CheckClusterDNS(cluster *NodeCluster) (issues []*pb.
|
|||||||
for _, node := range nodes {
|
for _, node := range nodes {
|
||||||
nodeId := int64(node.Id)
|
nodeId := int64(node.Id)
|
||||||
|
|
||||||
route, err := node.DNSRoute(domainId)
|
routeCodes, err := node.DNSRouteCodesForDomainId(domainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if len(route) == 0 {
|
if len(routeCodes) == 0 {
|
||||||
issues = append(issues, &pb.DNSIssue{
|
issues = append(issues, &pb.DNSIssue{
|
||||||
Target: node.Name,
|
Target: node.Name,
|
||||||
TargetId: nodeId,
|
TargetId: nodeId,
|
||||||
@@ -477,7 +477,8 @@ func (this *NodeClusterDAO) CheckClusterDNS(cluster *NodeCluster) (issues []*pb.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 检查线路是否在已有线路中
|
// 检查线路是否在已有线路中
|
||||||
routeOk, err := domain.ContainsRoute(route)
|
for _, routeCode := range routeCodes {
|
||||||
|
routeOk, err := domain.ContainsRouteCode(routeCode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -494,6 +495,7 @@ func (this *NodeClusterDAO) CheckClusterDNS(cluster *NodeCluster) (issues []*pb.
|
|||||||
})
|
})
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 检查IP地址
|
// 检查IP地址
|
||||||
ipAddr, err := SharedNodeIPAddressDAO.FindFirstNodeIPAddress(nodeId)
|
ipAddr, err := SharedNodeIPAddressDAO.FindFirstNodeIPAddress(nodeId)
|
||||||
|
|||||||
@@ -629,12 +629,12 @@ func (this *NodeDAO) FindEnabledNodeDNS(nodeId int64) (*Node, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 修改节点的DNS信息
|
// 修改节点的DNS信息
|
||||||
func (this *NodeDAO) UpdateNodeDNS(nodeId int64, routes map[int64]string) error {
|
func (this *NodeDAO) UpdateNodeDNS(nodeId int64, routes map[int64][]string) error {
|
||||||
if nodeId <= 0 {
|
if nodeId <= 0 {
|
||||||
return errors.New("invalid nodeId")
|
return errors.New("invalid nodeId")
|
||||||
}
|
}
|
||||||
if routes == nil {
|
if routes == nil {
|
||||||
routes = map[int64]string{}
|
routes = map[int64][]string{}
|
||||||
}
|
}
|
||||||
routesJSON, err := json.Marshal(routes)
|
routesJSON, err := json.Marshal(routes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -41,28 +41,28 @@ func (this *Node) DecodeStatus() (*nodeconfigs.NodeStatus, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 所有的DNS线路
|
// 所有的DNS线路
|
||||||
func (this *Node) DNSRoutes() (map[int64]string, error) {
|
func (this *Node) DNSRouteCodes() (map[int64][]string, error) {
|
||||||
routes := map[int64]string{} // domainId => route
|
routes := map[int64][]string{} // domainId => routes
|
||||||
if len(this.DnsRoutes) == 0 || this.DnsRoutes == "null" {
|
if len(this.DnsRoutes) == 0 || this.DnsRoutes == "null" {
|
||||||
return routes, nil
|
return routes, nil
|
||||||
}
|
}
|
||||||
err := json.Unmarshal([]byte(this.DnsRoutes), &routes)
|
err := json.Unmarshal([]byte(this.DnsRoutes), &routes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return map[int64]string{}, err
|
return map[int64][]string{}, err
|
||||||
}
|
}
|
||||||
return routes, nil
|
return routes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DNS线路
|
// DNS线路
|
||||||
func (this *Node) DNSRoute(dnsDomainId int64) (string, error) {
|
func (this *Node) DNSRouteCodesForDomainId(dnsDomainId int64) ([]string, error) {
|
||||||
routes := map[int64]string{} // domainId => route
|
routes := map[int64][]string{} // domainId => routes
|
||||||
if len(this.DnsRoutes) == 0 || this.DnsRoutes == "null" {
|
if len(this.DnsRoutes) == 0 || this.DnsRoutes == "null" {
|
||||||
return "", nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
err := json.Unmarshal([]byte(this.DnsRoutes), &routes)
|
err := json.Unmarshal([]byte(this.DnsRoutes), &routes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return nil, err
|
||||||
}
|
}
|
||||||
route, _ := routes[dnsDomainId]
|
domainRoutes, _ := routes[dnsDomainId]
|
||||||
return route, nil
|
return domainRoutes, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -382,13 +382,14 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster,
|
|||||||
if len(ipAddr) == 0 {
|
if len(ipAddr) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
route, err := node.DNSRoute(int64(cluster.DnsDomainId))
|
routeCodes, err := node.DNSRouteCodesForDomainId(int64(cluster.DnsDomainId))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, false, false, err
|
return nil, nil, nil, false, false, err
|
||||||
}
|
}
|
||||||
if len(route) == 0 {
|
if len(routeCodes) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
for _, route := range routeCodes {
|
||||||
key := ipAddr + "_" + route
|
key := ipAddr + "_" + route
|
||||||
nodeKeys = append(nodeKeys, key)
|
nodeKeys = append(nodeKeys, key)
|
||||||
record, ok := nodeRecordMapping[key]
|
record, ok := nodeRecordMapping[key]
|
||||||
@@ -408,6 +409,7 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster,
|
|||||||
doneNodeRecords = append(doneNodeRecords, record)
|
doneNodeRecords = append(doneNodeRecords, record)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 多余的节点域名
|
// 多余的节点域名
|
||||||
for _, record := range nodeRecords {
|
for _, record := range nodeRecords {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
||||||
|
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/events"
|
"github.com/TeaOSLab/EdgeAPI/internal/events"
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/installers"
|
"github.com/TeaOSLab/EdgeAPI/internal/installers"
|
||||||
@@ -55,9 +56,9 @@ func (this *NodeService) CreateNode(ctx context.Context, req *pb.CreateNodeReque
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 保存DNS相关
|
// 保存DNS相关
|
||||||
if req.DnsDomainId > 0 && len(req.DnsRoute) > 0 {
|
if req.DnsDomainId > 0 && len(req.DnsRoutes) > 0 {
|
||||||
err = models.SharedNodeDAO.UpdateNodeDNS(nodeId, map[int64]string{
|
err = models.SharedNodeDAO.UpdateNodeDNS(nodeId, map[int64][]string{
|
||||||
req.DnsDomainId: req.DnsRoute,
|
req.DnsDomainId: req.DnsRoutes,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -150,6 +151,20 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clusterDNS, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(req.ClusterId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
dnsDomainId := int64(clusterDNS.DnsDomainId)
|
||||||
|
domainRoutes := []*dnsclients.Route{}
|
||||||
|
if clusterDNS.DnsDomainId > 0 {
|
||||||
|
domainRoutes, err = models.SharedDNSDomainDAO.FindDomainRoutes(dnsDomainId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nodes, err := models.SharedNodeDAO.ListEnabledNodesMatch(req.Offset, req.Size, req.ClusterId, configutils.ToBoolState(req.InstallState), configutils.ToBoolState(req.ActiveState), req.Keyword, req.GroupId)
|
nodes, err := models.SharedNodeDAO.ListEnabledNodesMatch(req.Offset, req.Size, req.ClusterId, configutils.ToBoolState(req.InstallState), configutils.ToBoolState(req.ActiveState), req.Keyword, req.GroupId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -194,6 +209,24 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DNS线路
|
||||||
|
routeCodes, err := node.DNSRouteCodesForDomainId(dnsDomainId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pbRoutes := []*pb.DNSRoute{}
|
||||||
|
for _, routeCode := range routeCodes {
|
||||||
|
for _, route := range domainRoutes {
|
||||||
|
if route.Code == routeCode {
|
||||||
|
pbRoutes = append(pbRoutes, &pb.DNSRoute{
|
||||||
|
Name: route.Name,
|
||||||
|
Code: route.Code,
|
||||||
|
})
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result = append(result, &pb.Node{
|
result = append(result, &pb.Node{
|
||||||
Id: int64(node.Id),
|
Id: int64(node.Id),
|
||||||
Name: node.Name,
|
Name: node.Name,
|
||||||
@@ -209,6 +242,7 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List
|
|||||||
IsOn: node.IsOn == 1,
|
IsOn: node.IsOn == 1,
|
||||||
IsUp: node.IsUp == 1,
|
IsUp: node.IsUp == 1,
|
||||||
Group: pbGroup,
|
Group: pbGroup,
|
||||||
|
DnsRoutes: pbRoutes,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,6 +339,16 @@ func (this *NodeService) UpdateNode(ctx context.Context, req *pb.UpdateNodeReque
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 保存DNS相关
|
||||||
|
if req.DnsDomainId > 0 && len(req.DnsRoutes) > 0 {
|
||||||
|
err = models.SharedNodeDAO.UpdateNodeDNS(req.NodeId, map[int64][]string{
|
||||||
|
req.DnsDomainId: req.DnsRoutes,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 同步DNS
|
// 同步DNS
|
||||||
go func() {
|
go func() {
|
||||||
// TODO 只有状态变化的时候才需要同步
|
// TODO 只有状态变化的时候才需要同步
|
||||||
@@ -941,15 +985,21 @@ func (this *NodeService) FindAllEnabledNodesDNSWithClusterId(ctx context.Context
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
route, err := node.DNSRoute(dnsDomainId)
|
domainRouteCodes, err := node.DNSRouteCodesForDomainId(dnsDomainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
routeName := ""
|
pbRoutes := []*pb.DNSRoute{}
|
||||||
|
for _, routeCode := range domainRouteCodes {
|
||||||
for _, r := range routes {
|
for _, r := range routes {
|
||||||
if r.Code == route {
|
if r.Code == routeCode {
|
||||||
routeName = r.Name
|
pbRoutes = append(pbRoutes, &pb.DNSRoute{
|
||||||
|
Name: r.Name,
|
||||||
|
Code: r.Code,
|
||||||
|
})
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -957,10 +1007,7 @@ func (this *NodeService) FindAllEnabledNodesDNSWithClusterId(ctx context.Context
|
|||||||
Id: int64(node.Id),
|
Id: int64(node.Id),
|
||||||
Name: node.Name,
|
Name: node.Name,
|
||||||
IpAddr: ipAddr,
|
IpAddr: ipAddr,
|
||||||
Route: &pb.DNSRoute{
|
Routes: pbRoutes,
|
||||||
Name: routeName,
|
|
||||||
Code: route,
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return &pb.FindAllEnabledNodesDNSWithClusterIdResponse{Nodes: result}, nil
|
return &pb.FindAllEnabledNodesDNSWithClusterIdResponse{Nodes: result}, nil
|
||||||
@@ -998,18 +1045,23 @@ func (this *NodeService) FindEnabledNodeDNS(ctx context.Context, req *pb.FindEna
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var route = ""
|
pbRoutes := []*pb.DNSRoute{}
|
||||||
var routeName = ""
|
|
||||||
if dnsDomainId > 0 {
|
if dnsDomainId > 0 {
|
||||||
route, err = node.DNSRoute(dnsDomainId)
|
routeCodes, err := node.DNSRouteCodesForDomainId(dnsDomainId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
routeName, err = models.SharedDNSDomainDAO.FindDomainRouteName(dnsDomainId, route)
|
for _, routeCode := range routeCodes {
|
||||||
|
routeName, err := models.SharedDNSDomainDAO.FindDomainRouteName(dnsDomainId, routeCode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
pbRoutes = append(pbRoutes, &pb.DNSRoute{
|
||||||
|
Name: routeName,
|
||||||
|
Code: routeCode,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ipAddr, err := models.SharedNodeIPAddressDAO.FindFirstNodeIPAddress(int64(node.Id))
|
ipAddr, err := models.SharedNodeIPAddressDAO.FindFirstNodeIPAddress(int64(node.Id))
|
||||||
@@ -1022,10 +1074,7 @@ func (this *NodeService) FindEnabledNodeDNS(ctx context.Context, req *pb.FindEna
|
|||||||
Id: int64(node.Id),
|
Id: int64(node.Id),
|
||||||
Name: node.Name,
|
Name: node.Name,
|
||||||
IpAddr: ipAddr,
|
IpAddr: ipAddr,
|
||||||
Route: &pb.DNSRoute{
|
Routes: pbRoutes,
|
||||||
Name: routeName,
|
|
||||||
Code: route,
|
|
||||||
},
|
|
||||||
ClusterId: clusterId,
|
ClusterId: clusterId,
|
||||||
DnsDomainId: dnsDomainId,
|
DnsDomainId: dnsDomainId,
|
||||||
DnsDomainName: dnsDomainName,
|
DnsDomainName: dnsDomainName,
|
||||||
@@ -1050,15 +1099,15 @@ func (this *NodeService) UpdateNodeDNS(ctx context.Context, req *pb.UpdateNodeDN
|
|||||||
return nil, errors.New("node not found")
|
return nil, errors.New("node not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
routes, err := node.DNSRoutes()
|
routeCodeMap, err := node.DNSRouteCodes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if req.DnsDomainId > 0 && len(req.Route) > 0 {
|
if req.DnsDomainId > 0 && len(req.Routes) > 0 {
|
||||||
routes[req.DnsDomainId] = req.Route
|
routeCodeMap[req.DnsDomainId] = req.Routes
|
||||||
}
|
}
|
||||||
|
|
||||||
err = models.SharedNodeDAO.UpdateNodeDNS(req.NodeId, routes)
|
err = models.SharedNodeDAO.UpdateNodeDNS(req.NodeId, routeCodeMap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user