move daemonset to generalized label selector

This commit is contained in:
Mike Danese
2015-10-25 23:11:09 -07:00
parent abbed4f7e8
commit 7a7f31ead1
13 changed files with 91 additions and 64 deletions

View File

@@ -298,7 +298,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 map[string]string `json:"selector,omitempty"`
Selector *PodSelector `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

View File

@@ -35,8 +35,10 @@ func addDefaultingFuncs() {
}
// TODO: support templates defined elsewhere when we support them in the API
if labels != nil {
if len(obj.Spec.Selector) == 0 {
obj.Spec.Selector = labels
if obj.Spec.Selector == nil {
obj.Spec.Selector = &PodSelector{
MatchLabels: labels,
}
}
if len(obj.Labels) == 0 {
obj.Labels = labels

View File

@@ -296,7 +296,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 map[string]string `json:"selector,omitempty"`
Selector *PodSelector `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

View File

@@ -185,26 +185,26 @@ func ValidateDaemonSetTemplateUpdate(podTemplate, oldPodTemplate *api.PodTemplat
func ValidateDaemonSetSpec(spec *extensions.DaemonSetSpec) errs.ValidationErrorList {
allErrs := errs.ValidationErrorList{}
selector := labels.Set(spec.Selector).AsSelector()
if selector.Empty() {
allErrs = append(allErrs, errs.NewFieldRequired("selector"))
}
allErrs = append(allErrs, ValidatePodSelector(spec.Selector)...)
if spec.Template == nil {
allErrs = append(allErrs, errs.NewFieldRequired("template"))
} else {
labels := labels.Set(spec.Template.Labels)
if !selector.Matches(labels) {
allErrs = append(allErrs, errs.NewFieldInvalid("template.metadata.labels", spec.Template.Labels, "selector does not match template"))
}
allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpec(spec.Template).Prefix("template")...)
// Daemons typically run on more than one node, so mark Read-Write persistent disks as invalid.
allErrs = append(allErrs, apivalidation.ValidateReadOnlyPersistentDisks(spec.Template.Spec.Volumes).Prefix("template.spec.volumes")...)
// RestartPolicy has already been first-order validated as per ValidatePodTemplateSpec().
if spec.Template.Spec.RestartPolicy != api.RestartPolicyAlways {
allErrs = append(allErrs, errs.NewFieldValueNotSupported("template.spec.restartPolicy", spec.Template.Spec.RestartPolicy, []string{string(api.RestartPolicyAlways)}))
}
return allErrs
}
selector, err := extensions.PodSelectorAsSelector(spec.Selector)
if err == nil && !selector.Matches(labels.Set(spec.Template.Labels)) {
allErrs = append(allErrs, errs.NewFieldInvalid("template.metadata.labels", spec.Template.Labels, "selector does not match template"))
}
allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpec(spec.Template).Prefix("template")...)
// Daemons typically run on more than one node, so mark Read-Write persistent disks as invalid.
allErrs = append(allErrs, apivalidation.ValidateReadOnlyPersistentDisks(spec.Template.Spec.Volumes).Prefix("template.spec.volumes")...)
// RestartPolicy has already been first-order validated as per ValidatePodTemplateSpec().
if spec.Template.Spec.RestartPolicy != api.RestartPolicyAlways {
allErrs = append(allErrs, errs.NewFieldValueNotSupported("template.spec.restartPolicy", spec.Template.Spec.RestartPolicy, []string{string(api.RestartPolicyAlways)}))
}
return allErrs
}
@@ -226,7 +226,6 @@ func ValidatePositiveIntOrPercent(intOrPercent util.IntOrString, fieldName strin
if !validation.IsValidPercent(intOrPercent.StrVal) {
allErrs = append(allErrs, errs.NewFieldInvalid(fieldName, intOrPercent, "value should be int(5) or percentage(5%)"))
}
} else if intOrPercent.Kind == util.IntstrInt {
allErrs = append(allErrs, apivalidation.ValidatePositiveField(int64(intOrPercent.IntVal), fieldName)...)
}

View File

@@ -369,14 +369,14 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateAbc.Template,
},
},
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateAbc.Template,
},
},
@@ -385,14 +385,14 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateAbc.Template,
},
},
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector2,
Selector: &extensions.PodSelector{MatchLabels: validSelector2},
Template: &validPodTemplateAbc2.Template,
},
},
@@ -401,14 +401,14 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateAbc.Template,
},
},
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateNodeSelector.Template,
},
},
@@ -426,14 +426,14 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateAbc.Template,
},
},
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateAbc.Template,
},
},
@@ -442,14 +442,14 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateAbc.Template,
},
},
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: invalidSelector,
Selector: &extensions.PodSelector{MatchLabels: invalidSelector},
Template: &validPodTemplateAbc.Template,
},
},
@@ -458,14 +458,14 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateAbc.Template,
},
},
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &invalidPodTemplate.Template,
},
},
@@ -474,14 +474,14 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateAbc.Template,
},
},
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateDef.Template,
},
},
@@ -490,14 +490,14 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplateAbc.Template,
},
},
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &readWriteVolumePodTemplate.Template,
},
},
@@ -540,14 +540,14 @@ func TestValidateDaemonSet(t *testing.T) {
{
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplate.Template,
},
},
{
ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplate.Template,
},
},
@@ -562,14 +562,14 @@ func TestValidateDaemonSet(t *testing.T) {
"zero-length ID": {
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplate.Template,
},
},
"missing-namespace": {
ObjectMeta: api.ObjectMeta{Name: "abc-123"},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplate.Template,
},
},
@@ -582,14 +582,14 @@ func TestValidateDaemonSet(t *testing.T) {
"selector_doesnt_match": {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: map[string]string{"foo": "bar"},
Selector: &extensions.PodSelector{MatchLabels: map[string]string{"foo": "bar"}},
Template: &validPodTemplate.Template,
},
},
"invalid manifest": {
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
},
},
"invalid_label": {
@@ -601,7 +601,7 @@ func TestValidateDaemonSet(t *testing.T) {
},
},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplate.Template,
},
},
@@ -626,7 +626,7 @@ func TestValidateDaemonSet(t *testing.T) {
},
},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &validPodTemplate.Template,
},
},
@@ -636,7 +636,7 @@ func TestValidateDaemonSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &api.PodTemplateSpec{
Spec: api.PodSpec{
RestartPolicy: api.RestartPolicyOnFailure,
@@ -655,7 +655,7 @@ func TestValidateDaemonSet(t *testing.T) {
Namespace: api.NamespaceDefault,
},
Spec: extensions.DaemonSetSpec{
Selector: validSelector,
Selector: &extensions.PodSelector{MatchLabels: validSelector},
Template: &api.PodTemplateSpec{
Spec: api.PodSpec{
RestartPolicy: api.RestartPolicyNever,