阶段性提交

This commit is contained in:
刘祥超
2020-09-06 16:19:54 +08:00
parent 5c17caa416
commit 6f5faf66f7
37 changed files with 3134 additions and 91 deletions

View File

@@ -0,0 +1,163 @@
package models
import (
"errors"
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/rands"
"github.com/iwind/TeaGo/types"
)
const (
APINodeStateEnabled = 1 // 已启用
APINodeStateDisabled = 0 // 已禁用
)
type APINodeDAO dbs.DAO
func NewAPINodeDAO() *APINodeDAO {
return dbs.NewDAO(&APINodeDAO{
DAOObject: dbs.DAOObject{
DB: Tea.Env,
Table: "edgeApiNodes",
Model: new(APINode),
PkName: "id",
},
}).(*APINodeDAO)
}
var SharedAPINodeDAO = NewAPINodeDAO()
// 启用条目
func (this *APINodeDAO) EnableAPINode(id int64) error {
_, err := this.Query().
Pk(id).
Set("state", APINodeStateEnabled).
Update()
return err
}
// 禁用条目
func (this *APINodeDAO) DisableAPINode(id int64) error {
_, err := this.Query().
Pk(id).
Set("state", APINodeStateDisabled).
Update()
return err
}
// 查找启用中的条目
func (this *APINodeDAO) FindEnabledAPINode(id int64) (*APINode, error) {
result, err := this.Query().
Pk(id).
Attr("state", APINodeStateEnabled).
Find()
if result == nil {
return nil, err
}
return result.(*APINode), err
}
// 根据主键查找名称
func (this *APINodeDAO) FindAPINodeName(id int64) (string, error) {
return this.Query().
Pk(id).
Result("name").
FindStringCol("")
}
// 创建API节点
func (this *APINodeDAO) CreateAPINode(name string, description string, host string, port int) (nodeId int64, err error) {
uniqueId, err := this.genUniqueId()
if err != nil {
return 0, err
}
secret := rands.String(32)
err = SharedApiTokenDAO.CreateAPIToken(uniqueId, secret, NodeRoleAPI)
if err != nil {
return
}
op := NewAPINodeOperator()
op.IsOn = true
op.UniqueId = uniqueId
op.Secret = secret
op.Name = name
op.Description = description
op.Host = host
op.Port = port
op.State = NodeStateEnabled
_, err = this.Save(op)
if err != nil {
return
}
return types.Int64(op.Id), nil
}
// 修改API节点
func (this *APINodeDAO) UpdateAPINode(nodeId int64, name string, description string, host string, port int) error {
if nodeId <= 0 {
return errors.New("invalid nodeId")
}
op := NewAPINodeOperator()
op.Id = nodeId
op.Name = name
op.Description = description
op.Host = host
op.Port = port
_, err := this.Save(op)
return err
}
// 列出所有可用API节点
func (this *APINodeDAO) FindAllEnabledAPINodes() (result []*APINode, err error) {
_, err = this.Query().
Attr("clusterId", 0). // 非集群专用
State(APINodeStateEnabled).
Desc("order").
AscPk().
Slice(&result).
FindAll()
return
}
// 计算API节点数量
func (this *APINodeDAO) CountAllEnabledAPINodes() (int64, error) {
return this.Query().
State(APINodeStateEnabled).
Count()
}
// 列出单页的API节点
func (this *APINodeDAO) ListEnabledAPINodes(offset int64, size int64) (result []*APINode, err error) {
_, err = this.Query().
Attr("clusterId", 0). // 非集群专用
State(APINodeStateEnabled).
Offset(offset).
Limit(size).
Desc("order").
DescPk().
Slice(&result).
FindAll()
return
}
// 生成唯一ID
func (this *APINodeDAO) genUniqueId() (string, error) {
for {
uniqueId := rands.HexString(32)
ok, err := this.Query().
Attr("uniqueId", uniqueId).
Exist()
if err != nil {
return "", err
}
if ok {
continue
}
return uniqueId, nil
}
}

View File

@@ -0,0 +1,5 @@
package models
import (
_ "github.com/go-sql-driver/mysql"
)

View File

@@ -0,0 +1,34 @@
package models
//
type APINode struct {
Id uint32 `field:"id"` // ID
IsOn uint8 `field:"isOn"` // 是否启用
ClusterId uint32 `field:"clusterId"` // 专用集群ID
UniqueId string `field:"uniqueId"` // 唯一ID
Secret string `field:"secret"` // 密钥
Name string `field:"name"` // 名称
Description string `field:"description"` // 描述
Host string `field:"host"` // 地址
Port uint32 `field:"port"` // 端口
Order uint32 `field:"order"` // 排序
State uint8 `field:"state"` // 状态
}
type APINodeOperator struct {
Id interface{} // ID
IsOn interface{} // 是否启用
ClusterId interface{} // 专用集群ID
UniqueId interface{} // 唯一ID
Secret interface{} // 密钥
Name interface{} // 名称
Description interface{} // 描述
Host interface{} // 地址
Port interface{} // 端口
Order interface{} // 排序
State interface{} // 状态
}
func NewAPINodeOperator() *APINodeOperator {
return &APINodeOperator{}
}

View File

@@ -0,0 +1 @@
package models

View File

@@ -66,3 +66,14 @@ func (this *ApiTokenDAO) FindEnabledTokenWithNode(nodeId string) (*ApiToken, err
}
return nil, err
}
// 保存API Token
func (this *ApiTokenDAO) CreateAPIToken(nodeId string, secret string, role NodeRole) error {
op := NewApiTokenOperator()
op.NodeId = nodeId
op.Secret = secret
op.Role = role
op.State = ApiTokenStateEnabled
_, err := this.Save(op)
return err
}

View File

@@ -83,6 +83,8 @@ func (this *NodeClusterDAO) CreateCluster(name string, grantId int64, installDir
op.Name = name
op.GrantId = grantId
op.InstallDir = installDir
op.UseAllAPINodes = 1
op.ApiNodes = "[]"
op.State = NodeClusterStateEnabled
_, err = this.Save(op)
if err != nil {

View File

@@ -2,23 +2,27 @@ package models
// 节点集群
type NodeCluster struct {
Id uint32 `field:"id"` // ID
Name string `field:"name"` // 名称
InstallDir string `field:"installDir"` // 安装目录
GrantId uint32 `field:"grantId"` // 默认认证方式
Order uint32 `field:"order"` // 排序
CreatedAt uint32 `field:"createdAt"` // 创建时间
State uint8 `field:"state"` // 状态
Id uint32 `field:"id"` // ID
Name string `field:"name"` // 名称
InstallDir string `field:"installDir"` // 安装目录
GrantId uint32 `field:"grantId"` // 默认认证方式
UseAllAPINodes uint8 `field:"useAllAPINodes"` // 是否使用所有API节点
ApiNodes string `field:"apiNodes"` // 使用的API节点
Order uint32 `field:"order"` // 排序
CreatedAt uint32 `field:"createdAt"` // 创建时间
State uint8 `field:"state"` // 状态
}
type NodeClusterOperator struct {
Id interface{} // ID
Name interface{} // 名称
InstallDir interface{} // 安装目录
GrantId interface{} // 默认认证方式
Order interface{} // 排序
CreatedAt interface{} // 创建时间
State interface{} // 状态
Id interface{} // ID
Name interface{} // 名称
InstallDir interface{} // 安装目录
GrantId interface{} // 默认认证方式
UseAllAPINodes interface{} // 是否使用所有API节点
ApiNodes interface{} // 使用的API节点
Order interface{} // 排序
CreatedAt interface{} // 创建时间
State interface{} // 状态
}
func NewNodeClusterOperator() *NodeClusterOperator {

View File

@@ -74,10 +74,18 @@ func (this *NodeDAO) CreateNode(name string, clusterId int64) (nodeId int64, err
return 0, err
}
secret := rands.String(32)
// 保存API Token
err = SharedApiTokenDAO.CreateAPIToken(uniqueId, secret, NodeRoleNode)
if err != nil {
return
}
op := NewNodeOperator()
op.Name = name
op.UniqueId = uniqueId
op.Secret = rands.String(32)
op.Secret = secret
op.ClusterId = clusterId
op.IsOn = 1
op.State = NodeStateEnabled
@@ -260,6 +268,15 @@ func (this *NodeDAO) UpdateNodeStatus(nodeId int64, statusJSON []byte) error {
return err
}
// 设置节点安装状态
func (this *NodeDAO) UpdateNodeIsInstalled(nodeId int64, isInstalled bool) error {
_, err := this.Query().
Pk(nodeId).
Set("isInstalled", isInstalled).
Update()
return err
}
// 生成唯一ID
func (this *NodeDAO) genUniqueId() (string, error) {
for {

View File

@@ -0,0 +1,15 @@
package models
type NodeRole = string
const (
NodeRoleAdmin NodeRole = "admin"
NodeRoleUser NodeRole = "user"
NodeRoleProvider NodeRole = "provider"
NodeRoleAPI NodeRole = "api"
NodeRoleDatabase NodeRole = "database"
NodeRoleLog NodeRole = "log"
NodeRoleDNS NodeRole = "dns"
NodeRoleMonitor NodeRole = "monitor"
NodeRoleNode NodeRole = "node"
)