diff --git a/pkg/api/v1/conversion.go b/pkg/api/v1/conversion.go index 1a4d36d4343..0adf467f9af 100644 --- a/pkg/api/v1/conversion.go +++ b/pkg/api/v1/conversion.go @@ -87,7 +87,8 @@ func addConversionFuncs(scheme *runtime.Scheme) { "metadata.annotations", "status.phase", "status.podIP", - "spec.nodeName": + "spec.nodeName", + "spec.restartPolicy": return label, value, nil // This is for backwards compatibility with old v1 clients which send spec.host case "spec.host": diff --git a/pkg/registry/pod/strategy.go b/pkg/registry/pod/strategy.go index ffdeb988ef1..d739f92a837 100644 --- a/pkg/registry/pod/strategy.go +++ b/pkg/registry/pod/strategy.go @@ -173,8 +173,9 @@ func MatchPod(label labels.Selector, field fields.Selector) generic.Matcher { func PodToSelectableFields(pod *api.Pod) fields.Set { objectMetaFieldsSet := generic.ObjectMetaFieldsSet(pod.ObjectMeta, true) podSpecificFieldsSet := fields.Set{ - "spec.nodeName": pod.Spec.NodeName, - "status.phase": string(pod.Status.Phase), + "spec.nodeName": pod.Spec.NodeName, + "spec.restartPolicy": string(pod.Spec.RestartPolicy), + "status.phase": string(pod.Status.Phase), } return generic.MergeFieldsSets(objectMetaFieldsSet, podSpecificFieldsSet) } diff --git a/pkg/registry/pod/strategy_test.go b/pkg/registry/pod/strategy_test.go index 08ed1680e18..77d343b5219 100644 --- a/pkg/registry/pod/strategy_test.go +++ b/pkg/registry/pod/strategy_test.go @@ -24,10 +24,71 @@ import ( "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/testapi" apitesting "k8s.io/kubernetes/pkg/api/testing" + "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/runtime" ) +func TestMatchPod(t *testing.T) { + testCases := []struct { + in *api.Pod + fieldSelector fields.Selector + expectMatch bool + }{ + { + in: &api.Pod{ + Spec: api.PodSpec{NodeName: "nodeA"}, + }, + fieldSelector: fields.ParseSelectorOrDie("spec.nodeName=nodeA"), + expectMatch: true, + }, + { + in: &api.Pod{ + Spec: api.PodSpec{NodeName: "nodeB"}, + }, + fieldSelector: fields.ParseSelectorOrDie("spec.nodeName=nodeA"), + expectMatch: false, + }, + { + in: &api.Pod{ + Spec: api.PodSpec{RestartPolicy: api.RestartPolicyAlways}, + }, + fieldSelector: fields.ParseSelectorOrDie("spec.restartPolicy=Always"), + expectMatch: true, + }, + { + in: &api.Pod{ + Spec: api.PodSpec{RestartPolicy: api.RestartPolicyAlways}, + }, + fieldSelector: fields.ParseSelectorOrDie("spec.restartPolicy=Never"), + expectMatch: false, + }, + { + in: &api.Pod{ + Status: api.PodStatus{Phase: api.PodRunning}, + }, + fieldSelector: fields.ParseSelectorOrDie("status.phase=Running"), + expectMatch: true, + }, + { + in: &api.Pod{ + Status: api.PodStatus{Phase: api.PodRunning}, + }, + fieldSelector: fields.ParseSelectorOrDie("status.phase=Pending"), + expectMatch: false, + }, + } + for _, testCase := range testCases { + result, err := MatchPod(labels.Everything(), testCase.fieldSelector).Matches(testCase.in) + if err != nil { + t.Errorf("Unexpected error %v", err) + } + if result != testCase.expectMatch { + t.Errorf("Result %v, Expected %v, Selector: %v, Pod: %v", result, testCase.expectMatch, testCase.fieldSelector.String(), testCase.in) + } + } +} + func TestCheckGracefulDelete(t *testing.T) { defaultGracePeriod := int64(30) tcs := []struct {