package sdlgoredis
import (
+ "fmt"
"github.com/go-redis/redis/v7"
+ "strconv"
)
type Sentinel struct {
type IredisSentinelClient interface {
Master(name string) *redis.StringStringMapCmd
Slaves(name string) *redis.SliceCmd
+ Sentinels(name string) *redis.SliceCmd
}
type RedisSentinelCreateCb func(cfg *Config, addr string) *Sentinel
func (s *Sentinel) GetDbState() (*DbState, error) {
state := new(DbState)
- mState, mErr := s.getMasterDbState()
+ pState, pErr := s.getPrimaryDbState()
rState, rErr := s.getReplicasState()
- state.MasterDbState = *mState
+ sState, sErr := s.getSentinelsState()
+ state.PrimaryDbState = *pState
state.ReplicasDbState = rState
- if mErr == nil {
+ state.SentinelsDbState = sState
+
+ cnt, err := strconv.Atoi(s.Cfg.nodeCnt)
+ if err != nil {
+ state.Err = fmt.Errorf("Sentinel DBAAS_NODE_COUNT configuration value '%s' conversion to integer failed", s.Cfg.nodeCnt)
+ return state, state.Err
+ }
+ state.ConfigNodeCnt = cnt
+
+ if pErr != nil {
+ return state, pErr
+ }
+ if rErr != nil {
return state, rErr
}
- return state, mErr
+ return state, sErr
}
-func (s *Sentinel) getMasterDbState() (*MasterDbState, error) {
- state := new(MasterDbState)
+func (s *Sentinel) getPrimaryDbState() (*PrimaryDbState, error) {
+ state := new(PrimaryDbState)
redisVal, redisErr := s.Master(s.Cfg.masterName).Result()
if redisErr == nil {
state.Fields.Ip = redisVal["ip"]
redisVal, redisErr := s.Slaves(s.Cfg.masterName).Result()
if redisErr == nil {
- for _, redisSlave := range redisVal {
- replicaState := readReplicaState(redisSlave.([]interface{}))
+ for _, redisReplica := range redisVal {
+ replicaState := readReplicaState(redisReplica.([]interface{}))
states.States = append(states.States, replicaState)
}
}
return states, redisErr
}
-func readReplicaState(redisSlaves []interface{}) *ReplicaDbState {
+func readReplicaState(redisReplicas []interface{}) *ReplicaDbState {
state := new(ReplicaDbState)
- for i := 0; i < len(redisSlaves); i += 2 {
- if redisSlaves[i].(string) == "ip" {
- state.Fields.Ip = redisSlaves[i+1].(string)
- } else if redisSlaves[i].(string) == "port" {
- state.Fields.Port = redisSlaves[i+1].(string)
- } else if redisSlaves[i].(string) == "flags" {
- state.Fields.Flags = redisSlaves[i+1].(string)
- } else if redisSlaves[i].(string) == "role-reported" {
- state.Fields.Role = redisSlaves[i+1].(string)
- } else if redisSlaves[i].(string) == "master-link-status" {
- state.Fields.MasterLinkStatus = redisSlaves[i+1].(string)
+ for i := 0; i < len(redisReplicas); i += 2 {
+ if redisReplicas[i].(string) == "ip" {
+ state.Fields.Ip = redisReplicas[i+1].(string)
+ } else if redisReplicas[i].(string) == "port" {
+ state.Fields.Port = redisReplicas[i+1].(string)
+ } else if redisReplicas[i].(string) == "flags" {
+ state.Fields.Flags = redisReplicas[i+1].(string)
+ } else if redisReplicas[i].(string) == "role-reported" {
+ state.Fields.Role = redisReplicas[i+1].(string)
+ } else if redisReplicas[i].(string) == "master-link-status" {
+ state.Fields.PrimaryLinkStatus = redisReplicas[i+1].(string)
+ }
+ }
+ return state
+}
+
+func (s *Sentinel) getSentinelsState() (*SentinelsDbState, error) {
+ states := new(SentinelsDbState)
+ states.States = make([]*SentinelDbState, 0)
+
+ redisVal, redisErr := s.Sentinels(s.Cfg.masterName).Result()
+ if redisErr == nil {
+ for _, redisSentinel := range redisVal {
+ sentinelState := readSentinelState(redisSentinel.([]interface{}))
+ states.States = append(states.States, sentinelState)
+ }
+ }
+ states.Err = redisErr
+ return states, redisErr
+}
+
+func readSentinelState(redisSentinels []interface{}) *SentinelDbState {
+ state := new(SentinelDbState)
+ for i := 0; i < len(redisSentinels); i += 2 {
+ if redisSentinels[i].(string) == "ip" {
+ state.Fields.Ip = redisSentinels[i+1].(string)
+ } else if redisSentinels[i].(string) == "port" {
+ state.Fields.Port = redisSentinels[i+1].(string)
+ } else if redisSentinels[i].(string) == "flags" {
+ state.Fields.Flags = redisSentinels[i+1].(string)
}
}
return state