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 = &current.IBPOrderer{
    80  			Spec: current.IBPOrdererSpec{
    81  				ExternalAddress: "address",
    82  				Domain:          "domain",
    83  				HSM: &current.HSM{
    84  					PKCS11Endpoint: "tcp://0.0.0.0:2346",
    85  				},
    86  				Images: &current.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 = &current.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 = &current.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 = &current.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 := &current.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: &current.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  })