github.com/ranjib/nomad@v0.1.1-0.20160225204057-97751b02f70b/nomad/structs/node_class_test.go (about) 1 package structs 2 3 import ( 4 "reflect" 5 "testing" 6 ) 7 8 func testNode() *Node { 9 return &Node{ 10 ID: GenerateUUID(), 11 Datacenter: "dc1", 12 Name: "foobar", 13 Attributes: map[string]string{ 14 "kernel.name": "linux", 15 "arch": "x86", 16 "version": "0.1.0", 17 "driver.exec": "1", 18 }, 19 Resources: &Resources{ 20 CPU: 4000, 21 MemoryMB: 8192, 22 DiskMB: 100 * 1024, 23 IOPS: 150, 24 Networks: []*NetworkResource{ 25 &NetworkResource{ 26 Device: "eth0", 27 CIDR: "192.168.0.100/32", 28 MBits: 1000, 29 }, 30 }, 31 }, 32 Links: map[string]string{ 33 "consul": "foobar.dc1", 34 }, 35 Meta: map[string]string{ 36 "pci-dss": "true", 37 }, 38 NodeClass: "linux-medium-pci", 39 Status: NodeStatusReady, 40 } 41 } 42 43 func TestNode_ComputedClass(t *testing.T) { 44 // Create a node and gets it computed class 45 n := testNode() 46 if err := n.ComputeClass(); err != nil { 47 t.Fatalf("ComputeClass() failed: %v", err) 48 } 49 if n.ComputedClass == "" { 50 t.Fatal("ComputeClass() didn't set computed class") 51 } 52 old := n.ComputedClass 53 54 // Compute again to ensure determinism 55 if err := n.ComputeClass(); err != nil { 56 t.Fatalf("ComputeClass() failed: %v", err) 57 } 58 if old != n.ComputedClass { 59 t.Fatalf("ComputeClass() should have returned same class; got %v; want %v", n.ComputedClass, old) 60 } 61 62 // Modify a field and compute the class again. 63 n.Datacenter = "New DC" 64 if err := n.ComputeClass(); err != nil { 65 t.Fatalf("ComputeClass() failed: %v", err) 66 } 67 if n.ComputedClass == "" { 68 t.Fatal("ComputeClass() didn't set computed class") 69 } 70 71 if old == n.ComputedClass { 72 t.Fatal("ComputeClass() returned same computed class") 73 } 74 } 75 76 func TestNode_ComputedClass_Ignore(t *testing.T) { 77 // Create a node and gets it computed class 78 n := testNode() 79 if err := n.ComputeClass(); err != nil { 80 t.Fatalf("ComputeClass() failed: %v", err) 81 } 82 if n.ComputedClass == "" { 83 t.Fatal("ComputeClass() didn't set computed class") 84 } 85 old := n.ComputedClass 86 87 // Modify an ignored field and compute the class again. 88 n.ID = "New ID" 89 if err := n.ComputeClass(); err != nil { 90 t.Fatalf("ComputeClass() failed: %v", err) 91 } 92 if n.ComputedClass == "" { 93 t.Fatal("ComputeClass() didn't set computed class") 94 } 95 96 if old != n.ComputedClass { 97 t.Fatal("ComputeClass() should have ignored field") 98 } 99 } 100 101 func TestNode_ComputedClass_Attr(t *testing.T) { 102 // Create a node and gets it computed class 103 n := testNode() 104 if err := n.ComputeClass(); err != nil { 105 t.Fatalf("ComputeClass() failed: %v", err) 106 } 107 if n.ComputedClass == "" { 108 t.Fatal("ComputeClass() didn't set computed class") 109 } 110 old := n.ComputedClass 111 112 // Add a unique addr and compute the class again 113 n.Attributes["unique.foo"] = "bar" 114 if err := n.ComputeClass(); err != nil { 115 t.Fatalf("ComputeClass() failed: %v", err) 116 } 117 if old != n.ComputedClass { 118 t.Fatal("ComputeClass() didn't ignore unique attr suffix") 119 } 120 121 // Modify an attribute and compute the class again. 122 n.Attributes["version"] = "New Version" 123 if err := n.ComputeClass(); err != nil { 124 t.Fatalf("ComputeClass() failed: %v", err) 125 } 126 if n.ComputedClass == "" { 127 t.Fatal("ComputeClass() didn't set computed class") 128 } 129 if old == n.ComputedClass { 130 t.Fatal("ComputeClass() ignored attribute change") 131 } 132 old = n.ComputedClass 133 } 134 135 func TestNode_ComputedClass_Meta(t *testing.T) { 136 // Create a node and gets it computed class 137 n := testNode() 138 if err := n.ComputeClass(); err != nil { 139 t.Fatalf("ComputeClass() failed: %v", err) 140 } 141 if n.ComputedClass == "" { 142 t.Fatal("ComputeClass() didn't set computed class") 143 } 144 old := n.ComputedClass 145 146 // Modify a meta key and compute the class again. 147 n.Meta["pci-dss"] = "false" 148 if err := n.ComputeClass(); err != nil { 149 t.Fatalf("ComputeClass() failed: %v", err) 150 } 151 if n.ComputedClass == "" { 152 t.Fatal("ComputeClass() didn't set computed class") 153 } 154 if old == n.ComputedClass { 155 t.Fatal("ComputeClass() ignored meta change") 156 } 157 old = n.ComputedClass 158 159 // Add a unique meta key and compute the class again. 160 n.Meta["unique.foo"] = "ignore" 161 if err := n.ComputeClass(); err != nil { 162 t.Fatalf("ComputeClass() failed: %v", err) 163 } 164 if n.ComputedClass == "" { 165 t.Fatal("ComputeClass() didn't set computed class") 166 } 167 if old != n.ComputedClass { 168 t.Fatal("ComputeClass() didn't ignore unique meta key") 169 } 170 } 171 172 func TestNode_EscapedConstraints(t *testing.T) { 173 // Non-escaped constraints 174 ne1 := &Constraint{ 175 LTarget: "${attr.kernel.name}", 176 RTarget: "linux", 177 Operand: "=", 178 } 179 ne2 := &Constraint{ 180 LTarget: "${meta.key_foo}", 181 RTarget: "linux", 182 Operand: "<", 183 } 184 ne3 := &Constraint{ 185 LTarget: "${node.dc}", 186 RTarget: "test", 187 Operand: "!=", 188 } 189 190 // Escaped constraints 191 e1 := &Constraint{ 192 LTarget: "${attr.unique.kernel.name}", 193 RTarget: "linux", 194 Operand: "=", 195 } 196 e2 := &Constraint{ 197 LTarget: "${meta.unique.key_foo}", 198 RTarget: "linux", 199 Operand: "<", 200 } 201 e3 := &Constraint{ 202 LTarget: "${unique.node.id}", 203 RTarget: "test", 204 Operand: "!=", 205 } 206 constraints := []*Constraint{ne1, ne2, ne3, e1, e2, e3} 207 expected := []*Constraint{ne1, ne2, ne3} 208 if act := EscapedConstraints(constraints); reflect.DeepEqual(act, expected) { 209 t.Fatalf("EscapedConstraints(%v) returned %v; want %v", constraints, act, expected) 210 } 211 }