From 34a7b3dea8739abfc113c4e42935289ac1e89d64 Mon Sep 17 00:00:00 2001 From: Yang Guo Date: Wed, 22 Nov 2017 11:02:20 -0800 Subject: [PATCH] Create a separate conversion function for the field labels used by downward API --- pkg/apis/core/BUILD | 1 + pkg/apis/core/pods/BUILD | 30 +++++++++ pkg/apis/core/pods/helpers.go | 51 +++++++++++++++ pkg/apis/core/pods/helpers_test.go | 87 ++++++++++++++++++++++++++ pkg/apis/core/v1/conversion.go | 7 +-- pkg/apis/core/validation/BUILD | 1 + pkg/apis/core/validation/validation.go | 4 +- pkg/kubelet/BUILD | 2 +- pkg/kubelet/kubelet_pods.go | 4 +- 9 files changed, 176 insertions(+), 11 deletions(-) create mode 100644 pkg/apis/core/pods/BUILD create mode 100644 pkg/apis/core/pods/helpers.go create mode 100644 pkg/apis/core/pods/helpers_test.go diff --git a/pkg/apis/core/BUILD b/pkg/apis/core/BUILD index ddd461bd52..a4bdda2a88 100644 --- a/pkg/apis/core/BUILD +++ b/pkg/apis/core/BUILD @@ -51,6 +51,7 @@ filegroup( "//pkg/apis/core/fuzzer:all-srcs", "//pkg/apis/core/helper:all-srcs", "//pkg/apis/core/install:all-srcs", + "//pkg/apis/core/pods:all-srcs", "//pkg/apis/core/v1:all-srcs", "//pkg/apis/core/validation:all-srcs", ], diff --git a/pkg/apis/core/pods/BUILD b/pkg/apis/core/pods/BUILD new file mode 100644 index 0000000000..b78e256e7c --- /dev/null +++ b/pkg/apis/core/pods/BUILD @@ -0,0 +1,30 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["helpers.go"], + importpath = "k8s.io/kubernetes/pkg/apis/core/pods", + visibility = ["//visibility:public"], + deps = ["//pkg/fieldpath:go_default_library"], +) + +go_test( + name = "go_default_test", + srcs = ["helpers_test.go"], + importpath = "k8s.io/kubernetes/pkg/apis/core/pods", + library = ":go_default_library", +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/pkg/apis/core/pods/helpers.go b/pkg/apis/core/pods/helpers.go new file mode 100644 index 0000000000..0b4d14db02 --- /dev/null +++ b/pkg/apis/core/pods/helpers.go @@ -0,0 +1,51 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 pods + +import ( + "fmt" + + "k8s.io/kubernetes/pkg/fieldpath" +) + +func ConvertDownwardAPIFieldLabel(version, label, value string) (string, string, error) { + if version != "v1" { + return "", "", fmt.Errorf("unsupported pod version: %s", version) + } + + path, _ := fieldpath.SplitMaybeSubscriptedPath(label) + switch path { + case "metadata.annotations", + "metadata.labels", + "metadata.name", + "metadata.namespace", + "metadata.uid", + "spec.nodeName", + "spec.restartPolicy", + "spec.serviceAccountName", + "spec.schedulerName", + "status.phase", + "status.hostIP", + "status.podIP": + return label, value, nil + // This is for backwards compatibility with old v1 clients which send spec.host + case "spec.host": + return "spec.nodeName", value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } +} diff --git a/pkg/apis/core/pods/helpers_test.go b/pkg/apis/core/pods/helpers_test.go new file mode 100644 index 0000000000..9db95a014b --- /dev/null +++ b/pkg/apis/core/pods/helpers_test.go @@ -0,0 +1,87 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 pods + +import ( + "testing" +) + +func TestConvertDownwardAPIFieldLabel(t *testing.T) { + testCases := []struct { + version string + label string + value string + expectedErr bool + expectedLabel string + expectedValue string + }{ + { + version: "v2", + label: "metadata.name", + value: "test-pod", + expectedErr: true, + }, + { + version: "v1", + label: "invalid-label", + value: "value", + expectedErr: true, + }, + { + version: "v1", + label: "metadata.name", + value: "test-pod", + expectedLabel: "metadata.name", + expectedValue: "test-pod", + }, + { + version: "v1", + label: "metadata.annotations", + value: "myValue", + expectedLabel: "metadata.annotations", + expectedValue: "myValue", + }, + { + version: "v1", + label: "metadata.annotations['myKey']", + value: "myValue", + expectedLabel: "metadata.annotations['myKey']", + expectedValue: "myValue", + }, + { + version: "v1", + label: "spec.host", + value: "127.0.0.1", + expectedLabel: "spec.nodeName", + expectedValue: "127.0.0.1", + }, + } + for _, tc := range testCases { + label, value, err := ConvertDownwardAPIFieldLabel(tc.version, tc.label, tc.value) + if err != nil { + if tc.expectedErr { + continue + } + t.Errorf("ConvertDownwardAPIFieldLabel(%s, %s, %s) failed: %s", + tc.version, tc.label, tc.value, err) + } + if tc.expectedLabel != label || tc.expectedValue != value { + t.Errorf("ConvertDownwardAPIFieldLabel(%s, %s, %s) = (%s, %s, nil), expected (%s, %s, nil)", + tc.version, tc.label, tc.value, label, value, tc.expectedLabel, tc.expectedValue) + } + } +} diff --git a/pkg/apis/core/v1/conversion.go b/pkg/apis/core/v1/conversion.go index 70de6b9734..371982f0fb 100644 --- a/pkg/apis/core/v1/conversion.go +++ b/pkg/apis/core/v1/conversion.go @@ -159,17 +159,12 @@ func addConversionFuncs(scheme *runtime.Scheme) error { func(label, value string) (string, string, error) { path, _ := fieldpath.SplitMaybeSubscriptedPath(label) switch path { - case "metadata.annotations", - "metadata.labels", - "metadata.name", + case "metadata.name", "metadata.namespace", - "metadata.uid", "spec.nodeName", "spec.restartPolicy", - "spec.serviceAccountName", "spec.schedulerName", "status.phase", - "status.hostIP", "status.podIP": return label, value, nil // This is for backwards compatibility with old v1 clients which send spec.host diff --git a/pkg/apis/core/validation/BUILD b/pkg/apis/core/validation/BUILD index 18282ae464..e2d08109da 100644 --- a/pkg/apis/core/validation/BUILD +++ b/pkg/apis/core/validation/BUILD @@ -18,6 +18,7 @@ go_library( "//pkg/api/service:go_default_library", "//pkg/apis/core:go_default_library", "//pkg/apis/core/helper:go_default_library", + "//pkg/apis/core/pods:go_default_library", "//pkg/apis/core/v1:go_default_library", "//pkg/apis/core/v1/helper:go_default_library", "//pkg/capabilities:go_default_library", diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index cb063ad396..b3b094e3e7 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -42,10 +42,10 @@ import ( "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/kubernetes/pkg/api/legacyscheme" apiservice "k8s.io/kubernetes/pkg/api/service" "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/helper" + podshelper "k8s.io/kubernetes/pkg/apis/core/pods" corev1 "k8s.io/kubernetes/pkg/apis/core/v1" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/capabilities" @@ -1964,7 +1964,7 @@ func validateObjectFieldSelector(fs *core.ObjectFieldSelector, expressions *sets return allErrs } - internalFieldPath, _, err := legacyscheme.Scheme.ConvertFieldLabel(fs.APIVersion, "Pod", fs.FieldPath, "") + internalFieldPath, _, err := podshelper.ConvertDownwardAPIFieldLabel(fs.APIVersion, fs.FieldPath, "") if err != nil { allErrs = append(allErrs, field.Invalid(fldPath.Child("fieldPath"), fs.FieldPath, fmt.Sprintf("error converting fieldPath: %v", err))) return allErrs diff --git a/pkg/kubelet/BUILD b/pkg/kubelet/BUILD index 14874ca9ae..7fb5350124 100644 --- a/pkg/kubelet/BUILD +++ b/pkg/kubelet/BUILD @@ -29,10 +29,10 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/kubelet", deps = [ - "//pkg/api/legacyscheme:go_default_library", "//pkg/api/v1/pod:go_default_library", "//pkg/api/v1/resource:go_default_library", "//pkg/apis/core:go_default_library", + "//pkg/apis/core/pods:go_default_library", "//pkg/apis/core/v1:go_default_library", "//pkg/apis/core/v1/helper:go_default_library", "//pkg/apis/core/v1/helper/qos:go_default_library", diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index 8a18074742..233787c86c 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -43,9 +43,9 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/remotecommand" - "k8s.io/kubernetes/pkg/api/legacyscheme" podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/api/v1/resource" + podshelper "k8s.io/kubernetes/pkg/apis/core/pods" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" "k8s.io/kubernetes/pkg/apis/core/v1/validation" @@ -733,7 +733,7 @@ func (kl *Kubelet) makeEnvironmentVariables(pod *v1.Pod, container *v1.Container // podFieldSelectorRuntimeValue returns the runtime value of the given // selector for a pod. func (kl *Kubelet) podFieldSelectorRuntimeValue(fs *v1.ObjectFieldSelector, pod *v1.Pod, podIP string) (string, error) { - internalFieldPath, _, err := legacyscheme.Scheme.ConvertFieldLabel(fs.APIVersion, "Pod", fs.FieldPath, "") + internalFieldPath, _, err := podshelper.ConvertDownwardAPIFieldLabel(fs.APIVersion, fs.FieldPath, "") if err != nil { return "", err }