"git.curoverse.com/arvados.git/sdk/go/ctxlog"
)
-type Interface interface {
- CollectionCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Collection, error)
- CollectionUpdate(ctx context.Context, options arvados.UpdateOptions) (arvados.Collection, error)
- CollectionGet(ctx context.Context, options arvados.GetOptions) (arvados.Collection, error)
- CollectionList(ctx context.Context, options arvados.ListOptions) (arvados.CollectionList, error)
- CollectionProvenance(ctx context.Context, options arvados.GetOptions) (map[string]interface{}, error)
- CollectionUsedBy(ctx context.Context, options arvados.GetOptions) (map[string]interface{}, error)
- CollectionDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.Collection, error)
- CollectionTrash(ctx context.Context, options arvados.DeleteOptions) (arvados.Collection, error)
- CollectionUntrash(ctx context.Context, options arvados.UntrashOptions) (arvados.Collection, error)
- ContainerCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Container, error)
- ContainerUpdate(ctx context.Context, options arvados.UpdateOptions) (arvados.Container, error)
- ContainerGet(ctx context.Context, options arvados.GetOptions) (arvados.Container, error)
- ContainerList(ctx context.Context, options arvados.ListOptions) (arvados.ContainerList, error)
- ContainerDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.Container, error)
- ContainerLock(ctx context.Context, options arvados.GetOptions) (arvados.Container, error)
- ContainerUnlock(ctx context.Context, options arvados.GetOptions) (arvados.Container, error)
- SpecimenCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Specimen, error)
- SpecimenUpdate(ctx context.Context, options arvados.UpdateOptions) (arvados.Specimen, error)
- SpecimenGet(ctx context.Context, options arvados.GetOptions) (arvados.Specimen, error)
- SpecimenList(ctx context.Context, options arvados.ListOptions) (arvados.SpecimenList, error)
- SpecimenDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.Specimen, error)
- APIClientAuthorizationCurrent(ctx context.Context, options arvados.GetOptions) (arvados.APIClientAuthorization, error)
-}
-
type Conn struct {
cluster *arvados.Cluster
local backend
remotes map[string]backend
}
-func New(cluster *arvados.Cluster) Interface {
+func New(cluster *arvados.Cluster) *Conn {
local := railsproxy.NewConn(cluster)
remotes := map[string]backend{}
for id, remote := range cluster.RemoteClusters {
func saltedTokenProvider(local backend, remoteID string) rpc.TokenProvider {
return func(ctx context.Context) ([]string, error) {
var tokens []string
- incoming, ok := ctx.Value(auth.ContextKeyCredentials).(*auth.Credentials)
+ incoming, ok := auth.FromContext(ctx)
if !ok {
return nil, errors.New("no token provided")
}
case auth.ErrSalted:
tokens = append(tokens, token)
case auth.ErrObsoleteToken:
- ctx := context.WithValue(ctx, auth.ContextKeyCredentials, &auth.Credentials{Tokens: []string{token}})
+ ctx := auth.NewContext(ctx, &auth.Credentials{Tokens: []string{token}})
aca, err := local.APIClientAuthorizationCurrent(ctx, arvados.GetOptions{})
if errStatus(err) == http.StatusUnauthorized {
// pass through unmodified
// Return suitable backend for a query about the given cluster ID
// ("aaaaa") or object UUID ("aaaaa-dz642-abcdefghijklmno").
func (conn *Conn) chooseBackend(id string) backend {
- if len(id) > 5 {
+ if len(id) == 27 {
id = id[:5]
+ } else if len(id) != 5 {
+ // PDH or bogus ID
+ return conn.local
}
if id == conn.cluster.ClusterID {
return conn.local
}
}
-func (conn *Conn) CollectionList(ctx context.Context, options arvados.ListOptions) (arvados.CollectionList, error) {
- return conn.local.CollectionList(ctx, options)
-}
-
func (conn *Conn) CollectionProvenance(ctx context.Context, options arvados.GetOptions) (map[string]interface{}, error) {
- return conn.local.CollectionProvenance(ctx, options)
+ return conn.chooseBackend(options.UUID).CollectionProvenance(ctx, options)
}
func (conn *Conn) CollectionUsedBy(ctx context.Context, options arvados.GetOptions) (map[string]interface{}, error) {
- return conn.local.CollectionUsedBy(ctx, options)
+ return conn.chooseBackend(options.UUID).CollectionUsedBy(ctx, options)
}
func (conn *Conn) CollectionDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.Collection, error) {
return conn.chooseBackend(options.UUID).ContainerGet(ctx, options)
}
-func (conn *Conn) ContainerList(ctx context.Context, options arvados.ListOptions) (arvados.ContainerList, error) {
- return conn.local.ContainerList(ctx, options)
-}
-
func (conn *Conn) ContainerDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.Container, error) {
return conn.chooseBackend(options.UUID).ContainerDelete(ctx, options)
}
return conn.chooseBackend(options.UUID).SpecimenGet(ctx, options)
}
-func (conn *Conn) SpecimenList(ctx context.Context, options arvados.ListOptions) (arvados.SpecimenList, error) {
- return conn.local.SpecimenList(ctx, options)
-}
-
func (conn *Conn) SpecimenDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.Specimen, error) {
return conn.chooseBackend(options.UUID).SpecimenDelete(ctx, options)
}
return conn.chooseBackend(options.UUID).APIClientAuthorizationCurrent(ctx, options)
}
-type backend interface{ Interface }
+type backend interface{ arvados.API }
type notFoundError struct{}