github.com/IBM-Blockchain/fabric-operator@v1.0.4/controllers/ibporderer/predicate.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 ibporderer
    20  
    21  import (
    22  	"reflect"
    23  
    24  	current "github.com/IBM-Blockchain/fabric-operator/api/v1beta1"
    25  	commoninit "github.com/IBM-Blockchain/fabric-operator/pkg/initializer/common"
    26  	"github.com/IBM-Blockchain/fabric-operator/version"
    27  )
    28  
    29  type Update struct {
    30  	specUpdated           bool
    31  	statusUpdated         bool
    32  	overridesUpdated      bool
    33  	tlsCertUpdated        bool
    34  	ecertUpdated          bool
    35  	ordererTagUpdated     bool
    36  	restartNeeded         bool
    37  	ecertReenrollNeeded   bool
    38  	tlscertReenrollNeeded bool
    39  	ecertNewKeyReenroll   bool
    40  	tlscertNewKeyReenroll bool
    41  	deploymentUpdated     bool
    42  	mspUpdated            bool
    43  	ecertEnroll           bool
    44  	tlscertEnroll         bool
    45  	tlsCertCreated        bool
    46  	ecertCreated          bool
    47  	migrateToV2           bool
    48  	migrateToV24          bool
    49  	nodeOUUpdated         bool
    50  	imagesUpdated         bool
    51  	fabricVersionUpdated  bool
    52  	// update GetUpdateStackWithTrues when new fields are added
    53  }
    54  
    55  func (u *Update) Detected() bool {
    56  	return u.specUpdated ||
    57  		u.statusUpdated ||
    58  		u.overridesUpdated ||
    59  		u.tlsCertUpdated ||
    60  		u.ecertUpdated ||
    61  		u.ordererTagUpdated ||
    62  		u.restartNeeded ||
    63  		u.ecertReenrollNeeded ||
    64  		u.tlscertReenrollNeeded ||
    65  		u.ecertNewKeyReenroll ||
    66  		u.tlscertNewKeyReenroll ||
    67  		u.deploymentUpdated ||
    68  		u.mspUpdated ||
    69  		u.ecertEnroll ||
    70  		u.migrateToV2 ||
    71  		u.migrateToV24 ||
    72  		u.nodeOUUpdated ||
    73  		u.imagesUpdated ||
    74  		u.fabricVersionUpdated
    75  }
    76  
    77  func (u *Update) SpecUpdated() bool {
    78  	return u.specUpdated
    79  }
    80  
    81  func (u *Update) StatusUpdated() bool {
    82  	return u.statusUpdated
    83  }
    84  
    85  func (u *Update) ConfigOverridesUpdated() bool {
    86  	return u.overridesUpdated
    87  }
    88  
    89  func (u *Update) TLSCertUpdated() bool {
    90  	return u.tlsCertUpdated
    91  }
    92  
    93  func (u *Update) EcertUpdated() bool {
    94  	return u.ecertUpdated
    95  }
    96  
    97  func (u *Update) OrdererTagUpdated() bool {
    98  	return u.ordererTagUpdated
    99  }
   100  
   101  func (u *Update) CertificateUpdated() bool {
   102  	return u.tlsCertUpdated || u.ecertUpdated
   103  }
   104  
   105  func (u *Update) GetUpdatedCertType() commoninit.SecretType {
   106  	if u.tlsCertUpdated {
   107  		return commoninit.TLS
   108  	} else if u.ecertUpdated {
   109  		return commoninit.ECERT
   110  	}
   111  	return ""
   112  }
   113  
   114  func (u *Update) RestartNeeded() bool {
   115  	return u.restartNeeded
   116  }
   117  
   118  func (u *Update) EcertReenrollNeeded() bool {
   119  	return u.ecertReenrollNeeded
   120  }
   121  
   122  func (u *Update) TLScertReenrollNeeded() bool {
   123  	return u.tlscertReenrollNeeded
   124  }
   125  
   126  func (u *Update) EcertNewKeyReenroll() bool {
   127  	return u.ecertNewKeyReenroll
   128  }
   129  
   130  func (u *Update) TLScertNewKeyReenroll() bool {
   131  	return u.tlscertNewKeyReenroll
   132  }
   133  
   134  func (u *Update) EcertEnroll() bool {
   135  	return u.ecertEnroll
   136  }
   137  
   138  func (u *Update) TLScertEnroll() bool {
   139  	return u.tlscertEnroll
   140  }
   141  
   142  func (u *Update) DeploymentUpdated() bool {
   143  	return u.deploymentUpdated
   144  }
   145  
   146  func (u *Update) MSPUpdated() bool {
   147  	return u.mspUpdated
   148  }
   149  
   150  func (u *Update) TLSCertCreated() bool {
   151  	return u.tlsCertCreated
   152  }
   153  
   154  func (u *Update) EcertCreated() bool {
   155  	return u.ecertCreated
   156  }
   157  
   158  func (u *Update) CertificateCreated() bool {
   159  	return u.tlsCertCreated || u.ecertCreated
   160  }
   161  
   162  func (u *Update) GetCreatedCertType() commoninit.SecretType {
   163  	if u.tlsCertCreated {
   164  		return commoninit.TLS
   165  	} else if u.ecertCreated {
   166  		return commoninit.ECERT
   167  	}
   168  	return ""
   169  }
   170  
   171  func (u *Update) CryptoBackupNeeded() bool {
   172  	return u.ecertEnroll ||
   173  		u.tlscertEnroll ||
   174  		u.ecertReenrollNeeded ||
   175  		u.ecertNewKeyReenroll ||
   176  		u.tlscertReenrollNeeded ||
   177  		u.tlscertNewKeyReenroll ||
   178  		u.mspUpdated
   179  }
   180  
   181  func (u *Update) MigrateToV2() bool {
   182  	return u.migrateToV2
   183  }
   184  
   185  func (u *Update) MigrateToV24() bool {
   186  	return u.migrateToV24
   187  }
   188  
   189  func (u *Update) NodeOUUpdated() bool {
   190  	return u.nodeOUUpdated
   191  }
   192  
   193  func (u *Update) GetUpdateStackWithTrues() string {
   194  	stack := ""
   195  
   196  	if u.specUpdated {
   197  		stack += "specUpdated "
   198  	}
   199  	if u.statusUpdated {
   200  		stack += "statusUpdated "
   201  	}
   202  	if u.overridesUpdated {
   203  		stack += "overridesUpdated "
   204  	}
   205  	if u.tlsCertUpdated {
   206  		stack += "tlsCertUpdated "
   207  	}
   208  	if u.ecertUpdated {
   209  		stack += "ecertUpdated "
   210  	}
   211  	if u.ordererTagUpdated {
   212  		stack += "ordererTagUpdated "
   213  	}
   214  	if u.restartNeeded {
   215  		stack += "restartNeeded "
   216  	}
   217  	if u.ecertReenrollNeeded {
   218  		stack += "ecertReenrollNeeded "
   219  	}
   220  	if u.tlscertReenrollNeeded {
   221  		stack += "tlscertReenrollNeeded "
   222  	}
   223  	if u.ecertNewKeyReenroll {
   224  		stack += "ecertNewKeyReenroll "
   225  	}
   226  	if u.tlscertNewKeyReenroll {
   227  		stack += "tlscertNewKeyReenroll "
   228  	}
   229  
   230  	if u.deploymentUpdated {
   231  		stack += "deploymentUpdated "
   232  	}
   233  	if u.mspUpdated {
   234  		stack += "mspUpdated "
   235  	}
   236  	if u.ecertEnroll {
   237  		stack += "ecertEnroll "
   238  	}
   239  	if u.tlscertEnroll {
   240  		stack += "tlscertEnroll "
   241  	}
   242  	if u.tlsCertCreated {
   243  		stack += "tlsCertCreated "
   244  	}
   245  	if u.ecertCreated {
   246  		stack += "ecertCreated "
   247  	}
   248  	if u.migrateToV2 {
   249  		stack += "migrateToV2 "
   250  	}
   251  	if u.migrateToV24 {
   252  		stack += "migrateToV24 "
   253  	}
   254  	if u.nodeOUUpdated {
   255  		stack += "nodeOUUpdated "
   256  	}
   257  	if u.imagesUpdated {
   258  		stack += "imagesUpdated "
   259  	}
   260  	if u.fabricVersionUpdated {
   261  		stack += "fabricVersionUpdated "
   262  	}
   263  
   264  	if len(stack) == 0 {
   265  		stack = "emptystack "
   266  	}
   267  
   268  	return stack
   269  }
   270  
   271  // ImagesUpdated returns true if images updated
   272  func (u *Update) ImagesUpdated() bool {
   273  	return u.imagesUpdated
   274  }
   275  
   276  // FabricVersionUpdated returns true if fabric version updated
   277  func (u *Update) FabricVersionUpdated() bool {
   278  	return u.fabricVersionUpdated
   279  }
   280  
   281  func imagesUpdated(old, new *current.IBPOrderer) bool {
   282  	if new.Spec.Images != nil {
   283  		if old.Spec.Images == nil {
   284  			return true
   285  		}
   286  
   287  		if old.Spec.Images != nil {
   288  			return !reflect.DeepEqual(old.Spec.Images, new.Spec.Images)
   289  		}
   290  	}
   291  
   292  	return false
   293  }
   294  
   295  func fabricVersionUpdated(old, new *current.IBPOrderer) bool {
   296  	return old.Spec.FabricVersion != new.Spec.FabricVersion
   297  }
   298  
   299  func fabricVersionUpdatedTo149plusOr221plus(old, new *current.IBPOrderer) bool {
   300  	newVersion := version.String(new.Spec.FabricVersion)
   301  	newMajorVersion := version.GetMajorReleaseVersion(new.Spec.FabricVersion)
   302  	oldVersion := version.String(old.Spec.FabricVersion)
   303  	oldMajorVersion := version.GetMajorReleaseVersion(old.Spec.FabricVersion)
   304  
   305  	if old.Spec.FabricVersion != new.Spec.FabricVersion {
   306  		if oldVersion == version.Unsupported || (oldMajorVersion == version.V1 && oldVersion.LessThan("1.4.9")) {
   307  			if newMajorVersion == version.V1 {
   308  				if newVersion.Equal("1.4.9") || newVersion.GreaterThan("1.4.9") {
   309  					return true
   310  				}
   311  			} else if newMajorVersion == version.V2 {
   312  				if newVersion.Equal("2.2.1") || newVersion.GreaterThan("2.2.1") {
   313  					return true
   314  				}
   315  			}
   316  		} else if oldMajorVersion == version.V2 && oldVersion.LessThan("2.2.1") {
   317  			if newVersion.Equal("2.2.1") || newVersion.GreaterThan("2.2.1") {
   318  				return true
   319  			}
   320  		}
   321  	}
   322  
   323  	return false
   324  }