github.com/jlmeeker/kismatic@v1.10.1-0.20180612190640-57f9005a1f1a/pkg/install/version.go (about)

     1  package install
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"net/http"
     7  	"regexp"
     8  	"strings"
     9  	"time"
    10  
    11  	"github.com/blang/semver"
    12  )
    13  
    14  var (
    15  	httpTimeout                  = 5 * time.Second
    16  	kubeReleaseRegex             = regexp.MustCompile(`^v1\.10\.(0|[1-9][0-9]*)$`)
    17  	kubernetesReleaseURL         = "https://storage.googleapis.com/kubernetes-release/release/stable-1.10.txt"
    18  	kubernetesVersionString      = "v1.10.3"
    19  	kubernetesMinorVersionString = "v1.10.x"
    20  	kubernetesVersion            = semver.Version{Major: 1, Minor: 10, Patch: 3} // build the struct directly to not get an error
    21  )
    22  
    23  func parseVersion(versionString string) (semver.Version, error) {
    24  	// Support a 'v' prefix
    25  	verString := versionString
    26  	if versionString[0] == 'v' {
    27  		verString = versionString[1:len(versionString)]
    28  	}
    29  	v, err := semver.Make(verString)
    30  	if err != nil {
    31  		return semver.Version{}, fmt.Errorf("Unable to parse version %q: %v", verString, err)
    32  	}
    33  	return v, nil
    34  }
    35  
    36  // kubernetesStableVersion fetches the latest stable version
    37  // if an error occurs it will return the tested version
    38  func kubernetesLatestStableVersion() (semver.Version, string, error) {
    39  	timeout := time.Duration(httpTimeout)
    40  	client := http.Client{
    41  		Timeout: timeout,
    42  	}
    43  	resp, err := client.Get(kubernetesReleaseURL)
    44  	if err != nil {
    45  		return kubernetesVersion, kubernetesVersionString, fmt.Errorf("Error getting latest version from %v", err)
    46  	}
    47  	defer resp.Body.Close()
    48  	if resp.StatusCode != http.StatusOK {
    49  		return kubernetesVersion, kubernetesVersionString, fmt.Errorf("Bad status code getting latest version")
    50  	}
    51  	body, err := ioutil.ReadAll(resp.Body)
    52  	if err != nil {
    53  		return kubernetesVersion, kubernetesVersionString, fmt.Errorf("Error reading response %v", err)
    54  	}
    55  	latest := strings.Trim(string(body), " \t\n")
    56  	if !kubeReleaseRegex.MatchString(latest) {
    57  		return kubernetesVersion, kubernetesVersionString, fmt.Errorf("Invalid version format %q", latest)
    58  	}
    59  	parsedLatest, err := parseVersion(latest)
    60  	if err != nil {
    61  		return kubernetesVersion, kubernetesVersionString, fmt.Errorf("Could not parse version string %q", latest)
    62  	}
    63  	return parsedLatest, latest, nil
    64  }
    65  
    66  // validates that the version is the expected Minor version
    67  func kubernetesVersionValid(version string) bool {
    68  	return kubeReleaseRegex.MatchString(version)
    69  }
    70  
    71  // VersionOverrides returns a map of all image names and their versions that can be modified by the user
    72  func VersionOverrides() map[string]string {
    73  	versions := make(map[string]string, 0)
    74  	versions["kube_proxy"] = kubernetesVersionString
    75  	versions["kube_controller_manager"] = kubernetesVersionString
    76  	versions["kube_scheduler"] = kubernetesVersionString
    77  	versions["kube_apiserver"] = kubernetesVersionString
    78  
    79  	return versions
    80  }