From 709f2ac25438f7b486b9a595ff9bba9646c8082c Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Tue, 16 Apr 2024 07:19:25 -0600 Subject: [PATCH] slack to model pipeline tested and K --- slack.go | 39 +++++++++++++++++++++++++--- slack_test.go | 70 ++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 90 insertions(+), 19 deletions(-) diff --git a/slack.go b/slack.go index dca13cf..8499e4d 100644 --- a/slack.go +++ b/slack.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "regexp" "strconv" "strings" "time" @@ -44,13 +45,43 @@ func NewSlackToModelPipeline(ctx context.Context, cfg Config) (Pipeline, error) func newSlackToModelProcess(cfg Config) processFunc { return func(ctx context.Context, slack []byte) ([]byte, error) { - slackMessage, err := parseSlack(slack) + s, err := parseSlack(slack) if err != nil { return nil, fmt.Errorf("failed to deserialize slack %w: %s", err, slack) } - return nil, errors.New("not impl") - _ = slackMessage - return json.Marshal(Models{}) + + for pattern, ptr := range map[string]*string{ + cfg.AssetPattern: &s.Asset, + cfg.DatacenterPattern: &s.Datacenter, + cfg.EventNamePattern: &s.EventName, + } { + r := regexp.MustCompile(pattern) + parsed := r.FindString(*ptr) + for i, name := range r.SubexpNames() { + if i > 0 && name != "" { + parsed = r.FindStringSubmatch(*ptr)[i] + } + } + *ptr = parsed + } + + event := model.Event{} + if s.Event != "" && s.Source != "" && s.TS > 0 && s.EventName != "" { + event = model.NewEvent(s.Event, s.Source, s.TS, s.EventName, s.Asset, s.Datacenter, "TODO", s.Resolved) + } + message := model.Message{} + if s.ID != "" && s.Source != "" && s.TS > 0 && s.Thread != "" { + message = model.NewMessage(s.ID, s.Source, s.TS, "TODO", s.Plaintext, s.Thread) + } + thread := model.Thread{} + if s.Thread != "" && s.Source != "" && s.TS > 0 && s.Event != "" { + thread = model.NewThread(s.Thread, s.Source, s.TS, s.Channel, s.Event) + } + return json.Marshal(Models{ + Event: event, + Message: message, + Thread: thread, + }) } } diff --git a/slack_test.go b/slack_test.go index a13d036..261e66d 100644 --- a/slack_test.go +++ b/slack_test.go @@ -2,11 +2,13 @@ package main import ( "context" + "encoding/json" "os" "path" "testing" "time" + "github.com/breel-render/spoc-bot-vr/model" "gotest.tools/assert" ) @@ -15,7 +17,12 @@ func TestSlackToModelPipeline(t *testing.T) { ctx, can := context.WithTimeout(context.Background(), time.Second*5) defer can() - pipeline, err := NewSlackToModelPipeline(ctx, Config{driver: NewTestDriver(t)}) + pipeline, err := NewSlackToModelPipeline(ctx, Config{ + driver: NewTestDriver(t), + AssetPattern: renderAssetPattern, + DatacenterPattern: renderDatacenterPattern, + EventNamePattern: renderEventNamePattern, + }) if err != nil { t.Fatal(err) } @@ -25,8 +32,33 @@ func TestSlackToModelPipeline(t *testing.T) { } }() - /* - want := Message{ + want := Models{ + Event: model.NewEvent( + "11071", + "https://renderinc.slack.com/archives/C06U1DDBBU4/p1712927439728409", + 1712927439, + "Alertconfig Workflow Failed", + "", + "", + "TODO", + false, + ), + Message: model.NewMessage( + "1712927439.728409/1712927439", + "https://renderinc.slack.com/archives/C06U1DDBBU4/p1712927439728409", + 1712927439, + "TODO", + "At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ", + "1712927439.728409", + ), + Thread: model.NewThread( + "1712927439.728409", + "https://renderinc.slack.com/archives/C06U1DDBBU4/p1712927439728409", + 1712927439, + "C06U1DDBBU4", + "11071", + ), + /* ID: "1712927439.728409/1712927439", TS: 1712927439, Source: "https://renderinc.slack.com/archives/C06U1DDBBU4/p1712927439728409", @@ -37,19 +69,27 @@ func TestSlackToModelPipeline(t *testing.T) { Plaintext: "At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ", Asset: "At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ", Datacenter: "alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", - } + */ + } - b, _ := os.ReadFile("testdata/slack_events/opsgenie_alert.json") - if err := pipeline.reader.Enqueue(ctx, b); err != nil { - t.Fatal("failed to enqueue", err) - } - if _, b2, err := pipeline.writer.Syn(ctx); err != nil { - t.Fatal("failed to syn", err) - } else if m := MustDeserialize(b2); false { - } else { - assert.DeepEqual(t, want, m) - } - */ + b, _ := os.ReadFile("testdata/slack_events/opsgenie_alert.json") + if err := pipeline.reader.Enqueue(ctx, b); err != nil { + t.Fatal("failed to enqueue", err) + } + var got Models + if _, b2, err := pipeline.writer.Syn(ctx); err != nil { + t.Fatal("failed to syn", err) + } else if err := json.Unmarshal(b2, &got); err != nil { + t.Fatal("failed to parse outqueue:", err) + } else { + want.Event.Updated = 0 + want.Message.Updated = 0 + want.Thread.Updated = 0 + got.Event.Updated = 0 + got.Message.Updated = 0 + got.Thread.Updated = 0 + assert.DeepEqual(t, want, got) + } } func TestParseSlackTestdata(t *testing.T) {