From 888c8c20038f340f436ba87a141d5173c8e119cf Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Fri, 26 Mar 2021 16:44:13 +0800 Subject: [PATCH] fix: sku zone --- pkg/compute/models/dbinstance_skus.go | 80 +++++++++++++++++---------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/pkg/compute/models/dbinstance_skus.go b/pkg/compute/models/dbinstance_skus.go index 35952345b8..174c9fbfa7 100644 --- a/pkg/compute/models/dbinstance_skus.go +++ b/pkg/compute/models/dbinstance_skus.go @@ -298,6 +298,11 @@ func (manager *SDBInstanceSkuManager) GetPropertyInstanceSpecs(ctx context.Conte return nil, errors.Wrap(err, "manager.ListItemFilter") } + q2, err := manager.ListItemFilter(ctx, manager.Query(), userCred, listQuery) + if err != nil { + return nil, errors.Wrap(err, "manager.ListItemFilter") + } + input := &SDBInstanceSku{} query.Unmarshal(input) for k, v := range map[string]interface{}{ @@ -317,15 +322,30 @@ func (manager *SDBInstanceSkuManager) GetPropertyInstanceSpecs(ctx context.Conte value := v.(string) if len(value) > 0 { q = q.Equals(k, v) + q2 = q2.Equals(k, v) } case int, int64: value := fmt.Sprintf("%d", v) if value != "0" { q = q.Equals(k, v) + q2 = q2.Equals(k, v) } } } + sq := q2.SubQuery() + q2 = sq.Query(sq.Field("zone1"), sq.Field("zone2"), sq.Field("zone3")).Distinct() + + skuZones := []struct { + Zone1 string + Zone2 string + Zone3 string + }{} + err = q2.All(&skuZones) + if err != nil { + return nil, errors.Wrapf(err, "query sku zones") + } + skus := []SDBInstanceSku{} q = q.GroupBy(q.Field("vcpu_count"), q.Field("vmem_size_mb")) q = q.Asc(q.Field("vcpu_count"), q.Field("vmem_size_mb")) @@ -360,23 +380,7 @@ func (manager *SDBInstanceSkuManager) GetPropertyInstanceSpecs(ctx context.Conte result.Zones.Zone1 = map[string]string{} result.Zones.Zone2 = map[string]string{} result.Zones.Zone3 = map[string]string{} - for _, sku := range skus { - if _, ok := result.cpuMemsMb[sku.VcpuCount]; !ok { - result.cpuMemsMb[sku.VcpuCount] = map[int]bool{} - result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)] = []int{} - result.Cpus = append(result.Cpus, sku.VcpuCount) - } - - if _, ok := result.cpuMemsMb[sku.VcpuCount][sku.VmemSizeMb]; !ok { - result.cpuMemsMb[sku.VcpuCount][sku.VmemSizeMb] = true - result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)] = append(result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)], sku.VmemSizeMb) - } - - if _, ok := result.memsMb[sku.VmemSizeMb]; !ok { - result.memsMb[sku.VmemSizeMb] = true - result.MemsMb = append(result.MemsMb, sku.VmemSizeMb) - } - + for _, sku := range skuZones { if _, ok := result.Zones.Zone1[sku.Zone1]; !ok && len(sku.Zone1) > 0 { result.Zones.Zone1[sku.Zone1] = sku.Zone1 } @@ -403,20 +407,36 @@ func (manager *SDBInstanceSkuManager) GetPropertyInstanceSpecs(ctx context.Conte result.Zones.Zones[zoneId] = zoneId } } - - zq := ZoneManager.Query("id", "name").In("id", result.zones) - rows, err := zq.Rows() - if err != nil { - return nil, err - } - defer rows.Close() - for rows.Next() { - id, name := "", "" - err = rows.Scan(&id, &name) - if err != nil { - return nil, errors.Wrap(err, "rows.Scan") + for _, sku := range skus { + if _, ok := result.cpuMemsMb[sku.VcpuCount]; !ok { + result.cpuMemsMb[sku.VcpuCount] = map[int]bool{} + result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)] = []int{} + result.Cpus = append(result.Cpus, sku.VcpuCount) } - result.zoneNames[id] = name + + if _, ok := result.cpuMemsMb[sku.VcpuCount][sku.VmemSizeMb]; !ok { + result.cpuMemsMb[sku.VcpuCount][sku.VmemSizeMb] = true + result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)] = append(result.CpuMemsMb[fmt.Sprintf("%d", sku.VcpuCount)], sku.VmemSizeMb) + } + + if _, ok := result.memsMb[sku.VmemSizeMb]; !ok { + result.memsMb[sku.VmemSizeMb] = true + result.MemsMb = append(result.MemsMb, sku.VmemSizeMb) + } + + } + + zones := []struct { + Id string + Name string + }{} + + err = ZoneManager.Query("id", "name").In("id", result.zones).All(&zones) + if err != nil { + return nil, errors.Wrapf(err, "query zones") + } + for _, zone := range zones { + result.zoneNames[zone.Id] = zone.Name } for _, zoneId := range result.Zones.Zone1 {