Skip to content

Commit 34bcf7f

Browse files
fix: add timestamp to proposal name (#319)
As raised by [Gustavo](https://chainlink-core.slack.com/archives/C08QF1BEW4T/p1756192076197519), this changed was missed when migrating from CLD to CLDF, adding it back. - added code back - extended the tests to cover the new use case.
1 parent 462346d commit 34bcf7f

File tree

3 files changed

+104
-31
lines changed

3 files changed

+104
-31
lines changed

.changeset/fine-jars-decide.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"chainlink-deployments-framework": patch
3+
---
4+
5+
add prefix to proposal if timestamp is available

engine/cld/domain/artifacts.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,13 +676,19 @@ func (a *ArtifactsDir) saveArtifact(k ksuid.KSUID, migKey, name string, v any) e
676676
// saveProposalArtifact writes a proposal artifact as JSON to the specified migration directory.
677677
func (a *ArtifactsDir) saveProposalArtifact(migkey string, name string, index int, v any) error {
678678
filename := fmt.Sprintf("%s-%s-%s_%s_%d.%s", a.DomainKey(), a.EnvKey(), migkey, name, index, JSONExt)
679+
if a.timestamp != "" {
680+
filename = fmt.Sprintf("%s-%s", a.timestamp, filename)
681+
}
679682

680683
return jsonutils.WriteFile(filepath.Join(a.getProposalDir(), filename), v)
681684
}
682685

683686
// saveDecodedProposalArtifact writes a decoded proposal artifact as JSON to the specified migration directory.
684687
func (a *ArtifactsDir) saveDecodedProposalArtifact(migkey string, name string, index int, data string) error {
685688
filename := fmt.Sprintf("%s-%s-%s_%s_%d_decoded.%s", a.DomainKey(), a.EnvKey(), migkey, name, index, TxtExt)
689+
if a.timestamp != "" {
690+
filename = fmt.Sprintf("%s-%s", a.timestamp, filename)
691+
}
686692

687693
return os.WriteFile(filepath.Join(a.getDecodedProposalDir(), filename), []byte(data), 0600)
688694
}

engine/cld/domain/artifacts_test.go

Lines changed: 93 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package domain
33
import (
44
"encoding/json"
55
"errors"
6+
"fmt"
67
"os"
78
"path/filepath"
89
"sort"
@@ -1020,10 +1021,6 @@ func Test_Artifacts_SaveAndLoadOperationsReport(t *testing.T) {
10201021
func Test_Artifacts_SaveAndLoadMultipleProposals(t *testing.T) {
10211022
t.Parallel()
10221023

1023-
fixture := setupTestDomainsFS(t)
1024-
migrationKey := "0001_initial"
1025-
artsDir := fixture.artifactsDir
1026-
10271024
validUntilUnixTime := uint32(time.Now().Add(time.Hour).Unix()) //nolint:gosec // This won't overflow until 7 Feb 2106, and would also cause MCMS to fail anyway
10281025

10291026
proposals := []mcmsv2.Proposal{
@@ -1071,38 +1068,103 @@ func Test_Artifacts_SaveAndLoadMultipleProposals(t *testing.T) {
10711068
},
10721069
}
10731070

1074-
// Save multiple proposals
1075-
require.NoError(t, artsDir.CreateMigrationDir(migrationKey))
1076-
for i, proposal := range proposals {
1077-
err := artsDir.saveProposalArtifact(migrationKey, ArtifactMCMSProposal, i, proposal)
1078-
require.NoError(t, err)
1079-
err = artsDir.saveDecodedProposalArtifact(migrationKey, ArtifactMCMSProposal, i, "some decoded proposal")
1080-
require.NoError(t, err)
1071+
tests := []struct {
1072+
name string
1073+
migrationKey string
1074+
setupFunc func(t *testing.T, artsDir *ArtifactsDir)
1075+
expectedFilePrefix string
1076+
isDurablePipelines bool
1077+
}{
1078+
{
1079+
name: "regular migration proposals",
1080+
migrationKey: "0001_initial",
1081+
expectedFilePrefix: "",
1082+
isDurablePipelines: false,
1083+
},
1084+
{
1085+
name: "durable pipelines proposals with timestamp prefix",
1086+
migrationKey: "0001_initial",
1087+
setupFunc: func(t *testing.T, artsDir *ArtifactsDir) {
1088+
t.Helper()
1089+
err := artsDir.SetDurablePipelines("1234567890123456789")
1090+
require.NoError(t, err)
1091+
},
1092+
expectedFilePrefix: "1234567890123456789-",
1093+
isDurablePipelines: true,
1094+
},
10811095
}
10821096

1083-
// Verify proposal files were created with correct indexes
1084-
files, err := os.ReadDir(artsDir.ProposalsDirPath())
1085-
sort.Slice(files, func(i, j int) bool { return files[i].Name() < files[j].Name() })
1086-
require.NoError(t, err)
1087-
assert.Len(t, files, len(proposals))
1097+
for _, tt := range tests {
1098+
t.Run(tt.name, func(t *testing.T) {
1099+
t.Parallel()
10881100

1089-
for i, file := range files {
1090-
assert.Contains(t, file.Name(), migrationKey)
1091-
assert.Contains(t, file.Name(), ArtifactMCMSProposal)
1092-
assert.Contains(t, file.Name(), "_"+strconv.Itoa(i))
1093-
}
1101+
fixture := setupTestDomainsFS(t)
1102+
artsDir := fixture.artifactsDir
10941103

1095-
// Load proposals and verify
1096-
exists, err := artsDir.MigrationDirExists(migrationKey)
1097-
require.NoError(t, err)
1098-
require.True(t, exists)
1099-
loadedProposals, err := artsDir.LoadChangesetOutput(migrationKey)
1100-
require.NoError(t, err)
1101-
assert.Len(t, loadedProposals.MCMSProposals, len(proposals))
1104+
if tt.setupFunc != nil {
1105+
tt.setupFunc(t, artsDir)
1106+
}
1107+
1108+
// Save multiple proposals
1109+
require.NoError(t, artsDir.CreateMigrationDir(tt.migrationKey))
1110+
for i, proposal := range proposals {
1111+
err := artsDir.saveProposalArtifact(tt.migrationKey, ArtifactMCMSProposal, i, proposal)
1112+
require.NoError(t, err)
1113+
err = artsDir.saveDecodedProposalArtifact(tt.migrationKey, ArtifactMCMSProposal, i, "some decoded proposal")
1114+
require.NoError(t, err)
1115+
}
1116+
1117+
// Verify proposal files were created with correct indexes and timestamp prefix
1118+
proposalFiles, err := os.ReadDir(artsDir.ProposalsDirPath())
1119+
require.NoError(t, err)
1120+
sort.Slice(proposalFiles, func(i, j int) bool { return proposalFiles[i].Name() < proposalFiles[j].Name() })
1121+
assert.Len(t, proposalFiles, len(proposals))
1122+
1123+
// Verify decoded proposal files were created
1124+
decodedFiles, err := os.ReadDir(artsDir.DecodedProposalsDirPath())
1125+
require.NoError(t, err)
1126+
sort.Slice(decodedFiles, func(i, j int) bool { return decodedFiles[i].Name() < decodedFiles[j].Name() })
1127+
assert.Len(t, decodedFiles, len(proposals))
1128+
1129+
// Check proposal file naming conventions
1130+
for i, file := range proposalFiles {
1131+
expectedFileName := fmt.Sprintf("%s%s-%s-%s_%s_%d.%s",
1132+
tt.expectedFilePrefix,
1133+
artsDir.DomainKey(),
1134+
artsDir.EnvKey(),
1135+
tt.migrationKey,
1136+
ArtifactMCMSProposal,
1137+
i,
1138+
JSONExt)
1139+
assert.Equal(t, expectedFileName, file.Name())
1140+
}
1141+
1142+
// Check decoded proposal file naming conventions
1143+
for i, file := range decodedFiles {
1144+
expectedFileName := fmt.Sprintf("%s%s-%s-%s_%s_%d_decoded.%s",
1145+
tt.expectedFilePrefix,
1146+
artsDir.DomainKey(),
1147+
artsDir.EnvKey(),
1148+
tt.migrationKey,
1149+
ArtifactMCMSProposal,
1150+
i,
1151+
TxtExt)
1152+
assert.Equal(t, expectedFileName, file.Name())
1153+
}
11021154

1103-
for i, proposal := range loadedProposals.MCMSProposals {
1104-
assert.Equal(t, proposals[i].Version, proposal.Version)
1105-
assert.Equal(t, proposals[i].ValidUntil, proposal.ValidUntil)
1155+
// Load proposals and verify
1156+
exists, err := artsDir.MigrationDirExists(tt.migrationKey)
1157+
require.NoError(t, err)
1158+
require.True(t, exists)
1159+
loadedProposals, err := artsDir.LoadChangesetOutput(tt.migrationKey)
1160+
require.NoError(t, err)
1161+
assert.Len(t, loadedProposals.MCMSProposals, len(proposals))
1162+
1163+
for i, proposal := range loadedProposals.MCMSProposals {
1164+
assert.Equal(t, proposals[i].Version, proposal.Version)
1165+
assert.Equal(t, proposals[i].ValidUntil, proposal.ValidUntil)
1166+
}
1167+
})
11061168
}
11071169
}
11081170

0 commit comments

Comments
 (0)