@@ -36,30 +36,42 @@ func TestGetSwitchoverCandidate(t *testing.T) {
3636 tests := []struct {
3737 subtest string
3838 clusterJson string
39+ syncModeEnabled bool
3940 expectedCandidate spec.NamespacedName
4041 expectedError error
4142 }{
4243 {
4344 subtest : "choose sync_standby over replica" ,
4445 clusterJson : `{"members": [{"name": "acid-test-cluster-0", "role": "leader", "state": "running", "api_url": "http://192.168.100.1:8008/patroni", "host": "192.168.100.1", "port": 5432, "timeline": 1}, {"name": "acid-test-cluster-1", "role": "sync_standby", "state": "running", "api_url": "http://192.168.100.2:8008/patroni", "host": "192.168.100.2", "port": 5432, "timeline": 1, "lag": 0}, {"name": "acid-test-cluster-2", "role": "replica", "state": "running", "api_url": "http://192.168.100.3:8008/patroni", "host": "192.168.100.3", "port": 5432, "timeline": 1, "lag": 0}]}` ,
46+ syncModeEnabled : true ,
4547 expectedCandidate : spec.NamespacedName {Namespace : namespace , Name : "acid-test-cluster-1" },
4648 expectedError : nil ,
4749 },
50+ {
51+ subtest : "no running sync_standby available" ,
52+ clusterJson : `{"members": [{"name": "acid-test-cluster-0", "role": "leader", "state": "running", "api_url": "http://192.168.100.1:8008/patroni", "host": "192.168.100.1", "port": 5432, "timeline": 1}, {"name": "acid-test-cluster-1", "role": "replica", "state": "running", "api_url": "http://192.168.100.2:8008/patroni", "host": "192.168.100.2", "port": 5432, "timeline": 1, "lag": 0}]}` ,
53+ syncModeEnabled : true ,
54+ expectedCandidate : spec.NamespacedName {},
55+ expectedError : fmt .Errorf ("failed to get Patroni cluster members: unexpected end of JSON input" ),
56+ },
4857 {
4958 subtest : "choose replica with lowest lag" ,
5059 clusterJson : `{"members": [{"name": "acid-test-cluster-0", "role": "leader", "state": "running", "api_url": "http://192.168.100.1:8008/patroni", "host": "192.168.100.1", "port": 5432, "timeline": 1}, {"name": "acid-test-cluster-1", "role": "replica", "state": "running", "api_url": "http://192.168.100.2:8008/patroni", "host": "192.168.100.2", "port": 5432, "timeline": 1, "lag": 5}, {"name": "acid-test-cluster-2", "role": "replica", "state": "running", "api_url": "http://192.168.100.3:8008/patroni", "host": "192.168.100.3", "port": 5432, "timeline": 1, "lag": 2}]}` ,
60+ syncModeEnabled : false ,
5161 expectedCandidate : spec.NamespacedName {Namespace : namespace , Name : "acid-test-cluster-2" },
5262 expectedError : nil ,
5363 },
5464 {
5565 subtest : "choose first replica when lag is equal evrywhere" ,
5666 clusterJson : `{"members": [{"name": "acid-test-cluster-0", "role": "leader", "state": "running", "api_url": "http://192.168.100.1:8008/patroni", "host": "192.168.100.1", "port": 5432, "timeline": 1}, {"name": "acid-test-cluster-1", "role": "replica", "state": "running", "api_url": "http://192.168.100.2:8008/patroni", "host": "192.168.100.2", "port": 5432, "timeline": 1, "lag": 5}, {"name": "acid-test-cluster-2", "role": "replica", "state": "running", "api_url": "http://192.168.100.3:8008/patroni", "host": "192.168.100.3", "port": 5432, "timeline": 1, "lag": 5}]}` ,
67+ syncModeEnabled : false ,
5768 expectedCandidate : spec.NamespacedName {Namespace : namespace , Name : "acid-test-cluster-1" },
5869 expectedError : nil ,
5970 },
6071 {
6172 subtest : "no running replica available" ,
6273 clusterJson : `{"members": [{"name": "acid-test-cluster-0", "role": "leader", "state": "running", "api_url": "http://192.168.100.1:8008/patroni", "host": "192.168.100.1", "port": 5432, "timeline": 2}, {"name": "acid-test-cluster-1", "role": "replica", "state": "starting", "api_url": "http://192.168.100.2:8008/patroni", "host": "192.168.100.2", "port": 5432, "timeline": 2}]}` ,
74+ syncModeEnabled : false ,
6375 expectedCandidate : spec.NamespacedName {},
6476 expectedError : fmt .Errorf ("no switchover candidate found" ),
6577 },
@@ -81,6 +93,7 @@ func TestGetSwitchoverCandidate(t *testing.T) {
8193 cluster .patroni = p
8294 mockMasterPod := newMockPod ("192.168.100.1" )
8395 mockMasterPod .Namespace = namespace
96+ cluster .Spec .Patroni .SynchronousMode = tt .syncModeEnabled
8497
8598 candidate , err := cluster .getSwitchoverCandidate (mockMasterPod )
8699 if err != nil && err .Error () != tt .expectedError .Error () {
0 commit comments