package models
|
|
import (
|
"errors"
|
"fmt"
|
"strconv"
|
"time"
|
"vamicro/config"
|
"vamicro/extend/util"
|
|
"basic.com/syncdb.git"
|
)
|
|
type Cluster struct {
|
ClusterId string `gorm:"primary_key;column:cluster_id" json:"cluster_id"`
|
ClusterName string `gorm:"column:cluster_name" json:"cluster_name"`
|
Password string `gorm:"column:password" json:"password"`
|
VirtualIp string `gorm:"column:virtual_ip" json:"virtual_ip"`
|
}
|
|
func (Cluster) TableName() string {
|
return "cluster"
|
}
|
|
func (c *Cluster) FindAll() (arr []Cluster, err error) {
|
if err = db.Table("cluster").Find(&arr).Error; err != nil {
|
return nil, err
|
}
|
return arr, nil
|
}
|
|
func (c *Cluster) FindByClusterId() (result Cluster, err error) {
|
if c.ClusterId == "" {
|
return Cluster{}, fmt.Errorf("param clusterId is nil error")
|
}
|
if err = db.Table("cluster").Where("cluster_id=?", c.ClusterId).First(&result).Error; err != nil {
|
return Cluster{}, err
|
}
|
return result, nil
|
}
|
|
func (c *Cluster) FindByVirtualIp() (result Cluster, err error) {
|
if c.VirtualIp == "" {
|
return Cluster{}, fmt.Errorf("param virtual_ip is nil error")
|
}
|
if err = db.Table("cluster").Where("virtual_ip=?", c.VirtualIp).First(&result).Error; err != nil {
|
return Cluster{}, err
|
}
|
return result, nil
|
}
|
|
func (c *Cluster) Create() error {
|
var localConfig LocalConfig
|
err := localConfig.Select()
|
if err != nil {
|
return err
|
}
|
|
serverId := config.Server.AnalyServerId
|
if serverId == "" {
|
return errors.New("serverId 为空")
|
}
|
|
serverIp, _, e := util.GetLocalIP(config.Server.NetworkAdapter)
|
if e != nil {
|
return e
|
}
|
|
tx := db.Begin()
|
defer func() {
|
if err != nil && tx != nil {
|
tx.Rollback()
|
}
|
}()
|
|
sql := "insert into cluster (cluster_id,cluster_name,password,virtual_ip) values ('" + c.ClusterId + "','" + c.ClusterName + "','" + c.Password + "','" + c.VirtualIp + "')"
|
if err = tx.Exec(sql).Error; err != nil {
|
return err
|
}
|
timeUnix := time.Now().Unix()
|
fmtTimeStr := time.Unix(timeUnix, 0).Format("2006-01-02 15:04:05")
|
//添加本身节点
|
sql = "insert into cluster_node (id,cluster_id,node_name,node_id,node_ip,create_time,isDelete,device_type,drift_state) values ('" + serverId + "','" + c.ClusterId + "','" + localConfig.ServerName + "','" + serverId + "','" + (serverIp + ":" + strconv.Itoa(syncdb.DefaultBindPort)) + "','" + fmtTimeStr + "',0,'" + config.Server.DeviceType + "','master')"
|
if err = tx.Exec(sql).Error; err != nil {
|
return err
|
}
|
|
tx.Commit()
|
|
return nil
|
}
|
|
func (c *Cluster) UpdateClusterName(clusterName string, virtualIp string) bool {
|
arr, e := c.FindAll()
|
if e == nil && arr != nil && len(arr) > 0 {
|
result := db.Exec("update cluster set cluster_name='" + clusterName + "',virtual_ip='" + virtualIp + "' where cluster_id='" + arr[0].ClusterId + "'")
|
if result.Error != nil {
|
return false
|
}
|
if result.RowsAffected > 0 {
|
return true
|
}
|
}
|
return false
|
}
|
|
func (c *Cluster) UpdateNodeName(nodeName string, nodeId string) bool {
|
arr, _ := c.FindAll()
|
if arr != nil && len(arr) > 0 {
|
c := arr[0]
|
result := db.Exec("update cluster_node set node_name='" + nodeName + "' where cluster_id='" + c.ClusterId + "' and id='" + nodeId + "'")
|
if result.Error != nil {
|
return false
|
}
|
return result.RowsAffected > 0
|
}
|
|
return false
|
}
|
|
func (c *Cluster) FindAllNodeMap() map[string]Node {
|
m := make(map[string]Node, 0)
|
arr, err := c.FindAll()
|
if err == nil && arr != nil {
|
var nodeE Node
|
for _, ct := range arr {
|
nodes, e := nodeE.FindNodesByClusterId(ct.ClusterId)
|
if e == nil && nodes != nil {
|
for _, nd := range nodes {
|
m[nd.NodeId] = nd
|
}
|
}
|
}
|
}
|
|
return m
|
}
|