mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-10-29 17:58:36 +08:00
fix(baremetal): power status of server is not synced (#23689)
This commit is contained in:
+19
-13
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user