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 }