github.com/vmware/govmomi@v0.43.0/vim25/types/esxi_version.go (about) 1 /* 2 Copyright (c) 2024-2024 VMware, Inc. All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package types 18 19 import ( 20 "fmt" 21 "regexp" 22 "strconv" 23 ) 24 25 // ESXiVersion is an ESXi version. 26 type ESXiVersion uint8 27 28 const ( 29 esxiVersionBegin ESXiVersion = iota 30 31 ESXi2000 32 ESXi3000 33 ESXi4000 34 ESXi5000 35 ESXi5100 36 ESXi5500 37 ESXi6000 38 ESXi6500 39 ESXi6700 40 ESXi6720 41 ESXi7000 42 ESXi7010 43 ESXi7020 44 ESXi8000 45 ESXi8010 46 ESXi8020 47 48 esxiVersionEnd 49 ) 50 51 // HardwareVersion returns the maximum hardware version supported by this 52 // version of ESXi, per https://kb.vmware.com/s/article/1003746. 53 func (ev ESXiVersion) HardwareVersion() HardwareVersion { 54 switch ev { 55 case ESXi2000: 56 return VMX3 57 case ESXi3000: 58 return VMX4 59 case ESXi4000: 60 return VMX7 61 case ESXi5000: 62 return VMX8 63 case ESXi5100: 64 return VMX9 65 case ESXi5500: 66 return VMX10 67 case ESXi6000: 68 return VMX11 69 case ESXi6500: 70 return VMX13 71 case ESXi6700: 72 return VMX14 73 case ESXi6720: 74 return VMX15 75 case ESXi7000: 76 return VMX17 77 case ESXi7010: 78 return VMX18 79 case ESXi7020: 80 return VMX19 81 case ESXi8000, ESXi8010: 82 return VMX20 83 case ESXi8020: 84 return VMX21 85 } 86 return 0 87 } 88 89 // IsHardwareVersionSupported returns true if the provided hardware version is 90 // supported by the given version of ESXi. 91 func (ev ESXiVersion) IsHardwareVersionSupported(hv HardwareVersion) bool { 92 return hv <= ev.HardwareVersion() 93 } 94 95 func (ev ESXiVersion) IsValid() bool { 96 return ev.String() != "" 97 } 98 99 func (ev ESXiVersion) String() string { 100 switch ev { 101 case ESXi2000: 102 return "2" 103 case ESXi3000: 104 return "3" 105 case ESXi4000: 106 return "4" 107 case ESXi5000: 108 return "5.0" 109 case ESXi5100: 110 return "5.1" 111 case ESXi5500: 112 return "5.5" 113 case ESXi6000: 114 return "6.0" 115 case ESXi6500: 116 return "6.5" 117 case ESXi6700: 118 return "6.7" 119 case ESXi6720: 120 return "6.7.2" 121 case ESXi7000: 122 return "7.0" 123 case ESXi7010: 124 return "7.0.1" 125 case ESXi7020: 126 return "7.0.2" 127 case ESXi8000: 128 return "8.0" 129 case ESXi8010: 130 return "8.0.1" 131 case ESXi8020: 132 return "8.0.2" 133 } 134 return "" 135 } 136 137 func (ev ESXiVersion) MarshalText() ([]byte, error) { 138 return []byte(ev.String()), nil 139 } 140 141 func (ev *ESXiVersion) UnmarshalText(text []byte) error { 142 v, err := ParseESXiVersion(string(text)) 143 if err != nil { 144 return err 145 } 146 *ev = v 147 return nil 148 } 149 150 // MustParseESXiVersion parses the provided string into an ESXi version. 151 func MustParseESXiVersion(s string) ESXiVersion { 152 v, err := ParseESXiVersion(s) 153 if err != nil { 154 panic(err) 155 } 156 return v 157 } 158 159 var esxiRe = regexp.MustCompile(`(?i)^v?(\d)(?:\.(\d))?(?:\.(\d))?(?:\s*u(\d))?$`) 160 161 // ParseESXiVersion parses the provided string into an ESXi version. 162 func ParseESXiVersion(s string) (ESXiVersion, error) { 163 if m := esxiRe.FindStringSubmatch(s); len(m) > 0 { 164 var ( 165 major int64 166 minor int64 167 patch int64 168 update int64 169 ) 170 171 major, _ = strconv.ParseInt(m[1], 0, 0) 172 if len(m) > 2 { 173 minor, _ = strconv.ParseInt(m[2], 0, 0) 174 } 175 if len(m) > 3 { 176 patch, _ = strconv.ParseInt(m[3], 0, 0) 177 } 178 if len(m) > 4 { 179 update, _ = strconv.ParseInt(m[4], 0, 0) 180 } 181 182 switch { 183 case major == 2 && minor == 0 && patch == 0 && update == 0: 184 return ESXi2000, nil 185 case major == 3 && minor == 0 && patch == 0 && update == 0: 186 return ESXi3000, nil 187 case major == 4 && minor == 0 && patch == 0 && update == 0: 188 return ESXi4000, nil 189 case major == 5 && minor == 0 && patch == 0 && update == 0: 190 return ESXi5000, nil 191 case major == 5 && minor == 1 && patch == 0 && update == 0: 192 return ESXi5100, nil 193 case major == 5 && minor == 5 && patch == 0 && update == 0: 194 return ESXi5500, nil 195 case major == 6 && minor == 0 && patch == 0 && update == 0: 196 return ESXi6000, nil 197 case major == 6 && minor == 5 && patch == 0 && update == 0: 198 return ESXi6500, nil 199 case major == 6 && minor == 7 && patch == 0 && update == 0: 200 return ESXi6700, nil 201 case major == 6 && minor == 7 && patch == 2 && update == 0, 202 major == 6 && minor == 7 && patch == 0 && update == 2: 203 return ESXi6720, nil 204 case major == 7 && minor == 0 && patch == 0 && update == 0: 205 return ESXi7000, nil 206 case major == 7 && minor == 0 && patch == 1 && update == 0, 207 major == 7 && minor == 0 && patch == 0 && update == 1: 208 return ESXi7010, nil 209 case major == 7 && minor == 0 && patch == 2 && update == 0, 210 major == 7 && minor == 0 && patch == 0 && update == 2: 211 return ESXi7020, nil 212 case major == 8 && minor == 0 && patch == 0 && update == 0: 213 return ESXi8000, nil 214 case major == 8 && minor == 0 && patch == 1 && update == 0, 215 major == 8 && minor == 0 && patch == 0 && update == 1: 216 return ESXi8010, nil 217 case major == 8 && minor == 0 && patch == 2 && update == 0, 218 major == 8 && minor == 0 && patch == 0 && update == 2: 219 return ESXi8020, nil 220 } 221 } 222 223 return 0, fmt.Errorf("invalid version: %q", s) 224 } 225 226 // GetESXiVersions returns a list of ESXi versions. 227 func GetESXiVersions() []ESXiVersion { 228 dst := make([]ESXiVersion, esxiVersionEnd-1) 229 for i := esxiVersionBegin + 1; i < esxiVersionEnd; i++ { 230 dst[i-1] = i 231 } 232 return dst 233 }