Files
cloudpods/pkg/baremetal/tasks/basedeploy.go

111 lines
3.0 KiB
Go

// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package tasks
import (
"context"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/pkg/errors"
"yunion.io/x/pkg/utils"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/util/ssh"
)
type IServerBaseDeployTask interface {
IPXEBootTask
DoDeploys(term *ssh.Client) (jsonutils.JSONObject, error)
PostDeploys(term *ssh.Client) error
}
type SBaremetalServerBaseDeployTask struct {
SBaremetalPXEBootTaskBase
}
func newBaremetalServerBaseDeployTask(
userCred mcclient.TokenCredential,
baremetal IBaremetal,
taskId string,
data jsonutils.JSONObject,
) SBaremetalServerBaseDeployTask {
task := SBaremetalServerBaseDeployTask{
SBaremetalPXEBootTaskBase: newBaremetalPXEBootTaskBase(userCred, baremetal, taskId, data),
}
// any inheritance must call:
// task.SetStage(task.InitPXEBootTask)
return task
}
func (self *SBaremetalServerBaseDeployTask) IServerBaseDeployTask() IServerBaseDeployTask {
return self.GetVirtualObject().(IServerBaseDeployTask)
}
func (self *SBaremetalServerBaseDeployTask) GetName() string {
return "BaremetalServerBaseDeployTask"
}
func (self *SBaremetalServerBaseDeployTask) GetFinishAction() string {
if self.data != nil {
action, _ := self.data.GetString("on_finish")
return action
}
return ""
}
func (self *SBaremetalServerBaseDeployTask) DoDeploys(_ *ssh.Client) (jsonutils.JSONObject, error) {
return nil, nil
}
func (self *SBaremetalServerBaseDeployTask) PostDeploys(_ *ssh.Client) error {
return nil
}
func (self *SBaremetalServerBaseDeployTask) OnPXEBoot(ctx context.Context, term *ssh.Client, args interface{}) error {
log.Infof("%s called on stage pxeboot, args: %v", self.GetName(), args)
result, err := self.IServerBaseDeployTask().DoDeploys(term)
if err != nil {
return errors.Wrap(err, "Do deploy")
}
_, err = term.Run(
"/bin/sync",
"/sbin/sysctl -w vm.drop_caches=3",
)
if err != nil {
return errors.Wrap(err, "Sync disk")
}
if err := self.IServerBaseDeployTask().PostDeploys(term); err != nil {
return errors.Wrap(err, "post deploy")
}
onFinishAction := self.GetFinishAction()
if utils.IsInStringArray(onFinishAction, []string{"restart", "shutdown"}) {
err = self.EnsurePowerShutdown(false)
if err != nil {
return errors.Wrap(err, "Ensure power off")
}
if onFinishAction == "restart" {
err = self.EnsurePowerUp()
if err != nil {
return errors.Wrap(err, "Ensure power up")
}
}
}
self.Baremetal.AutoSyncAllStatus()
SetTaskComplete(self, result)
return nil
}