github.com/kotalco/kotal@v0.3.0/apis/stacks/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 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 "k8s.io/apimachinery/pkg/util/validation/field" 12 ) 13 14 var _ = Describe("Stacks node validation", func() { 15 createCases := []struct { 16 Title string 17 Node *Node 18 Errors field.ErrorList 19 }{ 20 { 21 Title: "missing seedPrivateKeySecretName", 22 Node: &Node{ 23 Spec: NodeSpec{ 24 Network: Mainnet, 25 Miner: true, 26 }, 27 }, 28 Errors: []*field.Error{ 29 { 30 Type: field.ErrorTypeInvalid, 31 Field: "spec.seedPrivateKeySecretName", 32 BadValue: "", 33 Detail: "seedPrivateKeySecretName is required if node is miner", 34 }, 35 }, 36 }, 37 { 38 Title: "seedPrivateKeySecretName is given for non miner node", 39 Node: &Node{ 40 Spec: NodeSpec{ 41 Network: Mainnet, 42 SeedPrivateKeySecretName: "seed-private-key", 43 }, 44 }, 45 Errors: []*field.Error{ 46 { 47 Type: field.ErrorTypeInvalid, 48 Field: "spec.miner", 49 BadValue: false, 50 Detail: "node must be a miner if seedPrivateKeySecretName is given", 51 }, 52 }, 53 }, 54 { 55 Title: "mineMicroblocks is given for non miner node", 56 Node: &Node{ 57 Spec: NodeSpec{ 58 Network: Mainnet, 59 MineMicroblocks: true, 60 }, 61 }, 62 Errors: []*field.Error{ 63 { 64 Type: field.ErrorTypeInvalid, 65 Field: "spec.miner", 66 BadValue: false, 67 Detail: "node must be a miner if mineMicroblocks is true", 68 }, 69 }, 70 }, 71 } 72 73 updateCases := []struct { 74 Title string 75 OldNode *Node 76 NewNode *Node 77 Errors field.ErrorList 78 }{ 79 { 80 Title: "updated network", 81 OldNode: &Node{ 82 ObjectMeta: metav1.ObjectMeta{ 83 Name: "my-node", 84 }, 85 Spec: NodeSpec{ 86 Network: "mainnet", 87 }, 88 }, 89 NewNode: &Node{ 90 ObjectMeta: metav1.ObjectMeta{ 91 Name: "my-node", 92 }, 93 Spec: NodeSpec{ 94 Network: "testnet", 95 }, 96 }, 97 Errors: field.ErrorList{ 98 { 99 Type: field.ErrorTypeInvalid, 100 Field: "spec.network", 101 BadValue: "testnet", 102 Detail: "field is immutable", 103 }, 104 }, 105 }, 106 } 107 108 Context("While creating node", func() { 109 for _, c := range createCases { 110 func() { 111 cc := c 112 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 113 cc.Node.Default() 114 _, err := cc.Node.ValidateCreate() 115 116 errStatus := err.(*errors.StatusError) 117 118 causes := shared.ErrorsToCauses(cc.Errors) 119 120 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 121 }) 122 }() 123 } 124 }) 125 126 Context("While updating node", func() { 127 for _, c := range updateCases { 128 func() { 129 cc := c 130 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 131 cc.OldNode.Default() 132 cc.NewNode.Default() 133 _, err := cc.NewNode.ValidateUpdate(cc.OldNode) 134 135 errStatus := err.(*errors.StatusError) 136 137 causes := shared.ErrorsToCauses(cc.Errors) 138 139 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 140 }) 141 }() 142 } 143 }) 144 145 })