Commit 6133cb1f authored by Eric Tune's avatar Eric Tune

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.
parent ad9fa30e
/*
Copyright 2016 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 unversioned
import (
"fmt"
"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
}
/* /*
Copyright 2015 The Kubernetes Authors All rights reserved. Copyright 2016 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
...@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and ...@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package extensions package unversioned
import ( import (
"reflect" "reflect"
......
...@@ -15,6 +15,14 @@ limitations under the License. ...@@ -15,6 +15,14 @@ limitations under the License.
*/ */
// Package unversioned contains API types that are common to all versions. // Package unversioned contains API types that are common to all versions.
//
// The package contains two categories of types:
// - external (serialized) types that lack their own version (e.g TypeMeta)
// - internal (never-serialized) types that are needed by several different
// api groups, and so live here, to avoid duplication and/or import loops
// (e.g. LabelSelector).
// In the future, we will probably move these categories of objects into
// separate packages.
package unversioned package unversioned
import "strings" import "strings"
...@@ -382,3 +390,46 @@ func (apiVersions APIVersions) GoString() string { ...@@ -382,3 +390,46 @@ func (apiVersions APIVersions) GoString() string {
// Patch is provided to give a concrete name and type to the Kubernetes PATCH request body. // Patch is provided to give a concrete name and type to the Kubernetes PATCH request body.
type Patch struct{} type Patch struct{}
// Note:
// There are two different styles of label selectors used in versioned types:
// an older style which is represented as just a string in versioned types, and a
// newer style that is structured. LabelSelector is an internal representation for the
// latter style.
// 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"
)
/*
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 validation
import (
"k8s.io/kubernetes/pkg/api/unversioned"
apivalidation "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/util/validation/field"
)
func ValidateLabelSelector(ps *unversioned.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 unversioned.LabelSelectorRequirement, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
switch sr.Operator {
case unversioned.LabelSelectorOpIn, unversioned.LabelSelectorOpNotIn:
if len(sr.Values) == 0 {
allErrs = append(allErrs, field.Required(fldPath.Child("values"), "must be specified when `operator` is 'In' or 'NotIn'"))
}
case unversioned.LabelSelectorOpExists, unversioned.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
}
...@@ -17,53 +17,9 @@ limitations under the License. ...@@ -17,53 +17,9 @@ limitations under the License.
package extensions package extensions
import ( import (
"fmt"
"k8s.io/kubernetes/pkg/api" "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. // ScaleFromDeployment returns a scale subresource for a deployment.
func ScaleFromDeployment(deployment *Deployment) *Scale { func ScaleFromDeployment(deployment *Deployment) *Scale {
return &Scale{ return &Scale{
......
...@@ -413,7 +413,7 @@ type DaemonSetSpec struct { ...@@ -413,7 +413,7 @@ type DaemonSetSpec struct {
// Must match in order to be controlled. // Must match in order to be controlled.
// If empty, defaulted to labels on Pod template. // If empty, defaulted to labels on Pod template.
// More info: http://releases.k8s.io/HEAD/docs/user-guide/labels.md#label-selectors // 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. // 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 // The DaemonSet will create exactly one copy of this pod on every node
...@@ -545,7 +545,7 @@ type JobSpec struct { ...@@ -545,7 +545,7 @@ type JobSpec struct {
ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty"` ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty"`
// Selector is a label query over pods that should match the pod count. // 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 // Template is the object that describes the pod that will be created when
// executing a job. // executing a job.
...@@ -793,43 +793,6 @@ type ClusterAutoscalerList struct { ...@@ -793,43 +793,6 @@ type ClusterAutoscalerList struct {
Items []ClusterAutoscaler `json:"items"` 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 // +genclient=true
// ReplicaSet represents the configuration of a replica set. // ReplicaSet represents the configuration of a replica set.
...@@ -864,7 +827,7 @@ type ReplicaSetSpec struct { ...@@ -864,7 +827,7 @@ type ReplicaSetSpec struct {
// Must match in order to be controlled. // Must match in order to be controlled.
// If empty, defaulted to labels on pod template. // If empty, defaulted to labels on pod template.
// More info: http://releases.k8s.io/HEAD/docs/user-guide/labels.md#label-selectors // 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 // Template is the object that describes the pod that will be created if
// insufficient replicas are detected. // insufficient replicas are detected.
......
...@@ -21,6 +21,7 @@ import ( ...@@ -21,6 +21,7 @@ import (
"reflect" "reflect"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
v1 "k8s.io/kubernetes/pkg/api/v1" v1 "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/conversion" "k8s.io/kubernetes/pkg/conversion"
...@@ -454,10 +455,10 @@ func Convert_extensions_DaemonSetSpec_To_v1beta1_DaemonSetSpec(in *extensions.Da ...@@ -454,10 +455,10 @@ func Convert_extensions_DaemonSetSpec_To_v1beta1_DaemonSetSpec(in *extensions.Da
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*extensions.DaemonSetSpec))(in) 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 { if in.Selector != nil {
out.Selector = new(LabelSelector) 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 return err
} }
} else { } else {
...@@ -478,10 +479,10 @@ func Convert_v1beta1_DaemonSetSpec_To_extensions_DaemonSetSpec(in *DaemonSetSpec ...@@ -478,10 +479,10 @@ func Convert_v1beta1_DaemonSetSpec_To_extensions_DaemonSetSpec(in *DaemonSetSpec
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
defaulting.(func(*DaemonSetSpec))(in) 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 { if in.Selector != nil {
out.Selector = new(extensions.LabelSelector) out.Selector = new(unversioned.LabelSelector)
if err := Convert_v1beta1_LabelSelector_To_extensions_LabelSelector(in.Selector, out.Selector, s); err != nil { if err := Convert_v1beta1_LabelSelector_To_unversioned_LabelSelector(in.Selector, out.Selector, s); err != nil {
return err return err
} }
} else { } else {
...@@ -564,7 +565,7 @@ func Convert_extensions_ReplicaSetSpec_To_v1beta1_ReplicaSetSpec(in *extensions. ...@@ -564,7 +565,7 @@ func Convert_extensions_ReplicaSetSpec_To_v1beta1_ReplicaSetSpec(in *extensions.
*out.Replicas = int32(in.Replicas) *out.Replicas = int32(in.Replicas)
if in.Selector != nil { if in.Selector != nil {
out.Selector = new(LabelSelector) 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 return err
} }
} else { } else {
...@@ -589,8 +590,8 @@ func Convert_v1beta1_ReplicaSetSpec_To_extensions_ReplicaSetSpec(in *ReplicaSetS ...@@ -589,8 +590,8 @@ func Convert_v1beta1_ReplicaSetSpec_To_extensions_ReplicaSetSpec(in *ReplicaSetS
out.Replicas = int(*in.Replicas) out.Replicas = int(*in.Replicas)
} }
if in.Selector != nil { if in.Selector != nil {
out.Selector = new(extensions.LabelSelector) out.Selector = new(unversioned.LabelSelector)
if err := Convert_v1beta1_LabelSelector_To_extensions_LabelSelector(in.Selector, out.Selector, s); err != nil { if err := Convert_v1beta1_LabelSelector_To_unversioned_LabelSelector(in.Selector, out.Selector, s); err != nil {
return err return err
} }
} else { } else {
......
...@@ -23,6 +23,8 @@ import ( ...@@ -23,6 +23,8 @@ import (
"strings" "strings"
"k8s.io/kubernetes/pkg/api" "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" apivalidation "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
...@@ -210,9 +212,9 @@ func ValidateDaemonSetUpdateStrategy(strategy *extensions.DaemonSetUpdateStrateg ...@@ -210,9 +212,9 @@ func ValidateDaemonSetUpdateStrategy(strategy *extensions.DaemonSetUpdateStrateg
func ValidateDaemonSetSpec(spec *extensions.DaemonSetSpec, fldPath *field.Path) field.ErrorList { func ValidateDaemonSetSpec(spec *extensions.DaemonSetSpec, fldPath *field.Path) field.ErrorList {
allErrs := 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)) { 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`")) 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 ...@@ -391,10 +393,10 @@ func ValidateJobSpec(spec *extensions.JobSpec, fldPath *field.Path) field.ErrorL
if spec.Selector == nil { if spec.Selector == nil {
allErrs = append(allErrs, field.Required(fldPath.Child("selector"), "")) allErrs = append(allErrs, field.Required(fldPath.Child("selector"), ""))
} else { } 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) labels := labels.Set(spec.Template.Labels)
if !selector.Matches(labels) { if !selector.Matches(labels) {
allErrs = append(allErrs, field.Invalid(fldPath.Child("template", "metadata", "labels"), spec.Template.Labels, "`selector` does not match template `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 ...@@ -604,36 +606,6 @@ func ValidateClusterAutoscaler(autoscaler *extensions.ClusterAutoscaler) field.E
return allErrs 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 { func ValidateScale(scale *extensions.Scale) field.ErrorList {
allErrs := field.ErrorList{} allErrs := field.ErrorList{}
allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&scale.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) 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 ...@@ -686,13 +658,13 @@ func ValidateReplicaSetSpec(spec *extensions.ReplicaSetSpec, fldPath *field.Path
if spec.Selector == nil { if spec.Selector == nil {
allErrs = append(allErrs, field.Required(fldPath.Child("selector"), "")) allErrs = append(allErrs, field.Required(fldPath.Child("selector"), ""))
} else { } 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 { 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.")) 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 { if err != nil {
allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "failed to convert LabelSelector to Selector.")) allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "failed to convert LabelSelector to Selector."))
} else { } else {
......
...@@ -21,6 +21,7 @@ import ( ...@@ -21,6 +21,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
) )
...@@ -304,7 +305,7 @@ func (s *StoreToReplicaSetLister) GetPodReplicaSets(pod *api.Pod) (rss []extensi ...@@ -304,7 +305,7 @@ func (s *StoreToReplicaSetLister) GetPodReplicaSets(pod *api.Pod) (rss []extensi
if rs.Namespace != pod.Namespace { if rs.Namespace != pod.Namespace {
continue continue
} }
selector, err = extensions.LabelSelectorAsSelector(rs.Spec.Selector) selector, err = unversioned.LabelSelectorAsSelector(rs.Spec.Selector)
if err != nil { if err != nil {
err = fmt.Errorf("failed to convert pod selector to selector: %v", err) err = fmt.Errorf("failed to convert pod selector to selector: %v", err)
return return
...@@ -361,7 +362,7 @@ func (s *StoreToDaemonSetLister) GetPodDaemonSets(pod *api.Pod) (daemonSets []ex ...@@ -361,7 +362,7 @@ func (s *StoreToDaemonSetLister) GetPodDaemonSets(pod *api.Pod) (daemonSets []ex
if daemonSet.Namespace != pod.Namespace { if daemonSet.Namespace != pod.Namespace {
continue continue
} }
selector, err = extensions.LabelSelectorAsSelector(daemonSet.Spec.Selector) selector, err = unversioned.LabelSelectorAsSelector(daemonSet.Spec.Selector)
if err != nil { if err != nil {
// this should not happen if the DaemonSet passed validation // this should not happen if the DaemonSet passed validation
return nil, err return nil, err
...@@ -483,7 +484,7 @@ func (s *StoreToJobLister) GetPodJobs(pod *api.Pod) (jobs []extensions.Job, err ...@@ -483,7 +484,7 @@ func (s *StoreToJobLister) GetPodJobs(pod *api.Pod) (jobs []extensions.Job, err
continue continue
} }
selector, _ = extensions.LabelSelectorAsSelector(job.Spec.Selector) selector, _ = unversioned.LabelSelectorAsSelector(job.Spec.Selector)
if !selector.Matches(labels.Set(pod.Labels)) { if !selector.Matches(labels.Set(pod.Labels)) {
continue continue
} }
......
...@@ -20,6 +20,7 @@ import ( ...@@ -20,6 +20,7 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
...@@ -258,7 +259,7 @@ func TestStoreToReplicaSetLister(t *testing.T) { ...@@ -258,7 +259,7 @@ func TestStoreToReplicaSetLister(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"},
Spec: extensions.ReplicaSetSpec{ Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"foo": "baz"}}, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "baz"}},
}, },
}, },
}, },
...@@ -297,13 +298,13 @@ func TestStoreToReplicaSetLister(t *testing.T) { ...@@ -297,13 +298,13 @@ func TestStoreToReplicaSetLister(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "foo"}, ObjectMeta: api.ObjectMeta{Name: "foo"},
Spec: extensions.ReplicaSetSpec{ Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}},
}, },
}, },
{ {
ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"},
Spec: extensions.ReplicaSetSpec{ Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}},
}, },
}, },
}, },
...@@ -384,7 +385,7 @@ func TestStoreToDaemonSetLister(t *testing.T) { ...@@ -384,7 +385,7 @@ func TestStoreToDaemonSetLister(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"},
Spec: extensions.DaemonSetSpec{ Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"foo": "baz"}}, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "baz"}},
}, },
}, },
}, },
...@@ -423,13 +424,13 @@ func TestStoreToDaemonSetLister(t *testing.T) { ...@@ -423,13 +424,13 @@ func TestStoreToDaemonSetLister(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "foo"}, ObjectMeta: api.ObjectMeta{Name: "foo"},
Spec: extensions.DaemonSetSpec{ Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}},
}, },
}, },
{ {
ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"},
Spec: extensions.DaemonSetSpec{ Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}},
}, },
}, },
}, },
...@@ -513,7 +514,7 @@ func TestStoreToJobLister(t *testing.T) { ...@@ -513,7 +514,7 @@ func TestStoreToJobLister(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"}, ObjectMeta: api.ObjectMeta{Name: "basic", Namespace: "ns"},
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"foo": "baz"}, MatchLabels: map[string]string{"foo": "baz"},
}, },
}, },
...@@ -556,7 +557,7 @@ func TestStoreToJobLister(t *testing.T) { ...@@ -556,7 +557,7 @@ func TestStoreToJobLister(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "foo"}, ObjectMeta: api.ObjectMeta{Name: "foo"},
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"foo": "bar"}, MatchLabels: map[string]string{"foo": "bar"},
}, },
}, },
...@@ -564,7 +565,7 @@ func TestStoreToJobLister(t *testing.T) { ...@@ -564,7 +565,7 @@ func TestStoreToJobLister(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"},
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"foo": "bar"}, MatchLabels: map[string]string{"foo": "bar"},
}, },
}, },
...@@ -589,7 +590,7 @@ func TestStoreToJobLister(t *testing.T) { ...@@ -589,7 +590,7 @@ func TestStoreToJobLister(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "foo"}, ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "foo"},
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"foo": "bar"}, MatchLabels: map[string]string{"foo": "bar"},
}, },
}, },
...@@ -597,7 +598,7 @@ func TestStoreToJobLister(t *testing.T) { ...@@ -597,7 +598,7 @@ func TestStoreToJobLister(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "bar"}, ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "bar"},
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"foo": "bar"}, MatchLabels: map[string]string{"foo": "bar"},
}, },
}, },
......
...@@ -24,6 +24,7 @@ import ( ...@@ -24,6 +24,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/cache"
...@@ -365,7 +366,7 @@ func (dsc *DaemonSetsController) updateNode(old, cur interface{}) { ...@@ -365,7 +366,7 @@ func (dsc *DaemonSetsController) updateNode(old, cur interface{}) {
// getNodesToDaemonSetPods returns a map from nodes to daemon pods (corresponding to ds) running on the nodes. // getNodesToDaemonSetPods returns a map from nodes to daemon pods (corresponding to ds) running on the nodes.
func (dsc *DaemonSetsController) getNodesToDaemonPods(ds *extensions.DaemonSet) (map[string][]*api.Pod, error) { func (dsc *DaemonSetsController) getNodesToDaemonPods(ds *extensions.DaemonSet) (map[string][]*api.Pod, error) {
nodeToDaemonPods := make(map[string][]*api.Pod) nodeToDaemonPods := make(map[string][]*api.Pod)
selector, err := extensions.LabelSelectorAsSelector(ds.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(ds.Spec.Selector)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -60,7 +60,7 @@ func newDaemonSet(name string) *extensions.DaemonSet { ...@@ -60,7 +60,7 @@ func newDaemonSet(name string) *extensions.DaemonSet {
Namespace: api.NamespaceDefault, Namespace: api.NamespaceDefault,
}, },
Spec: extensions.DaemonSetSpec{ Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: simpleDaemonSetLabel}, Selector: &unversioned.LabelSelector{MatchLabels: simpleDaemonSetLabel},
Template: api.PodTemplateSpec{ Template: api.PodTemplateSpec{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Labels: simpleDaemonSetLabel, Labels: simpleDaemonSetLabel,
......
...@@ -317,7 +317,7 @@ func (jm *JobController) syncJob(key string) error { ...@@ -317,7 +317,7 @@ func (jm *JobController) syncJob(key string) error {
return err return err
} }
jobNeedsSync := jm.expectations.SatisfiedExpectations(jobKey) jobNeedsSync := jm.expectations.SatisfiedExpectations(jobKey)
selector, _ := extensions.LabelSelectorAsSelector(job.Spec.Selector) selector, _ := unversioned.LabelSelectorAsSelector(job.Spec.Selector)
podList, err := jm.podStore.Pods(job.Namespace).List(selector) podList, err := jm.podStore.Pods(job.Namespace).List(selector)
if err != nil { if err != nil {
glog.Errorf("Error getting pods for job %q: %v", key, err) glog.Errorf("Error getting pods for job %q: %v", key, err)
......
...@@ -45,7 +45,7 @@ func newJob(parallelism, completions int) *extensions.Job { ...@@ -45,7 +45,7 @@ func newJob(parallelism, completions int) *extensions.Job {
Namespace: api.NamespaceDefault, Namespace: api.NamespaceDefault,
}, },
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"foo": "bar"}, MatchLabels: map[string]string{"foo": "bar"},
}, },
Template: api.PodTemplateSpec{ Template: api.PodTemplateSpec{
...@@ -496,7 +496,7 @@ func TestJobPodLookup(t *testing.T) { ...@@ -496,7 +496,7 @@ func TestJobPodLookup(t *testing.T) {
job: &extensions.Job{ job: &extensions.Job{
ObjectMeta: api.ObjectMeta{Name: "foo"}, ObjectMeta: api.ObjectMeta{Name: "foo"},
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"foo": "bar"}, MatchLabels: map[string]string{"foo": "bar"},
}, },
}, },
...@@ -515,11 +515,11 @@ func TestJobPodLookup(t *testing.T) { ...@@ -515,11 +515,11 @@ func TestJobPodLookup(t *testing.T) {
job: &extensions.Job{ job: &extensions.Job{
ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"},
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchExpressions: []extensions.LabelSelectorRequirement{ MatchExpressions: []unversioned.LabelSelectorRequirement{
{ {
Key: "foo", Key: "foo",
Operator: extensions.LabelSelectorOpIn, Operator: unversioned.LabelSelectorOpIn,
Values: []string{"bar"}, Values: []string{"bar"},
}, },
}, },
......
...@@ -267,7 +267,7 @@ func TestMonitorNodeStatusEvictPods(t *testing.T) { ...@@ -267,7 +267,7 @@ func TestMonitorNodeStatusEvictPods(t *testing.T) {
Namespace: "default", Namespace: "default",
}, },
Spec: extensions.DaemonSetSpec{ Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"daemon": "yes"}, MatchLabels: map[string]string{"daemon": "yes"},
}, },
}, },
......
...@@ -26,6 +26,7 @@ import ( ...@@ -26,6 +26,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/cache"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_2" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_2"
...@@ -436,7 +437,7 @@ func (rsc *ReplicaSetController) syncReplicaSet(key string) error { ...@@ -436,7 +437,7 @@ func (rsc *ReplicaSetController) syncReplicaSet(key string) error {
return err return err
} }
rsNeedsSync := rsc.expectations.SatisfiedExpectations(rsKey) rsNeedsSync := rsc.expectations.SatisfiedExpectations(rsKey)
selector, err := extensions.LabelSelectorAsSelector(rs.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(rs.Spec.Selector)
if err != nil { if err != nil {
glog.Errorf("Error converting pod selector to selector: %v", err) glog.Errorf("Error converting pod selector to selector: %v", err)
return err return err
......
...@@ -66,7 +66,7 @@ func newReplicaSet(replicas int, selectorMap map[string]string) *extensions.Repl ...@@ -66,7 +66,7 @@ func newReplicaSet(replicas int, selectorMap map[string]string) *extensions.Repl
}, },
Spec: extensions.ReplicaSetSpec{ Spec: extensions.ReplicaSetSpec{
Replicas: replicas, Replicas: replicas,
Selector: &extensions.LabelSelector{MatchLabels: selectorMap}, Selector: &unversioned.LabelSelector{MatchLabels: selectorMap},
Template: &api.PodTemplateSpec{ Template: &api.PodTemplateSpec{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Labels: map[string]string{ Labels: map[string]string{
...@@ -379,7 +379,7 @@ func TestPodControllerLookup(t *testing.T) { ...@@ -379,7 +379,7 @@ func TestPodControllerLookup(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "foo"}, ObjectMeta: api.ObjectMeta{Name: "foo"},
Spec: extensions.ReplicaSetSpec{ Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}},
}, },
}, },
}, },
...@@ -394,7 +394,7 @@ func TestPodControllerLookup(t *testing.T) { ...@@ -394,7 +394,7 @@ func TestPodControllerLookup(t *testing.T) {
{ {
ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"},
Spec: extensions.ReplicaSetSpec{ Spec: extensions.ReplicaSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}},
}, },
}, },
}, },
...@@ -537,7 +537,7 @@ func TestUpdatePods(t *testing.T) { ...@@ -537,7 +537,7 @@ func TestUpdatePods(t *testing.T) {
manager.rsStore.Store.Add(testRSSpec1) manager.rsStore.Store.Add(testRSSpec1)
testRSSpec2 := *testRSSpec1 testRSSpec2 := *testRSSpec1
labelMap2 := map[string]string{"bar": "foo"} labelMap2 := map[string]string{"bar": "foo"}
testRSSpec2.Spec.Selector = &extensions.LabelSelector{MatchLabels: labelMap2} testRSSpec2.Spec.Selector = &unversioned.LabelSelector{MatchLabels: labelMap2}
testRSSpec2.Name = "barfoo" testRSSpec2.Name = "barfoo"
manager.rsStore.Store.Add(&testRSSpec2) manager.rsStore.Store.Add(&testRSSpec2)
......
...@@ -242,7 +242,7 @@ func TestDrain(t *testing.T) { ...@@ -242,7 +242,7 @@ func TestDrain(t *testing.T) {
SelfLink: "/apis/extensions/v1beta1/namespaces/default/daemonsets/ds", SelfLink: "/apis/extensions/v1beta1/namespaces/default/daemonsets/ds",
}, },
Spec: extensions.DaemonSetSpec{ Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: labels}, Selector: &unversioned.LabelSelector{MatchLabels: labels},
}, },
} }
...@@ -270,7 +270,7 @@ func TestDrain(t *testing.T) { ...@@ -270,7 +270,7 @@ func TestDrain(t *testing.T) {
SelfLink: "/apis/extensions/v1beta1/namespaces/default/jobs/job", SelfLink: "/apis/extensions/v1beta1/namespaces/default/jobs/job",
}, },
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{MatchLabels: labels}, Selector: &unversioned.LabelSelector{MatchLabels: labels},
}, },
} }
......
...@@ -920,7 +920,7 @@ func describeJob(job *extensions.Job, events *api.EventList) (string, error) { ...@@ -920,7 +920,7 @@ func describeJob(job *extensions.Job, events *api.EventList) (string, error) {
fmt.Fprintf(out, "Name:\t%s\n", job.Name) fmt.Fprintf(out, "Name:\t%s\n", job.Name)
fmt.Fprintf(out, "Namespace:\t%s\n", job.Namespace) fmt.Fprintf(out, "Namespace:\t%s\n", job.Namespace)
fmt.Fprintf(out, "Image(s):\t%s\n", makeImageList(&job.Spec.Template.Spec)) fmt.Fprintf(out, "Image(s):\t%s\n", makeImageList(&job.Spec.Template.Spec))
selector, _ := extensions.LabelSelectorAsSelector(job.Spec.Selector) selector, _ := unversioned.LabelSelectorAsSelector(job.Spec.Selector)
fmt.Fprintf(out, "Selector:\t%s\n", selector) fmt.Fprintf(out, "Selector:\t%s\n", selector)
fmt.Fprintf(out, "Parallelism:\t%d\n", *job.Spec.Parallelism) fmt.Fprintf(out, "Parallelism:\t%d\n", *job.Spec.Parallelism)
if job.Spec.Completions != nil { if job.Spec.Completions != nil {
...@@ -958,7 +958,7 @@ func (d *DaemonSetDescriber) Describe(namespace, name string) (string, error) { ...@@ -958,7 +958,7 @@ func (d *DaemonSetDescriber) Describe(namespace, name string) (string, error) {
return "", err return "", err
} }
selector, err := extensions.LabelSelectorAsSelector(daemon.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(daemon.Spec.Selector)
if err != nil { if err != nil {
return "", err return "", err
} }
...@@ -976,7 +976,7 @@ func describeDaemonSet(daemon *extensions.DaemonSet, events *api.EventList, runn ...@@ -976,7 +976,7 @@ func describeDaemonSet(daemon *extensions.DaemonSet, events *api.EventList, runn
return tabbedString(func(out io.Writer) error { return tabbedString(func(out io.Writer) error {
fmt.Fprintf(out, "Name:\t%s\n", daemon.Name) fmt.Fprintf(out, "Name:\t%s\n", daemon.Name)
fmt.Fprintf(out, "Image(s):\t%s\n", makeImageList(&daemon.Spec.Template.Spec)) fmt.Fprintf(out, "Image(s):\t%s\n", makeImageList(&daemon.Spec.Template.Spec))
selector, err := extensions.LabelSelectorAsSelector(daemon.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(daemon.Spec.Selector)
if err != nil { if err != nil {
// this shouldn't happen if LabelSelector passed validation // this shouldn't happen if LabelSelector passed validation
return err return err
...@@ -1645,7 +1645,7 @@ func getDaemonSetsForLabels(c client.DaemonSetInterface, labelsToMatch labels.La ...@@ -1645,7 +1645,7 @@ func getDaemonSetsForLabels(c client.DaemonSetInterface, labelsToMatch labels.La
// Find the ones that match labelsToMatch. // Find the ones that match labelsToMatch.
var matchingDaemonSets []extensions.DaemonSet var matchingDaemonSets []extensions.DaemonSet
for _, ds := range dss.Items { for _, ds := range dss.Items {
selector, err := extensions.LabelSelectorAsSelector(ds.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(ds.Spec.Selector)
if err != nil { if err != nil {
// this should never happen if the DaemonSet passed validation // this should never happen if the DaemonSet passed validation
return nil, err return nil, err
......
...@@ -740,7 +740,7 @@ func printJob(job *extensions.Job, w io.Writer, options PrintOptions) error { ...@@ -740,7 +740,7 @@ func printJob(job *extensions.Job, w io.Writer, options PrintOptions) error {
} }
} }
selector, _ := extensions.LabelSelectorAsSelector(job.Spec.Selector) selector, _ := unversioned.LabelSelectorAsSelector(job.Spec.Selector)
_, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%d", _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%d",
name, name,
firstContainer.Name, firstContainer.Name,
...@@ -941,7 +941,7 @@ func printDaemonSet(ds *extensions.DaemonSet, w io.Writer, options PrintOptions) ...@@ -941,7 +941,7 @@ func printDaemonSet(ds *extensions.DaemonSet, w io.Writer, options PrintOptions)
return err return err
} }
} }
selector, err := extensions.LabelSelectorAsSelector(ds.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(ds.Spec.Selector)
if err != nil { if err != nil {
// this shouldn't happen if LabelSelector passed validation // this shouldn't happen if LabelSelector passed validation
return err return err
......
...@@ -23,6 +23,7 @@ import ( ...@@ -23,6 +23,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/validation" "k8s.io/kubernetes/pkg/util/validation"
...@@ -266,7 +267,7 @@ func (JobV1Beta1) Generate(genericParams map[string]interface{}) (runtime.Object ...@@ -266,7 +267,7 @@ func (JobV1Beta1) Generate(genericParams map[string]interface{}) (runtime.Object
Labels: labels, Labels: labels,
}, },
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: labels, MatchLabels: labels,
}, },
Template: api.PodTemplateSpec{ Template: api.PodTemplateSpec{
......
...@@ -22,6 +22,7 @@ import ( ...@@ -22,6 +22,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
) )
...@@ -746,7 +747,7 @@ func TestGenerateJob(t *testing.T) { ...@@ -746,7 +747,7 @@ func TestGenerateJob(t *testing.T) {
Labels: map[string]string{"foo": "bar", "baz": "blah"}, Labels: map[string]string{"foo": "bar", "baz": "blah"},
}, },
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"foo": "bar", "baz": "blah"}, MatchLabels: map[string]string{"foo": "bar", "baz": "blah"},
}, },
Template: api.PodTemplateSpec{ Template: api.PodTemplateSpec{
......
...@@ -251,7 +251,7 @@ func (reaper *JobReaper) Stop(namespace, name string, timeout time.Duration, gra ...@@ -251,7 +251,7 @@ func (reaper *JobReaper) Stop(namespace, name string, timeout time.Duration, gra
return err return err
} }
// at this point only dead pods are left, that should be removed // at this point only dead pods are left, that should be removed
selector, _ := extensions.LabelSelectorAsSelector(job.Spec.Selector) selector, _ := unversioned.LabelSelectorAsSelector(job.Spec.Selector)
options := api.ListOptions{LabelSelector: selector} options := api.ListOptions{LabelSelector: selector}
podList, err := pods.List(options) podList, err := pods.List(options)
if err != nil { if err != nil {
......
...@@ -284,7 +284,7 @@ func TestJobStop(t *testing.T) { ...@@ -284,7 +284,7 @@ func TestJobStop(t *testing.T) {
}, },
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Parallelism: &zero, Parallelism: &zero,
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"k1": "v1"}, MatchLabels: map[string]string{"k1": "v1"},
}, },
}, },
...@@ -298,7 +298,7 @@ func TestJobStop(t *testing.T) { ...@@ -298,7 +298,7 @@ func TestJobStop(t *testing.T) {
}, },
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Parallelism: &zero, Parallelism: &zero,
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"k1": "v1"}, MatchLabels: map[string]string{"k1": "v1"},
}, },
}, },
...@@ -320,7 +320,7 @@ func TestJobStop(t *testing.T) { ...@@ -320,7 +320,7 @@ func TestJobStop(t *testing.T) {
}, },
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Parallelism: &zero, Parallelism: &zero,
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"k1": "v1"}, MatchLabels: map[string]string{"k1": "v1"},
}, },
}, },
...@@ -334,7 +334,7 @@ func TestJobStop(t *testing.T) { ...@@ -334,7 +334,7 @@ func TestJobStop(t *testing.T) {
}, },
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Parallelism: &zero, Parallelism: &zero,
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"k1": "v1"}, MatchLabels: map[string]string{"k1": "v1"},
}, },
}, },
......
...@@ -20,6 +20,7 @@ import ( ...@@ -20,6 +20,7 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
...@@ -43,7 +44,7 @@ func newValidDaemonSet() *extensions.DaemonSet { ...@@ -43,7 +44,7 @@ func newValidDaemonSet() *extensions.DaemonSet {
Namespace: api.NamespaceDefault, Namespace: api.NamespaceDefault,
}, },
Spec: extensions.DaemonSetSpec{ Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{"a": "b"}}, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"a": "b"}},
Template: api.PodTemplateSpec{ Template: api.PodTemplateSpec{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Labels: map[string]string{"a": "b"}, Labels: map[string]string{"a": "b"},
...@@ -85,7 +86,7 @@ func TestCreate(t *testing.T) { ...@@ -85,7 +86,7 @@ func TestCreate(t *testing.T) {
// invalid (invalid selector) // invalid (invalid selector)
&extensions.DaemonSet{ &extensions.DaemonSet{
Spec: extensions.DaemonSetSpec{ Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: map[string]string{}}, Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{}},
Template: validDaemonSet.Spec.Template, Template: validDaemonSet.Spec.Template,
}, },
}, },
...@@ -131,7 +132,7 @@ func TestUpdate(t *testing.T) { ...@@ -131,7 +132,7 @@ func TestUpdate(t *testing.T) {
}, },
func(obj runtime.Object) runtime.Object { func(obj runtime.Object) runtime.Object {
object := obj.(*extensions.DaemonSet) object := obj.(*extensions.DaemonSet)
object.Spec.Selector = &extensions.LabelSelector{MatchLabels: map[string]string{}} object.Spec.Selector = &unversioned.LabelSelector{MatchLabels: map[string]string{}}
return object return object
}, },
func(obj runtime.Object) runtime.Object { func(obj runtime.Object) runtime.Object {
......
...@@ -20,6 +20,7 @@ import ( ...@@ -20,6 +20,7 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
// Ensure that extensions/v1beta1 package is initialized. // Ensure that extensions/v1beta1 package is initialized.
_ "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" _ "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
...@@ -48,7 +49,7 @@ func validNewJob() *extensions.Job { ...@@ -48,7 +49,7 @@ func validNewJob() *extensions.Job {
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Completions: &completions, Completions: &completions,
Parallelism: &parallelism, Parallelism: &parallelism,
Selector: &extensions.LabelSelector{ Selector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"a": "b"}, MatchLabels: map[string]string{"a": "b"},
}, },
Template: api.PodTemplateSpec{ Template: api.PodTemplateSpec{
...@@ -84,7 +85,7 @@ func TestCreate(t *testing.T) { ...@@ -84,7 +85,7 @@ func TestCreate(t *testing.T) {
&extensions.Job{ &extensions.Job{
Spec: extensions.JobSpec{ Spec: extensions.JobSpec{
Completions: validJob.Spec.Completions, Completions: validJob.Spec.Completions,
Selector: &extensions.LabelSelector{}, Selector: &unversioned.LabelSelector{},
Template: validJob.Spec.Template, Template: validJob.Spec.Template,
}, },
}, },
...@@ -108,7 +109,7 @@ func TestUpdate(t *testing.T) { ...@@ -108,7 +109,7 @@ func TestUpdate(t *testing.T) {
// invalid updateFunc // invalid updateFunc
func(obj runtime.Object) runtime.Object { func(obj runtime.Object) runtime.Object {
object := obj.(*extensions.Job) object := obj.(*extensions.Job)
object.Spec.Selector = &extensions.LabelSelector{} object.Spec.Selector = &unversioned.LabelSelector{}
return object return object
}, },
func(obj runtime.Object) runtime.Object { func(obj runtime.Object) runtime.Object {
......
...@@ -22,6 +22,7 @@ import ( ...@@ -22,6 +22,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
apitesting "k8s.io/kubernetes/pkg/api/testing" apitesting "k8s.io/kubernetes/pkg/api/testing"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
) )
...@@ -35,7 +36,7 @@ func TestJobStrategy(t *testing.T) { ...@@ -35,7 +36,7 @@ func TestJobStrategy(t *testing.T) {
t.Errorf("Job should not allow create on update") t.Errorf("Job should not allow create on update")
} }
validSelector := &extensions.LabelSelector{ validSelector := &unversioned.LabelSelector{
MatchLabels: map[string]string{"a": "b"}, MatchLabels: map[string]string{"a": "b"},
} }
validPodTemplateSpec := api.PodTemplateSpec{ validPodTemplateSpec := api.PodTemplateSpec{
...@@ -100,7 +101,7 @@ func TestJobStatusStrategy(t *testing.T) { ...@@ -100,7 +101,7 @@ func TestJobStatusStrategy(t *testing.T) {
if StatusStrategy.AllowCreateOnUpdate() { if StatusStrategy.AllowCreateOnUpdate() {
t.Errorf("Job should not allow create on update") t.Errorf("Job should not allow create on update")
} }
validSelector := &extensions.LabelSelector{ validSelector := &unversioned.LabelSelector{
MatchLabels: map[string]string{"a": "b"}, MatchLabels: map[string]string{"a": "b"},
} }
validPodTemplateSpec := api.PodTemplateSpec{ validPodTemplateSpec := api.PodTemplateSpec{
......
...@@ -147,7 +147,7 @@ var _ = Describe("Daemon set [Feature:DaemonSet]", func() { ...@@ -147,7 +147,7 @@ var _ = Describe("Daemon set [Feature:DaemonSet]", func() {
Name: dsName, Name: dsName,
}, },
Spec: extensions.DaemonSetSpec{ Spec: extensions.DaemonSetSpec{
Selector: &extensions.LabelSelector{MatchLabels: complexLabel}, Selector: &unversioned.LabelSelector{MatchLabels: complexLabel},
Template: api.PodTemplateSpec{ Template: api.PodTemplateSpec{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Labels: complexLabel, Labels: complexLabel,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment