From 14c1ddaccba92ebf9fa07bf2bdf1c6617c03b4b6 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 8 Jan 2020 14:49:48 +0800 Subject: [PATCH 1/9] feature: cloudprovider capability filter and listinput recode --- cmd/climc/shell/cloudaccounts.go | 4 + cmd/climc/shell/cloudproviders.go | 9 +- pkg/apis/cloudevent/cloudevent.go | 9 +- pkg/apis/compute/bucket.go | 6 + pkg/apis/compute/cloudaccount.go | 8 + pkg/apis/compute/cloudprovider.go | 121 +++++++++++++-- pkg/apis/compute/dbinstance.go | 48 ++++++ pkg/apis/compute/disk.go | 46 ++++++ pkg/apis/compute/elasticcache_const.go | 13 ++ pkg/apis/compute/elasticips_const.go | 17 +++ pkg/apis/compute/geo_input.go | 138 +++++++++++++++++ pkg/apis/compute/guests.go | 47 ++++-- pkg/apis/compute/host.go | 26 ++++ pkg/apis/compute/input.go | 52 +++++++ pkg/apis/compute/instance_group.go | 5 +- pkg/apis/compute/isolated_device_const.go | 18 +++ pkg/apis/compute/loadbalancer.go | 80 ++++++++++ pkg/apis/compute/natgateway.go | 34 +++++ pkg/apis/compute/network.go | 88 ++++++++--- pkg/apis/compute/reservedip.go | 13 ++ pkg/apis/compute/schedtag.go | 40 +++++ pkg/apis/compute/secgroup.go | 27 +++- pkg/apis/compute/sku_const.go | 34 +++++ pkg/apis/compute/snapshot.go | 36 +++++ pkg/apis/compute/storage_const.go | 47 ++++++ pkg/apis/compute/vpcs_const.go | 33 +++++ pkg/apis/compute/zz_generated.model.go | 15 +- pkg/apis/identity/input.go | 139 ++++++++++++++++++ pkg/apis/image/image.go | 28 ++++ pkg/apis/input.go | 86 +++++++++++ pkg/apis/logger/doc.go | 15 ++ pkg/apis/logger/input.go | 30 ++++ pkg/apis/modelbase.go | 33 +++++ pkg/apis/parameters.go | 69 --------- pkg/apis/resourcebase.go | 19 +++ pkg/apis/sharablevirtualresource.go | 8 +- pkg/apis/standaloneresource.go | 31 +++- pkg/apis/virtualresource.go | 14 ++ pkg/cloudcommon/db/enabledstatusstandalone.go | 16 ++ pkg/cloudcommon/db/modelbase.go | 6 +- pkg/cloudcommon/db/resourcebase.go | 8 + pkg/cloudcommon/db/sharablevirtual.go | 8 + pkg/cloudcommon/db/standalone.go | 18 +-- pkg/cloudcommon/db/statusstandalone.go | 12 ++ pkg/cloudcommon/db/virtualresource.go | 8 + pkg/cloudevent/models/cloudevents.go | 20 ++- pkg/cloudnet/models/ifaces.go | 10 +- pkg/cloudnet/models/routes.go | 7 +- pkg/cloudnet/models/rules.go | 9 +- pkg/cloudprovider/cloudprovider.go | 40 ----- pkg/cloudprovider/consts.go | 1 + pkg/compute/models/buckets.go | 16 +- pkg/compute/models/cachedimages.go | 70 ++------- pkg/compute/models/capabilities.go | 123 ++-------------- pkg/compute/models/cloudaccounts.go | 105 +++++++++---- pkg/compute/models/cloudprovidercapacities.go | 101 +++++++++++++ pkg/compute/models/cloudproviders.go | 45 +++--- pkg/compute/models/cloudregions.go | 42 +++--- pkg/compute/models/dbinstance_accounts.go | 8 +- pkg/compute/models/dbinstance_backups.go | 24 +-- pkg/compute/models/dbinstance_databases.go | 8 +- pkg/compute/models/dbinstance_parameters.go | 9 +- pkg/compute/models/dbinstance_privileges.go | 9 +- pkg/compute/models/dbinstance_skus.go | 19 ++- pkg/compute/models/dbinstances.go | 29 ++-- pkg/compute/models/disks.go | 113 ++------------ pkg/compute/models/elasticcache_instances.go | 12 +- pkg/compute/models/elasticcache_skus.go | 56 +++---- pkg/compute/models/elasticips.go | 41 ++---- pkg/compute/models/external_projects.go | 14 +- pkg/compute/models/globalvpcs.go | 4 +- pkg/compute/models/groups.go | 8 +- pkg/compute/models/guests.go | 81 +++++----- pkg/compute/models/hosts.go | 80 ++++------ pkg/compute/models/instance_snapshots.go | 34 +++-- pkg/compute/models/isolated_devices.go | 58 ++++---- pkg/compute/models/keypairs.go | 9 +- pkg/compute/models/loadbalanceragents.go | 9 +- .../models/loadbalancerbackendgroups.go | 10 +- pkg/compute/models/loadbalancerbackends.go | 8 +- .../models/loadbalancercertificates.go | 14 +- pkg/compute/models/loadbalancerclusters.go | 9 +- .../models/loadbalancerlistenerrules.go | 8 +- pkg/compute/models/loadbalancerlisteners.go | 21 ++- pkg/compute/models/loadbalancers.go | 28 ++-- pkg/compute/models/managedresource.go | 105 +++---------- pkg/compute/models/natdtable.go | 8 +- pkg/compute/models/natgateways.go | 20 +-- pkg/compute/models/natstable.go | 8 +- pkg/compute/models/networkinterfaces.go | 14 +- pkg/compute/models/networks.go | 84 ++++------- pkg/compute/models/reservedips.go | 12 +- pkg/compute/models/routetables.go | 57 +------ pkg/compute/models/schedtags.go | 6 +- pkg/compute/models/secgroupcache.go | 8 +- pkg/compute/models/secgrouprules.go | 21 ++- pkg/compute/models/secgroups.go | 6 +- pkg/compute/models/skus.go | 54 +++---- pkg/compute/models/snapshotpolicycache.go | 8 +- pkg/compute/models/snapshots.go | 60 ++------ pkg/compute/models/storagecaches.go | 16 +- pkg/compute/models/storages.go | 71 +++------ pkg/compute/models/vpcs.go | 24 +-- pkg/compute/models/wires.go | 87 +++-------- pkg/compute/models/zones.go | 45 +++--- pkg/compute/service/handlers.go | 2 + pkg/hostman/diskutils/disk.go | 14 ++ pkg/image/models/images.go | 11 +- pkg/keystone/models/domains.go | 6 +- pkg/keystone/models/endpoints.go | 9 +- pkg/keystone/models/groups.go | 8 +- pkg/keystone/models/identitybase.go | 22 ++- pkg/keystone/models/projects.go | 8 +- pkg/keystone/models/roles.go | 12 +- pkg/keystone/models/users.go | 10 +- pkg/logger/models/baremetalevents.go | 20 ++- pkg/multicloud/aliyun/aliyun.go | 1 + pkg/multicloud/aws/aws.go | 2 + pkg/multicloud/azure/azure.go | 1 + pkg/multicloud/ctyun/ctyun.go | 2 + pkg/multicloud/esxi/manager.go | 2 + pkg/multicloud/google/google.go | 2 + pkg/multicloud/huawei/huawei.go | 1 + pkg/multicloud/objectstore/objectstore.go | 2 + .../objectstore/provider/provider.go | 8 - pkg/multicloud/openstack/openstack.go | 2 + pkg/multicloud/qcloud/monitor.go | 14 ++ pkg/multicloud/qcloud/qcloud.go | 1 + pkg/multicloud/ucloud/ucloud.go | 2 + pkg/multicloud/zstack/zstack.go | 2 + pkg/notify/template/doc.go | 14 ++ 131 files changed, 2392 insertions(+), 1374 deletions(-) create mode 100644 pkg/apis/compute/geo_input.go create mode 100644 pkg/apis/image/image.go create mode 100644 pkg/apis/logger/doc.go create mode 100644 pkg/apis/logger/input.go delete mode 100644 pkg/apis/parameters.go create mode 100644 pkg/apis/resourcebase.go create mode 100644 pkg/compute/models/cloudprovidercapacities.go diff --git a/cmd/climc/shell/cloudaccounts.go b/cmd/climc/shell/cloudaccounts.go index 5c8ff86a43..567193bd34 100644 --- a/cmd/climc/shell/cloudaccounts.go +++ b/cmd/climc/shell/cloudaccounts.go @@ -30,6 +30,7 @@ func init() { type CloudaccountListOptions struct { options.BaseListOptions + Capability []string `help:"capability filter" choices:"project|compute|network|loadbalancer|objectstore|rds|cache|event"` } R(&CloudaccountListOptions{}, "cloud-account-list", "List cloud accounts", func(s *mcclient.ClientSession, args *CloudaccountListOptions) error { var params *jsonutils.JSONDict @@ -39,6 +40,9 @@ func init() { if err != nil { return err } + if len(args.Capability) > 0 { + params.Add(jsonutils.NewStringArray(args.Capability), "capability") + } } result, err := modules.Cloudaccounts.List(s, params) if err != nil { diff --git a/cmd/climc/shell/cloudproviders.go b/cmd/climc/shell/cloudproviders.go index 0626f8dddf..c8fd8d3ad5 100644 --- a/cmd/climc/shell/cloudproviders.go +++ b/cmd/climc/shell/cloudproviders.go @@ -31,8 +31,9 @@ func init() { Usable bool `help:"Vpc & Network usable"` - HasObjectStorage bool `help:"filter cloudproviders that has object storage"` - NoObjectStorage bool `help:"filter cloudproviders that has no object storage"` + HasObjectStorage bool `help:"filter cloudproviders that has object storage"` + NoObjectStorage bool `help:"filter cloudproviders that has no object storage"` + Capability []string `help:"capability filter" choices:"project|compute|network|loadbalancer|objectstore|rds|cache|event"` } R(&CloudproviderListOptions{}, "cloud-provider-list", "List cloud providers", func(s *mcclient.ClientSession, args *CloudproviderListOptions) error { var params *jsonutils.JSONDict @@ -52,6 +53,10 @@ func init() { } else if args.NoObjectStorage { params.Add(jsonutils.JSONFalse, "has_object_storage") } + + if len(args.Capability) > 0 { + params.Add(jsonutils.NewStringArray(args.Capability), "capability") + } } result, err := modules.Cloudproviders.List(s, params) if err != nil { diff --git a/pkg/apis/cloudevent/cloudevent.go b/pkg/apis/cloudevent/cloudevent.go index 659340744d..e6ed566f4e 100644 --- a/pkg/apis/cloudevent/cloudevent.go +++ b/pkg/apis/cloudevent/cloudevent.go @@ -16,14 +16,11 @@ package cloudevent import ( "yunion.io/x/onecloud/pkg/apis" + "yunion.io/x/onecloud/pkg/apis/compute" ) type CloudeventListInput struct { - apis.BaseListInput + apis.VirtualResourceListInput - apis.SharableVirtualResourceListInput - - Cloudprovider string `json:"cloudprovider"` - - Providers []string `json:"providers"` + compute.ManagedResourceListInput } diff --git a/pkg/apis/compute/bucket.go b/pkg/apis/compute/bucket.go index 1c32afd7d0..b52524ac42 100644 --- a/pkg/apis/compute/bucket.go +++ b/pkg/apis/compute/bucket.go @@ -89,3 +89,9 @@ func (input *BucketMetadataInput) Validate() error { } return nil } + +type BucketListInput struct { + apis.VirtualResourceListInput + + ManagedResourceListInput +} diff --git a/pkg/apis/compute/cloudaccount.go b/pkg/apis/compute/cloudaccount.go index a2d7968724..3f1c9526b1 100644 --- a/pkg/apis/compute/cloudaccount.go +++ b/pkg/apis/compute/cloudaccount.go @@ -98,3 +98,11 @@ func (i CloudaccountShareModeInput) Validate() error { } return nil } + +type CloudaccountListInput struct { + apis.EnabledStatusStandaloneResourceListInput + + ManagedResourceListInput + + CapabilityListInput +} diff --git a/pkg/apis/compute/cloudprovider.go b/pkg/apis/compute/cloudprovider.go index bdbe6305c6..6e65bf5711 100644 --- a/pkg/apis/compute/cloudprovider.go +++ b/pkg/apis/compute/cloudprovider.go @@ -14,6 +14,13 @@ package compute +import ( + "yunion.io/x/pkg/utils" + + "yunion.io/x/onecloud/pkg/apis" + "yunion.io/x/onecloud/pkg/cloudprovider" +) + type CloudproviderDetails struct { Provider string `json:"provider,omitempty"` Brand string `json:"brand,omitempty"` @@ -36,30 +43,35 @@ type CloudproviderDetails struct { CloudEnv string `json:"cloud_env,omitempty"` } -type CloudaccountListInput struct { +type ManagedResourceListInput struct { // List objects belonging to the cloud provider Cloudprovider string `json:"cloudprovider"` - // List objects belonging to the cloud provider - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 Manager string `json:"manager"` - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 ManagerId string `json:"manager_id"` - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 CloudproviderId string `json:"cloudprovider_id"` // List objects belonging to the cloud account Cloudaccount string `json:"cloudaccount"` - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 CloudaccountId string `json:"cloudaccount_id"` - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 Account string `json:"account"` - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 AccountId string `json:"account_id"` @@ -68,27 +80,30 @@ type CloudaccountListInput struct { // List objects belonging to brands Brands []string `json:"brand"` -} -type CloudTypeListInput struct { - // enum: public_cloud,private_cloud,on_premise + // enum: public,private,onpremise CloudEnv string `json:"cloud_env"` - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 PublicCloud bool `json:"public_cloud"` - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 IsPublic bool `json:"is_public"` - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 PrivateCloud bool `json:"private_cloud"` - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 IsPrivate bool `json:"is_private"` - // deprecate:true + // swagger: ignore + // Deprecated // description: this param will be deprecate at 3.0 IsOnPremise bool `json:"is_on_premise"` @@ -96,3 +111,77 @@ type CloudTypeListInput struct { // default: false IsManaged bool `json:"is_managed"` } + +func (input ManagedResourceListInput) CloudaccountStr() string { + if len(input.Cloudaccount) > 0 { + return input.Cloudaccount + } + if len(input.CloudaccountId) > 0 { + return input.CloudaccountId + } + if len(input.Account) > 0 { + return input.Account + } + if len(input.AccountId) > 0 { + return input.AccountId + } + return "" +} + +func (input ManagedResourceListInput) CloudproviderStr() string { + if len(input.Cloudprovider) > 0 { + return input.Cloudprovider + } + if len(input.CloudproviderId) > 0 { + return input.CloudproviderId + } + if len(input.Manager) > 0 { + return input.Manager + } + if len(input.ManagerId) > 0 { + return input.ManagerId + } + return "" +} + +func (input ManagedResourceListInput) CloudEnvStr() string { + if len(input.CloudEnv) > 0 { + return input.CloudEnv + } + if input.PublicCloud || input.IsPublic { + return CLOUD_ENV_PUBLIC_CLOUD + } + if input.PrivateCloud || input.IsPrivate { + return CLOUD_ENV_PRIVATE_CLOUD + } + if input.IsOnPremise { + return CLOUD_ENV_ON_PREMISE + } + return "" +} + +type CapabilityListInput struct { + // filter by cloudprovider capability + Capability []string `json:"capability"` + // swagger: ignore + // Deprecated + // filter by HasObjectStorage + HasObjectStorage *bool `json:"has_object_storage"` +} + +type CloudproviderListInput struct { + apis.EnabledStatusStandaloneResourceListInput + + ManagedResourceListInput + + UsableResourceListInput + + CapabilityListInput +} + +func (input CapabilityListInput) CapabilityList() []string { + if input.HasObjectStorage != nil && *input.HasObjectStorage && !utils.IsInStringArray(cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, input.Capability) { + input.Capability = append(input.Capability, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE) + } + return input.Capability +} diff --git a/pkg/apis/compute/dbinstance.go b/pkg/apis/compute/dbinstance.go index bfe4092a75..456dad61ec 100644 --- a/pkg/apis/compute/dbinstance.go +++ b/pkg/apis/compute/dbinstance.go @@ -161,3 +161,51 @@ type SDBInstanceRecoveryConfigInput struct { DBInstancebackupId string `json:"dbinstancebackup_id"` Databases map[string]string `json:"allowempty"` } + +type DBInstanceListInput struct { + apis.VirtualResourceListInput + + ZonalResourceListInput + ManagedResourceListInput + VpcResourceListInput +} + +type DBInstanceBackupListInput struct { + apis.VirtualResourceListInput + + ManagedResourceListInput + RegionalResourceListInput + + // filter by dbinstance + Dbinstance string `json:"dbinstance"` +} + +type DBInstancePrivilegeListInput struct { + apis.ResourceBaseListInput + + // filter by dbinstanceaccount + Dbinstanceaccount string `json:"dbinstanceaccount"` + // filter by dbinstancedatabase + Dbinstancedatabase string `json:"dbinstancedatabase"` +} + +type DBInstanceParameterListInput struct { + apis.StandaloneResourceListInput + + // filter by dbinstance + Dbinstance string `json:"dbinstance"` +} + +type DBInstanceDatabaseListInput struct { + apis.StatusStandaloneResourceListInput + + // filter by dbinstance + Dbinstance string `json:"dbinstance"` +} + +type DBInstanceAccountListInput struct { + apis.StatusStandaloneResourceListInput + + // filter by dbinstance + Dbinstance string `json:"dbinstance"` +} diff --git a/pkg/apis/compute/disk.go b/pkg/apis/compute/disk.go index 52afc67277..c05b4d2109 100644 --- a/pkg/apis/compute/disk.go +++ b/pkg/apis/compute/disk.go @@ -80,3 +80,49 @@ func (req *ServerCreateInput) ToDiskCreateInput() *DiskCreateInput { input.Domain = req.Domain return &input } + +type DiskListInput struct { + apis.VirtualResourceListInput + + ManagedResourceListInput + BillingResourceListInput + + StorageResourceListInput + StorageShareListInput + + // filter disk by whether it is being used + Unused *bool `json:"unused"` + // filter disks attached to a guest + Guest string `json:"guest"` + // deprecated: true + // filter by disk type + Type string `json:"type"` + // filter by disk type + DiskType string `json:"disk_type"` + // filter disk by snapshotpolicy + Snapshotpolicy string `json:"snapshotpolicy"` + // swagger: ignore + // Deprecated + // filter disk by snapshotpolicy_id + SnapshotpolicyId string `json:"snapshotpolicy_id"` +} + +func (input DiskListInput) DiskTypeStr() string { + if len(input.DiskType) > 0 { + return input.DiskType + } + if len(input.Type) > 0 { + return input.Type + } + return "" +} + +func (input DiskListInput) SnapshotpolicyStr() string { + if len(input.Snapshotpolicy) > 0 { + return input.Snapshotpolicy + } + if len(input.SnapshotpolicyId) > 0 { + return input.SnapshotpolicyId + } + return "" +} diff --git a/pkg/apis/compute/elasticcache_const.go b/pkg/apis/compute/elasticcache_const.go index b4c212e260..57389490ec 100644 --- a/pkg/apis/compute/elasticcache_const.go +++ b/pkg/apis/compute/elasticcache_const.go @@ -14,6 +14,10 @@ package compute +import ( + "yunion.io/x/onecloud/pkg/apis" +) + const ( ELASTIC_CACHE_STATUS_RUNNING = "running" //(正常) ELASTIC_CACHE_STATUS_RESTARTING = "restarting" //(重启中) @@ -102,3 +106,12 @@ const ( ELASTIC_CACHE_ARCH_TYPE_CLUSTER = "cluster" // 集群 ELASTIC_CACHE_ARCH_TYPE_RWSPLIT = "rwsplit" // 读写分离 ) + +type ElasticcacheListInput struct { + apis.VirtualResourceListInput + + ZonalResourceListInput + VpcResourceListInput + + ManagedResourceListInput +} diff --git a/pkg/apis/compute/elasticips_const.go b/pkg/apis/compute/elasticips_const.go index 393665c09c..1f23ee0694 100644 --- a/pkg/apis/compute/elasticips_const.go +++ b/pkg/apis/compute/elasticips_const.go @@ -14,6 +14,10 @@ package compute +import ( + "yunion.io/x/onecloud/pkg/apis" +) + const ( EIP_MODE_INSTANCE_PUBLICIP = "public_ip" EIP_MODE_STANDALONE_EIP = "elastic_ip" @@ -48,3 +52,16 @@ const ( var ( EIP_ASSOCIATE_VALID_TYPES = []string{EIP_ASSOCIATE_TYPE_SERVER, EIP_ASSOCIATE_TYPE_NAT_GATEWAY} ) + +type ElasticipListInput struct { + apis.VirtualResourceListInput + + ManagedResourceListInput + RegionalResourceListInput + UsableResourceListInput + + // filter usable eip for given associate type + UsableEipForAssociateType string `json:"usable_eip_for_associate_type"` + // filter usable eip for given associate id + UsableEipForAssociateId string `json:"usable_eip_for_associate_id"` +} diff --git a/pkg/apis/compute/geo_input.go b/pkg/apis/compute/geo_input.go new file mode 100644 index 0000000000..6b643d8a5f --- /dev/null +++ b/pkg/apis/compute/geo_input.go @@ -0,0 +1,138 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package compute + +import ( + "yunion.io/x/onecloud/pkg/apis" +) + +type RegionalResourceListInput struct { + // filter by city + City string `json:"city"` + + // filter by cloudregion + Cloudregion string `json:"cloudregion"` + // swagger: ignore + // Deprecated + // description: this param will be deprecate at 3.0 + CloudregionId string `json:"cloudregion_id"` + // swagger: ignore + // Deprecated + // description: this param will be deprecate at 3.0 + Region string `json:"region"` + // swagger: ignore + // Deprecated + // description: this param will be deprecate at 3.0 + RegionId string `json:"region_id"` +} + +func (input RegionalResourceListInput) CloudregionStr() string { + if len(input.Cloudregion) > 0 { + return input.Cloudregion + } + if len(input.CloudregionId) > 0 { + return input.CloudregionId + } + if len(input.Region) > 0 { + return input.Region + } + if len(input.RegionId) > 0 { + return input.RegionId + } + return "" +} + +type ZonalResourceListInput struct { + RegionalResourceListInput + + // filter by zone + Zone string `json:"zone"` + // swagger: ignore + // Deprecated + // filter by zone_id + ZoneId string `json:"zone_id"` + // filter by an array of zone + Zones []string `json:"zones"` +} + +func (input ZonalResourceListInput) ZoneStr() string { + if len(input.Zone) > 0 { + return input.Zone + } + if len(input.ZoneId) > 0 { + return input.ZoneId + } + return "" +} + +func (input ZonalResourceListInput) ZoneList() []string { + zoneStr := input.ZoneStr() + if len(zoneStr) > 0 { + input.Zones = append(input.Zones, zoneStr) + } + return input.Zones +} + +type HostResourceListInput struct { + ZonalResourceListInput + + // filter by host + Host string `json:"host"` + // swagger: ignore + // Deprecated + // filter by host_id + HostId string `json:"host_id"` +} + +func (input HostResourceListInput) HostStr() string { + if len(input.Host) > 0 { + return input.Host + } + if len(input.HostId) > 0 { + return input.HostId + } + return "" +} + +type CloudregionListInput struct { + apis.EnabledStatusStandaloneResourceListInput + apis.DomainizedResourceListInput + + ManagedResourceListInput + UsableResourceListInput + + // filter by city + City string `json:"city"` + // filter by vpc usability + UsableVpc *bool `json:"usable_vpc"` + // filter by service??? + Service string `json:"service"` +} + +type ZoneListInput struct { + apis.StatusStandaloneResourceListInput + apis.DomainizedResourceListInput + + ManagedResourceListInput + + RegionalResourceListInput + + UsableResourceListInput + + // filter by vpc usability + UsableVpc *bool `json:"usable_vpc"` + // filter by service + Service string `json:"service"` +} diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index eacc16bf33..feebcf9612 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -19,18 +19,15 @@ import ( ) type ServerListInput struct { - apis.BaseListInput + apis.VirtualResourceListInput + + ManagedResourceListInput + HostResourceListInput + NetworkResourceListInput + BillingResourceListInput - // 过滤可用区底下的资源 - Zone string `json:"zone"` - // 过滤连接此二层网络的资源 - Wire string `json:"wire"` - // 过滤关联此网络的资源 - Network string `json:"network"` // Disk ID or Name Disk string `json:"disk"` - // Host ID or Name - Host string `json:"host"` // Show baremetal servers Baremetal *bool `json:"baremetal"` // Show gpu servers @@ -40,9 +37,7 @@ type ServerListInput struct { // AdminSecgroup ID or Name AdminSecgroup string `json:"admin_security"` // Show server of hypervisor choices:"kvm|esxi|container|baremetal|aliyun|azure|aws|huawei|ucloud|zstack|openstack"` - Hypervisor string `json:"hypervisor"` - // Show servers in cloudregion - Region string `json:"region"` + Hypervisor []string `json:"hypervisor"` // Show Servers with EIP WithEip *bool `json:"with_eip"` // Show Servers without EIP @@ -61,10 +56,34 @@ type ServerListInput struct { WithoutUserMeta *bool `json:"without_user_meta"` // Instance Group ID or Name Group string `json:"group"` + // deprecated: true + // Filter by instance group Id + GroupId string `json:"group_id"` // Resource type choices:"shared|prepaid|dedicated" ResourceType string `json:"resource_type"` - // Billing type choices:"postpaid|prepaid" - BillingType string `json:"billing_type"` + // return backup guests on a host + GetBackupGuestsOnHost *bool `json:"get_backup_guests_on_host"` +} + +func (input ServerListInput) HypervisorList() []string { + ret := make([]string, 0) + if input.Baremetal != nil && *input.Baremetal { + ret = append(ret, HYPERVISOR_BAREMETAL) + } + if len(input.Hypervisor) > 0 { + ret = append(ret, input.Hypervisor...) + } + return ret +} + +func (input ServerListInput) GroupStr() string { + if len(input.Group) > 0 { + return input.Group + } + if len(input.GroupId) > 0 { + return input.GroupId + } + return "" } type ServerRebuildRootInput struct { diff --git a/pkg/apis/compute/host.go b/pkg/apis/compute/host.go index b0644c26ee..1d8d3a5edf 100644 --- a/pkg/apis/compute/host.go +++ b/pkg/apis/compute/host.go @@ -43,3 +43,29 @@ type DiskSpec struct { EndIndex int `json:"end_index"` Count int `json:"count"` } + +type HostListInput struct { + apis.EnabledStatusStandaloneResourceListInput + apis.DomainizedResourceListInput + + ManagedResourceListInput + ZonalResourceListInput + WireResourceListInput + SchedtagResourceListInput + + StorageResourceListInput + UsableResourceListInput + + // filter by ResourceType + ResourceType string `json:"resource_type"` + // filter by mac of any network interface + AnyMac string `json:"any_mac"` + // filter storages not attached to this host + StorageNotAttached *bool `json:"storage_not_attached"` + // filter by Hypervisor + Hypervisor string `json:"hypervisor"` + // filter host that is empty + IsEmpty *bool `json:"is_empty"` + // filter host that is baremetal + Baremetal *bool `json:"baremetal"` +} diff --git a/pkg/apis/compute/input.go b/pkg/apis/compute/input.go index 1cf2248c09..cfa3ed687b 100644 --- a/pkg/apis/compute/input.go +++ b/pkg/apis/compute/input.go @@ -14,6 +14,10 @@ package compute +import ( + "yunion.io/x/onecloud/pkg/apis" +) + type RegionalResourceCreateInput struct { Cloudregion string `json:"cloudregion"` CloudregionId string `json:"cloudregion_id"` @@ -29,3 +33,51 @@ type DeletePreventableCreateInput struct { //default: true DisableDelete *bool `json:"disable_delete"` } + +type KeypairListInput struct { + apis.StandaloneResourceListInput + + apis.UserResourceListInput + + // list in admin mode + Admin *bool `json:"admin"` +} + +type CachedimageListInput struct { + apis.StandaloneResourceListInput + + ManagedResourceListInput + ZonalResourceListInput +} + +type ExternalProjectListInput struct { + apis.StandaloneResourceListInput + + ManagedResourceListInput +} + +type RouteTableListInput struct { + apis.VirtualResourceListInput + + ManagedResourceListInput + RegionalResourceListInput + VpcResourceListInput +} + +type SnapshotPolicyCacheListInput struct { + apis.ResourceBaseListInput + + // filter by snapshotpolicy Id or Name + Snapshotpolicy string `json:"snapshotpolicy"` +} + +type BillingResourceListInput struct { + // filter by billing_type + BillingType string `json:"billing_type"` +} + +type NetworkInterfaceListInput struct { + apis.StatusStandaloneResourceListInput + + ManagedResourceListInput +} diff --git a/pkg/apis/compute/instance_group.go b/pkg/apis/compute/instance_group.go index 18d6d14294..0ea389f4ad 100644 --- a/pkg/apis/compute/instance_group.go +++ b/pkg/apis/compute/instance_group.go @@ -17,14 +17,13 @@ package compute import "yunion.io/x/onecloud/pkg/apis" type InstanceGroupListInput struct { - apis.BaseListInput + apis.VirtualResourceListInput + ZonalResourceListInput // Filter by service type ServiceType string `json:"service_type"` // Filter by parent id ParentId string `json:"parent_id"` - // Filter by zone id - ZoneId string `json:"zone_id"` // Filter by guest id or name Server string `json:"server"` } diff --git a/pkg/apis/compute/isolated_device_const.go b/pkg/apis/compute/isolated_device_const.go index 37efc9433b..ebc7ebf55a 100644 --- a/pkg/apis/compute/isolated_device_const.go +++ b/pkg/apis/compute/isolated_device_const.go @@ -14,6 +14,10 @@ package compute +import ( + "yunion.io/x/onecloud/pkg/apis" +) + const ( DIRECT_PCI_TYPE = "PCI" GPU_HPC_TYPE = "GPU-HPC" // # for compute @@ -38,3 +42,17 @@ var VENDOR_ID_MAP = map[string]string{ "NVIDIA": NVIDIA_VENDOR_ID, "AMD": AMD_VENDOR_ID, } + +type IsolatedDeviceListInput struct { + apis.StandaloneResourceListInput + apis.DomainizedResourceListInput + + HostResourceListInput + + // filter by GPU type + Gpu *bool `json:"gpu"` + // filter by USB type + Usb *bool `json:"usb"` + // filter unused devices + Unused *bool `json:"unused"` +} diff --git a/pkg/apis/compute/loadbalancer.go b/pkg/apis/compute/loadbalancer.go index 972940af29..1515549bfc 100644 --- a/pkg/apis/compute/loadbalancer.go +++ b/pkg/apis/compute/loadbalancer.go @@ -30,3 +30,83 @@ const ( DeployMethodYum = "yum" DeployMethodCopy = "copy" ) + +type LoadbalancerListenerListInput struct { + apis.VirtualResourceListInput + + ManagedResourceListInput + RegionalResourceListInput + + // filter by loadbalancer + Loadbalancer string `json:"loadbalancer"` + // filter by backend_group + BackendGroup string `json:"backend_group"` + // filter by acl + Acl string `json:"acl"` +} + +type LoadbalancerListenerRuleListInput struct { + apis.VirtualResourceListInput + + // filter by listener + Listener string `json:"listener"` + // filter by backend_group + BackendGroup string `json:"backend_group"` +} + +type LoadbalancerListInput struct { + apis.VirtualResourceListInput + + ManagedResourceListInput + ZonalResourceListInput + NetworkResourceListInput + + // filter by cluster + Cluster string `json:"cluster"` +} + +type LoadbalancerAgentListInput struct { + apis.StandaloneResourceListInput + + // filter by loadbalancercluster + Cluster string `json:"cluster"` +} + +type LoadbalancerCertificateListInput struct { + apis.VirtualResourceListInput + + UsableResourceListInput + RegionalResourceListInput + ManagedResourceListInput +} + +type LoadbalancerBackendListInput struct { + apis.VirtualResourceListInput + + ManagedResourceListInput + RegionalResourceListInput + + // filter by backend server + Backend string `json:"backend"` + // filter by backend group + BackendGroup string `json:"backend_group"` +} + +type LoadbalancerBackendGroupListInput struct { + apis.VirtualResourceListInput + + RegionalResourceListInput + ManagedResourceListInput + + // filter by loadbalancer + Loadbalancer string `json:"loadbalancer"` + // filter LoadbalancerBackendGroup with no reference + NoRef *bool `json:"no_ref"` +} + +type LoadbalancerClusterListInput struct { + apis.StandaloneResourceListInput + + ZonalResourceListInput + WireResourceListInput +} diff --git a/pkg/apis/compute/natgateway.go b/pkg/apis/compute/natgateway.go index 1c850e256d..6d42d8b8de 100644 --- a/pkg/apis/compute/natgateway.go +++ b/pkg/apis/compute/natgateway.go @@ -14,6 +14,10 @@ package compute +import ( + "yunion.io/x/onecloud/pkg/apis" +) + const ( NAT_STAUTS_AVAILABLE = "available" //可用 NAT_STATUS_ALLOCATE = "allocate" //创建中 @@ -33,3 +37,33 @@ const ( QCLOUD_NAT_SPEC_MIDDLE = "middle" QCLOUD_NAT_SPEC_LARGE = "large" ) + +type NatGetewayListInput struct { + apis.StandaloneResourceListInput + + VpcResourceListInput + RegionalResourceListInput + ManagedResourceListInput +} + +type NatEntryListInput struct { + apis.StandaloneResourceListInput + + ManagedResourceListInput +} + +type NatDEntryListInput struct { + NatEntryListInput + + // filter by natgateway + Natgateway string `json:"natgateway"` +} + +type NatSEntryListInput struct { + NatEntryListInput + + // filter by natgateway + Natgateway string `json:"natgateway"` + // filter by network + Network string `json:"network"` +} diff --git a/pkg/apis/compute/network.go b/pkg/apis/compute/network.go index 1cb36c7fc3..651840b556 100644 --- a/pkg/apis/compute/network.go +++ b/pkg/apis/compute/network.go @@ -18,33 +18,79 @@ import ( "yunion.io/x/onecloud/pkg/apis" ) -type NetworkListInput struct { - apis.BaseListInput +type VpcResourceListInput struct { + // filter by vpc + // 过滤关联此Vpc的资源 + Vpc string `json:"vpc"` + // swagger: ignore + // Deprecated + // filter by vpc Id + VpcId string `json:"vpc_id"` +} +func (input VpcResourceListInput) VpcStr() string { + if len(input.Vpc) > 0 { + return input.Vpc + } + if len(input.VpcId) > 0 { + return input.VpcId + } + return "" +} + +type WireResourceListInput struct { + VpcResourceListInput + // filter by wire + // 过滤连接此二层网络的资源 + Wire string `json:"wire"` + // swagger: ignore + // Deprecated + // fitler by wire id + WireId string `json:"wire_id"` +} + +func (input WireResourceListInput) WireStr() string { + if len(input.Wire) > 0 { + return input.Wire + } + if len(input.WireId) > 0 { + return input.WireId + } + return "" +} + +type NetworkResourceListInput struct { + WireResourceListInput + + // filter by network + // 过滤关联此网络的资源 + Network string `json:"network"` + // swagger: ignore + // Deprecated + // filter by networkId + NetworkId string `json:"network"` +} + +func (input NetworkResourceListInput) NetworkStr() string { + if len(input.Network) > 0 { + return input.Network + } + if len(input.NetworkId) > 0 { + return input.NetworkId + } + return "" +} + +type NetworkListInput struct { apis.SharableVirtualResourceListInput - CloudaccountListInput - CloudTypeListInput + HostResourceListInput - Zone string `json:"zone"` - Zones []string `json:"zones"` + ManagedResourceListInput - Vpc string `json:"vpc"` + UsableResourceListInput - Cloudregion string `json:"cloudregion"` - // deprecate:true - // description: this param will be deprecate at 3.0 - CloudregionId string `json:"cloudregion_id"` - // deprecate:true - // description: this param will be deprecate at 3.0 - Region string `json:"region"` - // deprecate:true - // description: this param will be deprecate at 3.0 - RegionId string `json:"region_id"` - - Usable bool `json:"usable"` - Host string `json:"host"` - City string `json:"city"` + VpcResourceListInput } type NetworkCreateInput struct { diff --git a/pkg/apis/compute/reservedip.go b/pkg/apis/compute/reservedip.go index babe324d01..9afef54957 100644 --- a/pkg/apis/compute/reservedip.go +++ b/pkg/apis/compute/reservedip.go @@ -14,6 +14,10 @@ package compute +import ( + "yunion.io/x/onecloud/pkg/apis" +) + const ( RESERVEDIP_TABLE = "reservedips_tbl" RESERVEDIP_RESOURCE_TYPE = "reservedip" @@ -23,3 +27,12 @@ const ( RESERVEDIP_STATUS_OFFLINE = "offline" RESERVEDIP_STATUS_UNKNOWN = "unknown" ) + +type ReservedipListInput struct { + apis.ResourceBaseListInput + + NetworkResourceListInput + + // list all reserved ips, including expired ones + All *bool `json:"all"` +} diff --git a/pkg/apis/compute/schedtag.go b/pkg/apis/compute/schedtag.go index a20446a569..508d232f8f 100644 --- a/pkg/apis/compute/schedtag.go +++ b/pkg/apis/compute/schedtag.go @@ -38,3 +38,43 @@ type SchedtagCreateInput struct { // default: hosts ResourceType string `json:"resource_type"` } + +type SchedtagResourceListInput struct { + // filter by schedtag + Schedtag string `json:"schedtag"` + // swagger: ignore + // Deprecated + // filter by schedtag_id + SchedtagId string `json:"schedtag_id"` +} + +func (input SchedtagResourceListInput) SchedtagStr() string { + if len(input.Schedtag) > 0 { + return input.Schedtag + } + if len(input.SchedtagId) > 0 { + return input.SchedtagId + } + return "" +} + +type SchedtagListInput struct { + apis.StandaloneResourceListInput + + // fitler by resource_type + ResourceType string `json:"resource_type"` + // swagger: ignore + // Deprecated + // filter by type, alias for resource_type + Type string `json:"type"` +} + +func (input SchedtagListInput) ResourceTypeStr() string { + if len(input.ResourceType) > 0 { + return input.ResourceType + } + if len(input.Type) > 0 { + return input.Type + } + return "" +} diff --git a/pkg/apis/compute/secgroup.go b/pkg/apis/compute/secgroup.go index b12a8d1ad6..727edafa8d 100644 --- a/pkg/apis/compute/secgroup.go +++ b/pkg/apis/compute/secgroup.go @@ -17,8 +17,7 @@ package compute import ( "fmt" - "github.com/pkg/errors" - + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/regutils" "yunion.io/x/pkg/util/secrules" @@ -130,9 +129,29 @@ type SSecgroupCreateInput struct { Rules []SSecgroupRuleCreateInput `json:"rules"` } -type SSecgroupListFilterInput struct { - apis.BaseListInput +type SecgroupListInput struct { + apis.SharableVirtualResourceListInput Equals string Server string } + +type SecurityGroupCacheListInput struct { + apis.StatusStandaloneResourceListInput + + // filter by security group + Secgroup string `json:"secgroup"` +} + +type SecurityGroupRuleListInput struct { + apis.ResourceBaseListInput + + // filter by Security group + Secgroup string `json:"secgroup"` + // filter by direction + Direction string `json:"direction"` + // filter by action + Action string `json:"action"` + // filter by protocol + Protocol string `json:"protocol"` +} diff --git a/pkg/apis/compute/sku_const.go b/pkg/apis/compute/sku_const.go index 76c468478d..1a3d08fe7d 100644 --- a/pkg/apis/compute/sku_const.go +++ b/pkg/apis/compute/sku_const.go @@ -14,6 +14,11 @@ package compute +import ( + "yunion.io/x/onecloud/pkg/apis" + "yunion.io/x/onecloud/pkg/util/choices" +) + const ( SkuCategoryGeneralPurpose = "general_purpose" // 通用型 SkuCategoryBurstable = "burstable" // 突发性能型 @@ -57,3 +62,32 @@ var SKU_FAMILIES = []string{ SkuCategoryHighStorage, SkuCategoryHighMemory, } + +type ServerSkuListInput struct { + apis.StatusStandaloneResourceListInput + + ManagedResourceListInput + ZonalResourceListInput + + UsableResourceListInput + + // filter sku by memory size in MB + MemorySizeMb int `json:"memory_size_mb"` +} + +type ElasticcacheSkuListInput struct { + apis.StatusStandaloneResourceListInput + + UsableResourceListInput + BillingResourceListInput + ZonalResourceListInput + + // filter sku by memory size in MB + MemorySizeMb int `json:"memory_size_mb"` +} + +type DBInstanceSkuListInput struct { + apis.EnabledStatusStandaloneResourceListInput + + RegionalResourceListInput +} diff --git a/pkg/apis/compute/snapshot.go b/pkg/apis/compute/snapshot.go index d2e08c9dcf..376ac10369 100644 --- a/pkg/apis/compute/snapshot.go +++ b/pkg/apis/compute/snapshot.go @@ -66,3 +66,39 @@ type SSnapshotPolicyCreateInternalInput struct { RepeatWeekdays uint8 TimePoints uint32 } + +type SnapshotListInput struct { + apis.VirtualResourceListInput + + ManagedResourceListInput + StorageShareListInput + + // filter snapshot that is fake deleted + FakeDeleted *bool `json:"fake_deleted"` + // filter by disk type + DiskType string `json:"disk_type"` + // filter instance snapshot + IsInstanceSnapshot *bool `json:"is_instance_snapshot"` +} + + +type InstanceSnapshotListInput struct { + apis.VirtualResourceListInput + + // filter by guest + Guest string `json:"guest"` + // swagger: ignore + // Deprecated + // filter by guest id + GuestId string `json:"guest_id"` +} + +func (input InstanceSnapshotListInput) GuestStr() string { + if len(input.Guest) > 0 { + return input.Guest + } + if len(input.GuestId) > 0 { + return input.GuestId + } + return "" +} diff --git a/pkg/apis/compute/storage_const.go b/pkg/apis/compute/storage_const.go index 100b5106ea..8493f30c91 100644 --- a/pkg/apis/compute/storage_const.go +++ b/pkg/apis/compute/storage_const.go @@ -14,6 +14,10 @@ package compute +import ( + "yunion.io/x/onecloud/pkg/apis" +) + const ( STORAGE_LOCAL = "local" STORAGE_BAREMETAL = "baremetal" @@ -133,3 +137,46 @@ var ( // 目前来说只支持这些 SHARED_STORAGE = []string{STORAGE_NFS, STORAGE_GPFS, STORAGE_RBD} ) + +type StorageResourceListInput struct { + // filter by storage + Storage string `json:"storage"` + // swagger: ignore + // Deprecated + // filter by storage_id + StorageId string `json:"storage_id"` +} + +func (input StorageResourceListInput) StorageStr() string { + if len(input.Storage) > 0 { + return input.Storage + } + if len(input.StorageId) > 0 { + return input.StorageId + } + return "" +} + +type StorageShareListInput struct { + // filter shared storage + Share *bool `json:"share"` + // filter local storage + Local *bool `json:"local"` +} + +type StorageListInput struct { + apis.StandaloneResourceListInput + apis.DomainizedResourceListInput + + ManagedResourceListInput + ZonalResourceListInput + UsableResourceListInput + StorageShareListInput +} + +type StoragecacheListInput struct { + apis.StandaloneResourceListInput + apis.DomainizedResourceListInput + + ManagedResourceListInput +} diff --git a/pkg/apis/compute/vpcs_const.go b/pkg/apis/compute/vpcs_const.go index 690c575ab7..6dadc2aea7 100644 --- a/pkg/apis/compute/vpcs_const.go +++ b/pkg/apis/compute/vpcs_const.go @@ -14,6 +14,10 @@ package compute +import ( + "yunion.io/x/onecloud/pkg/apis" +) + const ( VPC_STATUS_PENDING = "pending" VPC_STATUS_AVAILABLE = "available" @@ -32,3 +36,32 @@ const ( DEFAULT_VPC_ID = "default" NORMAL_VPC_ID = "normal" // 没有关联VPC的安全组,统一使用normal ) + +type UsableResourceListInput struct { + // filter by network usability of the resource + Usable *bool `json:"usable"` +} + +type VpcListInput struct { + apis.StatusStandaloneResourceListInput + apis.DomainizedResourceListInput + + ManagedResourceListInput + UsableResourceListInput + + // filter by globalvpc + Globalvpc string `json:"globalvpc"` +} + +type WireListInput struct { + apis.StandaloneResourceListInput + apis.DomainizedResourceListInput + + ManagedResourceListInput + VpcResourceListInput + HostResourceListInput +} + +type GlobalVpcListInput struct { + apis.EnabledStatusStandaloneResourceListInput +} diff --git a/pkg/apis/compute/zz_generated.model.go b/pkg/apis/compute/zz_generated.model.go index ac91c63109..92b1a3964f 100644 --- a/pkg/apis/compute/zz_generated.model.go +++ b/pkg/apis/compute/zz_generated.model.go @@ -126,7 +126,6 @@ type SCloudaccount struct { AccountId string `json:"account_id"` IsPublicCloud *bool `json:"is_public_cloud,omitempty"` IsOnPremise bool `json:"is_on_premise"` - HasObjectStorage bool `json:"has_object_storage"` Provider string `json:"provider"` EnableAutoSync bool `json:"enable_auto_sync"` SyncIntervalSeconds int `json:"sync_interval_seconds"` @@ -156,6 +155,13 @@ type SCloudprovider struct { Provider string `json:"provider"` } +// SCloudproviderCapability is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SCloudproviderCapability. +type SCloudproviderCapability struct { + apis.SResourceBase + CloudproviderId string `json:"cloudprovider_id"` + Capability string `json:"capability"` +} + // SCloudproviderregion is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SCloudproviderregion. type SCloudproviderregion struct { apis.SJointResourceBase @@ -173,7 +179,8 @@ type SCloudregion struct { SManagedResourceBase apis.SExternalizedResourceBase cloudprovider.SGeographicInfo - Provider string `json:"provider"` + Environment string `json:"environment"` + Provider string `json:"provider"` } // SCloudregionResourceBase is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SCloudregionResourceBase. @@ -306,7 +313,7 @@ type SDeletePreventableResourceBase struct { // SDisk is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SDisk. type SDisk struct { - apis.SSharableVirtualResourceBase + apis.SVirtualResourceBase apis.SExternalizedResourceBase SBillingResourceBase DiskFormat string `json:"disk_format"` @@ -529,6 +536,8 @@ type SGuest struct { FlavorId string `json:"flavor_id"` SecgrpId string `json:"secgrp_id"` AdminSecgrpId string `json:"admin_secgrp_id"` + SrcIpCheck *bool `json:"omitempty,src_ip_check"` + SrcMacCheck *bool `json:"omitempty,src_mac_check"` Hypervisor string `json:"hypervisor"` InstanceType string `json:"instance_type"` } diff --git a/pkg/apis/identity/input.go b/pkg/apis/identity/input.go index dc93fcc990..d3495b77ed 100644 --- a/pkg/apis/identity/input.go +++ b/pkg/apis/identity/input.go @@ -30,6 +30,145 @@ type EnabledIdentityBaseResourceCreateInput struct { Enabled *bool `json:"enabled"` } +type IdentityBaseResourceListInput struct { + apis.StandaloneResourceListInput + apis.DomainizedResourceListInput +} + +type EnabledIdentityBaseResourceListInput struct { + IdentityBaseResourceListInput + + // filter by enabled status + Enabled *bool `json:"enabled"` +} + +type RoleListInput struct { + IdentityBaseResourceListInput + + // filter by project_id + ProjectId string `json:"project_id"` + // filter by user_id + UserId string `json:"user_id"` + // filter by group_id + GroupId string `json:"group_id"` +} + +type GroupListInput struct { + IdentityBaseResourceListInput + + // filter by user_id + UserId string `json:"user_id"` + // filter by project_id + ProjectId string `json:"project_id"` + // deprecated: true + // filter by tenant_id + TenantId string `json:"tenant_id"` +} + +func (input GroupListInput) ProjectIdStr() string { + if len(input.ProjectId) > 0 { + return input.ProjectId + } + if len(input.TenantId) > 0 { + return input.TenantId + } + return "" +} + +type ProjectListInput struct { + IdentityBaseResourceListInput + + // filter by user_id + UserId string `json:"user_id"` + // filter by group_id + GroupId string `json:"group_id"` +} + +type DomainListInput struct { + apis.StandaloneResourceListInput +} + +type UserListInput struct { + EnabledIdentityBaseResourceListInput + + // filter by group_id + GroupId string `json:"group_id"` + // deprecated: true + // filter by group + Group string `json:"group"` + + // filter by project + Project string `json:"project"` + // filter by project_id + ProjectId string `json:"project_id"` + // filter by tenant + Tenant string `json:"tenant"` + // filter by tenant_id + TenantId string `json:"tenant_id"` + + // filter by role + Role string `json:"role"` + // deprecated: true + // filter by role_id + RoleId string `json:"role_id"` +} + +func (input UserListInput) GroupStr() string { + if len(input.GroupId) > 0 { + return input.GroupId + } + if len(input.Group) > 0 { + return input.Group + } + return "" +} + +func (input UserListInput) ProjectStr() string { + if len(input.Project) > 0 { + return input.Project + } + if len(input.ProjectId) > 0 { + return input.ProjectId + } + if len(input.Tenant) > 0 { + return input.Tenant + } + if len(input.TenantId) > 0 { + return input.TenantId + } + return "" +} + +func (input UserListInput) RoleStr() string { + if len(input.Role) > 0 { + return input.Role + } + if len(input.RoleId) > 0 { + return input.RoleId + } + return "" +} + +type EndpointListInput struct { + apis.StandaloneResourceListInput + + // filter by service, either id or name + Service string `json:"service"` + // deprecated: true + // filter by service_id + ServiceId string `json:"service_id"` +} + +func (input EndpointListInput) ServiceStr() string { + if len(input.Service) > 0 { + return input.Service + } + if len(input.ServiceId) > 0 { + return input.ServiceId + } + return "" +} + type SJoinProjectsInput struct { Projects []string Roles []string diff --git a/pkg/apis/image/image.go b/pkg/apis/image/image.go new file mode 100644 index 0000000000..8938bdb7c4 --- /dev/null +++ b/pkg/apis/image/image.go @@ -0,0 +1,28 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package image + +import ( + "yunion.io/x/onecloud/pkg/apis" +) + +type ImageListInput struct { + apis.SharableVirtualResourceListInput + + // filter by disk_formats + DiskFormats []string `json:"disk_formats"` + // filter by uefi + Uefi *bool `json:"uefi"` +} diff --git a/pkg/apis/input.go b/pkg/apis/input.go index 5c536f5395..7fda48a4fc 100644 --- a/pkg/apis/input.go +++ b/pkg/apis/input.go @@ -14,6 +14,38 @@ package apis +type DomainizedResourceListInput struct { + // Is an admin call? equivalent to scope=system + // Deprecated + Admin *bool `json:"admin"` + // Specify query scope, either project, domain or system + Scope string `json:"scope"` + + // Project domain filter, either by Id or Name + ProjectDomain string `json:"project_domain"` + // swagger: ignore + // Deprecated + // Project domain Id filter, alias for project_domain + ProjectDomainId string `json:"project_domain_id"` + // swagger: ignore + // Deprecated + // Domain Id filter, alias for project_domain + DomainId string `json:"domain_id"` +} + +func (input DomainizedResourceListInput) DomainStr() string { + if len(input.ProjectDomain) > 0 { + return input.ProjectDomain + } + if len(input.ProjectDomainId) > 0 { + return input.ProjectDomainId + } + if len(input.DomainId) > 0 { + return input.DomainId + } + return "" +} + type DomainizedResourceCreateInput struct { // description: the owner domain name or id // required: false @@ -24,6 +56,41 @@ type DomainizedResourceCreateInput struct { DomainId string `json:"domain_id"` } +type ProjectizedResourceListInput struct { + DomainizedResourceListInput + + // Filter by project, either ID or Name + Project string `json:"project"` + // swagger: ignore + // Deprecated + // Filter by project_id, alias for project + ProjectId string `json:"project_id"` + // swagger: ignore + // Deprecated + // Filter by tenant ID or Name, alias for project + Tenant string `json:"tenant"` + // swagger: ignore + // Deprecated + // Filter by tenant_id, alias for project + TenantId string `json:"tenant_id"` +} + +func (input ProjectizedResourceListInput) ProjectStr() string { + if len(input.Project) > 0 { + return input.Project + } + if len(input.ProjectId) > 0 { + return input.ProjectId + } + if len(input.Tenant) > 0 { + return input.Tenant + } + if len(input.TenantId) > 0 { + return input.TenantId + } + return "" +} + type ProjectizedResourceCreateInput struct { DomainizedResourceCreateInput @@ -36,6 +103,25 @@ type ProjectizedResourceCreateInput struct { ProjectId string `json:"project_id"` } +type UserResourceListInput struct { + // User ID or Name + User string `json:"user"` + // swagger: ignore + // Deprecated + // Filter by userId + UserId string `json:"user_id"` +} + +func (input UserResourceListInput) UserStr() string { + if len(input.User) > 0 { + return input.User + } + if len(input.UserId) > 0 { + return input.UserId + } + return "" +} + type SharableVirtualResourceCreateInput struct { VirtualResourceCreateInput diff --git a/pkg/apis/logger/doc.go b/pkg/apis/logger/doc.go new file mode 100644 index 0000000000..7d5ae0e538 --- /dev/null +++ b/pkg/apis/logger/doc.go @@ -0,0 +1,15 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logger // import "yunion.io/x/onecloud/pkg/apis/logger" diff --git a/pkg/apis/logger/input.go b/pkg/apis/logger/input.go new file mode 100644 index 0000000000..c872838b93 --- /dev/null +++ b/pkg/apis/logger/input.go @@ -0,0 +1,30 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logger + +import ( + "time" + + "yunion.io/x/onecloud/pkg/apis" +) + +type BaremetalEventListInput struct { + apis.ModelBaseListInput + + // since + Since time.Time `json:"since"` + // until + Until time.Time `json:"until"` +} diff --git a/pkg/apis/modelbase.go b/pkg/apis/modelbase.go index b36f33dcae..56169c768e 100644 --- a/pkg/apis/modelbase.go +++ b/pkg/apis/modelbase.go @@ -26,4 +26,37 @@ type ModelBaseShortDescDetail struct { } type ModelBaseListInput struct { + Meta + + // 查询限制量 + // default: 20 + Limit *int `json:"limit"` + // 查询偏移量 + // default: 0 + Offset *int `json:"offset"` + // Name of the field to be ordered by + OrderBy []string `json:"order_by"` + // List Order + // example: desc|asc + Order string + // Show more details + Details *bool `json:"details"` + // Filter results by a simple keyword search + Search string `json:"search"` + // Filters + Filter []string `json:"filters"` + // Filters with joint table col; joint_tbl.related_key(origin_key).filter_col.filter_cond(filters) + JointFilter []string `json:"joint_filter"` + // If true, match if any of the filters matches; otherwise, match if all of the filters match + FilterAny *bool `json:"filter_any"` + // Show only specified fields + Field []string `json:"field"` + // Export field keys + ExportKeys string `json:"export_keys"` } + +type IncrementalListInput struct { + // 增量加载的标记 + // Marker for streamed pagination + PagingMarker string `json:"paging_marker"` +} \ No newline at end of file diff --git a/pkg/apis/parameters.go b/pkg/apis/parameters.go deleted file mode 100644 index 3903b91f0b..0000000000 --- a/pkg/apis/parameters.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package apis - -type BaseListInput struct { - Meta - - // 查询限制量 - // default: 20 - Limit *int `json:"limit"` - // 查询偏移量 - // default: 0 - Offset *int `json:"offset"` - // Name of the field to be ordered by - OrderBy []string `json:"order_by"` - // List Order - // example: desc|asc - Order string - // Show more details - Details *bool `json:"details"` - // Filter results by a simple keyword search - Search string `json:"search"` - // Piggyback metadata information - WithMeta *bool `json:"with_meta"` - // Filters - Filter []string `json:"filters"` - // Filters with joint table col; joint_tbl.related_key(origin_key).filter_col.filter_cond(filters) - JointFilter []string `json:"joint_filter"` - // If true, match if any of the filters matches; otherwise, match if all of the filters match - FilterAny *bool `json:"filter_any"` - // Is an admin call? - Admin *bool `json:"admin"` - // Tenant ID or Name - Tenant string `json:"tenant"` - // Project domain filter - ProjectDomain string `json:"project_domain"` - // User ID or Name - User string `json:"user"` - // Show only specified fields - Field []string `json:"field"` - // Specify query scope, either project, domain or system - Scope string `json:"scope"` - // Show system resource - System *bool `json:"system"` - // Show only pending deleted resource - PendingDelete *bool `json:"pending_delete"` - // Show all resources including pending deleted - // TODO: fix this??? - PendingDeleteAll *bool `json:"-"` - // Show all resources including the emulated resources - ShowEmulated *bool `json:"show_emulated"` - // Export field keys - ExportKeys string `json:"export_keys"` - - // Marker for pagination - PagingMarker string `json:"paging_marker"` -} diff --git a/pkg/apis/resourcebase.go b/pkg/apis/resourcebase.go new file mode 100644 index 0000000000..c569309f20 --- /dev/null +++ b/pkg/apis/resourcebase.go @@ -0,0 +1,19 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package apis + +type ResourceBaseListInput struct { + ModelBaseListInput +} diff --git a/pkg/apis/sharablevirtualresource.go b/pkg/apis/sharablevirtualresource.go index 7d4d82a219..2a4b5d6224 100644 --- a/pkg/apis/sharablevirtualresource.go +++ b/pkg/apis/sharablevirtualresource.go @@ -25,5 +25,11 @@ type SharableVirtualResourceDetails struct { } type SharableVirtualResourceListInput struct { - StandaloneResourceListInput + VirtualResourceListInput + + // filter by is_public status + IsPublic *bool `json:"is_public"` + // filter by public_scope + // possible value is system, domain, project + PublicScope string `json:"public_scope"` } diff --git a/pkg/apis/standaloneresource.go b/pkg/apis/standaloneresource.go index af6b57224a..511ead3477 100644 --- a/pkg/apis/standaloneresource.go +++ b/pkg/apis/standaloneresource.go @@ -27,8 +27,33 @@ type STag struct { } type StandaloneResourceListInput struct { - ModelBaseListInput + ResourceBaseListInput - Tags []STag `json:"tags"` - WithoutUserMeta bool `json:"without_user_meta"` + // filter by tags + Tags []STag `json:"tags"` + // Piggyback user metadata information + WithoutUserMeta bool `json:"without_user_meta"` + // Piggyback metadata information + WithMeta *bool `json:"with_meta"` + // Show all resources including the emulated resources + ShowEmulated *bool `json:"show_emulated"` + + // filter by resource name + Names []string `json:"name"` + // filter by resource ID + Ids []string `json:"id"` +} + +type StatusStandaloneResourceListInput struct { + StandaloneResourceListInput + + // filter by resource status + Status []string `json:"status"` +} + +type EnabledStatusStandaloneResourceListInput struct { + StatusStandaloneResourceListInput + + // filter by enable/disabled status + Enabled *bool `json:"enabled"` } diff --git a/pkg/apis/virtualresource.go b/pkg/apis/virtualresource.go index 2df8b7ebea..10f89f10eb 100644 --- a/pkg/apis/virtualresource.go +++ b/pkg/apis/virtualresource.go @@ -17,3 +17,17 @@ package apis type VirtualResourceDetails struct { ModelBaseDetails } + +type VirtualResourceListInput struct { + StatusStandaloneResourceListInput + + ProjectizedResourceListInput + + // Show system resource + System *bool `json:"system"` + // Show only pending deleted resource + PendingDelete *bool `json:"pending_delete"` + // Show all resources including pending deleted + // TODO: fix this??? + PendingDeleteAll *bool `json:"-"` +} diff --git a/pkg/cloudcommon/db/enabledstatusstandalone.go b/pkg/cloudcommon/db/enabledstatusstandalone.go index 6ab76b928d..ee4ddf520a 100644 --- a/pkg/cloudcommon/db/enabledstatusstandalone.go +++ b/pkg/cloudcommon/db/enabledstatusstandalone.go @@ -20,6 +20,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/errors" + "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/mcclient" @@ -89,3 +90,18 @@ func (manager *SEnabledStatusStandaloneResourceBaseManager) ValidateCreateData(c } return input, nil } + +func (manager *SEnabledStatusStandaloneResourceBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query apis.EnabledStatusStandaloneResourceListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") + } + if query.Enabled != nil { + if *query.Enabled { + q = q.IsTrue("enabled") + } else { + q = q.IsFalse("enabled") + } + } + return q, nil +} diff --git a/pkg/cloudcommon/db/modelbase.go b/pkg/cloudcommon/db/modelbase.go index 9b5c7bbe39..3a2485b6d2 100644 --- a/pkg/cloudcommon/db/modelbase.go +++ b/pkg/cloudcommon/db/modelbase.go @@ -123,11 +123,7 @@ func (manager *SModelBaseManager) ValidateListConditions(ctx context.Context, us return query, nil } -func (manager *SModelBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - return q, nil -} - -func (manager *SModelBaseManager) ListItemFilterV2(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input *apis.ModelBaseListInput) (*sqlchemy.SQuery, error) { +func (manager *SModelBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query apis.ModelBaseListInput) (*sqlchemy.SQuery, error) { return q, nil } diff --git a/pkg/cloudcommon/db/resourcebase.go b/pkg/cloudcommon/db/resourcebase.go index 9af84936e7..903cc5503c 100644 --- a/pkg/cloudcommon/db/resourcebase.go +++ b/pkg/cloudcommon/db/resourcebase.go @@ -120,3 +120,11 @@ func (manager *SResourceBaseManager) ValidateCreateData(ctx context.Context, use } return input, nil } + +func (manager *SResourceBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query apis.ResourceBaseListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SModelBaseManager.ListItemFilter(ctx, q, userCred, query.ModelBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SModelBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/cloudcommon/db/sharablevirtual.go b/pkg/cloudcommon/db/sharablevirtual.go index 3e8a67fbf2..5509c9e936 100644 --- a/pkg/cloudcommon/db/sharablevirtual.go +++ b/pkg/cloudcommon/db/sharablevirtual.go @@ -322,3 +322,11 @@ func (manager *SSharableVirtualResourceBaseManager) ValidateCreateData(ctx conte } return input, nil } + +func (manager *SSharableVirtualResourceBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query apis.SharableVirtualResourceListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/cloudcommon/db/standalone.go b/pkg/cloudcommon/db/standalone.go index 29ba62b834..15fecfe116 100644 --- a/pkg/cloudcommon/db/standalone.go +++ b/pkg/cloudcommon/db/standalone.go @@ -135,20 +135,18 @@ func (manager *SStandaloneResourceBaseManager) FetchByIdOrName(userCred mcclient return FetchByIdOrName(manager.GetIStandaloneModelManager(), userCred, idStr) } -func (manager *SStandaloneResourceBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - input := &apis.StandaloneResourceListInput{} - err := query.Unmarshal(input) +func (manager *SStandaloneResourceBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input apis.StandaloneResourceListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ResourceBaseListInput) if err != nil { - return nil, httperrors.NewInputParameterError("invalid input error: %v", err) + return q, errors.Wrap(err, "SResourceBaseManager.ListItemFilte") } - return manager.ListItemFilterV2(ctx, q, userCred, input) -} + if len(input.Names) > 0 { + q = q.In("name", input.Names) + } -func (manager *SStandaloneResourceBaseManager) ListItemFilterV2(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input *apis.StandaloneResourceListInput) (*sqlchemy.SQuery, error) { - q, err := manager.SResourceBaseManager.ListItemFilterV2(ctx, q, userCred, &input.ModelBaseListInput) - if err != nil { - return q, err + if len(input.Ids) > 0 { + q = q.In("id", input.Ids) } tags := map[string][]string{} diff --git a/pkg/cloudcommon/db/statusstandalone.go b/pkg/cloudcommon/db/statusstandalone.go index 4af977565b..c8c3ac89ea 100644 --- a/pkg/cloudcommon/db/statusstandalone.go +++ b/pkg/cloudcommon/db/statusstandalone.go @@ -21,6 +21,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" "yunion.io/x/pkg/utils" + "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/httperrors" @@ -100,3 +101,14 @@ func (manager *SStatusStandaloneResourceBaseManager) ValidateCreateData(ctx cont } return input, nil } + +func (manager *SStatusStandaloneResourceBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query apis.StatusStandaloneResourceListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") + } + if len(query.Status) > 0 { + q = q.In("status", query.Status) + } + return q, nil +} diff --git a/pkg/cloudcommon/db/virtualresource.go b/pkg/cloudcommon/db/virtualresource.go index a1e9875f73..163630eb8e 100644 --- a/pkg/cloudcommon/db/virtualresource.go +++ b/pkg/cloudcommon/db/virtualresource.go @@ -568,3 +568,11 @@ func (manager *SVirtualResourceBaseManager) OrderByExtraFields(ctx context.Conte return q, nil } + +func (manager *SVirtualResourceBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query apis.VirtualResourceListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/cloudevent/models/cloudevents.go b/pkg/cloudevent/models/cloudevents.go index 453f305d7f..196d3afbe6 100644 --- a/pkg/cloudevent/models/cloudevents.go +++ b/pkg/cloudevent/models/cloudevents.go @@ -20,6 +20,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/sqlchemy" api "yunion.io/x/onecloud/pkg/apis/cloudevent" @@ -75,12 +76,25 @@ func (self *SCloudevent) AllowUpdateItem(ctx context.Context, userCred mcclient. return false } -func (manager *SCloudeventManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input *api.CloudeventListInput) (*sqlchemy.SQuery, error) { - q, err := manager.SModelBaseManager.ListItemFilter(ctx, q, userCred, input.JSON(input)) +func (manager *SCloudeventManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.CloudeventListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SModelBaseManager.ListItemFilter(ctx, q, userCred, input.ModelBaseListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + /* input.Cloudprovider = input.CloudproviderStr() + if len(input.Cloudprovider) > 0 { + providerObj, err := CloudproviderManager.FetchByIdOrName(userCred, input.Cloudprovider) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), input.Cloudprovider) + } else { + return nil, httperrors.NewGeneralError(err) + } + } + q = q.Equals("cloudprovider_id", providerObj.GetId()) + }*/ + if len(input.Providers) > 0 { q = q.In("provider", input.Providers) } diff --git a/pkg/cloudnet/models/ifaces.go b/pkg/cloudnet/models/ifaces.go index 56e94e2124..9ce3233e5b 100644 --- a/pkg/cloudnet/models/ifaces.go +++ b/pkg/cloudnet/models/ifaces.go @@ -28,6 +28,7 @@ import ( "yunion.io/x/pkg/util/netutils" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/validators" cnutils "yunion.io/x/onecloud/pkg/cloudnet/utils" @@ -78,9 +79,14 @@ func (man *SIfaceManager) ValidateCreateData(ctx context.Context, userCred mccli } func (man *SIfaceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + input := apis.StandaloneResourceListInput{} + err := query.Unmarshal(&input) if err != nil { - return nil, err + return nil, errors.Wrap(err, "query.Unmarshal") + } + q, err = man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input) + if err != nil { + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } data := query.(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ diff --git a/pkg/cloudnet/models/routes.go b/pkg/cloudnet/models/routes.go index b0fcbb51f9..9f4d297dc4 100644 --- a/pkg/cloudnet/models/routes.go +++ b/pkg/cloudnet/models/routes.go @@ -115,7 +115,12 @@ func (man *SRouteManager) ValidateCreateData(ctx context.Context, userCred mccli } func (man *SRouteManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + input := apis.StandaloneResourceListInput{} + err := query.Unmarshal(&input) + if err != nil { + return nil, err + } + q, err = man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input) if err != nil { return nil, err } diff --git a/pkg/cloudnet/models/rules.go b/pkg/cloudnet/models/rules.go index 3a347cb5c9..ea302481a9 100644 --- a/pkg/cloudnet/models/rules.go +++ b/pkg/cloudnet/models/rules.go @@ -213,9 +213,14 @@ func (man *SRuleManager) ValidateCreateData(ctx context.Context, userCred mcclie } func (man *SRuleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + input := apis.StandaloneResourceListInput{} + err := query.Unmarshal(&input) if err != nil { - return nil, err + return nil, errors.Wrap(err, "query.Unmarshal") + } + q, err = man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input) + if err != nil { + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } data := query.(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ diff --git a/pkg/cloudprovider/cloudprovider.go b/pkg/cloudprovider/cloudprovider.go index c86d6c66b0..2b0abd97b0 100644 --- a/pkg/cloudprovider/cloudprovider.go +++ b/pkg/cloudprovider/cloudprovider.go @@ -158,10 +158,6 @@ type ICloudProviderFactory interface { IsSupportPrepaidResources() bool NeedSyncSkuFromCloud() bool - IsSupportObjectStorage() bool - IsSupportComputeEngine() bool - IsSupportNetworkManage() bool - IsCloudeventRegional() bool GetMaxCloudEventSyncDays() int GetMaxCloudEventKeepDays() int @@ -375,22 +371,10 @@ func (factory *SPremiseBaseProviderFactory) IsOnPremise() bool { return true } -func (factory *SPremiseBaseProviderFactory) IsSupportObjectStorage() bool { - return false -} - func (factory *SPremiseBaseProviderFactory) NeedSyncSkuFromCloud() bool { return false } -func (factory *SPremiseBaseProviderFactory) IsSupportComputeEngine() bool { - return true -} - -func (factory *SPremiseBaseProviderFactory) IsSupportNetworkManage() bool { - return false -} - type SPublicCloudBaseProviderFactor struct { baseProviderFactory } @@ -403,22 +387,10 @@ func (factory *SPublicCloudBaseProviderFactor) IsSupportPrepaidResources() bool return true } -func (factory *SPublicCloudBaseProviderFactor) IsSupportObjectStorage() bool { - return true -} - func (factory *SPublicCloudBaseProviderFactor) NeedSyncSkuFromCloud() bool { return false } -func (factory *SPublicCloudBaseProviderFactor) IsSupportComputeEngine() bool { - return true -} - -func (factory *SPublicCloudBaseProviderFactor) IsSupportNetworkManage() bool { - return true -} - type SPrivateCloudBaseProviderFactor struct { baseProviderFactory } @@ -431,18 +403,6 @@ func (factory *SPrivateCloudBaseProviderFactor) IsSupportPrepaidResources() bool return false } -func (factory *SPrivateCloudBaseProviderFactor) IsSupportObjectStorage() bool { - return false -} - func (factory *SPrivateCloudBaseProviderFactor) NeedSyncSkuFromCloud() bool { return true } - -func (factory *SPrivateCloudBaseProviderFactor) IsSupportComputeEngine() bool { - return true -} - -func (factory *SPrivateCloudBaseProviderFactor) IsSupportNetworkManage() bool { - return true -} diff --git a/pkg/cloudprovider/consts.go b/pkg/cloudprovider/consts.go index 23ac7f0eb5..a7efe124d6 100644 --- a/pkg/cloudprovider/consts.go +++ b/pkg/cloudprovider/consts.go @@ -43,6 +43,7 @@ const ( const ( CLOUD_CAPABILITY_PROJECT = "project" CLOUD_CAPABILITY_COMPUTE = "compute" + CLOUD_CAPABILITY_NETWORK = "network" CLOUD_CAPABILITY_LOADBALANCER = "loadbalancer" CLOUD_CAPABILITY_OBJECTSTORE = "objectstore" CLOUD_CAPABILITY_RDS = "rds" diff --git a/pkg/compute/models/buckets.go b/pkg/compute/models/buckets.go index 8fd266d7a3..0873ef2e02 100644 --- a/pkg/compute/models/buckets.go +++ b/pkg/compute/models/buckets.go @@ -576,23 +576,23 @@ func (bucket *SBucket) getCloudProviderInfo() SCloudProviderInfo { return MakeCloudProviderInfo(region, nil, provider) } -func (manager *SBucketManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SBucketManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.BucketListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = managedResourceFilterByDomain(q, query, "", nil) + q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByDomain") } - q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } return q, nil diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index f8edcd5649..f8712d1bcb 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -587,10 +587,10 @@ func (image *SCachedimage) GetCloudprovider() (*SCloudprovider, error) { return cloudprovider, nil } -func (manager *SCachedimageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SCachedimageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.CachedimageListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "id", func() *sqlchemy.SQuery { cachedImages := CachedimageManager.Query().SubQuery() storagecachedImages := StoragecachedimageManager.Query().SubQuery() storageCaches := StoragecacheManager.Query().SubQuery() @@ -601,10 +601,10 @@ func (manager *SCachedimageManager) ListItemFilter(ctx context.Context, q *sqlch return subq }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "id", func() *sqlchemy.SQuery { + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "id", func() *sqlchemy.SQuery { cachedImages := CachedimageManager.Query().SubQuery() storagecachedImages := StoragecachedimageManager.Query().SubQuery() storageCaches := StoragecacheManager.Query().SubQuery() @@ -615,12 +615,12 @@ func (manager *SCachedimageManager) ListItemFilter(ctx context.Context, q *sqlch return subq }) - q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - q, err = managedResourceFilterByRegion(q, query, "id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "id", func() *sqlchemy.SQuery { storagecachedImages := StoragecachedimageManager.Query().SubQuery() storageCaches := StoragecacheManager.Query().SubQuery() storages := StorageManager.Query().SubQuery() @@ -634,10 +634,10 @@ func (manager *SCachedimageManager) ListItemFilter(ctx context.Context, q *sqlch return subq }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - q, err = managedResourceFilterByZone(q, query, "id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "id", func() *sqlchemy.SQuery { storagecachedImages := StoragecachedimageManager.Query().SubQuery() storageCaches := StoragecacheManager.Query().SubQuery() storages := StorageManager.Query().SubQuery() @@ -649,58 +649,8 @@ func (manager *SCachedimageManager) ListItemFilter(ctx context.Context, q *sqlch return subq }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByZone") } - /*regionStr := jsonutils.GetAnyString(query, []string{"region", "region_id", "cloudregion", "cloudregion_id"}) - if len(regionStr) > 0 { - regionObj, err := CloudregionManager.FetchByIdOrName(nil, regionStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudregionManager.Keyword(), regionStr) - } else { - return nil, httperrors.NewGeneralError(err) - } - } - cachedImages := CachedimageManager.Query().SubQuery() - storagecachedImages := StoragecachedimageManager.Query().SubQuery() - storageCaches := StoragecacheManager.Query().SubQuery() - storages := StorageManager.Query().SubQuery() - zones := ZoneManager.Query().SubQuery() - - subq := cachedImages.Query(cachedImages.Field("id")) - subq = subq.Join(storagecachedImages, sqlchemy.Equals(cachedImages.Field("id"), storagecachedImages.Field("cachedimage_id"))) - subq = subq.Join(storageCaches, sqlchemy.Equals(storagecachedImages.Field("storagecache_id"), storageCaches.Field("id"))) - subq = subq.Join(storages, sqlchemy.Equals(storageCaches.Field("id"), storages.Field("storagecache_id"))) - subq = subq.Join(zones, sqlchemy.Equals(storages.Field("zone_id"), zones.Field("id"))) - subq = subq.Filter(sqlchemy.Equals(zones.Field("cloudregion_id"), regionObj.GetId())).Filter(sqlchemy.Equals(storagecachedImages.Field("status"), api.CACHED_IMAGE_STATUS_READY)) - - q = q.Filter(sqlchemy.In(q.Field("id"), subq.SubQuery())) - }*/ - - /* zoneStr := jsonutils.GetAnyString(query, []string{"zone", "zone_id"}) - if len(zoneStr) > 0 { - zoneObj, err := ZoneManager.FetchByIdOrName(nil, zoneStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(ZoneManager.Keyword(), zoneStr) - } else { - return nil, httperrors.NewGeneralError(err) - } - } - cachedImages := CachedimageManager.Query().SubQuery() - storagecachedImages := StoragecachedimageManager.Query().SubQuery() - storageCaches := StoragecacheManager.Query().SubQuery() - storages := StorageManager.Query().SubQuery() - - subq := cachedImages.Query(cachedImages.Field("id")) - subq = subq.Join(storagecachedImages, sqlchemy.Equals(cachedImages.Field("id"), storagecachedImages.Field("cachedimage_id"))) - subq = subq.Join(storageCaches, sqlchemy.Equals(storagecachedImages.Field("storagecache_id"), storageCaches.Field("id"))) - subq = subq.Join(storages, sqlchemy.Equals(storageCaches.Field("id"), storages.Field("storagecache_id"))) - subq = subq.Filter(sqlchemy.Equals(storages.Field("zone_id"), zoneObj.GetId())).Filter(sqlchemy.Equals(storagecachedImages.Field("status"), api.CACHED_IMAGE_STATUS_READY)) - - q = q.Filter(sqlchemy.In(q.Field("id"), subq.SubQuery())) - }*/ - return q, nil } diff --git a/pkg/compute/models/capabilities.go b/pkg/compute/models/capabilities.go index 4946f78e0c..5c096bd53f 100644 --- a/pkg/compute/models/capabilities.go +++ b/pkg/compute/models/capabilities.go @@ -20,7 +20,6 @@ import ( "fmt" "yunion.io/x/jsonutils" - "yunion.io/x/log" "yunion.io/x/pkg/tristate" "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" @@ -29,6 +28,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/consts" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/policy" + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/rbacutils" @@ -202,118 +202,25 @@ func getDBInstanceInfo(region *SCloudregion, zone *SZone) map[string]map[string] // set all brands, compute engine brands, network manage brands, object storage brands func getBrands(region *SCloudregion, zone *SZone, domainId string, capa *SCapabilities) { - q := CloudaccountManager.Query() - providers := CloudproviderManager.Query().SubQuery() - q = q.Join(providers, sqlchemy.Equals(q.Field("id"), providers.Field("cloudaccount_id"))) - if zone != nil { - region = zone.GetRegion() - } - if region != nil { - providerregions := CloudproviderRegionManager.Query().SubQuery() - q = q.Join(providerregions, sqlchemy.Equals(providers.Field("id"), providerregions.Field("cloudprovider_id"))) - q = q.Filter(sqlchemy.Equals(providerregions.Field("cloudregion_id"), region.Id)) - } - if len(domainId) > 0 { - q = q.Filter(sqlchemy.OR( - sqlchemy.AND( - sqlchemy.Equals(q.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN), - sqlchemy.Equals(q.Field("domain_id"), domainId), - ), - sqlchemy.Equals(q.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM), - sqlchemy.AND( - sqlchemy.Equals(q.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN), - sqlchemy.Equals(providers.Field("domain_id"), domainId), - ), - )) - } - cloudAccounts := make([]SCloudaccount, 0) - err := q.All(&cloudAccounts) - if err != nil { - log.Errorf("get brands failed %s", err) - return - } + capa.Brands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, "") + capa.ComputeEngineBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_COMPUTE) + capa.NetworkManageBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_NETWORK) + capa.ObjectStorageBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.True, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE) - enabledBrandAccountMap := make(map[string]*SCloudaccount, 0) - disabledBrandAccountMap := make(map[string]*SCloudaccount, 0) - for i := 0; i < len(cloudAccounts); i++ { - if _, ok := enabledBrandAccountMap[cloudAccounts[i].Brand]; ok { - continue - } else if _, ok := disabledBrandAccountMap[cloudAccounts[i].Brand]; ok { - if cloudAccounts[i].Enabled { - delete(disabledBrandAccountMap, cloudAccounts[i].Brand) - enabledBrandAccountMap[cloudAccounts[i].Brand] = &cloudAccounts[i] - } - continue - } else { - if cloudAccounts[i].Enabled { - enabledBrandAccountMap[cloudAccounts[i].Brand] = &cloudAccounts[i] - } else { - disabledBrandAccountMap[cloudAccounts[i].Brand] = &cloudAccounts[i] - } - } + if utils.IsInStringArray(api.HYPERVISOR_KVM, capa.Hypervisors) || utils.IsInStringArray(api.HYPERVISOR_BAREMETAL, capa.Hypervisors) { + capa.Brands = append(capa.Brands, api.ONECLOUD_BRAND_ONECLOUD) + capa.ComputeEngineBrands = append(capa.ComputeEngineBrands, api.ONECLOUD_BRAND_ONECLOUD) } - b, c, n, o := getBrandsFromBrandAccountMap(enabledBrandAccountMap, capa.Hypervisors, true) - capa.Brands, capa.ComputeEngineBrands, capa.NetworkManageBrands, capa.ObjectStorageBrands = b, c, n, o - b, c, n, o = getBrandsFromBrandAccountMap(disabledBrandAccountMap, capa.Hypervisors, false) - capa.DisabledBrands, capa.DisabledComputeEngineBrands, capa.DisabledNetworkManageBrands, capa.DisabledObjectStorageBrands = b, c, n, o + capa.NetworkManageBrands = append(capa.NetworkManageBrands, api.ONECLOUD_BRAND_ONECLOUD) + + capa.DisabledBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, "") + capa.DisabledComputeEngineBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_COMPUTE) + capa.DisabledNetworkManageBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_NETWORK) + capa.DisabledObjectStorageBrands, _ = CloudaccountManager.getBrandsOfCapability(region, zone, domainId, tristate.False, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE) + return } -func getBrandsFromBrandAccountMap(bam map[string]*SCloudaccount, hypervisors []string, enabled bool, -) ([]string, []string, []string, []string) { - var ( - brands []string = make([]string, 0) - computeEngineBrands []string - networkManageBrands []string - objectStorageBrands []string - ) - for brand, cloudAccount := range bam { - brands = append(brands, brand) - factory, err := cloudAccount.GetProviderFactory() - if err != nil { - log.Errorln(err) - continue - } - if factory.IsSupportComputeEngine() { - if computeEngineBrands == nil { - computeEngineBrands = make([]string, 0) - } - computeEngineBrands = append(computeEngineBrands, brand) - } - if factory.IsSupportNetworkManage() { - if networkManageBrands == nil { - networkManageBrands = make([]string, 0) - } - networkManageBrands = append(networkManageBrands, brand) - } - if factory.IsSupportObjectStorage() { - if objectStorageBrands == nil { - objectStorageBrands = make([]string, 0) - } - objectStorageBrands = append(objectStorageBrands, brand) - } - } - - if enabled { - for _, hyper := range api.ONECLOUD_HYPERVISORS { - if utils.IsInStringArray(hyper, hypervisors) { - brands = append(brands, api.CLOUD_PROVIDER_ONECLOUD) - if computeEngineBrands == nil { - computeEngineBrands = make([]string, 0) - } - computeEngineBrands = append(computeEngineBrands, api.CLOUD_PROVIDER_ONECLOUD) - if networkManageBrands == nil { - networkManageBrands = make([]string, 0) - } - networkManageBrands = append(networkManageBrands, api.CLOUD_PROVIDER_ONECLOUD) - break - } - } - } - - return brands, computeEngineBrands, networkManageBrands, objectStorageBrands -} - func getHypervisors(region *SCloudregion, zone *SZone, domainId string) []string { q := HostManager.Query("host_type", "manager_id") if region != nil { diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index b462703d81..a29a627aff 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -91,8 +91,6 @@ type SCloudaccount struct { IsPublicCloud tristate.TriState `nullable:"false" get:"user" create:"optional" list:"user" default:"true"` IsOnPremise bool `nullable:"false" get:"user" create:"optional" list:"user" default:"false"` - HasObjectStorage bool `nullable:"false" get:"user" create:"optional" list:"user" default:"false"` - Provider string `width:"64" charset:"ascii" list:"domain" create:"domain_required"` EnableAutoSync bool `default:"false" create:"domain_optional" list:"domain"` @@ -763,18 +761,6 @@ func (self *SCloudaccount) importSubAccount(ctx context.Context, userCred mcclie return newCloudprovider, isNew, nil } -//func (self *SCloudaccount) AllowPerformImport(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { -// return db.IsAdminAllowPerform(userCred, self, "import") -//} - -//func (self *SCloudaccount) PerformImport(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { -// autoCreateProject := jsonutils.QueryBoolean(data, "auto_create_project", false) -// autoSync := jsonutils.QueryBoolean(data, "auto_sync", false) -// err := self.startImportSubAccountTask(ctx, userCred, autoCreateProject, autoSync, "") -// noop -// return nil, nil -//} - func (manager *SCloudaccountManager) FetchCloudaccountById(accountId string) *SCloudaccount { providerObj, err := manager.FetchById(accountId) if err != nil { @@ -1153,10 +1139,9 @@ func (self *SCloudaccount) PerformChangeProject(ctx context.Context, userCred mc return providers[0].PerformChangeProject(ctx, userCred, query, data) } -func (manager *SCloudaccountManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - accountStr, _ := query.GetString("account") +func (manager *SCloudaccountManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.CloudaccountListInput) (*sqlchemy.SQuery, error) { + accountStr := query.CloudaccountStr() if len(accountStr) > 0 { - query.(*jsonutils.JSONDict).Remove("account") accountObj, err := manager.FetchByIdOrName(userCred, accountStr) if err != nil { if err == sql.ErrNoRows { @@ -1168,11 +1153,11 @@ func (manager *SCloudaccountManager) ListItemFilter(ctx context.Context, q *sqlc q = q.Equals("id", accountObj.GetId()) } - q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager") } - managerStr, _ := query.GetString("manager") + managerStr := query.CloudproviderStr() if len(managerStr) > 0 { providerObj, err := CloudproviderManager.FetchByIdOrName(userCred, managerStr) if err != nil { @@ -1186,19 +1171,29 @@ func (manager *SCloudaccountManager) ListItemFilter(ctx context.Context, q *sqlc q = q.Equals("id", provider.CloudaccountId) } - cloudEnvStr, _ := query.GetString("cloud_env") - if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD || jsonutils.QueryBoolean(query, "public_cloud", false) { + cloudEnvStr := query.CloudEnvStr() + if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { q = q.IsTrue("is_public_cloud").IsFalse("is_on_premise") } - if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD || jsonutils.QueryBoolean(query, "private_cloud", false) { + if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD { q = q.IsFalse("is_public_cloud").IsFalse("is_on_premise") } - if cloudEnvStr == api.CLOUD_ENV_ON_PREMISE || jsonutils.QueryBoolean(query, "is_on_premise", false) { + if cloudEnvStr == api.CLOUD_ENV_ON_PREMISE { q = q.IsTrue("is_on_premise").IsFalse("is_public_cloud") } + capabilities := query.CapabilityList() + if len(capabilities) > 0 { + cloudproviders := CloudproviderManager.Query().SubQuery() + cloudprovidercapabilities := CloudproviderCapabilityManager.Query().SubQuery() + subq := cloudproviders.Query(cloudproviders.Field("cloudaccount_id")) + subq = subq.Join(cloudprovidercapabilities, sqlchemy.Equals(cloudprovidercapabilities.Field("cloudprovider_id"), cloudproviders.Field("id"))) + subq = subq.Filter(sqlchemy.In(cloudprovidercapabilities.Field("capability"), capabilities)) + q = q.In("id", subq.SubQuery()) + } + return q, nil } @@ -1409,7 +1404,6 @@ func (account *SCloudaccount) probeAccountStatus(ctx context.Context, userCred m isPublic := factory.IsPublicCloud() account.IsPublicCloud = tristate.NewFromBool(isPublic) account.IsOnPremise = factory.IsOnPremise() - account.HasObjectStorage = factory.IsSupportObjectStorage() account.Balance = balance if !options.Options.CloudaccountHealthStatusCheck { status = api.CLOUD_PROVIDER_HEALTH_NORMAL @@ -1787,3 +1781,64 @@ func (account *SCloudaccount) PerformSyncSkus(ctx context.Context, userCred mccl return nil, nil } + +func (manager *SCloudaccountManager) queryCloudAccountByCapability(region *SCloudregion, zone *SZone, domainId string, enabled tristate.TriState, capability string) *sqlchemy.SQuery { + providers := CloudproviderManager.Query().SubQuery() + q := manager.Query() + q = q.Join(providers, sqlchemy.Equals(q.Field("id"), providers.Field("cloudaccount_id"))) + if len(capability) > 0 { + cloudproviderCapabilities := CloudproviderCapabilityManager.Query().SubQuery() + q = q.Join(cloudproviderCapabilities, sqlchemy.Equals(providers.Field("id"), cloudproviderCapabilities.Field("cloudprovider_id"))) + q = q.Filter(sqlchemy.Equals(cloudproviderCapabilities.Field("capability"), capability)) + } + if enabled.IsTrue() { + q = q.IsTrue("enabled") + } else if enabled.IsFalse() { + q = q.IsFalse("enabled") + } + if zone != nil { + region = zone.GetRegion() + } + if region != nil { + providerregions := CloudproviderRegionManager.Query().SubQuery() + q = q.Join(providerregions, sqlchemy.Equals(providers.Field("id"), providerregions.Field("cloudprovider_id"))) + q = q.Filter(sqlchemy.Equals(providerregions.Field("cloudregion_id"), region.Id)) + } + if len(domainId) > 0 { + q = q.Filter(sqlchemy.OR( + sqlchemy.AND( + sqlchemy.Equals(q.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN), + sqlchemy.Equals(q.Field("domain_id"), domainId), + ), + sqlchemy.Equals(q.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM), + sqlchemy.AND( + sqlchemy.Equals(q.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN), + sqlchemy.Equals(providers.Field("domain_id"), domainId), + ), + )) + } + return q +} + +func (manager *SCloudaccountManager) getBrandsOfCapability(region *SCloudregion, zone *SZone, domainId string, enabled tristate.TriState, capability string) ([]string, error) { + subq := manager.queryCloudAccountByCapability(region, zone, domainId, enabled, capability).SubQuery() + q := subq.Query(subq.Field("brand")).Distinct() + rows, err := q.Rows() + if err != nil { + if errors.Cause(err) != sql.ErrNoRows { + return nil, errors.Wrap(err, "rows") + } + return []string{}, nil + } + ret := make([]string, 0) + defer rows.Close() + for rows.Next() { + var brand string + err := rows.Scan(&brand) + if err != nil { + return nil, errors.Wrap(err, "rows.Scan") + } + ret = append(ret, brand) + } + return ret, nil +} diff --git a/pkg/compute/models/cloudprovidercapacities.go b/pkg/compute/models/cloudprovidercapacities.go new file mode 100644 index 0000000000..968fcb5866 --- /dev/null +++ b/pkg/compute/models/cloudprovidercapacities.go @@ -0,0 +1,101 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package models + +import ( + "context" + "sort" + + "yunion.io/x/pkg/errors" + + "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/stringutils2" +) + +type SCloudproviderCapabilityManager struct { + db.SResourceBaseManager +} + +var CloudproviderCapabilityManager *SCloudproviderCapabilityManager + +func init() { + CloudproviderCapabilityManager = &SCloudproviderCapabilityManager{ + SResourceBaseManager: db.NewResourceBaseManager( + SCloudproviderCapability{}, + "cloudprovider_capabilities_tbl", + "cloudprovider_capability", + "cloudprovider_capabilities", + ), + } + CloudproviderCapabilityManager.SetVirtualObject(CloudproviderCapabilityManager) +} + +type SCloudproviderCapability struct { + db.SResourceBase + + CloudproviderId string `width:"36" charset:"ascii" nullable:"false" primary:"true"` + Capability string `width:"18" charset:"ascii" nullable:"false" primary:"true"` +} + +func (manager *SCloudproviderCapabilityManager) setCapabilities(ctx context.Context, userCred mcclient.TokenCredential, cloudproviderId string, capabilities []string) error { + oldCapabilities, err := manager.getCapabilities(cloudproviderId) + if err != nil { + return errors.Wrap(err, "manager.getCapabilities") + } + oldCapas := stringutils2.NewSortedStrings(oldCapabilities) + newCapas := stringutils2.NewSortedStrings(capabilities) + deleted, _, added := stringutils2.Split(oldCapas, newCapas) + + cpc := SCloudproviderCapability{ + CloudproviderId: cloudproviderId, + } + cpc.SetModelManager(manager, &cpc) + + for _, capability := range added { + cpc.Capability = capability + err := manager.TableSpec().InsertOrUpdate(&cpc) + if err != nil { + return errors.Wrap(err, "manager.TableSpec().InsertOrUpdate") + } + } + for _, capability := range deleted { + cpc.Capability = capability + err := cpc.Delete(ctx, userCred) + if err != nil { + return errors.Wrap(err, "cpc.Delete") + } + } + return nil +} + +func (manager *SCloudproviderCapabilityManager) getCapabilities(cloudproviderId string) ([]string, error) { + q := manager.Query().Equals("cloudprovider_id", cloudproviderId) + capabilities := make([]SCloudproviderCapability, 0) + err := db.FetchModelObjects(manager, q, &capabilities) + if err != nil { + return nil, errors.Wrap(err, "db.FetchModelObjects") + } + capaStrs := make([]string, len(capabilities)) + for i := range capabilities { + capaStrs[i] = capabilities[i].Capability + } + sort.Strings(capaStrs) + return capaStrs, nil +} + +func (manager *SCloudproviderCapabilityManager) removeCapabilities(ctx context.Context, userCred mcclient.TokenCredential, cloudproviderId string) error { + return manager.setCapabilities(ctx, userCred, cloudproviderId, []string{}) +} diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index b3efd820b7..0fb7e22359 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -870,6 +870,10 @@ func (self *SCloudprovider) getMoreDetails(ctx context.Context, extra *jsonutils extra.Add(jsonutils.NewString(account.GetName()), "cloudaccount") } extra.Set("sync_status2", jsonutils.NewString(self.getSyncStatus2())) + capabilities, _ := CloudproviderCapabilityManager.getCapabilities(self.Id) + if len(capabilities) > 0 { + extra.Add(jsonutils.NewStringArray(capabilities), "capabilities") + } return extra } @@ -963,11 +967,9 @@ func (manager *SCloudproviderManager) migrateVCenterInfo(vc *SVCenter) error { return manager.TableSpec().Insert(&cp) } -func (manager *SCloudproviderManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - accountStr, _ := query.GetString("account") +func (manager *SCloudproviderManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.CloudproviderListInput) (*sqlchemy.SQuery, error) { + accountStr := query.CloudaccountStr() if len(accountStr) > 0 { - queryDict := query.(*jsonutils.JSONDict) - queryDict.Remove("account") accountObj, err := CloudaccountManager.FetchByIdOrName(userCred, accountStr) if err != nil { if err == sql.ErrNoRows { @@ -979,7 +981,7 @@ func (manager *SCloudproviderManager) ListItemFilter(ctx context.Context, q *sql q = q.Equals("cloudaccount_id", accountObj.GetId()) } - if jsonutils.QueryBoolean(query, "usable", false) { + if query.Usable != nil && *query.Usable { providers := CloudproviderManager.Query().SubQuery() networks := NetworkManager.Query().SubQuery() wires := WireManager.Query().SubQuery() @@ -1009,11 +1011,11 @@ func (manager *SCloudproviderManager) ListItemFilter(ctx context.Context, q *sql )) } - q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) if err != nil { return nil, err } - managerStr, _ := query.GetString("manager") + managerStr := query.CloudproviderStr() if len(managerStr) > 0 { providerObj, err := manager.FetchByIdOrName(userCred, managerStr) if err != nil { @@ -1026,37 +1028,32 @@ func (manager *SCloudproviderManager) ListItemFilter(ctx context.Context, q *sql q = q.Equals("id", providerObj.GetId()) } - cloudEnvStr, _ := query.GetString("cloud_env") - if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD || jsonutils.QueryBoolean(query, "public_cloud", false) { + cloudEnvStr := query.CloudEnvStr() + if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { cloudaccounts := CloudaccountManager.Query().SubQuery() q = q.Join(cloudaccounts, sqlchemy.Equals(cloudaccounts.Field("id"), q.Field("cloudaccount_id"))) q = q.Filter(sqlchemy.IsTrue(cloudaccounts.Field("is_public_cloud"))) q = q.Filter(sqlchemy.IsFalse(cloudaccounts.Field("is_on_premise"))) } - if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD || jsonutils.QueryBoolean(query, "private_cloud", false) { + if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD { cloudaccounts := CloudaccountManager.Query().SubQuery() q = q.Join(cloudaccounts, sqlchemy.Equals(cloudaccounts.Field("id"), q.Field("cloudaccount_id"))) q = q.Filter(sqlchemy.IsFalse(cloudaccounts.Field("is_public_cloud"))) q = q.Filter(sqlchemy.IsFalse(cloudaccounts.Field("is_on_premise"))) } - if cloudEnvStr == api.CLOUD_ENV_ON_PREMISE || jsonutils.QueryBoolean(query, "is_on_premise", false) { + if cloudEnvStr == api.CLOUD_ENV_ON_PREMISE { cloudaccounts := CloudaccountManager.Query().SubQuery() q = q.Join(cloudaccounts, sqlchemy.Equals(cloudaccounts.Field("id"), q.Field("cloudaccount_id"))) q = q.Filter(sqlchemy.IsFalse(cloudaccounts.Field("is_public_cloud"))) q = q.Filter(sqlchemy.IsTrue(cloudaccounts.Field("is_on_premise"))) } - if query.Contains("has_object_storage") { - hasObjectStorage, _ := query.Bool("has_object_storage") - cloudaccounts := CloudaccountManager.Query().SubQuery() - q = q.Join(cloudaccounts, sqlchemy.Equals(cloudaccounts.Field("id"), q.Field("cloudaccount_id"))) - if hasObjectStorage { - q = q.Filter(sqlchemy.IsTrue(cloudaccounts.Field("has_object_storage"))) - } else { - q = q.Filter(sqlchemy.IsFalse(cloudaccounts.Field("has_object_storage"))) - } + capabilities := query.CapabilityList() + if len(capabilities) > 0 { + subq := CloudproviderCapabilityManager.Query("cloudprovider_id").In("capability", capabilities).Distinct().SubQuery() + q = q.In("id", subq) } return q, nil @@ -1092,7 +1089,11 @@ func (provider *SCloudprovider) markProviderConnected(ctx context.Context, userC func (provider *SCloudprovider) prepareCloudproviderRegions(ctx context.Context, userCred mcclient.TokenCredential) ([]SCloudproviderregion, error) { driver, err := provider.GetProvider() if err != nil { - return nil, err + return nil, errors.Wrap(err, "provider.GetProvider") + } + err = CloudproviderCapabilityManager.setCapabilities(ctx, userCred, provider.Id, driver.GetCapabilities()) + if err != nil { + return nil, errors.Wrap(err, "CloudproviderCapabilityManager.setCapabilities") } if driver.GetFactory().IsOnPremise() { cpr := CloudproviderRegionManager.FetchByIdsOrCreate(provider.Id, api.DEFAULT_REGION_ID) @@ -1199,6 +1200,8 @@ func (self *SCloudprovider) RealDelete(ctx context.Context, userCred mcclient.To log.Debugf("%s purgeall success!", manager.Keyword()) } + CloudproviderCapabilityManager.removeCapabilities(ctx, userCred, self.Id) + return self.SEnabledStatusStandaloneResourceBase.Delete(ctx, userCred) } diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index 4d3d2a9478..8b82307c10 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -579,36 +579,34 @@ func queryCloudregionIdsByProviders(providerField string, providerStrs []string) return q } -func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - providerStrs := jsonutils.GetQueryStringArray(query, "provider") +func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.CloudregionListInput) (*sqlchemy.SQuery, error) { + providerStrs := query.Providers if len(providerStrs) > 0 { - query.(*jsonutils.JSONDict).Remove("provider") subq := queryCloudregionIdsByProviders("provider", providerStrs) q = q.In("id", subq.SubQuery()) } - brandStrs := jsonutils.GetQueryStringArray(query, "brand") + brandStrs := query.Brands if len(brandStrs) > 0 { - query.(*jsonutils.JSONDict).Remove("brand") subq := queryCloudregionIdsByProviders("brand", brandStrs) q = q.In("id", subq.SubQuery()) } - q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager.ListItemFilter") } - cloudEnvStr, _ := query.GetString("cloud_env") - if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD || jsonutils.QueryBoolean(query, "is_public", false) || jsonutils.QueryBoolean(query, "public_cloud", false) { + cloudEnvStr := query.CloudEnvStr() + if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { q = q.In("provider", cloudprovider.GetPublicProviders()) } - if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD || jsonutils.QueryBoolean(query, "is_private", false) || jsonutils.QueryBoolean(query, "private_cloud", false) { + if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD { q = q.In("provider", cloudprovider.GetPrivateProviders()) } - if cloudEnvStr == api.CLOUD_ENV_ON_PREMISE || jsonutils.QueryBoolean(query, "is_on_premise", false) { + if cloudEnvStr == api.CLOUD_ENV_ON_PREMISE { q = q.Filter(sqlchemy.OR( sqlchemy.In(q.Field("provider"), cloudprovider.GetOnPremiseProviders()), sqlchemy.Equals(q.Field("provider"), api.CLOUD_PROVIDER_ONECLOUD), @@ -623,35 +621,34 @@ func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlch )) } - if jsonutils.QueryBoolean(query, "is_managed", false) { + if query.IsManaged { q = q.IsNotEmpty("external_id") } - managerStr, _ := query.GetString("manager") + managerStr := query.CloudproviderStr() if len(managerStr) > 0 { subq := CloudproviderRegionManager.QueryRelatedRegionIds("", managerStr) q = q.In("id", subq) } - accountStr, _ := query.GetString("account") + accountStr := query.CloudaccountStr() if len(accountStr) > 0 { subq := CloudproviderRegionManager.QueryRelatedRegionIds(accountStr) q = q.In("id", subq) } - domainId, err := db.FetchQueryDomain(ctx, userCred, query) + domainId, err := db.FetchQueryDomain(ctx, userCred, jsonutils.Marshal(query)) if len(domainId) > 0 { q = q.In("id", getCloudRegionIdByDomainId(domainId)) } - if jsonutils.QueryBoolean(query, "usable", false) || jsonutils.QueryBoolean(query, "usable_vpc", false) { + usableNet := (query.Usable != nil && *query.Usable) + usableVpc := (query.UsableVpc != nil && *query.UsableVpc) + if usableNet || usableVpc { 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"))) if usableNet { sq = sq.Join(wires, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) @@ -684,7 +681,7 @@ func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlch sqlchemy.In(q.Field("id"), sq2.SubQuery()), )) - service, _ := query.GetString("service") + service := query.Service switch service { case DBInstanceManager.KeywordPlural(): skusSQ := DBInstanceSkuManager.Query("cloudregion_id").Equals("status", api.DBINSTANCE_SKU_AVAILABLE).IsTrue("enabled").SubQuery() @@ -699,10 +696,11 @@ func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlch } } - cityStr, _ := query.GetString("city") + cityStr := query.City if cityStr == "Other" { q = q.IsNullOrEmpty("city") - query.(*jsonutils.JSONDict).Remove("city") + } else if len(cityStr) > 0 { + q = q.Equals("city", cityStr) } return q, nil } diff --git a/pkg/compute/models/dbinstance_accounts.go b/pkg/compute/models/dbinstance_accounts.go index 6a8c5824ce..6bc173eec7 100644 --- a/pkg/compute/models/dbinstance_accounts.go +++ b/pkg/compute/models/dbinstance_accounts.go @@ -171,12 +171,12 @@ func (self *SDBInstanceAccount) GetExtraDetails(ctx context.Context, userCred mc return self.getMoreDetails(ctx, userCred, extra) } -func (manager *SDBInstanceAccountManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SDBInstanceAccountManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.DBInstanceAccountListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) return validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "dbinstance", ModelKeyword: "dbinstance", OwnerId: userCred}, }) diff --git a/pkg/compute/models/dbinstance_backups.go b/pkg/compute/models/dbinstance_backups.go index 13bde172b4..bd6ec4e556 100644 --- a/pkg/compute/models/dbinstance_backups.go +++ b/pkg/compute/models/dbinstance_backups.go @@ -97,28 +97,32 @@ func (self *SDBInstanceBackup) AllowDeleteItem(ctx context.Context, userCred mcc return db.IsAdminAllowDelete(userCred, self) } -func (manager *SDBInstanceBackupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SDBInstanceBackupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.DBInstanceBackupListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = managedResourceFilterByDomain(q, query, "", nil) + q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByDomain") } - data := query.(*jsonutils.JSONDict) + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") + } + + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) return validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "dbinstance", ModelKeyword: "dbinstance", OwnerId: userCred}, - {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred}, }) } diff --git a/pkg/compute/models/dbinstance_databases.go b/pkg/compute/models/dbinstance_databases.go index 8593887b99..a1f33708c7 100644 --- a/pkg/compute/models/dbinstance_databases.go +++ b/pkg/compute/models/dbinstance_databases.go @@ -131,12 +131,12 @@ func (self *SDBInstanceDatabase) AllowDeleteItem(ctx context.Context, userCred m return db.IsAdminAllowDelete(userCred, self) } -func (manager *SDBInstanceDatabaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SDBInstanceDatabaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.DBInstanceDatabaseListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) return validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "dbinstance", ModelKeyword: "dbinstance", OwnerId: userCred}, }) diff --git a/pkg/compute/models/dbinstance_parameters.go b/pkg/compute/models/dbinstance_parameters.go index e8bd40ead4..f7326c694d 100644 --- a/pkg/compute/models/dbinstance_parameters.go +++ b/pkg/compute/models/dbinstance_parameters.go @@ -23,6 +23,7 @@ import ( "yunion.io/x/pkg/util/compare" "yunion.io/x/sqlchemy" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/validators" @@ -84,12 +85,12 @@ func (self *SDBInstanceParameter) AllowDeleteItem(ctx context.Context, userCred return db.IsAdminAllowDelete(userCred, self) } -func (manager *SDBInstanceParameterManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SDBInstanceParameterManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.DBInstanceParameterListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) return validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "dbinstance", ModelKeyword: "dbinstance", OwnerId: userCred}, }) diff --git a/pkg/compute/models/dbinstance_privileges.go b/pkg/compute/models/dbinstance_privileges.go index f49152fe0b..5b84cef0c1 100644 --- a/pkg/compute/models/dbinstance_privileges.go +++ b/pkg/compute/models/dbinstance_privileges.go @@ -22,6 +22,7 @@ import ( "yunion.io/x/pkg/util/compare" "yunion.io/x/sqlchemy" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/validators" @@ -123,12 +124,12 @@ func (self *SDBInstancePrivilege) GetDetailedJson() (*jsonutils.JSONDict, error) return result, nil } -func (manager *SDBInstancePrivilegeManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SDBInstancePrivilegeManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.DBInstancePrivilegeListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ResourceBaseListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) return validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "dbinstanceaccount", ModelKeyword: "dbinstanceaccount", OwnerId: userCred}, {Key: "dbinstancedatabase", ModelKeyword: "dbinstancedatabase", OwnerId: userCred}, diff --git a/pkg/compute/models/dbinstance_skus.go b/pkg/compute/models/dbinstance_skus.go index 2136588621..580dee1ef5 100644 --- a/pkg/compute/models/dbinstance_skus.go +++ b/pkg/compute/models/dbinstance_skus.go @@ -27,6 +27,7 @@ import ( "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/validators" @@ -108,12 +109,13 @@ func (manager *SDBInstanceSkuManager) fetchDBInstanceSkus(provider string, regio return skus, nil } -func (manager *SDBInstanceSkuManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SDBInstanceSkuManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.DBInstanceSkuListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q = listItemDomainFilter(q, data) @@ -146,9 +148,14 @@ func (manager *SDBInstanceSkuManager) AllowGetPropertyInstanceSpecs(ctx context. } func (manager *SDBInstanceSkuManager) GetPropertyInstanceSpecs(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) { - q, err := manager.ListItemFilter(ctx, manager.Query(), userCred, query) + listQuery := api.DBInstanceSkuListInput{} + err := query.Unmarshal(&listQuery) if err != nil { - return nil, err + return nil, errors.Wrap(err, "query.Unmarshal") + } + q, err := manager.ListItemFilter(ctx, manager.Query(), userCred, listQuery) + if err != nil { + return nil, errors.Wrap(err, "manager.ListItemFilter") } input := &SDBInstanceSku{} diff --git a/pkg/compute/models/dbinstances.go b/pkg/compute/models/dbinstances.go index 075e789a6e..ae84061b0b 100644 --- a/pkg/compute/models/dbinstances.go +++ b/pkg/compute/models/dbinstances.go @@ -124,32 +124,39 @@ func (self *SDBInstance) AllowDeleteItem(ctx context.Context, userCred mcclient. return db.IsAdminAllowDelete(userCred, self) } -func (man *SDBInstanceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (man *SDBInstanceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.DBInstanceListInput) (*sqlchemy.SQuery, error) { + q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "vpc", ModelKeyword: "vpc", OwnerId: userCred}, - {Key: "zone", ModelKeyword: "zone", OwnerId: userCred}, - {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred}, }) if err != nil { return nil, err } - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = managedResourceFilterByDomain(q, query, "", nil) + q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByDomain") } + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") + } + + q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByZone") + } return q, nil } diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 24d0d42b6b..3582eeccb0 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -113,25 +113,20 @@ func (manager *SDiskManager) FetchDiskById(diskId string) *SDisk { return disk.(*SDisk) } -func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - queryDict, ok := query.(*jsonutils.JSONDict) - if !ok { - return nil, fmt.Errorf("invalid querystring format") - } - +func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.DiskListInput) (*sqlchemy.SQuery, error) { var err error storages := StorageManager.Query().SubQuery() - q, err = managedResourceFilterByAccount(q, query, "storage_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "storage_id", func() *sqlchemy.SQuery { return storages.Query(storages.Field("id")) }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "storage_id", func() *sqlchemy.SQuery { + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "storage_id", func() *sqlchemy.SQuery { return storages.Query(storages.Field("id")) }) - billingTypeStr, _ := queryDict.GetString("billing_type") + billingTypeStr := query.BillingType if len(billingTypeStr) > 0 { if billingTypeStr == billing_api.BILLING_TYPE_POSTPAID { q = q.Filter( @@ -143,71 +138,35 @@ func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } else { q = q.Equals("billing_type", billingTypeStr) } - queryDict.Remove("billing_type") } - q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - if query.Contains("unused") { + if query.Unused != nil { guestdisks := GuestdiskManager.Query().SubQuery() sq := guestdisks.Query(guestdisks.Field("disk_id")) - if jsonutils.QueryBoolean(query, "unused", false) { + if *query.Unused { q = q.Filter(sqlchemy.NotIn(q.Field("id"), sq)) } else { q = q.Filter(sqlchemy.In(q.Field("id"), sq)) } } - if jsonutils.QueryBoolean(query, "share", false) { + if query.Share != nil && *query.Share { sq := storages.Query(storages.Field("id")).Filter(sqlchemy.NotIn(storages.Field("storage_type"), api.STORAGE_LOCAL_TYPES)) q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) } - /*if jsonutils.QueryBoolean(query, "public_cloud", false) { - sq := - sq = sq.Filter(sqlchemy.In(storages.Field("manager_id"), CloudproviderManager.GetPublicProviderIdsQuery())) - - q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) - } - - if jsonutils.QueryBoolean(query, "private_cloud", false) { - sq := storages.Query(storages.Field("id")) - sq = sq.Filter( - sqlchemy.OR( - sqlchemy.In(storages.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery()), - sqlchemy.IsNullOrEmpty(storages.Field("manager_id")), - ), - ) - q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) - } - - if jsonutils.QueryBoolean(query, "is_on_premise", false) { - sq := storages.Query(storages.Field("id")) - sq = sq.Filter( - sqlchemy.OR( - sqlchemy.In(storages.Field("manager_id"), CloudproviderManager.GetOnPremiseProviderIdsQuery()), - sqlchemy.IsNullOrEmpty(storages.Field("manager_id")), - ), - ) - q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) - } - - if jsonutils.QueryBoolean(query, "is_managed", false) { - sq := storages.Query(storages.Field("id")) - sq = sq.Filter(sqlchemy.IsNotEmpty(storages.Field("manager_id"))) - q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) - }*/ - - if jsonutils.QueryBoolean(query, "local", false) { + if query.Local != nil && *query.Local { sq := storages.Query(storages.Field("id")).Filter(sqlchemy.In(storages.Field("storage_type"), api.STORAGE_LOCAL_TYPES)) q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) } - guestId, _ := queryDict.GetString("guest") - if len(guestId) != 0 { + guestId := query.Guest + if len(guestId) > 0 { iGuest, err := GuestManager.FetchByIdOrName(userCred, guestId) if err == sql.ErrNoRows { return nil, httperrors.NewResourceNotFoundError("guest %q not found", guestId) @@ -222,7 +181,7 @@ func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu )) } - storageStr := jsonutils.GetAnyString(queryDict, []string{"storage", "storage_id"}) + storageStr := query.StorageStr() if len(storageStr) > 0 { storageObj, err := StorageManager.FetchByIdOrName(userCred, storageStr) if err != nil { @@ -231,52 +190,12 @@ func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.Filter(sqlchemy.Equals(q.Field("storage_id"), storageObj.GetId())) } - /* managerStr := jsonutils.GetAnyString(query, []string{"manager", "cloudprovider", "cloudprovider_id", "manager_id"}) - if len(managerStr) > 0 { - provider, err := CloudproviderManager.FetchByIdOrName(nil, managerStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr) - } - return nil, httperrors.NewGeneralError(err) - } - subq := storages.Query(storages.Field("id")).Equals("manager_id", provider.GetId()) - q = q.Filter(sqlchemy.In(q.Field("storage_id"), subq.SubQuery())) - } - - accountStr := jsonutils.GetAnyString(query, []string{"account", "account_id", "cloudaccount", "cloudaccount_id"}) - if len(accountStr) > 0 { - account, err := CloudaccountManager.FetchByIdOrName(nil, accountStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), accountStr) - } - return nil, httperrors.NewGeneralError(err) - } - - cloudproviders := CloudproviderManager.Query().SubQuery() - subq := storages.Query(storages.Field("id")) - subq = subq.Join(cloudproviders, sqlchemy.Equals(cloudproviders.Field("id"), storages.Field("manager_id"))) - subq = subq.Filter(sqlchemy.Equals(cloudproviders.Field("cloudaccount_id"), account.GetId())) - - q = q.Filter(sqlchemy.In(q.Field("storage_id"), subq.SubQuery())) - } - - if provier, _ := queryDict.GetString("provider"); len(provier) > 0 { - cloudproviders := CloudproviderManager.Query().SubQuery() - sq := storages.Query(storages.Field("id")) - sq = sq.Join(cloudproviders, sqlchemy.Equals(cloudproviders.Field("id"), storages.Field("manager_id"))) - sq = sq.Filter(sqlchemy.Equals(cloudproviders.Field("provider"), provier)) - - q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq.SubQuery())) - }*/ - - if diskType := jsonutils.GetAnyString(query, []string{"type", "disk_type"}); diskType != "" { + if diskType := query.DiskTypeStr(); diskType != "" { q = q.Filter(sqlchemy.Equals(q.Field("disk_type"), diskType)) } // for snapshotpolicy_id - snapshotpolicyStr := jsonutils.GetAnyString(queryDict, []string{"snapshotpolicy", "snapshotpolicy_id"}) + snapshotpolicyStr := query.SnapshotpolicyStr() if len(snapshotpolicyStr) > 0 { snapshotpolicyObj, err := SnapshotPolicyManager.FetchByIdOrName(userCred, snapshotpolicyStr) if err != nil { diff --git a/pkg/compute/models/elasticcache_instances.go b/pkg/compute/models/elasticcache_instances.go index 363d073801..085281fbd2 100644 --- a/pkg/compute/models/elasticcache_instances.go +++ b/pkg/compute/models/elasticcache_instances.go @@ -250,12 +250,12 @@ func (manager *SElasticcacheManager) GetOwnerIdByElasticcacheId(elasticcacheId s return ec.(*SElasticcache).GetOwnerId() } -func (manager *SElasticcacheManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SElasticcacheManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ElasticcacheListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "vpc", ModelKeyword: "vpc", OwnerId: userCred}, {Key: "zone", ModelKeyword: "zone", OwnerId: userCred}, @@ -264,9 +264,9 @@ func (manager *SElasticcacheManager) ListItemFilter(ctx context.Context, q *sqlc if err != nil { return nil, err } - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } return q, nil } diff --git a/pkg/compute/models/elasticcache_skus.go b/pkg/compute/models/elasticcache_skus.go index ba8dbd393b..516bd78781 100644 --- a/pkg/compute/models/elasticcache_skus.go +++ b/pkg/compute/models/elasticcache_skus.go @@ -29,7 +29,6 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/policy" - "yunion.io/x/onecloud/pkg/cloudcommon/validators" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/stringutils2" ) @@ -166,20 +165,19 @@ func (manager *SElasticcacheSkuManager) FetchCustomizeColumns(ctx context.Contex return ret } -func (manager *SElasticcacheSkuManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - data := query.(*jsonutils.JSONDict) - q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, data) +func (manager *SElasticcacheSkuManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ElasticcacheSkuListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } - if usable, _ := query.Bool("usable"); usable { + if query.Usable != nil && *query.Usable { q = usableFilter(q, true) sq := sqlchemy.OR(sqlchemy.Equals(q.Field("prepaid_status"), api.SkuStatusAvailable), sqlchemy.Equals(q.Field("postpaid_status"), api.SkuStatusAvailable)) q = q.Filter(sq) } - if b, _ := query.GetString("billing_type"); len(b) > 0 { + if b := query.BillingType; len(b) > 0 { switch b { case billing.BILLING_TYPE_POSTPAID: q = q.Equals("postpaid_status", api.SkuStatusAvailable) @@ -188,33 +186,27 @@ func (manager *SElasticcacheSkuManager) ListItemFilter(ctx context.Context, q *s } } - q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ - {Key: "zone", ModelKeyword: "zone", OwnerId: userCred}, - {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred}, - }) + q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByZone") } q = listItemDomainFilter(q, data) - city, _ := query.GetString("city") - if len(city) > 0 { - regionTable := CloudregionManager.Query().SubQuery() - q = q.Join(regionTable, sqlchemy.Equals(regionTable.Field("id"), q.Field("cloudregion_id"))).Filter(sqlchemy.Equals(regionTable.Field("city"), city)) + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") } // 按区间查询内存, 避免0.75G这样的套餐不好过滤 - memSizeMB, _ := query.Int("memory_size_mb") + memSizeMB := query.MemorySizeMb if memSizeMB > 0 { s, e := intervalMem(int(memSizeMB)) q.GT("memory_size_mb", s) q.LE("memory_size_mb", e) - queryDict := query.(*jsonutils.JSONDict) - queryDict.Remove("memory_size_mb") } - return q, err + return q, nil } // 获取region下所有Available状态的sku id @@ -319,12 +311,17 @@ func (manager *SElasticcacheSkuManager) GetPropertyInstanceSpecs(ctx context.Con q := manager.Query("memory_size_mb") q, err := db.ListItemQueryFilters(manager, ctx, q, userCred, query, policy.PolicyActionList) if err != nil { - return nil, err + return nil, errors.Wrap(err, "db.ListItemQueryFilters") } - q, err = manager.ListItemFilter(ctx, q, userCred, query) + listQuery := api.ElasticcacheSkuListInput{} + err = query.Unmarshal(&listQuery) if err != nil { - return nil, err + return nil, errors.Wrap(err, "query.Unmarshal") + } + q, err = manager.ListItemFilter(ctx, q, userCred, listQuery) + if err != nil { + return nil, errors.Wrap(err, "manager.ListItemFilter") } q = q.GroupBy(q.Field("memory_size_mb")).Asc(q.Field("memory_size_mb")).Distinct() @@ -332,10 +329,10 @@ func (manager *SElasticcacheSkuManager) GetPropertyInstanceSpecs(ctx context.Con if err != nil { return nil, err } + defer rows.Close() mems := map[int]bool{} mems_mb := jsonutils.NewArray() - defer rows.Close() for rows.Next() { var ms int err := rows.Scan(&ms) @@ -365,12 +362,17 @@ func (manager *SElasticcacheSkuManager) GetPropertyCapability(ctx context.Contex q := manager.Query("engine", "engine_version", "local_category", "node_type", "performance_type") q, err := db.ListItemQueryFilters(manager, ctx, q, userCred, query, policy.PolicyActionList) if err != nil { - return nil, err + return nil, errors.Wrap(err, "db.ListItemQueryFilters") } - q, err = manager.ListItemFilter(ctx, q, userCred, query) + listQuery := api.ElasticcacheSkuListInput{} + err = query.Unmarshal(&listQuery) if err != nil { - return nil, err + return nil, errors.Wrap(err, "query.Unmarshal") + } + q, err = manager.ListItemFilter(ctx, q, userCred, listQuery) + if err != nil { + return nil, errors.Wrap(err, "manager.ListItemFilter") } f1 := q.Field("engine") diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index 18c4a9d946..cb5781d734 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -83,41 +83,33 @@ type SElasticip struct { CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` } -func (manager *SElasticipManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SElasticipManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ElasticipListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - regionFilter, _ := query.GetString("region") - if len(regionFilter) > 0 { - regionObj, err := CloudregionManager.FetchByIdOrName(userCred, regionFilter) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError("cloud region %s not found", regionFilter) - } else { - return nil, httperrors.NewGeneralError(err) - } - } - q = q.Equals("cloudregion_id", regionObj.GetId()) + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - associateType, _ := query.GetString("usable_eip_for_associate_type") - associateId, _ := query.GetString("usable_eip_for_associate_id") + associateType := query.UsableEipForAssociateType + associateId := query.UsableEipForAssociateId if len(associateType) > 0 && len(associateId) > 0 { switch associateType { case api.EIP_ASSOCIATE_TYPE_SERVER: serverObj, err := GuestManager.FetchByIdOrName(userCred, associateId) if err != nil { if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError("server %s not found", regionFilter) + return nil, httperrors.NewResourceNotFoundError("server %s not found", associateId) } return nil, httperrors.NewGeneralError(err) } @@ -141,12 +133,9 @@ func (manager *SElasticipManager) ListItemFilter(ctx context.Context, q *sqlchem } } - if query.Contains("usable") { - usable := jsonutils.QueryBoolean(query, "usable", false) - if usable { - q = q.Equals("status", api.EIP_STATUS_READY) - q = q.Filter(sqlchemy.OR(sqlchemy.IsNull(q.Field("associate_id")), sqlchemy.IsEmpty(q.Field("associate_id")))) - } + if query.Usable != nil && *query.Usable { + q = q.Equals("status", api.EIP_STATUS_READY) + q = q.Filter(sqlchemy.OR(sqlchemy.IsNull(q.Field("associate_id")), sqlchemy.IsEmpty(q.Field("associate_id")))) } return q, nil diff --git a/pkg/compute/models/external_projects.go b/pkg/compute/models/external_projects.go index 7d9b4bd3cf..ab81ff8c2b 100644 --- a/pkg/compute/models/external_projects.go +++ b/pkg/compute/models/external_projects.go @@ -20,9 +20,11 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/compare" "yunion.io/x/sqlchemy" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudprovider" @@ -274,17 +276,17 @@ func (self *SExternalProject) PerformChangeProject(ctx context.Context, userCred return nil, nil } -func (manager *SExternalProjectManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SExternalProjectManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ExternalProjectListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } return q, nil diff --git a/pkg/compute/models/globalvpcs.go b/pkg/compute/models/globalvpcs.go index 8b0c9bac8d..28d7e923cc 100644 --- a/pkg/compute/models/globalvpcs.go +++ b/pkg/compute/models/globalvpcs.go @@ -96,8 +96,8 @@ func (self *SGlobalVpc) ValidateUpdateData(ctx context.Context, userCred mcclien return self.SEnabledStatusStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data) } -func (manager *SGlobalVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - return manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SGlobalVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.GlobalVpcListInput) (*sqlchemy.SQuery, error) { + return manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) } func (self *SGlobalVpc) ValidateUpdateCondition(ctx context.Context) error { diff --git a/pkg/compute/models/groups.go b/pkg/compute/models/groups.go index 78a3aa3ff7..1020c81ba2 100644 --- a/pkg/compute/models/groups.go +++ b/pkg/compute/models/groups.go @@ -74,7 +74,7 @@ type SGroup struct { } func (sm *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, - input *api.InstanceGroupListInput) (*sqlchemy.SQuery, error) { + input api.InstanceGroupListInput) (*sqlchemy.SQuery, error) { guestFilter := input.Server if len(guestFilter) != 0 { guestObj, err := GuestManager.FetchByIdOrName(userCred, guestFilter) @@ -84,6 +84,12 @@ func (sm *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, ggSub := GroupguestManager.Query("group_id").Equals("guest_id", guestObj.GetId()).SubQuery() q = q.Join(ggSub, sqlchemy.Equals(ggSub.Field("group_id"), q.Field("id"))) } + if len(input.ParentId) > 0 { + q = q.Equals("parent_id", input.ParentId) + } + if len(input.ServiceType) > 0 { + q = q.Equals("service_type", input.ServiceType) + } return q, nil } diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index fdbc25e4f0..23ba547bd5 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -132,26 +132,21 @@ func (manager *SGuestManager) AllowListItems(ctx context.Context, userCred mccli } // 按指定条件列出云主机实例 -func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - queryDict, ok := query.(*jsonutils.JSONDict) - if !ok { - return nil, fmt.Errorf("invalid querystring format") - } - +func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ServerListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "host_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "host_id", func() *sqlchemy.SQuery { hosts := HostManager.Query().SubQuery() return hosts.Query(hosts.Field("id")) }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "host_id", func() *sqlchemy.SQuery { + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "host_id", func() *sqlchemy.SQuery { hosts := HostManager.Query().SubQuery() return hosts.Query(hosts.Field("id")) }) - billingTypeStr, _ := queryDict.GetString("billing_type") + billingTypeStr := query.BillingType if len(billingTypeStr) > 0 { if billingTypeStr == billing_api.BILLING_TYPE_POSTPAID { q = q.Filter( @@ -163,24 +158,18 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } else { q = q.Equals("billing_type", billingTypeStr) } - queryDict.Remove("billing_type") } - q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - isBMstr, _ := queryDict.GetString("baremetal") - if len(isBMstr) > 0 && utils.ToBool(isBMstr) { - queryDict.Add(jsonutils.NewString(api.HYPERVISOR_BAREMETAL), "hypervisor") - queryDict.Remove("baremetal") - } - hypervisor, _ := queryDict.GetString("hypervisor") - if len(hypervisor) > 0 { - q = q.Equals("hypervisor", hypervisor) + hypervisorList := query.HypervisorList() + if len(hypervisorList) > 0 { + q = q.In("hypervisor", hypervisorList) } - resourceTypeStr := jsonutils.GetAnyString(queryDict, []string{"resource_type"}) + resourceTypeStr := query.ResourceType if len(resourceTypeStr) > 0 { hosts := HostManager.Query().SubQuery() subq := hosts.Query(hosts.Field("id")) @@ -199,13 +188,13 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", subq.SubQuery()) } - hostFilter, _ := queryDict.GetString("host") + hostFilter := query.Host if len(hostFilter) > 0 { host, _ := HostManager.FetchByIdOrName(nil, hostFilter) if host == nil { return nil, httperrors.NewResourceNotFoundError("host %s not found", hostFilter) } - if jsonutils.QueryBoolean(queryDict, "get_backup_guests_on_host", false) { + if query.GetBackupGuestsOnHost != nil && *query.GetBackupGuestsOnHost { q.Filter(sqlchemy.OR(sqlchemy.Equals(q.Field("host_id"), host.GetId()), sqlchemy.Equals(q.Field("backup_host_id"), host.GetId()))) } else { @@ -213,7 +202,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } } - secgrpFilter, _ := queryDict.GetString("secgroup") + secgrpFilter := query.Secgroup if len(secgrpFilter) > 0 { var notIn = false // HACK FOR NOT IN SECGROUP @@ -237,7 +226,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } isAdmin := false - admin, _ := query.Bool("admin") + admin := (query.Admin != nil && *query.Admin) if consts.IsRbacEnabled() { allowScope := policy.PolicyManager.AllowScope(userCred, consts.GetServiceType(), manager.KeywordPlural(), policy.PolicyActionList) if allowScope == rbacutils.ScopeSystem || allowScope == rbacutils.ScopeDomain { @@ -267,7 +256,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } } - usableServerForEipFilter, _ := queryDict.GetString("usable_server_for_eip") + usableServerForEipFilter := query.UsableServerForEip if len(usableServerForEipFilter) > 0 { eipObj, err := ElasticipManager.FetchByIdOrName(userCred, usableServerForEipFilter) if err != nil { @@ -299,7 +288,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } } - zoneFilter, _ := queryDict.GetString("zone") + zoneFilter := query.ZoneStr() if len(zoneFilter) > 0 { zone, _ := ZoneManager.FetchByIdOrName(nil, zoneFilter) if zone == nil { @@ -312,7 +301,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", sq) } - wireFilter, _ := queryDict.GetString("wire") + wireFilter := query.Wire if len(wireFilter) > 0 { wire, _ := WireManager.FetchByIdOrName(nil, wireFilter) if wire == nil { @@ -324,7 +313,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", sq) } - networkFilter, _ := queryDict.GetString("network") + networkFilter := query.Network if len(networkFilter) > 0 { netI, _ := NetworkManager.FetchByIdOrName(userCred, networkFilter) if netI == nil { @@ -338,8 +327,8 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", sq) } - vpcFilter, err := queryDict.GetString("vpc") - if err == nil { + vpcFilter := query.Vpc + if len(vpcFilter) > 0 { IVpc, err := VpcManager.FetchByIdOrName(userCred, vpcFilter) if err != nil { return nil, httperrors.NewResourceNotFoundError("Vpc %s not found", vpcFilter) @@ -355,7 +344,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("id", sq) } - diskFilter, _ := queryDict.GetString("disk") + diskFilter := query.Disk if len(diskFilter) > 0 { diskI, _ := DiskManager.FetchByIdOrName(userCred, diskFilter) if diskI == nil { @@ -382,7 +371,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } } - regionFilter, _ := queryDict.GetString("region") + regionFilter := query.CloudregionStr() if len(regionFilter) > 0 { regionObj, err := CloudregionManager.FetchByIdOrName(userCred, regionFilter) if err != nil { @@ -400,47 +389,45 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", sq) } - withEip, _ := queryDict.GetString("with_eip") - withoutEip, _ := queryDict.GetString("without_eip") - if len(withEip) > 0 || len(withoutEip) > 0 { + withEip := (query.WithEip != nil && *query.WithEip) + withoutEip := (query.WithoutEip != nil && *query.WithoutEip) + if withEip || withoutEip { eips := ElasticipManager.Query().SubQuery() sq := eips.Query(eips.Field("associate_id")).Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER) sq = sq.IsNotNull("associate_id").IsNotEmpty("associate_id") - if utils.ToBool(withEip) { + if withEip { q = q.In("id", sq) - } else if utils.ToBool(withoutEip) { + } else if withoutEip { q = q.NotIn("id", sq) } } - gpu, _ := queryDict.GetString("gpu") - if len(gpu) != 0 { + if query.Gpu != nil { isodev := IsolatedDeviceManager.Query().SubQuery() sgq := isodev.Query(isodev.Field("guest_id")). Filter(sqlchemy.AND( sqlchemy.IsNotNull(isodev.Field("guest_id")), sqlchemy.Startswith(isodev.Field("dev_type"), "GPU"))) - showGpu := utils.ToBool(gpu) cond := sqlchemy.NotIn - if showGpu { + if *query.Gpu { cond = sqlchemy.In } q = q.Filter(cond(q.Field("id"), sgq)) } - groupFilter := jsonutils.GetAnyString(queryDict, []string{"group", "group_id"}) + groupFilter := query.GroupStr() if len(groupFilter) != 0 { groupObj, err := GroupManager.FetchByIdOrName(userCred, groupFilter) if err != nil { return nil, httperrors.NewNotFoundError("group %s not found", groupFilter) } - queryDict.Add(jsonutils.NewString(groupObj.GetId()), "group") + // queryDict.Add(jsonutils.NewString(groupObj.GetId()), "group") ggSub := GroupguestManager.Query("guest_id").Equals("group_id", groupObj.GetId()).SubQuery() q = q.Join(ggSub, sqlchemy.Equals(ggSub.Field("guest_id"), q.Field("id"))) } - orderByDisk, _ := queryDict.GetString("order_by_disk") + orderByDisk := query.OrderByDisk if orderByDisk == "asc" || orderByDisk == "desc" { guestdisks := GuestdiskManager.Query().SubQuery() disks := DiskManager.Query().SubQuery() @@ -461,7 +448,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } } - orderByHost, _ := queryDict.GetString("order_by_host") + orderByHost := query.OrderByHost if orderByHost == "asc" { hosts := HostManager.Query().SubQuery() q = q.Join(hosts, sqlchemy.Equals(q.Field("host_id"), hosts.Field("id"))). diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 1421e30982..6bcdf109a9 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -170,25 +170,21 @@ func (self *SHost) AllowDeleteItem(ctx context.Context, userCred mcclient.TokenC return db.IsAdminAllowDelete(userCred, self) } -func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.HostListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = managedResourceFilterByDomain(q, query, "", nil) + q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByDomain") } - queryDict := query.(*jsonutils.JSONDict) - - resType, _ := query.GetString("resource_type") + resType := query.ResourceType if len(resType) > 0 { - queryDict.Remove("resource_type") - switch resType { case api.HostResourceTypeShared: q = q.Filter( @@ -202,12 +198,12 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } } - q, err = manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager.ListItemFilter") } - anyMac, _ := query.GetString("any_mac") + anyMac := query.AnyMac if len(anyMac) > 0 { anyMac := netutils.FormatMacAddr(anyMac) if len(anyMac) == 0 { @@ -222,7 +218,7 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } // var scopeQuery *sqlchemy.SSubQuery - schedTagStr := jsonutils.GetAnyString(query, []string{"schedtag", "schedtag_id"}) + schedTagStr := query.SchedtagStr() if len(schedTagStr) > 0 { schedTag, _ := SchedtagManager.FetchByIdOrName(nil, schedTagStr) if schedTag == nil { @@ -233,7 +229,7 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", scopeQuery) } - wireStr := jsonutils.GetAnyString(query, []string{"wire", "wire_id"}) + wireStr := query.WireStr() if len(wireStr) > 0 { wire, _ := WireManager.FetchByIdOrName(nil, wireStr) if wire == nil { @@ -244,8 +240,7 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", scopeQuery) } - storageStr := jsonutils.GetAnyString(query, []string{"storage", "storage_id"}) - notAttached := jsonutils.QueryBoolean(query, "storage_not_attached", false) + storageStr := query.StorageStr() if len(storageStr) > 0 { storage, _ := StorageManager.FetchByIdOrName(nil, storageStr) if storage == nil { @@ -253,6 +248,7 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } hoststorages := HoststorageManager.Query().SubQuery() scopeQuery := hoststorages.Query(hoststorages.Field("host_id")).Equals("storage_id", storage.GetId()).SubQuery() + notAttached := (query.StorageNotAttached != nil && *query.StorageNotAttached) if !notAttached { q = q.In("id", scopeQuery) } else { @@ -260,39 +256,19 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } } - q, err = managedResourceFilterByZone(q, query, "", nil) - /*zoneStr := jsonutils.GetAnyString(query, []string{"zone", "zone_id"}) - if len(zoneStr) > 0 { - zone, err := ZoneManager.FetchByIdOrName(nil, zoneStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(ZoneManager.Keyword(), zoneStr) - } - return nil, httperrors.NewGeneralError(err) - } - q = q.Filter(sqlchemy.Equals(q.Field("zone_id"), zone.GetId())) + q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByZone") + } - queryDict.Remove("zone_id") - }*/ - - q, err = managedResourceFilterByRegion(q, query, "zone_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "zone_id", func() *sqlchemy.SQuery { return ZoneManager.Query("id") }) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") + } - /*regionStr := jsonutils.GetAnyString(query, []string{"region", "region_id"}) - if len(regionStr) > 0 { - region, err := CloudregionManager.FetchByIdOrName(nil, regionStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudregionManager.Keyword(), regionStr) - } - return nil, httperrors.NewGeneralError(err) - } - subq := ZoneManager.Query("id").Equals("cloudregion_id", region.GetId()).SubQuery() - q = q.Filter(sqlchemy.In(q.Field("zone_id"), subq)) - }*/ - - hypervisorStr := jsonutils.GetAnyString(query, []string{"hypervisor"}) + hypervisorStr := query.Hypervisor if len(hypervisorStr) > 0 { hostType, ok := api.HYPERVISOR_HOSTTYPE[hypervisorStr] if !ok { @@ -301,7 +277,7 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.Filter(sqlchemy.Equals(q.Field("host_type"), hostType)) } - usable := jsonutils.QueryBoolean(query, "usable", false) + usable := (query.Usable != nil && *query.Usable) if usable { hosts := HostManager.Query().SubQuery() hostwires := HostwireManager.Query().SubQuery() @@ -347,8 +323,8 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu ) } - if query.Contains("is_empty") { - isEmpty := jsonutils.QueryBoolean(query, "is_empty", false) + if query.IsEmpty != nil { + isEmpty := *query.IsEmpty sq := GuestManager.Query("host_id").IsNotEmpty("host_id").GroupBy("host_id").SubQuery() if isEmpty { q = q.NotIn("id", sq) @@ -357,8 +333,8 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } } - if query.Contains("baremetal") { - isBaremetal := jsonutils.QueryBoolean(query, "baremetal", false) + if query.Baremetal != nil { + isBaremetal := *query.Baremetal if isBaremetal { q = q.Equals("host_type", api.HOST_TYPE_BAREMETAL) } else { diff --git a/pkg/compute/models/instance_snapshots.go b/pkg/compute/models/instance_snapshots.go index 02a6ae2c33..e047db8af2 100644 --- a/pkg/compute/models/instance_snapshots.go +++ b/pkg/compute/models/instance_snapshots.go @@ -17,7 +17,6 @@ package models import ( "context" "database/sql" - "fmt" "yunion.io/x/jsonutils" "yunion.io/x/log" @@ -25,7 +24,7 @@ import ( "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" - "yunion.io/x/onecloud/pkg/apis/compute" + api "yunion.io/x/onecloud/pkg/apis/compute" schedapi "yunion.io/x/onecloud/pkg/apis/scheduler" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" @@ -72,14 +71,25 @@ func (manager *SInstanceSnapshotManager) AllowCreateItem( return false } -func (manager *SInstanceSnapshotManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - queryDict, ok := query.(*jsonutils.JSONDict) - if !ok { - return nil, fmt.Errorf("invalid querystring format") +func (manager *SInstanceSnapshotManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.InstanceSnapshotListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - if guestId, _ := queryDict.GetString("guest_id"); len(guestId) > 0 { - q = q.Equals("guest_id", guestId) + + guestStr := query.GuestStr() + if len(guestStr) > 0 { + guestObj, err := GuestManager.FetchByIdOrName(userCred, guestStr) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2("guests", guestStr) + } else { + return nil, httperrors.NewGeneralError(err) + } + } + q = q.Equals("guest_id", guestObj.GetId()) } + return q, nil } @@ -102,7 +112,7 @@ func (self *SInstanceSnapshot) getMoreDetails(userCred mcclient.TokenCredential, snapshots, _ := self.GetSnapshots() snapshotsDesc := jsonutils.NewArray() for i := 0; i < len(snapshots); i++ { - if snapshots[i].DiskType == compute.DISK_TYPE_SYS { + if snapshots[i].DiskType == api.DISK_TYPE_SYS { osType = snapshots[i].OsType } jsonDict := jsonutils.Marshal(&snapshots[i]).(*jsonutils.JSONDict) @@ -221,7 +231,7 @@ func (manager *SInstanceSnapshotManager) CreateInstanceSnapshot( } func (self *SInstanceSnapshot) ToInstanceCreateInput( - sourceInput *compute.ServerCreateInput) (*compute.ServerCreateInput, error) { + sourceInput *api.ServerCreateInput) (*api.ServerCreateInput, error) { serverConfig := new(schedapi.ServerConfig) if err := self.ServerConfig.Unmarshal(serverConfig); err != nil { @@ -286,7 +296,7 @@ func (self *SInstanceSnapshot) GetInstanceSnapshotJointAt(diskIndex int) (*SInst } func (self *SInstanceSnapshot) ValidateDeleteCondition(ctx context.Context) error { - if self.Status == compute.INSTANCE_SNAPSHOT_START_DELETE { + if self.Status == api.INSTANCE_SNAPSHOT_START_DELETE { return httperrors.NewBadRequestError("can't delete snapshot in deleting") } return nil @@ -308,7 +318,7 @@ func (self *SInstanceSnapshot) StartInstanceSnapshotDeleteTask( log.Errorf("%s", err) return err } - self.SetStatus(userCred, compute.INSTANCE_SNAPSHOT_START_DELETE, "InstanceSnapshotDeleteTask") + self.SetStatus(userCred, api.INSTANCE_SNAPSHOT_START_DELETE, "InstanceSnapshotDeleteTask") task.ScheduleRun(nil) return nil } diff --git a/pkg/compute/models/isolated_devices.go b/pkg/compute/models/isolated_devices.go index 873019c443..aee7f0787b 100644 --- a/pkg/compute/models/isolated_devices.go +++ b/pkg/compute/models/isolated_devices.go @@ -16,13 +16,13 @@ package models import ( "context" - "database/sql" "fmt" "strings" "time" "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" @@ -136,23 +136,26 @@ func (self *SIsolatedDevice) AllowUpdateItem(ctx context.Context, userCred mccli return db.IsAdminAllowUpdate(userCred, self) } -func (manager *SIsolatedDeviceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SIsolatedDeviceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.IsolatedDeviceListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - q, err = managedResourceFilterByDomain(q, query, "host_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "host_id", func() *sqlchemy.SQuery { return HostManager.Query("id") }) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByDomain") + } - if jsonutils.QueryBoolean(query, "gpu", false) { + if query.Gpu != nil && *query.Gpu { q = q.Startswith("dev_type", "GPU") } - if jsonutils.QueryBoolean(query, "usb", false) { + if query.Usb != nil && *query.Usb { q = q.Equals("dev_type", "USB") } - hostStr, _ := query.GetString("host") + hostStr := query.Host var sq *sqlchemy.SSubQuery if len(hostStr) > 0 { hosts := HostManager.Query().SubQuery() @@ -163,32 +166,29 @@ func (manager *SIsolatedDeviceManager) ListItemFilter(ctx context.Context, q *sq if sq != nil { q = q.Filter(sqlchemy.In(q.Field("host_id"), sq)) } - if jsonutils.QueryBoolean(query, "unused", false) { + if query.Unused != nil && *query.Unused { q = q.IsEmpty("guest_id") } - regionStr := jsonutils.GetAnyString(query, []string{"region", "region_id"}) - if len(regionStr) > 0 { - region, err := CloudregionManager.FetchByIdOrName(nil, regionStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudregionManager.Keyword(), regionStr) - } - return nil, httperrors.NewGeneralError(err) - } + + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "host_id", func() *sqlchemy.SQuery { hosts := HostManager.Query().SubQuery() - subq := ZoneManager.Query("id").Equals("cloudregion_id", region.GetId()).SubQuery() - q.Join(hosts, sqlchemy.Equals(q.Field("host_id"), hosts.Field("id"))).Filter(sqlchemy.In(hosts.Field("zone_id"), subq)) + zones := ZoneManager.Query().SubQuery() + + q := hosts.Query(hosts.Field("id")) + q = q.Join(zones, sqlchemy.Equals(hosts.Field("zone_id"), zones.Field("id"))) + return q + }) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - zoneStr := jsonutils.GetAnyString(query, []string{"zone", "zone_id"}) - if len(zoneStr) > 0 { - zone, _ := ZoneManager.FetchByIdOrName(nil, zoneStr) - if zone == nil { - return nil, httperrors.NewResourceNotFoundError("Zone %s not found", zoneStr) - } - hosts := HostManager.Query().SubQuery() - sq := hosts.Query(hosts.Field("id")).Filter(sqlchemy.Equals(hosts.Field("zone_id"), zone.GetId())) - q = q.Filter(sqlchemy.In(q.Field("host_id"), sq)) + + q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "host_id", func() *sqlchemy.SQuery { + return HostManager.Query("id") + }) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByZone") } + return q, nil } diff --git a/pkg/compute/models/keypairs.go b/pkg/compute/models/keypairs.go index 639644f828..c6ec528c42 100644 --- a/pkg/compute/models/keypairs.go +++ b/pkg/compute/models/keypairs.go @@ -24,6 +24,7 @@ import ( "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" @@ -61,13 +62,13 @@ type SKeypair struct { OwnerId string `width:"128" charset:"ascii" index:"true" nullable:"false" create:"required"` // Column(VARCHAR(length=36, charset='ascii'), index=True, nullable=False) } -func (manager *SKeypairManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SKeypairManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.KeypairListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { return nil, err } - if jsonutils.QueryBoolean(query, "admin", false) && db.IsAdminAllowList(userCred, manager) { - user, _ := query.GetString("user") + if query.Admin != nil && *query.Admin && db.IsAdminAllowList(userCred, manager) { + user := query.UserStr() if len(user) > 0 { uc, _ := db.UserCacheManager.FetchUserByIdOrName(ctx, user) if uc == nil { diff --git a/pkg/compute/models/loadbalanceragents.go b/pkg/compute/models/loadbalanceragents.go index 2a05698d03..cf3f60510f 100644 --- a/pkg/compute/models/loadbalanceragents.go +++ b/pkg/compute/models/loadbalanceragents.go @@ -25,6 +25,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/gotypes" "yunion.io/x/sqlchemy" @@ -379,12 +380,12 @@ func (man *SLoadbalancerAgentManager) ValidateCreateData(ctx context.Context, us return data, nil } -func (man *SLoadbalancerAgentManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (man *SLoadbalancerAgentManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.LoadbalancerAgentListInput) (*sqlchemy.SQuery, error) { + q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "cluster", ModelKeyword: "loadbalancercluster", OwnerId: userCred}, }) diff --git a/pkg/compute/models/loadbalancerbackendgroups.go b/pkg/compute/models/loadbalancerbackendgroups.go index 365b319b40..77d70bddb6 100644 --- a/pkg/compute/models/loadbalancerbackendgroups.go +++ b/pkg/compute/models/loadbalancerbackendgroups.go @@ -75,13 +75,13 @@ func (man *SLoadbalancerBackendGroupManager) pendingDeleteSubs(ctx context.Conte } } -func (man *SLoadbalancerBackendGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (man *SLoadbalancerBackendGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.LoadbalancerBackendGroupListInput) (*sqlchemy.SQuery, error) { + q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } // userProjId := userCred.GetProjectId() - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "loadbalancer", ModelKeyword: "loadbalancer", OwnerId: userCred}, {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred}, @@ -91,7 +91,7 @@ func (man *SLoadbalancerBackendGroupManager) ListItemFilter(ctx context.Context, return nil, err } - if noRef, _ := data.Bool("no_ref"); noRef { + if query.NoRef != nil && *query.NoRef { q, err = man.FilterZeroRefBackendGroup(q) if err != nil { log.Errorf("SLoadbalancerBackendGroupManager ListItemFilter %s", err) diff --git a/pkg/compute/models/loadbalancerbackends.go b/pkg/compute/models/loadbalancerbackends.go index e0d8727246..6ffecc598d 100644 --- a/pkg/compute/models/loadbalancerbackends.go +++ b/pkg/compute/models/loadbalancerbackends.go @@ -82,13 +82,13 @@ func (man *SLoadbalancerBackendManager) pendingDeleteSubs(ctx context.Context, u } } -func (man *SLoadbalancerBackendManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (man *SLoadbalancerBackendManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.LoadbalancerBackendListInput) (*sqlchemy.SQuery, error) { + q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } // userProjId := userCred.GetProjectId() - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "backend_group", ModelKeyword: "loadbalancerbackendgroup", OwnerId: userCred}, {Key: "backend", ModelKeyword: "server", OwnerId: userCred}, // NOTE extend this when new backend_type was added diff --git a/pkg/compute/models/loadbalancercertificates.go b/pkg/compute/models/loadbalancercertificates.go index 6ab000a78b..5718d7bfee 100644 --- a/pkg/compute/models/loadbalancercertificates.go +++ b/pkg/compute/models/loadbalancercertificates.go @@ -27,6 +27,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" @@ -219,16 +220,15 @@ func (man *SLoadbalancerCertificateManager) validateCertKey(ctx context.Context, return data, nil } -func (man *SLoadbalancerCertificateManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (man *SLoadbalancerCertificateManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.LoadbalancerCertificateListInput) (*sqlchemy.SQuery, error) { + q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) - if jsonutils.QueryBoolean(query, "usable", false) { - region, _ := data.GetString("cloudregion") - manager, _ := data.GetString("manager") + if query.Usable != nil && *query.Usable { + region := query.CloudregionStr() + manager := query.CloudproviderStr() // 证书可用包含两类:1.本地证书内容不为空 2.公有云中已经存在,但是证书内容不完整的证书 if len(region) > 0 || len(manager) > 0 { diff --git a/pkg/compute/models/loadbalancerclusters.go b/pkg/compute/models/loadbalancerclusters.go index bb191b5f56..56d64bcd30 100644 --- a/pkg/compute/models/loadbalancerclusters.go +++ b/pkg/compute/models/loadbalancerclusters.go @@ -23,6 +23,7 @@ import ( "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/validators" "yunion.io/x/onecloud/pkg/httperrors" @@ -73,12 +74,12 @@ func (lbc *SLoadbalancerCluster) AllowDeleteItem(ctx context.Context, userCred m return db.IsAdminAllowDelete(userCred, lbc) } -func (man *SLoadbalancerClusterManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (man *SLoadbalancerClusterManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.LoadbalancerClusterListInput) (*sqlchemy.SQuery, error) { + q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "zone", ModelKeyword: "zone", OwnerId: userCred}, {Key: "wire", ModelKeyword: "wire", OwnerId: userCred}, diff --git a/pkg/compute/models/loadbalancerlistenerrules.go b/pkg/compute/models/loadbalancerlistenerrules.go index 6fadb58133..efe71d0a6e 100644 --- a/pkg/compute/models/loadbalancerlistenerrules.go +++ b/pkg/compute/models/loadbalancerlistenerrules.go @@ -379,13 +379,13 @@ func (man *SLoadbalancerListenerRuleManager) pendingDeleteSubs(ctx context.Conte } } -func (man *SLoadbalancerListenerRuleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (man *SLoadbalancerListenerRuleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.LoadbalancerListenerRuleListInput) (*sqlchemy.SQuery, error) { + q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } // userProjId := userCred.GetProjectId() - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "listener", ModelKeyword: "loadbalancerlistener", OwnerId: userCred}, {Key: "backend_group", ModelKeyword: "loadbalancerbackendgroup", OwnerId: userCred}, diff --git a/pkg/compute/models/loadbalancerlisteners.go b/pkg/compute/models/loadbalancerlisteners.go index 296d790126..5fbd9f2ba8 100644 --- a/pkg/compute/models/loadbalancerlisteners.go +++ b/pkg/compute/models/loadbalancerlisteners.go @@ -195,19 +195,28 @@ func (man *SLoadbalancerListenerManager) pendingDeleteSubs(ctx context.Context, } } -func (man *SLoadbalancerListenerManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (man *SLoadbalancerListenerManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.LoadbalancerListenerListInput) (*sqlchemy.SQuery, error) { + q, err := man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByAccount") + } + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") + } + // userProjId := userCred.GetProjectId() - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "loadbalancer", ModelKeyword: "loadbalancer", OwnerId: userCred}, {Key: "backend_group", ModelKeyword: "loadbalancerbackendgroup", OwnerId: userCred}, {Key: "acl", ModelKeyword: "cachedloadbalanceracl", OwnerId: userCred}, - {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred}, - {Key: "manager", ModelKeyword: "cloudprovider", OwnerId: userCred}, + // {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred}, + // {Key: "manager", ModelKeyword: "cloudprovider", OwnerId: userCred}, }) if err != nil { return nil, err diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index ec0704c817..a8dcc68d81 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -92,25 +92,33 @@ type SLoadbalancer struct { LBInfo jsonutils.JSONObject `charset:"utf8" nullable:"true" list:"user" update:"admin" create:"admin_optional"` } -func (man *SLoadbalancerManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (man *SLoadbalancerManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.LoadbalancerListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") + } + + q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByZone") + } + ownerId := userCred - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "network", ModelKeyword: "network", OwnerId: ownerId}, - {Key: "zone", ModelKeyword: "zone", OwnerId: ownerId}, - {Key: "manager", ModelKeyword: "cloudprovider", OwnerId: ownerId}, - {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: ownerId}, {Key: "cluster", ModelKeyword: "loadbalancercluster", OwnerId: userCred}, }) if err != nil { diff --git a/pkg/compute/models/managedresource.go b/pkg/compute/models/managedresource.go index dd12344b13..d4f5a1d241 100644 --- a/pkg/compute/models/managedresource.go +++ b/pkg/compute/models/managedresource.go @@ -24,6 +24,7 @@ import ( "yunion.io/x/log" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/appctx" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -145,10 +146,9 @@ func (self *SManagedResourceBase) IsManaged() bool { return len(self.ManagerId) > 0 } -func managedResourceFilterByDomain(q *sqlchemy.SQuery, query jsonutils.JSONObject, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { - domainStr, key := jsonutils.GetAnyString2(query, []string{"domain_id", "project_domain", "project_domain_id"}) +func managedResourceFilterByDomain(q *sqlchemy.SQuery, query apis.DomainizedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { + domainStr := query.DomainStr() if len(domainStr) > 0 { - query.(*jsonutils.JSONDict).Remove(key) domain, err := db.TenantCacheManager.FetchDomainByIdOrName(context.Background(), domainStr) if err != nil { if err == sql.ErrNoRows { @@ -231,7 +231,7 @@ func filterByProviderStrs(q *sqlchemy.SQuery, filterField string, subqFunc func( return q } -func managedResourceFilterByAccountV2(q *sqlchemy.SQuery, input *api.CloudaccountListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { +func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { // deprecate at 3.0 for _, provider := range []string{input.Cloudprovider, input.Manager, input.ManagerId, input.CloudproviderId} { if len(provider) > 0 { @@ -293,75 +293,9 @@ func managedResourceFilterByAccountV2(q *sqlchemy.SQuery, input *api.Cloudaccoun return q, nil } -func managedResourceFilterByAccount(q *sqlchemy.SQuery, query jsonutils.JSONObject, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { - queryDict := query.(*jsonutils.JSONDict) - - managerStr, key := jsonutils.GetAnyString2(query, []string{"manager", "cloudprovider", "cloudprovider_id", "manager_id"}) - if len(managerStr) > 0 { - queryDict.Remove("manager") - queryDict.Remove(key) - provider, err := CloudproviderManager.FetchByIdOrName(nil, managerStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr) - } - return nil, httperrors.NewGeneralError(err) - } - if len(filterField) == 0 { - q = q.Filter(sqlchemy.Equals(q.Field("manager_id"), provider.GetId())) - queryDict.Remove("manager_id") - } else { - sq := subqFunc() - sq = sq.Filter(sqlchemy.Equals(sq.Field("manager_id"), provider.GetId())) - q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) - queryDict.Remove(filterField) - } - } - - accountStr, key := jsonutils.GetAnyString2(query, []string{"account", "account_id", "cloudaccount", "cloudaccount_id"}) - if len(accountStr) > 0 { - queryDict.Remove("account") - queryDict.Remove(key) - account, err := CloudaccountManager.FetchByIdOrName(nil, accountStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), accountStr) - } - return nil, httperrors.NewGeneralError(err) - } - subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", account.GetId()).SubQuery() - if len(filterField) == 0 { - q = q.Filter(sqlchemy.In(q.Field("manager_id"), subq)) - queryDict.Remove("manager_id") - } else { - sq := subqFunc() - sq = sq.Filter(sqlchemy.In(sq.Field("manager_id"), subq)) - q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) - queryDict.Remove(filterField) - } - } - - providerStrs := jsonutils.GetQueryStringArray(query, "provider") - if len(providerStrs) > 0 { - q = filterByProviderStrs(q, filterField, subqFunc, "provider", providerStrs) - queryDict.Remove(filterField) - queryDict.Remove("provider") - } - - brandStrs := jsonutils.GetQueryStringArray(query, "brand") - if len(brandStrs) > 0 { - q = filterByProviderStrs(q, filterField, subqFunc, "brand", brandStrs) - queryDict.Remove(filterField) - queryDict.Remove("brand") - } - - return q, nil -} - -func managedResourceFilterByZone(q *sqlchemy.SQuery, query jsonutils.JSONObject, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { - zoneStr, key := jsonutils.GetAnyString2(query, []string{"zone", "zone_id"}) +func managedResourceFilterByZone(q *sqlchemy.SQuery, query api.ZonalResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { + zoneStr := query.ZoneStr() if len(zoneStr) > 0 { - query.(*jsonutils.JSONDict).Remove(key) zoneObj, err := ZoneManager.FetchByIdOrName(nil, zoneStr) if err != nil { if err == sql.ErrNoRows { @@ -381,10 +315,9 @@ func managedResourceFilterByZone(q *sqlchemy.SQuery, query jsonutils.JSONObject, return q, nil } -func managedResourceFilterByRegion(q *sqlchemy.SQuery, query jsonutils.JSONObject, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { - regionStr, key := jsonutils.GetAnyString2(query, []string{"region", "region_id", "cloudregion", "cloudregion_id"}) +func managedResourceFilterByRegion(q *sqlchemy.SQuery, query api.RegionalResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { + regionStr := query.CloudregionStr() if len(regionStr) > 0 { - query.(*jsonutils.JSONDict).Remove(key) regionObj, err := CloudregionManager.FetchByIdOrName(nil, regionStr) if err != nil { if err == sql.ErrNoRows { @@ -394,23 +327,27 @@ func managedResourceFilterByRegion(q *sqlchemy.SQuery, query jsonutils.JSONObjec } } if len(filterField) == 0 { - q = q.Filter(sqlchemy.In(q.Field("cloudregion_id"), regionObj.GetId())) + q = q.Filter(sqlchemy.Equals(q.Field("cloudregion_id"), regionObj.GetId())) } else { sq := subqFunc() - sq = sq.Filter(sqlchemy.In(sq.Field("cloudregion_id"), regionObj.GetId())) + sq = sq.Filter(sqlchemy.Equals(sq.Field("cloudregion_id"), regionObj.GetId())) + q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) + } + } + if len(query.City) > 0 { + subq := CloudregionManager.Query("id").Equals("city", query.City).SubQuery() + if len(filterField) == 0 { + q = q.Filter(sqlchemy.In(q.Field("cloudregion_id"), subq)) + } else { + sq := subqFunc() + sq = sq.Filter(sqlchemy.In(sq.Field("cloudregion_id"), subq)) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } } return q, nil } -func managedResourceFilterByCloudType(q *sqlchemy.SQuery, query jsonutils.JSONObject, filterField string, subqFunc func() *sqlchemy.SQuery) *sqlchemy.SQuery { - input := &api.CloudTypeListInput{} - query.Unmarshal(input) - return managedResourceFilterByCloudTypeV2(q, input, filterField, subqFunc) -} - -func managedResourceFilterByCloudTypeV2(q *sqlchemy.SQuery, input *api.CloudTypeListInput, filterField string, subqFunc func() *sqlchemy.SQuery) *sqlchemy.SQuery { +func managedResourceFilterByCloudType(q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) *sqlchemy.SQuery { if input.CloudEnv == api.CLOUD_ENV_PUBLIC_CLOUD || input.PublicCloud || input.IsPublic { if len(filterField) == 0 { q = q.Filter(sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPublicProviderIdsQuery())) diff --git a/pkg/compute/models/natdtable.go b/pkg/compute/models/natdtable.go index f0b03a4c7d..274daeb567 100644 --- a/pkg/compute/models/natdtable.go +++ b/pkg/compute/models/natdtable.go @@ -64,12 +64,12 @@ type SNatDEntry struct { IpProtocol string `width:"8" charset:"ascii" list:"user" create:"required"` } -func (man *SNatDEntryManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SNatEntryManager.ListItemFilter(ctx, q, userCred, query) +func (man *SNatDEntryManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.NatDEntryListInput) (*sqlchemy.SQuery, error) { + q, err := man.SNatEntryManager.ListItemFilter(ctx, q, userCred, query.NatEntryListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SNatEntryManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) return validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "natgateway", ModelKeyword: "natgateway", OwnerId: userCred}, }) diff --git a/pkg/compute/models/natgateways.go b/pkg/compute/models/natgateways.go index d2b9d13ca6..e3bbc9df6a 100644 --- a/pkg/compute/models/natgateways.go +++ b/pkg/compute/models/natgateways.go @@ -89,12 +89,12 @@ func (self *SNatGateway) AllowDeleteItem(ctx context.Context, userCred mcclient. return db.IsAdminAllowDelete(userCred, self) } -func (man *SNatGetewayManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (man *SNatGetewayManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.NatGetewayListInput) (*sqlchemy.SQuery, error) { + q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "vpc", ModelKeyword: "vpc", OwnerId: userCred}, {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred}, @@ -102,9 +102,9 @@ func (man *SNatGetewayManager) ListItemFilter(ctx context.Context, q *sqlchemy.S if err != nil { return nil, err } - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } return q, nil } @@ -596,13 +596,13 @@ func (self *SNatEntry) GetNatgateway() (*SNatGateway, error) { return model.(*SNatGateway), nil } -func (man *SNatEntryManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (man *SNatEntryManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.NatEntryListInput) (*sqlchemy.SQuery, error) { + q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - q, err = managedResourceFilterByAccount(q, query, "natgateway_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "natgateway_id", func() *sqlchemy.SQuery { natgateways := NatGatewayManager.Query().SubQuery() return natgateways.Query(natgateways.Field("id")) }) diff --git a/pkg/compute/models/natstable.go b/pkg/compute/models/natstable.go index 5431ac545b..41f5f5b88b 100644 --- a/pkg/compute/models/natstable.go +++ b/pkg/compute/models/natstable.go @@ -74,12 +74,12 @@ func (self *SNatSEntry) GetNetwork() (*SNetwork, error) { return _network.(*SNetwork), nil } -func (man *SNatSEntryManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := man.SNatEntryManager.ListItemFilter(ctx, q, userCred, query) +func (man *SNatSEntryManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.NatSEntryListInput) (*sqlchemy.SQuery, error) { + q, err := man.SNatEntryManager.ListItemFilter(ctx, q, userCred, query.NatEntryListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SNatEntryManager.ListItemFilter") } - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) return validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "network", ModelKeyword: "network", OwnerId: userCred}, {Key: "natgateway", ModelKeyword: "natgateway", OwnerId: userCred}, diff --git a/pkg/compute/models/networkinterfaces.go b/pkg/compute/models/networkinterfaces.go index ab9f859858..6347728232 100644 --- a/pkg/compute/models/networkinterfaces.go +++ b/pkg/compute/models/networkinterfaces.go @@ -85,21 +85,21 @@ func (self *SNetworkInterface) AllowDeleteItem(ctx context.Context, userCred mcc return db.IsAdminAllowDelete(userCred, self) } -func (manager *SNetworkInterfaceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SNetworkInterfaceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.NetworkInterfaceListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } - return q, err + return q, nil } func (self *SNetworkInterface) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index e40d82d86e..0288688a18 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -1731,10 +1731,10 @@ func (manager *SNetworkManager) CustomizeFilterList(ctx context.Context, q *sqlc return filters, nil } -func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input *api.NetworkListInput) (*sqlchemy.SQuery, error) { +func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.NetworkListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccountV2(q, &input.CloudaccountListInput, "wire_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByAccount(q, input.ManagedResourceListInput, "wire_id", func() *sqlchemy.SQuery { wires := WireManager.Query().SubQuery() vpcs := VpcManager.Query().SubQuery() @@ -1743,10 +1743,10 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. return subq }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudTypeV2(q, &input.CloudTypeListInput, "wire_id", func() *sqlchemy.SQuery { + q = managedResourceFilterByCloudType(q, input.ManagedResourceListInput, "wire_id", func() *sqlchemy.SQuery { wires := WireManager.Query().SubQuery() vpcs := VpcManager.Query().SubQuery() subq := wires.Query(wires.Field("id")) @@ -1754,24 +1754,21 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. return subq }) - q, err = manager.SSharableVirtualResourceBaseManager.ListItemFilterV2(ctx, q, userCred, &input.StandaloneResourceListInput) + q, err = manager.SSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, input.SharableVirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter") } - if len(input.Zone) > 0 { - input.Zones = append(input.Zones, input.Zone) - } - - if len(input.Zones) > 0 { + zoneList := input.ZoneList() + if len(zoneList) > 0 { zq := ZoneManager.Query().SubQuery() regions := CloudregionManager.Query().SubQuery() zoneQ := zq.Query(zq.Field("id"), regions.Field("id"), regions.Field("provider")). Join(regions, sqlchemy.Equals(zq.Field("cloudregion_id"), regions.Field("id"))). Filter( sqlchemy.OR( - sqlchemy.In(zq.Field("id"), input.Zones), - sqlchemy.In(zq.Field("name"), input.Zones), + sqlchemy.In(zq.Field("id"), zoneList), + sqlchemy.In(zq.Field("name"), zoneList), ), ) rows, err := zoneQ.Rows() @@ -1811,42 +1808,25 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. q = q.In("wire_id", sq.SubQuery()) } - if len(input.Vpc) > 0 { - vpcObj, err := VpcManager.FetchByIdOrName(userCred, input.Vpc) + vpcStr := input.VpcStr() + if len(vpcStr) > 0 { + vpcObj, err := VpcManager.FetchByIdOrName(userCred, vpcStr) if err != nil { - return nil, httperrors.NewNotFoundError("VPC %s not found", input.Vpc) + return nil, httperrors.NewNotFoundError("VPC %s not found", vpcStr) } sq := WireManager.Query("id").Equals("vpc_id", vpcObj.GetId()) q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery())) } - // deprecate at 3.0 - for _, region := range []string{input.Cloudregion, input.CloudregionId, input.Region, input.RegionId} { - if len(region) > 0 { - input.Cloudregion = region - break - } - } - - if len(input.Cloudregion) > 0 { - region, err := CloudregionManager.FetchByIdOrName(userCred, input.Cloudregion) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError("cloud region %s not found", input.Cloudregion) - } else { - return nil, httperrors.NewGeneralError(err) - } - } + q, err = managedResourceFilterByRegion(q, input.RegionalResourceListInput, "wire_id", func() *sqlchemy.SQuery { wires := WireManager.Query().SubQuery() vpcs := VpcManager.Query().SubQuery() sq := wires.Query(wires.Field("id")). - Join(vpcs, sqlchemy.AND( - sqlchemy.Equals(vpcs.Field("cloudregion_id"), region.GetId()), - sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id")))) - q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery())) - } + Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))) + return sq + }) - if input.Usable { + if input.Usable != nil && *input.Usable { wires := WireManager.Query().SubQuery() zones := ZoneManager.Query().SubQuery() vpcs := VpcManager.Query().SubQuery() @@ -1876,26 +1856,16 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. q = q.In("wire_id", sq.SubQuery()).Equals("status", api.NETWORK_STATUS_AVAILABLE) } - if len(input.Host) > 0 { - hostObj, err := HostManager.FetchByIdOrName(userCred, input.Host) + hostStr:= input.HostStr() + if len(hostStr) > 0 { + hostObj, err := HostManager.FetchByIdOrName(userCred, hostStr) if err != nil { - return nil, httperrors.NewResourceNotFoundError2(HostManager.Keyword(), input.Host) + return nil, httperrors.NewResourceNotFoundError2(HostManager.Keyword(), hostStr) } sq := HostwireManager.Query("wire_id").Equals("host_id", hostObj.GetId()) q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery())) } - if len(input.City) > 0 { - regions := CloudregionManager.Query().SubQuery() - wires := WireManager.Query().SubQuery() - vpcs := VpcManager.Query().SubQuery() - sq := wires.Query(wires.Field("id")). - Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))). - Join(regions, sqlchemy.Equals(regions.Field("id"), vpcs.Field("cloudregion_id"))). - Filter(sqlchemy.Equals(regions.Field("city"), input.City)) - q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery())) - } - return q, nil } @@ -2223,7 +2193,13 @@ func (manager *SNetworkManager) PerformTryCreateNetwork(ctx context.Context, use ) q := NetworkManager.Query().Equals("server_type", input.ServerType).Equals("guest_ip_mask", input.Mask) - q = managedResourceFilterByCloudType(q, query, "wire_id", func() *sqlchemy.SQuery { + + listQuery := api.NetworkListInput{} + err = query.Unmarshal(&listQuery) + if err != nil { + return nil, errors.Wrap(err, "query.Unmarshal") + } + q = managedResourceFilterByCloudType(q, listQuery.ManagedResourceListInput, "wire_id", func() *sqlchemy.SQuery { wires := WireManager.Query().SubQuery() vpcs := VpcManager.Query().SubQuery() subq := wires.Query(wires.Field("id")) diff --git a/pkg/compute/models/reservedips.go b/pkg/compute/models/reservedips.go index b5b0c282bd..caba84efb4 100644 --- a/pkg/compute/models/reservedips.go +++ b/pkg/compute/models/reservedips.go @@ -180,20 +180,18 @@ func (self *SReservedip) GetCustomizeColumns(ctx context.Context, userCred mccli return extra } -func (manager *SReservedipManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SReservedipManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ReservedipListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ResourceBaseListInput) if err != nil { - log.Errorf("ListItemFilter %s", err) - return nil, err + return nil, errors.Wrap(err, "SResourceBaseManager.ListItemFilter") } - isAll := jsonutils.QueryBoolean(query, "all", false) - if !isAll { + if query.All == nil || *query.All == false { q = q.Filter(sqlchemy.OR( sqlchemy.IsNullOrEmpty(q.Field("expired_at")), sqlchemy.GT(q.Field("expired_at"), time.Now().UTC()), )) } - network, _ := query.GetString("network") + network := query.Network if len(network) > 0 { netObj, _ := NetworkManager.FetchByIdOrName(userCred, network) if netObj == nil { diff --git a/pkg/compute/models/routetables.go b/pkg/compute/models/routetables.go index 1caa2d7930..67af290d13 100644 --- a/pkg/compute/models/routetables.go +++ b/pkg/compute/models/routetables.go @@ -22,11 +22,13 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/gotypes" "yunion.io/x/pkg/util/compare" "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/validators" @@ -125,20 +127,20 @@ type SRouteTable struct { Routes *SRoutes `list:"user" update:"user" create:"required"` } -func (man *SRouteTableManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (man *SRouteTableManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.RouteTableListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { return nil, err } // userProjId := userCred.GetProjectId() - data := query.(*jsonutils.JSONDict) + data := jsonutils.Marshal(query).(*jsonutils.JSONDict) q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ {Key: "vpc", ModelKeyword: "vpc", OwnerId: userCred}, {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred}, @@ -148,49 +150,6 @@ func (man *SRouteTableManager) ListItemFilter(ctx context.Context, q *sqlchemy.S return nil, err } - /*managerStr := jsonutils.GetAnyString(query, []string{"manager", "cloudprovider", "cloudprovider_id", "manager_id"}) - if len(managerStr) > 0 { - provider, err := CloudproviderManager.FetchByIdOrName(nil, managerStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr) - } - return nil, httperrors.NewGeneralError(err) - } - sq := VpcManager.Query("id").Equals("manager_id", provider.GetId()) - q = q.In("vpc_id", sq.SubQuery()) - } - - accountStr := jsonutils.GetAnyString(query, []string{"account", "account_id", "cloudaccount", "cloudaccount_id"}) - if len(accountStr) > 0 { - account, err := CloudaccountManager.FetchByIdOrName(nil, accountStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), accountStr) - } - return nil, httperrors.NewGeneralError(err) - } - vpcs := VpcManager.Query().SubQuery() - cloudproviders := CloudproviderManager.Query().SubQuery() - - subq := vpcs.Query(vpcs.Field("id")) - subq = subq.Join(cloudproviders, sqlchemy.Equals(cloudproviders.Field("id"), vpcs.Field("manager_id"))) - subq = subq.Filter(sqlchemy.Equals(cloudproviders.Field("cloudaccount_id"), account.GetId())) - q = q.Filter(sqlchemy.In(q.Field("vpc_id"), subq.SubQuery())) - } - - providerStr := jsonutils.GetAnyString(query, []string{"provider"}) - if len(providerStr) > 0 { - vpcs := VpcManager.Query().SubQuery() - cloudproviders := CloudproviderManager.Query().SubQuery() - - subq := vpcs.Query(vpcs.Field("id")) - subq = subq.Join(cloudproviders, sqlchemy.Equals(cloudproviders.Field("id"), vpcs.Field("manager_id"))) - subq = subq.Filter(sqlchemy.Equals(cloudproviders.Field("provider"), providerStr)) - - q = q.Filter(sqlchemy.In(q.Field("vpc_id"), subq.SubQuery())) - }*/ - return q, nil } diff --git a/pkg/compute/models/schedtags.go b/pkg/compute/models/schedtags.go index 29ae3f3b5d..f3295aa27b 100644 --- a/pkg/compute/models/schedtags.go +++ b/pkg/compute/models/schedtags.go @@ -132,11 +132,11 @@ func (manager *SSchedtagManager) AllowListItems(ctx context.Context, userCred mc return true } -func (manager *SSchedtagManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - if resType := jsonutils.GetAnyString(query, []string{"type", "resource_type"}); resType != "" { +func (manager *SSchedtagManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.SchedtagListInput) (*sqlchemy.SQuery, error) { + if resType := query.ResourceTypeStr(); resType != "" { q = q.Equals("resource_type", resType) } - return manager.SResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + return manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) } func (self *SSchedtag) AllowGetDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool { diff --git a/pkg/compute/models/secgroupcache.go b/pkg/compute/models/secgroupcache.go index 4bbfae06cd..bdcc763dbd 100644 --- a/pkg/compute/models/secgroupcache.go +++ b/pkg/compute/models/secgroupcache.go @@ -74,12 +74,12 @@ func (self *SSecurityGroupCache) AllowUpdateItem(ctx context.Context, userCred m return false } -func (manager *SSecurityGroupCacheManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SSecurityGroupCacheManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.SecurityGroupCacheListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } - if defsecgroup, _ := query.GetString("secgroup"); len(defsecgroup) > 0 { + if defsecgroup := query.Secgroup; len(defsecgroup) > 0 { secgroup, err := SecurityGroupManager.FetchByIdOrName(userCred, defsecgroup) if err != nil { if err == sql.ErrNoRows { diff --git a/pkg/compute/models/secgrouprules.go b/pkg/compute/models/secgrouprules.go index 33df586876..65bf12a676 100644 --- a/pkg/compute/models/secgrouprules.go +++ b/pkg/compute/models/secgrouprules.go @@ -157,21 +157,26 @@ func (manager *SSecurityGroupRuleManager) FilterById(q *sqlchemy.SQuery, idStr s return q.Equals("id", idStr) } -func (manager *SSecurityGroupRuleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (sql *sqlchemy.SQuery, err error) { - if sql, err = manager.SResourceBaseManager.ListItemFilter(ctx, q, userCred, query); err != nil { - return nil, err +func (manager *SSecurityGroupRuleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.SecurityGroupRuleListInput) (*sqlchemy.SQuery, error) { + sql, err := manager.SResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SResourceBaseManager.ListItemFilter") } - if defsecgroup, _ := query.GetString("secgroup"); len(defsecgroup) > 0 { + if defsecgroup := query.Secgroup; len(defsecgroup) > 0 { if secgroup, _ := SecurityGroupManager.FetchByIdOrName(userCred, defsecgroup); secgroup != nil { sql = sql.Equals("secgroup_id", secgroup.GetId()) } else { return nil, httperrors.NewNotFoundError("Security Group %s not found", defsecgroup) } } - for _, field := range []string{"direction", "action", "protocol"} { - if key, _ := query.GetString(field); len(key) > 0 { - sql = sql.Equals(field, key) - } + if len(query.Direction) > 0 { + sql = sql.Equals("direction", query.Direction) + } + if len(query.Action) > 0 { + sql = sql.Equals("action", query.Action) + } + if len(query.Protocol) > 0 { + sql = sql.Equals("protocol", query.Protocol) } return sql, err } diff --git a/pkg/compute/models/secgroups.go b/pkg/compute/models/secgroups.go index 2f02a57aeb..ad443d8ca8 100644 --- a/pkg/compute/models/secgroups.go +++ b/pkg/compute/models/secgroups.go @@ -74,9 +74,7 @@ type SSecurityGroup struct { IsDirty bool `nullable:"false" default:"false"` // Column(Boolean, nullable=False, default=False) } -func (manager *SSecurityGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - input := api.SSecgroupListFilterInput{} - query.Unmarshal(&input) +func (manager *SSecurityGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.SecgroupListInput) (*sqlchemy.SQuery, error) { if len(input.Equals) > 0 { _secgroup, err := manager.FetchByIdOrName(userCred, input.Equals) if err != nil { @@ -119,7 +117,7 @@ func (manager *SSecurityGroupManager) ListItemFilter(ctx context.Context, q *sql filters = append(filters, sqlchemy.In(q.Field("id"), GuestsecgroupManager.Query("secgroup_id").Equals("guest_id", serverId).SubQuery())) isAdmin := false - admin, _ := query.Bool("admin") + admin := (input.Admin != nil && *input.Admin) if consts.IsRbacEnabled() { allowScope := policy.PolicyManager.AllowScope(userCred, consts.GetServiceType(), manager.KeywordPlural(), policy.PolicyActionList) if allowScope == rbacutils.ScopeSystem || allowScope == rbacutils.ScopeDomain { diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index c620f7d228..32e8a40e68 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -560,9 +560,14 @@ func usableFilter(q *sqlchemy.SQuery, public_cloud bool) *sqlchemy.SQuery { } func (manager *SServerSkuManager) GetPropertyInstanceSpecs(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) { - q, err := manager.ListItemFilter(ctx, manager.Query(), userCred, query) + listQuery := api.ServerSkuListInput{} + err := query.Unmarshal(&listQuery) if err != nil { - return nil, err + return nil, errors.Wrap(err, "query.Unmarshal") + } + q, err := manager.ListItemFilter(ctx, manager.Query(), userCred, listQuery) + if err != nil { + return nil, errors.Wrap(err, "manager.ListItemFilter") } skus := make([]SServerSku, 0) @@ -712,18 +717,18 @@ func listItemDomainFilter(q *sqlchemy.SQuery, data *jsonutils.JSONDict) *sqlchem return q } -func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ServerSkuListInput) (*sqlchemy.SQuery, error) { publicCloud := false - cloudEnvStr, _ := query.GetString("cloud_env") - if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD || jsonutils.QueryBoolean(query, "public_cloud", false) || jsonutils.QueryBoolean(query, "is_public", false) { + cloudEnvStr := query.CloudEnvStr() + if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { publicCloud = true q = q.Filter(sqlchemy.In(q.Field("provider"), CloudproviderManager.GetPublicProviderProvidersQuery())) } - if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD || jsonutils.QueryBoolean(query, "private_cloud", false) || jsonutils.QueryBoolean(query, "is_private", false) { + if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD { q = q.Filter(sqlchemy.In(q.Field("provider"), CloudproviderManager.GetPrivateProviderProvidersQuery())) } - if jsonutils.QueryBoolean(query, "is_on_premise", false) { + if cloudEnvStr == api.CLOUD_ENV_ON_PREMISE { q = q.Filter( sqlchemy.OR( sqlchemy.Equals(q.Field("provider"), api.CLOUD_PROVIDER_ONECLOUD), @@ -743,33 +748,32 @@ func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchem q = listItemDomainFilter(q, data) - providers := jsonutils.GetQueryStringArray(query, "provider") + providers := query.Providers if len(providers) > 0 { q = q.Filter(sqlchemy.In(q.Field("provider"), providers)) if len(providers) == 1 && utils.IsInStringArray(providers[0], cloudprovider.GetPublicProviders()) { publicCloud = true } - data.Remove("provider") } - brands := jsonutils.GetQueryStringArray(query, "brand") + brands := query.Brands if len(brands) > 0 { q = q.Filter(sqlchemy.In(q.Field("brand"), brands)) - data.Remove("brand") } - q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, data) + q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } - if usable, _ := query.Bool("usable"); usable { + if query.Usable != nil && *query.Usable { q = usableFilter(q, publicCloud) q = q.IsTrue("enabled") } - if data.Contains("zone") { - zoneStr, _ := data.GetString("zone") + zoneStr := query.ZoneStr() + regionStr := query.CloudregionStr() + if len(zoneStr) > 0 { _zone, err := ZoneManager.FetchByIdOrName(userCred, zoneStr) if err != nil { if err == sql.ErrNoRows { @@ -788,29 +792,19 @@ func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchem } else { q = q.Equals("zone_id", zone.Id) } - } else { - q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ - {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred}, - }) + } else if len(regionStr) > 0 { + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByRegion") } } - city, _ := query.GetString("city") - if len(city) > 0 { - regionTable := CloudregionManager.Query().SubQuery() - q = q.Join(regionTable, sqlchemy.Equals(regionTable.Field("id"), q.Field("cloudregion_id"))).Filter(sqlchemy.Equals(regionTable.Field("city"), city)) - } - // 按区间查询内存, 避免0.75G这样的套餐不好过滤 - memSizeMB, _ := query.Int("memory_size_mb") + memSizeMB := query.MemorySizeMb if memSizeMB > 0 { s, e := intervalMem(int(memSizeMB)) q.GT("memory_size_mb", s) q.LE("memory_size_mb", e) - queryDict := query.(*jsonutils.JSONDict) - queryDict.Remove("memory_size_mb") } return q, err diff --git a/pkg/compute/models/snapshotpolicycache.go b/pkg/compute/models/snapshotpolicycache.go index d034544432..8e8547df6a 100644 --- a/pkg/compute/models/snapshotpolicycache.go +++ b/pkg/compute/models/snapshotpolicycache.go @@ -71,12 +71,12 @@ func NewSSnapshotPolicyCache(snapshotpolicyId, cloudregionId, externalId string) } func (spcm *SSnapshotPolicyCacheManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, - query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := spcm.SResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + query api.SnapshotPolicyCacheListInput) (*sqlchemy.SQuery, error) { + q, err := spcm.SResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ResourceBaseListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SResourceBaseManager.ListItemFilter") } - if snapshotpolicyIden, _ := query.GetString("snapshotpolicy"); len(snapshotpolicyIden) > 0 { + if snapshotpolicyIden := query.Snapshotpolicy; len(snapshotpolicyIden) > 0 { snapshotpolicy, err := SnapshotPolicyManager.FetchByIdOrName(userCred, snapshotpolicyIden) if err != nil { if errors.Cause(err) == sql.ErrNoRows { diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index 59b152ad8d..c3d1135805 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -88,48 +88,48 @@ func (self *SSnapshotManager) AllowListItems(ctx context.Context, userCred mccli return true } -func (manager *SSnapshotManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SSnapshotManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.SnapshotListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - if jsonutils.QueryBoolean(query, "fake_deleted", false) { - q = q.Equals("fake_deleted", true) + if query.FakeDeleted != nil && *query.FakeDeleted { + q = q.IsTrue("fake_deleted") } else { - q = q.Equals("fake_deleted", false) + q = q.IsFalse("fake_deleted") } - if jsonutils.QueryBoolean(query, "local", false) { + if query.Local != nil && *query.Local { storages := StorageManager.Query().SubQuery() sq := storages.Query(storages.Field("id")).Filter(sqlchemy.Equals(storages.Field("storage_type"), api.STORAGE_LOCAL)) q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) } // Public cloud snapshot doesn't have storage id - if jsonutils.QueryBoolean(query, "share", false) { + if query.Share != nil && *query.Share { storages := StorageManager.Query().SubQuery() sq := storages.Query(storages.Field("id")).NotEquals("storage_type", "local") q = q.Filter(sqlchemy.OR(sqlchemy.IsNull(q.Field("storage_id")), sqlchemy.In(q.Field("storage_id"), sq))) } - if diskType, err := query.GetString("disk_type"); err == nil { + if len(query.DiskType) > 0 { diskTbl := DiskManager.Query().SubQuery() - sq := diskTbl.Query(diskTbl.Field("id")).Equals("disk_type", diskType).SubQuery() + sq := diskTbl.Query(diskTbl.Field("id")).Equals("disk_type", query.DiskType).SubQuery() q = q.In("disk_id", sq) } - if isInstanceSnapshot, err := query.Bool("is_instance_snapshot"); err == nil { + if query.IsInstanceSnapshot != nil { insjsq := InstanceSnapshotJointManager.Query().SubQuery() - if !isInstanceSnapshot { + if !*query.IsInstanceSnapshot { q = q.LeftJoin(insjsq, sqlchemy.Equals(q.Field("id"), insjsq.Field("snapshot_id"))). Filter(sqlchemy.IsNull(insjsq.Field("snapshot_id"))) } else { @@ -137,36 +137,6 @@ func (manager *SSnapshotManager) ListItemFilter(ctx context.Context, q *sqlchemy } } - /*if provider, err := query.GetString("provider"); err == nil { - cloudproviderTbl := CloudproviderManager.Query().SubQuery() - sq := cloudproviderTbl.Query(cloudproviderTbl.Field("id")).Equals("provider", provider) - q = q.In("manager_id", sq) - }*/ - - /*if managerStr := jsonutils.GetAnyString(query, []string{"manager", "manager_id"}); len(managerStr) > 0 { - managerObj, err := CloudproviderManager.FetchByIdOrName(nil, managerStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewNotFoundError("manager %s not found", managerStr) - } - return nil, httperrors.NewGeneralError(err) - } - q = q.Equals("manager_id", managerObj.GetId()) - } - - accountStr := jsonutils.GetAnyString(query, []string{"account", "account_id", "cloudaccount", "cloudaccount_id"}) - if len(accountStr) > 0 { - account, err := CloudaccountManager.FetchByIdOrName(nil, accountStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), accountStr) - } - return nil, httperrors.NewGeneralError(err) - } - subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", account.GetId()).SubQuery() - q = q.Filter(sqlchemy.In(q.Field("manager_id"), subq)) - }*/ - return q, nil } diff --git a/pkg/compute/models/storagecaches.go b/pkg/compute/models/storagecaches.go index 4351fa187f..ca11814fe1 100644 --- a/pkg/compute/models/storagecaches.go +++ b/pkg/compute/models/storagecaches.go @@ -403,22 +403,22 @@ func (self *SStoragecache) GetIStorageCache() (cloudprovider.ICloudStoragecache, return istorage.GetIStoragecache(), nil } -func (manager *SStoragecacheManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SStoragecacheManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.StoragecacheListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = managedResourceFilterByDomain(q, query, "", nil) + q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByDomain") } - q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } return q, nil diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index 2e9e891223..01da064c1e 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -1112,42 +1112,44 @@ func (manager *SStorageManager) IsStorageTypeExist(storageType string) (string, return storages[0].StorageType, true } -func (manager *SStorageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SStorageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.StorageListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "", nil) - q, err = managedResourceFilterByDomain(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) + q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByDomain") } - q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - regionStr, _ := query.GetString("region") - if len(regionStr) > 0 { - regionObj, err := CloudregionManager.FetchByIdOrName(userCred, regionStr) - if err != nil { - return nil, httperrors.NewNotFoundError("Region %s not found: %s", regionStr, err) - } - sq := ZoneManager.Query("id").Equals("cloudregion_id", regionObj.GetId()) - q = q.Filter(sqlchemy.In(q.Field("zone_id"), sq.SubQuery())) + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "zone_id", func() *sqlchemy.SQuery { + return ZoneManager.Query("id") + }) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - if jsonutils.QueryBoolean(query, "share", false) { + q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByZone") + } + + if query.Share != nil && *query.Share { q = q.Filter(sqlchemy.NotIn(q.Field("storage_type"), api.STORAGE_LOCAL_TYPES)) } - if jsonutils.QueryBoolean(query, "local", false) { + if query.Local != nil && *query.Local { q = q.Filter(sqlchemy.In(q.Field("storage_type"), api.STORAGE_LOCAL_TYPES)) } - if jsonutils.QueryBoolean(query, "usable", false) { + if query.Usable != nil && *query.Usable { hostStorageTable := HoststorageManager.Query().SubQuery() hostTable := HostManager.Query().SubQuery() sq1 := hostStorageTable.Query(hostStorageTable.Field("storage_id")). @@ -1173,37 +1175,6 @@ func (manager *SStorageManager) ListItemFilter(ctx context.Context, q *sqlchemy. Filter(sqlchemy.IsTrue(q.Field("enabled"))) } - /*managerStr := jsonutils.GetAnyString(query, []string{"manager", "cloudprovider", "cloudprovider_id", "manager_id"}) - if len(managerStr) > 0 { - provider, err := CloudproviderManager.FetchByIdOrName(nil, managerStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr) - } - return nil, httperrors.NewGeneralError(err) - } - q = q.Filter(sqlchemy.Equals(q.Field("manager_id"), provider.GetId())) - } - - accountStr := jsonutils.GetAnyString(query, []string{"account", "account_id", "cloudaccount", "cloudaccount_id"}) - if len(accountStr) > 0 { - account, err := CloudaccountManager.FetchByIdOrName(nil, accountStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), accountStr) - } - return nil, httperrors.NewGeneralError(err) - } - subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", account.GetId()).SubQuery() - q = q.Filter(sqlchemy.In(q.Field("manager_id"), subq)) - } - - providerStr := jsonutils.GetAnyString(query, []string{"provider"}) - if len(providerStr) > 0 { - subq := CloudproviderManager.Query("id").Equals("provider", providerStr).SubQuery() - q = q.Filter(sqlchemy.In(q.Field("manager_id"), subq)) - }*/ - return q, err } diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index f66f8c898f..484b3a14d8 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -785,25 +785,25 @@ func (self *SVpc) PerformPurge(ctx context.Context, userCred mcclient.TokenCrede return nil, err } -func (manager *SVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.VpcListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "", nil) + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByDomain") } - q = managedResourceFilterByCloudType(q, query, "", nil) + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = managedResourceFilterByDomain(q, query, "", nil) + q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByDomain") + } + + q, err = manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) if err != nil { return nil, err } - q, err = manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) - if err != nil { - return nil, err - } - - if jsonutils.QueryBoolean(query, "usable", false) { + if query.Usable != nil && *query.Usable { regions := CloudregionManager.Query().SubQuery() cloudproviders := CloudproviderManager.Query().SubQuery() providerSQ := cloudproviders.Query(cloudproviders.Field("id")).Filter( @@ -833,7 +833,7 @@ func (manager *SVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQue q = q.In("id", sq.SubQuery()) } - globalVpcStr, _ := query.GetString("globalvpc") + globalVpcStr := query.Globalvpc if len(globalVpcStr) > 0 { globalVpc, err := GlobalVpcManager.FetchByIdOrName(userCred, globalVpcStr) if err != nil { diff --git a/pkg/compute/models/wires.go b/pkg/compute/models/wires.go index 786169d4e6..04aa6bed21 100644 --- a/pkg/compute/models/wires.go +++ b/pkg/compute/models/wires.go @@ -827,38 +827,38 @@ func (manager *SWireManager) GetOnPremiseWireOfIp(ipAddr string) (*SWire, error) } } -func (manager *SWireManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { +func (manager *SWireManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.WireListInput) (*sqlchemy.SQuery, error) { var err error - q, err = managedResourceFilterByAccount(q, query, "vpc_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "vpc_id", func() *sqlchemy.SQuery { vpcs := VpcManager.Query().SubQuery() subq := vpcs.Query(vpcs.Field("id")) return subq }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query, "vpc_id", func() *sqlchemy.SQuery { + q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "vpc_id", func() *sqlchemy.SQuery { vpcs := VpcManager.Query().SubQuery() subq := vpcs.Query(vpcs.Field("id")) return subq }) - q, err = managedResourceFilterByDomain(q, query, "vpc_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "vpc_id", func() *sqlchemy.SQuery { vpcs := VpcManager.Query().SubQuery() subq := vpcs.Query(vpcs.Field("id")) return subq }) if err != nil { - return nil, err + return nil, errors.Wrap(err, "managedResourceFilterByDomain") } - q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - vpcStr := jsonutils.GetAnyString(query, []string{"vpc_id", "vpc"}) + vpcStr := query.VpcStr() if len(vpcStr) > 0 { vpc, err := VpcManager.FetchByIdOrName(userCred, vpcStr) if err != nil { @@ -871,21 +871,19 @@ func (manager *SWireManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.Equals("vpc_id", vpc.GetId()) } - regionStr := jsonutils.GetAnyString(query, []string{"region_id", "region", "cloudregion_id", "cloudregion"}) - if len(regionStr) > 0 { - region, err := CloudregionManager.FetchByIdOrName(userCred, regionStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewNotFoundError("region %s not found", regionStr) - } else { - return nil, httperrors.NewInternalServerError("region %s query fail %s", regionStr, err) - } - } - sq := VpcManager.Query("id").Equals("cloudregion_id", region.GetId()) - q = q.In("vpc_id", sq.SubQuery()) + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "vpc_id", func() *sqlchemy.SQuery { + return VpcManager.Query("id") + }) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - hostStr, _ := query.GetString("host") + q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByZone") + } + + hostStr := query.Host if len(hostStr) > 0 { hostObj, err := HostManager.FetchByIdOrName(userCred, hostStr) if err != nil { @@ -895,50 +893,7 @@ func (manager *SWireManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.Filter(sqlchemy.In(q.Field("id"), sq.SubQuery())) } - /*managerStr := jsonutils.GetAnyString(query, []string{"manager", "cloudprovider", "cloudprovider_id", "manager_id"}) - if len(managerStr) > 0 { - provider, err := CloudproviderManager.FetchByIdOrName(nil, managerStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr) - } - return nil, httperrors.NewGeneralError(err) - } - sq := VpcManager.Query("id").Equals("manager_id", provider.GetId()) - q = q.In("vpc_id", sq.SubQuery()) - } - - accountStr := jsonutils.GetAnyString(query, []string{"account", "account_id", "cloudaccount", "cloudaccount_id"}) - if len(accountStr) > 0 { - account, err := CloudaccountManager.FetchByIdOrName(nil, accountStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), accountStr) - } - return nil, httperrors.NewGeneralError(err) - } - vpcs := VpcManager.Query().SubQuery() - cloudproviders := CloudproviderManager.Query().SubQuery() - - subq := vpcs.Query(vpcs.Field("id")) - subq = subq.Join(cloudproviders, sqlchemy.Equals(cloudproviders.Field("id"), vpcs.Field("manager_id"))) - subq = subq.Filter(sqlchemy.Equals(cloudproviders.Field("cloudaccount_id"), account.GetId())) - q = q.Filter(sqlchemy.In(q.Field("vpc_id"), subq.SubQuery())) - } - - providerStr := jsonutils.GetAnyString(query, []string{"provider"}) - if len(providerStr) > 0 { - vpcs := VpcManager.Query().SubQuery() - cloudproviders := CloudproviderManager.Query().SubQuery() - - subq := vpcs.Query(vpcs.Field("id")) - subq = subq.Join(cloudproviders, sqlchemy.Equals(cloudproviders.Field("id"), vpcs.Field("manager_id"))) - subq = subq.Filter(sqlchemy.Equals(cloudproviders.Field("provider"), providerStr)) - - q = q.Filter(sqlchemy.In(q.Field("vpc_id"), subq.SubQuery())) - }*/ - - return q, err + return q, nil } func (self *SWire) getRegion() *SCloudregion { diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index 23e84fbbbc..1199bbe2ea 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -20,6 +20,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/tristate" "yunion.io/x/pkg/util/compare" "yunion.io/x/sqlchemy" @@ -522,26 +523,26 @@ func NetworkUsableZoneQueries(field sqlchemy.IQueryField, usableNet, usableVpc b return iconditions } -func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ZoneListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } - cloudEnvStr, _ := query.GetString("cloud_env") - if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD || jsonutils.QueryBoolean(query, "is_private", false) || jsonutils.QueryBoolean(query, "private", false) || jsonutils.QueryBoolean(query, "private_cloud", false) { + cloudEnvStr := query.CloudEnvStr() + if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD { regions := CloudregionManager.Query().SubQuery() subq := regions.Query(regions.Field("id")) subq = subq.Filter(sqlchemy.In(regions.Field("provider"), cloudprovider.GetPrivateProviders())) q = q.In("cloudregion_id", subq.SubQuery()) } - if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD || jsonutils.QueryBoolean(query, "is_public", false) || jsonutils.QueryBoolean(query, "public", false) || jsonutils.QueryBoolean(query, "public_cloud", false) { + if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { regions := CloudregionManager.Query().SubQuery() subq := regions.Query(regions.Field("id")) subq = subq.Filter(sqlchemy.In(regions.Field("provider"), cloudprovider.GetPublicProviders())) q = q.In("cloudregion_id", subq.SubQuery()) } - if cloudEnvStr == api.CLOUD_ENV_ON_PREMISE || jsonutils.QueryBoolean(query, "is_on_premise", false) { + if cloudEnvStr == api.CLOUD_ENV_ON_PREMISE { regions := CloudregionManager.Query().SubQuery() subq := regions.Query(regions.Field("id")) subq = subq.Filter(sqlchemy.OR( @@ -560,24 +561,24 @@ func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu )) q = q.In("cloudregion_id", subq.SubQuery()) } - if jsonutils.QueryBoolean(query, "is_managed", false) { + if query.IsManaged { q = q.IsNotEmpty("external_id") } - domainId, err := db.FetchQueryDomain(ctx, userCred, query) + data := jsonutils.Marshal(query.DomainizedResourceListInput) + domainId, err := db.FetchQueryDomain(ctx, userCred, data) if len(domainId) > 0 { q = q.In("cloudregion_id", getCloudRegionIdByDomainId(domainId)) } - if jsonutils.QueryBoolean(query, "usable", false) || jsonutils.QueryBoolean(query, "usable_vpc", false) { - usableNet := jsonutils.QueryBoolean(query, "usable", false) - usableVpc := jsonutils.QueryBoolean(query, "usable_vpc", - false) + usableNet := (query.Usable != nil && *query.Usable) + usableVpc := (query.UsableVpc != nil && *query.UsableVpc) + if usableNet || usableVpc { iconditions := NetworkUsableZoneQueries(q.Field("id"), usableNet, usableVpc) q = q.Filter(sqlchemy.OR(iconditions...)) q = q.Equals("status", api.ZONE_ENABLE) - service, _ := query.GetString("service") + service := query.Service switch service { case ElasticcacheManager.KeywordPlural(): q2 := ElasticcacheSkuManager.Query("zone_id").Distinct() @@ -589,36 +590,30 @@ func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } } - managerStr, _ := query.GetString("manager") + managerStr := query.CloudproviderStr() if len(managerStr) > 0 { subq := CloudproviderRegionManager.QueryRelatedRegionIds("", managerStr) q = q.In("cloudregion_id", subq) } - accountStr, _ := query.GetString("account") + accountStr := query.CloudaccountStr() if len(accountStr) > 0 { subq := CloudproviderRegionManager.QueryRelatedRegionIds(accountStr) q = q.In("cloudregion_id", subq) } - providerStrs := jsonutils.GetQueryStringArray(query, "provider") + providerStrs := query.Providers if len(providerStrs) > 0 { - query.(*jsonutils.JSONDict).Remove("provider") subq := queryCloudregionIdsByProviders("provider", providerStrs) q = q.In("cloudregion_id", subq.SubQuery()) } - brandStrs := jsonutils.GetQueryStringArray(query, "brand") + brandStrs := query.Brands if len(brandStrs) > 0 { - query.(*jsonutils.JSONDict).Remove("brand") subq := queryCloudregionIdsByProviders("brand", brandStrs) q = q.In("cloudregion_id", subq.SubQuery()) } - city, _ := query.GetString("city") - if len(city) > 0 { - subq := CloudregionManager.Query("id").Equals("city", city).SubQuery() - q = q.In("cloudregion_id", subq) - } + q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) return q, nil } diff --git a/pkg/compute/service/handlers.go b/pkg/compute/service/handlers.go index 09a5d80ee1..e9d4b5b76b 100644 --- a/pkg/compute/service/handlers.go +++ b/pkg/compute/service/handlers.go @@ -72,6 +72,8 @@ func InitHandlers(app *appsrv.Application) { models.ProjectPendingUsageManager, models.GroupguestManager, + + models.CloudproviderCapabilityManager, } { db.RegisterModelManager(manager) } diff --git a/pkg/hostman/diskutils/disk.go b/pkg/hostman/diskutils/disk.go index e755dccbef..2c79d887b7 100644 --- a/pkg/hostman/diskutils/disk.go +++ b/pkg/hostman/diskutils/disk.go @@ -1,3 +1,17 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package diskutils import ( diff --git a/pkg/image/models/images.go b/pkg/image/models/images.go index e14317b9a9..0f35ca0f82 100644 --- a/pkg/image/models/images.go +++ b/pkg/image/models/images.go @@ -1093,17 +1093,16 @@ func (self *SImage) GetDetailsSubformats(ctx context.Context, userCred mcclient. return jsonutils.Marshal(ret), nil } -func (manager *SImageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SImageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ImageListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SharableVirtualResourceListInput) if err != nil { return nil, err } - fmtJsonArray, _ := query.GetArray("disk_formats") + fmtJsonArray := query.DiskFormats if len(fmtJsonArray) > 0 { - fmtArray := jsonutils.JSONArray2StringArray(fmtJsonArray) - q = q.In("disk_format", fmtArray) + q = q.In("disk_format", fmtJsonArray) } - if jsonutils.QueryBoolean(query, "uefi", false) { + if query.Uefi != nil && *query.Uefi { imagePropertyQ := ImagePropertyManager.Query(). Equals("name", api.IMAGE_UEFI_SUPPORT).Equals("value", "true").SubQuery() q = q.Join(imagePropertyQ, sqlchemy.Equals(q.Field("id"), imagePropertyQ.Field("image_id"))) diff --git a/pkg/keystone/models/domains.go b/pkg/keystone/models/domains.go index 19556b6e9f..cab6ab7d06 100644 --- a/pkg/keystone/models/domains.go +++ b/pkg/keystone/models/domains.go @@ -168,10 +168,10 @@ func (manager *SDomainManager) FetchDomainByIdOrName(domain string) (*SDomain, e return obj.(*SDomain), err } -func (manager *SDomainManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SDomainManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.DomainListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } q = q.NotEquals("id", api.KeystoneDomainRoot) return q, nil diff --git a/pkg/keystone/models/endpoints.go b/pkg/keystone/models/endpoints.go index 805a4ef3b7..7edfa71a2d 100644 --- a/pkg/keystone/models/endpoints.go +++ b/pkg/keystone/models/endpoints.go @@ -20,6 +20,7 @@ import ( "fmt" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/tristate" "yunion.io/x/sqlchemy" @@ -335,12 +336,12 @@ func (manager *SEndpointManager) ValidateCreateData(ctx context.Context, userCre return data, nil } -func (manager *SEndpointManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SEndpointManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.EndpointListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - svcStr := jsonutils.GetAnyString(query, []string{"service", "service_id"}) + svcStr := query.ServiceStr() if len(svcStr) > 0 { svcObj, err := ServiceManager.FetchByIdOrName(userCred, svcStr) if err != nil { diff --git a/pkg/keystone/models/groups.go b/pkg/keystone/models/groups.go index 74b812ca6c..87992c9c78 100644 --- a/pkg/keystone/models/groups.go +++ b/pkg/keystone/models/groups.go @@ -75,13 +75,13 @@ func (manager *SGroupManager) GetContextManagers() [][]db.IModelManager { } } -func (manager *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SIdentityBaseResourceManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.GroupListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SIdentityBaseResourceManager.ListItemFilter(ctx, q, userCred, query.IdentityBaseResourceListInput) if err != nil { return nil, err } - userIdStr := jsonutils.GetAnyString(query, []string{"user_id"}) + userIdStr := query.UserId if len(userIdStr) > 0 { user, err := UserManager.FetchById(userIdStr) if err != nil { @@ -95,7 +95,7 @@ func (manager *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("id", subq.SubQuery()) } - projIdStr := jsonutils.GetAnyString(query, []string{"project_id", "tenant_id"}) + projIdStr := query.ProjectIdStr() if len(projIdStr) > 0 { proj, err := ProjectManager.FetchProjectById(projIdStr) if err != nil { diff --git a/pkg/keystone/models/identitybase.go b/pkg/keystone/models/identitybase.go index 934db22719..3b4917b815 100644 --- a/pkg/keystone/models/identitybase.go +++ b/pkg/keystone/models/identitybase.go @@ -20,6 +20,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/tristate" "yunion.io/x/sqlchemy" @@ -116,10 +117,25 @@ func (manager *SIdentityBaseResourceManager) FetchByIdOrName(userCred mcclient.I return db.FetchByIdOrName(manager.GetIIdentityModelManager(), userCred, idStr) } -func (manager *SIdentityBaseResourceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SIdentityBaseResourceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.IdentityBaseResourceListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") + } + return q, nil +} + +func (manager *SEnabledIdentityBaseResourceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.EnabledIdentityBaseResourceListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SIdentityBaseResourceManager.ListItemFilter(ctx, q, userCred, query.IdentityBaseResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SIdentityBaseResourceManager.ListItemFilter") + } + if query.Enabled != nil { + if *query.Enabled { + q = q.IsTrue("enabled") + } else { + q = q.IsFalse("enabled") + } } return q, nil } diff --git a/pkg/keystone/models/projects.go b/pkg/keystone/models/projects.go index 5d07304a64..ad2d1d3732 100644 --- a/pkg/keystone/models/projects.go +++ b/pkg/keystone/models/projects.go @@ -203,13 +203,13 @@ func (proj *SProject) FetchExtend() (*SProjectExtended, error) { return &ext, nil } -func (manager *SProjectManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SIdentityBaseResourceManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SProjectManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ProjectListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SIdentityBaseResourceManager.ListItemFilter(ctx, q, userCred, query.IdentityBaseResourceListInput) if err != nil { return nil, err } - userStr := jsonutils.GetAnyString(query, []string{"user_id"}) + userStr := query.UserId if len(userStr) > 0 { userObj, err := UserManager.FetchById(userStr) if err != nil { @@ -223,7 +223,7 @@ func (manager *SProjectManager) ListItemFilter(ctx context.Context, q *sqlchemy. q = q.In("id", subq.SubQuery()) } - groupStr := jsonutils.GetAnyString(query, []string{"group_id"}) + groupStr := query.GroupId if len(groupStr) > 0 { groupObj, err := GroupManager.FetchById(groupStr) if err != nil { diff --git a/pkg/keystone/models/roles.go b/pkg/keystone/models/roles.go index 024b798a6c..e5c73ec1f9 100644 --- a/pkg/keystone/models/roles.go +++ b/pkg/keystone/models/roles.go @@ -222,14 +222,14 @@ func roleExtra(role *SRole, extra *jsonutils.JSONDict) *jsonutils.JSONDict { return extra } -func (manager *SRoleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SIdentityBaseResourceManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SRoleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.RoleListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SIdentityBaseResourceManager.ListItemFilter(ctx, q, userCred, query.IdentityBaseResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SIdentityBaseResourceManager.ListItemFilter") } var projectId string - projectStr := jsonutils.GetAnyString(query, []string{"project_id"}) + projectStr := query.ProjectId if len(projectStr) > 0 { project, err := ProjectManager.FetchProjectById(projectStr) if err != nil { @@ -242,7 +242,7 @@ func (manager *SRoleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu projectId = project.Id } - userStr := jsonutils.GetAnyString(query, []string{"user_id"}) + userStr := query.UserId if len(projectId) > 0 && len(userStr) > 0 { userObj, err := UserManager.FetchById(userStr) if err != nil { @@ -256,7 +256,7 @@ func (manager *SRoleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", subq.SubQuery()) } - groupStr := jsonutils.GetAnyString(query, []string{"group_id"}) + groupStr := query.GroupId if len(projectId) > 0 && len(groupStr) > 0 { groupObj, err := GroupManager.FetchById(groupStr) if err != nil { diff --git a/pkg/keystone/models/users.go b/pkg/keystone/models/users.go index bf41aa424a..372c92abb6 100644 --- a/pkg/keystone/models/users.go +++ b/pkg/keystone/models/users.go @@ -312,13 +312,13 @@ func localUserVerifyPassword(user *api.SUserExtended, passwd string) error { return errors.Error("invalid password") } -func (manager *SUserManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - q, err := manager.SEnabledIdentityBaseResourceManager.ListItemFilter(ctx, q, userCred, query) +func (manager *SUserManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.UserListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SEnabledIdentityBaseResourceManager.ListItemFilter(ctx, q, userCred, query.EnabledIdentityBaseResourceListInput) if err != nil { return nil, err } - groupStr := jsonutils.GetAnyString(query, []string{"group", "group_id"}) + groupStr := query.GroupStr() if len(groupStr) > 0 { groupObj, err := GroupManager.FetchByIdOrName(userCred, groupStr) if err != nil { @@ -332,7 +332,7 @@ func (manager *SUserManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", subq.SubQuery()) } - projectStr := jsonutils.GetAnyString(query, []string{"project", "project_id", "tenant", "tenant_id"}) + projectStr := query.ProjectStr() if len(projectStr) > 0 { project, err := ProjectManager.FetchByIdOrName(userCred, projectStr) if err != nil { @@ -346,7 +346,7 @@ func (manager *SUserManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", subq.SubQuery()) } - roleStr := jsonutils.GetAnyString(query, []string{"role", "role_id"}) + roleStr := query.RoleStr() if len(roleStr) > 0 { role, err := RoleManager.FetchByIdOrName(userCred, roleStr) if err != nil { diff --git a/pkg/logger/models/baremetalevents.go b/pkg/logger/models/baremetalevents.go index 5c85cd56cb..b09d7632e2 100644 --- a/pkg/logger/models/baremetalevents.go +++ b/pkg/logger/models/baremetalevents.go @@ -19,9 +19,10 @@ import ( "fmt" "time" - "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" "yunion.io/x/sqlchemy" + api "yunion.io/x/onecloud/pkg/apis/logger" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/rbacutils" @@ -84,14 +85,17 @@ func (manager *SBaremetalEventManager) GetPagingConfig() *db.SPagingConfig { } } -func (manager *SBaremetalEventManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { - since, _ := query.GetTime("since") - if !since.IsZero() { - q = q.GT("created", since) +func (manager *SBaremetalEventManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.BaremetalEventListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SModelBaseManager.ListItemFilter(ctx, q, userCred, query.ModelBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SModelBaseManager.ListItemFilter") } - until, _ := query.GetTime("until") - if !until.IsZero() { - q = q.LE("created", until) + + if !query.Since.IsZero() { + q = q.GT("created", query.Since) + } + if !query.Until.IsZero() { + q = q.LE("created", query.Until) } return q, nil } diff --git a/pkg/multicloud/aliyun/aliyun.go b/pkg/multicloud/aliyun/aliyun.go index d68762221c..9cc0080876 100644 --- a/pkg/multicloud/aliyun/aliyun.go +++ b/pkg/multicloud/aliyun/aliyun.go @@ -402,6 +402,7 @@ func (region *SAliyunClient) GetCapabilities() []string { caps := []string{ // cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + cloudprovider.CLOUD_CAPABILITY_NETWORK, cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, cloudprovider.CLOUD_CAPABILITY_RDS, diff --git a/pkg/multicloud/aws/aws.go b/pkg/multicloud/aws/aws.go index 9f4030ca55..6bfa01b998 100644 --- a/pkg/multicloud/aws/aws.go +++ b/pkg/multicloud/aws/aws.go @@ -393,10 +393,12 @@ func (self *SAwsClient) GetCapabilities() []string { caps := []string{ // cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + cloudprovider.CLOUD_CAPABILITY_NETWORK, cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, // cloudprovider.CLOUD_CAPABILITY_RDS, // cloudprovider.CLOUD_CAPABILITY_CACHE, + // cloudprovider.CLOUD_CAPABILITY_EVENT, } return caps } diff --git a/pkg/multicloud/azure/azure.go b/pkg/multicloud/azure/azure.go index 0fe2aced41..01004e7983 100644 --- a/pkg/multicloud/azure/azure.go +++ b/pkg/multicloud/azure/azure.go @@ -968,6 +968,7 @@ func (self *SAzureClient) GetCapabilities() []string { caps := []string{ cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + cloudprovider.CLOUD_CAPABILITY_NETWORK, // cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, // cloudprovider.CLOUD_CAPABILITY_RDS, diff --git a/pkg/multicloud/ctyun/ctyun.go b/pkg/multicloud/ctyun/ctyun.go index 6a1f5afb6d..a4624bd0a2 100644 --- a/pkg/multicloud/ctyun/ctyun.go +++ b/pkg/multicloud/ctyun/ctyun.go @@ -308,10 +308,12 @@ func (self *SCtyunClient) GetCapabilities() []string { caps := []string{ // cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + cloudprovider.CLOUD_CAPABILITY_NETWORK, // cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, // cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, // cloudprovider.CLOUD_CAPABILITY_RDS, // cloudprovider.CLOUD_CAPABILITY_CACHE, + // cloudprovider.CLOUD_CAPABILITY_EVENT, } return caps } diff --git a/pkg/multicloud/esxi/manager.go b/pkg/multicloud/esxi/manager.go index b0c27e7163..6bcbeeaad0 100644 --- a/pkg/multicloud/esxi/manager.go +++ b/pkg/multicloud/esxi/manager.go @@ -444,10 +444,12 @@ func (cli *SESXiClient) GetCapabilities() []string { caps := []string{ // cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + // cloudprovider.CLOUD_CAPABILITY_NETWORK, // cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, // cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, // cloudprovider.CLOUD_CAPABILITY_RDS, // cloudprovider.CLOUD_CAPABILITY_CACHE, + // cloudprovider.CLOUD_CAPABILITY_EVENT, } return caps } diff --git a/pkg/multicloud/google/google.go b/pkg/multicloud/google/google.go index bffb16e6c2..266053ad54 100644 --- a/pkg/multicloud/google/google.go +++ b/pkg/multicloud/google/google.go @@ -273,10 +273,12 @@ func (self *SGoogleClient) GetCapabilities() []string { caps := []string{ // cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + cloudprovider.CLOUD_CAPABILITY_NETWORK, // cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, // cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, // cloudprovider.CLOUD_CAPABILITY_RDS, // cloudprovider.CLOUD_CAPABILITY_CACHE, + // cloudprovider.CLOUD_CAPABILITY_EVENT, } return caps } diff --git a/pkg/multicloud/huawei/huawei.go b/pkg/multicloud/huawei/huawei.go index acc31d918b..cd6886676f 100644 --- a/pkg/multicloud/huawei/huawei.go +++ b/pkg/multicloud/huawei/huawei.go @@ -419,6 +419,7 @@ func (self *SHuaweiClient) GetCapabilities() []string { caps := []string{ // cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + cloudprovider.CLOUD_CAPABILITY_NETWORK, cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, // cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, cloudprovider.CLOUD_CAPABILITY_RDS, diff --git a/pkg/multicloud/objectstore/objectstore.go b/pkg/multicloud/objectstore/objectstore.go index e9327ce89f..05773c6e0d 100644 --- a/pkg/multicloud/objectstore/objectstore.go +++ b/pkg/multicloud/objectstore/objectstore.go @@ -528,10 +528,12 @@ func (self *SObjectStoreClient) GetCapabilities() []string { caps := []string{ // cloudprovider.CLOUD_CAPABILITY_PROJECT, // cloudprovider.CLOUD_CAPABILITY_COMPUTE, + // cloudprovider.CLOUD_CAPABILITY_NETWORK, // cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, // cloudprovider.CLOUD_CAPABILITY_RDS, // cloudprovider.CLOUD_CAPABILITY_CACHE, + // cloudprovider.CLOUD_CAPABILITY_EVENT, } return caps } diff --git a/pkg/multicloud/objectstore/provider/provider.go b/pkg/multicloud/objectstore/provider/provider.go index 72f0a25b0d..146f9a30f8 100644 --- a/pkg/multicloud/objectstore/provider/provider.go +++ b/pkg/multicloud/objectstore/provider/provider.go @@ -39,14 +39,6 @@ func (self *SObjectStoreProviderFactory) GetName() string { return api.CLOUD_PROVIDER_GENERICS3 } -func (factory *SObjectStoreProviderFactory) IsSupportObjectStorage() bool { - return true -} - -func (factory *SObjectStoreProviderFactory) IsSupportComputeEngine() bool { - return false -} - func (self *SObjectStoreProviderFactory) ValidateCreateCloudaccountData(ctx context.Context, userCred mcclient.TokenCredential, input cloudprovider.SCloudaccountCredential) (cloudprovider.SCloudaccount, error) { output := cloudprovider.SCloudaccount{} if len(input.AccessKeyId) == 0 { diff --git a/pkg/multicloud/openstack/openstack.go b/pkg/multicloud/openstack/openstack.go index f3339af0c1..7af8110f8a 100644 --- a/pkg/multicloud/openstack/openstack.go +++ b/pkg/multicloud/openstack/openstack.go @@ -260,10 +260,12 @@ func (self *SOpenStackClient) GetCapabilities() []string { caps := []string{ cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + cloudprovider.CLOUD_CAPABILITY_NETWORK, // cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, // cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, // cloudprovider.CLOUD_CAPABILITY_RDS, // cloudprovider.CLOUD_CAPABILITY_CACHE, + // cloudprovider.CLOUD_CAPABILITY_EVENT, } return caps } diff --git a/pkg/multicloud/qcloud/monitor.go b/pkg/multicloud/qcloud/monitor.go index 13242f7421..9661117696 100644 --- a/pkg/multicloud/qcloud/monitor.go +++ b/pkg/multicloud/qcloud/monitor.go @@ -1,3 +1,17 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package qcloud import ( diff --git a/pkg/multicloud/qcloud/qcloud.go b/pkg/multicloud/qcloud/qcloud.go index 660e62d1f7..b355a7335d 100644 --- a/pkg/multicloud/qcloud/qcloud.go +++ b/pkg/multicloud/qcloud/qcloud.go @@ -753,6 +753,7 @@ func (self *SQcloudClient) GetCapabilities() []string { caps := []string{ cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + cloudprovider.CLOUD_CAPABILITY_NETWORK, cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, // cloudprovider.CLOUD_CAPABILITY_RDS, diff --git a/pkg/multicloud/ucloud/ucloud.go b/pkg/multicloud/ucloud/ucloud.go index 40fa5a40f0..07425d851c 100644 --- a/pkg/multicloud/ucloud/ucloud.go +++ b/pkg/multicloud/ucloud/ucloud.go @@ -347,10 +347,12 @@ func (self *SUcloudClient) GetCapabilities() []string { caps := []string{ // cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + cloudprovider.CLOUD_CAPABILITY_NETWORK, // cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, // cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, // cloudprovider.CLOUD_CAPABILITY_RDS, // cloudprovider.CLOUD_CAPABILITY_CACHE, + // cloudprovider.CLOUD_CAPABILITY_EVENT, } return caps } diff --git a/pkg/multicloud/zstack/zstack.go b/pkg/multicloud/zstack/zstack.go index fefa82a6f9..86f81a4d88 100644 --- a/pkg/multicloud/zstack/zstack.go +++ b/pkg/multicloud/zstack/zstack.go @@ -438,10 +438,12 @@ func (self *SZStackClient) GetCapabilities() []string { caps := []string{ // cloudprovider.CLOUD_CAPABILITY_PROJECT, cloudprovider.CLOUD_CAPABILITY_COMPUTE, + cloudprovider.CLOUD_CAPABILITY_NETWORK, // cloudprovider.CLOUD_CAPABILITY_LOADBALANCER, // cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, // cloudprovider.CLOUD_CAPABILITY_RDS, // cloudprovider.CLOUD_CAPABILITY_CACHE, + // cloudprovider.CLOUD_CAPABILITY_EVENT, } return caps } diff --git a/pkg/notify/template/doc.go b/pkg/notify/template/doc.go index aebfaab473..fe2add7fa7 100644 --- a/pkg/notify/template/doc.go +++ b/pkg/notify/template/doc.go @@ -1 +1,15 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package template // import "yunion.io/x/onecloud/pkg/notify/template" From 29c9d05b5f20633736df472dced2ae1a121b5c36 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 9 Jan 2020 15:34:29 +0800 Subject: [PATCH 2/9] refine auto-gen swagger documentation --- pkg/apis/compute/cloudprovider.go | 24 +-- pkg/apis/compute/dbinstance.go | 33 +++- pkg/apis/compute/disk.go | 58 ++++-- pkg/apis/compute/elasticcache_const.go | 20 +- pkg/apis/compute/elasticips_const.go | 2 +- pkg/apis/compute/geo_input.go | 36 ++-- pkg/apis/compute/guests.go | 64 ++++--- pkg/apis/compute/host.go | 8 +- pkg/apis/compute/input.go | 20 +- pkg/apis/compute/instance_group.go | 24 ++- pkg/apis/compute/isolated_device_const.go | 2 +- pkg/apis/compute/loadbalancer.go | 20 +- pkg/apis/compute/natgateway.go | 4 +- pkg/apis/compute/network.go | 26 +-- pkg/apis/compute/reservedip.go | 2 +- pkg/apis/compute/schedtag.go | 8 +- pkg/apis/compute/secgroup.go | 29 ++- pkg/apis/compute/sku_const.go | 10 +- pkg/apis/compute/snapshot.go | 20 +- pkg/apis/compute/storage_const.go | 12 +- pkg/apis/compute/vpcs_const.go | 9 +- pkg/apis/identity/input.go | 178 ++++++++++-------- pkg/apis/input.go | 16 +- pkg/apis/modelbase.go | 6 +- pkg/apis/sharablevirtualresource.go | 4 + pkg/cloudcommon/db/adminsharablevirtual.go | 11 ++ pkg/compute/models/baremetalagents.go | 5 + pkg/compute/models/buckets.go | 1 - pkg/compute/models/cachedimages.go | 15 +- pkg/compute/models/cloudproviders.go | 4 + pkg/compute/models/dbinstance_backups.go | 4 +- pkg/compute/models/dbinstances.go | 6 +- pkg/compute/models/disks.go | 5 +- pkg/compute/models/dnsrecords.go | 5 + pkg/compute/models/dynamicschedtags.go | 10 + pkg/compute/models/elasticcache_accounts.go | 8 + pkg/compute/models/elasticcache_acls.go | 8 + pkg/compute/models/elasticcache_backups.go | 8 + pkg/compute/models/elasticcache_parameters.go | 8 + pkg/compute/models/elasticcache_skus.go | 4 +- pkg/compute/models/elasticips.go | 3 +- pkg/compute/models/external_projects.go | 1 - pkg/compute/models/groups.go | 2 +- pkg/compute/models/guests.go | 16 +- pkg/compute/models/hosts.go | 5 +- pkg/compute/models/instance_snapshots.go | 2 +- pkg/compute/models/isolated_devices.go | 6 +- pkg/compute/models/loadbalanceracls.go | 9 + pkg/compute/models/loadbalancerlisteners.go | 2 +- pkg/compute/models/loadbalancers.go | 5 +- pkg/compute/models/managedresource.go | 69 ++++--- pkg/compute/models/networkinterfaces.go | 2 - pkg/compute/models/networks.go | 17 +- pkg/compute/models/reservedips.go | 2 +- pkg/compute/models/routetables.go | 1 - pkg/compute/models/secgroupcache.go | 2 +- pkg/compute/models/secgrouprules.go | 2 +- pkg/compute/models/secgroups.go | 7 +- pkg/compute/models/skus.go | 2 +- pkg/compute/models/snapshots.go | 1 - pkg/compute/models/storagecaches.go | 1 - pkg/compute/models/storages.go | 6 +- pkg/compute/models/vpcs.go | 1 - pkg/compute/models/wires.go | 12 +- pkg/compute/models/zones.go | 2 +- pkg/keystone/models/groups.go | 4 +- pkg/keystone/models/projects.go | 4 +- pkg/keystone/models/roles.go | 6 +- 68 files changed, 556 insertions(+), 373 deletions(-) diff --git a/pkg/apis/compute/cloudprovider.go b/pkg/apis/compute/cloudprovider.go index 6e65bf5711..8f7b5d2746 100644 --- a/pkg/apis/compute/cloudprovider.go +++ b/pkg/apis/compute/cloudprovider.go @@ -47,30 +47,30 @@ type ManagedResourceListInput struct { // List objects belonging to the cloud provider Cloudprovider string `json:"cloudprovider"` // List objects belonging to the cloud provider - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 Manager string `json:"manager"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 ManagerId string `json:"manager_id"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 CloudproviderId string `json:"cloudprovider_id"` // List objects belonging to the cloud account Cloudaccount string `json:"cloudaccount"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 CloudaccountId string `json:"cloudaccount_id"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 Account string `json:"account"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 AccountId string `json:"account_id"` @@ -84,25 +84,25 @@ type ManagedResourceListInput struct { // enum: public,private,onpremise CloudEnv string `json:"cloud_env"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 PublicCloud bool `json:"public_cloud"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 IsPublic bool `json:"is_public"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 PrivateCloud bool `json:"private_cloud"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 IsPrivate bool `json:"is_private"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 IsOnPremise bool `json:"is_on_premise"` @@ -163,7 +163,7 @@ func (input ManagedResourceListInput) CloudEnvStr() string { type CapabilityListInput struct { // filter by cloudprovider capability Capability []string `json:"capability"` - // swagger: ignore + // swagger:ignore // Deprecated // filter by HasObjectStorage HasObjectStorage *bool `json:"has_object_storage"` diff --git a/pkg/apis/compute/dbinstance.go b/pkg/apis/compute/dbinstance.go index 456dad61ec..1f358d560e 100644 --- a/pkg/apis/compute/dbinstance.go +++ b/pkg/apis/compute/dbinstance.go @@ -165,19 +165,18 @@ type SDBInstanceRecoveryConfigInput struct { type DBInstanceListInput struct { apis.VirtualResourceListInput - ZonalResourceListInput + ZonalFilterListInput ManagedResourceListInput - VpcResourceListInput + VpcFilterListInput } type DBInstanceBackupListInput struct { apis.VirtualResourceListInput ManagedResourceListInput - RegionalResourceListInput + RegionalFilterListInput - // filter by dbinstance - Dbinstance string `json:"dbinstance"` + DbinstanceFilterListInput } type DBInstancePrivilegeListInput struct { @@ -192,20 +191,36 @@ type DBInstancePrivilegeListInput struct { type DBInstanceParameterListInput struct { apis.StandaloneResourceListInput - // filter by dbinstance - Dbinstance string `json:"dbinstance"` + DbinstanceFilterListInput } type DBInstanceDatabaseListInput struct { apis.StatusStandaloneResourceListInput - // filter by dbinstance - Dbinstance string `json:"dbinstance"` + DbinstanceFilterListInput } type DBInstanceAccountListInput struct { apis.StatusStandaloneResourceListInput + DbinstanceFilterListInput +} + +type DbinstanceFilterListInput struct { // filter by dbinstance Dbinstance string `json:"dbinstance"` + // swagger:ignore + // Deprecated + // filter by dbinstance_id + DbinstanceId string `json:"dbinstance_id"` +} + +func (input DbinstanceFilterListInput) DbinstanceStr() string { + if len(input.Dbinstance) > 0 { + return input.Dbinstance + } + if len(input.DbinstanceId) > 0 { + return input.DbinstanceId + } + return "" } diff --git a/pkg/apis/compute/disk.go b/pkg/apis/compute/disk.go index c05b4d2109..42ff0d780e 100644 --- a/pkg/apis/compute/disk.go +++ b/pkg/apis/compute/disk.go @@ -81,30 +81,45 @@ func (req *ServerCreateInput) ToDiskCreateInput() *DiskCreateInput { return &input } +type SnapshotPolicyFilterListInput struct { + // filter disk by snapshotpolicy + Snapshotpolicy string `json:"snapshotpolicy"` + // swagger:ignore + // Deprecated + // filter disk by snapshotpolicy_id + SnapshotpolicyId string `json:"snapshotpolicy_id"` +} + +func (input SnapshotPolicyFilterListInput) SnapshotpolicyStr() string { + if len(input.Snapshotpolicy) > 0 { + return input.Snapshotpolicy + } + if len(input.SnapshotpolicyId) > 0 { + return input.SnapshotpolicyId + } + return "" +} + type DiskListInput struct { apis.VirtualResourceListInput ManagedResourceListInput - BillingResourceListInput - StorageResourceListInput - StorageShareListInput + BillingFilterListInput + StorageFilterListInput + StorageShareFilterListInput + SnapshotPolicyFilterListInput + ServerFilterListInput // filter disk by whether it is being used Unused *bool `json:"unused"` - // filter disks attached to a guest - Guest string `json:"guest"` - // deprecated: true + + // swagger:ignore + // Deprecated // filter by disk type Type string `json:"type"` // filter by disk type DiskType string `json:"disk_type"` - // filter disk by snapshotpolicy - Snapshotpolicy string `json:"snapshotpolicy"` - // swagger: ignore - // Deprecated - // filter disk by snapshotpolicy_id - SnapshotpolicyId string `json:"snapshotpolicy_id"` } func (input DiskListInput) DiskTypeStr() string { @@ -117,12 +132,21 @@ func (input DiskListInput) DiskTypeStr() string { return "" } -func (input DiskListInput) SnapshotpolicyStr() string { - if len(input.Snapshotpolicy) > 0 { - return input.Snapshotpolicy +type DiskFilterListInput struct { + // filter by disk, id or name + Disk string `json:"disk"` + // swagger:ignore + // Deprecated + // filter by disk_id + DiskId string `json:"disk_id"` +} + +func (input DiskFilterListInput) DiskStr() string { + if len(input.Disk) > 0 { + return input.Disk } - if len(input.SnapshotpolicyId) > 0 { - return input.SnapshotpolicyId + if len(input.DiskId) > 0 { + return input.DiskId } return "" } diff --git a/pkg/apis/compute/elasticcache_const.go b/pkg/apis/compute/elasticcache_const.go index 57389490ec..39a89da1a7 100644 --- a/pkg/apis/compute/elasticcache_const.go +++ b/pkg/apis/compute/elasticcache_const.go @@ -110,8 +110,24 @@ const ( type ElasticcacheListInput struct { apis.VirtualResourceListInput - ZonalResourceListInput - VpcResourceListInput + ZonalFilterListInput + VpcFilterListInput ManagedResourceListInput } + +type ElasticcacheAccountListInput struct { + apis.StatusStandaloneResourceListInput +} + +type ElasticcacheAclListInput struct { + apis.StandaloneResourceListInput +} + +type ElasticcacheBackupListInput struct { + apis.StatusStandaloneResourceListInput +} + +type ElasticcacheParameterListInput struct { + apis.StandaloneResourceListInput +} diff --git a/pkg/apis/compute/elasticips_const.go b/pkg/apis/compute/elasticips_const.go index 1f23ee0694..788a968866 100644 --- a/pkg/apis/compute/elasticips_const.go +++ b/pkg/apis/compute/elasticips_const.go @@ -57,7 +57,7 @@ type ElasticipListInput struct { apis.VirtualResourceListInput ManagedResourceListInput - RegionalResourceListInput + RegionalFilterListInput UsableResourceListInput // filter usable eip for given associate type diff --git a/pkg/apis/compute/geo_input.go b/pkg/apis/compute/geo_input.go index 6b643d8a5f..4f771b475d 100644 --- a/pkg/apis/compute/geo_input.go +++ b/pkg/apis/compute/geo_input.go @@ -18,27 +18,27 @@ import ( "yunion.io/x/onecloud/pkg/apis" ) -type RegionalResourceListInput struct { +type RegionalFilterListInput struct { // filter by city City string `json:"city"` // filter by cloudregion Cloudregion string `json:"cloudregion"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 CloudregionId string `json:"cloudregion_id"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 Region string `json:"region"` - // swagger: ignore + // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 RegionId string `json:"region_id"` } -func (input RegionalResourceListInput) CloudregionStr() string { +func (input RegionalFilterListInput) CloudregionStr() string { if len(input.Cloudregion) > 0 { return input.Cloudregion } @@ -54,12 +54,12 @@ func (input RegionalResourceListInput) CloudregionStr() string { return "" } -type ZonalResourceListInput struct { - RegionalResourceListInput +type ZonalFilterListInput struct { + RegionalFilterListInput // filter by zone Zone string `json:"zone"` - // swagger: ignore + // swagger:ignore // Deprecated // filter by zone_id ZoneId string `json:"zone_id"` @@ -67,7 +67,7 @@ type ZonalResourceListInput struct { Zones []string `json:"zones"` } -func (input ZonalResourceListInput) ZoneStr() string { +func (input ZonalFilterListInput) ZoneStr() string { if len(input.Zone) > 0 { return input.Zone } @@ -77,7 +77,7 @@ func (input ZonalResourceListInput) ZoneStr() string { return "" } -func (input ZonalResourceListInput) ZoneList() []string { +func (input ZonalFilterListInput) ZoneList() []string { zoneStr := input.ZoneStr() if len(zoneStr) > 0 { input.Zones = append(input.Zones, zoneStr) @@ -85,18 +85,18 @@ func (input ZonalResourceListInput) ZoneList() []string { return input.Zones } -type HostResourceListInput struct { - ZonalResourceListInput +type HostFilterListInput struct { + ZonalFilterListInput // filter by host Host string `json:"host"` - // swagger: ignore + // swagger:ignore // Deprecated // filter by host_id HostId string `json:"host_id"` } -func (input HostResourceListInput) HostStr() string { +func (input HostFilterListInput) HostStr() string { if len(input.Host) > 0 { return input.Host } @@ -112,11 +112,10 @@ type CloudregionListInput struct { ManagedResourceListInput UsableResourceListInput + UsableVpcResourceListInput // filter by city City string `json:"city"` - // filter by vpc usability - UsableVpc *bool `json:"usable_vpc"` // filter by service??? Service string `json:"service"` } @@ -127,12 +126,11 @@ type ZoneListInput struct { ManagedResourceListInput - RegionalResourceListInput + RegionalFilterListInput UsableResourceListInput + UsableVpcResourceListInput - // filter by vpc usability - UsableVpc *bool `json:"usable_vpc"` // filter by service Service string `json:"service"` } diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index feebcf9612..72e74a6d13 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -18,22 +18,54 @@ import ( "yunion.io/x/onecloud/pkg/apis" ) +type ServerFilterListInput struct { + // Filter by guest id or name + Server string `json:"server"` + // swagger:ignore + // Deprecated + // Filter by guest Id + ServerId string `json:"server_id"` + // swagger:ignore + // Deprecated + // Filter by guest Id + Guest string `json:"guest"` + // swagger:ignore + // Deprecated + // Filter by guest Id + GuestId string `json:"guest_id"` +} + +func (input ServerFilterListInput) ServerStr() string { + if len(input.Server) > 0 { + return input.Server + } + if len(input.ServerId) > 0 { + return input.ServerId + } + if len(input.Guest) > 0 { + return input.Guest + } + if len(input.GuestId) > 0 { + return input.GuestId + } + return "" +} + type ServerListInput struct { apis.VirtualResourceListInput ManagedResourceListInput - HostResourceListInput - NetworkResourceListInput - BillingResourceListInput + HostFilterListInput + NetworkFilterListInput + BillingFilterListInput + GroupFilterListInput + SecgroupFilterListInput + DiskFilterListInput - // Disk ID or Name - Disk string `json:"disk"` // Show baremetal servers Baremetal *bool `json:"baremetal"` // Show gpu servers Gpu *bool `json:"gpu"` - // Secgroup ID or Name - Secgroup string `json:"secgroup"` // AdminSecgroup ID or Name AdminSecgroup string `json:"admin_security"` // Show server of hypervisor choices:"kvm|esxi|container|baremetal|aliyun|azure|aws|huawei|ucloud|zstack|openstack"` @@ -48,17 +80,11 @@ type ServerListInput struct { OrderByDisk string `json:"order_by_disk"` // Order by host name choices:"asc|desc" OrderByHost string `json:"order_by_host"` - // Vpc id or name - Vpc string `json:"vpc"` // Eip id or name UsableServerForEip string `json:"usable_server_for_eip"` // Show Servers without user metadata WithoutUserMeta *bool `json:"without_user_meta"` - // Instance Group ID or Name - Group string `json:"group"` - // deprecated: true - // Filter by instance group Id - GroupId string `json:"group_id"` + // Resource type choices:"shared|prepaid|dedicated" ResourceType string `json:"resource_type"` // return backup guests on a host @@ -76,16 +102,6 @@ func (input ServerListInput) HypervisorList() []string { return ret } -func (input ServerListInput) GroupStr() string { - if len(input.Group) > 0 { - return input.Group - } - if len(input.GroupId) > 0 { - return input.GroupId - } - return "" -} - type ServerRebuildRootInput struct { apis.Meta diff --git a/pkg/apis/compute/host.go b/pkg/apis/compute/host.go index 1d8d3a5edf..22983589c0 100644 --- a/pkg/apis/compute/host.go +++ b/pkg/apis/compute/host.go @@ -49,11 +49,11 @@ type HostListInput struct { apis.DomainizedResourceListInput ManagedResourceListInput - ZonalResourceListInput - WireResourceListInput - SchedtagResourceListInput + ZonalFilterListInput + WireFilterListInput + SchedtagFilterListInput - StorageResourceListInput + StorageFilterListInput UsableResourceListInput // filter by ResourceType diff --git a/pkg/apis/compute/input.go b/pkg/apis/compute/input.go index cfa3ed687b..6058bc8339 100644 --- a/pkg/apis/compute/input.go +++ b/pkg/apis/compute/input.go @@ -47,7 +47,7 @@ type CachedimageListInput struct { apis.StandaloneResourceListInput ManagedResourceListInput - ZonalResourceListInput + ZonalFilterListInput } type ExternalProjectListInput struct { @@ -60,8 +60,8 @@ type RouteTableListInput struct { apis.VirtualResourceListInput ManagedResourceListInput - RegionalResourceListInput - VpcResourceListInput + RegionalFilterListInput + VpcFilterListInput } type SnapshotPolicyCacheListInput struct { @@ -71,7 +71,7 @@ type SnapshotPolicyCacheListInput struct { Snapshotpolicy string `json:"snapshotpolicy"` } -type BillingResourceListInput struct { +type BillingFilterListInput struct { // filter by billing_type BillingType string `json:"billing_type"` } @@ -81,3 +81,15 @@ type NetworkInterfaceListInput struct { ManagedResourceListInput } + +type BaremetalagentListInput struct { + apis.StandaloneResourceListInput +} + +type DnsRecordListInput struct { + apis.AdminSharableVirtualResourceListInput +} + +type DynamicschedtagListInput struct { + apis.StandaloneResourceListInput +} diff --git a/pkg/apis/compute/instance_group.go b/pkg/apis/compute/instance_group.go index 0ea389f4ad..b95c94c83a 100644 --- a/pkg/apis/compute/instance_group.go +++ b/pkg/apis/compute/instance_group.go @@ -18,14 +18,13 @@ import "yunion.io/x/onecloud/pkg/apis" type InstanceGroupListInput struct { apis.VirtualResourceListInput - ZonalResourceListInput + ZonalFilterListInput + ServerFilterListInput // Filter by service type ServiceType string `json:"service_type"` // Filter by parent id ParentId string `json:"parent_id"` - // Filter by guest id or name - Server string `json:"server"` } type InstanceGroupDetail struct { @@ -33,3 +32,22 @@ type InstanceGroupDetail struct { SGroup GuestCount int64 `json:"guest_count"` } + +type GroupFilterListInput struct { + // Instance Group ID or Name + Group string `json:"group"` + // swagger:ignore + // deprecated: true + // Filter by instance group Id + GroupId string `json:"group_id"` +} + +func (input GroupFilterListInput) GroupStr() string { + if len(input.Group) > 0 { + return input.Group + } + if len(input.GroupId) > 0 { + return input.GroupId + } + return "" +} diff --git a/pkg/apis/compute/isolated_device_const.go b/pkg/apis/compute/isolated_device_const.go index ebc7ebf55a..bb77be3055 100644 --- a/pkg/apis/compute/isolated_device_const.go +++ b/pkg/apis/compute/isolated_device_const.go @@ -47,7 +47,7 @@ type IsolatedDeviceListInput struct { apis.StandaloneResourceListInput apis.DomainizedResourceListInput - HostResourceListInput + HostFilterListInput // filter by GPU type Gpu *bool `json:"gpu"` diff --git a/pkg/apis/compute/loadbalancer.go b/pkg/apis/compute/loadbalancer.go index 1515549bfc..6dbcd13535 100644 --- a/pkg/apis/compute/loadbalancer.go +++ b/pkg/apis/compute/loadbalancer.go @@ -35,7 +35,7 @@ type LoadbalancerListenerListInput struct { apis.VirtualResourceListInput ManagedResourceListInput - RegionalResourceListInput + RegionalFilterListInput // filter by loadbalancer Loadbalancer string `json:"loadbalancer"` @@ -58,8 +58,8 @@ type LoadbalancerListInput struct { apis.VirtualResourceListInput ManagedResourceListInput - ZonalResourceListInput - NetworkResourceListInput + ZonalFilterListInput + NetworkFilterListInput // filter by cluster Cluster string `json:"cluster"` @@ -76,7 +76,7 @@ type LoadbalancerCertificateListInput struct { apis.VirtualResourceListInput UsableResourceListInput - RegionalResourceListInput + RegionalFilterListInput ManagedResourceListInput } @@ -84,7 +84,7 @@ type LoadbalancerBackendListInput struct { apis.VirtualResourceListInput ManagedResourceListInput - RegionalResourceListInput + RegionalFilterListInput // filter by backend server Backend string `json:"backend"` @@ -95,7 +95,7 @@ type LoadbalancerBackendListInput struct { type LoadbalancerBackendGroupListInput struct { apis.VirtualResourceListInput - RegionalResourceListInput + RegionalFilterListInput ManagedResourceListInput // filter by loadbalancer @@ -107,6 +107,10 @@ type LoadbalancerBackendGroupListInput struct { type LoadbalancerClusterListInput struct { apis.StandaloneResourceListInput - ZonalResourceListInput - WireResourceListInput + ZonalFilterListInput + WireFilterListInput +} + +type LoadbalancerAclListInput struct { + apis.SharableVirtualResourceListInput } diff --git a/pkg/apis/compute/natgateway.go b/pkg/apis/compute/natgateway.go index 6d42d8b8de..e962b1bbb5 100644 --- a/pkg/apis/compute/natgateway.go +++ b/pkg/apis/compute/natgateway.go @@ -41,8 +41,8 @@ const ( type NatGetewayListInput struct { apis.StandaloneResourceListInput - VpcResourceListInput - RegionalResourceListInput + VpcFilterListInput + RegionalFilterListInput ManagedResourceListInput } diff --git a/pkg/apis/compute/network.go b/pkg/apis/compute/network.go index 651840b556..abeb9b05ec 100644 --- a/pkg/apis/compute/network.go +++ b/pkg/apis/compute/network.go @@ -18,17 +18,17 @@ import ( "yunion.io/x/onecloud/pkg/apis" ) -type VpcResourceListInput struct { +type VpcFilterListInput struct { // filter by vpc // 过滤关联此Vpc的资源 Vpc string `json:"vpc"` - // swagger: ignore + // swagger:ignore // Deprecated // filter by vpc Id VpcId string `json:"vpc_id"` } -func (input VpcResourceListInput) VpcStr() string { +func (input VpcFilterListInput) VpcStr() string { if len(input.Vpc) > 0 { return input.Vpc } @@ -38,18 +38,18 @@ func (input VpcResourceListInput) VpcStr() string { return "" } -type WireResourceListInput struct { - VpcResourceListInput +type WireFilterListInput struct { + VpcFilterListInput // filter by wire // 过滤连接此二层网络的资源 Wire string `json:"wire"` - // swagger: ignore + // swagger:ignore // Deprecated // fitler by wire id WireId string `json:"wire_id"` } -func (input WireResourceListInput) WireStr() string { +func (input WireFilterListInput) WireStr() string { if len(input.Wire) > 0 { return input.Wire } @@ -59,19 +59,19 @@ func (input WireResourceListInput) WireStr() string { return "" } -type NetworkResourceListInput struct { - WireResourceListInput +type NetworkFilterListInput struct { + WireFilterListInput // filter by network // 过滤关联此网络的资源 Network string `json:"network"` - // swagger: ignore + // swagger:ignore // Deprecated // filter by networkId NetworkId string `json:"network"` } -func (input NetworkResourceListInput) NetworkStr() string { +func (input NetworkFilterListInput) NetworkStr() string { if len(input.Network) > 0 { return input.Network } @@ -84,13 +84,13 @@ func (input NetworkResourceListInput) NetworkStr() string { type NetworkListInput struct { apis.SharableVirtualResourceListInput - HostResourceListInput + HostFilterListInput ManagedResourceListInput UsableResourceListInput - VpcResourceListInput + WireFilterListInput } type NetworkCreateInput struct { diff --git a/pkg/apis/compute/reservedip.go b/pkg/apis/compute/reservedip.go index 9afef54957..046ce0c83f 100644 --- a/pkg/apis/compute/reservedip.go +++ b/pkg/apis/compute/reservedip.go @@ -31,7 +31,7 @@ const ( type ReservedipListInput struct { apis.ResourceBaseListInput - NetworkResourceListInput + NetworkFilterListInput // list all reserved ips, including expired ones All *bool `json:"all"` diff --git a/pkg/apis/compute/schedtag.go b/pkg/apis/compute/schedtag.go index 508d232f8f..93399a2a03 100644 --- a/pkg/apis/compute/schedtag.go +++ b/pkg/apis/compute/schedtag.go @@ -39,16 +39,16 @@ type SchedtagCreateInput struct { ResourceType string `json:"resource_type"` } -type SchedtagResourceListInput struct { +type SchedtagFilterListInput struct { // filter by schedtag Schedtag string `json:"schedtag"` - // swagger: ignore + // swagger:ignore // Deprecated // filter by schedtag_id SchedtagId string `json:"schedtag_id"` } -func (input SchedtagResourceListInput) SchedtagStr() string { +func (input SchedtagFilterListInput) SchedtagStr() string { if len(input.Schedtag) > 0 { return input.Schedtag } @@ -63,7 +63,7 @@ type SchedtagListInput struct { // fitler by resource_type ResourceType string `json:"resource_type"` - // swagger: ignore + // swagger:ignore // Deprecated // filter by type, alias for resource_type Type string `json:"type"` diff --git a/pkg/apis/compute/secgroup.go b/pkg/apis/compute/secgroup.go index 727edafa8d..9f6abf0322 100644 --- a/pkg/apis/compute/secgroup.go +++ b/pkg/apis/compute/secgroup.go @@ -132,22 +132,22 @@ type SSecgroupCreateInput struct { type SecgroupListInput struct { apis.SharableVirtualResourceListInput + // equals Equals string - Server string + + ServerFilterListInput } type SecurityGroupCacheListInput struct { apis.StatusStandaloneResourceListInput - // filter by security group - Secgroup string `json:"secgroup"` + SecgroupFilterListInput } type SecurityGroupRuleListInput struct { apis.ResourceBaseListInput + SecgroupFilterListInput - // filter by Security group - Secgroup string `json:"secgroup"` // filter by direction Direction string `json:"direction"` // filter by action @@ -155,3 +155,22 @@ type SecurityGroupRuleListInput struct { // filter by protocol Protocol string `json:"protocol"` } + +type SecgroupFilterListInput struct { + // filter by Security group + Secgroup string `json:"secgroup"` + // swagger:ignore + // Deprecated + // filter by secgroup_id + SecgroupId string `json:"secgroup_id"` +} + +func (input SecgroupFilterListInput) SecgroupStr() string { + if len(input.Secgroup) > 0 { + return input.Secgroup + } + if len(input.SecgroupId) > 0 { + return input.SecgroupId + } + return "" +} diff --git a/pkg/apis/compute/sku_const.go b/pkg/apis/compute/sku_const.go index 1a3d08fe7d..f47af39865 100644 --- a/pkg/apis/compute/sku_const.go +++ b/pkg/apis/compute/sku_const.go @@ -67,8 +67,9 @@ type ServerSkuListInput struct { apis.StatusStandaloneResourceListInput ManagedResourceListInput - ZonalResourceListInput + ZonalFilterListInput + BillingFilterListInput UsableResourceListInput // filter sku by memory size in MB @@ -79,8 +80,8 @@ type ElasticcacheSkuListInput struct { apis.StatusStandaloneResourceListInput UsableResourceListInput - BillingResourceListInput - ZonalResourceListInput + BillingFilterListInput + ZonalFilterListInput // filter sku by memory size in MB MemorySizeMb int `json:"memory_size_mb"` @@ -89,5 +90,6 @@ type ElasticcacheSkuListInput struct { type DBInstanceSkuListInput struct { apis.EnabledStatusStandaloneResourceListInput - RegionalResourceListInput + RegionalFilterListInput + BillingFilterListInput } diff --git a/pkg/apis/compute/snapshot.go b/pkg/apis/compute/snapshot.go index 376ac10369..13f2b90383 100644 --- a/pkg/apis/compute/snapshot.go +++ b/pkg/apis/compute/snapshot.go @@ -71,7 +71,7 @@ type SnapshotListInput struct { apis.VirtualResourceListInput ManagedResourceListInput - StorageShareListInput + StorageShareFilterListInput // filter snapshot that is fake deleted FakeDeleted *bool `json:"fake_deleted"` @@ -81,24 +81,8 @@ type SnapshotListInput struct { IsInstanceSnapshot *bool `json:"is_instance_snapshot"` } - type InstanceSnapshotListInput struct { apis.VirtualResourceListInput - // filter by guest - Guest string `json:"guest"` - // swagger: ignore - // Deprecated - // filter by guest id - GuestId string `json:"guest_id"` -} - -func (input InstanceSnapshotListInput) GuestStr() string { - if len(input.Guest) > 0 { - return input.Guest - } - if len(input.GuestId) > 0 { - return input.GuestId - } - return "" + ServerFilterListInput } diff --git a/pkg/apis/compute/storage_const.go b/pkg/apis/compute/storage_const.go index 8493f30c91..7506ccb5b5 100644 --- a/pkg/apis/compute/storage_const.go +++ b/pkg/apis/compute/storage_const.go @@ -138,16 +138,16 @@ var ( SHARED_STORAGE = []string{STORAGE_NFS, STORAGE_GPFS, STORAGE_RBD} ) -type StorageResourceListInput struct { +type StorageFilterListInput struct { // filter by storage Storage string `json:"storage"` - // swagger: ignore + // swagger:ignore // Deprecated // filter by storage_id StorageId string `json:"storage_id"` } -func (input StorageResourceListInput) StorageStr() string { +func (input StorageFilterListInput) StorageStr() string { if len(input.Storage) > 0 { return input.Storage } @@ -157,7 +157,7 @@ func (input StorageResourceListInput) StorageStr() string { return "" } -type StorageShareListInput struct { +type StorageShareFilterListInput struct { // filter shared storage Share *bool `json:"share"` // filter local storage @@ -169,9 +169,9 @@ type StorageListInput struct { apis.DomainizedResourceListInput ManagedResourceListInput - ZonalResourceListInput + ZonalFilterListInput UsableResourceListInput - StorageShareListInput + StorageShareFilterListInput } type StoragecacheListInput struct { diff --git a/pkg/apis/compute/vpcs_const.go b/pkg/apis/compute/vpcs_const.go index 6dadc2aea7..4f71006ed7 100644 --- a/pkg/apis/compute/vpcs_const.go +++ b/pkg/apis/compute/vpcs_const.go @@ -42,6 +42,11 @@ type UsableResourceListInput struct { Usable *bool `json:"usable"` } +type UsableVpcResourceListInput struct { + // filter by Vpc usability of the resource + UsableVpc *bool `json:"usable_vpc"` +} + type VpcListInput struct { apis.StatusStandaloneResourceListInput apis.DomainizedResourceListInput @@ -58,8 +63,8 @@ type WireListInput struct { apis.DomainizedResourceListInput ManagedResourceListInput - VpcResourceListInput - HostResourceListInput + VpcFilterListInput + HostFilterListInput } type GlobalVpcListInput struct { diff --git a/pkg/apis/identity/input.go b/pkg/apis/identity/input.go index d3495b77ed..6ddd7013b2 100644 --- a/pkg/apis/identity/input.go +++ b/pkg/apis/identity/input.go @@ -42,88 +42,24 @@ type EnabledIdentityBaseResourceListInput struct { Enabled *bool `json:"enabled"` } -type RoleListInput struct { - IdentityBaseResourceListInput - - // filter by project_id - ProjectId string `json:"project_id"` - // filter by user_id - UserId string `json:"user_id"` - // filter by group_id - GroupId string `json:"group_id"` -} - -type GroupListInput struct { - IdentityBaseResourceListInput - - // filter by user_id - UserId string `json:"user_id"` - // filter by project_id - ProjectId string `json:"project_id"` - // deprecated: true - // filter by tenant_id - TenantId string `json:"tenant_id"` -} - -func (input GroupListInput) ProjectIdStr() string { - if len(input.ProjectId) > 0 { - return input.ProjectId - } - if len(input.TenantId) > 0 { - return input.TenantId - } - return "" -} - -type ProjectListInput struct { - IdentityBaseResourceListInput - - // filter by user_id - UserId string `json:"user_id"` - // filter by group_id - GroupId string `json:"group_id"` -} - -type DomainListInput struct { - apis.StandaloneResourceListInput -} - -type UserListInput struct { - EnabledIdentityBaseResourceListInput - - // filter by group_id - GroupId string `json:"group_id"` - // deprecated: true - // filter by group - Group string `json:"group"` - +type ProjectFilterListInput struct { // filter by project Project string `json:"project"` + // swagger:ignore + // Deprecated // filter by project_id ProjectId string `json:"project_id"` + // swagger:ignore + // Deprecated // filter by tenant Tenant string `json:"tenant"` + // swagger:ignore + // Deprecated // filter by tenant_id TenantId string `json:"tenant_id"` - - // filter by role - Role string `json:"role"` - // deprecated: true - // filter by role_id - RoleId string `json:"role_id"` } -func (input UserListInput) GroupStr() string { - if len(input.GroupId) > 0 { - return input.GroupId - } - if len(input.Group) > 0 { - return input.Group - } - return "" -} - -func (input UserListInput) ProjectStr() string { +func (input ProjectFilterListInput) ProjectStr() string { if len(input.Project) > 0 { return input.Project } @@ -139,7 +75,54 @@ func (input UserListInput) ProjectStr() string { return "" } -func (input UserListInput) RoleStr() string { +type UserFilterListInput struct { + // filter by user + User string `json:"user"` + // swagger:ignore + // Deprecated + // filter by user_id + UserId string `json:"user_id"` +} + +func (input UserFilterListInput) UserStr() string { + if len(input.User) > 0 { + return input.User + } + if len(input.UserId) > 0 { + return input.UserId + } + return "" +} + +type GroupFilterListInput struct { + // filter by group + Group string `json:"group"` + // swagger:ignore + // Deprecated + // filter by group_id + GroupId string `json:"group_id"` +} + +func (input GroupFilterListInput) GroupStr() string { + if len(input.Group) > 0 { + return input.Group + } + if len(input.GroupId) > 0 { + return input.GroupId + } + return "" +} + +type RoleFilterListInput struct { + // filter by role + Role string `json:"role"` + // swagger:ignore + // Deprecated + // filter by role_id + RoleId string `json:"role_id"` +} + +func (input RoleFilterListInput) RoleStr() string { if len(input.Role) > 0 { return input.Role } @@ -149,17 +132,16 @@ func (input UserListInput) RoleStr() string { return "" } -type EndpointListInput struct { - apis.StandaloneResourceListInput - +type ServiceFilterListInput struct { // filter by service, either id or name Service string `json:"service"` - // deprecated: true + // swagger:ignore + // Deprecated // filter by service_id ServiceId string `json:"service_id"` } -func (input EndpointListInput) ServiceStr() string { +func (input ServiceFilterListInput) ServiceStr() string { if len(input.Service) > 0 { return input.Service } @@ -169,6 +151,46 @@ func (input EndpointListInput) ServiceStr() string { return "" } +type RoleListInput struct { + IdentityBaseResourceListInput + + ProjectFilterListInput + UserFilterListInput + GroupFilterListInput +} + +type GroupListInput struct { + IdentityBaseResourceListInput + + UserFilterListInput + ProjectFilterListInput +} + +type ProjectListInput struct { + IdentityBaseResourceListInput + + UserFilterListInput + GroupFilterListInput +} + +type DomainListInput struct { + apis.StandaloneResourceListInput +} + +type UserListInput struct { + EnabledIdentityBaseResourceListInput + + GroupFilterListInput + ProjectFilterListInput + RoleFilterListInput +} + +type EndpointListInput struct { + apis.StandaloneResourceListInput + + ServiceFilterListInput +} + type SJoinProjectsInput struct { Projects []string Roles []string diff --git a/pkg/apis/input.go b/pkg/apis/input.go index 7fda48a4fc..6c127ac0da 100644 --- a/pkg/apis/input.go +++ b/pkg/apis/input.go @@ -15,19 +15,23 @@ package apis type DomainizedResourceListInput struct { + // swagger:ignore // Is an admin call? equivalent to scope=system // Deprecated Admin *bool `json:"admin"` + // Specify query scope, either project, domain or system + // 指定查询的权限范围,可能值为project, domain or system Scope string `json:"scope"` // Project domain filter, either by Id or Name + // 指定查询的项目,ID or Name ProjectDomain string `json:"project_domain"` - // swagger: ignore + // swagger:ignore // Deprecated // Project domain Id filter, alias for project_domain ProjectDomainId string `json:"project_domain_id"` - // swagger: ignore + // swagger:ignore // Deprecated // Domain Id filter, alias for project_domain DomainId string `json:"domain_id"` @@ -61,15 +65,15 @@ type ProjectizedResourceListInput struct { // Filter by project, either ID or Name Project string `json:"project"` - // swagger: ignore + // swagger:ignore // Deprecated // Filter by project_id, alias for project ProjectId string `json:"project_id"` - // swagger: ignore + // swagger:ignore // Deprecated // Filter by tenant ID or Name, alias for project Tenant string `json:"tenant"` - // swagger: ignore + // swagger:ignore // Deprecated // Filter by tenant_id, alias for project TenantId string `json:"tenant_id"` @@ -106,7 +110,7 @@ type ProjectizedResourceCreateInput struct { type UserResourceListInput struct { // User ID or Name User string `json:"user"` - // swagger: ignore + // swagger:ignore // Deprecated // Filter by userId UserId string `json:"user_id"` diff --git a/pkg/apis/modelbase.go b/pkg/apis/modelbase.go index 56169c768e..b389962381 100644 --- a/pkg/apis/modelbase.go +++ b/pkg/apis/modelbase.go @@ -38,13 +38,13 @@ type ModelBaseListInput struct { OrderBy []string `json:"order_by"` // List Order // example: desc|asc - Order string + Order string `json:"order"` // Show more details Details *bool `json:"details"` // Filter results by a simple keyword search Search string `json:"search"` // Filters - Filter []string `json:"filters"` + Filter []string `json:"filter"` // Filters with joint table col; joint_tbl.related_key(origin_key).filter_col.filter_cond(filters) JointFilter []string `json:"joint_filter"` // If true, match if any of the filters matches; otherwise, match if all of the filters match @@ -59,4 +59,4 @@ type IncrementalListInput struct { // 增量加载的标记 // Marker for streamed pagination PagingMarker string `json:"paging_marker"` -} \ No newline at end of file +} diff --git a/pkg/apis/sharablevirtualresource.go b/pkg/apis/sharablevirtualresource.go index 2a4b5d6224..3773ea9e50 100644 --- a/pkg/apis/sharablevirtualresource.go +++ b/pkg/apis/sharablevirtualresource.go @@ -33,3 +33,7 @@ type SharableVirtualResourceListInput struct { // possible value is system, domain, project PublicScope string `json:"public_scope"` } + +type AdminSharableVirtualResourceListInput struct { + SharableVirtualResourceListInput +} diff --git a/pkg/cloudcommon/db/adminsharablevirtual.go b/pkg/cloudcommon/db/adminsharablevirtual.go index 61ef7451ac..87b3fb1d4b 100644 --- a/pkg/cloudcommon/db/adminsharablevirtual.go +++ b/pkg/cloudcommon/db/adminsharablevirtual.go @@ -21,8 +21,11 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/pkg/utils" + "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/pkg/errors" + "yunion.io/x/sqlchemy" ) type SAdminSharableVirtualResourceBase struct { @@ -161,3 +164,11 @@ func (model *SAdminSharableVirtualResourceBase) setInfo(ctx context.Context, func (model *SAdminSharableVirtualResourceBase) GetIAdminSharableVirtualModel() IAdminSharableVirtualModel { return model.GetVirtualObject().(IAdminSharableVirtualModel) } + +func (manager *SAdminSharableVirtualResourceBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input apis.AdminSharableVirtualResourceListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, input.SharableVirtualResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/compute/models/baremetalagents.go b/pkg/compute/models/baremetalagents.go index ca0f2c70ee..0a271f2b1d 100644 --- a/pkg/compute/models/baremetalagents.go +++ b/pkg/compute/models/baremetalagents.go @@ -28,6 +28,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/sqlchemy" ) type SBaremetalagentManager struct { @@ -274,3 +275,7 @@ func (agent *SBaremetalagent) setStoragecacheId(cacheId string) error { }) return err } + +func (manager *SBaremetalagentManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.BaremetalagentListInput) (*sqlchemy.SQuery, error) { + return manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) +} diff --git a/pkg/compute/models/buckets.go b/pkg/compute/models/buckets.go index 0873ef2e02..c9e141a4a4 100644 --- a/pkg/compute/models/buckets.go +++ b/pkg/compute/models/buckets.go @@ -583,7 +583,6 @@ func (manager *SBucketManager) ListItemFilter(ctx context.Context, q *sqlchemy.S if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index f8712d1bcb..bada250e61 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -604,23 +604,12 @@ func (manager *SCachedimageManager) ListItemFilter(ctx context.Context, q *sqlch return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "id", func() *sqlchemy.SQuery { - cachedImages := CachedimageManager.Query().SubQuery() - storagecachedImages := StoragecachedimageManager.Query().SubQuery() - storageCaches := StoragecacheManager.Query().SubQuery() - - subq := cachedImages.Query(cachedImages.Field("id")) - subq = subq.Join(storagecachedImages, sqlchemy.Equals(cachedImages.Field("id"), storagecachedImages.Field("cachedimage_id"))) - subq = subq.Join(storageCaches, sqlchemy.Equals(storagecachedImages.Field("storagecache_id"), storageCaches.Field("id"))) - return subq - }) - q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "id", func() *sqlchemy.SQuery { storagecachedImages := StoragecachedimageManager.Query().SubQuery() storageCaches := StoragecacheManager.Query().SubQuery() storages := StorageManager.Query().SubQuery() @@ -637,7 +626,7 @@ func (manager *SCachedimageManager) ListItemFilter(ctx context.Context, q *sqlch return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByZone(q, query.ZonalFilterListInput, "id", func() *sqlchemy.SQuery { storagecachedImages := StoragecachedimageManager.Query().SubQuery() storageCaches := StoragecacheManager.Query().SubQuery() storages := StorageManager.Query().SubQuery() diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 0fb7e22359..36e63fbc5b 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -139,6 +139,10 @@ func (manager *SCloudproviderManager) GetOnPremiseProviderIdsQuery() *sqlchemy.S return manager.GetProviderIdsQuery(tristate.None, tristate.True, nil, nil) } +func (manager *SCloudproviderManager) GetPrivateOrOnPremiseProviderIdsQuery() *sqlchemy.SSubQuery { + return manager.GetProviderIdsQuery(tristate.False, tristate.None, nil, nil) +} + func (manager *SCloudproviderManager) GetProviderIdsQuery(isPublic tristate.TriState, isOnPremise tristate.TriState, providers []string, brands []string) *sqlchemy.SSubQuery { return manager.GetProviderFieldQuery("id", isPublic, isOnPremise, providers, brands) } diff --git a/pkg/compute/models/dbinstance_backups.go b/pkg/compute/models/dbinstance_backups.go index bd6ec4e556..ceee164e20 100644 --- a/pkg/compute/models/dbinstance_backups.go +++ b/pkg/compute/models/dbinstance_backups.go @@ -108,14 +108,12 @@ func (manager *SDBInstanceBackupManager) ListItemFilter(ctx context.Context, q * return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByDomain") } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByRegion") } diff --git a/pkg/compute/models/dbinstances.go b/pkg/compute/models/dbinstances.go index ae84061b0b..fdb6f159a7 100644 --- a/pkg/compute/models/dbinstances.go +++ b/pkg/compute/models/dbinstances.go @@ -141,19 +141,17 @@ func (man *SDBInstanceManager) ListItemFilter(ctx context.Context, q *sqlchemy.S return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByDomain") } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + q, err = managedResourceFilterByZone(q, query.ZonalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByZone") } diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 3582eeccb0..6aab026d79 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -122,9 +122,6 @@ func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "storage_id", func() *sqlchemy.SQuery { - return storages.Query(storages.Field("id")) - }) billingTypeStr := query.BillingType if len(billingTypeStr) > 0 { @@ -165,7 +162,7 @@ func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) } - guestId := query.Guest + guestId := query.ServerStr() if len(guestId) > 0 { iGuest, err := GuestManager.FetchByIdOrName(userCred, guestId) if err == sql.ErrNoRows { diff --git a/pkg/compute/models/dnsrecords.go b/pkg/compute/models/dnsrecords.go index 2b03f41fd5..53a6f3f83c 100644 --- a/pkg/compute/models/dnsrecords.go +++ b/pkg/compute/models/dnsrecords.go @@ -26,6 +26,7 @@ import ( "yunion.io/x/pkg/util/regutils" "yunion.io/x/sqlchemy" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" @@ -486,3 +487,7 @@ func (rec *SDnsRecord) PerformDisable(ctx context.Context, userCred mcclient.Tok } return nil, nil } + +func (manager *SDnsRecordManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.DnsRecordListInput) (*sqlchemy.SQuery, error) { + return manager.SAdminSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.AdminSharableVirtualResourceListInput) +} diff --git a/pkg/compute/models/dynamicschedtags.go b/pkg/compute/models/dynamicschedtags.go index b92749997f..9bad62592e 100644 --- a/pkg/compute/models/dynamicschedtags.go +++ b/pkg/compute/models/dynamicschedtags.go @@ -25,10 +25,12 @@ import ( "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" + api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/conditionparser" + "yunion.io/x/pkg/errors" ) type IDynamicResourceManager interface { @@ -302,3 +304,11 @@ func FetchDynamicResourceObject(man IDynamicResourceManager, userCred mcclient.T } return res, nil } + +func (manager *SDynamicschedtagManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.DynamicschedtagListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input.StandaloneResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/compute/models/elasticcache_accounts.go b/pkg/compute/models/elasticcache_accounts.go index 6292b1d100..ad44e625d9 100644 --- a/pkg/compute/models/elasticcache_accounts.go +++ b/pkg/compute/models/elasticcache_accounts.go @@ -462,3 +462,11 @@ func (self *SElasticcacheAccount) GetDetailsLoginInfo(ctx context.Context, userC func (self *SElasticcacheAccount) ValidatePurgeCondition(ctx context.Context) error { return nil } + +func (manager *SElasticcacheAccountManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.ElasticcacheAccountListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input.StatusStandaloneResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/compute/models/elasticcache_acls.go b/pkg/compute/models/elasticcache_acls.go index 6c029112fd..44900a5c96 100644 --- a/pkg/compute/models/elasticcache_acls.go +++ b/pkg/compute/models/elasticcache_acls.go @@ -342,3 +342,11 @@ func (self *SElasticcacheAcl) StartDeleteElasticcacheAclTask(ctx context.Context func (self *SElasticcacheAcl) Delete(ctx context.Context, userCred mcclient.TokenCredential) error { return nil } + +func (manager *SElasticcacheAclManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.ElasticcacheAclListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input.StandaloneResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/compute/models/elasticcache_backups.go b/pkg/compute/models/elasticcache_backups.go index 1cd7ca18f2..6ace6d028a 100644 --- a/pkg/compute/models/elasticcache_backups.go +++ b/pkg/compute/models/elasticcache_backups.go @@ -366,3 +366,11 @@ func (self *SElasticcacheBackup) ValidateDeleteCondition(ctx context.Context) er func (self *SElasticcacheBackup) ValidatePurgeCondition(ctx context.Context) error { return nil } + +func (manager *SElasticcacheBackupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.ElasticcacheBackupListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input.StatusStandaloneResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/compute/models/elasticcache_parameters.go b/pkg/compute/models/elasticcache_parameters.go index 3dba52e2dc..5e8cac89b6 100644 --- a/pkg/compute/models/elasticcache_parameters.go +++ b/pkg/compute/models/elasticcache_parameters.go @@ -235,3 +235,11 @@ func (self *SElasticcacheParameter) StartUpdateElasticcacheParameterTask(ctx con func (self *SElasticcacheParameter) ValidatePurgeCondition(ctx context.Context) error { return nil } + +func (manager *SElasticcacheParameterManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.ElasticcacheParameterListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input.StandaloneResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/compute/models/elasticcache_skus.go b/pkg/compute/models/elasticcache_skus.go index 516bd78781..29010a32bc 100644 --- a/pkg/compute/models/elasticcache_skus.go +++ b/pkg/compute/models/elasticcache_skus.go @@ -186,14 +186,14 @@ func (manager *SElasticcacheSkuManager) ListItemFilter(ctx context.Context, q *s } } - q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + q, err = managedResourceFilterByZone(q, query.ZonalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByZone") } q = listItemDomainFilter(q, data) - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByRegion") } diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index cb5781d734..5ef202c2ed 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -89,14 +89,13 @@ func (manager *SElasticipManager) ListItemFilter(ctx context.Context, q *sqlchem if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByRegion") } diff --git a/pkg/compute/models/external_projects.go b/pkg/compute/models/external_projects.go index ab81ff8c2b..a741607dd2 100644 --- a/pkg/compute/models/external_projects.go +++ b/pkg/compute/models/external_projects.go @@ -282,7 +282,6 @@ func (manager *SExternalProjectManager) ListItemFilter(ctx context.Context, q *s if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { diff --git a/pkg/compute/models/groups.go b/pkg/compute/models/groups.go index 1020c81ba2..9edf433827 100644 --- a/pkg/compute/models/groups.go +++ b/pkg/compute/models/groups.go @@ -75,7 +75,7 @@ type SGroup struct { func (sm *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.InstanceGroupListInput) (*sqlchemy.SQuery, error) { - guestFilter := input.Server + guestFilter := input.ServerStr() if len(guestFilter) != 0 { guestObj, err := GuestManager.FetchByIdOrName(userCred, guestFilter) if err != nil { diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 23ba547bd5..146a480229 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -141,10 +141,6 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "host_id", func() *sqlchemy.SQuery { - hosts := HostManager.Query().SubQuery() - return hosts.Query(hosts.Field("id")) - }) billingTypeStr := query.BillingType if len(billingTypeStr) > 0 { @@ -188,7 +184,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", subq.SubQuery()) } - hostFilter := query.Host + hostFilter := query.HostStr() if len(hostFilter) > 0 { host, _ := HostManager.FetchByIdOrName(nil, hostFilter) if host == nil { @@ -202,7 +198,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } } - secgrpFilter := query.Secgroup + secgrpFilter := query.SecgroupStr() if len(secgrpFilter) > 0 { var notIn = false // HACK FOR NOT IN SECGROUP @@ -301,7 +297,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", sq) } - wireFilter := query.Wire + wireFilter := query.WireStr() if len(wireFilter) > 0 { wire, _ := WireManager.FetchByIdOrName(nil, wireFilter) if wire == nil { @@ -313,7 +309,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", sq) } - networkFilter := query.Network + networkFilter := query.NetworkStr() if len(networkFilter) > 0 { netI, _ := NetworkManager.FetchByIdOrName(userCred, networkFilter) if netI == nil { @@ -327,7 +323,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", sq) } - vpcFilter := query.Vpc + vpcFilter := query.VpcStr() if len(vpcFilter) > 0 { IVpc, err := VpcManager.FetchByIdOrName(userCred, vpcFilter) if err != nil { @@ -344,7 +340,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("id", sq) } - diskFilter := query.Disk + diskFilter := query.DiskStr() if len(diskFilter) > 0 { diskI, _ := DiskManager.FetchByIdOrName(userCred, diskFilter) if diskI == nil { diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 6bcdf109a9..977c54b885 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -176,7 +176,6 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { @@ -256,12 +255,12 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } } - q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + q, err = managedResourceFilterByZone(q, query.ZonalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByZone") } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "zone_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "zone_id", func() *sqlchemy.SQuery { return ZoneManager.Query("id") }) if err != nil { diff --git a/pkg/compute/models/instance_snapshots.go b/pkg/compute/models/instance_snapshots.go index e047db8af2..c448bdfaec 100644 --- a/pkg/compute/models/instance_snapshots.go +++ b/pkg/compute/models/instance_snapshots.go @@ -77,7 +77,7 @@ func (manager *SInstanceSnapshotManager) ListItemFilter(ctx context.Context, q * return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - guestStr := query.GuestStr() + guestStr := query.ServerStr() if len(guestStr) > 0 { guestObj, err := GuestManager.FetchByIdOrName(userCred, guestStr) if err != nil { diff --git a/pkg/compute/models/isolated_devices.go b/pkg/compute/models/isolated_devices.go index aee7f0787b..29181993a3 100644 --- a/pkg/compute/models/isolated_devices.go +++ b/pkg/compute/models/isolated_devices.go @@ -155,7 +155,7 @@ func (manager *SIsolatedDeviceManager) ListItemFilter(ctx context.Context, q *sq if query.Usb != nil && *query.Usb { q = q.Equals("dev_type", "USB") } - hostStr := query.Host + hostStr := query.HostStr() var sq *sqlchemy.SSubQuery if len(hostStr) > 0 { hosts := HostManager.Query().SubQuery() @@ -170,7 +170,7 @@ func (manager *SIsolatedDeviceManager) ListItemFilter(ctx context.Context, q *sq q = q.IsEmpty("guest_id") } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "host_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "host_id", func() *sqlchemy.SQuery { hosts := HostManager.Query().SubQuery() zones := ZoneManager.Query().SubQuery() @@ -182,7 +182,7 @@ func (manager *SIsolatedDeviceManager) ListItemFilter(ctx context.Context, q *sq return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "host_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByZone(q, query.ZonalFilterListInput, "host_id", func() *sqlchemy.SQuery { return HostManager.Query("id") }) if err != nil { diff --git a/pkg/compute/models/loadbalanceracls.go b/pkg/compute/models/loadbalanceracls.go index 50acf485b7..c5b96d0f23 100644 --- a/pkg/compute/models/loadbalanceracls.go +++ b/pkg/compute/models/loadbalanceracls.go @@ -38,6 +38,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/pkg/errors" ) type SLoadbalancerAclEntry struct { @@ -413,3 +414,11 @@ func (manager *SLoadbalancerAclManager) InitializeData() error { return nil } + +func (manager *SLoadbalancerAclManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.LoadbalancerAclListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, input.SharableVirtualResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/compute/models/loadbalancerlisteners.go b/pkg/compute/models/loadbalancerlisteners.go index 5fbd9f2ba8..83fce85184 100644 --- a/pkg/compute/models/loadbalancerlisteners.go +++ b/pkg/compute/models/loadbalancerlisteners.go @@ -204,7 +204,7 @@ func (man *SLoadbalancerListenerManager) ListItemFilter(ctx context.Context, q * if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByRegion") } diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index a8dcc68d81..6bfdc50fff 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -98,19 +98,18 @@ func (man *SLoadbalancerManager) ListItemFilter(ctx context.Context, q *sqlchemy if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) q, err = man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + q, err = managedResourceFilterByZone(q, query.ZonalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByZone") } diff --git a/pkg/compute/models/managedresource.go b/pkg/compute/models/managedresource.go index d4f5a1d241..c0e75a490c 100644 --- a/pkg/compute/models/managedresource.go +++ b/pkg/compute/models/managedresource.go @@ -232,18 +232,12 @@ func filterByProviderStrs(q *sqlchemy.SQuery, filterField string, subqFunc func( } func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { - // deprecate at 3.0 - for _, provider := range []string{input.Cloudprovider, input.Manager, input.ManagerId, input.CloudproviderId} { - if len(provider) > 0 { - input.Cloudprovider = provider - break - } - } - if len(input.Cloudprovider) > 0 { - provider, err := CloudproviderManager.FetchByIdOrName(nil, input.Cloudprovider) + cloudproviderStr := input.CloudproviderStr() + if len(input.CloudproviderStr()) > 0 { + provider, err := CloudproviderManager.FetchByIdOrName(nil, cloudproviderStr) if err != nil { if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), input.Cloudprovider) + return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), cloudproviderStr) } return nil, httperrors.NewGeneralError(err) } @@ -256,19 +250,12 @@ func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourc } } - // deprecate at 3.0 - for _, account := range []string{input.Cloudaccount, input.CloudaccountId, input.Account, input.AccountId} { - if len(account) > 0 { - input.Cloudaccount = account - break - } - } - - if len(input.Cloudaccount) > 0 { - account, err := CloudaccountManager.FetchByIdOrName(nil, input.Cloudaccount) + cloudaccountStr := input.CloudaccountStr() + if len(cloudaccountStr) > 0 { + account, err := CloudaccountManager.FetchByIdOrName(nil, cloudaccountStr) if err != nil { if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), input.Cloudaccount) + return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), cloudaccountStr) } return nil, httperrors.NewGeneralError(err) } @@ -290,10 +277,12 @@ func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourc q = filterByProviderStrs(q, filterField, subqFunc, "brand", input.Brands) } + q = filterByCloudType(q, input, filterField, subqFunc) + return q, nil } -func managedResourceFilterByZone(q *sqlchemy.SQuery, query api.ZonalResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { +func managedResourceFilterByZone(q *sqlchemy.SQuery, query api.ZonalFilterListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { zoneStr := query.ZoneStr() if len(zoneStr) > 0 { zoneObj, err := ZoneManager.FetchByIdOrName(nil, zoneStr) @@ -312,10 +301,11 @@ func managedResourceFilterByZone(q *sqlchemy.SQuery, query api.ZonalResourceList q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } } + return q, nil } -func managedResourceFilterByRegion(q *sqlchemy.SQuery, query api.RegionalResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { +func managedResourceFilterByRegion(q *sqlchemy.SQuery, query api.RegionalFilterListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { regionStr := query.CloudregionStr() if len(regionStr) > 0 { regionObj, err := CloudregionManager.FetchByIdOrName(nil, regionStr) @@ -347,8 +337,11 @@ func managedResourceFilterByRegion(q *sqlchemy.SQuery, query api.RegionalResourc return q, nil } -func managedResourceFilterByCloudType(q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) *sqlchemy.SQuery { - if input.CloudEnv == api.CLOUD_ENV_PUBLIC_CLOUD || input.PublicCloud || input.IsPublic { +func filterByCloudType(q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) *sqlchemy.SQuery { + cloudEnvStr := input.CloudEnvStr() + + switch cloudEnvStr { + case api.CLOUD_ENV_PUBLIC_CLOUD: if len(filterField) == 0 { q = q.Filter(sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPublicProviderIdsQuery())) } else { @@ -356,9 +349,7 @@ func managedResourceFilterByCloudType(q *sqlchemy.SQuery, input api.ManagedResou sq = sq.Filter(sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetPublicProviderIdsQuery())) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } - } - - if input.CloudEnv == api.CLOUD_ENV_PRIVATE_CLOUD || input.PrivateCloud || input.IsPrivate { + case api.CLOUD_ENV_PRIVATE_CLOUD: if len(filterField) == 0 { q = q.Filter(sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery())) } else { @@ -366,9 +357,7 @@ func managedResourceFilterByCloudType(q *sqlchemy.SQuery, input api.ManagedResou sq = sq.Filter(sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery())) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } - } - - if input.CloudEnv == api.CLOUD_ENV_ON_PREMISE || input.IsOnPremise { + case api.CLOUD_ENV_ON_PREMISE: if len(filterField) == 0 { q = q.Filter( sqlchemy.OR( @@ -386,6 +375,24 @@ func managedResourceFilterByCloudType(q *sqlchemy.SQuery, input api.ManagedResou ) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } + case api.CLOUD_ENV_PRIVATE_ON_PREMISE: + if len(filterField) == 0 { + q = q.Filter( + sqlchemy.OR( + sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPrivateOrOnPremiseProviderIdsQuery()), + sqlchemy.IsNullOrEmpty(q.Field("manager_id")), + ), + ) + } else { + sq := subqFunc() + sq = sq.Filter( + sqlchemy.OR( + sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetPrivateOrOnPremiseProviderIdsQuery()), + sqlchemy.IsNullOrEmpty(sq.Field("manager_id")), + ), + ) + q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) + } } if input.IsManaged { diff --git a/pkg/compute/models/networkinterfaces.go b/pkg/compute/models/networkinterfaces.go index 6347728232..12a7de3826 100644 --- a/pkg/compute/models/networkinterfaces.go +++ b/pkg/compute/models/networkinterfaces.go @@ -92,8 +92,6 @@ func (manager *SNetworkInterfaceManager) ListItemFilter(ctx context.Context, q * return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) - q, err = manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) if err != nil { return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 0288688a18..997e0dba53 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -1746,14 +1746,6 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, input.ManagedResourceListInput, "wire_id", func() *sqlchemy.SQuery { - wires := WireManager.Query().SubQuery() - vpcs := VpcManager.Query().SubQuery() - subq := wires.Query(wires.Field("id")) - subq = subq.Join(vpcs, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) - return subq - }) - q, err = manager.SSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, input.SharableVirtualResourceListInput) if err != nil { return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter") @@ -1818,7 +1810,7 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery())) } - q, err = managedResourceFilterByRegion(q, input.RegionalResourceListInput, "wire_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByRegion(q, input.RegionalFilterListInput, "wire_id", func() *sqlchemy.SQuery { wires := WireManager.Query().SubQuery() vpcs := VpcManager.Query().SubQuery() sq := wires.Query(wires.Field("id")). @@ -1856,7 +1848,7 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. q = q.In("wire_id", sq.SubQuery()).Equals("status", api.NETWORK_STATUS_AVAILABLE) } - hostStr:= input.HostStr() + hostStr := input.HostStr() if len(hostStr) > 0 { hostObj, err := HostManager.FetchByIdOrName(userCred, hostStr) if err != nil { @@ -2199,13 +2191,16 @@ func (manager *SNetworkManager) PerformTryCreateNetwork(ctx context.Context, use if err != nil { return nil, errors.Wrap(err, "query.Unmarshal") } - q = managedResourceFilterByCloudType(q, listQuery.ManagedResourceListInput, "wire_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByAccount(q, listQuery.ManagedResourceListInput, "wire_id", func() *sqlchemy.SQuery { wires := WireManager.Query().SubQuery() vpcs := VpcManager.Query().SubQuery() subq := wires.Query(wires.Field("id")) subq = subq.Join(vpcs, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) return subq }) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByAccount") + } rows, err := q.Rows() if err != nil { diff --git a/pkg/compute/models/reservedips.go b/pkg/compute/models/reservedips.go index caba84efb4..473416a8ac 100644 --- a/pkg/compute/models/reservedips.go +++ b/pkg/compute/models/reservedips.go @@ -191,7 +191,7 @@ func (manager *SReservedipManager) ListItemFilter(ctx context.Context, q *sqlche sqlchemy.GT(q.Field("expired_at"), time.Now().UTC()), )) } - network := query.Network + network := query.NetworkStr() if len(network) > 0 { netObj, _ := NetworkManager.FetchByIdOrName(userCred, network) if netObj == nil { diff --git a/pkg/compute/models/routetables.go b/pkg/compute/models/routetables.go index 67af290d13..71cfec6a04 100644 --- a/pkg/compute/models/routetables.go +++ b/pkg/compute/models/routetables.go @@ -133,7 +133,6 @@ func (man *SRouteTableManager) ListItemFilter(ctx context.Context, q *sqlchemy.S if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) q, err = man.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { diff --git a/pkg/compute/models/secgroupcache.go b/pkg/compute/models/secgroupcache.go index bdcc763dbd..012893fcf9 100644 --- a/pkg/compute/models/secgroupcache.go +++ b/pkg/compute/models/secgroupcache.go @@ -79,7 +79,7 @@ func (manager *SSecurityGroupCacheManager) ListItemFilter(ctx context.Context, q if err != nil { return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } - if defsecgroup := query.Secgroup; len(defsecgroup) > 0 { + if defsecgroup := query.SecgroupStr(); len(defsecgroup) > 0 { secgroup, err := SecurityGroupManager.FetchByIdOrName(userCred, defsecgroup) if err != nil { if err == sql.ErrNoRows { diff --git a/pkg/compute/models/secgrouprules.go b/pkg/compute/models/secgrouprules.go index 65bf12a676..f2ccd09592 100644 --- a/pkg/compute/models/secgrouprules.go +++ b/pkg/compute/models/secgrouprules.go @@ -162,7 +162,7 @@ func (manager *SSecurityGroupRuleManager) ListItemFilter(ctx context.Context, q if err != nil { return nil, errors.Wrap(err, "SResourceBaseManager.ListItemFilter") } - if defsecgroup := query.Secgroup; len(defsecgroup) > 0 { + if defsecgroup := query.SecgroupStr(); len(defsecgroup) > 0 { if secgroup, _ := SecurityGroupManager.FetchByIdOrName(userCred, defsecgroup); secgroup != nil { sql = sql.Equals("secgroup_id", secgroup.GetId()) } else { diff --git a/pkg/compute/models/secgroups.go b/pkg/compute/models/secgroups.go index ad443d8ca8..f5ef587350 100644 --- a/pkg/compute/models/secgroups.go +++ b/pkg/compute/models/secgroups.go @@ -103,11 +103,12 @@ func (manager *SSecurityGroupManager) ListItemFilter(ctx context.Context, q *sql } q = q.In("id", secgroupIds) } - if len(input.Server) > 0 { - guest, err := GuestManager.FetchByIdOrName(userCred, input.Server) + serverStr := input.ServerStr() + if len(serverStr) > 0 { + guest, err := GuestManager.FetchByIdOrName(userCred, serverStr) if err != nil { if err != sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError("failed to found server %s", input.Server) + return nil, httperrors.NewResourceNotFoundError2(GuestManager.Keyword(), serverStr) } return nil, httperrors.NewGeneralError(err) } diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index 32e8a40e68..e3888bc65d 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -793,7 +793,7 @@ func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchem q = q.Equals("zone_id", zone.Id) } } else if len(regionStr) > 0 { - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByRegion") } diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index c3d1135805..1a80e51cf6 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -94,7 +94,6 @@ func (manager *SSnapshotManager) ListItemFilter(ctx context.Context, q *sqlchemy if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { diff --git a/pkg/compute/models/storagecaches.go b/pkg/compute/models/storagecaches.go index ca11814fe1..692ad85517 100644 --- a/pkg/compute/models/storagecaches.go +++ b/pkg/compute/models/storagecaches.go @@ -409,7 +409,6 @@ func (manager *SStoragecacheManager) ListItemFilter(ctx context.Context, q *sqlc if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index 01da064c1e..595a1fe9e4 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -1118,7 +1118,7 @@ func (manager *SStorageManager) ListItemFilter(ctx context.Context, q *sqlchemy. if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) + q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByDomain") @@ -1129,14 +1129,14 @@ func (manager *SStorageManager) ListItemFilter(ctx context.Context, q *sqlchemy. return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "zone_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "zone_id", func() *sqlchemy.SQuery { return ZoneManager.Query("id") }) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + q, err = managedResourceFilterByZone(q, query.ZonalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByZone") } diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index 484b3a14d8..205a398590 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -791,7 +791,6 @@ func (manager *SVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQue if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByDomain") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "", nil) q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "", nil) if err != nil { diff --git a/pkg/compute/models/wires.go b/pkg/compute/models/wires.go index 04aa6bed21..7b7f53ff6b 100644 --- a/pkg/compute/models/wires.go +++ b/pkg/compute/models/wires.go @@ -838,12 +838,6 @@ func (manager *SWireManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu return nil, errors.Wrap(err, "managedResourceFilterByAccount") } - q = managedResourceFilterByCloudType(q, query.ManagedResourceListInput, "vpc_id", func() *sqlchemy.SQuery { - vpcs := VpcManager.Query().SubQuery() - subq := vpcs.Query(vpcs.Field("id")) - return subq - }) - q, err = managedResourceFilterByDomain(q, query.DomainizedResourceListInput, "vpc_id", func() *sqlchemy.SQuery { vpcs := VpcManager.Query().SubQuery() subq := vpcs.Query(vpcs.Field("id")) @@ -871,19 +865,19 @@ func (manager *SWireManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.Equals("vpc_id", vpc.GetId()) } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "vpc_id", func() *sqlchemy.SQuery { + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "vpc_id", func() *sqlchemy.SQuery { return VpcManager.Query("id") }) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - q, err = managedResourceFilterByZone(q, query.ZonalResourceListInput, "", nil) + q, err = managedResourceFilterByZone(q, query.ZonalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByZone") } - hostStr := query.Host + hostStr := query.HostStr() if len(hostStr) > 0 { hostObj, err := HostManager.FetchByIdOrName(userCred, hostStr) if err != nil { diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index 1199bbe2ea..9d096d16aa 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -613,7 +613,7 @@ func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("cloudregion_id", subq.SubQuery()) } - q, err = managedResourceFilterByRegion(q, query.RegionalResourceListInput, "", nil) + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) return q, nil } diff --git a/pkg/keystone/models/groups.go b/pkg/keystone/models/groups.go index 87992c9c78..5a1eb3685e 100644 --- a/pkg/keystone/models/groups.go +++ b/pkg/keystone/models/groups.go @@ -81,7 +81,7 @@ func (manager *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ return nil, err } - userIdStr := query.UserId + userIdStr := query.UserStr() if len(userIdStr) > 0 { user, err := UserManager.FetchById(userIdStr) if err != nil { @@ -95,7 +95,7 @@ func (manager *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("id", subq.SubQuery()) } - projIdStr := query.ProjectIdStr() + projIdStr := query.ProjectStr() if len(projIdStr) > 0 { proj, err := ProjectManager.FetchProjectById(projIdStr) if err != nil { diff --git a/pkg/keystone/models/projects.go b/pkg/keystone/models/projects.go index ad2d1d3732..2b3b97b968 100644 --- a/pkg/keystone/models/projects.go +++ b/pkg/keystone/models/projects.go @@ -209,7 +209,7 @@ func (manager *SProjectManager) ListItemFilter(ctx context.Context, q *sqlchemy. return nil, err } - userStr := query.UserId + userStr := query.UserStr() if len(userStr) > 0 { userObj, err := UserManager.FetchById(userStr) if err != nil { @@ -223,7 +223,7 @@ func (manager *SProjectManager) ListItemFilter(ctx context.Context, q *sqlchemy. q = q.In("id", subq.SubQuery()) } - groupStr := query.GroupId + groupStr := query.GroupStr() if len(groupStr) > 0 { groupObj, err := GroupManager.FetchById(groupStr) if err != nil { diff --git a/pkg/keystone/models/roles.go b/pkg/keystone/models/roles.go index e5c73ec1f9..48faad5605 100644 --- a/pkg/keystone/models/roles.go +++ b/pkg/keystone/models/roles.go @@ -229,7 +229,7 @@ func (manager *SRoleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } var projectId string - projectStr := query.ProjectId + projectStr := query.ProjectStr() if len(projectStr) > 0 { project, err := ProjectManager.FetchProjectById(projectStr) if err != nil { @@ -242,7 +242,7 @@ func (manager *SRoleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu projectId = project.Id } - userStr := query.UserId + userStr := query.UserStr() if len(projectId) > 0 && len(userStr) > 0 { userObj, err := UserManager.FetchById(userStr) if err != nil { @@ -256,7 +256,7 @@ func (manager *SRoleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", subq.SubQuery()) } - groupStr := query.GroupId + groupStr := query.GroupStr() if len(projectId) > 0 && len(groupStr) > 0 { groupObj, err := GroupManager.FetchById(groupStr) if err != nil { From b9be567ebfad401878270c90c915f78aa8a13175 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 10 Jan 2020 19:43:51 +0800 Subject: [PATCH 3/9] use deprecated-by tag to describe deprecated fields --- pkg/apis/compute/cloudprovider.go | 85 ++++++----------- pkg/apis/compute/dbinstance.go | 14 +-- pkg/apis/compute/disk.go | 48 +++------- pkg/apis/compute/geo_input.go | 64 +++---------- pkg/apis/compute/guests.go | 31 +------ pkg/apis/compute/instance_group.go | 18 +--- pkg/apis/compute/network.go | 46 ++------- pkg/apis/compute/schedtag.go | 26 +----- pkg/apis/compute/secgroup.go | 20 +--- pkg/apis/compute/storage_const.go | 14 +-- pkg/apis/identity/input.go | 93 ++++++------------- pkg/apis/image/image.go | 8 +- pkg/apis/input.go | 49 ++-------- pkg/apis/modelbase.go | 50 +++++++--- pkg/apis/sharablevirtualresource.go | 10 +- pkg/apis/standaloneresource.go | 20 ++-- pkg/apis/virtualresource.go | 6 +- pkg/compute/models/cloudaccounts.go | 8 +- pkg/compute/models/cloudproviders.go | 8 +- pkg/compute/models/cloudregions.go | 6 +- pkg/compute/models/disks.go | 8 +- pkg/compute/models/groups.go | 2 +- pkg/compute/models/guests.go | 59 +++++------- pkg/compute/models/hosts.go | 6 +- pkg/compute/models/instance_snapshots.go | 2 +- pkg/compute/models/isolated_devices.go | 2 +- .../models/loadbalancercertificates.go | 4 +- pkg/compute/models/managedresource.go | 14 +-- pkg/compute/models/networks.go | 4 +- pkg/compute/models/reservedips.go | 2 +- pkg/compute/models/schedtags.go | 2 +- pkg/compute/models/secgroupcache.go | 2 +- pkg/compute/models/secgrouprules.go | 2 +- pkg/compute/models/secgroups.go | 2 +- pkg/compute/models/skus.go | 6 +- pkg/compute/models/wires.go | 4 +- pkg/compute/models/zones.go | 6 +- pkg/image/models/image_guest.go | 8 ++ pkg/keystone/models/credentials.go | 4 + pkg/keystone/models/endpoints.go | 2 +- pkg/keystone/models/groups.go | 4 +- pkg/keystone/models/identity_provider.go | 4 + pkg/keystone/models/policies.go | 34 +++++++ pkg/keystone/models/projects.go | 4 +- pkg/keystone/models/regions.go | 11 +++ pkg/keystone/models/roles.go | 6 +- pkg/keystone/models/services.go | 8 ++ pkg/keystone/models/users.go | 6 +- 48 files changed, 336 insertions(+), 506 deletions(-) diff --git a/pkg/apis/compute/cloudprovider.go b/pkg/apis/compute/cloudprovider.go index 8f7b5d2746..d09fdae028 100644 --- a/pkg/apis/compute/cloudprovider.go +++ b/pkg/apis/compute/cloudprovider.go @@ -44,43 +44,52 @@ type CloudproviderDetails struct { } type ManagedResourceListInput struct { - // List objects belonging to the cloud provider + // 列出关联指定云订阅(ID或Name)的资源 Cloudprovider string `json:"cloudprovider"` // List objects belonging to the cloud provider // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - Manager string `json:"manager"` + Manager string `json:"manager" deprecated-by:"cloudprovider"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - ManagerId string `json:"manager_id"` + ManagerId string `json:"manager_id" deprecated-by:"cloudprovider"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - CloudproviderId string `json:"cloudprovider_id"` + CloudproviderId string `json:"cloudprovider_id" deprecated-by:"cloudprovider"` - // List objects belonging to the cloud account + // 列出关联指定云账号(ID或Name)的资源 Cloudaccount string `json:"cloudaccount"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - CloudaccountId string `json:"cloudaccount_id"` + CloudaccountId string `json:"cloudaccount_id" deprecated-by:"cloudaccount"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - Account string `json:"account"` + Account string `json:"account" deprecated-by:"cloudaccount"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - AccountId string `json:"account_id"` + AccountId string `json:"account_id" deprecated-by:"cloudaccount"` - // List objects from the providers, choices:"OneCloud|VMware|Aliyun|Qcloud|Azure|Aws|Huawei|OpenStack|Ucloud|ZStack|Google" + // 列出指定云平台的资源,支持的云平台如下 + // enum: OneCloud,VMware,Aliyun,Qcloud,Azure,Aws,Huawei,OpenStack,Ucloud,ZStack,Google,Ctyun,S3,Ceph,Xsky" Providers []string `json:"provider"` - // List objects belonging to brands + // 列出指定云平台品牌的资源 Brands []string `json:"brand"` + // 列出指定云环境的资源,支持云环境如下: + // + // | CloudEnv | 说明 | + // |-----------|--------| + // | public | 公有云 | + // | private | 私有云 | + // | onpremise | 本地IDC | + // // enum: public,private,onpremise CloudEnv string `json:"cloud_env"` @@ -107,61 +116,26 @@ type ManagedResourceListInput struct { // description: this param will be deprecate at 3.0 IsOnPremise bool `json:"is_on_premise"` - // List objects managed by external providers + // 过滤资源,是否为非OneCloud内置私有云管理的资源 // default: false IsManaged bool `json:"is_managed"` } -func (input ManagedResourceListInput) CloudaccountStr() string { - if len(input.Cloudaccount) > 0 { - return input.Cloudaccount - } - if len(input.CloudaccountId) > 0 { - return input.CloudaccountId - } - if len(input.Account) > 0 { - return input.Account - } - if len(input.AccountId) > 0 { - return input.AccountId - } - return "" -} - -func (input ManagedResourceListInput) CloudproviderStr() string { - if len(input.Cloudprovider) > 0 { - return input.Cloudprovider - } - if len(input.CloudproviderId) > 0 { - return input.CloudproviderId - } - if len(input.Manager) > 0 { - return input.Manager - } - if len(input.ManagerId) > 0 { - return input.ManagerId - } - return "" -} - -func (input ManagedResourceListInput) CloudEnvStr() string { +func (input *ManagedResourceListInput) AfterUnmarshal() { if len(input.CloudEnv) > 0 { - return input.CloudEnv + return } if input.PublicCloud || input.IsPublic { - return CLOUD_ENV_PUBLIC_CLOUD + input.CloudEnv = CLOUD_ENV_PUBLIC_CLOUD + } else if input.PrivateCloud || input.IsPrivate { + input.CloudEnv = CLOUD_ENV_PRIVATE_CLOUD + } else if input.IsOnPremise { + input.CloudEnv = CLOUD_ENV_ON_PREMISE } - if input.PrivateCloud || input.IsPrivate { - return CLOUD_ENV_PRIVATE_CLOUD - } - if input.IsOnPremise { - return CLOUD_ENV_ON_PREMISE - } - return "" } type CapabilityListInput struct { - // filter by cloudprovider capability + // 根据该云平台的功能对云账号或云订阅进行过滤 Capability []string `json:"capability"` // swagger:ignore // Deprecated @@ -179,9 +153,8 @@ type CloudproviderListInput struct { CapabilityListInput } -func (input CapabilityListInput) CapabilityList() []string { +func (input *CapabilityListInput) AfterUnmarshal() { if input.HasObjectStorage != nil && *input.HasObjectStorage && !utils.IsInStringArray(cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE, input.Capability) { input.Capability = append(input.Capability, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE) } - return input.Capability } diff --git a/pkg/apis/compute/dbinstance.go b/pkg/apis/compute/dbinstance.go index 1f358d560e..60c19c8d11 100644 --- a/pkg/apis/compute/dbinstance.go +++ b/pkg/apis/compute/dbinstance.go @@ -159,7 +159,7 @@ type SDBInstanceRecoveryConfigInput struct { DBInstancebackup string DBInstancebackupId string `json:"dbinstancebackup_id"` - Databases map[string]string `json:"allowempty"` + Databases map[string]string `json:"databases,allowempty"` } type DBInstanceListInput struct { @@ -212,15 +212,5 @@ type DbinstanceFilterListInput struct { // swagger:ignore // Deprecated // filter by dbinstance_id - DbinstanceId string `json:"dbinstance_id"` -} - -func (input DbinstanceFilterListInput) DbinstanceStr() string { - if len(input.Dbinstance) > 0 { - return input.Dbinstance - } - if len(input.DbinstanceId) > 0 { - return input.DbinstanceId - } - return "" + DbinstanceId string `json:"dbinstance_id" deprecated-by:"dbinstance"` } diff --git a/pkg/apis/compute/disk.go b/pkg/apis/compute/disk.go index 42ff0d780e..d2b99f41b4 100644 --- a/pkg/apis/compute/disk.go +++ b/pkg/apis/compute/disk.go @@ -87,17 +87,7 @@ type SnapshotPolicyFilterListInput struct { // swagger:ignore // Deprecated // filter disk by snapshotpolicy_id - SnapshotpolicyId string `json:"snapshotpolicy_id"` -} - -func (input SnapshotPolicyFilterListInput) SnapshotpolicyStr() string { - if len(input.Snapshotpolicy) > 0 { - return input.Snapshotpolicy - } - if len(input.SnapshotpolicyId) > 0 { - return input.SnapshotpolicyId - } - return "" + SnapshotpolicyId string `json:"snapshotpolicy_id" deprecated-by:"snapshotpolicy"` } type DiskListInput struct { @@ -117,36 +107,24 @@ type DiskListInput struct { // swagger:ignore // Deprecated // filter by disk type - Type string `json:"type"` - // filter by disk type + Type string `json:"type" deprecated-by:"disk_type"` + // 过滤指定disk_type的磁盘列表,可能的值为:sys, data, swap. volume + // + // | disk_type值 | 说明 | + // |-------------|----------| + // | sys | 虚拟机系统盘 | + // | data | 虚拟机数据盘 | + // | swap | 虚拟机内存交换盘 | + // | volume | 容器volumn盘 | + // DiskType string `json:"disk_type"` } -func (input DiskListInput) DiskTypeStr() string { - if len(input.DiskType) > 0 { - return input.DiskType - } - if len(input.Type) > 0 { - return input.Type - } - return "" -} - type DiskFilterListInput struct { - // filter by disk, id or name + // 以指定虚拟磁盘(ID或Name)过滤列表结果 Disk string `json:"disk"` // swagger:ignore // Deprecated // filter by disk_id - DiskId string `json:"disk_id"` -} - -func (input DiskFilterListInput) DiskStr() string { - if len(input.Disk) > 0 { - return input.Disk - } - if len(input.DiskId) > 0 { - return input.DiskId - } - return "" + DiskId string `json:"disk_id" deprecated-by:"disk"` } diff --git a/pkg/apis/compute/geo_input.go b/pkg/apis/compute/geo_input.go index 4f771b475d..a08e7172b1 100644 --- a/pkg/apis/compute/geo_input.go +++ b/pkg/apis/compute/geo_input.go @@ -19,66 +19,40 @@ import ( ) type RegionalFilterListInput struct { - // filter by city + // 过滤位于指定城市区域的资源 City string `json:"city"` - // filter by cloudregion + // 过滤处于指定区域内的资源 Cloudregion string `json:"cloudregion"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - CloudregionId string `json:"cloudregion_id"` + CloudregionId string `json:"cloudregion_id" deprecated-by:"cloudregion"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - Region string `json:"region"` + Region string `json:"region" deprecated-by:"cloudregion"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 - RegionId string `json:"region_id"` -} - -func (input RegionalFilterListInput) CloudregionStr() string { - if len(input.Cloudregion) > 0 { - return input.Cloudregion - } - if len(input.CloudregionId) > 0 { - return input.CloudregionId - } - if len(input.Region) > 0 { - return input.Region - } - if len(input.RegionId) > 0 { - return input.RegionId - } - return "" + RegionId string `json:"region_id" deprecated-by:"cloudregion"` } type ZonalFilterListInput struct { RegionalFilterListInput - // filter by zone + // 过滤处于指定可用区内的资源 Zone string `json:"zone"` // swagger:ignore // Deprecated // filter by zone_id - ZoneId string `json:"zone_id"` - // filter by an array of zone + ZoneId string `json:"zone_id" deprecated-by:"zone"` + // 过滤处于多个指定可用区内的资源 Zones []string `json:"zones"` } -func (input ZonalFilterListInput) ZoneStr() string { - if len(input.Zone) > 0 { - return input.Zone - } - if len(input.ZoneId) > 0 { - return input.ZoneId - } - return "" -} - func (input ZonalFilterListInput) ZoneList() []string { - zoneStr := input.ZoneStr() + zoneStr := input.Zone if len(zoneStr) > 0 { input.Zones = append(input.Zones, zoneStr) } @@ -88,22 +62,12 @@ func (input ZonalFilterListInput) ZoneList() []string { type HostFilterListInput struct { ZonalFilterListInput - // filter by host + // 过滤关联指定宿主机(ID或Name)的列表结果 Host string `json:"host"` // swagger:ignore // Deprecated // filter by host_id - HostId string `json:"host_id"` -} - -func (input HostFilterListInput) HostStr() string { - if len(input.Host) > 0 { - return input.Host - } - if len(input.HostId) > 0 { - return input.HostId - } - return "" + HostId string `json:"host_id" deprecated-by:"host"` } type CloudregionListInput struct { @@ -114,9 +78,9 @@ type CloudregionListInput struct { UsableResourceListInput UsableVpcResourceListInput - // filter by city + // 过滤位于指定城市的区域 City string `json:"city"` - // filter by service??? + // 过滤提供特定服务的区域 Service string `json:"service"` } @@ -131,6 +95,6 @@ type ZoneListInput struct { UsableResourceListInput UsableVpcResourceListInput - // filter by service + // 过滤提供特定服务的可用区 Service string `json:"service"` } diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index 72e74a6d13..726ad68a3a 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -24,31 +24,15 @@ type ServerFilterListInput struct { // swagger:ignore // Deprecated // Filter by guest Id - ServerId string `json:"server_id"` + ServerId string `json:"server_id" deprecated-by:"server"` // swagger:ignore // Deprecated // Filter by guest Id - Guest string `json:"guest"` + Guest string `json:"guest" deprecated-by:"server"` // swagger:ignore // Deprecated // Filter by guest Id - GuestId string `json:"guest_id"` -} - -func (input ServerFilterListInput) ServerStr() string { - if len(input.Server) > 0 { - return input.Server - } - if len(input.ServerId) > 0 { - return input.ServerId - } - if len(input.Guest) > 0 { - return input.Guest - } - if len(input.GuestId) > 0 { - return input.GuestId - } - return "" + GuestId string `json:"guest_id" deprecated-by:"server"` } type ServerListInput struct { @@ -91,15 +75,10 @@ type ServerListInput struct { GetBackupGuestsOnHost *bool `json:"get_backup_guests_on_host"` } -func (input ServerListInput) HypervisorList() []string { - ret := make([]string, 0) +func (input *ServerListInput) AfterUnmarshal() { if input.Baremetal != nil && *input.Baremetal { - ret = append(ret, HYPERVISOR_BAREMETAL) + input.Hypervisor = append(input.Hypervisor, HYPERVISOR_BAREMETAL) } - if len(input.Hypervisor) > 0 { - ret = append(ret, input.Hypervisor...) - } - return ret } type ServerRebuildRootInput struct { diff --git a/pkg/apis/compute/instance_group.go b/pkg/apis/compute/instance_group.go index b95c94c83a..0c2e73509b 100644 --- a/pkg/apis/compute/instance_group.go +++ b/pkg/apis/compute/instance_group.go @@ -21,9 +21,9 @@ type InstanceGroupListInput struct { ZonalFilterListInput ServerFilterListInput - // Filter by service type + // 以service_type过滤列表结果 ServiceType string `json:"service_type"` - // Filter by parent id + // 以parent_id过滤列表结果 ParentId string `json:"parent_id"` } @@ -34,20 +34,10 @@ type InstanceGroupDetail struct { } type GroupFilterListInput struct { - // Instance Group ID or Name + // 以指定实例组(ID或Name)过滤列表结果 Group string `json:"group"` // swagger:ignore // deprecated: true // Filter by instance group Id - GroupId string `json:"group_id"` -} - -func (input GroupFilterListInput) GroupStr() string { - if len(input.Group) > 0 { - return input.Group - } - if len(input.GroupId) > 0 { - return input.GroupId - } - return "" + GroupId string `json:"group_id" deprecated-by:"group"` } diff --git a/pkg/apis/compute/network.go b/pkg/apis/compute/network.go index abeb9b05ec..4609761fb6 100644 --- a/pkg/apis/compute/network.go +++ b/pkg/apis/compute/network.go @@ -19,66 +19,34 @@ import ( ) type VpcFilterListInput struct { - // filter by vpc - // 过滤关联此Vpc的资源 + // 过滤关联此VPC(ID或Name)的资源 Vpc string `json:"vpc"` // swagger:ignore // Deprecated // filter by vpc Id - VpcId string `json:"vpc_id"` -} - -func (input VpcFilterListInput) VpcStr() string { - if len(input.Vpc) > 0 { - return input.Vpc - } - if len(input.VpcId) > 0 { - return input.VpcId - } - return "" + VpcId string `json:"vpc_id" deprecated-by:"vpc"` } type WireFilterListInput struct { VpcFilterListInput - // filter by wire - // 过滤连接此二层网络的资源 + + // 过滤连接此二层网络(ID或Name)的资源 Wire string `json:"wire"` // swagger:ignore // Deprecated // fitler by wire id - WireId string `json:"wire_id"` -} - -func (input WireFilterListInput) WireStr() string { - if len(input.Wire) > 0 { - return input.Wire - } - if len(input.WireId) > 0 { - return input.WireId - } - return "" + WireId string `json:"wire_id" deprecated-by:"wire"` } type NetworkFilterListInput struct { WireFilterListInput - // filter by network - // 过滤关联此网络的资源 + // 过滤关联此网络(ID或Name)的资源 Network string `json:"network"` // swagger:ignore // Deprecated // filter by networkId - NetworkId string `json:"network"` -} - -func (input NetworkFilterListInput) NetworkStr() string { - if len(input.Network) > 0 { - return input.Network - } - if len(input.NetworkId) > 0 { - return input.NetworkId - } - return "" + NetworkId string `json:"network_id" deprecated-by:"network"` } type NetworkListInput struct { diff --git a/pkg/apis/compute/schedtag.go b/pkg/apis/compute/schedtag.go index 93399a2a03..263a0166d0 100644 --- a/pkg/apis/compute/schedtag.go +++ b/pkg/apis/compute/schedtag.go @@ -40,22 +40,12 @@ type SchedtagCreateInput struct { } type SchedtagFilterListInput struct { - // filter by schedtag + // 以关联的调度标签(ID或Name)过滤列表 Schedtag string `json:"schedtag"` // swagger:ignore // Deprecated // filter by schedtag_id - SchedtagId string `json:"schedtag_id"` -} - -func (input SchedtagFilterListInput) SchedtagStr() string { - if len(input.Schedtag) > 0 { - return input.Schedtag - } - if len(input.SchedtagId) > 0 { - return input.SchedtagId - } - return "" + SchedtagId string `json:"schedtag_id" deprecated-by:"schedtag"` } type SchedtagListInput struct { @@ -66,15 +56,5 @@ type SchedtagListInput struct { // swagger:ignore // Deprecated // filter by type, alias for resource_type - Type string `json:"type"` -} - -func (input SchedtagListInput) ResourceTypeStr() string { - if len(input.ResourceType) > 0 { - return input.ResourceType - } - if len(input.Type) > 0 { - return input.Type - } - return "" + Type string `json:"type" deprecated-by:"resource_type"` } diff --git a/pkg/apis/compute/secgroup.go b/pkg/apis/compute/secgroup.go index 9f6abf0322..b5659876ff 100644 --- a/pkg/apis/compute/secgroup.go +++ b/pkg/apis/compute/secgroup.go @@ -148,29 +148,19 @@ type SecurityGroupRuleListInput struct { apis.ResourceBaseListInput SecgroupFilterListInput - // filter by direction + // 以direction字段过滤安全组规则 Direction string `json:"direction"` - // filter by action + // 以action字段过滤安全组规则 Action string `json:"action"` - // filter by protocol + // 以protocol字段过滤安全组规则 Protocol string `json:"protocol"` } type SecgroupFilterListInput struct { - // filter by Security group + // 过滤关联指定安全组(ID或Name)的列表结果 Secgroup string `json:"secgroup"` // swagger:ignore // Deprecated // filter by secgroup_id - SecgroupId string `json:"secgroup_id"` -} - -func (input SecgroupFilterListInput) SecgroupStr() string { - if len(input.Secgroup) > 0 { - return input.Secgroup - } - if len(input.SecgroupId) > 0 { - return input.SecgroupId - } - return "" + SecgroupId string `json:"secgroup_id" deprecated-by:"secgroup"` } diff --git a/pkg/apis/compute/storage_const.go b/pkg/apis/compute/storage_const.go index 7506ccb5b5..37a0bacd1b 100644 --- a/pkg/apis/compute/storage_const.go +++ b/pkg/apis/compute/storage_const.go @@ -139,22 +139,12 @@ var ( ) type StorageFilterListInput struct { - // filter by storage + // 过滤关联此存储(ID或Name)的列表结果 Storage string `json:"storage"` // swagger:ignore // Deprecated // filter by storage_id - StorageId string `json:"storage_id"` -} - -func (input StorageFilterListInput) StorageStr() string { - if len(input.Storage) > 0 { - return input.Storage - } - if len(input.StorageId) > 0 { - return input.StorageId - } - return "" + StorageId string `json:"storage_id" deprecated-by:"storage"` } type StorageShareFilterListInput struct { diff --git a/pkg/apis/identity/input.go b/pkg/apis/identity/input.go index 6ddd7013b2..f99d691b44 100644 --- a/pkg/apis/identity/input.go +++ b/pkg/apis/identity/input.go @@ -43,36 +43,20 @@ type EnabledIdentityBaseResourceListInput struct { } type ProjectFilterListInput struct { - // filter by project + // 以项目(ID或Name)过滤列表结果 Project string `json:"project"` // swagger:ignore // Deprecated // filter by project_id - ProjectId string `json:"project_id"` + ProjectId string `json:"project_id" deprecated-by:"project"` // swagger:ignore // Deprecated // filter by tenant - Tenant string `json:"tenant"` + Tenant string `json:"tenant" deprecated-by:"project"` // swagger:ignore // Deprecated // filter by tenant_id - TenantId string `json:"tenant_id"` -} - -func (input ProjectFilterListInput) ProjectStr() string { - if len(input.Project) > 0 { - return input.Project - } - if len(input.ProjectId) > 0 { - return input.ProjectId - } - if len(input.Tenant) > 0 { - return input.Tenant - } - if len(input.TenantId) > 0 { - return input.TenantId - } - return "" + TenantId string `json:"tenant_id" deprecated-by:"project"` } type UserFilterListInput struct { @@ -81,17 +65,7 @@ type UserFilterListInput struct { // swagger:ignore // Deprecated // filter by user_id - UserId string `json:"user_id"` -} - -func (input UserFilterListInput) UserStr() string { - if len(input.User) > 0 { - return input.User - } - if len(input.UserId) > 0 { - return input.UserId - } - return "" + UserId string `json:"user_id" deprecated-by:"user"` } type GroupFilterListInput struct { @@ -100,17 +74,7 @@ type GroupFilterListInput struct { // swagger:ignore // Deprecated // filter by group_id - GroupId string `json:"group_id"` -} - -func (input GroupFilterListInput) GroupStr() string { - if len(input.Group) > 0 { - return input.Group - } - if len(input.GroupId) > 0 { - return input.GroupId - } - return "" + GroupId string `json:"group_id" deprecated-by:"group"` } type RoleFilterListInput struct { @@ -119,17 +83,7 @@ type RoleFilterListInput struct { // swagger:ignore // Deprecated // filter by role_id - RoleId string `json:"role_id"` -} - -func (input RoleFilterListInput) RoleStr() string { - if len(input.Role) > 0 { - return input.Role - } - if len(input.RoleId) > 0 { - return input.RoleId - } - return "" + RoleId string `json:"role_id" deprecated-by:"role"` } type ServiceFilterListInput struct { @@ -138,17 +92,7 @@ type ServiceFilterListInput struct { // swagger:ignore // Deprecated // filter by service_id - ServiceId string `json:"service_id"` -} - -func (input ServiceFilterListInput) ServiceStr() string { - if len(input.Service) > 0 { - return input.Service - } - if len(input.ServiceId) > 0 { - return input.ServiceId - } - return "" + ServiceId string `json:"service_id" deprecated-by:"service"` } type RoleListInput struct { @@ -281,3 +225,24 @@ func (input SProjectRemoveUserGroupInput) Validate() error { } return nil } + +type IdentityProviderListInput struct { + apis.EnabledStatusStandaloneResourceListInput +} + +type CredentialListInput struct { + apis.StandaloneResourceListInput +} + +type PolicyListInput struct { + EnabledIdentityBaseResourceListInput + apis.SharableResourceListInput +} + +type RegionListInput struct { + apis.StandaloneResourceListInput +} + +type ServiceListInput struct { + apis.StandaloneResourceListInput +} diff --git a/pkg/apis/image/image.go b/pkg/apis/image/image.go index 8938bdb7c4..58874a1c66 100644 --- a/pkg/apis/image/image.go +++ b/pkg/apis/image/image.go @@ -21,8 +21,12 @@ import ( type ImageListInput struct { apis.SharableVirtualResourceListInput - // filter by disk_formats + // 以镜像的格式过滤,可能值为:qcow2, iso, vmdk, vhd, raw等 DiskFormats []string `json:"disk_formats"` - // filter by uefi + // 列出是否支持UEFI启动的镜像 Uefi *bool `json:"uefi"` } + +type GuestImageListInput struct { + apis.SharableVirtualResourceListInput +} diff --git a/pkg/apis/input.go b/pkg/apis/input.go index 6c127ac0da..bbf2e856df 100644 --- a/pkg/apis/input.go +++ b/pkg/apis/input.go @@ -20,34 +20,19 @@ type DomainizedResourceListInput struct { // Deprecated Admin *bool `json:"admin"` - // Specify query scope, either project, domain or system // 指定查询的权限范围,可能值为project, domain or system Scope string `json:"scope"` - // Project domain filter, either by Id or Name - // 指定查询的项目,ID or Name + // 查询指定的域(ID或名称)拥有的资源 ProjectDomain string `json:"project_domain"` // swagger:ignore // Deprecated // Project domain Id filter, alias for project_domain - ProjectDomainId string `json:"project_domain_id"` + ProjectDomainId string `json:"project_domain_id" deprecated-by:"project_domain"` // swagger:ignore // Deprecated // Domain Id filter, alias for project_domain - DomainId string `json:"domain_id"` -} - -func (input DomainizedResourceListInput) DomainStr() string { - if len(input.ProjectDomain) > 0 { - return input.ProjectDomain - } - if len(input.ProjectDomainId) > 0 { - return input.ProjectDomainId - } - if len(input.DomainId) > 0 { - return input.DomainId - } - return "" + DomainId string `json:"domain_id" deprecated-by:"project_domain"` } type DomainizedResourceCreateInput struct { @@ -63,36 +48,20 @@ type DomainizedResourceCreateInput struct { type ProjectizedResourceListInput struct { DomainizedResourceListInput - // Filter by project, either ID or Name + // 查询指定的项目(ID或名称)拥有的资源 Project string `json:"project"` // swagger:ignore // Deprecated // Filter by project_id, alias for project - ProjectId string `json:"project_id"` + ProjectId string `json:"project_id" deprecated-by:"project"` // swagger:ignore // Deprecated // Filter by tenant ID or Name, alias for project - Tenant string `json:"tenant"` + Tenant string `json:"tenant" deprecated-by:"project"` // swagger:ignore // Deprecated // Filter by tenant_id, alias for project - TenantId string `json:"tenant_id"` -} - -func (input ProjectizedResourceListInput) ProjectStr() string { - if len(input.Project) > 0 { - return input.Project - } - if len(input.ProjectId) > 0 { - return input.ProjectId - } - if len(input.Tenant) > 0 { - return input.Tenant - } - if len(input.TenantId) > 0 { - return input.TenantId - } - return "" + TenantId string `json:"tenant_id" deprecated-by:"project"` } type ProjectizedResourceCreateInput struct { @@ -108,12 +77,12 @@ type ProjectizedResourceCreateInput struct { } type UserResourceListInput struct { - // User ID or Name + // 查询指定的用户(ID或名称)拥有的资源 User string `json:"user"` // swagger:ignore // Deprecated // Filter by userId - UserId string `json:"user_id"` + UserId string `json:"user_id" deprecated-by:"user"` } func (input UserResourceListInput) UserStr() string { diff --git a/pkg/apis/modelbase.go b/pkg/apis/modelbase.go index b389962381..9e402df429 100644 --- a/pkg/apis/modelbase.go +++ b/pkg/apis/modelbase.go @@ -34,29 +34,57 @@ type ModelBaseListInput struct { // 查询偏移量 // default: 0 Offset *int `json:"offset"` - // Name of the field to be ordered by + // 列表排序时,用于排序的字段的名称,该字段不提供时,则按默认字段排序。一般时按照资源的新建时间逆序排序。 OrderBy []string `json:"order_by"` - // List Order + // 列表排序时的顺序,desc为从高到低,asc为从低到高。默认是按照资源的创建时间desc排序。 // example: desc|asc Order string `json:"order"` - // Show more details + // 列表返回资源的更多详细信息。默认只显示基本字段,该字段为true则返回扩展字段信息。 Details *bool `json:"details"` - // Filter results by a simple keyword search + // 模糊搜索所有字段 Search string `json:"search"` - // Filters + // 指定过滤条件,允许指定多个,每个条件的格式为"字段名称.操作符(匹配信息)",例如name字段等于test的过滤器为:name.equals('test') + // 支持的操作符如下: + // + // | 操作符 | 参数个数 | 举例 | 说明 | + // |---------------|---------|------------------------------------------------|-----------------------| + // | in | > 0 | name.in("test", "good") | 在给定数组中 | + // | notin | > 0 | name.notin('test') | 不在给定数组中 | + // | between | 2 | created_at.between('2019-12-10', '2020-01-02') | 在两个值之间 | + // | ge | 1 | created_at.ge('2020-01-01') | 大于或等于给定值 | + // | gt | 1 | created_at.gt('2020-01-01') | 严格大于给定值 | + // | le | 1 | created_at.le('2020-01-01') | 小于或等于给定值 | + // | lt | 1 | sync_seconds.lt(900) | 严格大于给定值 | + // | like | 1 | name.like('%test%') | sql字符串匹配 | + // | contains | 1 | name.contains('test') | 包含给定字符串 | + // | startswith | 1 | name.startswith('test') | 以给定字符串开头 | + // | endswith | 1 | name.endswith('test') | 以给定字符串结尾 | + // | equals | 1 | name.equals('test') | 等于给定值 | + // | notequals | 1 | name.notequals('test') | 不等于给定值 | + // | isnull | 0 | name.isnull() | 值为SQL的NULL | + // | isnotnull | 0 | name.isnotnull() | 值不为SQL的NULL | + // | isempty | 0 | name.isempty('test') | 值为空字符串 | + // | isnotempty | 0 | name.isnotempty('test') | 值不是空字符串 | + // | isnullorempty | 0 | name.isnullorempty('test') | 值为SQL的NULL或者空字符串 | + // Filter []string `json:"filter"` - // Filters with joint table col; joint_tbl.related_key(origin_key).filter_col.filter_cond(filters) + // 指定关联过滤条件,允许指定多个,后端将根据关联过滤条件和其他表关联查询,支持的查询语法和filter相同, + // 和其他表关联的语法如下: + // joint_tbl.related_key(origin_key).filter_col.filter_ops(values) + // 其中,joint_tbl为要关联的表,related_key为关联表column,origin_key为当前表column, filter_col为 + // 关联表用于查询匹配的field名称,field_ops为filter支持的操作,values为匹配的值 + // 举例: + // guestnetworks_tbl.guest_id(id).ip_addr.equals('10.168.21.222') JointFilter []string `json:"joint_filter"` - // If true, match if any of the filters matches; otherwise, match if all of the filters match + // 如果filter_any为true,则查询所有filter的并集,否则为交集 FilterAny *bool `json:"filter_any"` - // Show only specified fields + // 返回结果只包含指定的字段 Field []string `json:"field"` - // Export field keys + // 用于数据导出,指定导出的数据字段 ExportKeys string `json:"export_keys"` } type IncrementalListInput struct { - // 增量加载的标记 - // Marker for streamed pagination + // 用于指定增量加载的标记 PagingMarker string `json:"paging_marker"` } diff --git a/pkg/apis/sharablevirtualresource.go b/pkg/apis/sharablevirtualresource.go index 3773ea9e50..640c3e2370 100644 --- a/pkg/apis/sharablevirtualresource.go +++ b/pkg/apis/sharablevirtualresource.go @@ -24,13 +24,15 @@ type SharableVirtualResourceDetails struct { VirtualResourceDetails } +type SharableResourceListInput struct { + // 根据资源是否共享过滤列表 + IsPublic *bool `json:"is_public"` +} + type SharableVirtualResourceListInput struct { VirtualResourceListInput - // filter by is_public status - IsPublic *bool `json:"is_public"` - // filter by public_scope - // possible value is system, domain, project + // 根据资源的共享范围过滤列表,可能值为:system, domain, project PublicScope string `json:"public_scope"` } diff --git a/pkg/apis/standaloneresource.go b/pkg/apis/standaloneresource.go index 511ead3477..c607421907 100644 --- a/pkg/apis/standaloneresource.go +++ b/pkg/apis/standaloneresource.go @@ -22,38 +22,40 @@ type StandaloneResourceShortDescDetail struct { } type STag struct { - Key string + // 标签key + Key string + // 标签Value Value string } type StandaloneResourceListInput struct { ResourceBaseListInput - // filter by tags + // 通过标签过滤 Tags []STag `json:"tags"` - // Piggyback user metadata information + // 返回资源的标签不包含特定的用户标签 WithoutUserMeta bool `json:"without_user_meta"` - // Piggyback metadata information + // 返回列表数据中包含资源的标签数据(Metadata) WithMeta *bool `json:"with_meta"` - // Show all resources including the emulated resources + // 显示所有的资源,包括模拟的资源 ShowEmulated *bool `json:"show_emulated"` - // filter by resource name + // 以资源名称过滤列表 Names []string `json:"name"` - // filter by resource ID + // 以资源ID过滤列表 Ids []string `json:"id"` } type StatusStandaloneResourceListInput struct { StandaloneResourceListInput - // filter by resource status + // 以资源的状态过滤列表 Status []string `json:"status"` } type EnabledStatusStandaloneResourceListInput struct { StatusStandaloneResourceListInput - // filter by enable/disabled status + // 以资源是否启用/禁用过滤列表 Enabled *bool `json:"enabled"` } diff --git a/pkg/apis/virtualresource.go b/pkg/apis/virtualresource.go index 10f89f10eb..01f4bbb683 100644 --- a/pkg/apis/virtualresource.go +++ b/pkg/apis/virtualresource.go @@ -23,11 +23,11 @@ type VirtualResourceListInput struct { ProjectizedResourceListInput - // Show system resource + // 列表中包含标记为"系统资源"的资源 System *bool `json:"system"` - // Show only pending deleted resource + // 是否显示回收站内的资源,默认不显示(对实现了回收站的资源有效,例如主机,磁盘,镜像) PendingDelete *bool `json:"pending_delete"` - // Show all resources including pending deleted + // 是否显示所有资源,包括回收站和不再回收站的资源 // TODO: fix this??? PendingDeleteAll *bool `json:"-"` } diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index a29a627aff..0277bb163a 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -1140,7 +1140,7 @@ func (self *SCloudaccount) PerformChangeProject(ctx context.Context, userCred mc } func (manager *SCloudaccountManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.CloudaccountListInput) (*sqlchemy.SQuery, error) { - accountStr := query.CloudaccountStr() + accountStr := query.Cloudaccount if len(accountStr) > 0 { accountObj, err := manager.FetchByIdOrName(userCred, accountStr) if err != nil { @@ -1157,7 +1157,7 @@ func (manager *SCloudaccountManager) ListItemFilter(ctx context.Context, q *sqlc if err != nil { return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager") } - managerStr := query.CloudproviderStr() + managerStr := query.Cloudprovider if len(managerStr) > 0 { providerObj, err := CloudproviderManager.FetchByIdOrName(userCred, managerStr) if err != nil { @@ -1171,7 +1171,7 @@ func (manager *SCloudaccountManager) ListItemFilter(ctx context.Context, q *sqlc q = q.Equals("id", provider.CloudaccountId) } - cloudEnvStr := query.CloudEnvStr() + cloudEnvStr := query.CloudEnv if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { q = q.IsTrue("is_public_cloud").IsFalse("is_on_premise") } @@ -1184,7 +1184,7 @@ func (manager *SCloudaccountManager) ListItemFilter(ctx context.Context, q *sqlc q = q.IsTrue("is_on_premise").IsFalse("is_public_cloud") } - capabilities := query.CapabilityList() + capabilities := query.Capability if len(capabilities) > 0 { cloudproviders := CloudproviderManager.Query().SubQuery() cloudprovidercapabilities := CloudproviderCapabilityManager.Query().SubQuery() diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 36e63fbc5b..2ed83c8051 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -972,7 +972,7 @@ func (manager *SCloudproviderManager) migrateVCenterInfo(vc *SVCenter) error { } func (manager *SCloudproviderManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.CloudproviderListInput) (*sqlchemy.SQuery, error) { - accountStr := query.CloudaccountStr() + accountStr := query.Cloudaccount if len(accountStr) > 0 { accountObj, err := CloudaccountManager.FetchByIdOrName(userCred, accountStr) if err != nil { @@ -1019,7 +1019,7 @@ func (manager *SCloudproviderManager) ListItemFilter(ctx context.Context, q *sql if err != nil { return nil, err } - managerStr := query.CloudproviderStr() + managerStr := query.Cloudprovider if len(managerStr) > 0 { providerObj, err := manager.FetchByIdOrName(userCred, managerStr) if err != nil { @@ -1032,7 +1032,7 @@ func (manager *SCloudproviderManager) ListItemFilter(ctx context.Context, q *sql q = q.Equals("id", providerObj.GetId()) } - cloudEnvStr := query.CloudEnvStr() + cloudEnvStr := query.CloudEnv if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { cloudaccounts := CloudaccountManager.Query().SubQuery() q = q.Join(cloudaccounts, sqlchemy.Equals(cloudaccounts.Field("id"), q.Field("cloudaccount_id"))) @@ -1054,7 +1054,7 @@ func (manager *SCloudproviderManager) ListItemFilter(ctx context.Context, q *sql q = q.Filter(sqlchemy.IsTrue(cloudaccounts.Field("is_on_premise"))) } - capabilities := query.CapabilityList() + capabilities := query.Capability if len(capabilities) > 0 { subq := CloudproviderCapabilityManager.Query("cloudprovider_id").In("capability", capabilities).Distinct().SubQuery() q = q.In("id", subq) diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index 8b82307c10..7d3df20081 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -597,7 +597,7 @@ func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlch return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager.ListItemFilter") } - cloudEnvStr := query.CloudEnvStr() + cloudEnvStr := query.CloudEnv if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { q = q.In("provider", cloudprovider.GetPublicProviders()) } @@ -625,12 +625,12 @@ func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlch q = q.IsNotEmpty("external_id") } - managerStr := query.CloudproviderStr() + managerStr := query.Cloudprovider if len(managerStr) > 0 { subq := CloudproviderRegionManager.QueryRelatedRegionIds("", managerStr) q = q.In("id", subq) } - accountStr := query.CloudaccountStr() + accountStr := query.Cloudaccount if len(accountStr) > 0 { subq := CloudproviderRegionManager.QueryRelatedRegionIds(accountStr) q = q.In("id", subq) diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 6aab026d79..cba2e8c57b 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -162,7 +162,7 @@ func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) } - guestId := query.ServerStr() + guestId := query.Server if len(guestId) > 0 { iGuest, err := GuestManager.FetchByIdOrName(userCred, guestId) if err == sql.ErrNoRows { @@ -178,7 +178,7 @@ func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu )) } - storageStr := query.StorageStr() + storageStr := query.Storage if len(storageStr) > 0 { storageObj, err := StorageManager.FetchByIdOrName(userCred, storageStr) if err != nil { @@ -187,12 +187,12 @@ func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.Filter(sqlchemy.Equals(q.Field("storage_id"), storageObj.GetId())) } - if diskType := query.DiskTypeStr(); diskType != "" { + if diskType := query.DiskType; diskType != "" { q = q.Filter(sqlchemy.Equals(q.Field("disk_type"), diskType)) } // for snapshotpolicy_id - snapshotpolicyStr := query.SnapshotpolicyStr() + snapshotpolicyStr := query.Snapshotpolicy if len(snapshotpolicyStr) > 0 { snapshotpolicyObj, err := SnapshotPolicyManager.FetchByIdOrName(userCred, snapshotpolicyStr) if err != nil { diff --git a/pkg/compute/models/groups.go b/pkg/compute/models/groups.go index 9edf433827..1020c81ba2 100644 --- a/pkg/compute/models/groups.go +++ b/pkg/compute/models/groups.go @@ -75,7 +75,7 @@ type SGroup struct { func (sm *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.InstanceGroupListInput) (*sqlchemy.SQuery, error) { - guestFilter := input.ServerStr() + guestFilter := input.Server if len(guestFilter) != 0 { guestObj, err := GuestManager.FetchByIdOrName(userCred, guestFilter) if err != nil { diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 146a480229..641345c607 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -160,7 +160,8 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - hypervisorList := query.HypervisorList() + + hypervisorList := query.Hypervisor if len(hypervisorList) > 0 { q = q.In("hypervisor", hypervisorList) } @@ -184,7 +185,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", subq.SubQuery()) } - hostFilter := query.HostStr() + hostFilter := query.Host if len(hostFilter) > 0 { host, _ := HostManager.FetchByIdOrName(nil, hostFilter) if host == nil { @@ -198,7 +199,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } } - secgrpFilter := query.SecgroupStr() + secgrpFilter := query.Secgroup if len(secgrpFilter) > 0 { var notIn = false // HACK FOR NOT IN SECGROUP @@ -284,20 +285,26 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } } - zoneFilter := query.ZoneStr() - if len(zoneFilter) > 0 { - zone, _ := ZoneManager.FetchByIdOrName(nil, zoneFilter) - if zone == nil { - return nil, httperrors.NewResourceNotFoundError("zone %s not found", zoneFilter) - } + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "host_id", func() *sqlchemy.SQuery { hostTable := HostManager.Query().SubQuery() zoneTable := ZoneManager.Query().SubQuery() - sq := hostTable.Query(hostTable.Field("id")).Join(zoneTable, - sqlchemy.Equals(zoneTable.Field("id"), hostTable.Field("zone_id"))).Filter(sqlchemy.Equals(zoneTable.Field("id"), zone.GetId())).SubQuery() - q = q.In("host_id", sq) + sq := hostTable.Query(hostTable.Field("id")) + sq = sq.Join(zoneTable, sqlchemy.Equals(zoneTable.Field("id"), hostTable.Field("zone_id"))) + return sq + }) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") } - wireFilter := query.WireStr() + q, err = managedResourceFilterByZone(q, query.ZonalFilterListInput, "host_id", func() *sqlchemy.SQuery { + hostTable := HostManager.Query().SubQuery() + return hostTable.Query(hostTable.Field("id")) + }) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByZone") + } + + wireFilter := query.Wire if len(wireFilter) > 0 { wire, _ := WireManager.FetchByIdOrName(nil, wireFilter) if wire == nil { @@ -309,7 +316,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", sq) } - networkFilter := query.NetworkStr() + networkFilter := query.Network if len(networkFilter) > 0 { netI, _ := NetworkManager.FetchByIdOrName(userCred, networkFilter) if netI == nil { @@ -323,7 +330,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", sq) } - vpcFilter := query.VpcStr() + vpcFilter := query.Vpc if len(vpcFilter) > 0 { IVpc, err := VpcManager.FetchByIdOrName(userCred, vpcFilter) if err != nil { @@ -340,7 +347,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("id", sq) } - diskFilter := query.DiskStr() + diskFilter := query.Disk if len(diskFilter) > 0 { diskI, _ := DiskManager.FetchByIdOrName(userCred, diskFilter) if diskI == nil { @@ -367,24 +374,6 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ } } - regionFilter := query.CloudregionStr() - if len(regionFilter) > 0 { - regionObj, err := CloudregionManager.FetchByIdOrName(userCred, regionFilter) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError("cloud region %s not found", regionFilter) - } else { - return nil, httperrors.NewGeneralError(err) - } - } - hosts := HostManager.Query().SubQuery() - zones := ZoneManager.Query().SubQuery() - sq := hosts.Query(hosts.Field("id")) - sq = sq.Join(zones, sqlchemy.Equals(hosts.Field("zone_id"), zones.Field("id"))) - sq = sq.Filter(sqlchemy.Equals(zones.Field("cloudregion_id"), regionObj.GetId())) - q = q.In("host_id", sq) - } - withEip := (query.WithEip != nil && *query.WithEip) withoutEip := (query.WithoutEip != nil && *query.WithoutEip) if withEip || withoutEip { @@ -412,7 +401,7 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.Filter(cond(q.Field("id"), sgq)) } - groupFilter := query.GroupStr() + groupFilter := query.Group if len(groupFilter) != 0 { groupObj, err := GroupManager.FetchByIdOrName(userCred, groupFilter) if err != nil { diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 977c54b885..eb414918de 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -217,7 +217,7 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } // var scopeQuery *sqlchemy.SSubQuery - schedTagStr := query.SchedtagStr() + schedTagStr := query.Schedtag if len(schedTagStr) > 0 { schedTag, _ := SchedtagManager.FetchByIdOrName(nil, schedTagStr) if schedTag == nil { @@ -228,7 +228,7 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", scopeQuery) } - wireStr := query.WireStr() + wireStr := query.Wire if len(wireStr) > 0 { wire, _ := WireManager.FetchByIdOrName(nil, wireStr) if wire == nil { @@ -239,7 +239,7 @@ func (manager *SHostManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", scopeQuery) } - storageStr := query.StorageStr() + storageStr := query.Storage if len(storageStr) > 0 { storage, _ := StorageManager.FetchByIdOrName(nil, storageStr) if storage == nil { diff --git a/pkg/compute/models/instance_snapshots.go b/pkg/compute/models/instance_snapshots.go index c448bdfaec..4dc61c454a 100644 --- a/pkg/compute/models/instance_snapshots.go +++ b/pkg/compute/models/instance_snapshots.go @@ -77,7 +77,7 @@ func (manager *SInstanceSnapshotManager) ListItemFilter(ctx context.Context, q * return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - guestStr := query.ServerStr() + guestStr := query.Server if len(guestStr) > 0 { guestObj, err := GuestManager.FetchByIdOrName(userCred, guestStr) if err != nil { diff --git a/pkg/compute/models/isolated_devices.go b/pkg/compute/models/isolated_devices.go index 29181993a3..1fcdcc19ec 100644 --- a/pkg/compute/models/isolated_devices.go +++ b/pkg/compute/models/isolated_devices.go @@ -155,7 +155,7 @@ func (manager *SIsolatedDeviceManager) ListItemFilter(ctx context.Context, q *sq if query.Usb != nil && *query.Usb { q = q.Equals("dev_type", "USB") } - hostStr := query.HostStr() + hostStr := query.Host var sq *sqlchemy.SSubQuery if len(hostStr) > 0 { hosts := HostManager.Query().SubQuery() diff --git a/pkg/compute/models/loadbalancercertificates.go b/pkg/compute/models/loadbalancercertificates.go index 5718d7bfee..646c15443f 100644 --- a/pkg/compute/models/loadbalancercertificates.go +++ b/pkg/compute/models/loadbalancercertificates.go @@ -227,8 +227,8 @@ func (man *SLoadbalancerCertificateManager) ListItemFilter(ctx context.Context, } if query.Usable != nil && *query.Usable { - region := query.CloudregionStr() - manager := query.CloudproviderStr() + region := query.Cloudregion + manager := query.Cloudprovider // 证书可用包含两类:1.本地证书内容不为空 2.公有云中已经存在,但是证书内容不完整的证书 if len(region) > 0 || len(manager) > 0 { diff --git a/pkg/compute/models/managedresource.go b/pkg/compute/models/managedresource.go index c0e75a490c..809b2cfcc0 100644 --- a/pkg/compute/models/managedresource.go +++ b/pkg/compute/models/managedresource.go @@ -147,7 +147,7 @@ func (self *SManagedResourceBase) IsManaged() bool { } func managedResourceFilterByDomain(q *sqlchemy.SQuery, query apis.DomainizedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { - domainStr := query.DomainStr() + domainStr := query.ProjectDomain if len(domainStr) > 0 { domain, err := db.TenantCacheManager.FetchDomainByIdOrName(context.Background(), domainStr) if err != nil { @@ -232,8 +232,8 @@ func filterByProviderStrs(q *sqlchemy.SQuery, filterField string, subqFunc func( } func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { - cloudproviderStr := input.CloudproviderStr() - if len(input.CloudproviderStr()) > 0 { + cloudproviderStr := input.Cloudprovider + if len(cloudproviderStr) > 0 { provider, err := CloudproviderManager.FetchByIdOrName(nil, cloudproviderStr) if err != nil { if err == sql.ErrNoRows { @@ -250,7 +250,7 @@ func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourc } } - cloudaccountStr := input.CloudaccountStr() + cloudaccountStr := input.Cloudaccount if len(cloudaccountStr) > 0 { account, err := CloudaccountManager.FetchByIdOrName(nil, cloudaccountStr) if err != nil { @@ -283,7 +283,7 @@ func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourc } func managedResourceFilterByZone(q *sqlchemy.SQuery, query api.ZonalFilterListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { - zoneStr := query.ZoneStr() + zoneStr := query.Zone if len(zoneStr) > 0 { zoneObj, err := ZoneManager.FetchByIdOrName(nil, zoneStr) if err != nil { @@ -306,7 +306,7 @@ func managedResourceFilterByZone(q *sqlchemy.SQuery, query api.ZonalFilterListIn } func managedResourceFilterByRegion(q *sqlchemy.SQuery, query api.RegionalFilterListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { - regionStr := query.CloudregionStr() + regionStr := query.Cloudregion if len(regionStr) > 0 { regionObj, err := CloudregionManager.FetchByIdOrName(nil, regionStr) if err != nil { @@ -338,7 +338,7 @@ func managedResourceFilterByRegion(q *sqlchemy.SQuery, query api.RegionalFilterL } func filterByCloudType(q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) *sqlchemy.SQuery { - cloudEnvStr := input.CloudEnvStr() + cloudEnvStr := input.CloudEnv switch cloudEnvStr { case api.CLOUD_ENV_PUBLIC_CLOUD: diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 997e0dba53..2349297c9b 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -1800,7 +1800,7 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. q = q.In("wire_id", sq.SubQuery()) } - vpcStr := input.VpcStr() + vpcStr := input.Vpc if len(vpcStr) > 0 { vpcObj, err := VpcManager.FetchByIdOrName(userCred, vpcStr) if err != nil { @@ -1848,7 +1848,7 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. q = q.In("wire_id", sq.SubQuery()).Equals("status", api.NETWORK_STATUS_AVAILABLE) } - hostStr := input.HostStr() + hostStr := input.Host if len(hostStr) > 0 { hostObj, err := HostManager.FetchByIdOrName(userCred, hostStr) if err != nil { diff --git a/pkg/compute/models/reservedips.go b/pkg/compute/models/reservedips.go index 473416a8ac..caba84efb4 100644 --- a/pkg/compute/models/reservedips.go +++ b/pkg/compute/models/reservedips.go @@ -191,7 +191,7 @@ func (manager *SReservedipManager) ListItemFilter(ctx context.Context, q *sqlche sqlchemy.GT(q.Field("expired_at"), time.Now().UTC()), )) } - network := query.NetworkStr() + network := query.Network if len(network) > 0 { netObj, _ := NetworkManager.FetchByIdOrName(userCred, network) if netObj == nil { diff --git a/pkg/compute/models/schedtags.go b/pkg/compute/models/schedtags.go index f3295aa27b..833ee4d1dd 100644 --- a/pkg/compute/models/schedtags.go +++ b/pkg/compute/models/schedtags.go @@ -133,7 +133,7 @@ func (manager *SSchedtagManager) AllowListItems(ctx context.Context, userCred mc } func (manager *SSchedtagManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.SchedtagListInput) (*sqlchemy.SQuery, error) { - if resType := query.ResourceTypeStr(); resType != "" { + if resType := query.ResourceType; resType != "" { q = q.Equals("resource_type", resType) } return manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) diff --git a/pkg/compute/models/secgroupcache.go b/pkg/compute/models/secgroupcache.go index 012893fcf9..bdcc763dbd 100644 --- a/pkg/compute/models/secgroupcache.go +++ b/pkg/compute/models/secgroupcache.go @@ -79,7 +79,7 @@ func (manager *SSecurityGroupCacheManager) ListItemFilter(ctx context.Context, q if err != nil { return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } - if defsecgroup := query.SecgroupStr(); len(defsecgroup) > 0 { + if defsecgroup := query.Secgroup; len(defsecgroup) > 0 { secgroup, err := SecurityGroupManager.FetchByIdOrName(userCred, defsecgroup) if err != nil { if err == sql.ErrNoRows { diff --git a/pkg/compute/models/secgrouprules.go b/pkg/compute/models/secgrouprules.go index f2ccd09592..65bf12a676 100644 --- a/pkg/compute/models/secgrouprules.go +++ b/pkg/compute/models/secgrouprules.go @@ -162,7 +162,7 @@ func (manager *SSecurityGroupRuleManager) ListItemFilter(ctx context.Context, q if err != nil { return nil, errors.Wrap(err, "SResourceBaseManager.ListItemFilter") } - if defsecgroup := query.SecgroupStr(); len(defsecgroup) > 0 { + if defsecgroup := query.Secgroup; len(defsecgroup) > 0 { if secgroup, _ := SecurityGroupManager.FetchByIdOrName(userCred, defsecgroup); secgroup != nil { sql = sql.Equals("secgroup_id", secgroup.GetId()) } else { diff --git a/pkg/compute/models/secgroups.go b/pkg/compute/models/secgroups.go index f5ef587350..1ffab8a760 100644 --- a/pkg/compute/models/secgroups.go +++ b/pkg/compute/models/secgroups.go @@ -103,7 +103,7 @@ func (manager *SSecurityGroupManager) ListItemFilter(ctx context.Context, q *sql } q = q.In("id", secgroupIds) } - serverStr := input.ServerStr() + serverStr := input.Server if len(serverStr) > 0 { guest, err := GuestManager.FetchByIdOrName(userCred, serverStr) if err != nil { diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index e3888bc65d..edeb6e5ee1 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -720,7 +720,7 @@ func listItemDomainFilter(q *sqlchemy.SQuery, data *jsonutils.JSONDict) *sqlchem func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ServerSkuListInput) (*sqlchemy.SQuery, error) { publicCloud := false - cloudEnvStr := query.CloudEnvStr() + cloudEnvStr := query.CloudEnv if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { publicCloud = true q = q.Filter(sqlchemy.In(q.Field("provider"), CloudproviderManager.GetPublicProviderProvidersQuery())) @@ -771,8 +771,8 @@ func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchem q = q.IsTrue("enabled") } - zoneStr := query.ZoneStr() - regionStr := query.CloudregionStr() + zoneStr := query.Zone + regionStr := query.Cloudregion if len(zoneStr) > 0 { _zone, err := ZoneManager.FetchByIdOrName(userCred, zoneStr) if err != nil { diff --git a/pkg/compute/models/wires.go b/pkg/compute/models/wires.go index 7b7f53ff6b..2e2dd9f919 100644 --- a/pkg/compute/models/wires.go +++ b/pkg/compute/models/wires.go @@ -852,7 +852,7 @@ func (manager *SWireManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - vpcStr := query.VpcStr() + vpcStr := query.Vpc if len(vpcStr) > 0 { vpc, err := VpcManager.FetchByIdOrName(userCred, vpcStr) if err != nil { @@ -877,7 +877,7 @@ func (manager *SWireManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu return nil, errors.Wrap(err, "managedResourceFilterByZone") } - hostStr := query.HostStr() + hostStr := query.Host if len(hostStr) > 0 { hostObj, err := HostManager.FetchByIdOrName(userCred, hostStr) if err != nil { diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index 9d096d16aa..8d38c720dd 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -529,7 +529,7 @@ func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } - cloudEnvStr := query.CloudEnvStr() + cloudEnvStr := query.CloudEnv if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD { regions := CloudregionManager.Query().SubQuery() subq := regions.Query(regions.Field("id")) @@ -590,12 +590,12 @@ func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } } - managerStr := query.CloudproviderStr() + managerStr := query.Cloudprovider if len(managerStr) > 0 { subq := CloudproviderRegionManager.QueryRelatedRegionIds("", managerStr) q = q.In("cloudregion_id", subq) } - accountStr := query.CloudaccountStr() + accountStr := query.Cloudaccount if len(accountStr) > 0 { subq := CloudproviderRegionManager.QueryRelatedRegionIds(accountStr) q = q.In("cloudregion_id", subq) diff --git a/pkg/image/models/image_guest.go b/pkg/image/models/image_guest.go index 6219b92685..3ee2fe5178 100644 --- a/pkg/image/models/image_guest.go +++ b/pkg/image/models/image_guest.go @@ -539,3 +539,11 @@ func (self *SGuestImage) PerformPrivate(ctx context.Context, userCred mcclient.T } return self.SSharableVirtualResourceBase.PerformPrivate(ctx, userCred, query, data) } + +func (manager *SGuestImageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.GuestImageListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SharableVirtualResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/keystone/models/credentials.go b/pkg/keystone/models/credentials.go index 5ba2c193eb..4be13cfca6 100644 --- a/pkg/keystone/models/credentials.go +++ b/pkg/keystone/models/credentials.go @@ -260,3 +260,7 @@ func (manager *SCredentialManager) FetchOwnerId(ctx context.Context, data jsonut } return nil, nil } + +func (manager *SCredentialManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.CredentialListInput) (*sqlchemy.SQuery, error) { + return manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) +} diff --git a/pkg/keystone/models/endpoints.go b/pkg/keystone/models/endpoints.go index 7edfa71a2d..25871f6ea0 100644 --- a/pkg/keystone/models/endpoints.go +++ b/pkg/keystone/models/endpoints.go @@ -341,7 +341,7 @@ func (manager *SEndpointManager) ListItemFilter(ctx context.Context, q *sqlchemy if err != nil { return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - svcStr := query.ServiceStr() + svcStr := query.Service if len(svcStr) > 0 { svcObj, err := ServiceManager.FetchByIdOrName(userCred, svcStr) if err != nil { diff --git a/pkg/keystone/models/groups.go b/pkg/keystone/models/groups.go index 5a1eb3685e..8cad8fb92c 100644 --- a/pkg/keystone/models/groups.go +++ b/pkg/keystone/models/groups.go @@ -81,7 +81,7 @@ func (manager *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ return nil, err } - userIdStr := query.UserStr() + userIdStr := query.User if len(userIdStr) > 0 { user, err := UserManager.FetchById(userIdStr) if err != nil { @@ -95,7 +95,7 @@ func (manager *SGroupManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("id", subq.SubQuery()) } - projIdStr := query.ProjectStr() + projIdStr := query.Project if len(projIdStr) > 0 { proj, err := ProjectManager.FetchProjectById(projIdStr) if err != nil { diff --git a/pkg/keystone/models/identity_provider.go b/pkg/keystone/models/identity_provider.go index 3ccc949f4a..b1e3b3a21a 100644 --- a/pkg/keystone/models/identity_provider.go +++ b/pkg/keystone/models/identity_provider.go @@ -807,3 +807,7 @@ func (manager *SIdentityProviderManager) FetchPasswordProtectedIdpIdsQuery() *sq q := manager.Query("id").In("driver", api.PASSWORD_PROTECTED_IDPS) return q.SubQuery() } + +func (manager *SIdentityProviderManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.IdentityProviderListInput) (*sqlchemy.SQuery, error) { + return manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) +} diff --git a/pkg/keystone/models/policies.go b/pkg/keystone/models/policies.go index 9dd3ad0c04..417150f6e9 100644 --- a/pkg/keystone/models/policies.go +++ b/pkg/keystone/models/policies.go @@ -19,6 +19,8 @@ import ( "database/sql" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" + "yunion.io/x/sqlchemy" api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -203,3 +205,35 @@ func (policy *SPolicy) ValidateDeleteCondition(ctx context.Context) error { } return policy.SEnabledIdentityBaseResource.ValidateDeleteCondition(ctx) } + +func (manager *SPolicyManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.PolicyListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SEnabledIdentityBaseResourceManager.ListItemFilter(ctx, q, userCred, query.EnabledIdentityBaseResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SEnabledIdentityBaseResourceManager.ListItemFilter") + } + if query.IsPublic != nil { + if *query.IsPublic { + q = q.IsTrue("is_public") + } else { + q = q.IsFalse("is_public") + } + } + return q, nil +} + +func (policy *SPolicy) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { + extra := policy.SEnabledIdentityBaseResource.GetCustomizeColumns(ctx, userCred, query) + return policyExtra(policy, extra) +} + +func (policy *SPolicy) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*jsonutils.JSONDict, error) { + extra, err := policy.SEnabledIdentityBaseResource.GetExtraDetails(ctx, userCred, query) + if err != nil { + return nil, err + } + return policyExtra(policy, extra), nil +} + +func policyExtra(policy *SPolicy, extra *jsonutils.JSONDict) *jsonutils.JSONDict { + return extra +} diff --git a/pkg/keystone/models/projects.go b/pkg/keystone/models/projects.go index 2b3b97b968..5d48d6dda7 100644 --- a/pkg/keystone/models/projects.go +++ b/pkg/keystone/models/projects.go @@ -209,7 +209,7 @@ func (manager *SProjectManager) ListItemFilter(ctx context.Context, q *sqlchemy. return nil, err } - userStr := query.UserStr() + userStr := query.User if len(userStr) > 0 { userObj, err := UserManager.FetchById(userStr) if err != nil { @@ -223,7 +223,7 @@ func (manager *SProjectManager) ListItemFilter(ctx context.Context, q *sqlchemy. q = q.In("id", subq.SubQuery()) } - groupStr := query.GroupStr() + groupStr := query.Group if len(groupStr) > 0 { groupObj, err := GroupManager.FetchById(groupStr) if err != nil { diff --git a/pkg/keystone/models/regions.go b/pkg/keystone/models/regions.go index 4fa4474ecc..9933f8ab0e 100644 --- a/pkg/keystone/models/regions.go +++ b/pkg/keystone/models/regions.go @@ -18,11 +18,14 @@ import ( "context" "yunion.io/x/jsonutils" + "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" + api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/pkg/errors" ) type SRegionManager struct { @@ -146,3 +149,11 @@ func (region *SRegion) CustomizeCreate(ctx context.Context, userCred mcclient.To region.Id = idStr return nil } + +func (manager *SRegionManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.RegionListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/keystone/models/roles.go b/pkg/keystone/models/roles.go index 48faad5605..cdc3445203 100644 --- a/pkg/keystone/models/roles.go +++ b/pkg/keystone/models/roles.go @@ -229,7 +229,7 @@ func (manager *SRoleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } var projectId string - projectStr := query.ProjectStr() + projectStr := query.Project if len(projectStr) > 0 { project, err := ProjectManager.FetchProjectById(projectStr) if err != nil { @@ -242,7 +242,7 @@ func (manager *SRoleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu projectId = project.Id } - userStr := query.UserStr() + userStr := query.User if len(projectId) > 0 && len(userStr) > 0 { userObj, err := UserManager.FetchById(userStr) if err != nil { @@ -256,7 +256,7 @@ func (manager *SRoleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", subq.SubQuery()) } - groupStr := query.GroupStr() + groupStr := query.Group if len(projectId) > 0 && len(groupStr) > 0 { groupObj, err := GroupManager.FetchById(groupStr) if err != nil { diff --git a/pkg/keystone/models/services.go b/pkg/keystone/models/services.go index 126b7a9b7e..0a18ec0371 100644 --- a/pkg/keystone/models/services.go +++ b/pkg/keystone/models/services.go @@ -207,3 +207,11 @@ func (manager *SServiceManager) fetchServiceByType(typeStr string) (*SService, e } return srvObj.(*SService), nil } + +func (manager *SServiceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.RegionListInput) (*sqlchemy.SQuery, error) { + q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") + } + return q, nil +} diff --git a/pkg/keystone/models/users.go b/pkg/keystone/models/users.go index 372c92abb6..0cab21d2b5 100644 --- a/pkg/keystone/models/users.go +++ b/pkg/keystone/models/users.go @@ -318,7 +318,7 @@ func (manager *SUserManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu return nil, err } - groupStr := query.GroupStr() + groupStr := query.Group if len(groupStr) > 0 { groupObj, err := GroupManager.FetchByIdOrName(userCred, groupStr) if err != nil { @@ -332,7 +332,7 @@ func (manager *SUserManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", subq.SubQuery()) } - projectStr := query.ProjectStr() + projectStr := query.Project if len(projectStr) > 0 { project, err := ProjectManager.FetchByIdOrName(userCred, projectStr) if err != nil { @@ -346,7 +346,7 @@ func (manager *SUserManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q = q.In("id", subq.SubQuery()) } - roleStr := query.RoleStr() + roleStr := query.Role if len(roleStr) > 0 { role, err := RoleManager.FetchByIdOrName(userCred, roleStr) if err != nil { From f526acc5bfd01e8470bb3bdecaba5648c4acff17 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 10 Jan 2020 19:50:03 +0800 Subject: [PATCH 4/9] update vendor --- go.mod | 2 +- go.sum | 4 ++-- vendor/modules.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 2bf8256335..c4f6bf8f20 100644 --- a/go.mod +++ b/go.mod @@ -133,7 +133,7 @@ require ( k8s.io/klog v0.1.0 // indirect k8s.io/kubernetes v1.12.3 yunion.io/x/executor v0.0.0-20191202093616-92e2e6119257 - yunion.io/x/jsonutils v0.0.0-20200110114224-cf1b538ba071 + yunion.io/x/jsonutils v0.0.0-20200110113153-490130d977cf yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d yunion.io/x/pkg v0.0.0-20200103043034-27c6f82160fa yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e diff --git a/go.sum b/go.sum index 3e98c139f7..87f449c36c 100644 --- a/go.sum +++ b/go.sum @@ -662,8 +662,8 @@ yunion.io/x/executor v0.0.0-20191202093616-92e2e6119257 h1:LZ6eC1uoLDAp7NQlaCy+D yunion.io/x/executor v0.0.0-20191202093616-92e2e6119257/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051 h1:vtZw2iwGrsARNSwRTREGjmr2BWPdxbmXVkb3kI1qu28= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= -yunion.io/x/jsonutils v0.0.0-20200110114224-cf1b538ba071 h1:k5IGOgp0aCr8CE3T2XdmYF7valNGx8M2uG9OI3s22NU= -yunion.io/x/jsonutils v0.0.0-20200110114224-cf1b538ba071/go.mod h1:NpWHLv3D1iMpsp1Kv6o1ASPZmuSKutE3RIMhxKSOeAM= +yunion.io/x/jsonutils v0.0.0-20200110113153-490130d977cf h1:v9P4T01bkqmDtEUZNWaG91mPW6eLMArCciylx3Fvam8= +yunion.io/x/jsonutils v0.0.0-20200110113153-490130d977cf/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= yunion.io/x/log v0.0.0-20190514041436-04ce53b17c6b h1:Z9z+7iegu0HXuL+S8taVWRd1P4b9JJOgPXIeoqYrj7c= yunion.io/x/log v0.0.0-20190514041436-04ce53b17c6b/go.mod h1:+gauLs73omeJAPlsXcevLsJLKixV+sR/E7WSYTSx1fE= yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d h1:59zrDL7Ft+hDukguJRmLr/Gdu/9V75x+yX99ovZwfaA= diff --git a/vendor/modules.txt b/vendor/modules.txt index a509561a72..445c845790 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -803,7 +803,7 @@ sigs.k8s.io/yaml yunion.io/x/executor/apis yunion.io/x/executor/client yunion.io/x/executor/server -# yunion.io/x/jsonutils v0.0.0-20200110114224-cf1b538ba071 +# yunion.io/x/jsonutils v0.0.0-20200110113153-490130d977cf yunion.io/x/jsonutils # yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d yunion.io/x/log From 877fdf90d99054ea004eb5147a4661c70a7b305e Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 10 Jan 2020 21:49:00 +0800 Subject: [PATCH 5/9] fix: resolve compilation errors after merge --- pkg/apis/compute/sku_const.go | 4 +++- pkg/compute/models/dbinstance_skus.go | 20 +++++++++++++++----- pkg/compute/models/elasticcache_skus.go | 3 +++ pkg/compute/models/keypairs.go | 1 - 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/pkg/apis/compute/sku_const.go b/pkg/apis/compute/sku_const.go index f47af39865..354da0903c 100644 --- a/pkg/apis/compute/sku_const.go +++ b/pkg/apis/compute/sku_const.go @@ -16,7 +16,6 @@ package compute import ( "yunion.io/x/onecloud/pkg/apis" - "yunion.io/x/onecloud/pkg/util/choices" ) const ( @@ -65,6 +64,7 @@ var SKU_FAMILIES = []string{ type ServerSkuListInput struct { apis.StatusStandaloneResourceListInput + apis.DomainizedResourceListInput ManagedResourceListInput @@ -78,6 +78,7 @@ type ServerSkuListInput struct { type ElasticcacheSkuListInput struct { apis.StatusStandaloneResourceListInput + apis.DomainizedResourceListInput UsableResourceListInput BillingFilterListInput @@ -89,6 +90,7 @@ type ElasticcacheSkuListInput struct { type DBInstanceSkuListInput struct { apis.EnabledStatusStandaloneResourceListInput + apis.DomainizedResourceListInput RegionalFilterListInput BillingFilterListInput diff --git a/pkg/compute/models/dbinstance_skus.go b/pkg/compute/models/dbinstance_skus.go index 580dee1ef5..19802b7a37 100644 --- a/pkg/compute/models/dbinstance_skus.go +++ b/pkg/compute/models/dbinstance_skus.go @@ -30,7 +30,6 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" - "yunion.io/x/onecloud/pkg/cloudcommon/validators" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" ) @@ -115,13 +114,24 @@ func (manager *SDBInstanceSkuManager) ListItemFilter(ctx context.Context, q *sql return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager.ListItemFilter") } - data := jsonutils.Marshal(query).(*jsonutils.JSONDict) + if domainStr := query.ProjectDomain; len(domainStr) > 0 { + domain, err := db.TenantCacheManager.FetchDomainByIdOrName(context.Background(), domainStr) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2("domains", domainStr) + } + return nil, httperrors.NewGeneralError(err) + } + q = q.In("provider", getDomainManagerProviderSubq(domain.GetId())) + } q = listItemDomainFilter(q, data) + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) + if err != nil { + return nil, errors.Wrap(err, "managedResourceFilterByRegion") + } - return validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{ - {Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred}, - }) + return q, nil } func (manager *SDBInstanceSkuManager) GetDBStringArray(q *sqlchemy.SQuery) ([]string, error) { diff --git a/pkg/compute/models/elasticcache_skus.go b/pkg/compute/models/elasticcache_skus.go index 29010a32bc..540764accc 100644 --- a/pkg/compute/models/elasticcache_skus.go +++ b/pkg/compute/models/elasticcache_skus.go @@ -16,6 +16,7 @@ package models import ( "context" + "database/sql" "strings" "yunion.io/x/jsonutils" @@ -29,6 +30,8 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/policy" + "yunion.io/x/onecloud/pkg/cloudcommon/validators" + "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/stringutils2" ) diff --git a/pkg/compute/models/keypairs.go b/pkg/compute/models/keypairs.go index c6ec528c42..7fd470012d 100644 --- a/pkg/compute/models/keypairs.go +++ b/pkg/compute/models/keypairs.go @@ -24,7 +24,6 @@ import ( "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" - "yunion.io/x/onecloud/pkg/apis" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" From 750cd9d4dc6fd14508cdaf2f4c3bdeffaed02f0b Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Sat, 11 Jan 2020 00:34:30 +0800 Subject: [PATCH 6/9] fix: ServerCreateInput add deprecated sku field for backward compatibility --- pkg/apis/compute/api.go | 18 ++++++++++++------ pkg/cloudcommon/db/adminsharablevirtual.go | 4 ++-- pkg/compute/models/baremetalagents.go | 2 +- pkg/compute/models/dynamicschedtags.go | 2 +- pkg/compute/models/loadbalanceracls.go | 2 +- pkg/keystone/models/regions.go | 2 +- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/pkg/apis/compute/api.go b/pkg/apis/compute/api.go index a655bbe14c..64fa468c11 100644 --- a/pkg/apis/compute/api.go +++ b/pkg/apis/compute/api.go @@ -424,9 +424,6 @@ type ServerCreateInput struct { // swagger:ignore AutoPrepaidRecycle bool `json:"auto_prepaid_recycle,omitfalse"` - // 安全组Id, 此参数会和secgroups参数合并 - SecgroupId string `json:"secgrp_id"` - // 弹性公网IP带宽 // 指定此参数后会创建新的弹性公网IP并绑定到新建的虚拟机 // 私有云不支持此参数 @@ -445,6 +442,8 @@ type ServerCreateInput struct { // required: false InstanceSnapshotId string `json:"instance_snapshot_id,omitempty"` + // 安全组Id, 此参数会和secgroups参数合并 + SecgroupId string `json:"secgrp_id"` // 安全组Id列表 Secgroups []string `json:"secgroups"` @@ -458,7 +457,8 @@ type ServerCreateInput struct { // swagger:ignore BillingCycle string `json:"billing_cycle"` - // DEPRECATE + // swagger:ignore + // Deprecated // 此参数等同于 hypervisor=baremetal Baremetal bool `json:"baremetal"` @@ -469,8 +469,14 @@ type ServerCreateInput struct { // swagger:ignore DefaultStorageType string `json:"default_storage_type,omitempty"` - // Guest Image ID - GuestImageID string + // 指定用于新建主机的主机镜像ID + GuestImageID string `json:"guest_image_id"` +} + +func (input *ServerCreateInput) AfterUnmarshal() { + if input.Baremetal { + input.Hypervisor = HYPERVISOR_BAREMETAL + } } type ServerCloneInput struct { diff --git a/pkg/cloudcommon/db/adminsharablevirtual.go b/pkg/cloudcommon/db/adminsharablevirtual.go index 87b3fb1d4b..f3f9667a26 100644 --- a/pkg/cloudcommon/db/adminsharablevirtual.go +++ b/pkg/cloudcommon/db/adminsharablevirtual.go @@ -19,13 +19,13 @@ import ( "strings" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/utils" + "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" - "yunion.io/x/pkg/errors" - "yunion.io/x/sqlchemy" ) type SAdminSharableVirtualResourceBase struct { diff --git a/pkg/compute/models/baremetalagents.go b/pkg/compute/models/baremetalagents.go index 0a271f2b1d..dc5a8e0ed1 100644 --- a/pkg/compute/models/baremetalagents.go +++ b/pkg/compute/models/baremetalagents.go @@ -22,13 +22,13 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/util/regutils" + "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" - "yunion.io/x/sqlchemy" ) type SBaremetalagentManager struct { diff --git a/pkg/compute/models/dynamicschedtags.go b/pkg/compute/models/dynamicschedtags.go index 9bad62592e..d845afd50a 100644 --- a/pkg/compute/models/dynamicschedtags.go +++ b/pkg/compute/models/dynamicschedtags.go @@ -21,6 +21,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/tristate" "yunion.io/x/sqlchemy" @@ -30,7 +31,6 @@ import ( "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/conditionparser" - "yunion.io/x/pkg/errors" ) type IDynamicResourceManager interface { diff --git a/pkg/compute/models/loadbalanceracls.go b/pkg/compute/models/loadbalanceracls.go index c5b96d0f23..97aff73337 100644 --- a/pkg/compute/models/loadbalanceracls.go +++ b/pkg/compute/models/loadbalanceracls.go @@ -26,6 +26,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/gotypes" "yunion.io/x/pkg/util/compare" "yunion.io/x/sqlchemy" @@ -38,7 +39,6 @@ import ( "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" - "yunion.io/x/pkg/errors" ) type SLoadbalancerAclEntry struct { diff --git a/pkg/keystone/models/regions.go b/pkg/keystone/models/regions.go index 9933f8ab0e..1ba3973a01 100644 --- a/pkg/keystone/models/regions.go +++ b/pkg/keystone/models/regions.go @@ -18,6 +18,7 @@ import ( "context" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" @@ -25,7 +26,6 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" - "yunion.io/x/pkg/errors" ) type SRegionManager struct { From 7fba2df0f2014ae1d06a6fe62c128f20e01440ff Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Mon, 13 Jan 2020 10:13:30 +0800 Subject: [PATCH 7/9] fix: skus filters --- pkg/apis/compute/cloudprovider.go | 10 +++++++-- pkg/apis/compute/sku_const.go | 4 ++++ pkg/compute/models/dbinstance_skus.go | 5 +++-- pkg/compute/models/elasticcache_skus.go | 12 ++++++++++- pkg/compute/models/skus.go | 27 ++++++++++++++----------- 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/pkg/apis/compute/cloudprovider.go b/pkg/apis/compute/cloudprovider.go index d09fdae028..3e5caa0ed9 100644 --- a/pkg/apis/compute/cloudprovider.go +++ b/pkg/apis/compute/cloudprovider.go @@ -77,10 +77,16 @@ type ManagedResourceListInput struct { // 列出指定云平台的资源,支持的云平台如下 // enum: OneCloud,VMware,Aliyun,Qcloud,Azure,Aws,Huawei,OpenStack,Ucloud,ZStack,Google,Ctyun,S3,Ceph,Xsky" - Providers []string `json:"provider"` + Providers []string `json:"providers"` + // swagger:ignore + // Deprecated + Provider []string `json:"provider" deprecated-by:"providers"` // 列出指定云平台品牌的资源 - Brands []string `json:"brand"` + Brands []string `json:"brands"` + // swagger:ignore + // Deprecated + Brand []string `json:"brand" deprecated-by:"brands"` // 列出指定云环境的资源,支持云环境如下: // diff --git a/pkg/apis/compute/sku_const.go b/pkg/apis/compute/sku_const.go index 354da0903c..9bde562b02 100644 --- a/pkg/apis/compute/sku_const.go +++ b/pkg/apis/compute/sku_const.go @@ -80,6 +80,8 @@ type ElasticcacheSkuListInput struct { apis.StatusStandaloneResourceListInput apis.DomainizedResourceListInput + ManagedResourceListInput + UsableResourceListInput BillingFilterListInput ZonalFilterListInput @@ -92,6 +94,8 @@ type DBInstanceSkuListInput struct { apis.EnabledStatusStandaloneResourceListInput apis.DomainizedResourceListInput + ManagedResourceListInput + RegionalFilterListInput BillingFilterListInput } diff --git a/pkg/compute/models/dbinstance_skus.go b/pkg/compute/models/dbinstance_skus.go index 19802b7a37..e5422a0353 100644 --- a/pkg/compute/models/dbinstance_skus.go +++ b/pkg/compute/models/dbinstance_skus.go @@ -122,10 +122,11 @@ func (manager *SDBInstanceSkuManager) ListItemFilter(ctx context.Context, q *sql } return nil, httperrors.NewGeneralError(err) } - q = q.In("provider", getDomainManagerProviderSubq(domain.GetId())) + query.ProjectDomain = domain.GetId() } - q = listItemDomainFilter(q, data) + q = listItemDomainFilter(q, query.Providers, query.ProjectDomain) + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByRegion") diff --git a/pkg/compute/models/elasticcache_skus.go b/pkg/compute/models/elasticcache_skus.go index 540764accc..af3bdcd2c1 100644 --- a/pkg/compute/models/elasticcache_skus.go +++ b/pkg/compute/models/elasticcache_skus.go @@ -194,7 +194,17 @@ func (manager *SElasticcacheSkuManager) ListItemFilter(ctx context.Context, q *s return nil, errors.Wrap(err, "managedResourceFilterByZone") } - q = listItemDomainFilter(q, data) + if domainStr := query.ProjectDomain; len(domainStr) > 0 { + domain, err := db.TenantCacheManager.FetchDomainByIdOrName(context.Background(), domainStr) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2("domains", domainStr) + } + return nil, httperrors.NewGeneralError(err) + } + query.ProjectDomain = domain.GetId() + } + q = listItemDomainFilter(q, query.Providers, query.ProjectDomain) q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) if err != nil { diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index edeb6e5ee1..b5e16f9cd7 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -694,26 +694,21 @@ func (self *SServerSku) GetZoneExternalId() (string, error) { return zone.GetExternalId(), nil } -func listItemDomainFilter(q *sqlchemy.SQuery, data *jsonutils.JSONDict) *sqlchemy.SQuery { - providers := jsonutils.GetQueryStringArray(data, "provider") +func listItemDomainFilter(q *sqlchemy.SQuery, providers []string, domainId string) *sqlchemy.SQuery { // CLOUD_PROVIDER_ONECLOUD 没有对应的cloudaccount - if domian_id := jsonutils.GetAnyString(data, []string{"domain_id", "project_domain"}); len(domian_id) > 0 { + if len(domainId) > 0 { if len(providers) >= 1 && !utils.IsInStringArray(api.CLOUD_PROVIDER_ONECLOUD, providers) { // 明确指定只查询公有云provider的情况,只查询公有云skus - q = q.In("provider", getDomainManagerProviderSubq(domian_id)) + q = q.In("provider", getDomainManagerProviderSubq(domainId)) } else if len(providers) == 1 && utils.IsInStringArray(api.CLOUD_PROVIDER_ONECLOUD, providers) { // 明确指定只查询私有云provider的情况 } else { // 公有云skus & 私有云skus 混合查询 - publicSkusQ := sqlchemy.In(q.Field("provider"), getDomainManagerProviderSubq(domian_id)) + publicSkusQ := sqlchemy.In(q.Field("provider"), getDomainManagerProviderSubq(domainId)) privateSkusQ := sqlchemy.Equals(q.Field("provider"), api.CLOUD_PROVIDER_ONECLOUD) q = q.Filter(sqlchemy.OR(publicSkusQ, privateSkusQ)) } - - data.Remove("domain_id") - data.Remove("project_domain") } - return q } @@ -744,9 +739,17 @@ func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchem ) } - data := query.(*jsonutils.JSONDict) - - q = listItemDomainFilter(q, data) + if domainStr := query.ProjectDomain; len(domainStr) > 0 { + domain, err := db.TenantCacheManager.FetchDomainByIdOrName(context.Background(), domainStr) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2("domains", domainStr) + } + return nil, httperrors.NewGeneralError(err) + } + query.ProjectDomain = domain.GetId() + } + q = listItemDomainFilter(q, query.Providers, query.ProjectDomain) providers := query.Providers if len(providers) > 0 { From 8154999c051a718bb78e84a041a0d1a97cc79f38 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Mon, 13 Jan 2020 15:42:10 +0800 Subject: [PATCH 8/9] update server listinput comments --- pkg/apis/compute/guests.go | 33 +++++++++++--------- pkg/compute/models/buckets.go | 1 + pkg/compute/models/elasticcache_instances.go | 1 + pkg/compute/models/elasticips.go | 1 + pkg/compute/models/keypairs.go | 1 + pkg/compute/models/vpcs.go | 1 + 6 files changed, 23 insertions(+), 15 deletions(-) diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index 726ad68a3a..5aefb71511 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -19,7 +19,7 @@ import ( ) type ServerFilterListInput struct { - // Filter by guest id or name + // 以关联主机(ID或Name)过滤列表 Server string `json:"server"` // swagger:ignore // Deprecated @@ -46,32 +46,35 @@ type ServerListInput struct { SecgroupFilterListInput DiskFilterListInput - // Show baremetal servers + // 只列出裸金属主机 Baremetal *bool `json:"baremetal"` - // Show gpu servers + // 只列出GPU主机 Gpu *bool `json:"gpu"` - // AdminSecgroup ID or Name + // 列出管理安全组为指定安全组的主机 AdminSecgroup string `json:"admin_security"` - // Show server of hypervisor choices:"kvm|esxi|container|baremetal|aliyun|azure|aws|huawei|ucloud|zstack|openstack"` + // 列出Hypervisor为指定值的主机 + // enum: kvm,esxi,baremetal,aliyun,azure,aws,huawei,ucloud,zstack,openstack,google,ctyun"` Hypervisor []string `json:"hypervisor"` - // Show Servers with EIP + // 列出绑定了弹性IP(EIP)的主机 WithEip *bool `json:"with_eip"` - // Show Servers without EIP + // 列出未绑定弹性IP(EIO)的主机 WithoutEip *bool `json:"without_eip"` - // OS Type choices:"linux|windows|vmware"` + // 列出操作系统为指定值的主机 + // enum: linux,windows,vmware OsType string `json:"os_type"` - // Order by disk size choices:"asc|desc" + // 对列表结果按照磁盘进行排序 + // enum: asc,desc OrderByDisk string `json:"order_by_disk"` - // Order by host name choices:"asc|desc" + // 对主机列表结果按照宿主机名称进行排序 + // enum: asc,desc OrderByHost string `json:"order_by_host"` - // Eip id or name + // 列出可以挂载指定EIP的主机 UsableServerForEip string `json:"usable_server_for_eip"` - // Show Servers without user metadata - WithoutUserMeta *bool `json:"without_user_meta"` - // Resource type choices:"shared|prepaid|dedicated" + // 按主机资源类型进行排序 + // enum: shared,prepaid,dedicated ResourceType string `json:"resource_type"` - // return backup guests on a host + // 返回开启主备机功能的主机 GetBackupGuestsOnHost *bool `json:"get_backup_guests_on_host"` } diff --git a/pkg/compute/models/buckets.go b/pkg/compute/models/buckets.go index c9e141a4a4..b204da8311 100644 --- a/pkg/compute/models/buckets.go +++ b/pkg/compute/models/buckets.go @@ -576,6 +576,7 @@ func (bucket *SBucket) getCloudProviderInfo() SCloudProviderInfo { return MakeCloudProviderInfo(region, nil, provider) } +// 列出对象存储的存储桶 func (manager *SBucketManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.BucketListInput) (*sqlchemy.SQuery, error) { var err error diff --git a/pkg/compute/models/elasticcache_instances.go b/pkg/compute/models/elasticcache_instances.go index 085281fbd2..17f553857d 100644 --- a/pkg/compute/models/elasticcache_instances.go +++ b/pkg/compute/models/elasticcache_instances.go @@ -250,6 +250,7 @@ func (manager *SElasticcacheManager) GetOwnerIdByElasticcacheId(elasticcacheId s return ec.(*SElasticcache).GetOwnerId() } +// 列出弹性缓存(redis等) func (manager *SElasticcacheManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ElasticcacheListInput) (*sqlchemy.SQuery, error) { q, err := manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index 5ef202c2ed..df753ab509 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -83,6 +83,7 @@ type SElasticip struct { CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` } +// 列出弹性公网IP func (manager *SElasticipManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ElasticipListInput) (*sqlchemy.SQuery, error) { var err error q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) diff --git a/pkg/compute/models/keypairs.go b/pkg/compute/models/keypairs.go index 7fd470012d..fd8587820e 100644 --- a/pkg/compute/models/keypairs.go +++ b/pkg/compute/models/keypairs.go @@ -61,6 +61,7 @@ type SKeypair struct { OwnerId string `width:"128" charset:"ascii" index:"true" nullable:"false" create:"required"` // Column(VARCHAR(length=36, charset='ascii'), index=True, nullable=False) } +// 列出ssh密钥对 func (manager *SKeypairManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.KeypairListInput) (*sqlchemy.SQuery, error) { q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput) if err != nil { diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index 205a398590..de6e1f3f75 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -785,6 +785,7 @@ func (self *SVpc) PerformPurge(ctx context.Context, userCred mcclient.TokenCrede return nil, err } +// 列出VPC func (manager *SVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.VpcListInput) (*sqlchemy.SQuery, error) { var err error q, err = managedResourceFilterByAccount(q, query.ManagedResourceListInput, "", nil) From 7cf59a1fc1f1aa4b1a369f5d7e1ae157700c9945 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Mon, 13 Jan 2020 15:57:43 +0800 Subject: [PATCH 9/9] update vendor --- go.mod | 2 +- go.sum | 4 ++-- vendor/modules.txt | 2 +- vendor/yunion.io/x/jsonutils/unmarshal.go | 25 +++++++++++++++++++---- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index c4f6bf8f20..fc62ba4943 100644 --- a/go.mod +++ b/go.mod @@ -133,7 +133,7 @@ require ( k8s.io/klog v0.1.0 // indirect k8s.io/kubernetes v1.12.3 yunion.io/x/executor v0.0.0-20191202093616-92e2e6119257 - yunion.io/x/jsonutils v0.0.0-20200110113153-490130d977cf + yunion.io/x/jsonutils v0.0.0-20200113074440-9297fd00ba07 yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d yunion.io/x/pkg v0.0.0-20200103043034-27c6f82160fa yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e diff --git a/go.sum b/go.sum index 87f449c36c..4c88aab9fc 100644 --- a/go.sum +++ b/go.sum @@ -662,8 +662,8 @@ yunion.io/x/executor v0.0.0-20191202093616-92e2e6119257 h1:LZ6eC1uoLDAp7NQlaCy+D yunion.io/x/executor v0.0.0-20191202093616-92e2e6119257/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051 h1:vtZw2iwGrsARNSwRTREGjmr2BWPdxbmXVkb3kI1qu28= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= -yunion.io/x/jsonutils v0.0.0-20200110113153-490130d977cf h1:v9P4T01bkqmDtEUZNWaG91mPW6eLMArCciylx3Fvam8= -yunion.io/x/jsonutils v0.0.0-20200110113153-490130d977cf/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= +yunion.io/x/jsonutils v0.0.0-20200113074440-9297fd00ba07 h1:i6Im3w4UoyCIKOEtr0Y3aAPGrL9FYAzeFXoj3daXXt0= +yunion.io/x/jsonutils v0.0.0-20200113074440-9297fd00ba07/go.mod h1:NpWHLv3D1iMpsp1Kv6o1ASPZmuSKutE3RIMhxKSOeAM= yunion.io/x/log v0.0.0-20190514041436-04ce53b17c6b h1:Z9z+7iegu0HXuL+S8taVWRd1P4b9JJOgPXIeoqYrj7c= yunion.io/x/log v0.0.0-20190514041436-04ce53b17c6b/go.mod h1:+gauLs73omeJAPlsXcevLsJLKixV+sR/E7WSYTSx1fE= yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d h1:59zrDL7Ft+hDukguJRmLr/Gdu/9V75x+yX99ovZwfaA= diff --git a/vendor/modules.txt b/vendor/modules.txt index 445c845790..d3086a3560 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -803,7 +803,7 @@ sigs.k8s.io/yaml yunion.io/x/executor/apis yunion.io/x/executor/client yunion.io/x/executor/server -# yunion.io/x/jsonutils v0.0.0-20200110113153-490130d977cf +# yunion.io/x/jsonutils v0.0.0-20200113074440-9297fd00ba07 yunion.io/x/jsonutils # yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d yunion.io/x/log diff --git a/vendor/yunion.io/x/jsonutils/unmarshal.go b/vendor/yunion.io/x/jsonutils/unmarshal.go index b13b0ba780..ef80b8730f 100644 --- a/vendor/yunion.io/x/jsonutils/unmarshal.go +++ b/vendor/yunion.io/x/jsonutils/unmarshal.go @@ -61,10 +61,6 @@ func jsonUnmarshal(jo JSONObject, o interface{}, keys []string) error { if err != nil { return errors.Wrap(err, "jo.unmarshalValue") } - afterMarshalFunc := value.MethodByName("AfterUnmarshal") - if afterMarshalFunc.IsValid() && !afterMarshalFunc.IsNil() { - afterMarshalFunc.Call([]reflect.Value{}) - } return nil } @@ -557,5 +553,26 @@ func (this *JSONDict) unmarshalStruct(val reflect.Value) error { return errors.Wrapf(err, "setStructFieldAt %s: %s", k, v) } } + callStructAfterUnmarshal(val) return nil } + +func callStructAfterUnmarshal(val reflect.Value) { + switch val.Kind() { + case reflect.Struct: + structType := val.Type() + for i := 0; i < val.NumField(); i++ { + fieldType := structType.Field(i) + if fieldType.Anonymous { + callStructAfterUnmarshal(val.Field(i)) + } + } + valPtr := val.Addr() + afterMarshalFunc := valPtr.MethodByName("AfterUnmarshal") + if afterMarshalFunc.IsValid() && !afterMarshalFunc.IsNil() { + afterMarshalFunc.Call([]reflect.Value{}) + } + case reflect.Ptr: + callStructAfterUnmarshal(val.Elem()) + } +}