diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index 27db1a7723..8734f564ce 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -815,11 +815,10 @@ func FetchModelObjects(modelManager IModelManager, query *sqlchemy.SQuery, targe return nil } -func DoCreate(manager IModelManager, ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (IModel, error) { - ownerProjId, err := fetchOwnerProjectId(ctx, manager, userCred, data) - if err != nil { - return nil, err - } +func DoCreate(manager IModelManager, ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject, ownerProjId string) (IModel, error) { + lockman.LockClass(ctx, manager, ownerProjId) + defer lockman.ReleaseClass(ctx, manager, ownerProjId) + return doCreateItem(manager, ctx, userCred, ownerProjId, nil, data) } @@ -908,22 +907,18 @@ func (dispatcher *DBModelDispatcher) Create(ctx context.Context, query jsonutils return nil, httperrors.NewForbiddenError("Not allow to create item") } - model, err := func() (IModel, error) { - lockman.LockClass(ctx, dispatcher.modelManager, ownerProjId) - defer lockman.ReleaseClass(ctx, dispatcher.modelManager, ownerProjId) - - return doCreateItem(dispatcher.modelManager, ctx, userCred, ownerProjId, query, data) - }() - + model, err := DoCreate(dispatcher.modelManager, ctx, userCred, query, data, ownerProjId) if err != nil { log.Errorf("fail to doCreateItem %s", err) return nil, httperrors.NewGeneralError(err) } - lockman.LockObject(ctx, model) - defer lockman.ReleaseObject(ctx, model) + func() { + lockman.LockObject(ctx, model) + defer lockman.ReleaseObject(ctx, model) - model.PostCreate(ctx, userCred, ownerProjId, query, data) + model.PostCreate(ctx, userCred, ownerProjId, query, data) + }() OpsLog.LogEvent(model, ACT_CREATE, model.GetShortDesc(ctx), userCred) logclient.AddActionLog(model, logclient.ACT_CREATE, "", userCred, true) diff --git a/pkg/compute/hostdrivers/baremetal.go b/pkg/compute/hostdrivers/baremetal.go new file mode 100644 index 0000000000..d6de6b4530 --- /dev/null +++ b/pkg/compute/hostdrivers/baremetal.go @@ -0,0 +1,60 @@ +package hostdrivers + +import ( + "context" + "fmt" + + "yunion.io/x/jsonutils" + + "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" + "yunion.io/x/onecloud/pkg/compute/models" +) + +type SBaremetalHostDriver struct { + SBaseHostDriver +} + +func init() { + driver := SBaremetalHostDriver{} + models.RegisterHostDriver(&driver) +} + +func (self *SBaremetalHostDriver) GetHostType() string { + return models.HOST_TYPE_BAREMETAL +} + +func (self *SBaremetalHostDriver) CheckAndSetCacheImage(ctx context.Context, host *models.SHost, storageCache *models.SStoragecache, task taskman.ITask) error { + return fmt.Errorf("not supported") +} + +func (self *SBaremetalHostDriver) RequestAllocateDiskOnStorage(ctx context.Context, host *models.SHost, storage *models.SStorage, disk *models.SDisk, task taskman.ITask, content *jsonutils.JSONDict) error { + return fmt.Errorf("not supported") +} + +func (self *SBaremetalHostDriver) RequestDeallocateDiskOnHost(ctx context.Context, host *models.SHost, storage *models.SStorage, disk *models.SDisk, task taskman.ITask) error { + return fmt.Errorf("not supported") +} + +func (self *SBaremetalHostDriver) RequestPrepareSaveDiskOnHost(ctx context.Context, host *models.SHost, disk *models.SDisk, imageId string, task taskman.ITask) error { + return fmt.Errorf("not supported") +} + +func (self *SBaremetalHostDriver) RequestRebuildDiskOnStorage(ctx context.Context, host *models.SHost, storage *models.SStorage, disk *models.SDisk, task taskman.ITask, content *jsonutils.JSONDict) error { + return fmt.Errorf("not supported") +} + +func (self *SBaremetalHostDriver) RequestResizeDiskOnHost(ctx context.Context, host *models.SHost, storage *models.SStorage, disk *models.SDisk, sizeMb int64, task taskman.ITask) error { + return fmt.Errorf("not supported") +} + +func (self *SBaremetalHostDriver) RequestResizeDiskOnHostOnline(ctx context.Context, host *models.SHost, storage *models.SStorage, disk *models.SDisk, sizeMb int64, task taskman.ITask) error { + return fmt.Errorf("not supported") +} + +func (self *SBaremetalHostDriver) RequestSaveUploadImageOnHost(ctx context.Context, host *models.SHost, disk *models.SDisk, imageId string, task taskman.ITask, data jsonutils.JSONObject) error { + return fmt.Errorf("not supported") +} + +func (self *SBaremetalHostDriver) RequestUncacheImage(ctx context.Context, host *models.SHost, storageCache *models.SStoragecache, task taskman.ITask) error { + return fmt.Errorf("not supported") +} diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 1f287f7d7f..21dfb5f7cc 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -1946,18 +1946,17 @@ func (self *SHost) GetBaremetalServer() *SGuest { if !self.IsBaremetal { return nil } - guestObj, err := db.NewModelObject(GuestManager) - if err != nil { - log.Errorf("%s", err) - return nil - } + guest := SGuest{} + guest.SetModelManager(GuestManager) q := GuestManager.Query().Equals("host_id", self.Id).Equals("hypervisor", HOST_TYPE_BAREMETAL) - err = q.First(guestObj) + err := q.First(&guest) if err != nil { - log.Errorf("query fail %s", err) + if err != sql.ErrNoRows { + log.Errorf("query fail %s", err) + } return nil } - return guestObj.(*SGuest) + return &guest } func (self *SHost) getSchedtags() []SSchedtag { @@ -3283,10 +3282,16 @@ func (self *SHost) PerformConvertHypervisor(ctx context.Context, userCred mcclie if err != nil { return nil, httperrors.NewNotAcceptableError("Convert error: %s", err.Error()) } - guest, err := db.DoCreate(GuestManager, ctx, userCred, nil, params) + ownerProjId := userCred.GetProjectId() + guest, err := db.DoCreate(GuestManager, ctx, userCred, nil, params, ownerProjId) if err != nil { return nil, err } + func() { + lockman.LockObject(ctx, guest) + defer lockman.ReleaseObject(ctx, guest) + guest.PostCreate(ctx, userCred, ownerProjId, nil, params) + }() log.Infof("Host convert to %s", guest.GetName()) db.OpsLog.LogEvent(self, db.ACT_CONVERT_START, "", userCred) db.OpsLog.LogEvent(guest, db.ACT_CREATE, "Convert hypervisor", userCred)