github.com/IBM-Blockchain/fabric-operator@v1.0.4/pkg/offering/base/peer/override/deployment_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 override_test
    20  
    21  import (
    22  	"context"
    23  	"encoding/json"
    24  	"fmt"
    25  	"path/filepath"
    26  
    27  	. "github.com/onsi/ginkgo/v2"
    28  	. "github.com/onsi/gomega"
    29  	"github.com/pkg/errors"
    30  	appsv1 "k8s.io/api/apps/v1"
    31  	corev1 "k8s.io/api/core/v1"
    32  	"k8s.io/apimachinery/pkg/api/resource"
    33  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    34  	"k8s.io/apimachinery/pkg/runtime"
    35  	"k8s.io/apimachinery/pkg/types"
    36  
    37  	current "github.com/IBM-Blockchain/fabric-operator/api/v1beta1"
    38  	"github.com/IBM-Blockchain/fabric-operator/controllers/mocks"
    39  	"github.com/IBM-Blockchain/fabric-operator/pkg/apis/common"
    40  	v2peer "github.com/IBM-Blockchain/fabric-operator/pkg/apis/peer/v2"
    41  	"github.com/IBM-Blockchain/fabric-operator/pkg/initializer/common/config"
    42  	v2peerconfig "github.com/IBM-Blockchain/fabric-operator/pkg/initializer/peer/config/v2"
    43  	"github.com/IBM-Blockchain/fabric-operator/pkg/manager/resources"
    44  	dep "github.com/IBM-Blockchain/fabric-operator/pkg/manager/resources/deployment"
    45  	"github.com/IBM-Blockchain/fabric-operator/pkg/offering/base/peer/override"
    46  	"github.com/IBM-Blockchain/fabric-operator/pkg/util"
    47  	"github.com/IBM-Blockchain/fabric-operator/version"
    48  
    49  	"sigs.k8s.io/controller-runtime/pkg/client"
    50  	"sigs.k8s.io/yaml"
    51  )
    52  
    53  var testMatrix [][]resource.Quantity
    54  
    55  var _ = Describe("Base Peer Deployment Overrides", func() {
    56  	const (
    57  		definitionsDir = "../../../../../definitions/peer"
    58  	)
    59  
    60  	var (
    61  		overrider      *override.Override
    62  		instance       *current.IBPPeer
    63  		deployment     *dep.Deployment
    64  		k8sDep         *appsv1.Deployment
    65  		mockKubeClient *mocks.Client
    66  	)
    67  
    68  	BeforeEach(func() {
    69  		var err error
    70  
    71  		k8sDep, err = util.GetDeploymentFromFile("../../../../../definitions/peer/deployment.yaml")
    72  		Expect(err).NotTo(HaveOccurred())
    73  		deployment = dep.New(k8sDep)
    74  
    75  		mockKubeClient = &mocks.Client{}
    76  		mockKubeClient.GetStub = func(ctx context.Context, types types.NamespacedName, obj client.Object) error {
    77  			switch obj.(type) {
    78  			case *corev1.ConfigMap:
    79  				hsmConfig := &config.HSMConfig{
    80  					Type:    "hsm",
    81  					Version: "v1",
    82  					MountPaths: []config.MountPath{
    83  						config.MountPath{
    84  							Name:      "hsmcrypto",
    85  							Secret:    "hsmcrypto",
    86  							MountPath: "/hsm",
    87  							Paths: []config.Path{
    88  								{
    89  									Key:  "cafile.pem",
    90  									Path: "cafile.pem",
    91  								},
    92  								{
    93  									Key:  "cert.pem",
    94  									Path: "cert.pem",
    95  								},
    96  								{
    97  									Key:  "key.pem",
    98  									Path: "key.pem",
    99  								},
   100  								{
   101  									Key:  "server.pem",
   102  									Path: "server.pem",
   103  								},
   104  							},
   105  						},
   106  						config.MountPath{
   107  							Name:      "hsmconfig",
   108  							Secret:    "hsmcrypto",
   109  							MountPath: "/etc/Chrystoki.conf",
   110  							SubPath:   "Chrystoki.conf",
   111  							Paths: []config.Path{
   112  								{
   113  									Key:  "Chrystoki.conf",
   114  									Path: "Chrystoki.conf",
   115  								},
   116  							},
   117  						},
   118  					},
   119  					Envs: []corev1.EnvVar{
   120  						{
   121  							Name:  "env1",
   122  							Value: "env1value",
   123  						},
   124  					},
   125  				}
   126  
   127  				configBytes, err := yaml.Marshal(hsmConfig)
   128  				if err != nil {
   129  					return err
   130  				}
   131  				o := obj.(*corev1.ConfigMap)
   132  				o.Data = map[string]string{"ibp-hsm-config.yaml": string(configBytes)}
   133  			}
   134  			return nil
   135  		}
   136  
   137  		overrider = &override.Override{
   138  			Client:                        mockKubeClient,
   139  			DefaultCouchContainerFile:     filepath.Join(definitionsDir, "couchdb.yaml"),
   140  			DefaultCouchInitContainerFile: filepath.Join(definitionsDir, "couchdb-init.yaml"),
   141  			DefaultCCLauncherFile:         filepath.Join(definitionsDir, "chaincode-launcher.yaml"),
   142  			CouchdbUser:                   "dbuser",
   143  			CouchdbPassword:               "dbpassword",
   144  		}
   145  		testMatrix = [][]resource.Quantity{
   146  			{resource.MustParse("10m"), resource.MustParse("15m"), resource.MustParse("11m"), resource.MustParse("16m"), resource.MustParse("1G"), resource.MustParse("2G")},
   147  			{resource.MustParse("20m"), resource.MustParse("25m"), resource.MustParse("21m"), resource.MustParse("26m"), resource.MustParse("1G"), resource.MustParse("4G")},
   148  			{resource.MustParse("30m"), resource.MustParse("35m"), resource.MustParse("31m"), resource.MustParse("36m"), resource.MustParse("3G"), resource.MustParse("6G")},
   149  			{resource.MustParse("40m"), resource.MustParse("45m"), resource.MustParse("41m"), resource.MustParse("46m"), resource.MustParse("4G"), resource.MustParse("8G")},
   150  			{resource.MustParse("50m"), resource.MustParse("55m"), resource.MustParse("51m"), resource.MustParse("56m"), resource.MustParse("5G"), resource.MustParse("10G")},
   151  			{resource.MustParse("60m"), resource.MustParse("65m"), resource.MustParse("61m"), resource.MustParse("66m"), resource.MustParse("6G"), resource.MustParse("12G")},
   152  		}
   153  
   154  		instance = &current.IBPPeer{
   155  			ObjectMeta: metav1.ObjectMeta{
   156  				Name:      "peeroverride",
   157  				Namespace: "namespace1",
   158  			},
   159  			Spec: current.IBPPeerSpec{
   160  				License: current.License{
   161  					Accept: true,
   162  				},
   163  				MSPID:    "peer-msp-id",
   164  				Storage:  &current.PeerStorages{},
   165  				Service:  &current.Service{},
   166  				Images:   &current.PeerImages{},
   167  				Arch:     []string{"test-arch"},
   168  				DindArgs: []string{"--log-driver", "fluentd", "--mtu", "1480"},
   169  				Ingress: current.Ingress{
   170  					TlsSecretName: "tlssecret",
   171  				},
   172  				Zone:             "dal",
   173  				Region:           "us-south",
   174  				StateDb:          "couchdb",
   175  				ImagePullSecrets: []string{"pullsecret1"},
   176  				Resources: &current.PeerResources{
   177  					DinD: &corev1.ResourceRequirements{
   178  						Requests: map[corev1.ResourceName]resource.Quantity{
   179  							corev1.ResourceCPU:              testMatrix[0][0],
   180  							corev1.ResourceMemory:           testMatrix[0][1],
   181  							corev1.ResourceEphemeralStorage: testMatrix[0][4],
   182  						},
   183  						Limits: map[corev1.ResourceName]resource.Quantity{
   184  							corev1.ResourceCPU:              testMatrix[0][2],
   185  							corev1.ResourceMemory:           testMatrix[0][3],
   186  							corev1.ResourceEphemeralStorage: testMatrix[0][5],
   187  						},
   188  					},
   189  					Peer: &corev1.ResourceRequirements{
   190  						Requests: map[corev1.ResourceName]resource.Quantity{
   191  							corev1.ResourceCPU:              testMatrix[1][0],
   192  							corev1.ResourceMemory:           testMatrix[1][1],
   193  							corev1.ResourceEphemeralStorage: testMatrix[1][4],
   194  						},
   195  						Limits: map[corev1.ResourceName]resource.Quantity{
   196  							corev1.ResourceCPU:              testMatrix[1][2],
   197  							corev1.ResourceMemory:           testMatrix[1][3],
   198  							corev1.ResourceEphemeralStorage: testMatrix[1][5],
   199  						},
   200  					},
   201  					GRPCProxy: &corev1.ResourceRequirements{
   202  						Requests: map[corev1.ResourceName]resource.Quantity{
   203  							corev1.ResourceCPU:              testMatrix[2][0],
   204  							corev1.ResourceMemory:           testMatrix[2][1],
   205  							corev1.ResourceEphemeralStorage: testMatrix[2][4],
   206  						},
   207  						Limits: map[corev1.ResourceName]resource.Quantity{
   208  							corev1.ResourceCPU:              testMatrix[2][2],
   209  							corev1.ResourceMemory:           testMatrix[2][3],
   210  							corev1.ResourceEphemeralStorage: testMatrix[2][5],
   211  						},
   212  					},
   213  					FluentD: &corev1.ResourceRequirements{
   214  						Requests: map[corev1.ResourceName]resource.Quantity{
   215  							corev1.ResourceCPU:              testMatrix[3][0],
   216  							corev1.ResourceMemory:           testMatrix[3][1],
   217  							corev1.ResourceEphemeralStorage: testMatrix[3][4],
   218  						},
   219  						Limits: map[corev1.ResourceName]resource.Quantity{
   220  							corev1.ResourceCPU:              testMatrix[3][2],
   221  							corev1.ResourceMemory:           testMatrix[3][3],
   222  							corev1.ResourceEphemeralStorage: testMatrix[3][5],
   223  						},
   224  					},
   225  					CouchDB: &corev1.ResourceRequirements{
   226  						Requests: map[corev1.ResourceName]resource.Quantity{
   227  							corev1.ResourceCPU:              testMatrix[4][0],
   228  							corev1.ResourceMemory:           testMatrix[4][1],
   229  							corev1.ResourceEphemeralStorage: testMatrix[4][4],
   230  						},
   231  						Limits: map[corev1.ResourceName]resource.Quantity{
   232  							corev1.ResourceCPU:              testMatrix[4][2],
   233  							corev1.ResourceMemory:           testMatrix[4][3],
   234  							corev1.ResourceEphemeralStorage: testMatrix[4][5],
   235  						},
   236  					},
   237  					CCLauncher: &corev1.ResourceRequirements{
   238  						Requests: map[corev1.ResourceName]resource.Quantity{
   239  							corev1.ResourceCPU:              testMatrix[5][0],
   240  							corev1.ResourceMemory:           testMatrix[5][1],
   241  							corev1.ResourceEphemeralStorage: testMatrix[5][4],
   242  						},
   243  						Limits: map[corev1.ResourceName]resource.Quantity{
   244  							corev1.ResourceCPU:              testMatrix[5][2],
   245  							corev1.ResourceMemory:           testMatrix[5][3],
   246  							corev1.ResourceEphemeralStorage: testMatrix[5][5],
   247  						},
   248  					},
   249  				},
   250  			},
   251  		}
   252  	})
   253  
   254  	Context("create", func() {
   255  		It("returns an error if license is not accepted", func() {
   256  			instance.Spec.License.Accept = false
   257  			err := overrider.Deployment(instance, k8sDep, resources.Create)
   258  			Expect(err).To(HaveOccurred())
   259  			Expect(err.Error()).To(Equal("user must accept license before continuing"))
   260  		})
   261  
   262  		It("returns an error if MSP ID not provided", func() {
   263  			instance.Spec.MSPID = ""
   264  			err := overrider.Deployment(instance, k8sDep, resources.Create)
   265  			Expect(err).To(HaveOccurred())
   266  			Expect(err.Error()).To(Equal("failed to provide MSP ID for peer"))
   267  		})
   268  
   269  		It("sets default dind args if none provided", func() {
   270  			instance.Spec.DindArgs = nil
   271  			err := overrider.Deployment(instance, k8sDep, resources.Create)
   272  			Expect(err).NotTo(HaveOccurred())
   273  			Expect(deployment.Spec.Template.Spec.Containers[0].Args).To(Equal([]string{"--log-driver", "fluentd", "--log-opt", "fluentd-address=localhost:9880", "--mtu", "1400"}))
   274  		})
   275  
   276  		It("overrides value based on spec", func() {
   277  			mockKubeClient.GetReturnsOnCall(1, errors.New("no inter cert found"))
   278  			err := overrider.Deployment(instance, k8sDep, resources.Create)
   279  			Expect(err).NotTo(HaveOccurred())
   280  
   281  			By("setting dind args", func() {
   282  				Expect(len(deployment.Spec.Template.Spec.Containers[0].Args)).To(Equal(4))
   283  			})
   284  
   285  			By("setting service account", func() {
   286  				Expect(deployment.Spec.Template.Spec.ServiceAccountName).To(Equal(instance.Name))
   287  			})
   288  
   289  			By("setting CORE_PEER_ID env var", func() {
   290  				ev := corev1.EnvVar{
   291  					Name:  "CORE_PEER_ID",
   292  					Value: instance.Name,
   293  				}
   294  				Expect(deployment.Spec.Template.Spec.Containers[1].Env).To(ContainElement(ev))
   295  			})
   296  
   297  			By("setting CORE_PEER_LOCALMSPID env var", func() {
   298  				ev := corev1.EnvVar{
   299  					Name:  "CORE_PEER_LOCALMSPID",
   300  					Value: instance.Spec.MSPID,
   301  				}
   302  				Expect(deployment.Spec.Template.Spec.Containers[1].Env).To(ContainElement(ev))
   303  			})
   304  
   305  			By("setting db-data volume", func() {
   306  				v := corev1.Volume{
   307  					Name: "db-data",
   308  					VolumeSource: corev1.VolumeSource{
   309  						PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
   310  							ClaimName: instance.Name + "-statedb-pvc",
   311  						},
   312  					},
   313  				}
   314  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   315  			})
   316  
   317  			By("setting CORE_LEDGER_STATE_STATEDATABASE env var", func() {
   318  				ev := corev1.EnvVar{
   319  					Name:  "CORE_LEDGER_STATE_STATEDATABASE",
   320  					Value: "CouchDB",
   321  				}
   322  				Expect(deployment.Spec.Template.Spec.Containers[1].Env).To(ContainElement(ev))
   323  			})
   324  
   325  			By("setting CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME env var", func() {
   326  				ev := corev1.EnvVar{
   327  					Name:  "CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME",
   328  					Value: overrider.CouchdbUser,
   329  				}
   330  				Expect(deployment.Spec.Template.Spec.Containers[1].Env).To(ContainElement(ev))
   331  			})
   332  
   333  			By("setting CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD env var", func() {
   334  				ev := corev1.EnvVar{
   335  					Name:  "CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD",
   336  					Value: overrider.CouchdbPassword,
   337  				}
   338  				Expect(deployment.Spec.Template.Spec.Containers[1].Env).To(ContainElement(ev))
   339  			})
   340  
   341  			By("setting COUCHDB_USER env var", func() {
   342  				ev := corev1.EnvVar{
   343  					Name:  "COUCHDB_USER",
   344  					Value: overrider.CouchdbUser,
   345  				}
   346  				Expect(deployment.Spec.Template.Spec.Containers[4].Env).To(ContainElement(ev))
   347  			})
   348  
   349  			By("setting COUCHDB_PASSWORD env var", func() {
   350  				ev := corev1.EnvVar{
   351  					Name:  "COUCHDB_PASSWORD",
   352  					Value: overrider.CouchdbPassword,
   353  				}
   354  				Expect(deployment.Spec.Template.Spec.Containers[4].Env).To(ContainElement(ev))
   355  			})
   356  
   357  			By("setting SKIP_PERMISSIONS_UPDATE env var", func() {
   358  				ev := corev1.EnvVar{
   359  					Name:  "SKIP_PERMISSIONS_UPDATE",
   360  					Value: "true",
   361  				}
   362  				Expect(deployment.Spec.Template.Spec.Containers[4].Env).To(ContainElement(ev))
   363  			})
   364  
   365  			By("setting image pull secret", func() {
   366  				Expect(deployment.Spec.Template.Spec.ImagePullSecrets).To(ContainElement(corev1.LocalObjectReference{
   367  					Name: instance.Spec.ImagePullSecrets[0],
   368  				}))
   369  			})
   370  
   371  			By("setting fabric-peer-0 volume", func() {
   372  				v := corev1.Volume{
   373  					Name: "fabric-peer-0",
   374  					VolumeSource: corev1.VolumeSource{
   375  						PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
   376  							ClaimName: instance.Name + "-pvc",
   377  						},
   378  					},
   379  				}
   380  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   381  			})
   382  
   383  			By("setting fluentd-config volume", func() {
   384  				v := corev1.Volume{
   385  					Name: "fluentd-config",
   386  					VolumeSource: corev1.VolumeSource{
   387  						ConfigMap: &corev1.ConfigMapVolumeSource{
   388  							LocalObjectReference: corev1.LocalObjectReference{
   389  								Name: instance.Name + "-fluentd",
   390  							},
   391  						},
   392  					},
   393  				}
   394  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   395  			})
   396  
   397  			By("setting affinity", func() {
   398  				expectedAffinity := overrider.GetAffinity(instance)
   399  				Expect(deployment.Spec.Template.Spec.Affinity).To(Equal(expectedAffinity))
   400  			})
   401  
   402  			By("setting ecert admincerts volume and volume mount", func() {
   403  				v := corev1.Volume{
   404  					Name: "ecert-admincerts",
   405  					VolumeSource: corev1.VolumeSource{
   406  						Secret: &corev1.SecretVolumeSource{
   407  							SecretName: fmt.Sprintf("ecert-%s-admincerts", instance.Name),
   408  						},
   409  					},
   410  				}
   411  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   412  
   413  				vm := corev1.VolumeMount{
   414  					Name:      "ecert-admincerts",
   415  					MountPath: "/certs/msp/admincerts",
   416  				}
   417  				Expect(deployment.Spec.Template.Spec.Containers[1].VolumeMounts).To(ContainElement(vm))
   418  			})
   419  
   420  			By("setting ecert cacerts volume", func() {
   421  				v := corev1.Volume{
   422  					Name: "ecert-cacerts",
   423  					VolumeSource: corev1.VolumeSource{
   424  						Secret: &corev1.SecretVolumeSource{
   425  							SecretName: fmt.Sprintf("ecert-%s-cacerts", instance.Name),
   426  						},
   427  					},
   428  				}
   429  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   430  			})
   431  
   432  			By("setting ecert keystore volume", func() {
   433  				v := corev1.Volume{
   434  					Name: "ecert-keystore",
   435  					VolumeSource: corev1.VolumeSource{
   436  						Secret: &corev1.SecretVolumeSource{
   437  							SecretName: fmt.Sprintf("ecert-%s-keystore", instance.Name),
   438  						},
   439  					},
   440  				}
   441  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   442  			})
   443  
   444  			By("setting ecert signcert volume", func() {
   445  				v := corev1.Volume{
   446  					Name: "ecert-signcert",
   447  					VolumeSource: corev1.VolumeSource{
   448  						Secret: &corev1.SecretVolumeSource{
   449  							SecretName: fmt.Sprintf("ecert-%s-signcert", instance.Name),
   450  						},
   451  					},
   452  				}
   453  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   454  			})
   455  
   456  			By("setting tls cacerts volume", func() {
   457  				v := corev1.Volume{
   458  					Name: "tls-cacerts",
   459  					VolumeSource: corev1.VolumeSource{
   460  						Secret: &corev1.SecretVolumeSource{
   461  							SecretName: fmt.Sprintf("tls-%s-cacerts", instance.Name),
   462  						},
   463  					},
   464  				}
   465  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   466  			})
   467  
   468  			By("setting tls keystore volume", func() {
   469  				v := corev1.Volume{
   470  					Name: "tls-keystore",
   471  					VolumeSource: corev1.VolumeSource{
   472  						Secret: &corev1.SecretVolumeSource{
   473  							SecretName: fmt.Sprintf("tls-%s-keystore", instance.Name),
   474  						},
   475  					},
   476  				}
   477  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   478  			})
   479  
   480  			By("setting tls signcert volume", func() {
   481  				v := corev1.Volume{
   482  					Name: "tls-signcert",
   483  					VolumeSource: corev1.VolumeSource{
   484  						Secret: &corev1.SecretVolumeSource{
   485  							SecretName: fmt.Sprintf("tls-%s-signcert", instance.Name),
   486  						},
   487  					},
   488  				}
   489  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   490  			})
   491  
   492  			By("setting peer-config volume", func() {
   493  				v := corev1.Volume{
   494  					Name: "peer-config",
   495  					VolumeSource: corev1.VolumeSource{
   496  						ConfigMap: &corev1.ConfigMapVolumeSource{
   497  							LocalObjectReference: corev1.LocalObjectReference{
   498  								Name: instance.Name + "-config",
   499  							},
   500  						},
   501  					},
   502  				}
   503  				Expect(deployment.Spec.Template.Spec.Volumes).To(ContainElement(v))
   504  			})
   505  
   506  			CommonPeerDeploymentOverrides(instance, k8sDep)
   507  		})
   508  
   509  		Context("images", func() {
   510  			var (
   511  				image *current.PeerImages
   512  			)
   513  
   514  			BeforeEach(func() {
   515  				image = &current.PeerImages{
   516  					PeerInitImage: "init-image",
   517  					DindImage:     "dind-image",
   518  					CouchDBImage:  "couchdb-image",
   519  					PeerImage:     "peer-image",
   520  					GRPCWebImage:  "proxy-image",
   521  					FluentdImage:  "fluentd-image",
   522  				}
   523  				instance.Spec.Images = image
   524  			})
   525  
   526  			When("no tag is passed", func() {
   527  				It("uses 'latest' for image tags", func() {
   528  					err := overrider.Deployment(instance, k8sDep, resources.Create)
   529  					Expect(err).NotTo(HaveOccurred())
   530  					Expect(deployment.Spec.Template.Spec.InitContainers[0].Image).To(Equal("init-image:latest"))
   531  					Expect(deployment.Spec.Template.Spec.Containers[0].Image).To(Equal("dind-image:latest"))
   532  					Expect(deployment.Spec.Template.Spec.Containers[1].Image).To(Equal("peer-image:latest"))
   533  					Expect(deployment.Spec.Template.Spec.Containers[2].Image).To(Equal("proxy-image:latest"))
   534  					Expect(deployment.Spec.Template.Spec.Containers[3].Image).To(Equal("fluentd-image:latest"))
   535  					Expect(deployment.Spec.Template.Spec.Containers[4].Image).To(Equal("couchdb-image:latest"))
   536  				})
   537  			})
   538  
   539  			When("tag is passed", func() {
   540  				It("uses the passed in tag for image tags", func() {
   541  					instance.Spec.Images = image
   542  					image.DindTag = "1.0.1"
   543  					image.CouchDBTag = "1.0.2"
   544  					image.PeerTag = "1.0.3"
   545  					image.GRPCWebTag = "1.0.4"
   546  					image.PeerInitTag = "2.0.0"
   547  					image.FluentdTag = "1.0.5"
   548  
   549  					err := overrider.Deployment(instance, k8sDep, resources.Create)
   550  					Expect(err).NotTo(HaveOccurred())
   551  					Expect(deployment.Spec.Template.Spec.InitContainers[0].Image).To(Equal("init-image:2.0.0"))
   552  					Expect(deployment.Spec.Template.Spec.Containers[0].Image).To(Equal("dind-image:1.0.1"))
   553  					Expect(deployment.Spec.Template.Spec.Containers[1].Image).To(Equal("peer-image:1.0.3"))
   554  					Expect(deployment.Spec.Template.Spec.Containers[2].Image).To(Equal("proxy-image:1.0.4"))
   555  					Expect(deployment.Spec.Template.Spec.Containers[3].Image).To(Equal("fluentd-image:1.0.5"))
   556  					Expect(deployment.Spec.Template.Spec.Containers[4].Image).To(Equal("couchdb-image:1.0.2"))
   557  				})
   558  			})
   559  
   560  			Context("chaincode container", func() {
   561  				BeforeEach(func() {
   562  					instance.Spec.Images = &current.PeerImages{
   563  						PeerInitImage:   "ibp-init",
   564  						PeerInitTag:     "latest",
   565  						CCLauncherImage: "chaincode-builder",
   566  						CCLauncherTag:   "cclauncher-amd64",
   567  						BuilderImage:    "ibp-ccenv",
   568  						BuilderTag:      "builder-tag",
   569  						GoEnvImage:      "ibp-goenv",
   570  						GoEnvTag:        "goenv-tag",
   571  						JavaEnvImage:    "ibp-javaenv",
   572  						JavaEnvTag:      "javaenv-tag",
   573  						NodeEnvImage:    "ibp-nodeenv",
   574  						NodeEnvTag:      "nodeenv-tag",
   575  					}
   576  				})
   577  
   578  				It("creates chaincode launcher container", func() {
   579  					err := overrider.CreateCCLauncherContainer(instance, deployment)
   580  					Expect(err).NotTo(HaveOccurred())
   581  
   582  					ccLauncher := deployment.MustGetContainer("chaincode-launcher")
   583  
   584  					By("setting resources from spec", func() {
   585  						Expect(ccLauncher.Resources.Requests[corev1.ResourceCPU]).To(Equal(testMatrix[5][0]))
   586  						Expect(ccLauncher.Resources.Requests[corev1.ResourceMemory]).To(Equal(testMatrix[5][1]))
   587  						Expect(ccLauncher.Resources.Requests[corev1.ResourceEphemeralStorage]).To(Equal(testMatrix[5][4]))
   588  
   589  						Expect(ccLauncher.Resources.Limits[corev1.ResourceCPU]).To(Equal(testMatrix[5][2]))
   590  						Expect(ccLauncher.Resources.Limits[corev1.ResourceMemory]).To(Equal(testMatrix[5][3]))
   591  						Expect(ccLauncher.Resources.Limits[corev1.ResourceEphemeralStorage]).To(Equal(testMatrix[5][5]))
   592  					})
   593  
   594  					By("setting envs with the requestes images/spec", func() {
   595  						Expect(ccLauncher.Env).To(ContainElement(corev1.EnvVar{
   596  							Name:  "FILETRANSFERIMAGE",
   597  							Value: fmt.Sprintf("%s:%s", instance.Spec.Images.PeerInitImage, instance.Spec.Images.PeerInitTag),
   598  						}))
   599  
   600  						Expect(ccLauncher.Env).To(ContainElement(corev1.EnvVar{
   601  							Name:  "BUILDERIMAGE",
   602  							Value: fmt.Sprintf("%s:%s", instance.Spec.Images.BuilderImage, instance.Spec.Images.BuilderTag),
   603  						}))
   604  
   605  						Expect(ccLauncher.Env).To(ContainElement(corev1.EnvVar{
   606  							Name:  "GOENVIMAGE",
   607  							Value: fmt.Sprintf("%s:%s", instance.Spec.Images.GoEnvImage, instance.Spec.Images.GoEnvTag),
   608  						}))
   609  
   610  						Expect(ccLauncher.Env).To(ContainElement(corev1.EnvVar{
   611  							Name:  "JAVAENVIMAGE",
   612  							Value: fmt.Sprintf("%s:%s", instance.Spec.Images.JavaEnvImage, instance.Spec.Images.JavaEnvTag),
   613  						}))
   614  
   615  						Expect(ccLauncher.Env).To(ContainElement(corev1.EnvVar{
   616  							Name:  "NODEENVIMAGE",
   617  							Value: fmt.Sprintf("%s:%s", instance.Spec.Images.NodeEnvImage, instance.Spec.Images.NodeEnvTag),
   618  						}))
   619  					})
   620  				})
   621  			})
   622  		})
   623  
   624  		Context("leveldb", func() {
   625  			BeforeEach(func() {
   626  				instance.Spec.StateDb = "leveldb"
   627  			})
   628  
   629  			It("overrides value based on spec", func() {
   630  				err := overrider.Deployment(instance, k8sDep, resources.Create)
   631  				Expect(err).NotTo(HaveOccurred())
   632  
   633  				By("setting volume mount env var", func() {
   634  					vm := corev1.VolumeMount{
   635  						Name:      "db-data",
   636  						MountPath: "/data/peer/ledgersData/stateLeveldb/",
   637  						SubPath:   "data",
   638  					}
   639  					Expect(deployment.Spec.Template.Spec.InitContainers[0].VolumeMounts).To(ContainElement(vm))
   640  					Expect(deployment.Spec.Template.Spec.Containers[1].VolumeMounts).To(ContainElement(vm))
   641  				})
   642  
   643  				By("setting CORE_LEDGER_STATE_STATEDATABASE env var", func() {
   644  					ev := corev1.EnvVar{
   645  						Name:  "CORE_LEDGER_STATE_STATEDATABASE",
   646  						Value: "goleveldb",
   647  					}
   648  					Expect(deployment.Spec.Template.Spec.Containers[1].Env).To(ContainElement(ev))
   649  				})
   650  			})
   651  		})
   652  	})
   653  
   654  	Context("update", func() {
   655  		BeforeEach(func() {
   656  			var err error
   657  
   658  			err = overrider.CreateCouchDBContainers(instance, deployment)
   659  			Expect(err).NotTo(HaveOccurred())
   660  		})
   661  
   662  		It("overrides value based on spec", func() {
   663  			err := overrider.Deployment(instance, k8sDep, resources.Update)
   664  			Expect(err).NotTo(HaveOccurred())
   665  
   666  			CommonPeerDeploymentOverrides(instance, k8sDep)
   667  		})
   668  
   669  		It("sets init container command", func() {
   670  			err := overrider.Deployment(instance, k8sDep, resources.Update)
   671  			Expect(err).NotTo(HaveOccurred())
   672  
   673  			init, err := deployment.GetContainer(override.INIT)
   674  			Expect(err).NotTo(HaveOccurred())
   675  			cmd := "DEFAULT_PERM=775 && DEFAULT_USER=7051 && DEFAULT_GROUP=1000 "
   676  			cmd += `&& PERM=$(stat -c "%a" /data/) && USER=$(stat -c "%u" /data/) && GROUP=$(stat -c "%g" /data/) `
   677  			cmd += `&& if [ ${PERM} != ${DEFAULT_PERM} ] || [ ${USER} != ${DEFAULT_USER} ] || [ ${GROUP} != ${DEFAULT_GROUP} ]; `
   678  			cmd += `then chmod -R ${DEFAULT_PERM} /data/ && chown -R -H ${DEFAULT_USER}:${DEFAULT_GROUP} /data/; fi`
   679  			Expect(init.Command).To(Equal([]string{"bash", "-c", cmd}))
   680  		})
   681  
   682  		Context("images", func() {
   683  			var (
   684  				image *current.PeerImages
   685  			)
   686  
   687  			BeforeEach(func() {
   688  				image = &current.PeerImages{
   689  					PeerInitImage: "init-image",
   690  					DindImage:     "dind-image",
   691  					CouchDBImage:  "couchdb-image",
   692  					PeerImage:     "peer-image",
   693  					GRPCWebImage:  "proxy-image",
   694  					FluentdImage:  "fluentd-image",
   695  				}
   696  				instance.Spec.Images = image
   697  			})
   698  
   699  			When("no tag is passed", func() {
   700  				It("uses 'latest' for image tags", func() {
   701  					err := overrider.Deployment(instance, k8sDep, resources.Update)
   702  					Expect(err).NotTo(HaveOccurred())
   703  					Expect(deployment.Spec.Template.Spec.InitContainers[0].Image).To(Equal("init-image:latest"))
   704  					Expect(deployment.Spec.Template.Spec.Containers[0].Image).To(Equal("dind-image:latest"))
   705  					Expect(deployment.Spec.Template.Spec.Containers[1].Image).To(Equal("peer-image:latest"))
   706  					Expect(deployment.Spec.Template.Spec.Containers[2].Image).To(Equal("proxy-image:latest"))
   707  					Expect(deployment.Spec.Template.Spec.Containers[3].Image).To(Equal("fluentd-image:latest"))
   708  					Expect(deployment.Spec.Template.Spec.Containers[4].Image).To(Equal("couchdb-image:latest"))
   709  				})
   710  			})
   711  
   712  			When("tag is passed", func() {
   713  				It("uses the passed in tag for image tags", func() {
   714  					image.DindTag = "1.0.1"
   715  					image.CouchDBTag = "1.0.2"
   716  					image.PeerTag = "1.0.3"
   717  					image.GRPCWebTag = "1.0.4"
   718  					image.PeerInitTag = "2.0.0"
   719  					image.FluentdTag = "1.0.5"
   720  
   721  					err := overrider.Deployment(instance, k8sDep, resources.Update)
   722  					Expect(err).NotTo(HaveOccurred())
   723  					Expect(deployment.Spec.Template.Spec.InitContainers[0].Image).To(Equal("init-image:2.0.0"))
   724  					Expect(deployment.Spec.Template.Spec.Containers[0].Image).To(Equal("dind-image:1.0.1"))
   725  					Expect(deployment.Spec.Template.Spec.Containers[1].Image).To(Equal("peer-image:1.0.3"))
   726  					Expect(deployment.Spec.Template.Spec.Containers[2].Image).To(Equal("proxy-image:1.0.4"))
   727  					Expect(deployment.Spec.Template.Spec.Containers[3].Image).To(Equal("fluentd-image:1.0.5"))
   728  					Expect(deployment.Spec.Template.Spec.Containers[4].Image).To(Equal("couchdb-image:1.0.2"))
   729  				})
   730  			})
   731  		})
   732  
   733  		Context("v2", func() {
   734  			BeforeEach(func() {
   735  				instance.Spec.FabricVersion = "2.4.1"
   736  			})
   737  
   738  			Context("chaincode launcher", func() {
   739  				BeforeEach(func() {
   740  					instance.Spec.Images = &current.PeerImages{
   741  						CCLauncherImage: "new-cclauncher",
   742  						CCLauncherTag:   "v2",
   743  						PeerInitImage:   "new-peerinit",
   744  						PeerInitTag:     "v2",
   745  						BuilderImage:    "new-builder",
   746  						BuilderTag:      "v2",
   747  						GoEnvImage:      "new-goenv",
   748  						GoEnvTag:        "v2",
   749  						JavaEnvImage:    "new-javaenv",
   750  						JavaEnvTag:      "v2",
   751  						NodeEnvImage:    "new-nodeenv",
   752  						NodeEnvTag:      "v2",
   753  					}
   754  				})
   755  
   756  				It("updates", func() {
   757  					err := overrider.Deployment(instance, k8sDep, resources.Update)
   758  					Expect(err).NotTo(HaveOccurred())
   759  
   760  					By("setting chaincode launcher from spec to deployment", func() {
   761  						Expect(deployment.MustGetContainer(override.CCLAUNCHER).Image).To(Equal("new-cclauncher:v2"))
   762  					})
   763  
   764  					By("having a non-null cc launcher tag", func() {
   765  						_, err = deployment.GetContainer(override.CCLAUNCHER)
   766  						Expect(err).ToNot(HaveOccurred())
   767  					})
   768  
   769  					By("setting env vars with new image values", func() {
   770  						Expect(deployment.MustGetContainer(override.CCLAUNCHER).Env).To(ContainElements(
   771  							corev1.EnvVar{
   772  								Name:  "FILETRANSFERIMAGE",
   773  								Value: "new-peerinit:v2",
   774  							},
   775  							corev1.EnvVar{
   776  								Name:  "BUILDERIMAGE",
   777  								Value: "new-builder:v2",
   778  							},
   779  							corev1.EnvVar{
   780  								Name:  "GOENVIMAGE",
   781  								Value: "new-goenv:v2",
   782  							},
   783  							corev1.EnvVar{
   784  								Name:  "JAVAENVIMAGE",
   785  								Value: "new-javaenv:v2",
   786  							},
   787  							corev1.EnvVar{
   788  								Name:  "NODEENVIMAGE",
   789  								Value: "new-nodeenv:v2",
   790  							},
   791  						))
   792  					})
   793  
   794  					By("changing permissions on the /cclauncher volume", func() {
   795  						init, err := deployment.GetContainer(override.INIT)
   796  						Expect(err).NotTo(HaveOccurred())
   797  						Expect(init.Command).To(HaveLen(3))
   798  						Expect(init.Command[0]).To(Equal("bash"))
   799  						Expect(init.Command[1]).To(Equal("-c"))
   800  						Expect(init.Command[2]).To(Equal("DEFAULT_PERM=775 && DEFAULT_USER=7051 && DEFAULT_GROUP=1000 && PERM=$(stat -c \"%a\" /data/) && USER=$(stat -c \"%u\" /data/) && GROUP=$(stat -c \"%g\" /data/) && if [ ${PERM} != ${DEFAULT_PERM} ] || [ ${USER} != ${DEFAULT_USER} ] || [ ${GROUP} != ${DEFAULT_GROUP} ]; then chmod -R ${DEFAULT_PERM} /{data/,cclauncher/} && chown -R -H ${DEFAULT_USER}:${DEFAULT_GROUP} /{data/,cclauncher/}; fi"))
   801  					})
   802  				})
   803  			})
   804  
   805  			Context("chaincode launcher with leveldb", func() {
   806  				BeforeEach(func() {
   807  					instance.Spec.Images = &current.PeerImages{
   808  						CCLauncherImage: "new-cclauncher",
   809  						CCLauncherTag:   "v2",
   810  					}
   811  					instance.Spec.StateDb = "leveldb"
   812  				})
   813  
   814  				It("updates", func() {
   815  					err := overrider.Deployment(instance, k8sDep, resources.Update)
   816  					Expect(err).NotTo(HaveOccurred())
   817  
   818  					By("having a non-null cc launcher tag", func() {
   819  						_, err = deployment.GetContainer(override.CCLAUNCHER)
   820  						Expect(err).ToNot(HaveOccurred())
   821  					})
   822  
   823  					By("setting chaincode launcher from spec to deployment", func() {
   824  						Expect(deployment.MustGetContainer(override.CCLAUNCHER).Image).To(Equal("new-cclauncher:v2"))
   825  					})
   826  
   827  					By("changing permissions on the cclauncher and stateLeveldb volumes", func() {
   828  						init, err := deployment.GetContainer(override.INIT)
   829  						Expect(err).NotTo(HaveOccurred())
   830  						Expect(init.Command).To(HaveLen(3))
   831  						Expect(init.Command[0]).To(Equal("bash"))
   832  						Expect(init.Command[1]).To(Equal("-c"))
   833  						Expect(init.Command[2]).To(Equal("DEFAULT_PERM=775 && DEFAULT_USER=7051 && DEFAULT_GROUP=1000 && PERM=$(stat -c \"%a\" /data/) && USER=$(stat -c \"%u\" /data/) && GROUP=$(stat -c \"%g\" /data/) && if [ ${PERM} != ${DEFAULT_PERM} ] || [ ${USER} != ${DEFAULT_USER} ] || [ ${GROUP} != ${DEFAULT_GROUP} ]; then chmod -R ${DEFAULT_PERM} /{data/,data/peer/ledgersData/stateLeveldb,cclauncher/} && chown -R -H ${DEFAULT_USER}:${DEFAULT_GROUP} /{data/,data/peer/ledgersData/stateLeveldb,cclauncher/}; fi"))
   834  					})
   835  				})
   836  			})
   837  
   838  			Context("external chaincode builder", func() {
   839  				BeforeEach(func() {
   840  					instance.Spec.Images = &current.PeerImages{
   841  						PeerInitImage: "new-peer-init",
   842  						PeerInitTag:   "latest",
   843  						PeerImage:     "hyperledger/fabric-peer",
   844  						PeerTag:       "2.4.1",
   845  					}
   846  
   847  					err := overrider.Deployment(instance, k8sDep, resources.Update)
   848  					Expect(err).NotTo(HaveOccurred())
   849  				})
   850  
   851  				When("a nil launcher is specified", func() {
   852  					It("emits a deployment without a launcher sidecar", func() {
   853  						_, err := deployment.GetContainer(override.CCLAUNCHER)
   854  						Expect(err).To(HaveOccurred())
   855  					})
   856  
   857  					It("does not change permissions on the /cclauncher volume", func() {
   858  						init, err := deployment.GetContainer(override.INIT)
   859  						Expect(err).NotTo(HaveOccurred())
   860  						Expect(init.Command).To(HaveLen(3))
   861  						Expect(init.Command[0]).To(Equal("bash"))
   862  						Expect(init.Command[1]).To(Equal("-c"))
   863  						Expect(init.Command[2]).To(Equal("DEFAULT_PERM=775 && DEFAULT_USER=7051 && DEFAULT_GROUP=1000 && PERM=$(stat -c \"%a\" /data/) && USER=$(stat -c \"%u\" /data/) && GROUP=$(stat -c \"%g\" /data/) && if [ ${PERM} != ${DEFAULT_PERM} ] || [ ${USER} != ${DEFAULT_USER} ] || [ ${GROUP} != ${DEFAULT_GROUP} ]; then chmod -R ${DEFAULT_PERM} /data/ && chown -R -H ${DEFAULT_USER}:${DEFAULT_GROUP} /data/; fi"))
   864  					})
   865  				})
   866  			})
   867  
   868  			Context("chaincode builder config map as env", func() {
   869  				BeforeEach(func() {
   870  					instance.Spec.ChaincodeBuilderConfig = map[string]string{
   871  						"peername": "org1peer1",
   872  					}
   873  
   874  					err := overrider.Deployment(instance, k8sDep, resources.Update)
   875  					Expect(err).NotTo(HaveOccurred())
   876  				})
   877  
   878  				When("A chaincode builder config is present", func() {
   879  					It("Sets a JSON env map in the peer deployment", func() {
   880  						peer, err := deployment.GetContainer(override.PEER)
   881  						Expect(err).NotTo(HaveOccurred())
   882  						Expect(peer.Env).NotTo(BeNil())
   883  
   884  						Expect(deployment.MustGetContainer(override.PEER).Env).To(ContainElement(corev1.EnvVar{
   885  							Name:  "CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG",
   886  							Value: "{\"peername\":\"org1peer1\"}",
   887  						}))
   888  					})
   889  				})
   890  			})
   891  
   892  			Context("couchbase and external builder images: regression test for Issue #3269", func() {
   893  				BeforeEach(func() {
   894  					instance.Spec.Images = &current.PeerImages{
   895  						PeerInitImage: "new-peer-init",
   896  						PeerInitTag:   "latest",
   897  						PeerImage:     "hyperledger/fabric-peer",
   898  						PeerTag:       "2.4.1",
   899  					}
   900  
   901  					instance.Spec.StateDb = "couchdb"
   902  
   903  					err := overrider.Deployment(instance, k8sDep, resources.Update)
   904  					Expect(err).NotTo(HaveOccurred())
   905  				})
   906  
   907  				When("a nil launcher is specified with a couchdb state table", func() {
   908  					It("does not specify a bash set for the init container permission command", func() {
   909  						init, err := deployment.GetContainer(override.INIT)
   910  						Expect(err).NotTo(HaveOccurred())
   911  						Expect(init.Command).To(HaveLen(3))
   912  						Expect(init.Command[0]).To(Equal("bash"))
   913  						Expect(init.Command[1]).To(Equal("-c"))
   914  						Expect(init.Command[2]).To(Equal("DEFAULT_PERM=775 && DEFAULT_USER=7051 && DEFAULT_GROUP=1000 && PERM=$(stat -c \"%a\" /data/) && USER=$(stat -c \"%u\" /data/) && GROUP=$(stat -c \"%g\" /data/) && if [ ${PERM} != ${DEFAULT_PERM} ] || [ ${USER} != ${DEFAULT_USER} ] || [ ${GROUP} != ${DEFAULT_GROUP} ]; then chmod -R ${DEFAULT_PERM} /data/ && chown -R -H ${DEFAULT_USER}:${DEFAULT_GROUP} /data/; fi"))
   915  					})
   916  				})
   917  			})
   918  
   919  			Context("leveldb and external builder images: regression test for Issue #3269", func() {
   920  				BeforeEach(func() {
   921  					instance.Spec.Images = &current.PeerImages{
   922  						PeerInitImage: "new-peer-init",
   923  						PeerInitTag:   "latest",
   924  						PeerImage:     "hyperledger/fabric-peer",
   925  						PeerTag:       "2.4.1",
   926  					}
   927  
   928  					instance.Spec.StateDb = "leveldb"
   929  
   930  					err := overrider.Deployment(instance, k8sDep, resources.Update)
   931  					Expect(err).NotTo(HaveOccurred())
   932  				})
   933  
   934  				When("a nil launcher is specified with a leveldb state table", func() {
   935  					It("specifies a bash set for the init container permission command", func() {
   936  						init, err := deployment.GetContainer(override.INIT)
   937  						Expect(err).NotTo(HaveOccurred())
   938  						Expect(init.Command).To(HaveLen(3))
   939  						Expect(init.Command[0]).To(Equal("bash"))
   940  						Expect(init.Command[1]).To(Equal("-c"))
   941  						Expect(init.Command[2]).To(Equal("DEFAULT_PERM=775 && DEFAULT_USER=7051 && DEFAULT_GROUP=1000 && PERM=$(stat -c \"%a\" /data/) && USER=$(stat -c \"%u\" /data/) && GROUP=$(stat -c \"%g\" /data/) && if [ ${PERM} != ${DEFAULT_PERM} ] || [ ${USER} != ${DEFAULT_USER} ] || [ ${GROUP} != ${DEFAULT_GROUP} ]; then chmod -R ${DEFAULT_PERM} /{data/,data/peer/ledgersData/stateLeveldb} && chown -R -H ${DEFAULT_USER}:${DEFAULT_GROUP} /{data/,data/peer/ledgersData/stateLeveldb}; fi"))
   942  					})
   943  				})
   944  			})
   945  		})
   946  
   947  		Context("v24", func() {
   948  			BeforeEach(func() {
   949  				instance.Spec.FabricVersion = "2.4.3"
   950  				instance.Spec.Images = &current.PeerImages{
   951  					CCLauncherImage: "new-cclauncher",
   952  					CCLauncherTag:   "v2",
   953  					PeerInitImage:   "new-peerinit",
   954  					PeerInitTag:     "v2",
   955  					BuilderImage:    "new-builder",
   956  					BuilderTag:      "v2",
   957  					GoEnvImage:      "new-goenv",
   958  					GoEnvTag:        "v2",
   959  					JavaEnvImage:    "new-javaenv",
   960  					JavaEnvTag:      "v2",
   961  					NodeEnvImage:    "new-nodeenv",
   962  					NodeEnvTag:      "v2",
   963  				}
   964  			})
   965  
   966  			Context("chaincode launcher", func() {
   967  				It("updates", func() {
   968  					err := overrider.Deployment(instance, k8sDep, resources.Update)
   969  					Expect(err).NotTo(HaveOccurred())
   970  
   971  					By("setting liveliness probe to https", func() {
   972  						Expect(deployment.MustGetContainer(override.CCLAUNCHER).LivenessProbe.HTTPGet.Scheme).To(Equal(corev1.URISchemeHTTPS))
   973  					})
   974  
   975  					By("setting readiness probe to https", func() {
   976  						Expect(deployment.MustGetContainer(override.CCLAUNCHER).ReadinessProbe.HTTPGet.Scheme).To(Equal(corev1.URISchemeHTTPS))
   977  					})
   978  				})
   979  			})
   980  		})
   981  	})
   982  
   983  	Context("Replicas", func() {
   984  		When("Replicas is greater than 1", func() {
   985  			It("returns an error", func() {
   986  				replicas := int32(2)
   987  				instance.Spec.Replicas = &replicas
   988  				err := overrider.Deployment(instance, k8sDep, resources.Create)
   989  				Expect(err).To(HaveOccurred())
   990  				Expect(err.Error()).To(Equal("replicas > 1 not allowed in IBPPeer"))
   991  			})
   992  		})
   993  		When("Replicas is equal to 1", func() {
   994  			It("returns success", func() {
   995  				replicas := int32(1)
   996  				instance.Spec.Replicas = &replicas
   997  				err := overrider.Deployment(instance, k8sDep, resources.Create)
   998  				Expect(err).NotTo(HaveOccurred())
   999  			})
  1000  		})
  1001  		When("Replicas is equal to 0", func() {
  1002  			It("returns success", func() {
  1003  				replicas := int32(0)
  1004  				instance.Spec.Replicas = &replicas
  1005  				err := overrider.Deployment(instance, k8sDep, resources.Create)
  1006  				Expect(err).NotTo(HaveOccurred())
  1007  			})
  1008  		})
  1009  		When("Replicas is nil", func() {
  1010  			It("returns success", func() {
  1011  				instance.Spec.Replicas = nil
  1012  				err := overrider.Deployment(instance, k8sDep, resources.Create)
  1013  				Expect(err).NotTo(HaveOccurred())
  1014  			})
  1015  		})
  1016  	})
  1017  
  1018  	Context("HSM", func() {
  1019  		BeforeEach(func() {
  1020  			configOverride := v2peerconfig.Core{
  1021  				Core: v2peer.Core{
  1022  					Peer: v2peer.Peer{
  1023  						BCCSP: &common.BCCSP{
  1024  							ProviderName: "PKCS11",
  1025  							PKCS11: &common.PKCS11Opts{
  1026  								Label: "partition1",
  1027  								Pin:   "B6T9Q7mGNG",
  1028  							},
  1029  						},
  1030  					},
  1031  				},
  1032  			}
  1033  
  1034  			configBytes, err := json.Marshal(configOverride)
  1035  			Expect(err).NotTo(HaveOccurred())
  1036  
  1037  			instance.Spec.ConfigOverride = &runtime.RawExtension{Raw: configBytes}
  1038  		})
  1039  
  1040  		It("sets proxy env on peer container", func() {
  1041  			instance.Spec.HSM = &current.HSM{PKCS11Endpoint: "1.2.3.4"}
  1042  			err := overrider.Deployment(instance, k8sDep, resources.Create)
  1043  			Expect(err).NotTo(HaveOccurred())
  1044  
  1045  			d := dep.New(k8sDep)
  1046  			Expect(d.MustGetContainer(override.PEER).Env).To(ContainElement(corev1.EnvVar{
  1047  				Name:  "PKCS11_PROXY_SOCKET",
  1048  				Value: "1.2.3.4",
  1049  			}))
  1050  		})
  1051  
  1052  		It("configures deployment to use HSM init image", func() {
  1053  			err := overrider.Deployment(instance, k8sDep, resources.Create)
  1054  			Expect(err).NotTo(HaveOccurred())
  1055  
  1056  			d := dep.New(k8sDep)
  1057  			By("setting volume mounts", func() {
  1058  				Expect(d.MustGetContainer(override.PEER).VolumeMounts).To(ContainElement(corev1.VolumeMount{
  1059  					Name:      "shared",
  1060  					MountPath: "/hsm/lib",
  1061  					SubPath:   "hsm",
  1062  				}))
  1063  
  1064  				Expect(d.MustGetContainer(override.PEER).VolumeMounts).To(ContainElement(corev1.VolumeMount{
  1065  					Name:      "hsmconfig",
  1066  					MountPath: "/etc/Chrystoki.conf",
  1067  					SubPath:   "Chrystoki.conf",
  1068  				}))
  1069  			})
  1070  
  1071  			By("setting env vars", func() {
  1072  				Expect(d.MustGetContainer(override.PEER).Env).To(ContainElement(corev1.EnvVar{
  1073  					Name:  "env1",
  1074  					Value: "env1value",
  1075  				}))
  1076  			})
  1077  
  1078  			By("creating HSM init container", func() {
  1079  				Expect(d.ContainerExists("hsm-client")).To(Equal(true))
  1080  			})
  1081  		})
  1082  	})
  1083  })
  1084  
  1085  func CommonPeerDeploymentOverrides(instance *current.IBPPeer, deployment *appsv1.Deployment) {
  1086  	// Perform check after override to make sure new values are in place
  1087  	for i, c := range deployment.Spec.Template.Spec.Containers {
  1088  		By(fmt.Sprintf("setting resources for container '%s'", c.Name), func() {
  1089  			Expect(c.Resources.Requests[corev1.ResourceCPU]).To(Equal(testMatrix[i][0]))
  1090  			Expect(c.Resources.Requests[corev1.ResourceMemory]).To(Equal(testMatrix[i][1]))
  1091  			Expect(c.Resources.Requests[corev1.ResourceEphemeralStorage]).To(Equal(testMatrix[i][4]))
  1092  			Expect(c.Resources.Limits[corev1.ResourceCPU]).To(Equal(testMatrix[i][2]))
  1093  			Expect(c.Resources.Limits[corev1.ResourceMemory]).To(Equal(testMatrix[i][3]))
  1094  			Expect(c.Resources.Limits[corev1.ResourceEphemeralStorage]).To(Equal(testMatrix[i][5]))
  1095  		})
  1096  		if version.GetMajorReleaseVersion(instance.Spec.FabricVersion) == version.V2 {
  1097  			if c.Name == "peer" {
  1098  				By("string PEER_NAME in peer container", func() {
  1099  					Expect(util.EnvExists(c.Env, "PEER_NAME")).To(Equal(true))
  1100  					Expect(util.GetEnvValue(c.Env, "PEER_NAME")).To(Equal(instance.GetName()))
  1101  				})
  1102  			}
  1103  			if c.Name == "chaincode-launcher" {
  1104  				By("string CORE_PEER_LOCALMSPID in v2 chaincode-launcher container", func() {
  1105  					Expect(util.EnvExists(c.Env, "CORE_PEER_LOCALMSPID")).To(Equal(true))
  1106  					Expect(util.GetEnvValue(c.Env, "CORE_PEER_LOCALMSPID")).To(Equal(instance.Spec.MSPID))
  1107  				})
  1108  			}
  1109  		}
  1110  	}
  1111  }