X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=internal%2Fsdlgoredis%2Fsdlgosentinel.go;h=8a1b3313609ba50bd87088b3c1e8360e3d834236;hb=refs%2Fchanges%2F87%2F7587%2F6;hp=7af0410caa3d45b9856d31dbac88d6b0788ade15;hpb=977a55ca96d5dba1c7f9273671747eaf9cd6f894;p=ric-plt%2Fsdlgo.git diff --git a/internal/sdlgoredis/sdlgosentinel.go b/internal/sdlgoredis/sdlgosentinel.go index 7af0410..8a1b331 100644 --- a/internal/sdlgoredis/sdlgosentinel.go +++ b/internal/sdlgoredis/sdlgosentinel.go @@ -23,17 +23,22 @@ package sdlgoredis import ( - "github.com/go-redis/redis/v7" + "context" + "fmt" + "github.com/go-redis/redis/v8" + "strconv" ) type Sentinel struct { + ctx context.Context IredisSentinelClient Cfg *Config } type IredisSentinelClient interface { - Master(name string) *redis.StringStringMapCmd - Slaves(name string) *redis.SliceCmd + Master(ctx context.Context, name string) *redis.StringStringMapCmd + Slaves(ctx context.Context, name string) *redis.SliceCmd + Sentinels(ctx context.Context, name string) *redis.SliceCmd } type RedisSentinelCreateCb func(cfg *Config, addr string) *Sentinel @@ -41,6 +46,7 @@ type RedisSentinelCreateCb func(cfg *Config, addr string) *Sentinel func newRedisSentinel(cfg *Config, addr string) *Sentinel { redisAddress := addr + ":" + cfg.sentinelPort return &Sentinel{ + ctx: context.Background(), IredisSentinelClient: redis.NewSentinelClient(&redis.Options{ Addr: redisAddress, Password: "", // no password set @@ -54,19 +60,32 @@ func newRedisSentinel(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) - redisVal, redisErr := s.Master(s.Cfg.masterName).Result() +func (s *Sentinel) getPrimaryDbState() (*PrimaryDbState, error) { + state := new(PrimaryDbState) + redisVal, redisErr := s.Master(s.ctx, s.Cfg.masterName).Result() if redisErr == nil { state.Fields.Ip = redisVal["ip"] state.Fields.Port = redisVal["port"] @@ -81,10 +100,10 @@ func (s *Sentinel) getReplicasState() (*ReplicasDbState, error) { states := new(ReplicasDbState) states.States = make([]*ReplicaDbState, 0) - redisVal, redisErr := s.Slaves(s.Cfg.masterName).Result() + redisVal, redisErr := s.Slaves(s.ctx, 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) } } @@ -92,19 +111,52 @@ func (s *Sentinel) getReplicasState() (*ReplicasDbState, error) { 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.ctx, s.Cfg.masterName).Result() + if redisErr == nil { + for _, redisSentinel := range redisVal { + sentinelState := readSentinelState(redisSentinel.([]interface{})) + // Ignore a sentinel entry with zero port, because missing of fix + // for the Redis Bug #9240. + if sentinelState.Fields.Port != "0" { + 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