diff --git a/cmd/climc/climc.go b/cmd/climc/climc.go index bc9618729f..f373f391cf 100644 --- a/cmd/climc/climc.go +++ b/cmd/climc/climc.go @@ -23,14 +23,14 @@ import ( ) type BaseOptions struct { - Help bool `help:"Show help" short-token:"h"` - Debug bool `help:"Show debug information"` - Version bool `help:"Show version"` - Timeout int `default:"600" help:"Number of seconds to wait for a response"` - Insecure bool `default:"false" help:"Allow skip server cert verification if URL is https" short-token:"k"` - NoCachedToken bool `default:"$NO_CACHED_TOKEN|false" help:"Force not use cached token"` - OsUsername string `default:"$OS_USERNAME" help:"Username, defaults to env[OS_USERNAME]"` - OsPassword string `default:"$OS_PASSWORD" help:"Password, defaults to env[OS_PASSWORD]"` + Help bool `help:"Show help" short-token:"h"` + Debug bool `help:"Show debug information"` + Version bool `help:"Show version"` + Timeout int `default:"600" help:"Number of seconds to wait for a response"` + Insecure bool `default:"false" help:"Allow skip server cert verification if URL is https" short-token:"k"` + UseCachedToken bool `default:"$YUNION_USE_CACHED_TOKEN|false" help:"Use cached token"` + OsUsername string `default:"$OS_USERNAME" help:"Username, defaults to env[OS_USERNAME]"` + OsPassword string `default:"$OS_PASSWORD" help:"Password, defaults to env[OS_PASSWORD]"` // OsProjectId string `default:"$OS_PROJECT_ID" help:"Proejct ID, defaults to env[OS_PROJECT_ID]"` OsProjectName string `default:"$OS_PROJECT_NAME" help:"Project name, defaults to env[OS_PROJECT_NAME]"` OsDomainName string `default:"$OS_DOMAIN_NAME" help:"Domain name, defaults to env[OS_DOMAIN_NAME]"` @@ -130,23 +130,24 @@ func newClientSession(options *BaseOptions) (*mcclient.ClientSession, error) { authUrlAlter := strings.Replace(options.OsAuthURL, "/", "", -1) authUrlAlter = strings.Replace(authUrlAlter, ":", "", -1) tokenCachePath := filepath.Join(os.TempDir(), fmt.Sprintf("OS_AUTH_CACHE_TOKEN-%s-%s-%s-%s", authUrlAlter, options.OsUsername, options.OsDomainName, options.OsProjectName)) - cacheFile, err := os.Open(tokenCachePath) - - if err == nil && cacheFile != nil && !options.NoCachedToken { - fileInfo, _ := cacheFile.Stat() - dur, err := time.ParseDuration("-24h") - if fileInfo != nil && err == nil && fileInfo.ModTime().After(time.Now().Add(dur)) { - bytesToken, err := ioutil.ReadAll(cacheFile) - if err == nil { - token := client.NewAuthTokenCredential() - err := json.Unmarshal(bytesToken, token) - if err != nil { - fmt.Printf("Unmarshal token error:%s", err) - } else if token.IsValid() { - cacheToken = token + if options.UseCachedToken { + cacheFile, err := os.Open(tokenCachePath) + if err == nil && cacheFile != nil { + fileInfo, _ := cacheFile.Stat() + dur, err := time.ParseDuration("-24h") + if fileInfo != nil && err == nil && fileInfo.ModTime().After(time.Now().Add(dur)) { + bytesToken, err := ioutil.ReadAll(cacheFile) + if err == nil { + token := client.NewAuthTokenCredential() + err := json.Unmarshal(bytesToken, token) + if err != nil { + fmt.Printf("Unmarshal token error:%s", err) + } else if token.IsValid() { + cacheToken = token + } } + cacheFile.Close() } - cacheFile.Close() } } diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index e812746896..20958d8df5 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -74,9 +74,10 @@ const ( VM_MIGRATING = "migrating" VM_MIGRATE_FAILED = "migrate_failed" - VM_CHANGE_FLAVOR = "change_flavor" - VM_REBUILD_ROOT = "rebuild_root" - VM_REBUILD_ROOT_FAIL = "rebuild_root_fail" + VM_CHANGE_FLAVOR = "change_flavor" + VM_CHANGE_FLAVOR_FAIL = "change_flavor_fail" + VM_REBUILD_ROOT = "rebuild_root" + VM_REBUILD_ROOT_FAIL = "rebuild_root_fail" VM_START_SNAPSHOT = "snapshot_start" VM_SNAPSHOT = "snapshot" diff --git a/pkg/compute/tasks/guest_change_config_task.go b/pkg/compute/tasks/guest_change_config_task.go index 84b112e43c..a530ae70be 100644 --- a/pkg/compute/tasks/guest_change_config_task.go +++ b/pkg/compute/tasks/guest_change_config_task.go @@ -34,51 +34,51 @@ func (self *GuestChangeConfigTask) OnInit(ctx context.Context, obj db.IStandalon func (self *GuestChangeConfigTask) OnDisksResizeComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { iResizeDisks, err := self.Params.Get("resize") if iResizeDisks == nil || err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) return } resizeDisks := iResizeDisks.(*jsonutils.JSONArray) for i := 0; i < resizeDisks.Length(); i++ { iResizeSet, err := resizeDisks.GetAt(i) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(obj, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } resizeSet := iResizeSet.(*jsonutils.JSONArray) diskId, err := resizeSet.GetAt(0) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(obj, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } idStr, err := diskId.GetString() if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(obj, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } jSize, err := resizeSet.GetAt(1) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(obj, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } size, err := jSize.Int() if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(obj, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } iDisk, err := models.DiskManager.FetchById(idStr) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(obj, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } disk := iDisk.(*models.SDisk) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(disk, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } @@ -86,7 +86,7 @@ func (self *GuestChangeConfigTask) OnDisksResizeComplete(ctx context.Context, ob var pendingUsage models.SQuota err = self.GetPendingUsage(&pendingUsage) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(disk, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } @@ -120,7 +120,7 @@ func (self *GuestChangeConfigTask) OnCreateDisksComplete(ctx context.Context, ob if iVcpuCount != nil { vcpuCount, err = iVcpuCount.Int() if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(guest, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } @@ -128,14 +128,14 @@ func (self *GuestChangeConfigTask) OnCreateDisksComplete(ctx context.Context, ob if iVmemSize != nil { vmemSize, err = iVmemSize.Int() if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(guest, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } } err = guest.GetDriver().RequestChangeVmConfig(ctx, guest, self, vcpuCount, vmemSize) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(guest, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } @@ -162,14 +162,14 @@ func (self *GuestChangeConfigTask) OnCreateDisksComplete(ctx context.Context, ob return nil }) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(guest, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } var pendingUsage models.SQuota err = self.GetPendingUsage(&pendingUsage) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(guest, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } @@ -187,13 +187,13 @@ func (self *GuestChangeConfigTask) OnCreateDisksComplete(ctx context.Context, ob err = models.QuotaManager.CancelPendingUsage(ctx, self.UserCred, guest.ProjectId, &pendingUsage, &cancelUsage) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(guest, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } err = self.SetPendingUsage(&pendingUsage) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(guest, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } @@ -201,7 +201,7 @@ func (self *GuestChangeConfigTask) OnCreateDisksComplete(ctx context.Context, ob self.SetStage("on_sync_status_complete", nil) err = guest.StartSyncstatus(ctx, self.UserCred, self.GetTaskId()) if err != nil { - self.SetStageFailed(ctx, err.Error()) + self.markStageFailed(obj, ctx, err.Error()) logclient.AddActionLog(guest, logclient.ACT_VM_CHANGE_FLAVOR, err, self.UserCred, false) return } @@ -227,3 +227,9 @@ func (self *GuestChangeConfigTask) OnGuestStartComplete(ctx context.Context, obj dt.Add(jsonutils.NewString(guest.Id), "id") self.SetStageComplete(ctx, dt) } + +func (self *GuestChangeConfigTask) markStageFailed(obj db.IStandaloneModel, ctx context.Context, reason string) { + guest := obj.(*models.SGuest) + guest.SetStatus(self.UserCred, models.VM_CHANGE_FLAVOR_FAIL, reason) + self.SetStageFailed(ctx, reason) +} \ No newline at end of file