mirror of https://github.com/kubernetes/kops.git
Prevent KubernetesVersion 1.4 with classic networking
This commit is contained in:
parent
6388a77fd4
commit
13870c30c5
|
@ -2,6 +2,7 @@ package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/blang/semver"
|
||||||
"k8s.io/kops/upup/pkg/fi"
|
"k8s.io/kops/upup/pkg/fi"
|
||||||
"k8s.io/kubernetes/pkg/util/validation"
|
"k8s.io/kubernetes/pkg/util/validation"
|
||||||
"k8s.io/kubernetes/pkg/util/validation/field"
|
"k8s.io/kubernetes/pkg/util/validation/field"
|
||||||
|
@ -11,6 +12,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *Cluster) Validate(strict bool) error {
|
func (c *Cluster) Validate(strict bool) error {
|
||||||
|
specField := field.NewPath("Spec")
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if c.Name == "" {
|
if c.Name == "" {
|
||||||
|
@ -199,7 +202,7 @@ func (c *Cluster) Validate(strict bool) error {
|
||||||
if c.Spec.UpdatePolicy != nil {
|
if c.Spec.UpdatePolicy != nil {
|
||||||
switch *c.Spec.UpdatePolicy {
|
switch *c.Spec.UpdatePolicy {
|
||||||
case UpdatePolicyExternal:
|
case UpdatePolicyExternal:
|
||||||
// Valid
|
// Valid
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unrecognized value for UpdatePolicy: %v", *c.Spec.UpdatePolicy)
|
return fmt.Errorf("unrecognized value for UpdatePolicy: %v", *c.Spec.UpdatePolicy)
|
||||||
}
|
}
|
||||||
|
@ -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
|
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/api"
|
||||||
"k8s.io/kops/upup/pkg/fi"
|
"k8s.io/kops/upup/pkg/fi"
|
||||||
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
|
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
|
||||||
|
"k8s.io/kops/util/pkg/vfs"
|
||||||
"k8s.io/kubernetes/pkg/util/sets"
|
"k8s.io/kubernetes/pkg/util/sets"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"k8s.io/kops/util/pkg/vfs"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const MockAWSRegion = "us-mock-1"
|
const MockAWSRegion = "us-mock-1"
|
||||||
|
@ -140,6 +140,26 @@ func TestValidateFull_UpdatePolicy_Invalid(t *testing.T) {
|
||||||
expectErrorFromValidate(t, c, "UpdatePolicy")
|
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) {
|
func expectErrorFromValidate(t *testing.T, c *api.Cluster, message string) {
|
||||||
err := c.Validate(false)
|
err := c.Validate(false)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|
Loading…
Reference in New Issue