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 }