Move extensions.LabelSelector to unversioned.

Move type LabelSelector and type LabelSelectorRequirement from pkg/apis/extensions
This avoids an import loop when Job (and later DaemonSet, Deployment, ReplicaSet)
are moved out of extensions to new api groups.

Also Move LabelSelectorAsSelector utility from pkg/apis/extensions/ to pkg/api/unversioned/
Also its test.
Also LabelSelectorOp* constants.
Also the pkg/apis/extensions/validation functions ValidateLabelSelectorRequirement and
ValidateLabelSelector move to pkg/api/unversioned

The related type in pkg/apis/extensions/v1beta1/ is staying there.  I might move
it in another PR if neccessary.
This commit is contained in:
Eric Tune
2016-02-01 21:34:42 -08:00
parent ad9fa30e7e
commit 6133cb1f21
29 changed files with 316 additions and 246 deletions

View File

@@ -17,53 +17,9 @@ limitations under the License.
package extensions
import (
"fmt"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/util/sets"
)
// LabelSelectorAsSelector converts the LabelSelector api type into a struct that implements
// labels.Selector
func LabelSelectorAsSelector(ps *LabelSelector) (labels.Selector, error) {
if ps == nil {
return labels.Nothing(), nil
}
if len(ps.MatchLabels)+len(ps.MatchExpressions) == 0 {
return labels.Everything(), nil
}
selector := labels.NewSelector()
for k, v := range ps.MatchLabels {
r, err := labels.NewRequirement(k, labels.InOperator, sets.NewString(v))
if err != nil {
return nil, err
}
selector = selector.Add(*r)
}
for _, expr := range ps.MatchExpressions {
var op labels.Operator
switch expr.Operator {
case LabelSelectorOpIn:
op = labels.InOperator
case LabelSelectorOpNotIn:
op = labels.NotInOperator
case LabelSelectorOpExists:
op = labels.ExistsOperator
case LabelSelectorOpDoesNotExist:
op = labels.DoesNotExistOperator
default:
return nil, fmt.Errorf("%q is not a valid pod selector operator", expr.Operator)
}
r, err := labels.NewRequirement(expr.Key, op, sets.NewString(expr.Values...))
if err != nil {
return nil, err
}
selector = selector.Add(*r)
}
return selector, nil
}
// ScaleFromDeployment returns a scale subresource for a deployment.
func ScaleFromDeployment(deployment *Deployment) *Scale {
return &Scale{

View File

@@ -1,83 +0,0 @@
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package extensions
import (
"reflect"
"testing"
"k8s.io/kubernetes/pkg/labels"
)
func TestLabelSelectorAsSelector(t *testing.T) {
matchLabels := map[string]string{"foo": "bar"}
matchExpressions := []LabelSelectorRequirement{{
Key: "baz",
Operator: LabelSelectorOpIn,
Values: []string{"qux", "norf"},
}}
mustParse := func(s string) labels.Selector {
out, e := labels.Parse(s)
if e != nil {
panic(e)
}
return out
}
tc := []struct {
in *LabelSelector
out labels.Selector
expectErr bool
}{
{in: nil, out: labels.Nothing()},
{in: &LabelSelector{}, out: labels.Everything()},
{
in: &LabelSelector{MatchLabels: matchLabels},
out: mustParse("foo in (bar)"),
},
{
in: &LabelSelector{MatchExpressions: matchExpressions},
out: mustParse("baz in (norf,qux)"),
},
{
in: &LabelSelector{MatchLabels: matchLabels, MatchExpressions: matchExpressions},
out: mustParse("foo in (bar),baz in (norf,qux)"),
},
{
in: &LabelSelector{
MatchExpressions: []LabelSelectorRequirement{{
Key: "baz",
Operator: LabelSelectorOpExists,
Values: []string{"qux", "norf"},
}},
},
expectErr: true,
},
}
for i, tc := range tc {
out, err := LabelSelectorAsSelector(tc.in)
if err == nil && tc.expectErr {
t.Errorf("[%v]expected error but got none.", i)
}
if err != nil && !tc.expectErr {
t.Errorf("[%v]did not expect error but got: %v", i, err)
}
if !reflect.DeepEqual(out, tc.out) {
t.Errorf("[%v]expected:\n\t%+v\nbut got:\n\t%+v", i, tc.out, out)
}
}
}

View File

@@ -413,7 +413,7 @@ type DaemonSetSpec struct {
// Must match in order to be controlled.
// If empty, defaulted to labels on Pod template.
// More info: http://releases.k8s.io/HEAD/docs/user-guide/labels.md#label-selectors
Selector *LabelSelector `json:"selector,omitempty"`
Selector *unversioned.LabelSelector `json:"selector,omitempty"`
// Template is the object that describes the pod that will be created.
// The DaemonSet will create exactly one copy of this pod on every node
@@ -545,7 +545,7 @@ type JobSpec struct {
ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty"`
// Selector is a label query over pods that should match the pod count.
Selector *LabelSelector `json:"selector,omitempty"`
Selector *unversioned.LabelSelector `json:"selector,omitempty"`
// Template is the object that describes the pod that will be created when
// executing a job.
@@ -793,43 +793,6 @@ type ClusterAutoscalerList struct {
Items []ClusterAutoscaler `json:"items"`
}
// A label selector is a label query over a set of resources. The result of matchLabels and
// matchExpressions are ANDed. An empty label selector matches all objects. A null
// label selector matches no objects.
type LabelSelector struct {
// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
// map is equivalent to an element of matchExpressions, whose key field is "key", the
// operator is "In", and the values array contains only "value". The requirements are ANDed.
MatchLabels map[string]string `json:"matchLabels,omitempty"`
// matchExpressions is a list of label selector requirements. The requirements are ANDed.
MatchExpressions []LabelSelectorRequirement `json:"matchExpressions,omitempty"`
}
// A label selector requirement is a selector that contains values, a key, and an operator that
// relates the key and values.
type LabelSelectorRequirement struct {
// key is the label key that the selector applies to.
Key string `json:"key" patchStrategy:"merge" patchMergeKey:"key"`
// operator represents a key's relationship to a set of values.
// Valid operators ard In, NotIn, Exists and DoesNotExist.
Operator LabelSelectorOperator `json:"operator"`
// values is an array of string values. If the operator is In or NotIn,
// the values array must be non-empty. If the operator is Exists or DoesNotExist,
// the values array must be empty. This array is replaced during a strategic
// merge patch.
Values []string `json:"values,omitempty"`
}
// A label selector operator is the set of operators that can be used in a selector requirement.
type LabelSelectorOperator string
const (
LabelSelectorOpIn LabelSelectorOperator = "In"
LabelSelectorOpNotIn LabelSelectorOperator = "NotIn"
LabelSelectorOpExists LabelSelectorOperator = "Exists"
LabelSelectorOpDoesNotExist LabelSelectorOperator = "DoesNotExist"
)
// +genclient=true
// ReplicaSet represents the configuration of a replica set.
@@ -864,7 +827,7 @@ type ReplicaSetSpec struct {
// Must match in order to be controlled.
// If empty, defaulted to labels on pod template.
// More info: http://releases.k8s.io/HEAD/docs/user-guide/labels.md#label-selectors
Selector *LabelSelector `json:"selector,omitempty"`
Selector *unversioned.LabelSelector `json:"selector,omitempty"`
// Template is the object that describes the pod that will be created if
// insufficient replicas are detected.

View File

@@ -21,6 +21,7 @@ import (
"reflect"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
v1 "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/conversion"
@@ -454,10 +455,10 @@ func Convert_extensions_DaemonSetSpec_To_v1beta1_DaemonSetSpec(in *extensions.Da
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*extensions.DaemonSetSpec))(in)
}
// unable to generate simple pointer conversion for extensions.LabelSelector -> v1beta1.LabelSelector
// unable to generate simple pointer conversion for unversioned.LabelSelector -> v1beta1.LabelSelector
if in.Selector != nil {
out.Selector = new(LabelSelector)
if err := Convert_extensions_LabelSelector_To_v1beta1_LabelSelector(in.Selector, out.Selector, s); err != nil {
if err := Convert_unversioned_LabelSelector_To_v1beta1_LabelSelector(in.Selector, out.Selector, s); err != nil {
return err
}
} else {
@@ -478,10 +479,10 @@ func Convert_v1beta1_DaemonSetSpec_To_extensions_DaemonSetSpec(in *DaemonSetSpec
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*DaemonSetSpec))(in)
}
// unable to generate simple pointer conversion for v1beta1.LabelSelector -> extensions.LabelSelector
// unable to generate simple pointer conversion for v1beta1.LabelSelector -> unversioned.LabelSelector
if in.Selector != nil {
out.Selector = new(extensions.LabelSelector)
if err := Convert_v1beta1_LabelSelector_To_extensions_LabelSelector(in.Selector, out.Selector, s); err != nil {
out.Selector = new(unversioned.LabelSelector)
if err := Convert_v1beta1_LabelSelector_To_unversioned_LabelSelector(in.Selector, out.Selector, s); err != nil {
return err
}
} else {
@@ -564,7 +565,7 @@ func Convert_extensions_ReplicaSetSpec_To_v1beta1_ReplicaSetSpec(in *extensions.
*out.Replicas = int32(in.Replicas)
if in.Selector != nil {
out.Selector = new(LabelSelector)
if err := Convert_extensions_LabelSelector_To_v1beta1_LabelSelector(in.Selector, out.Selector, s); err != nil {
if err := Convert_unversioned_LabelSelector_To_v1beta1_LabelSelector(in.Selector, out.Selector, s); err != nil {
return err
}
} else {
@@ -589,8 +590,8 @@ func Convert_v1beta1_ReplicaSetSpec_To_extensions_ReplicaSetSpec(in *ReplicaSetS
out.Replicas = int(*in.Replicas)
}
if in.Selector != nil {
out.Selector = new(extensions.LabelSelector)
if err := Convert_v1beta1_LabelSelector_To_extensions_LabelSelector(in.Selector, out.Selector, s); err != nil {
out.Selector = new(unversioned.LabelSelector)
if err := Convert_v1beta1_LabelSelector_To_unversioned_LabelSelector(in.Selector, out.Selector, s); err != nil {
return err
}
} else {

View File

@@ -23,6 +23,8 @@ import (
"strings"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
unversionedvalidation "k8s.io/kubernetes/pkg/api/unversioned/validation"
apivalidation "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/labels"
@@ -210,9 +212,9 @@ func ValidateDaemonSetUpdateStrategy(strategy *extensions.DaemonSetUpdateStrateg
func ValidateDaemonSetSpec(spec *extensions.DaemonSetSpec, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
allErrs = append(allErrs, ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...)
allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...)
selector, err := extensions.LabelSelectorAsSelector(spec.Selector)
selector, err := unversioned.LabelSelectorAsSelector(spec.Selector)
if err == nil && !selector.Matches(labels.Set(spec.Template.Labels)) {
allErrs = append(allErrs, field.Invalid(fldPath.Child("template", "metadata", "labels"), spec.Template.Labels, "`selector` does not match template `labels`"))
}
@@ -391,10 +393,10 @@ func ValidateJobSpec(spec *extensions.JobSpec, fldPath *field.Path) field.ErrorL
if spec.Selector == nil {
allErrs = append(allErrs, field.Required(fldPath.Child("selector"), ""))
} else {
allErrs = append(allErrs, ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...)
allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...)
}
if selector, err := extensions.LabelSelectorAsSelector(spec.Selector); err == nil {
if selector, err := unversioned.LabelSelectorAsSelector(spec.Selector); err == nil {
labels := labels.Set(spec.Template.Labels)
if !selector.Matches(labels) {
allErrs = append(allErrs, field.Invalid(fldPath.Child("template", "metadata", "labels"), spec.Template.Labels, "`selector` does not match template `labels`"))
@@ -604,36 +606,6 @@ func ValidateClusterAutoscaler(autoscaler *extensions.ClusterAutoscaler) field.E
return allErrs
}
func ValidateLabelSelector(ps *extensions.LabelSelector, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
if ps == nil {
return allErrs
}
allErrs = append(allErrs, apivalidation.ValidateLabels(ps.MatchLabels, fldPath.Child("matchLabels"))...)
for i, expr := range ps.MatchExpressions {
allErrs = append(allErrs, ValidateLabelSelectorRequirement(expr, fldPath.Child("matchExpressions").Index(i))...)
}
return allErrs
}
func ValidateLabelSelectorRequirement(sr extensions.LabelSelectorRequirement, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
switch sr.Operator {
case extensions.LabelSelectorOpIn, extensions.LabelSelectorOpNotIn:
if len(sr.Values) == 0 {
allErrs = append(allErrs, field.Required(fldPath.Child("values"), "must be specified when `operator` is 'In' or 'NotIn'"))
}
case extensions.LabelSelectorOpExists, extensions.LabelSelectorOpDoesNotExist:
if len(sr.Values) > 0 {
allErrs = append(allErrs, field.Forbidden(fldPath.Child("values"), "may not be specified when `operator` is 'Exists' or 'DoesNotExist'"))
}
default:
allErrs = append(allErrs, field.Invalid(fldPath.Child("operator"), sr.Operator, "not a valid selector operator"))
}
allErrs = append(allErrs, apivalidation.ValidateLabelName(sr.Key, fldPath.Child("key"))...)
return allErrs
}
func ValidateScale(scale *extensions.Scale) field.ErrorList {
allErrs := field.ErrorList{}
allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&scale.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...)
@@ -686,13 +658,13 @@ func ValidateReplicaSetSpec(spec *extensions.ReplicaSetSpec, fldPath *field.Path
if spec.Selector == nil {
allErrs = append(allErrs, field.Required(fldPath.Child("selector"), ""))
} else {
allErrs = append(allErrs, ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...)
allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...)
if len(spec.Selector.MatchLabels)+len(spec.Selector.MatchExpressions) == 0 {
allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "empty selector is not valid for deployment."))
}
}
selector, err := extensions.LabelSelectorAsSelector(spec.Selector)
selector, err := unversioned.LabelSelectorAsSelector(spec.Selector)
if err != nil {
allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "failed to convert LabelSelector to Selector."))
} else {

View File

@@ -22,6 +22,7 @@ import (
"testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/util/intstr"
)
@@ -375,7 +376,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -383,7 +384,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -393,7 +394,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -401,7 +402,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector2},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector2},
Template: validPodTemplateAbc2.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -411,7 +412,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -419,7 +420,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateNodeSelector.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -438,7 +439,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -446,7 +447,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -456,7 +457,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -464,7 +465,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: invalidSelector},
Selector: &unversioned.LabelSelector{MatchLabels: invalidSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -474,7 +475,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -482,7 +483,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: invalidPodTemplate.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -492,7 +493,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -500,7 +501,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateDef.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -510,7 +511,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -518,7 +519,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: readWriteVolumePodTemplate.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -528,7 +529,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -536,7 +537,7 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: invalidSelector},
Selector: &unversioned.LabelSelector{MatchLabels: invalidSelector},
Template: validPodTemplateAbc.Template,
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
Type: extensions.RollingUpdateDaemonSetStrategyType,
@@ -589,7 +590,7 @@ func TestValidateDaemonSet(t *testing.T) {
{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -597,7 +598,7 @@ func TestValidateDaemonSet(t *testing.T) {
{
ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
UpdateStrategy: validUpdateStrategy,
},
@@ -613,14 +614,14 @@ func TestValidateDaemonSet(t *testing.T) {
"zero-length ID": {
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
},
},
"missing-namespace": {
ObjectMeta: api.ObjectMeta{Name: "abc-123"},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
},
},
@@ -633,14 +634,14 @@ func TestValidateDaemonSet(t *testing.T) {
"selector_doesnt_match": {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}},
Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}},
Template: validPodTemplate.Template,
},
},
"invalid template": {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
},
},
"invalid_label": {
@@ -652,7 +653,7 @@ func TestValidateDaemonSet(t *testing.T) {
},
},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
},
},
@@ -677,7 +678,7 @@ func TestValidateDaemonSet(t *testing.T) {
},
},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
},
},
@@ -687,7 +688,7 @@ func TestValidateDaemonSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: api.PodTemplateSpec{
Spec: api.PodSpec{
RestartPolicy: api.RestartPolicyOnFailure,
@@ -706,7 +707,7 @@ func TestValidateDaemonSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: api.PodTemplateSpec{
Spec: api.PodSpec{
RestartPolicy: api.RestartPolicyNever,
@@ -725,7 +726,7 @@ func TestValidateDaemonSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
Type: "",
@@ -741,7 +742,7 @@ func TestValidateDaemonSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
Type: extensions.RollingUpdateDaemonSetStrategyType,
@@ -755,7 +756,7 @@ func TestValidateDaemonSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
Type: extensions.RollingUpdateDaemonSetStrategyType,
@@ -772,7 +773,7 @@ func TestValidateDaemonSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
Type: extensions.RollingUpdateDaemonSetStrategyType,
@@ -789,7 +790,7 @@ func TestValidateDaemonSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
Type: extensions.RollingUpdateDaemonSetStrategyType,
@@ -806,7 +807,7 @@ func TestValidateDaemonSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
Selector: &unversioned.LabelSelector{MatchLabels: validSelector},
Template: validPodTemplate.Template,
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
Type: extensions.RollingUpdateDaemonSetStrategyType,
@@ -1007,7 +1008,7 @@ func TestValidateDeploymentRollback(t *testing.T) {
}
func TestValidateJob(t *testing.T) {
validSelector := &extensions.LabelSelector{
validSelector := &unversioned.LabelSelector{
MatchLabels: map[string]string{"a": "b"},
}
validPodTemplateSpec := api.PodTemplateSpec{
@@ -1529,7 +1530,7 @@ func TestValidateReplicaSetStatusUpdate(t *testing.T) {
old: extensions.ReplicaSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
Status: extensions.ReplicaSetStatus{
@@ -1540,7 +1541,7 @@ func TestValidateReplicaSetStatusUpdate(t *testing.T) {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Replicas: 3,
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
Status: extensions.ReplicaSetStatus{
@@ -1561,7 +1562,7 @@ func TestValidateReplicaSetStatusUpdate(t *testing.T) {
old: extensions.ReplicaSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
Status: extensions.ReplicaSetStatus{
@@ -1572,7 +1573,7 @@ func TestValidateReplicaSetStatusUpdate(t *testing.T) {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Replicas: 2,
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
Status: extensions.ReplicaSetStatus{
@@ -1637,7 +1638,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
old: extensions.ReplicaSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1645,7 +1646,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Replicas: 3,
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1654,7 +1655,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
old: extensions.ReplicaSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1662,7 +1663,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Replicas: 1,
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &readWriteVolumePodTemplate.Template,
},
},
@@ -1680,7 +1681,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
old: extensions.ReplicaSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1688,7 +1689,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Replicas: 2,
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &readWriteVolumePodTemplate.Template,
},
},
@@ -1697,7 +1698,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
old: extensions.ReplicaSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1705,7 +1706,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Replicas: 2,
Selector: &extensions.LabelSelector{MatchLabels: invalidLabels},
Selector: &unversioned.LabelSelector{MatchLabels: invalidLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1714,7 +1715,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
old: extensions.ReplicaSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1722,7 +1723,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Replicas: 2,
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &invalidPodTemplate.Template,
},
},
@@ -1731,7 +1732,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
old: extensions.ReplicaSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1739,7 +1740,7 @@ func TestValidateReplicaSetUpdate(t *testing.T) {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Replicas: -1,
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1795,14 +1796,14 @@ func TestValidateReplicaSet(t *testing.T) {
{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
{
ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1810,7 +1811,7 @@ func TestValidateReplicaSet(t *testing.T) {
ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Replicas: 1,
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &readWriteVolumePodTemplate.Template,
},
},
@@ -1825,14 +1826,14 @@ func TestValidateReplicaSet(t *testing.T) {
"zero-length ID": {
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
"missing-namespace": {
ObjectMeta: api.ObjectMeta{Name: "abc-123"},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1845,21 +1846,21 @@ func TestValidateReplicaSet(t *testing.T) {
"selector_doesnt_match": {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}},
Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}},
Template: &validPodTemplate.Template,
},
},
"invalid manifest": {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
},
},
"read-write persistent disk with > 1 pod": {
ObjectMeta: api.ObjectMeta{Name: "abc"},
Spec: extensions.ReplicaSetSpec{
Replicas: 2,
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &readWriteVolumePodTemplate.Template,
},
},
@@ -1867,7 +1868,7 @@ func TestValidateReplicaSet(t *testing.T) {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.ReplicaSetSpec{
Replicas: -1,
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
},
},
"invalid_label": {
@@ -1879,7 +1880,7 @@ func TestValidateReplicaSet(t *testing.T) {
},
},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1904,7 +1905,7 @@ func TestValidateReplicaSet(t *testing.T) {
},
},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &validPodTemplate.Template,
},
},
@@ -1914,7 +1915,7 @@ func TestValidateReplicaSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &api.PodTemplateSpec{
Spec: api.PodSpec{
RestartPolicy: api.RestartPolicyOnFailure,
@@ -1933,7 +1934,7 @@ func TestValidateReplicaSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: validLabels},
Selector: &unversioned.LabelSelector{MatchLabels: validLabels},
Template: &api.PodTemplateSpec{
Spec: api.PodSpec{
RestartPolicy: api.RestartPolicyNever,