@@ -542,14 +542,15 @@ type StatusItem struct {
542
542
}
543
543
544
544
type instanceUpInfo struct {
545
- Version string
546
- Role string
547
- Mode string
545
+ Version string
546
+ Role string
547
+ Mode string
548
+ IsLeader bool
548
549
}
549
550
550
551
// TestInstance checks the `up` status of an arangod server instance.
551
552
func (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 ) {
553
554
instanceUp := make (chan instanceUpInfo )
554
555
statusCodes := make (chan int )
555
556
if statusChanged != nil {
@@ -666,14 +667,42 @@ func (s *Service) TestInstance(ctx context.Context, serverType ServerType, addre
666
667
}
667
668
return roleResponse .Role , roleResponse .Mode , resp .StatusCode , nil
668
669
}
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
+ }
669
695
670
696
for i := 0 ; i < 300 ; i ++ {
671
697
if version , statusCode , err := makeVersionRequest (); err == nil {
672
698
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
+ }
677
706
}
678
707
} else {
679
708
statusCodes <- statusCode
@@ -695,7 +724,7 @@ func (s *Service) TestInstance(ctx context.Context, serverType ServerType, addre
695
724
up = instanceInfo .Version != ""
696
725
correctRole = instanceInfo .Role == expectedRole || expectedRole == ""
697
726
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
699
728
case statusCode := <- statusCodes :
700
729
lastStatusCode := math .MinInt32
701
730
if len (statusTrail ) > 0 {
@@ -712,7 +741,7 @@ func (s *Service) TestInstance(ctx context.Context, serverType ServerType, addre
712
741
}
713
742
}
714
743
case <- ctx .Done ():
715
- return false , false , "" , "" , "" , statusTrail , true
744
+ return false , false , "" , "" , "" , false , statusTrail , true
716
745
}
717
746
}
718
747
}
0 commit comments