diff --git a/internal/db/models/node_ip_address_dao.go b/internal/db/models/node_ip_address_dao.go index 97bac962..5032072a 100644 --- a/internal/db/models/node_ip_address_dao.go +++ b/internal/db/models/node_ip_address_dao.go @@ -2,6 +2,7 @@ package models import ( "errors" + "github.com/TeaOSLab/EdgeAPI/internal/db/models/dns" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" _ "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" @@ -36,21 +37,27 @@ func init() { } // EnableAddress 启用条目 -func (this *NodeIPAddressDAO) EnableAddress(tx *dbs.Tx, id int64) (err error) { +func (this *NodeIPAddressDAO) EnableAddress(tx *dbs.Tx, addressId int64) (err error) { _, err = this.Query(tx). - Pk(id). + Pk(addressId). Set("state", NodeIPAddressStateEnabled). Update() - return err + if err != nil { + return err + } + return this.NotifyUpdate(tx, addressId) } // DisableAddress 禁用IP地址 -func (this *NodeIPAddressDAO) DisableAddress(tx *dbs.Tx, id int64) (err error) { +func (this *NodeIPAddressDAO) DisableAddress(tx *dbs.Tx, addressId int64) (err error) { _, err = this.Query(tx). - Pk(id). + Pk(addressId). Set("state", NodeIPAddressStateDisabled). Update() - return err + if err != nil { + return err + } + return this.NotifyUpdate(tx, addressId) } // DisableAllAddressesWithNodeId 禁用节点的所有的IP地址 @@ -66,7 +73,11 @@ func (this *NodeIPAddressDAO) DisableAllAddressesWithNodeId(tx *dbs.Tx, nodeId i Attr("role", role). Set("state", NodeIPAddressStateDisabled). Update() - return err + if err != nil { + return err + } + + return SharedNodeDAO.NotifyDNSUpdate(tx, nodeId) } // FindEnabledAddress 查找启用中的IP地址 @@ -116,7 +127,7 @@ func (this *NodeIPAddressDAO) CreateAddress(tx *dbs.Tx, nodeId int64, role nodec } // UpdateAddress 修改IP地址 -func (this *NodeIPAddressDAO) UpdateAddress(tx *dbs.Tx, addressId int64, name string, ip string, canAccess bool) (err error) { +func (this *NodeIPAddressDAO) UpdateAddress(tx *dbs.Tx, addressId int64, name string, ip string, canAccess bool, isOn bool) (err error) { if addressId <= 0 { return errors.New("invalid addressId") } @@ -126,9 +137,13 @@ func (this *NodeIPAddressDAO) UpdateAddress(tx *dbs.Tx, addressId int64, name st op.Name = name op.Ip = ip op.CanAccess = canAccess + op.IsOn = isOn op.State = NodeIPAddressStateEnabled // 恢复状态 err = this.Save(tx, op) - return err + if err != nil { + return err + } + return this.NotifyUpdate(tx, addressId) } // UpdateAddressIP 修改IP地址中的IP @@ -140,7 +155,11 @@ func (this *NodeIPAddressDAO) UpdateAddressIP(tx *dbs.Tx, addressId int64, ip st op.Id = addressId op.Ip = ip err := this.Save(tx, op) - return err + if err != nil { + return err + } + + return this.NotifyUpdate(tx, addressId) } // UpdateAddressNodeId 修改IP地址所属节点 @@ -209,8 +228,8 @@ func (this *NodeIPAddressDAO) FindFirstNodeAccessIPAddressId(tx *dbs.Tx, nodeId FindInt64Col(0) } -// FindNodeAccessIPAddresses 查找节点所有的可访问的IP地址 -func (this *NodeIPAddressDAO) FindNodeAccessIPAddresses(tx *dbs.Tx, nodeId int64, role nodeconfigs.NodeRole) (result []*NodeIPAddress, err error) { +// FindNodeAccessAndUpIPAddresses 查找节点所有的可访问的IP地址 +func (this *NodeIPAddressDAO) FindNodeAccessAndUpIPAddresses(tx *dbs.Tx, nodeId int64, role nodeconfigs.NodeRole) (result []*NodeIPAddress, err error) { if len(role) == 0 { role = nodeconfigs.NodeRoleNode } @@ -219,9 +238,38 @@ func (this *NodeIPAddressDAO) FindNodeAccessIPAddresses(tx *dbs.Tx, nodeId int64 Attr("nodeId", nodeId). State(NodeIPAddressStateEnabled). Attr("canAccess", true). + Attr("isOn", true). + Attr("isUp", true). Desc("order"). AscPk(). Slice(&result). FindAll() return } + +// NotifyUpdate 通知更新 +func (this *NodeIPAddressDAO) NotifyUpdate(tx *dbs.Tx, addressId int64) error { + address, err := this.Query(tx). + Pk(addressId). + Result("nodeId", "role"). + Find() + if err != nil { + return err + } + if address == nil { + return nil + } + var nodeId = int64(address.(*NodeIPAddress).NodeId) + if nodeId == 0 { + return nil + } + var role = address.(*NodeIPAddress).Role + switch role { + case nodeconfigs.NodeRoleNode: + err = dns.SharedDNSTaskDAO.CreateNodeTask(tx, nodeId, dns.DNSTaskTypeNodeChange) + } + if err != nil { + return err + } + return nil +} diff --git a/internal/db/models/node_ip_address_log_dao.go b/internal/db/models/node_ip_address_log_dao.go new file mode 100644 index 00000000..3bb20550 --- /dev/null +++ b/internal/db/models/node_ip_address_log_dao.go @@ -0,0 +1,28 @@ +package models + +import ( + _ "github.com/go-sql-driver/mysql" + "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/dbs" +) + +type NodeIPAddressLogDAO dbs.DAO + +func NewNodeIPAddressLogDAO() *NodeIPAddressLogDAO { + return dbs.NewDAO(&NodeIPAddressLogDAO{ + DAOObject: dbs.DAOObject{ + DB: Tea.Env, + Table: "edgeNodeIPAddressLogs", + Model: new(NodeIPAddressLog), + PkName: "id", + }, + }).(*NodeIPAddressLogDAO) +} + +var SharedNodeIPAddressLogDAO *NodeIPAddressLogDAO + +func init() { + dbs.OnReady(func() { + SharedNodeIPAddressLogDAO = NewNodeIPAddressLogDAO() + }) +} diff --git a/internal/db/models/node_ip_address_log_dao_test.go b/internal/db/models/node_ip_address_log_dao_test.go new file mode 100644 index 00000000..224e9db7 --- /dev/null +++ b/internal/db/models/node_ip_address_log_dao_test.go @@ -0,0 +1,6 @@ +package models + +import ( + _ "github.com/go-sql-driver/mysql" + _ "github.com/iwind/TeaGo/bootstrap" +) diff --git a/internal/db/models/node_ip_address_log_model.go b/internal/db/models/node_ip_address_log_model.go new file mode 100644 index 00000000..6559ccf5 --- /dev/null +++ b/internal/db/models/node_ip_address_log_model.go @@ -0,0 +1,24 @@ +package models + +// NodeIPAddressLog IP状态变更日志 +type NodeIPAddressLog struct { + Id uint64 `field:"id"` // ID + AddressId uint64 `field:"addressId"` // 地址ID + AdminId uint32 `field:"adminId"` // 管理员ID + Description string `field:"description"` // 描述 + CreatedAt uint64 `field:"createdAt"` // 操作时间 + Day string `field:"day"` // YYYYMMDD,用来清理 +} + +type NodeIPAddressLogOperator struct { + Id interface{} // ID + AddressId interface{} // 地址ID + AdminId interface{} // 管理员ID + Description interface{} // 描述 + CreatedAt interface{} // 操作时间 + Day interface{} // YYYYMMDD,用来清理 +} + +func NewNodeIPAddressLogOperator() *NodeIPAddressLogOperator { + return &NodeIPAddressLogOperator{} +} diff --git a/internal/db/models/node_ip_address_log_model_ext.go b/internal/db/models/node_ip_address_log_model_ext.go new file mode 100644 index 00000000..2640e7f9 --- /dev/null +++ b/internal/db/models/node_ip_address_log_model_ext.go @@ -0,0 +1 @@ +package models diff --git a/internal/db/models/node_ip_address_model.go b/internal/db/models/node_ip_address_model.go index c3c24f85..531d8495 100644 --- a/internal/db/models/node_ip_address_model.go +++ b/internal/db/models/node_ip_address_model.go @@ -11,6 +11,9 @@ type NodeIPAddress struct { State uint8 `field:"state"` // 状态 Order uint32 `field:"order"` // 排序 CanAccess uint8 `field:"canAccess"` // 是否可以访问 + IsOn uint8 `field:"isOn"` // 是否启用 + IsUp uint8 `field:"isUp"` // 是否上线 + Thresholds string `field:"thresholds"` // 上线阈值 } type NodeIPAddressOperator struct { @@ -23,6 +26,9 @@ type NodeIPAddressOperator struct { State interface{} // 状态 Order interface{} // 排序 CanAccess interface{} // 是否可以访问 + IsOn interface{} // 是否启用 + IsUp interface{} // 是否上线 + Thresholds interface{} // 上线阈值 } func NewNodeIPAddressOperator() *NodeIPAddressOperator { diff --git a/internal/rpc/services/service_dns_domain.go b/internal/rpc/services/service_dns_domain.go index 068de6bc..fbe3034a 100644 --- a/internal/rpc/services/service_dns_domain.go +++ b/internal/rpc/services/service_dns_domain.go @@ -413,7 +413,7 @@ func (this *DNSDomainService) findClusterDNSChanges(cluster *models.NodeCluster, // 新增的节点域名 nodeKeys := []string{} for _, node := range nodes { - ipAddresses, err := models.SharedNodeIPAddressDAO.FindNodeAccessIPAddresses(tx, int64(node.Id), nodeconfigs.NodeRoleNode) + ipAddresses, err := models.SharedNodeIPAddressDAO.FindNodeAccessAndUpIPAddresses(tx, int64(node.Id), nodeconfigs.NodeRoleNode) if err != nil { return nil, nil, nil, 0, 0, false, false, err } diff --git a/internal/rpc/services/service_node.go b/internal/rpc/services/service_node.go index 02eb3837..95287a50 100644 --- a/internal/rpc/services/service_node.go +++ b/internal/rpc/services/service_node.go @@ -1203,7 +1203,7 @@ func (this *NodeService) FindAllEnabledNodesDNSWithNodeClusterId(ctx context.Con } result := []*pb.NodeDNSInfo{} for _, node := range nodes { - ipAddresses, err := models.SharedNodeIPAddressDAO.FindNodeAccessIPAddresses(tx, int64(node.Id), nodeconfigs.NodeRoleNode) + ipAddresses, err := models.SharedNodeIPAddressDAO.FindNodeAccessAndUpIPAddresses(tx, int64(node.Id), nodeconfigs.NodeRoleNode) if err != nil { return nil, err } diff --git a/internal/rpc/services/service_node_ip_address.go b/internal/rpc/services/service_node_ip_address.go index cab24260..80701ac4 100644 --- a/internal/rpc/services/service_node_ip_address.go +++ b/internal/rpc/services/service_node_ip_address.go @@ -38,7 +38,7 @@ func (this *NodeIPAddressService) UpdateNodeIPAddress(ctx context.Context, req * tx := this.NullTx() - err = models.SharedNodeIPAddressDAO.UpdateAddress(tx, req.AddressId, req.Name, req.Ip, req.CanAccess) + err = models.SharedNodeIPAddressDAO.UpdateAddress(tx, req.AddressId, req.Name, req.Ip, req.CanAccess, req.IsOn) if err != nil { return nil, err } @@ -118,14 +118,17 @@ func (this *NodeIPAddressService) FindEnabledNodeIPAddress(ctx context.Context, var result *pb.NodeIPAddress = nil if address != nil { result = &pb.NodeIPAddress{ - Id: int64(address.Id), - NodeId: int64(address.NodeId), - Name: address.Name, - Ip: address.Ip, - Description: address.Description, - State: int64(address.State), - Order: int64(address.Order), - CanAccess: address.CanAccess == 1, + Id: int64(address.Id), + NodeId: int64(address.NodeId), + Name: address.Name, + Ip: address.Ip, + Description: address.Description, + State: int64(address.State), + Order: int64(address.Order), + CanAccess: address.CanAccess == 1, + IsOn: address.IsOn == 1, + IsUp: address.IsUp == 1, + ThresholdsJSON: []byte(address.Thresholds), } } @@ -150,14 +153,17 @@ func (this *NodeIPAddressService) FindAllEnabledIPAddressesWithNodeId(ctx contex result := []*pb.NodeIPAddress{} for _, address := range addresses { result = append(result, &pb.NodeIPAddress{ - Id: int64(address.Id), - NodeId: int64(address.NodeId), - Name: address.Name, - Ip: address.Ip, - Description: address.Description, - State: int64(address.State), - Order: int64(address.Order), - CanAccess: address.CanAccess == 1, + Id: int64(address.Id), + NodeId: int64(address.NodeId), + Name: address.Name, + Ip: address.Ip, + Description: address.Description, + State: int64(address.State), + Order: int64(address.Order), + CanAccess: address.CanAccess == 1, + IsOn: address.IsOn == 1, + IsUp: address.IsUp == 1, + ThresholdsJSON: []byte(address.Thresholds), }) } diff --git a/internal/tasks/dns_task_executor.go b/internal/tasks/dns_task_executor.go index 0199ac01..a1bcea34 100644 --- a/internal/tasks/dns_task_executor.go +++ b/internal/tasks/dns_task_executor.go @@ -312,7 +312,7 @@ func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error { } for _, ipAddress := range ipAddresses { ip := ipAddress.Ip - if len(ip) == 0 || ipAddress.CanAccess == 0 { + if len(ip) == 0 || ipAddress.CanAccess == 0 || ipAddress.IsUp == 0 || ipAddress.IsOn == 0 { continue } if net.ParseIP(ip) == nil {