fix: 完善多云同步验证与实例统计
- 修复华为云签名、账单字段与区域映射缓存 - 按真实云实例更新账号服务器数并补充并发测试
This commit is contained in:
1 parent
132fe9ba97
commit
9b895efee3
6 files changed
+226
-64
No files matched your search
@@ -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: "导入完成",
|
||||
|
||||
Reference in new issue
Block a user