X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/b7569de781d06b65f2daf2b269ff185eb2ed13c1..fe561d69b42d55191d6d1f01d4f3cdcf1fc9faaa:/sdk/go/arvados/keep_service.go diff --git a/sdk/go/arvados/keep_service.go b/sdk/go/arvados/keep_service.go index b29748a224..0c866354aa 100644 --- a/sdk/go/arvados/keep_service.go +++ b/sdk/go/arvados/keep_service.go @@ -1,3 +1,7 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: Apache-2.0 + package arvados import ( @@ -18,6 +22,14 @@ type KeepService struct { ReadOnly bool `json:"read_only"` } +type KeepMount struct { + UUID string `json:"uuid"` + DeviceID string `json:"device_id"` + ReadOnly bool `json:"read_only"` + Replication int `json:"replication"` + StorageClasses []string `json:"storage_classes"` +} + // KeepServiceList is an arvados#keepServiceList record type KeepServiceList struct { Items []KeepService `json:"items"` @@ -73,10 +85,32 @@ func (s *KeepService) String() string { return s.UUID } +func (s *KeepService) Mounts(c *Client) ([]KeepMount, error) { + url := s.url("mounts") + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + var mounts []KeepMount + err = c.DoAndDecode(&mounts, req) + if err != nil { + return nil, fmt.Errorf("GET %v: %v", url, err) + } + return mounts, nil +} + +// Index returns an unsorted list of blocks at the given mount point. +func (s *KeepService) IndexMount(c *Client, mountUUID string, prefix string) ([]KeepServiceIndexEntry, error) { + return s.index(c, s.url("mounts/"+mountUUID+"/blocks?prefix="+prefix)) +} + // Index returns an unsorted list of blocks that can be retrieved from // this server. func (s *KeepService) Index(c *Client, prefix string) ([]KeepServiceIndexEntry, error) { - url := s.url("index/" + prefix) + return s.index(c, s.url("index/"+prefix)) +} + +func (s *KeepService) index(c *Client, url string) ([]KeepServiceIndexEntry, error) { req, err := http.NewRequest("GET", url, nil) if err != nil { return nil, fmt.Errorf("NewRequest(%v): %v", url, err) @@ -85,7 +119,7 @@ func (s *KeepService) Index(c *Client, prefix string) ([]KeepServiceIndexEntry, if err != nil { return nil, fmt.Errorf("Do(%v): %v", url, err) } else if resp.StatusCode != 200 { - return nil, fmt.Errorf("%v: %v", url, resp.Status) + return nil, fmt.Errorf("%v: %d %v", url, resp.StatusCode, resp.Status) } defer resp.Body.Close() @@ -93,6 +127,13 @@ func (s *KeepService) Index(c *Client, prefix string) ([]KeepServiceIndexEntry, scanner := bufio.NewScanner(resp.Body) sawEOF := false for scanner.Scan() { + if scanner.Err() != nil { + // If we encounter a read error (timeout, + // connection failure), stop now and return it + // below, so it doesn't get masked by the + // ensuing "badly formatted response" error. + break + } if sawEOF { return nil, fmt.Errorf("Index response contained non-terminal blank line") }