Updated defaults to upload only the current generated report path

This commit is contained in:
2026-06-09 11:26:50 -05:00
parent 8577fc29e4
commit 195a130124
7 changed files with 9 additions and 14 deletions

View File

@@ -103,7 +103,6 @@ weatherreporter uploads one distributor bundle per generated report after
Markdown report source. Default: Markdown report source. Default:
```yaml ```yaml
- "{valid_start_date}/{artifact_group}/{valid_start_date}-{artifact_group}-{run_id}.md" - "{valid_start_date}/{artifact_group}/{valid_start_date}-{artifact_group}-{run_id}.md"
- "{valid_start_date}/{artifact_group}/latest.md"
``` ```
Supported template variables are `location_id`, `report_id`, `run_id`, Supported template variables are `location_id`, `report_id`, `run_id`,

View File

@@ -147,8 +147,8 @@ attempted report. Notification fields are `notificationStatus`,
Distributor notification is configured with `notify.distributor` and is Distributor notification is configured with `notify.distributor` and is
disabled by default. When enabled, weatherreporter uploads the managed Markdown disabled by default. When enabled, weatherreporter uploads the managed Markdown
report path recorded in the report result and metadata. That single source file report path recorded in the report result and metadata. That single source file
can be mapped to multiple configured bundle paths, such as a dated archival path can be mapped to one or more configured bundle paths. By default, it is mapped
and a `latest.md` path. Extra copies written by `--out` or `--out-dir` are to one dated report path. Extra copies written by `--out` or `--out-dir` are
operator conveniences only. operator conveniences only.
The rendered pipeline ID selects the configured distributor `http_upload` The rendered pipeline ID selects the configured distributor `http_upload`
@@ -160,9 +160,9 @@ weatherreporter.{location_id}.{report_id}
``` ```
The default idempotency key appends RunID to the rendered bundle ID so each The default idempotency key appends RunID to the rendered bundle ID so each
report generation has a distinct retry identity. Default bundle paths use the report generation has a distinct retry identity. The default bundle path uses
valid-period start date, artifact group, and RunID, and also publish the valid-period start date, artifact group, and RunID. Distributor owns
`latest.md` under the same dated artifact-group directory. destination merge, retention, and derived snapshot behavior such as `latest`.
Notification happens after final metadata save. Weather API, briefing, Notification happens after final metadata save. Weather API, briefing,
data-package, render preflight, Scriptorium run, and metadata-save failures do data-package, render preflight, Scriptorium run, and metadata-save failures do

View File

@@ -26,7 +26,6 @@ notify:
idempotency_key_template: "{bundle_id}.{run_id}" idempotency_key_template: "{bundle_id}.{run_id}"
report_path_templates: report_path_templates:
- "{valid_start_date}/{artifact_group}/{valid_start_date}-{artifact_group}-{run_id}.md" - "{valid_start_date}/{artifact_group}/{valid_start_date}-{artifact_group}-{run_id}.md"
- "{valid_start_date}/{artifact_group}/latest.md"
missing_source: missing_source:
default: warn default: warn

View File

@@ -337,7 +337,6 @@ func TestGenerateReportNotifiesManagedReportPath(t *testing.T) {
} }
wantBundlePaths := []string{ wantBundlePaths := []string{
"2026-05-29/daily/2026-05-29-daily-" + result.Metadata.RunID + ".md", "2026-05-29/daily/2026-05-29-daily-" + result.Metadata.RunID + ".md",
"2026-05-29/daily/latest.md",
} }
if notificationArtifact.PipelineID != "weatherreporter.daily" || strings.Join(notificationArtifact.BundlePaths, "\n") != strings.Join(wantBundlePaths, "\n") || notificationArtifact.BundleCreated.IsZero() || notificationArtifact.RunStatus == nil || !strings.Contains(string(notificationArtifact.RunStatus.Report), "replace_older") { if notificationArtifact.PipelineID != "weatherreporter.daily" || strings.Join(notificationArtifact.BundlePaths, "\n") != strings.Join(wantBundlePaths, "\n") || notificationArtifact.BundleCreated.IsZero() || notificationArtifact.RunStatus == nil || !strings.Contains(string(notificationArtifact.RunStatus.Report), "replace_older") {
t.Fatalf("notification artifact = %#v, want requested pipeline, status report, and created timestamp", notificationArtifact) t.Fatalf("notification artifact = %#v, want requested pipeline, status report, and created timestamp", notificationArtifact)

View File

@@ -55,7 +55,6 @@ func TestDefaults(t *testing.T) {
} }
wantReportPaths := []string{ wantReportPaths := []string{
"{valid_start_date}/{artifact_group}/{valid_start_date}-{artifact_group}-{run_id}.md", "{valid_start_date}/{artifact_group}/{valid_start_date}-{artifact_group}-{run_id}.md",
"{valid_start_date}/{artifact_group}/latest.md",
} }
if strings.Join(cfg.Notify.Distributor.ReportPathTemplates, "\n") != strings.Join(wantReportPaths, "\n") { 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) t.Fatalf("Notify.Distributor.ReportPathTemplates = %#v, want %#v", cfg.Notify.Distributor.ReportPathTemplates, wantReportPaths)
@@ -86,8 +85,8 @@ func TestLoadExampleConfig(t *testing.T) {
if cfg.Notify.Distributor.PipelineIDTemplate != "weatherreporter.{artifact_group}" { if cfg.Notify.Distributor.PipelineIDTemplate != "weatherreporter.{artifact_group}" {
t.Fatalf("PipelineIDTemplate = %q, want example pipeline template", cfg.Notify.Distributor.PipelineIDTemplate) t.Fatalf("PipelineIDTemplate = %q, want example pipeline template", cfg.Notify.Distributor.PipelineIDTemplate)
} }
if len(cfg.Notify.Distributor.ReportPathTemplates) != 2 { if len(cfg.Notify.Distributor.ReportPathTemplates) != 1 {
t.Fatalf("ReportPathTemplates = %#v, want example archive and latest paths", cfg.Notify.Distributor.ReportPathTemplates) t.Fatalf("ReportPathTemplates = %#v, want example archive path", cfg.Notify.Distributor.ReportPathTemplates)
} }
} }

View File

@@ -33,7 +33,6 @@ func Defaults() Config {
IdempotencyKeyTemplate: "{bundle_id}.{run_id}", IdempotencyKeyTemplate: "{bundle_id}.{run_id}",
ReportPathTemplates: []string{ ReportPathTemplates: []string{
"{valid_start_date}/{artifact_group}/{valid_start_date}-{artifact_group}-{run_id}.md", "{valid_start_date}/{artifact_group}/{valid_start_date}-{artifact_group}-{run_id}.md",
"{valid_start_date}/{artifact_group}/latest.md",
}, },
}, },
}, },

View File

@@ -69,7 +69,7 @@ func TestSaveArtifactsAndMetadataRoundTrip(t *testing.T) {
BundleID: "weatherreporter.home.daily.run", BundleID: "weatherreporter.home.daily.run",
IdempotencyKey: "weatherreporter.home.daily.run", IdempotencyKey: "weatherreporter.home.daily.run",
SourcePath: "/tmp/report.md", SourcePath: "/tmp/report.md",
BundlePaths: []string{"2026-05-29/daily/report.md", "2026-05-29/daily/latest.md"}, BundlePaths: []string{"2026-05-29/daily/report.md"},
BundleCreated: resolved.GeneratedAt, BundleCreated: resolved.GeneratedAt,
Status: "succeeded", Status: "succeeded",
RunStatus: &DistributorRunStatus{RunID: "distributor-run", Status: "succeeded"}, RunStatus: &DistributorRunStatus{RunID: "distributor-run", Status: "succeeded"},
@@ -103,7 +103,7 @@ func TestSaveArtifactsAndMetadataRoundTrip(t *testing.T) {
if err := json.Unmarshal(notificationData, &notification); err != nil { if err := json.Unmarshal(notificationData, &notification); err != nil {
t.Fatalf("decode notification: %v", err) t.Fatalf("decode notification: %v", err)
} }
if notification.SchemaVersion != DistributorNotificationSchemaVersion || notification.PipelineID != "weatherreporter.daily" || len(notification.BundlePaths) != 2 || notification.RunStatus == nil || notification.RunStatus.Status != "succeeded" { if notification.SchemaVersion != DistributorNotificationSchemaVersion || notification.PipelineID != "weatherreporter.daily" || len(notification.BundlePaths) != 1 || notification.RunStatus == nil || notification.RunStatus.Status != "succeeded" {
t.Fatalf("notification = %#v, want persisted distributor status", notification) t.Fatalf("notification = %#v, want persisted distributor status", notification)
} }
paths, err := store.Paths(resolved) paths, err := store.Paths(resolved)