mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: set updated_by for system owned operations (#100068)
This commit is contained in:
parent
6eac07c3a7
commit
68f1730461
@ -757,23 +757,36 @@ type userIDToUserInfoFn func(id *ngmodels.UserUID) *apimodels.UserInfo
|
||||
|
||||
// getIdentityName returns name of either user or service account
|
||||
func (srv RulerSrv) resolveUserIdToNameFn(ctx context.Context) userIDToUserInfoFn {
|
||||
cache := map[ngmodels.UserUID]*apimodels.UserInfo{
|
||||
ngmodels.AlertingUserUID: {
|
||||
UID: string(ngmodels.AlertingUserUID),
|
||||
},
|
||||
ngmodels.FileProvisioningUserUID: {
|
||||
UID: string(ngmodels.FileProvisioningUserUID),
|
||||
},
|
||||
}
|
||||
return func(id *ngmodels.UserUID) *apimodels.UserInfo {
|
||||
if id == nil {
|
||||
return nil
|
||||
}
|
||||
if val, ok := cache[*id]; ok {
|
||||
return val
|
||||
}
|
||||
u, err := srv.userService.GetByUID(ctx, &user.GetUserByUIDQuery{
|
||||
UID: string(*id),
|
||||
})
|
||||
var result string
|
||||
var name string
|
||||
if err != nil {
|
||||
srv.log.FromContext(ctx).Warn("Failed to get user by uid. Defaulting to an empty name", "uid", id, "error", err)
|
||||
}
|
||||
if u != nil {
|
||||
result = u.NameOrFallback()
|
||||
name = u.NameOrFallback()
|
||||
}
|
||||
return &apimodels.UserInfo{
|
||||
result := &apimodels.UserInfo{
|
||||
UID: string(*id),
|
||||
Name: result,
|
||||
Name: name,
|
||||
}
|
||||
cache[*id] = result
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
@ -404,6 +404,24 @@ func TestRouteGetRuleByUID(t *testing.T) {
|
||||
Name: "Test",
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "recognize system identifier (alerting)",
|
||||
UpdatedBy: &models.AlertingUserUID,
|
||||
User: nil,
|
||||
UserServiceError: nil,
|
||||
Expected: &apimodels.UserInfo{
|
||||
UID: string(models.AlertingUserUID),
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "recognize system identifier (provisioning)",
|
||||
UpdatedBy: &models.FileProvisioningUserUID,
|
||||
User: nil,
|
||||
UserServiceError: nil,
|
||||
Expected: &apimodels.UserInfo{
|
||||
UID: string(models.FileProvisioningUserUID),
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tc := range testcases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
|
@ -47,6 +47,11 @@ var (
|
||||
ErrNoPanel = errors.New("no panel")
|
||||
)
|
||||
|
||||
var (
|
||||
FileProvisioningUserUID = UserUID("__provisioning__")
|
||||
AlertingUserUID = UserUID("__alerting__")
|
||||
)
|
||||
|
||||
// swagger:enum NoDataState
|
||||
type NoDataState string
|
||||
|
||||
|
@ -232,7 +232,7 @@ func (service *AlertRuleService) CreateAlertRule(ctx context.Context, user ident
|
||||
}
|
||||
}
|
||||
err = service.xact.InTransaction(ctx, func(ctx context.Context) error {
|
||||
ids, err := service.ruleStore.InsertAlertRules(ctx, models.NewUserUID(user), []models.AlertRule{
|
||||
ids, err := service.ruleStore.InsertAlertRules(ctx, userUidOrFallback(user), []models.AlertRule{
|
||||
rule,
|
||||
})
|
||||
if err != nil {
|
||||
@ -359,7 +359,7 @@ func (service *AlertRuleService) UpdateRuleGroup(ctx context.Context, user ident
|
||||
}
|
||||
}
|
||||
|
||||
return service.ruleStore.UpdateAlertRules(ctx, models.NewUserUID(user), updateRules)
|
||||
return service.ruleStore.UpdateAlertRules(ctx, userUidOrFallback(user), updateRules)
|
||||
})
|
||||
}
|
||||
|
||||
@ -511,7 +511,7 @@ func (service *AlertRuleService) persistDelta(ctx context.Context, user identity
|
||||
New: *update.New,
|
||||
})
|
||||
}
|
||||
if err := service.ruleStore.UpdateAlertRules(ctx, models.NewUserUID(user), updates); err != nil {
|
||||
if err := service.ruleStore.UpdateAlertRules(ctx, userUidOrFallback(user), updates); err != nil {
|
||||
return fmt.Errorf("failed to update alert rules: %w", err)
|
||||
}
|
||||
for _, update := range delta.Update {
|
||||
@ -522,7 +522,7 @@ func (service *AlertRuleService) persistDelta(ctx context.Context, user identity
|
||||
}
|
||||
|
||||
if len(delta.New) > 0 {
|
||||
uids, err := service.ruleStore.InsertAlertRules(ctx, models.NewUserUID(user), withoutNilAlertRules(delta.New))
|
||||
uids, err := service.ruleStore.InsertAlertRules(ctx, userUidOrFallback(user), withoutNilAlertRules(delta.New))
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to insert alert rules: %w", err)
|
||||
}
|
||||
@ -618,7 +618,7 @@ func (service *AlertRuleService) UpdateAlertRule(ctx context.Context, user ident
|
||||
return models.AlertRule{}, err
|
||||
}
|
||||
err = service.xact.InTransaction(ctx, func(ctx context.Context) error {
|
||||
err := service.ruleStore.UpdateAlertRules(ctx, models.NewUserUID(user), []models.UpdateRule{
|
||||
err := service.ruleStore.UpdateAlertRules(ctx, userUidOrFallback(user), []models.UpdateRule{
|
||||
{
|
||||
Existing: storedRule,
|
||||
New: rule,
|
||||
@ -871,3 +871,11 @@ func (service *AlertRuleService) ensureNamespace(ctx context.Context, user ident
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func userUidOrFallback(user identity.Requester) *models.UserUID {
|
||||
userUID := models.NewUserUID(user)
|
||||
if user == nil {
|
||||
return &models.FileProvisioningUserUID
|
||||
}
|
||||
return userUID
|
||||
}
|
||||
|
@ -988,7 +988,7 @@ func (st DBstore) RenameReceiverInNotificationSettings(ctx context.Context, orgI
|
||||
}
|
||||
// Provide empty user identifier to ensure it's clear that the rule update was made by the system
|
||||
// and not by the user who changed the receiver's title.
|
||||
return result, nil, st.UpdateAlertRules(ctx, nil, updates)
|
||||
return result, nil, st.UpdateAlertRules(ctx, &ngmodels.AlertingUserUID, updates)
|
||||
}
|
||||
|
||||
// RenameTimeIntervalInNotificationSettings renames all rules that use old time interval name to the new name.
|
||||
@ -1065,7 +1065,7 @@ func (st DBstore) RenameTimeIntervalInNotificationSettings(
|
||||
}
|
||||
// Provide empty user identifier to ensure it's clear that the rule update was made by the system
|
||||
// and not by the user who changed the receiver's title.
|
||||
return result, nil, st.UpdateAlertRules(ctx, nil, updates)
|
||||
return result, nil, st.UpdateAlertRules(ctx, &ngmodels.AlertingUserUID, updates)
|
||||
}
|
||||
|
||||
func ruleConstraintViolationToErr(sess *db.Session, rule ngmodels.AlertRule, err error, logger log.Logger) error {
|
||||
|
Loading…
Reference in New Issue
Block a user