github.com/kotalco/kotal@v0.3.0/apis/polkadot/v1alpha1/node_validation_webhook_test.go (about) 1 package v1alpha1 2 3 import ( 4 "fmt" 5 6 "github.com/kotalco/kotal/apis/shared" 7 . "github.com/onsi/ginkgo/v2" 8 . "github.com/onsi/gomega" 9 "k8s.io/apimachinery/pkg/api/errors" 10 v1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 "k8s.io/apimachinery/pkg/util/validation/field" 12 ) 13 14 var _ = Describe("Polkadot node validation", func() { 15 t := true 16 createCases := []struct { 17 Title string 18 Node *Node 19 Errors field.ErrorList 20 }{ 21 { 22 Title: "validator node with rpc enabled", 23 Node: &Node{ 24 ObjectMeta: v1.ObjectMeta{ 25 Name: "my-node", 26 }, 27 Spec: NodeSpec{ 28 Network: "kusama", 29 Validator: true, 30 RPC: true, 31 }, 32 }, 33 Errors: field.ErrorList{ 34 { 35 Type: field.ErrorTypeInvalid, 36 Field: "spec.rpc", 37 BadValue: true, 38 Detail: "must be false if node is validator", 39 }, 40 }, 41 }, 42 { 43 Title: "validator node with ws enabled", 44 Node: &Node{ 45 ObjectMeta: v1.ObjectMeta{ 46 Name: "my-node", 47 }, 48 Spec: NodeSpec{ 49 Network: "kusama", 50 Validator: true, 51 WS: true, 52 }, 53 }, 54 Errors: field.ErrorList{ 55 { 56 Type: field.ErrorTypeInvalid, 57 Field: "spec.ws", 58 BadValue: true, 59 Detail: "must be false if node is validator", 60 }, 61 }, 62 }, 63 { 64 Title: "validator node with pruning enabled", 65 Node: &Node{ 66 ObjectMeta: v1.ObjectMeta{ 67 Name: "my-node", 68 }, 69 Spec: NodeSpec{ 70 Network: "kusama", 71 Validator: true, 72 Pruning: &t, 73 }, 74 }, 75 Errors: field.ErrorList{ 76 { 77 Type: field.ErrorTypeInvalid, 78 Field: "spec.pruning", 79 BadValue: true, 80 Detail: "must be false if node is validator", 81 }, 82 }, 83 }, 84 } 85 86 updateCases := []struct { 87 Title string 88 OldNode *Node 89 NewNode *Node 90 Errors field.ErrorList 91 }{ 92 { 93 Title: "updated network", 94 OldNode: &Node{ 95 ObjectMeta: v1.ObjectMeta{ 96 Name: "my-node", 97 }, 98 Spec: NodeSpec{ 99 Network: "kusama", 100 }, 101 }, 102 NewNode: &Node{ 103 ObjectMeta: v1.ObjectMeta{ 104 Name: "my-node", 105 }, 106 Spec: NodeSpec{ 107 Network: "polkadot", 108 }, 109 }, 110 Errors: field.ErrorList{ 111 { 112 Type: field.ErrorTypeInvalid, 113 Field: "spec.network", 114 BadValue: "polkadot", 115 Detail: "field is immutable", 116 }, 117 }, 118 }, 119 { 120 Title: "enabling rpc for validator node", 121 OldNode: &Node{ 122 ObjectMeta: v1.ObjectMeta{ 123 Name: "my-node", 124 }, 125 Spec: NodeSpec{ 126 Network: "kusama", 127 Validator: true, 128 }, 129 }, 130 NewNode: &Node{ 131 ObjectMeta: v1.ObjectMeta{ 132 Name: "my-node", 133 }, 134 Spec: NodeSpec{ 135 Network: "kusama", 136 Validator: true, 137 RPC: true, 138 }, 139 }, 140 Errors: field.ErrorList{ 141 { 142 Type: field.ErrorTypeInvalid, 143 Field: "spec.rpc", 144 BadValue: true, 145 Detail: "must be false if node is validator", 146 }, 147 }, 148 }, 149 { 150 Title: "enabling ws for validator node", 151 OldNode: &Node{ 152 ObjectMeta: v1.ObjectMeta{ 153 Name: "my-node", 154 }, 155 Spec: NodeSpec{ 156 Network: "kusama", 157 Validator: true, 158 }, 159 }, 160 NewNode: &Node{ 161 ObjectMeta: v1.ObjectMeta{ 162 Name: "my-node", 163 }, 164 Spec: NodeSpec{ 165 Network: "kusama", 166 Validator: true, 167 WS: true, 168 }, 169 }, 170 Errors: field.ErrorList{ 171 { 172 Type: field.ErrorTypeInvalid, 173 Field: "spec.ws", 174 BadValue: true, 175 Detail: "must be false if node is validator", 176 }, 177 }, 178 }, 179 } 180 181 Context("While creating node", func() { 182 for _, c := range createCases { 183 func() { 184 cc := c 185 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 186 cc.Node.Default() 187 _, err := cc.Node.ValidateCreate() 188 189 errStatus := err.(*errors.StatusError) 190 191 causes := shared.ErrorsToCauses(cc.Errors) 192 193 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 194 }) 195 }() 196 } 197 }) 198 199 Context("While updating node", func() { 200 for _, c := range updateCases { 201 func() { 202 cc := c 203 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 204 cc.OldNode.Default() 205 cc.NewNode.Default() 206 _, err := cc.NewNode.ValidateUpdate(cc.OldNode) 207 208 errStatus := err.(*errors.StatusError) 209 210 causes := shared.ErrorsToCauses(cc.Errors) 211 212 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 213 }) 214 }() 215 } 216 }) 217 218 })