github.com/kotalco/kotal@v0.3.0/apis/stacks/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("Stacks node validation", func() {
    15  	createCases := []struct {
    16  		Title  string
    17  		Node   *Node
    18  		Errors field.ErrorList
    19  	}{
    20  		{
    21  			Title: "missing seedPrivateKeySecretName",
    22  			Node: &Node{
    23  				Spec: NodeSpec{
    24  					Network: Mainnet,
    25  					Miner:   true,
    26  				},
    27  			},
    28  			Errors: []*field.Error{
    29  				{
    30  					Type:     field.ErrorTypeInvalid,
    31  					Field:    "spec.seedPrivateKeySecretName",
    32  					BadValue: "",
    33  					Detail:   "seedPrivateKeySecretName is required if node is miner",
    34  				},
    35  			},
    36  		},
    37  		{
    38  			Title: "seedPrivateKeySecretName is given for non miner node",
    39  			Node: &Node{
    40  				Spec: NodeSpec{
    41  					Network:                  Mainnet,
    42  					SeedPrivateKeySecretName: "seed-private-key",
    43  				},
    44  			},
    45  			Errors: []*field.Error{
    46  				{
    47  					Type:     field.ErrorTypeInvalid,
    48  					Field:    "spec.miner",
    49  					BadValue: false,
    50  					Detail:   "node must be a miner if seedPrivateKeySecretName is given",
    51  				},
    52  			},
    53  		},
    54  		{
    55  			Title: "mineMicroblocks is given for non miner node",
    56  			Node: &Node{
    57  				Spec: NodeSpec{
    58  					Network:         Mainnet,
    59  					MineMicroblocks: true,
    60  				},
    61  			},
    62  			Errors: []*field.Error{
    63  				{
    64  					Type:     field.ErrorTypeInvalid,
    65  					Field:    "spec.miner",
    66  					BadValue: false,
    67  					Detail:   "node must be a miner if mineMicroblocks is true",
    68  				},
    69  			},
    70  		},
    71  	}
    72  
    73  	updateCases := []struct {
    74  		Title   string
    75  		OldNode *Node
    76  		NewNode *Node
    77  		Errors  field.ErrorList
    78  	}{
    79  		{
    80  			Title: "updated network",
    81  			OldNode: &Node{
    82  				ObjectMeta: metav1.ObjectMeta{
    83  					Name: "my-node",
    84  				},
    85  				Spec: NodeSpec{
    86  					Network: "mainnet",
    87  				},
    88  			},
    89  			NewNode: &Node{
    90  				ObjectMeta: metav1.ObjectMeta{
    91  					Name: "my-node",
    92  				},
    93  				Spec: NodeSpec{
    94  					Network: "testnet",
    95  				},
    96  			},
    97  			Errors: field.ErrorList{
    98  				{
    99  					Type:     field.ErrorTypeInvalid,
   100  					Field:    "spec.network",
   101  					BadValue: "testnet",
   102  					Detail:   "field is immutable",
   103  				},
   104  			},
   105  		},
   106  	}
   107  
   108  	Context("While creating node", func() {
   109  		for _, c := range createCases {
   110  			func() {
   111  				cc := c
   112  				It(fmt.Sprintf("Should validate %s", cc.Title), func() {
   113  					cc.Node.Default()
   114  					_, err := cc.Node.ValidateCreate()
   115  
   116  					errStatus := err.(*errors.StatusError)
   117  
   118  					causes := shared.ErrorsToCauses(cc.Errors)
   119  
   120  					Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes))
   121  				})
   122  			}()
   123  		}
   124  	})
   125  
   126  	Context("While updating node", func() {
   127  		for _, c := range updateCases {
   128  			func() {
   129  				cc := c
   130  				It(fmt.Sprintf("Should validate %s", cc.Title), func() {
   131  					cc.OldNode.Default()
   132  					cc.NewNode.Default()
   133  					_, err := cc.NewNode.ValidateUpdate(cc.OldNode)
   134  
   135  					errStatus := err.(*errors.StatusError)
   136  
   137  					causes := shared.ErrorsToCauses(cc.Errors)
   138  
   139  					Expect(errStatus.ErrStatus.Details.Causes).To(ContainElements(causes))
   140  				})
   141  			}()
   142  		}
   143  	})
   144  
   145  })