github.com/kotalco/kotal@v0.3.0/apis/polkadot/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  	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    11  	"k8s.io/apimachinery/pkg/util/validation/field"
    12  )
    13  
    14  var _ = Describe("Polkadot node validation", func() {
    15  	t := true
    16  	createCases := []struct {
    17  		Title  string
    18  		Node   *Node
    19  		Errors field.ErrorList
    20  	}{
    21  		{
    22  			Title: "validator node with rpc enabled",
    23  			Node: &Node{
    24  				ObjectMeta: v1.ObjectMeta{
    25  					Name: "my-node",
    26  				},
    27  				Spec: NodeSpec{
    28  					Network:   "kusama",
    29  					Validator: true,
    30  					RPC:       true,
    31  				},
    32  			},
    33  			Errors: field.ErrorList{
    34  				{
    35  					Type:     field.ErrorTypeInvalid,
    36  					Field:    "spec.rpc",
    37  					BadValue: true,
    38  					Detail:   "must be false if node is validator",
    39  				},
    40  			},
    41  		},
    42  		{
    43  			Title: "validator node with ws enabled",
    44  			Node: &Node{
    45  				ObjectMeta: v1.ObjectMeta{
    46  					Name: "my-node",
    47  				},
    48  				Spec: NodeSpec{
    49  					Network:   "kusama",
    50  					Validator: true,
    51  					WS:        true,
    52  				},
    53  			},
    54  			Errors: field.ErrorList{
    55  				{
    56  					Type:     field.ErrorTypeInvalid,
    57  					Field:    "spec.ws",
    58  					BadValue: true,
    59  					Detail:   "must be false if node is validator",
    60  				},
    61  			},
    62  		},
    63  		{
    64  			Title: "validator node with pruning enabled",
    65  			Node: &Node{
    66  				ObjectMeta: v1.ObjectMeta{
    67  					Name: "my-node",
    68  				},
    69  				Spec: NodeSpec{
    70  					Network:   "kusama",
    71  					Validator: true,
    72  					Pruning:   &t,
    73  				},
    74  			},
    75  			Errors: field.ErrorList{
    76  				{
    77  					Type:     field.ErrorTypeInvalid,
    78  					Field:    "spec.pruning",
    79  					BadValue: true,
    80  					Detail:   "must be false if node is validator",
    81  				},
    82  			},
    83  		},
    84  	}
    85  
    86  	updateCases := []struct {
    87  		Title   string
    88  		OldNode *Node
    89  		NewNode *Node
    90  		Errors  field.ErrorList
    91  	}{
    92  		{
    93  			Title: "updated network",
    94  			OldNode: &Node{
    95  				ObjectMeta: v1.ObjectMeta{
    96  					Name: "my-node",
    97  				},
    98  				Spec: NodeSpec{
    99  					Network: "kusama",
   100  				},
   101  			},
   102  			NewNode: &Node{
   103  				ObjectMeta: v1.ObjectMeta{
   104  					Name: "my-node",
   105  				},
   106  				Spec: NodeSpec{
   107  					Network: "polkadot",
   108  				},
   109  			},
   110  			Errors: field.ErrorList{
   111  				{
   112  					Type:     field.ErrorTypeInvalid,
   113  					Field:    "spec.network",
   114  					BadValue: "polkadot",
   115  					Detail:   "field is immutable",
   116  				},
   117  			},
   118  		},
   119  		{
   120  			Title: "enabling rpc for validator node",
   121  			OldNode: &Node{
   122  				ObjectMeta: v1.ObjectMeta{
   123  					Name: "my-node",
   124  				},
   125  				Spec: NodeSpec{
   126  					Network:   "kusama",
   127  					Validator: true,
   128  				},
   129  			},
   130  			NewNode: &Node{
   131  				ObjectMeta: v1.ObjectMeta{
   132  					Name: "my-node",
   133  				},
   134  				Spec: NodeSpec{
   135  					Network:   "kusama",
   136  					Validator: true,
   137  					RPC:       true,
   138  				},
   139  			},
   140  			Errors: field.ErrorList{
   141  				{
   142  					Type:     field.ErrorTypeInvalid,
   143  					Field:    "spec.rpc",
   144  					BadValue: true,
   145  					Detail:   "must be false if node is validator",
   146  				},
   147  			},
   148  		},
   149  		{
   150  			Title: "enabling ws for validator node",
   151  			OldNode: &Node{
   152  				ObjectMeta: v1.ObjectMeta{
   153  					Name: "my-node",
   154  				},
   155  				Spec: NodeSpec{
   156  					Network:   "kusama",
   157  					Validator: true,
   158  				},
   159  			},
   160  			NewNode: &Node{
   161  				ObjectMeta: v1.ObjectMeta{
   162  					Name: "my-node",
   163  				},
   164  				Spec: NodeSpec{
   165  					Network:   "kusama",
   166  					Validator: true,
   167  					WS:        true,
   168  				},
   169  			},
   170  			Errors: field.ErrorList{
   171  				{
   172  					Type:     field.ErrorTypeInvalid,
   173  					Field:    "spec.ws",
   174  					BadValue: true,
   175  					Detail:   "must be false if node is validator",
   176  				},
   177  			},
   178  		},
   179  	}
   180  
   181  	Context("While creating node", func() {
   182  		for _, c := range createCases {
   183  			func() {
   184  				cc := c
   185  				It(fmt.Sprintf("Should validate %s", cc.Title), func() {
   186  					cc.Node.Default()
   187  					_, err := cc.Node.ValidateCreate()
   188  
   189  					errStatus := err.(*errors.StatusError)
   190  
   191  					causes := shared.ErrorsToCauses(cc.Errors)
   192  
   193  					Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes))
   194  				})
   195  			}()
   196  		}
   197  	})
   198  
   199  	Context("While updating node", func() {
   200  		for _, c := range updateCases {
   201  			func() {
   202  				cc := c
   203  				It(fmt.Sprintf("Should validate %s", cc.Title), func() {
   204  					cc.OldNode.Default()
   205  					cc.NewNode.Default()
   206  					_, err := cc.NewNode.ValidateUpdate(cc.OldNode)
   207  
   208  					errStatus := err.(*errors.StatusError)
   209  
   210  					causes := shared.ErrorsToCauses(cc.Errors)
   211  
   212  					Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes))
   213  				})
   214  			}()
   215  		}
   216  	})
   217  
   218  })