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