2020-07-22 22:17:53 +08:00
package models
import (
2020-10-17 11:14:53 +08:00
"encoding/json"
2020-08-30 16:12:00 +08:00
"errors"
2021-01-25 16:40:03 +08:00
"github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
2020-11-14 21:28:07 +08:00
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
2020-11-15 21:17:42 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
2020-12-02 14:26:03 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
2020-11-14 21:28:07 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
2020-10-17 21:15:31 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
2020-07-22 22:17:53 +08:00
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
2021-01-11 18:16:04 +08:00
"github.com/iwind/TeaGo/maps"
2020-10-17 11:14:53 +08:00
"github.com/iwind/TeaGo/rands"
2020-08-30 16:12:00 +08:00
"github.com/iwind/TeaGo/types"
2020-10-17 21:15:31 +08:00
"strconv"
2020-07-22 22:17:53 +08:00
)
const (
NodeClusterStateEnabled = 1 // 已启用
NodeClusterStateDisabled = 0 // 已禁用
)
type NodeClusterDAO dbs . DAO
func NewNodeClusterDAO ( ) * NodeClusterDAO {
return dbs . NewDAO ( & NodeClusterDAO {
DAOObject : dbs . DAOObject {
DB : Tea . Env ,
Table : "edgeNodeClusters" ,
Model : new ( NodeCluster ) ,
PkName : "id" ,
} ,
} ) . ( * NodeClusterDAO )
}
2020-10-13 20:05:13 +08:00
var SharedNodeClusterDAO * NodeClusterDAO
func init ( ) {
dbs . OnReady ( func ( ) {
SharedNodeClusterDAO = NewNodeClusterDAO ( )
} )
}
2020-07-22 22:17:53 +08:00
2021-05-03 11:32:43 +08:00
// EnableNodeCluster 启用条目
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) EnableNodeCluster ( tx * dbs . Tx , id int64 ) error {
_ , err := this . Query ( tx ) .
2020-07-22 22:17:53 +08:00
Pk ( id ) .
Set ( "state" , NodeClusterStateEnabled ) .
Update ( )
2020-08-30 16:12:00 +08:00
return err
2020-07-22 22:17:53 +08:00
}
2021-05-03 11:32:43 +08:00
// DisableNodeCluster 禁用条目
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) DisableNodeCluster ( tx * dbs . Tx , id int64 ) error {
_ , err := this . Query ( tx ) .
2020-07-22 22:17:53 +08:00
Pk ( id ) .
Set ( "state" , NodeClusterStateDisabled ) .
Update ( )
2020-08-30 16:12:00 +08:00
return err
2020-07-22 22:17:53 +08:00
}
2021-05-03 11:32:43 +08:00
// FindEnabledNodeCluster 查找集群
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindEnabledNodeCluster ( tx * dbs . Tx , id int64 ) ( * NodeCluster , error ) {
result , err := this . Query ( tx ) .
2020-07-22 22:17:53 +08:00
Pk ( id ) .
Attr ( "state" , NodeClusterStateEnabled ) .
Find ( )
if result == nil {
return nil , err
}
return result . ( * NodeCluster ) , err
}
2021-05-03 11:32:43 +08:00
// FindEnabledClusterIdWithUniqueId 根据UniqueId获取ID
2020-10-17 11:14:53 +08:00
// TODO 增加缓存
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindEnabledClusterIdWithUniqueId ( tx * dbs . Tx , uniqueId string ) ( int64 , error ) {
return this . Query ( tx ) .
2020-10-17 11:14:53 +08:00
State ( NodeClusterStateEnabled ) .
Attr ( "uniqueId" , uniqueId ) .
ResultPk ( ) .
FindInt64Col ( 0 )
}
2021-05-03 11:32:43 +08:00
// FindNodeClusterName 根据主键查找名称
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindNodeClusterName ( tx * dbs . Tx , id int64 ) ( string , error ) {
return this . Query ( tx ) .
2020-07-22 22:17:53 +08:00
Pk ( id ) .
Result ( "name" ) .
FindStringCol ( "" )
}
2021-05-03 11:32:43 +08:00
// FindAllEnableClusters 查找所有可用的集群
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindAllEnableClusters ( tx * dbs . Tx ) ( result [ ] * NodeCluster , err error ) {
_ , err = this . Query ( tx ) .
2020-07-22 22:17:53 +08:00
State ( NodeClusterStateEnabled ) .
Slice ( & result ) .
Desc ( "order" ) .
DescPk ( ) .
FindAll ( )
return
}
2020-08-30 16:12:00 +08:00
2021-05-03 11:32:43 +08:00
// FindAllEnableClusterIds 查找所有可用的集群Ids
2021-01-17 16:48:00 +08:00
func ( this * NodeClusterDAO ) FindAllEnableClusterIds ( tx * dbs . Tx ) ( result [ ] int64 , err error ) {
ones , err := this . Query ( tx ) .
State ( NodeClusterStateEnabled ) .
ResultPk ( ) .
FindAll ( )
if err != nil {
return nil , err
}
for _ , one := range ones {
result = append ( result , int64 ( one . ( * NodeCluster ) . Id ) )
}
return
}
2021-05-03 11:32:43 +08:00
// CreateCluster 创建集群
2021-01-11 18:16:04 +08:00
func ( this * NodeClusterDAO ) CreateCluster ( tx * dbs . Tx , adminId int64 , name string , grantId int64 , installDir string , dnsDomainId int64 , dnsName string , cachePolicyId int64 , httpFirewallPolicyId int64 , systemServices map [ string ] maps . Map ) ( clusterId int64 , err error ) {
2021-01-27 23:00:02 +08:00
uniqueId , err := this . GenUniqueId ( tx )
2020-10-17 11:14:53 +08:00
if err != nil {
return 0 , err
}
secret := rands . String ( 32 )
2021-01-01 23:31:30 +08:00
err = SharedApiTokenDAO . CreateAPIToken ( tx , uniqueId , secret , NodeRoleCluster )
2020-10-17 11:14:53 +08:00
if err != nil {
return 0 , err
}
2020-08-30 16:12:00 +08:00
op := NewNodeClusterOperator ( )
2020-11-27 09:57:21 +08:00
op . AdminId = adminId
2020-08-30 16:12:00 +08:00
op . Name = name
op . GrantId = grantId
op . InstallDir = installDir
2020-11-15 21:17:42 +08:00
// DNS设置
2020-11-15 16:28:29 +08:00
op . DnsDomainId = dnsDomainId
op . DnsName = dnsName
2020-11-15 21:17:42 +08:00
dnsConfig := & dnsconfigs . ClusterDNSConfig {
NodesAutoSync : true ,
ServersAutoSync : true ,
}
dnsJSON , err := json . Marshal ( dnsConfig )
if err != nil {
return 0 , err
}
op . Dns = dnsJSON
2020-12-17 15:51:02 +08:00
// 缓存策略
op . CachePolicyId = cachePolicyId
// WAF策略
op . HttpFirewallPolicyId = httpFirewallPolicyId
2021-01-11 18:16:04 +08:00
// 系统服务
systemServicesJSON , err := json . Marshal ( systemServices )
if err != nil {
return 0 , err
}
op . SystemServices = systemServicesJSON
2020-09-06 16:19:54 +08:00
op . UseAllAPINodes = 1
op . ApiNodes = "[]"
2020-10-17 11:14:53 +08:00
op . UniqueId = uniqueId
op . Secret = secret
2020-08-30 16:12:00 +08:00
op . State = NodeClusterStateEnabled
2021-01-01 23:31:30 +08:00
err = this . Save ( tx , op )
2020-08-30 16:12:00 +08:00
if err != nil {
return 0 , err
}
return types . Int64 ( op . Id ) , nil
}
2021-05-03 11:32:43 +08:00
// UpdateCluster 修改集群
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) UpdateCluster ( tx * dbs . Tx , clusterId int64 , name string , grantId int64 , installDir string ) error {
2020-08-30 16:12:00 +08:00
if clusterId <= 0 {
return errors . New ( "invalid clusterId" )
}
op := NewNodeClusterOperator ( )
op . Id = clusterId
op . Name = name
op . GrantId = grantId
op . InstallDir = installDir
2021-01-01 23:31:30 +08:00
err := this . Save ( tx , op )
2020-08-30 16:12:00 +08:00
return err
}
2021-05-03 11:32:43 +08:00
// CountAllEnabledClusters 计算所有集群数量
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) CountAllEnabledClusters ( tx * dbs . Tx , keyword string ) ( int64 , error ) {
query := this . Query ( tx ) .
2020-12-24 19:15:17 +08:00
State ( NodeClusterStateEnabled )
if len ( keyword ) > 0 {
query . Where ( "(name LIKE :keyword OR dnsName like :keyword)" ) .
Param ( "keyword" , "%" + keyword + "%" )
}
return query . Count ( )
2020-08-30 16:12:00 +08:00
}
2021-05-03 11:32:43 +08:00
// ListEnabledClusters 列出单页集群
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) ListEnabledClusters ( tx * dbs . Tx , keyword string , offset , size int64 ) ( result [ ] * NodeCluster , err error ) {
query := this . Query ( tx ) .
2020-12-24 19:15:17 +08:00
State ( NodeClusterStateEnabled )
if len ( keyword ) > 0 {
query . Where ( "(name LIKE :keyword OR dnsName like :keyword)" ) .
Param ( "keyword" , "%" + keyword + "%" )
}
_ , err = query .
2020-08-30 16:12:00 +08:00
Offset ( offset ) .
Limit ( size ) .
Slice ( & result ) .
2020-10-17 11:14:53 +08:00
DescPk ( ) .
2020-08-30 16:12:00 +08:00
FindAll ( )
return
}
2020-10-17 11:14:53 +08:00
2021-05-03 11:32:43 +08:00
// FindAllAPINodeAddrsWithCluster 查找所有API节点地址
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindAllAPINodeAddrsWithCluster ( tx * dbs . Tx , clusterId int64 ) ( result [ ] string , err error ) {
one , err := this . Query ( tx ) .
2020-10-17 11:14:53 +08:00
Pk ( clusterId ) .
Result ( "useAllAPINodes" , "apiNodes" ) .
Find ( )
if err != nil {
return nil , err
}
if one == nil {
return nil , nil
}
cluster := one . ( * NodeCluster )
if cluster . UseAllAPINodes == 1 {
2021-01-01 23:31:30 +08:00
apiNodes , err := SharedAPINodeDAO . FindAllEnabledAPINodes ( tx )
2020-10-17 11:14:53 +08:00
if err != nil {
return nil , err
}
for _ , apiNode := range apiNodes {
if apiNode . IsOn != 1 {
continue
}
addrs , err := apiNode . DecodeAccessAddrStrings ( )
if err != nil {
return nil , err
}
result = append ( result , addrs ... )
}
return result , nil
}
apiNodeIds := [ ] int64 { }
if ! IsNotNull ( cluster . ApiNodes ) {
return
}
err = json . Unmarshal ( [ ] byte ( cluster . ApiNodes ) , & apiNodeIds )
if err != nil {
return nil , err
}
for _ , apiNodeId := range apiNodeIds {
2021-01-01 23:31:30 +08:00
apiNode , err := SharedAPINodeDAO . FindEnabledAPINode ( tx , apiNodeId )
2020-10-17 11:14:53 +08:00
if err != nil {
return nil , err
}
if apiNode == nil || apiNode . IsOn != 1 {
continue
}
addrs , err := apiNode . DecodeAccessAddrStrings ( )
if err != nil {
return nil , err
}
result = append ( result , addrs ... )
}
return result , nil
}
2021-05-03 11:32:43 +08:00
// FindClusterHealthCheckConfig 查找健康检查设置
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindClusterHealthCheckConfig ( tx * dbs . Tx , clusterId int64 ) ( * serverconfigs . HealthCheckConfig , error ) {
col , err := this . Query ( tx ) .
2020-10-17 21:15:31 +08:00
Pk ( clusterId ) .
Result ( "healthCheck" ) .
FindStringCol ( "" )
if err != nil {
return nil , err
}
if len ( col ) == 0 || col == "null" {
return nil , nil
}
config := & serverconfigs . HealthCheckConfig { }
err = json . Unmarshal ( [ ] byte ( col ) , config )
if err != nil {
return nil , err
}
return config , nil
}
2021-05-03 11:32:43 +08:00
// UpdateClusterHealthCheck 修改健康检查设置
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) UpdateClusterHealthCheck ( tx * dbs . Tx , clusterId int64 , healthCheckJSON [ ] byte ) error {
2020-10-17 21:15:31 +08:00
if clusterId <= 0 {
return errors . New ( "invalid clusterId '" + strconv . FormatInt ( clusterId , 10 ) + "'" )
}
op := NewNodeClusterOperator ( )
op . Id = clusterId
op . HealthCheck = healthCheckJSON
2021-01-01 23:31:30 +08:00
err := this . Save ( tx , op )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , clusterId )
2020-10-17 21:15:31 +08:00
}
2021-05-03 11:32:43 +08:00
// CountAllEnabledClustersWithGrantId 计算使用某个认证的集群数量
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) CountAllEnabledClustersWithGrantId ( tx * dbs . Tx , grantId int64 ) ( int64 , error ) {
return this . Query ( tx ) .
2020-10-25 21:27:46 +08:00
State ( NodeClusterStateEnabled ) .
Attr ( "grantId" , grantId ) .
Count ( )
}
2021-05-03 11:32:43 +08:00
// FindAllEnabledClustersWithGrantId 获取使用某个认证的所有集群
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindAllEnabledClustersWithGrantId ( tx * dbs . Tx , grantId int64 ) ( result [ ] * NodeCluster , err error ) {
_ , err = this . Query ( tx ) .
2020-10-25 21:27:46 +08:00
State ( NodeClusterStateEnabled ) .
Attr ( "grantId" , grantId ) .
Slice ( & result ) .
DescPk ( ) .
FindAll ( )
return
}
2021-05-03 11:32:43 +08:00
// CountAllEnabledClustersWithDNSProviderId 计算使用某个DNS服务商的集群数量
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) CountAllEnabledClustersWithDNSProviderId ( tx * dbs . Tx , dnsProviderId int64 ) ( int64 , error ) {
return this . Query ( tx ) .
2020-11-11 21:32:25 +08:00
State ( NodeClusterStateEnabled ) .
2021-01-25 16:40:03 +08:00
Where ( "dnsDomainId IN (SELECT id FROM " + dns . SharedDNSDomainDAO . Table + " WHERE state=1 AND providerId=:providerId)" ) .
2020-11-12 14:41:28 +08:00
Param ( "providerId" , dnsProviderId ) .
2020-11-11 21:32:25 +08:00
Count ( )
}
2021-05-03 11:32:43 +08:00
// FindAllEnabledClustersWithDNSProviderId 获取所有使用某个DNS服务商的集群
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindAllEnabledClustersWithDNSProviderId ( tx * dbs . Tx , dnsProviderId int64 ) ( result [ ] * NodeCluster , err error ) {
_ , err = this . Query ( tx ) .
2020-11-11 21:32:25 +08:00
State ( NodeClusterStateEnabled ) .
2021-01-25 16:40:03 +08:00
Where ( "dnsDomainId IN (SELECT id FROM " + dns . SharedDNSDomainDAO . Table + " WHERE state=1 AND providerId=:providerId)" ) .
2020-11-12 14:41:28 +08:00
Param ( "providerId" , dnsProviderId ) .
2020-11-11 21:32:25 +08:00
Slice ( & result ) .
DescPk ( ) .
FindAll ( )
return
}
2021-05-03 11:32:43 +08:00
// CountAllEnabledClustersWithDNSDomainId 计算使用某个DNS域名的集群数量
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) CountAllEnabledClustersWithDNSDomainId ( tx * dbs . Tx , dnsDomainId int64 ) ( int64 , error ) {
return this . Query ( tx ) .
2020-11-12 14:41:28 +08:00
State ( NodeClusterStateEnabled ) .
Attr ( "dnsDomainId" , dnsDomainId ) .
Count ( )
}
2021-05-03 11:32:43 +08:00
// FindAllEnabledClusterIdsWithDNSDomainId 查询使用某个DNS域名的集群ID列表
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindAllEnabledClusterIdsWithDNSDomainId ( tx * dbs . Tx , dnsDomainId int64 ) ( [ ] int64 , error ) {
ones , err := this . Query ( tx ) .
2020-11-13 18:22:22 +08:00
State ( NodeClusterStateEnabled ) .
Attr ( "dnsDomainId" , dnsDomainId ) .
ResultPk ( ) .
FindAll ( )
if err != nil {
return nil , err
}
result := [ ] int64 { }
for _ , one := range ones {
result = append ( result , int64 ( one . ( * NodeCluster ) . Id ) )
}
return result , nil
}
2021-05-03 11:32:43 +08:00
// FindAllEnabledClustersWithDNSDomainId 查询使用某个DNS域名的所有集群域名
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindAllEnabledClustersWithDNSDomainId ( tx * dbs . Tx , dnsDomainId int64 ) ( result [ ] * NodeCluster , err error ) {
_ , err = this . Query ( tx ) .
2020-11-13 18:22:22 +08:00
State ( NodeClusterStateEnabled ) .
Attr ( "dnsDomainId" , dnsDomainId ) .
2020-11-14 21:28:07 +08:00
Result ( "id" , "name" , "dnsName" , "dnsDomainId" ) .
Slice ( & result ) .
FindAll ( )
return
}
2021-05-03 11:32:43 +08:00
// FindAllEnabledClustersHaveDNSDomain 查询已经设置了域名的集群
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindAllEnabledClustersHaveDNSDomain ( tx * dbs . Tx ) ( result [ ] * NodeCluster , err error ) {
_ , err = this . Query ( tx ) .
2020-11-14 21:28:07 +08:00
State ( NodeClusterStateEnabled ) .
Gt ( "dnsDomainId" , 0 ) .
Result ( "id" , "name" , "dnsName" , "dnsDomainId" ) .
2020-11-13 18:22:22 +08:00
Slice ( & result ) .
FindAll ( )
return
}
2021-05-03 11:32:43 +08:00
// FindClusterGrantId 查找集群的认证ID
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindClusterGrantId ( tx * dbs . Tx , clusterId int64 ) ( int64 , error ) {
return this . Query ( tx ) .
2020-10-26 21:14:56 +08:00
Pk ( clusterId ) .
Result ( "grantId" ) .
FindInt64Col ( 0 )
}
2021-05-03 11:32:43 +08:00
// FindClusterDNSInfo 查找DNS信息
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindClusterDNSInfo ( tx * dbs . Tx , clusterId int64 ) ( * NodeCluster , error ) {
one , err := this . Query ( tx ) .
2020-11-11 21:32:25 +08:00
Pk ( clusterId ) .
2020-11-15 21:17:42 +08:00
Result ( "id" , "name" , "dnsName" , "dnsDomainId" , "dns" ) .
2020-11-11 21:32:25 +08:00
Find ( )
if err != nil {
return nil , err
}
if one == nil {
return nil , nil
}
return one . ( * NodeCluster ) , nil
}
2021-05-03 11:32:43 +08:00
// ExistClusterDNSName 检查某个子域名是否可用
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) ExistClusterDNSName ( tx * dbs . Tx , dnsName string , excludeClusterId int64 ) ( bool , error ) {
return this . Query ( tx ) .
2020-11-13 18:22:22 +08:00
Attr ( "dnsName" , dnsName ) .
State ( NodeClusterStateEnabled ) .
Where ( "id!=:clusterId" ) .
Param ( "clusterId" , excludeClusterId ) .
Exist ( )
}
2021-05-03 11:32:43 +08:00
// UpdateClusterDNS 修改集群DNS相关信息
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) UpdateClusterDNS ( tx * dbs . Tx , clusterId int64 , dnsName string , dnsDomainId int64 , nodesAutoSync bool , serversAutoSync bool ) error {
2020-11-13 18:22:22 +08:00
if clusterId <= 0 {
return errors . New ( "invalid clusterId" )
}
op := NewNodeClusterOperator ( )
op . Id = clusterId
op . DnsName = dnsName
op . DnsDomainId = dnsDomainId
2020-11-15 21:17:42 +08:00
dnsConfig := & dnsconfigs . ClusterDNSConfig {
NodesAutoSync : nodesAutoSync ,
ServersAutoSync : serversAutoSync ,
}
dnsJSON , err := json . Marshal ( dnsConfig )
if err != nil {
return err
}
op . Dns = dnsJSON
2021-01-01 23:31:30 +08:00
err = this . Save ( tx , op )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
2021-01-27 23:00:02 +08:00
err = this . NotifyUpdate ( tx , clusterId )
if err != nil {
return err
}
return this . NotifyDNSUpdate ( tx , clusterId )
2020-11-13 18:22:22 +08:00
}
2021-05-03 11:32:43 +08:00
// CheckClusterDNS 检查集群的DNS问题
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) CheckClusterDNS ( tx * dbs . Tx , cluster * NodeCluster ) ( issues [ ] * pb . DNSIssue , err error ) {
2020-11-14 21:28:07 +08:00
clusterId := int64 ( cluster . Id )
domainId := int64 ( cluster . DnsDomainId )
// 检查域名
2021-01-25 16:40:03 +08:00
domain , err := dns . SharedDNSDomainDAO . FindEnabledDNSDomain ( tx , domainId )
2020-11-14 21:28:07 +08:00
if err != nil {
return nil , err
}
if domain == nil {
issues = append ( issues , & pb . DNSIssue {
Target : cluster . Name ,
TargetId : clusterId ,
Type : "cluster" ,
Description : "域名选择错误,需要重新选择" ,
Params : nil ,
} )
return
}
// 检查二级域名
if len ( cluster . DnsName ) == 0 {
issues = append ( issues , & pb . DNSIssue {
Target : cluster . Name ,
TargetId : clusterId ,
Type : "cluster" ,
Description : "没有设置二级域名" ,
Params : nil ,
} )
return
}
// TODO 检查域名格式
// TODO 检查域名是否已解析
// 检查节点
2021-01-01 23:31:30 +08:00
nodes , err := SharedNodeDAO . FindAllEnabledNodesDNSWithClusterId ( tx , clusterId )
2020-11-14 21:28:07 +08:00
if err != nil {
return nil , err
}
// TODO 检查节点数量不能为0
for _ , node := range nodes {
nodeId := int64 ( node . Id )
2020-11-16 13:03:20 +08:00
routeCodes , err := node . DNSRouteCodesForDomainId ( domainId )
2020-11-14 21:28:07 +08:00
if err != nil {
return nil , err
}
2020-11-16 13:03:20 +08:00
if len ( routeCodes ) == 0 {
2020-11-14 21:28:07 +08:00
issues = append ( issues , & pb . DNSIssue {
Target : node . Name ,
TargetId : nodeId ,
Type : "node" ,
Description : "没有选择节点所属线路" ,
Params : map [ string ] string {
"clusterName" : cluster . Name ,
"clusterId" : numberutils . FormatInt64 ( clusterId ) ,
} ,
} )
continue
}
// 检查线路是否在已有线路中
2020-11-16 13:03:20 +08:00
for _ , routeCode := range routeCodes {
routeOk , err := domain . ContainsRouteCode ( routeCode )
if err != nil {
return nil , err
}
if ! routeOk {
issues = append ( issues , & pb . DNSIssue {
Target : node . Name ,
TargetId : nodeId ,
Type : "node" ,
Description : "线路已经失效,请重新选择" ,
Params : map [ string ] string {
"clusterName" : cluster . Name ,
"clusterId" : numberutils . FormatInt64 ( clusterId ) ,
} ,
} )
continue
}
2020-11-14 21:28:07 +08:00
}
// 检查IP地址
2021-01-27 23:00:02 +08:00
ipAddr , err := SharedNodeIPAddressDAO . FindFirstNodeAccessIPAddress ( tx , nodeId )
2020-11-14 21:28:07 +08:00
if err != nil {
return nil , err
}
if len ( ipAddr ) == 0 {
issues = append ( issues , & pb . DNSIssue {
Target : node . Name ,
TargetId : nodeId ,
Type : "node" ,
Description : "没有设置IP地址" ,
Params : map [ string ] string {
"clusterName" : cluster . Name ,
"clusterId" : numberutils . FormatInt64 ( clusterId ) ,
} ,
} )
continue
}
// TODO 检查是否有解析记录
}
return
}
2021-05-03 11:32:43 +08:00
// FindClusterAdminId 查找集群所属管理员
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindClusterAdminId ( tx * dbs . Tx , clusterId int64 ) ( int64 , error ) {
return this . Query ( tx ) .
2020-11-27 09:57:21 +08:00
Pk ( clusterId ) .
Result ( "adminId" ) .
FindInt64Col ( 0 )
}
2021-05-03 11:32:43 +08:00
// FindClusterTOAConfig 查找集群的TOA设置
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindClusterTOAConfig ( tx * dbs . Tx , clusterId int64 ) ( * nodeconfigs . TOAConfig , error ) {
toa , err := this . Query ( tx ) .
2020-12-02 14:26:03 +08:00
Pk ( clusterId ) .
Result ( "toa" ) .
FindStringCol ( "" )
if err != nil {
return nil , err
}
if ! IsNotNull ( toa ) {
return nodeconfigs . DefaultTOAConfig ( ) , nil
}
config := & nodeconfigs . TOAConfig { }
err = json . Unmarshal ( [ ] byte ( toa ) , config )
if err != nil {
return nil , err
}
return config , nil
}
2021-05-03 11:32:43 +08:00
// UpdateClusterTOA 修改集群的TOA设置
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) UpdateClusterTOA ( tx * dbs . Tx , clusterId int64 , toaJSON [ ] byte ) error {
2020-12-02 14:26:03 +08:00
if clusterId <= 0 {
return errors . New ( "invalid clusterId" )
}
op := NewNodeClusterOperator ( )
op . Id = clusterId
op . Toa = toaJSON
2021-01-01 23:31:30 +08:00
err := this . Save ( tx , op )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , clusterId )
2020-12-02 14:26:03 +08:00
}
2021-05-03 11:32:43 +08:00
// CountAllEnabledNodeClustersWithHTTPCachePolicyId 计算使用某个缓存策略的集群数量
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) CountAllEnabledNodeClustersWithHTTPCachePolicyId ( tx * dbs . Tx , httpCachePolicyId int64 ) ( int64 , error ) {
return this . Query ( tx ) .
2020-12-17 15:51:02 +08:00
State ( NodeClusterStateEnabled ) .
Attr ( "cachePolicyId" , httpCachePolicyId ) .
Count ( )
}
2021-05-03 11:32:43 +08:00
// FindAllEnabledNodeClustersWithHTTPCachePolicyId 查找使用缓存策略的所有集群
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindAllEnabledNodeClustersWithHTTPCachePolicyId ( tx * dbs . Tx , httpCachePolicyId int64 ) ( result [ ] * NodeCluster , err error ) {
_ , err = this . Query ( tx ) .
2020-12-17 15:51:02 +08:00
State ( NodeClusterStateEnabled ) .
Attr ( "cachePolicyId" , httpCachePolicyId ) .
DescPk ( ) .
Slice ( & result ) .
FindAll ( )
return
}
2021-05-03 11:32:43 +08:00
// CountAllEnabledNodeClustersWithHTTPFirewallPolicyId 计算使用某个WAF策略的集群数量
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) CountAllEnabledNodeClustersWithHTTPFirewallPolicyId ( tx * dbs . Tx , httpFirewallPolicyId int64 ) ( int64 , error ) {
return this . Query ( tx ) .
2020-12-17 15:51:02 +08:00
State ( NodeClusterStateEnabled ) .
Attr ( "httpFirewallPolicyId" , httpFirewallPolicyId ) .
Count ( )
}
2021-05-03 11:32:43 +08:00
// FindAllEnabledNodeClustersWithHTTPFirewallPolicyId 查找使用WAF策略的所有集群
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindAllEnabledNodeClustersWithHTTPFirewallPolicyId ( tx * dbs . Tx , httpFirewallPolicyId int64 ) ( result [ ] * NodeCluster , err error ) {
_ , err = this . Query ( tx ) .
2020-12-17 15:51:02 +08:00
State ( NodeClusterStateEnabled ) .
Attr ( "httpFirewallPolicyId" , httpFirewallPolicyId ) .
DescPk ( ) .
Slice ( & result ) .
FindAll ( )
return
}
2021-05-03 11:32:43 +08:00
// FindAllEnabledNodeClusterIdsWithHTTPFirewallPolicyId 查找使用WAF策略的所有集群Ids
2021-01-17 16:48:00 +08:00
func ( this * NodeClusterDAO ) FindAllEnabledNodeClusterIdsWithHTTPFirewallPolicyId ( tx * dbs . Tx , httpFirewallPolicyId int64 ) ( result [ ] int64 , err error ) {
ones , err := this . Query ( tx ) .
State ( NodeClusterStateEnabled ) .
Attr ( "httpFirewallPolicyId" , httpFirewallPolicyId ) .
ResultPk ( ) .
FindAll ( )
for _ , one := range ones {
result = append ( result , int64 ( one . ( * NodeCluster ) . Id ) )
}
return
}
2021-05-03 11:32:43 +08:00
// FindAllEnabledNodeClusterIdsWithCachePolicyId 查找使用缓存策略的所有集群Ids
2021-01-17 16:48:00 +08:00
func ( this * NodeClusterDAO ) FindAllEnabledNodeClusterIdsWithCachePolicyId ( tx * dbs . Tx , cachePolicyId int64 ) ( result [ ] int64 , err error ) {
ones , err := this . Query ( tx ) .
State ( NodeClusterStateEnabled ) .
Attr ( "cachePolicyId" , cachePolicyId ) .
ResultPk ( ) .
FindAll ( )
for _ , one := range ones {
result = append ( result , int64 ( one . ( * NodeCluster ) . Id ) )
}
return
}
2021-05-03 11:32:43 +08:00
// FindClusterHTTPFirewallPolicyId 获取集群的WAF策略ID
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindClusterHTTPFirewallPolicyId ( tx * dbs . Tx , clusterId int64 ) ( int64 , error ) {
return this . Query ( tx ) .
2020-12-17 17:36:20 +08:00
Pk ( clusterId ) .
Result ( "httpFirewallPolicyId" ) .
FindInt64Col ( 0 )
}
2021-05-03 11:32:43 +08:00
// UpdateNodeClusterHTTPCachePolicyId 设置集群的缓存策略
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) UpdateNodeClusterHTTPCachePolicyId ( tx * dbs . Tx , clusterId int64 , httpCachePolicyId int64 ) error {
_ , err := this . Query ( tx ) .
2020-12-17 15:51:02 +08:00
Pk ( clusterId ) .
Set ( "cachePolicyId" , httpCachePolicyId ) .
Update ( )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , clusterId )
2020-12-17 15:51:02 +08:00
}
2021-05-03 11:32:43 +08:00
// FindClusterHTTPCachePolicyId 获取集群的缓存策略ID
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) FindClusterHTTPCachePolicyId ( tx * dbs . Tx , clusterId int64 ) ( int64 , error ) {
return this . Query ( tx ) .
2020-12-17 17:36:20 +08:00
Pk ( clusterId ) .
Result ( "cachePolicyId" ) .
FindInt64Col ( 0 )
}
2021-05-03 11:32:43 +08:00
// UpdateNodeClusterHTTPFirewallPolicyId 设置集群的WAF策略
2021-01-01 23:31:30 +08:00
func ( this * NodeClusterDAO ) UpdateNodeClusterHTTPFirewallPolicyId ( tx * dbs . Tx , clusterId int64 , httpFirewallPolicyId int64 ) error {
_ , err := this . Query ( tx ) .
2020-12-17 15:51:02 +08:00
Pk ( clusterId ) .
Set ( "httpFirewallPolicyId" , httpFirewallPolicyId ) .
Update ( )
2021-01-17 16:48:00 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , clusterId )
2020-12-17 15:51:02 +08:00
}
2021-05-03 11:32:43 +08:00
// UpdateNodeClusterSystemService 修改集群的系统服务设置
2021-01-11 18:16:04 +08:00
func ( this * NodeClusterDAO ) UpdateNodeClusterSystemService ( tx * dbs . Tx , clusterId int64 , serviceType nodeconfigs . SystemServiceType , params maps . Map ) error {
if clusterId <= 0 {
return errors . New ( "invalid clusterId" )
}
service , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "systemServices" ) .
FindStringCol ( "" )
if err != nil {
return err
}
servicesMap := map [ string ] maps . Map { }
if IsNotNull ( service ) {
err = json . Unmarshal ( [ ] byte ( service ) , & servicesMap )
if err != nil {
return err
}
}
if params == nil {
params = maps . Map { }
}
servicesMap [ serviceType ] = params
servicesJSON , err := json . Marshal ( servicesMap )
if err != nil {
return err
}
_ , err = this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "systemServices" , servicesJSON ) .
Update ( )
if err != nil {
return err
}
2021-01-17 16:48:00 +08:00
return this . NotifyUpdate ( tx , clusterId )
2021-01-11 18:16:04 +08:00
}
2021-05-03 11:32:43 +08:00
// FindNodeClusterSystemServiceParams 查找集群的系统服务设置
2021-01-11 18:16:04 +08:00
func ( this * NodeClusterDAO ) FindNodeClusterSystemServiceParams ( tx * dbs . Tx , clusterId int64 , serviceType nodeconfigs . SystemServiceType ) ( params maps . Map , err error ) {
if clusterId <= 0 {
return nil , errors . New ( "invalid clusterId" )
}
service , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "systemServices" ) .
FindStringCol ( "" )
if err != nil {
return nil , err
}
servicesMap := map [ string ] maps . Map { }
if IsNotNull ( service ) {
err = json . Unmarshal ( [ ] byte ( service ) , & servicesMap )
if err != nil {
return nil , err
}
}
return servicesMap [ serviceType ] , nil
}
2021-05-03 11:32:43 +08:00
// FindNodeClusterSystemServices 查找集群的所有服务设置
2021-01-11 18:16:04 +08:00
func ( this * NodeClusterDAO ) FindNodeClusterSystemServices ( tx * dbs . Tx , clusterId int64 ) ( services map [ string ] maps . Map , err error ) {
if clusterId <= 0 {
return nil , errors . New ( "invalid clusterId" )
}
service , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "systemServices" ) .
FindStringCol ( "" )
if err != nil {
return nil , err
}
servicesMap := map [ string ] maps . Map { }
if IsNotNull ( service ) {
err = json . Unmarshal ( [ ] byte ( service ) , & servicesMap )
if err != nil {
return nil , err
}
}
return servicesMap , nil
}
2021-05-03 11:32:43 +08:00
// GenUniqueId 生成唯一ID
2021-01-27 23:00:02 +08:00
func ( this * NodeClusterDAO ) GenUniqueId ( tx * dbs . Tx ) ( string , error ) {
2020-10-17 11:14:53 +08:00
for {
uniqueId := rands . HexString ( 32 )
2021-01-01 23:31:30 +08:00
ok , err := this . Query ( tx ) .
2020-10-17 11:14:53 +08:00
Attr ( "uniqueId" , uniqueId ) .
Exist ( )
if err != nil {
return "" , err
}
if ok {
continue
}
return uniqueId , nil
}
}
2021-01-17 16:48:00 +08:00
2021-05-03 11:32:43 +08:00
// FindLatestNodeClusters 查询最近访问的集群
func ( this * NodeClusterDAO ) FindLatestNodeClusters ( tx * dbs . Tx , size int64 ) ( result [ ] * NodeCluster , err error ) {
_ , err = this . Query ( tx ) .
Result ( this . Table + ".id" , this . Table + ".name" ) .
Join ( SharedLatestItemDAO , dbs . QueryJoinRight , this . Table + ".id=" + SharedLatestItemDAO . Table + ".itemId AND " + SharedLatestItemDAO . Table + ".itemType='cluster'" ) .
Asc ( "CEIL((UNIX_TIMESTAMP() - updatedAt)/(7 * 86400))" ) . // 优先一个星期以内的
Desc ( SharedLatestItemDAO . Table + ".count" ) .
State ( NodeClusterStateEnabled ) .
Limit ( size ) .
Slice ( & result ) .
FindAll ( )
return
}
// NotifyUpdate 通知更新
2021-01-17 16:48:00 +08:00
func ( this * NodeClusterDAO ) NotifyUpdate ( tx * dbs . Tx , clusterId int64 ) error {
return SharedNodeTaskDAO . CreateClusterTask ( tx , clusterId , NodeTaskTypeConfigChanged )
}
2021-01-27 23:00:02 +08:00
2021-05-03 11:32:43 +08:00
// NotifyDNSUpdate 通知DNS更新
2021-01-27 23:00:02 +08:00
// TODO 更新新的DNS解析记录的同时, 需要删除老的DNS解析记录
func ( this * NodeClusterDAO ) NotifyDNSUpdate ( tx * dbs . Tx , clusterId int64 ) error {
err := dns . SharedDNSTaskDAO . CreateClusterTask ( tx , clusterId , dns . DNSTaskTypeClusterChange )
if err != nil {
return err
}
return nil
}