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:
Zexi Li
2021-04-08 18:13:05 +08:00
committed by GitHub
8 changed files with 140 additions and 4 deletions
+4
View File
@@ -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
}
+24
View File
@@ -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
}
+12 -3
View File
@@ -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 {
+1
View File
@@ -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
+15 -1
View File
@@ -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()
+29
View File
@@ -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)
}
}
+36
View File
@@ -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)
}
+19
View File
@@ -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)