dbState sdlgoredis.DbState
}
-func setupHcMockMasterDb(ip, port string) {
+func setupHcMockPrimaryDb(ip, port string, nodes int) {
hcMocks = new(healthCheckMocks)
- hcMocks.dbState.MasterDbState.Fields.Role = "master"
- hcMocks.dbState.MasterDbState.Fields.Ip = ip
- hcMocks.dbState.MasterDbState.Fields.Port = port
- hcMocks.dbState.MasterDbState.Fields.Flags = "master"
+ hcMocks.dbState.ConfigNodeCnt = nodes
+ hcMocks.dbState.PrimaryDbState.Fields.Role = "master"
+ hcMocks.dbState.PrimaryDbState.Fields.Ip = ip
+ hcMocks.dbState.PrimaryDbState.Fields.Port = port
+ hcMocks.dbState.PrimaryDbState.Fields.Flags = "master"
+ hcMocks.dbState.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
+ hcMocks.dbState.ReplicasDbState.States = []*sdlgoredis.ReplicaDbState{}
+ hcMocks.dbState.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
+ hcMocks.dbState.SentinelsDbState.States = []*sdlgoredis.SentinelDbState{}
}
-func setupHcMockReplicaDb(ip, port string) {
+func setupHcMockReplicaDb(nodes int) {
hcMocks = new(healthCheckMocks)
+ hcMocks.dbState.ConfigNodeCnt = nodes
hcMocks.dbState.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
- hcMocks.dbState.ReplicasDbState.States = []*sdlgoredis.ReplicaDbState{
- &sdlgoredis.ReplicaDbState{
- Fields: sdlgoredis.ReplicaDbStateFields{
- Role: "slave",
- },
- },
- }
+ hcMocks.dbState.ReplicasDbState.States = []*sdlgoredis.ReplicaDbState{}
+ hcMocks.dbState.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
+ hcMocks.dbState.SentinelsDbState.States = []*sdlgoredis.SentinelDbState{}
}
-func setupHcMockSentinelDb(ip, port string) {
+func setupHcMockSentinelDb(ip, port string, nodes int) {
hcMocks = new(healthCheckMocks)
+ hcMocks.dbState.ConfigNodeCnt = nodes
hcMocks.dbState.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
- hcMocks.dbState.SentinelsDbState.States = []*sdlgoredis.SentinelDbState{
- &sdlgoredis.SentinelDbState{
- Fields: sdlgoredis.SentinelDbStateFields{
- Ip: ip,
- Port: port,
- },
- },
- }
+ hcMocks.dbState.SentinelsDbState.States = []*sdlgoredis.SentinelDbState{}
}
-func addHcMockReplicaDbState(ip, port, masterLinkOk string) {
+func addHcMockReplicaDbState(ip, port, primaryLinkOk string) {
if hcMocks.dbState.ReplicasDbState == nil {
hcMocks.dbState.ReplicasDbState = new(sdlgoredis.ReplicasDbState)
}
hcMocks.dbState.ReplicasDbState.States = append(hcMocks.dbState.ReplicasDbState.States,
&sdlgoredis.ReplicaDbState{
Fields: sdlgoredis.ReplicaDbStateFields{
- Role: "slave",
- Ip: ip,
- Port: port,
- MasterLinkStatus: masterLinkOk,
- Flags: "slave",
+ Role: "slave",
+ Ip: ip,
+ Port: port,
+ PrimaryLinkStatus: primaryLinkOk,
+ Flags: "slave",
},
},
)
func runHcCli() (string, error) {
buf := new(bytes.Buffer)
- cmd := cli.NewHealthCheckCmdForTest(newMockDatabase)
+ cmd := cli.NewHealthCheckCmd(newMockDatabase)
cmd.SetOut(buf)
err := cmd.Execute()
var expOkErr error
expHelp := "Usage:\n " + "healthcheck [flags]"
expNokErr := errors.New("unknown flag: --some-unknown-flag")
+ expArgCntErr := errors.New("accepts 0 arg(s), received 1")
tests := []struct {
args string
expErr error
{args: "-h", expErr: expOkErr, expOutput: expHelp},
{args: "--help", expErr: expOkErr, expOutput: expHelp},
{args: "--some-unknown-flag", expErr: expNokErr, expOutput: expHelp},
+ {args: "some-extra-argument", expErr: expArgCntErr, expOutput: expHelp},
}
for _, test := range tests {
buf := new(bytes.Buffer)
- cmd := cli.NewHealthCheckCmd()
+ cmd := cli.NewHealthCheckCmd(newMockDatabase)
cmd.SetOut(buf)
cmd.SetArgs([]string{test.args})
}
func TestCliHealthCheckCanShowHaDeploymentOkStatusCorrectly(t *testing.T) {
- setupHcMockMasterDb("10.20.30.40", "6379")
+ expOut :=
+ "Overall status: OK\n\n" +
+ "CLUSTER ROLE ADDRESS STATUS ERROR \n" +
+ "0 primary 10.20.30.40:6379 OK <none> \n" +
+ "0 replica 1.2.3.4:6379 OK <none> \n" +
+ "0 replica 5.6.7.8:6379 OK <none> \n"
+ setupHcMockPrimaryDb("10.20.30.40", "6379", 3)
addHcMockReplicaDbState("1.2.3.4", "6379", "ok")
addHcMockReplicaDbState("5.6.7.8", "6379", "ok")
addHcMockSentinelDbState("1.2.3.4", "26379", "sentinel")
stdout, err := runHcCli()
assert.Nil(t, err)
- assert.Contains(t, stdout, "Overall status: OK")
- assert.Contains(t, stdout, "Master (10.20.30.40:6379): OK")
- assert.Contains(t, stdout, "Replica #1 (1.2.3.4:6379): OK")
- assert.Contains(t, stdout, "Replica #2 (5.6.7.8:6379): OK")
-
+ assert.Equal(t, expOut, stdout)
}
func TestCliHealthCheckCanShowHaDeploymentStatusCorrectlyWhenOneReplicaStateNotUp(t *testing.T) {
- setupHcMockMasterDb("10.20.30.40", "6379")
+ expOut :=
+ "Overall status: NOK\n\n" +
+ "CLUSTER ROLE ADDRESS STATUS ERROR \n" +
+ "0 primary 10.20.30.40:6379 OK <none> \n" +
+ "0 replica 1.2.3.4:6379 OK <none> \n" +
+ "0 replica 5.6.7.8:6379 NOK Replica link to the primary is down \n"
+ setupHcMockPrimaryDb("10.20.30.40", "6379", 3)
addHcMockReplicaDbState("1.2.3.4", "6379", "ok")
addHcMockReplicaDbState("5.6.7.8", "6379", "nok")
addHcMockSentinelDbState("1.2.3.4", "26379", "sentinel")
stdout, err := runHcCli()
assert.Nil(t, err)
- assert.Contains(t, stdout, "Overall status: NOK")
- assert.Contains(t, stdout, "Replica #2 (5.6.7.8:6379): NOK")
- assert.Contains(t, stdout, "Replica link to the master is down")
+ assert.Equal(t, expOut, stdout)
}
func TestCliHealthCheckCanShowHaDeploymentStatusCorrectlyWhenOneSentinelStateNotUp(t *testing.T) {
- setupHcMockMasterDb("10.20.30.40", "6379")
+ expOut :=
+ "Overall status: NOK\n\n" +
+ "CLUSTER ROLE ADDRESS STATUS ERROR \n" +
+ "0 primary 10.20.30.40:6379 OK <none> \n" +
+ "0 replica 1.2.3.4:6379 OK <none> \n" +
+ "0 replica 5.6.7.8:6379 OK <none> \n" +
+ "0 sentinel 1.2.3.4:26379 NOK Sentinel flags are 'some-failure', expected 'sentinel' \n"
+ setupHcMockPrimaryDb("10.20.30.40", "6379", 3)
addHcMockReplicaDbState("1.2.3.4", "6379", "ok")
addHcMockReplicaDbState("5.6.7.8", "6379", "ok")
addHcMockSentinelDbState("1.2.3.4", "26379", "some-failure")
stdout, err := runHcCli()
assert.Nil(t, err)
- assert.Contains(t, stdout, "Overall status: NOK")
- assert.Contains(t, stdout, "Replica #1 (1.2.3.4:6379): OK")
- assert.Contains(t, stdout, "Replica #2 (5.6.7.8:6379): OK")
- assert.Contains(t, stdout, "Sentinel #1 (1.2.3.4:26379): NOK")
- assert.Contains(t, stdout, "Sentinel flags are 'some-failure', expected 'sentinel'")
+ assert.Equal(t, expOut, stdout)
+}
+
+func TestCliHealthCheckCanShowHaDeploymentStatusCorrectlyWhenNoReplicas(t *testing.T) {
+ expOut :=
+ "Overall status: NOK\n\n" +
+ "CLUSTER ROLE ADDRESS STATUS ERROR \n" +
+ "0 primary 10.20.30.40:6379 OK <none> \n" +
+ "0 replica <none> NOK Configured DBAAS nodes 3 but only 1 primary and 0 replicas \n"
+ setupHcMockPrimaryDb("10.20.30.40", "6379", 3)
+ addHcMockSentinelDbState("1.2.3.4", "26379", "sentinel")
+ addHcMockSentinelDbState("5.6.7.8", "26379", "sentinel")
+
+ stdout, err := runHcCli()
+
+ assert.Nil(t, err)
+ assert.Equal(t, expOut, stdout)
}
func TestCliHealthCheckCanShowHaDeploymentStatusCorrectlyWhenDbStateQueryFails(t *testing.T) {
- setupHcMockMasterDb("10.20.30.40", "6379")
+ setupHcMockPrimaryDb("10.20.30.40", "6379", 3)
hcMocks.dbErr = errors.New("Some error")
- expCliErr := errors.New("SDL CLI error: Some error")
buf := new(bytes.Buffer)
- cmd := cli.NewHealthCheckCmdForTest(newMockDatabase)
+ cmd := cli.NewHealthCheckCmd(newMockDatabase)
cmd.SetErr(buf)
err := cmd.Execute()
stderr := buf.String()
- assert.Equal(t, expCliErr, err)
- assert.Contains(t, stderr, "Error: "+expCliErr.Error())
+ assert.Equal(t, hcMocks.dbErr, err)
+ assert.Contains(t, stderr, "Error: Some error")
}
func TestCliHealthCheckCanShowHaDeploymentOkStatusCorrectlyWhenDbStateIsFromReplicaOnly(t *testing.T) {
- setupHcMockReplicaDb("1.2.3.4", "6379")
+ expOut :=
+ "Overall status: NOK\n\n" +
+ "CLUSTER ROLE ADDRESS STATUS ERROR \n" +
+ "0 primary <none> NOK No primary DB, current role '' \n" +
+ "0 replica 1.2.3.4:6379 NOK Replica link to the primary is down \n" +
+ "0 replica 5.6.7.8:6379 NOK Replica link to the primary is down \n"
+ setupHcMockReplicaDb(3)
+ addHcMockReplicaDbState("1.2.3.4", "6379", "nok")
+ addHcMockReplicaDbState("5.6.7.8", "6379", "nok")
stdout, err := runHcCli()
assert.Nil(t, err)
- assert.Contains(t, stdout, "Overall status: NOK")
- assert.Contains(t, stdout, "Master (): NOK")
+ assert.Equal(t, expOut, stdout)
}
func TestCliHealthCheckCanShowHaDeploymentOkStatusCorrectlyWhenDbStateIsFromSentinelOnly(t *testing.T) {
- setupHcMockSentinelDb("1.2.3.4", "26379")
+ expOut :=
+ "Overall status: NOK\n\n" +
+ "CLUSTER ROLE ADDRESS STATUS ERROR \n" +
+ "0 primary <none> NOK No primary DB, current role '' \n"
+ setupHcMockSentinelDb("1.2.3.4", "26379", 3)
stdout, err := runHcCli()
assert.Nil(t, err)
- assert.Contains(t, stdout, "Overall status: NOK")
- assert.Contains(t, stdout, "Master (): NOK")
+ assert.Equal(t, expOut, stdout)
}
func TestCliHealthCheckCanShowStandaloneDeploymentOkStatusCorrectly(t *testing.T) {
- setupHcMockMasterDb("10.20.30.40", "6379")
+ expOut :=
+ "Overall status: OK\n\n" +
+ "CLUSTER ROLE ADDRESS STATUS ERROR \n" +
+ "0 primary 10.20.30.40:6379 OK <none> \n"
+ setupHcMockPrimaryDb("10.20.30.40", "6379", 1)
stdout, err := runHcCli()
assert.Nil(t, err)
- assert.Contains(t, stdout, "Overall status: OK")
- assert.Contains(t, stdout, "Master (10.20.30.40:6379): OK")
+ assert.Equal(t, expOut, stdout)
}