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