diff --git a/pkg/util/openstack/flavor.go b/pkg/util/openstack/flavor.go index 8835499aba..e889f2b0bf 100644 --- a/pkg/util/openstack/flavor.go +++ b/pkg/util/openstack/flavor.go @@ -4,8 +4,8 @@ import ( "fmt" "yunion.io/x/jsonutils" - "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" + "yunion.io/x/pkg/utils" ) type SFlavor struct { @@ -39,17 +39,22 @@ func (region *SRegion) GetFlavor(flavorId string) (*SFlavor, error) { return flavor, resp.Unmarshal(flavor, "flavor") } +func (region *SRegion) SyncFlavor(name string, cpu, memoryMb, diskGB int) (string, error) { + return region.syncFlavor(name, cpu, memoryMb, diskGB) +} + func (region *SRegion) syncFlavor(name string, cpu, memoryMb, diskGB int) (string, error) { flavors, err := region.GetFlavors() if err != nil { return "", err } - if len(name) > 0 { - for _, flavor := range flavors { - if flavor.GetName() == name { - return flavor.ID, nil - } + flavorNames := []string{} + for _, flavor := range flavors { + flavorName := flavor.GetName() + if len(name) > 0 && flavorName == name { + return flavor.ID, nil } + flavorNames = append(flavorNames, flavorName) } if cpu == 0 && memoryMb == 0 { @@ -79,11 +84,10 @@ func (region *SRegion) syncFlavor(name string, cpu, memoryMb, diskGB int) (strin } } for i := 0; i < 10; i++ { - if _, err := region.GetFlavor(fmt.Sprintf("m%d.%s", i, suffix)); err != nil { - if err == cloudprovider.ErrNotFound { - name = fmt.Sprintf("m%d.%s", i, suffix) - break - } + flavorName := fmt.Sprintf("m%d.%s", i, suffix) + if !utils.IsInStringArray(flavorName, flavorNames) { + name = flavorName + break } } if len(name) == 0 { diff --git a/pkg/util/openstack/shell/flavor.go b/pkg/util/openstack/shell/flavor.go index dc83807c5f..15e0da2da1 100644 --- a/pkg/util/openstack/shell/flavor.go +++ b/pkg/util/openstack/shell/flavor.go @@ -1,6 +1,8 @@ package shell import ( + "fmt" + "yunion.io/x/onecloud/pkg/util/openstack" "yunion.io/x/onecloud/pkg/util/shellutils" ) @@ -50,4 +52,13 @@ func init() { return nil }) + shellutils.R(&FlavorCreateOptions{}, "flavor-sync", "Sync flavor", func(cli *openstack.SRegion, args *FlavorCreateOptions) error { + flavorId, err := cli.SyncFlavor(args.NAME, args.CPU, args.MEMORY_MB, args.DISK) + if err != nil { + return err + } + fmt.Println(flavorId) + return nil + }) + }