Skip to content

Commit

Permalink
Maintain kubectl patch version in code not spec
Browse files Browse the repository at this point in the history
  • Loading branch information
emosbaugh committed Oct 18, 2021
1 parent e3e8c17 commit 4fcbc93
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 40 deletions.
16 changes: 8 additions & 8 deletions deploy/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ ENV KUBECTL_1_14_SHA256SUM=7729c6612bec76badc7926a79b26e0d9b06cc312af46dbb80ea74
RUN curl -fsSLO "${KUBECTL_1_14_URL}" \
&& echo "${KUBECTL_1_14_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_14_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.14"

# Install Kubectl 1.16
ENV KUBECTL_1_16_VERSION=v1.16.15
Expand All @@ -26,7 +26,7 @@ ENV KUBECTL_1_16_SHA256SUM=e8913069293156ddf55f243814a22d2384fc18b165efb6200606f
RUN curl -fsSLO "${KUBECTL_1_16_URL}" \
&& echo "${KUBECTL_1_16_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_16_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.16"

# Install Kubectl 1.17
ENV KUBECTL_1_17_VERSION=v1.17.17
Expand All @@ -35,7 +35,7 @@ ENV KUBECTL_1_17_SHA256SUM=8329fac94c66bf7a475b630972a8c0b036bab1f28a5584115e8dd
RUN curl -fsSLO "${KUBECTL_1_17_URL}" \
&& echo "${KUBECTL_1_17_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_17_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.17"

# Install Kubectl 1.18
ENV KUBECTL_1_18_VERSION=v1.18.20
Expand All @@ -44,7 +44,7 @@ ENV KUBECTL_1_18_SHA256SUM=66a9bb8e9843050340844ca6e72e67632b75b9ebb651559c49db2
RUN curl -fsSLO "${KUBECTL_1_18_URL}" \
&& echo "${KUBECTL_1_18_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_18_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.18"

# Install Kubectl 1.19
ENV KUBECTL_1_19_VERSION=v1.19.15
Expand All @@ -53,7 +53,7 @@ ENV KUBECTL_1_19_SHA256SUM=6f2ac7db8cfd59f660abc9891c1bb7da2dabd1cf5e114d836f2ff
RUN curl -fsSLO "${KUBECTL_1_19_URL}" \
&& echo "${KUBECTL_1_19_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_19_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.19"

# Install Kubectl 1.20
ENV KUBECTL_1_20_VERSION=v1.20.11
Expand All @@ -62,7 +62,7 @@ ENV KUBECTL_1_20_SHA256SUM=3a2bf981939df89f807858a481f6f5f2e33a7b9708bd029c8bece
RUN curl -fsSLO "${KUBECTL_1_20_URL}" \
&& echo "${KUBECTL_1_20_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_20_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.20"

# Install Kubectl 1.21
ENV KUBECTL_1_21_VERSION=v1.21.5
Expand All @@ -71,8 +71,8 @@ ENV KUBECTL_1_21_SHA256SUM=060ede75550c63bdc84e14fcc4c8ab3017f7ffc032fc4cac3bf20
RUN curl -fsSLO "${KUBECTL_1_21_URL}" \
&& echo "${KUBECTL_1_21_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_21_VERSION}" \
&& ln -s "/usr/local/bin/kubectl-${KUBECTL_1_21_VERSION}" /usr/local/bin/kubectl
&& mv kubectl "/usr/local/bin/kubectl-v1.21" \
&& ln -s "/usr/local/bin/kubectl-v1.21" /usr/local/bin/kubectl

# Install helm v3.4.2
RUN curl -L "https://get.helm.sh/helm-v3.4.2-linux-amd64.tar.gz" -o /tmp/helm.tar.gz && \
Expand Down
16 changes: 8 additions & 8 deletions hack/dev/Dockerfile.skaffold
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ ENV KUBECTL_1_14_SHA256SUM=7729c6612bec76badc7926a79b26e0d9b06cc312af46dbb80ea74
RUN curl -fsSLO "${KUBECTL_1_14_URL}" \
&& echo "${KUBECTL_1_14_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_14_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.14"

# Install Kubectl 1.16
ENV KUBECTL_1_16_VERSION=v1.16.15
Expand All @@ -42,7 +42,7 @@ ENV KUBECTL_1_16_SHA256SUM=e8913069293156ddf55f243814a22d2384fc18b165efb6200606f
RUN curl -fsSLO "${KUBECTL_1_16_URL}" \
&& echo "${KUBECTL_1_16_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_16_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.16"

# Install Kubectl 1.17
ENV KUBECTL_1_17_VERSION=v1.17.17
Expand All @@ -51,7 +51,7 @@ ENV KUBECTL_1_17_SHA256SUM=8329fac94c66bf7a475b630972a8c0b036bab1f28a5584115e8dd
RUN curl -fsSLO "${KUBECTL_1_17_URL}" \
&& echo "${KUBECTL_1_17_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_17_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.17"

# Install Kubectl 1.18
ENV KUBECTL_1_18_VERSION=v1.18.20
Expand All @@ -60,7 +60,7 @@ ENV KUBECTL_1_18_SHA256SUM=66a9bb8e9843050340844ca6e72e67632b75b9ebb651559c49db2
RUN curl -fsSLO "${KUBECTL_1_18_URL}" \
&& echo "${KUBECTL_1_18_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_18_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.18"

# Install Kubectl 1.19
ENV KUBECTL_1_19_VERSION=v1.19.15
Expand All @@ -69,7 +69,7 @@ ENV KUBECTL_1_19_SHA256SUM=6f2ac7db8cfd59f660abc9891c1bb7da2dabd1cf5e114d836f2ff
RUN curl -fsSLO "${KUBECTL_1_19_URL}" \
&& echo "${KUBECTL_1_19_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_19_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.19"

# Install Kubectl 1.20
ENV KUBECTL_1_20_VERSION=v1.20.11
Expand All @@ -78,7 +78,7 @@ ENV KUBECTL_1_20_SHA256SUM=3a2bf981939df89f807858a481f6f5f2e33a7b9708bd029c8bece
RUN curl -fsSLO "${KUBECTL_1_20_URL}" \
&& echo "${KUBECTL_1_20_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_20_VERSION}"
&& mv kubectl "/usr/local/bin/kubectl-v1.20"

# Install Kubectl 1.21
ENV KUBECTL_1_21_VERSION=v1.21.5
Expand All @@ -87,8 +87,8 @@ ENV KUBECTL_1_21_SHA256SUM=060ede75550c63bdc84e14fcc4c8ab3017f7ffc032fc4cac3bf20
RUN curl -fsSLO "${KUBECTL_1_21_URL}" \
&& echo "${KUBECTL_1_21_SHA256SUM} kubectl" | sha256sum -c - \
&& chmod +x kubectl \
&& mv kubectl "/usr/local/bin/kubectl-${KUBECTL_1_21_VERSION}" \
&& ln -s "/usr/local/bin/kubectl-${KUBECTL_1_21_VERSION}" /usr/local/bin/kubectl
&& mv kubectl "/usr/local/bin/kubectl-v1.21" \
&& ln -s "/usr/local/bin/kubectl-v1.21" /usr/local/bin/kubectl

# Install kustomize 3
RUN curl -L "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv3.5.4/kustomize_v3.5.4_linux_amd64.tar.gz" > /tmp/kustomize.tar.gz && \
Expand Down
55 changes: 37 additions & 18 deletions pkg/util/kubectl_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,28 +11,47 @@ import (
"github.com/replicatedhq/kots/pkg/persistence"
)

var knownKubectlVersions = []semver.Version{
semver.MustParse("1.21.2"),
semver.MustParse("1.20.4"),
semver.MustParse("1.19.3"),
semver.MustParse("1.18.10"),
semver.MustParse("1.17.13"),
semver.MustParse("1.16.3"),
semver.MustParse("1.14.9"),
var knownKubectlVersions = []kubectlFuzzyVersion{
{semver: semver.MustParse("1.21.1")},
{semver: semver.MustParse("1.20.1")},
{semver: semver.MustParse("1.19.1")},
{semver: semver.MustParse("1.18.1")},
{semver: semver.MustParse("1.17.1")},
{semver: semver.MustParse("1.16.1")},
{semver: semver.MustParse("1.14.1")},
}

// finds a known version that matches the provided range
func matchKnownVersion(userString string) string {
parsedRange, err := semver.ParseRange(userString)
type kubectlFuzzyVersion struct {
semver semver.Version
}

func (v kubectlFuzzyVersion) String() string {
return fmt.Sprintf("v%d.%d", v.semver.Major, v.semver.Minor)
}

func (v kubectlFuzzyVersion) Match(userString string) bool {
if userString == "" || userString == "latest" {
return false
}

if exactVer, err := semver.Parse(userString); err == nil {
return exactVer.Major == v.semver.Major && exactVer.Minor == v.semver.Minor
}

rangeVer, err := semver.ParseRange(userString)
if err != nil {
log.Printf("unable to parse range %s: %s", userString, err)
return ""
return false
}

return rangeVer(v.semver)
}

// finds a known version that matches the provided range
func matchKnownVersion(userString string) string {
// loop through list of known versions and check for matches
for _, knownVersion := range knownKubectlVersions {
if parsedRange(knownVersion) {
return "v" + knownVersion.String()
if knownVersion.Match(userString) {
return knownVersion.String()
}
}

Expand All @@ -52,7 +71,9 @@ func FindKubectlVersion(userString string) (string, error) {
}

// then maybe override it with custom kubectl version
if userString != "" && userString != "latest" {
if userString == "latest" {
log.Printf("using latest kubectl version")
} else if userString != "" {
// matchKnownVersion only returns a string on success
actualVersion := matchKnownVersion(userString)
if actualVersion == "" {
Expand All @@ -67,8 +88,6 @@ func FindKubectlVersion(userString string) (string, error) {
log.Printf("using custom kubectl version %s at %s", actualVersion, customKubectl)
kubectl = customKubectl
}
} else if userString == "latest" {
log.Printf("using latest kubectl version")
} else {
log.Printf("no kubectl version set, using default of 'latest'")
}
Expand Down
17 changes: 11 additions & 6 deletions pkg/util/kubectl_version_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,29 +21,34 @@ func Test_matchKnownVersion(t *testing.T) {
want: "",
},
{
name: "1.16.3",
name: "exact",
userString: "1.16.15",
want: "v1.16",
},
{
name: "wrong patch",
userString: "1.16.3",
want: "v1.16.3",
want: "v1.16",
},
{
name: "1.14.x",
userString: "1.14.x",
want: "v1.14.9",
want: "v1.14",
},
{
name: "<1.15.0",
userString: "<1.15.0",
want: "v1.14.9",
want: "v1.14",
},
{
name: ">1.15.0 <1.17.0",
userString: ">1.15.0 <1.17.0",
want: "v1.16.3",
want: "v1.16",
},
{
name: "<1.17.0",
userString: "<1.17.0",
want: "v1.16.3",
want: "v1.16",
},
}
for _, tt := range tests {
Expand Down

0 comments on commit 4fcbc93

Please sign in to comment.