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"