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"
2022-03-27 12:22:47 +08:00
dbutils "github.com/TeaOSLab/EdgeAPI/internal/db/utils"
2021-11-11 14:16:42 +08:00
"github.com/TeaOSLab/EdgeAPI/internal/utils"
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-10-17 21:15:31 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
2022-05-18 21:02:53 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/ddosconfigs"
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 禁用条目
2022-07-28 09:47:01 +08:00
func ( this * NodeClusterDAO ) DisableNodeCluster ( tx * dbs . Tx , clusterId int64 ) error {
2021-01-01 23:31:30 +08:00
_ , err := this . Query ( tx ) .
2022-07-28 09:47:01 +08:00
Pk ( clusterId ) .
2020-07-22 22:17:53 +08:00
Set ( "state" , NodeClusterStateDisabled ) .
Update ( )
2022-07-28 09:47:01 +08:00
if err != nil {
return err
}
return SharedNodeLogDAO . DeleteNodeLogsWithCluster ( tx , nodeconfigs . NodeRoleNode , clusterId )
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-06-30 19:59:49 +08:00
func ( this * NodeClusterDAO ) FindNodeClusterName ( tx * dbs . Tx , clusterId int64 ) ( string , error ) {
2021-01-01 23:31:30 +08:00
return this . Query ( tx ) .
2021-06-30 19:59:49 +08:00
Pk ( clusterId ) .
2020-07-22 22:17:53 +08:00
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 ) .
2023-06-30 18:54:45 +08:00
Result ( NodeClusterField_Id , NodeClusterField_Name , NodeClusterField_IsOn , NodeClusterField_HealthCheck , NodeClusterField_AutoRemoteStart , NodeClusterField_AutoRegister , NodeClusterField_CreatedAt , NodeClusterField_UniqueId , NodeClusterField_Secret ) .
2020-07-22 22:17:53 +08:00
State ( NodeClusterStateEnabled ) .
Slice ( & result ) .
2022-04-07 18:31:38 +08:00
Desc ( "isPinned" ) .
2020-07-22 22:17:53 +08:00
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 创建集群
2022-09-17 21:05:18 +08:00
func ( this * NodeClusterDAO ) CreateCluster ( tx * dbs . Tx , adminId int64 , name string , grantId int64 , installDir string , dnsDomainId int64 , dnsName string , dnsTTL int32 , cachePolicyId int64 , httpFirewallPolicyId int64 , systemServices map [ string ] maps . Map , globalServerConfig * serverconfigs . GlobalServerConfig , autoInstallNftables bool ) ( 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
}
2022-09-08 11:02:26 +08:00
var secret = rands . String ( 32 )
2021-05-26 14:40:05 +08:00
err = SharedApiTokenDAO . CreateAPIToken ( tx , uniqueId , secret , nodeconfigs . NodeRoleCluster )
2020-10-17 11:14:53 +08:00
if err != nil {
return 0 , err
}
2022-07-24 09:56:27 +08:00
var 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
2022-07-14 09:49:09 +08:00
var dnsConfig = & dnsconfigs . ClusterDNSConfig {
2022-08-25 19:18:30 +08:00
NodesAutoSync : true ,
ServersAutoSync : true ,
2022-09-21 15:09:39 +08:00
CNAMERecords : [ ] string { } ,
CNAMEAsDomain : true ,
2022-09-08 11:02:26 +08:00
TTL : dnsTTL ,
2022-08-25 19:18:30 +08:00
IncludingLnNodes : true ,
2020-11-15 21:17:42 +08:00
}
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
2022-09-16 19:34:19 +08:00
// 全局服务配置
if globalServerConfig == nil {
globalServerConfig = serverconfigs . DefaultGlobalServerConfig ( )
}
globalServerConfigJSON , err := json . Marshal ( globalServerConfig )
if err != nil {
return 0 , err
}
op . GlobalServerConfig = globalServerConfigJSON
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
2022-09-17 21:05:18 +08:00
op . AutoInstallNftables = autoInstallNftables
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 修改集群
2022-10-26 19:25:07 +08:00
func ( this * NodeClusterDAO ) UpdateCluster ( tx * dbs . Tx , clusterId int64 , name string , grantId int64 , installDir string , timezone string , nodeMaxThreads int32 , autoOpenPorts bool , clockConfig * nodeconfigs . ClockConfig , autoRemoteStart bool , autoInstallTables bool , sshParams * nodeconfigs . SSHParams ) error {
2020-08-30 16:12:00 +08:00
if clusterId <= 0 {
return errors . New ( "invalid clusterId" )
}
2022-07-24 09:56:27 +08:00
var op = NewNodeClusterOperator ( )
2020-08-30 16:12:00 +08:00
op . Id = clusterId
op . Name = name
op . GrantId = grantId
op . InstallDir = installDir
2021-10-12 11:44:24 +08:00
op . TimeZone = timezone
2021-12-09 18:49:51 +08:00
if nodeMaxThreads < 0 {
nodeMaxThreads = 0
}
op . NodeMaxThreads = nodeMaxThreads
2022-01-03 16:27:50 +08:00
op . AutoOpenPorts = autoOpenPorts
2021-12-09 18:49:51 +08:00
2022-09-15 15:56:50 +08:00
if clockConfig != nil {
clockJSON , err := json . Marshal ( clockConfig )
if err != nil {
return err
}
op . Clock = clockJSON
}
2022-09-17 15:11:34 +08:00
op . AutoRemoteStart = autoRemoteStart
2022-09-17 21:05:18 +08:00
op . AutoInstallNftables = autoInstallTables
2022-09-17 15:11:34 +08:00
2022-10-26 19:25:07 +08:00
if sshParams != nil {
sshParamsJSON , err := json . Marshal ( sshParams )
if err != nil {
return err
}
op . SshParams = sshParamsJSON
}
2021-01-01 23:31:30 +08:00
err := this . Save ( tx , op )
2021-10-12 11:44:24 +08:00
if err != nil {
return err
}
return this . NotifyUpdate ( tx , clusterId )
2020-08-30 16:12:00 +08:00
}
2022-03-17 11:12:46 +08:00
// UpdateClusterIsPinned 设置集群是否置顶
func ( this * NodeClusterDAO ) UpdateClusterIsPinned ( tx * dbs . Tx , clusterId int64 , isPinned bool ) error {
return this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "isPinned" , isPinned ) .
UpdateQuickly ( )
}
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 {
2021-08-25 18:39:17 +08:00
query . Where ( "(name LIKE :keyword OR dnsName like :keyword OR (dnsDomainId > 0 AND dnsDomainId IN (SELECT id FROM " + dns . SharedDNSDomainDAO . Table + " WHERE name LIKE :keyword AND state=1)))" ) .
2022-03-27 12:22:47 +08:00
Param ( "keyword" , dbutils . QuoteLike ( keyword ) )
2020-12-24 19:15:17 +08:00
}
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 ) {
2023-06-23 16:15:22 +08:00
var query = this . Query ( tx ) .
2020-12-24 19:15:17 +08:00
State ( NodeClusterStateEnabled )
if len ( keyword ) > 0 {
2021-08-25 18:39:17 +08:00
query . Where ( "(name LIKE :keyword OR dnsName like :keyword OR (dnsDomainId > 0 AND dnsDomainId IN (SELECT id FROM " + dns . SharedDNSDomainDAO . Table + " WHERE name LIKE :keyword AND state=1)))" ) .
2022-03-27 12:22:47 +08:00
Param ( "keyword" , dbutils . QuoteLike ( keyword ) )
2020-12-24 19:15:17 +08:00
}
_ , err = query .
2023-06-23 16:15:22 +08:00
Result (
2023-06-30 18:54:45 +08:00
NodeClusterField_Id ,
NodeClusterField_Name ,
NodeClusterField_IsOn ,
NodeClusterField_IsPinned ,
NodeClusterField_InstallDir ,
NodeClusterField_HttpFirewallPolicyId ,
NodeClusterField_AdminId ,
NodeClusterField_IsOn ,
NodeClusterField_IsAD ,
NodeClusterField_UserId ,
NodeClusterField_DnsName ,
NodeClusterField_DnsDomainId ,
NodeClusterField_Dns ,
NodeClusterField_CreatedAt ,
NodeClusterField_UniqueId ,
NodeClusterField_Secret ,
NodeClusterField_GrantId ,
NodeClusterField_TimeZone ,
2023-06-23 16:15:22 +08:00
) .
2020-08-30 16:12:00 +08:00
Offset ( offset ) .
Limit ( size ) .
Slice ( & result ) .
2022-03-17 11:12:46 +08:00
Desc ( "isPinned" ) .
2020-10-17 11:14:53 +08:00
DescPk ( ) .
2020-08-30 16:12:00 +08:00
FindAll ( )
2023-06-23 16:15:22 +08:00
2020-08-30 16:12:00 +08:00
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 {
2022-03-22 21:45:07 +08:00
if ! apiNode . IsOn {
2020-10-17 11:14:53 +08:00
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
}
2022-03-21 21:39:36 +08:00
err = json . Unmarshal ( cluster . ApiNodes , & apiNodeIds )
2020-10-17 11:14:53 +08:00
if err != nil {
return nil , err
}
for _ , apiNodeId := range apiNodeIds {
2022-01-19 16:53:52 +08:00
apiNode , err := SharedAPINodeDAO . FindEnabledAPINode ( tx , apiNodeId , nil )
2020-10-17 11:14:53 +08:00
if err != nil {
return nil , err
}
2022-03-22 21:45:07 +08:00
if apiNode == nil || ! apiNode . IsOn {
2020-10-17 11:14:53 +08:00
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 ) + "'" )
}
2022-07-24 09:56:27 +08:00
var op = NewNodeClusterOperator ( )
2020-10-17 21:15:31 +08:00
op . Id = clusterId
op . HealthCheck = healthCheckJSON
2021-08-29 16:01:31 +08:00
// 不需要通知更新
return this . Save ( tx , op )
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 ) .
2022-11-05 19:25:35 +08:00
Result ( "id" , "name" , "dnsName" , "dnsDomainId" , "isOn" , "dns" ) .
2020-11-14 21:28:07 +08:00
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 ) .
2021-07-31 22:23:11 +08:00
Result ( "id" , "name" , "dnsName" , "dnsDomainId" , "isOn" ) .
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 )
}
2022-10-26 19:25:07 +08:00
// FindClusterSSHParams 查找集群的SSH默认参数
func ( this * NodeClusterDAO ) FindClusterSSHParams ( tx * dbs . Tx , clusterId int64 ) ( * nodeconfigs . SSHParams , error ) {
sshParamsJSON , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "sshParams" ) .
FindJSONCol ( )
if err != nil {
return nil , err
}
var params = nodeconfigs . DefaultSSHParams ( )
if len ( sshParamsJSON ) == 0 {
return params , nil
}
err = json . Unmarshal ( sshParamsJSON , params )
if err != nil {
return nil , err
}
return params , nil
}
2021-05-03 11:32:43 +08:00
// FindClusterDNSInfo 查找DNS信息
2021-11-11 14:16:42 +08:00
func ( this * NodeClusterDAO ) FindClusterDNSInfo ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( * NodeCluster , error ) {
2021-10-12 11:44:24 +08:00
var cacheKey = this . Table + ":FindClusterDNSInfo:" + types . String ( clusterId )
2021-11-11 14:16:42 +08:00
if cacheMap != nil {
cache , ok := cacheMap . Get ( cacheKey )
if ok {
return cache . ( * NodeCluster ) , nil
}
2021-08-22 11:35:33 +08:00
}
2021-01-01 23:31:30 +08:00
one , err := this . Query ( tx ) .
2020-11-11 21:32:25 +08:00
Pk ( clusterId ) .
2022-09-22 14:09:28 +08:00
Result ( "id" , "name" , "dnsName" , "dnsDomainId" , "dns" , "isOn" , "state" ) .
2020-11-11 21:32:25 +08:00
Find ( )
if err != nil {
return nil , err
}
if one == nil {
return nil , nil
}
2021-11-11 14:16:42 +08:00
if cacheMap != nil {
cacheMap . Put ( cacheKey , one )
}
2020-11-11 21:32:25 +08:00
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相关信息
2022-08-25 19:18:30 +08:00
func ( this * NodeClusterDAO ) UpdateClusterDNS ( tx * dbs . Tx , clusterId int64 , dnsName string , dnsDomainId int64 , nodesAutoSync bool , serversAutoSync bool , cnameRecords [ ] string , ttl int32 , cnameAsDomain bool , includingLnNodes bool ) error {
2020-11-13 18:22:22 +08:00
if clusterId <= 0 {
return errors . New ( "invalid clusterId" )
}
2022-04-18 21:00:40 +08:00
// 删除老的域名中相关记录
oldOne , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "dnsName" , "dnsDomainId" ) .
Find ( )
if err != nil {
return err
}
if oldOne == nil {
return nil
}
var oldCluster = oldOne . ( * NodeCluster )
var oldDNSDomainId = int64 ( oldCluster . DnsDomainId )
2022-09-22 14:09:28 +08:00
var shouldRemoveOld = false
2022-04-18 21:00:40 +08:00
if ( oldDNSDomainId > 0 && oldDNSDomainId != dnsDomainId ) || ( oldCluster . DnsName != dnsName ) {
2022-09-22 14:09:28 +08:00
if oldDNSDomainId == dnsDomainId {
// 如果只是换子域名, 需要在新的域名添加之前, 先删除老的子域名, 防止无法添加CNAME
err = dns . SharedDNSTaskDAO . CreateClusterRemoveTask ( tx , clusterId , oldDNSDomainId , oldCluster . DnsName )
if err != nil {
return err
}
} else {
shouldRemoveOld = true
2022-04-18 21:00:40 +08:00
}
}
var op = NewNodeClusterOperator ( )
2020-11-13 18:22:22 +08:00
op . Id = clusterId
op . DnsName = dnsName
op . DnsDomainId = dnsDomainId
2020-11-15 21:17:42 +08:00
2021-09-20 16:37:48 +08:00
if len ( cnameRecords ) == 0 {
cnameRecords = [ ] string { }
}
2022-04-18 21:00:40 +08:00
var dnsConfig = & dnsconfigs . ClusterDNSConfig {
2022-08-25 19:18:30 +08:00
NodesAutoSync : nodesAutoSync ,
ServersAutoSync : serversAutoSync ,
2022-09-21 15:09:39 +08:00
CNAMERecords : cnameRecords ,
2022-08-25 19:18:30 +08:00
TTL : ttl ,
2022-09-21 15:09:39 +08:00
CNAMEAsDomain : cnameAsDomain ,
2022-08-25 19:18:30 +08:00
IncludingLnNodes : includingLnNodes ,
2020-11-15 21:17:42 +08:00
}
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
}
2022-09-22 14:09:28 +08:00
err = this . NotifyDNSUpdate ( tx , clusterId )
if err != nil {
return err
}
// 删除老的记录
if shouldRemoveOld {
err = dns . SharedDNSTaskDAO . CreateClusterRemoveTask ( tx , clusterId , oldDNSDomainId , oldCluster . DnsName )
if err != nil {
return err
}
}
return nil
2020-11-13 18:22:22 +08:00
}
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-11-11 14:16:42 +08:00
func ( this * NodeClusterDAO ) FindClusterTOAConfig ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( * nodeconfigs . TOAConfig , error ) {
var cacheKey = this . Table + ":FindClusterTOAConfig:" + types . String ( clusterId )
if cacheMap != nil {
cache , ok := cacheMap . Get ( cacheKey )
if ok {
return cache . ( * nodeconfigs . TOAConfig ) , nil
}
}
2021-01-01 23:31:30 +08:00
toa , err := this . Query ( tx ) .
2020-12-02 14:26:03 +08:00
Pk ( clusterId ) .
Result ( "toa" ) .
FindStringCol ( "" )
if err != nil {
return nil , err
}
2022-03-21 21:39:36 +08:00
if ! IsNotNull ( [ ] byte ( toa ) ) {
2020-12-02 14:26:03 +08:00
return nodeconfigs . DefaultTOAConfig ( ) , nil
}
config := & nodeconfigs . TOAConfig { }
err = json . Unmarshal ( [ ] byte ( toa ) , config )
if err != nil {
return nil , err
}
2021-11-11 14:16:42 +08:00
if cacheMap != nil {
cacheMap . Put ( cacheKey , config )
}
2020-12-02 14:26:03 +08:00
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" )
}
2022-07-24 09:56:27 +08:00
var op = NewNodeClusterOperator ( )
2020-12-02 14:26:03 +08:00
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-11-26 10:39:50 +08:00
// FindAllEnabledNodeClusterIds 查找所有可用的集群
func ( this * NodeClusterDAO ) FindAllEnabledNodeClusterIds ( tx * dbs . Tx ) ( [ ] int64 , error ) {
ones , err := this . Query ( tx ) .
State ( NodeClusterStateEnabled ) .
ResultPk ( ) .
FindAll ( )
if err != nil {
return nil , err
}
var result = [ ] int64 { }
for _ , one := range ones {
result = append ( result , int64 ( one . ( * NodeCluster ) . Id ) )
}
return result , nil
}
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-11-11 14:16:42 +08:00
func ( this * NodeClusterDAO ) FindClusterHTTPFirewallPolicyId ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( int64 , error ) {
2021-08-22 11:35:33 +08:00
if cacheMap == nil {
2021-11-11 14:16:42 +08:00
cacheMap = utils . NewCacheMap ( )
2021-08-22 11:35:33 +08:00
}
var cacheKey = this . Table + ":FindClusterHTTPFirewallPolicyId:" + types . String ( clusterId )
2021-11-11 14:16:42 +08:00
var cache , _ = cacheMap . Get ( cacheKey )
2021-08-22 11:35:33 +08:00
if cache != nil {
return cache . ( int64 ) , nil
}
firewallPolicyId , err := this . Query ( tx ) .
2020-12-17 17:36:20 +08:00
Pk ( clusterId ) .
Result ( "httpFirewallPolicyId" ) .
FindInt64Col ( 0 )
2021-08-22 11:35:33 +08:00
if err != nil {
return 0 , err
}
2021-11-11 14:16:42 +08:00
if cacheMap != nil {
cacheMap . Put ( cacheKey , firewallPolicyId )
}
2021-08-22 11:35:33 +08:00
return firewallPolicyId , nil
2020-12-17 17:36:20 +08:00
}
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-11-11 14:16:42 +08:00
func ( this * NodeClusterDAO ) FindClusterHTTPCachePolicyId ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( int64 , error ) {
2021-08-22 11:35:33 +08:00
if cacheMap == nil {
2021-11-11 14:16:42 +08:00
cacheMap = utils . NewCacheMap ( )
2021-08-22 11:35:33 +08:00
}
var cacheKey = this . Table + ":FindClusterHTTPCachePolicyId:" + types . String ( clusterId )
2021-11-11 14:16:42 +08:00
var cache , _ = cacheMap . Get ( cacheKey )
2021-08-22 11:35:33 +08:00
if cache != nil {
return cache . ( int64 ) , nil
}
cachePolicyId , err := this . Query ( tx ) .
2020-12-17 17:36:20 +08:00
Pk ( clusterId ) .
Result ( "cachePolicyId" ) .
FindInt64Col ( 0 )
2021-08-22 11:35:33 +08:00
if err != nil {
return 0 , err
}
2021-11-11 14:16:42 +08:00
if cacheMap != nil {
cacheMap . Put ( cacheKey , cachePolicyId )
}
2021-08-22 11:35:33 +08:00
return cachePolicyId , nil
2020-12-17 17:36:20 +08:00
}
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" )
}
2022-03-21 21:39:36 +08:00
serviceData , err := this . Query ( tx ) .
2021-01-11 18:16:04 +08:00
Pk ( clusterId ) .
Result ( "systemServices" ) .
2022-03-21 21:39:36 +08:00
FindBytesCol ( )
2021-01-11 18:16:04 +08:00
if err != nil {
return err
}
servicesMap := map [ string ] maps . Map { }
2022-03-21 21:39:36 +08:00
if IsNotNull ( serviceData ) {
err = json . Unmarshal ( serviceData , & servicesMap )
2021-01-11 18:16:04 +08:00
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 { }
2022-03-21 21:39:36 +08:00
if IsNotNull ( [ ] byte ( service ) ) {
2021-01-11 18:16:04 +08:00
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-11-11 14:16:42 +08:00
func ( this * NodeClusterDAO ) FindNodeClusterSystemServices ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( services map [ string ] maps . Map , err error ) {
2021-01-11 18:16:04 +08:00
if clusterId <= 0 {
return nil , errors . New ( "invalid clusterId" )
}
2021-11-11 14:16:42 +08:00
var cacheKey = this . Table + ":FindNodeClusterSystemServices:" + types . String ( clusterId )
if cacheMap != nil {
cache , ok := cacheMap . Get ( cacheKey )
if ok {
return cache . ( map [ string ] maps . Map ) , nil
}
}
2021-01-11 18:16:04 +08:00
service , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "systemServices" ) .
FindStringCol ( "" )
if err != nil {
return nil , err
}
servicesMap := map [ string ] maps . Map { }
2022-03-21 21:39:36 +08:00
if IsNotNull ( [ ] byte ( service ) ) {
2021-01-11 18:16:04 +08:00
err = json . Unmarshal ( [ ] byte ( service ) , & servicesMap )
if err != nil {
return nil , err
}
}
2021-11-11 14:16:42 +08:00
if cacheMap != nil {
cacheMap . Put ( cacheKey , servicesMap )
}
2021-01-11 18:16:04 +08:00
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 ) {
2021-05-03 15:16:02 +08:00
itemTable := SharedLatestItemDAO . Table
itemType := LatestItemTypeCluster
2021-05-03 11:32:43 +08:00
_ , err = this . Query ( tx ) .
Result ( this . Table + ".id" , this . Table + ".name" ) .
2021-05-03 15:16:02 +08:00
Join ( SharedLatestItemDAO , dbs . QueryJoinRight , this . Table + ".id=" + itemTable + ".itemId AND " + itemTable + ".itemType='" + itemType + "'" ) .
Asc ( "CEIL((UNIX_TIMESTAMP() - " + itemTable + ".updatedAt) / (7 * 86400))" ) . // 优先一个星期以内的
Desc ( itemTable + ".count" ) .
2021-05-03 11:32:43 +08:00
State ( NodeClusterStateEnabled ) .
Limit ( size ) .
Slice ( & result ) .
FindAll ( )
return
}
2021-07-31 22:23:11 +08:00
// CheckNodeClusterIsOn 获取集群是否正在启用状态
func ( this * NodeClusterDAO ) CheckNodeClusterIsOn ( tx * dbs . Tx , clusterId int64 ) ( bool , error ) {
return this . Query ( tx ) .
Pk ( clusterId ) .
State ( NodeClusterStateEnabled ) .
Attr ( "isOn" , true ) .
Exist ( )
}
// FindEnabledNodeClustersWithIds 查找一组集群
func ( this * NodeClusterDAO ) FindEnabledNodeClustersWithIds ( tx * dbs . Tx , clusterIds [ ] int64 ) ( result [ ] * NodeCluster , err error ) {
if len ( clusterIds ) == 0 {
return
}
for _ , clusterId := range clusterIds {
cluster , err := this . Query ( tx ) .
Pk ( clusterId ) .
State ( NodeClusterStateEnabled ) .
Find ( )
if err != nil {
return nil , err
}
if cluster == nil {
continue
}
result = append ( result , cluster . ( * NodeCluster ) )
}
return
}
2021-09-13 10:51:05 +08:00
// ExistsEnabledCluster 检查集群是否存在
func ( this * NodeClusterDAO ) ExistsEnabledCluster ( tx * dbs . Tx , clusterId int64 ) ( bool , error ) {
if clusterId <= 0 {
return false , nil
}
return this . Query ( tx ) .
Pk ( clusterId ) .
State ( NodeClusterStateEnabled ) .
Exist ( )
}
2021-12-09 18:49:51 +08:00
// FindClusterBasicInfo 查找集群基础信息
func ( this * NodeClusterDAO ) FindClusterBasicInfo ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( * NodeCluster , error ) {
var cacheKey = this . Table + ":FindClusterBasicInfo:" + types . String ( clusterId )
2021-11-11 14:16:42 +08:00
if cacheMap != nil {
cache , ok := cacheMap . Get ( cacheKey )
if ok {
2021-12-09 18:49:51 +08:00
return cache . ( * NodeCluster ) , nil
2021-11-11 14:16:42 +08:00
}
2021-10-12 11:44:24 +08:00
}
2021-12-09 18:49:51 +08:00
cluster , err := this . Query ( tx ) .
2021-10-12 11:44:24 +08:00
Pk ( clusterId ) .
2022-04-01 16:18:54 +08:00
State ( NodeClusterStateEnabled ) .
2023-06-01 17:46:10 +08:00
Result ( "id" , "name" , "timeZone" , "nodeMaxThreads" , "cachePolicyId" , "httpFirewallPolicyId" , "autoOpenPorts" , "webp" , "uam" , "cc" , "httpPages" , "http3" , "isOn" , "ddosProtection" , "clock" , "globalServerConfig" , "autoInstallNftables" ) .
2021-12-09 18:49:51 +08:00
Find ( )
if err != nil || cluster == nil {
return nil , err
2021-10-12 11:44:24 +08:00
}
2021-11-11 14:16:42 +08:00
if cacheMap != nil {
2021-12-09 18:49:51 +08:00
cacheMap . Put ( cacheKey , cluster )
2021-11-11 14:16:42 +08:00
}
2021-12-09 18:49:51 +08:00
return cluster . ( * NodeCluster ) , nil
2021-10-12 11:44:24 +08:00
}
2022-04-01 16:18:54 +08:00
// UpdateClusterWebPPolicy 修改WebP设置
func ( this * NodeClusterDAO ) UpdateClusterWebPPolicy ( tx * dbs . Tx , clusterId int64 , webpPolicy * nodeconfigs . WebPImagePolicy ) error {
if webpPolicy == nil {
err := this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "webp" , dbs . SQL ( "null" ) ) .
UpdateQuickly ( )
if err != nil {
return err
}
return this . NotifyUpdate ( tx , clusterId )
}
webpPolicyJSON , err := json . Marshal ( webpPolicy )
if err != nil {
return err
}
err = this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "webp" , webpPolicyJSON ) .
UpdateQuickly ( )
if err != nil {
return err
}
return this . NotifyUpdate ( tx , clusterId )
}
// FindClusterWebPPolicy 查询WebP设置
func ( this * NodeClusterDAO ) FindClusterWebPPolicy ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( * nodeconfigs . WebPImagePolicy , error ) {
var cacheKey = this . Table + ":FindClusterWebPPolicy:" + types . String ( clusterId )
if cacheMap != nil {
cache , ok := cacheMap . Get ( cacheKey )
if ok {
return cache . ( * nodeconfigs . WebPImagePolicy ) , nil
}
}
webpJSON , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "webp" ) .
FindJSONCol ( )
if err != nil {
return nil , err
}
if IsNull ( webpJSON ) {
return nodeconfigs . DefaultWebPImagePolicy , nil
}
var policy = & nodeconfigs . WebPImagePolicy { }
err = json . Unmarshal ( webpJSON , policy )
if err != nil {
return nil , err
}
return policy , nil
}
2022-07-03 22:10:46 +08:00
// UpdateClusterUAMPolicy 修改UAM设置
func ( this * NodeClusterDAO ) UpdateClusterUAMPolicy ( tx * dbs . Tx , clusterId int64 , uamPolicy * nodeconfigs . UAMPolicy ) error {
if uamPolicy == nil {
err := this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "uam" , dbs . SQL ( "null" ) ) .
UpdateQuickly ( )
if err != nil {
return err
}
2023-04-03 16:11:48 +08:00
return this . NotifyUAMUpdate ( tx , clusterId )
2022-07-03 22:10:46 +08:00
}
uamPolicyJSON , err := json . Marshal ( uamPolicy )
if err != nil {
return err
}
err = this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "uam" , uamPolicyJSON ) .
UpdateQuickly ( )
if err != nil {
return err
}
2023-04-03 16:11:48 +08:00
return this . NotifyUAMUpdate ( tx , clusterId )
2022-07-03 22:10:46 +08:00
}
2023-05-22 17:30:33 +08:00
// FindClusterUAMPolicy 查询UAM设置
2022-07-03 22:10:46 +08:00
func ( this * NodeClusterDAO ) FindClusterUAMPolicy ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( * nodeconfigs . UAMPolicy , error ) {
var cacheKey = this . Table + ":FindClusterUAMPolicy:" + types . String ( clusterId )
if cacheMap != nil {
cache , ok := cacheMap . Get ( cacheKey )
if ok {
return cache . ( * nodeconfigs . UAMPolicy ) , nil
}
}
uamJSON , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "uam" ) .
FindJSONCol ( )
if err != nil {
return nil , err
}
if IsNull ( uamJSON ) {
return nodeconfigs . DefaultUAMPolicy , nil
}
var policy = & nodeconfigs . UAMPolicy { }
err = json . Unmarshal ( uamJSON , policy )
if err != nil {
return nil , err
}
return policy , nil
}
2023-05-23 19:16:30 +08:00
// UpdateClusterHTTPCCPolicy 修改CC策略设置
func ( this * NodeClusterDAO ) UpdateClusterHTTPCCPolicy ( tx * dbs . Tx , clusterId int64 , httpCCPolicy * nodeconfigs . HTTPCCPolicy ) error {
if httpCCPolicy == nil {
err := this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "cc" , dbs . SQL ( "null" ) ) .
UpdateQuickly ( )
if err != nil {
return err
}
return this . NotifyHTTPCCUpdate ( tx , clusterId )
}
httpCCPolicyJSON , err := json . Marshal ( httpCCPolicy )
if err != nil {
return err
}
err = this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "cc" , httpCCPolicyJSON ) .
UpdateQuickly ( )
if err != nil {
return err
}
return this . NotifyHTTPCCUpdate ( tx , clusterId )
}
// FindClusterHTTPCCPolicy 查询CC策略设置
func ( this * NodeClusterDAO ) FindClusterHTTPCCPolicy ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( * nodeconfigs . HTTPCCPolicy , error ) {
var cacheKey = this . Table + ":FindClusterHTTPCCPolicy:" + types . String ( clusterId )
if cacheMap != nil {
cache , ok := cacheMap . Get ( cacheKey )
if ok {
return cache . ( * nodeconfigs . HTTPCCPolicy ) , nil
}
}
httpCCJSON , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "cc" ) .
FindJSONCol ( )
if err != nil {
return nil , err
}
if IsNull ( httpCCJSON ) {
return nodeconfigs . NewHTTPCCPolicy ( ) , nil
}
var policy = nodeconfigs . NewHTTPCCPolicy ( )
err = json . Unmarshal ( httpCCJSON , policy )
if err != nil {
return nil , err
}
return policy , nil
}
2023-06-01 17:46:10 +08:00
// UpdateClusterHTTP3Policy 修改HTTP3策略设置
func ( this * NodeClusterDAO ) UpdateClusterHTTP3Policy ( tx * dbs . Tx , clusterId int64 , http3Policy * nodeconfigs . HTTP3Policy ) error {
if http3Policy == nil {
err := this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "http3" , dbs . SQL ( "null" ) ) .
UpdateQuickly ( )
if err != nil {
return err
}
return this . NotifyHTTP3Update ( tx , clusterId )
}
http3PolicyJSON , err := json . Marshal ( http3Policy )
if err != nil {
return err
}
err = this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "http3" , http3PolicyJSON ) .
UpdateQuickly ( )
if err != nil {
return err
}
return this . NotifyHTTP3Update ( tx , clusterId )
}
// FindClusterHTTP3Policy 查询HTTP3策略设置
func ( this * NodeClusterDAO ) FindClusterHTTP3Policy ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( * nodeconfigs . HTTP3Policy , error ) {
var cacheKey = this . Table + ":FindClusterHTTP3Policy:" + types . String ( clusterId )
if cacheMap != nil {
cache , ok := cacheMap . Get ( cacheKey )
if ok {
return cache . ( * nodeconfigs . HTTP3Policy ) , nil
}
}
http3PolicyJSON , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "http3" ) .
FindJSONCol ( )
if err != nil {
return nil , err
}
if IsNull ( http3PolicyJSON ) {
return nodeconfigs . NewHTTP3Policy ( ) , nil
}
var policy = nodeconfigs . NewHTTP3Policy ( )
err = json . Unmarshal ( http3PolicyJSON , policy )
if err != nil {
return nil , err
}
return policy , nil
}
2023-05-22 17:30:33 +08:00
// UpdateClusterHTTPPagesPolicy 修改自定义页面设置
func ( this * NodeClusterDAO ) UpdateClusterHTTPPagesPolicy ( tx * dbs . Tx , clusterId int64 , httpPagesPolicy * nodeconfigs . HTTPPagesPolicy ) error {
if httpPagesPolicy == nil {
err := this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "httpPages" , dbs . SQL ( "null" ) ) .
UpdateQuickly ( )
if err != nil {
return err
}
return this . NotifyHTTPPagesPolicyUpdate ( tx , clusterId )
}
// 移除不需要保存的内容
var newPages = [ ] * serverconfigs . HTTPPageConfig { }
for _ , page := range httpPagesPolicy . Pages {
newPages = append ( newPages , & serverconfigs . HTTPPageConfig { Id : page . Id } )
}
httpPagesPolicy . Pages = newPages
httpPagesPolicyJSON , err := json . Marshal ( httpPagesPolicy )
if err != nil {
return err
}
err = this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "httpPages" , httpPagesPolicyJSON ) .
UpdateQuickly ( )
if err != nil {
return err
}
return this . NotifyHTTPPagesPolicyUpdate ( tx , clusterId )
}
// FindClusterHTTPPagesPolicy 查询自定义页面设置
func ( this * NodeClusterDAO ) FindClusterHTTPPagesPolicy ( tx * dbs . Tx , clusterId int64 , cacheMap * utils . CacheMap ) ( * nodeconfigs . HTTPPagesPolicy , error ) {
var cacheKey = this . Table + ":FindClusterHTTPPagesPolicy:" + types . String ( clusterId )
if cacheMap != nil {
cache , ok := cacheMap . Get ( cacheKey )
if ok {
return cache . ( * nodeconfigs . HTTPPagesPolicy ) , nil
}
}
pagesJSON , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "httpPages" ) .
FindJSONCol ( )
if err != nil {
return nil , err
}
if IsNull ( pagesJSON ) {
return nodeconfigs . NewHTTPPagesPolicy ( ) , nil
}
var policy = nodeconfigs . NewHTTPPagesPolicy ( )
err = json . Unmarshal ( pagesJSON , policy )
if err != nil {
return nil , err
}
// 读取Page信息
var newPages = [ ] * serverconfigs . HTTPPageConfig { }
for _ , page := range policy . Pages {
pageConfig , err := SharedHTTPPageDAO . ComposePageConfig ( tx , page . Id , cacheMap )
if err != nil {
return nil , err
}
if pageConfig == nil {
continue
}
newPages = append ( newPages , pageConfig )
}
policy . Pages = newPages
return policy , nil
}
2022-05-18 21:02:53 +08:00
// FindClusterDDoSProtection 获取集群的DDoS设置
func ( this * NodeClusterDAO ) FindClusterDDoSProtection ( tx * dbs . Tx , clusterId int64 ) ( * ddosconfigs . ProtectionConfig , error ) {
one , err := this . Query ( tx ) .
Result ( "ddosProtection" ) .
Pk ( clusterId ) .
Find ( )
if one == nil || err != nil {
return nil , err
}
return one . ( * NodeCluster ) . DecodeDDoSProtection ( ) , nil
}
2022-08-22 15:11:22 +08:00
// UpdateClusterDDoSProtection 设置集群的DDoS设置
2022-05-18 21:02:53 +08:00
func ( this * NodeClusterDAO ) UpdateClusterDDoSProtection ( tx * dbs . Tx , clusterId int64 , ddosProtection * ddosconfigs . ProtectionConfig ) error {
if clusterId <= 0 {
return ErrNotFound
}
var op = NewNodeClusterOperator ( )
op . Id = clusterId
if ddosProtection == nil {
op . DdosProtection = "{}"
} else {
ddosProtectionJSON , err := json . Marshal ( ddosProtection )
if err != nil {
return err
}
op . DdosProtection = ddosProtectionJSON
}
err := this . Save ( tx , op )
if err != nil {
return err
}
2022-10-23 16:22:20 +08:00
return SharedNodeTaskDAO . CreateClusterTask ( tx , nodeconfigs . NodeRoleNode , clusterId , 0 , 0 , NodeTaskTypeDDosProtectionChanged )
2022-05-18 21:02:53 +08:00
}
2022-09-16 18:42:14 +08:00
// FindClusterGlobalServerConfig 查询全局服务配置
func ( this * NodeClusterDAO ) FindClusterGlobalServerConfig ( tx * dbs . Tx , clusterId int64 ) ( * serverconfigs . GlobalServerConfig , error ) {
configJSON , err := this . Query ( tx ) .
Pk ( clusterId ) .
Result ( "globalServerConfig" ) .
FindJSONCol ( )
if err != nil {
return nil , err
}
var config = serverconfigs . DefaultGlobalServerConfig ( )
if IsNull ( configJSON ) {
return config , nil
}
err = json . Unmarshal ( configJSON , config )
if err != nil {
return nil , err
}
return config , nil
}
// UpdateClusterGlobalServerConfig 修改全局服务配置
func ( this * NodeClusterDAO ) UpdateClusterGlobalServerConfig ( tx * dbs . Tx , clusterId int64 , config * serverconfigs . GlobalServerConfig ) error {
if config == nil {
config = serverconfigs . DefaultGlobalServerConfig ( )
}
configJSON , err := json . Marshal ( config )
if err != nil {
return err
}
err = this . Query ( tx ) .
Pk ( clusterId ) .
Set ( "globalServerConfig" , configJSON ) .
UpdateQuickly ( )
if err != nil {
return err
}
2022-10-23 16:22:20 +08:00
return SharedNodeTaskDAO . CreateClusterTask ( tx , nodeconfigs . NodeRoleNode , clusterId , 0 , 0 , NodeTaskTypeGlobalServerConfigChanged )
2022-09-16 18:42:14 +08:00
}
2021-05-03 11:32:43 +08:00
// NotifyUpdate 通知更新
2021-01-17 16:48:00 +08:00
func ( this * NodeClusterDAO ) NotifyUpdate ( tx * dbs . Tx , clusterId int64 ) error {
2022-10-23 16:22:20 +08:00
return SharedNodeTaskDAO . CreateClusterTask ( tx , nodeconfigs . NodeRoleNode , clusterId , 0 , 0 , NodeTaskTypeConfigChanged )
2021-01-17 16:48:00 +08:00
}
2021-01-27 23:00:02 +08:00
2023-04-03 16:11:48 +08:00
// NotifyUAMUpdate 通知UAM更新
func ( this * NodeClusterDAO ) NotifyUAMUpdate ( tx * dbs . Tx , clusterId int64 ) error {
return SharedNodeTaskDAO . CreateClusterTask ( tx , nodeconfigs . NodeRoleNode , clusterId , 0 , 0 , NodeTaskTypeUAMPolicyChanged )
}
2023-05-23 19:16:30 +08:00
// NotifyHTTPCCUpdate 通知HTTP CC更新
func ( this * NodeClusterDAO ) NotifyHTTPCCUpdate ( tx * dbs . Tx , clusterId int64 ) error {
return SharedNodeTaskDAO . CreateClusterTask ( tx , nodeconfigs . NodeRoleNode , clusterId , 0 , 0 , NodeTaskTypeHTTPCCPolicyChanged )
}
2023-06-01 17:46:10 +08:00
// NotifyHTTP3Update 通知HTTP3更新
func ( this * NodeClusterDAO ) NotifyHTTP3Update ( tx * dbs . Tx , clusterId int64 ) error {
return SharedNodeTaskDAO . CreateClusterTask ( tx , nodeconfigs . NodeRoleNode , clusterId , 0 , 0 , NodeTaskTypeHTTP3PolicyChanged )
}
2023-05-22 17:30:33 +08:00
// NotifyHTTPPagesPolicyUpdate 通知HTTP Pages更新
func ( this * NodeClusterDAO ) NotifyHTTPPagesPolicyUpdate ( tx * dbs . Tx , clusterId int64 ) error {
return SharedNodeTaskDAO . CreateClusterTask ( tx , nodeconfigs . NodeRoleNode , clusterId , 0 , 0 , NodeTaskTypeHTTPPagesPolicyChanged )
}
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
}