@@ -542,14 +542,15 @@ type StatusItem struct {
542542}
543543
544544type instanceUpInfo struct {
545- Version string
546- Role string
547- Mode string
545+ Version string
546+ Role string
547+ Mode string
548+ IsLeader bool
548549}
549550
550551// TestInstance checks the `up` status of an arangod server instance.
551552func (s * Service ) TestInstance (ctx context.Context , serverType ServerType , address string , port int ,
552- statusChanged chan StatusItem ) (up , correctRole bool , version , role , mode string , statusTrail []int , cancelled bool ) {
553+ statusChanged chan StatusItem ) (up , correctRole bool , version , role , mode string , isLeader bool , statusTrail []int , cancelled bool ) {
553554 instanceUp := make (chan instanceUpInfo )
554555 statusCodes := make (chan int )
555556 if statusChanged != nil {
@@ -666,14 +667,42 @@ func (s *Service) TestInstance(ctx context.Context, serverType ServerType, addre
666667 }
667668 return roleResponse .Role , roleResponse .Mode , resp .StatusCode , nil
668669 }
670+ makeIsLeaderRequest := func () (bool , error ) {
671+ if serverType != ServerTypeResilientSingle {
672+ return false , nil
673+ }
674+ addr := net .JoinHostPort (address , strconv .Itoa (port ))
675+ url := fmt .Sprintf ("%s://%s/_api/database" , scheme , addr )
676+ req , err := http .NewRequest ("GET" , url , nil )
677+ if err != nil {
678+ return false , maskAny (err )
679+ }
680+ if err := addJwtHeader (req , s .jwtSecret ); err != nil {
681+ return false , maskAny (err )
682+ }
683+ resp , err := client .Do (req )
684+ if err != nil {
685+ return false , maskAny (err )
686+ }
687+ if resp .StatusCode == 200 {
688+ return true , nil
689+ }
690+ if resp .StatusCode == 503 && resp .Header .Get ("X-Arango-Endpoint" ) != "" {
691+ return false , nil
692+ }
693+ return false , maskAny (fmt .Errorf ("Invalid status %d" , resp .StatusCode ))
694+ }
669695
670696 for i := 0 ; i < 300 ; i ++ {
671697 if version , statusCode , err := makeVersionRequest (); err == nil {
672698 if role , mode , statusCode , err := makeRoleRequest (); err == nil {
673- instanceUp <- instanceUpInfo {
674- Version : version ,
675- Role : role ,
676- Mode : mode ,
699+ if isLeader , err := makeIsLeaderRequest (); err == nil {
700+ instanceUp <- instanceUpInfo {
701+ Version : version ,
702+ Role : role ,
703+ Mode : mode ,
704+ IsLeader : isLeader ,
705+ }
677706 }
678707 } else {
679708 statusCodes <- statusCode
@@ -695,7 +724,7 @@ func (s *Service) TestInstance(ctx context.Context, serverType ServerType, addre
695724 up = instanceInfo .Version != ""
696725 correctRole = instanceInfo .Role == expectedRole || expectedRole == ""
697726 correctMode := instanceInfo .Mode == expectedMode || expectedMode == ""
698- return up , correctRole && correctMode , instanceInfo .Version , instanceInfo .Role , instanceInfo .Mode , statusTrail , false
727+ return up , correctRole && correctMode , instanceInfo .Version , instanceInfo .Role , instanceInfo .Mode , instanceInfo . IsLeader , statusTrail , false
699728 case statusCode := <- statusCodes :
700729 lastStatusCode := math .MinInt32
701730 if len (statusTrail ) > 0 {
@@ -712,7 +741,7 @@ func (s *Service) TestInstance(ctx context.Context, serverType ServerType, addre
712741 }
713742 }
714743 case <- ctx .Done ():
715- return false , false , "" , "" , "" , statusTrail , true
744+ return false , false , "" , "" , "" , false , statusTrail , true
716745 }
717746 }
718747}
0 commit comments