12260: Fix remote ping auth. Make server work.
authorTom Clegg <tclegg@veritasgenetics.com>
Tue, 3 Oct 2017 14:55:42 +0000 (10:55 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Tue, 3 Oct 2017 14:55:42 +0000 (10:55 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/config.go
sdk/go/health/aggregator.go
services/health/main.go

index 537de2ac178e27320c9c97a380ed75816fcee8e4..d7bae38080f2a983e75f8364bf3b9c1aad8f6ece 100644 (file)
@@ -24,7 +24,9 @@ func GetConfig() (*Config, error) {
 // cluster, or the default/only configured cluster if clusterID is "".
 func (sc *Config) GetCluster(clusterID string) (*Cluster, error) {
        if clusterID == "" {
-               if len(sc.Clusters) != 1 {
+               if len(sc.Clusters) == 0 {
+                       return nil, fmt.Errorf("no clusters configured")
+               } else if len(sc.Clusters) > 1 {
                        return nil, fmt.Errorf("multiple clusters configured, cannot choose")
                } else {
                        for id, cc := range sc.Clusters {
@@ -79,9 +81,14 @@ func (cc *Cluster) GetSystemNode(node string) (*SystemNode, error) {
 }
 
 type SystemNode struct {
+       Health    Health
        Keepstore Keepstore
 }
 
+type Health struct {
+       Listen string
+}
+
 type Keepstore struct {
        Listen string
 }
index 88a338ef49dae640bb69835690c646499aa48dae..1ba1ee3c51a3c8e0059bb617fac8c08dc4a5e21d 100644 (file)
@@ -41,7 +41,7 @@ func (agg *Aggregator) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
        agg.setupOnce.Do(agg.setup)
        sendErr := func(statusCode int, err error) {
                resp.WriteHeader(statusCode)
-               json.NewEncoder(resp).Encode(map[string]interface{}{"error": err})
+               json.NewEncoder(resp).Encode(map[string]string{"error": err.Error()})
                if agg.Log != nil {
                        agg.Log(req, err)
                }
@@ -119,7 +119,7 @@ func (agg *Aggregator) ClusterHealth(cluster *arvados.Cluster) ClusterHealthResp
                        wg.Add(1)
                        go func(node string) {
                                defer wg.Done()
-                               pingResp := agg.ping(node, addr)
+                               pingResp := agg.ping(node, addr, cluster)
 
                                mtx.Lock()
                                defer mtx.Unlock()
@@ -148,7 +148,7 @@ func (agg *Aggregator) ClusterHealth(cluster *arvados.Cluster) ClusterHealthResp
        return resp
 }
 
-func (agg *Aggregator) ping(node, addr string) (result CheckResponse) {
+func (agg *Aggregator) ping(node, addr string, cluster *arvados.Cluster) (result CheckResponse) {
        t0 := time.Now()
 
        var err error
@@ -167,6 +167,7 @@ func (agg *Aggregator) ping(node, addr string) (result CheckResponse) {
        if err != nil {
                return
        }
+       req.Header.Set("Authorization", "Bearer "+cluster.ManagementToken)
 
        ctx, cancel := context.WithCancel(req.Context())
        go func() {
@@ -184,6 +185,7 @@ func (agg *Aggregator) ping(node, addr string) (result CheckResponse) {
        result.Status = resp.StatusCode
        err = json.NewDecoder(resp.Body).Decode(&result)
        if err != nil {
+               err = fmt.Errorf("cannot decode response: %s", err)
                return
        }
        if resp.StatusCode != http.StatusOK {
index 7f4d6481e034556f6c71f6caef042f0d3199030a..3e089fa5a229966dd79f410bbc3e56605f26b4bd 100644 (file)
@@ -1,6 +1,8 @@
 package main
 
 import (
+       "net/http"
+
        "git.curoverse.com/arvados.git/sdk/go/arvados"
        "git.curoverse.com/arvados.git/sdk/go/health"
        "git.curoverse.com/arvados.git/sdk/go/httpserver"
@@ -11,18 +13,27 @@ func main() {
        log.SetFormatter(&log.JSONFormatter{
                TimestampFormat: "2006-01-02T15:04:05.000000000Z07:00",
        })
-       sysConf, err := arvados.GetSystemConfig()
+       cfg, err := arvados.GetConfig()
+       if err != nil {
+               log.Fatal(err)
+       }
+       clusterCfg, err := cfg.GetCluster("")
+       if err != nil {
+               log.Fatal(err)
+       }
+       nodeCfg, err := clusterCfg.GetThisSystemNode()
        if err != nil {
                log.Fatal(err)
        }
 
        srv := &httpserver.Server{
-               Addr: ":", // FIXME: should be dictated by Health on this SystemNode
-               Handler: &health.Aggregator{
-                       SystemConfig: sysConf,
+               Addr: nodeCfg.Health.Listen,
+               Server: http.Server{
+                       Handler: &health.Aggregator{
+                               Config: cfg,
+                       },
                },
        }
-       srv.HandleFunc()
        if err := srv.Start(); err != nil {
                log.Fatal(err)
        }