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 := ¤t.Enrollment{ 76 CAHost: "localhost", 77 CAPort: "7054", 78 EnrollID: "admin", 79 EnrollSecret: "adminpw", 80 CATLS: ¤t.CATLS{ 81 CACert: testcert, 82 }, 83 } 84 tlsenrollment := enrollment.DeepCopy() 85 86 msp := ¤t.MSP{ 87 KeyStore: testkey, 88 SignCerts: testcert, 89 AdminCerts: []string{testcert}, 90 CACerts: []string{testcert}, 91 } 92 tlsmsp := msp.DeepCopy() 93 94 instance = ¤t.IBPOrderer{ 95 ObjectMeta: metav1.ObjectMeta{ 96 Name: "test", 97 }, 98 Spec: current.IBPOrdererSpec{ 99 Secret: ¤t.SecretSpec{ 100 Enrollment: ¤t.EnrollmentSpec{ 101 Component: enrollment, 102 TLS: tlsenrollment, 103 ClientAuth: ¤t.Enrollment{ 104 CAHost: "host", 105 CAPort: "1234", 106 EnrollID: "admin", 107 EnrollSecret: "adminpw", 108 CATLS: ¤t.CATLS{ 109 CACert: "cert", 110 }, 111 }, 112 }, 113 MSP: ¤t.MSPSpec{ 114 Component: msp, 115 TLS: tlsmsp, 116 ClientAuth: ¤t.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 })