From 3354b4eee55983c6d68e7823aaecc582eb19011c Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Tue, 25 Dec 2018 20:55:34 +0800 Subject: [PATCH] =?UTF-8?q?cloud-region=E5=92=8Czone=E5=A2=9E=E5=8A=A0usab?= =?UTF-8?q?le-vpc=3Dtrue=E7=9A=84=E8=BF=87=E6=BB=A4=E5=99=A8=EF=BC=8C?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=87=BA=E6=9C=89Avaiable=20VPC=E7=9A=84clou?= =?UTF-8?q?dregion=E5=92=8Czone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/climc/shell/cloudregions.go | 7 ++++--- cmd/climc/shell/zones.go | 30 ++++++++--------------------- pkg/compute/models/cloudregions.go | 29 +++++++++++++++++++++------- pkg/compute/models/zones.go | 31 +++++++++++++++++++++++------- 4 files changed, 58 insertions(+), 39 deletions(-) diff --git a/cmd/climc/shell/cloudregions.go b/cmd/climc/shell/cloudregions.go index 221c5b470b..486a71670a 100644 --- a/cmd/climc/shell/cloudregions.go +++ b/cmd/climc/shell/cloudregions.go @@ -11,9 +11,10 @@ import ( func init() { type CloudregionListOptions struct { options.BaseListOptions - Private *bool `help:"show private cloud regions only" json:"is_private"` - Public *bool `help:"show public cloud regions only" json:"is_public"` - Usable *bool `help:"List regions that are usable"` + Private *bool `help:"show private cloud regions only" json:"is_private"` + Public *bool `help:"show public cloud regions only" json:"is_public"` + Usable *bool `help:"List regions where networks are usable"` + UsableVpc *bool `help:"List regions where VPC are usable"` } R(&CloudregionListOptions{}, "cloud-region-list", "List cloud regions", func(s *mcclient.ClientSession, opts *CloudregionListOptions) error { params, err := options.ListStructToParams(opts) diff --git a/cmd/climc/shell/zones.go b/cmd/climc/shell/zones.go index 2ac7c8dd69..7430f05eab 100644 --- a/cmd/climc/shell/zones.go +++ b/cmd/climc/shell/zones.go @@ -10,31 +10,17 @@ import ( func init() { type ZoneListOptions struct { options.BaseListOptions - Region string `help:"cloud region ID or Name"` - Usable bool `help:"List all zones that is usable"` - Private bool `help:"show all zones in private cloud regions only"` - Public bool `help:"show all zones in public cloud regions only"` + Region string `help:"cloud region ID or Name" json:"-"` + Usable *bool `help:"List all zones where networks are usable"` + UsableVpc *bool `help:"List all zones where vpc are usable"` + Private *bool `help:"show all zones in private cloud regions only"` + Public *bool `help:"show all zones in public cloud regions only"` } R(&ZoneListOptions{}, "zone-list", "List zones", func(s *mcclient.ClientSession, args *ZoneListOptions) error { - var params *jsonutils.JSONDict - { - var err error - params, err = args.BaseListOptions.Params() - if err != nil { - return err - - } + params, err := options.ListStructToParams(args) + if err != nil { + return err } - if args.Usable { - params.Add(jsonutils.JSONTrue, "usable") - } - if args.Private { - params.Add(jsonutils.JSONTrue, "is_private") - } - if args.Public { - params.Add(jsonutils.JSONTrue, "is_public") - } - var err error var result *modules.ListResult if len(args.Region) > 0 { result, err = modules.Zones.ListInContext(s, params, &modules.Cloudregions, args.Region) diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index bac4d52357..afaee4ec03 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -351,25 +351,40 @@ func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlch q = q.Equals("provider", manager.Provider) } - if jsonutils.QueryBoolean(query, "usable", false) { + if jsonutils.QueryBoolean(query, "usable", false) || jsonutils.QueryBoolean(query, "usable_vpc", false) { providers := CloudproviderManager.Query().SubQuery() networks := NetworkManager.Query().SubQuery() wires := WireManager.Query().SubQuery() vpcs := VpcManager.Query().SubQuery() + usableNet := jsonutils.QueryBoolean(query, "usable", false) + usableVpc := jsonutils.QueryBoolean(query, "usable_vpc", false) + sq := vpcs.Query(sqlchemy.DISTINCT("cloudregion_id", vpcs.Field("cloudregion_id"))) - sq = sq.Join(wires, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) - sq = sq.Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))) + if usableNet { + sq = sq.Join(wires, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) + sq = sq.Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))) + } sq = sq.Join(providers, sqlchemy.Equals(vpcs.Field("manager_id"), providers.Field("id"))) - sq = sq.Filter(sqlchemy.Equals(networks.Field("status"), NETWORK_STATUS_AVAILABLE)) + if usableNet { + sq = sq.Filter(sqlchemy.Equals(networks.Field("status"), NETWORK_STATUS_AVAILABLE)) + } sq = sq.Filter(sqlchemy.IsTrue(providers.Field("enabled"))) sq = sq.Filter(sqlchemy.In(providers.Field("status"), CLOUD_PROVIDER_VALID_STATUS)) + if usableVpc { + sq = sq.Filter(sqlchemy.Equals(vpcs.Field("status"), VPC_STATUS_AVAILABLE)) + } sq2 := vpcs.Query(sqlchemy.DISTINCT("cloudregion_id", vpcs.Field("cloudregion_id"))) - sq2 = sq2.Join(wires, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) - sq2 = sq2.Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))) - sq2 = sq2.Filter(sqlchemy.Equals(networks.Field("status"), NETWORK_STATUS_AVAILABLE)) + if usableNet { + sq2 = sq2.Join(wires, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) + sq2 = sq2.Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))) + sq2 = sq2.Filter(sqlchemy.Equals(networks.Field("status"), NETWORK_STATUS_AVAILABLE)) + } sq2 = sq2.Filter(sqlchemy.IsNullOrEmpty(vpcs.Field("manager_id"))) + if usableVpc { + sq2 = sq2.Filter(sqlchemy.Equals(vpcs.Field("status"), VPC_STATUS_AVAILABLE)) + } q = q.Filter(sqlchemy.OR( sqlchemy.In(q.Field("id"), sq.SubQuery()), diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index 30d33ca8a2..03deb56450 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -476,34 +476,51 @@ func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu return nil, err } - if jsonutils.QueryBoolean(query, "is_private", false) { + if jsonutils.QueryBoolean(query, "is_private", false) || jsonutils.QueryBoolean(query, "private", false) { q = q.Filter(sqlchemy.OR(sqlchemy.IsNull(q.Field("external_id")), sqlchemy.IsEmpty(q.Field("external_id")))) } - if jsonutils.QueryBoolean(query, "is_public", false) { + if jsonutils.QueryBoolean(query, "is_public", false) || jsonutils.QueryBoolean(query, "public", false) { q = q.Filter(sqlchemy.AND(sqlchemy.IsNotNull(q.Field("external_id")), sqlchemy.IsNotEmpty(q.Field("external_id")))) } - if jsonutils.QueryBoolean(query, "usable", false) { + if jsonutils.QueryBoolean(query, "usable", false) || jsonutils.QueryBoolean(query, "usable_vpc", false) { networks := NetworkManager.Query().SubQuery() wires := WireManager.Query().SubQuery() vpcs := VpcManager.Query().SubQuery() providers := CloudproviderManager.Query().SubQuery() + usableNet := jsonutils.QueryBoolean(query, "usable", false) + usableVpc := jsonutils.QueryBoolean(query, "usable_vpc", false) + sq := wires.Query(sqlchemy.DISTINCT("zone_id", wires.Field("zone_id"))) - sq = sq.Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))) + if usableNet { + sq = sq.Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))) + } sq = sq.Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))) sq = sq.Join(providers, sqlchemy.Equals(vpcs.Field("manager_id"), providers.Field("id"))) - sq = sq.Filter(sqlchemy.Equals(networks.Field("status"), NETWORK_STATUS_AVAILABLE)) + if usableNet { + sq = sq.Filter(sqlchemy.Equals(networks.Field("status"), NETWORK_STATUS_AVAILABLE)) + } sq = sq.Filter(sqlchemy.IsTrue(providers.Field("enabled"))) sq = sq.Filter(sqlchemy.In(providers.Field("status"), CLOUD_PROVIDER_VALID_STATUS)) + if usableVpc { + sq = sq.Filter(sqlchemy.Equals(vpcs.Field("status"), VPC_STATUS_AVAILABLE)) + } sq2 := wires.Query(sqlchemy.DISTINCT("zone_id", wires.Field("zone_id"))) - sq2 = sq2.Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))) + if usableNet { + sq2 = sq2.Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))) + } sq2 = sq2.Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))) - sq2 = sq2.Filter(sqlchemy.Equals(networks.Field("status"), NETWORK_STATUS_AVAILABLE)) + if usableNet { + sq2 = sq2.Filter(sqlchemy.Equals(networks.Field("status"), NETWORK_STATUS_AVAILABLE)) + } sq2 = sq2.Filter(sqlchemy.IsNullOrEmpty(vpcs.Field("manager_id"))) + if usableVpc { + sq2 = sq2.Filter(sqlchemy.Equals(vpcs.Field("status"), VPC_STATUS_AVAILABLE)) + } q = q.Filter(sqlchemy.OR( sqlchemy.In(q.Field("id"), sq.SubQuery()),