mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-01 15:07:17 +08:00
Merge pull request #17267 from gouqi11/addRegionListOption
fix(region): support slice for list
This commit is contained in:
@@ -42,8 +42,8 @@ func init() {
|
||||
}
|
||||
var result *printutils.ListResult
|
||||
var err error
|
||||
if len(args.Manager) > 0 {
|
||||
result, err = modules.CloudproviderregionManager.ListDescendent(s, args.Manager, params)
|
||||
if len(args.Manager) == 1 {
|
||||
result, err = modules.CloudproviderregionManager.ListDescendent(s, args.Manager[0], params)
|
||||
} else if len(args.Region) > 0 {
|
||||
result, err = modules.CloudproviderregionManager.ListDescendent2(s, args.Region, params)
|
||||
} else {
|
||||
|
||||
@@ -165,11 +165,29 @@ type CloudproviderResourceInput struct {
|
||||
Cloudprovider string `json:"cloudprovider" yunion-deprecated-by:"cloudprovider_id"`
|
||||
}
|
||||
|
||||
type CloudproviderResourceListInput struct {
|
||||
// 列出关联指定云订阅(ID或Name)的资源
|
||||
CloudproviderId []string `json:"cloudprovider_id"`
|
||||
// List objects belonging to the cloud provider
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
Manager string `json:"manager" yunion-deprecated-by:"cloudprovider_id"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
ManagerId string `json:"manager_id" yunion-deprecated-by:"cloudprovider_id"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
Cloudprovider string `json:"cloudprovider" yunion-deprecated-by:"cloudprovider_id"`
|
||||
}
|
||||
|
||||
type ManagedResourceListInput struct {
|
||||
apis.DomainizedResourceListInput
|
||||
CloudenvResourceListInput
|
||||
|
||||
CloudproviderResourceInput
|
||||
CloudproviderResourceListInput
|
||||
|
||||
// 列出关联指定云账号(ID或Name)的资源
|
||||
CloudaccountId []string `json:"cloudaccount_id"`
|
||||
|
||||
@@ -220,7 +220,7 @@ type DBInstanceListInput struct {
|
||||
InstanceType string `json:"instance_type"`
|
||||
|
||||
// 通过IP搜索RDS实例
|
||||
IpAddr string `json:"ip_addr"`
|
||||
IpAddr []string `json:"ip_addr"`
|
||||
}
|
||||
|
||||
type DBInstanceBackupListInput struct {
|
||||
|
||||
@@ -88,7 +88,7 @@ type ElasticipListInput struct {
|
||||
Mode string `json:"mode"`
|
||||
|
||||
// IP地址
|
||||
IpAddr string `json:"ip_addr"`
|
||||
IpAddr []string `json:"ip_addr"`
|
||||
|
||||
// 绑定资源类型
|
||||
AssociateType string `json:"associate_type"`
|
||||
|
||||
@@ -18,6 +18,23 @@ import (
|
||||
"yunion.io/x/onecloud/pkg/apis"
|
||||
)
|
||||
|
||||
type CloudregionResourceListInput struct {
|
||||
// 区域名称或ID
|
||||
CloudregionId []string `json:"cloudregion_id"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
Cloudregion string `json:"cloudregion" yunion-deprecated-by:"cloudregion_id"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
Region string `json:"region" yunion-deprecated-by:"cloudregion_id"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
RegionId string `json:"region_id" yunion-deprecated-by:"cloudregion_id"`
|
||||
}
|
||||
|
||||
type CloudregionResourceInput struct {
|
||||
// 区域名称或ID
|
||||
CloudregionId string `json:"cloudregion_id"`
|
||||
@@ -39,7 +56,7 @@ type RegionalFilterListInput struct {
|
||||
// 过滤位于指定城市区域的资源
|
||||
City string `json:"city"`
|
||||
|
||||
CloudregionResourceInput
|
||||
CloudregionResourceListInput
|
||||
|
||||
// 按区域名称过滤
|
||||
OrderByRegion string `json:"order_by_region"`
|
||||
|
||||
@@ -60,7 +60,7 @@ type ServerListInput struct {
|
||||
Backup *bool `json:"bakcup"`
|
||||
// 列出指定类型的主机
|
||||
// enum: normal,gpu,usb,backup
|
||||
ServerType string `json:"server_type"`
|
||||
ServerType []string `json:"server_type"`
|
||||
// 列出管理安全组为指定安全组的主机
|
||||
AdminSecgroup string `json:"admin_security"`
|
||||
// 列出Hypervisor为指定值的主机
|
||||
|
||||
@@ -124,7 +124,7 @@ type HostListInput struct {
|
||||
ServerIdForNetwork string `json:"server_id_for_network"`
|
||||
// 宿主机 cpu 架构
|
||||
CpuArchitecture []string `json:"cpu_architecture"`
|
||||
OsArch string `json:"os_arch"`
|
||||
OsArch []string `json:"os_arch"`
|
||||
|
||||
// 按虚拟机数量排序
|
||||
// enum: asc,desc
|
||||
|
||||
@@ -93,11 +93,11 @@ type NetworkListInput struct {
|
||||
|
||||
// description: Exact matching ip address in network.
|
||||
// example: 10.168.222.1
|
||||
Ip string `json:"ip"`
|
||||
Ip []string `json:"ip"`
|
||||
|
||||
// description: Fuzzy matching ip address in network.
|
||||
// example: 10.168.222.1
|
||||
IpMatch string `json:"ip_match"`
|
||||
IpMatch []string `json:"ip_match"`
|
||||
|
||||
IfnameHint []string `json:"ifname_hint"`
|
||||
// 起始IP地址
|
||||
|
||||
+13
-1
@@ -111,8 +111,20 @@ type VpcResourceInput struct {
|
||||
ExternalAccessMode string `json:"external_access_mode"`
|
||||
}
|
||||
|
||||
type VpcListItemInput struct {
|
||||
// 关联VPC(ID或Name)
|
||||
VpcId []string `json:"vpc_id"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by vpc Id
|
||||
Vpc []string `json:"vpc" yunion-deprecated-by:"vpc_id"`
|
||||
|
||||
// Vpc外网访问模式
|
||||
ExternalAccessMode string `json:"external_access_mode"`
|
||||
}
|
||||
|
||||
type VpcFilterListInputBase struct {
|
||||
VpcResourceInput
|
||||
VpcListItemInput
|
||||
|
||||
// 按VPC名称排序
|
||||
// pattern:asc|desc
|
||||
|
||||
+1
-1
@@ -355,7 +355,7 @@ type MultiArchResourceBaseListInput struct {
|
||||
// arm会过滤出os_arch=aarch64或os_arch=aarch32或者以arm开头的资源
|
||||
// 其他的输入会过滤出以输入字符开头的资源
|
||||
// enmu: x86, arm
|
||||
OsArch string `json:"os_arch"`
|
||||
OsArch []string `json:"os_arch"`
|
||||
}
|
||||
|
||||
type AutoDeleteResourceBaseListInput struct {
|
||||
|
||||
+22
-16
@@ -41,24 +41,30 @@ func (manager *SMultiArchResourceBaseManager) ListItemFilter(
|
||||
return ListQueryByArchitecture(q, "os_arch", query.OsArch), nil
|
||||
}
|
||||
|
||||
func ListQueryByArchitecture(q *sqlchemy.SQuery, fieldKey string, arch string) *sqlchemy.SQuery {
|
||||
if len(arch) == 0 {
|
||||
func ListQueryByArchitecture(q *sqlchemy.SQuery, fieldKey string, archs []string) *sqlchemy.SQuery {
|
||||
if len(archs) == 0 {
|
||||
return q
|
||||
}
|
||||
if arch == apis.OS_ARCH_X86 {
|
||||
q = q.Filter(sqlchemy.OR(
|
||||
sqlchemy.Startswith(q.Field(fieldKey), arch),
|
||||
sqlchemy.Equals(q.Field(fieldKey), apis.OS_ARCH_I386),
|
||||
sqlchemy.IsNullOrEmpty(q.Field(fieldKey)),
|
||||
))
|
||||
} else if arch == apis.OS_ARCH_ARM {
|
||||
q = q.Filter(sqlchemy.OR(
|
||||
sqlchemy.Startswith(q.Field(fieldKey), arch),
|
||||
sqlchemy.Equals(q.Field(fieldKey), apis.OS_ARCH_AARCH32),
|
||||
sqlchemy.Equals(q.Field(fieldKey), apis.OS_ARCH_AARCH64),
|
||||
))
|
||||
} else {
|
||||
q = q.Startswith(fieldKey, arch)
|
||||
conditions := []sqlchemy.ICondition{}
|
||||
for _, arch := range archs {
|
||||
if arch == apis.OS_ARCH_X86 {
|
||||
conditions = append(conditions, sqlchemy.OR(
|
||||
sqlchemy.Startswith(q.Field(fieldKey), arch),
|
||||
sqlchemy.Equals(q.Field(fieldKey), apis.OS_ARCH_I386),
|
||||
sqlchemy.IsNullOrEmpty(q.Field(fieldKey)),
|
||||
))
|
||||
} else if arch == apis.OS_ARCH_ARM {
|
||||
conditions = append(conditions, sqlchemy.OR(
|
||||
sqlchemy.Startswith(q.Field(fieldKey), arch),
|
||||
sqlchemy.Equals(q.Field(fieldKey), apis.OS_ARCH_AARCH32),
|
||||
sqlchemy.Equals(q.Field(fieldKey), apis.OS_ARCH_AARCH64),
|
||||
))
|
||||
} else {
|
||||
conditions = append(conditions, sqlchemy.Startswith(q.Field(fieldKey), arch))
|
||||
}
|
||||
}
|
||||
if len(conditions) > 0 {
|
||||
q = q.Filter(sqlchemy.OR(conditions...))
|
||||
}
|
||||
return q
|
||||
}
|
||||
|
||||
@@ -1700,9 +1700,10 @@ func (manager *SCloudaccountManager) ListItemFilter(
|
||||
q = q.Equals("proxy_setting_id", proxy.GetId())
|
||||
}
|
||||
|
||||
managerStr := query.CloudproviderId
|
||||
if len(managerStr) > 0 {
|
||||
providerObj, err := CloudproviderManager.FetchByIdOrName(userCred, managerStr)
|
||||
managerStrs := query.CloudproviderId
|
||||
conditions := []sqlchemy.ICondition{}
|
||||
for _, managerStr := range managerStrs {
|
||||
providerObj, err := manager.FetchByIdOrName(userCred, managerStr)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr)
|
||||
@@ -1711,7 +1712,10 @@ func (manager *SCloudaccountManager) ListItemFilter(
|
||||
}
|
||||
}
|
||||
provider := providerObj.(*SCloudprovider)
|
||||
q = q.Equals("id", provider.CloudaccountId)
|
||||
conditions = append(conditions, sqlchemy.Equals(q.Field("id"), provider.CloudaccountId))
|
||||
}
|
||||
if len(conditions) > 0 {
|
||||
q = q.Filter(sqlchemy.OR(conditions...))
|
||||
}
|
||||
|
||||
cloudEnvStr := query.CloudEnv
|
||||
|
||||
@@ -1325,8 +1325,9 @@ func (manager *SCloudproviderManager) ListItemFilter(
|
||||
return nil, errors.Wrap(err, "SSyncableBaseResourceManager.ListItemFilter")
|
||||
}
|
||||
|
||||
managerStr := query.CloudproviderId
|
||||
if len(managerStr) > 0 {
|
||||
managerStrs := query.CloudproviderId
|
||||
conditions := []sqlchemy.ICondition{}
|
||||
for _, managerStr := range managerStrs {
|
||||
providerObj, err := manager.FetchByIdOrName(userCred, managerStr)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
@@ -1335,7 +1336,10 @@ func (manager *SCloudproviderManager) ListItemFilter(
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
}
|
||||
q = q.Equals("id", providerObj.GetId())
|
||||
conditions = append(conditions, sqlchemy.Equals(q.Field("id"), providerObj.GetId()))
|
||||
}
|
||||
if len(conditions) > 0 {
|
||||
q = q.Filter(sqlchemy.OR(conditions...))
|
||||
}
|
||||
|
||||
cloudEnvStr := query.CloudEnv
|
||||
|
||||
@@ -52,6 +52,18 @@ func ValidateCloudregionResourceInput(userCred mcclient.TokenCredential, input a
|
||||
return regionObj.(*SCloudregion), input, nil
|
||||
}
|
||||
|
||||
func ValidateCloudregionId(userCred mcclient.TokenCredential, regionId string) (*SCloudregion, error) {
|
||||
regionObj, err := CloudregionManager.FetchByIdOrName(userCred, regionId)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == sql.ErrNoRows {
|
||||
return nil, errors.Wrapf(httperrors.ErrResourceNotFound, "%s %s", CloudregionManager.Keyword(), regionId)
|
||||
} else {
|
||||
return nil, errors.Wrap(err, "CloudregionManager.FetchByIdOrName")
|
||||
}
|
||||
}
|
||||
return regionObj.(*SCloudregion), nil
|
||||
}
|
||||
|
||||
func (self *SCloudregionResourceBase) GetRegion() (*SCloudregion, error) {
|
||||
region, err := CloudregionManager.FetchById(self.CloudregionId)
|
||||
if err != nil {
|
||||
|
||||
@@ -887,7 +887,7 @@ func (manager *SCloudregionManager) ListItemFilter(
|
||||
|
||||
managerStr := query.CloudproviderId
|
||||
if len(managerStr) > 0 {
|
||||
subq := CloudproviderRegionManager.QueryRelatedRegionIds(nil, managerStr)
|
||||
subq := CloudproviderRegionManager.QueryRelatedRegionIds(nil, managerStr...)
|
||||
q = q.In("id", subq)
|
||||
}
|
||||
accountArr := query.CloudaccountId
|
||||
|
||||
@@ -235,7 +235,15 @@ func (man *SDBInstanceManager) ListItemFilter(
|
||||
}
|
||||
|
||||
if len(query.IpAddr) > 0 {
|
||||
dn := DBInstanceNetworkManager.Query("dbinstance_id").Contains("ip_addr", query.IpAddr)
|
||||
dn := DBInstanceNetworkManager.Query("dbinstance_id")
|
||||
conditions := []sqlchemy.ICondition{}
|
||||
for _, ipAddr := range query.IpAddr {
|
||||
condition := sqlchemy.Contains(dn.Field("ip_addr"), ipAddr)
|
||||
conditions = append(conditions, condition)
|
||||
}
|
||||
if len(conditions) > 0 {
|
||||
dn = dn.Filter(sqlchemy.OR(conditions...))
|
||||
}
|
||||
q = q.Filter(sqlchemy.In(q.Field("id"), dn.SubQuery()))
|
||||
}
|
||||
|
||||
|
||||
@@ -574,17 +574,22 @@ func (manager *SExternalProjectManager) ListItemFilter(
|
||||
return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter")
|
||||
}
|
||||
|
||||
if len(query.CloudproviderId) > 0 {
|
||||
p, err := CloudproviderManager.FetchByIdOrName(userCred, query.CloudproviderId)
|
||||
managerStrs := query.CloudproviderId
|
||||
conditions := []sqlchemy.ICondition{}
|
||||
for _, managerStr := range managerStrs {
|
||||
providerObj, err := manager.FetchByIdOrName(userCred, managerStr)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2("cloudprovider", query.CloudproviderId)
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr)
|
||||
} else {
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
q = q.Equals("manager_id", p.GetId())
|
||||
provider := p.(*SCloudprovider)
|
||||
query.CloudaccountId = []string{provider.CloudaccountId}
|
||||
provider := providerObj.(*SCloudprovider)
|
||||
conditions = append(conditions, sqlchemy.Equals(q.Field("id"), provider.CloudaccountId))
|
||||
}
|
||||
if len(conditions) > 0 {
|
||||
q = q.Filter(sqlchemy.OR(conditions...))
|
||||
}
|
||||
|
||||
if len(query.CloudaccountId) > 0 {
|
||||
|
||||
@@ -244,6 +244,7 @@ func (manager *SGuestManager) ListItemFilter(
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter")
|
||||
}
|
||||
|
||||
q, err = manager.SMultiArchResourceBaseManager.ListItemFilter(ctx, q, userCred, query.MultiArchResourceBaseListInput)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "MultiArchResourceBaseListInput.ListItemFilter")
|
||||
@@ -519,21 +520,26 @@ func (manager *SGuestManager) ListItemFilter(
|
||||
|
||||
if len(query.ServerType) > 0 {
|
||||
var trueVal, falseVal = true, false
|
||||
switch query.ServerType {
|
||||
case "normal":
|
||||
query.Normal = &falseVal
|
||||
query.Backup = &falseVal
|
||||
case "gpu":
|
||||
query.Gpu = &trueVal
|
||||
query.Backup = &falseVal
|
||||
case "backup":
|
||||
query.Gpu = &falseVal
|
||||
query.Backup = &trueVal
|
||||
case "usb":
|
||||
query.Usb = &trueVal
|
||||
query.Backup = &falseVal
|
||||
default:
|
||||
query.CustomDevType = query.ServerType
|
||||
for _, serverType := range query.ServerType {
|
||||
switch serverType {
|
||||
case "normal":
|
||||
query.Normal = &falseVal
|
||||
query.Backup = &falseVal
|
||||
case "gpu":
|
||||
query.Gpu = &trueVal
|
||||
query.Backup = &falseVal
|
||||
case "backup":
|
||||
query.Gpu = &falseVal
|
||||
query.Backup = &trueVal
|
||||
case "usb":
|
||||
query.Usb = &trueVal
|
||||
query.Backup = &falseVal
|
||||
default:
|
||||
query.CustomDevType = serverType
|
||||
query.Backup = &falseVal
|
||||
}
|
||||
}
|
||||
if query.Backup == nil {
|
||||
query.Backup = &falseVal
|
||||
}
|
||||
}
|
||||
@@ -545,12 +551,9 @@ func (manager *SGuestManager) ListItemFilter(
|
||||
q = q.IsEmpty("backup_host_id")
|
||||
}
|
||||
}
|
||||
|
||||
devTypeQ := func(q *sqlchemy.SQuery, checkType *bool, dType string) *sqlchemy.SQuery {
|
||||
devTypeQ := func(q *sqlchemy.SQuery, checkType *bool, dType string, conditions []sqlchemy.ICondition) []sqlchemy.ICondition {
|
||||
if checkType != nil {
|
||||
conditions := []sqlchemy.ICondition{}
|
||||
isodev := IsolatedDeviceManager.Query().SubQuery()
|
||||
|
||||
isodevCons := []sqlchemy.ICondition{sqlchemy.IsNotNull(isodev.Field("guest_id"))}
|
||||
if len(dType) > 0 {
|
||||
isodevCons = append(isodevCons, sqlchemy.Startswith(isodev.Field("dev_type"), dType))
|
||||
@@ -565,17 +568,22 @@ func (manager *SGuestManager) ListItemFilter(
|
||||
conditions = append(conditions, cond(q.Field("instance_type"), sq))
|
||||
}
|
||||
conditions = append(conditions, cond(q.Field("id"), sgq))
|
||||
return q.Filter(sqlchemy.OR(conditions...))
|
||||
return conditions
|
||||
}
|
||||
return q
|
||||
return conditions
|
||||
}
|
||||
|
||||
q = devTypeQ(q, query.Normal, "")
|
||||
q = devTypeQ(q, query.Gpu, "GPU")
|
||||
q = devTypeQ(q, query.Usb, api.USB_TYPE)
|
||||
conditions := []sqlchemy.ICondition{}
|
||||
|
||||
conditions = devTypeQ(q, query.Normal, "", conditions)
|
||||
conditions = devTypeQ(q, query.Gpu, "GPU", conditions)
|
||||
conditions = devTypeQ(q, query.Usb, api.USB_TYPE, conditions)
|
||||
if len(query.CustomDevType) > 0 {
|
||||
ct := true
|
||||
q = devTypeQ(q, &ct, query.CustomDevType)
|
||||
conditions = devTypeQ(q, &ct, query.CustomDevType, conditions)
|
||||
}
|
||||
if len(conditions) > 0 {
|
||||
q = q.Filter(sqlchemy.OR(conditions...))
|
||||
}
|
||||
|
||||
groupFilter := query.GroupId
|
||||
|
||||
@@ -490,8 +490,9 @@ func managedResourceFilterByAccount(q *sqlchemy.SQuery, input api.ManagedResourc
|
||||
}
|
||||
|
||||
func _managedResourceFilterByAccount(managerIdFieldName string, q *sqlchemy.SQuery, input api.ManagedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) {
|
||||
cloudproviderStr := input.CloudproviderId
|
||||
if len(cloudproviderStr) > 0 {
|
||||
cloudproviderStrs := input.CloudproviderId
|
||||
managerIds := []string{}
|
||||
for _, cloudproviderStr := range cloudproviderStrs {
|
||||
provider, err := CloudproviderManager.FetchByIdOrName(nil, cloudproviderStr)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
@@ -500,7 +501,7 @@ func _managedResourceFilterByAccount(managerIdFieldName string, q *sqlchemy.SQue
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
if len(filterField) == 0 {
|
||||
q = q.Filter(sqlchemy.Equals(q.Field(managerIdFieldName), provider.GetId()))
|
||||
managerIds = append(managerIds, provider.GetId())
|
||||
} else {
|
||||
sq := subqFunc()
|
||||
sq = sq.Filter(sqlchemy.Equals(sq.Field(managerIdFieldName), provider.GetId()))
|
||||
@@ -508,6 +509,10 @@ func _managedResourceFilterByAccount(managerIdFieldName string, q *sqlchemy.SQue
|
||||
}
|
||||
}
|
||||
|
||||
if len(managerIds) > 0 {
|
||||
q = q.In(managerIdFieldName, managerIds)
|
||||
}
|
||||
|
||||
cloudaccountArr := input.CloudaccountId
|
||||
if len(cloudaccountArr) > 0 {
|
||||
cpq := CloudaccountManager.Query().SubQuery()
|
||||
@@ -584,20 +589,26 @@ func managedResourceFilterByZone(q *sqlchemy.SQuery, query api.ZonalFilterListIn
|
||||
}
|
||||
|
||||
func managedResourceFilterByRegion(q *sqlchemy.SQuery, query api.RegionalFilterListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) {
|
||||
regionStr := query.CloudregionId
|
||||
if len(regionStr) > 0 {
|
||||
regionObj, _, err := ValidateCloudregionResourceInput(nil, query.CloudregionResourceInput)
|
||||
regionIds := []string{}
|
||||
for _, region := range query.CloudregionId {
|
||||
regionObj, err := ValidateCloudregionId(nil, region)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "ValidateCloudregionResourceInput")
|
||||
}
|
||||
if len(filterField) == 0 {
|
||||
q = q.Filter(sqlchemy.Equals(q.Field("cloudregion_id"), regionObj.GetId()))
|
||||
} else {
|
||||
regionIds = append(regionIds, regionObj.GetId())
|
||||
}
|
||||
if len(filterField) == 0 {
|
||||
if len(regionIds) > 0 {
|
||||
q = q.In("cloudregion_id", regionIds)
|
||||
}
|
||||
} else {
|
||||
if len(regionIds) > 0 {
|
||||
sq := subqFunc()
|
||||
sq = sq.Filter(sqlchemy.Equals(sq.Field("cloudregion_id"), regionObj.GetId()))
|
||||
sq = sq.Filter(sqlchemy.In(sq.Field("cloudregion_id"), regionIds))
|
||||
q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery()))
|
||||
}
|
||||
}
|
||||
|
||||
if len(query.City) > 0 {
|
||||
subq := CloudregionManager.Query("id").Equals("city", query.City).SubQuery()
|
||||
if len(filterField) == 0 {
|
||||
|
||||
@@ -2139,39 +2139,42 @@ func (manager *SNetworkManager) ListItemFilter(
|
||||
}
|
||||
}
|
||||
|
||||
ip := ""
|
||||
ips := []string{}
|
||||
exactIpMatch := false
|
||||
if len(input.Ip) > 0 {
|
||||
exactIpMatch = true
|
||||
ip = input.Ip
|
||||
ips = input.Ip
|
||||
} else if len(input.IpMatch) > 0 {
|
||||
ip = input.IpMatch
|
||||
ips = input.IpMatch
|
||||
}
|
||||
|
||||
if len(ip) > 0 {
|
||||
ipIa, err := parseIpToIntArray(ip)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
if len(ips) > 0 {
|
||||
conditions := []sqlchemy.ICondition{}
|
||||
for _, ip := range ips {
|
||||
ipIa, err := parseIpToIntArray(ip)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ipSa := []string{"0", "0", "0", "0"}
|
||||
for i := range ipIa {
|
||||
ipSa[i] = strconv.Itoa(ipIa[i])
|
||||
}
|
||||
fullIp := strings.Join(ipSa, ".")
|
||||
|
||||
ipField := sqlchemy.INET_ATON(sqlchemy.NewStringField(fullIp))
|
||||
ipStart := sqlchemy.INET_ATON(q.Field("guest_ip_start"))
|
||||
ipEnd := sqlchemy.INET_ATON(q.Field("guest_ip_end"))
|
||||
|
||||
var ipCondtion sqlchemy.ICondition
|
||||
if exactIpMatch {
|
||||
ipCondtion = sqlchemy.Between(ipField, ipStart, ipEnd)
|
||||
} else {
|
||||
ipCondtion = sqlchemy.OR(sqlchemy.Between(ipField, ipStart, ipEnd), sqlchemy.Contains(q.Field("guest_ip_start"), ip), sqlchemy.Contains(q.Field("guest_ip_end"), ip))
|
||||
}
|
||||
conditions = append(conditions, ipCondtion)
|
||||
}
|
||||
|
||||
ipSa := []string{"0", "0", "0", "0"}
|
||||
for i := range ipIa {
|
||||
ipSa[i] = strconv.Itoa(ipIa[i])
|
||||
}
|
||||
fullIp := strings.Join(ipSa, ".")
|
||||
|
||||
ipField := sqlchemy.INET_ATON(sqlchemy.NewStringField(fullIp))
|
||||
ipStart := sqlchemy.INET_ATON(q.Field("guest_ip_start"))
|
||||
ipEnd := sqlchemy.INET_ATON(q.Field("guest_ip_end"))
|
||||
|
||||
var ipCondtion sqlchemy.ICondition
|
||||
if exactIpMatch {
|
||||
ipCondtion = sqlchemy.Between(ipField, ipStart, ipEnd)
|
||||
} else {
|
||||
ipCondtion = sqlchemy.OR(sqlchemy.Between(ipField, ipStart, ipEnd), sqlchemy.Contains(q.Field("guest_ip_start"), ip), sqlchemy.Contains(q.Field("guest_ip_end"), ip))
|
||||
}
|
||||
|
||||
q = q.Filter(ipCondtion)
|
||||
q = q.Filter(sqlchemy.OR(conditions...))
|
||||
}
|
||||
|
||||
if len(input.SchedtagId) > 0 {
|
||||
|
||||
@@ -161,18 +161,23 @@ func (manager *SVpcResourceBaseManager) ListItemFilter(
|
||||
query api.VpcFilterListInput,
|
||||
) (*sqlchemy.SQuery, error) {
|
||||
var err error
|
||||
if len(query.VpcId) > 0 {
|
||||
switch query.VpcId {
|
||||
conditions := []sqlchemy.ICondition{}
|
||||
for _, vpcId := range query.VpcId {
|
||||
switch vpcId {
|
||||
case api.CLASSIC_VPC_NAME:
|
||||
q = q.Equals("name", api.CLASSIC_VPC_NAME)
|
||||
conditions = append(conditions, sqlchemy.Equals(q.Field("name"), api.CLASSIC_VPC_NAME))
|
||||
default:
|
||||
_, err := validators.ValidateModel(userCred, VpcManager, &query.VpcId)
|
||||
_, err := validators.ValidateModel(userCred, VpcManager, &vpcId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
q = q.Equals("vpc_id", query.VpcId)
|
||||
conditions = append(conditions, sqlchemy.Equals(q.Field("vpc_id"), vpcId))
|
||||
}
|
||||
}
|
||||
if len(conditions) > 0 {
|
||||
q = q.Filter(sqlchemy.OR(conditions...))
|
||||
}
|
||||
|
||||
subq := VpcManager.Query("id").Snapshot()
|
||||
subq, err = manager.SCloudregionResourceBaseManager.ListItemFilter(ctx, subq, userCred, query.RegionalFilterListInput)
|
||||
if err != nil {
|
||||
|
||||
@@ -764,7 +764,7 @@ func (manager *SZoneManager) ListItemFilter(
|
||||
|
||||
managerStr := query.CloudproviderId
|
||||
if len(managerStr) > 0 {
|
||||
subq := CloudproviderRegionManager.QueryRelatedRegionIds(nil, managerStr)
|
||||
subq := CloudproviderRegionManager.QueryRelatedRegionIds(nil, managerStr...)
|
||||
q = q.In("cloudregion_id", subq)
|
||||
}
|
||||
accountArr := query.CloudaccountId
|
||||
|
||||
@@ -243,7 +243,7 @@ type BaseListOptions struct {
|
||||
ProjectOrganizations []string `help:"filter by projects of specified organizations"`
|
||||
DomainOrganizations []string `help:"filter by domains of specified organizations"`
|
||||
|
||||
Manager string `help:"List objects belonging to the cloud provider" json:"manager,omitempty"`
|
||||
Manager []string `help:"List objects belonging to the cloud provider" json:"manager,omitempty"`
|
||||
Account string `help:"List objects belonging to the cloud account" json:"account,omitempty"`
|
||||
Provider []string `help:"List objects from the provider" choices:"OneCloud|VMware|Aliyun|Apsara|Qcloud|Azure|Aws|Huawei|OpenStack|Ucloud|ZStack|Google|Ctyun|Cloudpods|Nutanix|BingoCloud|IncloudSphere|JDcloud|Proxmox|Ceph|Ecloud|HCSO|HCS|HCSOP|H3C|S3|RemoteFile" json:"provider,omitempty"`
|
||||
Brand []string `help:"List objects belonging to a special brand"`
|
||||
|
||||
@@ -75,7 +75,7 @@ func (opts *DBInstanceCreateOptions) Params() (jsonutils.JSONObject, error) {
|
||||
type DBInstanceListOptions struct {
|
||||
options.BaseListOptions
|
||||
BillingType string `help:"billing type" choices:"postpaid|prepaid"`
|
||||
IpAddr string
|
||||
IpAddr []string
|
||||
}
|
||||
|
||||
func (opts *DBInstanceListOptions) Params() (jsonutils.JSONObject, error) {
|
||||
|
||||
@@ -28,6 +28,7 @@ type ElasticipListOptions struct {
|
||||
UsableEipForAssociateId string `help:"With associate type filter which eip can associate"`
|
||||
OrderByIp string
|
||||
|
||||
IpAddr []string
|
||||
options.BaseListOptions
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ type NetworkListOptions struct {
|
||||
|
||||
GuestIpStart []string `help:"search by guest_ip_start"`
|
||||
GuestIpEnd []string `help:"search by guest_ip_end"`
|
||||
IpMatch []string `help:"search by network ips"`
|
||||
|
||||
BgpType []string `help:"filter by bgp_type"`
|
||||
HostType string `help:"filter by host_type"`
|
||||
|
||||
@@ -49,7 +49,7 @@ type ServerListOptions struct {
|
||||
WithEip *bool `help:"Show Servers with EIP"`
|
||||
WithoutEip *bool `help:"Show Servers without EIP"`
|
||||
OsType string `help:"OS Type" choices:"linux|windows|vmware"`
|
||||
Vpc string `help:"Vpc id or name"`
|
||||
Vpc []string `help:"Vpc id or name"`
|
||||
UsableServerForEip string `help:"Eip id or name"`
|
||||
WithoutUserMeta *bool `help:"Show Servers without user metadata"`
|
||||
EipAssociable *bool `help:"Show Servers can associate with eip"`
|
||||
|
||||
Reference in New Issue
Block a user