github.com/IBM-Blockchain/fabric-operator@v1.0.4/pkg/offering/k8s/console/console_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 k8sconsole_test
    20  
    21  import (
    22  	current "github.com/IBM-Blockchain/fabric-operator/api/v1beta1"
    23  	"github.com/IBM-Blockchain/fabric-operator/controllers/mocks"
    24  	config "github.com/IBM-Blockchain/fabric-operator/operatorconfig"
    25  	managermocks "github.com/IBM-Blockchain/fabric-operator/pkg/manager/resources/mocks"
    26  	baseconsole "github.com/IBM-Blockchain/fabric-operator/pkg/offering/base/console"
    27  	baseconsolemocks "github.com/IBM-Blockchain/fabric-operator/pkg/offering/base/console/mocks"
    28  	k8sconsole "github.com/IBM-Blockchain/fabric-operator/pkg/offering/k8s/console"
    29  	"github.com/IBM-Blockchain/fabric-operator/version"
    30  	. "github.com/onsi/ginkgo/v2"
    31  	. "github.com/onsi/gomega"
    32  	"github.com/pkg/errors"
    33  	"k8s.io/apimachinery/pkg/runtime"
    34  )
    35  
    36  var _ = Describe("K8s Console", func() {
    37  	var (
    38  		console        *k8sconsole.Console
    39  		instance       *current.IBPConsole
    40  		mockKubeClient *mocks.Client
    41  
    42  		deploymentMgr        *managermocks.ResourceManager
    43  		serviceMgr           *managermocks.ResourceManager
    44  		pvcMgr               *managermocks.ResourceManager
    45  		configMapMgr         *managermocks.ResourceManager
    46  		consoleConfigMapMgr  *managermocks.ResourceManager
    47  		deployerConfigMapMgr *managermocks.ResourceManager
    48  		roleMgr              *managermocks.ResourceManager
    49  		roleBindingMgr       *managermocks.ResourceManager
    50  		serviceAccountMgr    *managermocks.ResourceManager
    51  		ingressMgr           *managermocks.ResourceManager
    52  		ingressv1beta1Mgr    *managermocks.ResourceManager
    53  		update               *baseconsolemocks.Update
    54  	)
    55  
    56  	BeforeEach(func() {
    57  		mockKubeClient = &mocks.Client{}
    58  		update = &baseconsolemocks.Update{}
    59  
    60  		deploymentMgr = &managermocks.ResourceManager{}
    61  		serviceMgr = &managermocks.ResourceManager{}
    62  		pvcMgr = &managermocks.ResourceManager{}
    63  		configMapMgr = &managermocks.ResourceManager{}
    64  		consoleConfigMapMgr = &managermocks.ResourceManager{}
    65  		deployerConfigMapMgr = &managermocks.ResourceManager{}
    66  		roleMgr = &managermocks.ResourceManager{}
    67  		roleBindingMgr = &managermocks.ResourceManager{}
    68  		serviceAccountMgr = &managermocks.ResourceManager{}
    69  		ingressMgr = &managermocks.ResourceManager{}
    70  		ingressv1beta1Mgr = &managermocks.ResourceManager{}
    71  
    72  		instance = &current.IBPConsole{
    73  			Spec: current.IBPConsoleSpec{
    74  				License: current.License{
    75  					Accept: true,
    76  				},
    77  				ServiceAccountName: "test",
    78  				AuthScheme:         "couchdb",
    79  				DeployerTimeout:    30000,
    80  				Components:         "athena-components",
    81  				Sessions:           "athena-sessions",
    82  				System:             "athena-system",
    83  				Service:            &current.Service{},
    84  				Email:              "xyz@ibm.com",
    85  				Password:           "cGFzc3dvcmQ=",
    86  				SystemChannel:      "testchainid",
    87  				ImagePullSecrets:   []string{"testsecret"},
    88  				RegistryURL:        "ghcr.io/ibm-blockchain/",
    89  				Kubeconfig:         &[]byte{},
    90  				Images: &current.ConsoleImages{
    91  					ConsoleInitImage:   "fake-init-image",
    92  					ConsoleInitTag:     "1234",
    93  					CouchDBImage:       "fake-couchdb-image",
    94  					CouchDBTag:         "1234",
    95  					ConsoleImage:       "fake-console-image",
    96  					ConsoleTag:         "1234",
    97  					ConfigtxlatorImage: "fake-configtxlator-image",
    98  					ConfigtxlatorTag:   "1234",
    99  					DeployerImage:      "fake-deployer-image",
   100  					DeployerTag:        "1234",
   101  				},
   102  				NetworkInfo: &current.NetworkInfo{
   103  					Domain:      "test.domain",
   104  					ConsolePort: 31010,
   105  					ProxyPort:   31011,
   106  				},
   107  				TLSSecretName: "secret",
   108  				Resources:     &current.ConsoleResources{},
   109  				Storage: &current.ConsoleStorage{
   110  					Console: &current.StorageSpec{
   111  						Size:  "100m",
   112  						Class: "manual",
   113  					},
   114  				},
   115  				PasswordSecretName: "password",
   116  				Versions:           &current.Versions{},
   117  				ConnectionString:   "https://localhost",
   118  			},
   119  		}
   120  		instance.Kind = "IBPConsole"
   121  		instance.Status.Version = version.Operator
   122  
   123  		console = &k8sconsole.Console{
   124  			Console: &baseconsole.Console{
   125  				Client: mockKubeClient,
   126  				Scheme: &runtime.Scheme{},
   127  				Config: &config.Config{},
   128  
   129  				DeploymentManager:        deploymentMgr,
   130  				ServiceManager:           serviceMgr,
   131  				PVCManager:               pvcMgr,
   132  				ConfigMapManager:         configMapMgr,
   133  				ConsoleConfigMapManager:  consoleConfigMapMgr,
   134  				DeployerConfigMapManager: deployerConfigMapMgr,
   135  				RoleManager:              roleMgr,
   136  				RoleBindingManager:       roleBindingMgr,
   137  				ServiceAccountManager:    serviceAccountMgr,
   138  				Restart:                  &baseconsolemocks.RestartManager{},
   139  			},
   140  			IngressManager:        ingressMgr,
   141  			Ingressv1beta1Manager: ingressv1beta1Mgr,
   142  		}
   143  	})
   144  
   145  	Context("Reconciles", func() {
   146  		It("returns an error if pvc manager fails to reconcile", func() {
   147  			pvcMgr.ReconcileReturns(errors.New("failed to reconcile pvc"))
   148  			_, err := console.Reconcile(instance, update)
   149  			Expect(err).To(HaveOccurred())
   150  			Expect(err.Error()).To(Equal("failed to reconcile managers: failed PVC reconciliation: failed to reconcile pvc"))
   151  		})
   152  
   153  		It("returns an error if service manager fails to reconcile", func() {
   154  			serviceMgr.ReconcileReturns(errors.New("failed to reconcile service"))
   155  			_, err := console.Reconcile(instance, update)
   156  			Expect(err).To(HaveOccurred())
   157  			Expect(err.Error()).To(Equal("failed to reconcile managers: failed Service reconciliation: failed to reconcile service"))
   158  		})
   159  
   160  		It("returns an error if deployment manager fails to reconcile", func() {
   161  			deploymentMgr.ReconcileReturns(errors.New("failed to reconcile deployment"))
   162  			_, err := console.Reconcile(instance, update)
   163  			Expect(err).To(HaveOccurred())
   164  			Expect(err.Error()).To(Equal("failed to reconcile managers: failed Deployment reconciliation: failed to reconcile deployment"))
   165  		})
   166  
   167  		It("returns an error if role manager fails to reconcile", func() {
   168  			roleMgr.ReconcileReturns(errors.New("failed to reconcile role"))
   169  			_, err := console.Reconcile(instance, update)
   170  			Expect(err).To(HaveOccurred())
   171  			Expect(err.Error()).To(Equal("failed to reconcile managers: failed RBAC reconciliation: failed to reconcile role"))
   172  		})
   173  
   174  		It("returns an error if role binding manager fails to reconcile", func() {
   175  			roleBindingMgr.ReconcileReturns(errors.New("failed to reconcile role binding"))
   176  			_, err := console.Reconcile(instance, update)
   177  			Expect(err).To(HaveOccurred())
   178  			Expect(err.Error()).To(Equal("failed to reconcile managers: failed RBAC reconciliation: failed to reconcile role binding"))
   179  		})
   180  
   181  		It("returns an error if service account binding manager fails to reconcile", func() {
   182  			serviceAccountMgr.ReconcileReturns(errors.New("failed to reconcile service account"))
   183  			_, err := console.Reconcile(instance, update)
   184  			Expect(err).To(HaveOccurred())
   185  			Expect(err.Error()).To(Equal("failed to reconcile managers: failed RBAC reconciliation: failed to reconcile service account"))
   186  		})
   187  
   188  		It("returns an error if config map manager fails to reconcile", func() {
   189  			configMapMgr.ReconcileReturns(errors.New("failed to reconcile config map"))
   190  			_, err := console.Reconcile(instance, update)
   191  			Expect(err).To(HaveOccurred())
   192  			Expect(err.Error()).To(Equal("failed to reconcile managers: failed ConfigMap reconciliation: failed to reconcile config map"))
   193  		})
   194  
   195  		It("returns an error if config map manager fails to reconcile", func() {
   196  			consoleConfigMapMgr.ReconcileReturns(errors.New("failed to reconcile config map"))
   197  			_, err := console.Reconcile(instance, update)
   198  			Expect(err).To(HaveOccurred())
   199  			Expect(err.Error()).To(Equal("failed to reconcile managers: failed Console ConfigMap reconciliation: failed to reconcile config map"))
   200  		})
   201  
   202  		It("returns an error if config map manager fails to reconcile", func() {
   203  			deployerConfigMapMgr.ReconcileReturns(errors.New("failed to reconcile config map"))
   204  			_, err := console.Reconcile(instance, update)
   205  			Expect(err).To(HaveOccurred())
   206  			Expect(err.Error()).To(Equal("failed to reconcile managers: failed Deployer ConfigMap reconciliation: failed to reconcile config map"))
   207  		})
   208  
   209  		It("returns an error if ingress manager fails to reconcile", func() {
   210  			ingressMgr.ReconcileReturns(errors.New("failed to reconcile ingress"))
   211  			_, err := console.Reconcile(instance, update)
   212  			Expect(err).To(HaveOccurred())
   213  			Expect(err.Error()).To(Equal("failed to reconcile managers: failed Ingress reconciliation: failed to reconcile ingress"))
   214  		})
   215  
   216  		It("restarts pods by deleting deployment", func() {
   217  			update.RestartNeededReturns(true)
   218  			_, err := console.Reconcile(instance, update)
   219  			Expect(err).NotTo(HaveOccurred())
   220  			Expect(mockKubeClient.PatchCallCount()).To(Equal(1))
   221  		})
   222  
   223  		It("does not return an error on a successful reconcile", func() {
   224  			_, err := console.Reconcile(instance, update)
   225  			Expect(err).NotTo(HaveOccurred())
   226  		})
   227  	})
   228  
   229  	Context("ValidateSpec", func() {
   230  		It("returns no error if valid spec is passed", func() {
   231  			err := console.ValidateSpec(instance)
   232  			Expect(err).NotTo(HaveOccurred())
   233  		})
   234  
   235  		It("returns error if license is not accepted", func() {
   236  			instance.Spec.License.Accept = false
   237  			err := console.ValidateSpec(instance)
   238  			Expect(err).To(HaveOccurred())
   239  			Expect(err.Error()).To(Equal("user must accept license before continuing"))
   240  		})
   241  
   242  		It("returns error if serviceaccountname is not passed", func() {
   243  			instance.Spec.ServiceAccountName = ""
   244  			err := console.ValidateSpec(instance)
   245  			Expect(err).To(HaveOccurred())
   246  			Expect(err.Error()).To(Equal("Service account name not provided"))
   247  		})
   248  
   249  		It("returns error if email is not passed", func() {
   250  			instance.Spec.Email = ""
   251  			err := console.ValidateSpec(instance)
   252  			Expect(err).To(HaveOccurred())
   253  			Expect(err.Error()).To(Equal("email not provided"))
   254  		})
   255  
   256  		It("returns error if password & passwordsecret are not passed", func() {
   257  			instance.Spec.PasswordSecretName = ""
   258  			instance.Spec.Password = ""
   259  			err := console.ValidateSpec(instance)
   260  			Expect(err).To(HaveOccurred())
   261  			Expect(err.Error()).To(Equal("password and passwordSecretName both not provided, at least one expected"))
   262  		})
   263  
   264  		It("should not return error if password & passwordsecret are not passed when authscheme is ibmid", func() {
   265  			instance.Spec.AuthScheme = "ibmid"
   266  			instance.Spec.PasswordSecretName = ""
   267  			instance.Spec.Password = ""
   268  			err := console.ValidateSpec(instance)
   269  			Expect(err).ToNot(HaveOccurred())
   270  		})
   271  
   272  		It("returns error if imagepullsecret is not passed", func() {
   273  			instance.Spec.ImagePullSecrets = nil
   274  			err := console.ValidateSpec(instance)
   275  			Expect(err).To(HaveOccurred())
   276  			Expect(err.Error()).To(Equal("imagepullsecrets required"))
   277  		})
   278  
   279  		It("returns error if ingress info are not passed", func() {
   280  			instance.Spec.NetworkInfo = nil
   281  			err := console.ValidateSpec(instance)
   282  			Expect(err).To(HaveOccurred())
   283  			Expect(err.Error()).To(Equal("network information not provided"))
   284  		})
   285  	})
   286  })