Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Support group topics in Telgram sender #1022

Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6499eed
refactor(notifier): Bump telebot package version & fix related issues
Gaspero Apr 10, 2024
c073d4c
feat(notifier): Add the ability to send notifications to telegram topics
Gaspero May 5, 2024
e7bf53d
test(notifier): Fix telegram sender tests
Gaspero May 7, 2024
b9c4f40
test(notifier): Refactor telegram sender tests
Gaspero May 8, 2024
8ad2789
docs(notifier): Adds description of Chat.Recipient function
Gaspero May 8, 2024
480bdd2
fix(notifier): Fix sender.getChat function
Gaspero May 12, 2024
42f18c9
feat(cli): Implement up and down migrations for Telegram user records
Gaspero May 12, 2024
764c353
refactor(notifier): Apply formatting
Gaspero May 12, 2024
87ff5cf
refactor(cli): Skip test for migrating Telegram user records in short…
Gaspero May 12, 2024
1688e04
refactor(cli): Apply formatting
Gaspero May 12, 2024
fa50c3d
fix(cli): Add v2.11 to moiraValidVersions
Gaspero May 26, 2024
42e4b55
refactor(cli): Remove magic strings and change ctx source
Gaspero May 26, 2024
ebf30d1
refactor(notifier): Change errors wrapping
Gaspero May 26, 2024
4b84763
fix(notifier): Change error message
Gaspero May 26, 2024
f726d1c
refactor(notifier): Remove excessive err variable declaration
Gaspero May 26, 2024
57f1b71
refactor(notifier): Change brokenContactAPIErrors type
Gaspero May 26, 2024
2aef869
docs(notifier): Add descriptions for Chat type
Gaspero May 26, 2024
8b9409c
Merge branch 'master' into 'feature/support-group-topics-in-telgram-s…
Gaspero Jun 1, 2024
ff21de6
fix(cli): Adjust moira v12 migrations to work with the new telegramLo…
Gaspero Jun 2, 2024
7bf897e
test(notifier): Fix telegram handle_message & send tests
Gaspero Jun 2, 2024
5becdc6
Merge branch 'feat/support-telegram-group-topics' into feature/suppor…
almostinf Jun 27, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions cmd/cli/from_2.11_to_2.12.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package main

import (
"github.com/moira-alert/moira"
)

func updateFrom211(logger moira.Logger, database moira.Database) error {
logger.Info().Msg("Update 2.11 -> 2.12 was started")

err := updateTelegramUsersRecords(logger, database)
if err != nil {
return err
}

logger.Info().Msg("Update 2.11 -> 2.12 was finished")
return nil
}

func downgradeTo211(logger moira.Logger, database moira.Database) error {
logger.Info().Msg("Downgrade 2.12 -> 2.11 started")

err := downgradeTelegramUsersRecords(logger, database)
if err != nil {
return err
}

logger.Info().Msg("Downgrade 2.12 -> 2.11 was finished")
return nil
}
14 changes: 14 additions & 0 deletions cmd/cli/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,13 @@ func main() { //nolint
Error(err).
Msg("Fail to update from version 2.9")
}
case "2.11":
err := updateFrom211(logger, database)
if err != nil {
logger.Fatal().
Error(err).
Msg("Fail to update from version 2.11")
}
}
}

Expand Down Expand Up @@ -139,6 +146,13 @@ func main() { //nolint
Error(err).
Msg("Fail to update to version 2.9")
}
case "2.11":
err := downgradeTo211(logger, database)
if err != nil {
logger.Fatal().
Error(err).
Msg("Fail to update to version 2.11")
}
}
}

Expand Down
119 changes: 119 additions & 0 deletions cmd/cli/telegram_utils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package main

import (
"context"
"encoding/json"
"fmt"
"strconv"

"github.com/moira-alert/moira"
"github.com/moira-alert/moira/database/redis"
"github.com/moira-alert/moira/senders/telegram"
)

var telegramUsersKey = "moira-telegram-users:"

func updateTelegramUsersRecords(logger moira.Logger, database moira.Database) error {
logger.Info().Msg("Start updateTelegramUsersRecords")

switch d := database.(type) {
case *redis.DbConnector:
pipe := d.Client().TxPipeline()
iter := d.Client().Scan(d.Context(), 0, telegramUsersKey+"*", 0).Iterator()
for iter.Next(d.Context()) {
key := iter.Val()
if key == "moira-telegram-users:moira-bot-host" {
continue
}

oldValue, err := d.Client().Get(d.Context(), key).Result()
if err != nil {
return err
}

var chatID int64
var chat *telegram.Chat
var chatBytes []byte

chatID, err = strconv.ParseInt(oldValue, 10, 64)
if err != nil {
return err
}

if chatID < 0 {
chat = &telegram.Chat{
Type: "group",
ID: chatID,
}
} else {
chat = &telegram.Chat{
Type: "private",
ID: chatID,
}
}

chatBytes, err = json.Marshal(chat)
if err != nil {
return err
}

pipe.Set(context.Background(), key, string(chatBytes), 0)
}
_, err := pipe.Exec(d.Context())
if err != nil {
return err
}
default:
return makeUnknownDBError(database)
}

logger.Info().Msg("Successfully finished updateTelegramUsersRecords")

return nil
}

func downgradeTelegramUsersRecords(logger moira.Logger, database moira.Database) error {
logger.Info().Msg("Start downgradeTelegramUsersValue")

switch d := database.(type) {
case *redis.DbConnector:
pipe := d.Client().TxPipeline()
iter := d.Client().Scan(d.Context(), 0, telegramUsersKey+"*", 0).Iterator()
for iter.Next(d.Context()) {
key := iter.Val()
if key == "moira-telegram-users:moira-bot-host" {
continue
}

oldValue, err := d.Client().Get(context.Background(), key).Result()
if err != nil {
return err
}

var newValue string

chat := telegram.Chat{}
err = json.Unmarshal([]byte(oldValue), &chat)
if err != nil {
return err
}

if chat.ID == 0 {
return fmt.Errorf("chat ID is null")
} else {
newValue = strconv.FormatInt(chat.ID, 10)
}
pipe.Set(context.Background(), key, string(newValue), 0)
}
_, err := pipe.Exec(d.Context())
if err != nil {
return err
}
default:
return makeUnknownDBError(database)
}

logger.Info().Msg("Successfully finished downgradeTelegramUsersValue")

return nil
}
123 changes: 123 additions & 0 deletions cmd/cli/telegram_utils_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package main

import (
"testing"

"github.com/moira-alert/moira"
"github.com/moira-alert/moira/database/redis"
logging "github.com/moira-alert/moira/logging/zerolog_adapter"

. "github.com/smartystreets/goconvey/convey"
)

func TestUpdateTelegramUsersRecords(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}

conf := getDefault()
logger, err := logging.ConfigureLog(conf.LogFile, "error", "cli", conf.LogPrettyFormat)
if err != nil {
t.Fatal(err)
}

database := redis.NewTestDatabase(logger)
database.Flush()
defer database.Flush()
client := database.Client()
ctx := database.Context()

Convey("Test data migration forwards", t, func() {
Convey("Given old database", func() {
createOldTelegramUserRecords(database)

Convey("When migration was applied", func() {
err := updateTelegramUsersRecords(logger, database)
So(err, ShouldBeNil)

Convey("Database should be new", func() {
result, err := client.Get(ctx, "moira-telegram-users:some telegram group").Result()
So(err, ShouldBeNil)
So(result, ShouldEqual, "{\"chatId\":-1001494975744,\"type\":\"group\"}")

result, err = client.Get(ctx, "moira-telegram-users:@durov").Result()
So(err, ShouldBeNil)
So(result, ShouldEqual, "{\"chatId\":1,\"type\":\"private\"}")

result, err = client.Get(ctx, "moira-telegram-users:moira-bot-host").Result()
So(err, ShouldBeNil)
So(result, ShouldEqual, "D4VdnzZDTS/xXF87THARWw==")
})
})
})
})
}

func TestDowngradeTelegramUsersRecords(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}

conf := getDefault()
logger, err := logging.ConfigureLog(conf.LogFile, "error", "cli", conf.LogPrettyFormat)
if err != nil {
t.Fatal(err)
}

database := redis.NewTestDatabase(logger)
database.Flush()
defer database.Flush()
client := database.Client()
ctx := database.Context()

Convey("Test data migration backwards", t, func() {
Convey("Given new database", func() {
createNewTelegramUserRecords(database)

Convey("When migration was applied", func() {
err := downgradeTelegramUsersRecords(logger, database)
So(err, ShouldBeNil)

Convey("Database should be old", func() {
result, err := client.Get(ctx, "moira-telegram-users:some telegram group").Result()
So(err, ShouldBeNil)
So(result, ShouldEqual, "-1001494975744")

result, err = client.Get(ctx, "moira-telegram-users:@durov").Result()
So(err, ShouldBeNil)
So(result, ShouldEqual, "1")

result, err = client.Get(ctx, "moira-telegram-users:moira-bot-host").Result()
So(err, ShouldBeNil)
So(result, ShouldEqual, "D4VdnzZDTS/xXF87THARWw==")
})
})
})
})
}

func createOldTelegramUserRecords(database moira.Database) {
switch d := database.(type) {
case *redis.DbConnector:
d.Flush()
client := d.Client()
ctx := d.Context()

client.Set(ctx, "moira-telegram-users:some telegram group", "-1001494975744", -1)
client.Set(ctx, "moira-telegram-users:@durov", "1", -1)
client.Set(ctx, "moira-telegram-users:moira-bot-host", "D4VdnzZDTS/xXF87THARWw==", -1)
}
}

func createNewTelegramUserRecords(database moira.Database) {
switch d := database.(type) {
case *redis.DbConnector:
d.Flush()
client := d.Client()
ctx := d.Context()

client.Set(ctx, "moira-telegram-users:some telegram group", "{\"type\":\"group\",\"chatId\":-1001494975744}", -1)
client.Set(ctx, "moira-telegram-users:@durov", "{\"type\":\"private\",\"chatId\":1}", -1)
client.Set(ctx, "moira-telegram-users:moira-bot-host", "D4VdnzZDTS/xXF87THARWw==", -1)
}
}
1 change: 1 addition & 0 deletions generate_mocks.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,6 @@ mockgen -destination=mock/moira-alert/metrics/meter.go -package=mock_moira_alert
mockgen -destination=mock/moira-alert/prometheus_api.go -package=mock_moira_alert github.com/moira-alert/moira/metric_source/prometheus PrometheusApi

mockgen -destination=mock/moira-alert/database_stats.go -package=mock_moira_alert github.com/moira-alert/moira/database/stats StatsReporter
mockgen -destination=mock/notifier/telegram/bot.go -package=mock_telegram github.com/moira-alert/moira/senders/telegram Bot

git add mock/*
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ require (
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/h2non/gock.v1 v1.1.2
gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637
gopkg.in/tucnak/telebot.v2 v2.5.0
gopkg.in/yaml.v2 v2.4.0
)

Expand All @@ -52,6 +51,7 @@ require (
github.com/mitchellh/mapstructure v1.5.0
github.com/moira-alert/blackfriday-slack v0.1.2
github.com/swaggo/http-swagger v1.3.4
gopkg.in/telebot.v3 v3.2.1
)

require (
Expand Down
Loading