github.com/kotalco/kotal@v0.3.0/apis/ethereum2/v1alpha1/beacon_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 "k8s.io/apimachinery/pkg/util/validation/field" 11 ) 12 13 var _ = Describe("Ethereum 2.0 beacon node validation", func() { 14 15 createCases := []struct { 16 Title string 17 Node *BeaconNode 18 Errors field.ErrorList 19 }{ 20 { 21 Title: "Node #1", 22 Node: &BeaconNode{ 23 Spec: BeaconNodeSpec{ 24 Network: "mainnet", 25 Client: PrysmClient, 26 REST: true, 27 }, 28 }, 29 Errors: field.ErrorList{ 30 { 31 Type: field.ErrorTypeInvalid, 32 Field: "spec.rest", 33 BadValue: true, 34 Detail: "not supported by prysm client", 35 }, 36 }, 37 }, 38 { 39 Title: "Node #2", 40 Node: &BeaconNode{ 41 Spec: BeaconNodeSpec{ 42 Network: "mainnet", 43 Client: PrysmClient, 44 REST: true, 45 }, 46 }, 47 Errors: field.ErrorList{ 48 { 49 Type: field.ErrorTypeInvalid, 50 Field: "spec.rest", 51 BadValue: true, 52 Detail: "not supported by prysm client", 53 }, 54 }, 55 }, 56 { 57 Title: "Node #3", 58 Node: &BeaconNode{ 59 Spec: BeaconNodeSpec{ 60 Network: "mainnet", 61 Client: TekuClient, 62 RPC: true, 63 }, 64 }, 65 Errors: field.ErrorList{ 66 { 67 Type: field.ErrorTypeInvalid, 68 Field: "spec.rpc", 69 BadValue: true, 70 Detail: "not supported by teku client", 71 }, 72 }, 73 }, 74 { 75 Title: "Node #4", 76 Node: &BeaconNode{ 77 Spec: BeaconNodeSpec{ 78 Network: "mainnet", 79 Client: LighthouseClient, 80 RPC: true, 81 }, 82 }, 83 Errors: field.ErrorList{ 84 { 85 Type: field.ErrorTypeInvalid, 86 Field: "spec.rpc", 87 BadValue: true, 88 Detail: "not supported by lighthouse client", 89 }, 90 }, 91 }, 92 { 93 Title: "Node #5", 94 Node: &BeaconNode{ 95 Spec: BeaconNodeSpec{ 96 Network: "mainnet", 97 Client: PrysmClient, 98 }, 99 }, 100 Errors: field.ErrorList{ 101 { 102 Type: field.ErrorTypeInvalid, 103 Field: "spec.rpc", 104 BadValue: false, 105 Detail: "can't be disabled in prysm client", 106 }, 107 }, 108 }, 109 { 110 Title: "Node #6", 111 Node: &BeaconNode{ 112 Spec: BeaconNodeSpec{ 113 Network: "mainnet", 114 Client: TekuClient, 115 GRPC: true, 116 }, 117 }, 118 Errors: field.ErrorList{ 119 { 120 Type: field.ErrorTypeInvalid, 121 Field: "spec.grpc", 122 BadValue: true, 123 Detail: "not supported by teku client", 124 }, 125 }, 126 }, 127 { 128 Title: "Node #9", 129 Node: &BeaconNode{ 130 Spec: BeaconNodeSpec{ 131 Network: "mainnet", 132 Client: TekuClient, 133 CertSecretName: "my-cert", 134 }, 135 }, 136 Errors: field.ErrorList{ 137 { 138 Type: field.ErrorTypeInvalid, 139 Field: "spec.certSecretName", 140 BadValue: "my-cert", 141 Detail: "not supported by teku client", 142 }, 143 }, 144 }, 145 } 146 147 updateCases := []struct { 148 Title string 149 OldNode *BeaconNode 150 NewNode *BeaconNode 151 Errors field.ErrorList 152 }{ 153 { 154 Title: "Node #1", 155 OldNode: &BeaconNode{ 156 Spec: BeaconNodeSpec{ 157 Network: "mainnet", 158 Client: TekuClient, 159 }, 160 }, 161 NewNode: &BeaconNode{ 162 Spec: BeaconNodeSpec{ 163 Network: "goerli", 164 Client: TekuClient, 165 }, 166 }, 167 Errors: field.ErrorList{ 168 { 169 Type: field.ErrorTypeInvalid, 170 Field: "spec.network", 171 BadValue: "goerli", 172 Detail: "field is immutable", 173 }, 174 }, 175 }, 176 { 177 Title: "Node #2", 178 OldNode: &BeaconNode{ 179 Spec: BeaconNodeSpec{ 180 Network: "mainnet", 181 Client: TekuClient, 182 }, 183 }, 184 NewNode: &BeaconNode{ 185 Spec: BeaconNodeSpec{ 186 Network: "mainnet", 187 Client: PrysmClient, 188 }, 189 }, 190 Errors: field.ErrorList{ 191 { 192 Type: field.ErrorTypeInvalid, 193 Field: "spec.client", 194 BadValue: PrysmClient, 195 Detail: "field is immutable", 196 }, 197 }, 198 }, 199 } 200 201 Context("While creating beacon node", func() { 202 for _, c := range createCases { 203 func() { 204 cc := c 205 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 206 cc.Node.Default() 207 _, err := cc.Node.ValidateCreate() 208 Expect(err).ToNot(BeNil()) 209 210 errStatus := err.(*errors.StatusError) 211 212 causes := shared.ErrorsToCauses(cc.Errors) 213 214 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 215 }) 216 }() 217 } 218 }) 219 220 Context("While updating beacon node", func() { 221 for _, c := range updateCases { 222 func() { 223 cc := c 224 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 225 cc.NewNode.Default() 226 cc.OldNode.Default() 227 _, err := cc.NewNode.ValidateUpdate(cc.OldNode) 228 Expect(err).ToNot(BeNil()) 229 230 errStatus := err.(*errors.StatusError) 231 232 causes := shared.ErrorsToCauses(cc.Errors) 233 234 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 235 }) 236 }() 237 } 238 }) 239 240 })