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 } diff --git a/pkg/compute/models/instance_backup.go b/pkg/compute/models/instance_backup.go index 57f963f7ac..f0c162170e 100644 --- a/pkg/compute/models/instance_backup.go +++ b/pkg/compute/models/instance_backup.go @@ -248,8 +248,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)) 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 {