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  })