Files
EdgeAdmin/internal/web/actions/default/clusters/create.go

165 lines
4.2 KiB
Go
Raw Normal View History

2020-09-06 16:19:34 +08:00
package clusters
import (
2023-11-27 11:28:01 +08:00
"crypto/rand"
2021-01-11 18:15:53 +08:00
"encoding/json"
2023-11-27 11:28:01 +08:00
"fmt"
2020-09-06 16:19:34 +08:00
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils"
2023-06-30 18:08:30 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
2021-01-11 18:15:53 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
2020-11-10 21:37:48 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
2020-09-06 16:19:34 +08:00
"github.com/iwind/TeaGo/actions"
2023-11-27 11:28:01 +08:00
"github.com/iwind/TeaGo/rands"
2020-09-06 16:19:34 +08:00
)
type CreateAction struct {
actionutils.ParentAction
}
func (this *CreateAction) Init() {
this.Nav("", "cluster", "create")
}
func (this *CreateAction) RunGet(params struct{}) {
// 是否有域名
hasDomainsResp, err := this.RPC().DNSDomainRPC().ExistAvailableDomains(this.AdminContext(), &pb.ExistAvailableDomainsRequest{})
if err != nil {
this.ErrorPage(err)
return
}
this.Data["hasDomains"] = hasDomainsResp.Exist
2022-04-07 18:31:21 +08:00
// 菜单:集群总数
2022-03-17 10:36:30 +08:00
totalResp, err := this.RPC().NodeClusterRPC().CountAllEnabledNodeClusters(this.AdminContext(), &pb.CountAllEnabledNodeClustersRequest{})
if err != nil {
this.ErrorPage(err)
return
}
this.Data["totalNodeClusters"] = totalResp.Count
2022-04-07 18:31:21 +08:00
// 菜单:节点总数
totalNodesResp, err := this.RPC().NodeRPC().CountAllEnabledNodes(this.AdminContext(), &pb.CountAllEnabledNodesRequest{})
if err != nil {
this.ErrorPage(err)
return
}
this.Data["totalNodes"] = totalNodesResp.Count
2023-11-27 11:28:01 +08:00
// 随机子域名
var defaultDNSName = "g" + rands.HexString(6) + ".cdn"
{
var b = make([]byte, 3)
_, err = rand.Read(b)
if err == nil {
defaultDNSName = fmt.Sprintf("g%x.cdn", b)
}
}
this.Data["defaultDNSName"] = defaultDNSName
this.Data["dnsName"] = defaultDNSName
2020-09-06 16:19:34 +08:00
this.Show()
}
func (this *CreateAction) RunPost(params struct {
Name string
// 缓存策略
CachePolicyId int64
// WAF策略
HttpFirewallPolicyId int64
// 服务配置
MatchDomainStrictly bool
// SSH相关
2022-09-17 21:04:45 +08:00
GrantId int64
InstallDir string
SystemdServiceIsOn bool
AutoInstallNftables bool
AutoSystemTuning bool
2020-09-06 16:19:34 +08:00
// DNS相关
DnsDomainId int64
DnsName string
DnsTTL int32
2020-09-06 16:19:34 +08:00
Must *actions.Must
}) {
params.Must.
Field("name", params.Name).
Require("请输入集群名称")
// 检查DNS名称
if len(params.DnsName) > 0 {
if !domainutils.ValidateDomainFormat(params.DnsName) {
this.FailField("dnsName", "请输入正确的DNS子域名")
}
// 检查是否已经被使用
resp, err := this.RPC().NodeClusterRPC().CheckNodeClusterDNSName(this.AdminContext(), &pb.CheckNodeClusterDNSNameRequest{
NodeClusterId: 0,
DnsName: params.DnsName,
})
if err != nil {
this.ErrorPage(err)
return
}
if resp.IsUsed {
this.FailField("dnsName", "此DNS子域名已经被使用请换一个再试")
}
}
// TODO 检查DnsDomainId的有效性
// 全局服务配置
var globalServerConfig = serverconfigs.NewGlobalServerConfig()
globalServerConfig.HTTPAll.MatchDomainStrictly = params.MatchDomainStrictly
globalServerConfigJSON, err := json.Marshal(globalServerConfig)
if err != nil {
this.ErrorPage(err)
return
}
2021-01-11 18:15:53 +08:00
// 系统服务
var systemServices = map[string]any{}
2021-01-11 18:15:53 +08:00
if params.SystemdServiceIsOn {
systemServices[nodeconfigs.SystemServiceTypeSystemd] = &nodeconfigs.SystemdServiceConfig{
IsOn: true,
}
}
systemServicesJSON, err := json.Marshal(systemServices)
if err != nil {
this.ErrorPage(err)
return
}
2020-11-10 21:37:48 +08:00
createResp, err := this.RPC().NodeClusterRPC().CreateNodeCluster(this.AdminContext(), &pb.CreateNodeClusterRequest{
Name: params.Name,
NodeGrantId: params.GrantId,
InstallDir: params.InstallDir,
DnsDomainId: params.DnsDomainId,
DnsName: params.DnsName,
DnsTTL: params.DnsTTL,
HttpCachePolicyId: params.CachePolicyId,
HttpFirewallPolicyId: params.HttpFirewallPolicyId,
SystemServicesJSON: systemServicesJSON,
GlobalServerConfigJSON: globalServerConfigJSON,
2022-09-17 21:04:45 +08:00
AutoInstallNftables: params.AutoInstallNftables,
AutoSystemTuning: params.AutoSystemTuning,
2020-09-06 16:19:34 +08:00
})
if err != nil {
this.ErrorPage(err)
return
}
2020-11-10 21:37:48 +08:00
// 创建日志
2023-06-30 18:08:30 +08:00
defer this.CreateLogInfo(codes.NodeCluster_LogCreateCluster, createResp.NodeClusterId)
2020-11-10 21:37:48 +08:00
this.Data["clusterId"] = createResp.NodeClusterId
2020-09-06 16:19:34 +08:00
this.Success()
}