github.com/hashicorp/nomad/api@v0.0.0-20240306165712-3193ac204f65/compose_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package api 5 6 import ( 7 "testing" 8 9 "github.com/hashicorp/nomad/api/internal/testutil" 10 "github.com/shoenig/test/must" 11 ) 12 13 func TestCompose(t *testing.T) { 14 testutil.Parallel(t) 15 // Compose a task 16 task := NewTask("task1", "exec"). 17 SetConfig("foo", "bar"). 18 SetMeta("foo", "bar"). 19 Constrain(NewConstraint("kernel.name", "=", "linux")). 20 Require(&Resources{ 21 CPU: pointerOf(1250), 22 MemoryMB: pointerOf(1024), 23 DiskMB: pointerOf(2048), 24 Networks: []*NetworkResource{ 25 { 26 CIDR: "0.0.0.0/0", 27 MBits: pointerOf(100), 28 ReservedPorts: []Port{{"", 80, 0, ""}, {"", 443, 0, ""}}, 29 }, 30 }, 31 }) 32 33 // Compose a task group 34 35 st1 := NewSpreadTarget("dc1", 80) 36 st2 := NewSpreadTarget("dc2", 20) 37 grp := NewTaskGroup("grp1", 2). 38 Constrain(NewConstraint("kernel.name", "=", "linux")). 39 AddAffinity(NewAffinity("${node.class}", "=", "large", 50)). 40 AddSpread(NewSpread("${node.datacenter}", 30, []*SpreadTarget{st1, st2})). 41 SetMeta("foo", "bar"). 42 AddTask(task) 43 44 // Compose a job 45 job := NewServiceJob("job1", "myjob", "global", 2). 46 SetMeta("foo", "bar"). 47 AddDatacenter("dc1"). 48 Constrain(NewConstraint("kernel.name", "=", "linux")). 49 AddTaskGroup(grp) 50 51 // Check that the composed result looks correct 52 expect := &Job{ 53 Region: pointerOf("global"), 54 ID: pointerOf("job1"), 55 Name: pointerOf("myjob"), 56 Type: pointerOf(JobTypeService), 57 Priority: pointerOf(2), 58 Datacenters: []string{ 59 "dc1", 60 }, 61 Meta: map[string]string{ 62 "foo": "bar", 63 }, 64 Constraints: []*Constraint{ 65 { 66 LTarget: "kernel.name", 67 RTarget: "linux", 68 Operand: "=", 69 }, 70 }, 71 TaskGroups: []*TaskGroup{ 72 { 73 Name: pointerOf("grp1"), 74 Count: pointerOf(2), 75 Constraints: []*Constraint{ 76 { 77 LTarget: "kernel.name", 78 RTarget: "linux", 79 Operand: "=", 80 }, 81 }, 82 Affinities: []*Affinity{ 83 { 84 LTarget: "${node.class}", 85 RTarget: "large", 86 Operand: "=", 87 Weight: pointerOf(int8(50)), 88 }, 89 }, 90 Spreads: []*Spread{ 91 { 92 Attribute: "${node.datacenter}", 93 Weight: pointerOf(int8(30)), 94 SpreadTarget: []*SpreadTarget{ 95 { 96 Value: "dc1", 97 Percent: 80, 98 }, 99 { 100 Value: "dc2", 101 Percent: 20, 102 }, 103 }, 104 }, 105 }, 106 Tasks: []*Task{ 107 { 108 Name: "task1", 109 Driver: "exec", 110 Resources: &Resources{ 111 CPU: pointerOf(1250), 112 MemoryMB: pointerOf(1024), 113 DiskMB: pointerOf(2048), 114 Networks: []*NetworkResource{ 115 { 116 CIDR: "0.0.0.0/0", 117 MBits: pointerOf(100), 118 ReservedPorts: []Port{ 119 {"", 80, 0, ""}, 120 {"", 443, 0, ""}, 121 }, 122 }, 123 }, 124 }, 125 Constraints: []*Constraint{ 126 { 127 LTarget: "kernel.name", 128 RTarget: "linux", 129 Operand: "=", 130 }, 131 }, 132 Config: map[string]interface{}{ 133 "foo": "bar", 134 }, 135 Meta: map[string]string{ 136 "foo": "bar", 137 }, 138 }, 139 }, 140 Meta: map[string]string{ 141 "foo": "bar", 142 }, 143 }, 144 }, 145 } 146 must.Eq(t, expect, job) 147 }