Add batch distributor notification config
This commit is contained in:
@@ -63,6 +63,18 @@ func TestDefaults(t *testing.T) {
|
||||
if strings.Join(cfg.Notify.Distributor.ReportPathTemplates, "\n") != strings.Join(wantReportPaths, "\n") {
|
||||
t.Fatalf("Notify.Distributor.ReportPathTemplates = %#v, want %#v", cfg.Notify.Distributor.ReportPathTemplates, wantReportPaths)
|
||||
}
|
||||
if !cfg.Notify.Distributor.Batch.Enabled {
|
||||
t.Fatalf("Notify.Distributor.Batch.Enabled = false, want true")
|
||||
}
|
||||
if cfg.Notify.Distributor.Batch.PipelineIDTemplate != "weatherreporter" {
|
||||
t.Fatalf("Notify.Distributor.Batch.PipelineIDTemplate = %q, want weatherreporter", cfg.Notify.Distributor.Batch.PipelineIDTemplate)
|
||||
}
|
||||
if cfg.Notify.Distributor.Batch.BundleIDTemplate != "weatherreporter.{location_id}.{batch}" {
|
||||
t.Fatalf("Notify.Distributor.Batch.BundleIDTemplate = %q, want default", cfg.Notify.Distributor.Batch.BundleIDTemplate)
|
||||
}
|
||||
if cfg.Notify.Distributor.Batch.IdempotencyKeyTemplate != "{bundle_id}.{batch_run_id}" {
|
||||
t.Fatalf("Notify.Distributor.Batch.IdempotencyKeyTemplate = %q, want default", cfg.Notify.Distributor.Batch.IdempotencyKeyTemplate)
|
||||
}
|
||||
if cfg.MissingSource.Default != MissingSourceWarn {
|
||||
t.Fatalf("MissingSource.Default = %q, want warn", cfg.MissingSource.Default)
|
||||
}
|
||||
@@ -92,6 +104,18 @@ func TestLoadExampleConfig(t *testing.T) {
|
||||
if len(cfg.Notify.Distributor.ReportPathTemplates) != 1 {
|
||||
t.Fatalf("ReportPathTemplates = %#v, want example archive path", cfg.Notify.Distributor.ReportPathTemplates)
|
||||
}
|
||||
if !cfg.Notify.Distributor.Batch.Enabled {
|
||||
t.Fatalf("Notify.Distributor.Batch.Enabled = false, want true")
|
||||
}
|
||||
if cfg.Notify.Distributor.Batch.PipelineIDTemplate != "weatherreporter" {
|
||||
t.Fatalf("Batch PipelineIDTemplate = %q, want weatherreporter", cfg.Notify.Distributor.Batch.PipelineIDTemplate)
|
||||
}
|
||||
if cfg.Notify.Distributor.Batch.BundleIDTemplate != "weatherreporter.{location_id}.{batch}" {
|
||||
t.Fatalf("Batch BundleIDTemplate = %q, want example batch bundle template", cfg.Notify.Distributor.Batch.BundleIDTemplate)
|
||||
}
|
||||
if cfg.Notify.Distributor.Batch.IdempotencyKeyTemplate != "{bundle_id}.{batch_run_id}" {
|
||||
t.Fatalf("Batch IdempotencyKeyTemplate = %q, want example batch idempotency template", cfg.Notify.Distributor.Batch.IdempotencyKeyTemplate)
|
||||
}
|
||||
overrides, err := cfg.ReportModuleOverrides()
|
||||
if err != nil {
|
||||
t.Fatalf("ReportModuleOverrides() error = %v", err)
|
||||
@@ -782,6 +806,18 @@ func TestDisabledDistributorNotifyAcceptsOmittedFields(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestDisabledDistributorNotifyAcceptsMalformedBatchTemplates(t *testing.T) {
|
||||
cfg := Defaults()
|
||||
cfg.Notify.Distributor.Enabled = false
|
||||
cfg.Notify.Distributor.Batch.PipelineIDTemplate = "{unknown}"
|
||||
cfg.Notify.Distributor.Batch.BundleIDTemplate = "{unknown}"
|
||||
cfg.Notify.Distributor.Batch.IdempotencyKeyTemplate = "{unknown}"
|
||||
|
||||
if err := Validate(cfg); err != nil {
|
||||
t.Fatalf("Validate() error = %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEnabledDistributorNotifyValidation(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
@@ -906,6 +942,109 @@ func TestEnabledDistributorNotifyValidation(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestEnabledDistributorBatchNotifyValidation(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
mutate func(*Config)
|
||||
wantErr string
|
||||
}{
|
||||
{
|
||||
name: "PipelineTemplateEmpty",
|
||||
mutate: func(cfg *Config) {
|
||||
cfg.Notify.Distributor.Batch.PipelineIDTemplate = ""
|
||||
},
|
||||
wantErr: "notify.distributor.batch.pipeline_id_template",
|
||||
},
|
||||
{
|
||||
name: "PipelineTemplateUnknown",
|
||||
mutate: func(cfg *Config) {
|
||||
cfg.Notify.Distributor.Batch.PipelineIDTemplate = "{report_id}"
|
||||
},
|
||||
wantErr: "notify.distributor.batch.pipeline_id_template",
|
||||
},
|
||||
{
|
||||
name: "PipelineTemplateRenderedEmpty",
|
||||
mutate: func(cfg *Config) {
|
||||
cfg.Notify.Distributor.Batch.PipelineIDTemplate = " "
|
||||
},
|
||||
wantErr: "notify.distributor.batch.pipeline_id_template",
|
||||
},
|
||||
{
|
||||
name: "BundleTemplateEmpty",
|
||||
mutate: func(cfg *Config) {
|
||||
cfg.Notify.Distributor.Batch.BundleIDTemplate = ""
|
||||
},
|
||||
wantErr: "notify.distributor.batch.bundle_id_template",
|
||||
},
|
||||
{
|
||||
name: "BundleTemplateUnknown",
|
||||
mutate: func(cfg *Config) {
|
||||
cfg.Notify.Distributor.Batch.BundleIDTemplate = "{run_id}"
|
||||
},
|
||||
wantErr: "notify.distributor.batch.bundle_id_template",
|
||||
},
|
||||
{
|
||||
name: "BundleTemplateRenderedEmpty",
|
||||
mutate: func(cfg *Config) {
|
||||
cfg.Notify.Distributor.Batch.BundleIDTemplate = " "
|
||||
},
|
||||
wantErr: "notify.distributor.batch.bundle_id_template",
|
||||
},
|
||||
{
|
||||
name: "IdempotencyTemplateEmpty",
|
||||
mutate: func(cfg *Config) {
|
||||
cfg.Notify.Distributor.Batch.IdempotencyKeyTemplate = ""
|
||||
},
|
||||
wantErr: "notify.distributor.batch.idempotency_key_template",
|
||||
},
|
||||
{
|
||||
name: "IdempotencyTemplateUnknown",
|
||||
mutate: func(cfg *Config) {
|
||||
cfg.Notify.Distributor.Batch.IdempotencyKeyTemplate = "{report_id}"
|
||||
},
|
||||
wantErr: "notify.distributor.batch.idempotency_key_template",
|
||||
},
|
||||
{
|
||||
name: "IdempotencyTemplateRenderedEmpty",
|
||||
mutate: func(cfg *Config) {
|
||||
cfg.Notify.Distributor.Batch.IdempotencyKeyTemplate = " "
|
||||
},
|
||||
wantErr: "notify.distributor.batch.idempotency_key_template",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
cfg := Defaults()
|
||||
cfg.Notify.Distributor.Enabled = true
|
||||
cfg.Notify.Distributor.PipelineIDTemplate = "weatherreporter.{artifact_group}"
|
||||
tt.mutate(&cfg)
|
||||
|
||||
err := Validate(cfg)
|
||||
if err == nil {
|
||||
t.Fatal("Validate() error = nil, want error")
|
||||
}
|
||||
if !strings.Contains(err.Error(), tt.wantErr) {
|
||||
t.Fatalf("error = %q, want %q", err.Error(), tt.wantErr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDisabledDistributorBatchNotifySkipsBatchTemplateValidation(t *testing.T) {
|
||||
cfg := Defaults()
|
||||
cfg.Notify.Distributor.Enabled = true
|
||||
cfg.Notify.Distributor.PipelineIDTemplate = "weatherreporter.{artifact_group}"
|
||||
cfg.Notify.Distributor.Batch.Enabled = false
|
||||
cfg.Notify.Distributor.Batch.PipelineIDTemplate = "{unknown}"
|
||||
cfg.Notify.Distributor.Batch.BundleIDTemplate = "{unknown}"
|
||||
cfg.Notify.Distributor.Batch.IdempotencyKeyTemplate = "{unknown}"
|
||||
|
||||
if err := Validate(cfg); err != nil {
|
||||
t.Fatalf("Validate() error = %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDistributorTemplateRendering(t *testing.T) {
|
||||
values := DistributorTemplateValues{
|
||||
LocationID: "home",
|
||||
@@ -962,6 +1101,69 @@ func TestDistributorTemplateRendering(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestDistributorBatchTemplateRendering(t *testing.T) {
|
||||
values := DistributorBatchTemplateValues{
|
||||
LocationID: "home",
|
||||
Batch: "evening",
|
||||
BatchRunID: "20260617T235037.642224552Z_evening",
|
||||
BatchStartedDate: "2026-06-17",
|
||||
}
|
||||
|
||||
bundleID, err := RenderDistributorBatchBundleID("weatherreporter.{location_id}.{batch}", values)
|
||||
if err != nil {
|
||||
t.Fatalf("RenderDistributorBatchBundleID() error = %v", err)
|
||||
}
|
||||
if bundleID != "weatherreporter.home.evening" {
|
||||
t.Fatalf("bundleID = %q, want batch bundle ID", bundleID)
|
||||
}
|
||||
values.BundleID = bundleID
|
||||
|
||||
pipelineID, err := RenderDistributorBatchPipelineID("weatherreporter", values)
|
||||
if err != nil {
|
||||
t.Fatalf("RenderDistributorBatchPipelineID() error = %v", err)
|
||||
}
|
||||
if pipelineID != "weatherreporter" {
|
||||
t.Fatalf("pipelineID = %q, want weatherreporter", pipelineID)
|
||||
}
|
||||
|
||||
idempotencyKey, err := RenderDistributorBatchIdempotencyKey("{bundle_id}.{batch_run_id}", values)
|
||||
if err != nil {
|
||||
t.Fatalf("RenderDistributorBatchIdempotencyKey() error = %v", err)
|
||||
}
|
||||
if idempotencyKey != "weatherreporter.home.evening.20260617T235037.642224552Z_evening" {
|
||||
t.Fatalf("idempotencyKey = %q, want batch retry key", idempotencyKey)
|
||||
}
|
||||
|
||||
bundleID, err = RenderDistributorBatchBundleID("weatherreporter.{batch_started_date}.{batch}", values)
|
||||
if err != nil {
|
||||
t.Fatalf("RenderDistributorBatchBundleID() with date error = %v", err)
|
||||
}
|
||||
if bundleID != "weatherreporter.2026-06-17.evening" {
|
||||
t.Fatalf("bundleID = %q, want date-aware batch bundle ID", bundleID)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDistributorBatchTemplateRejectsUnknownAndMalformedVariables(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
template string
|
||||
}{
|
||||
{name: "Unknown", template: "{report_id}"},
|
||||
{name: "Unclosed", template: "{batch"},
|
||||
{name: "Unopened", template: "batch}"},
|
||||
{name: "Empty", template: "{}"},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
_, err := RenderDistributorBatchBundleID(tt.template, DistributorBatchTemplateValues{})
|
||||
if err == nil {
|
||||
t.Fatal("RenderDistributorBatchBundleID() error = nil, want error")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDistributorTemplateRejectsUnknownAndMalformedVariables(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
|
||||
Reference in New Issue
Block a user