// Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . //go:build plus package services import ( "context" "encoding/json" "errors" "github.com/TeaOSLab/EdgeAPI/internal/db/models" "github.com/TeaOSLab/EdgeAPI/internal/utils/regexputils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" ) // FindNodeUAMPolicies 查找节点的UAM策略 func (this *NodeService) FindNodeUAMPolicies(ctx context.Context, req *pb.FindNodeUAMPoliciesRequest) (*pb.FindNodeUAMPoliciesResponse, error) { nodeId, err := this.ValidateNode(ctx) if err != nil { return nil, err } var tx = this.NullTx() clusterIds, err := models.SharedNodeDAO.FindEnabledAndOnNodeClusterIds(tx, nodeId) if err != nil { return nil, err } var pbPolicies = []*pb.FindNodeUAMPoliciesResponse_UAMPolicy{} for _, clusterId := range clusterIds { policy, err := models.SharedNodeClusterDAO.FindClusterUAMPolicy(tx, clusterId, nil) if err != nil { return nil, err } if policy == nil { continue } policyJSON, err := json.Marshal(policy) if err != nil { return nil, err } pbPolicies = append(pbPolicies, &pb.FindNodeUAMPoliciesResponse_UAMPolicy{ NodeClusterId: clusterId, UamPolicyJSON: policyJSON, }) } return &pb.FindNodeUAMPoliciesResponse{ UamPolicies: pbPolicies, }, nil } // FindNodeHTTPCCPolicies 查找节点的HTTP CC策略 func (this *NodeService) FindNodeHTTPCCPolicies(ctx context.Context, req *pb.FindNodeHTTPCCPoliciesRequest) (*pb.FindNodeHTTPCCPoliciesResponse, error) { nodeId, err := this.ValidateNode(ctx) if err != nil { return nil, err } var tx = this.NullTx() clusterIds, err := models.SharedNodeDAO.FindEnabledAndOnNodeClusterIds(tx, nodeId) if err != nil { return nil, err } var pbPolicies = []*pb.FindNodeHTTPCCPoliciesResponse_HTTPCCPolicy{} for _, clusterId := range clusterIds { policy, err := models.SharedNodeClusterDAO.FindClusterHTTPCCPolicy(tx, clusterId, nil) if err != nil { return nil, err } if policy == nil { continue } // 集成默认设置 for i := 0; i < len(serverconfigs.DefaultHTTPCCThresholds); i++ { if i < len(policy.Thresholds) { policy.Thresholds[i].MergeIfEmpty(serverconfigs.DefaultHTTPCCThresholds[i]) } } policyJSON, err := json.Marshal(policy) if err != nil { return nil, err } pbPolicies = append(pbPolicies, &pb.FindNodeHTTPCCPoliciesResponse_HTTPCCPolicy{ NodeClusterId: clusterId, HttpCCPolicyJSON: policyJSON, }) } return &pb.FindNodeHTTPCCPoliciesResponse{ HttpCCPolicies: pbPolicies, }, nil } // FindNodeHTTP3Policies 查找节点的HTTP3策略 func (this *NodeService) FindNodeHTTP3Policies(ctx context.Context, req *pb.FindNodeHTTP3PoliciesRequest) (*pb.FindNodeHTTP3PoliciesResponse, error) { nodeId, err := this.ValidateNode(ctx) if err != nil { return nil, err } var tx = this.NullTx() clusterIds, err := models.SharedNodeDAO.FindEnabledAndOnNodeClusterIds(tx, nodeId) if err != nil { return nil, err } var pbPolicies = []*pb.FindNodeHTTP3PoliciesResponse_HTTP3Policy{} for _, clusterId := range clusterIds { policy, err := models.SharedNodeClusterDAO.FindClusterHTTP3Policy(tx, clusterId, nil) if err != nil { return nil, err } if policy == nil { continue } policyJSON, err := json.Marshal(policy) if err != nil { return nil, err } pbPolicies = append(pbPolicies, &pb.FindNodeHTTP3PoliciesResponse_HTTP3Policy{ NodeClusterId: clusterId, Http3PolicyJSON: policyJSON, }) } return &pb.FindNodeHTTP3PoliciesResponse{ Http3Policies: pbPolicies, }, nil } // FindNodeHTTPPagesPolicies 查找节点的自定义页面策略 func (this *NodeService) FindNodeHTTPPagesPolicies(ctx context.Context, req *pb.FindNodeHTTPPagesPoliciesRequest) (*pb.FindNodeHTTPPagesPoliciesResponse, error) { nodeId, err := this.ValidateNode(ctx) if err != nil { return nil, err } var tx = this.NullTx() clusterIds, err := models.SharedNodeDAO.FindEnabledAndOnNodeClusterIds(tx, nodeId) if err != nil { return nil, err } var pbPolicies = []*pb.FindNodeHTTPPagesPoliciesResponse_HTTPPagesPolicy{} for _, clusterId := range clusterIds { policy, err := models.SharedNodeClusterDAO.FindClusterHTTPPagesPolicy(tx, clusterId, nil) if err != nil { return nil, err } if policy == nil { continue } policyJSON, err := json.Marshal(policy) if err != nil { return nil, err } pbPolicies = append(pbPolicies, &pb.FindNodeHTTPPagesPoliciesResponse_HTTPPagesPolicy{ NodeClusterId: clusterId, HttpPagesPolicyJSON: policyJSON, }) } return &pb.FindNodeHTTPPagesPoliciesResponse{ HttpPagesPolicies: pbPolicies, }, nil } // FindNodeScheduleInfo 查找节点调度信息 func (this *NodeService) FindNodeScheduleInfo(ctx context.Context, req *pb.FindNodeScheduleInfoRequest) (*pb.FindNodeScheduleInfoResponse, error) { _, err := this.ValidateAdmin(ctx) if err != nil { return nil, err } var tx = this.NullTx() node, err := models.SharedNodeDAO.FindNodeSchedule(tx, req.NodeId) if err != nil { return nil, err } if node == nil { return &pb.FindNodeScheduleInfoResponse{ ScheduleInfo: nil, }, nil } return &pb.FindNodeScheduleInfoResponse{ ScheduleInfo: &pb.FindNodeScheduleInfoResponse_ScheduleInfo{ OfflineDay: node.OfflineDay, IsBackupForCluster: node.IsBackupForCluster, IsBackupForGroup: node.IsBackupForGroup, BackupIPs: node.DecodeBackupIPs(), ActionStatusJSON: node.ActionStatus, }, }, nil } // UpdateNodeScheduleInfo 修改节点调度信息 func (this *NodeService) UpdateNodeScheduleInfo(ctx context.Context, req *pb.UpdateNodeScheduleInfoRequest) (*pb.RPCSuccess, error) { _, err := this.ValidateAdmin(ctx) if err != nil { return nil, err } // 下线日期 if len(req.OfflineDay) > 0 && !regexputils.YYYYMMDD.MatchString(req.OfflineDay) { return nil, errors.New("invalid 'offlineDay': " + req.OfflineDay) } var tx = this.NullTx() err = models.SharedNodeDAO.UpdateNodeSchedule(tx, req.NodeId, req.OfflineDay, req.IsBackupForCluster, req.IsBackupForGroup, req.BackupIPs) if err != nil { return nil, err } return this.Success() } // ResetNodeActionStatus 重置节点动作状态 func (this *NodeService) ResetNodeActionStatus(ctx context.Context, req *pb.ResetNodeActionStatusRequest) (*pb.RPCSuccess, error) { _, err := this.ValidateAdmin(ctx) if err != nil { return nil, err } var tx = this.NullTx() err = models.SharedNodeDAO.ResetNodeActionStatus(tx, req.NodeId, false) if err != nil { return nil, err } return this.Success() } // FindAllNodeScheduleInfoWithNodeClusterId 查找集群的节点调度信息 func (this *NodeService) FindAllNodeScheduleInfoWithNodeClusterId(ctx context.Context, req *pb.FindAllNodeScheduleInfoWithNodeClusterIdRequest) (*pb.FindAllNodeScheduleInfoWithNodeClusterIdResponse, error) { _, err := this.ValidateAdmin(ctx) if err != nil { return nil, err } var tx = this.NullTx() nodes, err := models.SharedNodeDAO.FindAllNodeScheduleWithClusterId(tx, req.NodeClusterId) if err != nil { return nil, err } var pbScheduleList = []*pb.FindAllNodeScheduleInfoWithNodeClusterIdResponse_ScheduleInfo{} for _, node := range nodes { // 分组 var groupName = "" if node.GroupId > 0 { groupName, err = models.SharedNodeGroupDAO.FindNodeGroupName(tx, int64(node.GroupId)) if err != nil { return nil, err } } pbScheduleList = append(pbScheduleList, &pb.FindAllNodeScheduleInfoWithNodeClusterIdResponse_ScheduleInfo{ NodeId: int64(node.Id), NodeName: node.Name, NodeGroupId: int64(node.GroupId), NodeGroupName: groupName, OfflineDay: node.OfflineDay, IsBackupForCluster: node.IsBackupForCluster, IsBackupForGroup: node.IsBackupForGroup, BackupIPs: node.DecodeBackupIPs(), ActionStatusJSON: node.ActionStatus, }) } return &pb.FindAllNodeScheduleInfoWithNodeClusterIdResponse{ Nodes: pbScheduleList, }, nil } // CopyNodeActionsToNodeGroup 复制动作设置到分组 func (this *NodeService) CopyNodeActionsToNodeGroup(ctx context.Context, req *pb.CopyNodeActionsToNodeGroupRequest) (*pb.RPCSuccess, error) { _, err := this.ValidateAdmin(ctx) if err != nil { return nil, err } var tx = this.NullTx() err = models.SharedNodeDAO.CopyNodeActionsToGroup(tx, req.NodeId) if err != nil { return nil, err } return this.Success() } // CopyNodeActionsToNodeCluster 复制动作设置到集群 func (this *NodeService) CopyNodeActionsToNodeCluster(ctx context.Context, req *pb.CopyNodeActionsToNodeClusterRequest) (*pb.RPCSuccess, error) { _, err := this.ValidateAdmin(ctx) if err != nil { return nil, err } var tx = this.NullTx() err = models.SharedNodeDAO.CopyNodeActionsToCluster(tx, req.NodeId) if err != nil { return nil, err } return this.Success() } // FindNodeTOAConfig 查找节点的TOA配置 func (this *NodeService) FindNodeTOAConfig(ctx context.Context, req *pb.FindNodeTOAConfigRequest) (*pb.FindNodeTOAConfigResponse, error) { nodeId, err := this.ValidateNode(ctx) if err != nil { return nil, err } var tx = this.NullTx() clusterId, err := models.SharedNodeDAO.FindNodeClusterId(tx, nodeId) if err != nil { return nil, err } if clusterId == 0 { return &pb.FindNodeTOAConfigResponse{ToaJSON: nil}, nil } toaConfig, err := models.SharedNodeClusterDAO.FindClusterTOAConfig(tx, clusterId, nil) if err != nil { return nil, err } if toaConfig == nil { return &pb.FindNodeTOAConfigResponse{ToaJSON: nil}, nil } toaJSON, err := json.Marshal(toaConfig) if err != nil { return nil, err } return &pb.FindNodeTOAConfigResponse{ToaJSON: toaJSON}, nil } // FindNodeNetworkSecurityPolicy 查找节点的网络安全策略 func (this *NodeService) FindNodeNetworkSecurityPolicy(ctx context.Context, req *pb.FindNodeNetworkSecurityPolicyRequest) (*pb.FindNodeNetworkSecurityPolicyResponse, error) { nodeId, err := this.ValidateNode(ctx) if err != nil { return nil, err } var tx = this.NullTx() clusterId, err := models.SharedNodeDAO.FindNodeClusterId(tx, nodeId) if err != nil { return nil, err } if clusterId == 0 { return &pb.FindNodeNetworkSecurityPolicyResponse{NetworkSecurityPolicyJSON: nil}, nil } policy, err := models.SharedNodeClusterDAO.FindClusterNetworkSecurityPolicy(tx, clusterId, nil) if err != nil { return nil, err } policyJSON, err := json.Marshal(policy) if err != nil { return nil, err } return &pb.FindNodeNetworkSecurityPolicyResponse{ NetworkSecurityPolicyJSON: policyJSON, }, nil }