From e07968a1eabcdc9ef68aa39f835fca36b820d0da Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Sat, 4 Aug 2018 18:31:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9Azone-create=E6=97=B6?= =?UTF-8?q?=E5=80=99=E6=B2=A1=E6=9C=89region=E6=97=B6=E5=88=9B=E5=BB=BAzon?= =?UTF-8?q?e=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/climc/shell/zones.go | 4 ++++ pkg/compute/models/zones.go | 27 ++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/cmd/climc/shell/zones.go b/cmd/climc/shell/zones.go index fe541c0170..fe9d66f8e6 100644 --- a/cmd/climc/shell/zones.go +++ b/cmd/climc/shell/zones.go @@ -106,6 +106,7 @@ func init() { NameCN string `help:"Name in Chinese"` Desc string `metavar:"" help:"Description"` Location string `help:"Location"` + Region string `help:"Cloudregion in which zone created"` } R(&ZoneCreateOptions{}, "zone-create", "Create a zone", func(s *mcclient.ClientSession, args *ZoneCreateOptions) error { params := jsonutils.NewDict() @@ -119,6 +120,9 @@ func init() { if len(args.Location) > 0 { params.Add(jsonutils.NewString(args.Location), "location") } + if len(args.Region) > 0 { + params.Add(jsonutils.NewString(args.Region), "region") + } zone, err := modules.Zones.Create(s, params) if err != nil { return err diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index a4680571be..fc9ceea224 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -2,14 +2,15 @@ package models import ( "context" + "database/sql" "fmt" "github.com/yunionio/jsonutils" "github.com/yunionio/log" - "github.com/yunionio/onecloud/pkg/mcclient" "github.com/yunionio/onecloud/pkg/cloudcommon/db" "github.com/yunionio/onecloud/pkg/cloudprovider" "github.com/yunionio/onecloud/pkg/httperrors" + "github.com/yunionio/onecloud/pkg/mcclient" "github.com/yunionio/pkg/tristate" "github.com/yunionio/pkg/util/compare" "github.com/yunionio/sqlchemy" @@ -288,6 +289,10 @@ return ret func zoneExtra(zone *SZone, extra *jsonutils.JSONDict) *jsonutils.JSONDict { usage := zone.GeneralUsage() extra.Update(jsonutils.Marshal(usage)) + region := zone.GetRegion() + if region != nil { + extra.Add(jsonutils.NewString(region.Name), "cloudregion") + } return extra } @@ -607,3 +612,23 @@ func (self *SZone) isUsable() bool { return false } } + +func (manager *SZoneManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerProjId string, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { + regionStr := jsonutils.GetAnyString(query, []string{"region", "region_id", "cloudregion", "cloudregion_id"}) + var regionId string + if len(regionStr) > 0 { + regionObj, err := CloudregionManager.FetchByIdOrName("", regionStr) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError("Region %s not found", regionStr) + } else { + return nil, httperrors.NewInternalServerError("Query region %s fail %s", regionStr, err) + } + } + regionId = regionObj.GetId() + } else { + regionId = "default" + } + data.Add(jsonutils.NewString(regionId), "cloudregion_id") + return manager.SStatusStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerProjId, query, data) +}