feature: recode structuralized GetExtraDetails and ListItemFilter

This commit is contained in:
Qiu Jian
2020-03-04 14:01:25 +08:00
parent c81a004878
commit cf5498ac24
299 changed files with 16056 additions and 4629 deletions
+66 -18
View File
@@ -29,6 +29,7 @@ import (
"yunion.io/x/pkg/utils"
"yunion.io/x/sqlchemy"
"yunion.io/x/onecloud/pkg/apis"
api "yunion.io/x/onecloud/pkg/apis/image"
"yunion.io/x/onecloud/pkg/appsrv"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
@@ -39,6 +40,7 @@ import (
"yunion.io/x/onecloud/pkg/image/options"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/util/logclient"
"yunion.io/x/onecloud/pkg/util/stringutils2"
)
type SGuestImageManager struct {
@@ -329,20 +331,36 @@ func (self *SGuestImage) getMoreDetails(ctx context.Context, userCred mcclient.T
return out
}
func (self *SGuestImage) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential,
query jsonutils.JSONObject, isList bool) (api.GuestImageDetails, error) {
func (self *SGuestImage) GetExtraDetails(
ctx context.Context,
userCred mcclient.TokenCredential,
query jsonutils.JSONObject,
isList bool,
) (api.GuestImageDetails, error) {
return api.GuestImageDetails{}, nil
}
var err error
out := api.GuestImageDetails{}
out.SharableVirtualResourceDetails, err = self.SSharableVirtualResourceBase.GetExtraDetails(ctx, userCred, query, isList)
if err != nil {
return out, err
}
if !isList && query.Contains("image_ids") {
out.ImageIds, _ = query.Get("image_ids")
func (manager *SGuestImageManager) FetchCustomizeColumns(
ctx context.Context,
userCred mcclient.TokenCredential,
query jsonutils.JSONObject,
objs []interface{},
fields stringutils2.SSortedStrings,
isList bool,
) []api.GuestImageDetails {
rows := make([]api.GuestImageDetails, len(objs))
virtRows := manager.SSharableVirtualResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
for i := range rows {
rows[i] = api.GuestImageDetails{
SharableVirtualResourceDetails: virtRows[i],
}
guestImage := objs[i].(*SGuestImage)
rows[i] = guestImage.getMoreDetails(ctx, userCred, query, rows[i])
}
return self.getMoreDetails(ctx, userCred, query, out), nil
return rows
}
func (self *SGuestImage) PostUpdate(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject,
@@ -502,42 +520,72 @@ func (self *SGuestImageManager) CleanPendingDeleteImages(ctx context.Context, us
}
func (self *SGuestImage) PerformPublic(ctx context.Context, userCred mcclient.TokenCredential,
query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
query jsonutils.JSONObject, input apis.PerformProjectPublicInput) (jsonutils.JSONObject, error) {
images, err := GuestImageJointManager.GetImagesByGuestImageId(self.Id)
if err != nil {
return nil, errors.Wrap(err, "fail to fetch subimages of guest image")
}
for i := range images {
_, err := images[i].PerformPublic(ctx, userCred, query, data)
_, err := images[i].PerformPublic(ctx, userCred, query, input)
if err != nil {
return nil, errors.Wrapf(err, "fail to public subimage %s", images[i].GetId())
}
}
return self.SSharableVirtualResourceBase.PerformPublic(ctx, userCred, query, data)
return self.SSharableVirtualResourceBase.PerformPublic(ctx, userCred, query, input)
}
func (self *SGuestImage) PerformPrivate(ctx context.Context, userCred mcclient.TokenCredential,
query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
query jsonutils.JSONObject, input apis.PerformProjectPrivateInput) (jsonutils.JSONObject, error) {
images, err := GuestImageJointManager.GetImagesByGuestImageId(self.Id)
if err != nil {
return nil, errors.Wrap(err, "fail to fetch subimages of guest image")
}
for i := range images {
_, err := images[i].PerformPrivate(ctx, userCred, query, data)
_, err := images[i].PerformPrivate(ctx, userCred, query, input)
if err != nil {
return nil, errors.Wrapf(err, "fail to private subimage %s", images[i].GetId())
}
}
return self.SSharableVirtualResourceBase.PerformPrivate(ctx, userCred, query, data)
return self.SSharableVirtualResourceBase.PerformPrivate(ctx, userCred, query, input)
}
// 主机镜像列表
func (manager *SGuestImageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.GuestImageListInput) (*sqlchemy.SQuery, error) {
func (manager *SGuestImageManager) ListItemFilter(
ctx context.Context,
q *sqlchemy.SQuery,
userCred mcclient.TokenCredential,
query api.GuestImageListInput,
) (*sqlchemy.SQuery, error) {
q, err := manager.SSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SharableVirtualResourceListInput)
if err != nil {
return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter")
}
return q, nil
}
func (manager *SGuestImageManager) OrderByExtraFields(
ctx context.Context,
q *sqlchemy.SQuery,
userCred mcclient.TokenCredential,
query api.GuestImageListInput,
) (*sqlchemy.SQuery, error) {
var err error
q, err = manager.SSharableVirtualResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.SharableVirtualResourceListInput)
if err != nil {
return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.OrderByExtraFields")
}
return q, nil
}
func (manager *SGuestImageManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
var err error
q, err = manager.SSharableVirtualResourceBaseManager.QueryDistinctExtraField(q, field)
if err == nil {
return q, nil
}
return q, httperrors.ErrNotFound
}
+81 -35
View File
@@ -52,6 +52,7 @@ import (
"yunion.io/x/onecloud/pkg/util/qemuimg"
"yunion.io/x/onecloud/pkg/util/rbacutils"
"yunion.io/x/onecloud/pkg/util/streamutils"
"yunion.io/x/onecloud/pkg/util/stringutils2"
)
const (
@@ -252,7 +253,18 @@ func (self *SImage) CustomizedGetDetailsBody(ctx context.Context, userCred mccli
return nil, nil
}
func (self *SImage) getMoreDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, out api.ImageDetails) api.ImageDetails {
func (self *SImage) getMoreDetails(out api.ImageDetails) api.ImageDetails {
properties, err := ImagePropertyManager.GetProperties(self.Id)
if err != nil {
log.Errorf("ImagePropertyManager.GetProperties fail %s", err)
}
out.Properties = properties
if self.PendingDeleted {
pendingDeletedAt := self.PendingDeletedAt.Add(time.Second * time.Duration(options.Options.PendingDeleteExpireSeconds))
out.AutoDeleteAt = pendingDeletedAt
}
var ossChksum = self.OssChecksum
if len(self.OssChecksum) == 0 {
ossChksum = self.Checksum
@@ -262,42 +274,43 @@ func (self *SImage) getMoreDetails(ctx context.Context, userCred mcclient.TokenC
return out
}
func (self *SImage) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, isList bool) (api.ImageDetails, error) {
var err error
out := api.ImageDetails{}
out.SharableVirtualResourceDetails, err = self.SSharableVirtualResourceBase.GetExtraDetails(ctx, userCred, query, isList)
if err != nil {
return out, err
func (manager *SImageManager) FetchCustomizeColumns(
ctx context.Context,
userCred mcclient.TokenCredential,
query jsonutils.JSONObject,
objs []interface{},
fields stringutils2.SSortedStrings,
isList bool,
) []api.ImageDetails {
rows := make([]api.ImageDetails, len(objs))
virtRows := manager.SSharableVirtualResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
for i := range rows {
image := objs[i].(*SImage)
rows[i] = api.ImageDetails{
SharableVirtualResourceDetails: virtRows[i],
}
rows[i] = image.getMoreDetails(rows[i])
}
properties, err := ImagePropertyManager.GetProperties(self.Id)
if err != nil {
return out, httperrors.NewGeneralError(err)
}
propJson := jsonutils.NewDict()
for k, v := range properties {
propJson.Add(jsonutils.NewString(v), k)
}
out.Properties = propJson
return rows
}
if self.PendingDeleted {
pendingDeletedAt := self.PendingDeletedAt.Add(time.Second * time.Duration(options.Options.PendingDeleteExpireSeconds))
out.AutoDeleteAt = pendingDeletedAt
//extra.Add(jsonutils.NewString(timeutils.FullIsoTime(pendingDeletedAt)), "auto_delete_at")
}
return self.getMoreDetails(ctx, userCred, query, out), nil
func (self *SImage) GetExtraDetails(
ctx context.Context,
userCred mcclient.TokenCredential,
query jsonutils.JSONObject,
isList bool,
) (api.ImageDetails, error) {
return api.ImageDetails{}, nil
}
func (self *SImage) GetExtraDetailsHeaders(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) map[string]string {
headers := make(map[string]string)
_extra, _ := self.SVirtualResourceBase.GetExtraDetails(ctx, userCred, query, false)
extra := _extra.JSON(_extra)
extraRows := self.GetModelManager().FetchCustomizeColumns(ctx, userCred, query, []db.IModel{self}, nil)
if len(extraRows) == 1 {
extra.Update(extraRows[0])
}
details := ImageManager.FetchCustomizeColumns(ctx, userCred, query, []interface{}{self}, nil, false)
extra := jsonutils.Marshal(details[0]).(*jsonutils.JSONDict)
for _, k := range extra.SortedKeys() {
val, _ := extra.GetString(k)
if len(val) > 0 {
@@ -1114,10 +1127,15 @@ func (self *SImage) GetDetailsSubformats(ctx context.Context, userCred mcclient.
}
// 磁盘镜像列表
func (manager *SImageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ImageListInput) (*sqlchemy.SQuery, error) {
func (manager *SImageManager) ListItemFilter(
ctx context.Context,
q *sqlchemy.SQuery,
userCred mcclient.TokenCredential,
query api.ImageListInput,
) (*sqlchemy.SQuery, error) {
q, err := manager.SSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SharableVirtualResourceListInput)
if err != nil {
return nil, err
return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter")
}
fmtJsonArray := query.DiskFormats
if len(fmtJsonArray) > 0 {
@@ -1131,6 +1149,33 @@ func (manager *SImageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ
return q, nil
}
func (manager *SImageManager) OrderByExtraFields(
ctx context.Context,
q *sqlchemy.SQuery,
userCred mcclient.TokenCredential,
query api.ImageListInput,
) (*sqlchemy.SQuery, error) {
var err error
q, err = manager.SSharableVirtualResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.SharableVirtualResourceListInput)
if err != nil {
return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.OrderByExtraFields")
}
return q, nil
}
func (manager *SImageManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
var err error
q, err = manager.SSharableVirtualResourceBaseManager.QueryDistinctExtraField(q, field)
if err == nil {
return q, nil
}
return q, httperrors.ErrNotFound
}
func isActive(localPath string, size int64, chksum string, fastHash string, useFastHash bool) bool {
if len(localPath) == 0 || !fileutils2.Exists(localPath) {
log.Errorf("invalid file: %s", localPath)
@@ -1263,11 +1308,12 @@ func (self *SImage) PerformMarkStandard(
) (jsonutils.JSONObject, error) {
isStandard := jsonutils.QueryBoolean(data, "is_standard", false)
if !self.IsStandard.IsTrue() && isStandard {
params := jsonutils.NewDict()
params.Set("scope", jsonutils.NewString("system"))
_, err := self.PerformPublic(ctx, userCred, query, params)
input := apis.PerformProjectPublicInput{
Scope: "system",
}
_, err := self.PerformPublic(ctx, userCred, query, input)
if err != nil {
return nil, err
return nil, errors.Wrap(err, "PerformPublic")
}
diff, err := db.Update(self, func() error {
self.IsStandard = tristate.True