From 3c9b368c43b3dcb4cef5350e8a85c1331efca6b8 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 12 Mar 2020 01:31:11 +0800 Subject: [PATCH] feature: fix region list filters round 3 --- go.mod | 2 +- go.sum | 4 +- pkg/apis/compute/bucket.go | 8 +- pkg/apis/compute/cloudaccount.go | 3 +- pkg/apis/compute/cloudprovider.go | 8 +- pkg/apis/compute/cloudproviderregion.go | 14 +- pkg/apis/compute/dbinstance.go | 16 +- pkg/apis/compute/disk.go | 14 +- pkg/apis/compute/elasticcache_const.go | 6 + pkg/apis/compute/elasticips_const.go | 1 + pkg/apis/compute/geo_input.go | 8 +- pkg/apis/compute/groupguest.go | 13 ++ pkg/apis/compute/groupnetwork.go | 9 + pkg/apis/compute/guests.go | 2 + pkg/apis/compute/host.go | 2 +- pkg/apis/compute/input.go | 54 +++++- pkg/apis/compute/instance_group.go | 10 +- pkg/apis/compute/loadbalancer.go | 53 ++++++ pkg/apis/compute/loadbalancernetwork.go | 9 + pkg/apis/compute/natgateway.go | 12 ++ pkg/apis/compute/network.go | 32 ++++ pkg/apis/compute/networkschedtag.go | 5 + pkg/apis/compute/reservedip.go | 5 + pkg/apis/compute/schedtag.go | 19 +- pkg/apis/compute/secgroup.go | 19 ++ pkg/apis/compute/sku_const.go | 17 +- pkg/apis/compute/snapshot.go | 8 + pkg/apis/compute/snapshotpolicy.go | 5 + pkg/apis/compute/snapshotpolicycache.go | 2 +- pkg/apis/compute/snapshotpolicydisk.go | 9 + pkg/apis/compute/storage_const.go | 7 +- pkg/apis/compute/storagecachedimage.go | 20 +++ pkg/apis/compute/storageschedtag.go | 5 + pkg/apis/compute/vpcs_const.go | 10 ++ pkg/apis/compute/zz_generated.model.go | 86 +++++---- pkg/apis/list.go | 11 ++ pkg/apis/output.go | 4 + pkg/apis/zz_generated.model.go | 3 +- pkg/cloudcommon/db/caller.go | 4 +- pkg/cloudcommon/db/db_dispatcher.go | 56 +++--- pkg/cloudcommon/db/fieldtags.go | 22 ++- pkg/cloudcommon/db/jointbase.go | 7 - pkg/cloudcommon/db/modelbase.go | 6 +- pkg/cloudcommon/db/resourcebase.go | 20 +-- pkg/cloudcommon/db/scoperesource.go | 74 ++++++-- pkg/compute/models/baremetalagents.go | 8 +- pkg/compute/models/buckets.go | 14 +- pkg/compute/models/cachedimages.go | 8 +- pkg/compute/models/cloudaccounts.go | 9 +- pkg/compute/models/cloudproviderregions.go | 163 +++++++++++++++--- pkg/compute/models/cloudproviders.go | 11 +- pkg/compute/models/cloudregions.go | 12 +- pkg/compute/models/cloudsync.go | 14 ++ pkg/compute/models/dbinstance_accounts.go | 7 +- pkg/compute/models/dbinstance_backups.go | 14 +- pkg/compute/models/dbinstance_databases.go | 7 +- pkg/compute/models/dbinstance_parameters.go | 7 +- pkg/compute/models/dbinstance_privileges.go | 7 +- pkg/compute/models/dbinstance_skus.go | 21 ++- pkg/compute/models/dbinstancejoints.go | 4 +- pkg/compute/models/dbinstances.go | 14 +- .../models/deletepreventableresource.go | 24 ++- pkg/compute/models/disks.go | 8 +- pkg/compute/models/dnsrecords.go | 2 +- pkg/compute/models/dynamicschedtags.go | 2 +- pkg/compute/models/elasticcache_accounts.go | 7 +- pkg/compute/models/elasticcache_acls.go | 8 +- pkg/compute/models/elasticcache_backups.go | 8 +- pkg/compute/models/elasticcache_instances.go | 12 +- pkg/compute/models/elasticcache_parameters.go | 8 +- pkg/compute/models/elasticcache_skus.go | 6 + pkg/compute/models/elasticips.go | 9 +- pkg/compute/models/external_projects.go | 5 + pkg/compute/models/groupguests.go | 46 +++++ pkg/compute/models/groupjoints.go | 43 +++++ pkg/compute/models/groupnetworks.go | 47 +++++ pkg/compute/models/groupresource.go | 153 ++++++++++++++++ pkg/compute/models/groups.go | 18 +- pkg/compute/models/guestdisks.go | 5 +- pkg/compute/models/guests.go | 17 +- pkg/compute/models/guestsecgroups.go | 50 +++++- pkg/compute/models/hostresource.go | 2 +- pkg/compute/models/hosts.go | 6 + pkg/compute/models/isolated_devices.go | 2 +- pkg/compute/models/keypairs.go | 8 + pkg/compute/models/loadbalanceracls.go | 12 ++ pkg/compute/models/loadbalanceragents.go | 13 +- .../models/loadbalancerbackendgroups.go | 13 +- pkg/compute/models/loadbalancerbackends.go | 24 ++- .../models/loadbalancercachedcertificates.go | 2 +- .../models/loadbalancercertificateresource.go | 2 +- .../models/loadbalancercertificates.go | 12 ++ pkg/compute/models/loadbalancerclusters.go | 2 +- .../models/loadbalancerlistenerrules.go | 22 ++- pkg/compute/models/loadbalancerlisteners.go | 27 ++- pkg/compute/models/loadbalancernetworks.go | 75 ++++++++ pkg/compute/models/loadbalancers.go | 27 ++- pkg/compute/models/managedresource.go | 87 ++++++---- pkg/compute/models/natdtable.go | 17 ++ pkg/compute/models/natgateways.go | 20 ++- pkg/compute/models/natstable.go | 8 + pkg/compute/models/networkinterfaces.go | 15 ++ pkg/compute/models/networks.go | 58 ++++++- pkg/compute/models/networkschedtags.go | 43 +++++ pkg/compute/models/reservedips.go | 9 +- pkg/compute/models/routetables.go | 10 ++ pkg/compute/models/schedpolicies.go | 11 ++ pkg/compute/models/schedtags.go | 21 ++- pkg/compute/models/secgroupcache.go | 39 ++++- pkg/compute/models/secgroupresource.go | 154 +++++++++++++++++ pkg/compute/models/secgrouprules.go | 29 +++- pkg/compute/models/secgroups.go | 17 +- pkg/compute/models/service_catalog.go | 11 ++ pkg/compute/models/skus.go | 7 +- pkg/compute/models/snapshotpolicy.go | 7 + pkg/compute/models/snapshotpolicycache.go | 34 +++- pkg/compute/models/snapshotpolicydisks.go | 101 +++++++++-- pkg/compute/models/snapshotpolicyresource.go | 155 +++++++++++++++++ pkg/compute/models/snapshots.go | 52 +++++- pkg/compute/models/storagecachedimages.go | 71 +++++++- pkg/compute/models/storages.go | 8 +- pkg/compute/models/storageschedtags.go | 43 +++++ pkg/compute/models/vpcs.go | 21 ++- pkg/compute/models/wires.go | 10 +- pkg/compute/models/zones.go | 21 ++- pkg/image/models/images.go | 2 +- pkg/notify/models/mod_notification.go | 6 +- vendor/modules.txt | 2 +- .../x/pkg/util/reflectutils/jsonfield.go | 30 +++- 129 files changed, 2516 insertions(+), 354 deletions(-) create mode 100644 pkg/compute/models/groupresource.go create mode 100644 pkg/compute/models/secgroupresource.go create mode 100644 pkg/compute/models/snapshotpolicyresource.go diff --git a/go.mod b/go.mod index 8d344066cc..7068f3785d 100644 --- a/go.mod +++ b/go.mod @@ -130,7 +130,7 @@ require ( yunion.io/x/executor v0.0.0-20200227030256-a18417815e74 yunion.io/x/jsonutils v0.0.0-20200303051356-aa609aba0cda yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d - yunion.io/x/pkg v0.0.0-20200304112442-9dae9351325e + yunion.io/x/pkg v0.0.0-20200312093207-f07f4cb157e0 yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e yunion.io/x/sqlchemy v0.0.0-20200312002602-1177cd8fbc57 yunion.io/x/structarg v0.0.0-20190809075558-115bed041de3 diff --git a/go.sum b/go.sum index e739fa699f..7e65d09768 100644 --- a/go.sum +++ b/go.sum @@ -1114,8 +1114,8 @@ yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d/go.mod h1:LC6f/4FozL0iaAbnFt2 yunion.io/x/pkg v0.0.0-20190620104149-945c25821dbf/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= yunion.io/x/pkg v0.0.0-20190628082551-f4033ba2ea30/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= yunion.io/x/pkg v0.0.0-20200302034534-fdf44d54b070/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= -yunion.io/x/pkg v0.0.0-20200304112442-9dae9351325e h1:rBfX77+VEBVpe6Xxy2gDa4WB7qbtndWvXcrVKzleF84= -yunion.io/x/pkg v0.0.0-20200304112442-9dae9351325e/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= +yunion.io/x/pkg v0.0.0-20200312093207-f07f4cb157e0 h1:ZgNhWrnxnVjw53rjx5uV5yQCYcwM8lpVHsrchmHWQI4= +yunion.io/x/pkg v0.0.0-20200312093207-f07f4cb157e0/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E= yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e h1:v+EzIadodSwkdZ/7bremd7J8J50Cise/HCylsOJngmo= yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e/go.mod h1:0iFKpOs1y4lbCxeOmq3Xx/0AcQoewVPwj62eRluioEo= yunion.io/x/sqlchemy v0.0.0-20200312002602-1177cd8fbc57 h1:KtQAuLJ00RSUVqkiRmJ1DiDABiw0U3xxXnzD3lGavaY= diff --git a/pkg/apis/compute/bucket.go b/pkg/apis/compute/bucket.go index 9a0e8b7652..a1111da261 100644 --- a/pkg/apis/compute/bucket.go +++ b/pkg/apis/compute/bucket.go @@ -98,15 +98,17 @@ func (input *BucketMetadataInput) Validate() error { type BucketListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput + ManagedResourceListInput RegionalFilterListInput // STORAGE_CLASS - StorageClass string `json:"storage_class"` + StorageClass []string `json:"storage_class"` // 位置 - Location string `json:"location"` + Location []string `json:"location"` // ACL - Acl string `json:"acl"` + Acl []string `json:"acl"` } diff --git a/pkg/apis/compute/cloudaccount.go b/pkg/apis/compute/cloudaccount.go index ac1a033798..3bdf2b1d01 100644 --- a/pkg/apis/compute/cloudaccount.go +++ b/pkg/apis/compute/cloudaccount.go @@ -212,8 +212,7 @@ type CloudaccountListInput struct { CapabilityListInput - // 同步状态 - SyncStatus []string `json:"sync_status"` + SyncableBaseResourceListInput // 账号健康状态 HealthStatus []string `json:"health_status"` diff --git a/pkg/apis/compute/cloudprovider.go b/pkg/apis/compute/cloudprovider.go index b16ceb5a01..53b0e0b6a9 100644 --- a/pkg/apis/compute/cloudprovider.go +++ b/pkg/apis/compute/cloudprovider.go @@ -216,8 +216,7 @@ type CloudproviderListInput struct { CapabilityListInput - // 同步状态 - SyncStatus []string `json:"sync_status"` + SyncableBaseResourceListInput // 账号健康状态 HealthStatus []string `json:"health_status"` @@ -228,3 +227,8 @@ func (input *CapabilityListInput) AfterUnmarshal() { input.Capability = append(input.Capability, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE) } } + +type SyncableBaseResourceListInput struct { + // 同步状态 + SyncStatus []string `json:"sync_status"` +} diff --git a/pkg/apis/compute/cloudproviderregion.go b/pkg/apis/compute/cloudproviderregion.go index a76d6f0496..039094b55e 100644 --- a/pkg/apis/compute/cloudproviderregion.go +++ b/pkg/apis/compute/cloudproviderregion.go @@ -18,9 +18,9 @@ import "yunion.io/x/onecloud/pkg/apis" type CloudproviderregionDetails struct { apis.JointResourceBaseDetails + CloudregionResourceInfo - Cloudprovider string - Cloudregion string + Cloudprovider string `json:"cloudprovider"` // 云账号Id // example: fa4aaf88-aed8-422d-84e7-56dea533b364 @@ -39,3 +39,13 @@ type CloudproviderregionDetails struct { // example: 300 SyncIntervalSeconds int `json:"sync_interval_seconds"` } + +type CloudproviderregionListInput struct { + apis.JointResourceBaseListInput + SyncableBaseResourceListInput + RegionalFilterListInput + ManagedResourceListInput + + // 是否启用 + Enabled *bool `json:"enabled"` +} diff --git a/pkg/apis/compute/dbinstance.go b/pkg/apis/compute/dbinstance.go index 8c4ce3136e..648e807b62 100644 --- a/pkg/apis/compute/dbinstance.go +++ b/pkg/apis/compute/dbinstance.go @@ -164,6 +164,8 @@ type SDBInstanceRecoveryConfigInput struct { type DBInstanceListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput + apis.DeletePreventableResourceBaseListInput VpcFilterListInput @@ -188,6 +190,7 @@ type DBInstanceListInput struct { type DBInstanceBackupListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput RegionalFilterListInput @@ -195,14 +198,14 @@ type DBInstanceBackupListInput struct { // RDS引擎 // example: MySQL - Engine string `json:"engine"` + Engine []string `json:"engine"` // RDS引擎版本 // example: 5.7 - EngineVersion string `json:"engine_version"` + EngineVersion []string `json:"engine_version"` // 备份模式 - BackupMode string `json:"backup_mode"` + BackupMode []string `json:"backup_mode"` // 数据库名称 DBNames string `json:"db_names"` @@ -210,6 +213,7 @@ type DBInstanceBackupListInput struct { type DBInstancePrivilegeListInput struct { apis.ResourceBaseListInput + apis.ExternalizedResourceBaseListInput // filter by dbinstanceaccount Dbinstanceaccount string `json:"dbinstanceaccount"` @@ -217,12 +221,12 @@ type DBInstancePrivilegeListInput struct { Dbinstancedatabase string `json:"dbinstancedatabase"` // 权限 - Privilege string `json:"privilege"` + Privilege []string `json:"privilege"` } type DBInstanceParameterListInput struct { apis.StandaloneResourceListInput - + apis.ExternalizedResourceBaseListInput DBInstanceFilterListInput // 参数名称 @@ -234,6 +238,7 @@ type DBInstanceParameterListInput struct { type DBInstanceDatabaseListInput struct { apis.StatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput DBInstanceFilterListInput @@ -243,6 +248,7 @@ type DBInstanceDatabaseListInput struct { type DBInstanceAccountListInput struct { apis.StatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput DBInstanceFilterListInput } diff --git a/pkg/apis/compute/disk.go b/pkg/apis/compute/disk.go index d820fc4da9..c4732cc054 100644 --- a/pkg/apis/compute/disk.go +++ b/pkg/apis/compute/disk.go @@ -91,10 +91,14 @@ type SnapshotPolicyFilterListInput struct { // Deprecated // filter disk by snapshotpolicy_id SnapshotpolicyId string `json:"snapshotpolicy_id" deprecated-by:"snapshotpolicy"` + + // 以快照策略名称排序 + OrderBySnapshotpolicy string `json:"order_by_snapshotpolicy"` } type DiskListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput billing.BillingResourceListInput StorageFilterListInput @@ -140,9 +144,7 @@ type DiskListInput struct { SnapshotId string `json:"snapshot_id" deprecated-by:"snapshot"` } -type DiskFilterListInput struct { - StorageFilterListInput - +type DiskFilterListInputBase struct { // 以指定虚拟磁盘(ID或Name)过滤列表结果 Disk string `json:"disk"` // swagger:ignore @@ -155,6 +157,12 @@ type DiskFilterListInput struct { OrderByDisk string `json:"order_by_disk"` } +type DiskFilterListInput struct { + StorageFilterListInput + + DiskFilterListInputBase +} + type SimpleGuest struct { Name string `json:"name"` Id string `json:"id"` diff --git a/pkg/apis/compute/elasticcache_const.go b/pkg/apis/compute/elasticcache_const.go index 9b0c1e65fc..4054aa5c44 100644 --- a/pkg/apis/compute/elasticcache_const.go +++ b/pkg/apis/compute/elasticcache_const.go @@ -109,6 +109,8 @@ const ( type ElasticcacheListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput + apis.DeletePreventableResourceBaseListInput VpcFilterListInput ZonalFilterListBase @@ -162,6 +164,7 @@ type ElasticcacheListInput struct { type ElasticcacheAccountListInput struct { apis.StatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput ElasticcacheFilterListInput @@ -174,6 +177,7 @@ type ElasticcacheAccountListInput struct { type ElasticcacheAclListInput struct { apis.StandaloneResourceListInput + apis.ExternalizedResourceBaseListInput ElasticcacheFilterListInput @@ -183,6 +187,7 @@ type ElasticcacheAclListInput struct { type ElasticcacheBackupListInput struct { apis.StatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput ElasticcacheFilterListInput @@ -195,6 +200,7 @@ type ElasticcacheBackupListInput struct { type ElasticcacheParameterListInput struct { apis.StandaloneResourceListInput + apis.ExternalizedResourceBaseListInput ElasticcacheFilterListInput diff --git a/pkg/apis/compute/elasticips_const.go b/pkg/apis/compute/elasticips_const.go index d7fc1ac595..8bb0795ca5 100644 --- a/pkg/apis/compute/elasticips_const.go +++ b/pkg/apis/compute/elasticips_const.go @@ -55,6 +55,7 @@ var ( type ElasticipListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput RegionalFilterListInput diff --git a/pkg/apis/compute/geo_input.go b/pkg/apis/compute/geo_input.go index 7cb98ac3d0..d4464cbfac 100644 --- a/pkg/apis/compute/geo_input.go +++ b/pkg/apis/compute/geo_input.go @@ -70,6 +70,7 @@ func (input ZonalFilterListInput) ZoneList() []string { type CloudregionListInput struct { apis.EnabledStatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput apis.DomainizedResourceListInput ManagedResourceListInput @@ -82,12 +83,12 @@ type CloudregionListInput struct { Service string `json:"service"` // 云环境 - Environment string `json:"environment"` + Environment []string `json:"environment"` } type ZoneListInput struct { apis.StatusStandaloneResourceListInput - apis.DomainizedResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput @@ -98,6 +99,9 @@ type ZoneListInput struct { // 过滤提供特定服务的可用区 Service string `json:"service"` + + Location []string `json:"location"` + Contacts []string `json:"contacts"` } type ZoneResourceInput struct { diff --git a/pkg/apis/compute/groupguest.go b/pkg/apis/compute/groupguest.go index 6f2ebc039c..c2f84f293f 100644 --- a/pkg/apis/compute/groupguest.go +++ b/pkg/apis/compute/groupguest.go @@ -25,6 +25,11 @@ type GroupJointResourceDetails struct { Instancegroup string `json:"instance_group"` } +type GroupJointsListInput struct { + apis.VirtualJointResourceBaseListInput + GroupFilterListInput +} + type GroupguestDetails struct { GroupJointResourceDetails @@ -33,3 +38,11 @@ type GroupguestDetails struct { SGroupguest } + +type GroupguestListInput struct { + GroupJointsListInput + GuestFilterListInput + + // 标签 + Tag []string `json:"tag"` +} diff --git a/pkg/apis/compute/groupnetwork.go b/pkg/apis/compute/groupnetwork.go index 7a868d464e..5aa826bf3b 100644 --- a/pkg/apis/compute/groupnetwork.go +++ b/pkg/apis/compute/groupnetwork.go @@ -22,3 +22,12 @@ type GroupnetworkDetails struct { // IP子网名称 Network string } + +type GroupnetworkListInput struct { + GroupJointsListInput + + NetworkFilterListInput + + // IP地址 + IpAddr []string `json:"ip_addr"` +} diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index f151d6d2e7..0d2522d8ac 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -42,6 +42,8 @@ type ServerFilterListInput struct { type ServerListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput + apis.DeletePreventableResourceBaseListInput HostFilterListInput diff --git a/pkg/apis/compute/host.go b/pkg/apis/compute/host.go index 8d7eb659ef..657bc34a78 100644 --- a/pkg/apis/compute/host.go +++ b/pkg/apis/compute/host.go @@ -48,7 +48,7 @@ type DiskSpec struct { type HostListInput struct { apis.EnabledStatusStandaloneResourceListInput - apis.DomainizedResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput ZonalFilterListInput diff --git a/pkg/apis/compute/input.go b/pkg/apis/compute/input.go index 9289b861de..471ff282c4 100644 --- a/pkg/apis/compute/input.go +++ b/pkg/apis/compute/input.go @@ -41,46 +41,71 @@ type KeypairListInput struct { // list in admin mode Admin *bool `json:"admin"` + + // 加密类型 + // example: RSA + Scheme []string `json:"scheme"` + + // 指纹信息 + // example: 1d:3a:83:4a:a1:f3:75:97:ec:d1:ef:f8:3f:a7:5d:9e + Fingerprint []string `json:"fingerprint"` } type CachedimageListInput struct { apis.StandaloneResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput ZonalFilterListInput // 镜像类型,可能值为: system(公有云公共镜像), customized(自定义镜像) // example: system - ImageType string `json:"image_type"` + ImageType []string `json:"image_type"` } type ExternalProjectListInput struct { apis.StandaloneResourceListInput apis.ProjectizedResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput } type RouteTableListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput VpcFilterListInput + + // filter by type + Type []string `json:"type"` } type SnapshotPolicyCacheListInput struct { apis.StatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput + ManagedResourceListInput RegionalFilterListInput + SnapshotPolicyFilterListInput // filter by snapshotpolicy Id or Name - Snapshotpolicy string `json:"snapshotpolicy"` + //Snapshotpolicy string `json:"snapshotpolicy"` } type NetworkInterfaceListInput struct { apis.StatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput RegionalFilterListInput + + // MAC地址 + Mac []string `json:"mac"` + // 绑定资源类型 + AssociateType []string `json:"associate_type"` + // 绑定资源Id + AssociateId []string `json:"associate_id"` } type BaremetalagentListInput struct { @@ -88,11 +113,11 @@ type BaremetalagentListInput struct { ZonalFilterListInput // 以状态过滤 - Status string `json:"status"` + Status []string `json:"status"` // 以IP地址过滤 - AccessIp string `json:"access_ip"` + AccessIp []string `json:"access_ip"` // 以AgentType过滤 - AgentType string `json:"agent_type"` + AgentType []string `json:"agent_type"` } type DnsRecordListInput struct { @@ -114,14 +139,33 @@ type GuestTemplateListInput struct { type SchedpolicyListInput struct { apis.StandaloneResourceListInput SchedtagFilterListInput + + // + Strategy []string `json:"strategy"` + + // + Enabled *bool `json:"enabled"` +} + +type GuestTemplateFilterListInput struct { + // 主机镜像 + GuestTemplate string `json:"guest_template"` + // swagger:ignore + // Deprecated + GuestTemplateId string `json:"guest_template_id" deprecated-by:"guest_template"` } type ServiceCatalogListInput struct { apis.SharableVirtualResourceListInput + + GuestTemplateFilterListInput } type SnapshotPolicyListInput struct { apis.VirtualResourceListInput + + // 是否启用? + IsActivated *bool `json:"is_activated"` } type DnsRecordDetails struct { diff --git a/pkg/apis/compute/instance_group.go b/pkg/apis/compute/instance_group.go index a8c4c3fd29..d09ac7f6df 100644 --- a/pkg/apis/compute/instance_group.go +++ b/pkg/apis/compute/instance_group.go @@ -48,7 +48,15 @@ type GroupFilterListInput struct { // 以指定实例组(ID或Name)过滤列表结果 Group string `json:"group"` // swagger:ignore - // deprecated: true + // Deprecated // Filter by instance group Id GroupId string `json:"group_id" deprecated-by:"group"` + + // 按组名排序 + OrderByGroup string `json:"order_by_group"` +} + +type GroupResourceInfo struct { + // 实例组名称 + Group string `json:"group"` } diff --git a/pkg/apis/compute/loadbalancer.go b/pkg/apis/compute/loadbalancer.go index 3879890f57..2e5b149122 100644 --- a/pkg/apis/compute/loadbalancer.go +++ b/pkg/apis/compute/loadbalancer.go @@ -33,47 +33,86 @@ const ( type LoadbalancerListenerListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput LoadbalancerFilterListInput // filter by backend_group BackendGroup string `json:"backend_group"` // filter by acl Acl string `json:"acl"` + + ListenerType []string `json:"listener_type"` + ListenerPort []int `json:"listener_port"` + + Scheduler []string `json:"scheduler"` + + SendProxy []string `json:"send_proxy"` + + AclStatus []string `json:"acl_status"` + AclType []string `json:"acl_type"` } type LoadbalancerListenerRuleListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput LoadbalancerListenerFilterListInput // filter by backend_group BackendGroup string `json:"backend_group"` + + // 默认转发策略,目前只有aws用到其它云都是false + IsDefault *bool `json:"is_default"` + + Domain []string `json:"domain"` + Path []string `json:"path"` } type LoadbalancerListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput + VpcFilterListInput ZonalFilterListBase NetworkFilterListBase // filter by cluster Cluster string `json:"cluster"` + + Address []string `json:"address"` + // 地址类型 + AddressType []string `json:"address_type"` + // 网络类型 + NetworkType []string `json:"network_type"` + // 计费类型 + ChargeType []string `json:"charge_type"` + // 套餐名称 + LoadbalancerSpec []string `json:"loadbalancer_spec"` } type LoadbalancerAgentListInput struct { apis.StandaloneResourceListInput LoadbalancerClusterFilterListInput + + Version []string `json:"version"` + IP []string `json:"ip"` + HaState []string `json:"ha_state"` } type LoadbalancerCertificateListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput UsableResourceListInput RegionalFilterListInput ManagedResourceListInput + + CommonName []string `json:"common_name"` + SubjectAlternativeNames []string `json:"subject_alternative_names"` } type LoadbalancerBackendListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput LoadbalancerBackendGroupFilterListInput @@ -82,15 +121,25 @@ type LoadbalancerBackendListInput struct { // filter by backend group // BackendGroup string `json:"backend_group"` + + BackendType []string `json:"backend_type"` + BackendRole []string `json:"backend_role"` + Address []string `json:"address"` + + SendProxy []string `json:"send_proxy"` + Ssl []string `json:"ssl"` } type LoadbalancerBackendGroupListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput LoadbalancerFilterListInput // filter LoadbalancerBackendGroup with no reference NoRef *bool `json:"no_ref"` + + Type []string `json:"type"` } type LoadbalancerClusterListInput struct { @@ -102,9 +151,13 @@ type LoadbalancerClusterListInput struct { type LoadbalancerAclListInput struct { apis.SharableVirtualResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput RegionalFilterListInput + + // + Fingerprint string `json:"fingerprint"` } type LoadbalancerDetails struct { diff --git a/pkg/apis/compute/loadbalancernetwork.go b/pkg/apis/compute/loadbalancernetwork.go index c9b658110f..ac514225d3 100644 --- a/pkg/apis/compute/loadbalancernetwork.go +++ b/pkg/apis/compute/loadbalancernetwork.go @@ -26,3 +26,12 @@ type LoadbalancernetworkDetails struct { // IP子网名称 Network string `json:"network"` } + +type LoadbalancernetworkListInput struct { + apis.VirtualJointResourceBaseListInput + + LoadbalancerFilterListInput + NetworkFilterListInput + + IpAddr []string `json:"ip_addr"` +} diff --git a/pkg/apis/compute/natgateway.go b/pkg/apis/compute/natgateway.go index 3b952bc3ac..53e2a2a416 100644 --- a/pkg/apis/compute/natgateway.go +++ b/pkg/apis/compute/natgateway.go @@ -40,6 +40,7 @@ const ( type NatGetewayListInput struct { apis.StatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput VpcFilterListInput RegionalFilterListInput @@ -48,17 +49,28 @@ type NatGetewayListInput struct { type NatEntryListInput struct { apis.StatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput NatGatewayFilterListInput ManagedResourceListInput } type NatDEntryListInput struct { NatEntryListInput + + ExternalIP []string `json:"external_ip"` + ExternalPort []int `json:"external_port"` + + InternalIP []string `json:"internal_ip"` + InternalPort []int `json:"internal_port"` + IpProtocol []string `json:"ip_protocol"` } type NatSEntryListInput struct { NatEntryListInput NetworkFilterListBase + + IP []string `json:"ip"` + SourceCIDR []string `json:"source_cidr"` } type NatGatewayResourceInfo struct { diff --git a/pkg/apis/compute/network.go b/pkg/apis/compute/network.go index c387725cbc..9120e207b4 100644 --- a/pkg/apis/compute/network.go +++ b/pkg/apis/compute/network.go @@ -75,6 +75,7 @@ type NetworkFilterListInput struct { type NetworkListInput struct { apis.SharableVirtualResourceListInput + apis.ExternalizedResourceBaseListInput WireFilterListInput HostResourceInput @@ -84,6 +85,37 @@ type NetworkListInput struct { // description: search ip address in network. // example: 10.168.222.1 Ip string `json:"ip"` + + IfnameHint []string `json:"ifname_hint"` + // 起始IP地址 + GuestIpStart []string `json:"guest_ip_start"` + // 接收IP地址 + GuestIpEnd []string `json:"guest_ip_end"` + // 掩码 + GuestIpMask []int8 `json:"guest_ip_mask"` + // 网关地址 + GuestGateway string `json:"guest_gateway"` + // DNS + GuestDns []string `json:"guest_dns"` + // allow multiple dhcp, seperated by "," + GuestDhcp []string `json:"guest_dhcp"` + + GuestDomain []string `json:"guest_domain"` + + GuestIp6Start []string `json:"guest_ip6_start"` + GuestIp6End []string `json:"guest_ip6_end"` + GuestIp6Mask []int8 `json:"guest_ip6_mask"` + GuestGateway6 []string `json:"guest_gateway6"` + GuestDns6 []string `json:"guest_dns6"` + + GuestDomain6 []string `json:"guest_domain6"` + // vlanId 1~4096 + VlanId []int `json:"vlan_id"` + // 服务器类型 + // example: server + ServerType []string `json:"server_type"` + // 分配策略 + AllocPolicy []string `json:"alloc_policy"` } type NetworkResourceInfoBase struct { diff --git a/pkg/apis/compute/networkschedtag.go b/pkg/apis/compute/networkschedtag.go index f365360190..6cbee02f60 100644 --- a/pkg/apis/compute/networkschedtag.go +++ b/pkg/apis/compute/networkschedtag.go @@ -22,3 +22,8 @@ type NetworkschedtagDetails struct { // IP子网名称 Network string `json:"network"` } + +type NetworkschedtagListInput struct { + SchedtagJointsListInput + NetworkFilterListInput +} diff --git a/pkg/apis/compute/reservedip.go b/pkg/apis/compute/reservedip.go index 25bf8a4b90..9620d7f5fa 100644 --- a/pkg/apis/compute/reservedip.go +++ b/pkg/apis/compute/reservedip.go @@ -35,6 +35,11 @@ type ReservedipListInput struct { // list all reserved ips, including expired ones All *bool `json:"all"` + + // ip_addr + IpAddr []string `json:"ip_addr"` + // 状态 + Status []string `json:"status"` } type ReservedipDetails struct { diff --git a/pkg/apis/compute/schedtag.go b/pkg/apis/compute/schedtag.go index dacf240438..ad2d84372e 100644 --- a/pkg/apis/compute/schedtag.go +++ b/pkg/apis/compute/schedtag.go @@ -58,6 +58,7 @@ type SchedtagFilterListInput struct { type SchedtagListInput struct { apis.StandaloneResourceListInput + apis.ScopedResourceBaseListInput // fitler by resource_type ResourceType string `json:"resource_type"` @@ -65,19 +66,23 @@ type SchedtagListInput struct { // Deprecated // filter by type, alias for resource_type Type string `json:"type" deprecated-by:"resource_type"` + + DefaultStrategy []string `json:"default_strategy"` } type SchedtagDetails struct { apis.StandaloneResourceDetails + apis.ScopedResourceBaseInfo + SSchedtag - DynamicSchedtagCount int `json:"dynamic_schedtag_count"` - SchedpolicyCount int `json:"schedpolicy_count"` - ProjectId string `json:"project_id"` - HostCount int `json:"host_count"` - ServerCount int `json:"server_count"` - OtherCount int `json:"other_count"` - JoinModelKeyword string `json:"join_model_keyword"` + DynamicSchedtagCount int `json:"dynamic_schedtag_count"` + SchedpolicyCount int `json:"schedpolicy_count"` + // ProjectId string `json:"project_id"` + HostCount int `json:"host_count"` + ServerCount int `json:"server_count"` + OtherCount int `json:"other_count"` + JoinModelKeyword string `json:"join_model_keyword"` } type SchedtagResourceInfo struct { diff --git a/pkg/apis/compute/secgroup.go b/pkg/apis/compute/secgroup.go index 2b154bb44b..556b58ba92 100644 --- a/pkg/apis/compute/secgroup.go +++ b/pkg/apis/compute/secgroup.go @@ -144,13 +144,19 @@ type SecgroupListInput struct { // 按缓存关联主机数排序 // pattern:asc|desc OrderByGuestCnt string `json:"order_by_guest_cnt"` + + // 是否被修改 + IsDirty *bool `json:"is_dirty"` } type SecurityGroupCacheListInput struct { apis.StatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput + ManagedResourceListInput RegionalFilterListInput + VpcFilterListInput SecgroupFilterListInput } @@ -173,6 +179,9 @@ type SecgroupFilterListInput struct { // Deprecated // filter by secgroup_id SecgroupId string `json:"secgroup_id" deprecated-by:"secgroup"` + + // 以安全组排序 + OrderBySecgroup string `json:"order_by_secgroup"` } type SecgroupDetails struct { @@ -190,3 +199,13 @@ type SecgroupDetails struct { // 出方向规则信息 OutRules string `json:"out_rules"` } + +type SecurityGroupResourceInfo struct { + // 安全组名称 + Secgroup string `json:"secgroup"` +} + +type GuestsecgroupListInput struct { + GuestJointsListInput + SecgroupFilterListInput +} diff --git a/pkg/apis/compute/sku_const.go b/pkg/apis/compute/sku_const.go index 70e1562ca4..7042ab78a9 100644 --- a/pkg/apis/compute/sku_const.go +++ b/pkg/apis/compute/sku_const.go @@ -75,11 +75,13 @@ type ServerSkuListInput struct { // filter sku by memory size in MB MemorySizeMb int `json:"memory_size_mb"` + // filter sku by CPU core count + CpuCoreCount []int `json:"cpu_core_count"` } type ElasticcacheSkuListInput struct { apis.StatusStandaloneResourceListInput - apis.DomainizedResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput @@ -122,6 +124,7 @@ type ElasticcacheSkuListInput struct { type DBInstanceSkuListInput struct { apis.EnabledStatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput apis.DomainizedResourceListInput ManagedResourceListInput @@ -130,15 +133,15 @@ type DBInstanceSkuListInput struct { billing.BillingResourceListInput // StorageType - StorageType string `json:"storage_type"` + StorageType []string `json:"storage_type"` - VcpuCount int `json:"vcpu_count"` + VcpuCount []int `json:"vcpu_count"` - VmemSizeMb int `json:"vmem_size_mb"` + VmemSizeMb []int `json:"vmem_size_mb"` - Category string `json:"category"` + Category []string `json:"category"` - Engine string `json:"engine"` + Engine []string `json:"engine"` - EngineVersion string `json:"engine_version"` + EngineVersion []string `json:"engine_version"` } diff --git a/pkg/apis/compute/snapshot.go b/pkg/apis/compute/snapshot.go index 6df6277101..d7b3e99eeb 100644 --- a/pkg/apis/compute/snapshot.go +++ b/pkg/apis/compute/snapshot.go @@ -69,6 +69,8 @@ type SSnapshotPolicyCreateInternalInput struct { type SnapshotListInput struct { apis.VirtualResourceListInput + apis.ExternalizedResourceBaseListInput + ManagedResourceListInput RegionalFilterListInput @@ -80,6 +82,12 @@ type SnapshotListInput struct { DiskType string `json:"disk_type"` // filter instance snapshot IsInstanceSnapshot *bool `json:"is_instance_snapshot"` + + DiskFilterListInputBase + StorageFilterListInputBase + + OutOfChain *bool `json:"out_of_chain"` + OsType []string `json:"os_type"` } type SnapshotDetails struct { diff --git a/pkg/apis/compute/snapshotpolicy.go b/pkg/apis/compute/snapshotpolicy.go index 1ab5ef338e..1c7b0feda6 100644 --- a/pkg/apis/compute/snapshotpolicy.go +++ b/pkg/apis/compute/snapshotpolicy.go @@ -28,3 +28,8 @@ type SnapshotPolicyDetails struct { BindingDiskCount int `json:"binding_disk_count"` } + +type SnapshotPolicyResourceInfo struct { + // 快照策略名称 + Snapshotpolicy string `json:"snapshotpolicy"` +} diff --git a/pkg/apis/compute/snapshotpolicycache.go b/pkg/apis/compute/snapshotpolicycache.go index 224b754b4f..03a2ba1676 100644 --- a/pkg/apis/compute/snapshotpolicycache.go +++ b/pkg/apis/compute/snapshotpolicycache.go @@ -20,6 +20,6 @@ type SnapshotPolicyCacheDetails struct { apis.StatusStandaloneResourceDetails ManagedResourceInfo CloudregionResourceInfo - + SnapshotPolicyResourceInfo SSnapshotPolicyCache } diff --git a/pkg/apis/compute/snapshotpolicydisk.go b/pkg/apis/compute/snapshotpolicydisk.go index 3d70a75453..e85517322e 100644 --- a/pkg/apis/compute/snapshotpolicydisk.go +++ b/pkg/apis/compute/snapshotpolicydisk.go @@ -25,3 +25,12 @@ type SnapshotPolicyDiskDetails struct { Snapshotpolicy string `json:"snapshotpolicy"` Disk DiskDetails `json:"disk"` } + +type SnapshotPolicyDiskListInput struct { + apis.VirtualJointResourceBaseListInput + SnapshotPolicyFilterListInput + DiskFilterListInput + + // 状态 + Status []string `json:"status"` +} diff --git a/pkg/apis/compute/storage_const.go b/pkg/apis/compute/storage_const.go index 5057f07652..7f9c01e2c5 100644 --- a/pkg/apis/compute/storage_const.go +++ b/pkg/apis/compute/storage_const.go @@ -138,7 +138,7 @@ var ( SHARED_STORAGE = []string{STORAGE_NFS, STORAGE_GPFS, STORAGE_RBD} ) -type StorageFilterListInput struct { +type StorageFilterListInputBase struct { // 过滤关联此存储(ID或Name)的列表结果 Storage string `json:"storage"` // swagger:ignore @@ -149,6 +149,10 @@ type StorageFilterListInput struct { // 以存储名称排序 // pattern:asc|desc OrderByStorage string `json:"order_by_storage"` +} + +type StorageFilterListInput struct { + StorageFilterListInputBase StorageShareFilterListInput @@ -165,6 +169,7 @@ type StorageShareFilterListInput struct { type StorageListInput struct { apis.EnabledStatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput ZonalFilterListInput diff --git a/pkg/apis/compute/storagecachedimage.go b/pkg/apis/compute/storagecachedimage.go index b5cd634b77..3614164fe1 100644 --- a/pkg/apis/compute/storagecachedimage.go +++ b/pkg/apis/compute/storagecachedimage.go @@ -39,3 +39,23 @@ type StoragecachedimageDetails struct { // 引用次数 Reference int `json:"reference"` } + +type StoragecachedimageListInput struct { + apis.JointResourceBaseListInput + apis.ExternalizedResourceBaseListInput + + // 以镜像缓存存储过滤 + Storagecache string `json:"storagecache"` + // Deprecated + // swagger:ignore + StoragecacheId string `json:"storagecache_id" deprecated-by:"storagecache"` + + // 以镜像缓存过滤 + Cachedimage string `json:"cachedimage"` + // Deprecated + // swagger:ignore + CachedimageId string `json:"cachedimage_id" deprecated-by:"cachedimage_id"` + + // 镜像状态 + Status []string `json:"status"` +} diff --git a/pkg/apis/compute/storageschedtag.go b/pkg/apis/compute/storageschedtag.go index 479e9bf165..7e1cc195f2 100644 --- a/pkg/apis/compute/storageschedtag.go +++ b/pkg/apis/compute/storageschedtag.go @@ -22,3 +22,8 @@ type StorageschedtagDetails struct { // 存储名称 Storage string `json:"storage"` } + +type StorageschedtagListInput struct { + SchedtagJointsListInput + StorageFilterListInput +} diff --git a/pkg/apis/compute/vpcs_const.go b/pkg/apis/compute/vpcs_const.go index 74e99195e1..38517d9565 100644 --- a/pkg/apis/compute/vpcs_const.go +++ b/pkg/apis/compute/vpcs_const.go @@ -49,6 +49,7 @@ type UsableVpcResourceListInput struct { type VpcListInput struct { apis.EnabledStatusStandaloneResourceListInput + apis.ExternalizedResourceBaseListInput ManagedResourceListInput RegionalFilterListInput @@ -59,10 +60,19 @@ type VpcListInput struct { // filter by globalvpc Globalvpc string `json:"globalvpc"` + + // 是否是默认VPC + // example: true + IsDefault *bool `json:"is_default"` + + // CIDR地址段 + // example: 192.168.222.0/24 + CidrBlock []string `json:"cidr_block"` } type WireListInput struct { apis.StandaloneResourceListInput + apis.ExternalizedResourceBaseListInput VpcFilterListInput diff --git a/pkg/apis/compute/zz_generated.model.go b/pkg/apis/compute/zz_generated.model.go index c3222b91f8..7e9c9ddca1 100644 --- a/pkg/apis/compute/zz_generated.model.go +++ b/pkg/apis/compute/zz_generated.model.go @@ -233,11 +233,10 @@ type SCloudproviderCapability struct { type SCloudproviderregion struct { apis.SJointResourceBase SSyncableBaseResource + SCloudregionResourceBase // 云订阅ID CloudproviderId string `json:"cloudprovider_id"` - // Column(VARCHAR(36, charset='ascii'), nullable=False) - CloudregionId string `json:"cloudregion_id"` - Enabled bool `json:"enabled"` + Enabled bool `json:"enabled"` // SyncIntervalSeconds int `list:"domain"` SyncResults interface{} `json:"sync_results"` LastDeepSyncAt time.Time `json:"last_deep_sync_at"` @@ -370,7 +369,7 @@ type SDBInstanceDatabase struct { // SDBInstanceJointsBase is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SDBInstanceJointsBase. type SDBInstanceJointsBase struct { apis.SVirtualJointResourceBase - DBInstanceId string `json:"dbinstance_id"` + SDBInstanceResourceBase } // SDBInstanceNetwork is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SDBInstanceNetwork. @@ -474,6 +473,11 @@ type SDisk struct { Nonpersistent bool `json:"nonpersistent"` } +// SDiskResourceBase is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SDiskResourceBase. +type SDiskResourceBase struct { + DiskId string `json:"disk_id"` +} + // SDnsRecord is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SDnsRecord. type SDnsRecord struct { apis.SAdminSharableVirtualResourceBase @@ -822,8 +826,7 @@ type SGuestTemplate struct { // SGuestdisk is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SGuestdisk. type SGuestdisk struct { SGuestJointsBase - // SDiskResourceBase `list:"user" create:"required"` - DiskId string `json:"disk_id"` + SDiskResourceBase ImagePath string `json:"image_path"` Driver string `json:"driver"` // Column(VARCHAR(32, charset='ascii'), nullable=True) @@ -864,7 +867,7 @@ type SGuestnetwork struct { // SGuestsecgroup is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SGuestsecgroup. type SGuestsecgroup struct { SGuestJointsBase - SecgroupId string `json:"secgroup_id"` + SSecurityGroupResourceBase } // SHost is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SHost. @@ -875,16 +878,18 @@ type SHost struct { SManagedResourceBase SBillingResourceBase // 机架 - Rack string `json:"rack"` - Slots string `json:"slots"` + Rack string `json:"rack"` + // 机位 + Slots string `json:"slots"` + // 管理口MAC AccessMac string `json:"access_mac"` - // Ip地址 + // 管理口Ip地址 AccessIp string `json:"access_ip"` // 管理地址 ManagerUri string `json:"manager_uri"` // 系统信息 SysInfo interface{} `json:"sys_info"` - // SN信息 + // 物理机序列号信息 SN string `json:"sn"` // CPU大小 CpuCount int `json:"cpu_count"` @@ -926,8 +931,10 @@ type SHost struct { // example: online HostStatus string `json:"host_status"` // 宿主机类型 - HostType string `json:"host_type"` - Version string `json:"version"` + HostType string `json:"host_type"` + // host服务软件版本 + Version string `json:"version"` + // OVN软件版本 OvnVersion string `json:"ovn_version"` IsBaremetal bool `json:"is_baremetal"` // 是否处于维护状态 @@ -935,10 +942,14 @@ type SHost struct { LastPingAt time.Time `json:"last_ping_at"` ResourceType string `json:"resource_type"` RealExternalId string `json:"real_external_id"` - IsImport bool `json:"is_import"` - EnablePxeBoot *bool `json:"enable_pxe_boot,omitempty"` - Uuid string `json:"uuid"` - BootMode string `json:"boot_mode"` + // 是否为导入的宿主机 + IsImport bool `json:"is_import"` + // 是否允许PXE启动 + EnablePxeBoot *bool `json:"enable_pxe_boot,omitempty"` + // 主机UUID + Uuid string `json:"uuid"` + // 主机启动模式, 可能值位PXE和ISO + BootMode string `json:"boot_mode"` } // SHostJointsBase is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SHostJointsBase. @@ -954,12 +965,13 @@ type SHostResourceBase struct { // SHostnetwork is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SHostnetwork. type SHostnetwork struct { SHostJointsBase + // 宿主机ID BaremetalId string `json:"baremetal_id"` - // Column(VARCHAR(36, charset='ascii'), nullable=False) + // 网络ID NetworkId string `json:"network_id"` - // Column(VARCHAR(36, charset='ascii'), nullable=False) + // IP地址 IpAddr string `json:"ip_addr"` - // Column(VARCHAR(16, charset='ascii')) + // MAC地址 MacAddr string `json:"mac_addr"` } @@ -972,12 +984,12 @@ type SHostschedtag struct { // SHoststorage is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SHoststorage. type SHoststorage struct { SHostJointsBase - // 挂载点 - MountPoint string `json:"mount_point"` // 宿主机Id HostId string `json:"host_id"` // 存储Id StorageId string `json:"storage_id"` + // 挂载点 + MountPoint string `json:"mount_point"` // 配置信息 Config interface{} `json:"config"` // 真实容量大小 @@ -1047,6 +1059,8 @@ type SInstanceSnapshot struct { KeypairId string `json:"keypair_id"` // 操作系统类型 OsType string `json:"os_type"` + // 套餐名称 + InstanceType string `json:"instance_type"` } // SInstanceSnapshotJoint is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SInstanceSnapshotJoint. @@ -1628,15 +1642,21 @@ type SSecurityGroupCache struct { apis.SExternalizedResourceBase SCloudregionResourceBase SManagedResourceBase - // 安全组Id - SecgroupId string `json:"secgroup_id"` + SSecurityGroupResourceBase // 虚拟私有网络外部Id VpcId string `json:"vpc_id"` } +// SSecurityGroupResourceBase is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SSecurityGroupResourceBase. +type SSecurityGroupResourceBase struct { + // 本地安全组ID + SecgroupId string `json:"secgroup_id"` +} + // SSecurityGroupRule is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SSecurityGroupRule. type SSecurityGroupRule struct { apis.SResourceBase + SSecurityGroupResourceBase Id string `json:"id"` Priority int64 `json:"priority"` Protocol string `json:"protocol"` @@ -1645,7 +1665,6 @@ type SSecurityGroupRule struct { CIDR string `json:"cidr"` Action string `json:"action"` Description string `json:"description"` - SecgroupID string `json:"secgroup_id"` } // SServerSku is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SServerSku. @@ -1735,15 +1754,23 @@ type SSnapshotPolicyCache struct { apis.SExternalizedResourceBase SCloudregionResourceBase SManagedResourceBase - SnapshotpolicyId string `json:"snapshotpolicy_id"` + SSnapshotPolicyResourceBase } // SSnapshotPolicyDisk is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SSnapshotPolicyDisk. type SSnapshotPolicyDisk struct { apis.SVirtualJointResourceBase + SSnapshotPolicyResourceBase + SDiskResourceBase + // SnapshotpolicyId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` + // DiskId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` + Status string `json:"status"` +} + +// SSnapshotPolicyResourceBase is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SSnapshotPolicyResourceBase. +type SSnapshotPolicyResourceBase struct { + // 本地快照策略ID SnapshotpolicyId string `json:"snapshotpolicy_id"` - DiskId string `json:"disk_id"` - Status string `json:"status"` } // SStorage is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SStorage. @@ -1791,12 +1818,11 @@ type SStoragecache struct { // SStoragecachedimage is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SStoragecachedimage. type SStoragecachedimage struct { apis.SJointResourceBase + apis.SExternalizedResourceBase // 存储缓存Id StoragecacheId string `json:"storagecache_id"` // 镜像缓存Id CachedimageId string `json:"cachedimage_id"` - // 外部Id - ExternalId string `json:"external_id"` // 镜像状态 Status string `json:"status"` Path string `json:"path"` diff --git a/pkg/apis/list.go b/pkg/apis/list.go index 05125c714b..e7d7bd4314 100644 --- a/pkg/apis/list.go +++ b/pkg/apis/list.go @@ -115,6 +115,8 @@ type ModelBaseListInput struct { Field []string `json:"field"` // 用于数据导出,指定导出的数据字段 ExportKeys string `json:"export_keys"` + // 返回结果携带delete_fail_reason和update_fail_reason字段 + ShowFailReason *bool `json:"show_fail_reason"` } type IncrementalListInput struct { @@ -227,3 +229,12 @@ type ExternalizedResourceBaseListInput struct { // 以资源外部ID过滤 ExternalId string `json:"external_id"` } + +type DeletePreventableResourceBaseListInput struct { + // 是否禁止删除 + DisableDelete *bool `json:"disable_delete"` +} + +type ScopedResourceBaseListInput struct { + ProjectizedResourceListInput +} diff --git a/pkg/apis/output.go b/pkg/apis/output.go index 1eea1f132c..cf6eedba2a 100644 --- a/pkg/apis/output.go +++ b/pkg/apis/output.go @@ -125,3 +125,7 @@ type ProjectizedResourceInfo struct { // Deprecated Tenant string `json:"project"` } + +type ScopedResourceBaseInfo struct { + ProjectizedResourceInfo +} diff --git a/pkg/apis/zz_generated.model.go b/pkg/apis/zz_generated.model.go index 13257838e9..7dea0554f9 100644 --- a/pkg/apis/zz_generated.model.go +++ b/pkg/apis/zz_generated.model.go @@ -100,8 +100,7 @@ type SResourceBase struct { // SScopedResourceBase is an autogenerated struct via yunion.io/x/onecloud/pkg/cloudcommon/db.SScopedResourceBase. type SScopedResourceBase struct { - DomainId string `json:"domain_id"` - ProjectId string `json:"tenant_id"` + SProjectizedResourceBase } // SSharableBaseResource is an autogenerated struct via yunion.io/x/onecloud/pkg/cloudcommon/db.SSharableBaseResource. diff --git a/pkg/cloudcommon/db/caller.go b/pkg/cloudcommon/db/caller.go index d115a29e4b..b68793e421 100644 --- a/pkg/cloudcommon/db/caller.go +++ b/pkg/cloudcommon/db/caller.go @@ -246,7 +246,9 @@ func FetchCustomizeColumns( } retVal := make([]*jsonutils.JSONDict, ret[0].Len()) for i := 0; i < ret[0].Len(); i += 1 { - retVal[i] = ValueToJSONDict(ret[0].Index(i)) + jsonDict := ValueToJSONDict(ret[0].Index(i)) + jsonDict.Update(jsonutils.Marshal(objs[i])) + retVal[i] = jsonDict } return retVal, nil } diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index eebd664da1..375fbb36cd 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -330,9 +330,10 @@ func mergeFields(metaFields, queryFields []string, isSysAdmin bool) stringutils2 } func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.TokenCredential, q *sqlchemy.SQuery, query jsonutils.JSONObject, delayFetch bool) ([]jsonutils.JSONObject, error) { - metaFields := listFields(manager, userCred) + metaFields, excludeFields := listFields(manager, userCred) fieldFilter := jsonutils.GetQueryStringArray(query, "field") listF := mergeFields(metaFields, fieldFilter, IsAllowList(rbacutils.ScopeSystem, userCred, manager)) + listExcludes, _, _ := stringutils2.Split(stringutils2.NewSortedStrings(excludeFields), listF) showDetails := false showDetailsJson, _ := query.Get("details") @@ -342,7 +343,7 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To showDetails = true } items := make([]interface{}, 0) - results := make([]jsonutils.JSONObject, 0) + extraResults := make([]jsonutils.JSONObject, 0) rows, err := q.Rows() if err != nil && err != sql.ErrNoRows { return nil, err @@ -354,8 +355,8 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To return nil, err } - extraData := jsonutils.NewDict() if query.Contains("export_keys") { + extraData := jsonutils.NewDict() RowMap, err := q.Row2Map(rows) if err != nil { return nil, err @@ -368,6 +369,7 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To if err != nil { return nil, err } + extraResults = append(extraResults, extraData) } else { err = q.Row2Struct(rows, item) if err != nil { @@ -381,9 +383,9 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To } } - jsonDict := jsonutils.Marshal(item).(*jsonutils.JSONDict) - jsonDict = jsonDict.CopyIncludes([]string(listF)...) - jsonDict.Update(extraData) + // jsonDict := jsonutils.Marshal(item).(*jsonutils.JSONDict) + // jsonDict = jsonDict.CopyIncludes([]string(listF)...) + // jsonDict.Update(extraData) // ignore GetExtraDetails /*if showDetails && !query.Contains("export_keys") { extraDict, _ := GetExtraDetails(item, ctx, userCred, query, true) @@ -394,9 +396,10 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To } // jsonDict = getModelExtraDetails(item, ctx, jsonDict) }*/ - results = append(results, jsonDict) + // results = append(results, jsonDict) items = append(items, item) } + results := make([]jsonutils.JSONObject, len(items)) if showDetails && !query.Contains("export_keys") { extraRows, err := FetchCustomizeColumns(manager, ctx, userCred, query, items, stringutils2.NewSortedStrings(fieldFilter), true) @@ -405,9 +408,18 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To } if len(extraRows) == len(results) { for i := range results { - extraRows[i].Update(results[i]) - results[i] = extraRows[i] + results[i] = extraRows[i].CopyExcludes(listExcludes...) } + } else { + return nil, httperrors.NewInternalServerError("FetchCustomizeColumns return incorrect number of results") + } + } else { + for i := range items { + jsonDict := jsonutils.Marshal(items[i]).(*jsonutils.JSONDict).CopyExcludes(listExcludes...) + if i < len(extraResults) { + jsonDict.Update(extraResults[i]) + } + results[i] = jsonDict } } return results, nil @@ -727,7 +739,7 @@ func (dispatcher *DBModelDispatcher) List(ctx context.Context, query jsonutils.J return items, nil } -func getModelExtraDetails(item IModel, ctx context.Context) apis.ModelBaseDetails { +func getModelExtraDetails(item IModel, ctx context.Context, showReason bool) apis.ModelBaseDetails { out := apis.ModelBaseDetails{ CanDelete: true, CanUpdate: true, @@ -735,12 +747,16 @@ func getModelExtraDetails(item IModel, ctx context.Context) apis.ModelBaseDetail err := item.ValidateDeleteCondition(ctx) if err != nil { out.CanDelete = false - out.DeleteFailReason = err.Error() + if showReason { + out.DeleteFailReason = err.Error() + } } err = item.ValidateUpdateCondition(ctx) if err != nil { out.CanUpdate = false - out.UpdateFailReason = err.Error() + if showReason { + out.UpdateFailReason = err.Error() + } } return out } @@ -779,13 +795,14 @@ func getItemDetails(manager IModelManager, item IModel, ctx context.Context, use return nil, nil } - metaFields := GetDetailFields(manager, userCred) + metaFields, excludeFields := GetDetailFields(manager, userCred) fieldFilter := jsonutils.GetQueryStringArray(query, "field") getFields := mergeFields(metaFields, fieldFilter, IsAllowGet(rbacutils.ScopeSystem, userCred, item)) + excludes, _, _ := stringutils2.Split(stringutils2.NewSortedStrings(excludeFields), getFields) - jsonDict := jsonutils.Marshal(item).(*jsonutils.JSONDict) - jsonDict = jsonDict.CopyIncludes(getFields...) - extraDict.Update(jsonDict) + //jsonDict := jsonutils.Marshal(item).(*jsonutils.JSONDict) + //jsonDict = jsonDict.CopyIncludes(getFields...) + // extraDict.Update(jsonDict) // jsonDict = getModelExtraDetails(item, ctx, jsonDict) extraRows, err := FetchCustomizeColumns(manager, ctx, userCred, query, []interface{}{item}, stringutils2.NewSortedStrings(fieldFilter), false) @@ -793,11 +810,10 @@ func getItemDetails(manager IModelManager, item IModel, ctx context.Context, use return nil, errors.Wrap(err, "FetchCustomizeColumns") } if len(extraRows) == 1 { - extraRows[0].Update(extraDict) - extraDict = extraRows[0] + return extraRows[0].CopyExcludes(excludes...), nil } - - return extraDict, nil + log.Errorf("FetchCustomizeColumns return incorrect number of objects %d", len(extraRows)) + return nil, httperrors.NewInternalServerError("FetchCustomizeColumns returns incorrect results") } func (dispatcher *DBModelDispatcher) tryGetModelProperty(ctx context.Context, property string, query jsonutils.JSONObject) (jsonutils.JSONObject, error) { diff --git a/pkg/cloudcommon/db/fieldtags.go b/pkg/cloudcommon/db/fieldtags.go index f8b18d24e6..11438f7225 100644 --- a/pkg/cloudcommon/db/fieldtags.go +++ b/pkg/cloudcommon/db/fieldtags.go @@ -70,16 +70,19 @@ func allowOptional(manager IResource, userCred mcclient.TokenCredential, action * update: user | domain | admin * */ -func listFields(manager IModelManager, userCred mcclient.TokenCredential) []string { - ret := make([]string, 0) +func listFields(manager IModelManager, userCred mcclient.TokenCredential) ([]string, []string) { + includes := make([]string, 0) + excludes := make([]string, 0) for _, col := range manager.TableSpec().Columns() { tags := col.Tags() list, _ := tags["list"] if allowAction(manager, userCred, list, IsAllowList) { - ret = append(ret, col.Name()) + includes = append(includes, col.Name()) + } else { + excludes = append(excludes, col.Name()) } } - return ret + return includes, excludes } func searchFields(manager IModelManager, userCred mcclient.TokenCredential) stringutils2.SSortedStrings { @@ -96,17 +99,20 @@ func searchFields(manager IModelManager, userCred mcclient.TokenCredential) stri return stringutils2.SSortedStrings(ret) } -func GetDetailFields(manager IModelManager, userCred mcclient.TokenCredential) []string { - ret := make([]string, 0) +func GetDetailFields(manager IModelManager, userCred mcclient.TokenCredential) ([]string, []string) { + includes := make([]string, 0) + excludes := make([]string, 0) for _, col := range manager.TableSpec().Columns() { tags := col.Tags() list := tags["list"] get := tags["get"] if allowAction(manager, userCred, list, IsAllowGet) || allowAction(manager, userCred, get, IsAllowGet) { - ret = append(ret, col.Name()) + includes = append(includes, col.Name()) + } else { + excludes = append(excludes, col.Name()) } } - return ret + return includes, excludes } func createRequireFields(manager IModelManager, userCred mcclient.TokenCredential) []string { diff --git a/pkg/cloudcommon/db/jointbase.go b/pkg/cloudcommon/db/jointbase.go index de06bfa855..282c46e527 100644 --- a/pkg/cloudcommon/db/jointbase.go +++ b/pkg/cloudcommon/db/jointbase.go @@ -207,13 +207,6 @@ func (self *SJointResourceBase) AllowDetach(ctx context.Context, userCred mcclie return false } -/* -func (joint *SJointResourceBase) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { - extra := joint.SResourceBase.GetCustomizeColumns(ctx, userCred, query) - return JointModelExtra(joint, extra) -} -*/ - func (manager *SJointResourceBaseManager) ResourceScope() rbacutils.TRbacScope { return manager.GetMasterManager().ResourceScope() } diff --git a/pkg/cloudcommon/db/modelbase.go b/pkg/cloudcommon/db/modelbase.go index e124987009..c25191e85b 100644 --- a/pkg/cloudcommon/db/modelbase.go +++ b/pkg/cloudcommon/db/modelbase.go @@ -293,9 +293,13 @@ func (manager *SModelBaseManager) FetchCustomizeColumns( fields stringutils2.SSortedStrings, isList bool, ) []apis.ModelBaseDetails { + showReason := false + if query.Contains("show_fail_reason") { + showReason = true + } ret := make([]apis.ModelBaseDetails, len(objs)) for i := range objs { - ret[i] = getModelExtraDetails(objs[i].(IModel), ctx) + ret[i] = getModelExtraDetails(objs[i].(IModel), ctx, showReason) } return ret } diff --git a/pkg/cloudcommon/db/resourcebase.go b/pkg/cloudcommon/db/resourcebase.go index 193b736cd6..7c5b2e4b7e 100644 --- a/pkg/cloudcommon/db/resourcebase.go +++ b/pkg/cloudcommon/db/resourcebase.go @@ -81,18 +81,6 @@ func (model *SResourceBase) GetIResourceModel() IResourceModel { return model.GetVirtualObject().(IResourceModel) } -/* -func (model *SResourceBase) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { - extra := model.SModelBase.GetExtraDetails(ctx, userCred, query) - canDelete := CanDelete(model, ctx) - if canDelete { - extra.Add(jsonutils.JSONTrue, "can_delete") - } else { - extra.Add(jsonutils.JSONFalse, "can_delete") - } - return extra -}*/ - func (model *SResourceBase) MarkDelete() error { model.Deleted = true model.DeletedAt = timeutils.UtcNow() @@ -186,11 +174,5 @@ func (manager *SResourceBaseManager) FetchCustomizeColumns( } func (model *SResourceBase) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, isList bool) (apis.ResourceBaseDetails, error) { - var err error - out := apis.ResourceBaseDetails{} - out.ModelBaseDetails, err = model.SModelBase.GetExtraDetails(ctx, userCred, query, isList) - if err != nil { - return out, errors.Wrap(err, "SModelBase.GetExtraDetails") - } - return out, nil + return apis.ResourceBaseDetails{}, nil } diff --git a/pkg/cloudcommon/db/scoperesource.go b/pkg/cloudcommon/db/scoperesource.go index 4f55c655f7..2ddf6fb44d 100644 --- a/pkg/cloudcommon/db/scoperesource.go +++ b/pkg/cloudcommon/db/scoperesource.go @@ -18,24 +18,26 @@ import ( "context" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" "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/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/rbacutils" + "yunion.io/x/onecloud/pkg/util/stringutils2" ) -type SScopedResourceBaseManager struct{} - -type SScopedResourceBase struct { - DomainId string `width:"64" charset:"ascii" nullable:"true" index:"true" list:"user"` - ProjectId string `name:"tenant_id" width:"128" charset:"ascii" nullable:"true" index:"true" list:"user"` +type SScopedResourceBaseManager struct { + SProjectizedResourceBaseManager } -func (m *SScopedResourceBaseManager) ResourceScope() rbacutils.TRbacScope { - return rbacutils.ScopeProject +type SScopedResourceBase struct { + SProjectizedResourceBase + // DomainId string `width:"64" charset:"ascii" nullable:"true" index:"true" list:"user"` + // ProjectId string `name:"tenant_id" width:"128" charset:"ascii" nullable:"true" index:"true" list:"user"` } func (m *SScopedResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, userCred mcclient.IIdentityProvider, scope rbacutils.TRbacScope) *sqlchemy.SQuery { @@ -57,10 +59,6 @@ func (m *SScopedResourceBaseManager) FilterByOwner(q *sqlchemy.SQuery, userCred return q } -func (m *SScopedResourceBaseManager) FetchOwnerId(ctx context.Context, data jsonutils.JSONObject) (mcclient.IIdentityProvider, error) { - return FetchProjectInfo(ctx, data) -} - func (m *SScopedResourceBaseManager) ValidateCreateData(man IScopedResourceManager, ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input api.ScopedResourceCreateInput) (api.ScopedResourceCreateInput, error) { if input.Scope == "" { input.Scope = string(rbacutils.ScopeSystem) @@ -99,13 +97,6 @@ func getScopedResourceScope(domainId, projectId string) rbacutils.TRbacScope { return rbacutils.ScopeNone } -func (s *SScopedResourceBase) GetOwnerId() mcclient.IIdentityProvider { - return &SOwnerId{ - DomainId: s.DomainId, - ProjectId: s.ProjectId, - } -} - func (s *SScopedResourceBase) GetResourceScope() rbacutils.TRbacScope { return getScopedResourceScope(s.DomainId, s.ProjectId) } @@ -235,3 +226,50 @@ func (m *SScopedResourceBaseManager) SetScopedResourceToProject(model IScopedRes } return setScopedResourceIds(model, userCred, project.GetDomainId(), projectId) } + +func (m *SScopedResourceBaseManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query apis.ScopedResourceBaseListInput, +) (*sqlchemy.SQuery, error) { + q, err := m.SProjectizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ProjectizedResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SProjectizedResourceBaseManager.ListItemFilter") + } + return q, nil +} + +func (m *SScopedResourceBaseManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query apis.ScopedResourceBaseListInput, +) (*sqlchemy.SQuery, error) { + q, err := m.SProjectizedResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.ProjectizedResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SProjectizedResourceBaseManager.OrderByExtraFields") + } + return q, nil +} + +func (manager *SScopedResourceBaseManager) FetchCustomizeColumns( + ctx context.Context, + userCred mcclient.TokenCredential, + query jsonutils.JSONObject, + objs []interface{}, + fields stringutils2.SSortedStrings, + isList bool, +) []apis.ScopedResourceBaseInfo { + rows := make([]apis.ScopedResourceBaseInfo, len(objs)) + + projRows := manager.SProjectizedResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) + + for i := range rows { + rows[i] = apis.ScopedResourceBaseInfo{ + ProjectizedResourceInfo: projRows[i], + } + } + + return rows +} diff --git a/pkg/compute/models/baremetalagents.go b/pkg/compute/models/baremetalagents.go index 77c436a423..510843330a 100644 --- a/pkg/compute/models/baremetalagents.go +++ b/pkg/compute/models/baremetalagents.go @@ -40,7 +40,7 @@ type SBaremetalagentManager struct { type SBaremetalagent struct { db.SStandaloneResourceBase - SZoneResourceBase + SZoneResourceBase `width:"128" charset:"ascii" nullable:"false" list:"admin" update:"admin" create:"admin_required"` Status string `width:"36" charset:"ascii" nullable:"false" default:"disable" list:"user" create:"optional"` AccessIp string `width:"16" charset:"ascii" nullable:"false" list:"admin" update:"admin" create:"admin_required"` @@ -279,13 +279,13 @@ func (manager *SBaremetalagentManager) ListItemFilter( return nil, errors.Wrap(err, "SZoneResourceBaseManager.ListItemFilter") } if len(query.Status) > 0 { - q = q.Equals("status", query.Status) + q = q.In("status", query.Status) } if len(query.AccessIp) > 0 { - q = q.Equals("access_ip", query.AccessIp) + q = q.In("access_ip", query.AccessIp) } if len(query.AgentType) > 0 { - q = q.Equals("agent_type", query.AgentType) + q = q.In("agent_type", query.AgentType) } return q, nil } diff --git a/pkg/compute/models/buckets.go b/pkg/compute/models/buckets.go index 62b9e14f8d..5bec842904 100644 --- a/pkg/compute/models/buckets.go +++ b/pkg/compute/models/buckets.go @@ -50,6 +50,7 @@ import ( type SBucketManager struct { db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SCloudregionResourceBaseManager SManagedResourceBaseManager } @@ -71,7 +72,7 @@ func init() { type SBucket struct { db.SVirtualResourceBase db.SExternalizedResourceBase - SCloudregionResourceBase + SCloudregionResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` SManagedResourceBase // CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` @@ -601,6 +602,11 @@ func (manager *SBucketManager) ListItemFilter( return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") @@ -612,13 +618,13 @@ func (manager *SBucketManager) ListItemFilter( } if len(query.StorageClass) > 0 { - q = q.Equals("storage_class", query.StorageClass) + q = q.In("storage_class", query.StorageClass) } if len(query.Location) > 0 { - q = q.Equals("location", query.Location) + q = q.In("location", query.Location) } if len(query.Acl) > 0 { - q = q.Equals("acl", query.Acl) + q = q.In("acl", query.Acl) } return q, nil diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index ee09faf800..3d63932ac4 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -41,6 +41,7 @@ import ( type SCachedimageManager struct { db.SStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager } var CachedimageManager *SCachedimageManager @@ -642,6 +643,11 @@ func (manager *SCachedimageManager) ListItemFilter( return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "id", func() *sqlchemy.SQuery { storagecachedImages := StoragecachedimageManager.Query().SubQuery() storageCaches := StoragecacheManager.Query().SubQuery() @@ -675,7 +681,7 @@ func (manager *SCachedimageManager) ListItemFilter( } if len(query.ImageType) > 0 { - q = q.Equals("image_type", query.ImageType) + q = q.In("image_type", query.ImageType) } return q, nil diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 76730fc1f8..4f7b90dd71 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -54,6 +54,7 @@ import ( type SCloudaccountManager struct { db.SEnabledStatusDomainLevelResourceBaseManager + SSyncableBaseResourceManager } var CloudaccountManager *SCloudaccountManager @@ -1251,6 +1252,11 @@ func (manager *SCloudaccountManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SEnabledStatusDomainLevelResourceBaseManager") } + q, err = manager.SSyncableBaseResourceManager.ListItemFilter(ctx, q, userCred, query.SyncableBaseResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SSyncableBaseResourceManager.ListItemFilter") + } + managerStr := query.Cloudprovider if len(managerStr) > 0 { providerObj, err := CloudproviderManager.FetchByIdOrName(userCred, managerStr) @@ -1288,9 +1294,6 @@ func (manager *SCloudaccountManager) ListItemFilter( q = q.In("id", subq.SubQuery()) } - if len(query.SyncStatus) > 0 { - q = q.In("sync_status", query.SyncStatus) - } if len(query.HealthStatus) > 0 { q = q.In("health_status", query.HealthStatus) } diff --git a/pkg/compute/models/cloudproviderregions.go b/pkg/compute/models/cloudproviderregions.go index 19bd719f8d..ab2e14dcd3 100644 --- a/pkg/compute/models/cloudproviderregions.go +++ b/pkg/compute/models/cloudproviderregions.go @@ -32,10 +32,14 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/stringutils2" ) type SCloudproviderregionManager struct { db.SJointResourceBaseManager + SSyncableBaseResourceManager + SCloudregionResourceBaseManager + SManagedResourceBaseManager } var CloudproviderRegionManager *SCloudproviderregionManager @@ -51,6 +55,9 @@ func init() { CloudproviderManager, CloudregionManager, ), + SManagedResourceBaseManager: SManagedResourceBaseManager{ + managerIdFieldName: "cloudprovider_id", + }, } CloudproviderRegionManager.SetVirtualObject(CloudproviderRegionManager) }) @@ -61,9 +68,12 @@ type SCloudproviderregion struct { SSyncableBaseResource + SCloudregionResourceBase `width:"36" charset:"ascii" nullable:"false" list:"domain"` + // 云订阅ID - CloudproviderId string `width:"36" charset:"ascii" nullable:"false" list:"domain"` // Column(VARCHAR(36, charset='ascii'), nullable=False) - CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"domain"` + CloudproviderId string `width:"36" charset:"ascii" nullable:"false" list:"domain"` + + //CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"domain"` Enabled bool `nullable:"false" list:"domain" update:"domain"` @@ -116,14 +126,55 @@ func (self *SCloudproviderregion) GetRegion() *SCloudregion { } func (self *SCloudproviderregion) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, isList bool) (api.CloudproviderregionDetails, error) { - var err error - out := api.CloudproviderregionDetails{} - out.JointResourceBaseDetails, err = self.SJointResourceBase.GetExtraDetails(ctx, userCred, query, isList) - if err != nil { - return out, err + return api.CloudproviderregionDetails{}, nil +} + +func (manager *SCloudproviderregionManager) FetchCustomizeColumns( + ctx context.Context, + userCred mcclient.TokenCredential, + query jsonutils.JSONObject, + objs []interface{}, + fields stringutils2.SSortedStrings, + isList bool, +) []api.CloudproviderregionDetails { + rows := make([]api.CloudproviderregionDetails, len(objs)) + + jointRows := manager.SJointResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) + regionRows := manager.SCloudregionResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) + + managerIds := make([]string, len(rows)) + + for i := range rows { + rows[i].JointResourceBaseDetails = jointRows[i] + rows[i].CloudregionResourceInfo = regionRows[i] + managerIds[i] = objs[i].(*SCloudproviderregion).CloudproviderId } - out.Cloudprovider, out.Cloudregion = db.JointModelExtra(self) - return self.getExtraDetails(out), nil + + managers := make(map[string]SCloudprovider) + err := db.FetchStandaloneObjectsByIds(CloudproviderManager, managerIds, &managers) + if err != nil { + log.Errorf("FetchStandaloneObjectsByIds fail %s", err) + return rows + } + + for i := range rows { + if manager, ok := managers[managerIds[i]]; ok { + rows[i].Cloudprovider = manager.Name + account := manager.GetCloudaccount() + rows[i].EnableAutoSync = false + if account != nil { + rows[i].CloudaccountId = account.Id + rows[i].Cloudaccount = account.Name + rows[i].CloudaccountDomainId = account.DomainId + if account.GetEnabled() && account.EnableAutoSync { + rows[i].EnableAutoSync = true + } + rows[i].SyncIntervalSeconds = account.getSyncIntervalSeconds() + } + } + } + + return rows } func (self *SCloudproviderregion) getSyncIntervalSeconds(account *SCloudaccount) int { @@ -133,21 +184,6 @@ func (self *SCloudproviderregion) getSyncIntervalSeconds(account *SCloudaccount) return account.getSyncIntervalSeconds() } -func (self *SCloudproviderregion) getExtraDetails(out api.CloudproviderregionDetails) api.CloudproviderregionDetails { - account := self.GetAccount() - if account != nil { - out.CloudaccountId = account.Id - out.Cloudaccount = account.Name - out.CloudaccountDomainId = account.DomainId - out.EnableAutoSync = false - if account.GetEnabled() && account.EnableAutoSync { - out.EnableAutoSync = true - } - out.SyncIntervalSeconds = self.getSyncIntervalSeconds(account) - } - return out -} - func (manager *SCloudproviderregion) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { return nil, httperrors.NewForbiddenError("not allow to create") } @@ -451,3 +487,82 @@ func (cprm *SCloudproviderregionManager) fetchRecordsByCloudproviderId(providerI } return recs, nil } + +func (manager *SCloudproviderregionManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.CloudproviderregionListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SJointResourceBaseManager.ListItemFilter(ctx, q, userCred, query.JointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SJointResourceBaseManager.ListItemFilter") + } + q, err = manager.SSyncableBaseResourceManager.ListItemFilter(ctx, q, userCred, query.SyncableBaseResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SSyncableBaseResourceManager.ListItemFilter") + } + q, err = manager.SCloudregionResourceBaseManager.ListItemFilter(ctx, q, userCred, query.RegionalFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter") + } + q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") + } + + if query.Enabled != nil { + if *query.Enabled { + q = q.IsTrue("enabled") + } else { + q = q.IsFalse("enabled") + } + } + + return q, nil +} + +func (manager *SCloudproviderregionManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.CloudproviderregionListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SJointResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.JointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SJointResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SCloudregionResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.RegionalFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SManagedResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.ManagedResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SManagedResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} + +func (manager *SCloudproviderregionManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SJointResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } + q, err = manager.SCloudregionResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } + q, err = manager.SManagedResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } + + return q, httperrors.ErrNotFound +} diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 794e849367..648fa987d1 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -49,6 +49,8 @@ import ( type SCloudproviderManager struct { db.SEnabledStatusStandaloneResourceBaseManager db.SProjectizedResourceBaseManager + + SSyncableBaseResourceManager } var CloudproviderManager *SCloudproviderManager @@ -1019,7 +1021,11 @@ func (manager *SCloudproviderManager) ListItemFilter( q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) if err != nil { - return nil, err + return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager.ListItemFilter") + } + q, err = manager.SSyncableBaseResourceManager.ListItemFilter(ctx, q, userCred, query.SyncableBaseResourceListInput) + if err != nil { + return nil, errors.Wrap(err, "SSyncableBaseResourceManager.ListItemFilter") } managerStr := query.Cloudprovider @@ -1063,9 +1069,6 @@ func (manager *SCloudproviderManager) ListItemFilter( q = q.In("id", subq) } - if len(query.SyncStatus) > 0 { - q = q.In("sync_status", query.SyncStatus) - } if len(query.HealthStatus) > 0 { q = q.In("health_status", query.HealthStatus) } diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index ad6d56f77c..b695494cdb 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -39,6 +39,7 @@ import ( type SCloudregionManager struct { db.SEnabledStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager } var CloudregionManager *SCloudregionManager @@ -632,6 +633,8 @@ func (manager *SCloudregionManager) ListItemFilter( userCred mcclient.TokenCredential, query api.CloudregionListInput, ) (*sqlchemy.SQuery, error) { + var err error + providerStrs := query.Providers if len(providerStrs) > 0 { subq := queryCloudregionIdsByProviders("provider", providerStrs) @@ -644,11 +647,16 @@ func (manager *SCloudregionManager) ListItemFilter( q = q.In("id", subq.SubQuery()) } - q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) + q, err = manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) if err != nil { return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "") + } + cloudEnvStr := query.CloudEnv if cloudEnvStr == api.CLOUD_ENV_PUBLIC_CLOUD { q = q.In("provider", cloudprovider.GetPublicProviders()) @@ -756,7 +764,7 @@ func (manager *SCloudregionManager) ListItemFilter( } if len(query.Environment) > 0 { - q = q.Equals("environment", query.Environment) + q = q.In("environment", query.Environment) } return q, nil diff --git a/pkg/compute/models/cloudsync.go b/pkg/compute/models/cloudsync.go index 3297788d54..f6d5f9d92b 100644 --- a/pkg/compute/models/cloudsync.go +++ b/pkg/compute/models/cloudsync.go @@ -41,6 +41,8 @@ type SSyncableBaseResource struct { LastSyncEndAt time.Time `list:"domain"` } +type SSyncableBaseResourceManager struct{} + func (self *SSyncableBaseResource) CanSync() bool { if self.SyncStatus == api.CLOUD_PROVIDER_SYNC_STATUS_QUEUED || self.SyncStatus == api.CLOUD_PROVIDER_SYNC_STATUS_SYNCING { if self.LastSync.IsZero() || time.Now().Sub(self.LastSync) > 1800*time.Second { @@ -53,6 +55,18 @@ func (self *SSyncableBaseResource) CanSync() bool { } } +func (manager *SSyncableBaseResourceManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SyncableBaseResourceListInput, +) (*sqlchemy.SQuery, error) { + if len(query.SyncStatus) > 0 { + q = q.In("sync_status", query.SyncStatus) + } + return q, nil +} + type sStoragecacheSyncPair struct { local *SStoragecache remote cloudprovider.ICloudStoragecache diff --git a/pkg/compute/models/dbinstance_accounts.go b/pkg/compute/models/dbinstance_accounts.go index 018babff6d..9ffbe973c9 100644 --- a/pkg/compute/models/dbinstance_accounts.go +++ b/pkg/compute/models/dbinstance_accounts.go @@ -39,6 +39,7 @@ import ( type SDBInstanceAccountManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SDBInstanceResourceBaseManager } @@ -60,7 +61,7 @@ type SDBInstanceAccount struct { db.SStatusStandaloneResourceBase db.SExternalizedResourceBase - SDBInstanceResourceBase + SDBInstanceResourceBase `width:"36" charset:"ascii" name:"dbinstance_id" nullable:"false" list:"user" create:"required" index:"true"` // 数据库密码 Secret string `width:"256" charset:"ascii" nullable:"false" list:"domain" create:"optional"` @@ -199,6 +200,10 @@ func (manager *SDBInstanceAccountManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SDBInstanceResourceBaseManager.ListItemFilter(ctx, q, userCred, query.DBInstanceFilterListInput) if err != nil { return nil, errors.Wrap(err, "SDBInstanceResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/dbinstance_backups.go b/pkg/compute/models/dbinstance_backups.go index a2b9fcf961..ae0f9d213f 100644 --- a/pkg/compute/models/dbinstance_backups.go +++ b/pkg/compute/models/dbinstance_backups.go @@ -39,6 +39,7 @@ import ( type SDBInstanceBackupManager struct { db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SManagedResourceBaseManager SCloudregionResourceBaseManager SDBInstanceResourceBaseManager @@ -64,7 +65,7 @@ type SDBInstanceBackup struct { SManagedResourceBase db.SExternalizedResourceBase - SDBInstanceResourceBase + SDBInstanceResourceBase `width:"36" charset:"ascii" name:"dbinstance_id" nullable:"false" list:"user" create:"required" index:"true"` // RDS引擎 // example: MySQL @@ -107,6 +108,11 @@ func (manager *SDBInstanceBackupManager) ListItemFilter( return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") @@ -126,13 +132,13 @@ func (manager *SDBInstanceBackupManager) ListItemFilter( } if len(query.Engine) > 0 { - q = q.Equals("engine", query.Engine) + q = q.In("engine", query.Engine) } if len(query.EngineVersion) > 0 { - q = q.Equals("engine_version", query.EngineVersion) + q = q.In("engine_version", query.EngineVersion) } if len(query.BackupMode) > 0 { - q = q.Equals("backup_mode", query.BackupMode) + q = q.In("backup_mode", query.BackupMode) } if len(query.DBNames) > 0 { q = q.Contains("db_names", query.DBNames) diff --git a/pkg/compute/models/dbinstance_databases.go b/pkg/compute/models/dbinstance_databases.go index 9f8dbe8814..059f92bfb7 100644 --- a/pkg/compute/models/dbinstance_databases.go +++ b/pkg/compute/models/dbinstance_databases.go @@ -37,6 +37,7 @@ import ( type SDBInstanceDatabaseManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SDBInstanceResourceBaseManager } @@ -58,7 +59,7 @@ type SDBInstanceDatabase struct { db.SStatusStandaloneResourceBase db.SExternalizedResourceBase - SDBInstanceResourceBase + SDBInstanceResourceBase `width:"36" charset:"ascii" name:"dbinstance_id" nullable:"false" list:"user" create:"required" index:"true"` // 字符集 // example: utf-8 @@ -142,6 +143,10 @@ func (manager *SDBInstanceDatabaseManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SDBInstanceResourceBaseManager.ListItemFilter(ctx, q, userCred, query.DBInstanceFilterListInput) if err != nil { return nil, errors.Wrap(err, "SDBInstanceResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/dbinstance_parameters.go b/pkg/compute/models/dbinstance_parameters.go index 792b4ab948..20775d59bf 100644 --- a/pkg/compute/models/dbinstance_parameters.go +++ b/pkg/compute/models/dbinstance_parameters.go @@ -34,6 +34,7 @@ import ( type SDBInstanceParameterManager struct { db.SStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SDBInstanceResourceBaseManager } @@ -54,7 +55,7 @@ func init() { type SDBInstanceParameter struct { db.SStandaloneResourceBase db.SExternalizedResourceBase - SDBInstanceResourceBase + SDBInstanceResourceBase `width:"36" charset:"ascii" name:"dbinstance_id" nullable:"false" list:"user" create:"required" index:"true"` // DBInstanceId string `width:"36" charset:"ascii" name:"dbinstance_id" nullable:"false" list:"user" create:"required" index:"true"` // 数据库参数名称 @@ -81,6 +82,10 @@ func (manager *SDBInstanceParameterManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SDBInstanceResourceBaseManager.ListItemFilter(ctx, q, userCred, query.DBInstanceFilterListInput) if err != nil { return nil, errors.Wrap(err, "SDBInstanceResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/dbinstance_privileges.go b/pkg/compute/models/dbinstance_privileges.go index 67ef95c8fa..fbeacd9726 100644 --- a/pkg/compute/models/dbinstance_privileges.go +++ b/pkg/compute/models/dbinstance_privileges.go @@ -33,6 +33,7 @@ import ( type SDBInstancePrivilegeManager struct { db.SResourceBaseManager + db.SExternalizedResourceBaseManager } var DBInstancePrivilegeManager *SDBInstancePrivilegeManager @@ -114,9 +115,13 @@ func (manager *SDBInstancePrivilegeManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } if len(query.Privilege) > 0 { - q = q.Equals("privilege", query.Privilege) + q = q.In("privilege", query.Privilege) } data := jsonutils.Marshal(query).(*jsonutils.JSONDict) diff --git a/pkg/compute/models/dbinstance_skus.go b/pkg/compute/models/dbinstance_skus.go index 0b21ec5c50..2820bd49bc 100644 --- a/pkg/compute/models/dbinstance_skus.go +++ b/pkg/compute/models/dbinstance_skus.go @@ -37,6 +37,7 @@ import ( type SDBInstanceSkuManager struct { db.SEnabledStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SCloudregionResourceBaseManager } @@ -121,6 +122,10 @@ func (manager *SDBInstanceSkuManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } if domainStr := query.ProjectDomain; len(domainStr) > 0 { domain, err := db.TenantCacheManager.FetchDomainByIdOrName(context.Background(), domainStr) @@ -142,22 +147,22 @@ func (manager *SDBInstanceSkuManager) ListItemFilter( // StorageType if len(query.StorageType) > 0 { - q = q.Equals("storage_type", query.StorageType) + q = q.In("storage_type", query.StorageType) } - if query.VcpuCount > 0 { - q = q.Equals("vcpu_count", query.VcpuCount) + if len(query.VcpuCount) > 0 { + q = q.In("vcpu_count", query.VcpuCount) } - if query.VmemSizeMb > 0 { - q = q.Equals("vmem_size_mb", query.VmemSizeMb) + if len(query.VmemSizeMb) > 0 { + q = q.In("vmem_size_mb", query.VmemSizeMb) } if len(query.Category) > 0 { - q = q.Equals("category", query.Category) + q = q.In("category", query.Category) } if len(query.Engine) > 0 { - q = q.Equals("engine", query.Engine) + q = q.In("engine", query.Engine) } if len(query.EngineVersion) > 0 { - q = q.Equals("engine_version", query.EngineVersion) + q = q.In("engine_version", query.EngineVersion) } return q, nil diff --git a/pkg/compute/models/dbinstancejoints.go b/pkg/compute/models/dbinstancejoints.go index c8d4f461d5..d45f258665 100644 --- a/pkg/compute/models/dbinstancejoints.go +++ b/pkg/compute/models/dbinstancejoints.go @@ -22,6 +22,7 @@ import ( type SDBInstanceJointsManager struct { db.SVirtualJointResourceBaseManager + SDBInstanceResourceBaseManager } func NewDBInstanceJointsManager(dt interface{}, tableName string, keyword string, keywordPlural string, slave db.IVirtualModelManager) SDBInstanceJointsManager { @@ -40,7 +41,8 @@ func NewDBInstanceJointsManager(dt interface{}, tableName string, keyword string type SDBInstanceJointsBase struct { db.SVirtualJointResourceBase - DBInstanceId string `width:"36" charset:"ascii" name:"dbinstance_id" nullable:"false" list:"user" create:"required" index:"true"` + SDBInstanceResourceBase `width:"36" charset:"ascii" name:"dbinstance_id" nullable:"false" list:"user" create:"required" index:"true"` + // DBInstanceId string `width:"36" charset:"ascii" name:"dbinstance_id" nullable:"false" list:"user" create:"required" index:"true"` } func (self *SDBInstanceJointsBase) getDBInstance() (*SDBInstance, error) { diff --git a/pkg/compute/models/dbinstances.go b/pkg/compute/models/dbinstances.go index c131a4828f..b346dcd1e6 100644 --- a/pkg/compute/models/dbinstances.go +++ b/pkg/compute/models/dbinstances.go @@ -48,6 +48,9 @@ import ( type SDBInstanceManager struct { db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager + SDeletePreventableResourceBaseManager + SCloudregionResourceBaseManager SManagedResourceBaseManager SVpcResourceBaseManager @@ -152,17 +155,22 @@ func (man *SDBInstanceManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - + q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = man.SDeletePreventableResourceBaseManager.ListItemFilter(ctx, q, userCred, query.DeletePreventableResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SDeletePreventableResourceBaseManager.ListItemFilter") + } q, err = man.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") } - q, err = man.SCloudregionResourceBaseManager.ListItemFilter(ctx, q, userCred, query.RegionalFilterListInput) if err != nil { return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter") } - q, err = man.SVpcResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VpcFilterListInput) if err != nil { return nil, errors.Wrap(err, "SVpcResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/deletepreventableresource.go b/pkg/compute/models/deletepreventableresource.go index 57d44d9e10..5ffe617b4d 100644 --- a/pkg/compute/models/deletepreventableresource.go +++ b/pkg/compute/models/deletepreventableresource.go @@ -15,8 +15,12 @@ package models import ( - "yunion.io/x/pkg/tristate" + "context" + "yunion.io/x/pkg/tristate" + "yunion.io/x/sqlchemy" + + "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/mcclient" ) @@ -27,6 +31,8 @@ type SDeletePreventableResourceBase struct { DisableDelete tristate.TriState `nullable:"false" default:"true" list:"user" update:"user" create:"optional" json:"disable_delete"` } +type SDeletePreventableResourceBaseManager struct{} + func (lock *SDeletePreventableResourceBase) MarkDeletePreventionOff() { lock.DisableDelete = tristate.False } @@ -56,3 +62,19 @@ func (lock *SDeletePreventableResourceBase) DeletePreventionOff(model db.IModel, } return nil } + +func (manager *SDeletePreventableResourceBaseManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query apis.DeletePreventableResourceBaseListInput, +) (*sqlchemy.SQuery, error) { + if query.DisableDelete != nil { + if *query.DisableDelete { + q = q.IsTrue("disable_delete") + } else { + q = q.IsFalse("disable_delete") + } + } + return q, nil +} diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index a13735ab52..4a04c24c66 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -55,6 +55,7 @@ import ( type SDiskManager struct { db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SStorageResourceBaseManager SBillingResourceBaseManager } @@ -78,7 +79,7 @@ type SDisk struct { db.SExternalizedResourceBase SBillingResourceBase - SStorageResourceBase + SStorageResourceBase `width:"128" charset:"ascii" nullable:"true" list:"admin" create:"optional"` // 磁盘存储类型 // example: qcow2 @@ -147,6 +148,11 @@ func (manager *SDiskManager) ListItemFilter( return nil, errors.Wrap(err, "SStorageResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SBillingResourceBaseManager.ListItemFilter(ctx, q, userCred, query.BillingResourceListInput) if err != nil { return nil, errors.Wrap(err, "SBillingResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/dnsrecords.go b/pkg/compute/models/dnsrecords.go index 66de03b96c..18d298432a 100644 --- a/pkg/compute/models/dnsrecords.go +++ b/pkg/compute/models/dnsrecords.go @@ -56,7 +56,7 @@ const DNS_RECORDS_SEPARATOR = "," type SDnsRecord struct { db.SAdminSharableVirtualResourceBase - db.SEnabledResourceBase + db.SEnabledResourceBase `nullable:"false" default:"true" create:"optional" list:"user"` // DNS记录的过期时间,单位为秒 // example: 60 diff --git a/pkg/compute/models/dynamicschedtags.go b/pkg/compute/models/dynamicschedtags.go index c4ce388904..e07302c1fb 100644 --- a/pkg/compute/models/dynamicschedtags.go +++ b/pkg/compute/models/dynamicschedtags.go @@ -101,7 +101,7 @@ func (man *SDynamicschedtagManager) InitializeData() error { // type SDynamicschedtag struct { db.SStandaloneResourceBase - SSchedtagResourceBase + SSchedtagResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" update:"admin"` // 动态调度标间的匹配条件 // example: host.sys_load > 1.5 || host.mem_used_percent > 0.7 => "high_load" diff --git a/pkg/compute/models/elasticcache_accounts.go b/pkg/compute/models/elasticcache_accounts.go index f141350439..e5b794a141 100644 --- a/pkg/compute/models/elasticcache_accounts.go +++ b/pkg/compute/models/elasticcache_accounts.go @@ -43,6 +43,7 @@ import ( // SElasticcache.Account type SElasticcacheAccountManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SElasticcacheResourceBaseManager } @@ -64,7 +65,7 @@ type SElasticcacheAccount struct { db.SStatusStandaloneResourceBase db.SExternalizedResourceBase - SElasticcacheResourceBase + SElasticcacheResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` // ElasticcacheId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` // elastic cache instance id @@ -463,6 +464,10 @@ func (manager *SElasticcacheAccountManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SElasticcacheResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ElasticcacheFilterListInput) if err != nil { return nil, errors.Wrap(err, "SElasticcacheResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/elasticcache_acls.go b/pkg/compute/models/elasticcache_acls.go index 93f95cb793..58bd512796 100644 --- a/pkg/compute/models/elasticcache_acls.go +++ b/pkg/compute/models/elasticcache_acls.go @@ -41,6 +41,7 @@ import ( // SElasticcache.Acl type SElasticcacheAclManager struct { db.SStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SElasticcacheResourceBaseManager } @@ -61,7 +62,7 @@ func init() { type SElasticcacheAcl struct { db.SStatusStandaloneResourceBase db.SExternalizedResourceBase - SElasticcacheResourceBase + SElasticcacheResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` // ElasticcacheId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` // elastic cache instance id @@ -343,6 +344,11 @@ func (manager *SElasticcacheAclManager) ListItemFilter( return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SElasticcacheResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ElasticcacheFilterListInput) if err != nil { return nil, errors.Wrap(err, "SElasticcacheResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/elasticcache_backups.go b/pkg/compute/models/elasticcache_backups.go index 8243a377dd..0ebc87f0f8 100644 --- a/pkg/compute/models/elasticcache_backups.go +++ b/pkg/compute/models/elasticcache_backups.go @@ -40,6 +40,7 @@ import ( // SElasticcache.Backup type SElasticcacheBackupManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SElasticcacheResourceBaseManager } @@ -60,7 +61,7 @@ func init() { type SElasticcacheBackup struct { db.SStatusStandaloneResourceBase db.SExternalizedResourceBase - SElasticcacheResourceBase + SElasticcacheResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` // ElasticcacheId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` // elastic cache instance id @@ -355,6 +356,11 @@ func (manager *SElasticcacheBackupManager) ListItemFilter( return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SElasticcacheResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ElasticcacheFilterListInput) if err != nil { return nil, errors.Wrap(err, "SElasticcacheResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/elasticcache_instances.go b/pkg/compute/models/elasticcache_instances.go index b4a7985e6d..a8383c969a 100644 --- a/pkg/compute/models/elasticcache_instances.go +++ b/pkg/compute/models/elasticcache_instances.go @@ -49,6 +49,8 @@ import ( type SElasticcacheManager struct { db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager + SDeletePreventableResourceBaseManager SVpcResourceBaseManager SZoneResourceBaseManager SNetworkResourceBaseManager @@ -73,7 +75,7 @@ type SElasticcache struct { db.SExternalizedResourceBase SBillingResourceBase SDeletePreventableResourceBase - SVpcResourceBase + SVpcResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"optional"` SZoneResourceBase // 备可用区 @@ -315,6 +317,14 @@ func (manager *SElasticcacheManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SDeletePreventableResourceBaseManager.ListItemFilter(ctx, q, userCred, query.DeletePreventableResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SDeletePreventableResourceBaseManager.ListItemFilter") + } q, err = manager.SVpcResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VpcFilterListInput) if err != nil { return nil, errors.Wrap(err, "SVpcResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/elasticcache_parameters.go b/pkg/compute/models/elasticcache_parameters.go index 547920a328..23aff4ca63 100644 --- a/pkg/compute/models/elasticcache_parameters.go +++ b/pkg/compute/models/elasticcache_parameters.go @@ -37,6 +37,7 @@ import ( // SElasticcache.Parameter type SElasticcacheParameterManager struct { db.SStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SElasticcacheResourceBaseManager } @@ -57,7 +58,7 @@ func init() { type SElasticcacheParameter struct { db.SStatusStandaloneResourceBase db.SExternalizedResourceBase - SElasticcacheResourceBase + SElasticcacheResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` // ElasticcacheId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` // elastic cache instance id @@ -261,7 +262,10 @@ func (manager *SElasticcacheParameterManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SElasticcacheResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ElasticcacheFilterListInput) if err != nil { return nil, errors.Wrap(err, "SElasticcacheResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/elasticcache_skus.go b/pkg/compute/models/elasticcache_skus.go index 722b9014fd..24a0438d8e 100644 --- a/pkg/compute/models/elasticcache_skus.go +++ b/pkg/compute/models/elasticcache_skus.go @@ -37,6 +37,7 @@ import ( type SElasticcacheSkuManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SCloudregionResourceBaseManager SZoneResourceBaseManager } @@ -225,6 +226,11 @@ func (manager *SElasticcacheSkuManager) ListItemFilter( return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SCloudregionResourceBaseManager.ListItemFilter(ctx, q, userCred, query.RegionalFilterListInput) if err != nil { return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index 2248ff4a3c..27d7710b95 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -42,6 +42,7 @@ import ( type SElasticipManager struct { db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SManagedResourceBaseManager SCloudregionResourceBaseManager } @@ -63,11 +64,10 @@ func init() { type SElasticip struct { db.SVirtualResourceBase - db.SExternalizedResourceBase SManagedResourceBase - SCloudregionResourceBase + SCloudregionResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` SBillingResourceBase @@ -120,6 +120,11 @@ func (manager *SElasticipManager) ListItemFilter( return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/external_projects.go b/pkg/compute/models/external_projects.go index dd75a53b98..2da017872a 100644 --- a/pkg/compute/models/external_projects.go +++ b/pkg/compute/models/external_projects.go @@ -37,6 +37,7 @@ import ( type SExternalProjectManager struct { db.SStandaloneResourceBaseManager db.SProjectizedResourceBaseManager + db.SExternalizedResourceBaseManager SManagedResourceBaseManager } @@ -297,6 +298,10 @@ func (manager *SExternalProjectManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/groupguests.go b/pkg/compute/models/groupguests.go index 9012311886..e109ab75b9 100644 --- a/pkg/compute/models/groupguests.go +++ b/pkg/compute/models/groupguests.go @@ -19,6 +19,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/compute" @@ -29,6 +30,7 @@ import ( type SGroupguestManager struct { SGroupJointsManager + SGuestResourceBaseManager } var GroupguestManager *SGroupguestManager @@ -152,3 +154,47 @@ func (self *SGroupguestManager) Attach(ctx context.Context, groupId, guestId str joint.SetModelManager(self, joint) return joint, nil } + +func (manager *SGroupguestManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GroupguestListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SGroupJointsManager.ListItemFilter(ctx, q, userCred, query.GroupJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SGroupJointsManager.ListItemFilter") + } + q, err = manager.SGuestResourceBaseManager.ListItemFilter(ctx, q, userCred, query.GuestFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SGuestResourceBaseManager.ListItemFilter") + } + + if len(query.Tag) > 0 { + q = q.In("tag", query.Tag) + } + + return q, nil +} + +func (manager *SGroupguestManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GroupguestListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SGroupJointsManager.OrderByExtraFields(ctx, q, userCred, query.GroupJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SGroupJointsManager.OrderByExtraFields") + } + q, err = manager.SGuestResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.GuestFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SGuestResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} diff --git a/pkg/compute/models/groupjoints.go b/pkg/compute/models/groupjoints.go index 230a8f4b7d..83c143889b 100644 --- a/pkg/compute/models/groupjoints.go +++ b/pkg/compute/models/groupjoints.go @@ -19,7 +19,9 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/reflectutils" + "yunion.io/x/sqlchemy" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -29,6 +31,7 @@ import ( type SGroupJointsManager struct { db.SVirtualJointResourceBaseManager + SGroupResourceBaseManager } func NewGroupJointsManager(dt interface{}, tableName string, keyword string, keywordPlural string, slave db.IVirtualModelManager) SGroupJointsManager { @@ -106,3 +109,43 @@ func (manager *SGroupJointsManager) FetchCustomizeColumns( return rows } + +func (manager *SGroupJointsManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GroupJointsListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SVirtualJointResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualJointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SVirtualJointResourceBaseManager.ListItemFilter") + } + q, err = manager.SGroupResourceBaseManager.ListItemFilter(ctx, q, userCred, query.GroupFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SGroupResourceBaseManager.ListItemFilter") + } + + return q, nil +} + +func (manager *SGroupJointsManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GroupJointsListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SVirtualJointResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.VirtualJointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SVirtualJointResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SGroupResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.GroupFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SGroupResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} diff --git a/pkg/compute/models/groupnetworks.go b/pkg/compute/models/groupnetworks.go index b4899af67b..9c994c8c2e 100644 --- a/pkg/compute/models/groupnetworks.go +++ b/pkg/compute/models/groupnetworks.go @@ -19,6 +19,8 @@ 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/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -28,6 +30,7 @@ import ( type SGroupnetworkManager struct { SGroupJointsManager + SNetworkResourceBaseManager } var GroupnetworkManager *SGroupnetworkManager @@ -131,3 +134,47 @@ func (self *SGroupnetwork) Delete(ctx context.Context, userCred mcclient.TokenCr func (self *SGroupnetwork) Detach(ctx context.Context, userCred mcclient.TokenCredential) error { return db.DetachJoint(ctx, userCred, self) } + +func (manager *SGroupnetworkManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GroupnetworkListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SGroupJointsManager.ListItemFilter(ctx, q, userCred, query.GroupJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SGroupJointsManager.ListItemFilter") + } + q, err = manager.SNetworkResourceBaseManager.ListItemFilter(ctx, q, userCred, query.NetworkFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SNetworkResourceBaseManager.ListItemFilter") + } + + if len(query.IpAddr) > 0 { + q = q.In("ip_addr", query.IpAddr) + } + + return q, nil +} + +func (manager *SGroupnetworkManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GroupnetworkListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SGroupJointsManager.OrderByExtraFields(ctx, q, userCred, query.GroupJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SGroupJointsManager.OrderByExtraFields") + } + q, err = manager.SNetworkResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.NetworkFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SNetworkResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} diff --git a/pkg/compute/models/groupresource.go b/pkg/compute/models/groupresource.go new file mode 100644 index 0000000000..bfeed8f9e5 --- /dev/null +++ b/pkg/compute/models/groupresource.go @@ -0,0 +1,153 @@ +// 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" + "database/sql" + + "yunion.io/x/jsonutils" + "yunion.io/x/log" + "yunion.io/x/pkg/errors" + "yunion.io/x/pkg/util/reflectutils" + "yunion.io/x/sqlchemy" + + api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/httperrors" + "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/stringutils2" +) + +type SGroupResourceBase struct { + // 实例组ID + GroupId string `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional"` +} + +type SGroupResourceBaseManager struct { +} + +func (self *SGroupResourceBase) GetGroup() *SGroup { + obj, _ := GroupManager.FetchById(self.GroupId) + if obj != nil { + return obj.(*SGroup) + } + return nil +} + +func (self *SGroupResourceBase) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) api.GroupResourceInfo { + return api.GroupResourceInfo{} +} + +func (manager *SGroupResourceBaseManager) FetchCustomizeColumns( + ctx context.Context, + userCred mcclient.TokenCredential, + query jsonutils.JSONObject, + objs []interface{}, + fields stringutils2.SSortedStrings, + isList bool, +) []api.GroupResourceInfo { + rows := make([]api.GroupResourceInfo, len(objs)) + groupIds := make([]string, len(objs)) + for i := range objs { + var base *SGroupResourceBase + err := reflectutils.FindAnonymouStructPointer(objs[i], &base) + if err != nil { + log.Errorf("Cannot find SGuestResourceBase in object %s", objs[i]) + continue + } + groupIds[i] = base.GroupId + } + groupNames, err := db.FetchIdNameMap2(GroupManager, groupIds) + if err != nil { + log.Errorf("FetchIdNameMap2 fail %s", err) + return rows + } + + for i := range rows { + if name, ok := groupNames[groupIds[i]]; ok { + rows[i].Group = name + } + } + return rows +} + +func (manager *SGroupResourceBaseManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GroupFilterListInput, +) (*sqlchemy.SQuery, error) { + if len(query.Group) > 0 { + groupObj, err := GroupManager.FetchByIdOrName(userCred, query.Group) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(GroupManager.Keyword(), query.Group) + } else { + return nil, errors.Wrap(err, "GroupManager.FetchByIdOrName") + } + } + q = q.Equals("group_id", groupObj.GetId()) + } + return q, nil +} + +func (manager *SGroupResourceBaseManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { + switch field { + case "group": + groupQuery := GroupManager.Query("name", "id").SubQuery() + q = q.AppendField(groupQuery.Field("name", field)).Distinct() + q = q.Join(groupQuery, sqlchemy.Equals(q.Field("group_id"), groupQuery.Field("id"))) + return q, nil + } + return q, httperrors.ErrNotFound +} + +func (manager *SGroupResourceBaseManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GroupFilterListInput, +) (*sqlchemy.SQuery, error) { + q, orders, fields := manager.GetOrderBySubQuery(q, userCred, query) + if len(orders) > 0 { + q = db.OrderByFields(q, orders, fields) + } + return q, nil +} + +func (manager *SGroupResourceBaseManager) GetOrderBySubQuery( + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GroupFilterListInput, +) (*sqlchemy.SQuery, []string, []sqlchemy.IQueryField) { + groupQ := GroupManager.Query("id", "name") + var orders []string + var fields []sqlchemy.IQueryField + + if db.NeedOrderQuery(manager.GetOrderByFields(query)) { + subq := groupQ.SubQuery() + q = q.LeftJoin(subq, sqlchemy.Equals(q.Field("group_id"), subq.Field("id"))) + if db.NeedOrderQuery([]string{query.OrderByGroup}) { + orders = append(orders, query.OrderByGroup) + fields = append(fields, subq.Field("name")) + } + } + return q, orders, fields +} + +func (manager *SGroupResourceBaseManager) GetOrderByFields(query api.GroupFilterListInput) []string { + return []string{query.OrderByGroup} +} diff --git a/pkg/compute/models/groups.go b/pkg/compute/models/groups.go index 48a7029ac1..486acf498b 100644 --- a/pkg/compute/models/groups.go +++ b/pkg/compute/models/groups.go @@ -66,26 +66,26 @@ func init() { type SGroup struct { db.SVirtualResourceBase - SZoneResourceBase + SZoneResourceBase `width:"36" charset:"ascii" nullable:"true" list:"user" update:"user" create:"optional"` - db.SEnabledResourceBase + db.SEnabledResourceBase `nullable:"false" default:"true" create:"optional" list:"user" update:"user"` // 服务类型 - ServiceType string `width:"36" charset:"ascii" nullable:"true" list:"user" update:"user" create:"optional" json:"service_type"` - ParentId string `width:"36" charset:"ascii" nullable:"true" list:"user" update:"user" create:"optional" json:"parent_id"` + ServiceType string `width:"36" charset:"ascii" nullable:"true" list:"user" update:"user" create:"optional"` + ParentId string `width:"36" charset:"ascii" nullable:"true" list:"user" update:"user" create:"optional"` // 可用区Id // example: zone1 - // ZoneId string `width:"36" charset:"ascii" nullable:"true" list:"user" update:"user" create:"optional" json:"zone_id"` + // ZoneId string `width:"36" charset:"ascii" nullable:"true" list:"user" update:"user" create:"optional"` // 调度策略 - SchedStrategy string `width:"16" charset:"ascii" nullable:"true" default:"" list:"user" update:"user" create:"optional" json:"sched_strategy"` + SchedStrategy string `width:"16" charset:"ascii" nullable:"true" default:"" list:"user" update:"user" create:"optional"` // the upper limit number of guests with this group in a host - Granularity int `nullable:"false" list:"user" get:"user" create:"optional" update:"user" default:"1" json:"granularity"` - ForceDispersion tristate.TriState `list:"user" get:"user" create:"optional" update:"user" default:"true" json:"force_dispersion"` + Granularity int `nullable:"false" list:"user" get:"user" create:"optional" update:"user" default:"1"` + ForceDispersion tristate.TriState `list:"user" get:"user" create:"optional" update:"user" default:"true"` // 是否启用 - // Enabled tristate.TriState `nullable:"false" default:"true" create:"optional" list:"user" update:"user" json:"enabled"` + // Enabled tristate.TriState `nullable:"false" default:"true" create:"optional" list:"user" update:"user"` } // 主机组列表 diff --git a/pkg/compute/models/guestdisks.go b/pkg/compute/models/guestdisks.go index 52a40223e4..737ceaf2ca 100644 --- a/pkg/compute/models/guestdisks.go +++ b/pkg/compute/models/guestdisks.go @@ -57,8 +57,8 @@ func init() { type SGuestdisk struct { SGuestJointsBase - // SDiskResourceBase `list:"user" create:"required"` - DiskId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` // Column(VARCHAR(36, charset='ascii'), nullable=False) + SDiskResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` + // DiskId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` // Column(VARCHAR(36, charset='ascii'), nullable=False) ImagePath string `width:"256" charset:"ascii" nullable:"false" get:"user" create:"required"` // Column(VARCHAR(256, charset='ascii'), nullable=False) @@ -151,6 +151,7 @@ func (manager *SGuestdiskManager) FetchCustomizeColumns( for i := range rows { if disk, ok := disks[diskIds[i]]; ok { rows[i].Disk = disk.Name + rows[i].Status = disk.Status rows[i].DiskSize = disk.DiskSize rows[i].DiskType = disk.DiskType storage := disk.GetStorage() diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 1d9c16c81e..80524d2933 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -66,6 +66,8 @@ import ( type SGuestManager struct { db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager + SDeletePreventableResourceBaseManager SHostResourceBaseManager SBillingResourceBaseManager @@ -96,7 +98,7 @@ type SGuest struct { SBillingResourceBase SDeletePreventableResourceBase - SHostResourceBase + SHostResourceBase `width:"36" charset:"ascii" nullable:"true" list:"admin" get:"admin" index:"true"` // CPU大小 VcpuCount int `nullable:"false" default:"1" list:"user" create:"optional"` @@ -168,6 +170,16 @@ func (manager *SGuestManager) ListItemFilter( return nil, errors.Wrap(err, "SHostResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + + q, err = manager.SDeletePreventableResourceBaseManager.ListItemFilter(ctx, q, userCred, query.DeletePreventableResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SDeletePreventableResourceBaseManager.ListItemFilter") + } + q, err = manager.SBillingResourceBaseManager.ListItemFilter(ctx, q, userCred, query.BillingResourceListInput) if err != nil { return nil, errors.Wrap(err, "SBillingResourceBaseManager.ListItemFilter") @@ -1512,7 +1524,8 @@ func (guest *SGuest) PostCreate(ctx context.Context, userCred mcclient.TokenCred } secgroups, _ := jsonutils.GetStringArray(data, "secgroups") for _, secgroup := range secgroups { - gs := SGuestsecgroup{SecgroupId: secgroup} + gs := SGuestsecgroup{} + gs.SecgroupId = secgroup gs.GuestId = guest.Id GuestsecgroupManager.TableSpec().Insert(&gs) } diff --git a/pkg/compute/models/guestsecgroups.go b/pkg/compute/models/guestsecgroups.go index 75f723a618..3ddabed641 100644 --- a/pkg/compute/models/guestsecgroups.go +++ b/pkg/compute/models/guestsecgroups.go @@ -19,7 +19,10 @@ import ( "fmt" "yunion.io/x/log" + "yunion.io/x/pkg/errors" + "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/mcclient" @@ -27,6 +30,7 @@ import ( type SGuestsecgroupManager struct { SGuestJointsManager + SSecurityGroupResourceBaseManager } var GuestsecgroupManager *SGuestsecgroupManager @@ -49,7 +53,8 @@ func init() { type SGuestsecgroup struct { SGuestJointsBase - SecgroupId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` // Column(VARCHAR(36, charset='ascii'), nullable=False) + SSecurityGroupResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` + // SecgroupId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` // Column(VARCHAR(36, charset='ascii'), nullable=False) } func (manager *SGuestsecgroupManager) GetSlaveFieldName() string { @@ -78,7 +83,8 @@ func (manager *SGuestsecgroupManager) newGuestSecgroup(ctx context.Context, user return nil, fmt.Errorf("security group %s has already been assigned to guest %s", secgroup.Name, guest.Name) } - gs := SGuestsecgroup{SecgroupId: secgroup.Id} + gs := SGuestsecgroup{} + gs.SecgroupId = secgroup.Id gs.SetModelManager(manager, &gs) gs.GuestId = guest.Id @@ -126,3 +132,43 @@ func (manager *SGuestsecgroupManager) DeleteGuestSecgroup(ctx context.Context, u func (self *SGuestsecgroup) Delete(ctx context.Context, userCred mcclient.TokenCredential) error { return db.DeleteModel(ctx, userCred, self) } + +func (manager *SGuestsecgroupManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GuestsecgroupListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SGuestJointsManager.ListItemFilter(ctx, q, userCred, query.GuestJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SGuestJointsManager.ListItemFilter") + } + q, err = manager.SSecurityGroupResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SecgroupFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSecurityGroupResourceBaseManager.ListItemFilter") + } + + return q, nil +} + +func (manager *SGuestsecgroupManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.GuestsecgroupListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SGuestJointsManager.OrderByExtraFields(ctx, q, userCred, query.GuestJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SGuestJointsManager.OrderByExtraFields") + } + q, err = manager.SSecurityGroupResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.SecgroupFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSecurityGroupResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} diff --git a/pkg/compute/models/hostresource.go b/pkg/compute/models/hostresource.go index cefb128e6e..8b4d19ff04 100644 --- a/pkg/compute/models/hostresource.go +++ b/pkg/compute/models/hostresource.go @@ -32,7 +32,7 @@ import ( ) type SHostResourceBase struct { - HostId string `width:"36" charset:"ascii" nullable:"true" list:"user" index:"true" create:"optional"` + HostId string `width:"36" charset:"ascii" nullable:"true" list:"user"` } type SHostResourceBaseManager struct { diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 18b6355767..70f34c6295 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -59,6 +59,7 @@ import ( type SHostManager struct { db.SEnabledStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SZoneResourceBaseManager SManagedResourceBaseManager } @@ -201,6 +202,11 @@ func (manager *SHostManager) ListItemFilter( return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SZoneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ZonalFilterListInput) if err != nil { return nil, errors.Wrap(err, "SZoneResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/isolated_devices.go b/pkg/compute/models/isolated_devices.go index 3c30af841d..9342d269ec 100644 --- a/pkg/compute/models/isolated_devices.go +++ b/pkg/compute/models/isolated_devices.go @@ -74,7 +74,7 @@ func init() { type SIsolatedDevice struct { db.SStandaloneResourceBase - SHostResourceBase + SHostResourceBase `width:"36" charset:"ascii" nullable:"false" default:"" index:"true" list:"admin" create:"admin_required"` // 宿主机Id // HostId string `width:"36" charset:"ascii" nullable:"false" default:"" index:"true" list:"admin" create:"admin_required"` diff --git a/pkg/compute/models/keypairs.go b/pkg/compute/models/keypairs.go index 1b9d6fbd84..46e0ffa10b 100644 --- a/pkg/compute/models/keypairs.go +++ b/pkg/compute/models/keypairs.go @@ -93,6 +93,14 @@ func (manager *SKeypairManager) ListItemFilter( } else { q = q.Equals("owner_id", userCred.GetUserId()) } + + if len(query.Scheme) > 0 { + q = q.In("scheme", query.Scheme) + } + if len(query.Fingerprint) > 0 { + q = q.In("fingerprint", query.Fingerprint) + } + return q, nil } diff --git a/pkg/compute/models/loadbalanceracls.go b/pkg/compute/models/loadbalanceracls.go index 728b88e14a..0a12401b0c 100644 --- a/pkg/compute/models/loadbalanceracls.go +++ b/pkg/compute/models/loadbalanceracls.go @@ -115,7 +115,10 @@ func (aclEntries *SLoadbalancerAclEntries) Fingerprint() string { type SLoadbalancerAclManager struct { SLoadbalancerLogSkipper + db.SSharableVirtualResourceBaseManager + db.SExternalizedResourceBaseManager + SManagedResourceBaseManager SCloudregionResourceBaseManager } @@ -454,6 +457,10 @@ func (manager *SLoadbalancerAclManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") @@ -462,6 +469,11 @@ func (manager *SLoadbalancerAclManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter") } + + if len(input.Fingerprint) > 0 { + q = q.In("fingerprint", input.Fingerprint) + } + return q, nil } diff --git a/pkg/compute/models/loadbalanceragents.go b/pkg/compute/models/loadbalanceragents.go index 4fb47505ad..65f40cc01f 100644 --- a/pkg/compute/models/loadbalanceragents.go +++ b/pkg/compute/models/loadbalanceragents.go @@ -70,7 +70,7 @@ func init() { // type SLoadbalancerAgent struct { db.SStandaloneResourceBase - SLoadbalancerClusterResourceBase + SLoadbalancerClusterResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` Version string `width:"64" nullable:"true" list:"admin" update:"admin"` IP string `width:"32" nullable:"true" list:"admin" update:"admin"` @@ -385,6 +385,17 @@ func (man *SLoadbalancerAgentManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SLoadbalancerClusterResourceBaseManager.ListItemFilter") } + + if len(query.Version) > 0 { + q = q.In("version", query.Version) + } + if len(query.IP) > 0 { + q = q.In("ip", query.IP) + } + if len(query.HaState) > 0 { + q = q.In("ha_state", query.HaState) + } + return q, nil } diff --git a/pkg/compute/models/loadbalancerbackendgroups.go b/pkg/compute/models/loadbalancerbackendgroups.go index d900bc9283..462049d9fb 100644 --- a/pkg/compute/models/loadbalancerbackendgroups.go +++ b/pkg/compute/models/loadbalancerbackendgroups.go @@ -41,6 +41,7 @@ import ( type SLoadbalancerBackendGroupManager struct { SLoadbalancerLogSkipper db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SLoadbalancerResourceBaseManager } @@ -62,7 +63,7 @@ type SLoadbalancerBackendGroup struct { db.SVirtualResourceBase db.SExternalizedResourceBase - SLoadbalancerResourceBase + SLoadbalancerResourceBase `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional"` Type string `width:"36" charset:"ascii" nullable:"false" list:"user" default:"normal" create:"optional"` @@ -89,6 +90,11 @@ func (man *SLoadbalancerBackendGroupManager) ListItemFilter( return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = man.SLoadbalancerResourceBaseManager.ListItemFilter(ctx, q, userCred, query.LoadbalancerFilterListInput) if err != nil { return nil, errors.Wrap(err, "SLoadbalancerResourceBaseManager.ListItemFilter") @@ -112,6 +118,11 @@ func (man *SLoadbalancerBackendGroupManager) ListItemFilter( return nil, httperrors.NewInternalServerError("query backend group releated resource failed.") } } + + if len(query.Type) > 0 { + q = q.In("type", query.Type) + } + return q, nil } diff --git a/pkg/compute/models/loadbalancerbackends.go b/pkg/compute/models/loadbalancerbackends.go index ff9a4e8e7a..43b353ac40 100644 --- a/pkg/compute/models/loadbalancerbackends.go +++ b/pkg/compute/models/loadbalancerbackends.go @@ -41,6 +41,7 @@ import ( type SLoadbalancerBackendManager struct { SLoadbalancerLogSkipper db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SLoadbalancerBackendgroupResourceBaseManager } @@ -64,7 +65,7 @@ type SLoadbalancerBackend struct { //SManagedResourceBase //SCloudregionResourceBase - SLoadbalancerBackendgroupResourceBase + SLoadbalancerBackendgroupResourceBase `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional"` // BackendGroupId string `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional"` BackendId string `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional"` @@ -97,6 +98,10 @@ func (man *SLoadbalancerBackendManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = man.SLoadbalancerBackendgroupResourceBaseManager.ListItemFilter(ctx, q, userCred, query.LoadbalancerBackendGroupFilterListInput) if err != nil { return nil, errors.Wrap(err, "SLoadbalancerBackendgroupResourceBaseManager.ListItemFilter") @@ -113,6 +118,23 @@ func (man *SLoadbalancerBackendManager) ListItemFilter( if err != nil { return nil, err } + + if len(query.BackendType) > 0 { + q = q.In("backend_type", query.BackendType) + } + if len(query.BackendRole) > 0 { + q = q.In("backend_role", query.BackendRole) + } + if len(query.Address) > 0 { + q = q.In("address", query.Address) + } + if len(query.SendProxy) > 0 { + q = q.In("send_proxy", query.SendProxy) + } + if len(query.Ssl) > 0 { + q = q.In("ssl", query.Ssl) + } + return q, nil } diff --git a/pkg/compute/models/loadbalancercachedcertificates.go b/pkg/compute/models/loadbalancercachedcertificates.go index ee54cf36a3..48d9de50f4 100644 --- a/pkg/compute/models/loadbalancercachedcertificates.go +++ b/pkg/compute/models/loadbalancercachedcertificates.go @@ -66,7 +66,7 @@ type SCachedLoadbalancerCertificate struct { SManagedResourceBase // 云账号ID SCloudregionResourceBase // Region ID - SLoadbalancerCertificateResourceBase + SLoadbalancerCertificateResourceBase `width:"128" charset:"ascii" nullable:"false" create:"required" index:"true" list:"user"` // CertificateId string `width:"128" charset:"ascii" nullable:"false" create:"required" index:"true" list:"user" json:"certificate_id"` // 本地证书ID } diff --git a/pkg/compute/models/loadbalancercertificateresource.go b/pkg/compute/models/loadbalancercertificateresource.go index fee578352a..7b22e20a7a 100644 --- a/pkg/compute/models/loadbalancercertificateresource.go +++ b/pkg/compute/models/loadbalancercertificateresource.go @@ -152,5 +152,5 @@ func (manager *SLoadbalancerCertificateResourceBaseManager) GetOrderBySubQuery( } func (manager *SLoadbalancerCertificateResourceBaseManager) GetOrderByFields(query api.LoadbalancerCertificateFilterListInput) []string { - return []string{query.Certificate} + return []string{query.OrderByCertificate} } diff --git a/pkg/compute/models/loadbalancercertificates.go b/pkg/compute/models/loadbalancercertificates.go index 7ddd3d0866..1ff5d1eee4 100644 --- a/pkg/compute/models/loadbalancercertificates.go +++ b/pkg/compute/models/loadbalancercertificates.go @@ -42,6 +42,7 @@ import ( type SLoadbalancerCertificateManager struct { SLoadbalancerLogSkipper db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager } var LoadbalancerCertificateManager *SLoadbalancerCertificateManager @@ -251,6 +252,10 @@ func (man *SLoadbalancerCertificateManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } if query.Usable != nil && *query.Usable { region := query.Cloudregion @@ -284,6 +289,13 @@ func (man *SLoadbalancerCertificateManager) ListItemFilter( } } + if len(query.CommonName) > 0 { + q = q.In("common_name", query.CommonName) + } + if len(query.SubjectAlternativeNames) > 0 { + q = q.In("subject_alternative_names", query.SubjectAlternativeNames) + } + return q, nil } diff --git a/pkg/compute/models/loadbalancerclusters.go b/pkg/compute/models/loadbalancerclusters.go index 382eb09714..8cf7ed25df 100644 --- a/pkg/compute/models/loadbalancerclusters.go +++ b/pkg/compute/models/loadbalancerclusters.go @@ -54,7 +54,7 @@ func init() { type SLoadbalancerCluster struct { db.SStandaloneResourceBase SZoneResourceBase - SWireResourceBase + SWireResourceBase `width:"36" charset:"ascii" nullable:"true" list:"admin" create:"optional" update:"admin"` //WireId string `width:"36" charset:"ascii" nullable:"true" list:"admin" create:"optional" update:"admin"` } diff --git a/pkg/compute/models/loadbalancerlistenerrules.go b/pkg/compute/models/loadbalancerlistenerrules.go index 7b9a2bff03..f060cc2317 100644 --- a/pkg/compute/models/loadbalancerlistenerrules.go +++ b/pkg/compute/models/loadbalancerlistenerrules.go @@ -40,6 +40,7 @@ import ( type SLoadbalancerListenerRuleManager struct { SLoadbalancerLogSkipper db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SLoadbalancerListenerResourceBaseManager } @@ -61,7 +62,7 @@ type SLoadbalancerListenerRule struct { db.SVirtualResourceBase db.SExternalizedResourceBase - SLoadbalancerListenerResourceBase + SLoadbalancerListenerResourceBase `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional"` // 默认转发策略,目前只有aws用到其它云都是false IsDefault bool `default:"false" nullable:"true" list:"user" create:"optional"` @@ -395,6 +396,10 @@ func (man *SLoadbalancerListenerRuleManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = man.SLoadbalancerListenerResourceBaseManager.ListItemFilter(ctx, q, userCred, query.LoadbalancerListenerFilterListInput) if err != nil { return nil, errors.Wrap(err, "SLoadbalancerListenerResourceBaseManager.ListItemFilter") @@ -409,6 +414,21 @@ func (man *SLoadbalancerListenerRuleManager) ListItemFilter( if err != nil { return nil, err } + + if query.IsDefault != nil { + if *query.IsDefault { + q = q.IsTrue("is_default") + } else { + q = q.IsFalse("is_default") + } + } + if len(query.Domain) > 0 { + q = q.In("domain", query.Domain) + } + if len(query.Path) > 0 { + q = q.In("path", query.Path) + } + return q, nil } diff --git a/pkg/compute/models/loadbalancerlisteners.go b/pkg/compute/models/loadbalancerlisteners.go index f54c46da9b..a70306d971 100644 --- a/pkg/compute/models/loadbalancerlisteners.go +++ b/pkg/compute/models/loadbalancerlisteners.go @@ -41,6 +41,7 @@ import ( type SLoadbalancerListenerManager struct { SLoadbalancerLogSkipper db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SLoadbalancerResourceBaseManager } @@ -123,7 +124,7 @@ type SLoadbalancerListener struct { db.SVirtualResourceBase db.SExternalizedResourceBase - SLoadbalancerResourceBase + SLoadbalancerResourceBase `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional"` //LoadbalancerId string `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional"` ListenerType string `width:"16" charset:"ascii" nullable:"false" list:"user" create:"required"` @@ -216,6 +217,10 @@ func (man *SLoadbalancerListenerManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = man.SLoadbalancerResourceBaseManager.ListItemFilter(ctx, q, userCred, query.LoadbalancerFilterListInput) if err != nil { return nil, errors.Wrap(err, "SLoadbalancerResourceBaseManager.ListItemFilter") @@ -233,6 +238,26 @@ func (man *SLoadbalancerListenerManager) ListItemFilter( if err != nil { return nil, err } + + if len(query.ListenerType) > 0 { + q = q.In("listener_type", query.ListenerType) + } + if len(query.ListenerPort) > 0 { + q = q.In("listener_port", query.ListenerPort) + } + if len(query.Scheduler) > 0 { + q = q.In("scheduler", query.Scheduler) + } + if len(query.SendProxy) > 0 { + q = q.In("send_proxy", query.SendProxy) + } + if len(query.AclStatus) > 0 { + q = q.In("acl_status", query.AclStatus) + } + if len(query.AclType) > 0 { + q = q.In("acl_type", query.AclType) + } + return q, nil } diff --git a/pkg/compute/models/loadbalancernetworks.go b/pkg/compute/models/loadbalancernetworks.go index 2e6f85a7a3..1068e760a5 100644 --- a/pkg/compute/models/loadbalancernetworks.go +++ b/pkg/compute/models/loadbalancernetworks.go @@ -20,6 +20,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/netutils" "yunion.io/x/pkg/util/regutils" "yunion.io/x/sqlchemy" @@ -27,6 +28,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" + "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/rbacutils" "yunion.io/x/onecloud/pkg/util/stringutils2" @@ -34,6 +36,8 @@ import ( type SLoadbalancernetworkManager struct { db.SVirtualJointResourceBaseManager + SLoadbalancerResourceBaseManager + SNetworkResourceBaseManager } var LoadbalancernetworkManager *SLoadbalancernetworkManager @@ -293,3 +297,74 @@ func totalLBNicCount( q = CloudProviderFilter(q, lbs.Field("manager_id"), providers, brands, cloudEnv) return q.CountWithError() } + +func (manager *SLoadbalancernetworkManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.LoadbalancernetworkListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SVirtualJointResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualJointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SVirtualJointResourceBaseManager.ListItemFilter") + } + q, err = manager.SLoadbalancerResourceBaseManager.ListItemFilter(ctx, q, userCred, query.LoadbalancerFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SLoadbalancerResourceBaseManager.ListItemFilter") + } + q, err = manager.SNetworkResourceBaseManager.ListItemFilter(ctx, q, userCred, query.NetworkFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SNetworkResourceBaseManager.ListItemFilter") + } + + if len(query.IpAddr) > 0 { + q = q.In("ip_addr", query.IpAddr) + } + + return q, nil +} + +func (manager *SLoadbalancernetworkManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.LoadbalancernetworkListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SVirtualJointResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.VirtualJointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SVirtualJointResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SLoadbalancerResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.LoadbalancerFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SLoadbalancerResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SNetworkResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.NetworkFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SNetworkResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} + +func (manager *SLoadbalancernetworkManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SVirtualJointResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } + q, err = manager.SLoadbalancerResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } + q, err = manager.SNetworkResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } + + return q, httperrors.ErrNotFound +} diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index 94c5f7f03e..6f193737e1 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -42,7 +42,10 @@ import ( type SLoadbalancerManager struct { SLoadbalancerLogSkipper + db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager + SVpcResourceBaseManager SZoneResourceBaseManager SNetworkResourceBaseManager @@ -76,11 +79,11 @@ type SLoadbalancer struct { db.SVirtualResourceBase db.SExternalizedResourceBase // LB must be in a VPC, vpc_id, manager_id, cloudregion_id - SVpcResourceBase + SVpcResourceBase `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional"` // zone_id SZoneResourceBase // optional network_id - SNetworkResourceBase + SNetworkResourceBase `width:"147" charset:"ascii" nullable:"true" list:"user" create:"optional"` SLoadbalancerRateLimiter @@ -126,6 +129,10 @@ func (man *SLoadbalancerManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = man.SVpcResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VpcFilterListInput) if err != nil { return nil, errors.Wrap(err, "SVpcResourceBaseManager.ListItemFilter") @@ -155,6 +162,22 @@ func (man *SLoadbalancerManager) ListItemFilter( return nil, err } + if len(query.Address) > 0 { + q = q.In("address", query.Address) + } + if len(query.AddressType) > 0 { + q = q.In("address_type", query.AddressType) + } + if len(query.NetworkType) > 0 { + q = q.In("network_type", query.NetworkType) + } + if len(query.ChargeType) > 0 { + q = q.In("charge_type", query.ChargeType) + } + if len(query.LoadbalancerSpec) > 0 { + q = q.In("loadbalancer_spec", query.LoadbalancerSpec) + } + return q, nil } diff --git a/pkg/compute/models/managedresource.go b/pkg/compute/models/managedresource.go index ad20161912..35f7850410 100644 --- a/pkg/compute/models/managedresource.go +++ b/pkg/compute/models/managedresource.go @@ -38,10 +38,19 @@ import ( type SManagedResourceBase struct { // 云订阅ID - ManagerId string `width:"128" charset:"ascii" nullable:"true" list:"admin" create:"optional" json:"manager_id"` + ManagerId string `width:"128" charset:"ascii" nullable:"true" list:"admin" create:"optional"` } -type SManagedResourceBaseManager struct{} +type SManagedResourceBaseManager struct { + managerIdFieldName string +} + +func (manager *SManagedResourceBaseManager) getManagerIdFileName() string { + if len(manager.managerIdFieldName) > 0 { + return manager.managerIdFieldName + } + return "manager_id" +} func (self *SManagedResourceBase) GetCloudprovider() *SCloudprovider { if len(self.ManagerId) > 0 { @@ -207,7 +216,7 @@ func (manager *SManagedResourceBaseManager) ListItemFilter( userCred mcclient.TokenCredential, query api.ManagedResourceListInput, ) (*sqlchemy.SQuery, error) { - return managedResourceFilterByAccount(q, query, "", nil) + return _managedResourceFilterByAccount(manager.getManagerIdFileName(), q, query, "", nil) } func (manager *SManagedResourceBaseManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { @@ -215,20 +224,20 @@ func (manager *SManagedResourceBaseManager) QueryDistinctExtraField(q *sqlchemy. case "manager": managerQuery := CloudproviderManager.Query("name", "id").SubQuery() q.AppendField(managerQuery.Field("name", field)).Distinct() - q = q.Join(managerQuery, sqlchemy.Equals(q.Field("manager_id"), managerQuery.Field("id"))) + q = q.Join(managerQuery, sqlchemy.Equals(q.Field(manager.getManagerIdFileName()), managerQuery.Field("id"))) return q, nil case "account": accountQuery := CloudaccountManager.Query("name", "id").SubQuery() providers := CloudproviderManager.Query("id", "cloudaccount_id").SubQuery() q.AppendField(accountQuery.Field("name", field)).Distinct() - q = q.Join(providers, sqlchemy.Equals(q.Field("manager_id"), providers.Field("id"))) + q = q.Join(providers, sqlchemy.Equals(q.Field(manager.getManagerIdFileName()), providers.Field("id"))) q = q.Join(accountQuery, sqlchemy.Equals(providers.Field("cloudaccount_id"), accountQuery.Field("id"))) return q, nil case "provider", "brand": accountQuery := CloudaccountManager.Query(field, "id").Distinct().SubQuery() providers := CloudproviderManager.Query("id", "cloudaccount_id").SubQuery() q.AppendField(accountQuery.Field(field)).Distinct() - q = q.Join(providers, sqlchemy.Equals(q.Field("manager_id"), providers.Field("id"))) + q = q.Join(providers, sqlchemy.Equals(q.Field(manager.getManagerIdFileName()), providers.Field("id"))) q = q.Join(accountQuery, sqlchemy.Equals(providers.Field("cloudaccount_id"), accountQuery.Field("id"))) return q, nil } @@ -269,7 +278,7 @@ func (manager *SManagedResourceBaseManager) GetOrderBySubQuery( accounts, sqlchemy.Equals(providers.Field("cloudaccount_id"), accounts.Field("id")), ).SubQuery() - q = q.LeftJoin(subq, sqlchemy.Equals(q.Field("manager_id"), subq.Field("id"))) + q = q.LeftJoin(subq, sqlchemy.Equals(q.Field(manager.getManagerIdFileName()), subq.Field("id"))) fields = []sqlchemy.IQueryField{ subq.Field("name"), subq.Field("account"), @@ -284,7 +293,7 @@ func (manager *SManagedResourceBaseManager) GetOrderByFields(query api.ManagedRe return []string{query.OrderByManager, query.OrderByAccount, query.OrderByProvider, query.OrderByBrand} } -func _managedResourceFilterByDomain(q *sqlchemy.SQuery, query apis.DomainizedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { +func _managedResourceFilterByDomain(managerIdFieldName string, q *sqlchemy.SQuery, query apis.DomainizedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { domainStr := query.ProjectDomain if len(domainStr) > 0 { domain, err := db.TenantCacheManager.FetchDomainByIdOrName(context.Background(), domainStr) @@ -311,12 +320,12 @@ func _managedResourceFilterByDomain(q *sqlchemy.SQuery, query apis.DomainizedRes )) if len(filterField) == 0 { q = q.Filter(sqlchemy.OR( - sqlchemy.IsNullOrEmpty(q.Field("manager_id")), - sqlchemy.In(q.Field("manager_id"), subq.SubQuery()), + sqlchemy.IsNullOrEmpty(q.Field(managerIdFieldName)), + sqlchemy.In(q.Field(managerIdFieldName), subq.SubQuery()), )) } else { sq := subqFunc() - sq = sq.Filter(sqlchemy.OR(sqlchemy.In(sq.Field("manager_id"), subq.SubQuery()), sqlchemy.IsNullOrEmpty(sq.Field("manager_id")))) + sq = sq.Filter(sqlchemy.OR(sqlchemy.In(sq.Field(managerIdFieldName), subq.SubQuery()), sqlchemy.IsNullOrEmpty(sq.Field(managerIdFieldName)))) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } } @@ -336,7 +345,7 @@ func splitProviders(providers []string) (bool, []string) { return oneCloud, others } -func filterByProviderStrs(q *sqlchemy.SQuery, filterField string, subqFunc func() *sqlchemy.SQuery, fieldName string, providerStrs []string) *sqlchemy.SQuery { +func _filterByProviderStrs(managerIdFieldName string, q *sqlchemy.SQuery, filterField string, subqFunc func() *sqlchemy.SQuery, fieldName string, providerStrs []string) *sqlchemy.SQuery { oneCloud, providers := splitProviders(providerStrs) sq := q if len(filterField) > 0 { @@ -351,10 +360,10 @@ func filterByProviderStrs(q *sqlchemy.SQuery, filterField string, subqFunc func( account.Field("id"), providers.Field("cloudaccount_id"), )) subq = subq.Filter(sqlchemy.In(account.Field(fieldName), providerStrs)) - filters = append(filters, sqlchemy.In(sq.Field("manager_id"), subq.SubQuery())) + filters = append(filters, sqlchemy.In(sq.Field(managerIdFieldName), subq.SubQuery())) } if oneCloud { - filters = append(filters, sqlchemy.IsNullOrEmpty(sq.Field("manager_id"))) + filters = append(filters, sqlchemy.IsNullOrEmpty(sq.Field(managerIdFieldName))) } if len(filters) == 1 { sq = sq.Filter(filters[0]) @@ -370,6 +379,10 @@ func filterByProviderStrs(q *sqlchemy.SQuery, filterField string, subqFunc func( } func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { + return _managedResourceFilterByAccount("manager_id", q, input, filterField, subqFunc) +} + +func _managedResourceFilterByAccount(managerIdFieldName string, q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) { cloudproviderStr := input.Cloudprovider if len(cloudproviderStr) > 0 { provider, err := CloudproviderManager.FetchByIdOrName(nil, cloudproviderStr) @@ -380,10 +393,10 @@ func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourc return nil, httperrors.NewGeneralError(err) } if len(filterField) == 0 { - q = q.Filter(sqlchemy.Equals(q.Field("manager_id"), provider.GetId())) + q = q.Filter(sqlchemy.Equals(q.Field(managerIdFieldName), provider.GetId())) } else { sq := subqFunc() - sq = sq.Filter(sqlchemy.Equals(sq.Field("manager_id"), provider.GetId())) + sq = sq.Filter(sqlchemy.Equals(sq.Field(managerIdFieldName), provider.GetId())) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } } @@ -399,25 +412,25 @@ func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourc } subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", account.GetId()).SubQuery() if len(filterField) == 0 { - q = q.Filter(sqlchemy.In(q.Field("manager_id"), subq)) + q = q.Filter(sqlchemy.In(q.Field(managerIdFieldName), subq)) } else { sq := subqFunc() - sq = sq.Filter(sqlchemy.In(sq.Field("manager_id"), subq)) + sq = sq.Filter(sqlchemy.In(sq.Field(managerIdFieldName), subq)) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } } if len(input.Providers) > 0 { - q = filterByProviderStrs(q, filterField, subqFunc, "provider", input.Providers) + q = _filterByProviderStrs(managerIdFieldName, q, filterField, subqFunc, "provider", input.Providers) } if len(input.Brands) > 0 { - q = filterByProviderStrs(q, filterField, subqFunc, "brand", input.Brands) + q = _filterByProviderStrs(managerIdFieldName, q, filterField, subqFunc, "brand", input.Brands) } - q = filterByCloudType(q, input, filterField, subqFunc) + q = _filterByCloudType(managerIdFieldName, q, input, filterField, subqFunc) - q, err := _managedResourceFilterByDomain(q, input.DomainizedResourceListInput, filterField, subqFunc) + q, err := _managedResourceFilterByDomain(managerIdFieldName, q, input.DomainizedResourceListInput, filterField, subqFunc) if err != nil { return nil, errors.Wrap(err, "managedResourceFilterByDomain") } @@ -493,40 +506,40 @@ func managedResourceFilterByRegion(q *sqlchemy.SQuery, query api.RegionalFilterL return q, nil } -func filterByCloudType(q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) *sqlchemy.SQuery { +func _filterByCloudType(managerIdFieldName string, q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) *sqlchemy.SQuery { cloudEnvStr := input.CloudEnv switch cloudEnvStr { case api.CLOUD_ENV_PUBLIC_CLOUD: if len(filterField) == 0 { - q = q.Filter(sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPublicProviderIdsQuery())) + q = q.Filter(sqlchemy.In(q.Field(managerIdFieldName), CloudproviderManager.GetPublicProviderIdsQuery())) } else { sq := subqFunc() - sq = sq.Filter(sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetPublicProviderIdsQuery())) + sq = sq.Filter(sqlchemy.In(sq.Field(managerIdFieldName), CloudproviderManager.GetPublicProviderIdsQuery())) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } case api.CLOUD_ENV_PRIVATE_CLOUD: if len(filterField) == 0 { - q = q.Filter(sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery())) + q = q.Filter(sqlchemy.In(q.Field(managerIdFieldName), CloudproviderManager.GetPrivateProviderIdsQuery())) } else { sq := subqFunc() - sq = sq.Filter(sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery())) + sq = sq.Filter(sqlchemy.In(sq.Field(managerIdFieldName), CloudproviderManager.GetPrivateProviderIdsQuery())) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } case api.CLOUD_ENV_ON_PREMISE: if len(filterField) == 0 { q = q.Filter( sqlchemy.OR( - sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetOnPremiseProviderIdsQuery()), - sqlchemy.IsNullOrEmpty(q.Field("manager_id")), + sqlchemy.In(q.Field(managerIdFieldName), CloudproviderManager.GetOnPremiseProviderIdsQuery()), + sqlchemy.IsNullOrEmpty(q.Field(managerIdFieldName)), ), ) } else { sq := subqFunc() sq = sq.Filter( sqlchemy.OR( - sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetOnPremiseProviderIdsQuery()), - sqlchemy.IsNullOrEmpty(sq.Field("manager_id")), + sqlchemy.In(sq.Field(managerIdFieldName), CloudproviderManager.GetOnPremiseProviderIdsQuery()), + sqlchemy.IsNullOrEmpty(sq.Field(managerIdFieldName)), ), ) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) @@ -535,16 +548,16 @@ func filterByCloudType(q *sqlchemy.SQuery, input api.ManagedResourceListInput, f if len(filterField) == 0 { q = q.Filter( sqlchemy.OR( - sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPrivateOrOnPremiseProviderIdsQuery()), - sqlchemy.IsNullOrEmpty(q.Field("manager_id")), + sqlchemy.In(q.Field(managerIdFieldName), CloudproviderManager.GetPrivateOrOnPremiseProviderIdsQuery()), + sqlchemy.IsNullOrEmpty(q.Field(managerIdFieldName)), ), ) } else { sq := subqFunc() sq = sq.Filter( sqlchemy.OR( - sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetPrivateOrOnPremiseProviderIdsQuery()), - sqlchemy.IsNullOrEmpty(sq.Field("manager_id")), + sqlchemy.In(sq.Field(managerIdFieldName), CloudproviderManager.GetPrivateOrOnPremiseProviderIdsQuery()), + sqlchemy.IsNullOrEmpty(sq.Field(managerIdFieldName)), ), ) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) @@ -553,10 +566,10 @@ func filterByCloudType(q *sqlchemy.SQuery, input api.ManagedResourceListInput, f if input.IsManaged { if len(filterField) == 0 { - q = q.Filter(sqlchemy.IsNotEmpty(q.Field("manager_id"))) + q = q.Filter(sqlchemy.IsNotEmpty(q.Field(managerIdFieldName))) } else { sq := subqFunc() - sq = sq.Filter(sqlchemy.IsNotEmpty(sq.Field("manager_id"))) + sq = sq.Filter(sqlchemy.IsNotEmpty(sq.Field(managerIdFieldName))) q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery())) } } diff --git a/pkg/compute/models/natdtable.go b/pkg/compute/models/natdtable.go index 51ae030592..482f0327e6 100644 --- a/pkg/compute/models/natdtable.go +++ b/pkg/compute/models/natdtable.go @@ -75,6 +75,23 @@ func (man *SNatDEntryManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SNatEntryManager.ListItemFilter") } + + if len(query.ExternalIP) > 0 { + q = q.In("external_ip", query.ExternalIP) + } + if len(query.ExternalPort) > 0 { + q = q.In("external_port", query.ExternalPort) + } + if len(query.InternalIP) > 0 { + q = q.In("internal_ip", query.InternalIP) + } + if len(query.InternalPort) > 0 { + q = q.In("internal_port", query.InternalPort) + } + if len(query.IpProtocol) > 0 { + q = q.In("ip_protocol", query.IpProtocol) + } + return q, nil } diff --git a/pkg/compute/models/natgateways.go b/pkg/compute/models/natgateways.go index 678d11498b..d5fef34659 100644 --- a/pkg/compute/models/natgateways.go +++ b/pkg/compute/models/natgateways.go @@ -37,6 +37,7 @@ import ( type SNatGatewayManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SVpcResourceBaseManager // SManagedResourceBaseManager } @@ -72,11 +73,20 @@ func (manager *SNatGatewayManager) GetContextManagers() [][]db.IModelManager { } // NAT网关列表 -func (man *SNatGatewayManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.NatGetewayListInput) (*sqlchemy.SQuery, error) { +func (man *SNatGatewayManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.NatGetewayListInput, +) (*sqlchemy.SQuery, error) { q, err := man.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusStandaloneResourceListInput) if err != nil { return nil, errors.Wrap(err, "SStatusDomainLevelResourceBaseManager.ListItemFilter") } + q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = man.SVpcResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VpcFilterListInput) if err != nil { return nil, errors.Wrap(err, "SVpcResourceBaseManager.ListItemFilter") @@ -532,6 +542,7 @@ type INatHelper interface { type SNatEntryManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SNatgatewayResourceBaseManager } @@ -545,7 +556,7 @@ type SNatEntry struct { db.SStatusStandaloneResourceBase db.SExternalizedResourceBase - SNatgatewayResourceBase + SNatgatewayResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` // NatgatewayId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` } @@ -566,7 +577,10 @@ func (man *SNatEntryManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } - + q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = man.SNatgatewayResourceBaseManager.ListItemFilter(ctx, q, userCred, query.NatGatewayFilterListInput) if err != nil { return nil, errors.Wrap(err, "SNatgatewayResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/natstable.go b/pkg/compute/models/natstable.go index 7df4a3c426..c5a7183319 100644 --- a/pkg/compute/models/natstable.go +++ b/pkg/compute/models/natstable.go @@ -92,6 +92,14 @@ func (man *SNatSEntryManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SNetworkResourceBaseManager.ListItemFilter") } + + if len(query.IP) > 0 { + q = q.In("ip", query.IP) + } + if len(query.SourceCIDR) > 0 { + q = q.In("source_cidr", query.SourceCIDR) + } + return q, nil } diff --git a/pkg/compute/models/networkinterfaces.go b/pkg/compute/models/networkinterfaces.go index cb637046ad..c84add775b 100644 --- a/pkg/compute/models/networkinterfaces.go +++ b/pkg/compute/models/networkinterfaces.go @@ -34,6 +34,7 @@ import ( type SNetworkInterfaceManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SManagedResourceBaseManager SCloudregionResourceBaseManager } @@ -85,6 +86,10 @@ func (manager *SNetworkInterfaceManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") @@ -94,6 +99,16 @@ func (manager *SNetworkInterfaceManager) ListItemFilter( return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter") } + if len(query.Mac) > 0 { + q = q.In("mac", query.Mac) + } + if len(query.AssociateType) > 0 { + q = q.In("associate_type", query.AssociateType) + } + if len(query.AssociateId) > 0 { + q = q.In("associate_id", query.AssociateId) + } + return q, nil } diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index d908d73c91..d4ecb721ff 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -58,6 +58,7 @@ var ( type SNetworkManager struct { db.SSharableVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SWireResourceBaseManager } @@ -1655,7 +1656,10 @@ func (manager *SNetworkManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter") } - + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SWireResourceBaseManager.ListItemFilter(ctx, q, userCred, input.WireFilterListInput) if err != nil { return nil, errors.Wrap(err, "SWireResourceBaseManager.ListItemFilter") @@ -1730,6 +1734,58 @@ func (manager *SNetworkManager) ListItemFilter( q = q.Filter(ipCondtion) } + if len(input.IfnameHint) > 0 { + q = q.In("ifname_hint", input.IfnameHint) + } + if len(input.GuestIpStart) > 0 { + q = q.In("guest_ip_start", input.GuestIpStart) + } + if len(input.GuestIpEnd) > 0 { + q = q.In("guest_ip_end", input.GuestIpEnd) + } + if len(input.GuestIpMask) > 0 { + q = q.In("guest_ip_mask", input.GuestIpMask) + } + if len(input.GuestGateway) > 0 { + q = q.In("guest_gateway", input.GuestGateway) + } + if len(input.GuestDns) > 0 { + q = q.In("guest_dns", input.GuestDns) + } + if len(input.GuestDhcp) > 0 { + q = q.In("guest_dhcp", input.GuestDhcp) + } + if len(input.GuestDomain) > 0 { + q = q.In("guest_domain", input.GuestDomain) + } + if len(input.GuestIp6Start) > 0 { + q = q.In("guest_ip6_start", input.GuestIp6Start) + } + if len(input.GuestIp6End) > 0 { + q = q.In("guest_ip6_end", input.GuestIp6End) + } + if len(input.GuestIp6Mask) > 0 { + q = q.In("guest_ip6_mask", input.GuestIp6Mask) + } + if len(input.GuestGateway6) > 0 { + q = q.In("guest_gateway6", input.GuestGateway6) + } + if len(input.GuestDns6) > 0 { + q = q.In("guest_dns6", input.GuestDns6) + } + if len(input.GuestDomain6) > 0 { + q = q.In("guest_domain6", input.GuestDomain6) + } + if len(input.VlanId) > 0 { + q = q.In("vlan_id", input.VlanId) + } + if len(input.ServerType) > 0 { + q = q.In("server_type", input.ServerType) + } + if len(input.AllocPolicy) > 0 { + q = q.In("alloc_policy", input.AllocPolicy) + } + return q, nil } diff --git a/pkg/compute/models/networkschedtags.go b/pkg/compute/models/networkschedtags.go index 83c153bf18..11f9e721a2 100644 --- a/pkg/compute/models/networkschedtags.go +++ b/pkg/compute/models/networkschedtags.go @@ -19,6 +19,8 @@ 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/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -28,6 +30,7 @@ import ( type SNetworkschedtagManager struct { *SSchedtagJointsManager + SNetworkResourceBaseManager } var NetworkschedtagManager *SNetworkschedtagManager @@ -122,3 +125,43 @@ func (s *SNetworkschedtag) Delete(ctx context.Context, userCred mcclient.TokenCr func (s *SNetworkschedtag) Detach(ctx context.Context, userCred mcclient.TokenCredential) error { return s.SSchedtagJointsBase.detach(s, ctx, userCred) } + +func (manager *SNetworkschedtagManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.NetworkschedtagListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SSchedtagJointsManager.ListItemFilter(ctx, q, userCred, query.SchedtagJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SSchedtagJointsManager.ListItemFilter") + } + q, err = manager.SNetworkResourceBaseManager.ListItemFilter(ctx, q, userCred, query.NetworkFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SNetworkResourceBaseManager.ListItemFilter") + } + + return q, nil +} + +func (manager *SNetworkschedtagManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.NetworkschedtagListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SSchedtagJointsManager.OrderByExtraFields(ctx, q, userCred, query.SchedtagJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SSchedtagJointsManager.OrderByExtraFields") + } + q, err = manager.SNetworkResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.NetworkFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SNetworkResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} diff --git a/pkg/compute/models/reservedips.go b/pkg/compute/models/reservedips.go index 859c620087..22bd7a2813 100644 --- a/pkg/compute/models/reservedips.go +++ b/pkg/compute/models/reservedips.go @@ -53,7 +53,7 @@ func init() { type SReservedip struct { db.SResourceBase - SNetworkResourceBase + SNetworkResourceBase `width:"36" charset:"ascii" nullable:"false" list:"admin"` // 自增Id Id int64 `primary:"true" auto_increment:"true" list:"admin"` @@ -248,6 +248,13 @@ func (manager *SReservedipManager) ListItemFilter( )) } + if len(query.IpAddr) > 0 { + q = q.In("ip_addr", query.IpAddr) + } + if len(query.Status) > 0 { + q = q.In("status", query.Status) + } + return q, nil } diff --git a/pkg/compute/models/routetables.go b/pkg/compute/models/routetables.go index 5b46e0e7c5..34574b4e25 100644 --- a/pkg/compute/models/routetables.go +++ b/pkg/compute/models/routetables.go @@ -97,6 +97,7 @@ func (routes *SRoutes) Validate(data *jsonutils.JSONDict) error { type SRouteTableManager struct { db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SVpcResourceBaseManager } @@ -140,11 +141,20 @@ func (man *SRouteTableManager) ListItemFilter( return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = man.SVpcResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VpcFilterListInput) if err != nil { return nil, errors.Wrap(err, "SVpcResourceBaseManager.ListItemFilter") } + if len(query.Type) > 0 { + q = q.In("type", query.Type) + } + return q, nil } diff --git a/pkg/compute/models/schedpolicies.go b/pkg/compute/models/schedpolicies.go index 327cad181c..3eeecbd66f 100644 --- a/pkg/compute/models/schedpolicies.go +++ b/pkg/compute/models/schedpolicies.go @@ -323,6 +323,17 @@ func (manager *SSchedpolicyManager) ListItemFilter( return nil, errors.Wrap(err, "SSchedtagResourceBaseManager.ListItemFilter") } + if len(input.Strategy) > 0 { + q = q.In("strategy", input.Strategy) + } + if input.Enabled != nil { + if *input.Enabled { + q = q.IsTrue("enabled") + } else { + q = q.IsFalse("enabled") + } + } + return q, nil } diff --git a/pkg/compute/models/schedtags.go b/pkg/compute/models/schedtags.go index 36df25fecd..e4144b3f94 100644 --- a/pkg/compute/models/schedtags.go +++ b/pkg/compute/models/schedtags.go @@ -146,9 +146,19 @@ func (manager *SSchedtagManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SScopedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ScopedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SScopedResourceBaseManager.ListItemFilter") + } + if resType := query.ResourceType; resType != "" { q = q.Equals("resource_type", resType) } + + if len(query.DefaultStrategy) > 0 { + q = q.In("default_strategy", query.DefaultStrategy) + } + return q, nil } @@ -164,6 +174,10 @@ func (manager *SSchedtagManager) OrderByExtraFields( if err != nil { return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.OrderByExtraFields") } + q, err = manager.SScopedResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.ScopedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SScopedResourceBaseManager.OrderByExtraFields") + } return q, nil } @@ -175,6 +189,10 @@ func (manager *SSchedtagManager) QueryDistinctExtraField(q *sqlchemy.SQuery, fie if err == nil { return q, nil } + q, err = manager.SScopedResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } return q, httperrors.ErrNotFound } @@ -393,10 +411,11 @@ func (manager *SSchedtagManager) FetchCustomizeColumns( rows := make([]api.SchedtagDetails, len(objs)) stdRows := manager.SStandaloneResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) - + scopedRows := manager.SScopedResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) for i := range rows { rows[i] = api.SchedtagDetails{ StandaloneResourceDetails: stdRows[i], + ScopedResourceBaseInfo: scopedRows[i], } rows[i] = objs[i].(*SSchedtag).getMoreColumns(rows[i]) } diff --git a/pkg/compute/models/secgroupcache.go b/pkg/compute/models/secgroupcache.go index faf7187c4d..50cf5d00a7 100644 --- a/pkg/compute/models/secgroupcache.go +++ b/pkg/compute/models/secgroupcache.go @@ -37,8 +37,11 @@ import ( type SSecurityGroupCacheManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SManagedResourceBaseManager SCloudregionResourceBaseManager + SVpcResourceBaseManager + SSecurityGroupResourceBaseManager } type SSecurityGroupCache struct { @@ -46,9 +49,11 @@ type SSecurityGroupCache struct { db.SExternalizedResourceBase SCloudregionResourceBase SManagedResourceBase + SSecurityGroupResourceBase // 安全组Id - SecgroupId string `width:"128" charset:"ascii" list:"user" create:"required"` + // SecgroupId string `width:"128" charset:"ascii" list:"user" create:"required"` + // 虚拟私有网络外部Id VpcId string `width:"128" charset:"ascii" list:"user" create:"required"` } @@ -90,6 +95,10 @@ func (manager *SSecurityGroupCacheManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") @@ -98,8 +107,16 @@ func (manager *SSecurityGroupCacheManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter") } + q, err = manager.SVpcResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VpcFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SVpcResourceBaseManager.ListItemFilter") + } + q, err = manager.SSecurityGroupResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SecgroupFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSecurityGroupResourceBaseManager.ListItemFilter") + } - if defsecgroup := query.Secgroup; len(defsecgroup) > 0 { + /*if defsecgroup := query.Secgroup; len(defsecgroup) > 0 { secgroup, err := SecurityGroupManager.FetchByIdOrName(userCred, defsecgroup) if err != nil { if err == sql.ErrNoRows { @@ -109,7 +126,8 @@ func (manager *SSecurityGroupCacheManager) ListItemFilter( } } q = q.Equals("secgroup_id", secgroup.GetId()) - } + }*/ + return q, nil } @@ -133,6 +151,10 @@ func (manager *SSecurityGroupCacheManager) OrderByExtraFields( if err != nil { return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.OrderByExtraFields") } + q, err = manager.SSecurityGroupResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.SecgroupFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSecurityGroupResourceBaseManager.OrderByExtraFields") + } return q, nil } @@ -140,6 +162,10 @@ func (manager *SSecurityGroupCacheManager) OrderByExtraFields( func (manager *SSecurityGroupCacheManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { var err error + q, err = manager.SSecurityGroupResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } q, err = manager.SStatusStandaloneResourceBaseManager.QueryDistinctExtraField(q, field) if err == nil { return q, nil @@ -252,10 +278,9 @@ func (manager *SSecurityGroupCacheManager) NewCache(ctx context.Context, userCre return nil, errors.Wrapf(err, "SecurityGroupManager.FetchById(%s)", secgroupId) } - secgroupCache := &SSecurityGroupCache{ - SecgroupId: secgroupId, - VpcId: vpcId, - } + secgroupCache := &SSecurityGroupCache{} + secgroupCache.SecgroupId = secgroupId + secgroupCache.VpcId = vpcId secgroupCache.ManagerId = providerId secgroupCache.Status = api.SECGROUP_CACHE_STATUS_CACHING secgroupCache.CloudregionId = regionId diff --git a/pkg/compute/models/secgroupresource.go b/pkg/compute/models/secgroupresource.go new file mode 100644 index 0000000000..de69dc15a1 --- /dev/null +++ b/pkg/compute/models/secgroupresource.go @@ -0,0 +1,154 @@ +// 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" + "database/sql" + + "yunion.io/x/jsonutils" + "yunion.io/x/log" + "yunion.io/x/pkg/errors" + "yunion.io/x/pkg/util/reflectutils" + "yunion.io/x/sqlchemy" + + api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/httperrors" + "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/stringutils2" +) + +type SSecurityGroupResourceBase struct { + // 本地安全组ID + SecgroupId string `width:"36" charset:"ascii" nullable:"false" create:"required" index:"true" list:"user" json:"secgroup_id"` +} + +type SSecurityGroupResourceBaseManager struct{} + +func (self *SSecurityGroupResourceBase) GetSecGroup() *SSecurityGroup { + secgrp, err := SecurityGroupManager.FetchById(self.SecgroupId) + if err != nil { + log.Errorf("failed to find secgroup %s error: %v", self.SecgroupId, err) + return nil + } + return secgrp.(*SSecurityGroup) +} + +func (self *SSecurityGroupResourceBaseManager) GetExtraDetails( + ctx context.Context, + userCred mcclient.TokenCredential, + query jsonutils.JSONObject, + isList bool, +) api.SecurityGroupResourceInfo { + return api.SecurityGroupResourceInfo{} +} + +func (manager *SSecurityGroupResourceBaseManager) FetchCustomizeColumns( + ctx context.Context, + userCred mcclient.TokenCredential, + query jsonutils.JSONObject, + objs []interface{}, + fields stringutils2.SSortedStrings, + isList bool, +) []api.SecurityGroupResourceInfo { + rows := make([]api.SecurityGroupResourceInfo, len(objs)) + secgrpIds := make([]string, len(objs)) + for i := range objs { + var base *SSecurityGroupResourceBase + err := reflectutils.FindAnonymouStructPointer(objs[i], &base) + if err != nil { + log.Errorf("Cannot find SSecurityGroupResourceBase in object %s", objs[i]) + continue + } + secgrpIds[i] = base.SecgroupId + } + secgrpNames, err := db.FetchIdNameMap2(SecurityGroupManager, secgrpIds) + if err != nil { + log.Errorf("FetchIdNameMap2 fail %s", err) + return rows + } + for i := range rows { + if name, ok := secgrpNames[secgrpIds[i]]; ok { + rows[i].Secgroup = name + } + } + return rows +} + +func (manager *SSecurityGroupResourceBaseManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SecgroupFilterListInput, +) (*sqlchemy.SQuery, error) { + if len(query.Secgroup) > 0 { + secgrpObj, err := SecurityGroupManager.FetchByIdOrName(userCred, query.Secgroup) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(SecurityGroupManager.Keyword(), query.Secgroup) + } else { + return nil, errors.Wrap(err, "SecurityGroupManager.FetchByIdOrName") + } + } + q = q.Equals("secgroup", secgrpObj.GetId()) + } + return q, nil +} + +func (manager *SSecurityGroupResourceBaseManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SecgroupFilterListInput, +) (*sqlchemy.SQuery, error) { + q, orders, fields := manager.GetOrderBySubQuery(q, userCred, query) + if len(orders) > 0 { + q = db.OrderByFields(q, orders, fields) + } + return q, nil +} + +func (manager *SSecurityGroupResourceBaseManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { + if field == "secgroup" { + secgrpQuery := SecurityGroupManager.Query("name", "id").Distinct().SubQuery() + q.AppendField(secgrpQuery.Field("name", field)) + q = q.Join(secgrpQuery, sqlchemy.Equals(q.Field("secgroup_id"), secgrpQuery.Field("id"))) + q.GroupBy(secgrpQuery.Field("name")) + return q, nil + } + return q, httperrors.ErrNotFound +} + +func (manager *SSecurityGroupResourceBaseManager) GetOrderBySubQuery( + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SecgroupFilterListInput, +) (*sqlchemy.SQuery, []string, []sqlchemy.IQueryField) { + secgrpQ := SecurityGroupManager.Query("id", "name") + var orders []string + var fields []sqlchemy.IQueryField + if db.NeedOrderQuery(manager.GetOrderByFields(query)) { + subq := secgrpQ.SubQuery() + q = q.LeftJoin(subq, sqlchemy.Equals(q.Field("secgroup_id"), subq.Field("id"))) + orders = append(orders, query.OrderBySecgroup) + fields = append(fields, subq.Field("name")) + } + return q, orders, fields +} + +func (manager *SSecurityGroupResourceBaseManager) GetOrderByFields(query api.SecgroupFilterListInput) []string { + return []string{query.OrderBySecgroup} +} diff --git a/pkg/compute/models/secgrouprules.go b/pkg/compute/models/secgrouprules.go index 83041d5c8d..cbfc8a913e 100644 --- a/pkg/compute/models/secgrouprules.go +++ b/pkg/compute/models/secgrouprules.go @@ -40,6 +40,7 @@ import ( type SSecurityGroupRuleManager struct { db.SResourceBaseManager + SSecurityGroupResourceBaseManager } var SecurityGroupRuleManager *SSecurityGroupRuleManager @@ -58,6 +59,8 @@ func init() { type SSecurityGroupRule struct { db.SResourceBase + SSecurityGroupResourceBase `create:"required"` + Id string `width:"128" charset:"ascii" primary:"true" list:"user"` Priority int64 `default:"1" list:"user" update:"user" list:"user"` Protocol string `width:"5" charset:"ascii" nullable:"false" list:"user" update:"user" create:"required"` @@ -66,7 +69,7 @@ type SSecurityGroupRule struct { CIDR string `width:"256" charset:"ascii" list:"user" update:"user" create:"required"` Action string `width:"5" charset:"ascii" nullable:"false" list:"user" update:"user" create:"required"` Description string `width:"256" charset:"utf8" list:"user" update:"user" create:"optional"` - SecgroupID string `width:"128" charset:"ascii" create:"required"` + // SecgroupID string `width:"128" charset:"ascii" create:"required"` } func (self *SSecurityGroupRule) GetId() string { @@ -147,12 +150,12 @@ func (self *SSecurityGroupRule) AllowDeleteItem(ctx context.Context, userCred mc return false } -func (self *SSecurityGroupRule) GetSecGroup() *SSecurityGroup { - if secgroup, _ := SecurityGroupManager.FetchById(self.SecgroupID); secgroup != nil { +/*func (self *SSecurityGroupRule) GetSecGroup() *SSecurityGroup { + if secgroup, _ := SecurityGroupManager.FetchById(self.SecgroupI); secgroup != nil { return secgroup.(*SSecurityGroup) } return nil -} +}*/ func (manager *SSecurityGroupRuleManager) FilterById(q *sqlchemy.SQuery, idStr string) *sqlchemy.SQuery { return q.Equals("id", idStr) @@ -169,13 +172,17 @@ func (manager *SSecurityGroupRuleManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SResourceBaseManager.ListItemFilter") } - if defsecgroup := query.Secgroup; len(defsecgroup) > 0 { + sql, err = manager.SSecurityGroupResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SecgroupFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSecurityGroupResourceBaseManager.ListItemFilter") + } + /*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) } - } + }*/ if len(query.Direction) > 0 { sql = sql.Equals("direction", query.Direction) } @@ -200,6 +207,10 @@ func (manager *SSecurityGroupRuleManager) OrderByExtraFields( if err != nil { return nil, errors.Wrap(err, "SResourceBaseManager.OrderByExtraFields") } + q, err = manager.SSecurityGroupResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.SecgroupFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSecurityGroupResourceBaseManager.OrderByExtraFields") + } return q, nil } @@ -211,6 +222,10 @@ func (manager *SSecurityGroupRuleManager) QueryDistinctExtraField(q *sqlchemy.SQ if err == nil { return q, nil } + q, err = manager.SSecurityGroupResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } return q, httperrors.ErrNotFound } @@ -414,8 +429,8 @@ func (manager *SSecurityGroupRuleManager) newFromCloudSecurityGroup(ctx context. CIDR: cidr, Action: string(rule.Action), Description: rule.Description, - SecgroupID: secgroup.Id, } + secrule.SecgroupId = secgroup.Id err := manager.TableSpec().Insert(secrule) if err != nil { diff --git a/pkg/compute/models/secgroups.go b/pkg/compute/models/secgroups.go index b144d027ff..293e962bfd 100644 --- a/pkg/compute/models/secgroups.go +++ b/pkg/compute/models/secgroups.go @@ -148,6 +148,14 @@ func (manager *SSecurityGroupManager) ListItemFilter( q = q.Filter(sqlchemy.OR(filters...)) } + if input.IsDirty != nil { + if *input.IsDirty { + q = q.IsTrue("is_dirty") + } else { + q = q.IsFalse("is_dirty") + } + } + return q, nil } @@ -340,8 +348,8 @@ func (self *SSecurityGroup) PostCreate(ctx context.Context, userCred mcclient.To CIDR: r.CIDR, Action: r.Action, Description: r.Description, - SecgroupID: self.Id, } + rule.SecgroupId = self.Id SecurityGroupRuleManager.TableSpec().Insert(rule) } @@ -466,7 +474,8 @@ func (self *SSecurityGroup) AllowPerformAddRule(ctx context.Context, userCred mc } func (self *SSecurityGroup) PerformAddRule(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { - secgrouprule := &SSecurityGroupRule{SecgroupID: self.Id} + secgrouprule := &SSecurityGroupRule{} + secgrouprule.SecgroupId = self.Id secgrouprule.SetModelManager(SecurityGroupRuleManager, secgrouprule) if err := data.Unmarshal(secgrouprule); err != nil { return nil, err @@ -544,7 +553,7 @@ func (self *SSecurityGroup) PerformClone(ctx context.Context, userCred mcclient. secgrouprule.CIDR = rule.CIDR secgrouprule.Action = rule.Action secgrouprule.Description = rule.Description - secgrouprule.SecgroupID = secgroup.Id + secgrouprule.SecgroupId = secgroup.Id if err := SecurityGroupRuleManager.TableSpec().Insert(secgrouprule); err != nil { return nil, err } @@ -826,7 +835,7 @@ func (manager *SSecurityGroupManager) InitializeData() error { defRule.Priority = 1 defRule.CIDR = "0.0.0.0/0" defRule.Action = string(secrules.SecurityRuleAllow) - defRule.SecgroupID = "default" + defRule.SecgroupId = "default" err = SecurityGroupRuleManager.TableSpec().Insert(&defRule) if err != nil { log.Errorf("Insert default secgroup rule fail %s", err) diff --git a/pkg/compute/models/service_catalog.go b/pkg/compute/models/service_catalog.go index 533fa4016c..1d5a63040e 100644 --- a/pkg/compute/models/service_catalog.go +++ b/pkg/compute/models/service_catalog.go @@ -181,6 +181,17 @@ func (manager *SServiceCatalogManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter") } + if len(input.GuestTemplate) > 0 { + gtObj, err := GuestTemplateManager.FetchByIdOrName(userCred, input.GuestTemplate) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(GuestTemplateManager.Keyword(), input.GuestTemplate) + } else { + return nil, errors.Wrap(err, "GuestTemplateManager.FetchByIdOrName") + } + } + q = q.Equals("guest_template_id", gtObj.GetId()) + } return q, nil } diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index bf9a6ca749..9ff3dbd5eb 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -818,8 +818,11 @@ func (manager *SServerSkuManager) ListItemFilter( memSizeMB := query.MemorySizeMb if memSizeMB > 0 { s, e := intervalMem(int(memSizeMB)) - q.GT("memory_size_mb", s) - q.LE("memory_size_mb", e) + q = q.GT("memory_size_mb", s) + q = q.LE("memory_size_mb", e) + } + if len(query.CpuCoreCount) > 0 { + q = q.In("cpu_core_count", query.CpuCoreCount) } return q, err diff --git a/pkg/compute/models/snapshotpolicy.go b/pkg/compute/models/snapshotpolicy.go index 7bdf9858ed..41ca07839e 100644 --- a/pkg/compute/models/snapshotpolicy.go +++ b/pkg/compute/models/snapshotpolicy.go @@ -863,6 +863,13 @@ func (manager *SSnapshotPolicyManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } + if input.IsActivated != nil { + if *input.IsActivated { + q = q.IsTrue("is_activated") + } else { + q = q.IsFalse("is_activated") + } + } return q, nil } diff --git a/pkg/compute/models/snapshotpolicycache.go b/pkg/compute/models/snapshotpolicycache.go index 04034ae1ee..0b7e25f9bc 100644 --- a/pkg/compute/models/snapshotpolicycache.go +++ b/pkg/compute/models/snapshotpolicycache.go @@ -16,7 +16,6 @@ package models import ( "context" - "database/sql" "fmt" "strings" "time" @@ -38,8 +37,10 @@ import ( type SSnapshotPolicyCacheManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SCloudregionResourceBaseManager SManagedResourceBaseManager + SSnapshotPolicyResourceBaseManager } type SSnapshotPolicyCache struct { @@ -47,8 +48,8 @@ type SSnapshotPolicyCache struct { db.SExternalizedResourceBase SCloudregionResourceBase SManagedResourceBase - - SnapshotpolicyId string `width:"128" charset:"ascii" create:"required"` + SSnapshotPolicyResourceBase `width:"128" charset:"ascii" create:"required"` + // SnapshotpolicyId string `width:"128" charset:"ascii" create:"required"` } var SnapshotPolicyCacheManager *SSnapshotPolicyCacheManager @@ -67,10 +68,11 @@ func init() { func NewSSnapshotPolicyCache(snapshotpolicyId, cloudregionId, externalId string) *SSnapshotPolicyCache { cache := SSnapshotPolicyCache{ - SnapshotpolicyId: snapshotpolicyId, + // SnapshotpolicyId: snapshotpolicyId, SCloudregionResourceBase: SCloudregionResourceBase{cloudregionId}, SExternalizedResourceBase: db.SExternalizedResourceBase{externalId}, } + cache.SnapshotpolicyId = snapshotpolicyId cache.SetModelManager(SnapshotPolicyCacheManager, &cache) return &cache } @@ -89,6 +91,11 @@ func (spcm *SSnapshotPolicyCacheManager) ListItemFilter( return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = spcm.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = spcm.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") @@ -99,7 +106,11 @@ func (spcm *SSnapshotPolicyCacheManager) ListItemFilter( return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter") } - if snapshotpolicyIden := query.Snapshotpolicy; len(snapshotpolicyIden) > 0 { + q, err = spcm.SSnapshotPolicyResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SnapshotPolicyFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSnapshotPolicyResourceBaseManager.ListItemFilter") + } + /*if snapshotpolicyIden := query.Snapshotpolicy; len(snapshotpolicyIden) > 0 { snapshotpolicy, err := SnapshotPolicyManager.FetchByIdOrName(userCred, snapshotpolicyIden) if err != nil { if errors.Cause(err) == sql.ErrNoRows { @@ -109,7 +120,7 @@ func (spcm *SSnapshotPolicyCacheManager) ListItemFilter( } } q = q.Equals("snapshotpolicy_id", snapshotpolicy.GetId()) - } + }*/ return q, nil } @@ -133,6 +144,10 @@ func (spcm *SSnapshotPolicyCacheManager) OrderByExtraFields( if err != nil { return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.OrderByExtraFields") } + q, err = spcm.SSnapshotPolicyResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.SnapshotPolicyFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSnapshotPolicyResourceBaseManager.OrderByExtraFields") + } return q, nil } @@ -152,6 +167,10 @@ func (spcm *SSnapshotPolicyCacheManager) QueryDistinctExtraField(q *sqlchemy.SQu if err == nil { return q, nil } + q, err = spcm.SSnapshotPolicyResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } return q, httperrors.ErrNotFound } @@ -189,12 +208,13 @@ func (spcm *SSnapshotPolicyCacheManager) FetchCustomizeColumns( stdRows := spcm.SStatusStandaloneResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) manRows := spcm.SManagedResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) regionRows := spcm.SCloudregionResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) - + snapshotPolicyRows := spcm.SSnapshotPolicyResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) for i := range rows { rows[i] = api.SnapshotPolicyCacheDetails{ StatusStandaloneResourceDetails: stdRows[i], ManagedResourceInfo: manRows[i], CloudregionResourceInfo: regionRows[i], + SnapshotPolicyResourceInfo: snapshotPolicyRows[i], } } diff --git a/pkg/compute/models/snapshotpolicydisks.go b/pkg/compute/models/snapshotpolicydisks.go index fae8d60aed..90c3307053 100644 --- a/pkg/compute/models/snapshotpolicydisks.go +++ b/pkg/compute/models/snapshotpolicydisks.go @@ -26,7 +26,7 @@ import ( "yunion.io/x/pkg/errors" "yunion.io/x/sqlchemy" - "yunion.io/x/onecloud/pkg/apis/compute" + 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/db/taskman" @@ -37,6 +37,8 @@ import ( type SSnapshotPolicyDiskManager struct { db.SVirtualJointResourceBaseManager + SSnapshotPolicyResourceBaseManager + SDiskResourceBaseManager } func (m *SSnapshotPolicyDiskManager) GetMasterFieldName() string { @@ -69,9 +71,11 @@ func init() { type SSnapshotPolicyDisk struct { db.SVirtualJointResourceBase - SnapshotpolicyId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` - DiskId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` - Status string `width:"36" charset:"ascii" nullable:"false" default:"init" list:"user" create:"optional"` + SSnapshotPolicyResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` + SDiskResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` + // SnapshotpolicyId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` + // DiskId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required" index:"true"` + Status string `width:"36" charset:"ascii" nullable:"false" default:"init" list:"user" create:"optional"` } func (sd *SSnapshotPolicyDisk) SetStatus(userCred mcclient.TokenCredential, status string, reason string) error { @@ -101,8 +105,8 @@ func (self *SSnapshotPolicyDisk) GetExtraDetails( userCred mcclient.TokenCredential, query jsonutils.JSONObject, isList bool, -) (compute.SnapshotPolicyDiskDetails, error) { - return compute.SnapshotPolicyDiskDetails{}, nil +) (api.SnapshotPolicyDiskDetails, error) { + return api.SnapshotPolicyDiskDetails{}, nil } func (manager *SSnapshotPolicyDiskManager) FetchCustomizeColumns( @@ -112,15 +116,15 @@ func (manager *SSnapshotPolicyDiskManager) FetchCustomizeColumns( objs []interface{}, fields stringutils2.SSortedStrings, isList bool, -) []compute.SnapshotPolicyDiskDetails { - rows := make([]compute.SnapshotPolicyDiskDetails, len(objs)) +) []api.SnapshotPolicyDiskDetails { + rows := make([]api.SnapshotPolicyDiskDetails, len(objs)) virtRows := manager.SVirtualJointResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) snapIds := make([]string, len(rows)) diskIds := make([]string, len(rows)) for i := range rows { - rows[i] = compute.SnapshotPolicyDiskDetails{ + rows[i] = api.SnapshotPolicyDiskDetails{ VirtualJointResourceBaseDetails: virtRows[i], } snapIds[i] = objs[i].(*SSnapshotPolicyDisk).SnapshotpolicyId @@ -317,7 +321,7 @@ func (m *SSnapshotPolicyDiskManager) SyncAttachDisk(ctx context.Context, userCre sd := SSnapshotPolicyDisk{} sd.DiskId = disk.GetId() sd.SnapshotpolicyId = spId - sd.Status = compute.SNAPSHOT_POLICY_DISK_READY + sd.Status = api.SNAPSHOT_POLICY_DISK_READY err = m.TableSpec().Insert(&sd) if err != nil { failRecord = append(failRecord, fmt.Sprintf("attachsnapshotpolicy %s to disk %s failed", @@ -413,7 +417,9 @@ func (self *SSnapshotPolicyDiskManager) newSnapshotpolicyDisk(ctx context.Contex return &spd, ErrExistSD } - spd := SSnapshotPolicyDisk{SnapshotpolicyId: sp.GetId(), DiskId: disk.GetId()} + spd := SSnapshotPolicyDisk{} + spd.SnapshotpolicyId = sp.GetId() + spd.DiskId = disk.GetId() spd.SetModelManager(self, &spd) lockman.LockJointObject(ctx, disk, sp) @@ -480,7 +486,7 @@ func (sd *SSnapshotPolicyDisk) CustomizeDelete(ctx context.Context, userCred mcc taskData := jsonutils.NewDict() taskData.Add(jsonutils.NewString(snapshotPolicyID), "snapshot_policy_id") taskData.Add(jsonutils.Marshal(sd), "snapshotPolicyDisk") - sd.SetStatus(userCred, compute.SNAPSHOT_POLICY_DISK_DELETING, "") + sd.SetStatus(userCred, api.SNAPSHOT_POLICY_DISK_DELETING, "") task, err := taskman.TaskManager.NewTask(ctx, "SnapshotPolicyCancelTask", disk, userCred, nil, "", "", nil) if err != nil { return errors.Wrapf(err, "SnapshotPolicyCancelTask newTask error %s", err) @@ -489,3 +495,74 @@ func (sd *SSnapshotPolicyDisk) CustomizeDelete(ctx context.Context, userCred mcc } return nil } + +func (manager *SSnapshotPolicyDiskManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SnapshotPolicyDiskListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SVirtualJointResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualJointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SVirtualJointResourceBaseManager.ListItemFilter") + } + q, err = manager.SSnapshotPolicyResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SnapshotPolicyFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSnapshotPolicyResourceBaseManager.ListItemFilter") + } + q, err = manager.SDiskResourceBaseManager.ListItemFilter(ctx, q, userCred, query.DiskFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SDiskResourceBaseManager.ListItemFilter") + } + + if len(query.Status) > 0 { + q = q.In("status", query.Status) + } + + return q, nil +} + +func (manager *SSnapshotPolicyDiskManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SnapshotPolicyDiskListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SVirtualJointResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.VirtualJointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SVirtualJointResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SSnapshotPolicyResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.SnapshotPolicyFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSnapshotPolicyResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SDiskResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.DiskFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SDiskResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} + +func (manager *SSnapshotPolicyDiskManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SVirtualJointResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } + q, err = manager.SSnapshotPolicyResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } + q, err = manager.SDiskResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } + + return q, httperrors.ErrNotFound +} diff --git a/pkg/compute/models/snapshotpolicyresource.go b/pkg/compute/models/snapshotpolicyresource.go new file mode 100644 index 0000000000..f313b924ee --- /dev/null +++ b/pkg/compute/models/snapshotpolicyresource.go @@ -0,0 +1,155 @@ +// 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" + "database/sql" + + "yunion.io/x/jsonutils" + "yunion.io/x/log" + "yunion.io/x/pkg/errors" + "yunion.io/x/pkg/util/reflectutils" + "yunion.io/x/sqlchemy" + + api "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/httperrors" + "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/stringutils2" +) + +type SSnapshotPolicyResourceBase struct { + // 本地快照策略ID + SnapshotpolicyId string `width:"36" charset:"ascii" nullable:"false" create:"required" index:"true" list:"user" json:"snapshotpolicy_id"` +} + +type SSnapshotPolicyResourceBaseManager struct{} + +func (self *SSnapshotPolicyResourceBase) GetSnapshotPolicy() *SSnapshotPolicy { + spObj, err := SnapshotPolicyManager.FetchById(self.SnapshotpolicyId) + if err != nil { + log.Errorf("failed to find snapshot policy %s error: %v", self.SnapshotpolicyId, err) + return nil + } + return spObj.(*SSnapshotPolicy) +} + +func (self *SSnapshotPolicyResourceBase) GetExtraDetails( + ctx context.Context, + userCred mcclient.TokenCredential, + query jsonutils.JSONObject, + isList bool, +) api.SnapshotPolicyResourceInfo { + return api.SnapshotPolicyResourceInfo{} +} + +func (manager *SSnapshotPolicyResourceBaseManager) FetchCustomizeColumns( + ctx context.Context, + userCred mcclient.TokenCredential, + query jsonutils.JSONObject, + objs []interface{}, + fields stringutils2.SSortedStrings, + isList bool, +) []api.SnapshotPolicyResourceInfo { + rows := make([]api.SnapshotPolicyResourceInfo, len(objs)) + snapshotPolicyIds := make([]string, len(objs)) + for i := range objs { + var base *SSnapshotPolicyResourceBase + err := reflectutils.FindAnonymouStructPointer(objs[i], &base) + if err != nil { + log.Errorf("Cannot find SSnapshotPolicyResourceBase in object %s", objs[i]) + continue + } + snapshotPolicyIds[i] = base.SnapshotpolicyId + } + snapshotPolicyNames, err := db.FetchIdNameMap2(SnapshotPolicyManager, snapshotPolicyIds) + if err != nil { + log.Errorf("FetchIdNameMap2 fail %s", err) + return rows + } + for i := range rows { + if name, ok := snapshotPolicyNames[snapshotPolicyIds[i]]; ok { + rows[i].Snapshotpolicy = name + } + } + return rows +} + +func (manager *SSnapshotPolicyResourceBaseManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SnapshotPolicyFilterListInput, +) (*sqlchemy.SQuery, error) { + if len(query.Snapshotpolicy) > 0 { + snapPObj, err := SnapshotPolicyManager.FetchByIdOrName(userCred, query.Snapshotpolicy) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(SnapshotPolicyManager.Keyword(), query.Snapshotpolicy) + } else { + return nil, errors.Wrap(err, "SnapshotPolicyManager.FetchByIdOrName") + } + } + q = q.Equals("snapshotpolicy_id", snapPObj.GetId()) + } + return q, nil +} + +func (manager *SSnapshotPolicyResourceBaseManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SnapshotPolicyFilterListInput, +) (*sqlchemy.SQuery, error) { + q, orders, fields := manager.GetOrderBySubQuery(q, userCred, query) + if len(orders) > 0 { + q = db.OrderByFields(q, orders, fields) + } + return q, nil +} + +func (manager *SSnapshotPolicyResourceBaseManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { + if field == "snapshotpolicy" { + snapPolicyQuery := SnapshotPolicyManager.Query("name", "id").Distinct().SubQuery() + q.AppendField(snapPolicyQuery.Field("name", field)) + q = q.Join(snapPolicyQuery, sqlchemy.Equals(q.Field("snapshotpolicy_id"), snapPolicyQuery.Field("id"))) + q.GroupBy(snapPolicyQuery.Field("name")) + return q, nil + } + return q, httperrors.ErrNotFound +} + +func (manager *SSnapshotPolicyResourceBaseManager) GetOrderBySubQuery( + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SnapshotPolicyFilterListInput, +) (*sqlchemy.SQuery, []string, []sqlchemy.IQueryField) { + snapQ := SnapshotPolicyManager.Query("id", "name") + var orders []string + var fields []sqlchemy.IQueryField + if db.NeedOrderQuery(manager.GetOrderByFields(query)) { + subq := snapQ.SubQuery() + q = q.LeftJoin(subq, sqlchemy.Equals(q.Field("snapshotpolicy_id"), subq.Field("id"))) + orders = append(orders, query.OrderBySnapshotpolicy) + fields = append(fields, subq.Field("name")) + } + + return q, orders, fields +} + +func (manager *SSnapshotPolicyResourceBaseManager) GetOrderByFields(query api.SnapshotPolicyFilterListInput) []string { + return []string{query.OrderBySnapshotpolicy} +} diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index f4cb935e30..3771c74000 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -43,8 +43,11 @@ import ( type SSnapshotManager struct { db.SVirtualResourceBaseManager + db.SExternalizedResourceBaseManager SManagedResourceBaseManager SCloudregionResourceBaseManager + SDiskResourceBaseManager + SStorageResourceBaseManager } type SSnapshot struct { @@ -52,7 +55,7 @@ type SSnapshot struct { db.SExternalizedResourceBase SManagedResourceBase - SCloudregionResourceBase + SCloudregionResourceBase `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional"` // 磁盘Id DiskId string `width:"36" charset:"ascii" nullable:"true" create:"required" list:"user" index:"true"` @@ -111,12 +114,14 @@ func (manager *SSnapshotManager) ListItemFilter( if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") } - + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") } - q, err = manager.SCloudregionResourceBaseManager.ListItemFilter(ctx, q, userCred, query.RegionalFilterListInput) if err != nil { return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter") @@ -156,6 +161,32 @@ func (manager *SSnapshotManager) ListItemFilter( } } + diskInput := api.DiskFilterListInput{ + DiskFilterListInputBase: query.DiskFilterListInputBase, + } + q, err = manager.SDiskResourceBaseManager.ListItemFilter(ctx, q, userCred, diskInput) + if err != nil { + return nil, errors.Wrap(err, "SDiskResourceBaseManager.ListItemFilter") + } + storageInput := api.StorageFilterListInput{ + StorageFilterListInputBase: query.StorageFilterListInputBase, + } + q, err = manager.SStorageResourceBaseManager.ListItemFilter(ctx, q, userCred, storageInput) + if err != nil { + return nil, errors.Wrap(err, "SStorageResourceBaseManager.ListItemFilter") + } + + if query.OutOfChain != nil { + if *query.OutOfChain { + q = q.IsTrue("out_of_chain") + } else { + q = q.IsFalse("out_of_chain") + } + } + if len(query.OsType) > 0 { + q = q.In("os_type", query.OsType) + } + return q, nil } @@ -182,6 +213,21 @@ func (manager *SSnapshotManager) OrderByExtraFields( return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.OrderByExtraFields") } + diskInput := api.DiskFilterListInput{ + DiskFilterListInputBase: query.DiskFilterListInputBase, + } + q, err = manager.SDiskResourceBaseManager.OrderByExtraFields(ctx, q, userCred, diskInput) + if err != nil { + return nil, errors.Wrap(err, "SDiskResourceBaseManager.OrderByExtraFields") + } + storageInput := api.StorageFilterListInput{ + StorageFilterListInputBase: query.StorageFilterListInputBase, + } + q, err = manager.SStorageResourceBaseManager.OrderByExtraFields(ctx, q, userCred, storageInput) + if err != nil { + return nil, errors.Wrap(err, "SStorageResourceBaseManager.OrderByExtraFields") + } + return q, nil } diff --git a/pkg/compute/models/storagecachedimages.go b/pkg/compute/models/storagecachedimages.go index 725857f0f5..32fd944ddc 100644 --- a/pkg/compute/models/storagecachedimages.go +++ b/pkg/compute/models/storagecachedimages.go @@ -40,6 +40,7 @@ import ( type SStoragecachedimageManager struct { db.SJointResourceBaseManager + db.SExternalizedResourceBaseManager } var StoragecachedimageManager *SStoragecachedimageManager @@ -62,6 +63,7 @@ func init() { type SStoragecachedimage struct { db.SJointResourceBase + db.SExternalizedResourceBase // 存储缓存Id StoragecacheId string `width:"36" charset:"ascii" nullable:"false" list:"admin" create:"admin_required"` @@ -69,7 +71,7 @@ type SStoragecachedimage struct { CachedimageId string `width:"36" charset:"ascii" nullable:"false" list:"admin" create:"admin_required"` // 外部Id - ExternalId string `width:"256" charset:"utf8" nullable:"false" get:"admin"` + // ExternalId string `width:"256" charset:"utf8" nullable:"false" get:"admin"` // 镜像状态 Status string `width:"32" charset:"ascii" nullable:"false" default:"init" list:"admin" update:"admin" create:"admin_required"` @@ -152,8 +154,7 @@ func (self *SStoragecachedimage) GetExtraDetails( query jsonutils.JSONObject, isList bool, ) (api.StoragecachedimageDetails, error) { - out := api.StoragecachedimageDetails{} - return self.getExtraDetails(ctx, out), nil + return api.StoragecachedimageDetails{}, nil } func (manager *SStoragecachedimageManager) FetchCustomizeColumns( @@ -172,6 +173,7 @@ func (manager *SStoragecachedimageManager) FetchCustomizeColumns( rows[i] = api.StoragecachedimageDetails{ JointResourceBaseDetails: jointRows[i], } + rows[i] = objs[i].(*SStoragecachedimage).getExtraDetails(ctx, rows[i]) } return rows @@ -488,3 +490,66 @@ func (manager *SStoragecachedimageManager) newFromCloudImage(ctx context.Context } return scimg.SetExternalId(image.GetGlobalId()) } + +func (manager *SStoragecachedimageManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.StoragecachedimageListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SJointResourceBaseManager.ListItemFilter(ctx, q, userCred, query.JointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SSchedtagJointsManager.ListItemFilter") + } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + + if len(query.Storagecache) > 0 { + storageCacheObj, err := StoragecacheManager.FetchByIdOrName(userCred, query.Storagecache) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(StoragecacheManager.Keyword(), query.Storagecache) + } else { + return nil, errors.Wrap(err, "StoragecacheManager.FetchByIdOrName") + } + } + q = q.Equals("storagecache_id", storageCacheObj.GetId()) + } + if len(query.Cachedimage) > 0 { + cachedImageObj, err := CachedimageManager.FetchByIdOrName(userCred, query.Cachedimage) + if err != nil { + if errors.Cause(err) == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(CachedimageManager.Keyword(), query.Cachedimage) + } else { + return nil, errors.Wrap(err, "CachedimageManager.FetchByIdOrName") + } + } + q = q.Equals("cachedimage_id", cachedImageObj.GetId()) + } + + if len(query.Status) > 0 { + q = q.In("status", query.Status) + } + + return q, nil +} + +func (manager *SStoragecachedimageManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.StoragecachedimageListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SJointResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.JointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SSchedtagJointsManager.OrderByExtraFields") + } + + return q, nil +} diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index b74723ab3c..8e98cbde8e 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -44,6 +44,7 @@ import ( type SStorageManager struct { db.SEnabledStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SManagedResourceBaseManager SZoneResourceBaseManager } @@ -63,7 +64,7 @@ func init() { } type SStorage struct { - db.SEnabledStatusStandaloneResourceBase + db.SEnabledStatusStandaloneResourceBase `"status->default":"offline" "status->update":"admin" "enabled->default":"true"` db.SExternalizedResourceBase SManagedResourceBase @@ -1164,6 +1165,11 @@ func (manager *SStorageManager) ListItemFilter( return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SZoneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ZonalFilterListInput) if err != nil { return nil, errors.Wrap(err, "SZoneResourceBaseManager.ListItemFilter") diff --git a/pkg/compute/models/storageschedtags.go b/pkg/compute/models/storageschedtags.go index 5c3f2b9ca8..fc59cff552 100644 --- a/pkg/compute/models/storageschedtags.go +++ b/pkg/compute/models/storageschedtags.go @@ -19,6 +19,8 @@ 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/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -28,6 +30,7 @@ import ( type SStorageschedtagManager struct { *SSchedtagJointsManager + SStorageResourceBaseManager } var StorageschedtagManager *SStorageschedtagManager @@ -122,3 +125,43 @@ func (joint *SStorageschedtag) Delete(ctx context.Context, userCred mcclient.Tok func (joint *SStorageschedtag) Detach(ctx context.Context, userCred mcclient.TokenCredential) error { return joint.SSchedtagJointsBase.detach(joint, ctx, userCred) } + +func (manager *SStorageschedtagManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.StorageschedtagListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SSchedtagJointsManager.ListItemFilter(ctx, q, userCred, query.SchedtagJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SSchedtagJointsManager.ListItemFilter") + } + q, err = manager.SStorageResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StorageFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SStorageResourceBaseManager.ListItemFilter") + } + + return q, nil +} + +func (manager *SStorageschedtagManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.StorageschedtagListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SSchedtagJointsManager.OrderByExtraFields(ctx, q, userCred, query.SchedtagJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SSchedtagJointsManager.OrderByExtraFields") + } + q, err = manager.SStorageResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.StorageFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SStorageResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index a9addf4452..b391a445cf 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -40,6 +40,7 @@ import ( type SVpcManager struct { db.SEnabledStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SManagedResourceBaseManager SCloudregionResourceBaseManager SGlobalVpcResourceBaseManager @@ -65,9 +66,9 @@ type SVpc struct { SManagedResourceBase - SCloudregionResourceBase + SCloudregionResourceBase `width:"36" charset:"ascii" nullable:"false" list:"domain" create:"admin_required" default:"default"` - SGlobalVpcResourceBase + SGlobalVpcResourceBase `width:"36" charset:"ascii" list:"user" json:"globalvpc_id"` // 是否是默认VPC // example: true @@ -802,6 +803,11 @@ func (manager *SVpcManager) ListItemFilter( return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") @@ -851,6 +857,17 @@ func (manager *SVpcManager) ListItemFilter( } } + if query.IsDefault != nil { + if *query.IsDefault { + q = q.IsTrue("is_default") + } else { + q = q.IsFalse("is_default") + } + } + if len(query.CidrBlock) > 0 { + q = q.In("cidr_block", query.CidrBlock) + } + return q, nil } diff --git a/pkg/compute/models/wires.go b/pkg/compute/models/wires.go index 8dc6d6eb28..8e9a4aef0c 100644 --- a/pkg/compute/models/wires.go +++ b/pkg/compute/models/wires.go @@ -42,6 +42,7 @@ import ( type SWireManager struct { db.SStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SVpcResourceBaseManager SZoneResourceBaseManager } @@ -64,8 +65,8 @@ type SWire struct { db.SStandaloneResourceBase db.SExternalizedResourceBase - SVpcResourceBase - SZoneResourceBase + SVpcResourceBase `wdith:"36" charset:"ascii" nullable:"false" list:"admin" create:"admin_required"` + SZoneResourceBase `width:"36" charset:"ascii" nullable:"true" list:"admin" create:"admin_required"` // 带宽大小, 单位Mbps // example: 1000 @@ -817,6 +818,11 @@ func (manager *SWireManager) ListItemFilter( return nil, errors.Wrap(err, "SVpcResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + zoneQuery := api.ZonalFilterListInput{ ZonalFilterListBase: query.ZonalFilterListBase, } diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index 041f328324..2a2681b8b5 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -37,6 +37,7 @@ import ( type SZoneManager struct { db.SStatusStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SCloudregionResourceBaseManager } @@ -58,7 +59,7 @@ func init() { type SZone struct { db.SStatusStandaloneResourceBase db.SExternalizedResourceBase - SCloudregionResourceBase + SCloudregionResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"admin_required"` Location string `width:"256" charset:"utf8" get:"user" list:"user" update:"admin"` Contacts string `width:"256" charset:"utf8" get:"user" update:"admin"` @@ -490,11 +491,20 @@ func NetworkUsableZoneQueries(field sqlchemy.IQueryField, usableNet, usableVpc b } // 可用区列表 -func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ZoneListInput) (*sqlchemy.SQuery, error) { +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, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } cloudEnvStr := query.CloudEnv if cloudEnvStr == api.CLOUD_ENV_PRIVATE_CLOUD { @@ -582,6 +592,13 @@ func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu q, err = managedResourceFilterByRegion(q, query.RegionalFilterListInput, "", nil) + if len(query.Location) > 0 { + q = q.In("location", query.Location) + } + if len(query.Contacts) > 0 { + q = q.In("contacts", query.Contacts) + } + return q, nil } diff --git a/pkg/image/models/images.go b/pkg/image/models/images.go index 16375b5b92..c43e5b7ddd 100644 --- a/pkg/image/models/images.go +++ b/pkg/image/models/images.go @@ -322,7 +322,7 @@ func (self *SImage) GetExtraDetailsHeaders(ctx context.Context, userCred mcclien } jsonDict := jsonutils.Marshal(self).(*jsonutils.JSONDict) - fields := db.GetDetailFields(self.GetModelManager(), userCred) + fields, _ := db.GetDetailFields(self.GetModelManager(), userCred) for _, k := range jsonDict.SortedKeys() { if utils.IsInStringArray(k, fields) { val, _ := jsonDict.GetString(k) diff --git a/pkg/notify/models/mod_notification.go b/pkg/notify/models/mod_notification.go index 349269af3d..636bc4ac32 100644 --- a/pkg/notify/models/mod_notification.go +++ b/pkg/notify/models/mod_notification.go @@ -121,6 +121,7 @@ func (manager *SNotificationManager) FetchCustomizeColumns( rows[i] = api.NotificationDetails{ ResourceBaseDetails: resRows[i], } + rows[i], _ = objs[i].(*SNotification).getMoreDetails(ctx, query, rows[i]) } return rows @@ -132,8 +133,11 @@ func (self *SNotification) GetExtraDetails( query jsonutils.JSONObject, isList bool, ) (api.NotificationDetails, error) { + return api.NotificationDetails{}, nil +} + +func (self *SNotification) getMoreDetails(ctx context.Context, query jsonutils.JSONObject, out api.NotificationDetails) (api.NotificationDetails, error) { var err error - out := api.NotificationDetails{} var scopeStr string scopeStr, err = query.GetString("scope") diff --git a/vendor/modules.txt b/vendor/modules.txt index f1e36d3f4e..a421272fd8 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1018,7 +1018,7 @@ yunion.io/x/jsonutils # yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d yunion.io/x/log yunion.io/x/log/hooks -# yunion.io/x/pkg v0.0.0-20200304112442-9dae9351325e +# yunion.io/x/pkg v0.0.0-20200312093207-f07f4cb157e0 yunion.io/x/pkg/errors yunion.io/x/pkg/gotypes yunion.io/x/pkg/prettytable diff --git a/vendor/yunion.io/x/pkg/util/reflectutils/jsonfield.go b/vendor/yunion.io/x/pkg/util/reflectutils/jsonfield.go index 8871c1431f..9b70f0d4a2 100644 --- a/vendor/yunion.io/x/pkg/util/reflectutils/jsonfield.go +++ b/vendor/yunion.io/x/pkg/util/reflectutils/jsonfield.go @@ -44,6 +44,10 @@ type SStructFieldInfo struct { Tags map[string]string } +func (s *SStructFieldInfo) updateTags(k, v string) { + s.Tags[k] = v +} + func (s SStructFieldInfo) deepCopy() *SStructFieldInfo { scopy := SStructFieldInfo{ Ignore: s.Ignore, @@ -134,11 +138,11 @@ type SStructFieldValue struct { type SStructFieldValueSet []SStructFieldValue func FetchStructFieldValueSet(dataValue reflect.Value) SStructFieldValueSet { - return fetchStructFieldValueSet(dataValue, false) + return fetchStructFieldValueSet(dataValue, false, nil) } func FetchStructFieldValueSetForWrite(dataValue reflect.Value) SStructFieldValueSet { - return fetchStructFieldValueSet(dataValue, true) + return fetchStructFieldValueSet(dataValue, true, nil) } type sStructFieldInfoMap map[string]SStructFieldInfo @@ -182,7 +186,7 @@ func fetchStructFieldInfos(dataType reflect.Type) sStructFieldInfoMap { return smap } -func fetchStructFieldValueSet(dataValue reflect.Value, allocatePtr bool) SStructFieldValueSet { +func fetchStructFieldValueSet(dataValue reflect.Value, allocatePtr bool, tags map[string]string) SStructFieldValueSet { fields := SStructFieldValueSet{} dataType := dataValue.Type() fieldInfos := fetchCacheStructFieldInfos(dataType) @@ -218,7 +222,8 @@ func fetchStructFieldValueSet(dataValue reflect.Value, allocatePtr bool) SStruct // different from how encoding/json handles struct // field of interface type. if fv.Kind() == reflect.Struct && sf.Type != gotypes.TimeType { - subfields := fetchStructFieldValueSet(fv, allocatePtr) + anonymousTags := utils.TagMap(sf.Tag) + subfields := fetchStructFieldValueSet(fv, allocatePtr, anonymousTags) fields = append(fields, subfields...) continue } @@ -231,6 +236,23 @@ func fetchStructFieldValueSet(dataValue reflect.Value, allocatePtr bool) SStruct }) } } + if len(tags) > 0 { + for i := range fields { + fieldName := fields[i].Info.MarshalName() + for k, v := range tags { + target := "" + pos := strings.Index(k, "->") + if pos > 0 { + target = k[:pos] + k = k[pos+2:] + } + if len(target) > 0 && target != fieldName { + continue + } + fields[i].Info.updateTags(k, v) + } + } + } return fields }