fix(region): server usb filter

This commit is contained in:
Zexi Li
2022-05-07 19:23:05 +08:00
parent 2289dca066
commit 39da24facf
2 changed files with 23 additions and 12 deletions
+4 -2
View File
@@ -46,12 +46,14 @@ type ServerListInput struct {
// 只列出裸金属主机
Baremetal *bool `json:"baremetal"`
// 只列出GPU主机
// 只列出透传了 GPU 的主机
Gpu *bool `json:"gpu"`
// 只列出透传了 USB 的主机
Usb *bool `json:"usb"`
// 只列出还有备份机的主机
Backup *bool `json:"bakcup"`
// 列出指定类型的主机
// enum: normal,gpu,backup
// enum: normal,gpu,usb,backup
ServerType string `json:"server_type"`
// 列出管理安全组为指定安全组的主机
AdminSecgroup string `json:"admin_security"`
+19 -10
View File
@@ -463,6 +463,9 @@ func (manager *SGuestManager) ListItemFilter(
case "backup":
query.Gpu = &falseVal
query.Backup = &trueVal
case "usb":
query.Usb = &trueVal
query.Backup = &falseVal
default:
return nil, httperrors.NewInputParameterError("unknown server type %s", query.ServerType)
}
@@ -476,19 +479,25 @@ func (manager *SGuestManager) ListItemFilter(
}
}
if query.Gpu != nil {
isodev := IsolatedDeviceManager.Query().SubQuery()
sgq := isodev.Query(isodev.Field("guest_id")).
Filter(sqlchemy.AND(
sqlchemy.IsNotNull(isodev.Field("guest_id")),
sqlchemy.Startswith(isodev.Field("dev_type"), "GPU")))
cond := sqlchemy.NotIn
if *query.Gpu {
cond = sqlchemy.In
devTypeQ := func(q *sqlchemy.SQuery, checkType *bool, dType string) *sqlchemy.SQuery {
if checkType != nil {
isodev := IsolatedDeviceManager.Query().SubQuery()
sgq := isodev.Query(isodev.Field("guest_id")).
Filter(sqlchemy.AND(
sqlchemy.IsNotNull(isodev.Field("guest_id")),
sqlchemy.Startswith(isodev.Field("dev_type"), dType)))
cond := sqlchemy.NotIn
if *checkType {
cond = sqlchemy.In
}
return q.Filter(cond(q.Field("id"), sgq))
}
q = q.Filter(cond(q.Field("id"), sgq))
return q
}
q = devTypeQ(q, query.Gpu, "GPU")
q = devTypeQ(q, query.Usb, api.USB_TYPE)
groupFilter := query.GroupId
if len(groupFilter) != 0 {
groupObj, err := GroupManager.FetchByIdOrName(userCred, groupFilter)