From 14f0342b3618dc01b368db36bf67751851ee17b5 Mon Sep 17 00:00:00 2001 From: zhaoxiangchun <1422928955@qq.com> Date: Fri, 2 Apr 2021 15:40:58 +0800 Subject: [PATCH] fix(host): update host metric tags when server or host changeowner --- pkg/compute/hostdrivers/base.go | 4 ++++ pkg/compute/hostdrivers/kvm.go | 24 +++++++++++++++++++ pkg/compute/models/guest_actions.go | 15 +++++++++--- pkg/compute/models/hostdrivers.go | 1 + pkg/compute/models/hosts.go | 16 ++++++++++++- pkg/compute/tasks/host_sync_task.go | 29 +++++++++++++++++++++++ pkg/hostman/hosthandler/handler.go | 36 +++++++++++++++++++++++++++++ pkg/hostman/hostinfo/hostinfo.go | 19 +++++++++++++++ 8 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 pkg/compute/tasks/host_sync_task.go diff --git a/pkg/compute/hostdrivers/base.go b/pkg/compute/hostdrivers/base.go index 1e6f032e00..c2b2c7c392 100644 --- a/pkg/compute/hostdrivers/base.go +++ b/pkg/compute/hostdrivers/base.go @@ -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 +} diff --git a/pkg/compute/hostdrivers/kvm.go b/pkg/compute/hostdrivers/kvm.go index f4f2f9d534..550a26a494 100644 --- a/pkg/compute/hostdrivers/kvm.go +++ b/pkg/compute/hostdrivers/kvm.go @@ -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 +} diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index f4cb60a2a4..59341dae0c 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -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 { diff --git a/pkg/compute/models/hostdrivers.go b/pkg/compute/models/hostdrivers.go index 4888ac441e..208b64644a 100644 --- a/pkg/compute/models/hostdrivers.go +++ b/pkg/compute/models/hostdrivers.go @@ -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 diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index fd2241dfb5..670f847aa8 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -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() diff --git a/pkg/compute/tasks/host_sync_task.go b/pkg/compute/tasks/host_sync_task.go new file mode 100644 index 0000000000..72b09cc150 --- /dev/null +++ b/pkg/compute/tasks/host_sync_task.go @@ -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) + } +} diff --git a/pkg/hostman/hosthandler/handler.go b/pkg/hostman/hosthandler/handler.go index cac8e05315..6ddae50ef5 100644 --- a/pkg/hostman/hosthandler/handler.go +++ b/pkg/hostman/hosthandler/handler.go @@ -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//%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[""] + 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) +} diff --git a/pkg/hostman/hostinfo/hostinfo.go b/pkg/hostman/hostinfo/hostinfo.go index eb79c094ca..37ddde2e4d 100644 --- a/pkg/hostman/hostinfo/hostinfo.go +++ b/pkg/hostman/hostinfo/hostinfo.go @@ -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)