Skip to content

Commit

Permalink
fix(region,host): rescue mode update initramfs, vnc login no passwd (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
wanyaoqi authored Feb 10, 2024
1 parent c36ba88 commit 710d5ac
Show file tree
Hide file tree
Showing 13 changed files with 41 additions and 327 deletions.
2 changes: 1 addition & 1 deletion build/docker/Dockerfile.host-deployer
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM registry.cn-beijing.aliyuncs.com/yunionio/host-deployer-base:1.4.4
FROM registry.cn-beijing.aliyuncs.com/yunionio/host-deployer-base:1.4.6

MAINTAINER "Yaoqi Wan [email protected]"

Expand Down
11 changes: 2 additions & 9 deletions pkg/apis/compute/guest_rescue.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,6 @@ package compute

// Rescue constants are used for rescue mode
const (
GUEST_RESCUE_RELATIVE_PATH = "rescue" // serverxxx/rescue

GUEST_RESCUE_INITRAMFS = "initramfs"
GUEST_RESCUE_KERNEL = "kernel"
GUEST_RESCUE_INITRAMFS_ARM64 = "initramfs_aarch64"
GUEST_RESCUE_KERNEL_ARM64 = "kernel_aarch64"

GUEST_RESCUE_SYS_DISK_NAME = "sys_img"
GUEST_RESCUE_SYS_DISK_SIZE = 500 // MB
GUEST_RESCUE_INITRAMFS = "initramfs"
GUEST_RESCUE_KERNEL = "kernel"
)
4 changes: 0 additions & 4 deletions pkg/compute/guestdrivers/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -557,10 +557,6 @@ func (self *SBaseGuestDriver) RequestStartRescue(ctx context.Context, task taskm
return httperrors.ErrNotImplemented
}

func (self *SBaseGuestDriver) RequestStopRescue(ctx context.Context, task taskman.ITask, body jsonutils.JSONObject, host *models.SHost, guest *models.SGuest) error {
return httperrors.ErrNotImplemented
}

func (base *SBaseGuestDriver) ValidateGuestChangeConfigInput(ctx context.Context, guest *models.SGuest, input api.ServerChangeConfigInput) (*api.ServerChangeConfigSettings, error) {
confs := api.ServerChangeConfigSettings{}

Expand Down
12 changes: 0 additions & 12 deletions pkg/compute/guestdrivers/kvm.go
Original file line number Diff line number Diff line change
Expand Up @@ -1195,18 +1195,6 @@ func (self *SKVMGuestDriver) RequestStartRescue(ctx context.Context, task taskma
return nil
}

func (self *SKVMGuestDriver) RequestStopRescue(ctx context.Context, task taskman.ITask, body jsonutils.JSONObject, host *models.SHost, guest *models.SGuest) error {
header := self.getTaskRequestHeader(task)
client := httputils.GetDefaultClient()
url := fmt.Sprintf("%s/servers/%s/stop-rescue", host.ManagerUri, guest.Id)
_, _, err := httputils.JSONRequest(client, ctx, "POST", url, header, body, false)
if err != nil {
return err
}

return nil
}

func (self *SKVMGuestDriver) ValidateSyncOSInfo(ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest) error {
if !utils.IsInStringArray(guest.Status, []string{api.VM_RUNNING, api.VM_READY}) {
return httperrors.NewBadRequestError("can't sync guest os info in status %s", guest.Status)
Expand Down
25 changes: 5 additions & 20 deletions pkg/compute/models/guest_rescue.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,31 +30,16 @@ import (

func (self *SGuest) PerformStartRescue(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject,
data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if !utils.IsInStringArray(self.Status, []string{api.VM_READY, api.VM_RUNNING}) {
return nil, httperrors.NewInvalidStatusError("guest status must be ready or running")
if self.Hypervisor != api.HYPERVISOR_KVM {
return nil, httperrors.NewBadRequestError("Cannot rescue guest hypervisor %s", self.Hypervisor)
}

// Check vmem size, need to be greater than 2G
if self.VmemSize < 2048 {
return nil, httperrors.NewInvalidStatusError("vmem size must be greater than 2G")
}

// Get baremetal agent
host, err := self.GetHost()
if err != nil {
return nil, httperrors.NewInvalidStatusError("guest.GetHost: %s", err.Error())
}
bmAgent := BaremetalagentManager.GetAgent(api.AgentTypeBaremetal, host.ZoneId)
if bmAgent == nil {
return nil, httperrors.NewInvalidStatusError("BaremetalagentManager.GetAgent: %s", "Baremetal agent not found")
if !utils.IsInStringArray(self.Status, []string{api.VM_READY, api.VM_RUNNING}) {
return nil, httperrors.NewInvalidStatusError("guest status must be ready or running")
}

// Set available baremetal agent managerURi to data
dataDict := data.(*jsonutils.JSONDict)
dataDict.Add(jsonutils.NewString(bmAgent.ManagerUri), "manager_uri")

// Start rescue vm task
err = self.StartRescueTask(ctx, userCred, dataDict, "")
err := self.StartRescueTask(ctx, userCred, jsonutils.NewDict(), "")
if err != nil {
return nil, httperrors.NewInvalidStatusError("guest.StartGuestRescueTask: %s", err.Error())
}
Expand Down
1 change: 0 additions & 1 deletion pkg/compute/models/guestdrivers.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,6 @@ type IGuestDriver interface {
ValidateSetOSInfo(ctx context.Context, userCred mcclient.TokenCredential, guest *SGuest, input *api.ServerSetOSInfoInput) error
ValidateSyncOSInfo(ctx context.Context, userCred mcclient.TokenCredential, guest *SGuest) error
RequestStartRescue(ctx context.Context, task taskman.ITask, body jsonutils.JSONObject, host *SHost, guest *SGuest) error
RequestStopRescue(ctx context.Context, task taskman.ITask, body jsonutils.JSONObject, host *SHost, guest *SGuest) error
}

var guestDrivers map[string]IGuestDriver
Expand Down
18 changes: 7 additions & 11 deletions pkg/compute/tasks/guest_rescue_task.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,14 @@ func (self *StartRescueTask) OnServerStopCompleteFailed(ctx context.Context, gue
func (self *StartRescueTask) PrepareRescue(ctx context.Context, guest *models.SGuest) {
db.OpsLog.LogEvent(guest, db.ACT_START_RESCUE, nil, self.UserCred)
guest.SetStatus(ctx, self.UserCred, api.VM_START_RESCUE, "PrepareRescue")
self.SetStage("OnRescuePrepareComplete", nil)

host, _ := guest.GetHost()
err := guest.GetDriver().RequestStartRescue(ctx, self, self.GetParams(), host, guest)
err := guest.GetDriver().RequestStartRescue(ctx, self, jsonutils.NewDict(), host, guest)
if err != nil {
self.OnRescuePrepareCompleteFailed(ctx, guest, jsonutils.NewString(err.Error()))
return
}
self.OnRescuePrepareComplete(ctx, guest, nil)
}

func (self *StartRescueTask) OnRescuePrepareComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
Expand Down Expand Up @@ -166,20 +166,16 @@ func (self *StopRescueTask) OnServerStopCompleteFailed(ctx context.Context, gues
func (self *StopRescueTask) ClearRescue(ctx context.Context, guest *models.SGuest) {
db.OpsLog.LogEvent(guest, db.ACT_STOP_RESCUE, nil, self.UserCred)
guest.SetStatus(ctx, self.UserCred, api.VM_STOP_RESCUE, "ClearRescue")
self.SetStage("OnRescueClearComplete", nil)

host, _ := guest.GetHost()
err := guest.GetDriver().RequestStopRescue(ctx, self, nil, host, guest)
if err != nil {
self.OnRescueClearCompleteFailed(ctx, guest, jsonutils.NewString(err.Error()))
return
}
self.OnRescueClearComplete(ctx, guest, nil)
}

func (self *StopRescueTask) OnRescueClearComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
db.OpsLog.LogEvent(guest, db.ACT_STOP_RESCUE, guest.GetShortDesc(ctx), self.UserCred)
logclient.AddActionLogWithStartable(self, guest, logclient.ACT_VM_STOP_RESCUE, guest.GetShortDesc(ctx), self.UserCred, true)
guest.UpdateRescueMode(false)
if err := guest.UpdateRescueMode(false); err != nil {
self.OnRescueClearCompleteFailed(ctx, guest, jsonutils.NewString(err.Error()))
return
}
self.RescueStartServer(ctx, guest)
}

Expand Down
10 changes: 1 addition & 9 deletions pkg/hostman/guestman/guesthandlers/guesthandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ func AddGuestTaskHandler(prefix string, app *appsrv.Application) {
"qga-set-network": qgaSetNetwork,
"qga-get-os-info": qgaGetOsInfo,
"start-rescue": guestStartRescue,
"stop-rescue": guestStopRescue,
} {
app.AddHandler("POST",
fmt.Sprintf("%s/%s/<sid>/%s", prefix, keyWord, action),
Expand Down Expand Up @@ -950,14 +949,7 @@ func qgaGetOsInfo(ctx context.Context, userCred mcclient.TokenCredential, sid st
return gm.QgaGetOsInfo(sid)
}

// guestStartRescue prepare rescue files
// prepare rescue files
func guestStartRescue(ctx context.Context, userCred mcclient.TokenCredential, sid string, body jsonutils.JSONObject) (interface{}, error) {
// Start rescue guest
return guestman.GetGuestManager().GuestStartRescue(ctx, userCred, sid, body)
}

// guestStopRescue clear rescue files
func guestStopRescue(ctx context.Context, userCred mcclient.TokenCredential, sid string, body jsonutils.JSONObject) (interface{}, error) {
// Stop rescue guest
return guestman.GetGuestManager().GuestStopRescue(ctx, userCred, sid, body)
}
21 changes: 7 additions & 14 deletions pkg/hostman/guestman/guestman.go
Original file line number Diff line number Diff line change
Expand Up @@ -911,21 +911,14 @@ func (m *SGuestManager) GuestStop(ctx context.Context, sid string, timeout int64
}

func (m *SGuestManager) GuestStartRescue(ctx context.Context, userCred mcclient.TokenCredential, sid string, body jsonutils.JSONObject) (jsonutils.JSONObject, error) {
baremetalManagerUri, err := body.GetString("manager_uri")
if err != nil {
return nil, httperrors.NewInputParameterError("manager_uri required")
}
if guest, ok := m.GetServer(sid); ok {
guest.ExecStartRescueTask(ctx, baremetalManagerUri)
return nil, nil
} else {
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
}
}

func (m *SGuestManager) GuestStopRescue(ctx context.Context, userCred mcclient.TokenCredential, sid string, body jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if guest, ok := m.GetServer(sid); ok {
guest.ExecStopRescueTask(ctx, body)
// initrd and kernel should be prepared by host-deployer
if !fileutils2.Exists(guest.getRescueInitrdPath()) {
return nil, httperrors.NewInternalServerError("guest initrd not ready")
}
if !fileutils2.Exists(guest.getRescueKernelPath()) {
return nil, httperrors.NewInternalServerError("guest kernel not ready")
}
return nil, nil
} else {
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
Expand Down
48 changes: 0 additions & 48 deletions pkg/hostman/guestman/guesttasks.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,54 +102,6 @@ func (s *SGuestStopTask) CheckGuestRunningLater() {
s.checkGuestRunning()
}

// SGuestStartRescueTask Start a rescue vm
type SGuestStartRescueTask struct {
*SKVMGuestInstance
ctx context.Context
BaremetalManagerUri string
}

func NewGuestStartRescueTask(guest *SKVMGuestInstance, ctx context.Context, baremetalManagerUri string) *SGuestStartRescueTask {
return &SGuestStartRescueTask{
SKVMGuestInstance: guest,
ctx: ctx,
BaremetalManagerUri: baremetalManagerUri,
}
}

func (s *SGuestStartRescueTask) Start() {
if err := s.prepareRescue(s.ctx, s.BaremetalManagerUri); err != nil {
log.Errorf("prepareRescue fail %s", err)
hostutils.TaskFailed(s.ctx, err.Error())
return
}

hostutils.TaskComplete(s.ctx, nil)
}

// SGuestStopRescueTask Stop a rescue vm, clean rescue files
type SGuestStopRescueTask struct {
*SKVMGuestInstance
ctx context.Context
}

func NewGuestStopRescueTask(guest *SKVMGuestInstance, ctx context.Context) *SGuestStopRescueTask {
return &SGuestStopRescueTask{
SKVMGuestInstance: guest,
ctx: ctx,
}
}

func (s *SGuestStopRescueTask) Start() {
if err := s.clearRescue(s.ctx); err != nil {
log.Errorf("clearRescue fail %s", err)
hostutils.TaskFailed(s.ctx, err.Error())
return
}

hostutils.TaskComplete(s.ctx, nil)
}

type SGuestSuspendTask struct {
*SKVMGuestInstance
ctx context.Context
Expand Down
Loading

0 comments on commit 710d5ac

Please sign in to comment.