fix(baremetal): power status of server is not synced (#23689)

This commit is contained in:
Zexi Li
2025-11-10 09:56:39 +08:00
committed by GitHub
parent aa394ead62
commit a34da1092c
8 changed files with 38 additions and 30 deletions
+19 -13
View File
@@ -826,7 +826,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
@@ -836,7 +836,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 {
@@ -890,7 +890,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()
@@ -898,24 +898,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 := &apis.PerformStatusInput{}
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
@@ -1863,7 +1865,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 {
@@ -1875,7 +1877,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 {
@@ -1893,7 +1895,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 {
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
+5 -5
View File
@@ -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
+4 -2
View File
@@ -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 {
+3 -3
View File
@@ -3190,11 +3190,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")
}
}
@@ -3213,7 +3213,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 {
@@ -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)
+3 -3
View File
@@ -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")