github.com/IBM-Blockchain/fabric-operator@v1.0.4/pkg/offering/base/orderer/node_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 baseorderer_test 20 21 import ( 22 "context" 23 "encoding/json" 24 "fmt" 25 "os" 26 "time" 27 28 current "github.com/IBM-Blockchain/fabric-operator/api/v1beta1" 29 cmocks "github.com/IBM-Blockchain/fabric-operator/controllers/mocks" 30 config "github.com/IBM-Blockchain/fabric-operator/operatorconfig" 31 commonapi "github.com/IBM-Blockchain/fabric-operator/pkg/apis/common" 32 "github.com/IBM-Blockchain/fabric-operator/pkg/apis/deployer" 33 v1 "github.com/IBM-Blockchain/fabric-operator/pkg/apis/orderer/v1" 34 v2 "github.com/IBM-Blockchain/fabric-operator/pkg/apis/orderer/v2" 35 commonconfig "github.com/IBM-Blockchain/fabric-operator/pkg/initializer/common/config" 36 "github.com/IBM-Blockchain/fabric-operator/pkg/initializer/common/mspparser" 37 ordererinit "github.com/IBM-Blockchain/fabric-operator/pkg/initializer/orderer" 38 oconfig "github.com/IBM-Blockchain/fabric-operator/pkg/initializer/orderer/config/v1" 39 v2config "github.com/IBM-Blockchain/fabric-operator/pkg/initializer/orderer/config/v2" 40 managermocks "github.com/IBM-Blockchain/fabric-operator/pkg/manager/resources/mocks" 41 baseorderer "github.com/IBM-Blockchain/fabric-operator/pkg/offering/base/orderer" 42 "github.com/IBM-Blockchain/fabric-operator/pkg/offering/base/orderer/mocks" 43 orderermocks "github.com/IBM-Blockchain/fabric-operator/pkg/offering/base/orderer/mocks" 44 "github.com/IBM-Blockchain/fabric-operator/pkg/operatorerrors" 45 "github.com/IBM-Blockchain/fabric-operator/version" 46 . "github.com/onsi/ginkgo/v2" 47 . "github.com/onsi/gomega" 48 "github.com/pkg/errors" 49 corev1 "k8s.io/api/core/v1" 50 "k8s.io/apimachinery/pkg/runtime" 51 "k8s.io/apimachinery/pkg/types" 52 "k8s.io/apimachinery/pkg/util/intstr" 53 "sigs.k8s.io/controller-runtime/pkg/client" 54 "sigs.k8s.io/yaml" 55 ) 56 57 var _ = Describe("Base Orderer Node", func() { 58 var ( 59 node *baseorderer.Node 60 instance *current.IBPOrderer 61 mockKubeClient *cmocks.Client 62 63 deploymentMgr *orderermocks.DeploymentManager 64 serviceMgr *managermocks.ResourceManager 65 pvcMgr *managermocks.ResourceManager 66 configMapMgr *managermocks.ResourceManager 67 68 certificateMgr *orderermocks.CertificateManager 69 initializer *orderermocks.InitializeIBPOrderer 70 update *mocks.Update 71 cfg *config.Config 72 ) 73 74 BeforeEach(func() { 75 mockKubeClient = &cmocks.Client{} 76 update = &mocks.Update{} 77 78 replicas := int32(1) 79 instance = ¤t.IBPOrderer{ 80 Spec: current.IBPOrdererSpec{ 81 ExternalAddress: "address", 82 Domain: "domain", 83 HSM: ¤t.HSM{ 84 PKCS11Endpoint: "tcp://0.0.0.0:2346", 85 }, 86 Images: ¤t.OrdererImages{ 87 OrdererTag: "1.4.9-20200611", 88 }, 89 Replicas: &replicas, 90 FabricVersion: "1.4.9", 91 }, 92 } 93 instance.Kind = "IBPOrderer" 94 instance.Name = "orderer1" 95 instance.Namespace = "random" 96 nodeNumber := 1 97 instance.Spec.NodeNumber = &nodeNumber 98 instance.Status.Version = version.Operator 99 100 mockKubeClient.GetStub = func(ctx context.Context, types types.NamespacedName, obj client.Object) error { 101 switch obj.(type) { 102 case *current.IBPOrderer: 103 o := obj.(*current.IBPOrderer) 104 o.Kind = "IBPOrderer" 105 instance = o 106 case *corev1.Service: 107 o := obj.(*corev1.Service) 108 o.Spec.Type = corev1.ServiceTypeNodePort 109 o.Spec.Ports = append(o.Spec.Ports, corev1.ServicePort{ 110 Name: "orderer-api", 111 TargetPort: intstr.IntOrString{ 112 IntVal: 7051, 113 }, 114 NodePort: int32(7051), 115 }) 116 case *corev1.Secret: 117 o := obj.(*corev1.Secret) 118 switch types.Name { 119 case "ecert-" + instance.Name + "-signcert": 120 o.Name = "ecert-" + instance.Name + "-signcert" 121 o.Namespace = instance.Namespace 122 o.Data = map[string][]byte{"cert.pem": []byte("LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwVENDQWtxZ0F3SUJBZ0lSQU1FeVZVcDRMdlYydEFUREhlWklldDh3Q2dZSUtvWkl6ajBFQXdJd2daVXgKQ3pBSkJnTlZCQVlUQWxWVE1SY3dGUVlEVlFRSUV3NU9iM0owYUNCRFlYSnZiR2x1WVRFUE1BMEdBMVVFQnhNRwpSSFZ5YUdGdE1Rd3dDZ1lEVlFRS0V3TkpRazB4RXpBUkJnTlZCQXNUQ2tKc2IyTnJZMmhoYVc0eE9UQTNCZ05WCkJBTVRNR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzFqWVM1aGNIQnpMbkIxYldGekxtOXpMbVo1Y21VdWFXSnQKTG1OdmJUQWVGdzB5TURBeE1qSXhPREExTURCYUZ3MHpNREF4TVRreE9EQTFNREJhTUlHVk1Rc3dDUVlEVlFRRwpFd0pWVXpFWE1CVUdBMVVFQ0JNT1RtOXlkR2dnUTJGeWIyeHBibUV4RHpBTkJnTlZCQWNUQmtSMWNtaGhiVEVNCk1Bb0dBMVVFQ2hNRFNVSk5NUk13RVFZRFZRUUxFd3BDYkc5amEyTm9ZV2x1TVRrd053WURWUVFERXpCcVlXNHkKTWkxdmNtUmxjbVZ5YjNKblkyRXRZMkV1WVhCd2N5NXdkVzFoY3k1dmN5NW1lWEpsTG1saWJTNWpiMjB3V1RBVApCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFTR0lHUFkvZC9tQVhMejM4SlROR3F5bldpOTJXUVB6cnN0Cm5vdEFWZlh0dHZ5QWJXdTRNbWNUMEh6UnBTWjNDcGdxYUNXcTg1MUwyV09LcnZ6L0JPREpvM2t3ZHpCMUJnTlYKSFJFRWJqQnNnakJxWVc0eU1pMXZjbVJsY21WeWIzSm5ZMkV0WTJFdVlYQndjeTV3ZFcxaGN5NXZjeTVtZVhKbApMbWxpYlM1amIyMkNPR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzF2Y0dWeVlYUnBiMjV6TG1Gd2NITXVjSFZ0CllYTXViM011Wm5seVpTNXBZbTB1WTI5dE1Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQ0lRQzM3Y1pkNFY2RThPQ1IKaDloQXEyK0dyR21FVTFQU0I1eHo5RkdEWThkODZRSWhBT1crM3Urb2d4bFNWNUoyR3ZYbHRaQmpXRkpvYnJxeApwVVQ4cW4yMDA1b0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo")} 123 case "ecert-" + instance.Name + "-keystore": 124 o.Name = "ecert-" + instance.Name + "-keystore" 125 o.Namespace = instance.Namespace 126 o.Data = map[string][]byte{"key.pem": []byte("LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwVENDQWtxZ0F3SUJBZ0lSQU1FeVZVcDRMdlYydEFUREhlWklldDh3Q2dZSUtvWkl6ajBFQXdJd2daVXgKQ3pBSkJnTlZCQVlUQWxWVE1SY3dGUVlEVlFRSUV3NU9iM0owYUNCRFlYSnZiR2x1WVRFUE1BMEdBMVVFQnhNRwpSSFZ5YUdGdE1Rd3dDZ1lEVlFRS0V3TkpRazB4RXpBUkJnTlZCQXNUQ2tKc2IyTnJZMmhoYVc0eE9UQTNCZ05WCkJBTVRNR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzFqWVM1aGNIQnpMbkIxYldGekxtOXpMbVo1Y21VdWFXSnQKTG1OdmJUQWVGdzB5TURBeE1qSXhPREExTURCYUZ3MHpNREF4TVRreE9EQTFNREJhTUlHVk1Rc3dDUVlEVlFRRwpFd0pWVXpFWE1CVUdBMVVFQ0JNT1RtOXlkR2dnUTJGeWIyeHBibUV4RHpBTkJnTlZCQWNUQmtSMWNtaGhiVEVNCk1Bb0dBMVVFQ2hNRFNVSk5NUk13RVFZRFZRUUxFd3BDYkc5amEyTm9ZV2x1TVRrd053WURWUVFERXpCcVlXNHkKTWkxdmNtUmxjbVZ5YjNKblkyRXRZMkV1WVhCd2N5NXdkVzFoY3k1dmN5NW1lWEpsTG1saWJTNWpiMjB3V1RBVApCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFTR0lHUFkvZC9tQVhMejM4SlROR3F5bldpOTJXUVB6cnN0Cm5vdEFWZlh0dHZ5QWJXdTRNbWNUMEh6UnBTWjNDcGdxYUNXcTg1MUwyV09LcnZ6L0JPREpvM2t3ZHpCMUJnTlYKSFJFRWJqQnNnakJxWVc0eU1pMXZjbVJsY21WeWIzSm5ZMkV0WTJFdVlYQndjeTV3ZFcxaGN5NXZjeTVtZVhKbApMbWxpYlM1amIyMkNPR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzF2Y0dWeVlYUnBiMjV6TG1Gd2NITXVjSFZ0CllYTXViM011Wm5seVpTNXBZbTB1WTI5dE1Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQ0lRQzM3Y1pkNFY2RThPQ1IKaDloQXEyK0dyR21FVTFQU0I1eHo5RkdEWThkODZRSWhBT1crM3Urb2d4bFNWNUoyR3ZYbHRaQmpXRkpvYnJxeApwVVQ4cW4yMDA1b0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo")} 127 case "tls-" + instance.Name + "-signcert": 128 o.Name = "ecert-" + instance.Name + "-signcert" 129 o.Namespace = instance.Namespace 130 o.Data = map[string][]byte{"cert.pem": []byte("LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwVENDQWtxZ0F3SUJBZ0lSQU1FeVZVcDRMdlYydEFUREhlWklldDh3Q2dZSUtvWkl6ajBFQXdJd2daVXgKQ3pBSkJnTlZCQVlUQWxWVE1SY3dGUVlEVlFRSUV3NU9iM0owYUNCRFlYSnZiR2x1WVRFUE1BMEdBMVVFQnhNRwpSSFZ5YUdGdE1Rd3dDZ1lEVlFRS0V3TkpRazB4RXpBUkJnTlZCQXNUQ2tKc2IyTnJZMmhoYVc0eE9UQTNCZ05WCkJBTVRNR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzFqWVM1aGNIQnpMbkIxYldGekxtOXpMbVo1Y21VdWFXSnQKTG1OdmJUQWVGdzB5TURBeE1qSXhPREExTURCYUZ3MHpNREF4TVRreE9EQTFNREJhTUlHVk1Rc3dDUVlEVlFRRwpFd0pWVXpFWE1CVUdBMVVFQ0JNT1RtOXlkR2dnUTJGeWIyeHBibUV4RHpBTkJnTlZCQWNUQmtSMWNtaGhiVEVNCk1Bb0dBMVVFQ2hNRFNVSk5NUk13RVFZRFZRUUxFd3BDYkc5amEyTm9ZV2x1TVRrd053WURWUVFERXpCcVlXNHkKTWkxdmNtUmxjbVZ5YjNKblkyRXRZMkV1WVhCd2N5NXdkVzFoY3k1dmN5NW1lWEpsTG1saWJTNWpiMjB3V1RBVApCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFTR0lHUFkvZC9tQVhMejM4SlROR3F5bldpOTJXUVB6cnN0Cm5vdEFWZlh0dHZ5QWJXdTRNbWNUMEh6UnBTWjNDcGdxYUNXcTg1MUwyV09LcnZ6L0JPREpvM2t3ZHpCMUJnTlYKSFJFRWJqQnNnakJxWVc0eU1pMXZjbVJsY21WeWIzSm5ZMkV0WTJFdVlYQndjeTV3ZFcxaGN5NXZjeTVtZVhKbApMbWxpYlM1amIyMkNPR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzF2Y0dWeVlYUnBiMjV6TG1Gd2NITXVjSFZ0CllYTXViM011Wm5seVpTNXBZbTB1WTI5dE1Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQ0lRQzM3Y1pkNFY2RThPQ1IKaDloQXEyK0dyR21FVTFQU0I1eHo5RkdEWThkODZRSWhBT1crM3Urb2d4bFNWNUoyR3ZYbHRaQmpXRkpvYnJxeApwVVQ4cW4yMDA1b0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo")} 131 case "tls-" + instance.Name + "-keystore": 132 o.Name = "ecert-" + instance.Name + "-keystore" 133 o.Namespace = instance.Namespace 134 o.Data = map[string][]byte{"key.pem": []byte("LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwVENDQWtxZ0F3SUJBZ0lSQU1FeVZVcDRMdlYydEFUREhlWklldDh3Q2dZSUtvWkl6ajBFQXdJd2daVXgKQ3pBSkJnTlZCQVlUQWxWVE1SY3dGUVlEVlFRSUV3NU9iM0owYUNCRFlYSnZiR2x1WVRFUE1BMEdBMVVFQnhNRwpSSFZ5YUdGdE1Rd3dDZ1lEVlFRS0V3TkpRazB4RXpBUkJnTlZCQXNUQ2tKc2IyTnJZMmhoYVc0eE9UQTNCZ05WCkJBTVRNR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzFqWVM1aGNIQnpMbkIxYldGekxtOXpMbVo1Y21VdWFXSnQKTG1OdmJUQWVGdzB5TURBeE1qSXhPREExTURCYUZ3MHpNREF4TVRreE9EQTFNREJhTUlHVk1Rc3dDUVlEVlFRRwpFd0pWVXpFWE1CVUdBMVVFQ0JNT1RtOXlkR2dnUTJGeWIyeHBibUV4RHpBTkJnTlZCQWNUQmtSMWNtaGhiVEVNCk1Bb0dBMVVFQ2hNRFNVSk5NUk13RVFZRFZRUUxFd3BDYkc5amEyTm9ZV2x1TVRrd053WURWUVFERXpCcVlXNHkKTWkxdmNtUmxjbVZ5YjNKblkyRXRZMkV1WVhCd2N5NXdkVzFoY3k1dmN5NW1lWEpsTG1saWJTNWpiMjB3V1RBVApCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFTR0lHUFkvZC9tQVhMejM4SlROR3F5bldpOTJXUVB6cnN0Cm5vdEFWZlh0dHZ5QWJXdTRNbWNUMEh6UnBTWjNDcGdxYUNXcTg1MUwyV09LcnZ6L0JPREpvM2t3ZHpCMUJnTlYKSFJFRWJqQnNnakJxWVc0eU1pMXZjbVJsY21WeWIzSm5ZMkV0WTJFdVlYQndjeTV3ZFcxaGN5NXZjeTVtZVhKbApMbWxpYlM1amIyMkNPR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzF2Y0dWeVlYUnBiMjV6TG1Gd2NITXVjSFZ0CllYTXViM011Wm5seVpTNXBZbTB1WTI5dE1Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQ0lRQzM3Y1pkNFY2RThPQ1IKaDloQXEyK0dyR21FVTFQU0I1eHo5RkdEWThkODZRSWhBT1crM3Urb2d4bFNWNUoyR3ZYbHRaQmpXRkpvYnJxeApwVVQ4cW4yMDA1b0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo")} 135 case "tls-" + instance.Name + "-cacerts": 136 o.Name = "ecert-" + instance.Name + "-cacerts" 137 o.Namespace = instance.Namespace 138 o.Data = map[string][]byte{"key.pem": []byte("LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwVENDQWtxZ0F3SUJBZ0lSQU1FeVZVcDRMdlYydEFUREhlWklldDh3Q2dZSUtvWkl6ajBFQXdJd2daVXgKQ3pBSkJnTlZCQVlUQWxWVE1SY3dGUVlEVlFRSUV3NU9iM0owYUNCRFlYSnZiR2x1WVRFUE1BMEdBMVVFQnhNRwpSSFZ5YUdGdE1Rd3dDZ1lEVlFRS0V3TkpRazB4RXpBUkJnTlZCQXNUQ2tKc2IyTnJZMmhoYVc0eE9UQTNCZ05WCkJBTVRNR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzFqWVM1aGNIQnpMbkIxYldGekxtOXpMbVo1Y21VdWFXSnQKTG1OdmJUQWVGdzB5TURBeE1qSXhPREExTURCYUZ3MHpNREF4TVRreE9EQTFNREJhTUlHVk1Rc3dDUVlEVlFRRwpFd0pWVXpFWE1CVUdBMVVFQ0JNT1RtOXlkR2dnUTJGeWIyeHBibUV4RHpBTkJnTlZCQWNUQmtSMWNtaGhiVEVNCk1Bb0dBMVVFQ2hNRFNVSk5NUk13RVFZRFZRUUxFd3BDYkc5amEyTm9ZV2x1TVRrd053WURWUVFERXpCcVlXNHkKTWkxdmNtUmxjbVZ5YjNKblkyRXRZMkV1WVhCd2N5NXdkVzFoY3k1dmN5NW1lWEpsTG1saWJTNWpiMjB3V1RBVApCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFTR0lHUFkvZC9tQVhMejM4SlROR3F5bldpOTJXUVB6cnN0Cm5vdEFWZlh0dHZ5QWJXdTRNbWNUMEh6UnBTWjNDcGdxYUNXcTg1MUwyV09LcnZ6L0JPREpvM2t3ZHpCMUJnTlYKSFJFRWJqQnNnakJxWVc0eU1pMXZjbVJsY21WeWIzSm5ZMkV0WTJFdVlYQndjeTV3ZFcxaGN5NXZjeTVtZVhKbApMbWxpYlM1amIyMkNPR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzF2Y0dWeVlYUnBiMjV6TG1Gd2NITXVjSFZ0CllYTXViM011Wm5seVpTNXBZbTB1WTI5dE1Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQ0lRQzM3Y1pkNFY2RThPQ1IKaDloQXEyK0dyR21FVTFQU0I1eHo5RkdEWThkODZRSWhBT1crM3Urb2d4bFNWNUoyR3ZYbHRaQmpXRkpvYnJxeApwVVQ4cW4yMDA1b0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo")} 139 case "ecert-" + instance.Name + "-cacerts": 140 o.Name = "ecert-" + instance.Name + "-cacerts" 141 o.Namespace = instance.Namespace 142 o.Data = map[string][]byte{"cacert-0.pem": []byte("LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwVENDQWtxZ0F3SUJBZ0lSQU1FeVZVcDRMdlYydEFUREhlWklldDh3Q2dZSUtvWkl6ajBFQXdJd2daVXgKQ3pBSkJnTlZCQVlUQWxWVE1SY3dGUVlEVlFRSUV3NU9iM0owYUNCRFlYSnZiR2x1WVRFUE1BMEdBMVVFQnhNRwpSSFZ5YUdGdE1Rd3dDZ1lEVlFRS0V3TkpRazB4RXpBUkJnTlZCQXNUQ2tKc2IyTnJZMmhoYVc0eE9UQTNCZ05WCkJBTVRNR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzFqWVM1aGNIQnpMbkIxYldGekxtOXpMbVo1Y21VdWFXSnQKTG1OdmJUQWVGdzB5TURBeE1qSXhPREExTURCYUZ3MHpNREF4TVRreE9EQTFNREJhTUlHVk1Rc3dDUVlEVlFRRwpFd0pWVXpFWE1CVUdBMVVFQ0JNT1RtOXlkR2dnUTJGeWIyeHBibUV4RHpBTkJnTlZCQWNUQmtSMWNtaGhiVEVNCk1Bb0dBMVVFQ2hNRFNVSk5NUk13RVFZRFZRUUxFd3BDYkc5amEyTm9ZV2x1TVRrd053WURWUVFERXpCcVlXNHkKTWkxdmNtUmxjbVZ5YjNKblkyRXRZMkV1WVhCd2N5NXdkVzFoY3k1dmN5NW1lWEpsTG1saWJTNWpiMjB3V1RBVApCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFTR0lHUFkvZC9tQVhMejM4SlROR3F5bldpOTJXUVB6cnN0Cm5vdEFWZlh0dHZ5QWJXdTRNbWNUMEh6UnBTWjNDcGdxYUNXcTg1MUwyV09LcnZ6L0JPREpvM2t3ZHpCMUJnTlYKSFJFRWJqQnNnakJxWVc0eU1pMXZjbVJsY21WeWIzSm5ZMkV0WTJFdVlYQndjeTV3ZFcxaGN5NXZjeTVtZVhKbApMbWxpYlM1amIyMkNPR3BoYmpJeUxXOXlaR1Z5WlhKdmNtZGpZUzF2Y0dWeVlYUnBiMjV6TG1Gd2NITXVjSFZ0CllYTXViM011Wm5seVpTNXBZbTB1WTI5dE1Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQ0lRQzM3Y1pkNFY2RThPQ1IKaDloQXEyK0dyR21FVTFQU0I1eHo5RkdEWThkODZRSWhBT1crM3Urb2d4bFNWNUoyR3ZYbHRaQmpXRkpvYnJxeApwVVQ4cW4yMDA1b0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo")} 143 } 144 } 145 return nil 146 } 147 148 deploymentMgr = &orderermocks.DeploymentManager{} 149 serviceMgr = &managermocks.ResourceManager{} 150 pvcMgr = &managermocks.ResourceManager{} 151 configMapMgr = &managermocks.ResourceManager{} 152 roleMgr := &managermocks.ResourceManager{} 153 roleBindingMgr := &managermocks.ResourceManager{} 154 serviceAccountMgr := &managermocks.ResourceManager{} 155 156 initializer = &orderermocks.InitializeIBPOrderer{} 157 initializer.GetInitOrdererReturns(&ordererinit.Orderer{}, nil) 158 159 certificateMgr = &orderermocks.CertificateManager{} 160 restartMgr := &orderermocks.RestartManager{} 161 162 cfg = &config.Config{ 163 OrdererInitConfig: &ordererinit.Config{ 164 ConfigTxFile: "../../../../defaultconfig/orderer/configtx.yaml", 165 OUFile: "../../../../defaultconfig/orderer/ouconfig.yaml", 166 OrdererFile: "../../../../defaultconfig/orderer/orderer.yaml", 167 }, 168 Operator: config.Operator{ 169 Versions: &deployer.Versions{ 170 Orderer: map[string]deployer.VersionOrderer{ 171 "1.4.9-0": { 172 Default: true, 173 Image: deployer.OrdererImages{ 174 OrdererImage: "ordererimage", 175 OrdererTag: "1.4.9-amd64", 176 OrdererInitImage: "ordererinitimage", 177 OrdererInitTag: "1.4.9-amd64", 178 }, 179 }, 180 }, 181 }, 182 }, 183 } 184 185 node = &baseorderer.Node{ 186 Client: mockKubeClient, 187 Scheme: &runtime.Scheme{}, 188 Config: cfg, 189 190 DeploymentManager: deploymentMgr, 191 ServiceManager: serviceMgr, 192 EnvConfigMapManager: configMapMgr, 193 PVCManager: pvcMgr, 194 RoleManager: roleMgr, 195 RoleBindingManager: roleBindingMgr, 196 ServiceAccountManager: serviceAccountMgr, 197 198 CertificateManager: certificateMgr, 199 RenewCertTimers: make(map[string]*time.Timer), 200 Initializer: initializer, 201 Restart: restartMgr, 202 } 203 }) 204 205 Context("pre reconcile checks", func() { 206 Context("version and images", func() { 207 Context("create CR", func() { 208 It("returns an error if fabric version is not set in spec", func() { 209 instance.Spec.FabricVersion = "" 210 _, err := node.PreReconcileChecks(instance, update) 211 Expect(err).To(MatchError(ContainSubstring("fabric version is not set"))) 212 }) 213 214 Context("images section blank", func() { 215 BeforeEach(func() { 216 instance.Spec.Images = nil 217 }) 218 219 It("normalizes fabric version and requests a requeue", func() { 220 instance.Spec.FabricVersion = "1.4.9" 221 requeue, err := node.PreReconcileChecks(instance, update) 222 Expect(err).NotTo(HaveOccurred()) 223 Expect(requeue).To(Equal(true)) 224 Expect(instance.Spec.FabricVersion).To(Equal("1.4.9-0")) 225 }) 226 227 It("returns an error if fabric version not supported", func() { 228 instance.Spec.FabricVersion = "0.0.1" 229 _, err := node.PreReconcileChecks(instance, update) 230 Expect(err).To(MatchError(ContainSubstring("fabric version '0.0.1' is not supported"))) 231 }) 232 233 When("version is passed without hyphen", func() { 234 BeforeEach(func() { 235 instance.Spec.FabricVersion = "1.4.9" 236 }) 237 238 It("finds default version for release and updates images section", func() { 239 requeue, err := node.PreReconcileChecks(instance, update) 240 Expect(err).NotTo(HaveOccurred()) 241 Expect(requeue).To(Equal(true)) 242 Expect(*instance.Spec.Images).To(Equal(current.OrdererImages{ 243 OrdererImage: "ordererimage", 244 OrdererTag: "1.4.9-amd64", 245 OrdererInitImage: "ordererinitimage", 246 OrdererInitTag: "1.4.9-amd64", 247 })) 248 }) 249 }) 250 251 When("version is passed with hyphen", func() { 252 BeforeEach(func() { 253 instance.Spec.FabricVersion = "1.4.9-0" 254 }) 255 256 It("looks images and updates images section", func() { 257 requeue, err := node.PreReconcileChecks(instance, update) 258 Expect(err).NotTo(HaveOccurred()) 259 Expect(requeue).To(Equal(true)) 260 Expect(*instance.Spec.Images).To(Equal(current.OrdererImages{ 261 OrdererImage: "ordererimage", 262 OrdererTag: "1.4.9-amd64", 263 OrdererInitImage: "ordererinitimage", 264 OrdererInitTag: "1.4.9-amd64", 265 })) 266 }) 267 }) 268 }) 269 270 Context("images section passed", func() { 271 BeforeEach(func() { 272 instance.Spec.Images = ¤t.OrdererImages{ 273 OrdererImage: "ghcr.io/ibm-blockchain/ordererimage", 274 OrdererTag: "2.0.0", 275 OrdererInitImage: "ghcr.io/ibm-blockchain/ordererinitimage", 276 OrdererInitTag: "2.0.0", 277 } 278 }) 279 280 When("version is not passed", func() { 281 BeforeEach(func() { 282 instance.Spec.FabricVersion = "" 283 }) 284 285 It("returns an error", func() { 286 _, err := node.PreReconcileChecks(instance, update) 287 Expect(err).To(MatchError(ContainSubstring("fabric version is not set"))) 288 }) 289 }) 290 291 When("version is passed", func() { 292 BeforeEach(func() { 293 instance.Spec.FabricVersion = "2.0.0-8" 294 }) 295 296 It("persists current spec configuration", func() { 297 requeue, err := node.PreReconcileChecks(instance, update) 298 Expect(err).NotTo(HaveOccurred()) 299 Expect(requeue).To(Equal(false)) 300 Expect(instance.Spec.FabricVersion).To(Equal("2.0.0-8")) 301 Expect(*instance.Spec.Images).To(Equal(current.OrdererImages{ 302 OrdererImage: "ghcr.io/ibm-blockchain/ordererimage", 303 OrdererTag: "2.0.0", 304 OrdererInitImage: "ghcr.io/ibm-blockchain/ordererinitimage", 305 OrdererInitTag: "2.0.0", 306 })) 307 }) 308 }) 309 }) 310 }) 311 312 Context("update CR", func() { 313 BeforeEach(func() { 314 instance.Spec.FabricVersion = "2.0.1-0" 315 instance.Spec.Images = ¤t.OrdererImages{ 316 OrdererImage: "ghcr.io/ibm-blockchain/ordererimage", 317 OrdererTag: "2.0.1", 318 OrdererInitImage: "ghcr.io/ibm-blockchain/ordererinitimage", 319 OrdererInitTag: "2.0.1", 320 } 321 }) 322 323 When("images updated", func() { 324 BeforeEach(func() { 325 update.ImagesUpdatedReturns(true) 326 instance.Spec.Images = ¤t.OrdererImages{ 327 OrdererImage: "ghcr.io/ibm-blockchain/ordererimage", 328 OrdererTag: "2.0.8", 329 OrdererInitImage: "ghcr.io/ibm-blockchain/ordererinitimage", 330 OrdererInitTag: "2.0.8", 331 } 332 }) 333 334 Context("and version updated", func() { 335 BeforeEach(func() { 336 update.FabricVersionUpdatedReturns(true) 337 instance.Spec.FabricVersion = "2.0.1-8" 338 }) 339 340 It("persists current spec configuration", func() { 341 requeue, err := node.PreReconcileChecks(instance, update) 342 Expect(err).NotTo(HaveOccurred()) 343 Expect(requeue).To(Equal(false)) 344 Expect(instance.Spec.FabricVersion).To(Equal("2.0.1-8")) 345 Expect(*instance.Spec.Images).To(Equal(current.OrdererImages{ 346 OrdererImage: "ghcr.io/ibm-blockchain/ordererimage", 347 OrdererTag: "2.0.8", 348 OrdererInitImage: "ghcr.io/ibm-blockchain/ordererinitimage", 349 OrdererInitTag: "2.0.8", 350 })) 351 }) 352 }) 353 354 Context("and version not updated", func() { 355 It("persists current spec configuration", func() { 356 requeue, err := node.PreReconcileChecks(instance, update) 357 Expect(err).NotTo(HaveOccurred()) 358 Expect(requeue).To(Equal(false)) 359 Expect(instance.Spec.FabricVersion).To(Equal("2.0.1-0")) 360 Expect(*instance.Spec.Images).To(Equal(current.OrdererImages{ 361 OrdererImage: "ghcr.io/ibm-blockchain/ordererimage", 362 OrdererTag: "2.0.8", 363 OrdererInitImage: "ghcr.io/ibm-blockchain/ordererinitimage", 364 OrdererInitTag: "2.0.8", 365 })) 366 }) 367 }) 368 }) 369 370 When("images not updated", func() { 371 Context("and version updated during operator migration", func() { 372 BeforeEach(func() { 373 update.FabricVersionUpdatedReturns(true) 374 instance.Spec.FabricVersion = "unsupported" 375 }) 376 377 It("persists current spec configuration", func() { 378 requeue, err := node.PreReconcileChecks(instance, update) 379 Expect(err).NotTo(HaveOccurred()) 380 Expect(requeue).To(Equal(false)) 381 Expect(instance.Spec.FabricVersion).To(Equal("unsupported")) 382 Expect(*instance.Spec.Images).To(Equal(current.OrdererImages{ 383 OrdererImage: "ghcr.io/ibm-blockchain/ordererimage", 384 OrdererTag: "2.0.1", 385 OrdererInitImage: "ghcr.io/ibm-blockchain/ordererinitimage", 386 OrdererInitTag: "2.0.1", 387 })) 388 }) 389 }) 390 391 Context("and version updated (not during operator migration)", func() { 392 BeforeEach(func() { 393 update.FabricVersionUpdatedReturns(true) 394 }) 395 396 When("using non-hyphenated version", func() { 397 BeforeEach(func() { 398 instance.Spec.FabricVersion = "1.4.9" 399 }) 400 401 It("looks images and updates images section", func() { 402 requeue, err := node.PreReconcileChecks(instance, update) 403 Expect(err).NotTo(HaveOccurred()) 404 Expect(requeue).To(Equal(true)) 405 Expect(instance.Spec.FabricVersion).To(Equal("1.4.9-0")) 406 Expect(*instance.Spec.Images).To(Equal(current.OrdererImages{ 407 OrdererImage: "ordererimage", 408 OrdererTag: "1.4.9-amd64", 409 OrdererInitImage: "ordererinitimage", 410 OrdererInitTag: "1.4.9-amd64", 411 })) 412 }) 413 }) 414 415 When("using hyphenated version", func() { 416 BeforeEach(func() { 417 instance.Spec.FabricVersion = "1.4.9-0" 418 }) 419 420 It("looks images and updates images section", func() { 421 requeue, err := node.PreReconcileChecks(instance, update) 422 Expect(err).NotTo(HaveOccurred()) 423 Expect(requeue).To(Equal(true)) 424 Expect(instance.Spec.FabricVersion).To(Equal("1.4.9-0")) 425 Expect(*instance.Spec.Images).To(Equal(current.OrdererImages{ 426 OrdererImage: "ordererimage", 427 OrdererTag: "1.4.9-amd64", 428 OrdererInitImage: "ordererinitimage", 429 OrdererInitTag: "1.4.9-amd64", 430 })) 431 }) 432 }) 433 }) 434 }) 435 }) 436 }) 437 438 Context("hsm image updates", func() { 439 var ( 440 hsmConfig = &commonconfig.HSMConfig{ 441 Library: commonconfig.Library{ 442 Image: "ghcr.io/ibm-blockchain/hsmimage:1.0.0", 443 }, 444 } 445 ) 446 447 BeforeEach(func() { 448 mockKubeClient.GetStub = func(ctx context.Context, types types.NamespacedName, obj client.Object) error { 449 switch obj.(type) { 450 case *corev1.ConfigMap: 451 o := obj.(*corev1.ConfigMap) 452 453 bytes, err := yaml.Marshal(hsmConfig) 454 Expect(err).NotTo(HaveOccurred()) 455 456 o.Data = map[string]string{ 457 "ibp-hsm-config.yaml": string(bytes), 458 } 459 } 460 return nil 461 } 462 }) 463 464 It("updates hsm image and tag if passed through operator config", func() { 465 updated, err := node.PreReconcileChecks(instance, update) 466 Expect(err).NotTo(HaveOccurred()) 467 Expect(updated).To(Equal(true)) 468 Expect(instance.Spec.Images.HSMImage).To(Equal("ghcr.io/ibm-blockchain/hsmimage")) 469 Expect(instance.Spec.Images.HSMTag).To(Equal("1.0.0")) 470 }) 471 472 It("doesn't update hsm image and tag if hsm update is disabled", func() { 473 hsmConfig.Library.AutoUpdateDisabled = true 474 475 updated, err := node.PreReconcileChecks(instance, update) 476 Expect(err).NotTo(HaveOccurred()) 477 Expect(updated).To(Equal(false)) 478 Expect(instance.Spec.Images.HSMImage).To(Equal("")) 479 Expect(instance.Spec.Images.HSMTag).To(Equal("")) 480 }) 481 }) 482 }) 483 484 Context("Reconciles", func() { 485 It("returns nil and will requeue update request if instance version is updated", func() { 486 instance.Status.Version = "" 487 _, err := node.Reconcile(instance, update) 488 Expect(err).NotTo(HaveOccurred()) 489 Expect(mockKubeClient.PatchStatusCallCount()).To(Equal(1)) 490 }) 491 It("returns a breaking error if initialization fails", func() { 492 cfg.OrdererInitConfig.OrdererFile = "../../../../defaultconfig/orderer/badfile.yaml" 493 node.Initializer = ordererinit.New(nil, nil, cfg.OrdererInitConfig, "", nil) 494 _, err := node.Reconcile(instance, update) 495 Expect(err).To(HaveOccurred()) 496 Expect(err.Error()).To(ContainSubstring("Code: 21 - failed to initialize orderer node")) 497 Expect(operatorerrors.IsBreakingError(err, "msg", nil)).NotTo(HaveOccurred()) 498 }) 499 500 It("returns an error for invalid HSM endpoint", func() { 501 instance.Spec.HSM.PKCS11Endpoint = "tcp://:2346" 502 _, err := node.Reconcile(instance, update) 503 Expect(err).To(HaveOccurred()) 504 Expect(err.Error()).To(Equal(fmt.Sprintf("failed pre reconcile checks: invalid HSM endpoint for orderer instance '%s': missing IP address", instance.Name))) 505 }) 506 507 It("returns an error domain is not set", func() { 508 instance.Spec.Domain = "" 509 _, err := node.Reconcile(instance, update) 510 Expect(err).To(HaveOccurred()) 511 Expect(err.Error()).To(Equal(fmt.Sprintf("failed pre reconcile checks: domain not set for orderer instance '%s'", instance.Name))) 512 }) 513 514 It("returns an error if pvc manager fails to reconcile", func() { 515 pvcMgr.ReconcileReturns(errors.New("failed to reconcile pvc")) 516 _, err := node.Reconcile(instance, update) 517 Expect(err).To(HaveOccurred()) 518 Expect(err.Error()).To(Equal("failed to reconcile managers: failed PVC reconciliation: failed to reconcile pvc")) 519 }) 520 521 It("returns an error if service manager fails to reconcile", func() { 522 serviceMgr.ReconcileReturns(errors.New("failed to reconcile service")) 523 _, err := node.Reconcile(instance, update) 524 Expect(err).To(HaveOccurred()) 525 Expect(err.Error()).To(Equal("failed to reconcile managers: failed Service reconciliation: failed to reconcile service")) 526 }) 527 528 It("returns an error if config map manager fails to reconcile", func() { 529 configMapMgr.ReconcileReturns(errors.New("failed to reconcile config map")) 530 _, err := node.Reconcile(instance, update) 531 Expect(err).To(HaveOccurred()) 532 Expect(err.Error()).To(Equal("failed to reconcile managers: failed Env ConfigMap reconciliation: failed to reconcile config map")) 533 }) 534 535 It("returns an error if deployment manager fails to reconcile", func() { 536 deploymentMgr.ReconcileReturns(errors.New("failed to reconcile deployment")) 537 _, err := node.Reconcile(instance, update) 538 Expect(err).To(HaveOccurred()) 539 Expect(err.Error()).To(Equal("failed to reconcile managers: failed Deployment reconciliation: failed to reconcile deployment")) 540 }) 541 542 It("reconciles IBPOrderer", func() { 543 _, err := node.Reconcile(instance, update) 544 Expect(err).NotTo(HaveOccurred()) 545 }) 546 547 }) 548 549 Context("fabric orderer migration", func() { 550 BeforeEach(func() { 551 overrides := &oconfig.Orderer{ 552 Orderer: v1.Orderer{ 553 General: v1.General{ 554 BCCSP: &commonapi.BCCSP{ 555 ProviderName: "pkcs11", 556 PKCS11: &commonapi.PKCS11Opts{ 557 FileKeyStore: &commonapi.FileKeyStoreOpts{ 558 KeyStorePath: "msp/keystore", 559 }, 560 }, 561 }, 562 }, 563 }, 564 } 565 bytes, err := json.Marshal(overrides) 566 Expect(err).NotTo(HaveOccurred()) 567 568 instance.Spec.ConfigOverride = &runtime.RawExtension{Raw: bytes} 569 570 coreBytes, err := yaml.Marshal(overrides) 571 Expect(err).NotTo(HaveOccurred()) 572 573 cm := &corev1.ConfigMap{ 574 BinaryData: map[string][]byte{ 575 "orderer.yaml": coreBytes, 576 }, 577 } 578 initializer.GetConfigFromConfigMapReturns(cm, nil) 579 }) 580 581 When("fabric orderer tag is less than 1.4.7", func() { 582 BeforeEach(func() { 583 instance.Spec.Images.OrdererTag = "1.4.6-20200611" 584 }) 585 586 It("returns without updating config", func() { 587 ordererConfig, err := node.FabricOrdererMigration(instance) 588 Expect(err).NotTo(HaveOccurred()) 589 Expect(ordererConfig).To(BeNil()) 590 }) 591 }) 592 593 When("hsm is not enabled", func() { 594 BeforeEach(func() { 595 overrides := &oconfig.Orderer{ 596 Orderer: v1.Orderer{ 597 General: v1.General{ 598 BCCSP: &commonapi.BCCSP{ 599 ProviderName: "sw", 600 PKCS11: &commonapi.PKCS11Opts{ 601 FileKeyStore: &commonapi.FileKeyStoreOpts{ 602 KeyStorePath: "msp/keystore", 603 }, 604 }, 605 }, 606 }, 607 }, 608 } 609 bytes, err := json.Marshal(overrides) 610 Expect(err).NotTo(HaveOccurred()) 611 612 instance.Spec.ConfigOverride = &runtime.RawExtension{Raw: bytes} 613 }) 614 615 It("returns without updating config", func() { 616 ordererConfig, err := node.FabricOrdererMigration(instance) 617 Expect(err).NotTo(HaveOccurred()) 618 Expect(ordererConfig).To(BeNil()) 619 }) 620 }) 621 622 It("removes keystore path value", func() { 623 ordererConfig, err := node.FabricOrdererMigration(instance) 624 Expect(err).NotTo(HaveOccurred()) 625 Expect(ordererConfig.General.BCCSP.PKCS11.FileKeyStore).To(BeNil()) 626 }) 627 }) 628 629 Context("initialize", func() { 630 BeforeEach(func() { 631 config := v2config.Orderer{ 632 Orderer: v2.Orderer{ 633 General: v2.General{ 634 BCCSP: &commonapi.BCCSP{ 635 ProviderName: "PKCS11", 636 }, 637 }, 638 }, 639 } 640 641 bytes, err := json.Marshal(config) 642 Expect(err).NotTo(HaveOccurred()) 643 644 instance.Spec.ConfigOverride = &runtime.RawExtension{Raw: bytes} 645 }) 646 647 It("sets PKCS11_PROXY_SOCKET environment variable", func() { 648 err := node.Initialize(instance, update) 649 Expect(err).NotTo(HaveOccurred()) 650 Expect(os.Getenv("PKCS11_PROXY_SOCKET")).To(Equal("tcp://0.0.0.0:2346")) 651 }) 652 653 }) 654 655 Context("update connection profile", func() { 656 It("returns error if fails to get cert", func() { 657 mockKubeClient.GetReturns(errors.New("get error")) 658 err := node.UpdateConnectionProfile(instance) 659 Expect(err).To(HaveOccurred()) 660 Expect(err.Error()).To(ContainSubstring("get error")) 661 }) 662 663 It("updates connection profile cm", func() { 664 err := node.UpdateConnectionProfile(instance) 665 Expect(err).NotTo(HaveOccurred()) 666 Expect(mockKubeClient.GetCallCount()).To(Equal(7)) 667 }) 668 }) 669 670 Context("update msp certificates", func() { 671 const testcert = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpVENDQWkrZ0F3SUJBZ0lVRkd3N0RjK0QvZUoyY08wOHd6d2tialIzK1M4d0NnWUlLb1pJemowRUF3SXcKYURFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBZ1REazV2Y25Sb0lFTmhjbTlzYVc1aE1SUXdFZ1lEVlFRSwpFd3RJZVhCbGNteGxaR2RsY2pFUE1BMEdBMVVFQ3hNR1JtRmljbWxqTVJrd0Z3WURWUVFERXhCbVlXSnlhV010ClkyRXRjMlZ5ZG1WeU1CNFhEVEU1TVRBd09URTBNakF3TUZvWERUSXdNVEF3T0RFME1qQXdNRm93YnpFTE1Ba0cKQTFVRUJoTUNWVk14RnpBVkJnTlZCQWdURGs1dmNuUm9JRU5oY205c2FXNWhNUlF3RWdZRFZRUUtFd3RJZVhCbApjbXhsWkdkbGNqRVBNQTBHQTFVRUN4TUdSbUZpY21sak1TQXdIZ1lEVlFRREV4ZFRZV0ZrY3kxTllXTkNiMjlyCkxWQnlieTVzYjJOaGJEQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJBK0JBRzhZakJvTllabGgKRjFrVHNUbHd6VERDQTJocDhZTXI5Ky8vbEd0NURoSGZVT1c3bkhuSW1USHlPRjJQVjFPcVRuUWhUbWpLYTdaQwpqeU9BUWxLamdhOHdnYXd3RGdZRFZSMFBBUUgvQkFRREFnT29NQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CCkJnZ3JCZ0VGQlFjREFqQU1CZ05WSFJNQkFmOEVBakFBTUIwR0ExVWREZ1FXQkJTbHJjL0lNQkxvMzR0UktvWnEKNTQreDIyYWEyREFmQmdOVkhTTUVHREFXZ0JSWmpxT3RQZWJzSFI2UjBNQUhrNnd4ei85UFZqQXRCZ05WSFJFRQpKakFrZ2hkVFlXRmtjeTFOWVdOQ2IyOXJMVkJ5Ynk1c2IyTmhiSUlKYkc5allXeG9iM04wTUFvR0NDcUdTTTQ5CkJBTUNBMGdBTUVVQ0lRRGR0Y1QwUE9FQXJZKzgwdEhmWUwvcXBiWWoxMGU2eWlPWlpUQ29wY25mUVFJZ1FNQUQKaFc3T0NSUERNd3lqKzNhb015d2hFenFHYy9jRDJSU2V5ekRiRjFFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==" 672 673 BeforeEach(func() { 674 msp := ¤t.MSP{ 675 SignCerts: testcert, 676 CACerts: []string{testcert}, 677 KeyStore: "keystore", 678 } 679 680 initializer.GetUpdatedOrdererReturns(&ordererinit.Orderer{ 681 Cryptos: &commonconfig.Cryptos{ 682 TLS: &mspparser.MSPParser{ 683 Config: msp, 684 }, 685 }, 686 }, nil) 687 688 }) 689 690 It("returns error if fails to get update msp parsers", func() { 691 initializer.GetUpdatedOrdererReturns(nil, errors.New("get error")) 692 err := node.UpdateMSPCertificates(instance) 693 Expect(err).To(HaveOccurred()) 694 Expect(err.Error()).To(ContainSubstring("get error")) 695 }) 696 697 It("returns error if fails to generate crypto", func() { 698 initializer.GetUpdatedOrdererReturns(&ordererinit.Orderer{ 699 Cryptos: &commonconfig.Cryptos{ 700 TLS: &mspparser.MSPParser{ 701 Config: ¤t.MSP{ 702 SignCerts: "invalid", 703 }, 704 }, 705 }, 706 }, nil) 707 err := node.UpdateMSPCertificates(instance) 708 Expect(err).To(HaveOccurred()) 709 }) 710 711 It("returns error if fails to update tls secrets", func() { 712 initializer.UpdateSecretsReturnsOnCall(1, errors.New("update error")) 713 err := node.UpdateMSPCertificates(instance) 714 Expect(err).To(HaveOccurred()) 715 Expect(err.Error()).To(Equal("failed to update tls secrets: update error")) 716 }) 717 718 It("updates secrets of certificates passed through MSP spec", func() { 719 err := node.UpdateMSPCertificates(instance) 720 Expect(err).NotTo(HaveOccurred()) 721 Expect(initializer.UpdateSecretsCallCount()).To(Equal(3)) 722 }) 723 }) 724 })