github.com/IBM-Blockchain/fabric-operator@v1.0.4/pkg/manager/resources/orderernode/manager_test.go (about)

     1  /*
     2   * Copyright contributors to the Hyperledger Fabric Operator project
     3   *
     4   * SPDX-License-Identifier: Apache-2.0
     5   *
     6   * Licensed under the Apache License, Version 2.0 (the "License");
     7   * you may not use this file except in compliance with the License.
     8   * You may obtain a copy of the License at:
     9   *
    10   * 	  http://www.apache.org/licenses/LICENSE-2.0
    11   *
    12   * Unless required by applicable law or agreed to in writing, software
    13   * distributed under the License is distributed on an "AS IS" BASIS,
    14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    15   * See the License for the specific language governing permissions and
    16   * limitations under the License.
    17   */
    18  
    19  package orderernode_test
    20  
    21  import (
    22  	"context"
    23  
    24  	current "github.com/IBM-Blockchain/fabric-operator/api/v1beta1"
    25  	"github.com/IBM-Blockchain/fabric-operator/controllers/mocks"
    26  	"github.com/IBM-Blockchain/fabric-operator/pkg/manager/resources"
    27  	"github.com/IBM-Blockchain/fabric-operator/pkg/manager/resources/orderernode"
    28  	. "github.com/onsi/ginkgo/v2"
    29  	. "github.com/onsi/gomega"
    30  	"github.com/pkg/errors"
    31  	k8serror "k8s.io/apimachinery/pkg/api/errors"
    32  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    33  	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    34  	"k8s.io/apimachinery/pkg/types"
    35  	"sigs.k8s.io/controller-runtime/pkg/client"
    36  )
    37  
    38  var _ = Describe("Orderernode manager", func() {
    39  	var (
    40  		mockKubeClient *mocks.Client
    41  		manager        *orderernode.Manager
    42  		instance       metav1.Object
    43  	)
    44  
    45  	BeforeEach(func() {
    46  		mockKubeClient = &mocks.Client{}
    47  		mockKubeClient.GetStub = func(ctx context.Context, types types.NamespacedName, obj client.Object) error {
    48  			switch obj.(type) {
    49  			case *current.IBPOrderer:
    50  				o := obj.(*current.IBPOrderer)
    51  				manager.BasedOnCR(instance, o)
    52  			}
    53  			return nil
    54  		}
    55  
    56  		manager = &orderernode.Manager{
    57  			OrdererNodeFile: "../../../../definitions/orderer/orderernode.yaml",
    58  			Client:          mockKubeClient,
    59  			OverrideFunc: func(object v1.Object, d *current.IBPOrderer, action resources.Action) error {
    60  				return nil
    61  			},
    62  			LabelsFunc: func(v1.Object) map[string]string {
    63  				return map[string]string{}
    64  			},
    65  		}
    66  
    67  		instance = &metav1.ObjectMeta{}
    68  
    69  	})
    70  
    71  	Context("reconciles the orderernode instance", func() {
    72  		It("does not try to create orderernode if the get request returns an error other than 'not found'", func() {
    73  			errMsg := "connection refused"
    74  			mockKubeClient.GetReturns(errors.New(errMsg))
    75  			err := manager.Reconcile(instance, false)
    76  			Expect(err).To(HaveOccurred())
    77  			Expect(err.Error()).To(Equal(errMsg))
    78  		})
    79  
    80  		When("orderernode does not exist", func() {
    81  			BeforeEach(func() {
    82  				notFoundErr := &k8serror.StatusError{
    83  					ErrStatus: metav1.Status{
    84  						Reason: metav1.StatusReasonNotFound,
    85  					},
    86  				}
    87  				mockKubeClient.GetReturns(notFoundErr)
    88  			})
    89  
    90  			It("returns an error if the creation of the Orderernode fails", func() {
    91  				errMsg := "unable to create orderernode"
    92  				mockKubeClient.CreateReturns(errors.New(errMsg))
    93  				err := manager.Reconcile(instance, false)
    94  				Expect(err).To(HaveOccurred())
    95  				Expect(err.Error()).To(Equal(errMsg))
    96  			})
    97  
    98  			It("does not return an error on a successfull Orderernode creation", func() {
    99  				err := manager.Reconcile(instance, false)
   100  				Expect(err).NotTo(HaveOccurred())
   101  			})
   102  		})
   103  
   104  		When("orderernode already exists", func() {
   105  			It("returns an error if orderernode is updated", func() {
   106  				errMsg := "Updating orderer node is not allowed programmatically"
   107  				err := manager.Reconcile(instance, true)
   108  				Expect(err).To(HaveOccurred())
   109  				Expect(err.Error()).To(ContainSubstring(errMsg))
   110  			})
   111  		})
   112  	})
   113  
   114  	Context("check orderernode state", func() {
   115  		// TODO fix this test
   116  		// 	It("returns an error if an unexpected change in orderernode is detected", func() {
   117  		// 		num := 1
   118  		// 		dep := &current.IBPOrderer{
   119  		// 			Spec: current.IBPOrdererSpec{
   120  		// 				NodeNumber: &num,
   121  		// 			},
   122  		// 		}
   123  		// 		mockKubeClient.GetStub = func(ctx context.Context, types types.NamespacedName, obj runtime.Object) error {
   124  		// 			switch obj.(type) {
   125  		// 			case *current.IBPOrderer:
   126  		// 				on := obj.(*current.IBPOrderer)
   127  		// 				on.Spec = current.IBPOrdererSpec{
   128  		// 					NodeNumber: &num,
   129  		// 					Arch:       []string{"s390x"},
   130  		// 				}
   131  		// 			}
   132  		// 			return nil
   133  		// 		}
   134  
   135  		// 		err := manager.CheckState(dep)
   136  		// 		Expect(err).To(HaveOccurred())
   137  		// 		Expect(err.Error()).To(ContainSubstring("orderernode has been edited manually, and does not match what is expected based on the CR: unexpected mismatch"))
   138  		// 	})
   139  
   140  		// 	It("returns no error if no changes detected for orderernode", func() {
   141  		// 		err := manager.CheckState(&appsv1.Deployment{})
   142  		// 		Expect(err).NotTo(HaveOccurred())
   143  		// 	})
   144  	})
   145  
   146  	Context("restore orderernode state", func() {
   147  		It("returns an error if the restoring orderernode state fails", func() {
   148  			errMsg := "unable to restore orderernode"
   149  			mockKubeClient.UpdateReturns(errors.New(errMsg))
   150  			num := 1
   151  			err := manager.RestoreState(&current.IBPOrderer{
   152  				Spec: current.IBPOrdererSpec{
   153  					NodeNumber: &num,
   154  				},
   155  			})
   156  			Expect(err).To(HaveOccurred())
   157  			Expect(err.Error()).To(Equal(errMsg))
   158  		})
   159  
   160  		It("returns no error if able to restore orderernode state", func() {
   161  			num := 1
   162  			err := manager.RestoreState(&current.IBPOrderer{
   163  				Spec: current.IBPOrdererSpec{
   164  					NodeNumber: &num,
   165  				},
   166  			})
   167  			Expect(err).NotTo(HaveOccurred())
   168  		})
   169  	})
   170  })