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