diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index 407cc3e550..0d06bd2610 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -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"` diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 5fbf7c9beb..2ca0962770 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -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)