Skip to content

Commit 3ae897d

Browse files
committed
added quota tree unit tests 2
1 parent 1565b21 commit 3ae897d

File tree

4 files changed

+213
-9
lines changed

4 files changed

+213
-9
lines changed

pkg/quotaplugins/quota-forest/quota-manager/demos/manager/forest/demo.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
66
You may obtain a copy of the License at
77
8-
http://www.apache.org/licenses/LICENSE-2.0
8+
http://www.apache.org/licenses/LICENSE-2.0
99
1010
Unless required by applicable law or agreed to in writing, software
1111
distributed under the License is distributed on an "AS IS" BASIS,
@@ -18,7 +18,6 @@ package main
1818
import (
1919
"flag"
2020
"fmt"
21-
"io/ioutil"
2221
"os"
2322

2423
"github.com/project-codeflare/multi-cluster-app-dispatcher/pkg/quotaplugins/quota-forest/quota-manager/quota"
@@ -52,7 +51,7 @@ func main() {
5251
for _, treeName := range treeNames {
5352
fName := prefix + treeName + ".json"
5453
fmt.Printf("Tree file name: %s\n", fName)
55-
jsonTree, err := ioutil.ReadFile(fName)
54+
jsonTree, err := os.ReadFile(fName)
5655
if err != nil {
5756
fmt.Printf("error reading quota tree file: %s", fName)
5857
return

pkg/quotaplugins/quota-forest/quota-manager/demos/manager/tree/demo.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
66
You may obtain a copy of the License at
77
8-
http://www.apache.org/licenses/LICENSE-2.0
8+
http://www.apache.org/licenses/LICENSE-2.0
99
1010
Unless required by applicable law or agreed to in writing, software
1111
distributed under the License is distributed on an "AS IS" BASIS,
@@ -18,7 +18,6 @@ package main
1818
import (
1919
"flag"
2020
"fmt"
21-
"io/ioutil"
2221
"os"
2322

2423
"github.com/project-codeflare/multi-cluster-app-dispatcher/pkg/quotaplugins/quota-forest/quota-manager/quota"
@@ -52,7 +51,7 @@ func main() {
5251
fmt.Println(quotaManager.GetModeString())
5352

5453
// add a quota tree from file
55-
jsonTree, err := ioutil.ReadFile(treeFileName)
54+
jsonTree, err := os.ReadFile(treeFileName)
5655
if err != nil {
5756
fmt.Printf("error reading quota tree file: %s", treeFileName)
5857
return

pkg/quotaplugins/quota-forest/quota-manager/main.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
66
You may obtain a copy of the License at
77
8-
http://www.apache.org/licenses/LICENSE-2.0
8+
http://www.apache.org/licenses/LICENSE-2.0
99
1010
Unless required by applicable law or agreed to in writing, software
1111
distributed under the License is distributed on an "AS IS" BASIS,
@@ -18,7 +18,6 @@ package main
1818
import (
1919
"flag"
2020
"fmt"
21-
"io/ioutil"
2221
"os"
2322

2423
"github.com/project-codeflare/multi-cluster-app-dispatcher/pkg/quotaplugins/quota-forest/quota-manager/quota"
@@ -40,7 +39,7 @@ func main() {
4039
fmt.Println("==> Creating Quota Manager")
4140
fmt.Println("**************************")
4241
quotaManager := quota.NewManager()
43-
treeJsonString, err := ioutil.ReadFile(treeFileName)
42+
treeJsonString, err := os.ReadFile(treeFileName)
4443
if err != nil {
4544
fmt.Printf("error reading quota tree file: %s", treeFileName)
4645
return

pkg/quotaplugins/quota-forest/quota-manager/quota/quotamanager_test.go

+207
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package quota_test
1818

1919
import (
20+
"reflect"
21+
"sort"
2022
"strings"
2123
"testing"
2224
"time"
@@ -381,6 +383,211 @@ func TestQuotaManagerQuotaUsedLongRunningConsumers(t *testing.T) {
381383

382384
}
383385

386+
var (
387+
tree1String string = `{
388+
"kind": "QuotaTree",
389+
"metadata": {
390+
"name": "tree-1"
391+
},
392+
"spec": {
393+
"resourceNames": [
394+
"cpu",
395+
"memory"
396+
],
397+
"nodes": {
398+
"A": {
399+
"parent": "nil",
400+
"hard": "true",
401+
"quota": {
402+
"cpu": "10",
403+
"memory": "256"
404+
}
405+
},
406+
"B": {
407+
"parent": "A",
408+
"hard": "true",
409+
"quota": {
410+
"cpu": "2",
411+
"memory": "64"
412+
}
413+
},
414+
"C": {
415+
"parent": "A",
416+
"quota": {
417+
"cpu": "6",
418+
"memory": "64"
419+
}
420+
}
421+
}
422+
}
423+
}`
424+
425+
tree2String string = `{
426+
"kind": "QuotaTree",
427+
"metadata": {
428+
"name": "tree-2"
429+
},
430+
"spec": {
431+
"resourceNames": [
432+
"gpu"
433+
],
434+
"nodes": {
435+
"X": {
436+
"parent": "nil",
437+
"hard": "true",
438+
"quota": {
439+
"gpu": "32"
440+
}
441+
},
442+
"Y": {
443+
"parent": "X",
444+
"hard": "true",
445+
"quota": {
446+
"gpu": "16"
447+
}
448+
},
449+
"Z": {
450+
"parent": "X",
451+
"quota": {
452+
"gpu": "8"
453+
}
454+
}
455+
}
456+
}
457+
}`
458+
459+
tree3String string = `{
460+
"kind": "QuotaTree",
461+
"metadata": {
462+
"name": "tree-3"
463+
},
464+
"spec": {
465+
"resourceNames": [
466+
"count"
467+
],
468+
"nodes": {
469+
"zone": {
470+
"parent": "nil",
471+
"hard": "true",
472+
"quota": {
473+
"count": "100"
474+
}
475+
},
476+
"rack": {
477+
"parent": "zone",
478+
"hard": "true",
479+
"quota": {
480+
"count": "100"
481+
}
482+
},
483+
"server": {
484+
"parent": "rack",
485+
"quota": {
486+
"count": "100"
487+
}
488+
}
489+
}
490+
}
491+
}`
492+
)
493+
494+
// TestAddDeleteTrees : test adding, retrieving, deleting trees
495+
func TestAddDeleteTrees(t *testing.T) {
496+
qmTest := quota.NewManager()
497+
assert.NotNil(t, qmTest, "Expecting no error creating a quota manager")
498+
modeSet := qmTest.SetMode(quota.Normal)
499+
assert.True(t, modeSet, "Expecting no error setting mode to normal")
500+
mode := qmTest.GetMode()
501+
assert.True(t, mode == quota.Normal, "Expecting mode set to normal")
502+
modeString := qmTest.GetModeString()
503+
match := strings.Contains(modeString, "Normal")
504+
assert.True(t, match, "Expecting mode set to normal")
505+
// add a few trees by name
506+
treeNames := []string{"tree-1", "tree-2", "tree-3"}
507+
treeStrings := []string{tree1String, tree2String, tree3String}
508+
for i, treeString := range treeStrings {
509+
name, err := qmTest.AddTreeFromString(treeString)
510+
assert.NoError(t, err, "No error expected when adding a tree")
511+
assert.Equal(t, treeNames[i], name, "Returned name should match")
512+
}
513+
// get list of names
514+
names := qmTest.GetTreeNames()
515+
assert.ElementsMatch(t, treeNames, names, "Expecting retrieved tree names same as added names")
516+
// delete a name
517+
deletedTreeName := treeNames[0]
518+
remainingTreeNames := treeNames[1:]
519+
err := qmTest.DeleteTree(deletedTreeName)
520+
assert.NoError(t, err, "No error expected when deleting an existing tree")
521+
// get list of names after deletion
522+
names = qmTest.GetTreeNames()
523+
assert.ElementsMatch(t, remainingTreeNames, names, "Expecting retrieved tree names to reflect additions/deletions")
524+
// delete a non-existing name
525+
err = qmTest.DeleteTree(deletedTreeName)
526+
assert.Error(t, err, "Error expected when deleting a non-existing tree")
527+
}
528+
529+
// TestAddDeleteForests : test adding, retrieving, deleting forests
530+
func TestAddDeleteForests(t *testing.T) {
531+
var err error
532+
qmTest := quota.NewManager()
533+
assert.NotNil(t, qmTest, "Expecting no error creating a quota manager")
534+
modeSet := qmTest.SetMode(quota.Normal)
535+
assert.True(t, modeSet, "Expecting no error setting mode to normal")
536+
537+
// add a few trees by name
538+
treeNames := []string{"tree-1", "tree-2", "tree-3"}
539+
treeStrings := []string{tree1String, tree2String, tree3String}
540+
for i, treeString := range treeStrings {
541+
name, err := qmTest.AddTreeFromString(treeString)
542+
assert.NoError(t, err, "No error expected when adding a tree")
543+
assert.Equal(t, treeNames[i], name, "Returned name should match")
544+
}
545+
// create two forests
546+
forestNames := []string{"forest-1", "forest-2"}
547+
for _, forestName := range forestNames {
548+
err = qmTest.AddForest(forestName)
549+
assert.NoError(t, err, "No error expected when adding a forest")
550+
}
551+
// assign trees to forests
552+
err = qmTest.AddTreeToForest("forest-1", "tree-1")
553+
assert.NoError(t, err, "No error expected when adding a tree to a forest")
554+
err = qmTest.AddTreeToForest("forest-2", "tree-2")
555+
assert.NoError(t, err, "No error expected when adding a tree to a forest")
556+
err = qmTest.AddTreeToForest("forest-2", "tree-3")
557+
assert.NoError(t, err, "No error expected when adding a tree to a forest")
558+
// get list of forest names
559+
fNames := qmTest.GetForestNames()
560+
assert.ElementsMatch(t, forestNames, fNames, "Expecting retrieved forest names same as added names")
561+
// get forests map
562+
forestTreeMap := qmTest.GetForestTreeNames()
563+
for _, v := range forestTreeMap {
564+
sort.Strings(v)
565+
}
566+
inputForestTreeMap := map[string][]string{"forest-1": {"tree-1"}, "forest-2": {"tree-2", "tree-3"}}
567+
assert.True(t, reflect.DeepEqual(forestTreeMap, inputForestTreeMap),
568+
"Expecting retrieved forest tree map same as input, got %v, want %v", forestTreeMap, inputForestTreeMap)
569+
// delete a forest
570+
deletedForestName := forestNames[0]
571+
remainingForestNames := forestNames[1:]
572+
err = qmTest.DeleteForest(deletedForestName)
573+
assert.NoError(t, err, "No error expected when deleting an existing forest")
574+
// get list of forest names after deletion
575+
fNames = qmTest.GetForestNames()
576+
assert.ElementsMatch(t, remainingForestNames, fNames, "Expecting retrieved forest names to reflect additions/deletions")
577+
// delete a non-existing forest name
578+
err = qmTest.DeleteForest(deletedForestName)
579+
assert.Error(t, err, "Error expected when deleting a non-existing forest")
580+
// delete a tree from a forest
581+
err = qmTest.DeleteTreeFromForest("forest-2", "tree-2")
582+
assert.NoError(t, err, "No error expected when deleting an existing tree from an existing forest")
583+
err = qmTest.DeleteTreeFromForest("forest-2", "tree-2")
584+
assert.Error(t, err, "Error expected when deleting an non-existing tree from an existing forest")
585+
// check remaining trees after deletions
586+
names := qmTest.GetTreeNames()
587+
assert.True(t, reflect.DeepEqual(treeNames, names),
588+
"Expecting all trees after forest deletions as trees are not deleted, got %v, want %v", names, treeNames)
589+
}
590+
384591
type AllocationClassifier struct {
385592
}
386593

0 commit comments

Comments
 (0)