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

284 lines
6.6 KiB
Go
Raw Normal View History

2020-07-29 19:34:54 +08:00
package servers
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
2020-09-13 20:37:07 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
2020-07-29 19:34:54 +08:00
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
)
type CreateAction struct {
actionutils.ParentAction
}
func (this *CreateAction) Init() {
2020-08-21 12:32:16 +08:00
this.Nav("", "server", "create")
2020-07-29 19:34:54 +08:00
}
func (this *CreateAction) RunGet(params struct{}) {
// 所有集群
2020-09-06 16:19:34 +08:00
resp, err := this.RPC().NodeClusterRPC().FindAllEnabledNodeClusters(this.AdminContext(), &pb.FindAllEnabledNodeClustersRequest{})
2020-07-29 19:34:54 +08:00
if err != nil {
this.ErrorPage(err)
}
if err != nil {
this.ErrorPage(err)
return
}
clusterMaps := []maps.Map{}
for _, cluster := range resp.Clusters {
clusterMaps = append(clusterMaps, maps.Map{
"id": cluster.Id,
"name": cluster.Name,
})
}
this.Data["clusters"] = clusterMaps
2020-08-21 12:32:16 +08:00
// 服务类型
2020-09-13 20:37:07 +08:00
this.Data["serverTypes"] = serverconfigs.AllServerTypes()
2020-08-21 12:32:16 +08:00
2020-07-29 19:34:54 +08:00
this.Show()
}
func (this *CreateAction) RunPost(params struct {
2020-08-21 12:32:16 +08:00
Name string
Description string
ClusterId int64
ServerType string
Addresses string
ServerNames string
Origins string
WebRoot string
2020-07-29 19:34:54 +08:00
Must *actions.Must
}) {
params.Must.
Field("name", params.Name).
Require("请输入服务名称")
if params.ClusterId <= 0 {
this.Fail("请选择部署的集群")
}
// TODO 验证集群ID
2020-08-21 12:32:16 +08:00
// 端口地址
2020-09-15 14:44:52 +08:00
var httpConfig *serverconfigs.HTTPProtocolConfig = nil
var httpsConfig *serverconfigs.HTTPSProtocolConfig = nil
var tcpConfig *serverconfigs.TCPProtocolConfig = nil
var tlsConfig *serverconfigs.TLSProtocolConfig = nil
var unixConfig *serverconfigs.UnixProtocolConfig = nil
var udpConfig *serverconfigs.UDPProtocolConfig = nil
var webId int64 = 0
2020-08-21 12:32:16 +08:00
switch params.ServerType {
2020-09-13 20:37:07 +08:00
case serverconfigs.ServerTypeHTTPProxy, serverconfigs.ServerTypeHTTPWeb:
2020-08-21 12:32:16 +08:00
listen := []*serverconfigs.NetworkAddressConfig{}
err := json.Unmarshal([]byte(params.Addresses), &listen)
if err != nil {
this.Fail("端口地址解析失败:" + err.Error())
}
2020-09-15 14:44:52 +08:00
if len(listen) == 0 {
this.Fail("至少需要绑定一个端口")
}
2020-08-21 12:32:16 +08:00
for _, addr := range listen {
2020-09-15 14:44:52 +08:00
switch addr.Protocol.Primary() {
case serverconfigs.ProtocolHTTP:
if httpConfig == nil {
httpConfig = &serverconfigs.HTTPProtocolConfig{
2020-08-21 12:32:16 +08:00
BaseProtocol: serverconfigs.BaseProtocol{
IsOn: true,
},
}
}
2020-09-15 14:44:52 +08:00
httpConfig.AddListen(addr)
case serverconfigs.ProtocolHTTPS:
if httpsConfig == nil {
httpsConfig = &serverconfigs.HTTPSProtocolConfig{
2020-08-21 12:32:16 +08:00
BaseProtocol: serverconfigs.BaseProtocol{
IsOn: true,
},
}
}
2020-09-15 14:44:52 +08:00
httpsConfig.AddListen(addr)
2020-08-21 12:32:16 +08:00
}
}
2020-09-13 20:37:07 +08:00
case serverconfigs.ServerTypeTCPProxy:
2020-08-21 12:32:16 +08:00
listen := []*serverconfigs.NetworkAddressConfig{}
err := json.Unmarshal([]byte(params.Addresses), &listen)
if err != nil {
this.Fail("端口地址解析失败:" + err.Error())
}
2020-09-15 14:44:52 +08:00
if len(listen) == 0 {
this.Fail("至少需要绑定一个端口")
}
2020-08-21 12:32:16 +08:00
for _, addr := range listen {
2020-09-15 14:44:52 +08:00
switch addr.Protocol.Primary() {
case serverconfigs.ProtocolTCP:
if tcpConfig == nil {
tcpConfig = &serverconfigs.TCPProtocolConfig{
2020-08-21 12:32:16 +08:00
BaseProtocol: serverconfigs.BaseProtocol{
IsOn: true,
},
}
}
2020-09-15 14:44:52 +08:00
tcpConfig.AddListen(addr)
case serverconfigs.ProtocolTLS:
if tlsConfig == nil {
tlsConfig = &serverconfigs.TLSProtocolConfig{
2020-08-21 12:32:16 +08:00
BaseProtocol: serverconfigs.BaseProtocol{
IsOn: true,
},
}
}
2020-09-15 14:44:52 +08:00
tlsConfig.AddListen(addr)
2020-08-21 12:32:16 +08:00
}
}
default:
this.Fail("请选择正确的服务类型")
}
// TODO 证书
// 域名
2020-09-15 14:44:52 +08:00
if len(params.ServerNames) > 0 {
serverNames := []*serverconfigs.ServerNameConfig{}
err := json.Unmarshal([]byte(params.ServerNames), &serverNames)
if err != nil {
this.Fail("域名解析失败:" + err.Error())
}
2020-08-21 12:32:16 +08:00
}
// 源站地址
2020-09-21 11:37:24 +08:00
reverseProxyRefJSON := []byte{}
2020-08-21 12:32:16 +08:00
switch params.ServerType {
2020-09-13 20:37:07 +08:00
case serverconfigs.ServerTypeHTTPProxy, serverconfigs.ServerTypeTCPProxy:
2020-09-22 11:36:51 +08:00
origins := []*serverconfigs.OriginConfig{}
2020-09-15 14:44:52 +08:00
err := json.Unmarshal([]byte(params.Origins), &origins)
2020-08-21 12:32:16 +08:00
if err != nil {
this.Fail("源站地址解析失败:" + err.Error())
}
2020-09-15 14:44:52 +08:00
resp, err := this.RPC().ReverseProxyRPC().CreateReverseProxy(this.AdminContext(), &pb.CreateReverseProxyRequest{
SchedulingJSON: nil,
PrimaryOriginsJSON: []byte(params.Origins),
BackupOriginsJSON: nil,
})
if err != nil {
this.ErrorPage(err)
return
2020-08-21 12:32:16 +08:00
}
2020-09-21 11:37:24 +08:00
reverseProxyRef := &serverconfigs.ReverseProxyRef{
IsOn: true,
ReverseProxyId: resp.ReverseProxyId,
}
reverseProxyRefJSON, err = json.Marshal(reverseProxyRef)
if err != nil {
this.ErrorPage(err)
return
}
2020-08-21 12:32:16 +08:00
}
// Web地址
switch params.ServerType {
2020-09-13 20:37:07 +08:00
case serverconfigs.ServerTypeHTTPWeb:
2020-09-15 14:44:52 +08:00
webResp, err := this.RPC().HTTPWebRPC().CreateHTTPWeb(this.AdminContext(), &pb.CreateHTTPWebRequest{Root: params.WebRoot})
if err != nil {
this.ErrorPage(err)
return
2020-08-21 12:32:16 +08:00
}
2020-09-15 14:44:52 +08:00
webId = webResp.WebId
2020-07-29 19:34:54 +08:00
}
// 包含条件
includeNodes := []maps.Map{}
includeNodesJSON, err := json.Marshal(includeNodes)
if err != nil {
this.ErrorPage(err)
return
}
// 排除条件
excludeNodes := []maps.Map{}
excludeNodesJSON, err := json.Marshal(excludeNodes)
if err != nil {
this.ErrorPage(err)
return
}
2020-09-15 14:44:52 +08:00
req := &pb.CreateServerRequest{
2020-07-29 19:34:54 +08:00
UserId: 0,
AdminId: this.AdminId(),
2020-09-13 20:37:07 +08:00
Type: params.ServerType,
Name: params.Name,
2020-09-15 14:44:52 +08:00
ServerNamesJON: []byte(params.ServerNames),
2020-09-13 20:37:07 +08:00
Description: params.Description,
2020-07-29 19:34:54 +08:00
ClusterId: params.ClusterId,
IncludeNodesJSON: includeNodesJSON,
ExcludeNodesJSON: excludeNodesJSON,
2020-09-15 14:44:52 +08:00
WebId: webId,
2020-09-21 11:37:24 +08:00
ReverseProxyJSON: reverseProxyRefJSON,
2020-09-15 14:44:52 +08:00
}
if httpConfig != nil {
data, err := json.Marshal(httpConfig)
if err != nil {
this.ErrorPage(err)
return
}
req.HttpJSON = data
}
if httpsConfig != nil {
data, err := json.Marshal(httpsConfig)
if err != nil {
this.ErrorPage(err)
return
}
req.HttpsJSON = data
}
if tcpConfig != nil {
data, err := json.Marshal(tcpConfig)
if err != nil {
this.ErrorPage(err)
return
}
req.TcpJSON = data
}
if tlsConfig != nil {
data, err := json.Marshal(tlsConfig)
if err != nil {
this.ErrorPage(err)
return
}
req.TlsJSON = data
}
if unixConfig != nil {
data, err := json.Marshal(unixConfig)
if err != nil {
this.ErrorPage(err)
return
}
req.UnixJSON = data
}
if udpConfig != nil {
data, err := json.Marshal(udpConfig)
if err != nil {
this.ErrorPage(err)
return
}
req.UdpJSON = data
}
_, err = this.RPC().ServerRPC().CreateServer(this.AdminContext(), req)
2020-07-29 19:34:54 +08:00
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}