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 = ¤t.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: ¤t.PeerStorages{}, 165 Service: ¤t.Service{}, 166 Images: ¤t.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: ¤t.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 = ¤t.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 = ¤t.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 = ¤t.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 = ¤t.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 = ¤t.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 = ¤t.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 = ¤t.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 = ¤t.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 = ¤t.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 = ¤t.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 }