12199: Move services/dispatchcloud to lib/dispatchcloud.
[arvados.git] / lib / dispatchcloud / node_size_test.go
diff --git a/lib/dispatchcloud/node_size_test.go b/lib/dispatchcloud/node_size_test.go
new file mode 100644 (file)
index 0000000..bc628b5
--- /dev/null
@@ -0,0 +1,73 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+package dispatchcloud
+
+import (
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
+       check "gopkg.in/check.v1"
+)
+
+var _ = check.Suite(&NodeSizeSuite{})
+
+type NodeSizeSuite struct{}
+
+func (*NodeSizeSuite) TestChooseNotConfigured(c *check.C) {
+       _, err := ChooseInstanceType(&arvados.Cluster{}, &arvados.Container{
+               RuntimeConstraints: arvados.RuntimeConstraints{
+                       RAM:   1234567890,
+                       VCPUs: 2,
+               },
+       })
+       c.Check(err, check.Equals, ErrInstanceTypesNotConfigured)
+}
+
+func (*NodeSizeSuite) TestChooseUnsatisfiable(c *check.C) {
+       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)
+       }
+}
+
+func (*NodeSizeSuite) TestChoose(c *check.C) {
+       for _, menu := range [][]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"},
+               },
+               {
+                       {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"},
+               },
+               {
+                       {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"},
+               },
+       } {
+               best, err := ChooseInstanceType(&arvados.Cluster{InstanceTypes: menu}, &arvados.Container{
+                       RuntimeConstraints: arvados.RuntimeConstraints{
+                               VCPUs:        2,
+                               RAM:          987654321,
+                               KeepCacheRAM: 123456789,
+                       },
+               })
+               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)
+       }
+}