Skip to content

Commit e390370

Browse files
committed
Fix issue where the presence of --target-timeline was adding --target-action.
Adjust tests and add more test cases.
1 parent b7e320f commit e390370

File tree

2 files changed

+94
-2
lines changed

2 files changed

+94
-2
lines changed

internal/controller/postgrescluster/pgbackrest.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1153,10 +1153,16 @@ func (r *Reconciler) reconcileRestoreJob(ctx context.Context,
11531153
"--pg1-path=" + pgdata,
11541154
"--repo=" + regexRepoIndex.FindString(repoName)}...)
11551155

1156+
// Look specifically for the "--target" flag, NOT flags that contain
1157+
// "--target" (e.g. "--target-timeline")
1158+
targetRegex, err := regexp.Compile("--target[ =]")
1159+
if err != nil {
1160+
return err
1161+
}
11561162
var deltaOptFound, foundTarget bool
11571163
for _, opt := range opts {
11581164
switch {
1159-
case strings.Contains(opt, "--target"):
1165+
case targetRegex.Match([]byte(opt)):
11601166
foundTarget = true
11611167
case strings.Contains(opt, "--delta"):
11621168
deltaOptFound = true

internal/controller/postgrescluster/pgbackrest_test.go

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1777,6 +1777,9 @@ func TestReconcilePostgresClusterDataSource(t *testing.T) {
17771777
configCount, jobCount, pvcCount int
17781778
invalidSourceRepo, invalidSourceCluster, invalidOptions bool
17791779
expectedClusterCondition *metav1.Condition
1780+
expectedEventMessage string
1781+
expectedCommandPieces []string
1782+
missingCommandPieces []string
17801783
}
17811784

17821785
for _, dedicated := range []bool{true, false} {
@@ -1799,6 +1802,8 @@ func TestReconcilePostgresClusterDataSource(t *testing.T) {
17991802
configCount: 1, jobCount: 1, pvcCount: 1,
18001803
invalidSourceRepo: false, invalidSourceCluster: false, invalidOptions: false,
18011804
expectedClusterCondition: nil,
1805+
expectedCommandPieces: []string{"--stanza=", "--pg1-path=", "--repo=", "--delta"},
1806+
missingCommandPieces: []string{"--target-action"},
18021807
},
18031808
}, {
18041809
desc: "invalid source cluster",
@@ -1812,6 +1817,7 @@ func TestReconcilePostgresClusterDataSource(t *testing.T) {
18121817
configCount: 0, jobCount: 0, pvcCount: 0,
18131818
invalidSourceRepo: false, invalidSourceCluster: true, invalidOptions: false,
18141819
expectedClusterCondition: nil,
1820+
expectedEventMessage: "does not exist",
18151821
},
18161822
}, {
18171823
desc: "invalid source repo",
@@ -1825,6 +1831,7 @@ func TestReconcilePostgresClusterDataSource(t *testing.T) {
18251831
configCount: 1, jobCount: 0, pvcCount: 0,
18261832
invalidSourceRepo: true, invalidSourceCluster: false, invalidOptions: false,
18271833
expectedClusterCondition: nil,
1834+
expectedEventMessage: "does not have a repo named",
18281835
},
18291836
}, {
18301837
desc: "invalid option: --repo=",
@@ -1839,6 +1846,7 @@ func TestReconcilePostgresClusterDataSource(t *testing.T) {
18391846
configCount: 1, jobCount: 0, pvcCount: 1,
18401847
invalidSourceRepo: false, invalidSourceCluster: false, invalidOptions: true,
18411848
expectedClusterCondition: nil,
1849+
expectedEventMessage: "Option '--repo' is not allowed: please use the 'repoName' field instead.",
18421850
},
18431851
}, {
18441852
desc: "invalid option: --repo ",
@@ -1853,6 +1861,7 @@ func TestReconcilePostgresClusterDataSource(t *testing.T) {
18531861
configCount: 1, jobCount: 0, pvcCount: 1,
18541862
invalidSourceRepo: false, invalidSourceCluster: false, invalidOptions: true,
18551863
expectedClusterCondition: nil,
1864+
expectedEventMessage: "Option '--repo' is not allowed: please use the 'repoName' field instead.",
18561865
},
18571866
}, {
18581867
desc: "invalid option: stanza",
@@ -1867,6 +1876,7 @@ func TestReconcilePostgresClusterDataSource(t *testing.T) {
18671876
configCount: 1, jobCount: 0, pvcCount: 1,
18681877
invalidSourceRepo: false, invalidSourceCluster: false, invalidOptions: true,
18691878
expectedClusterCondition: nil,
1879+
expectedEventMessage: "Option '--stanza' is not allowed: the operator will automatically set this option",
18701880
},
18711881
}, {
18721882
desc: "invalid option: pg1-path",
@@ -1881,6 +1891,68 @@ func TestReconcilePostgresClusterDataSource(t *testing.T) {
18811891
configCount: 1, jobCount: 0, pvcCount: 1,
18821892
invalidSourceRepo: false, invalidSourceCluster: false, invalidOptions: true,
18831893
expectedClusterCondition: nil,
1894+
expectedEventMessage: "Option '--pg1-path' is not allowed: the operator will automatically set this option",
1895+
},
1896+
}, {
1897+
desc: "invalid option: target-action",
1898+
dataSource: &v1beta1.DataSource{PostgresCluster: &v1beta1.PostgresClusterDataSource{
1899+
ClusterName: "invalid-target-action-option", RepoName: "repo1",
1900+
Options: []string{"--target-action"},
1901+
}},
1902+
clusterBootstrapped: false,
1903+
sourceClusterName: "invalid-target-action-option",
1904+
sourceClusterRepos: []v1beta1.PGBackRestRepo{{Name: "repo1"}},
1905+
result: testResult{
1906+
configCount: 1, jobCount: 0, pvcCount: 1,
1907+
invalidSourceRepo: false, invalidSourceCluster: false, invalidOptions: true,
1908+
expectedClusterCondition: nil,
1909+
expectedEventMessage: "Option '--target-action' is not allowed: the operator will automatically set this option",
1910+
},
1911+
}, {
1912+
desc: "invalid option: link-map",
1913+
dataSource: &v1beta1.DataSource{PostgresCluster: &v1beta1.PostgresClusterDataSource{
1914+
ClusterName: "invalid-link-map-option", RepoName: "repo1",
1915+
Options: []string{"--link-map"},
1916+
}},
1917+
clusterBootstrapped: false,
1918+
sourceClusterName: "invalid-link-map-option",
1919+
sourceClusterRepos: []v1beta1.PGBackRestRepo{{Name: "repo1"}},
1920+
result: testResult{
1921+
configCount: 1, jobCount: 0, pvcCount: 1,
1922+
invalidSourceRepo: false, invalidSourceCluster: false, invalidOptions: true,
1923+
expectedClusterCondition: nil,
1924+
expectedEventMessage: "Option '--link-map' is not allowed: the operator will automatically set this option",
1925+
},
1926+
}, {
1927+
desc: "valid option: target-timeline",
1928+
dataSource: &v1beta1.DataSource{PostgresCluster: &v1beta1.PostgresClusterDataSource{
1929+
ClusterName: "valid-target-timeline-option", RepoName: "repo1",
1930+
Options: []string{"--target-timeline=1"},
1931+
}},
1932+
clusterBootstrapped: false,
1933+
sourceClusterName: "valid-target-timeline-option",
1934+
sourceClusterRepos: []v1beta1.PGBackRestRepo{{Name: "repo1"}},
1935+
result: testResult{
1936+
configCount: 1, jobCount: 1, pvcCount: 1,
1937+
invalidSourceRepo: false, invalidSourceCluster: false, invalidOptions: false,
1938+
expectedClusterCondition: nil,
1939+
expectedCommandPieces: []string{"--stanza=", "--pg1-path=", "--repo=", "--delta", "--target-timeline=1"},
1940+
missingCommandPieces: []string{"--target=", "--target-action=promote"},
1941+
},
1942+
}, {
1943+
desc: "valid option: target",
1944+
dataSource: &v1beta1.DataSource{PostgresCluster: &v1beta1.PostgresClusterDataSource{
1945+
ClusterName: "valid-target-option", RepoName: "repo1",
1946+
Options: []string{"--target=some-date"},
1947+
}},
1948+
clusterBootstrapped: false,
1949+
sourceClusterName: "valid-target-option",
1950+
sourceClusterRepos: []v1beta1.PGBackRestRepo{{Name: "repo1"}},
1951+
result: testResult{
1952+
configCount: 1, jobCount: 1, pvcCount: 1,
1953+
invalidSourceRepo: false, invalidSourceCluster: false, invalidOptions: false,
1954+
expectedClusterCondition: nil,
1955+
expectedCommandPieces: []string{"--stanza=", "--pg1-path=", "--repo=", "--delta", "--target=some-date", "--target-action=promote"},
18841956
},
18851957
}, {
18861958
desc: "cluster bootstrapped init condition missing",
@@ -2003,6 +2075,16 @@ func TestReconcilePostgresClusterDataSource(t *testing.T) {
20032075
if len(restoreJobs.Items) == 1 {
20042076
assert.Assert(t, restoreJobs.Items[0].Labels[naming.LabelStartupInstance] != "")
20052077
assert.Assert(t, restoreJobs.Items[0].Annotations[naming.PGBackRestConfigHash] != "")
2078+
for _, cmd := range tc.result.expectedCommandPieces {
2079+
assert.Assert(t, cmp.Contains(
2080+
strings.Join(restoreJobs.Items[0].Spec.Template.Spec.Containers[0].Command, " "),
2081+
cmd))
2082+
}
2083+
for _, cmd := range tc.result.missingCommandPieces {
2084+
assert.Assert(t, !strings.Contains(
2085+
strings.Join(restoreJobs.Items[0].Spec.Template.Spec.Containers[0].Command, " "),
2086+
cmd))
2087+
}
20062088
}
20072089

20082090
dataPVCs := &corev1.PersistentVolumeClaimList{}
@@ -2040,7 +2122,11 @@ func TestReconcilePostgresClusterDataSource(t *testing.T) {
20402122
"involvedObject.namespace": namespace,
20412123
"reason": "InvalidDataSource",
20422124
})
2043-
return len(events.Items) == 1, err
2125+
eventExists := len(events.Items) > 0
2126+
if eventExists {
2127+
assert.Assert(t, cmp.Contains(events.Items[0].Message, tc.result.expectedEventMessage))
2128+
}
2129+
return eventExists, err
20442130
}))
20452131
}
20462132
})

0 commit comments

Comments
 (0)