github.com/IBM-Blockchain/fabric-operator@v1.0.4/version/version.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 version
    20  
    21  import (
    22  	"fmt"
    23  	"strconv"
    24  	"strings"
    25  )
    26  
    27  const (
    28  	// DEPRECATED: operator versions for IBP logic
    29  	V210        = "2.1.0"
    30  	V212        = "2.1.2"
    31  	V213        = "2.1.3"
    32  	V250        = "2.5.0"
    33  	V251        = "2.5.1"
    34  	V252        = "2.5.2"
    35  	V253        = "2.5.3"
    36  	IBPOperator = "2.5.3"
    37  
    38  	// IBM Support for Hyperledger Fabric product version
    39  	V100     = "1.0.0"
    40  	Operator = "1.0.0"
    41  )
    42  
    43  type String string
    44  
    45  func (s String) Equal(new string) bool {
    46  	oldVersion := newVersion(string(s))
    47  	newVersion := newVersion(new)
    48  
    49  	return oldVersion.equal(newVersion)
    50  
    51  }
    52  func (s String) EqualWithoutTag(new string) bool {
    53  	oldVersion := newVersion(string(s))
    54  	newVersion := newVersion(new)
    55  
    56  	return oldVersion.equalWithoutTag(newVersion)
    57  
    58  }
    59  
    60  func (s String) GreaterThan(new string) bool {
    61  	oldVersion := newVersion(string(s))
    62  	newVersion := newVersion(new)
    63  
    64  	return oldVersion.greaterThan(newVersion)
    65  }
    66  
    67  func (s String) LessThan(new string) bool {
    68  	oldVersion := newVersion(string(s))
    69  	newVersion := newVersion(new)
    70  
    71  	return oldVersion.lessThan(newVersion)
    72  
    73  }
    74  
    75  type Version struct {
    76  	Major   int `json:"major"`
    77  	Minor   int `json:"minor"`
    78  	Fixpack int `json:"fixpack"`
    79  	Tag     int `json:"tag"`
    80  }
    81  
    82  func GetMajorReleaseVersion(version string) string {
    83  	version = stripVersionPrefix(version)
    84  	v := newVersion(version)
    85  	switch v.Major {
    86  	case 2:
    87  		return V2
    88  	case 1:
    89  		return V1
    90  	default:
    91  		return V1
    92  	}
    93  }
    94  
    95  func stripVersionPrefix(version string) string {
    96  	version = strings.ToLower(version)
    97  	if strings.HasPrefix(version, "v") {
    98  		version = strings.TrimPrefix(version, "v")
    99  	}
   100  	return version
   101  }
   102  
   103  func newVersion(version string) *Version {
   104  	v := stringToIntList(version)
   105  
   106  	switch len(v) {
   107  	case 1:
   108  		return &Version{
   109  			Major: v[0],
   110  		}
   111  	case 2:
   112  		return &Version{
   113  			Major: v[0],
   114  			Minor: v[1],
   115  		}
   116  	case 3:
   117  		return &Version{
   118  			Major:   v[0],
   119  			Minor:   v[1],
   120  			Fixpack: v[2],
   121  		}
   122  	case 4:
   123  		return &Version{
   124  			Major:   v[0],
   125  			Minor:   v[1],
   126  			Fixpack: v[2],
   127  			Tag:     v[3],
   128  		}
   129  	}
   130  
   131  	return &Version{}
   132  }
   133  
   134  func stringToIntList(version string) []int {
   135  	var tag string
   136  
   137  	// If version of format major.minor.fixpack-tag, extract tag first
   138  	if strings.Contains(version, "-") {
   139  		vList := strings.Split(version, "-")
   140  		version = vList[0] // major.minor.fixpack
   141  		tag = vList[1]     // tag
   142  	}
   143  
   144  	strList := strings.Split(version, ".")
   145  	if tag != "" {
   146  		strList = append(strList, tag)
   147  	}
   148  
   149  	intList := []int{}
   150  	for _, str := range strList {
   151  		num, err := strconv.Atoi(str)
   152  		if err != nil {
   153  			// No-op: strconv.Atoi() returns 0 with the error
   154  		}
   155  		intList = append(intList, num)
   156  	}
   157  
   158  	return intList
   159  }
   160  
   161  func (v *Version) equal(newVersion *Version) bool {
   162  	if newVersion == nil {
   163  		return false
   164  	}
   165  
   166  	if v.Major == newVersion.Major {
   167  		if v.Minor == newVersion.Minor {
   168  			if v.Fixpack == newVersion.Fixpack {
   169  				if v.Tag == newVersion.Tag {
   170  					return true
   171  				}
   172  			}
   173  		}
   174  	}
   175  
   176  	return false
   177  }
   178  
   179  func (v *Version) equalWithoutTag(newVersion *Version) bool {
   180  	if newVersion == nil {
   181  		return false
   182  	}
   183  
   184  	if v.Major == newVersion.Major {
   185  		if v.Minor == newVersion.Minor {
   186  			if v.Fixpack == newVersion.Fixpack {
   187  				return true
   188  			}
   189  		}
   190  	}
   191  
   192  	return false
   193  }
   194  
   195  func (v *Version) lessThan(newVersion *Version) bool {
   196  	if v.Major < newVersion.Major {
   197  		return true
   198  	} else if v.Major > newVersion.Major {
   199  		return false
   200  	}
   201  
   202  	if v.Minor < newVersion.Minor {
   203  		return true
   204  	} else if v.Minor > newVersion.Minor {
   205  		return false
   206  	}
   207  
   208  	if v.Fixpack < newVersion.Fixpack {
   209  		return true
   210  	} else if v.Fixpack > newVersion.Fixpack {
   211  		return false
   212  	}
   213  
   214  	if v.Tag < newVersion.Tag {
   215  		return true
   216  	}
   217  
   218  	return false
   219  }
   220  
   221  func (v *Version) greaterThan(newVersion *Version) bool {
   222  	if v.Major > newVersion.Major {
   223  		return true
   224  	} else if v.Major < newVersion.Major {
   225  		return false
   226  	}
   227  
   228  	if v.Minor > newVersion.Minor {
   229  		return true
   230  	} else if v.Minor < newVersion.Minor {
   231  		return false
   232  	}
   233  
   234  	if v.Fixpack > newVersion.Fixpack {
   235  		return true
   236  	} else if v.Fixpack < newVersion.Fixpack {
   237  		return false
   238  	}
   239  
   240  	if v.Tag > newVersion.Tag {
   241  		return true
   242  	}
   243  
   244  	return false
   245  }
   246  
   247  func (v *Version) String() string {
   248  	if v != nil {
   249  		return fmt.Sprintf("%d.%d.%d-%d", v.Major, v.Minor, v.Fixpack, v.Tag)
   250  	}
   251  	return "nil"
   252  }