github.com/IBM-Blockchain/fabric-operator@v1.0.4/pkg/initializer/orderer/initializer_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 initializer_test
    20  
    21  import (
    22  	"context"
    23  	"encoding/base64"
    24  	"os"
    25  	"path/filepath"
    26  
    27  	current "github.com/IBM-Blockchain/fabric-operator/api/v1beta1"
    28  	controllermocks "github.com/IBM-Blockchain/fabric-operator/controllers/mocks"
    29  	commonconfig "github.com/IBM-Blockchain/fabric-operator/pkg/initializer/common/config"
    30  	commonmocks "github.com/IBM-Blockchain/fabric-operator/pkg/initializer/common/mocks"
    31  	initializer "github.com/IBM-Blockchain/fabric-operator/pkg/initializer/orderer"
    32  	. "github.com/onsi/ginkgo/v2"
    33  	. "github.com/onsi/gomega"
    34  	"github.com/pkg/errors"
    35  	corev1 "k8s.io/api/core/v1"
    36  	k8serrors "k8s.io/apimachinery/pkg/api/errors"
    37  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    38  	"k8s.io/apimachinery/pkg/runtime"
    39  	"k8s.io/apimachinery/pkg/runtime/schema"
    40  	"k8s.io/apimachinery/pkg/types"
    41  	"sigs.k8s.io/controller-runtime/pkg/client"
    42  )
    43  
    44  const (
    45  	testcert = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpVENDQWkrZ0F3SUJBZ0lVRkd3N0RjK0QvZUoyY08wOHd6d2tialIzK1M4d0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEU1TVRBd09URTBNakF3TUZvWERUSXdNVEF3T0RFME1qQXdNRm93YnpFTE1Ba0cKQTFVRUJoTUNWVk14RnpBVkJnTlZCQWdURGs1dmNuUm9JRU5oY205c2FXNWhNUlF3RWdZRFZRUUtFd3RJZVhCbApjbXhsWkdkbGNqRVBNQTBHQTFVRUN4TUdSbUZpY21sak1TQXdIZ1lEVlFRREV4ZFRZV0ZrY3kxTllXTkNiMjlyCkxWQnlieTVzYjJOaGJEQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJBK0JBRzhZakJvTllabGgKRjFrVHNUbHd6VERDQTJocDhZTXI5Ky8vbEd0NURoSGZVT1c3bkhuSW1USHlPRjJQVjFPcVRuUWhUbWpLYTdaQwpqeU9BUWxLamdhOHdnYXd3RGdZRFZSMFBBUUgvQkFRREFnT29NQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CCkJnZ3JCZ0VGQlFjREFqQU1CZ05WSFJNQkFmOEVBakFBTUIwR0ExVWREZ1FXQkJTbHJjL0lNQkxvMzR0UktvWnEKNTQreDIyYWEyREFmQmdOVkhTTUVHREFXZ0JSWmpxT3RQZWJzSFI2UjBNQUhrNnd4ei85UFZqQXRCZ05WSFJFRQpKakFrZ2hkVFlXRmtjeTFOWVdOQ2IyOXJMVkJ5Ynk1c2IyTmhiSUlKYkc5allXeG9iM04wTUFvR0NDcUdTTTQ5CkJBTUNBMGdBTUVVQ0lRRGR0Y1QwUE9FQXJZKzgwdEhmWUwvcXBiWWoxMGU2eWlPWlpUQ29wY25mUVFJZ1FNQUQKaFc3T0NSUERNd3lqKzNhb015d2hFenFHYy9jRDJSU2V5ekRiRjFFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
    46  	testkey  = "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ3hRUXdSVFFpVUcwREo1UHoKQTJSclhIUEtCelkxMkxRa0MvbVlveWo1bEhDaFJBTkNBQVN5bE1YLzFqdDlmUGt1RTZ0anpvSTlQbGt4LzZuVQpCMHIvMU56TTdrYnBjUk8zQ3RIeXQ2TXlQR21FOUZUN29pYXphU3J1TW9JTDM0VGdBdUpIOU9ZWQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg=="
    47  )
    48  
    49  var _ = Describe("Initializing the Orderer", func() {
    50  	var (
    51  		ordererInitializer *initializer.Initializer
    52  		instance           *current.IBPOrderer
    53  		mockClient         *controllermocks.Client
    54  		mockValidator      *commonmocks.CryptoValidator
    55  	)
    56  
    57  	BeforeEach(func() {
    58  		testCertBytes, err := base64.StdEncoding.DecodeString(testcert)
    59  		Expect(err).NotTo(HaveOccurred())
    60  
    61  		mockValidator = &commonmocks.CryptoValidator{}
    62  
    63  		mockClient = &controllermocks.Client{}
    64  		mockClient.GetStub = func(ctx context.Context, types types.NamespacedName, obj client.Object) error {
    65  			switch obj.(type) {
    66  			case *corev1.Secret:
    67  				s := obj.(*corev1.Secret)
    68  				s.Data = map[string][]byte{"cert.pem": testCertBytes}
    69  			}
    70  			return nil
    71  		}
    72  
    73  		ordererInitializer = initializer.New(mockClient, &runtime.Scheme{}, nil, "", mockValidator)
    74  
    75  		enrollment := &current.Enrollment{
    76  			CAHost:       "localhost",
    77  			CAPort:       "7054",
    78  			EnrollID:     "admin",
    79  			EnrollSecret: "adminpw",
    80  			CATLS: &current.CATLS{
    81  				CACert: testcert,
    82  			},
    83  		}
    84  		tlsenrollment := enrollment.DeepCopy()
    85  
    86  		msp := &current.MSP{
    87  			KeyStore:   testkey,
    88  			SignCerts:  testcert,
    89  			AdminCerts: []string{testcert},
    90  			CACerts:    []string{testcert},
    91  		}
    92  		tlsmsp := msp.DeepCopy()
    93  
    94  		instance = &current.IBPOrderer{
    95  			ObjectMeta: metav1.ObjectMeta{
    96  				Name: "test",
    97  			},
    98  			Spec: current.IBPOrdererSpec{
    99  				Secret: &current.SecretSpec{
   100  					Enrollment: &current.EnrollmentSpec{
   101  						Component: enrollment,
   102  						TLS:       tlsenrollment,
   103  						ClientAuth: &current.Enrollment{
   104  							CAHost:       "host",
   105  							CAPort:       "1234",
   106  							EnrollID:     "admin",
   107  							EnrollSecret: "adminpw",
   108  							CATLS: &current.CATLS{
   109  								CACert: "cert",
   110  							},
   111  						},
   112  					},
   113  					MSP: &current.MSPSpec{
   114  						Component: msp,
   115  						TLS:       tlsmsp,
   116  						ClientAuth: &current.MSP{
   117  							KeyStore:  "key",
   118  							SignCerts: "cert",
   119  							CACerts:   []string{"certs"},
   120  						},
   121  					},
   122  				},
   123  			},
   124  		}
   125  	})
   126  
   127  	PContext("create", func() {
   128  		// TODO
   129  	})
   130  
   131  	PContext("update", func() {
   132  		// TODO
   133  	})
   134  
   135  	Context("check for missing crypto", func() {
   136  		It("returns true, if missing any crypto", func() {
   137  			mockValidator.CheckEcertCryptoReturns(errors.New("not found"))
   138  			missing := ordererInitializer.MissingCrypto(instance)
   139  			Expect(missing).To(Equal(true))
   140  		})
   141  
   142  		It("returns false, if all crypto found and is in proper format", func() {
   143  			missing := ordererInitializer.MissingCrypto(instance)
   144  			Expect(missing).To(Equal(false))
   145  		})
   146  	})
   147  
   148  	Context("get init orderer", func() {
   149  		It("returns empty init peer if neither MSP nor enrollment spec is passed", func() {
   150  			instance.Spec.Secret.MSP.TLS = nil
   151  			instance.Spec.Secret.Enrollment.TLS = nil
   152  			initorderer, err := ordererInitializer.GetInitOrderer(instance, "foo")
   153  			Expect(err).NotTo(HaveOccurred())
   154  			Expect(initorderer.Cryptos).NotTo(BeNil())
   155  			Expect(initorderer.Cryptos.TLS).To(BeNil())
   156  		})
   157  
   158  		It("returns init peer with ecert, tls, clientauth enrollers", func() {
   159  			initorderer, err := ordererInitializer.GetInitOrderer(instance, "foo")
   160  			Expect(err).NotTo(HaveOccurred())
   161  			Expect(initorderer.Cryptos).NotTo(BeNil())
   162  			Expect(initorderer.Cryptos.Enrollment).NotTo(BeNil())
   163  			Expect(initorderer.Cryptos.TLS).NotTo(BeNil())
   164  			Expect(initorderer.Cryptos.ClientAuth).NotTo(BeNil())
   165  		})
   166  
   167  		It("returns init peer with ecert, tls, clientauth msp parsers", func() {
   168  			initorderer, err := ordererInitializer.GetInitOrderer(instance, "foo")
   169  			Expect(err).NotTo(HaveOccurred())
   170  			Expect(initorderer.Cryptos).NotTo(BeNil())
   171  			Expect(initorderer.Cryptos.Enrollment).NotTo(BeNil())
   172  			Expect(initorderer.Cryptos.TLS).NotTo(BeNil())
   173  			Expect(initorderer.Cryptos.ClientAuth).NotTo(BeNil())
   174  		})
   175  
   176  		It("returns ecert msp parsers and tls enrollers", func() {
   177  			instance.Spec.Secret.Enrollment.Component = nil
   178  			instance.Spec.Secret.MSP.TLS = nil
   179  			initorderer, err := ordererInitializer.GetInitOrderer(instance, "foo")
   180  			Expect(err).NotTo(HaveOccurred())
   181  			Expect(initorderer.Cryptos).NotTo(BeNil())
   182  			Expect(initorderer.Cryptos.Enrollment).NotTo(BeNil())
   183  			Expect(initorderer.Cryptos.TLS).NotTo(BeNil())
   184  		})
   185  	})
   186  
   187  	Context("create or update config map", func() {
   188  		BeforeEach(func() {
   189  			wd, err := os.Getwd()
   190  			Expect(err).NotTo(HaveOccurred())
   191  
   192  			ordererInitializer.Config = &initializer.Config{
   193  				OUFile:      filepath.Join(wd, "../../../defaultconfig/orderer/ouconfig.yaml"),
   194  				InterOUFile: filepath.Join(wd, "../../../defaultconfig/orderer/ouconfig-inter.yaml"),
   195  			}
   196  
   197  			// Trigger create config map logic
   198  			mockClient.GetReturns(k8serrors.NewNotFound(schema.GroupResource{}, "not found"))
   199  		})
   200  
   201  		It("returns error if failed to create config map", func() {
   202  			mockClient.CreateOrUpdateReturns(errors.New("update error"))
   203  			err := ordererInitializer.CreateOrUpdateConfigMap(instance, nil)
   204  			Expect(err).To(HaveOccurred())
   205  			Expect(err.Error()).To(ContainSubstring("update error"))
   206  		})
   207  
   208  		It("creates config map with node ou config", func() {
   209  			err := ordererInitializer.CreateOrUpdateConfigMap(instance, nil)
   210  			Expect(err).NotTo(HaveOccurred())
   211  
   212  			_, obj, _ := mockClient.CreateOrUpdateArgsForCall(0)
   213  			cm := obj.(*corev1.ConfigMap)
   214  			Expect(cm.BinaryData["config.yaml"]).NotTo(BeNil())
   215  			nodeOUs, err := commonconfig.NodeOUConfigFromBytes(cm.BinaryData["config.yaml"])
   216  			Expect(nodeOUs.NodeOUs.Enable).To(Equal(true))
   217  		})
   218  	})
   219  
   220  })