diff --git a/pkg/apihelper/interface.go b/pkg/apihelper/interface.go index f61eba47b0..a44a9bef90 100644 --- a/pkg/apihelper/interface.go +++ b/pkg/apihelper/interface.go @@ -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() diff --git a/pkg/apihelper/reflect.go b/pkg/apihelper/reflect.go index 9af1a6d719..8d49d73b14 100644 --- a/pkg/apihelper/reflect.go +++ b/pkg/apihelper/reflect.go @@ -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)) diff --git a/pkg/monitor/models/modelset.go b/pkg/monitor/models/modelset.go index a9f43f8610..4cf4fb7440 100644 --- a/pkg/monitor/models/modelset.go +++ b/pkg/monitor/models/modelset.go @@ -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 } diff --git a/pkg/monitor/models/monitor_resource.go b/pkg/monitor/models/monitor_resource.go index 845c6593aa..f759262f3b 100644 --- a/pkg/monitor/models/monitor_resource.go +++ b/pkg/monitor/models/monitor_resource.go @@ -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)