fix: 完善多云同步验证与实例统计

- 修复华为云签名、账单字段与区域映射缓存
- 按真实云实例更新账号服务器数并补充并发测试
This commit is contained in:
Logan.Li committed 2026-07-29 06:35:54 +08:00
1 parent 132fe9ba97
commit 9b895efee3
6 files changed
+226 -64

No files matched your search

+44 -10
View File
@@ -3,6 +3,7 @@ package controller
import (
"net/http"
"strconv"
"sync"
"time"
"ezops/cloud"
@@ -73,22 +74,60 @@ func (h *CloudSyncHandler) SyncRegions(c *gin.Context) {
}
}
// 更新账号的 region_count 和 last_sync_at
h.db.Model(&account).Updates(map[string]interface{}{
// 并发统计所有可用区域实例数,卡片展示云账号真实资源量。 // Logan.Li
serverCount, countedRegions := countCloudInstances(provider, cloudRegions)
updates := map[string]interface{}{
"region_count": len(cloudRegions),
"last_sync_at": time.Now(),
})
}
if countedRegions > 0 {
updates["server_count"] = serverCount
}
// 更新账号区域、实例数量和同步时间。 // Logan.Li
h.db.Model(&account).Updates(updates)
c.JSON(http.StatusOK, model.Response{
Code: 200,
Message: "同步成功",
Data: gin.H{
"synced": synced,
"total": len(cloudRegions),
"synced": synced,
"total": len(cloudRegions),
"server_count": serverCount,
},
})
}
// countCloudInstances 以固定并发统计各区域实例数量,避免串行请求过慢。 // Logan.Li
func countCloudInstances(provider cloud.Provider, regions []cloud.CloudRegion) (total int, succeeded int) {
type countResult struct {
count int
ok bool
}
results := make(chan countResult, len(regions))
semaphore := make(chan struct{}, 4)
var waitGroup sync.WaitGroup
for _, region := range regions {
regionID := region.RegionID
waitGroup.Add(1)
go func() {
defer waitGroup.Done()
semaphore <- struct{}{}
defer func() { <-semaphore }()
instances, err := provider.ListInstances(regionID)
results <- countResult{count: len(instances), ok: err == nil}
}()
}
waitGroup.Wait()
close(results)
for result := range results {
if result.ok {
total += result.count
succeeded++
}
}
return total, succeeded
}
// GetAccountRegions 获取指定云账号的区域列表(按 provider 过滤)
// GET /cloud-accounts/:id/regions
func (h *CloudSyncHandler) GetAccountRegions(c *gin.Context) {
@@ -308,11 +347,6 @@ func (h *CloudSyncHandler) ImportInstances(c *gin.Context) {
}
}
// 保存该账号当前已关联的资产总数,而不是本次新增数。 // Logan.Li
var serverCount int64
h.db.Model(&model.Server{}).Where("cloud_account_id = ?", account.ID).Count(&serverCount)
h.db.Model(&account).UpdateColumn("server_count", serverCount)
c.JSON(http.StatusOK, model.Response{
Code: 200,
Message: "导入完成",