From e3ac3dafe5432c81a294403e1996c306a93d48f8 Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Tue, 31 Oct 2023 10:27:45 -0400 Subject: [PATCH] 20978: Test choosing multiple instance types. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- lib/dispatchcloud/node_size_test.go | 40 ++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/dispatchcloud/node_size_test.go b/lib/dispatchcloud/node_size_test.go index 72989477fa..5d2713e982 100644 --- a/lib/dispatchcloud/node_size_test.go +++ b/lib/dispatchcloud/node_size_test.go @@ -94,12 +94,50 @@ func (*NodeSizeSuite) TestChoose(c *check.C) { }, }) c.Assert(err, check.IsNil) - c.Assert(best, check.HasLen, 1) + c.Assert(best, check.Not(check.HasLen), 0) c.Check(best[0].Name, check.Equals, "best") c.Check(best[0].RAM >= 1234567890, check.Equals, true) c.Check(best[0].VCPUs >= 2, check.Equals, true) c.Check(best[0].Scratch >= 2*GiB, check.Equals, true) + for i := range best { + // If multiple instance types are returned + // then they should all have the same price, + // because we didn't set MaximumPriceFactor>1. + c.Check(best[i].Price, check.Equals, best[0].Price) + } + } +} + +func (*NodeSizeSuite) TestMaximumPriceFactor(c *check.C) { + menu := map[string]arvados.InstanceType{ + "best+7": {Price: 3.4, RAM: 8000000000, VCPUs: 8, Scratch: 64 * GiB, Name: "best+7"}, + "best+5": {Price: 3.0, RAM: 8000000000, VCPUs: 8, Scratch: 16 * GiB, Name: "best+5"}, + "best+3": {Price: 2.6, RAM: 4000000000, VCPUs: 8, Scratch: 16 * GiB, Name: "best+3"}, + "best+2": {Price: 2.4, RAM: 4000000000, VCPUs: 8, Scratch: 4 * GiB, Name: "best+2"}, + "best+1": {Price: 2.2, RAM: 2000000000, VCPUs: 4, Scratch: 4 * GiB, Name: "best+1"}, + "best": {Price: 2.0, RAM: 2000000000, VCPUs: 4, Scratch: 2 * GiB, Name: "best"}, + "small+1": {Price: 1.1, RAM: 1000000000, VCPUs: 2, Scratch: 16 * GiB, Name: "small+1"}, + "small": {Price: 1.0, RAM: 2000000000, VCPUs: 2, Scratch: 1 * GiB, Name: "small"}, } + best, err := ChooseInstanceType(&arvados.Cluster{InstanceTypes: menu, Containers: arvados.ContainersConfig{ + MaximumPriceFactor: 1.5, + }}, &arvados.Container{ + Mounts: map[string]arvados.Mount{ + "/tmp": {Kind: "tmp", Capacity: 2 * int64(GiB)}, + }, + RuntimeConstraints: arvados.RuntimeConstraints{ + VCPUs: 2, + RAM: 987654321, + KeepCacheRAM: 123456789, + }, + }) + c.Assert(err, check.IsNil) + c.Assert(best, check.HasLen, 5) + c.Check(best[0].Name, check.Equals, "best") // best price is $2 + c.Check(best[1].Name, check.Equals, "best+1") + c.Check(best[2].Name, check.Equals, "best+2") + c.Check(best[3].Name, check.Equals, "best+3") + c.Check(best[4].Name, check.Equals, "best+5") // max price is $2 * 1.5 = $3 } func (*NodeSizeSuite) TestChooseWithBlobBuffersOverhead(c *check.C) { -- 2.30.2