单个节点支持多个DNS线路

This commit is contained in:
刘祥超
2020-11-16 13:03:20 +08:00
parent 5ef3e4acaf
commit b331cb71b0
6 changed files with 131 additions and 78 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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
} }

View File

@@ -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 {

View File

@@ -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
} }