diff --git a/internal/db/models/node_cluster_dao.go b/internal/db/models/node_cluster_dao.go index 7f531503..e940d782 100644 --- a/internal/db/models/node_cluster_dao.go +++ b/internal/db/models/node_cluster_dao.go @@ -5,6 +5,7 @@ import ( "errors" "github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils" "github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs" + "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" _ "github.com/go-sql-driver/mysql" @@ -531,6 +532,39 @@ func (this *NodeClusterDAO) FindClusterAdminId(clusterId int64) (int64, error) { FindInt64Col(0) } +// 查找集群的TOA设置 +func (this *NodeClusterDAO) FindClusterTOAConfig(clusterId int64) (*nodeconfigs.TOAConfig, error) { + toa, err := this.Query(). + Pk(clusterId). + Result("toa"). + FindStringCol("") + if err != nil { + return nil, err + } + if !IsNotNull(toa) { + return nodeconfigs.DefaultTOAConfig(), nil + } + + config := &nodeconfigs.TOAConfig{} + err = json.Unmarshal([]byte(toa), config) + if err != nil { + return nil, err + } + return config, nil +} + +// 修改集群的TOA设置 +func (this *NodeClusterDAO) UpdateClusterTOA(clusterId int64, toaJSON []byte) error { + if clusterId <= 0 { + return errors.New("invalid clusterId") + } + op := NewNodeClusterOperator() + op.Id = clusterId + op.Toa = toaJSON + _, err := this.Save(op) + return err +} + // 生成唯一ID func (this *NodeClusterDAO) genUniqueId() (string, error) { for { diff --git a/internal/db/models/node_cluster_model.go b/internal/db/models/node_cluster_model.go index 27fcd8a8..79710f52 100644 --- a/internal/db/models/node_cluster_model.go +++ b/internal/db/models/node_cluster_model.go @@ -20,6 +20,7 @@ type NodeCluster struct { DnsName string `field:"dnsName"` // DNS名称 DnsDomainId uint32 `field:"dnsDomainId"` // 域名ID Dns string `field:"dns"` // DNS配置 + Toa string `field:"toa"` // TOA配置 } type NodeClusterOperator struct { @@ -41,6 +42,7 @@ type NodeClusterOperator struct { DnsName interface{} // DNS名称 DnsDomainId interface{} // 域名ID Dns interface{} // DNS配置 + Toa interface{} // TOA配置 } func NewNodeClusterOperator() *NodeClusterOperator { diff --git a/internal/db/models/node_dao.go b/internal/db/models/node_dao.go index 6da1bdc9..03c252b4 100644 --- a/internal/db/models/node_dao.go +++ b/internal/db/models/node_dao.go @@ -142,15 +142,8 @@ func (this *NodeDAO) UpdateNodeLatestVersion(nodeId int64) error { // 批量更新节点版本 func (this *NodeDAO) UpdateAllNodesLatestVersionMatch(clusterId int64) error { - nodeIds, err := this.FindAllNodeIdsMatch(clusterId) - if err != nil { - return err - } - if len(nodeIds) == 0 { - return nil - } - _, err = this.Query(). - Pk(nodeIds). + _, err := this.Query(). + Attr("clusterId", clusterId). Set("latestVersion", dbs.SQL("latestVersion+1")). Update() return err @@ -507,6 +500,13 @@ func (this *NodeDAO) ComposeNodeConfig(nodeId int64) (*nodeconfigs.NodeConfig, e config.GlobalConfig = globalConfig } + // TOA + toaConfig, err := SharedNodeClusterDAO.FindClusterTOAConfig(int64(node.ClusterId)) + if err != nil { + return nil, err + } + config.TOA = toaConfig + return config, nil } @@ -744,6 +744,14 @@ func (this *NodeDAO) FindNodeActive(nodeId int64) (bool, error) { return isActive == 1, nil } +// 查找节点的版本号 +func (this *NodeDAO) FindNodeVersion(nodeId int64) (int64, error) { + return this.Query(). + Pk(nodeId). + Result("version"). + FindInt64Col(0) +} + // 生成唯一ID func (this *NodeDAO) genUniqueId() (string, error) { for { diff --git a/internal/db/models/user_model.go b/internal/db/models/user_model.go index be1a89ce..bab4a9be 100644 --- a/internal/db/models/user_model.go +++ b/internal/db/models/user_model.go @@ -2,29 +2,35 @@ package models // 用户 type User struct { - Id uint32 `field:"id"` // ID - Username string `field:"username"` // 用户名 - Password string `field:"password"` // 密码 - Fullname string `field:"fullname"` // 真实姓名 - CreatedAt uint64 `field:"createdAt"` // 创建时间 - UpdatedAt uint64 `field:"updatedAt"` // 修改时间 - State uint8 `field:"state"` // 状态 - Mobile string `field:"mobile"` // 手机号 - Remark string `field:"remark"` // 备注 - Email string `field:"email"` // 邮箱地址 + Id uint32 `field:"id"` // ID + IsOn uint8 `field:"isOn"` // 是否启用 + Username string `field:"username"` // 用户名 + Password string `field:"password"` // 密码 + Fullname string `field:"fullname"` // 真实姓名 + Mobile string `field:"mobile"` // 手机号 + Tel string `field:"tel"` // 联系电话 + Remark string `field:"remark"` // 备注 + Email string `field:"email"` // 邮箱地址 + AvatarFileId uint64 `field:"avatarFileId"` // 头像文件ID + CreatedAt uint64 `field:"createdAt"` // 创建时间 + UpdatedAt uint64 `field:"updatedAt"` // 修改时间 + State uint8 `field:"state"` // 状态 } type UserOperator struct { - Id interface{} // ID - Username interface{} // 用户名 - Password interface{} // 密码 - Fullname interface{} // 真实姓名 - CreatedAt interface{} // 创建时间 - UpdatedAt interface{} // 修改时间 - State interface{} // 状态 - Mobile interface{} // 手机号 - Remark interface{} // 备注 - Email interface{} // 邮箱地址 + Id interface{} // ID + IsOn interface{} // 是否启用 + Username interface{} // 用户名 + Password interface{} // 密码 + Fullname interface{} // 真实姓名 + Mobile interface{} // 手机号 + Tel interface{} // 联系电话 + Remark interface{} // 备注 + Email interface{} // 邮箱地址 + AvatarFileId interface{} // 头像文件ID + CreatedAt interface{} // 创建时间 + UpdatedAt interface{} // 修改时间 + State interface{} // 状态 } func NewUserOperator() *UserOperator { diff --git a/internal/db/models/utils.go b/internal/db/models/utils.go index c13bf506..6e00330b 100644 --- a/internal/db/models/utils.go +++ b/internal/db/models/utils.go @@ -10,7 +10,7 @@ func JSONBytes(data []byte) []byte { return data } -// 判断JSON是否为空 +// 判断JSON是否不为空 func IsNotNull(data string) bool { return len(data) > 0 && data != "null" } diff --git a/internal/rpc/services/service_node.go b/internal/rpc/services/service_node.go index 00640273..651fa75f 100644 --- a/internal/rpc/services/service_node.go +++ b/internal/rpc/services/service_node.go @@ -466,6 +466,16 @@ func (this *NodeService) FindCurrentNodeConfig(ctx context.Context, req *pb.Find if err != nil { return nil, err } + + // 检查版本号 + currentVersion, err := models.SharedNodeDAO.FindNodeVersion(nodeId) + if err != nil { + return nil, err + } + if currentVersion == req.Version { + return &pb.FindCurrentNodeConfigResponse{IsChanged: false}, nil + } + nodeConfig, err := models.SharedNodeDAO.ComposeNodeConfig(nodeId) if err != nil { return nil, err @@ -476,7 +486,7 @@ func (this *NodeService) FindCurrentNodeConfig(ctx context.Context, req *pb.Find return nil, err } - return &pb.FindCurrentNodeConfigResponse{NodeJSON: data}, nil + return &pb.FindCurrentNodeConfigResponse{IsChanged: true, NodeJSON: data}, nil } // 更新节点状态 diff --git a/internal/rpc/services/service_node_cluster.go b/internal/rpc/services/service_node_cluster.go index 71a0ad9f..146fb220 100644 --- a/internal/rpc/services/service_node_cluster.go +++ b/internal/rpc/services/service_node_cluster.go @@ -267,7 +267,7 @@ func (this *NodeClusterService) FindNodeClusterHealthCheckConfig(ctx context.Con if err != nil { return nil, err } - return &pb.FindNodeClusterHealthCheckConfigResponse{HealthCheckConfig: configJSON}, nil + return &pb.FindNodeClusterHealthCheckConfigResponse{HealthCheckJSON: configJSON}, nil } // 修改集群健康检查设置 @@ -529,3 +529,46 @@ func (this *NodeClusterService) CheckNodeClusterDNSChanges(ctx context.Context, return &pb.CheckNodeClusterDNSChangesResponse{IsChanged: len(changes) > 0}, nil } + +// 查找集群的TOA配置 +func (this *NodeClusterService) FindEnabledNodeClusterTOA(ctx context.Context, req *pb.FindEnabledNodeClusterTOARequest) (*pb.FindEnabledNodeClusterTOAResponse, error) { + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + // TODO 检查权限 + + config, err := models.SharedNodeClusterDAO.FindClusterTOAConfig(req.NodeClusterId) + if err != nil { + return nil, err + } + configJSON, err := json.Marshal(config) + if err != nil { + return nil, err + } + return &pb.FindEnabledNodeClusterTOAResponse{ToaJSON: configJSON}, nil +} + +// 修改集群的TOA设置 +func (this *NodeClusterService) UpdateNodeClusterTOA(ctx context.Context, req *pb.UpdateNodeClusterTOARequest) (*pb.RPCSuccess, error) { + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + // TODO 检查权限 + + err = models.SharedNodeClusterDAO.UpdateClusterTOA(req.NodeClusterId, req.ToaJSON) + if err != nil { + return nil, err + } + + // 更新节点版本 + err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(req.NodeClusterId) + if err != nil { + return nil, err + } + + return this.Success() +}