19886: Save log collection when crunch-run starts a container
authorBrett Smith <brett.smith@curii.com>
Thu, 12 Jan 2023 21:51:12 +0000 (16:51 -0500)
committerBrett Smith <brett.smith@curii.com>
Fri, 13 Jan 2023 14:36:43 +0000 (09:36 -0500)
This allows users to see information about the node where the container
started, including through Workbench 2.

Arvados-DCO-1.1-Signed-off-by: Brett Smith <brett.smith@curii.com>

lib/crunchrun/crunchrun.go
lib/crunchrun/crunchrun_test.go

index 52e1bf63a57037bc5a6184b88908bf5d6dcf6503..d322a3ac3c03f1eb178b9b2e6919de20cf30a390 100644 (file)
@@ -1434,7 +1434,11 @@ func (runner *ContainerRunner) UpdateContainerRunning() error {
                return ErrCancelled
        }
        return runner.DispatcherArvClient.Update("containers", runner.Container.UUID,
-               arvadosclient.Dict{"container": arvadosclient.Dict{"state": "Running", "gateway_address": runner.gateway.Address}}, nil)
+               arvadosclient.Dict{"container": arvadosclient.Dict{
+                       "state":           "Running",
+                       "gateway_address": runner.gateway.Address,
+                       "log":             runner.logUUID,
+               }}, nil)
 }
 
 // ContainerToken returns the api_token the container (and any
@@ -1625,6 +1629,10 @@ func (runner *ContainerRunner) Run() (err error) {
                return
        }
 
+       _, err = runner.saveLogCollection(false)
+       if err != nil {
+               runner.CrunchLog.Printf("Error committing initial log collection: %v", err)
+       }
        err = runner.UpdateContainerRunning()
        if err != nil {
                return
index 1f4681e3a7bbcab1545e2f2003bed2d0af9d4897..20ce8c647d379164f8568ec0f3b5337caaf2f352 100644 (file)
@@ -896,6 +896,37 @@ func (s *TestSuite) TestLogVersionAndRuntime(c *C) {
        c.Check(s.api.Logs["crunch-run"].String(), Matches, `(?ms).*Using container runtime: stub.*`)
 }
 
+func (s *TestSuite) TestCommitNodeInfoBeforeStart(c *C) {
+       var collection_create, container_update arvadosclient.Dict
+       s.fullRunHelper(c, `{
+               "command": ["true"],
+               "container_image": "`+arvadostest.DockerImage112PDH+`",
+               "cwd": ".",
+               "environment": {},
+               "mounts": {"/tmp": {"kind": "tmp"} },
+               "output_path": "/tmp",
+               "priority": 1,
+               "runtime_constraints": {},
+               "state": "Locked",
+               "uuid": "zzzzz-dz642-202301121543210"
+       }`, nil, 0,
+               func() {
+                       collection_create = s.api.CalledWith("ensure_unique_name", true)
+                       container_update = s.api.CalledWith("container.state", "Running")
+               })
+
+       c.Assert(collection_create, NotNil)
+       c.Check(collection_create["collection"].(arvadosclient.Dict)["name"], Equals, "logs for zzzzz-dz642-202301121543210")
+       manifest_text := collection_create["collection"].(arvadosclient.Dict)["manifest_text"]
+       // We check that the file size is at least two digits as an easy way to
+       // check the file isn't empty.
+       c.Check(manifest_text, Matches, `\. .* \d+:\d{2,}:node-info\.txt .*\n`)
+       c.Check(manifest_text, Matches, `\. .* \d+:\d{2,}:node\.json .*\n`)
+
+       c.Assert(container_update, NotNil)
+       c.Check(container_update["container"].(arvadosclient.Dict)["log"], Matches, `zzzzz-4zz18-[0-9a-z]{15}`)
+}
+
 func (s *TestSuite) TestContainerRecordLog(c *C) {
        s.fullRunHelper(c, `{
                "command": ["sleep", "1"],