X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/14d8cfa18f28586ad296e3e598d0a2a536be0613..c138f58b21edb574b101588f6fc61dce8a98ed3e:/lib/crunchrun/crunchrun_test.go diff --git a/lib/crunchrun/crunchrun_test.go b/lib/crunchrun/crunchrun_test.go index 9971757893..a5045863b0 100644 --- a/lib/crunchrun/crunchrun_test.go +++ b/lib/crunchrun/crunchrun_test.go @@ -12,6 +12,7 @@ import ( "fmt" "io" "io/ioutil" + "log" "os" "os/exec" "regexp" @@ -22,6 +23,7 @@ import ( "testing" "time" + "git.arvados.org/arvados.git/lib/cloud" "git.arvados.org/arvados.git/lib/cmd" "git.arvados.org/arvados.git/sdk/go/arvados" "git.arvados.org/arvados.git/sdk/go/arvadosclient" @@ -276,7 +278,7 @@ func (client *ArvTestClient) Update(resourceType string, uuid string, parameters if parameters["container"].(arvadosclient.Dict)["state"] == "Running" { client.WasSetRunning = true } - } else if resourceType == "collections" { + } else if resourceType == "collections" && output != nil { mt := parameters["collection"].(arvadosclient.Dict)["manifest_text"].(string) output.(*arvados.Collection).UUID = uuid output.(*arvados.Collection).PortableDataHash = fmt.Sprintf("%x", md5.Sum([]byte(mt))) @@ -1299,7 +1301,7 @@ func (s *TestSuite) TestSetupMounts(c *C) { bindmounts, err := cr.SetupMounts() c.Check(err, IsNil) c.Check(am.Cmd, DeepEquals, []string{"arv-mount", "--foreground", - "--read-write", "--storage-classes", "default", "--crunchstat-interval=5", + "--read-write", "--storage-classes", "default", "--crunchstat-interval=5", "--ram-cache", "--file-cache", "512", "--mount-tmp", "tmp0", "--mount-by-pdh", "by_id", "--disable-event-listening", "--mount-by-id", "by_uuid", realTemp + "/keep1"}) c.Check(bindmounts, DeepEquals, map[string]bindmount{ "/keepinp": {realTemp + "/keep1/by_id/59389a8f9ee9d399be35462a0f92541c+53", true}, @@ -1382,7 +1384,7 @@ func (s *TestSuite) TestSetupMounts(c *C) { bindmounts, err := cr.SetupMounts() c.Check(err, IsNil) c.Check(am.Cmd, DeepEquals, []string{"arv-mount", "--foreground", - "--read-write", "--storage-classes", "default", "--crunchstat-interval=5", + "--read-write", "--storage-classes", "default", "--crunchstat-interval=5", "--ram-cache", "--file-cache", "512", "--mount-tmp", "tmp0", "--mount-by-pdh", "by_id", "--disable-event-listening", "--mount-by-id", "by_uuid", realTemp + "/keep1"}) c.Check(bindmounts, DeepEquals, map[string]bindmount{ "/tmp": {realTemp + "/tmp2", false}, @@ -2071,6 +2073,57 @@ func (s *TestSuite) TestSecretTextMountPoint(c *C) { c.Check(s.runner.ContainerArvClient.(*ArvTestClient).CalledWith("collection.manifest_text", ". acbd18db4cc2f85cedef654fccc4a4d8+3 0:3:foo.txt\n"), NotNil) } +func (s *TestSuite) TestCalculateCost(c *C) { + defer func(s string) { lockdir = s }(lockdir) + lockdir = c.MkDir() + now := time.Now() + cr := s.runner + cr.costStartTime = now.Add(-time.Hour) + var logbuf bytes.Buffer + cr.CrunchLog.Immediate = log.New(&logbuf, "", 0) + + // if there's no InstanceType env var, cost is calculated as 0 + os.Unsetenv("InstanceType") + cost := cr.calculateCost(now) + c.Check(cost, Equals, 0.0) + + // with InstanceType env var and loadPrices() hasn't run (or + // hasn't found any data), cost is calculated based on + // InstanceType env var + os.Setenv("InstanceType", `{"Price":1.2}`) + defer os.Unsetenv("InstanceType") + cost = cr.calculateCost(now) + c.Check(cost, Equals, 1.2) + + // first update tells us the spot price was $1/h until 30 + // minutes ago when it increased to $2/h + j, err := json.Marshal([]cloud.InstancePrice{ + {StartTime: now.Add(-4 * time.Hour), Price: 1.0}, + {StartTime: now.Add(-time.Hour / 2), Price: 2.0}, + }) + c.Assert(err, IsNil) + os.WriteFile(lockdir+"/"+pricesfile, j, 0777) + cr.loadPrices() + cost = cr.calculateCost(now) + c.Check(cost, Equals, 1.5) + + // next update (via --list + SIGUSR2) tells us the spot price + // increased to $3/h 15 minutes ago + j, err = json.Marshal([]cloud.InstancePrice{ + {StartTime: now.Add(-time.Hour / 3), Price: 2.0}, // dup of -time.Hour/2 price + {StartTime: now.Add(-time.Hour / 4), Price: 3.0}, + }) + c.Assert(err, IsNil) + os.WriteFile(lockdir+"/"+pricesfile, j, 0777) + cr.loadPrices() + cost = cr.calculateCost(now) + c.Check(cost, Equals, 1.0/2+2.0/4+3.0/4) + + c.Logf("%s", logbuf.String()) + c.Check(logbuf.String(), Matches, `(?ms).*Instance price changed to 1\.00 at 20.* changed to 2\.00 .* changed to 3\.00 .*`) + c.Check(logbuf.String(), Not(Matches), `(?ms).*changed to 2\.00 .* changed to 2\.00 .*`) +} + type FakeProcess struct { cmdLine []string }