Merge branch '12630-nvidia-devices' refs #12630
[arvados.git] / sdk / go / arvados / client.go
index 52c75d5113c2a9399267e90fb8c18c8a5aeeaad7..5ec828667fc940ace2c3f59b6cdc643139ae3b14 100644 (file)
@@ -9,6 +9,7 @@ import (
        "context"
        "crypto/tls"
        "encoding/json"
+       "errors"
        "fmt"
        "io"
        "io/ioutil"
@@ -67,6 +68,10 @@ type Client struct {
        dd *DiscoveryDocument
 
        defaultRequestID string
+
+       // APIHost and AuthToken were loaded from ARVADOS_* env vars
+       // (used to customize "no host/token" error messages)
+       loadedFromEnv bool
 }
 
 // InsecureHTTPClient is the default http.Client used by a Client with
@@ -123,6 +128,7 @@ func NewClientFromEnv() *Client {
                Insecure:        insecure,
                KeepServiceURIs: svcs,
                Timeout:         5 * time.Minute,
+               loadedFromEnv:   true,
        }
 }
 
@@ -211,6 +217,8 @@ func (c *Client) DoAndDecode(dst interface{}, req *http.Request) error {
                return err
        }
        switch {
+       case resp.StatusCode == http.StatusNoContent:
+               return nil
        case resp.StatusCode == http.StatusOK && dst == nil:
                return nil
        case resp.StatusCode == http.StatusOK:
@@ -312,6 +320,12 @@ func (c *Client) RequestAndDecodeContext(ctx context.Context, dst interface{}, m
                // Ensure body is closed even if we error out early
                defer body.Close()
        }
+       if c.APIHost == "" {
+               if c.loadedFromEnv {
+                       return errors.New("ARVADOS_API_HOST and/or ARVADOS_API_TOKEN environment variables are not set")
+               }
+               return errors.New("arvados.Client cannot perform request: APIHost is not set")
+       }
        urlString := c.apiURL(path)
        urlValues, err := anythingToValues(params)
        if err != nil {