20831: Add DiscoveryDocument to arvados.API
authorPeter Amstutz <peter.amstutz@curii.com>
Fri, 17 Nov 2023 14:37:28 +0000 (09:37 -0500)
committerPeter Amstutz <peter.amstutz@curii.com>
Fri, 17 Nov 2023 14:37:28 +0000 (09:37 -0500)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curii.com>

lib/controller/federation/conn.go
lib/controller/rpc/conn.go
sdk/go/arvados/api.go
sdk/go/arvados/client.go

index 95b50e7827b12a82eca1091107dc91a14ef4fbfe..24a7b6f8833a2131cf44eebfb1042b34648cae64 100644 (file)
@@ -228,6 +228,10 @@ func (conn *Conn) VocabularyGet(ctx context.Context) (arvados.Vocabulary, error)
        return conn.chooseBackend(conn.cluster.ClusterID).VocabularyGet(ctx)
 }
 
+func (conn *Conn) DiscoveryDocument(ctx context.Context) (arvados.DiscoveryDocument, error) {
+       return conn.chooseBackend(conn.cluster.ClusterID).DiscoveryDocument(ctx)
+}
+
 func (conn *Conn) Login(ctx context.Context, options arvados.LoginOptions) (arvados.LoginResponse, error) {
        if id := conn.cluster.Login.LoginCluster; id != "" && id != conn.cluster.ClusterID {
                // defer entire login procedure to designated cluster
index e15e4c47021045d03fdf29e20bc42765006ac2d4..beedf3b993806b00a3ece62f46ee76e78fcc5a60 100644 (file)
@@ -48,6 +48,7 @@ type Conn struct {
        httpClient    http.Client
        baseURL       url.URL
        tokenProvider TokenProvider
+       discoveryDocument *arvados.DiscoveryDocument
 }
 
 func NewConn(clusterID string, url *url.URL, insecure bool, tp TokenProvider) *Conn {
@@ -189,6 +190,19 @@ func (conn *Conn) VocabularyGet(ctx context.Context) (arvados.Vocabulary, error)
        return resp, err
 }
 
+func (conn *Conn) DiscoveryDocument(ctx context.Context) (arvados.DiscoveryDocument, error) {
+       if conn.discoveryDocument != nil {
+               return *conn.discoveryDocument, nil
+       }
+       var dd arvados.DiscoveryDocument
+       err := conn.requestAndDecode(ctx, &dd, arvados.EndpointDiscoveryDocument, nil, nil)
+       if err != nil {
+               return dd, err
+       }
+       conn.discoveryDocument = &dd
+       return *conn.discoveryDocument, nil
+}
+
 func (conn *Conn) Login(ctx context.Context, options arvados.LoginOptions) (arvados.LoginResponse, error) {
        ep := arvados.EndpointLogin
        var resp arvados.LoginResponse
index f4ac1ab3c424c896de04d9da7c904a4dd199d5af..bff01eeda5918136655fbafb0a5fe7b0547bef78 100644 (file)
@@ -25,6 +25,7 @@ type APIEndpoint struct {
 var (
        EndpointConfigGet                     = APIEndpoint{"GET", "arvados/v1/config", ""}
        EndpointVocabularyGet                 = APIEndpoint{"GET", "arvados/v1/vocabulary", ""}
+       EndpointDiscoveryDocument             = APIEndpoint{"GET", "discovery/v1/apis/arvados/v1/rest", ""}
        EndpointLogin                         = APIEndpoint{"GET", "login", ""}
        EndpointLogout                        = APIEndpoint{"GET", "logout", ""}
        EndpointAuthorizedKeyCreate           = APIEndpoint{"POST", "arvados/v1/authorized_keys", "authorized_key"}
@@ -347,4 +348,5 @@ type API interface {
        APIClientAuthorizationDelete(ctx context.Context, options DeleteOptions) (APIClientAuthorization, error)
        APIClientAuthorizationUpdate(ctx context.Context, options UpdateOptions) (APIClientAuthorization, error)
        APIClientAuthorizationGet(ctx context.Context, options GetOptions) (APIClientAuthorization, error)
+       DiscoveryDocument(ctx context.Context) (DiscoveryDocument, error)
 }
index d71ade8a81f92e76fe0c9155d16e437fb3dbb267..735a44d24c9263d3248fd5c9ae2b0574ca15ca22 100644 (file)
@@ -630,6 +630,7 @@ type DiscoveryDocument struct {
        GitURL                       string              `json:"gitUrl"`
        Schemas                      map[string]Schema   `json:"schemas"`
        Resources                    map[string]Resource `json:"resources"`
+       Revision                     string              `json:"revision"`
 }
 
 type Resource struct {