github.com/kotalco/kotal@v0.3.0/apis/aptos/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("Aptos node validation", func() { 15 createCases := []struct { 16 Title string 17 Node *Node 18 Errors field.ErrorList 19 }{ 20 { 21 Title: "missing peerId", 22 Node: &Node{ 23 ObjectMeta: metav1.ObjectMeta{ 24 Name: "my-node", 25 }, 26 Spec: NodeSpec{ 27 Network: Devnet, 28 NodePrivateKeySecretName: "my-private-key", 29 }, 30 }, 31 Errors: field.ErrorList{ 32 { 33 Type: field.ErrorTypeInvalid, 34 Field: "spec.peerId", 35 BadValue: "", 36 Detail: "must provide peerId if nodePrivateKeySecretName is provided", 37 }, 38 }, 39 }, 40 { 41 Title: "missing nodePrivateKeySecretName", 42 Node: &Node{ 43 ObjectMeta: metav1.ObjectMeta{ 44 Name: "my-node", 45 }, 46 Spec: NodeSpec{ 47 Network: Devnet, 48 PeerId: "76c8ca8bb75d1abd853fc17b70cc72cb78a63425fa85be96743825d93cc57d6f", 49 }, 50 }, 51 Errors: field.ErrorList{ 52 { 53 Type: field.ErrorTypeInvalid, 54 Field: "spec.nodePrivateKeySecretName", 55 BadValue: "", 56 Detail: "must provide nodePrivateKeySecretName if peerId is provided", 57 }, 58 }, 59 }, 60 } 61 62 updateCases := []struct { 63 Title string 64 OldNode *Node 65 NewNode *Node 66 Errors field.ErrorList 67 }{ 68 { 69 Title: "updated network", 70 OldNode: &Node{ 71 ObjectMeta: metav1.ObjectMeta{ 72 Name: "my-node", 73 }, 74 Spec: NodeSpec{ 75 Network: Devnet, 76 }, 77 }, 78 NewNode: &Node{ 79 ObjectMeta: metav1.ObjectMeta{ 80 Name: "my-node", 81 }, 82 Spec: NodeSpec{ 83 Network: Testnet, 84 }, 85 }, 86 Errors: field.ErrorList{ 87 { 88 Type: field.ErrorTypeInvalid, 89 Field: "spec.network", 90 BadValue: Testnet, 91 Detail: "field is immutable", 92 }, 93 }, 94 }, 95 { 96 Title: "missing peerId", 97 OldNode: &Node{ 98 ObjectMeta: metav1.ObjectMeta{ 99 Name: "my-node", 100 }, 101 Spec: NodeSpec{ 102 Network: Devnet, 103 NodePrivateKeySecretName: "my-private-key", 104 PeerId: "76c8ca8bb75d1abd853fc17b70cc72cb78a63425fa85be96743825d93cc57d6f", 105 }, 106 }, 107 NewNode: &Node{ 108 ObjectMeta: metav1.ObjectMeta{ 109 Name: "my-node", 110 }, 111 Spec: NodeSpec{ 112 Network: Devnet, 113 NodePrivateKeySecretName: "my-private-key", 114 }, 115 }, 116 Errors: field.ErrorList{ 117 { 118 Type: field.ErrorTypeInvalid, 119 Field: "spec.peerId", 120 BadValue: "", 121 Detail: "must provide peerId if nodePrivateKeySecretName is provided", 122 }, 123 }, 124 }, 125 { 126 Title: "missing nodePrivateKeySecretName", 127 OldNode: &Node{ 128 ObjectMeta: metav1.ObjectMeta{ 129 Name: "my-node", 130 }, 131 Spec: NodeSpec{ 132 Network: Devnet, 133 NodePrivateKeySecretName: "my-private-key", 134 PeerId: "76c8ca8bb75d1abd853fc17b70cc72cb78a63425fa85be96743825d93cc57d6f", 135 }, 136 }, 137 NewNode: &Node{ 138 ObjectMeta: metav1.ObjectMeta{ 139 Name: "my-node", 140 }, 141 Spec: NodeSpec{ 142 Network: Devnet, 143 PeerId: "76c8ca8bb75d1abd853fc17b70cc72cb78a63425fa85be96743825d93cc57d6f", 144 }, 145 }, 146 Errors: field.ErrorList{ 147 { 148 Type: field.ErrorTypeInvalid, 149 Field: "spec.nodePrivateKeySecretName", 150 BadValue: "", 151 Detail: "must provide nodePrivateKeySecretName if peerId is provided", 152 }, 153 }, 154 }, 155 } 156 157 Context("While creating node", func() { 158 for _, c := range createCases { 159 func() { 160 cc := c 161 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 162 cc.Node.Default() 163 _, err := cc.Node.ValidateCreate() 164 165 errStatus := err.(*errors.StatusError) 166 167 causes := shared.ErrorsToCauses(cc.Errors) 168 169 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 170 }) 171 }() 172 } 173 }) 174 175 Context("While updating node", func() { 176 for _, c := range updateCases { 177 func() { 178 cc := c 179 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 180 cc.OldNode.Default() 181 cc.NewNode.Default() 182 _, err := cc.NewNode.ValidateUpdate(cc.OldNode) 183 184 errStatus := err.(*errors.StatusError) 185 186 causes := shared.ErrorsToCauses(cc.Errors) 187 188 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 189 }) 190 }() 191 } 192 }) 193 194 })