Go version changed
[ric-plt/sdlgo.git] / internal / cli / healthcheck_test.go
index be98aed..f3cf65f 100644 (file)
@@ -40,38 +40,62 @@ type healthCheckMocks struct {
        dbState sdlgoredis.DbState
 }
 
-func setupHcMockMasterDb(ip, port string, replicas uint32) {
+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() {
+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 addHcMockReplicaDbState(ip, port, masterLinkOk 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{}
+}
+
+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 addHcMockSentinelDbState(ip, port, flags string) {
+       if hcMocks.dbState.SentinelsDbState == nil {
+               hcMocks.dbState.SentinelsDbState = new(sdlgoredis.SentinelsDbState)
+       }
+       hcMocks.dbState.SentinelsDbState.States = append(hcMocks.dbState.SentinelsDbState.States,
+               &sdlgoredis.SentinelDbState{
+                       Fields: sdlgoredis.SentinelDbStateFields{
+                               Ip:    ip,
+                               Port:  port,
+                               Flags: flags,
                        },
                },
        )
@@ -87,7 +111,7 @@ func newMockDatabase() *cli.Database {
 
 func runHcCli() (string, error) {
        buf := new(bytes.Buffer)
-       cmd := cli.NewHealthCheckCmdForTest(newMockDatabase)
+       cmd := cli.NewHealthCheckCmd(newMockDatabase)
        cmd.SetOut(buf)
 
        err := cmd.Execute()
@@ -99,6 +123,7 @@ func TestCliHealthCheckCanShowHelp(t *testing.T) {
        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
@@ -107,11 +132,12 @@ func TestCliHealthCheckCanShowHelp(t *testing.T) {
                {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})
 
@@ -124,65 +150,133 @@ func TestCliHealthCheckCanShowHelp(t *testing.T) {
 }
 
 func TestCliHealthCheckCanShowHaDeploymentOkStatusCorrectly(t *testing.T) {
-       setupHcMockMasterDb("10.20.30.40", "6379", 2)
+       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")
+       addHcMockSentinelDbState("5.6.7.8", "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", 2)
+       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")
+       addHcMockSentinelDbState("5.6.7.8", "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) {
+       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")
+       addHcMockSentinelDbState("5.6.7.8", "26379", "sentinel")
+
+       stdout, err := runHcCli()
+
+       assert.Nil(t, err)
+       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", 0)
+       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) {
+       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.Equal(t, expOut, stdout)
 }
 
-func TestCliHealthCheckCanShowHaDeploymentOkStatusCorrectlyWhenDbStateIsFromReplicaServer(t *testing.T) {
-       setupHcMockReplicaDb()
+func TestCliHealthCheckCanShowHaDeploymentOkStatusCorrectlyWhenDbStateIsFromSentinelOnly(t *testing.T) {
+       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", 0)
+       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)
 }