From d0529e1af04e12ac6ee0cf99124b307506b0037b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E9=9B=A8?= Date: Tue, 19 Nov 2019 17:37:32 +0800 Subject: [PATCH] fix(region): Add public/private feature for Guest Image Public/private subimages firstly when do public/private for guest image. Add cmd "guest-image-public" and "guest-image-private". --- cmd/climc/shell/imageguest.go | 55 +++++++++++++++++++++++++++++++-- pkg/image/models/image_guest.go | 32 +++++++++++++++++++ 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/cmd/climc/shell/imageguest.go b/cmd/climc/shell/imageguest.go index a09a33a9d0..27ddf2827c 100644 --- a/cmd/climc/shell/imageguest.go +++ b/cmd/climc/shell/imageguest.go @@ -16,6 +16,7 @@ package shell import ( "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/modules" @@ -165,8 +166,8 @@ func init() { } printObject(result) return nil - }, - ) + }) + R(&GuestImageOptions{}, "guest-image-mark-unprotected", "Mark image protected", func(s *mcclient.ClientSession, args *GuestImageOptions) error { @@ -178,7 +179,55 @@ func init() { } printObject(result) return nil - }, + }) + + type GuestImageOperationOptions struct { + ID []string `help:"Guest Image ID or Name"` + } + + type GuestImagePublicOptions struct { + GuestImageOperationOptions + Scope string `help:"sharing scope" choices:"system|domain"` + ShareToProject []string `help:"Share to prject"` + } + + R(&GuestImageOperationOptions{}, "guest-image-private", "Make a guest image private", + func(s *mcclient.ClientSession, args *GuestImageOperationOptions) error { + if len(args.ID) == 0 { + return errors.Error("No guest image ID provided") + } else if len(args.ID) == 1 { + result, err := modules.GuestImages.PerformAction(s, args.ID[0], "private", nil) + if err != nil { + return err + } + printObject(result) + } else { + results := modules.GuestImages.BatchPerformAction(s, args.ID, "private", nil) + printBatchResults(results, modules.GuestImages.GetColumns(s)) + } + return nil + }, ) + R(&GuestImagePublicOptions{}, "guest-image-public", "Make a guest image public", + func(s *mcclient.ClientSession, args *GuestImagePublicOptions) error { + params, err := options.StructToParams(args) + if err != nil { + return err + } + if len(args.ID) == 0 { + return errors.Error("No guest image ID provided") + } else if len(args.ID) == 1 { + result, err := modules.GuestImages.PerformAction(s, args.ID[0], "public", params) + if err != nil { + return err + } + printObject(result) + } else { + results := modules.GuestImages.BatchPerformAction(s, args.ID, "public", params) + printBatchResults(results, modules.GuestImages.GetColumns(s)) + } + return nil + }, + ) } diff --git a/pkg/image/models/image_guest.go b/pkg/image/models/image_guest.go index 4aea88652a..ecf9274d89 100644 --- a/pkg/image/models/image_guest.go +++ b/pkg/image/models/image_guest.go @@ -500,3 +500,35 @@ func (self *SGuestImageManager) CleanPendingDeleteImages(ctx context.Context, us images[i].startDeleteTask(ctx, userCred, "", false, true) } } + +func (self *SGuestImage) PerformPublic(ctx context.Context, userCred mcclient.TokenCredential, + query jsonutils.JSONObject, data jsonutils.JSONObject) (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) + if err != nil { + return nil, errors.Wrapf(err, "fail to public subimage %s", images[i].GetId()) + } + } + return self.SSharableVirtualResourceBase.PerformPublic(ctx, userCred, query, data) +} + +func (self *SGuestImage) PerformPrivate(ctx context.Context, userCred mcclient.TokenCredential, + query jsonutils.JSONObject, data jsonutils.JSONObject) (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) + if err != nil { + return nil, errors.Wrapf(err, "fail to private subimage %s", images[i].GetId()) + } + } + return self.SSharableVirtualResourceBase.PerformPrivate(ctx, userCred, query, data) +}