Merge pull request #12099 from zhaoxiangchun/automated-cherry-pick-of-#12097-upstream-release-3.7

Automated cherry pick of #12097: fix(monitor): monitor resource apiHelper fix
This commit is contained in:
Zexi Li
2021-09-02 18:30:28 +08:00
committed by GitHub
4 changed files with 71 additions and 0 deletions
+10
View File
@@ -15,6 +15,8 @@
package apihelper
import (
"yunion.io/x/jsonutils"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
mcclient "yunion.io/x/onecloud/pkg/mcclient"
mcclient_modulebase "yunion.io/x/onecloud/pkg/mcclient/modulebase"
@@ -44,6 +46,14 @@ type IModelSetEmulatedIncluder interface {
IncludeEmulated() bool
}
type IModelSetFilter interface {
ModelFilter() []string
}
type IModelListParam interface {
ModelParamFilter() jsonutils.JSONObject
}
func SyncModelSets(mssOld IModelSets, s *mcclient.ClientSession, opt *Options) (r ModelSetsUpdateResult, err error) {
mss := mssOld.ModelSetList()
mssNews := mssOld.NewEmpty()
+8
View File
@@ -120,6 +120,10 @@ func GetModels(opts *GetModelsOptions) error {
"cloud_env=onpremise",
)
}
if inter, ok := opts.ModelSet.(IModelSetFilter); ok {
filter := inter.ModelFilter()
listOptions.Filter = append(listOptions.Filter, filter...)
}
if !minUpdatedAt.Equal(PseudoZeroTime) {
// Only fetching pending deletes when we are doing incremental fetch
listOptions.PendingDeleteAll = options.Bool(true)
@@ -129,6 +133,10 @@ func GetModels(opts *GetModelsOptions) error {
if err != nil {
return fmt.Errorf("%s: making list params: %s", manKeyPlural, err)
}
if inter, ok := opts.ModelSet.(IModelListParam); ok {
filter := inter.ModelParamFilter()
params.Update(filter)
}
//XXX
//params.Set(api.LBAGENT_QUERY_ORIG_KEY, jsonutils.NewString(api.LBAGENT_QUERY_ORIG_VAL))
+12
View File
@@ -15,6 +15,8 @@
package models
import (
"yunion.io/x/jsonutils"
"yunion.io/x/onecloud/pkg/apihelper"
"yunion.io/x/onecloud/pkg/apis/monitor"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
@@ -130,6 +132,10 @@ func (s Servers) NeedSync() bool {
return true
}
func (s Servers) ModelFilter() []string {
return []string{"hypervisor.notin(baremetal,container)"}
}
func (h Hosts) AddModel(i db.IModel) {
resource := i.(*Host)
h[resource.Id] = resource
@@ -155,6 +161,12 @@ func (s Hosts) NeedSync() bool {
return true
}
func (s Hosts) ModelParamFilter() jsonutils.JSONObject {
param := jsonutils.NewDict()
param.Set("baremetal", jsonutils.NewBool(false))
return param
}
func (r Rds) ModelManager() modulebase.IBaseManager {
return &mcclient_modules.DBInstance
}
+41
View File
@@ -103,6 +103,41 @@ func (manager *SMonitorResourceManager) GetMonitorResources(input monitor.Monito
return monitorResources, nil
}
type SdeleteRes struct {
resType string
notIn []string
in []string
}
func (manager *SMonitorResourceManager) DeleteMonitorResources(ctx context.Context, userCred mcclient.TokenCredential, input SdeleteRes) error {
monitorResources := make([]SMonitorResource, 0)
errs := make([]error, 0)
query := manager.Query()
if len(input.notIn) != 0 {
query.NotIn("res_id", input.notIn)
}
if len(input.in) != 0 {
query.In("res_id", input.in)
}
if len(input.resType) != 0 {
query.Equals("res_type", input.resType)
}
err := db.FetchModelObjects(manager, query, &monitorResources)
if err != nil {
return errors.Wrap(err, "SMonitorResourceManager FetchModelObjects when DeleteMonitorResources err")
}
for _, res := range monitorResources {
err := (&res).RealDelete(ctx, userCred)
if err != nil {
errs = append(errs, errors.Wrapf(err, "delete monitorResource:%s err", res.GetId()))
}
}
if len(errs) != 0 {
return errors.NewAggregate(errs)
}
return nil
}
func (manager *SMonitorResourceManager) GetMonitorResourceById(id string) (*SMonitorResource, error) {
iModel, err := db.FetchById(manager, id)
if err != nil {
@@ -401,6 +436,7 @@ func (manager *SMonitorResourceManager) SyncResources(ctx context.Context, mss *
userCred := auth.AdminCredential()
errs := make([]error, 0)
log.Infoln("start sync")
aliveIds := make([]string, 0)
for _, set := range mss.ModelSetList() {
setRv := reflect.ValueOf(set)
needSync, typ := manager.GetSetType(set)
@@ -420,6 +456,7 @@ func (manager *SMonitorResourceManager) SyncResources(ctx context.Context, mss *
return errors.Wrap(err, "GetMonitorResources err")
}
if mRv.IsValid() {
aliveIds = append(aliveIds, kRv.String())
obj := jsonutils.Marshal(mRv.Interface())
if len(res) == 0 {
// no find to create
@@ -452,6 +489,10 @@ func (manager *SMonitorResourceManager) SyncResources(ctx context.Context, mss *
}
}
}
err := manager.DeleteMonitorResources(ctx, userCred, SdeleteRes{notIn: aliveIds, resType: typ})
if err != nil {
return err
}
}
log.Infoln("SMonitorResourceManager SyncResources End")
err := CommonAlertManager.Run(ctx)