feat: sync httpdns sdk/platform updates without large binaries
This commit is contained in:
@@ -187,6 +187,100 @@ func (q *HTTPDNSNodeQueue) InstallNode(nodeId int64, installStatus *models.NodeI
|
||||
return installer.Install(installDir, params, installStatus)
|
||||
}
|
||||
|
||||
// StartNode 启动HTTPDNS节点
|
||||
func (q *HTTPDNSNodeQueue) StartNode(nodeId int64) error {
|
||||
node, err := models.SharedHTTPDNSNodeDAO.FindEnabledNode(nil, nodeId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if node == nil {
|
||||
return errors.New("can not find node, ID '" + numberutils.FormatInt64(nodeId) + "'")
|
||||
}
|
||||
|
||||
// 登录信息
|
||||
login, err := models.SharedNodeLoginDAO.FindEnabledNodeLoginWithNodeId(nil, nodeconfigs.NodeRoleHTTPDNS, nodeId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if login == nil {
|
||||
return newGrantError("can not find node login information")
|
||||
}
|
||||
loginParams, err := login.DecodeSSHParams()
|
||||
if err != nil {
|
||||
return newGrantError(err.Error())
|
||||
}
|
||||
if len(strings.TrimSpace(loginParams.Host)) == 0 {
|
||||
return newGrantError("ssh host should not be empty")
|
||||
}
|
||||
if loginParams.Port <= 0 {
|
||||
loginParams.Port = 22
|
||||
}
|
||||
if loginParams.GrantId <= 0 {
|
||||
return newGrantError("can not find node grant")
|
||||
}
|
||||
|
||||
grant, err := models.SharedNodeGrantDAO.FindEnabledNodeGrant(nil, loginParams.GrantId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if grant == nil {
|
||||
return newGrantError("can not find user grant with id '" + numberutils.FormatInt64(loginParams.GrantId) + "'")
|
||||
}
|
||||
|
||||
installer := &HTTPDNSNodeInstaller{}
|
||||
err = installer.Login(&Credentials{
|
||||
Host: strings.TrimSpace(loginParams.Host),
|
||||
Port: loginParams.Port,
|
||||
Username: grant.Username,
|
||||
Password: grant.Password,
|
||||
PrivateKey: grant.PrivateKey,
|
||||
Passphrase: grant.Passphrase,
|
||||
Method: grant.Method,
|
||||
Sudo: grant.Su == 1,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
_ = installer.Close()
|
||||
}()
|
||||
|
||||
installDir := strings.TrimSpace(node.InstallDir)
|
||||
if len(installDir) == 0 {
|
||||
cluster, err := models.SharedHTTPDNSClusterDAO.FindEnabledCluster(nil, int64(node.ClusterId))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if cluster == nil {
|
||||
return errors.New("can not find cluster, ID '" + numberutils.FormatInt64(int64(node.ClusterId)) + "'")
|
||||
}
|
||||
installDir = strings.TrimSpace(cluster.InstallDir)
|
||||
if len(installDir) == 0 {
|
||||
installDir = installer.client.UserHome() + "/edge-httpdns"
|
||||
}
|
||||
}
|
||||
_, appDir := resolveHTTPDNSInstallPaths(installDir)
|
||||
exeFile := appDir + "/bin/edge-httpdns"
|
||||
|
||||
_, err = installer.client.Stat(exeFile)
|
||||
if err != nil {
|
||||
return errors.New("httpdns node is not installed correctly, can not find executable file: " + exeFile)
|
||||
}
|
||||
|
||||
// 先尝试 systemd 拉起
|
||||
_, _, _ = installer.client.Exec("/usr/bin/systemctl start edge-httpdns")
|
||||
|
||||
_, stderr, err := installer.client.Exec(exeFile + " start")
|
||||
if err != nil {
|
||||
return fmt.Errorf("start failed: %w", err)
|
||||
}
|
||||
if len(strings.TrimSpace(stderr)) > 0 {
|
||||
return errors.New("start failed: " + strings.TrimSpace(stderr))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (q *HTTPDNSNodeQueue) resolveClusterTLSCertPair(cluster *models.HTTPDNSCluster) ([]byte, []byte, error) {
|
||||
if cluster == nil {
|
||||
return nil, nil, errors.New("cluster not found")
|
||||
|
||||
25
EdgeAPI/internal/installers/upgrade_queue.go
Normal file
25
EdgeAPI/internal/installers/upgrade_queue.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package installers
|
||||
|
||||
// UpgradeQueue 升级队列,控制并发数
|
||||
type UpgradeQueue struct {
|
||||
sem chan struct{}
|
||||
}
|
||||
|
||||
// SharedUpgradeQueue 全局升级队列,最多5个并发
|
||||
var SharedUpgradeQueue = NewUpgradeQueue(5)
|
||||
|
||||
// NewUpgradeQueue 创建升级队列
|
||||
func NewUpgradeQueue(maxConcurrent int) *UpgradeQueue {
|
||||
return &UpgradeQueue{
|
||||
sem: make(chan struct{}, maxConcurrent),
|
||||
}
|
||||
}
|
||||
|
||||
// SubmitNodeUpgrade 提交节点升级任务(异步执行,超过并发限制自动排队)
|
||||
func (q *UpgradeQueue) SubmitNodeUpgrade(nodeId int64, upgradeFunc func(int64) error) {
|
||||
go func() {
|
||||
q.sem <- struct{}{}
|
||||
defer func() { <-q.sem }()
|
||||
_ = upgradeFunc(nodeId)
|
||||
}()
|
||||
}
|
||||
Reference in New Issue
Block a user