mirror of https://github.com/kubernetes/kops.git
Merge pull request #539 from justinsb/prevent_classic_with_14
Prevent KubernetesVersion 1.4 with classic networking
This commit is contained in:
commit
ef5c183928
|
@ -2,6 +2,7 @@ package api
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/blang/semver"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kubernetes/pkg/util/validation"
|
||||
"k8s.io/kubernetes/pkg/util/validation/field"
|
||||
|
@ -11,6 +12,8 @@ import (
|
|||
)
|
||||
|
||||
func (c *Cluster) Validate(strict bool) error {
|
||||
specField := field.NewPath("Spec")
|
||||
|
||||
var err error
|
||||
|
||||
if c.Name == "" {
|
||||
|
@ -274,6 +277,24 @@ func (c *Cluster) Validate(strict bool) error {
|
|||
}
|
||||
}
|
||||
|
||||
// KubernetesVersion
|
||||
if c.Spec.KubernetesVersion == "" {
|
||||
if strict {
|
||||
return field.Required(specField.Child("KubernetesVersion"), "")
|
||||
}
|
||||
} else {
|
||||
sv, err := ParseKubernetesVersion(c.Spec.KubernetesVersion)
|
||||
if err != nil {
|
||||
return field.Invalid(specField.Child("KubernetesVersion"), c.Spec.KubernetesVersion, "unable to determine kubernetes version")
|
||||
}
|
||||
|
||||
if sv.GTE(semver.Version{Major: 1, Minor: 4}) {
|
||||
if c.Spec.Networking != nil && c.Spec.Networking.Classic != nil {
|
||||
return field.Invalid(specField.Child("Networking"), "classic", "classic networking is not supported with kubernetes versions 1.4 and later")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
package api
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/blang/semver"
|
||||
"github.com/golang/glog"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func ParseKubernetesVersion(version string) (*semver.Version, error) {
|
||||
sv, err := semver.ParseTolerant(version)
|
||||
if err != nil {
|
||||
glog.Warningf("error parsing kubernetes semver %q, falling back to string matching", version)
|
||||
|
||||
v := strings.Trim(version, "v")
|
||||
if strings.HasPrefix(v, "1.3.") {
|
||||
sv = semver.Version{Major: 1, Minor: 3}
|
||||
} else if strings.HasPrefix(v, "1.4.") {
|
||||
sv = semver.Version{Major: 1, Minor: 4}
|
||||
} else if strings.HasPrefix(v, "1.5.") {
|
||||
sv = semver.Version{Major: 1, Minor: 5}
|
||||
} else if strings.Contains(v, "/v1.3.") {
|
||||
sv = semver.Version{Major: 1, Minor: 3}
|
||||
} else if strings.Contains(v, "/v1.4.") {
|
||||
sv = semver.Version{Major: 1, Minor: 4}
|
||||
} else if strings.Contains(v, "/v1.5.") {
|
||||
sv = semver.Version{Major: 1, Minor: 5}
|
||||
} else {
|
||||
return nil, fmt.Errorf("unable to parse kubernetes version %q", version)
|
||||
}
|
||||
}
|
||||
|
||||
return &sv, nil
|
||||
}
|
|
@ -6,10 +6,10 @@ import (
|
|||
"k8s.io/kops/upup/pkg/api"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
|
||||
"k8s.io/kops/util/pkg/vfs"
|
||||
"k8s.io/kubernetes/pkg/util/sets"
|
||||
"strings"
|
||||
"testing"
|
||||
"k8s.io/kops/util/pkg/vfs"
|
||||
)
|
||||
|
||||
const MockAWSRegion = "us-mock-1"
|
||||
|
@ -140,6 +140,26 @@ func TestValidateFull_UpdatePolicy_Invalid(t *testing.T) {
|
|||
expectErrorFromValidate(t, c, "UpdatePolicy")
|
||||
}
|
||||
|
||||
func Test_Validate_No_Classic_With_14(t *testing.T) {
|
||||
c := buildDefaultCluster(t)
|
||||
c.Spec.KubernetesVersion = "1.4.1"
|
||||
c.Spec.Networking = &api.NetworkingSpec{
|
||||
Classic: &api.ClassicNetworkingSpec{},
|
||||
}
|
||||
|
||||
expectErrorFromValidate(t, c, "Spec.Networking")
|
||||
}
|
||||
|
||||
func Test_Validate_Kubenet_With_14(t *testing.T) {
|
||||
c := buildDefaultCluster(t)
|
||||
c.Spec.KubernetesVersion = "1.4.1"
|
||||
c.Spec.Networking = &api.NetworkingSpec{
|
||||
Kubenet: &api.KubenetNetworkingSpec{},
|
||||
}
|
||||
|
||||
expectNoErrorFromValidate(t, c)
|
||||
}
|
||||
|
||||
func expectErrorFromValidate(t *testing.T, c *api.Cluster, message string) {
|
||||
err := c.Validate(false)
|
||||
if err == nil {
|
||||
|
|
Loading…
Reference in New Issue