From 761cb6ca605733611e65ad0eaf152a9914de2d45 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Wed, 11 Nov 2020 21:32:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0DNS=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=95=86=E8=B4=A6=E5=8F=B7=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/build.sh | 4 + internal/db/models/dns_provider_dao.go | 133 ++++++++++++++++ internal/db/models/dns_provider_dao_test.go | 5 + internal/db/models/dns_provider_model.go | 30 ++++ internal/db/models/dns_provider_model_ext.go | 1 + internal/db/models/node_cluster_dao.go | 34 ++++ internal/db/models/node_cluster_model.go | 6 + internal/db/models/node_model.go | 2 + internal/db/models/server_dao.go | 23 +++ internal/db/models/server_dao_test.go | 10 ++ internal/db/models/server_model.go | 2 + internal/dnsproviders/provider_interface.go | 7 + internal/dnsproviders/types.go | 25 +++ internal/nodes/api_node.go | 1 + internal/rpc/services/service_dns_provider.go | 146 ++++++++++++++++++ internal/rpc/services/service_node_cluster.go | 57 +++++++ internal/rpc/services/service_server.go | 2 + 17 files changed, 488 insertions(+) create mode 100644 internal/db/models/dns_provider_dao.go create mode 100644 internal/db/models/dns_provider_dao_test.go create mode 100644 internal/db/models/dns_provider_model.go create mode 100644 internal/db/models/dns_provider_model_ext.go create mode 100644 internal/dnsproviders/provider_interface.go create mode 100644 internal/dnsproviders/types.go create mode 100644 internal/rpc/services/service_dns_provider.go diff --git a/build/build.sh b/build/build.sh index d7edd737..f550b0bc 100755 --- a/build/build.sh +++ b/build/build.sh @@ -69,6 +69,10 @@ function build() { # building api node env GOOS=$OS GOARCH=$ARCH go build --ldflags="-s -w" -o $DIST/bin/edge-api $ROOT/../cmd/edge-api/main.go + # delete hidden files + find $DIST -name ".DS_Store" -delete + find $DIST -name ".gitignore" -delete + echo "zip files" cd "${DIST}/../" || exit if [ -f "${ZIP}" ]; then diff --git a/internal/db/models/dns_provider_dao.go b/internal/db/models/dns_provider_dao.go new file mode 100644 index 00000000..1a5ff03d --- /dev/null +++ b/internal/db/models/dns_provider_dao.go @@ -0,0 +1,133 @@ +package models + +import ( + "github.com/TeaOSLab/EdgeAPI/internal/errors" + _ "github.com/go-sql-driver/mysql" + "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/types" + "time" +) + +const ( + DNSProviderStateEnabled = 1 // 已启用 + DNSProviderStateDisabled = 0 // 已禁用 +) + +type DNSProviderDAO dbs.DAO + +func NewDNSProviderDAO() *DNSProviderDAO { + return dbs.NewDAO(&DNSProviderDAO{ + DAOObject: dbs.DAOObject{ + DB: Tea.Env, + Table: "edgeDNSProviders", + Model: new(DNSProvider), + PkName: "id", + }, + }).(*DNSProviderDAO) +} + +var SharedDNSProviderDAO *DNSProviderDAO + +func init() { + dbs.OnReady(func() { + SharedDNSProviderDAO = NewDNSProviderDAO() + }) +} + +// 启用条目 +func (this *DNSProviderDAO) EnableDNSProvider(id int64) error { + _, err := this.Query(). + Pk(id). + Set("state", DNSProviderStateEnabled). + Update() + return err +} + +// 禁用条目 +func (this *DNSProviderDAO) DisableDNSProvider(id int64) error { + _, err := this.Query(). + Pk(id). + Set("state", DNSProviderStateDisabled). + Update() + return err +} + +// 查找启用中的条目 +func (this *DNSProviderDAO) FindEnabledDNSProvider(id int64) (*DNSProvider, error) { + result, err := this.Query(). + Pk(id). + Attr("state", DNSProviderStateEnabled). + Find() + if result == nil { + return nil, err + } + return result.(*DNSProvider), err +} + +// 创建服务商 +func (this *DNSProviderDAO) CreateDNSProvider(providerType string, name string, apiParamsJSON []byte, routesJSON []byte) (int64, error) { + op := NewDNSProviderOperator() + op.Type = providerType + op.Name = name + if len(apiParamsJSON) > 0 { + op.ApiParams = apiParamsJSON + } + if len(routesJSON) > 0 { + op.Routes = routesJSON + } + op.State = DNSProviderStateEnabled + op.DataUpdatedAt = time.Now().Unix() + _, err := this.Save(op) + if err != nil { + return 0, err + } + return types.Int64(op.Id), nil +} + +// 修改服务商 +func (this *DNSProviderDAO) UpdateDNSProvider(dnsProviderId int64, name string, apiParamsJSON []byte, routesJSON []byte) error { + if dnsProviderId <= 0 { + return errors.New("invalid dnsProviderId") + } + + op := NewDNSProviderOperator() + op.Id = dnsProviderId + op.Name = name + + // 如果留空则表示不修改 + if len(apiParamsJSON) > 0 { + op.ApiParams = apiParamsJSON + } + + // 如果留空则表示不修改 + if len(routesJSON) > 0 { + op.Routes = routesJSON + } + + op.DataUpdatedAt = time.Now().Unix() + _, err := this.Save(op) + if err != nil { + return err + } + return nil +} + +// 计算服务商数量 +func (this *DNSProviderDAO) CountAllEnabledDNSProviders() (int64, error) { + return this.Query(). + State(DNSProviderStateEnabled). + Count() +} + +// 列出单页服务商 +func (this *DNSProviderDAO) ListEnabledDNSProviders(offset int64, size int64) (result []*DNSProvider, err error) { + _, err = this.Query(). + State(DNSProviderStateEnabled). + Offset(offset). + Limit(size). + DescPk(). + Slice(&result). + FindAll() + return +} diff --git a/internal/db/models/dns_provider_dao_test.go b/internal/db/models/dns_provider_dao_test.go new file mode 100644 index 00000000..97c24b56 --- /dev/null +++ b/internal/db/models/dns_provider_dao_test.go @@ -0,0 +1,5 @@ +package models + +import ( + _ "github.com/go-sql-driver/mysql" +) diff --git a/internal/db/models/dns_provider_model.go b/internal/db/models/dns_provider_model.go new file mode 100644 index 00000000..cdeb43f1 --- /dev/null +++ b/internal/db/models/dns_provider_model.go @@ -0,0 +1,30 @@ +package models + +// DNS服务商 +type DNSProvider struct { + Id uint32 `field:"id"` // ID + Name string `field:"name"` // 名称 + AdminId uint32 `field:"adminId"` // 管理员ID + Type string `field:"type"` // 供应商类型 + ApiParams string `field:"apiParams"` // API参数 + CreatedAt uint64 `field:"createdAt"` // 创建时间 + State uint8 `field:"state"` // 状态 + Routes string `field:"routes"` // 可以使用的线路 + DataUpdatedAt uint64 `field:"dataUpdatedAt"` // 数据同步时间 +} + +type DNSProviderOperator struct { + Id interface{} // ID + Name interface{} // 名称 + AdminId interface{} // 管理员ID + Type interface{} // 供应商类型 + ApiParams interface{} // API参数 + CreatedAt interface{} // 创建时间 + State interface{} // 状态 + Routes interface{} // 可以使用的线路 + DataUpdatedAt interface{} // 数据同步时间 +} + +func NewDNSProviderOperator() *DNSProviderOperator { + return &DNSProviderOperator{} +} diff --git a/internal/db/models/dns_provider_model_ext.go b/internal/db/models/dns_provider_model_ext.go new file mode 100644 index 00000000..2640e7f9 --- /dev/null +++ b/internal/db/models/dns_provider_model_ext.go @@ -0,0 +1 @@ +package models diff --git a/internal/db/models/node_cluster_dao.go b/internal/db/models/node_cluster_dao.go index 76c92152..0a65bdbe 100644 --- a/internal/db/models/node_cluster_dao.go +++ b/internal/db/models/node_cluster_dao.go @@ -268,6 +268,25 @@ func (this *NodeClusterDAO) FindAllEnabledClustersWithGrantId(grantId int64) (re return } +// 计算使用某个DNS服务商的集群数量 +func (this *NodeClusterDAO) CountAllEnabledClustersWithDNSProviderId(dnsProviderId int64) (int64, error) { + return this.Query(). + State(NodeClusterStateEnabled). + Attr("dnsProviderId", dnsProviderId). + Count() +} + +// 获取所有使用某个DNS服务商的集群 +func (this *NodeClusterDAO) FindAllEnabledClustersWithDNSProviderId(dnsProviderId int64) (result []*NodeCluster, err error) { + _, err = this.Query(). + State(NodeClusterStateEnabled). + Attr("dnsProviderId", dnsProviderId). + Slice(&result). + DescPk(). + FindAll() + return +} + // 查找集群的认证ID func (this *NodeClusterDAO) FindClusterGrantId(clusterId int64) (int64, error) { return this.Query(). @@ -276,6 +295,21 @@ func (this *NodeClusterDAO) FindClusterGrantId(clusterId int64) (int64, error) { FindInt64Col(0) } +// 查找DNS信息 +func (this *NodeClusterDAO) FindClusterDNSInfo(clusterId int64) (*NodeCluster, error) { + one, err := this.Query(). + Pk(clusterId). + Result("dnsName", "dnsDomain", "dnsProviderId"). + Find() + if err != nil { + return nil, err + } + if one == nil { + return nil, nil + } + return one.(*NodeCluster), nil +} + // 生成唯一ID func (this *NodeClusterDAO) genUniqueId() (string, error) { for { diff --git a/internal/db/models/node_cluster_model.go b/internal/db/models/node_cluster_model.go index 5253e510..1bb6100a 100644 --- a/internal/db/models/node_cluster_model.go +++ b/internal/db/models/node_cluster_model.go @@ -17,6 +17,9 @@ type NodeCluster struct { UniqueId string `field:"uniqueId"` // 唯一ID Secret string `field:"secret"` // 密钥 HealthCheck string `field:"healthCheck"` // 健康检查 + DnsProviderId uint32 `field:"dnsProviderId"` // 当前使用的DNS供应商 + DnsName string `field:"dnsName"` // DNS名称 + DnsDomain string `field:"dnsDomain"` // DNS域 } type NodeClusterOperator struct { @@ -35,6 +38,9 @@ type NodeClusterOperator struct { UniqueId interface{} // 唯一ID Secret interface{} // 密钥 HealthCheck interface{} // 健康检查 + DnsProviderId interface{} // 当前使用的DNS供应商 + DnsName interface{} // DNS名称 + DnsDomain interface{} // DNS域 } func NewNodeClusterOperator() *NodeClusterOperator { diff --git a/internal/db/models/node_model.go b/internal/db/models/node_model.go index 338b8c85..51f85d42 100644 --- a/internal/db/models/node_model.go +++ b/internal/db/models/node_model.go @@ -23,6 +23,7 @@ type Node struct { State uint8 `field:"state"` // 状态 ConnectedAPINodes string `field:"connectedAPINodes"` // 当前连接的API节点 MaxCPU uint32 `field:"maxCPU"` // 可以使用的最多CPU + DnsRoutes string `field:"dnsRoutes"` // DNS线路设置 } type NodeOperator struct { @@ -47,6 +48,7 @@ type NodeOperator struct { State interface{} // 状态 ConnectedAPINodes interface{} // 当前连接的API节点 MaxCPU interface{} // 可以使用的最多CPU + DnsRoutes interface{} // DNS线路设置 } func NewNodeOperator() *NodeOperator { diff --git a/internal/db/models/server_dao.go b/internal/db/models/server_dao.go index a288fc44..587a9d8f 100644 --- a/internal/db/models/server_dao.go +++ b/internal/db/models/server_dao.go @@ -10,6 +10,7 @@ import ( _ "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/rands" "github.com/iwind/TeaGo/types" "strconv" "strings" @@ -138,6 +139,12 @@ func (this *ServerDAO) CreateServer(adminId int64, userId int64, serverType serv op.GroupIds = groupIdsJSON } + dnsName, err := this.genDNSName() + if err != nil { + return 0, err + } + op.DnsName = dnsName + op.Version = 1 op.IsOn = 1 op.State = ServerStateEnabled @@ -795,3 +802,19 @@ func (this *ServerDAO) CountAllEnabledServersWithGroupId(groupId int64) (int64, func (this *ServerDAO) createEvent() error { return SharedSysEventDAO.CreateEvent(NewServerChangeEvent()) } + +// 生成DNS Name +func (this *ServerDAO) genDNSName() (string, error) { + for { + dnsName := rands.HexString(8) + exist, err := this.Query(). + Attr("dnsName", dnsName). + Exist() + if err != nil { + return "", err + } + if !exist { + return dnsName, nil + } + } +} diff --git a/internal/db/models/server_dao_test.go b/internal/db/models/server_dao_test.go index c8580793..e092481d 100644 --- a/internal/db/models/server_dao_test.go +++ b/internal/db/models/server_dao_test.go @@ -4,6 +4,7 @@ import ( "crypto/md5" "encoding/json" _ "github.com/go-sql-driver/mysql" + "github.com/iwind/TeaGo/dbs" "github.com/iwind/TeaGo/logs" "testing" ) @@ -42,3 +43,12 @@ func TestNewServerDAO_md5(t *testing.T) { h := m.Sum(nil) t.Logf("%x", h) } + +func TestServerDAO_genDNSName(t *testing.T) { + dbs.NotifyReady() + dnsName, err := SharedServerDAO.genDNSName() + if err != nil { + t.Fatal(err) + } + t.Log("dnsName:", dnsName) +} diff --git a/internal/db/models/server_model.go b/internal/db/models/server_model.go index bdd38f13..5ed65bc7 100644 --- a/internal/db/models/server_model.go +++ b/internal/db/models/server_model.go @@ -27,6 +27,7 @@ type Server struct { Version uint32 `field:"version"` // 版本号 CreatedAt uint64 `field:"createdAt"` // 创建时间 State uint8 `field:"state"` // 状态 + DnsName string `field:"dnsName"` // DNS名称 } type ServerOperator struct { @@ -55,6 +56,7 @@ type ServerOperator struct { Version interface{} // 版本号 CreatedAt interface{} // 创建时间 State interface{} // 状态 + DnsName interface{} // DNS名称 } func NewServerOperator() *ServerOperator { diff --git a/internal/dnsproviders/provider_interface.go b/internal/dnsproviders/provider_interface.go new file mode 100644 index 00000000..299e91e9 --- /dev/null +++ b/internal/dnsproviders/provider_interface.go @@ -0,0 +1,7 @@ +package dnsproviders + +// DNS操作接口 +type ProviderInterface interface { + // 检查账号 + +} diff --git a/internal/dnsproviders/types.go b/internal/dnsproviders/types.go new file mode 100644 index 00000000..df9ac8e1 --- /dev/null +++ b/internal/dnsproviders/types.go @@ -0,0 +1,25 @@ +package dnsproviders + +import "github.com/iwind/TeaGo/maps" + +type ProviderType = string + +const ( + ProviderTypeDNSPod ProviderType = "dnspod" +) + +var AllProviderTypes = []maps.Map{ + { + "name": "DNSPod", + "code": ProviderTypeDNSPod, + }, +} + +func FindProviderTypeName(providerType string) string { + for _, t := range AllProviderTypes { + if t.GetString("code") == providerType { + return t.GetString("name") + } + } + return "" +} diff --git a/internal/nodes/api_node.go b/internal/nodes/api_node.go index a0a59b76..43726a2a 100644 --- a/internal/nodes/api_node.go +++ b/internal/nodes/api_node.go @@ -181,6 +181,7 @@ func (this *APINode) listenRPC(listener net.Listener, tlsConfig *tls.Config) err pb.RegisterIPListServiceServer(rpcServer, &services.IPListService{}) pb.RegisterIPItemServiceServer(rpcServer, &services.IPItemService{}) pb.RegisterLogServiceServer(rpcServer, &services.LogService{}) + pb.RegisterDNSProviderServiceServer(rpcServer, &services.DNSProviderService{}) err := rpcServer.Serve(listener) if err != nil { return errors.New("[API]start rpc failed: " + err.Error()) diff --git a/internal/rpc/services/service_dns_provider.go b/internal/rpc/services/service_dns_provider.go new file mode 100644 index 00000000..a42391c5 --- /dev/null +++ b/internal/rpc/services/service_dns_provider.go @@ -0,0 +1,146 @@ +package services + +import ( + "context" + "github.com/TeaOSLab/EdgeAPI/internal/db/models" + "github.com/TeaOSLab/EdgeAPI/internal/dnsproviders" + rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +// DNS服务商相关服务 +type DNSProviderService struct { +} + +// 创建服务商 +func (this *DNSProviderService) CreateDNSProvider(ctx context.Context, req *pb.CreateDNSProviderRequest) (*pb.CreateDNSProviderResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + providerId, err := models.SharedDNSProviderDAO.CreateDNSProvider(req.Type, req.Name, req.ApiParamsJSON, req.RoutesJSON) + if err != nil { + return nil, err + } + + return &pb.CreateDNSProviderResponse{DnsProviderId: providerId}, nil +} + +// 修改服务商 +func (this *DNSProviderService) UpdateDNSProvider(ctx context.Context, req *pb.UpdateDNSProviderRequest) (*pb.RPCUpdateSuccess, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + err = models.SharedDNSProviderDAO.UpdateDNSProvider(req.DnsProviderId, req.Name, req.ApiParamsJSON, req.RoutesJSON) + if err != nil { + return nil, err + } + return rpcutils.RPCUpdateSuccess() +} + +// 计算服务商数量 +func (this *DNSProviderService) CountAllEnabledDNSProviders(ctx context.Context, req *pb.CountAllEnabledDNSProvidersRequest) (*pb.CountAllEnabledDNSProvidersResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + count, err := models.SharedDNSProviderDAO.CountAllEnabledDNSProviders() + if err != nil { + return nil, err + } + return &pb.CountAllEnabledDNSProvidersResponse{Count: count}, nil +} + +// 列出单页服务商信息 +func (this *DNSProviderService) ListEnabledDNSProviders(ctx context.Context, req *pb.ListEnabledDNSProvidersRequest) (*pb.ListEnabledDNSProvidersResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + providers, err := models.SharedDNSProviderDAO.ListEnabledDNSProviders(req.Offset, req.Size) + if err != nil { + return nil, err + } + result := []*pb.DNSProvider{} + for _, provider := range providers { + result = append(result, &pb.DNSProvider{ + Id: int64(provider.Id), + Name: provider.Name, + Type: provider.Type, + TypeName: dnsproviders.FindProviderTypeName(provider.Type), + ApiParamsJSON: []byte(provider.ApiParams), + RoutesJSON: []byte(provider.Routes), + DataUpdatedAt: int64(provider.DataUpdatedAt), + }) + } + return &pb.ListEnabledDNSProvidersResponse{DnsProviders: result}, nil +} + +// 删除服务商 +func (this *DNSProviderService) DeleteDNSProvider(ctx context.Context, req *pb.DeleteDNSProviderRequest) (*pb.RPCDeleteSuccess, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + err = models.SharedDNSProviderDAO.DisableDNSProvider(req.DnsProviderId) + if err != nil { + return nil, err + } + return rpcutils.RPCDeleteSuccess() +} + +// 查找单个服务商 +func (this *DNSProviderService) FindEnabledDNSProvider(ctx context.Context, req *pb.FindEnabledDNSProviderRequest) (*pb.FindEnabledDNSProviderResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + provider, err := models.SharedDNSProviderDAO.FindEnabledDNSProvider(req.DnsProviderId) + if err != nil { + return nil, err + } + if provider == nil { + return &pb.FindEnabledDNSProviderResponse{DnsProvider: nil}, nil + } + + return &pb.FindEnabledDNSProviderResponse{DnsProvider: &pb.DNSProvider{ + Id: int64(provider.Id), + Name: provider.Name, + Type: provider.Type, + TypeName: dnsproviders.FindProviderTypeName(provider.Type), + ApiParamsJSON: []byte(provider.ApiParams), + RoutesJSON: []byte(provider.Routes), + DataUpdatedAt: int64(provider.DataUpdatedAt), + }}, nil +} + +// 取得所有服务商类型 +func (this *DNSProviderService) FindAllDNSProviderTypes(ctx context.Context, req *pb.FindAllDNSProviderTypesRequest) (*pb.FindAllDNSProviderTypesResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + result := []*pb.DNSProviderType{} + for _, t := range dnsproviders.AllProviderTypes { + result = append(result, &pb.DNSProviderType{ + Name: t.GetString("name"), + Code: t.GetString("code"), + }) + } + return &pb.FindAllDNSProviderTypesResponse{ProviderTypes: result}, nil +} diff --git a/internal/rpc/services/service_node_cluster.go b/internal/rpc/services/service_node_cluster.go index 815d5102..fc024b9a 100644 --- a/internal/rpc/services/service_node_cluster.go +++ b/internal/rpc/services/service_node_cluster.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "github.com/TeaOSLab/EdgeAPI/internal/db/models" + "github.com/TeaOSLab/EdgeAPI/internal/dnsproviders" "github.com/TeaOSLab/EdgeAPI/internal/errors" rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" "github.com/TeaOSLab/EdgeAPI/internal/tasks" @@ -350,3 +351,59 @@ func (this *NodeClusterService) FindAllEnabledNodeClustersWithGrantId(ctx contex } return &pb.FindAllEnabledNodeClustersWithGrantIdResponse{Clusters: result}, nil } + +// 查找集群的DNS配置 +func (this *NodeClusterService) FindEnabledNodeClusterDNS(ctx context.Context, req *pb.FindEnabledNodeClusterDNSRequest) (*pb.FindEnabledNodeClusterDNSResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + dnsInfo, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(req.NodeClusterId) + if err != nil { + return nil, err + } + if dnsInfo == nil { + return &pb.FindEnabledNodeClusterDNSResponse{ + Name: "", + Domain: "", + Provider: nil, + }, nil + } + + provider, err := models.SharedDNSProviderDAO.FindEnabledDNSProvider(int64(dnsInfo.DnsProviderId)) + if err != nil { + return nil, err + } + + var pbProvider *pb.DNSProvider = nil + if provider != nil { + pbProvider = &pb.DNSProvider{ + Id: int64(provider.Id), + Type: provider.Type, + TypeName: dnsproviders.FindProviderTypeName(provider.Type), + } + } + + return &pb.FindEnabledNodeClusterDNSResponse{ + Name: dnsInfo.DnsName, + Domain: dnsInfo.DnsDomain, + Provider: pbProvider, + }, nil +} + +// 计算使用某个DNS服务商的集群数量 +func (this *NodeClusterService) CountAllEnabledNodeClustersWithDNSProviderId(ctx context.Context, req *pb.CountAllEnabledNodeClustersWithDNSProviderIdRequest) (*pb.CountAllEnabledNodeClustersWithDNSProviderIdResponse, error) { + // 校验请求 + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin) + if err != nil { + return nil, err + } + + count, err := models.SharedNodeClusterDAO.CountAllEnabledClustersWithDNSProviderId(req.DnsProviderId) + if err != nil { + return nil, err + } + return &pb.CountAllEnabledNodeClustersWithDNSProviderIdResponse{Count: count}, nil +} diff --git a/internal/rpc/services/service_server.go b/internal/rpc/services/service_server.go index 01b78a8e..0c16bc59 100644 --- a/internal/rpc/services/service_server.go +++ b/internal/rpc/services/service_server.go @@ -420,6 +420,7 @@ func (this *ServerService) ListEnabledServersMatch(ctx context.Context, req *pb. ExcludeNodes: []byte(server.ExcludeNodes), ServerNamesJON: []byte(server.ServerNames), CreatedAt: int64(server.CreatedAt), + DnsName: server.DnsName, Cluster: &pb.NodeCluster{ Id: int64(server.ClusterId), Name: clusterName, @@ -515,6 +516,7 @@ func (this *ServerService) FindEnabledServer(ctx context.Context, req *pb.FindEn Type: server.Type, Name: server.Name, Description: server.Description, + DnsName: server.DnsName, Config: []byte(server.Config), ServerNamesJON: []byte(server.ServerNames), HttpJSON: []byte(server.Http),