From b11f117781e191a3f1780d53dc9226143eb9db04 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 13 Feb 2019 15:38:30 +0800 Subject: [PATCH 1/2] minor updates --- pkg/cloudcommon/db/db_dispatcher.go | 25 ++++++++++--------------- pkg/cloudcommon/db/modelbase.go | 1 - pkg/cloudcommon/db/resourcebase.go | 1 - pkg/compute/models/hosts.go | 8 +++++++- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index 5a6b32b250..0c622b5089 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -811,11 +811,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) } @@ -900,22 +899,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/cloudcommon/db/modelbase.go b/pkg/cloudcommon/db/modelbase.go index 207c5d3691..c48df26c5d 100644 --- a/pkg/cloudcommon/db/modelbase.go +++ b/pkg/cloudcommon/db/modelbase.go @@ -3,7 +3,6 @@ package db import ( "context" "database/sql" - "fmt" "net/http" "yunion.io/x/jsonutils" diff --git a/pkg/cloudcommon/db/resourcebase.go b/pkg/cloudcommon/db/resourcebase.go index fc201376b5..c0f3a7ea7e 100644 --- a/pkg/cloudcommon/db/resourcebase.go +++ b/pkg/cloudcommon/db/resourcebase.go @@ -4,7 +4,6 @@ import ( "context" "time" - "yunion.io/x/jsonutils" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/pkg/util/timeutils" "yunion.io/x/sqlchemy" diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index ca77317e46..ef14988e86 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -3272,10 +3272,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) From 4bca4b1e6ef7f884d314cdfc800bf041faa845c6 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 13 Feb 2019 18:23:57 +0800 Subject: [PATCH 2/2] implement baremetal host driver --- pkg/compute/hostdrivers/baremetal.go | 60 ++++++++++++++++++++++++++++ pkg/compute/models/hosts.go | 15 ++++--- 2 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 pkg/compute/hostdrivers/baremetal.go 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 ef14988e86..c70fd3d6c9 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 {