github.com/kotalco/kotal@v0.3.0/apis/ethereum2/v1alpha1/beacon_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  	"k8s.io/apimachinery/pkg/util/validation/field"
    11  )
    12  
    13  var _ = Describe("Ethereum 2.0 beacon node validation", func() {
    14  
    15  	createCases := []struct {
    16  		Title  string
    17  		Node   *BeaconNode
    18  		Errors field.ErrorList
    19  	}{
    20  		{
    21  			Title: "Node #1",
    22  			Node: &BeaconNode{
    23  				Spec: BeaconNodeSpec{
    24  					Network: "mainnet",
    25  					Client:  PrysmClient,
    26  					REST:    true,
    27  				},
    28  			},
    29  			Errors: field.ErrorList{
    30  				{
    31  					Type:     field.ErrorTypeInvalid,
    32  					Field:    "spec.rest",
    33  					BadValue: true,
    34  					Detail:   "not supported by prysm client",
    35  				},
    36  			},
    37  		},
    38  		{
    39  			Title: "Node #2",
    40  			Node: &BeaconNode{
    41  				Spec: BeaconNodeSpec{
    42  					Network: "mainnet",
    43  					Client:  PrysmClient,
    44  					REST:    true,
    45  				},
    46  			},
    47  			Errors: field.ErrorList{
    48  				{
    49  					Type:     field.ErrorTypeInvalid,
    50  					Field:    "spec.rest",
    51  					BadValue: true,
    52  					Detail:   "not supported by prysm client",
    53  				},
    54  			},
    55  		},
    56  		{
    57  			Title: "Node #3",
    58  			Node: &BeaconNode{
    59  				Spec: BeaconNodeSpec{
    60  					Network: "mainnet",
    61  					Client:  TekuClient,
    62  					RPC:     true,
    63  				},
    64  			},
    65  			Errors: field.ErrorList{
    66  				{
    67  					Type:     field.ErrorTypeInvalid,
    68  					Field:    "spec.rpc",
    69  					BadValue: true,
    70  					Detail:   "not supported by teku client",
    71  				},
    72  			},
    73  		},
    74  		{
    75  			Title: "Node #4",
    76  			Node: &BeaconNode{
    77  				Spec: BeaconNodeSpec{
    78  					Network: "mainnet",
    79  					Client:  LighthouseClient,
    80  					RPC:     true,
    81  				},
    82  			},
    83  			Errors: field.ErrorList{
    84  				{
    85  					Type:     field.ErrorTypeInvalid,
    86  					Field:    "spec.rpc",
    87  					BadValue: true,
    88  					Detail:   "not supported by lighthouse client",
    89  				},
    90  			},
    91  		},
    92  		{
    93  			Title: "Node #5",
    94  			Node: &BeaconNode{
    95  				Spec: BeaconNodeSpec{
    96  					Network: "mainnet",
    97  					Client:  PrysmClient,
    98  				},
    99  			},
   100  			Errors: field.ErrorList{
   101  				{
   102  					Type:     field.ErrorTypeInvalid,
   103  					Field:    "spec.rpc",
   104  					BadValue: false,
   105  					Detail:   "can't be disabled in prysm client",
   106  				},
   107  			},
   108  		},
   109  		{
   110  			Title: "Node #6",
   111  			Node: &BeaconNode{
   112  				Spec: BeaconNodeSpec{
   113  					Network: "mainnet",
   114  					Client:  TekuClient,
   115  					GRPC:    true,
   116  				},
   117  			},
   118  			Errors: field.ErrorList{
   119  				{
   120  					Type:     field.ErrorTypeInvalid,
   121  					Field:    "spec.grpc",
   122  					BadValue: true,
   123  					Detail:   "not supported by teku client",
   124  				},
   125  			},
   126  		},
   127  		{
   128  			Title: "Node #9",
   129  			Node: &BeaconNode{
   130  				Spec: BeaconNodeSpec{
   131  					Network:        "mainnet",
   132  					Client:         TekuClient,
   133  					CertSecretName: "my-cert",
   134  				},
   135  			},
   136  			Errors: field.ErrorList{
   137  				{
   138  					Type:     field.ErrorTypeInvalid,
   139  					Field:    "spec.certSecretName",
   140  					BadValue: "my-cert",
   141  					Detail:   "not supported by teku client",
   142  				},
   143  			},
   144  		},
   145  	}
   146  
   147  	updateCases := []struct {
   148  		Title   string
   149  		OldNode *BeaconNode
   150  		NewNode *BeaconNode
   151  		Errors  field.ErrorList
   152  	}{
   153  		{
   154  			Title: "Node #1",
   155  			OldNode: &BeaconNode{
   156  				Spec: BeaconNodeSpec{
   157  					Network: "mainnet",
   158  					Client:  TekuClient,
   159  				},
   160  			},
   161  			NewNode: &BeaconNode{
   162  				Spec: BeaconNodeSpec{
   163  					Network: "goerli",
   164  					Client:  TekuClient,
   165  				},
   166  			},
   167  			Errors: field.ErrorList{
   168  				{
   169  					Type:     field.ErrorTypeInvalid,
   170  					Field:    "spec.network",
   171  					BadValue: "goerli",
   172  					Detail:   "field is immutable",
   173  				},
   174  			},
   175  		},
   176  		{
   177  			Title: "Node #2",
   178  			OldNode: &BeaconNode{
   179  				Spec: BeaconNodeSpec{
   180  					Network: "mainnet",
   181  					Client:  TekuClient,
   182  				},
   183  			},
   184  			NewNode: &BeaconNode{
   185  				Spec: BeaconNodeSpec{
   186  					Network: "mainnet",
   187  					Client:  PrysmClient,
   188  				},
   189  			},
   190  			Errors: field.ErrorList{
   191  				{
   192  					Type:     field.ErrorTypeInvalid,
   193  					Field:    "spec.client",
   194  					BadValue: PrysmClient,
   195  					Detail:   "field is immutable",
   196  				},
   197  			},
   198  		},
   199  	}
   200  
   201  	Context("While creating beacon node", func() {
   202  		for _, c := range createCases {
   203  			func() {
   204  				cc := c
   205  				It(fmt.Sprintf("Should validate %s", cc.Title), func() {
   206  					cc.Node.Default()
   207  					_, err := cc.Node.ValidateCreate()
   208  					Expect(err).ToNot(BeNil())
   209  
   210  					errStatus := err.(*errors.StatusError)
   211  
   212  					causes := shared.ErrorsToCauses(cc.Errors)
   213  
   214  					Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes))
   215  				})
   216  			}()
   217  		}
   218  	})
   219  
   220  	Context("While updating beacon node", func() {
   221  		for _, c := range updateCases {
   222  			func() {
   223  				cc := c
   224  				It(fmt.Sprintf("Should validate %s", cc.Title), func() {
   225  					cc.NewNode.Default()
   226  					cc.OldNode.Default()
   227  					_, err := cc.NewNode.ValidateUpdate(cc.OldNode)
   228  					Expect(err).ToNot(BeNil())
   229  
   230  					errStatus := err.(*errors.StatusError)
   231  
   232  					causes := shared.ErrorsToCauses(cc.Errors)
   233  
   234  					Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes))
   235  				})
   236  			}()
   237  		}
   238  	})
   239  
   240  })