github.com/diptanu/nomad@v0.5.7-0.20170516172507-d72e86cbe3d9/nomad/status_endpoint.go (about)

     1  package nomad
     2  
     3  import "github.com/hashicorp/nomad/nomad/structs"
     4  
     5  // Status endpoint is used to check on server status
     6  type Status struct {
     7  	srv *Server
     8  }
     9  
    10  // Version is used to allow clients to determine the capabilities
    11  // of the server
    12  func (s *Status) Version(args *structs.GenericRequest, reply *structs.VersionResponse) error {
    13  	if done, err := s.srv.forward("Status.Version", args, args, reply); done {
    14  		return err
    15  	}
    16  
    17  	conf := s.srv.config
    18  	reply.Build = conf.Build
    19  	reply.Versions = map[string]int{
    20  		structs.ProtocolVersion: int(conf.ProtocolVersion),
    21  		structs.APIMajorVersion: structs.ApiMajorVersion,
    22  		structs.APIMinorVersion: structs.ApiMinorVersion,
    23  	}
    24  	return nil
    25  }
    26  
    27  // Ping is used to just check for connectivity
    28  func (s *Status) Ping(args struct{}, reply *struct{}) error {
    29  	return nil
    30  }
    31  
    32  // Leader is used to get the address of the leader
    33  func (s *Status) Leader(args *structs.GenericRequest, reply *string) error {
    34  	if args.Region == "" {
    35  		args.Region = s.srv.config.Region
    36  	}
    37  	if done, err := s.srv.forward("Status.Leader", args, args, reply); done {
    38  		return err
    39  	}
    40  
    41  	leader := string(s.srv.raft.Leader())
    42  	if leader != "" {
    43  		*reply = leader
    44  	} else {
    45  		*reply = ""
    46  	}
    47  	return nil
    48  }
    49  
    50  // Peers is used to get all the Raft peers
    51  func (s *Status) Peers(args *structs.GenericRequest, reply *[]string) error {
    52  	if args.Region == "" {
    53  		args.Region = s.srv.config.Region
    54  	}
    55  	if done, err := s.srv.forward("Status.Peers", args, args, reply); done {
    56  		return err
    57  	}
    58  
    59  	future := s.srv.raft.GetConfiguration()
    60  	if err := future.Error(); err != nil {
    61  		return err
    62  	}
    63  
    64  	for _, server := range future.Configuration().Servers {
    65  		*reply = append(*reply, string(server.Address))
    66  	}
    67  	return nil
    68  }
    69  
    70  // Members return the list of servers in a cluster that a particular server is
    71  // aware of
    72  func (s *Status) Members(args *structs.GenericRequest, reply *structs.ServerMembersResponse) error {
    73  	serfMembers := s.srv.Members()
    74  	members := make([]*structs.ServerMember, len(serfMembers))
    75  	for i, mem := range serfMembers {
    76  		members[i] = &structs.ServerMember{
    77  			Name:        mem.Name,
    78  			Addr:        mem.Addr,
    79  			Port:        mem.Port,
    80  			Tags:        mem.Tags,
    81  			Status:      mem.Status.String(),
    82  			ProtocolMin: mem.ProtocolMin,
    83  			ProtocolMax: mem.ProtocolMax,
    84  			ProtocolCur: mem.ProtocolCur,
    85  			DelegateMin: mem.DelegateMin,
    86  			DelegateMax: mem.DelegateMax,
    87  			DelegateCur: mem.DelegateCur,
    88  		}
    89  	}
    90  	*reply = structs.ServerMembersResponse{
    91  		ServerName:   s.srv.config.NodeName,
    92  		ServerRegion: s.srv.config.Region,
    93  		ServerDC:     s.srv.config.Datacenter,
    94  		Members:      members,
    95  	}
    96  	return nil
    97  }