|keepproxy |yes |yes|no ^2^|InternalURLs only used by reverse proxy (e.g. Nginx)|
|keepstore |no |yes|yes |All clients connect to InternalURLs|
|keep-balance |no |yes|no ^3^|InternalURLs only used to expose Prometheus metrics|
-|keep-web |yes |yes|no ^2^|InternalURLs only used by reverse proxy (e.g. Nginx)|
+|keep-web |yes |yes|yes ^5^|InternalURLs used by reverse proxy and container log API|
|websocket |yes |yes|no ^2^|InternalURLs only used by reverse proxy (e.g. Nginx)|
|workbench1 |yes |no|no ||
|workbench2 |yes |no|no ||
^2^ If the reverse proxy (e.g. Nginx) does not run on the same host as the Arvados service it fronts, the @InternalURLs@ will need to be reachable from the host that runs the reverse proxy.
^3^ If the Prometheus metrics are not collected from the same machine that runs the service, the @InternalURLs@ will need to be reachable from the host that collects the metrics.
^4^ If dispatching containers to HPC (Slurm/LSF) and there are multiple @Controller@ services, they must be able to connect to one another using their InternalURLs, otherwise the "tunnel connections":{{site.baseurl}}/architecture/hpc.html enabling "container shell access":{{site.baseurl}}/install/container-shell-access.html will not work.
+^5^ All URLs in @Services.WebDAVDownload.InternalURLs@ must be reachable by all Controller services. Alternatively, each entry in @Services.Controller.InternalURLs@ must have a corresponding entry in @Services.WebDAVDownload.InternalURLs@ with the same hostname.
When @InternalURLs@ do not need to be reachable from other nodes, it is most secure to use loopback addresses as @InternalURLs@, e.g. @http://127.0.0.1:9005@.
Supports federated @get@ and @list@.
-h2(#create). create
+h3(#create). create
Create a new Container.
+This API requires admin privileges. In normal operation, it should not be used at all.
+
Arguments:
table(table table-bordered table-condensed).
table(table table-bordered table-condensed).
|_. Argument |_. Type |_. Description |_. Location |_. Example |
{background:#ccffcc}.|uuid|string||path||
+
+h3. log
+
+Get container log data using WebDAV methods.
+
+This API retrieves data from the container's log collection. It can be used at any time in the container lifecycle.
+* While the container is @Queued@ or @Locked@ it returns an empty directory.
+* While the container is @Running@ it returns real-time logging data.
+* While the container is @Complete@ or @Cancelled@ it returns the final log collection.
+
+This API also supports the @Range@ request header, so it can be used to poll for and retrieve logs while the container is running.
+
+Arguments:
+
+table(table table-bordered table-condensed).
+|_. Argument |_. Type |_. Description |_. Location |_. Example |
+|method|string|Read-only WebDAV method|HTTP method|@GET@, @OPTIONS@, @PROPFIND@|
+{background:#ccffcc}.|uuid|string|The UUID of the Container in question.|path||
+|path|string|Path to a file in the log collection.|path|@/stderr.txt@|
+
+Examples:
+* @GET /arvados/v1/containers/zzzzz-dz642-0123456789abcde/log/stderr.txt@
+* @PROPFIND /arvados/v1/containers/zzzzz-dz642-0123456789abcde/log/@
myHostname := u.Hostname()
var webdavBase arvados.URL
var ok bool
- for webdavBase = range conn.cluster.Services.WebDAV.InternalURLs {
+ for webdavBase = range conn.cluster.Services.WebDAVDownload.InternalURLs {
ok = true
u := url.URL(webdavBase)
if h := u.Hostname(); h == "127.0.0.1" || h == "0.0.0.0" || h == "::1" || h == myHostname {