@@ -26,11 +26,13 @@ import (
2626
2727 "github.com/rs/zerolog"
2828
29+ "github.com/arangodb/arangosync-client/client"
2930 "github.com/arangodb/go-driver"
3031
3132 api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
3233 "github.com/arangodb/kube-arangodb/pkg/deployment/reconciler"
3334 "github.com/arangodb/kube-arangodb/pkg/logging"
35+ "github.com/arangodb/kube-arangodb/pkg/util/errors"
3436 "github.com/arangodb/kube-arangodb/pkg/util/globals"
3537)
3638
@@ -40,6 +42,13 @@ type StateInspectorGetter interface {
4042
4143type StateInspector interface {
4244 RefreshState (ctx context.Context , members api.DeploymentStatusMemberElements )
45+
46+ // GetMemberClient returns member connection to an ArangoDB server.
47+ GetMemberClient (id string ) (driver.Client , error )
48+
49+ // GetMemberSyncClient returns member connection to an ArangoSync server.
50+ GetMemberSyncClient (id string ) (client.API , error )
51+
4352 MemberState (id string ) (State , bool )
4453
4554 Health () Health
@@ -164,6 +173,7 @@ func (s *stateInspector) fetchArangosyncMemberState(ctx context.Context, m api.D
164173 "arangosync-build" : v .Build ,
165174 },
166175 }
176+ state .syncClient = c
167177 }
168178 return state
169179}
@@ -180,10 +190,43 @@ func (s *stateInspector) fetchServerMemberState(ctx context.Context, m api.Deplo
180190 state .NotReachableErr = err
181191 } else {
182192 state .Version = v
193+ state .client = c
183194 }
184195 return state
185196}
186197
198+ // GetMemberClient returns member client to a server.
199+ func (s * stateInspector ) GetMemberClient (id string ) (driver.Client , error ) {
200+ if state , ok := s .MemberState (id ); ok {
201+ if state .NotReachableErr != nil {
202+ // ArangoDB client can be set, but it might be old value.
203+ return nil , state .NotReachableErr
204+ }
205+
206+ if state .client != nil {
207+ return state .client , nil
208+ }
209+ }
210+
211+ return nil , errors .Newf ("failed to get ArangoDB member client: %s" , id )
212+ }
213+
214+ // GetMemberSyncClient returns member client to a server.
215+ func (s * stateInspector ) GetMemberSyncClient (id string ) (client.API , error ) {
216+ if state , ok := s .MemberState (id ); ok {
217+ if state .NotReachableErr != nil {
218+ // ArangoSync client can be set, but it might be old value.
219+ return nil , state .NotReachableErr
220+ }
221+
222+ if state .syncClient != nil {
223+ return state .syncClient , nil
224+ }
225+ }
226+
227+ return nil , errors .Newf ("failed to get ArangoSync member client: %s" , id )
228+ }
229+
187230func (s * stateInspector ) MemberState (id string ) (State , bool ) {
188231 s .lock .Lock ()
189232 defer s .lock .Unlock ()
@@ -203,10 +246,16 @@ type Health struct {
203246 Error error
204247}
205248
249+ // State describes a state of a member.
206250type State struct {
251+ // NotReachableErr set to non-nil if a member is not reachable.
207252 NotReachableErr error
208-
253+ // Version of this specific member.
209254 Version driver.VersionInfo
255+ // client to this specific ArangoDB member.
256+ client driver.Client
257+ // client to this specific ArangoSync member.
258+ syncClient client.API
210259}
211260
212261func (s State ) IsReachable () bool {
0 commit comments