X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/03f277bf4b616f41ef7ed4b195d44dab83d16144..1980d00a9afeaea0bc6f266892e43de14ccd297e:/lib/dispatchcloud/node_size_test.go diff --git a/lib/dispatchcloud/node_size_test.go b/lib/dispatchcloud/node_size_test.go index bc628b5160..91c6bb1049 100644 --- a/lib/dispatchcloud/node_size_test.go +++ b/lib/dispatchcloud/node_size_test.go @@ -11,6 +11,8 @@ import ( var _ = check.Suite(&NodeSizeSuite{}) +const GiB = arvados.ByteSize(1 << 30) + type NodeSizeSuite struct{} func (*NodeSizeSuite) TestChooseNotConfigured(c *check.C) { @@ -24,41 +26,58 @@ func (*NodeSizeSuite) TestChooseNotConfigured(c *check.C) { } func (*NodeSizeSuite) TestChooseUnsatisfiable(c *check.C) { + checkUnsatisfiable := func(ctr *arvados.Container) { + _, err := ChooseInstanceType(&arvados.Cluster{InstanceTypes: map[string]arvados.InstanceType{ + "small1": {Price: 1.1, RAM: 1000000000, VCPUs: 2, Name: "small1"}, + "small2": {Price: 2.2, RAM: 2000000000, VCPUs: 4, Name: "small2"}, + "small4": {Price: 4.4, RAM: 4000000000, VCPUs: 8, Name: "small4", Scratch: GiB}, + }}, ctr) + c.Check(err, check.FitsTypeOf, ConstraintsNotSatisfiableError{}) + } + for _, rc := range []arvados.RuntimeConstraints{ {RAM: 9876543210, VCPUs: 2}, {RAM: 1234567890, VCPUs: 20}, {RAM: 1234567890, VCPUs: 2, KeepCacheRAM: 9876543210}, } { - _, err := ChooseInstanceType(&arvados.Cluster{InstanceTypes: []arvados.InstanceType{ - {Price: 1.1, RAM: 1000000000, VCPUs: 2, Name: "small1"}, - {Price: 2.2, RAM: 2000000000, VCPUs: 4, Name: "small2"}, - {Price: 4.4, RAM: 4000000000, VCPUs: 8, Name: "small4"}, - }}, &arvados.Container{RuntimeConstraints: rc}) - c.Check(err, check.Equals, ErrConstraintsNotSatisfiable) + checkUnsatisfiable(&arvados.Container{RuntimeConstraints: rc}) } + checkUnsatisfiable(&arvados.Container{ + Mounts: map[string]arvados.Mount{"/tmp": {Kind: "tmp", Capacity: int64(2 * GiB)}}, + RuntimeConstraints: arvados.RuntimeConstraints{RAM: 12345, VCPUs: 1}, + }) } func (*NodeSizeSuite) TestChoose(c *check.C) { - for _, menu := range [][]arvados.InstanceType{ + for _, menu := range []map[string]arvados.InstanceType{ { - {Price: 4.4, RAM: 4000000000, VCPUs: 8, Name: "costly"}, - {Price: 2.2, RAM: 2000000000, VCPUs: 4, Name: "best"}, - {Price: 1.1, RAM: 1000000000, VCPUs: 2, Name: "small"}, + "costly": {Price: 4.4, RAM: 4000000000, VCPUs: 8, Scratch: 2 * GiB, Name: "costly"}, + "best": {Price: 2.2, RAM: 2000000000, VCPUs: 4, Scratch: 2 * GiB, Name: "best"}, + "small": {Price: 1.1, RAM: 1000000000, VCPUs: 2, Scratch: 2 * GiB, Name: "small"}, }, { - {Price: 4.4, RAM: 4000000000, VCPUs: 8, Name: "costly"}, - {Price: 2.2, RAM: 2000000000, VCPUs: 4, Name: "goodenough"}, - {Price: 2.2, RAM: 4000000000, VCPUs: 4, Name: "best"}, - {Price: 1.1, RAM: 1000000000, VCPUs: 2, Name: "small"}, + "costly": {Price: 4.4, RAM: 4000000000, VCPUs: 8, Scratch: 2 * GiB, Name: "costly"}, + "goodenough": {Price: 2.2, RAM: 2000000000, VCPUs: 4, Scratch: 2 * GiB, Name: "goodenough"}, + "best": {Price: 2.2, RAM: 4000000000, VCPUs: 4, Scratch: 2 * GiB, Name: "best"}, + "small": {Price: 1.1, RAM: 1000000000, VCPUs: 2, Scratch: 2 * GiB, Name: "small"}, }, { - {Price: 1.1, RAM: 1000000000, VCPUs: 2, Name: "small"}, - {Price: 2.2, RAM: 2000000000, VCPUs: 4, Name: "goodenough"}, - {Price: 2.2, RAM: 4000000000, VCPUs: 4, Name: "best"}, - {Price: 4.4, RAM: 4000000000, VCPUs: 8, Name: "costly"}, + "small": {Price: 1.1, RAM: 1000000000, VCPUs: 2, Scratch: 2 * GiB, Name: "small"}, + "goodenough": {Price: 2.2, RAM: 2000000000, VCPUs: 4, Scratch: 2 * GiB, Name: "goodenough"}, + "best": {Price: 2.2, RAM: 4000000000, VCPUs: 4, Scratch: 2 * GiB, Name: "best"}, + "costly": {Price: 4.4, RAM: 4000000000, VCPUs: 8, Scratch: 2 * GiB, Name: "costly"}, + }, + { + "small": {Price: 1.1, RAM: 1000000000, VCPUs: 2, Scratch: GiB, Name: "small"}, + "nearly": {Price: 2.2, RAM: 2000000000, VCPUs: 4, Scratch: GiB, Name: "nearly"}, + "best": {Price: 3.3, RAM: 4000000000, VCPUs: 4, Scratch: 2 * GiB, Name: "best"}, + "costly": {Price: 4.4, RAM: 4000000000, VCPUs: 8, Scratch: 2 * GiB, Name: "costly"}, }, } { best, err := ChooseInstanceType(&arvados.Cluster{InstanceTypes: menu}, &arvados.Container{ + Mounts: map[string]arvados.Mount{ + "/tmp": {Kind: "tmp", Capacity: 2 * int64(GiB)}, + }, RuntimeConstraints: arvados.RuntimeConstraints{ VCPUs: 2, RAM: 987654321, @@ -69,5 +88,34 @@ func (*NodeSizeSuite) TestChoose(c *check.C) { c.Check(best.Name, check.Equals, "best") c.Check(best.RAM >= 1234567890, check.Equals, true) c.Check(best.VCPUs >= 2, check.Equals, true) + c.Check(best.Scratch >= 2*GiB, check.Equals, true) } } + +func (*NodeSizeSuite) TestChoosePreemptable(c *check.C) { + menu := map[string]arvados.InstanceType{ + "costly": {Price: 4.4, RAM: 4000000000, VCPUs: 8, Scratch: 2 * GiB, Preemptible: true, Name: "costly"}, + "almost best": {Price: 2.2, RAM: 2000000000, VCPUs: 4, Scratch: 2 * GiB, Name: "almost best"}, + "best": {Price: 2.2, RAM: 2000000000, VCPUs: 4, Scratch: 2 * GiB, Preemptible: true, Name: "best"}, + "small": {Price: 1.1, RAM: 1000000000, VCPUs: 2, Scratch: 2 * GiB, Preemptible: true, Name: "small"}, + } + best, err := ChooseInstanceType(&arvados.Cluster{InstanceTypes: menu}, &arvados.Container{ + Mounts: map[string]arvados.Mount{ + "/tmp": {Kind: "tmp", Capacity: 2 * int64(GiB)}, + }, + RuntimeConstraints: arvados.RuntimeConstraints{ + VCPUs: 2, + RAM: 987654321, + KeepCacheRAM: 123456789, + }, + SchedulingParameters: arvados.SchedulingParameters{ + Preemptible: true, + }, + }) + c.Check(err, check.IsNil) + c.Check(best.Name, check.Equals, "best") + c.Check(best.RAM >= 1234567890, check.Equals, true) + c.Check(best.VCPUs >= 2, check.Equals, true) + c.Check(best.Scratch >= 2*GiB, check.Equals, true) + c.Check(best.Preemptible, check.Equals, true) +}