github.com/vmware/govmomi@v0.37.2/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  }