From 0dc352509185c571b04b761d9704f75299e2eef2 Mon Sep 17 00:00:00 2001 From: rainzm Date: Tue, 8 Mar 2022 14:49:28 +0800 Subject: [PATCH 1/3] feat(scheduler): class metadata ignore public system image --- .../algorithm/predicates/class_metadata_predicate.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/scheduler/algorithm/predicates/class_metadata_predicate.go b/pkg/scheduler/algorithm/predicates/class_metadata_predicate.go index a6b13f4b0b..74118cc0fd 100644 --- a/pkg/scheduler/algorithm/predicates/class_metadata_predicate.go +++ b/pkg/scheduler/algorithm/predicates/class_metadata_predicate.go @@ -18,11 +18,13 @@ import ( "context" "fmt" + "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/scheduler/core" + "yunion.io/x/onecloud/pkg/util/rbacutils" ) type ClassMetadataPredicate struct { @@ -97,8 +99,13 @@ func (p *ClassMetadataPredicate) PreExecute(u *core.Unit, cs []core.Candidater) if err != nil { return false, errors.Wrapf(err, "unable to fetch cachedimage %s", disks[0].ImageId) } - stand = &obj.SStandaloneAnonResourceBase - guestSource.keyword = "image" + // no check if image if system public image + public := jsonutils.QueryBoolean(obj.Info, "is_public", false) + publicScope, _ := obj.Info.GetString("public_scope") + if !public || publicScope != string(rbacutils.ScopeSystem) { + stand = &obj.SStandaloneAnonResourceBase + guestSource.keyword = "image" + } case disks[0].SnapshotId != "": obj, err := models.SnapshotManager.FetchById(disks[0].SnapshotId) if err != nil { From af1f721f502579941abd2f5869e79b6836643587 Mon Sep 17 00:00:00 2001 From: rainzm Date: Tue, 8 Mar 2022 19:02:48 +0800 Subject: [PATCH 2/3] fix(region): get mountpoint from guestdisk not disk's metadata --- pkg/compute/models/guestdisks.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/compute/models/guestdisks.go b/pkg/compute/models/guestdisks.go index 44d825612a..83f4881b25 100644 --- a/pkg/compute/models/guestdisks.go +++ b/pkg/compute/models/guestdisks.go @@ -249,6 +249,7 @@ func (self *SGuestdisk) ToDiskConfig() *api.DiskConfig { } conf := disk.ToDiskConfig() conf.Index = int(self.Index) + conf.Mountpoint = self.Mountpoint return conf } From e2e19ba771ca2036f0c428a083ac91dd1775536c Mon Sep 17 00:00:00 2001 From: rainzm Date: Tue, 8 Mar 2022 19:04:18 +0800 Subject: [PATCH 3/3] feat(region): try to restore to the original project when the instance backup is recoveryed --- pkg/compute/models/instance_backup.go | 2 -- pkg/compute/tasks/instance_backup_recovery_task.go | 13 +++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pkg/compute/models/instance_backup.go b/pkg/compute/models/instance_backup.go index 364307119f..917ee561e2 100644 --- a/pkg/compute/models/instance_backup.go +++ b/pkg/compute/models/instance_backup.go @@ -247,8 +247,6 @@ func (manager *SInstanceBackupManager) fillInstanceBackup(ctx context.Context, u instanceBackup.CloudregionId = zone.CloudregionId guestSchedInput.HostId = "" - guestSchedInput.Project = "" - guestSchedInput.Domain = "" for i := 0; i < len(guestSchedInput.Networks); i++ { guestSchedInput.Networks[i].Mac = "" guestSchedInput.Networks[i].Address = "" diff --git a/pkg/compute/tasks/instance_backup_recovery_task.go b/pkg/compute/tasks/instance_backup_recovery_task.go index af2011a498..bdb9f991ce 100644 --- a/pkg/compute/tasks/instance_backup_recovery_task.go +++ b/pkg/compute/tasks/instance_backup_recovery_task.go @@ -16,9 +16,11 @@ package tasks import ( "context" + "database/sql" "fmt" "yunion.io/x/jsonutils" + "yunion.io/x/pkg/errors" "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -59,12 +61,23 @@ func (self *InstanceBackupRecoveryTask) OnInit(ctx context.Context, obj db.IStan if serverName == "" { serverName, _ = ib.ServerConfig.GetString("name") } + project, _ := ib.ServerConfig.GetString("project") sourceInput := &compute.ServerCreateInput{} sourceInput.ServerConfigs = &compute.ServerConfigs{} sourceInput.GenerateName = serverName sourceInput.Description = fmt.Sprintf("recovery from instance backup %s", ib.GetName()) sourceInput.InstanceBackupId = ib.GetId() sourceInput.Hypervisor = compute.HYPERVISOR_KVM + if project != "" { + tenant, err := db.TenantCacheManager.FetchTenantByIdOrName(ctx, project) + if err != nil && errors.Cause(err) != sql.ErrNoRows { + self.taskFailed(ctx, ib, jsonutils.NewString(err.Error())) + return + } + if tenant != nil { + sourceInput.Project = project + } + } taskHeader := self.GetTaskRequestHeader() session := auth.GetSession(ctx, self.UserCred, "", "") session.Header.Set(mcclient.TASK_NOTIFY_URL, taskHeader.Get(mcclient.TASK_NOTIFY_URL))