diff --git a/pkg/client/cache/listers.go b/pkg/client/cache/listers.go index 060e74e7f78..12c81b1ae47 100644 --- a/pkg/client/cache/listers.go +++ b/pkg/client/cache/listers.go @@ -382,11 +382,9 @@ func (s *StoreToJobLister) GetPodJobs(pod *api.Pod) (jobs []extensions.Job, err if job.Namespace != pod.Namespace { continue } - labelSet := labels.Set(job.Spec.Selector) - selector = labels.Set(job.Spec.Selector).AsSelector() - // Job with a nil or empty selector match nothing - if labelSet.AsSelector().Empty() || !selector.Matches(labels.Set(pod.Labels)) { + selector, _ = extensions.PodSelectorAsSelector(job.Spec.Selector) + if !selector.Matches(labels.Set(pod.Labels)) { continue } jobs = append(jobs, job) diff --git a/pkg/controller/job/controller.go b/pkg/controller/job/controller.go index f2f702c3085..1c13cca161c 100644 --- a/pkg/controller/job/controller.go +++ b/pkg/controller/job/controller.go @@ -313,7 +313,8 @@ func (jm *JobController) syncJob(key string) error { return err } jobNeedsSync := jm.expectations.SatisfiedExpectations(jobKey) - podList, err := jm.podStore.Pods(job.Namespace).List(labels.Set(job.Spec.Selector).AsSelector()) + selector, _ := extensions.PodSelectorAsSelector(job.Spec.Selector) + podList, err := jm.podStore.Pods(job.Namespace).List(selector) if err != nil { glog.Errorf("Error getting pods for job %q: %v", key, err) jm.queue.Add(key) diff --git a/pkg/controller/job/controller_test.go b/pkg/controller/job/controller_test.go index 21f1f177518..25adf5ff858 100644 --- a/pkg/controller/job/controller_test.go +++ b/pkg/controller/job/controller_test.go @@ -43,7 +43,9 @@ func newJob(parallelism, completions int) *extensions.Job { Spec: extensions.JobSpec{ Parallelism: ¶llelism, Completions: &completions, - Selector: map[string]string{"foo": "bar"}, + Selector: &extensions.PodSelector{ + MatchLabels: map[string]string{"foo": "bar"}, + }, Template: api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ Labels: map[string]string{ @@ -76,7 +78,7 @@ func newPodList(count int, status api.PodPhase, job *extensions.Job) []api.Pod { newPod := api.Pod{ ObjectMeta: api.ObjectMeta{ Name: fmt.Sprintf("pod-%v", unversioned.Now().UnixNano()), - Labels: job.Spec.Selector, + Labels: job.Spec.Selector.MatchLabels, Namespace: job.Namespace, }, Status: api.PodStatus{Phase: status}, @@ -289,7 +291,9 @@ func TestJobPodLookup(t *testing.T) { job: &extensions.Job{ ObjectMeta: api.ObjectMeta{Name: "foo"}, Spec: extensions.JobSpec{ - Selector: map[string]string{"foo": "bar"}, + Selector: &extensions.PodSelector{ + MatchLabels: map[string]string{"foo": "bar"}, + }, }, }, pod: &api.Pod{ @@ -306,7 +310,15 @@ func TestJobPodLookup(t *testing.T) { job: &extensions.Job{ ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"}, Spec: extensions.JobSpec{ - Selector: map[string]string{"foo": "bar"}, + Selector: &extensions.PodSelector{ + MatchExpressions: []extensions.PodSelectorRequirement{ + { + Key: "foo", + Operator: extensions.PodSelectorOpIn, + Values: []string{"bar"}, + }, + }, + }, }, }, pod: &api.Pod{ diff --git a/pkg/kubectl/describe.go b/pkg/kubectl/describe.go index 8966b0cf618..462d62c9711 100644 --- a/pkg/kubectl/describe.go +++ b/pkg/kubectl/describe.go @@ -885,7 +885,8 @@ func describeJob(job *extensions.Job, events *api.EventList) (string, error) { fmt.Fprintf(out, "Name:\t%s\n", job.Name) 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, "Selector:\t%s\n", labels.FormatLabels(job.Spec.Selector)) + selector, _ := extensions.PodSelectorAsSelector(job.Spec.Selector) + fmt.Fprintf(out, "Selector:\t%s\n", selector) fmt.Fprintf(out, "Parallelism:\t%d\n", *job.Spec.Parallelism) fmt.Fprintf(out, "Completions:\t%d\n", *job.Spec.Completions) fmt.Fprintf(out, "Labels:\t%s\n", labels.FormatLabels(job.Labels)) diff --git a/pkg/kubectl/resource_printer.go b/pkg/kubectl/resource_printer.go index 3937cd9cf7f..e7f83f45e0b 100644 --- a/pkg/kubectl/resource_printer.go +++ b/pkg/kubectl/resource_printer.go @@ -736,11 +736,13 @@ func printJob(job *extensions.Job, w io.Writer, withNamespace bool, wide bool, s return err } } + + selector, _ := extensions.PodSelectorAsSelector(job.Spec.Selector) _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%d\n", name, firstContainer.Name, firstContainer.Image, - labels.FormatLabels(job.Spec.Selector), + selector.String(), job.Status.Succeeded) if err != nil { return err diff --git a/pkg/kubectl/stop_test.go b/pkg/kubectl/stop_test.go index c640d7712da..d5b645353c6 100644 --- a/pkg/kubectl/stop_test.go +++ b/pkg/kubectl/stop_test.go @@ -293,7 +293,10 @@ func TestJobStop(t *testing.T) { }, Spec: extensions.JobSpec{ Parallelism: &zero, - Selector: map[string]string{"k1": "v1"}}, + Selector: &extensions.PodSelector{ + MatchLabels: map[string]string{"k1": "v1"}, + }, + }, }, &extensions.JobList{ // LIST Items: []extensions.Job{ @@ -304,7 +307,10 @@ func TestJobStop(t *testing.T) { }, Spec: extensions.JobSpec{ Parallelism: &zero, - Selector: map[string]string{"k1": "v1"}}, + Selector: &extensions.PodSelector{ + MatchLabels: map[string]string{"k1": "v1"}, + }, + }, }, }, }, diff --git a/pkg/registry/job/etcd/etcd_test.go b/pkg/registry/job/etcd/etcd_test.go index 399e2547952..19c43e57d01 100644 --- a/pkg/registry/job/etcd/etcd_test.go +++ b/pkg/registry/job/etcd/etcd_test.go @@ -47,7 +47,9 @@ func validNewJob() *extensions.Job { Spec: extensions.JobSpec{ Completions: &completions, Parallelism: ¶llelism, - Selector: map[string]string{"a": "b"}, + Selector: &extensions.PodSelector{ + MatchLabels: map[string]string{"a": "b"}, + }, Template: api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ Labels: map[string]string{"a": "b"}, @@ -80,7 +82,7 @@ func TestCreate(t *testing.T) { &extensions.Job{ Spec: extensions.JobSpec{ Completions: validJob.Spec.Completions, - Selector: map[string]string{}, + Selector: &extensions.PodSelector{}, Template: validJob.Spec.Template, }, }, @@ -103,7 +105,7 @@ func TestUpdate(t *testing.T) { // invalid updateFunc func(obj runtime.Object) runtime.Object { object := obj.(*extensions.Job) - object.Spec.Selector = map[string]string{} + object.Spec.Selector = &extensions.PodSelector{} return object }, func(obj runtime.Object) runtime.Object { diff --git a/pkg/registry/job/strategy_test.go b/pkg/registry/job/strategy_test.go index 6b90786128e..376d5ac76f1 100644 --- a/pkg/registry/job/strategy_test.go +++ b/pkg/registry/job/strategy_test.go @@ -32,10 +32,12 @@ func TestJobStrategy(t *testing.T) { t.Errorf("Job should not allow create on update") } - validSelector := map[string]string{"a": "b"} + validSelector := &extensions.PodSelector{ + MatchLabels: map[string]string{"a": "b"}, + } validPodTemplateSpec := api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ - Labels: validSelector, + Labels: validSelector.MatchLabels, }, Spec: api.PodSpec{ RestartPolicy: api.RestartPolicyOnFailure, @@ -95,10 +97,12 @@ func TestJobStatusStrategy(t *testing.T) { if StatusStrategy.AllowCreateOnUpdate() { t.Errorf("Job should not allow create on update") } - validSelector := map[string]string{"a": "b"} + validSelector := &extensions.PodSelector{ + MatchLabels: map[string]string{"a": "b"}, + } validPodTemplateSpec := api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ - Labels: validSelector, + Labels: validSelector.MatchLabels, }, Spec: api.PodSpec{ RestartPolicy: api.RestartPolicyOnFailure,