slack to model pipeline tested and K

main
Bel LaPointe 2024-04-16 07:19:25 -06:00
parent ba06796b8c
commit 709f2ac254
2 changed files with 90 additions and 19 deletions

View File

@ -5,6 +5,7 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"regexp"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -44,13 +45,43 @@ func NewSlackToModelPipeline(ctx context.Context, cfg Config) (Pipeline, error)
func newSlackToModelProcess(cfg Config) processFunc { func newSlackToModelProcess(cfg Config) processFunc {
return func(ctx context.Context, slack []byte) ([]byte, error) { return func(ctx context.Context, slack []byte) ([]byte, error) {
slackMessage, err := parseSlack(slack) s, err := parseSlack(slack)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to deserialize slack %w: %s", err, slack) return nil, fmt.Errorf("failed to deserialize slack %w: %s", err, slack)
} }
return nil, errors.New("not impl")
_ = slackMessage for pattern, ptr := range map[string]*string{
return json.Marshal(Models{}) 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,
})
} }
} }

View File

@ -2,11 +2,13 @@ package main
import ( import (
"context" "context"
"encoding/json"
"os" "os"
"path" "path"
"testing" "testing"
"time" "time"
"github.com/breel-render/spoc-bot-vr/model"
"gotest.tools/assert" "gotest.tools/assert"
) )
@ -15,7 +17,12 @@ func TestSlackToModelPipeline(t *testing.T) {
ctx, can := context.WithTimeout(context.Background(), time.Second*5) ctx, can := context.WithTimeout(context.Background(), time.Second*5)
defer can() 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 { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -25,8 +32,33 @@ func TestSlackToModelPipeline(t *testing.T) {
} }
}() }()
/* want := Models{
want := Message{ 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: <https://grafana.render.com/d/VLZU83YVk?orgId=1>\nPanel: <https://grafana.render.com/d/VLZU83YVk?orgId=1&amp;viewPanel=17>\nSource: <https://grafana.render.com/alerting/grafana/fa7b06b8-b4d8-4979-bce7-5e1c432edd81/view?orgId=1>",
"1712927439.728409",
),
Thread: model.NewThread(
"1712927439.728409",
"https://renderinc.slack.com/archives/C06U1DDBBU4/p1712927439728409",
1712927439,
"C06U1DDBBU4",
"11071",
),
/*
ID: "1712927439.728409/1712927439", ID: "1712927439.728409/1712927439",
TS: 1712927439, TS: 1712927439,
Source: "https://renderinc.slack.com/archives/C06U1DDBBU4/p1712927439728409", 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: <https://grafana.render.com/d/VLZU83YVk?orgId=1>\nPanel: <https://grafana.render.com/d/VLZU83YVk?orgId=1&amp;viewPanel=17>\nSource: <https://grafana.render.com/alerting/grafana/fa7b06b8-b4d8-4979-bce7-5e1c432edd81/view?orgId=1>", Plaintext: "At least one alertconfig run has failed unexpectedly.\nDashboard: <https://grafana.render.com/d/VLZU83YVk?orgId=1>\nPanel: <https://grafana.render.com/d/VLZU83YVk?orgId=1&amp;viewPanel=17>\nSource: <https://grafana.render.com/alerting/grafana/fa7b06b8-b4d8-4979-bce7-5e1c432edd81/view?orgId=1>",
Asset: "At least one alertconfig run has failed unexpectedly.\nDashboard: <https://grafana.render.com/d/VLZU83YVk?orgId=1>\nPanel: <https://grafana.render.com/d/VLZU83YVk?orgId=1&amp;viewPanel=17>\nSource: <https://grafana.render.com/alerting/grafana/fa7b06b8-b4d8-4979-bce7-5e1c432edd81/view?orgId=1>", Asset: "At least one alertconfig run has failed unexpectedly.\nDashboard: <https://grafana.render.com/d/VLZU83YVk?orgId=1>\nPanel: <https://grafana.render.com/d/VLZU83YVk?orgId=1&amp;viewPanel=17>\nSource: <https://grafana.render.com/alerting/grafana/fa7b06b8-b4d8-4979-bce7-5e1c432edd81/view?orgId=1>",
Datacenter: "alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", Datacenter: "alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb",
} */
}
b, _ := os.ReadFile("testdata/slack_events/opsgenie_alert.json") b, _ := os.ReadFile("testdata/slack_events/opsgenie_alert.json")
if err := pipeline.reader.Enqueue(ctx, b); err != nil { if err := pipeline.reader.Enqueue(ctx, b); err != nil {
t.Fatal("failed to enqueue", err) t.Fatal("failed to enqueue", err)
} }
if _, b2, err := pipeline.writer.Syn(ctx); err != nil { var got Models
t.Fatal("failed to syn", err) if _, b2, err := pipeline.writer.Syn(ctx); err != nil {
} else if m := MustDeserialize(b2); false { t.Fatal("failed to syn", err)
} else { } else if err := json.Unmarshal(b2, &got); err != nil {
assert.DeepEqual(t, want, m) 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) { func TestParseSlackTestdata(t *testing.T) {