Skip to content

Commit

Permalink
cmd: new --kubernetes-version flag
Browse files Browse the repository at this point in the history
To be used in scores where the version of Kubernetes changes the recommendations, such as API deprecation warnings.
  • Loading branch information
zegl committed Aug 10, 2020
1 parent 73e27b0 commit b621032
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 1 deletion.
8 changes: 8 additions & 0 deletions cmd/kube-score/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"encoding/csv"
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
Expand Down Expand Up @@ -102,6 +103,7 @@ func scoreFiles(binName string, args []string) error {
optionalTests := fs.StringSlice("enable-optional-test", []string{}, "Enable an optional test, can be set multiple times")
ignoreTests := fs.StringSlice("ignore-test", []string{}, "Disable a test, can be set multiple times")
disableIgnoreChecksAnnotation := fs.Bool("disable-ignore-checks-annotations", false, "Set to true to disable the effect of the 'kube-score/ignore' annotations")
kubernetesVersion := fs.String("kubernetes-version", "v1.18", "Setting the kubernetes-version will affect the checks ran against the manifests. Set this to the version of Kubernetes that you're using in production for the best results.")
setDefault(fs, binName, "score", false)

err := fs.Parse(args)
Expand Down Expand Up @@ -149,6 +151,11 @@ Use "-" as filename to read from STDIN.`, execName(binName))
ignoredTests := listToStructMap(ignoreTests)
enabledOptionalTests := listToStructMap(optionalTests)

kubeVer, err := config.ParseSemver(*kubernetesVersion)
if err != nil {
return errors.New("Invalid --kubernetes-version. Use on format \"vN.NN\"")
}

cnf := config.Configuration{
AllFiles: allFilePointers,
VerboseOutput: *verboseOutput,
Expand All @@ -157,6 +164,7 @@ Use "-" as filename to read from STDIN.`, execName(binName))
IgnoredTests: ignoredTests,
EnabledOptionalTests: enabledOptionalTests,
UseIgnoreChecksAnnotation: !*disableIgnoreChecksAnnotation,
KubernetesVersion: kubeVer,
}

parsedFiles, err := parser.ParseFiles(cnf)
Expand Down
46 changes: 45 additions & 1 deletion config/config.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package config

import "io"
import (
"errors"
"io"
"strconv"
"strings"
)

type Configuration struct {
AllFiles []io.Reader
Expand All @@ -10,4 +15,43 @@ type Configuration struct {
IgnoredTests map[string]struct{}
EnabledOptionalTests map[string]struct{}
UseIgnoreChecksAnnotation bool
KubernetesVersion Semver
}

type Semver struct {
Major int
Minor int
}

var errInvalidSemver = errors.New("invalid semver")

func ParseSemver(s string) (Semver, error) {
if len(s) == 0 {
return Semver{}, errInvalidSemver
}
start := 0
if s[0] == 'v' {
start = 1
}

// Separate by .
parts := strings.Split(s[start:], ".")
if len(parts) != 2 {
return Semver{}, errInvalidSemver
}

major, err := strconv.Atoi(parts[0])
if err != nil {
return Semver{}, errInvalidSemver
}

minor, err := strconv.Atoi(parts[1])
if err != nil {
return Semver{}, errInvalidSemver
}

return Semver{
Major: major,
Minor: minor,
}, nil
}
32 changes: 32 additions & 0 deletions config/semver_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package config

import (
"github.com/stretchr/testify/assert"
"testing"
)

func TestSemver(t *testing.T) {
tc := []struct {
input string
expected Semver
expectedErr error
}{
{"v1.0", Semver{1, 0}, nil},
{"v1.999", Semver{1, 999}, nil},
{"1.0", Semver{1, 0}, nil},
{"1.999", Semver{1, 999}, nil},

{"foo", Semver{}, errInvalidSemver},
{"v1.2.3", Semver{}, errInvalidSemver},
{"v1.foo", Semver{}, errInvalidSemver},
{"x1.0", Semver{}, errInvalidSemver},
{"v0x00.123", Semver{}, errInvalidSemver},
{"v1b.5nn3", Semver{}, errInvalidSemver},
}

for d, tc := range tc {
s, e := ParseSemver(tc.input)
assert.Equal(t, tc.expected, s, "Case: %d", d)
assert.Equal(t, tc.expectedErr, e, "Case: %d", d)
}
}

0 comments on commit b621032

Please sign in to comment.