Merge branch 'master' into 10081-cwl-run-same-job
[arvados.git] / sdk / go / arvadosclient / arvadosclient.go
index b67eaa59a6749fb7e9b1a3da5ad2617344fc799d..e3cbfcf13effab33a5c53e12e6b1a9e4e03b18ac 100644 (file)
@@ -15,6 +15,8 @@ import (
        "regexp"
        "strings"
        "time"
+
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
 )
 
 type StringMatcher func(string) bool
@@ -86,6 +88,12 @@ type ArvadosClient struct {
        // the client is outside the cluster.
        External bool
 
+       // Base URIs of Keep services, e.g., {"https://host1:8443",
+       // "https://host2:8443"}.  If this is nil, Keep clients will
+       // use the arvados.v1.keep_services.accessible API to discover
+       // available services.
+       KeepServiceURIs []string
+
        // Discovery document
        DiscoveryDoc Dict
 
@@ -95,9 +103,28 @@ type ArvadosClient struct {
        Retries int
 }
 
-// Create a new ArvadosClient, initialized with standard Arvados environment
-// variables ARVADOS_API_HOST, ARVADOS_API_TOKEN, and (optionally)
-// ARVADOS_API_HOST_INSECURE.
+// New returns an ArvadosClient using the given arvados.Client
+// configuration. This is useful for callers who load arvados.Client
+// fields from configuration files but still need to use the
+// arvadosclient.ArvadosClient package.
+func New(c *arvados.Client) (*ArvadosClient, error) {
+       return &ArvadosClient{
+               Scheme:      "https",
+               ApiServer:   c.APIHost,
+               ApiToken:    c.AuthToken,
+               ApiInsecure: c.Insecure,
+               Client: &http.Client{Transport: &http.Transport{
+                       TLSClientConfig: &tls.Config{InsecureSkipVerify: c.Insecure}}},
+               External:          false,
+               Retries:           2,
+               lastClosedIdlesAt: time.Now(),
+       }, nil
+}
+
+// MakeArvadosClient creates a new ArvadosClient using the standard
+// environment variables ARVADOS_API_HOST, ARVADOS_API_TOKEN,
+// ARVADOS_API_HOST_INSECURE, ARVADOS_EXTERNAL_CLIENT, and
+// ARVADOS_KEEP_SERVICES.
 func MakeArvadosClient() (ac ArvadosClient, err error) {
        var matchTrue = regexp.MustCompile("^(?i:1|yes|true)$")
        insecure := matchTrue.MatchString(os.Getenv("ARVADOS_API_HOST_INSECURE"))
@@ -113,6 +140,18 @@ func MakeArvadosClient() (ac ArvadosClient, err error) {
                External: external,
                Retries:  2}
 
+       for _, s := range strings.Split(os.Getenv("ARVADOS_KEEP_SERVICES"), " ") {
+               if s == "" {
+                       continue
+               }
+               if u, err := url.Parse(s); err != nil {
+                       return ac, fmt.Errorf("ARVADOS_KEEP_SERVICES: %q: %s", s, err)
+               } else if !u.IsAbs() {
+                       return ac, fmt.Errorf("ARVADOS_KEEP_SERVICES: %q: not an absolute URI", s)
+               }
+               ac.KeepServiceURIs = append(ac.KeepServiceURIs, s)
+       }
+
        if ac.ApiServer == "" {
                return ac, MissingArvadosApiHost
        }
@@ -273,7 +312,7 @@ func newAPIServerError(ServerAddress string, resp *http.Response) APIServerError
 // Returns a non-nil error if an error occurs making the API call, the
 // API responds with a non-successful HTTP status, or an error occurs
 // parsing the response body.
-func (c ArvadosClient) Call(method string, resourceType string, uuid string, action string, parameters Dict, output interface{}) error {
+func (c ArvadosClient) Call(method, resourceType, uuid, action string, parameters Dict, output interface{}) error {
        reader, err := c.CallRaw(method, resourceType, uuid, action, parameters)
        if reader != nil {
                defer reader.Close()