github.com/kotalco/kotal@v0.3.0/apis/ipfs/v1alpha1/cluster_peer_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("IPFS cluster peer validation", func() { 14 createCases := []struct { 15 Title string 16 Peer *ClusterPeer 17 Errors field.ErrorList 18 }{ 19 { 20 Title: "Cluster Peer #1", 21 Peer: &ClusterPeer{ 22 Spec: ClusterPeerSpec{ 23 ID: "12D3KooWBcEtY8GH4mNkri9kM3haeWhEXtQV7mi81ErWrqLYGuiq", 24 }, 25 }, 26 Errors: field.ErrorList{ 27 { 28 Type: field.ErrorTypeInvalid, 29 Field: "spec.privateKeySecretName", 30 BadValue: "", 31 Detail: "must provide privateKeySecretName if id is provided", 32 }, 33 }, 34 }, 35 { 36 Title: "Cluster Peer #1", 37 Peer: &ClusterPeer{ 38 Spec: ClusterPeerSpec{ 39 PrivateKeySecretName: "my-cluster-privatekey", 40 }, 41 }, 42 Errors: field.ErrorList{ 43 { 44 Type: field.ErrorTypeInvalid, 45 Field: "spec.id", 46 BadValue: "", 47 Detail: "must provide id if privateKeySecretName is provided", 48 }, 49 }, 50 }, 51 } 52 53 updateCases := []struct { 54 Title string 55 Peer *ClusterPeer 56 NewPeer *ClusterPeer 57 Errors field.ErrorList 58 }{ 59 { 60 Title: "Cluster Peer #1", 61 Peer: &ClusterPeer{ 62 Spec: ClusterPeerSpec{ 63 ID: "12D3KooWBcEtY8GH4mNkri9kM3haeWhEXtQV7mi81ErWrqLYGuiq", 64 PrivateKeySecretName: "my-cluster-privatekey", 65 }, 66 }, 67 NewPeer: &ClusterPeer{ 68 Spec: ClusterPeerSpec{ 69 ID: "12D3KooWBcEtY8GH4mNkri9kM3haeWhEXtQV7mi81ErWrqLYGuiq", 70 }, 71 }, 72 Errors: field.ErrorList{ 73 { 74 Type: field.ErrorTypeInvalid, 75 Field: "spec.privateKeySecretName", 76 BadValue: "", 77 Detail: "must provide privateKeySecretName if id is provided", 78 }, 79 }, 80 }, 81 { 82 Title: "Cluster Peer #2", 83 Peer: &ClusterPeer{ 84 Spec: ClusterPeerSpec{ 85 PrivateKeySecretName: "my-cluster-privatekey", 86 ID: "12D3KooWBcEtY8GH4mNkri9kM3haeWhEXtQV7mi81ErWrqLYGuiq", 87 }, 88 }, 89 NewPeer: &ClusterPeer{ 90 Spec: ClusterPeerSpec{ 91 PrivateKeySecretName: "my-cluster-privatekey", 92 }, 93 }, 94 Errors: field.ErrorList{ 95 { 96 Type: field.ErrorTypeInvalid, 97 Field: "spec.id", 98 BadValue: "", 99 Detail: "must provide id if privateKeySecretName is provided", 100 }, 101 }, 102 }, 103 { 104 Title: "Cluster Peer #3", 105 Peer: &ClusterPeer{ 106 Spec: ClusterPeerSpec{ 107 Consensus: CRDT, 108 }, 109 }, 110 NewPeer: &ClusterPeer{ 111 Spec: ClusterPeerSpec{ 112 Consensus: Raft, 113 }, 114 }, 115 Errors: field.ErrorList{ 116 { 117 Type: field.ErrorTypeInvalid, 118 Field: "spec.consensus", 119 BadValue: Raft, 120 Detail: "field is immutable", 121 }, 122 }, 123 }, 124 { 125 Title: "Cluster Peer #4", 126 Peer: &ClusterPeer{ 127 Spec: ClusterPeerSpec{ 128 PrivateKeySecretName: "my-cluster-privatekey", 129 ID: "12D3KooWBcEtY8GH4mNkri9kM3haeWhEXtQV7mi81ErWrqLYGuiq", 130 }, 131 }, 132 NewPeer: &ClusterPeer{ 133 Spec: ClusterPeerSpec{ 134 PrivateKeySecretName: "my-cluster-privatekey", 135 ID: "12D3KooWBcEtY8GH4mNkri9kM3haeWhEXtQV7mi81ErWrqLYGuir", 136 }, 137 }, 138 Errors: field.ErrorList{ 139 { 140 Type: field.ErrorTypeInvalid, 141 Field: "spec.id", 142 BadValue: "12D3KooWBcEtY8GH4mNkri9kM3haeWhEXtQV7mi81ErWrqLYGuir", 143 Detail: "field is immutable", 144 }, 145 }, 146 }, 147 { 148 Title: "Cluster Peer #5", 149 Peer: &ClusterPeer{ 150 Spec: ClusterPeerSpec{ 151 PrivateKeySecretName: "my-cluster-privatekey", 152 ID: "12D3KooWBcEtY8GH4mNkri9kM3haeWhEXtQV7mi81ErWrqLYGuir", 153 }, 154 }, 155 NewPeer: &ClusterPeer{ 156 Spec: ClusterPeerSpec{ 157 PrivateKeySecretName: "your-cluster-privatekey", 158 ID: "12D3KooWBcEtY8GH4mNkri9kM3haeWhEXtQV7mi81ErWrqLYGuir", 159 }, 160 }, 161 Errors: field.ErrorList{ 162 { 163 Type: field.ErrorTypeInvalid, 164 Field: "spec.privateKeySecretName", 165 BadValue: "your-cluster-privatekey", 166 Detail: "field is immutable", 167 }, 168 }, 169 }, 170 } 171 172 Context("While creating cluster peer", func() { 173 for _, c := range createCases { 174 func() { 175 cc := c 176 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 177 cc.Peer.Default() 178 _, err := cc.Peer.ValidateCreate() 179 180 // all test cases has validation errors 181 Expect(err).NotTo(BeNil()) 182 183 errStatus := err.(*errors.StatusError) 184 185 causes := shared.ErrorsToCauses(cc.Errors) 186 187 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 188 }) 189 }() 190 } 191 }) 192 193 Context("While updating cluster peer", func() { 194 for _, c := range updateCases { 195 func() { 196 cc := c 197 It(fmt.Sprintf("Should validate %s", cc.Title), func() { 198 cc.Peer.Default() 199 cc.NewPeer.Default() 200 _, err := cc.NewPeer.ValidateUpdate(cc.Peer) 201 202 // all test cases has validation errors 203 Expect(err).NotTo(BeNil()) 204 205 errStatus := err.(*errors.StatusError) 206 207 causes := shared.ErrorsToCauses(cc.Errors) 208 209 Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes)) 210 }) 211 }() 212 } 213 }) 214 })