diff --git a/pkg/cloudcommon/cronman/cronman.go b/pkg/cloudcommon/cronman/cronman.go index f9fa6cc936..caae5fd13a 100644 --- a/pkg/cloudcommon/cronman/cronman.go +++ b/pkg/cloudcommon/cronman/cronman.go @@ -205,7 +205,7 @@ func (job *SCronJob) runJobInWorker(isStart bool) { } }() - log.Debugf("Cron job: %s started", job.Name) + // log.Debugf("Cron job: %s started", job.Name) ctx := context.Background() ctx = context.WithValue(ctx, appctx.APP_CONTEXT_KEY_APPNAME, "Region-Cron-Service") userCred := auth.AdminCredential() diff --git a/pkg/cloudcommon/db/adminsharablevirtual.go b/pkg/cloudcommon/db/adminsharablevirtual.go index 13bd2ed27c..98771b8d46 100644 --- a/pkg/cloudcommon/db/adminsharablevirtual.go +++ b/pkg/cloudcommon/db/adminsharablevirtual.go @@ -3,9 +3,11 @@ package db import ( "strings" + "context" "yunion.io/x/jsonutils" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/logclient" "yunion.io/x/pkg/utils" ) @@ -37,6 +39,7 @@ func (manager *SAdminSharableVirtualResourceBaseManager) ValidateCreateData(man } func (model *SAdminSharableVirtualResourceBase) SetInfo( + ctx context.Context, userCred mcclient.TokenCredential, man IAdminSharableVirtualModelManager, obj IAdminSharableVirtualModel, @@ -59,12 +62,13 @@ func (model *SAdminSharableVirtualResourceBase) SetInfo( } } if isChanged { - return model.setInfo(userCred, man, records) + return model.setInfo(ctx, userCred, man, records) } return nil } func (model *SAdminSharableVirtualResourceBase) AddInfo( + ctx context.Context, userCred mcclient.TokenCredential, man IAdminSharableVirtualModelManager, obj IAdminSharableVirtualModel, @@ -83,12 +87,13 @@ func (model *SAdminSharableVirtualResourceBase) AddInfo( } } if len(adds) > 0 { - return model.setInfo(userCred, man, oldRecs) + return model.setInfo(ctx, userCred, man, oldRecs) } return nil } func (model *SAdminSharableVirtualResourceBase) RemoveInfo( + ctx context.Context, userCred mcclient.TokenCredential, man IAdminSharableVirtualModelManager, obj IAdminSharableVirtualModel, @@ -111,12 +116,12 @@ func (model *SAdminSharableVirtualResourceBase) RemoveInfo( return httperrors.NewNotAcceptableError("Not allow empty records") } if len(removes) > 0 { - return model.setInfo(userCred, man, oldRecs) + return model.setInfo(ctx, userCred, man, oldRecs) } return nil } -func (model *SAdminSharableVirtualResourceBase) setInfo( +func (model *SAdminSharableVirtualResourceBase) setInfo(ctx context.Context, userCred mcclient.TokenCredential, man IAdminSharableVirtualModelManager, records []string, @@ -124,7 +129,7 @@ func (model *SAdminSharableVirtualResourceBase) setInfo( if man.GetRecordsLimit() > 0 && len(records) > man.GetRecordsLimit() { return httperrors.NewNotAcceptableError("Records limit exceeded.") } - diff, err := model.GetModelManager().TableSpec().Update(model, func() error { + diff, err := Update(model, func() error { model.Records = strings.Join(records, man.GetRecordsSeparator()) return nil }) @@ -133,6 +138,7 @@ func (model *SAdminSharableVirtualResourceBase) setInfo( } if diff != nil { OpsLog.LogEvent(model, ACT_UPDATE, diff, userCred) + logclient.AddActionLogWithContext(ctx, model, logclient.ACT_UPDATE, diff, userCred, true) } return err } diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index 5256b6cafd..f6c88ffa8d 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -1231,7 +1231,7 @@ func updateItem(manager IModelManager, item IModel, ctx context.Context, userCre item.PreUpdate(ctx, userCred, query, dataDict) - diff, err := manager.TableSpec().Update(item, func() error { + diff, err := Update(item, func() error { filterData := dataDict.CopyIncludes(updateFields(manager, userCred)...) err = filterData.Unmarshal(item) if err != nil { @@ -1293,24 +1293,23 @@ func (dispatcher *DBModelDispatcher) Update(ctx context.Context, idStr string, q } func DeleteModel(ctx context.Context, userCred mcclient.TokenCredential, item IModel) error { - manager := item.GetModelManager() // log.Debugf("Ready to delete %s %s %#v", jsonutils.Marshal(item), item, manager) - _, err := manager.TableSpec().Update(item, func() error { + _, err := Update(item, func() error { return item.MarkDelete() }) if err != nil { msg := fmt.Sprintf("save update error %s", err) log.Errorf(msg) - logclient.AddActionLogWithContext(ctx, item, logclient.ACT_DELETE, msg, userCred, false) + // logclient.AddActionLogWithContext(ctx, item, logclient.ACT_DELETE, msg, userCred, false) return httperrors.NewGeneralError(err) } OpsLog.LogEvent(item, ACT_DELETE, item.GetShortDesc(ctx), userCred) - logclient.AddActionLogWithContext(ctx, item, logclient.ACT_DELETE, item.GetShortDesc(ctx), userCred, true) + logclient.AddSimpleActionLog(item, logclient.ACT_DELETE, item.GetShortDesc(ctx), userCred, true) return nil } func deleteItem(manager IModelManager, model IModel, ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { - log.Debugf("deleteItem %s", jsonutils.Marshal(model)) + // log.Debugf("deleteItem %s", jsonutils.Marshal(model)) var isAllow bool if consts.IsRbacEnabled() { diff --git a/pkg/cloudcommon/db/enabledstatusstandalone.go b/pkg/cloudcommon/db/enabledstatusstandalone.go index d394230149..5cd6715519 100644 --- a/pkg/cloudcommon/db/enabledstatusstandalone.go +++ b/pkg/cloudcommon/db/enabledstatusstandalone.go @@ -30,7 +30,7 @@ func (self *SEnabledStatusStandaloneResourceBase) AllowPerformEnable(ctx context func (self *SEnabledStatusStandaloneResourceBase) PerformEnable(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if !self.Enabled { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := Update(self, func() error { self.Enabled = true return nil }) @@ -50,7 +50,7 @@ func (self *SEnabledStatusStandaloneResourceBase) AllowPerformDisable(ctx contex func (self *SEnabledStatusStandaloneResourceBase) PerformDisable(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if self.Enabled { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := Update(self, func() error { self.Enabled = false return nil }) diff --git a/pkg/cloudcommon/db/metadata.go b/pkg/cloudcommon/db/metadata.go index b6ac604efe..10928e70ab 100644 --- a/pkg/cloudcommon/db/metadata.go +++ b/pkg/cloudcommon/db/metadata.go @@ -115,7 +115,7 @@ func (manager *SMetadataManager) RemoveAll(ctx context.Context, model IModel, us changes := make([]sMetadataChange, 0) for _, rec := range records { if len(rec.Value) > 0 { - _, err := manager.TableSpec().Update(&rec, func() error { + _, err := Update(&rec, func() error { rec.Value = "" return nil }) @@ -163,7 +163,7 @@ func (manager *SMetadataManager) SetAll(ctx context.Context, obj IModel, store m return err } } else { - _, err := manager.TableSpec().Update(&record, func() error { + _, err := Update(&record, func() error { record.Value = valStr return nil }) diff --git a/pkg/cloudcommon/db/opslog.go b/pkg/cloudcommon/db/opslog.go index 0ffee3eb56..2f1fa0ba88 100644 --- a/pkg/cloudcommon/db/opslog.go +++ b/pkg/cloudcommon/db/opslog.go @@ -29,6 +29,9 @@ const ( ACT_ATTACH = "attach" ACT_DETACH = "detach" + ACT_SYNC_UPDATE = "sync_update" + ACT_SYNC_CREATE = "sync_create" + ACT_START_CREATE_BACKUP = "start_create_backup" ACT_CREATE_BACKUP = "create_backup" ACT_CREATE_BACKUP_FAILED = "create_backup_failed" diff --git a/pkg/cloudcommon/db/sharablevirtual.go b/pkg/cloudcommon/db/sharablevirtual.go index c19791b3ba..7698d6d37e 100644 --- a/pkg/cloudcommon/db/sharablevirtual.go +++ b/pkg/cloudcommon/db/sharablevirtual.go @@ -5,6 +5,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/logclient" "yunion.io/x/sqlchemy" ) @@ -47,10 +48,14 @@ func (model *SSharableVirtualResourceBase) AllowPerformPrivate(ctx context.Conte func (model *SSharableVirtualResourceBase) PerformPublic(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if !model.IsPublic { - _, err := model.GetModelManager().TableSpec().Update(model, func() error { + diff, err := Update(model, func() error { model.IsPublic = true return nil }) + if err == nil { + OpsLog.LogEvent(model, ACT_UPDATE, diff, userCred) + logclient.AddActionLogWithContext(ctx, model, logclient.ACT_UPDATE, diff, userCred, true) + } return nil, err } return nil, nil @@ -58,10 +63,14 @@ func (model *SSharableVirtualResourceBase) PerformPublic(ctx context.Context, us func (model *SSharableVirtualResourceBase) PerformPrivate(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if model.IsPublic { - _, err := model.GetModelManager().TableSpec().Update(model, func() error { + diff, err := Update(model, func() error { model.IsPublic = false return nil }) + if err == nil { + OpsLog.LogEvent(model, ACT_UPDATE, diff, userCred) + logclient.AddActionLogWithContext(ctx, model, logclient.ACT_UPDATE, diff, userCred, true) + } return nil, err } return nil, nil diff --git a/pkg/cloudcommon/db/standalone.go b/pkg/cloudcommon/db/standalone.go index dc13c87673..16722eecce 100644 --- a/pkg/cloudcommon/db/standalone.go +++ b/pkg/cloudcommon/db/standalone.go @@ -8,6 +8,7 @@ import ( "yunion.io/x/log" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/logclient" "yunion.io/x/pkg/util/regutils" "yunion.io/x/pkg/util/stringutils" "yunion.io/x/pkg/utils" @@ -257,10 +258,17 @@ func (model SStandaloneResourceBase) GetExternalId() string { return model.ExternalId } -func (model *SStandaloneResourceBase) SetExternalId(idstr string) error { - _, err := model.GetModelManager().TableSpec().Update(model, func() error { - model.ExternalId = idstr - return nil - }) - return err +func (model *SStandaloneResourceBase) SetExternalId(userCred mcclient.TokenCredential, idstr string) error { + if model.ExternalId != idstr { + diff, err := Update(model, func() error { + model.ExternalId = idstr + return nil + }) + if err != nil { + OpsLog.LogEvent(model, ACT_UPDATE, diff, userCred) + logclient.AddSimpleActionLog(model, ACT_UPDATE, diff, userCred, true) + } + return err + } + return nil } diff --git a/pkg/cloudcommon/db/statusstandalone.go b/pkg/cloudcommon/db/statusstandalone.go index 751abe7d9c..325c7f0950 100644 --- a/pkg/cloudcommon/db/statusstandalone.go +++ b/pkg/cloudcommon/db/statusstandalone.go @@ -7,6 +7,7 @@ import ( "yunion.io/x/pkg/utils" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/logclient" ) type SStatusStandaloneResourceBase struct { @@ -28,7 +29,7 @@ func (model *SStatusStandaloneResourceBase) SetStatus(userCred mcclient.TokenCre return nil } oldStatus := model.Status - _, err := model.GetModelManager().TableSpec().Update(model, func() error { + _, err := Update(model, func() error { model.Status = status return nil }) @@ -41,6 +42,7 @@ func (model *SStatusStandaloneResourceBase) SetStatus(userCred mcclient.TokenCre notes = fmt.Sprintf("%s: %s", notes, reason) } OpsLog.LogEvent(model, ACT_UPDATE_STATUS, notes, userCred) + logclient.AddSimpleActionLog(model, logclient.ACT_UPDATE, notes, userCred, true) // if strings.Contains(notes, "fail") { // logclient.AddActionLog(model, logclient.ACT_VM_SYNC_STATUS, notes, userCred, false) // } diff --git a/pkg/cloudcommon/db/taskman/subtasks.go b/pkg/cloudcommon/db/taskman/subtasks.go index 2ef4e56966..9653f3ffa7 100644 --- a/pkg/cloudcommon/db/taskman/subtasks.go +++ b/pkg/cloudcommon/db/taskman/subtasks.go @@ -67,7 +67,7 @@ func (manager *SSubTaskmanager) GetInitSubtasks(taskId string, stage string) []S } func (self *SSubTask) SaveResults(failed bool, result jsonutils.JSONObject) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { if failed { self.Status = SUBTASK_FAIL } else { diff --git a/pkg/cloudcommon/db/taskman/tasks.go b/pkg/cloudcommon/db/taskman/tasks.go index e9c703ac6a..fd48a0d255 100644 --- a/pkg/cloudcommon/db/taskman/tasks.go +++ b/pkg/cloudcommon/db/taskman/tasks.go @@ -467,7 +467,7 @@ func (self *STask) GetRequestContext() appctx.AppContextData { } func (self *STask) SaveRequestContext(data *appctx.AppContextData) { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { params := self.Params.CopyExcludes(REQUEST_CONTEXT_KEY) params.Add(jsonutils.Marshal(data), REQUEST_CONTEXT_KEY) self.Params = params @@ -483,7 +483,7 @@ func (self *STask) SaveParams(data *jsonutils.JSONDict) error { } func (self *STask) SetStage(stageName string, data *jsonutils.JSONDict) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { params := jsonutils.NewDict() params.Update(self.Params) if data != nil { @@ -624,7 +624,7 @@ func (self *STask) GetPendingUsage(quota quotas.IQuota) error { } func (self *STask) SetPendingUsage(quota quotas.IQuota) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { params := self.Params.CopyExcludes(PENDING_USAGE_KEY) params.Add(jsonutils.Marshal(quota), PENDING_USAGE_KEY) self.Params = params @@ -637,7 +637,7 @@ func (self *STask) SetPendingUsage(quota quotas.IQuota) error { } func (self *STask) ClearPendingUsage() error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { params := self.Params.CopyExcludes(PENDING_USAGE_KEY) self.Params = params return nil diff --git a/pkg/cloudcommon/db/tenantcache.go b/pkg/cloudcommon/db/tenantcache.go index ee42bc40fc..3219a23e82 100644 --- a/pkg/cloudcommon/db/tenantcache.go +++ b/pkg/cloudcommon/db/tenantcache.go @@ -107,7 +107,7 @@ func (manager *STenantCacheManager) Save(ctx context.Context, idStr string, name } if err == nil { obj := objo.(*STenant) - _, err = manager.TableSpec().Update(obj, func() error { + _, err = Update(obj, func() error { obj.Id = idStr obj.Name = name obj.Domain = domain diff --git a/pkg/cloudcommon/db/update.go b/pkg/cloudcommon/db/update.go new file mode 100644 index 0000000000..b17d1341c5 --- /dev/null +++ b/pkg/cloudcommon/db/update.go @@ -0,0 +1,20 @@ +package db + +import ( + "context" + + "yunion.io/x/sqlchemy" + + "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" +) + +func Update(model IModel, updateFunc func() error) (map[string]sqlchemy.SUpdateDiff, error) { + return model.GetModelManager().TableSpec().Update(model, updateFunc) +} + +func UpdateWithLock(ctx context.Context, model IModel, updateFunc func() error) (map[string]sqlchemy.SUpdateDiff, error) { + lockman.LockObject(ctx, model) + defer lockman.ReleaseObject(ctx, model) + + return Update(model, updateFunc) +} diff --git a/pkg/cloudcommon/db/usercache.go b/pkg/cloudcommon/db/usercache.go index 7b01d845bc..f8b036ea3a 100644 --- a/pkg/cloudcommon/db/usercache.go +++ b/pkg/cloudcommon/db/usercache.go @@ -62,7 +62,7 @@ func (manager *SUserCacheManager) Save(ctx context.Context, idStr string, name s return nil, err } if err == nil { - _, err = manager.TableSpec().Update(obj, func() error { + _, err = Update(obj, func() error { obj.Id = idStr obj.Name = name obj.Domain = domain diff --git a/pkg/cloudcommon/db/virtualresource.go b/pkg/cloudcommon/db/virtualresource.go index 63bfa5fa5f..8c35975317 100644 --- a/pkg/cloudcommon/db/virtualresource.go +++ b/pkg/cloudcommon/db/virtualresource.go @@ -213,6 +213,10 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC if tobj == nil { return nil, httperrors.NewTenantNotFoundError("tenant %s not found", tenant) } + if tobj.GetId() == model.ProjectId { + // do nothing + return nil, nil + } q := model.GetModelManager().Query().Equals("name", model.GetName()) q = q.Equals("tenant_id", tobj.GetId()) q = q.NotEquals("id", model.GetId()) @@ -225,36 +229,38 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC formerObj := NewTenant(model.ProjectId, "unknown") former = &formerObj } - _, err := model.GetModelManager().TableSpec().Update(model, func() error { + diff, err := Update(model, func() error { model.ProjectId = tobj.GetId() return nil }) if err != nil { + logclient.AddActionLogWithContext(ctx, model, logclient.ACT_CHANGE_OWNER, err, userCred, false) return nil, err } OpsLog.SyncOwner(model, former, userCred) - logclient.AddActionLogWithContext(ctx, model, logclient.ACT_CHANGE_OWNER, nil, userCred, true) + logclient.AddActionLogWithContext(ctx, model, logclient.ACT_CHANGE_OWNER, diff, userCred, true) return nil, nil } func (model *SVirtualResourceBase) DoPendingDelete(ctx context.Context, userCred mcclient.TokenCredential) error { - err := model.PendingDelete() - if err == nil { - OpsLog.LogEvent(model, ACT_PENDING_DELETE, nil, userCred) - } - return err + return model.MarkPendingDelete(userCred) } -func (model *SVirtualResourceBase) PendingDelete() error { - _, err := model.GetModelManager().TableSpec().Update(model, func() error { - model.PendingDeleted = true - model.PendingDeletedAt = timeutils.UtcNow() - return nil - }) - if err != nil { - log.Errorf("PendingDelete fail %s", err) +func (model *SVirtualResourceBase) MarkPendingDelete(userCred mcclient.TokenCredential) error { + if !model.PendingDeleted { + diff, err := Update(model, func() error { + model.PendingDeleted = true + model.PendingDeletedAt = timeutils.UtcNow() + return nil + }) + if err != nil { + log.Errorf("MarkPendingDelete update fail %s", err) + return err + } + OpsLog.LogEvent(model, ACT_PENDING_DELETE, diff, userCred) + logclient.AddSimpleActionLog(model, logclient.ACT_PENDING_DELETE, diff, userCred, true) } - return err + return nil } func (model *SVirtualResourceBase) Delete(ctx context.Context, userCred mcclient.TokenCredential) error { @@ -294,17 +300,31 @@ func (model *SVirtualResourceBase) VirtualModelManager() IVirtualModelManager { } func (model *SVirtualResourceBase) CancelPendingDelete(ctx context.Context, userCred mcclient.TokenCredential) error { + if model.PendingDeleted { + return model.MarkCancelPendingDelete(ctx, userCred) + } + return nil +} + +func (model *SVirtualResourceBase) MarkCancelPendingDelete(ctx context.Context, userCred mcclient.TokenCredential) error { ownerProjId := model.GetOwnerProjectId() lockman.LockClass(ctx, model.GetModelManager(), ownerProjId) defer lockman.ReleaseClass(ctx, model.GetModelManager(), ownerProjId) - _, err := model.GetModelManager().TableSpec().Update(model, func() error { + diff, err := Update(model, func() error { model.Name = GenerateName(model.GetModelManager(), ownerProjId, model.Name) model.PendingDeleted = false + model.PendingDeletedAt = time.Time{} return nil }) - return err + if err != nil { + log.Errorf("MarkCancelPendingDelete fail %s", err) + return err + } + OpsLog.LogEvent(model, ACT_CANCEL_DELETE, diff, userCred) + logclient.AddSimpleActionLog(model, logclient.ACT_CANCEL_DELETE, diff, userCred, true) + return nil } func (model *SVirtualResourceBase) GetShortDesc(ctx context.Context) *jsonutils.JSONDict { diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index cd7fa10e32..2ff9432c69 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -162,7 +162,7 @@ func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu if createErr != nil { return nil, createErr } - guest.SetExternalId(iVM.GetGlobalId()) + guest.SetExternalId(task.GetUserCred(), iVM.GetGlobalId()) log.Debugf("VMcreated %s, wait status ready ...", iVM.GetGlobalId()) err = cloudprovider.WaitStatus(iVM, models.VM_READY, time.Second*5, time.Second*1800) diff --git a/pkg/compute/guestdrivers/aws.go b/pkg/compute/guestdrivers/aws.go index 9de620a4d7..5251929ee0 100644 --- a/pkg/compute/guestdrivers/aws.go +++ b/pkg/compute/guestdrivers/aws.go @@ -133,7 +133,7 @@ func (self *SAwsGuestDriver) RequestDeployGuestOnHost(ctx context.Context, guest return nil, createErr } - guest.SetExternalId(iVM.GetGlobalId()) + guest.SetExternalId(task.GetUserCred(), iVM.GetGlobalId()) log.Debugf("VMcreated %s, wait status running ...", iVM.GetGlobalId()) err = cloudprovider.WaitStatus(iVM, models.VM_RUNNING, time.Second*5, time.Second*1800) diff --git a/pkg/compute/guestdrivers/azure.go b/pkg/compute/guestdrivers/azure.go index b8e85dbdac..9903a98c21 100644 --- a/pkg/compute/guestdrivers/azure.go +++ b/pkg/compute/guestdrivers/azure.go @@ -158,7 +158,7 @@ func (self *SAzureGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gue return nil, createErr } - guest.SetExternalId(iVM.GetGlobalId()) + guest.SetExternalId(task.GetUserCred(), iVM.GetGlobalId()) log.Debugf("VMcreated %s, wait status running ...", iVM.GetGlobalId()) if err = cloudprovider.WaitStatus(iVM, models.VM_RUNNING, time.Second*5, time.Second*1800); err != nil { @@ -247,7 +247,7 @@ func (self *SAzureGuestDriver) RequestSyncConfigOnHost(ctx context.Context, gues if err != nil { return nil, err } - if err = secgroupCache.SetExternalId(extID); err != nil { + if err = secgroupCache.SetExternalId(task.GetUserCred(), extID); err != nil { return nil, err } return nil, iVM.AssignSecurityGroup(extID) diff --git a/pkg/compute/guestdrivers/baremetals.go b/pkg/compute/guestdrivers/baremetals.go index 34f581c1b2..004a184f3d 100644 --- a/pkg/compute/guestdrivers/baremetals.go +++ b/pkg/compute/guestdrivers/baremetals.go @@ -55,7 +55,7 @@ func (self *SBaremetalGuestDriver) GetMaxVMemSizeGB() int { return 4096 } -func (self *SBaremetalGuestDriver) PrepareDiskRaidConfig(host *models.SHost, params *jsonutils.JSONDict) error { +func (self *SBaremetalGuestDriver) PrepareDiskRaidConfig(userCred mcclient.TokenCredential, host *models.SHost, params *jsonutils.JSONDict) error { baremetalStorage := models.ConvertStorageInfo2BaremetalStorages(host.StorageInfo) if baremetalStorage == nil { return fmt.Errorf("Convert storage info error") @@ -68,7 +68,7 @@ func (self *SBaremetalGuestDriver) PrepareDiskRaidConfig(host *models.SHost, par if err != nil { return err } - return host.UpdateDiskConfig(layouts) + return host.UpdateDiskConfig(userCred, layouts) } else { var nConfs = make([]*baremetal.BaremetalDiskConfig, 0) for i := 0; i < len(confs); i++ { @@ -84,7 +84,7 @@ func (self *SBaremetalGuestDriver) PrepareDiskRaidConfig(host *models.SHost, par if err != nil { return err } - return host.UpdateDiskConfig(layouts) + return host.UpdateDiskConfig(userCred, layouts) } } @@ -338,7 +338,7 @@ func (self *SBaremetalGuestDriver) OnGuestDeployTaskDataReceived(ctx context.Con disk := iDisk.(*models.SDisk) diskSize, _ := disks[i].Int("size") notes := fmt.Sprintf("%s=>%s", disk.Status, models.DISK_READY) - _, err := disk.GetModelManager().TableSpec().Update(disk, func() error { + _, err := db.Update(disk, func() error { if disk.DiskSize < int(diskSize) { disk.DiskSize = int(diskSize) } @@ -422,7 +422,7 @@ func (self *SBaremetalGuestDriver) OnDeleteGuestFinalCleanup(ctx context.Context } baremetal := guest.GetHost() if baremetal != nil { - return baremetal.UpdateDiskConfig(nil) + return baremetal.UpdateDiskConfig(userCred, nil) } return nil } diff --git a/pkg/compute/guestdrivers/huawei.go b/pkg/compute/guestdrivers/huawei.go index 76c040417f..ce87473604 100644 --- a/pkg/compute/guestdrivers/huawei.go +++ b/pkg/compute/guestdrivers/huawei.go @@ -123,7 +123,7 @@ func (self *SHuaweiGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu if createErr != nil { return nil, createErr } - guest.SetExternalId(iVM.GetGlobalId()) + guest.SetExternalId(task.GetUserCred(), iVM.GetGlobalId()) log.Debugf("VMcreated %s, wait status ready ...", iVM.GetGlobalId()) err = cloudprovider.WaitStatus(iVM, models.VM_RUNNING, time.Second*5, time.Second*1800) diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 1e716a50a7..848b25b4ed 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -331,7 +331,7 @@ func (self *SManagedVirtualizedGuestDriver) OnGuestDeployTaskDataReceived(ctx co uuid, _ := data.GetString("uuid") if len(uuid) > 0 { - guest.SetExternalId(uuid) + guest.SetExternalId(task.GetUserCred(), uuid) } recycle := false @@ -354,7 +354,7 @@ func (self *SManagedVirtualizedGuestDriver) OnGuestDeployTaskDataReceived(ctx co } for i := 0; i < len(diskInfo); i += 1 { disk := disks[i].GetDisk() - _, err = disk.GetModelManager().TableSpec().Update(disk, func() error { + _, err = db.Update(disk, func() error { disk.DiskSize = diskInfo[i].Size disk.ExternalId = diskInfo[i].Uuid disk.DiskType = diskInfo[i].DiskType @@ -388,7 +388,7 @@ func (self *SManagedVirtualizedGuestDriver) OnGuestDeployTaskDataReceived(ctx co } db.OpsLog.LogEvent(disk, db.ACT_ALLOCATE, disk.GetShortDesc(ctx), task.GetUserCred()) guestdisk := guest.GetGuestDisk(disk.Id) - _, err = guestdisk.GetModelManager().TableSpec().Update(guestdisk, func() error { + _, err = db.Update(guestdisk, func() error { guestdisk.Driver = diskInfo[i].Driver guestdisk.CacheMode = diskInfo[i].CacheMode return nil @@ -464,7 +464,7 @@ func (self *SManagedVirtualizedGuestDriver) RequestSyncConfigOnHost(ctx context. if err != nil { return nil, err } - if err = secgroupCache.SetExternalId(extID); err != nil { + if err = secgroupCache.SetExternalId(task.GetUserCred(), extID); err != nil { return nil, err } externalIds = append(externalIds, extID) diff --git a/pkg/compute/guestdrivers/openstack.go b/pkg/compute/guestdrivers/openstack.go index b22ad00eb1..8694b691d5 100644 --- a/pkg/compute/guestdrivers/openstack.go +++ b/pkg/compute/guestdrivers/openstack.go @@ -123,7 +123,7 @@ func (self *SOpenStackGuestDriver) RequestDeployGuestOnHost(ctx context.Context, } // 避免部署失败后,不能删除openstack平台机器 - guest.SetExternalId(iVM.GetGlobalId()) + guest.SetExternalId(task.GetUserCred(), iVM.GetGlobalId()) log.Debugf("VMcreated %s, wait status running ...", iVM.GetGlobalId()) err = cloudprovider.WaitStatus(iVM, models.VM_RUNNING, time.Second*5, time.Second*1800) @@ -273,7 +273,7 @@ func (self *SOpenStackGuestDriver) RequestSyncConfigOnHost(ctx context.Context, if err != nil { return nil, err } - if err = secgroupCache.SetExternalId(extID); err != nil { + if err = secgroupCache.SetExternalId(task.GetUserCred(), extID); err != nil { return nil, err } externalIds = append(externalIds, extID) diff --git a/pkg/compute/guestdrivers/qcloud.go b/pkg/compute/guestdrivers/qcloud.go index e07af3536c..0312ea6c1f 100644 --- a/pkg/compute/guestdrivers/qcloud.go +++ b/pkg/compute/guestdrivers/qcloud.go @@ -181,7 +181,7 @@ func (self *SQcloudGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu if createErr != nil { return nil, createErr } - guest.SetExternalId(iVM.GetGlobalId()) + guest.SetExternalId(task.GetUserCred(), iVM.GetGlobalId()) log.Debugf("VMcreated %s, wait status running ...", iVM.GetGlobalId()) err = cloudprovider.WaitStatus(iVM, models.VM_RUNNING, time.Second*5, time.Second*1800) @@ -346,7 +346,7 @@ func (self *SQcloudGuestDriver) RequestSyncConfigOnHost(ctx context.Context, gue if err != nil { return nil, err } - if err = secgroupCache.SetExternalId(extID); err != nil { + if err = secgroupCache.SetExternalId(task.GetUserCred(), extID); err != nil { return nil, err } externalIds = append(externalIds, extID) diff --git a/pkg/compute/guestdrivers/virtualization.go b/pkg/compute/guestdrivers/virtualization.go index 9215b36ce2..f43347a519 100644 --- a/pkg/compute/guestdrivers/virtualization.go +++ b/pkg/compute/guestdrivers/virtualization.go @@ -27,7 +27,7 @@ func (self *SVirtualizedGuestDriver) GetMaxVMemSizeGB() int { return 512 } -func (self *SVirtualizedGuestDriver) PrepareDiskRaidConfig(host *models.SHost, params *jsonutils.JSONDict) error { +func (self *SVirtualizedGuestDriver) PrepareDiskRaidConfig(userCred mcclient.TokenCredential, host *models.SHost, params *jsonutils.JSONDict) error { // do nothing return nil } diff --git a/pkg/compute/hostdrivers/base.go b/pkg/compute/hostdrivers/base.go index e215c3c908..eb98851fee 100644 --- a/pkg/compute/hostdrivers/base.go +++ b/pkg/compute/hostdrivers/base.go @@ -8,6 +8,7 @@ import ( "yunion.io/x/log" "yunion.io/x/pkg/utils" + "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/baremetal" "yunion.io/x/onecloud/pkg/compute/models" @@ -77,7 +78,7 @@ func (self *SBaseHostDriver) FinishUnconvert(ctx context.Context, userCred mccli if adminNic == nil { return fmt.Errorf("admin nic is nil") } - host.GetModelManager().TableSpec().Update(host, func() error { + db.Update(host, func() error { host.AccessIp = adminNic.IpAddr host.Enabled = true host.HostType = models.HOST_TYPE_BAREMETAL @@ -96,7 +97,7 @@ func (self *SBaseHostDriver) CleanSchedCache(host *models.SHost) error { return host.ClearSchedDescCache() } func (self *SBaseHostDriver) FinishConvert(userCred mcclient.TokenCredential, host *models.SHost, guest *models.SGuest, hostType string) error { - _, err := guest.GetModelManager().TableSpec().Update(guest, func() error { + _, err := db.Update(guest, func() error { guest.VmemSize = 0 guest.VcpuCount = 0 return nil @@ -106,14 +107,14 @@ func (self *SBaseHostDriver) FinishConvert(userCred mcclient.TokenCredential, ho } for _, guestdisk := range guest.GetDisks() { disk := guestdisk.GetDisk() - disk.GetModelManager().TableSpec().Update(disk, func() error { + db.Update(disk, func() error { disk.DiskSize = 0 return nil }) } bs := host.GetBaremetalstorage().GetStorage() bs.SetStatus(userCred, models.STORAGE_OFFLINE, "") - host.GetModelManager().TableSpec().Update(host, func() error { + db.Update(host, func() error { host.CpuReserved = 0 host.MemReserved = 0 host.AccessIp = guest.GetRealIps()[0] diff --git a/pkg/compute/hostdrivers/managedvirtual.go b/pkg/compute/hostdrivers/managedvirtual.go index 331010df04..f3e931b175 100644 --- a/pkg/compute/hostdrivers/managedvirtual.go +++ b/pkg/compute/hostdrivers/managedvirtual.go @@ -231,10 +231,7 @@ func (self *SManagedVirtualizationHostDriver) RequestAllocateDiskOnStorage(ctx c if err != nil { return nil, err } - _, err = disk.GetModelManager().TableSpec().Update(disk, func() error { - disk.ExternalId = iDisk.GetGlobalId() - return nil - }) + err = disk.SetExternalId(task.GetUserCred(), iDisk.GetGlobalId()) if err != nil { log.Errorf("Update disk externalId err: %v", err) return nil, err diff --git a/pkg/compute/models/baremetalagents.go b/pkg/compute/models/baremetalagents.go index 65fcf1c30b..89899f62d1 100644 --- a/pkg/compute/models/baremetalagents.go +++ b/pkg/compute/models/baremetalagents.go @@ -103,7 +103,7 @@ func (self *SBaremetalagent) AllowPerformEnable(ctx context.Context, userCred mc func (self *SBaremetalagent) PerformEnable(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if self.Status != BAREMETAL_AGENT_ENABLED { - self.GetModelManager().TableSpec().Update(self, func() error { + db.Update(self, func() error { self.Status = BAREMETAL_AGENT_ENABLED return nil }) @@ -118,7 +118,7 @@ func (self *SBaremetalagent) AllowPerformDisable(ctx context.Context, userCred m func (self *SBaremetalagent) PerformDisable(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if self.Status != BAREMETAL_AGENT_DISABLED { - self.GetModelManager().TableSpec().Update(self, func() error { + db.Update(self, func() error { self.Status = BAREMETAL_AGENT_DISABLED return nil }) @@ -133,7 +133,7 @@ func (self *SBaremetalagent) AllowPerformOnline(ctx context.Context, userCred mc func (self *SBaremetalagent) PerformOnline(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if self.Status == BAREMETAL_AGENT_OFFLINE { - self.GetModelManager().TableSpec().Update(self, func() error { + db.Update(self, func() error { self.Status = BAREMETAL_AGENT_ENABLED return nil }) @@ -148,7 +148,7 @@ func (self *SBaremetalagent) AllowPerformOffline(ctx context.Context, userCred m func (self *SBaremetalagent) PerformOffline(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if self.Status == BAREMETAL_AGENT_ENABLED { - self.GetModelManager().TableSpec().Update(self, func() error { + db.Update(self, func() error { self.Status = BAREMETAL_AGENT_OFFLINE return nil }) diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index 10ff08b712..9a36430a04 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -196,7 +196,7 @@ func (manager *SCachedimageManager) cacheGlanceImageInfo(ctx context.Context, us return nil, err } } else { // update - diff, err := manager.TableSpec().Update(&imageCache, func() error { + diff, err := db.Update(&imageCache, func() error { imageCache.Size = size imageCache.Info = info imageCache.LastSync = timeutils.UtcNow() @@ -312,7 +312,7 @@ func (self *SCachedimage) addRefCount() { if self.GetStatus() != "active" { return } - _, err := CachedimageManager.TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.RefCount += 1 self.LastRef = timeutils.UtcNow() return nil @@ -387,7 +387,7 @@ func (self *SCachedimage) canDeleteLastCache() bool { } func (self *SCachedimage) syncWithCloudImage(ctx context.Context, userCred mcclient.TokenCredential, image cloudprovider.ICloudImage) error { - diff, err := self.GetModelManager().TableSpec().Update(self, func() error { + diff, err := db.UpdateWithLock(ctx, self, func() error { self.Name = image.GetName() self.Size = image.GetSize() self.ExternalId = image.GetGlobalId() @@ -397,15 +397,18 @@ func (self *SCachedimage) syncWithCloudImage(ctx context.Context, userCred mccli self.LastSync = time.Now().UTC() return nil }) - db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) + db.OpsLog.LogEvent(self, db.ACT_SYNC_UPDATE, diff, userCred) return err } func (manager *SCachedimageManager) newFromCloudImage(ctx context.Context, userCred mcclient.TokenCredential, image cloudprovider.ICloudImage) (*SCachedimage, error) { + lockman.LockClass(ctx, manager, "") + defer lockman.ReleaseClass(ctx, manager, "") + cachedImage := SCachedimage{} cachedImage.SetModelManager(manager) - cachedImage.Name = image.GetName() + cachedImage.Name = db.GenerateName(manager, "", image.GetName()) cachedImage.Size = image.GetSize() sImage := cloudprovider.CloudImage2Image(image) cachedImage.Info = jsonutils.Marshal(&sImage) diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 405da8c322..5f049e7201 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -16,6 +16,7 @@ import ( "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/httperrors" @@ -56,6 +57,10 @@ type SCloudaccount struct { IsOnPremise bool `nullable:"false" get:"user" create:"optional" list:"user" default:"false"` Provider string `width:"64" charset:"ascii" list:"admin" create:"admin_required"` + + AutoSync bool `default:"false" create:"admin_optional" list:"admin"` + MaxSyncIntvlSecs int `default:"86400" create:"admin_optional" list:"admin"` + MinSyncIntvlSecs int `default:"60" create:"admin_optional" list:"admin"` } func (self *SCloudaccountManager) AllowListItems(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool { @@ -202,7 +207,7 @@ func (self *SCloudaccount) savePassword(secret string) error { return err } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.Secret = sec return nil }) @@ -281,7 +286,7 @@ func (self *SCloudaccount) PerformUpdateCredential(ctx context.Context, userCred if account.Account != self.Account { for _, cloudprovider := range self.GetCloudproviders() { if cloudprovider.Account == self.Account { - _, err = cloudprovider.GetModelManager().TableSpec().Update(&cloudprovider, func() error { + _, err = db.Update(&cloudprovider, func() error { cloudprovider.Account = account.Account return nil }) @@ -291,7 +296,7 @@ func (self *SCloudaccount) PerformUpdateCredential(ctx context.Context, userCred } } } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.Account = account.Account return nil }) @@ -319,7 +324,7 @@ func (self *SCloudaccount) PerformUpdateCredential(ctx context.Context, userCred func (self *SCloudaccount) syncAttributes(factory cloudprovider.ICloudProviderFactory) error { if self.IsPublicCloud != factory.IsPublicCloud() || self.IsOnPremise != factory.IsOnPremise() { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.IsPublicCloud = factory.IsPublicCloud() self.IsOnPremise = factory.IsOnPremise() return nil @@ -350,21 +355,18 @@ func (self *SCloudaccount) StartSyncCloudProviderInfoTask(ctx context.Context, u taskItems = append(taskItems, &cloudProviders[i]) } } - originState := self.Status - self.MarkStartSync(userCred) - task, err := taskman.TaskManager.NewParallelTask(ctx, "CloudAccountSyncInfoTask", taskItems, userCred, params, "", "", nil) if err != nil { log.Errorf("CloudAccountSyncInfoTask newTask error %s", err) - self.SetStatus(userCred, originState, err.Error()) - } else { - task.ScheduleRun(nil) + return err } + self.markStartSync(userCred) + task.ScheduleRun(nil) return nil } -func (self *SCloudaccount) MarkStartSync(userCred mcclient.TokenCredential) { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SCloudaccount) markStartSync(userCred mcclient.TokenCredential) { + _, err := db.Update(self, func() error { self.LastSync = timeutils.UtcNow() return nil }) @@ -417,13 +419,12 @@ func (self *SCloudaccount) ImportSubAccount(ctx context.Context, userCred mcclie return nil, isNew, err } - _, err = CloudproviderManager.TableSpec().Update(provider, func() error { - provider.Name = subAccount.Name + _, err = db.UpdateWithLock(ctx, provider, func() error { + // provider.Name = subAccount.Name provider.Enabled = true provider.HealthStatus = subAccount.HealthStatus return nil }) - if err != nil { log.Errorf("Update cloudprovider error: %v", err) return nil, isNew, err @@ -434,23 +435,33 @@ func (self *SCloudaccount) ImportSubAccount(ctx context.Context, userCred mcclie // not found, create a new cloudprovider isNew = true - newCloudprovider := SCloudprovider{} - newCloudprovider.Account = subAccount.Account - newCloudprovider.Secret = self.Secret - newCloudprovider.CloudaccountId = self.Id - newCloudprovider.Provider = self.Provider - newCloudprovider.AccessUrl = self.AccessUrl - newCloudprovider.Enabled = true - newCloudprovider.Status = CLOUD_PROVIDER_CONNECTED - newCloudprovider.HealthStatus = subAccount.HealthStatus - newCloudprovider.Name = subAccount.Name - if !autoCreateProject { - newCloudprovider.ProjectId = auth.AdminCredential().GetProjectId() - } + newCloudprovider, err := func() (*SCloudprovider, error) { + lockman.LockClass(ctx, CloudproviderManager, "") + defer lockman.ReleaseClass(ctx, CloudproviderManager, "") - newCloudprovider.SetModelManager(CloudproviderManager) + newCloudprovider := SCloudprovider{} + newCloudprovider.Account = subAccount.Account + newCloudprovider.Secret = self.Secret + newCloudprovider.CloudaccountId = self.Id + newCloudprovider.Provider = self.Provider + newCloudprovider.AccessUrl = self.AccessUrl + newCloudprovider.Enabled = true + newCloudprovider.Status = CLOUD_PROVIDER_CONNECTED + newCloudprovider.HealthStatus = subAccount.HealthStatus + newCloudprovider.Name = db.GenerateName(CloudproviderManager, "", subAccount.Name) + if !autoCreateProject { + newCloudprovider.ProjectId = auth.AdminCredential().GetProjectId() + } - err := CloudproviderManager.TableSpec().Insert(&newCloudprovider) + newCloudprovider.SetModelManager(CloudproviderManager) + + err := CloudproviderManager.TableSpec().Insert(&newCloudprovider) + if err != nil { + return nil, err + } else { + return &newCloudprovider, nil + } + }() if err != nil { log.Errorf("insert new cloudprovider fail %s", err) return nil, isNew, err @@ -464,14 +475,14 @@ func (self *SCloudaccount) ImportSubAccount(ctx context.Context, userCred mcclie newCloudprovider.savePassword(passwd) if autoCreateProject { - err = newCloudprovider.syncProject(ctx) + err = newCloudprovider.syncProject(ctx, userCred) if err != nil { log.Errorf("syncproject fail %s", err) return nil, isNew, err } } - return &newCloudprovider, isNew, nil + return newCloudprovider, isNew, nil } func (self *SCloudaccount) AllowPerformImport(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { @@ -504,21 +515,6 @@ func (self *SCloudaccount) startImportSubAccountTask(ctx context.Context, userCr return nil } -/*func getSubAccounts(name, accessUrl, account, secret, provider string) ([]cloudprovider.SSubAccount, error) { - iprovider, err := cloudprovider.GetProvider("", name, accessUrl, account, secret, provider) - if err != nil { - return nil, err - } - return iprovider.GetSubAccounts() -}*/ - -/*func (self *SCloudaccount) SaveSysInfo(info jsonutils.JSONObject) { - self.GetModelManager().TableSpec().Update(self, func() error { - self.Sysinfo = info - return nil - }) -}*/ - func (manager *SCloudaccountManager) FetchCloudaccountById(accountId string) *SCloudaccount { providerObj, err := manager.FetchById(accountId) if err != nil { @@ -721,7 +717,7 @@ func migrateCloudprovider(cloudprovider *SCloudprovider) error { } } - _, err = CloudproviderManager.TableSpec().Update(cloudprovider, func() error { + _, err = db.Update(cloudprovider, func() error { cloudprovider.CloudaccountId = account.Id return nil }) diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 196aa77a02..685007cf90 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -21,6 +21,7 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/util/logclient" ) const ( @@ -251,7 +252,7 @@ func (self *SCloudprovider) CanSync() bool { } } -func (self *SCloudprovider) syncProject(ctx context.Context) error { +func (self *SCloudprovider) syncProject(ctx context.Context, userCred mcclient.TokenCredential) error { if len(self.ProjectId) > 0 { _, err := db.TenantCacheManager.FetchTenantById(ctx, self.ProjectId) if err != nil && err != sql.ErrNoRows { @@ -293,16 +294,22 @@ func (self *SCloudprovider) syncProject(ctx context.Context) error { projectId = tenant.Id } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { - self.ProjectId = projectId - return nil - }) + return self.saveProject(userCred, projectId) +} - if err != nil { - log.Errorf("update projectId fail: %s", err) - return err +func (self *SCloudprovider) saveProject(userCred mcclient.TokenCredential, projectId string) error { + if projectId != self.ProjectId { + diff, err := db.Update(self, func() error { + self.ProjectId = projectId + return nil + }) + if err != nil { + log.Errorf("update projectId fail: %s", err) + return err + } + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) + logclient.AddSimpleActionLog(self, db.ACT_UPDATE, diff, userCred, true) } - return nil } @@ -456,6 +463,7 @@ func (self *SCloudprovider) StartSyncCloudProviderInfoTask(ctx context.Context, log.Errorf("startSyncCloudProviderInfoTask newTask error %s", err) return err } + self.markStartSync(userCred) task.ScheduleRun(nil) return nil } @@ -479,11 +487,7 @@ func (self *SCloudprovider) PerformChangeProject(ctx context.Context, userCred m return nil, nil } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { - self.ProjectId = tenant.Id - return nil - }) - + err = self.saveProject(userCred, tenant.Id) if err != nil { log.Errorf("Update cloudprovider error: %v", err) return nil, httperrors.NewGeneralError(err) @@ -492,8 +496,8 @@ func (self *SCloudprovider) PerformChangeProject(ctx context.Context, userCred m return nil, self.StartSyncCloudProviderInfoTask(ctx, userCred, &SSyncRange{FullSync: true, ProjectSync: true}, "") } -func (self *SCloudprovider) MarkStartSync(userCred mcclient.TokenCredential) { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SCloudprovider) markStartSync(userCred mcclient.TokenCredential) { + _, err := db.Update(self, func() error { self.LastSync = timeutils.UtcNow() return nil }) @@ -527,7 +531,7 @@ func (self *SCloudprovider) savePassword(secret string) error { return err } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.Secret = sec return nil }) @@ -539,7 +543,7 @@ func (self *SCloudprovider) GetCloudaccount() *SCloudaccount { } func (self *SCloudprovider) SaveSysInfo(info jsonutils.JSONObject, version string) { - self.GetModelManager().TableSpec().Update(self, func() error { + db.Update(self, func() error { self.Sysinfo = info self.Version = version return nil @@ -665,7 +669,7 @@ func (manager *SCloudproviderManager) InitializeData() error { log.Errorf("migrateVcenterInfo fail %s", err) return err } - _, err = VCenterManager.TableSpec().Update(&vc, func() error { + _, err = db.Update(&vc, func() error { return vc.MarkDelete() }) if err != nil { @@ -691,7 +695,7 @@ func (manager *SCloudproviderManager) InitializeData() error { return err } for i := 0; i < len(providers); i += 1 { - _, err := CloudproviderManager.TableSpec().Update(&providers[i], func() error { + _, err := db.Update(&providers[i], func() error { providers[i].ProjectId = auth.AdminCredential().GetProjectId() return nil }) diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index 8264dcab16..197ae0c75a 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -14,6 +14,7 @@ import ( "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudprovider" ) @@ -183,6 +184,9 @@ func (manager *SCloudregionManager) GetRegionByProvider(provider string) ([]SClo } func (manager *SCloudregionManager) SyncRegions(ctx context.Context, userCred mcclient.TokenCredential, externalIdPrefix string, regions []cloudprovider.ICloudRegion) ([]SCloudregion, []cloudprovider.ICloudRegion, compare.SyncResult) { + lockman.LockClass(ctx, manager, "") + defer lockman.ReleaseClass(ctx, manager, "") + syncResult := compare.SyncResult{} localRegions := make([]SCloudregion, 0) remoteRegions := make([]cloudprovider.ICloudRegion, 0) @@ -205,29 +209,16 @@ func (manager *SCloudregionManager) SyncRegions(ctx context.Context, userCred mc return nil, nil, syncResult } for i := 0; i < len(removed); i += 1 { - err = removed[i].ValidateDeleteCondition(ctx) - if err == nil { - err = removed[i].Delete(ctx, userCred) - if err != nil { - syncResult.DeleteError(err) - } else { - syncResult.Delete() - } + err = removed[i].syncRemoveCloudRegion(ctx, userCred) + if err != nil { + syncResult.DeleteError(err) } else { - err = removed[i].SetStatus(userCred, CLOUD_REGION_STATUS_OUTOFSERVICE, "Out of sync") - if err == nil { - _, err = removed[i].PerformDisable(ctx, userCred, nil, nil) - } - if err != nil { - syncResult.DeleteError(err) - } else { - syncResult.Delete() - } + syncResult.Delete() } } for i := 0; i < len(commondb); i += 1 { // update - err = commondb[i].syncWithCloudRegion(commonext[i]) + err = commondb[i].syncWithCloudRegion(ctx, userCred, commonext[i]) if err != nil { syncResult.UpdateError(err) } else { @@ -237,7 +228,7 @@ func (manager *SCloudregionManager) SyncRegions(ctx context.Context, userCred mc } } for i := 0; i < len(added); i += 1 { - new, err := manager.newFromCloudRegion(added[i]) + new, err := manager.newFromCloudRegion(ctx, userCred, added[i]) if err != nil { syncResult.AddError(err) } else { @@ -249,8 +240,25 @@ func (manager *SCloudregionManager) SyncRegions(ctx context.Context, userCred mc return localRegions, remoteRegions, syncResult } -func (self *SCloudregion) syncWithCloudRegion(cloudRegion cloudprovider.ICloudRegion) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SCloudregion) syncRemoveCloudRegion(ctx context.Context, userCred mcclient.TokenCredential) error { + lockman.LockObject(ctx, self) + defer lockman.ReleaseObject(ctx, self) + + err := self.ValidateDeleteCondition(ctx) + if err == nil { + err = self.Delete(ctx, userCred) + } + if err != nil { + err = self.SetStatus(userCred, CLOUD_REGION_STATUS_OUTOFSERVICE, "Out of sync") + if err == nil { + _, err = self.PerformDisable(ctx, userCred, nil, nil) + } + } + return err +} + +func (self *SCloudregion) syncWithCloudRegion(ctx context.Context, userCred mcclient.TokenCredential, cloudRegion cloudprovider.ICloudRegion) error { + diff, err := db.UpdateWithLock(ctx, self, func() error { self.Name = cloudRegion.GetName() self.Status = cloudRegion.GetStatus() self.SGeographicInfo = cloudRegion.GetGeographicInfo() @@ -262,16 +270,18 @@ func (self *SCloudregion) syncWithCloudRegion(cloudRegion cloudprovider.ICloudRe }) if err != nil { log.Errorf("syncWithCloudRegion %s", err) + return err } - return err + db.OpsLog.LogEvent(self, db.ACT_SYNC_UPDATE, diff, userCred) + return nil } -func (manager *SCloudregionManager) newFromCloudRegion(cloudRegion cloudprovider.ICloudRegion) (*SCloudregion, error) { +func (manager *SCloudregionManager) newFromCloudRegion(ctx context.Context, userCred mcclient.TokenCredential, cloudRegion cloudprovider.ICloudRegion) (*SCloudregion, error) { region := SCloudregion{} region.SetModelManager(manager) region.ExternalId = cloudRegion.GetGlobalId() - region.Name = cloudRegion.GetName() + region.Name = db.GenerateName(manager, "", cloudRegion.GetName()) region.SGeographicInfo = cloudRegion.GetGeographicInfo() region.Status = cloudRegion.GetStatus() region.Enabled = true @@ -284,6 +294,7 @@ func (manager *SCloudregionManager) newFromCloudRegion(cloudRegion cloudprovider log.Errorf("newFromCloudRegion fail %s", err) return nil, err } + db.OpsLog.LogEvent(®ion, db.ACT_CREATE, region.GetShortDesc(ctx), userCred) return ®ion, nil } diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 6d4960af37..b20a78e2b3 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -480,7 +480,7 @@ func (disk *SDisk) SetStorageByHost(hostId string, diskConfig *SDiskConfig) erro if err != nil { return err } - _, err = disk.GetModelManager().TableSpec().Update(disk, func() error { + _, err = db.Update(disk, func() error { disk.StorageId = storage.Id return nil }) @@ -999,8 +999,9 @@ func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.Toke if provider.GetFactory().IsSupportPrepaidResources() && len(guests) == 1 && guests[0].IsPrepaidRecycle() { recycle = true } - _, err := self.GetModelManager().TableSpec().Update(self, func() error { - extDisk.Refresh() + extDisk.Refresh() + + _, err := db.Update(self, func() error { // self.Name = extDisk.GetName() self.Status = extDisk.GetStatus() self.DiskFormat = extDisk.GetDiskFormat() @@ -1499,12 +1500,17 @@ func (self *SDisk) SetDiskReady(ctx context.Context, userCred mcclient.TokenCred } } -func (self *SDisk) SwitchToBackup() error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SDisk) SwitchToBackup(userCred mcclient.TokenCredential) error { + diff, err := db.Update(self, func() error { self.StorageId, self.BackupStorageId = self.BackupStorageId, self.StorageId return nil }) - return err + if err != nil { + log.Errorf("SwitchToBackup fail %s", err) + return err + } + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) + return nil } func (self *SDisk) ClearHostSchedCache() error { @@ -1670,7 +1676,7 @@ func (disk *SDisk) StratCreateBackupTask(ctx context.Context, userCred mcclient. } func (self *SDisk) SaveRenewInfo(ctx context.Context, userCred mcclient.TokenCredential, bc *billing.SBillingCycle, expireAt *time.Time) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { if self.BillingType != BILLING_TYPE_PREPAID { self.BillingType = BILLING_TYPE_PREPAID } diff --git a/pkg/compute/models/dnsrecords.go b/pkg/compute/models/dnsrecords.go index a5843c5a69..cfbfbe7c31 100644 --- a/pkg/compute/models/dnsrecords.go +++ b/pkg/compute/models/dnsrecords.go @@ -14,6 +14,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/logclient" ) type SDnsRecordManager struct { @@ -378,8 +379,8 @@ func (rec *SDnsRecord) ValidateUpdateData(ctx context.Context, userCred mcclient return rec.SAdminSharableVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, data) } -func (rec *SDnsRecord) AddInfo(userCred mcclient.TokenCredential, data jsonutils.JSONObject) error { - return rec.SAdminSharableVirtualResourceBase.AddInfo(userCred, DnsRecordManager, rec, data) +func (rec *SDnsRecord) AddInfo(ctx context.Context, userCred mcclient.TokenCredential, data jsonutils.JSONObject) error { + return rec.SAdminSharableVirtualResourceBase.AddInfo(ctx, userCred, DnsRecordManager, rec, data) } func (rec *SDnsRecord) AllowPerformAddRecords(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { @@ -397,7 +398,7 @@ func (rec *SDnsRecord) PerformAddRecords(ctx context.Context, userCred mcclient. if oldType != "" && oldType != newType { return nil, httperrors.NewNotAcceptableError("Cannot mix different types of records, %s != %s", oldType, newType) } - err = rec.AddInfo(userCred, data) + err = rec.AddInfo(ctx, userCred, data) return nil, err } @@ -406,7 +407,7 @@ func (rec *SDnsRecord) AllowPerformRemoveRecords(ctx context.Context, userCred m } func (rec *SDnsRecord) PerformRemoveRecords(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { - err := rec.SAdminSharableVirtualResourceBase.RemoveInfo(userCred, DnsRecordManager, rec, data, false) + err := rec.SAdminSharableVirtualResourceBase.RemoveInfo(ctx, userCred, DnsRecordManager, rec, data, false) return nil, err } @@ -416,7 +417,7 @@ func (rec *SDnsRecord) AllowPerformEnable(ctx context.Context, userCred mcclient func (rec *SDnsRecord) PerformEnable(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if !rec.Enabled { - _, err := rec.GetModelManager().TableSpec().Update(rec, func() error { + diff, err := db.Update(rec, func() error { rec.Enabled = true return nil }) @@ -424,6 +425,8 @@ func (rec *SDnsRecord) PerformEnable(ctx context.Context, userCred mcclient.Toke log.Errorf("enabling dnsrecords for %s failed: %s", rec.Name, err) return nil, err } + db.OpsLog.LogEvent(rec, db.ACT_ENABLE, diff, userCred) + logclient.AddActionLogWithContext(ctx, rec, logclient.ACT_ENABLE, diff, userCred, true) } return nil, nil } @@ -434,7 +437,7 @@ func (rec *SDnsRecord) AllowPerformDisable(ctx context.Context, userCred mcclien func (rec *SDnsRecord) PerformDisable(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if rec.Enabled { - _, err := rec.GetModelManager().TableSpec().Update(rec, func() error { + diff, err := db.Update(rec, func() error { rec.Enabled = false return nil }) @@ -442,6 +445,8 @@ func (rec *SDnsRecord) PerformDisable(ctx context.Context, userCred mcclient.Tok log.Errorf("disabling dnsrecords for %s failed: %s", rec.Name, err) return nil, err } + db.OpsLog.LogEvent(rec, db.ACT_DISABLE, diff, userCred) + logclient.AddActionLogWithContext(ctx, rec, logclient.ACT_DISABLE, diff, userCred, true) } return nil, nil } diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index efcdf1b517..256d618710 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -229,7 +229,7 @@ func (manager *SElasticipManager) SyncEips(ctx context.Context, userCred mcclien } } for i := 0; i < len(commondb); i += 1 { - err = commondb[i].SyncWithCloudEip(userCred, commonext[i], projectId, projectSync) + err = commondb[i].SyncWithCloudEip(ctx, userCred, commonext[i], projectId, projectSync) if err != nil { syncResult.UpdateError(err) } else { @@ -283,8 +283,8 @@ func (self *SElasticip) SyncInstanceWithCloudEip(ctx context.Context, userCred m return nil } -func (self *SElasticip) SyncWithCloudEip(userCred mcclient.TokenCredential, ext cloudprovider.ICloudEIP, projectId string, projectSync bool) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SElasticip) SyncWithCloudEip(ctx context.Context, userCred mcclient.TokenCredential, ext cloudprovider.ICloudEIP, projectId string, projectSync bool) error { + diff, err := db.UpdateWithLock(ctx, self, func() error { // self.Name = ext.GetName() self.Bandwidth = ext.GetBandwidth() @@ -304,11 +304,16 @@ func (self *SElasticip) SyncWithCloudEip(userCred mcclient.TokenCredential, ext }) if err != nil { log.Errorf("SyncWithCloudEip fail %s", err) + return err } - return err + db.OpsLog.LogEvent(self, db.ACT_SYNC_UPDATE, diff, userCred) + return nil } func (manager *SElasticipManager) newFromCloudEip(ctx context.Context, userCred mcclient.TokenCredential, extEip cloudprovider.ICloudEIP, region *SCloudregion, projectId string) (*SElasticip, error) { + lockman.LockClass(ctx, manager, "") + defer lockman.ReleaseClass(ctx, manager, "") + eip := SElasticip{} eip.SetModelManager(manager) @@ -333,7 +338,7 @@ func (manager *SElasticipManager) newFromCloudEip(ctx context.Context, userCred return nil, err } - db.OpsLog.LogEvent(&eip, db.ACT_SYNC_CLOUD_EIP, eip.GetShortDesc(ctx), userCred) + db.OpsLog.LogEvent(&eip, db.ACT_SYNC_CREATE, eip.GetShortDesc(ctx), userCred) return &eip, nil } @@ -385,7 +390,7 @@ func (self *SElasticip) Dissociate(ctx context.Context, userCred mcclient.TokenC if vm == nil { log.Errorf("dissociate VM not exists???") } - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.AssociateId = "" self.AssociateType = "" return nil @@ -411,7 +416,7 @@ func (self *SElasticip) AssociateVM(ctx context.Context, userCred mcclient.Token if len(self.AssociateType) > 0 { return fmt.Errorf("EIP has been associated!!") } - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.AssociateType = "server" self.AssociateId = vm.Id return nil @@ -852,7 +857,7 @@ func (self *SElasticip) DoChangeBandwidth(userCred mcclient.TokenCredential, ban changes := jsonutils.NewDict() changes.Add(jsonutils.NewInt(int64(self.Bandwidth)), "obw") - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Bandwidth = bandwidth return nil }) diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index b1cae7d671..a8b6f070dc 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -330,16 +330,17 @@ func (self *SGuest) PerformDeploy(ctx context.Context, userCred mcclient.TokenCr kwargs.Set("delete_public_key", jsonutils.NewString(okey.PublicKey)) } - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + diff, err := db.Update(self, func() error { self.KeypairId = kpId return nil }) - if err != nil { log.Errorf("update keypair fail: %s", err) return nil, httperrors.NewInternalServerError(err.Error()) } + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) + kwargs.Set("reset_password", jsonutils.JSONTrue) } } @@ -776,6 +777,21 @@ func (self *SGuest) AllowPerformRevokeSecgroup(ctx context.Context, userCred mcc return self.IsOwner(userCred) || db.IsAdminAllowPerform(userCred, self, "revoke-secgroup") } +func (self *SGuest) saveDefaultSecgroupId(userCred mcclient.TokenCredential, secGrpId string) error { + if secGrpId != self.SecgrpId { + diff, err := db.Update(self, func() error { + self.SecgrpId = "default" + return nil + }) + if err != nil { + log.Errorf("saveDefaultSecgroupId fail %s", err) + return err + } + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) + } + return nil +} + func (self *SGuest) revokeSecgroup(ctx context.Context, userCred mcclient.TokenCredential, secgroup *SSecurityGroup) error { if secgroup == nil { return fmt.Errorf("failed to revoke null secgroup") @@ -785,11 +801,7 @@ func (self *SGuest) revokeSecgroup(ctx context.Context, userCred mcclient.TokenC } secgroups := self.GetSecgroups() if len(secgroups) <= 1 { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { - self.SecgrpId = "default" - return nil - }) - return err + return self.saveDefaultSecgroupId(userCred, "default") } for _, _secgroup := range secgroups { // 从guestsecgroups中移除一个安全组,并将guest的 secgroupId 设为此安全组ID @@ -798,11 +810,7 @@ func (self *SGuest) revokeSecgroup(ctx context.Context, userCred mcclient.TokenC if err != nil { return err } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { - self.SecgrpId = _secgroup.Id - return nil - }) - return err + return self.saveDefaultSecgroupId(userCred, _secgroup.Id) } } return nil @@ -860,14 +868,13 @@ func (self *SGuest) PerformAssignSecgroup(ctx context.Context, userCred mcclient return nil, err } - if err := SecurityGroupManager.ValidateName(secgrpV.Model.GetName()); err != nil { + err := SecurityGroupManager.ValidateName(secgrpV.Model.GetName()) + if err != nil { return nil, httperrors.NewInputParameterError("The secgroup name %s does not meet the requirements, please change the name", secgrpV.Model.GetName()) } - if _, err := self.GetModelManager().TableSpec().Update(self, func() error { - self.SecgrpId = secgrpV.Model.GetId() - return nil - }); err != nil { + err = self.saveDefaultSecgroupId(userCred, secgrpV.Model.GetId()) + if err != nil { return nil, err } @@ -917,23 +924,19 @@ func (self *SGuest) PerformSetSecgroup(ctx context.Context, userCred mcclient.To setSecgroupNames = append(setSecgroupNames, secgrp.GetName()) } - if err := self.RevokeAllSecgroups(ctx, userCred); err != nil { + err := self.RevokeAllSecgroups(ctx, userCred) + if err != nil { return nil, err } for i := 0; i < len(setSecgroups); i++ { if i == 0 { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { - self.SecgrpId = setSecgroups[i].Id - return nil - }) - if err != nil { - return nil, err - } + err = self.saveDefaultSecgroupId(userCred, setSecgroups[i].Id) } else { - if _, err := GuestsecgroupManager.newGuestSecgroup(ctx, userCred, self, setSecgroups[i]); err != nil { - return nil, httperrors.NewInputParameterError(err.Error()) - } + _, err = GuestsecgroupManager.newGuestSecgroup(ctx, userCred, self, setSecgroups[i]) + } + if err != nil { + return nil, httperrors.NewInputParameterError(err.Error()) } } logclient.AddActionLogWithContext(ctx, self, logclient.ACT_VM_SETSECGROUP, fmt.Sprintf("secgroups: %s", strings.Join(setSecgroupNames, ",")), userCred, true) @@ -958,7 +961,7 @@ func (self *SGuest) PerformPurge(ctx context.Context, userCred mcclient.TokenCre } func (self *SGuest) setKeypairId(userCred mcclient.TokenCredential, keypairId string) error { - diff, err := self.GetModelManager().TableSpec().Update(self, func() error { + diff, err := db.Update(self, func() error { self.KeypairId = keypairId return nil }) @@ -1216,7 +1219,7 @@ func (self *SGuest) StartGuestDetachdiskTask(ctx context.Context, userCred mccli if utils.IsInStringArray(disk.Status, []string{DISK_INIT, DISK_ALLOC_FAILED}) { //删除非正常状态下的disk taskData.Add(jsonutils.JSONFalse, "keep_disk") - disk.GetModelManager().TableSpec().Update(disk, func() error { + db.Update(disk, func() error { disk.AutoDelete = true return nil }) @@ -1264,7 +1267,7 @@ func (self *SGuest) detachIsolateDevice(ctx context.Context, userCred mcclient.T logclient.AddActionLogWithContext(ctx, self, logclient.ACT_GUEST_DETACH_ISOLATED_DEVICE, msg, userCred, false) return httperrors.NewBadRequestError(msg) } - _, err := dev.GetModelManager().TableSpec().Update(dev, func() error { + _, err := db.Update(dev, func() error { dev.GuestId = "" return nil }) @@ -1552,13 +1555,16 @@ func (self *SGuest) PerformChangeBandwidth(ctx context.Context, userCred mcclien } if guestnic.BwLimit != int(bandwidth) { - GuestnetworkManager.TableSpec().Update(guestnic, func() error { + diff, err := db.Update(guestnic, func() error { guestnic.BwLimit = int(bandwidth) return nil }) - err := self.StartSyncTask(ctx, userCred, false, "") - logclient.AddActionLogWithContext(ctx, self, logclient.ACT_VM_CHANGE_BANDWIDTH, err, userCred, err == nil) - return nil, err + if err != nil { + return nil, err + } + db.OpsLog.LogEvent(self, db.ACT_CHANGE_BANDWIDTH, diff, userCred) + logclient.AddActionLogWithContext(ctx, self, logclient.ACT_VM_CHANGE_BANDWIDTH, diff, userCred, true) + return nil, self.StartSyncTask(ctx, userCred, false, "") } return nil, nil } @@ -2241,12 +2247,16 @@ func (self *SGuest) PerformUserData(ctx context.Context, userCred mcclient.Token return nil, nil } -func (self *SGuest) SwitchToBackup() error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SGuest) SwitchToBackup(userCred mcclient.TokenCredential) error { + diff, err := db.Update(self, func() error { self.HostId, self.BackupHostId = self.BackupHostId, self.HostId return nil }) - return err + if err != nil { + return err + } + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) + return nil } func (self *SGuest) AllowPerformSwitchToBackup(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { @@ -2524,7 +2534,7 @@ func (self *SGuest) SaveRenewInfo(ctx context.Context, userCred mcclient.TokenCr } func (self *SGuest) doSaveRenewInfo(ctx context.Context, userCred mcclient.TokenCredential, bc *billing.SBillingCycle, expireAt *time.Time) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { if self.BillingType != BILLING_TYPE_PREPAID { self.BillingType = BILLING_TYPE_PREPAID } diff --git a/pkg/compute/models/guestcdrom.go b/pkg/compute/models/guestcdrom.go index bafc3103e6..1e189e312d 100644 --- a/pkg/compute/models/guestcdrom.go +++ b/pkg/compute/models/guestcdrom.go @@ -41,7 +41,7 @@ type SGuestcdrom struct { func (self *SGuestcdrom) insertIso(imageId string) bool { if len(self.ImageId) == 0 { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.ImageId = imageId self.Name = "" self.Path = "" @@ -60,7 +60,7 @@ func (self *SGuestcdrom) insertIso(imageId string) bool { func (self *SGuestcdrom) insertIsoSucc(imageId string, path string, size int, name string) bool { if self.ImageId == imageId { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Name = name self.Path = path self.Size = size @@ -78,7 +78,7 @@ func (self *SGuestcdrom) insertIsoSucc(imageId string, path string, size int, na func (self *SGuestcdrom) ejectIso() bool { if len(self.ImageId) > 0 { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.ImageId = "" self.Name = "" self.Path = "" diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index 3999161bdb..dc1d1cfbb1 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -35,7 +35,7 @@ type IGuestDriver interface { ValidateCreateHostData(ctx context.Context, userCred mcclient.TokenCredential, bmName string, host *SHost, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) - PrepareDiskRaidConfig(host *SHost, params *jsonutils.JSONDict) error + PrepareDiskRaidConfig(userCred mcclient.TokenCredential, host *SHost, params *jsonutils.JSONDict) error GetNamedNetworkConfiguration(guest *SGuest, userCred mcclient.TokenCredential, host *SHost, netConfig *SNetworkConfig) (*SNetwork, string, int8, IPAddlocationDirection) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 19a5070a82..45c88fe426 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -33,6 +33,7 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/mcclient/auth" "yunion.io/x/onecloud/pkg/util/billing" + "yunion.io/x/onecloud/pkg/util/logclient" "yunion.io/x/onecloud/pkg/util/seclib2" ) @@ -682,20 +683,30 @@ func (guest *SGuest) GetHost() *SHost { return nil } -func (guest *SGuest) SetHostId(hostId string) error { - _, err := guest.GetModelManager().TableSpec().Update(guest, func() error { - guest.HostId = hostId - return nil - }) - return err +func (guest *SGuest) SetHostId(userCred mcclient.TokenCredential, hostId string) error { + if guest.HostId != hostId { + diff, err := db.Update(guest, func() error { + guest.HostId = hostId + return nil + }) + if err != nil { + return err + } + db.OpsLog.LogEvent(guest, db.ACT_UPDATE, diff, userCred) + } + return nil } -func (guest *SGuest) SetHostIdWithBackup(master, slave string) error { - _, err := guest.GetModelManager().TableSpec().Update(guest, func() error { +func (guest *SGuest) SetHostIdWithBackup(userCred mcclient.TokenCredential, master, slave string) error { + diff, err := db.Update(guest, func() error { guest.HostId = master guest.BackupHostId = slave return nil }) + if err != nil { + return err + } + db.OpsLog.LogEvent(guest, db.ACT_UPDATE, diff, userCred) return err } @@ -1807,9 +1818,6 @@ func (self *SGuest) GetIsolatedDevices() []SIsolatedDevice { } func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, host *SHost, extVM cloudprovider.ICloudVM, projectId string, projectSync bool) error { - lockman.LockObject(ctx, self) - defer lockman.ReleaseObject(ctx, self) - recycle := false if provider.GetFactory().IsSupportPrepaidResources() && self.IsPrepaidRecycle() { @@ -1817,7 +1825,7 @@ func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.Token } metaData := extVM.GetMetadata() - diff, err := GuestManager.TableSpec().Update(self, func() error { + diff, err := db.UpdateWithLock(ctx, self, func() error { extVM.Refresh() // self.Name = extVM.GetName() self.Status = extVM.GetStatus() @@ -1892,7 +1900,7 @@ func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.Token if diff != nil { diffStr := sqlchemy.UpdateDiffString(diff) if len(diffStr) > 0 { - db.OpsLog.LogEvent(self, db.ACT_UPDATE, diffStr, userCred) + db.OpsLog.LogEvent(self, db.ACT_SYNC_UPDATE, diffStr, userCred) } } if metaData != nil { @@ -2634,7 +2642,7 @@ func (self *SGuest) createDiskOnHost(ctx context.Context, userCred mcclient.Toke if len(self.BackupHostId) > 0 { backupHost := HostManager.FetchHostById(self.BackupHostId) backupStorage := self.GetDriver().ChooseHostStorage(backupHost, diskConfig.Backend) - _, err = disk.GetModelManager().TableSpec().Update(disk, func() error { + diff, err := db.Update(disk, func() error { disk.BackupStorageId = backupStorage.Id return nil }) @@ -2642,6 +2650,7 @@ func (self *SGuest) createDiskOnHost(ctx context.Context, userCred mcclient.Toke log.Errorf("Disk save backup storage error") return disk, err } + db.OpsLog.LogEvent(disk, db.ACT_UPDATE, diff, userCred) } err = self.attach2Disk(ctx, disk, userCred, diskConfig.Driver, diskConfig.Cache, diskConfig.Mountpoint) return disk, err @@ -2683,7 +2692,7 @@ func (self *SGuest) attachIsolatedDevice(ctx context.Context, userCred mcclient. if dev.HostId != self.HostId { return fmt.Errorf("Isolated device and guest are not located in the same host") } - _, err := IsolatedDeviceManager.TableSpec().Update(dev, func() error { + _, err := db.Update(dev, func() error { dev.GuestId = self.Id return nil }) @@ -2960,7 +2969,7 @@ func (self *SGuest) GetDeployConfigOnHost(ctx context.Context, userCred mcclient if err != nil { return nil, fmt.Errorf("SyncSecurityGroup fail %s", err) } - if err := secgroupCache.SetExternalId(externalSecgroupId); err != nil { + if err := secgroupCache.SetExternalId(userCred, externalSecgroupId); err != nil { return nil, fmt.Errorf("failed to set externalId for secgroup %s(%s) externalId %s: error: %v", secgroup.Name, secgroup.Id, externalSecgroupId, err) } secgroupIds.Add(jsonutils.NewString(externalSecgroupId)) @@ -3478,20 +3487,24 @@ func (self *SGuest) GetShortDesc(ctx context.Context) *jsonutils.JSONDict { return desc } -func (self *SGuest) saveOsType(osType string) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SGuest) saveOsType(userCred mcclient.TokenCredential, osType string) error { + diff, err := db.Update(self, func() error { self.OsType = osType return nil }) + if err != nil { + return err + } + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) return err } func (self *SGuest) SaveDeployInfo(ctx context.Context, userCred mcclient.TokenCredential, data jsonutils.JSONObject) { - log.Infof("------SaveDeployInfo: %s", data.PrettyString()) + // log.Infof("------SaveDeployInfo: %s", data.PrettyString()) info := make(map[string]interface{}) if data.Contains("os") { osName, _ := data.GetString("os") - self.saveOsType(osName) + self.saveOsType(userCred, osName) info["os_name"] = osName } if data.Contains("account") { @@ -3673,7 +3686,7 @@ func (manager *SGuestManager) DeleteExpiredPrepaidServers(ctx context.Context, u continue } } - guests[i].SetDisableDelete(false) + guests[i].SetDisableDelete(userCred, false) guests[i].StartDeleteGuestTask(ctx, userCred, "", false, false) } } @@ -3744,7 +3757,7 @@ func (self *SGuest) SyncVMEip(ctx context.Context, userCred mcclient.TokenCreden } } else { // do nothing - err := eip.SyncWithCloudEip(userCred, extEip, projectId, false) + err := eip.SyncWithCloudEip(ctx, userCred, extEip, projectId, false) if err != nil { result.UpdateError(err) } else { @@ -3802,8 +3815,8 @@ func (self *SGuest) DeleteEip(ctx context.Context, userCred mcclient.TokenCreden return nil } -func (self *SGuest) SetDisableDelete(val bool) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SGuest) SetDisableDelete(userCred mcclient.TokenCredential, val bool) error { + diff, err := db.Update(self, func() error { if val { self.DisableDelete = tristate.True } else { @@ -3811,6 +3824,11 @@ func (self *SGuest) SetDisableDelete(val bool) error { } return nil }) + if err != nil { + return err + } + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) + logclient.AddSimpleActionLog(self, logclient.ACT_UPDATE, diff, userCred, true) return err } @@ -3936,7 +3954,7 @@ func (self *SGuest) GuestDisksHasSnapshot() bool { } func (self *SGuest) OnScheduleToHost(ctx context.Context, userCred mcclient.TokenCredential, hostId string) error { - err := self.SetHostId(hostId) + err := self.SetHostId(userCred, hostId) if err != nil { return err } diff --git a/pkg/compute/models/host_recycle.go b/pkg/compute/models/host_recycle.go index 7937d27afc..b90e59ce25 100644 --- a/pkg/compute/models/host_recycle.go +++ b/pkg/compute/models/host_recycle.go @@ -204,6 +204,7 @@ func (self *SGuest) doPrepaidRecycleNoLock(ctx context.Context, userCred mcclien if externalId != storage.ExternalId { msg := "inconsistent storage !!!!" log.Errorf(msg) + fakeHost.RealDelete(ctx, userCred) return errors.New(msg) } } @@ -232,6 +233,7 @@ func (self *SGuest) doPrepaidRecycleNoLock(ctx context.Context, userCred mcclien err = StorageManager.TableSpec().Insert(&fakeStorage) if err != nil { log.Errorf("fail to insert fake storage %s", err) + fakeHost.RealDelete(ctx, userCred) return err } @@ -242,7 +244,7 @@ func (self *SGuest) doPrepaidRecycleNoLock(ctx context.Context, userCred mcclien return err } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { // clear billing information self.BillingType = BILLING_TYPE_POSTPAID self.BillingCycle = "" @@ -251,7 +253,6 @@ func (self *SGuest) doPrepaidRecycleNoLock(ctx context.Context, userCred mcclien self.HostId = fakeHost.Id return nil }) - if err != nil { log.Errorf("clear billing information fail: %s", err) fakeHost.RealDelete(ctx, userCred) @@ -262,7 +263,7 @@ func (self *SGuest) doPrepaidRecycleNoLock(ctx context.Context, userCred mcclien disk := guestdisks[i].GetDisk() if disk.BillingType == BILLING_TYPE_PREPAID { - _, err = disk.GetModelManager().TableSpec().Update(disk, func() error { + _, err = db.Update(disk, func() error { disk.BillingType = BILLING_TYPE_POSTPAID disk.BillingCycle = "" disk.ExpiredAt = time.Time{} @@ -440,7 +441,7 @@ func doUndoPrepaidRecycleNoLock(ctx context.Context, userCred mcclient.TokenCred return errors.New(msg) } - _, err = server.GetModelManager().TableSpec().Update(server, func() error { + _, err = db.Update(server, func() error { // recover billing information server.BillingType = BILLING_TYPE_PREPAID server.BillingCycle = host.BillingCycle @@ -481,7 +482,7 @@ func doUndoPrepaidRecycleNoLock(ctx context.Context, userCred mcclient.TokenCred oStorage := oHostStorage.GetStorage() if storage.StorageType == STORAGE_LOCAL { - _, err = disk.GetModelManager().TableSpec().Update(disk, func() error { + _, err = db.Update(disk, func() error { disk.BillingType = BILLING_TYPE_PREPAID disk.BillingCycle = host.BillingCycle disk.ExpiredAt = host.ExpiredAt @@ -498,6 +499,7 @@ func doUndoPrepaidRecycleNoLock(ctx context.Context, userCred mcclient.TokenCred err = host.RealDelete(ctx, userCred) if err != nil { log.Errorf("fail to delete fake host") + logclient.AddActionLogWithContext(ctx, server, logclient.ACT_UNDO_RECYCLE_PREPAID, err, userCred, false) return err } @@ -637,7 +639,7 @@ func (host *SHost) RebuildRecycledGuest(ctx context.Context, userCred mcclient.T return err } - err = guest.SetExternalId(host.RealExternalId) + err = guest.SetExternalId(userCred, host.RealExternalId) if err != nil { log.Errorf("guest.SetExternalId fail %s", err) return err @@ -670,7 +672,7 @@ func (host *SHost) RebuildRecycledGuest(ctx context.Context, userCred mcclient.T guestdisks := guest.GetDisks() for i := 0; i < len(guestdisks); i += 1 { disk := guestdisks[i].GetDisk() - err = disk.SetExternalId(idisks[i].GetGlobalId()) + err = disk.SetExternalId(userCred, idisks[i].GetGlobalId()) if err != nil { log.Errorf("disk.SetExternalId fail %s", err) return err @@ -741,7 +743,7 @@ func (self *SHost) startPrepaidRecycleHostRenewTask(ctx context.Context, userCre } func (self *SHost) DoSaveRenewInfo(ctx context.Context, userCred mcclient.TokenCredential, bc *billing.SBillingCycle, expireAt *time.Time) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { if self.BillingType != BILLING_TYPE_PREPAID { self.BillingType = BILLING_TYPE_PREPAID } diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index de4a3774f9..572ac8bafa 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -646,11 +646,14 @@ func (self *SHost) SaveUpdates(doUpdate func() error) (map[string]sqlchemy.SUpda } func (self *SHost) saveUpdates(doUpdate func() error, doSchedClean bool) (map[string]sqlchemy.SUpdateDiff, error) { - diff, err := self.GetModelManager().TableSpec().Update(self, doUpdate) - if err == nil && doSchedClean { + diff, err := db.Update(self, doUpdate) + if err != nil { + return nil, err + } + if doSchedClean { self.ClearSchedDescCache() } - return diff, err + return diff, nil } func (self *SHost) AllowPerformUpdateStorage( @@ -685,6 +688,7 @@ func (self *SHost) PerformUpdateStorage( if err != nil { return nil, fmt.Errorf("Create baremetal storage error: %v", err) } + db.OpsLog.LogEvent(&storage, db.ACT_CREATE, storage.GetShortDesc(ctx), userCred) // 2. create host storage bmStorage := SHoststorage{} bmStorage.HostId = self.Id @@ -695,17 +699,19 @@ func (self *SHost) PerformUpdateStorage( if err != nil { return nil, fmt.Errorf("Create baremetal hostStorage error: %v", err) } + db.OpsLog.LogAttachEvent(ctx, self, &storage, userCred, bmStorage.GetShortDesc(ctx)) return nil, nil } storage := bs.GetStorage() if capacity != int64(storage.Capacity) { - _, err := storage.GetModelManager().TableSpec().Update(storage, func() error { + diff, err := db.Update(storage, func() error { storage.Capacity = int(capacity) return nil }) if err != nil { return nil, fmt.Errorf("Update baremetal storage error: %v", err) } + db.OpsLog.LogEvent(storage, db.ACT_UPDATE, diff, userCred) } return nil, nil } @@ -1462,7 +1468,7 @@ func (self *SHost) SyncHostStorages(ctx context.Context, userCred mcclient.Token for i := 0; i < len(commondb); i += 1 { log.Infof("host %s is still connected with %s, to update ...", self.Id, commondb[i].Id) - err := self.syncWithCloudHostStorage(&commondb[i], commonext[i]) + err := self.syncWithCloudHostStorage(userCred, &commondb[i], commonext[i]) if err != nil { syncResult.UpdateError(err) } else { @@ -1486,10 +1492,10 @@ func (self *SHost) SyncHostStorages(ctx context.Context, userCred mcclient.Token return localStorages, remoteStorages, syncResult } -func (self *SHost) syncWithCloudHostStorage(localStorage *SStorage, extStorage cloudprovider.ICloudStorage) error { +func (self *SHost) syncWithCloudHostStorage(userCred mcclient.TokenCredential, localStorage *SStorage, extStorage cloudprovider.ICloudStorage) error { // do nothing hs := self.GetHoststorageOfId(localStorage.Id) - return hs.syncWithCloudHostStorage(extStorage) + return hs.syncWithCloudHostStorage(userCred, extStorage) } func (self *SHost) isAttach2Storage(storage *SStorage) bool { @@ -2844,7 +2850,7 @@ func (self *SHost) addNetif(ctx context.Context, userCred mcclient.TokenCredenti } } else { var changed = false - _, err := NetInterfaceManager.TableSpec().Update(netif, func() error { + _, err := db.Update(netif, func() error { if netif.BaremetalId != self.Id { changed = true netif.BaremetalId = self.Id @@ -2902,7 +2908,7 @@ func (self *SHost) addNetif(ctx context.Context, userCred mcclient.TokenCredenti } } else { hw := ihw.(*SHostwire) - HostwireManager.TableSpec().Update(hw, func() error { + db.Update(hw, func() error { hw.Bridge = bridge hw.Interface = strInterface hw.MacAddr = mac @@ -3363,10 +3369,7 @@ func (self *SHost) PerformUndoConvert(ctx context.Context, userCred mcclient.Tok if guest.Hypervisor != HYPERVISOR_BAREMETAL { return nil, httperrors.NewNotAcceptableError("Not an converted hypervisor") } - _, err := guest.GetModelManager().TableSpec().Update(&guest, func() error { - guest.DisableDelete = tristate.False - return nil - }) + err := guest.SetDisableDelete(userCred, false) if err != nil { return nil, err } @@ -3389,10 +3392,10 @@ func (self *SHost) GetDriverWithDefault() IHostDriver { return GetHostDriver(hostType) } -func (self *SHost) UpdateDiskConfig(layouts []baremetal.Layout) error { +func (self *SHost) UpdateDiskConfig(userCred mcclient.TokenCredential, layouts []baremetal.Layout) error { bs := self.GetBaremetalstorage() if bs != nil { - _, err := bs.GetModelManager().TableSpec().Update(bs, func() error { + diff, err := db.Update(bs, func() error { if len(layouts) != 0 { bs.Config = jsonutils.Marshal(layouts).(*jsonutils.JSONArray) var size int64 @@ -3410,6 +3413,7 @@ func (self *SHost) UpdateDiskConfig(layouts []baremetal.Layout) error { log.Errorln(err) return err } + db.OpsLog.LogEvent(bs, db.ACT_UPDATE, diff, userCred) } return nil } diff --git a/pkg/compute/models/hoststorages.go b/pkg/compute/models/hoststorages.go index f80c6935e9..2d78e6b435 100644 --- a/pkg/compute/models/hoststorages.go +++ b/pkg/compute/models/hoststorages.go @@ -133,7 +133,7 @@ func (self *SHoststorage) PostCreate(ctx context.Context, userCred mcclient.Toke log.Errorf("Host Storage Post Create Error: %s", err) // panic(err) ??? } - self.SyncStorageStatus() + self.SyncStorageStatus(userCred) } } @@ -153,11 +153,11 @@ func (self *SHoststorage) PreDelete(ctx context.Context, userCred mcclient.Token log.Errorf("Host Storage Post Create Error: %s", err) // panic(err) ??? } - self.SyncStorageStatus() + self.SyncStorageStatus(userCred) } } -func (self *SHoststorage) SyncStorageStatus() { +func (self *SHoststorage) SyncStorageStatus(userCred mcclient.TokenCredential) { storage := self.GetStorage() hostQuery := HostManager.Query().SubQuery() count := HoststorageManager.Query().Join(hostQuery, @@ -170,10 +170,7 @@ func (self *SHoststorage) SyncStorageStatus() { status = STORAGE_OFFLINE } if status != storage.Status { - storage.GetModelManager().TableSpec().Update(storage, func() error { - storage.Status = status - return nil - }) + storage.SetStatus(userCred, status, "SyncStorageStatus") } } @@ -247,10 +244,14 @@ func (manager *SHoststorageManager) GetStorages(hostId string) ([]SHoststorage, return hoststorage, nil } -func (self *SHoststorage) syncWithCloudHostStorage(extStorage cloudprovider.ICloudStorage) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SHoststorage) syncWithCloudHostStorage(userCred mcclient.TokenCredential, extStorage cloudprovider.ICloudStorage) error { + diff, err := db.Update(self, func() error { self.MountPoint = extStorage.GetMountPoint() return nil }) - return err + if err != nil { + return err + } + db.OpsLog.LogEvent(self, db.ACT_SYNC_UPDATE, diff, userCred) + return nil } diff --git a/pkg/compute/models/isolated_devices.go b/pkg/compute/models/isolated_devices.go index 806593000d..7d7159c078 100644 --- a/pkg/compute/models/isolated_devices.go +++ b/pkg/compute/models/isolated_devices.go @@ -389,7 +389,7 @@ func (manager *SIsolatedDeviceManager) ReleaseDevicesOfGuest(ctx context.Context return fmt.Errorf("fail to find attached devices") } for _, dev := range devs { - _, err := manager.TableSpec().Update(&dev, func() error { + _, err := db.Update(&dev, func() error { dev.GuestId = "" return nil }) diff --git a/pkg/compute/models/keypairs.go b/pkg/compute/models/keypairs.go index cb5c0de1aa..3ccd2b7963 100644 --- a/pkg/compute/models/keypairs.go +++ b/pkg/compute/models/keypairs.go @@ -11,6 +11,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/util/logclient" "yunion.io/x/onecloud/pkg/util/seclib2" "yunion.io/x/pkg/utils" ) @@ -201,7 +202,7 @@ func (keypair *SKeypair) GetDetailsPrivatekey(ctx context.Context, userCred mccl retval.Add(jsonutils.NewString(keypair.PrivateKey), "private_key") retval.Add(jsonutils.NewString(keypair.Name), "name") retval.Add(jsonutils.NewString(keypair.Scheme), "scheme") - _, err := keypair.GetModelManager().TableSpec().Update(keypair, func() error { + _, err := db.Update(keypair, func() error { keypair.PrivateKey = "" return nil }) @@ -210,6 +211,7 @@ func (keypair *SKeypair) GetDetailsPrivatekey(ctx context.Context, userCred mccl } db.OpsLog.LogEvent(keypair, db.ACT_FETCH, nil, userCred) + logclient.AddActionLogWithContext(ctx, keypair, logclient.ACT_FETCH, nil, userCred, true) } return retval, nil } diff --git a/pkg/compute/models/loadbalanceracls.go b/pkg/compute/models/loadbalanceracls.go index dbd069dbd2..eddf7225ed 100644 --- a/pkg/compute/models/loadbalanceracls.go +++ b/pkg/compute/models/loadbalanceracls.go @@ -253,13 +253,14 @@ func (lbacl *SLoadbalancerAcl) PerformPatch(ctx context.Context, userCred mcclie } } } - _, err := lbacl.GetModelManager().TableSpec().Update(lbacl, func() error { + diff, err := db.Update(lbacl, func() error { lbacl.AclEntries = &aclEntries return nil }) if err != nil { return nil, err } + db.OpsLog.LogEvent(lbacl, db.ACT_UPDATE, diff, userCred) return nil, nil } @@ -396,7 +397,7 @@ func (man *SLoadbalancerAclManager) newFromCloudLoadbalancerAcl(ctx context.Cont } func (acl *SLoadbalancerAcl) SyncWithCloudLoadbalancerAcl(ctx context.Context, userCred mcclient.TokenCredential, extAcl cloudprovider.ICloudLoadbalancerAcl, projectId string, projectSync bool) error { - _, err := acl.GetModelManager().TableSpec().Update(acl, func() error { + diff, err := db.UpdateWithLock(ctx, acl, func() error { acl.Name = extAcl.GetName() acl.AclEntries = &SLoadbalancerAclEntries{} for _, entry := range extAcl.GetAclEntries() { @@ -407,5 +408,9 @@ func (acl *SLoadbalancerAcl) SyncWithCloudLoadbalancerAcl(ctx context.Context, u } return nil }) - return err + if err != nil { + return err + } + db.OpsLog.LogEvent(acl, db.ACT_SYNC_UPDATE, diff, userCred) + return nil } diff --git a/pkg/compute/models/loadbalanceragents.go b/pkg/compute/models/loadbalanceragents.go index 756e74abda..e9d4ff7b2e 100644 --- a/pkg/compute/models/loadbalanceragents.go +++ b/pkg/compute/models/loadbalanceragents.go @@ -419,13 +419,14 @@ func (lbagent *SLoadbalancerAgent) AllowPerformHb(ctx context.Context, userCred } func (lbagent *SLoadbalancerAgent) PerformHb(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { - _, err := lbagent.GetModelManager().TableSpec().Update(lbagent, func() error { + diff, err := db.Update(lbagent, func() error { lbagent.HbLastSeen = time.Now() return nil }) if err != nil { return nil, err } + db.OpsLog.LogEvent(lbagent, db.ACT_UPDATE, diff, userCred) return nil, nil } @@ -453,13 +454,14 @@ func (lbagent *SLoadbalancerAgent) PerformParamsPatch(ctx context.Context, userC return nil, err } { - _, err := lbagent.GetModelManager().TableSpec().Update(lbagent, func() error { + diff, err := db.Update(lbagent, func() error { lbagent.Params = ¶ms return nil }) if err != nil { return nil, err } + db.OpsLog.LogEvent(lbagent, db.ACT_UPDATE, diff, userCred) } return nil, nil } diff --git a/pkg/compute/models/loadbalancerbackendgroups.go b/pkg/compute/models/loadbalancerbackendgroups.go index 9fdf4a5363..4255644ef5 100644 --- a/pkg/compute/models/loadbalancerbackendgroups.go +++ b/pkg/compute/models/loadbalancerbackendgroups.go @@ -399,25 +399,30 @@ func (lbbg *SLoadbalancerBackendGroup) constructFieldsFromCloudBackendgroup(lb * } func (lbbg *SLoadbalancerBackendGroup) SyncWithCloudLoadbalancerBackendgroup(ctx context.Context, userCred mcclient.TokenCredential, lb *SLoadbalancer, extLoadbalancerBackendgroup cloudprovider.ICloudLoadbalancerBackendGroup, projectId string, projectSync bool) error { - _, err := lbbg.GetModelManager().TableSpec().Update(lbbg, func() error { - + diff, err := db.UpdateWithLock(ctx, lbbg, func() error { lbbg.constructFieldsFromCloudBackendgroup(lb, extLoadbalancerBackendgroup) if projectSync && len(projectId) > 0 { lbbg.ProjectId = projectId } - - if extLoadbalancerBackendgroup.IsDefault() { - _, err := lb.GetModelManager().TableSpec().Update(lb, func() error { - lb.BackendGroupId = lbbg.Id - return nil - }) - if err != nil { - log.Errorf("failed to set backendgroup id for lb %s error: %v", lb.Name, err) - } - } - return nil }) + if err != nil { + return err + } + db.OpsLog.LogEvent(lbbg, db.ACT_UPDATE, diff, userCred) + + if extLoadbalancerBackendgroup.IsDefault() { + diff, err := db.UpdateWithLock(ctx, lb, func() error { + lb.BackendGroupId = lbbg.Id + return nil + }) + if err != nil { + log.Errorf("failed to set backendgroup id for lb %s error: %v", lb.Name, err) + return err + } + db.OpsLog.LogEvent(lb, db.ACT_UPDATE, diff, userCred) + } + return err } @@ -442,7 +447,7 @@ func (man *SLoadbalancerBackendGroupManager) newFromCloudLoadbalancerBackendgrou } if extLoadbalancerBackendgroup.IsDefault() { - _, err := lb.GetModelManager().TableSpec().Update(lb, func() error { + _, err := db.Update(lb, func() error { lb.BackendGroupId = lbbg.Id return nil }) @@ -462,7 +467,7 @@ func (man *SLoadbalancerBackendGroupManager) initBackendGroupType() error { return err } for i := 0; i < len(backendgroups); i++ { - _, err := man.TableSpec().Update(&backendgroups[i], func() error { + _, err := db.Update(&backendgroups[i], func() error { backendgroups[i].Type = LB_BACKENDGROUP_TYPE_NORMAL return nil }) @@ -490,7 +495,7 @@ func (manager *SLoadbalancerBackendGroupManager) initBackendGroupRegion() error for i := 0; i < len(groups); i++ { group := &groups[i] if lb := group.GetLoadbalancer(); lb != nil && len(lb.CloudregionId) > 0 { - _, err := group.GetModelManager().TableSpec().Update(group, func() error { + _, err := db.Update(group, func() error { group.CloudregionId = lb.CloudregionId group.ManagerId = lb.ManagerId return nil diff --git a/pkg/compute/models/loadbalancerbackends.go b/pkg/compute/models/loadbalancerbackends.go index 4b7bdf33e2..56c532ee46 100644 --- a/pkg/compute/models/loadbalancerbackends.go +++ b/pkg/compute/models/loadbalancerbackends.go @@ -299,7 +299,7 @@ func (man *SLoadbalancerBackendManager) SyncLoadbalancerBackends(ctx context.Con syncResult.Delete() } } else { - err = removed[i].PendingDelete() + err = removed[i].MarkPendingDelete(userCred) if err != nil { syncResult.DeleteError(err) } else { @@ -352,7 +352,7 @@ func (lbb *SLoadbalancerBackend) constructFieldsFromCloudLoadbalancerBackend(ext } func (lbb *SLoadbalancerBackend) SyncWithCloudLoadbalancerBackend(ctx context.Context, userCred mcclient.TokenCredential, extLoadbalancerBackend cloudprovider.ICloudLoadbalancerBackend, projectId string, projectSync bool) error { - _, err := lbb.GetModelManager().TableSpec().Update(lbb, func() error { + _, err := db.UpdateWithLock(ctx, lbb, func() error { if projectSync && len(projectId) > 0 { lbb.ProjectId = projectId } @@ -392,7 +392,7 @@ func (manager *SLoadbalancerBackendManager) InitializeData() error { for i := 0; i < len(backends); i++ { backend := &backends[i] if group := backend.GetLoadbalancerBackendGroup(); group != nil && len(group.CloudregionId) > 0 { - _, err := backend.GetModelManager().TableSpec().Update(backend, func() error { + _, err := db.Update(backend, func() error { backend.CloudregionId = group.CloudregionId backend.ManagerId = group.ManagerId return nil diff --git a/pkg/compute/models/loadbalancercertificates.go b/pkg/compute/models/loadbalancercertificates.go index 90ee15fc13..ccd742b5e0 100644 --- a/pkg/compute/models/loadbalancercertificates.go +++ b/pkg/compute/models/loadbalancercertificates.go @@ -165,7 +165,7 @@ func (man *SLoadbalancerCertificateManager) InitializeData() error { d := sha256.Sum256(c.Raw) fp = LB_TLS_CERT_FINGERPRINT_ALGO_SHA256 + ":" + hex.EncodeToString(d[:]) } - _, err := man.TableSpec().Update(lbcert, func() error { + _, err := db.Update(lbcert, func() error { lbcert.Fingerprint = fp return nil }) @@ -378,7 +378,7 @@ func (man *SLoadbalancerCertificateManager) newFromCloudLoadbalancerCertificate( } func (lbcert *SLoadbalancerCertificate) SyncWithCloudLoadbalancerCertificate(ctx context.Context, userCred mcclient.TokenCredential, extCertificate cloudprovider.ICloudLoadbalancerCertificate, projectId string, projectSync bool) error { - _, err := lbcert.GetModelManager().TableSpec().Update(lbcert, func() error { + diff, err := db.UpdateWithLock(ctx, lbcert, func() error { lbcert.Name = extCertificate.GetName() lbcert.CommonName = extCertificate.GetCommonName() lbcert.SubjectAlternativeNames = extCertificate.GetSubjectAlternativeNames() @@ -391,5 +391,9 @@ func (lbcert *SLoadbalancerCertificate) SyncWithCloudLoadbalancerCertificate(ctx return nil }) - return err + if err != nil { + return err + } + db.OpsLog.LogEvent(lbcert, db.ACT_SYNC_UPDATE, diff, userCred) + return nil } diff --git a/pkg/compute/models/loadbalancerlistenerrules.go b/pkg/compute/models/loadbalancerlistenerrules.go index 08084298cd..0094725a7c 100644 --- a/pkg/compute/models/loadbalancerlistenerrules.go +++ b/pkg/compute/models/loadbalancerlistenerrules.go @@ -338,7 +338,7 @@ func (man *SLoadbalancerListenerRuleManager) SyncLoadbalancerListenerRules(ctx c return syncResult } -func (lbr *SLoadbalancerListenerRule) constructFieldsFromCloudListenerRule(extRule cloudprovider.ICloudLoadbalancerListenerRule) { +func (lbr *SLoadbalancerListenerRule) constructFieldsFromCloudListenerRule(userCred mcclient.TokenCredential, extRule cloudprovider.ICloudLoadbalancerListenerRule) { lbr.Name = extRule.GetName() lbr.Domain = extRule.GetDomain() lbr.Path = extRule.GetPath() @@ -348,7 +348,7 @@ func (lbr *SLoadbalancerListenerRule) constructFieldsFromCloudListenerRule(extRu ilbbg, err := LoadbalancerBackendGroupManager.FetchById(lbr.BackendGroupId) lbbg := ilbbg.(*SLoadbalancerBackendGroup) if err == nil && (len(lbbg.ExternalId) == 0 || lbbg.ExternalId != groupId) { - err = lbbg.SetExternalId(groupId) + err = lbbg.SetExternalId(userCred, groupId) if err != nil { log.Errorf("Update loadbalancer BackendGroup(%s) external id failed: %s", lbbg.GetId(), err) } @@ -368,7 +368,7 @@ func (man *SLoadbalancerListenerRuleManager) newFromCloudLoadbalancerListenerRul lbr.ExternalId = extRule.GetGlobalId() lbr.ListenerId = listener.Id - lbr.constructFieldsFromCloudListenerRule(extRule) + lbr.constructFieldsFromCloudListenerRule(userCred, extRule) lbr.ProjectId = userCred.GetProjectId() if len(projectId) > 0 { lbr.ProjectId = projectId @@ -378,8 +378,8 @@ func (man *SLoadbalancerListenerRuleManager) newFromCloudLoadbalancerListenerRul } func (lbr *SLoadbalancerListenerRule) SyncWithCloudLoadbalancerListenerRule(ctx context.Context, userCred mcclient.TokenCredential, extRule cloudprovider.ICloudLoadbalancerListenerRule, projectId string, projectSync bool) error { - _, err := lbr.GetModelManager().TableSpec().Update(lbr, func() error { - lbr.constructFieldsFromCloudListenerRule(extRule) + _, err := db.Update(lbr, func() error { + lbr.constructFieldsFromCloudListenerRule(userCred, extRule) if projectSync && len(projectId) > 0 { lbr.ProjectId = projectId @@ -399,7 +399,7 @@ func (manager *SLoadbalancerListenerRuleManager) InitializeData() error { for i := 0; i < len(rules); i++ { rule := &rules[i] if listener := rule.GetLoadbalancerListener(); listener != nil && len(listener.CloudregionId) > 0 { - _, err := listener.GetModelManager().TableSpec().Update(rule, func() error { + _, err := db.Update(rule, func() error { rule.CloudregionId = listener.CloudregionId rule.ManagerId = listener.ManagerId return nil diff --git a/pkg/compute/models/loadbalancerlisteners.go b/pkg/compute/models/loadbalancerlisteners.go index 10d29cfdef..5b596915e5 100644 --- a/pkg/compute/models/loadbalancerlisteners.go +++ b/pkg/compute/models/loadbalancerlisteners.go @@ -734,7 +734,7 @@ func (man *SLoadbalancerListenerManager) SyncLoadbalancerListeners(ctx context.C return localListeners, remoteListeners, syncResult } -func (lblis *SLoadbalancerListener) constructFieldsFromCloudListener(lb *SLoadbalancer, extListener cloudprovider.ICloudLoadbalancerListener) { +func (lblis *SLoadbalancerListener) constructFieldsFromCloudListener(userCred mcclient.TokenCredential, lb *SLoadbalancer, extListener cloudprovider.ICloudLoadbalancerListener) { lblis.Name = extListener.GetName() lblis.ListenerType = extListener.GetListenerType() lblis.ListenerPort = extListener.GetListenerPort() @@ -779,7 +779,7 @@ func (lblis *SLoadbalancerListener) constructFieldsFromCloudListener(lb *SLoadba ilbbg, err := LoadbalancerBackendGroupManager.FetchById(lblis.BackendGroupId) lbbg := ilbbg.(*SLoadbalancerBackendGroup) if err == nil && (len(lbbg.ExternalId) == 0 || lbbg.ExternalId != groupId) { - err = lbbg.SetExternalId(groupId) + err = lbbg.SetExternalId(userCred, groupId) if err != nil { log.Errorf("Update loadbalancer BackendGroup(%s) external id failed: %s", lbbg.GetId(), err) } @@ -794,8 +794,8 @@ func (lblis *SLoadbalancerListener) constructFieldsFromCloudListener(lb *SLoadba } func (lblis *SLoadbalancerListener) SyncWithCloudLoadbalancerListener(ctx context.Context, userCred mcclient.TokenCredential, lb *SLoadbalancer, extListener cloudprovider.ICloudLoadbalancerListener, projectId string, projectSync bool) error { - _, err := lblis.GetModelManager().TableSpec().Update(lblis, func() error { - lblis.constructFieldsFromCloudListener(lb, extListener) + _, err := db.UpdateWithLock(ctx, lblis, func() error { + lblis.constructFieldsFromCloudListener(userCred, lb, extListener) if projectSync && len(projectId) > 0 { lblis.ProjectId = projectId } @@ -810,7 +810,7 @@ func (man *SLoadbalancerListenerManager) newFromCloudLoadbalancerListener(ctx co lblis.LoadbalancerId = lb.Id lblis.ExternalId = extListener.GetGlobalId() - lblis.constructFieldsFromCloudListener(lb, extListener) + lblis.constructFieldsFromCloudListener(userCred, lb, extListener) lblis.ProjectId = userCred.GetProjectId() if len(projectId) > 0 { @@ -829,7 +829,7 @@ func (manager *SLoadbalancerListenerManager) InitializeData() error { for i := 0; i < len(listeners); i++ { listener := &listeners[i] if lb := listener.GetLoadbalancer(); lb != nil && len(lb.CloudregionId) > 0 { - _, err := listener.GetModelManager().TableSpec().Update(listener, func() error { + _, err := db.Update(listener, func() error { listener.CloudregionId = lb.CloudregionId listener.ManagerId = lb.ManagerId return nil diff --git a/pkg/compute/models/loadbalancernetworks.go b/pkg/compute/models/loadbalancernetworks.go index 28244397ce..c0b394a3b6 100644 --- a/pkg/compute/models/loadbalancernetworks.go +++ b/pkg/compute/models/loadbalancernetworks.go @@ -149,7 +149,7 @@ func (m *SLoadbalancernetworkManager) SyncLoadbalancerNetwork(ctx context.Contex for i := 0; i < len(lns); i++ { if i == 0 { if lns[i].IpAddr != req.Address { - _, err := lns[i].GetModelManager().TableSpec().Update(&lns[i], func() error { + _, err := db.Update(&lns[i], func() error { lns[i].IpAddr = req.Address return nil }) diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index 2434068ead..20bc165361 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -587,7 +587,7 @@ func (lb *SLoadbalancer) syncLoadbalancerNetwork(ctx context.Context, userCred m } func (lb *SLoadbalancer) SyncWithCloudLoadbalancer(ctx context.Context, userCred mcclient.TokenCredential, extLb cloudprovider.ICloudLoadbalancer, projectId string, projectSync bool) error { - _, err := lb.GetModelManager().TableSpec().Update(lb, func() error { + _, err := db.Update(lb, func() error { lb.Address = extLb.GetAddress() lb.Status = extLb.GetStatus() lb.Name = extLb.GetName() @@ -616,7 +616,7 @@ func (lb *SLoadbalancer) setCloudregionId() error { if region == nil { return fmt.Errorf("failed to find region for zone: %s", lb.ZoneId) } - _, err := lb.GetModelManager().TableSpec().Update(lb, func() error { + _, err := db.Update(lb, func() error { lb.CloudregionId = region.Id return nil }) diff --git a/pkg/compute/models/netinterfaces.go b/pkg/compute/models/netinterfaces.go index 71aa440ba2..2ff5bf4dc5 100644 --- a/pkg/compute/models/netinterfaces.go +++ b/pkg/compute/models/netinterfaces.go @@ -228,7 +228,7 @@ func (self *SNetInterface) Remove(ctx context.Context, userCred mcclient.TokenCr hw.Delete(ctx, userCred) } } - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.WireId = "" self.BaremetalId = "" self.Rate = 0 diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 8cfb067641..6129966aa3 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -496,7 +496,7 @@ func (manager *SNetworkManager) SyncNetworks(ctx context.Context, userCred mccli } } for i := 0; i < len(commondb); i += 1 { - err = commondb[i].SyncWithCloudNetwork(userCred, commonext[i], projectId, projectSync) + err = commondb[i].SyncWithCloudNetwork(ctx, userCred, commonext[i], projectId, projectSync) if err != nil { syncResult.UpdateError(err) } else { @@ -519,8 +519,8 @@ func (manager *SNetworkManager) SyncNetworks(ctx context.Context, userCred mccli return localNets, remoteNets, syncResult } -func (self *SNetwork) SyncWithCloudNetwork(userCred mcclient.TokenCredential, extNet cloudprovider.ICloudNetwork, projectId string, projectSync bool) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SNetwork) SyncWithCloudNetwork(ctx context.Context, userCred mcclient.TokenCredential, extNet cloudprovider.ICloudNetwork, projectId string, projectSync bool) error { + diff, err := db.UpdateWithLock(ctx, self, func() error { extNet.Refresh() self.Name = extNet.GetName() self.Status = extNet.GetStatus() @@ -541,8 +541,10 @@ func (self *SNetwork) SyncWithCloudNetwork(userCred mcclient.TokenCredential, ex }) if err != nil { log.Errorf("syncWithCloudNetwork error %s", err) + return err } - return err + db.OpsLog.LogEvent(self, db.ACT_SYNC_UPDATE, diff, userCred) + return nil } func (manager *SNetworkManager) newFromCloudNetwork(userCred mcclient.TokenCredential, extNet cloudprovider.ICloudNetwork, wire *SWire, projectId string) (*SNetwork, error) { @@ -1545,7 +1547,7 @@ func (manager *SNetworkManager) InitializeData() error { } for _, n := range networks { if len(n.ExternalId) == 0 && len(n.WireId) > 0 && n.Status == NETWORK_STATUS_INIT { - manager.TableSpec().Update(&n, func() error { + db.Update(&n, func() error { n.Status = NETWORK_STATUS_AVAILABLE return nil }) @@ -1636,7 +1638,7 @@ func (self *SNetwork) PerformMerge(ctx context.Context, userCred mcclient.TokenC lockman.LockClass(ctx, NetworkManager, userCred.GetProjectId()) defer lockman.ReleaseClass(ctx, NetworkManager, userCred.GetProjectId()) - _, err = NetworkManager.TableSpec().Update(net, func() error { + _, err = db.Update(net, func() error { net.GuestIpStart = startIp net.GuestIpEnd = endIp return nil @@ -1655,7 +1657,7 @@ func (self *SNetwork) PerformMerge(ctx context.Context, userCred mcclient.TokenC for _, gn := range guestnetworks { addr, _ := netutils.NewIPV4Addr(gn.IpAddr) if self.isAddressInRange(addr) { - _, err = GuestnetworkManager.TableSpec().Update(&gn, func() error { + _, err = db.Update(&gn, func() error { gn.NetworkId = net.Id return nil }) @@ -1674,7 +1676,7 @@ func (self *SNetwork) PerformMerge(ctx context.Context, userCred mcclient.TokenC for _, gn := range hostnetworks { addr, _ := netutils.NewIPV4Addr(gn.IpAddr) if self.isAddressInRange(addr) { - _, err = HostnetworkManager.TableSpec().Update(&gn, func() error { + _, err = db.Update(&gn, func() error { gn.NetworkId = net.Id return nil }) @@ -1693,7 +1695,7 @@ func (self *SNetwork) PerformMerge(ctx context.Context, userCred mcclient.TokenC for _, gn := range reservedips { addr, _ := netutils.NewIPV4Addr(gn.IpAddr) if self.isAddressInRange(addr) { - _, err = ReservedipManager.TableSpec().Update(&gn, func() error { + _, err = db.Update(&gn, func() error { gn.NetworkId = net.Id return nil }) @@ -1712,7 +1714,7 @@ func (self *SNetwork) PerformMerge(ctx context.Context, userCred mcclient.TokenC for _, gn := range groupnetwroks { addr, _ := netutils.NewIPV4Addr(gn.IpAddr) if self.isAddressInRange(addr) { - _, err = GroupnetworkManager.TableSpec().Update(&gn, func() error { + _, err = db.Update(&gn, func() error { gn.NetworkId = net.Id return nil }) @@ -1793,7 +1795,7 @@ func (self *SNetwork) PerformSplit(ctx context.Context, userCred mcclient.TokenC } network.SetModelManager(NetworkManager) - self.GetModelManager().TableSpec().Update(self, func() error { + db.Update(self, func() error { self.GuestIpEnd = iSplitIp.StepDown().String() return nil }) @@ -1807,7 +1809,7 @@ func (self *SNetwork) PerformSplit(ctx context.Context, userCred mcclient.TokenC for _, gn := range guestnetworks { addr, _ := netutils.NewIPV4Addr(gn.IpAddr) if network.isAddressInRange(addr) { - _, err := GuestnetworkManager.TableSpec().Update(&gn, func() error { + _, err := db.Update(&gn, func() error { gn.NetworkId = network.Id return nil }) @@ -1826,7 +1828,7 @@ func (self *SNetwork) PerformSplit(ctx context.Context, userCred mcclient.TokenC for _, gn := range hostnetworks { addr, _ := netutils.NewIPV4Addr(gn.IpAddr) if network.isAddressInRange(addr) { - _, err = HostnetworkManager.TableSpec().Update(&gn, func() error { + _, err = db.Update(&gn, func() error { gn.NetworkId = network.Id return nil }) @@ -1845,7 +1847,7 @@ func (self *SNetwork) PerformSplit(ctx context.Context, userCred mcclient.TokenC for _, gn := range reservedips { addr, _ := netutils.NewIPV4Addr(gn.IpAddr) if network.isAddressInRange(addr) { - _, err = ReservedipManager.TableSpec().Update(&gn, func() error { + _, err = db.Update(&gn, func() error { gn.NetworkId = network.Id return nil }) @@ -1864,7 +1866,7 @@ func (self *SNetwork) PerformSplit(ctx context.Context, userCred mcclient.TokenC for _, gn := range groupnetworks { addr, _ := netutils.NewIPV4Addr(gn.IpAddr) if network.isAddressInRange(addr) { - _, err = GroupnetworkManager.TableSpec().Update(&gn, func() error { + _, err = db.Update(&gn, func() error { gn.NetworkId = network.Id return nil }) diff --git a/pkg/compute/models/routetables.go b/pkg/compute/models/routetables.go index 3383b964a0..f648529f2f 100644 --- a/pkg/compute/models/routetables.go +++ b/pkg/compute/models/routetables.go @@ -265,7 +265,7 @@ func (rt *SRouteTable) PerformAddRoutes(ctx context.Context, userCred mcclient.T } } } - _, err := rt.GetModelManager().TableSpec().Update(rt, func() error { + _, err := db.Update(rt, func() error { rt.Routes = &routes return nil }) @@ -296,7 +296,7 @@ func (rt *SRouteTable) PerformDelRoutes(ctx context.Context, userCred mcclient.T } } } - _, err := rt.GetModelManager().TableSpec().Update(rt, func() error { + _, err := db.Update(rt, func() error { rt.Routes = &routes return nil }) @@ -431,7 +431,7 @@ func (self *SRouteTable) SyncWithCloudRouteTable(userCred mcclient.TokenCredenti if err != nil { return err } - _, err = man.TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.CloudregionId = routeTable.CloudregionId self.VpcId = vpc.Id self.Type = routeTable.Type diff --git a/pkg/compute/models/secgroupcache.go b/pkg/compute/models/secgroupcache.go index db741f973c..75f032110e 100644 --- a/pkg/compute/models/secgroupcache.go +++ b/pkg/compute/models/secgroupcache.go @@ -164,10 +164,14 @@ func (manager *SSecurityGroupCacheManager) Register(ctx context.Context, userCre return secgroupCache } -func (self *SSecurityGroupCache) SetExternalId(externalId string) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { +func (self *SSecurityGroupCache) SetExternalId(userCred mcclient.TokenCredential, externalId string) error { + diff, err := db.Update(self, func() error { self.ExternalId = externalId return nil }) - return err + if err != nil { + return err + } + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) + return nil } diff --git a/pkg/compute/models/secgrouprules.go b/pkg/compute/models/secgrouprules.go index 1a32ef1d5b..036c83e41e 100644 --- a/pkg/compute/models/secgrouprules.go +++ b/pkg/compute/models/secgrouprules.go @@ -351,7 +351,7 @@ func (manager *SSecurityGroupRuleManager) SyncRules(ctx context.Context, userCre cmp := strings.Compare(dbStr, ruleStr) if cmp == 0 { if dbRules[j].Description != rules[i].Description { - if _, err := manager.TableSpec().Update(&dbRules[j], func() error { + if _, err := db.Update(&dbRules[j], func() error { dbRules[j].Description = rules[i].Description return nil }); err != nil { diff --git a/pkg/compute/models/secgroups.go b/pkg/compute/models/secgroups.go index b53dd3f62f..a852f2c21c 100644 --- a/pkg/compute/models/secgroups.go +++ b/pkg/compute/models/secgroups.go @@ -264,7 +264,7 @@ func (manager *SSecurityGroupManager) getSecurityGroups() ([]SSecurityGroup, err } func (self *SSecurityGroup) SyncWithCloudSecurityGroup(userCred mcclient.TokenCredential, extSec cloudprovider.ICloudSecurityGroup, vpc *SVpc, projectId string, projectSync bool) error { - if _, err := self.GetModelManager().TableSpec().Update(self, func() error { + if _, err := db.Update(self, func() error { extSec.Refresh() self.Name = extSec.GetName() self.Description = extSec.GetDescription() @@ -279,7 +279,7 @@ func (self *SSecurityGroup) SyncWithCloudSecurityGroup(userCred mcclient.TokenCr } if secgroupcache := SecurityGroupCacheManager.Register(context.Background(), userCred, self.Id, extSec.GetVpcId(), vpc.CloudregionId, vpc.ManagerId); secgroupcache != nil { - if err := secgroupcache.SetExternalId(self.ExternalId); err != nil { + if err := secgroupcache.SetExternalId(userCred, self.ExternalId); err != nil { log.Errorf("set secgroupcache %s externalId error: %v", secgroupcache.Id, err) } } @@ -311,7 +311,7 @@ func (manager *SSecurityGroupManager) newFromCloudVpc(userCred mcclient.TokenCre } if secgroupcache := SecurityGroupCacheManager.Register(context.Background(), userCred, secgroup.Id, extSec.GetVpcId(), vpc.CloudregionId, vpc.ManagerId); secgroupcache != nil { - if err := secgroupcache.SetExternalId(secgroup.ExternalId); err != nil { + if err := secgroupcache.SetExternalId(userCred, secgroup.ExternalId); err != nil { log.Errorf("set secgroupcache %s externalId error: %v", secgroupcache.Id, err) } } @@ -385,7 +385,7 @@ func (manager *SSecurityGroupManager) DelaySync(ctx context.Context, userCred mc defer lockman.ReleaseObject(ctx, secgrp) if secgrp.IsDirty { - if _, err := secgrp.GetModelManager().TableSpec().Update(secgrp, func() error { + if _, err := db.Update(secgrp, func() error { secgrp.IsDirty = false return nil }); err != nil { @@ -402,7 +402,7 @@ func (manager *SSecurityGroupManager) DelaySync(ctx context.Context, userCred mc } func (self *SSecurityGroup) DoSync(ctx context.Context, userCred mcclient.TokenCredential) { - if _, err := self.GetModelManager().TableSpec().Update(self, func() error { + if _, err := db.Update(self, func() error { self.IsDirty = true return nil }); err != nil { @@ -458,7 +458,7 @@ func (manager *SSecurityGroupManager) InitializeData() error { return err } for i := 0; i < len(guests); i += 1 { - GuestManager.TableSpec().Update(&guests[i], func() error { + db.Update(&guests[i], func() error { guests[i].SecgrpId = "default" return nil }) diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index 5d8554bfe3..82b5233cdc 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -669,7 +669,7 @@ func (manager *SServerSkuManager) PendingDeleteInvalidSku() error { for i := range skus { sku := skus[i] - _, err = manager.TableSpec().Update(&sku, func() error { + _, err = db.Update(&sku, func() error { return sku.MarkDelete() }) @@ -757,7 +757,7 @@ func (self *SServerSku) constructSku(extSku cloudprovider.ICloudSku) { } func (self *SServerSku) syncWithCloudSku(ctx context.Context, userCred mcclient.TokenCredential, extSku cloudprovider.ICloudSku, zone *SZone, provider *SCloudprovider) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.constructSku(extSku) return nil }) diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index 007f34f7b1..b8c36df2a6 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -280,7 +280,7 @@ func (self *SSnapshotManager) AddRefCount(snapshotId string, count int) { iSnapshot, _ := self.FetchById(snapshotId) if iSnapshot != nil { snapshot := iSnapshot.(*SSnapshot) - _, err := self.TableSpec().Update(snapshot, func() error { + _, err := db.Update(snapshot, func() error { snapshot.RefCount += count return nil }) @@ -418,7 +418,7 @@ func (self *SSnapshot) AllowPerformDeleted(ctx context.Context, userCred mcclien } func (self *SSnapshot) PerformDeleted(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { - self.GetModelManager().TableSpec().Update(self, func() error { + db.Update(self, func() error { self.OutOfChain = true return nil }) @@ -492,7 +492,7 @@ func (self *SSnapshot) RealDelete(ctx context.Context, userCred mcclient.TokenCr } func (self *SSnapshot) FakeDelete() error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.FakeDeleted = true return nil }) @@ -532,7 +532,7 @@ func TotalSnapshotCount(projectId string, rangeObj db.IStandaloneModel, provider // Only sync snapshot status func (self *SSnapshot) SyncWithCloudSnapshot(userCred mcclient.TokenCredential, ext cloudprovider.ICloudSnapshot, projectId string, projectSync bool, region *SCloudregion) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Name = ext.GetName() self.Status = ext.GetStatus() self.DiskType = ext.GetDiskType() diff --git a/pkg/compute/models/storagecachedimages.go b/pkg/compute/models/storagecachedimages.go index 5385ea5359..0f737b4976 100644 --- a/pkg/compute/models/storagecachedimages.go +++ b/pkg/compute/models/storagecachedimages.go @@ -280,7 +280,7 @@ func (self *SStoragecachedimage) markDeleting(ctx context.Context, userCred mccl []string{CACHED_IMAGE_STATUS_READY, CACHED_IMAGE_STATUS_DELETING, CACHED_IMAGE_STATUS_CACHE_FAILED}) { return httperrors.NewInvalidStatusError("Cannot uncache in status %s", self.Status) } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.Status = CACHED_IMAGE_STATUS_DELETING return nil }) @@ -321,7 +321,7 @@ func (self *SStoragecachedimage) SetStatus(userCred mcclient.TokenCredential, st return nil } oldStatus := self.Status - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Status = status return nil }) @@ -339,7 +339,7 @@ func (self *SStoragecachedimage) SetStatus(userCred mcclient.TokenCredential, st } func (self *SStoragecachedimage) AddDownloadRefcount() error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.DownloadRefcnt += 1 self.LastDownload = time.Now() return nil @@ -348,7 +348,7 @@ func (self *SStoragecachedimage) AddDownloadRefcount() error { } func (self *SStoragecachedimage) SetExternalId(externalId string) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.ExternalId = externalId return nil }) diff --git a/pkg/compute/models/storagecaches.go b/pkg/compute/models/storagecaches.go index 6777f4bc37..836d566d74 100644 --- a/pkg/compute/models/storagecaches.go +++ b/pkg/compute/models/storagecaches.go @@ -173,7 +173,7 @@ func (manager *SStoragecacheManager) newFromCloudStoragecache(cloudCache cloudpr } func (self *SStoragecache) syncWithCloudStoragecache(cloudCache cloudprovider.ICloudStoragecache) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Name = cloudCache.GetName() self.Path = cloudCache.GetPath() diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index bfe52a5daf..d8b75be199 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -270,7 +270,7 @@ func (self *SStorage) PostCreate(ctx context.Context, userCred mcclient.TokenCre self.SStandaloneResourceBase.PostCreate(ctx, userCred, ownerProjId, query, data) storageConf, _ := data.Get("storage_conf") if storageConf != nil { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.StorageConf = storageConf return nil }) @@ -292,7 +292,7 @@ func (self *SStorage) PostCreate(ctx context.Context, userCred mcclient.TokenCre monHost, _ := storages[i].StorageConf.GetString("mon_host") key, _ := storages[i].StorageConf.GetString("key") if monHost == nMonHost && nKey == key { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.StoragecacheId = storages[i].StoragecacheId return nil }) @@ -327,7 +327,7 @@ func (self *SStorage) PostCreate(ctx context.Context, userCred mcclient.TokenCre log.Errorln(err) return } - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.StoragecacheId = sc.Id self.Status = STORAGE_ONLINE return nil @@ -343,7 +343,7 @@ func (self *SStorage) SetStatus(userCred mcclient.TokenCredential, status string return nil } oldStatus := self.Status - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Status = status return nil }) @@ -369,7 +369,7 @@ func (self *SStorage) AllowPerformEnable(ctx context.Context, userCred mcclient. func (self *SStorage) PerformEnable(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if !self.Enabled { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Enabled = true return nil }) @@ -388,7 +388,7 @@ func (self *SStorage) AllowPerformDisable(ctx context.Context, userCred mcclient func (self *SStorage) PerformDisable(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if self.Enabled { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Enabled = false return nil }) @@ -546,7 +546,7 @@ func (self *SStorage) GetZoneId() string { } host := self.GetMasterHost() if host != nil { - _, err := StorageManager.TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.ZoneId = host.ZoneId return nil }) @@ -747,7 +747,7 @@ func (manager *SStorageManager) SyncStorages(ctx context.Context, userCred mccli } func (self *SStorage) syncWithCloudStorage(extStorage cloudprovider.ICloudStorage) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Name = extStorage.GetName() self.Status = extStorage.GetStatus() self.StorageType = extStorage.GetStorageType() @@ -997,15 +997,19 @@ func (self *SStorage) GetAllAttachingHosts() []SHost { return ret } -func (self *SStorage) SetStoragecache(cache *SStoragecache) error { +func (self *SStorage) SetStoragecache(userCred mcclient.TokenCredential, cache *SStoragecache) error { if self.StoragecacheId == cache.Id { return nil } - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + diff, err := db.Update(self, func() error { self.StoragecacheId = cache.Id return nil }) - return err + if err != nil { + return err + } + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) + return nil } func (self *SStorage) AllowPerformCacheImage(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { @@ -1098,7 +1102,7 @@ func (manager *SStorageManager) InitializeData() error { } else { log.Fatalf("Cannot locate zoneId for storage %s", s.Name) } - manager.TableSpec().Update(&s, func() error { + db.Update(&s, func() error { s.ZoneId = zoneId return nil }) @@ -1114,7 +1118,7 @@ func (manager *SStorageManager) InitializeData() error { if err := StoragecacheManager.TableSpec().Insert(storagecache); err != nil { log.Fatalf("Cannot Add storagecache for %s", s.Name) } else { - manager.TableSpec().Update(&s, func() error { + db.Update(&s, func() error { s.StoragecacheId = storagecache.Id return nil }) diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index 982277493c..24c3f144dd 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -228,7 +228,7 @@ func (manager *SVpcManager) getVpcsByRegion(region *SCloudregion, provider *SClo func (self *SVpc) setDefault(def bool) error { var err error if self.IsDefault != def { - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.IsDefault = def return nil }) @@ -305,7 +305,7 @@ func (manager *SVpcManager) SyncVPCs(ctx context.Context, userCred mcclient.Toke } func (self *SVpc) SyncWithCloudVpc(extVPC cloudprovider.ICloudVpc) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { extVPC.Refresh() self.Name = extVPC.GetName() self.Status = extVPC.GetStatus() @@ -378,7 +378,7 @@ func (manager *SVpcManager) InitializeData() error { } else { vpc := vpcObj.(*SVpc) if vpc.Status != VPC_STATUS_AVAILABLE { - _, err = manager.TableSpec().Update(vpc, func() error { + _, err = db.Update(vpc, func() error { vpc.Status = VPC_STATUS_AVAILABLE return nil }) diff --git a/pkg/compute/models/wires.go b/pkg/compute/models/wires.go index f65f6803a6..5a08913135 100644 --- a/pkg/compute/models/wires.go +++ b/pkg/compute/models/wires.go @@ -226,7 +226,7 @@ func (manager *SWireManager) SyncWires(ctx context.Context, userCred mcclient.To } func (self *SWire) syncWithCloudWire(extWire cloudprovider.ICloudWire) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Name = extWire.GetName() self.Bandwidth = extWire.GetBandwidth() // 10G @@ -525,8 +525,8 @@ func (manager *SWireManager) InitializeData() error { } for _, w := range wires { if len(w.VpcId) == 0 { - manager.TableSpec().Update(&w, func() error { - w.VpcId = "default" + db.Update(&w, func() error { + w.VpcId = DEFAULT_VPC_ID return nil }) } diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index f941b176c3..fcda4ba40c 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -406,7 +406,7 @@ func (manager *SZoneManager) SyncZones(ctx context.Context, userCred mcclient.To } func (self *SZone) syncWithCloudZone(extZone cloudprovider.ICloudZone, region *SCloudregion) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Name = extZone.GetName() self.Status = extZone.GetStatus() @@ -465,13 +465,13 @@ func (manager *SZoneManager) InitializeData() error { } for _, z := range zones { if len(z.CloudregionId) == 0 { - manager.TableSpec().Update(&z, func() error { - z.CloudregionId = "default" + db.Update(&z, func() error { + z.CloudregionId = DEFAULT_REGION_ID return nil }) } if z.Status == ZONE_INIT || z.Status == ZONE_DISABLE { - manager.TableSpec().Update(&z, func() error { + db.Update(&z, func() error { z.Status = ZONE_ENABLE return nil }) diff --git a/pkg/compute/regiondrivers/kvm.go b/pkg/compute/regiondrivers/kvm.go index 47882154e2..4c1f6ede65 100644 --- a/pkg/compute/regiondrivers/kvm.go +++ b/pkg/compute/regiondrivers/kvm.go @@ -103,7 +103,7 @@ func (self *SKVMRegionDriver) ValidateUpdateLoadbalancerListenerData(ctx context func (self *SKVMRegionDriver) RequestCreateLoadbalancer(ctx context.Context, userCred mcclient.TokenCredential, lb *models.SLoadbalancer, task taskman.ITask) error { taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { - _, err := models.LoadbalancerManager.TableSpec().Update(lb, func() error { + _, err := db.Update(lb, func() error { if lb.AddressType == models.LB_ADDR_TYPE_INTRANET { // TODO support use reserved ip address // TODO prefer ip address from server_type loadbalancer? diff --git a/pkg/compute/regiondrivers/managedvirtual.go b/pkg/compute/regiondrivers/managedvirtual.go index ab721fa324..9005994134 100644 --- a/pkg/compute/regiondrivers/managedvirtual.go +++ b/pkg/compute/regiondrivers/managedvirtual.go @@ -121,7 +121,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancer(ctx co if err != nil { return nil, err } - if err := lb.SetExternalId(iLoadbalancer.GetGlobalId()); err != nil { + if err := lb.SetExternalId(userCred, iLoadbalancer.GetGlobalId()); err != nil { return nil, err } if err := lb.SyncWithCloudLoadbalancer(ctx, userCred, iLoadbalancer, "", false); err != nil { @@ -229,7 +229,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerAcl(ctx if err != nil { return nil, err } - if err := lbacl.SetExternalId(iLoadbalancerAcl.GetGlobalId()); err != nil { + if err := lbacl.SetExternalId(userCred, iLoadbalancerAcl.GetGlobalId()); err != nil { return nil, err } return nil, lbacl.SyncWithCloudLoadbalancerAcl(ctx, userCred, iLoadbalancerAcl, "", false) @@ -297,7 +297,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerCertifi if err != nil { return nil, err } - if err := lbcert.SetExternalId(iLoadbalancerCert.GetGlobalId()); err != nil { + if err := lbcert.SetExternalId(userCred, iLoadbalancerCert.GetGlobalId()); err != nil { return nil, err } return nil, lbcert.SyncWithCloudLoadbalancerCertificate(ctx, userCred, iLoadbalancerCert, "", false) @@ -349,7 +349,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerBackend if err != nil { return nil, err } - if err := lbbg.SetExternalId(iLoadbalancerBackendGroup.GetGlobalId()); err != nil { + if err := lbbg.SetExternalId(userCred, iLoadbalancerBackendGroup.GetGlobalId()); err != nil { return nil, err } iBackends, err := iLoadbalancerBackendGroup.GetILoadbalancerBackends() @@ -427,7 +427,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerBackend if err != nil { return nil, err } - if err := lbb.SetExternalId(iLoadbalancerBackend.GetGlobalId()); err != nil { + if err := lbb.SetExternalId(userCred, iLoadbalancerBackend.GetGlobalId()); err != nil { return nil, err } return nil, lbb.SyncWithCloudLoadbalancerBackend(ctx, userCred, iLoadbalancerBackend, "", false) @@ -491,7 +491,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerListene if err != nil { return nil, err } - if err := lblis.SetExternalId(iListener.GetGlobalId()); err != nil { + if err := lblis.SetExternalId(userCred, iListener.GetGlobalId()); err != nil { return nil, err } return nil, lblis.SyncWithCloudLoadbalancerListener(ctx, userCred, loadbalancer, iListener, "", false) @@ -673,7 +673,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerListene if err != nil { return nil, err } - if err := lbr.SetExternalId(iListenerRule.GetGlobalId()); err != nil { + if err := lbr.SetExternalId(userCred, iListenerRule.GetGlobalId()); err != nil { return nil, err } return nil, lbr.SyncWithCloudLoadbalancerListenerRule(ctx, userCred, iListenerRule, "", false) diff --git a/pkg/compute/regiondrivers/qcloud.go b/pkg/compute/regiondrivers/qcloud.go index c4617cf423..80fca286c3 100644 --- a/pkg/compute/regiondrivers/qcloud.go +++ b/pkg/compute/regiondrivers/qcloud.go @@ -53,7 +53,7 @@ func (self *SQcloudRegionDriver) RequestCreateLoadbalancerBackendGroup(ctx conte if err != nil { return nil, err } - if err := lbbg.SetExternalId(iLoadbalancerBackendGroup.GetGlobalId()); err != nil { + if err := lbbg.SetExternalId(userCred, iLoadbalancerBackendGroup.GetGlobalId()); err != nil { return nil, err } iBackends, err := iLoadbalancerBackendGroup.GetILoadbalancerBackends() @@ -109,7 +109,7 @@ func (self *SQcloudRegionDriver) RequestCreateLoadbalancerBackend(ctx context.Co if err != nil { return nil, err } - if err := lbb.SetExternalId(iLoadbalancerBackend.GetGlobalId()); err != nil { + if err := lbb.SetExternalId(userCred, iLoadbalancerBackend.GetGlobalId()); err != nil { return nil, err } return nil, lbb.SyncWithCloudLoadbalancerBackend(ctx, userCred, iLoadbalancerBackend, "", false) @@ -182,7 +182,7 @@ func (self *SQcloudRegionDriver) RequestCreateLoadbalancerListener(ctx context.C if err != nil { return nil, err } - if err := lblis.SetExternalId(iListener.GetGlobalId()); err != nil { + if err := lblis.SetExternalId(userCred, iListener.GetGlobalId()); err != nil { return nil, err } @@ -262,7 +262,7 @@ func (self *SQcloudRegionDriver) RequestCreateLoadbalancerListenerRule(ctx conte if err != nil { return nil, err } - if err := lbr.SetExternalId(iListenerRule.GetGlobalId()); err != nil { + if err := lbr.SetExternalId(userCred, iListenerRule.GetGlobalId()); err != nil { return nil, err } // ====腾讯云添加后端服务器===== diff --git a/pkg/compute/skus/skus.go b/pkg/compute/skus/skus.go index fbe3e7ea6a..37cb298aa4 100644 --- a/pkg/compute/skus/skus.go +++ b/pkg/compute/skus/skus.go @@ -9,6 +9,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/compute/options" @@ -153,7 +154,7 @@ func (self *SkusZone) doCreate(data models.SServerSku) error { } func (self *SkusZone) doUpdate(odata *models.SServerSku, sku jsonutils.JSONObject) error { - _, err := models.ServerSkuManager.TableSpec().Update(odata, func() error { + _, err := db.Update(odata, func() error { if err := sku.Unmarshal(&odata); err != nil { return err } diff --git a/pkg/compute/tasks/baremetal_convert_hypervisor_task.go b/pkg/compute/tasks/baremetal_convert_hypervisor_task.go index acf6debfa5..f9e1e7ae90 100644 --- a/pkg/compute/tasks/baremetal_convert_hypervisor_task.go +++ b/pkg/compute/tasks/baremetal_convert_hypervisor_task.go @@ -6,8 +6,6 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" - "yunion.io/x/pkg/tristate" - "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/models" @@ -65,10 +63,7 @@ func (self *BaremetalConvertHypervisorTask) OnGuestDeployCompleteFailed(ctx cont guestId, _ := self.Params.GetString("server_id") guestObj, _ := models.GuestManager.FetchById(guestId) guest := guestObj.(*models.SGuest) - guest.GetModelManager().TableSpec().Update(guest, func() error { - guest.DisableDelete = tristate.False - return nil - }) + guest.SetDisableDelete(self.UserCred, false) self.SetStage("OnGuestDeleteComplete", nil) guest.StartDeleteGuestTask(ctx, self.UserCred, self.GetTaskId(), false, true) logclient.AddActionLogWithStartable(self, baremetal, logclient.ACT_BM_CONVERT_HYPER, "convert deploy failed", self.UserCred, false) diff --git a/pkg/compute/tasks/baremetal_maintenance_task.go b/pkg/compute/tasks/baremetal_maintenance_task.go index 3e990d19d3..af0fba6412 100644 --- a/pkg/compute/tasks/baremetal_maintenance_task.go +++ b/pkg/compute/tasks/baremetal_maintenance_task.go @@ -36,7 +36,7 @@ func (self *BaremetalMaintenanceTask) OnEnterMaintenantModeSucc(ctx context.Cont if len(action) > 0 { logclient.AddActionLogWithStartable(self, baremetal, action, "", self.UserCred, true) } - baremetal.GetModelManager().TableSpec().Update(baremetal, func() error { + db.Update(baremetal, func() error { baremetal.IsMaintenance = true return nil }) diff --git a/pkg/compute/tasks/baremetal_server_rebuild_root_task.go b/pkg/compute/tasks/baremetal_server_rebuild_root_task.go index fe78fcec7a..0c860997bb 100644 --- a/pkg/compute/tasks/baremetal_server_rebuild_root_task.go +++ b/pkg/compute/tasks/baremetal_server_rebuild_root_task.go @@ -41,7 +41,7 @@ func (self *BaremetalServerRebuildRootTask) StartRebuildRootDisk(ctx context.Con db.OpsLog.LogEvent(guest, db.ACT_REBUILDING_ROOT, imageId, self.UserCred) gds := guest.CategorizeDisks() oldStatus := gds.Root.Status - _, err := gds.Root.GetModelManager().TableSpec().Update(gds.Root, func() error { + _, err := db.Update(gds.Root, func() error { gds.Root.TemplateId = imageId gds.Root.Status = models.DISK_REBUILD return nil diff --git a/pkg/compute/tasks/baremetal_sync_status_task.go b/pkg/compute/tasks/baremetal_sync_status_task.go index eba6ea3378..712167ea41 100644 --- a/pkg/compute/tasks/baremetal_sync_status_task.go +++ b/pkg/compute/tasks/baremetal_sync_status_task.go @@ -48,7 +48,7 @@ func (self *BaremetalSyncAllGuestsStatusTask) OnInit(ctx context.Context, obj db if !guest.IsSystem { first = true } - guest.GetModelManager().TableSpec().Update(guest, func() error { + db.Update(guest, func() error { guest.IsSystem = true guest.VmemSize = 0 guest.VcpuCount = 0 @@ -57,7 +57,7 @@ func (self *BaremetalSyncAllGuestsStatusTask) OnInit(ctx context.Context, obj db bs := baremetal.GetBaremetalstorage().GetStorage() bs.SetStatus(self.UserCred, models.STORAGE_OFFLINE, "") if first && baremetal.Name != guest.Name { - baremetal.GetModelManager().TableSpec().Update(baremetal, func() error { + db.Update(baremetal, func() error { if models.HostManager.IsNewNameUnique(guest.Name, self.UserCred, nil) { baremetal.Name = guest.Name } else { diff --git a/pkg/compute/tasks/baremetal_unmaintenance_task.go b/pkg/compute/tasks/baremetal_unmaintenance_task.go index dd03201a05..244f22ce99 100644 --- a/pkg/compute/tasks/baremetal_unmaintenance_task.go +++ b/pkg/compute/tasks/baremetal_unmaintenance_task.go @@ -40,7 +40,7 @@ func (self *BaremetalUnmaintenanceTask) OnInit(ctx context.Context, obj db.IStan } func (self *BaremetalUnmaintenanceTask) OnUnmaintenantComplete(ctx context.Context, baremetal *models.SHost, body jsonutils.JSONObject) { - baremetal.GetModelManager().TableSpec().Update(baremetal, func() error { + db.Update(baremetal, func() error { baremetal.IsMaintenance = false return nil }) diff --git a/pkg/compute/tasks/cloud_account_import_task.go b/pkg/compute/tasks/cloud_account_import_task.go index 0117fc2500..af38fb679d 100644 --- a/pkg/compute/tasks/cloud_account_import_task.go +++ b/pkg/compute/tasks/cloud_account_import_task.go @@ -20,7 +20,7 @@ func init() { func (self *CloudAccountImportTask) OnInit(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) { cloudAccount := obj.(*models.SCloudaccount) - cloudAccount.MarkStartSync(self.UserCred) + cloudAccount.SetStatus(self.UserCred, models.CLOUD_PROVIDER_SYNCING, "account sync") autoCreateProject := jsonutils.QueryBoolean(self.Params, "auto_create_project", false) autoSync := jsonutils.QueryBoolean(self.Params, "auto_sync", false) diff --git a/pkg/compute/tasks/cloud_provider_sync_info_task.go b/pkg/compute/tasks/cloud_provider_sync_info_task.go index 406f32a875..356265aea2 100644 --- a/pkg/compute/tasks/cloud_provider_sync_info_task.go +++ b/pkg/compute/tasks/cloud_provider_sync_info_task.go @@ -56,7 +56,7 @@ func taskFail(ctx context.Context, task *CloudProviderSyncInfoTask, provider *mo func (self *CloudProviderSyncInfoTask) OnInit(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) { provider := obj.(*models.SCloudprovider) - provider.MarkStartSync(self.UserCred) + provider.SetStatus(self.UserCred, models.CLOUD_PROVIDER_SYNCING, "start syncing") // do sync notes := fmt.Sprintf("Start sync cloud provider %s status ...", provider.Name) @@ -78,16 +78,24 @@ func (self *CloudProviderSyncInfoTask) OnInit(ctx context.Context, obj db.IStand provider.SaveSysInfo(sysinfo, version) } - syncRangeJson, _ := self.Params.Get("sync_range") - if syncRangeJson != nil { - syncRange := models.SSyncRange{} - err = syncRangeJson.Unmarshal(&syncRange) - if err == nil && syncRange.NeedSyncInfo() { - syncRange.Normalize() - syncCloudProviderInfo(ctx, provider, self, driver, &syncRange) - } - } + self.SetStage("OnSyncCLoudProviderInfoComplete", nil) + taskman.LocalTaskRun(self, func() (jsonutils.JSONObject, error) { + syncRangeJson, _ := self.Params.Get("sync_range") + if syncRangeJson != nil { + syncRange := models.SSyncRange{} + err = syncRangeJson.Unmarshal(&syncRange) + if err == nil && syncRange.NeedSyncInfo() { + syncRange.Normalize() + syncCloudProviderInfo(ctx, provider, self, driver, &syncRange) + } + } + return nil, nil + }) +} + +func (self *CloudProviderSyncInfoTask) OnSyncCLoudProviderInfoComplete(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) { + provider := obj.(*models.SCloudprovider) provider.SetStatus(self.UserCred, models.CLOUD_PROVIDER_CONNECTED, "") provider.CleanSchedCache() self.SetStageComplete(ctx, nil) @@ -198,11 +206,6 @@ func syncPublicCloudProviderInfo(ctx context.Context, provider *models.SCloudpro result := storageCachePairs[i].syncCloudImages(ctx, task.GetUserCred()) msg := result.Result() log.Infof("syncCloudImages result: %s", msg) - // skip errors - // if result.IsError() { - // logSyncFailed(provider, task, msg) - // return - // } } } @@ -578,7 +581,7 @@ func syncStorageCaches(ctx context.Context, provider *models.SCloudprovider, tas logSyncFailed(provider, task, msg) return } - err = localStorage.SetStoragecache(localCache) + err = localStorage.SetStoragecache(task.GetUserCred(), localCache) if err != nil { msg := fmt.Sprintf("localStorage %s set cache failed: %s", localStorage.GetName(), err) log.Errorf(msg) diff --git a/pkg/compute/tasks/disk_create_task.go b/pkg/compute/tasks/disk_create_task.go index 5d86465954..d12b814925 100644 --- a/pkg/compute/tasks/disk_create_task.go +++ b/pkg/compute/tasks/disk_create_task.go @@ -86,7 +86,7 @@ func (self *DiskCreateTask) OnStartAllocateFailed(ctx context.Context, disk *mod func (self *DiskCreateTask) OnDiskReady(ctx context.Context, disk *models.SDisk, data jsonutils.JSONObject) { diskSize, _ := data.Int("disk_size") - if _, err := disk.GetModelManager().TableSpec().Update(disk, func() error { + if _, err := db.Update(disk, func() error { disk.DiskSize = int(diskSize) disk.DiskFormat, _ = data.GetString("disk_format") disk.AccessPath, _ = data.GetString("disk_path") diff --git a/pkg/compute/tasks/disk_reset_task.go b/pkg/compute/tasks/disk_reset_task.go index cefaf0daf3..24743e369d 100644 --- a/pkg/compute/tasks/disk_reset_task.go +++ b/pkg/compute/tasks/disk_reset_task.go @@ -88,7 +88,7 @@ func (self *DiskResetTask) OnRequestResetDisk(ctx context.Context, disk *models. externalId, _ := data.GetString("exteranl_disk_id") if disk.DiskSize != snapshot.Size || (len(externalId) > 0 && externalId != disk.GetExternalId()) { - _, err := models.DiskManager.TableSpec().Update(disk, func() error { + _, err := db.Update(disk, func() error { disk.DiskSize = snapshot.Size disk.ExternalId = externalId return nil @@ -150,7 +150,7 @@ func (self *DiskCleanUpSnapshotsTask) OnCleanUpSnapshots(ctx context.Context, di continue } snapshot := iSnapshot.(*models.SSnapshot) - models.SnapshotManager.TableSpec().Update(snapshot, func() error { + db.Update(snapshot, func() error { snapshot.OutOfChain = true return nil }) diff --git a/pkg/compute/tasks/disk_resize_task.go b/pkg/compute/tasks/disk_resize_task.go index 308dd9598f..4e505455d0 100644 --- a/pkg/compute/tasks/disk_resize_task.go +++ b/pkg/compute/tasks/disk_resize_task.go @@ -92,7 +92,7 @@ func (self *DiskResizeTask) OnDiskResizeComplete(ctx context.Context, disk *mode return } oldStatus := disk.Status - _, err = disk.GetModelManager().TableSpec().Update(disk, func() error { + _, err = db.Update(disk, func() error { disk.Status = models.DISK_READY disk.DiskSize = int(sizeMb) return nil diff --git a/pkg/compute/tasks/eip_allocate_task.go b/pkg/compute/tasks/eip_allocate_task.go index 7ec5713f7e..4e0210038d 100644 --- a/pkg/compute/tasks/eip_allocate_task.go +++ b/pkg/compute/tasks/eip_allocate_task.go @@ -53,7 +53,7 @@ func (self *EipAllocateTask) OnInit(ctx context.Context, obj db.IStandaloneModel return } - err = eip.SyncWithCloudEip(self.UserCred, extEip, "", false) + err = eip.SyncWithCloudEip(ctx, self.UserCred, extEip, "", false) if err != nil { msg := fmt.Sprintf("sync eip fail %s", err) diff --git a/pkg/compute/tasks/eip_syncstatus_task.go b/pkg/compute/tasks/eip_syncstatus_task.go index 799d316bed..eac97e1d82 100644 --- a/pkg/compute/tasks/eip_syncstatus_task.go +++ b/pkg/compute/tasks/eip_syncstatus_task.go @@ -38,7 +38,7 @@ func (self *EipSyncstatusTask) OnInit(ctx context.Context, obj db.IStandaloneMod return } - err = eip.SyncWithCloudEip(self.UserCred, extEip, "", false) + err = eip.SyncWithCloudEip(ctx, self.UserCred, extEip, "", false) if err != nil { msg := fmt.Sprintf("fail to sync eip status %s", err) eip.SetStatus(self.UserCred, models.EIP_STATUS_UNKNOWN, msg) diff --git a/pkg/compute/tasks/guest_backup_tasks.go b/pkg/compute/tasks/guest_backup_tasks.go index 481e181b9f..d23f26d9ae 100644 --- a/pkg/compute/tasks/guest_backup_tasks.go +++ b/pkg/compute/tasks/guest_backup_tasks.go @@ -47,12 +47,12 @@ func (self *GuestSwitchToBackupTask) OnBackupGuestStoped(ctx context.Context, gu disks := guest.GetDisks() for i := 0; i < len(disks); i++ { disk := disks[i].GetDisk() - err := disk.SwitchToBackup() + err := disk.SwitchToBackup(self.UserCred) if err != nil { if i > 0 { for j := 0; j < i; j++ { disk = disks[j].GetDisk() - disk.SwitchToBackup() + disk.SwitchToBackup(self.UserCred) } } db.OpsLog.LogEvent(guest, db.ACT_SWITCH_FAILED, fmt.Sprintf("Switch to backup disk error: %s", err), self.UserCred) @@ -60,7 +60,7 @@ func (self *GuestSwitchToBackupTask) OnBackupGuestStoped(ctx context.Context, gu return } } - err := guest.SwitchToBackup() + err := guest.SwitchToBackup(self.UserCred) if err != nil { db.OpsLog.LogEvent(guest, db.ACT_SWITCH_FAILED, fmt.Sprintf("Switch to backup guest error: %s", err), self.UserCred) self.OnFail(ctx, guest, fmt.Sprintf("Switch to backup guest error: %s", err)) @@ -176,7 +176,7 @@ func (self *GuestCreateBackupTask) SaveScheduleResult(ctx context.Context, obj I self.TaskFailed(ctx, guest, "target host not found?") return } - guest.SetHostIdWithBackup(guest.HostId, targetHostId) + guest.SetHostIdWithBackup(self.UserCred, guest.HostId, targetHostId) db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP, fmt.Sprintf("guest backup start create on host %s", targetHostId), self.UserCred) // backup disk only support disk backend local @@ -192,7 +192,7 @@ func (self *GuestCreateBackupTask) StartCreateBackupDisks(ctx context.Context, g guestDisks := guest.GetDisks() for i := 0; i < len(guestDisks); i++ { disk := guestDisks[i].GetDisk() - disk.GetModelManager().TableSpec().Update(disk, func() error { + db.Update(disk, func() error { disk.BackupStorageId = storageId return nil }) diff --git a/pkg/compute/tasks/guest_batch_create_task.go b/pkg/compute/tasks/guest_batch_create_task.go index b67e9f7456..1f012354a3 100644 --- a/pkg/compute/tasks/guest_batch_create_task.go +++ b/pkg/compute/tasks/guest_batch_create_task.go @@ -28,13 +28,13 @@ func (self *GuestBatchCreateTask) OnScheduleFailCallback(obj IScheduleModel, rea self.SSchedTask.OnScheduleFailCallback(obj, reason) guest := obj.(*models.SGuest) if guest.DisableDelete.IsTrue() { - guest.SetDisableDelete(false) + guest.SetDisableDelete(self.UserCred, false) } } func (self *GuestBatchCreateTask) SaveScheduleResultWithBackup(ctx context.Context, obj IScheduleModel, master, slave string) { guest := obj.(*models.SGuest) - guest.SetHostIdWithBackup(master, slave) + guest.SetHostIdWithBackup(self.UserCred, master, slave) self.SaveScheduleResult(ctx, obj, master) } @@ -82,7 +82,7 @@ func (self *GuestBatchCreateTask) SaveScheduleResult(ctx context.Context, obj IS return } - guest.GetDriver().PrepareDiskRaidConfig(host, self.Params) + guest.GetDriver().PrepareDiskRaidConfig(self.UserCred, host, self.Params) err = guest.CreateDisksOnHost(ctx, self.UserCred, host, self.Params, &pendingUsage, true) self.SetPendingUsage(&pendingUsage) diff --git a/pkg/compute/tasks/guest_change_config_task.go b/pkg/compute/tasks/guest_change_config_task.go index b8f947677a..882f2650f6 100644 --- a/pkg/compute/tasks/guest_change_config_task.go +++ b/pkg/compute/tasks/guest_change_config_task.go @@ -152,7 +152,7 @@ func (self *GuestChangeConfigTask) OnGuestChangeCpuMemSpecComplete(ctx context.C addCpu := int(vcpuCount - int64(guest.VcpuCount)) addMem := int(vmemSize - int64(guest.VmemSize)) - _, err := guest.GetModelManager().TableSpec().Update(guest, func() error { + _, err := db.Update(guest, func() error { if vcpuCount > 0 { guest.VcpuCount = int8(vcpuCount) } diff --git a/pkg/compute/tasks/guest_create_disk_task.go b/pkg/compute/tasks/guest_create_disk_task.go index e976e13a6b..ac40f27dad 100644 --- a/pkg/compute/tasks/guest_create_disk_task.go +++ b/pkg/compute/tasks/guest_create_disk_task.go @@ -251,7 +251,7 @@ func (self *ESXiGuestCreateDiskTask) OnInit(ctx context.Context, obj db.IStandal vdisk := idisks[len(idisks)-1] - _, err = disk.GetModelManager().TableSpec().Update(disk, func() error { + _, err = db.Update(disk, func() error { disk.DiskSize = vdisk.GetDiskSizeMB() disk.AccessPath = vdisk.GetAccessPath() disk.ExternalId = vdisk.GetGlobalId() diff --git a/pkg/compute/tasks/guest_delete_on_host_task.go b/pkg/compute/tasks/guest_delete_on_host_task.go index 44e8d80b05..21baf0ff5a 100644 --- a/pkg/compute/tasks/guest_delete_on_host_task.go +++ b/pkg/compute/tasks/guest_delete_on_host_task.go @@ -56,7 +56,7 @@ func (self *GuestDeleteOnHostTask) OnStopGuest(ctx context.Context, guest *model return } } - _, err := models.DiskManager.TableSpec().Update(disk, func() error { + _, err := db.Update(disk, func() error { disk.BackupStorageId = "" return nil }) @@ -76,7 +76,7 @@ func (self *GuestDeleteOnHostTask) OnStopGuest(ctx context.Context, guest *model func (self *GuestDeleteOnHostTask) OnUnDeployGuest(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { hostId, _ := self.Params.GetString("host_id") if guest.BackupHostId == hostId { - _, err := models.GuestManager.TableSpec().Update(guest, func() error { + _, err := db.Update(guest, func() error { guest.BackupHostId = "" return nil }) diff --git a/pkg/compute/tasks/guest_disk_snapshot_task.go b/pkg/compute/tasks/guest_disk_snapshot_task.go index e6a2d13924..ec35a79911 100644 --- a/pkg/compute/tasks/guest_disk_snapshot_task.go +++ b/pkg/compute/tasks/guest_disk_snapshot_task.go @@ -61,14 +61,14 @@ func (self *GuestDiskSnapshotTask) OnDiskSnapshotComplete(ctx context.Context, g log.Infof("OnDiskSnapshotComplete called with data no location") return } - models.SnapshotManager.TableSpec().Update(snapshot, func() error { + db.Update(snapshot, func() error { snapshot.Location = location snapshot.Status = models.SNAPSHOT_READY return nil }) } else { extSnapshotId, _ := data.GetString("snapshot_id") - models.SnapshotManager.TableSpec().Update(snapshot, func() error { + db.Update(snapshot, func() error { snapshot.ExternalId = extSnapshotId snapshot.Status = models.SNAPSHOT_READY return nil @@ -108,7 +108,7 @@ func (self *GuestDiskSnapshotTask) TaskFailed(ctx context.Context, guest *models snapshotId, _ := self.Params.GetString("snapshot_id") iSnapshot, _ := models.SnapshotManager.FetchById(snapshotId) snapshot := iSnapshot.(*models.SSnapshot) - models.SnapshotManager.TableSpec().Update(snapshot, func() error { + db.Update(snapshot, func() error { snapshot.Status = models.SNAPSHOT_FAILED return nil }) @@ -244,7 +244,7 @@ func (self *SnapshotDeleteTask) OnDeleteSnapshot(ctx context.Context, snapshot * FakeDelete = true } if FakeDelete { - models.SnapshotManager.TableSpec().Update(snapshot, func() error { + db.Update(snapshot, func() error { snapshot.OutOfChain = true return nil }) diff --git a/pkg/compute/tasks/guest_live_migrate_task.go b/pkg/compute/tasks/guest_live_migrate_task.go index ad970302dc..d3469b27ab 100644 --- a/pkg/compute/tasks/guest_live_migrate_task.go +++ b/pkg/compute/tasks/guest_live_migrate_task.go @@ -285,14 +285,14 @@ func (self *GuestMigrateTask) setGuest(ctx context.Context, guest *models.SGuest guestDisks := guest.GetDisks() for i := 0; i < len(guestDisks); i++ { disk := guestDisks[i].GetDisk() - disk.GetModelManager().TableSpec().Update(disk, func() error { + db.Update(disk, func() error { disk.Status = models.DISK_READY disk.StorageId = targetStorage.Id return nil }) snapshots := models.SnapshotManager.GetDiskSnapshots(disk.Id) for _, snapshot := range snapshots { - snapshot.GetModelManager().TableSpec().Update(snapshot, func() error { + db.Update(&snapshot, func() error { snapshot.StorageId = targetStorage.Id return nil }) diff --git a/pkg/compute/tasks/guest_rebuild_root_task.go b/pkg/compute/tasks/guest_rebuild_root_task.go index 6d5db6c926..053a45cb71 100644 --- a/pkg/compute/tasks/guest_rebuild_root_task.go +++ b/pkg/compute/tasks/guest_rebuild_root_task.go @@ -49,7 +49,7 @@ func (self *GuestRebuildRootTask) StartRebuildRootDisk(ctx context.Context, gues gds := guest.CategorizeDisks() imageId, _ := self.Params.GetString("image_id") oldStatus := gds.Root.Status - _, err := gds.Root.GetModelManager().TableSpec().Update(gds.Root, func() error { + _, err := db.Update(gds.Root, func() error { gds.Root.TemplateId = imageId gds.Root.Status = models.DISK_REBUILD return nil @@ -139,7 +139,7 @@ func (self *GuestRebuildRootTask) OnRebuildAllDisksComplete(ctx context.Context, return } if guest.OsType != osprof.OSType { - _, err := guest.GetModelManager().TableSpec().Update(guest, func() error { + _, err := db.Update(guest, func() error { guest.OsType = osprof.OSType return nil }) diff --git a/pkg/compute/tasks/network_create_task.go b/pkg/compute/tasks/network_create_task.go index f22fec944c..9755087724 100644 --- a/pkg/compute/tasks/network_create_task.go +++ b/pkg/compute/tasks/network_create_task.go @@ -56,7 +56,7 @@ func (self *NetworkCreateTask) OnInit(ctx context.Context, obj db.IStandaloneMod self.taskFailed(ctx, network, "createinetwork", err) return } - network.SetExternalId(inet.GetGlobalId()) + network.SetExternalId(self.UserCred, inet.GetGlobalId()) err = cloudprovider.WaitStatus(inet, models.NETWORK_STATUS_AVAILABLE, 10*time.Second, 300*time.Second) if err != nil { @@ -64,7 +64,7 @@ func (self *NetworkCreateTask) OnInit(ctx context.Context, obj db.IStandaloneMod return } - err = network.SyncWithCloudNetwork(self.UserCred, inet, "", false) + err = network.SyncWithCloudNetwork(ctx, self.UserCred, inet, "", false) if err != nil { self.taskFailed(ctx, network, "SyncWithCloudNetwork", err) diff --git a/pkg/compute/tasks/vpc_create_task.go b/pkg/compute/tasks/vpc_create_task.go index 1164090984..0225c69504 100644 --- a/pkg/compute/tasks/vpc_create_task.go +++ b/pkg/compute/tasks/vpc_create_task.go @@ -41,7 +41,7 @@ func (self *VpcCreateTask) OnInit(ctx context.Context, obj db.IStandaloneModel, self.TaskFailed(ctx, vpc, err) return } - vpc.SetExternalId(ivpc.GetGlobalId()) + vpc.SetExternalId(self.UserCred, ivpc.GetGlobalId()) err = cloudprovider.WaitStatus(ivpc, models.VPC_STATUS_AVAILABLE, 10*time.Second, 300*time.Second) if err != nil { diff --git a/pkg/image/models/image_properties.go b/pkg/image/models/image_properties.go index 1e58d8b100..e6748a19b8 100644 --- a/pkg/image/models/image_properties.go +++ b/pkg/image/models/image_properties.go @@ -116,7 +116,7 @@ func (manager *SImagePropertyManager) NewProperty(ctx context.Context, userCred } func (self *SImageProperty) UpdateValue(ctx context.Context, userCred mcclient.TokenCredential, value string) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Value = value return nil }) diff --git a/pkg/image/models/image_subs.go b/pkg/image/models/image_subs.go index 67ee947f6f..1201307d52 100644 --- a/pkg/image/models/image_subs.go +++ b/pkg/image/models/image_subs.go @@ -106,7 +106,7 @@ func (self *SImageSubformat) Save(image *SImage) error { return nil // httperrors.NewInvalidStatusError("cannot save in status %s", self.Status) } location := image.GetPath(self.Format) - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Status = IMAGE_STATUS_SAVING self.Location = fmt.Sprintf("%s%s", LocalFilePrefix, location) return nil @@ -135,7 +135,7 @@ func (self *SImageSubformat) Save(image *SImage) error { log.Errorf("fileutils2.fastChecksum fail %s", err) return err } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.Status = IMAGE_STATUS_ACTIVE self.Location = fmt.Sprintf("%s%s", LocalFilePrefix, location) self.Checksum = checksum @@ -159,7 +159,7 @@ func (self *SImageSubformat) SaveTorrent() error { } imgPath := self.getLocalLocation() torrentPath := filepath.Join(options.Options.TorrentStoreDir, fmt.Sprintf("%s.torrent", filepath.Base(imgPath))) - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.TorrentStatus = IMAGE_STATUS_SAVING self.TorrentLocation = fmt.Sprintf("%s%s", LocalFilePrefix, torrentPath) return nil @@ -178,7 +178,7 @@ func (self *SImageSubformat) SaveTorrent() error { log.Errorf("fileutils2.Md5 fail %s", err) return err } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.TorrentStatus = IMAGE_STATUS_ACTIVE self.TorrentLocation = fmt.Sprintf("%s%s", LocalFilePrefix, torrentPath) self.TorrentChecksum = checksum @@ -281,7 +281,7 @@ func (self *SImageSubformat) isTorrentActive() bool { } func (self *SImageSubformat) setStatus(status string) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.Status = status return nil }) @@ -289,7 +289,7 @@ func (self *SImageSubformat) setStatus(status string) error { } func (self *SImageSubformat) setTorrentStatus(status string) error { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.TorrentStatus = status return nil }) @@ -306,7 +306,7 @@ func (self *SImageSubformat) checkStatus(useFast bool) { if err != nil { log.Errorf("checkStatus fileutils2.FastChecksum fail %s", err) } else { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.FastHash = fastHash return nil }) diff --git a/pkg/image/models/images.go b/pkg/image/models/images.go index 80f695d656..b5f81c4126 100644 --- a/pkg/image/models/images.go +++ b/pkg/image/models/images.go @@ -144,7 +144,7 @@ func (manager *SImageManager) InitializeData() error { } for i := 0; i < len(images); i += 1 { if len(images[i].ProjectId) == 0 { - manager.TableSpec().Update(&images[i], func() error { + db.Update(&images[i], func() error { images[i].ProjectId = images[i].Owner return nil }) @@ -407,7 +407,7 @@ func (self *SImage) SaveImageFromStream(reader io.Reader) error { return err } - self.GetModelManager().TableSpec().Update(self, func() error { + db.Update(self, func() error { self.Size = sp.Size self.Checksum = sp.CheckSum self.FastHash = fastChksum @@ -663,7 +663,7 @@ func (self *SImage) DoPendingDelete(ctx context.Context, userCred mcclient.Token if err != nil { return err } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.Status = IMAGE_STATUS_PENDING_DELETE return nil }) @@ -675,7 +675,7 @@ func (self *SImage) DoCancelPendingDelete(ctx context.Context, userCred mcclient if err != nil { return err } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.Status = IMAGE_STATUS_ACTIVE return nil }) @@ -829,7 +829,7 @@ func (self *SImage) MigrateSubImage() error { if err != nil { return err } - _, err = self.GetModelManager().TableSpec().Update(self, func() error { + _, err = db.Update(self, func() error { self.Location = fmt.Sprintf("%s%s", LocalFilePrefix, newLocalpath) return nil }) @@ -1017,7 +1017,7 @@ func (self *SImage) DoCheckStatus(ctx context.Context, userCred mcclient.TokenCr if err != nil { log.Errorf("DoCheckStatus fileutils2.FastChecksum fail %s", err) } else { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.FastHash = fastHash return nil }) @@ -1070,7 +1070,7 @@ func (self *SImage) PerformMarkPublicProtected( isPublic := jsonutils.QueryBoolean(data, "is-public", false) protected := jsonutils.QueryBoolean(data, "protected", false) if isPublic != self.IsPublic || (self.Protected == nil && protected) || (self.Protected != nil && *self.Protected != protected) { - _, err := self.GetModelManager().TableSpec().Update(self, func() error { + _, err := db.Update(self, func() error { self.IsPublic = isPublic self.Protected = &protected return nil diff --git a/pkg/mcclient/token2.go b/pkg/mcclient/token2.go index f64d045014..d5188353ad 100644 --- a/pkg/mcclient/token2.go +++ b/pkg/mcclient/token2.go @@ -190,14 +190,15 @@ func (catalog KeystoneServiceCatalogV2) getRegions() []string { func (catalog KeystoneServiceCatalogV2) getServiceEndpoint(service, region, zone string) (KeystoneEndpointV2, error) { var selected KeystoneEndpointV2 + var findService bool for i := 0; i < len(catalog); i++ { if service == catalog[i].Type { + findService = true + if len(catalog[i].Endpoints) == 0 { + continue + } if len(region) == 0 { - if len(catalog[i].Endpoints) >= 1 { - selected = catalog[i].Endpoints[0] - } else { - return selected, fmt.Errorf("No default region") - } + selected = catalog[i].Endpoints[0] } else { regionEps := make([]KeystoneEndpointV2, 0) zoneEps := make([]KeystoneEndpointV2, 0) @@ -222,7 +223,11 @@ func (catalog KeystoneServiceCatalogV2) getServiceEndpoint(service, region, zone return selected, nil } } - return selected, fmt.Errorf("No such service %s", service) + if findService { + return selected, fmt.Errorf("No default region") + } else { + return selected, fmt.Errorf("No such service %s", service) + } } func (catalog KeystoneServiceCatalogV2) GetServiceURL(service, region, zone, endpointType string) (string, error) { diff --git a/pkg/mcclient/token3.go b/pkg/mcclient/token3.go index da9b4e0bae..c7d063fede 100644 --- a/pkg/mcclient/token3.go +++ b/pkg/mcclient/token3.go @@ -271,6 +271,9 @@ func (catalog KeystoneServiceCatalogV3) GetServiceURLs(service, region, zone, en } for i := 0; i < len(catalog); i++ { if service == catalog[i].Type { + if len(catalog[i].Endpoints) == 0 { + continue + } var selected []string regeps := make(map[string][]string) regionzone := "" diff --git a/pkg/util/huawei/image.go b/pkg/util/huawei/image.go index 0c1b725bec..66448b654c 100644 --- a/pkg/util/huawei/image.go +++ b/pkg/util/huawei/image.go @@ -126,7 +126,7 @@ func (self *SImage) GetImageType() string { } func (self *SImage) GetSize() int64 { - return int64(self.ImageSize) * 1024 * 1024 * 1024 + return int64(self.MinDisk) * 1024 * 1024 * 1024 } func (self *SImage) GetOsType() string { diff --git a/pkg/util/logclient/logclient.go b/pkg/util/logclient/logclient.go index df3852e7a6..0bfdb446ef 100644 --- a/pkg/util/logclient/logclient.go +++ b/pkg/util/logclient/logclient.go @@ -75,6 +75,8 @@ const ( ACT_RECYCLE_PREPAID = "池化预付费主机" ACT_UNDO_RECYCLE_PREPAID = "取消池化预付费主机" + + ACT_FETCH = "下载密钥" ) // golang 不支持 const 的string array, http://t.cn/EzAvbw8 diff --git a/pkg/yunionconf/models/parameters.go b/pkg/yunionconf/models/parameters.go index 6b7a1ed3c4..ff9d480f2f 100644 --- a/pkg/yunionconf/models/parameters.go +++ b/pkg/yunionconf/models/parameters.go @@ -201,7 +201,7 @@ func (model *SParameter) CustomizeDelete(ctx context.Context, userCred mcclient. } func (model *SParameter) Delete(ctx context.Context, userCred mcclient.TokenCredential) error { - _, err := model.GetModelManager().TableSpec().Update(model, func() error { + _, err := db.Update(model, func() error { model.Deleted = true model.DeletedAt = timeutils.UtcNow() return nil