mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #10592 from zhaoxiangchun/fix/zxc-node-alert-vm
fix(host): update host metric tags when server or host changeowner
This commit is contained in:
@@ -256,3 +256,7 @@ func (driver *SBaseHostDriver) GetStoragecacheQuota(host *models.SHost) int {
|
||||
func (driver *SBaseHostDriver) RequestDeallocateBackupDiskOnHost(ctx context.Context, host *models.SHost, storage *models.SStorage, disk *models.SDisk, task taskman.ITask) error {
|
||||
return fmt.Errorf("Not Implement")
|
||||
}
|
||||
|
||||
func (driver *SBaseHostDriver) RequestSyncOnHost(ctx context.Context, host *models.SHost, task taskman.ITask) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ import (
|
||||
|
||||
api "yunion.io/x/onecloud/pkg/apis/compute"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/cmdline"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
|
||||
"yunion.io/x/onecloud/pkg/cloudprovider"
|
||||
"yunion.io/x/onecloud/pkg/compute/baremetal"
|
||||
@@ -588,3 +589,26 @@ func (self *SKVMHostDriver) tryCleanKubernetesData(host *models.SHost, hostname
|
||||
}
|
||||
return cli.Nodes().Delete(context.Background(), hostname, metav1.DeleteOptions{})
|
||||
}
|
||||
|
||||
func (self *SKVMHostDriver) RequestSyncOnHost(ctx context.Context, host *models.SHost, task taskman.ITask) error {
|
||||
log.Infof("Deallocating disk on host %s", host.GetName())
|
||||
header := mcclient.GetTokenHeaders(task.GetUserCred())
|
||||
url := fmt.Sprintf("/hosts/%s/sync", host.Id)
|
||||
body := jsonutils.NewDict()
|
||||
desc := self.GetJsonFromHost(ctx, host)
|
||||
body.Add(desc, "desc")
|
||||
_, err := host.Request(ctx, task.GetUserCred(), "POST", url, header, body)
|
||||
return err
|
||||
}
|
||||
|
||||
func (self *SKVMHostDriver) GetJsonFromHost(ctx context.Context, host *models.SHost) *jsonutils.JSONDict {
|
||||
desc := jsonutils.NewDict()
|
||||
desc.Add(jsonutils.NewString(host.Name), "name")
|
||||
// tenant
|
||||
domainFetcher, _ := db.DefaultDomainFetcher(ctx, host.DomainId)
|
||||
if domainFetcher != nil {
|
||||
desc.Add(jsonutils.NewString(domainFetcher.GetProjectDomainId()), "domain_id")
|
||||
desc.Add(jsonutils.NewString(domainFetcher.GetProjectDomain()), "project_domain")
|
||||
}
|
||||
return desc
|
||||
}
|
||||
|
||||
@@ -732,10 +732,11 @@ func (self *SGuest) PerformAttachdisk(ctx context.Context, userCred mcclient.Tok
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (self *SGuest) StartSyncTask(ctx context.Context, userCred mcclient.TokenCredential, fwOnly bool, parentTaskId string) error {
|
||||
func (self *SGuest) StartSyncTask(ctx context.Context, userCred mcclient.TokenCredential, firewallOnly bool,
|
||||
parentTaskId string) error {
|
||||
|
||||
data := jsonutils.NewDict()
|
||||
if fwOnly {
|
||||
if firewallOnly {
|
||||
data.Add(jsonutils.JSONTrue, "fw_only")
|
||||
} else if err := self.SetStatus(userCred, api.VM_SYNC_CONFIG, ""); err != nil {
|
||||
log.Errorln(err)
|
||||
@@ -4402,7 +4403,15 @@ func (guest *SGuest) PerformChangeOwner(ctx context.Context, userCred mcclient.T
|
||||
return nil, errors.Wrapf(err, "unable to change owner for instance snapshot %s", isps[i].GetId())
|
||||
}
|
||||
}
|
||||
return guest.SVirtualResourceBase.PerformChangeOwner(ctx, userCred, query, input)
|
||||
changOwner, err := guest.SVirtualResourceBase.PerformChangeOwner(ctx, userCred, query, input)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = guest.StartSyncTask(ctx, userCred, false, "")
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "PerformChangeOwner StartSyncTask err")
|
||||
}
|
||||
return changOwner, nil
|
||||
}
|
||||
|
||||
func (guest *SGuest) AllowPerformResizeDisk(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
|
||||
|
||||
@@ -62,6 +62,7 @@ type IHostDriver interface {
|
||||
ValidateAttachStorage(ctx context.Context, userCred mcclient.TokenCredential, host *SHost, storage *SStorage, data *jsonutils.JSONDict) error
|
||||
RequestAttachStorage(ctx context.Context, hoststorage *SHoststorage, host *SHost, storage *SStorage, task taskman.ITask) error
|
||||
RequestDetachStorage(ctx context.Context, host *SHost, storage *SStorage, task taskman.ITask) error
|
||||
RequestSyncOnHost(ctx context.Context, host *SHost, task taskman.ITask) error
|
||||
}
|
||||
|
||||
var hostDrivers map[string]IHostDriver
|
||||
|
||||
@@ -5732,10 +5732,24 @@ func (host *SHost) PerformChangeOwner(ctx context.Context, userCred mcclient.Tok
|
||||
return nil, errors.Wrap(err, "local storage change owner")
|
||||
}
|
||||
}
|
||||
|
||||
err = host.StartSyncTask(ctx, userCred, "")
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "PerformChangeOwner StartSyncTask err")
|
||||
}
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func (self *SHost) StartSyncTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error {
|
||||
if task, err := taskman.TaskManager.NewTask(ctx, "HostSyncTask", self, userCred, jsonutils.NewDict(), parentTaskId, "",
|
||||
nil); err != nil {
|
||||
log.Errorln(err)
|
||||
return err
|
||||
} else {
|
||||
task.ScheduleRun(nil)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (host *SHost) GetChangeOwnerRequiredDomainIds() []string {
|
||||
requires := stringutils2.SSortedStrings{}
|
||||
guests, _ := host.GetGuests()
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package tasks
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
|
||||
"yunion.io/x/onecloud/pkg/compute/models"
|
||||
)
|
||||
|
||||
type HostSyncTask struct {
|
||||
taskman.STask
|
||||
}
|
||||
|
||||
func init() {
|
||||
taskman.RegisterTask(HostSyncTask{})
|
||||
}
|
||||
|
||||
func (self *HostSyncTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
|
||||
host := obj.(*models.SHost)
|
||||
err := host.GetHostDriver().RequestSyncOnHost(ctx, host, self)
|
||||
if err != nil {
|
||||
self.SetStageFailed(ctx, jsonutils.NewString(err.Error()))
|
||||
log.Errorf("syncHost:%s err:%v", host.GetId(), err)
|
||||
}
|
||||
}
|
||||
@@ -19,12 +19,17 @@ import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/appsrv"
|
||||
"yunion.io/x/onecloud/pkg/hostman/host_health"
|
||||
"yunion.io/x/onecloud/pkg/hostman/hostinfo"
|
||||
"yunion.io/x/onecloud/pkg/hostman/hostutils"
|
||||
"yunion.io/x/onecloud/pkg/mcclient/auth"
|
||||
)
|
||||
|
||||
type actionFunc func(context.Context, string, jsonutils.JSONObject) (interface{}, error)
|
||||
|
||||
var (
|
||||
keyWords = []string{"hosts"}
|
||||
)
|
||||
@@ -33,6 +38,15 @@ func AddHostHandler(prefix string, app *appsrv.Application) {
|
||||
for _, keyword := range keyWords {
|
||||
app.AddHandler("POST", fmt.Sprintf("%s/%s/shutdown-servers-on-host-down", prefix, keyword),
|
||||
auth.Authenticate(setOnHostDown))
|
||||
|
||||
for action, f := range map[string]actionFunc{
|
||||
"sync": hostSync,
|
||||
} {
|
||||
app.AddHandler("POST",
|
||||
fmt.Sprintf("%s/%s/<sid>/%s", prefix, keyword, action),
|
||||
auth.Authenticate(hostActions(f)),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,3 +57,25 @@ func setOnHostDown(ctx context.Context, w http.ResponseWriter, r *http.Request)
|
||||
}
|
||||
hostutils.ResponseOk(ctx, w)
|
||||
}
|
||||
|
||||
func hostActions(f actionFunc) appsrv.FilterHandler {
|
||||
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
params, _, body := appsrv.FetchEnv(ctx, w, r)
|
||||
if body == nil {
|
||||
body = jsonutils.NewDict()
|
||||
}
|
||||
var sid = params["<sid>"]
|
||||
res, err := f(ctx, sid, body)
|
||||
if err != nil {
|
||||
hostutils.Response(ctx, w, err)
|
||||
} else if res != nil {
|
||||
hostutils.Response(ctx, w, res)
|
||||
} else {
|
||||
hostutils.ResponseOk(ctx, w)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func hostSync(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
return hostinfo.Instance().UpdateSyncInfo(sid, body)
|
||||
}
|
||||
|
||||
@@ -930,6 +930,25 @@ func (h *SHostInfo) getDomainInfo(hostId string) {
|
||||
h.Project_domain = strings.ReplaceAll(project_domain, " ", "+")
|
||||
}
|
||||
|
||||
func (h *SHostInfo) UpdateSyncInfo(hostId string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if h.GetHostId() != hostId {
|
||||
return nil, nil
|
||||
}
|
||||
descObj, err := body.Get("desc")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
domainId, _ := descObj.GetString("domain_id")
|
||||
projectDomain, _ := descObj.GetString("project_domain")
|
||||
if len(domainId) != 0 {
|
||||
h.Domain_id = domainId
|
||||
}
|
||||
if len(projectDomain) != 0 {
|
||||
h.Project_domain = strings.ReplaceAll(projectDomain, " ", "+")
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (h *SHostInfo) setHostname(name string) {
|
||||
h.FullName = name
|
||||
err := sysutils.SetHostname(name)
|
||||
|
||||
Reference in New Issue
Block a user