From fdc9333109ff4786f4582cc42bd1a5f6571a01b4 Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Mon, 21 Dec 2020 14:14:32 +0300 Subject: [PATCH] PMM-7207 Toggle Rule API (#588) * Toggle Rule API * Check for empty list of IDs * Add constraint * Unexport method --- models/channel_helpers.go | 4 +++ models/database.go | 3 ++- services/management/ia/alerts_service.go | 4 ++- services/management/ia/rules_service.go | 34 +++++++++++++++++++++--- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/models/channel_helpers.go b/models/channel_helpers.go index 03391b04a8..cce4b2e952 100644 --- a/models/channel_helpers.go +++ b/models/channel_helpers.go @@ -129,6 +129,10 @@ func FindChannelByID(q *reform.Querier, id string) (*Channel, error) { // FindChannelsByIDs finds channels by IDs. func FindChannelsByIDs(q *reform.Querier, ids []string) ([]*Channel, error) { + if len(ids) == 0 { + return []*Channel{}, nil + } + p := strings.Join(q.Placeholders(1, len(ids)), ", ") tail := fmt.Sprintf("WHERE id IN (%s) ORDER BY id", p) //nolint:gosec args := make([]interface{}, len(ids)) diff --git a/models/database.go b/models/database.go index 014a04dfbe..ffa69f18f5 100644 --- a/models/database.go +++ b/models/database.go @@ -410,7 +410,8 @@ var databaseSchema = [][]string{ created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL, - PRIMARY KEY (id) + PRIMARY KEY (id), + FOREIGN KEY (template_name) REFERENCES ia_templates (name) )`, }, } diff --git a/services/management/ia/alerts_service.go b/services/management/ia/alerts_service.go index c9977a79cc..d6940aea66 100644 --- a/services/management/ia/alerts_service.go +++ b/services/management/ia/alerts_service.go @@ -151,7 +151,9 @@ func (s *AlertsService) ToggleAlert(ctx context.Context, req *iav1beta1.ToggleAl return nil, status.Errorf(codes.FailedPrecondition, "%v.", services.ErrAlertingDisabled) } - switch req.Silenced { //nolint:exhaustive + switch req.Silenced { + case iav1beta1.BooleanFlag_DO_NOT_CHANGE: + // nothing case iav1beta1.BooleanFlag_TRUE: err := s.alertManager.Silence(ctx, req.AlertId) if err != nil { diff --git a/services/management/ia/rules_service.go b/services/management/ia/rules_service.go index a6c4b72387..1baacf9c5b 100644 --- a/services/management/ia/rules_service.go +++ b/services/management/ia/rules_service.go @@ -58,15 +58,15 @@ func (s *RulesService) ListAlertRules(ctx context.Context, req *iav1beta1.ListAl return nil, status.Errorf(codes.FailedPrecondition, "%v.", services.ErrAlertingDisabled) } - res, err := s.GetAlertRules() + res, err := s.getAlertRules() if err != nil { return nil, err } return &iav1beta1.ListAlertRulesResponse{Rules: res}, nil } -// GetAlertRules returns list of available alert rules. -func (s *RulesService) GetAlertRules() ([]*iav1beta1.Rule, error) { +// getAlertRules returns list of available alert rules. +func (s *RulesService) getAlertRules() ([]*iav1beta1.Rule, error) { var rules []*models.Rule var channels []*models.Channel e := s.db.InTransaction(func(tx *reform.TX) error { @@ -182,7 +182,33 @@ func (s *RulesService) UpdateAlertRule(ctx context.Context, req *iav1beta1.Updat // ToggleAlertRule allows to switch between disabled and enabled states of an Alert Rule. func (s *RulesService) ToggleAlertRule(ctx context.Context, req *iav1beta1.ToggleAlertRuleRequest) (*iav1beta1.ToggleAlertRuleResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ToggleAlertRule not implemented") + settings, err := models.GetSettings(s.db) + if err != nil { + return nil, err + } + + if !settings.IntegratedAlerting.Enabled { + return nil, status.Errorf(codes.FailedPrecondition, "%v.", services.ErrAlertingDisabled) + } + + var params models.ChangeRuleParams + switch req.Disabled { + case iav1beta1.BooleanFlag_DO_NOT_CHANGE: + return &iav1beta1.ToggleAlertRuleResponse{}, nil + case iav1beta1.BooleanFlag_TRUE: + params.Disabled = true + case iav1beta1.BooleanFlag_FALSE: + // nothing + } + + e := s.db.InTransaction(func(tx *reform.TX) error { + _, err := models.ChangeRule(tx.Querier, req.RuleId, ¶ms) + return err + }) + if e != nil { + return nil, e + } + return &iav1beta1.ToggleAlertRuleResponse{}, nil } // DeleteAlertRule deletes Integrated Alerting rule.