diff --git a/pkg/baremetal/manager.go b/pkg/baremetal/manager.go index 8bb81b3670..bce876d86c 100644 --- a/pkg/baremetal/manager.go +++ b/pkg/baremetal/manager.go @@ -867,7 +867,7 @@ func (b *SBaremetalInstance) ServerLoadDesc(ctx context.Context) error { } } -func PowerStatusToBaremetalStatus(status string) string { +func PowerStatusToBaremetalStatus(status types.PowerStatus) string { switch status { case types.POWER_STATUS_ON: return baremetalstatus.RUNNING @@ -877,7 +877,7 @@ func PowerStatusToBaremetalStatus(status string) string { return baremetalstatus.UNKNOWN } -func PowerStatusToServerStatus(bm *SBaremetalInstance, status string) string { +func PowerStatusToServerStatus(bm *SBaremetalInstance, status types.PowerStatus) string { switch status { case types.POWER_STATUS_ON: if conf, _ := bm.GetSSHConfig(); conf == nil { @@ -931,7 +931,7 @@ func (b *SBaremetalInstance) DelayedSyncStatus(ctx context.Context, data jsonuti return nil, nil } -func (b *SBaremetalInstance) SyncAllStatus(ctx context.Context, status string) { +func (b *SBaremetalInstance) SyncAllStatus(ctx context.Context, status types.PowerStatus) { var err error if status == "" { status, err = b.GetPowerStatus() @@ -939,24 +939,26 @@ func (b *SBaremetalInstance) SyncAllStatus(ctx context.Context, status string) { log.Errorf("Get power status error: %v", err) } } - b.SyncStatus(ctx, PowerStatusToBaremetalStatus(status), "") - b.SyncServerStatus(PowerStatusToServerStatus(b, status)) + b.SyncStatus(ctx, PowerStatusToBaremetalStatus(status), "SyncAllStatus by baremetal-agent") + b.SyncServerStatus(status) } -func (b *SBaremetalInstance) SyncServerStatus(status string) { +func (b *SBaremetalInstance) SyncServerStatus(powerStatus types.PowerStatus) { if b.GetServerId() == "" { return } - if status == "" { + status := PowerStatusToServerStatus(b, powerStatus) + if powerStatus == "" { powerStatus, err := b.GetPowerStatus() if err != nil { log.Errorf("Get power status error: %v", err) } status = PowerStatusToServerStatus(b, powerStatus) } - params := jsonutils.NewDict() - params.Add(jsonutils.NewString(status), "status") - _, err := modules.Servers.PerformAction(b.GetClientSession(), b.GetServerId(), "status", params) + params := &api.ServerPerformStatusInput{} + params.Status = status + params.PowerStates = string(powerStatus) + _, err := modules.Servers.PerformAction(b.GetClientSession(), b.GetServerId(), "status", jsonutils.Marshal(params)) if err != nil { log.Errorf("Update server %s status %s error: %v", b.GetServerName(), status, err) return @@ -1913,7 +1915,7 @@ func (b *SBaremetalInstance) DoDiskBoot() error { } */ -func (b *SBaremetalInstance) GetPowerStatus() (string, error) { +func (b *SBaremetalInstance) GetPowerStatus() (types.PowerStatus, error) { status, err := b.getPowerStatus() if err != nil { if errors.Cause(err) != types.ErrIPMIToolNull { @@ -1925,7 +1927,7 @@ func (b *SBaremetalInstance) GetPowerStatus() (string, error) { return status, nil } -func (b *SBaremetalInstance) getPowerStatus() (string, error) { +func (b *SBaremetalInstance) getPowerStatus() (types.PowerStatus, error) { ipmiCli := b.GetIPMITool() if ipmiCli == nil { if cli, err := b.GetHostSSHClient(); err == nil { @@ -1943,7 +1945,11 @@ func (b *SBaremetalInstance) getPowerStatus() (string, error) { } return "", errors.Wrapf(types.ErrIPMIToolNull, "Baremetal %s", b.GetId()) } - return ipmitool.GetChassisPowerStatus(ipmiCli) + cps, err := ipmitool.GetChassisPowerStatus(ipmiCli) + if err != nil { + return "", errors.Wrap(err, "ipmitool.GetChassisPowerStatus") + } + return types.PowerStatus(cps), nil } func (b *SBaremetalInstance) DoPowerShutdown(soft bool) error { diff --git a/pkg/baremetal/tasks/interface.go b/pkg/baremetal/tasks/interface.go index 4849511290..b571e6b138 100644 --- a/pkg/baremetal/tasks/interface.go +++ b/pkg/baremetal/tasks/interface.go @@ -50,10 +50,10 @@ type IBaremetal interface { SyncStatus(ctx context.Context, status, reason string) AutoSyncStatus(ctx context.Context) - SyncAllStatus(ctx context.Context, status string) + SyncAllStatus(ctx context.Context, status types.PowerStatus) AutoSyncAllStatus(ctx context.Context) - GetPowerStatus() (string, error) + GetPowerStatus() (types.PowerStatus, error) DoPowerShutdown(soft bool) error DoPXEBoot() error // DoDiskBoot() error diff --git a/pkg/baremetal/tasks/resetbmc.go b/pkg/baremetal/tasks/resetbmc.go index e059c64768..6bdd48f60d 100644 --- a/pkg/baremetal/tasks/resetbmc.go +++ b/pkg/baremetal/tasks/resetbmc.go @@ -71,7 +71,7 @@ func (self *SBaremetalResetBMCTask) WaitForBMCReady(ctx context.Context, args in if err != nil { return err } - if status != "" && status == types.POWER_STATUS_ON { + if status != "" && status == string(types.POWER_STATUS_ON) { ExecuteTask(self, nil) } return nil diff --git a/pkg/baremetal/utils/ipmitool/ipmitool.go b/pkg/baremetal/utils/ipmitool/ipmitool.go index 8d1cc3124f..f5184457aa 100644 --- a/pkg/baremetal/utils/ipmitool/ipmitool.go +++ b/pkg/baremetal/utils/ipmitool/ipmitool.go @@ -520,7 +520,7 @@ func DoReboot(exector IPMIExecutor) error { } isValidStatus := func(s string) bool { - return utils.IsInStringArray(s, []string{types.POWER_STATUS_ON, types.POWER_STATUS_OFF}) + return utils.IsInStringArray(s, []string{string(types.POWER_STATUS_ON), string(types.POWER_STATUS_OFF)}) } for tried := 0; !isValidStatus(status) && tried <= maxTries; tried++ { @@ -536,7 +536,7 @@ func DoReboot(exector IPMIExecutor) error { } // do shutdown - if status == types.POWER_STATUS_ON { + if status == string(types.POWER_STATUS_ON) { if err := DoHardShutdown(exector); err != nil { log.Errorf("DoHardShutdown: %v", err) } @@ -546,7 +546,7 @@ func DoReboot(exector IPMIExecutor) error { if err != nil { log.Errorf("DoReboot %d tries to get power status: %v", tried, err) } - if status == types.POWER_STATUS_OFF { + if status == string(types.POWER_STATUS_OFF) { break } time.Sleep(10 * time.Second) @@ -555,7 +555,7 @@ func DoReboot(exector IPMIExecutor) error { // do power on status, _ = GetChassisPowerStatus(exector) - for tried := 0; status != types.POWER_STATUS_ON && tried < maxTries; tried++ { + for tried := 0; status != string(types.POWER_STATUS_ON) && tried < maxTries; tried++ { if err := DoPowerOn(exector); err != nil { log.Errorf("DoReboot %d tries to power on: %v", tried, err) } @@ -570,7 +570,7 @@ func DoReboot(exector IPMIExecutor) error { if err != nil { return errors.Wrap(err, "Get power status after power on") } - if status != types.POWER_STATUS_ON { + if status != string(types.POWER_STATUS_ON) { return errors.Errorf("do reboot fail to poweron, current status: %s", status) } return nil diff --git a/pkg/cloudcommon/types/ipmi.go b/pkg/cloudcommon/types/ipmi.go index cb57fe31ca..f9d0366d5b 100644 --- a/pkg/cloudcommon/types/ipmi.go +++ b/pkg/cloudcommon/types/ipmi.go @@ -16,9 +16,11 @@ package types import "yunion.io/x/jsonutils" +type PowerStatus string + const ( - POWER_STATUS_ON = "on" - POWER_STATUS_OFF = "off" + POWER_STATUS_ON PowerStatus = "on" + POWER_STATUS_OFF PowerStatus = "off" ) type SIPMIInfo struct { diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index e38f328eba..2cf2990755 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -3601,11 +3601,11 @@ func (self *SGuest) isNotRunningStatus(status string) bool { func (self *SGuest) SetStatus(ctx context.Context, userCred mcclient.TokenCredential, status, reason string) error { if status == api.VM_RUNNING { if err := self.SetPowerStates(api.VM_POWER_STATES_ON); err != nil { - return err + return errors.Wrap(err, "input status is running") } } else if status == api.VM_READY { if err := self.SetPowerStates(api.VM_POWER_STATES_OFF); err != nil { - return err + return errors.Wrap(err, "input status is ready") } } @@ -3624,7 +3624,7 @@ func (self *SGuest) SetPowerStates(powerStates string) error { self.PowerStates = powerStates return nil }) - return errors.Wrap(err, "Update power states") + return errors.Wrapf(err, "Update power states to %s", powerStates) } func (self *SGuest) SetBackupGuestStatus(userCred mcclient.TokenCredential, status string, reason string) error { diff --git a/pkg/compute/tasks/guest/baremetal_server_start_task.go b/pkg/compute/tasks/guest/baremetal_server_start_task.go index d4f160cccf..ede02c06cd 100644 --- a/pkg/compute/tasks/guest/baremetal_server_start_task.go +++ b/pkg/compute/tasks/guest/baremetal_server_start_task.go @@ -58,7 +58,7 @@ func (self *BaremetalServerStartTask) OnInit(ctx context.Context, obj db.IStanda } func (self *BaremetalServerStartTask) OnStartComplete(ctx context.Context, guest *models.SGuest, body jsonutils.JSONObject) { - guest.SetStatus(ctx, self.UserCred, api.VM_RUNNING, "") + guest.SetStatus(ctx, self.UserCred, api.VM_RUNNING, "BaremetalServerStartTask.OnStartComplete") baremetal, _ := guest.GetHost() baremetal.SetStatus(ctx, self.UserCred, api.BAREMETAL_RUNNING, "") db.OpsLog.LogEvent(guest, db.ACT_START, guest.GetShortDesc(ctx), self.UserCred) diff --git a/pkg/util/redfish/redfish.go b/pkg/util/redfish/redfish.go index 26395e8126..d362a18e72 100644 --- a/pkg/util/redfish/redfish.go +++ b/pkg/util/redfish/redfish.go @@ -390,10 +390,10 @@ func (r *SBaseRedfishClient) GetSystemInfo(ctx context.Context) (string, SSystem sysInfo.Model = strings.TrimSpace(sysInfo.Model) sysInfo.Manufacturer = strings.TrimSpace(sysInfo.Manufacturer) - if strings.EqualFold(sysInfo.PowerState, types.POWER_STATUS_ON) { - sysInfo.PowerState = types.POWER_STATUS_ON + if strings.EqualFold(sysInfo.PowerState, string(types.POWER_STATUS_ON)) { + sysInfo.PowerState = string(types.POWER_STATUS_ON) } else { - sysInfo.PowerState = types.POWER_STATUS_OFF + sysInfo.PowerState = string(types.POWER_STATUS_OFF) } memGBStr, _ := resp.GetString("MemorySummary", "TotalSystemMemoryGiB")