diff --git a/build/BUILD b/build/BUILD index 7f4148d453a..cc2e846cb6f 100644 --- a/build/BUILD +++ b/build/BUILD @@ -124,6 +124,7 @@ release_filegroup( name = "client-targets", conditioned_srcs = for_platforms(for_client = [ "//cmd/kubectl", + "//cmd/kubectl-convert", ]), ) diff --git a/cmd/kubectl-convert/BUILD b/cmd/kubectl-convert/BUILD index 81d97a72154..55701676e72 100644 --- a/cmd/kubectl-convert/BUILD +++ b/cmd/kubectl-convert/BUILD @@ -6,7 +6,7 @@ load( load("//staging/src/k8s.io/component-base/version:def.bzl", "version_x_defs") go_binary( - name = "kubectl", + name = "kubectl-convert", embed = [":go_default_library"], pure = "on", visibility = ["//visibility:public"], diff --git a/hack/lib/golang.sh b/hack/lib/golang.sh index 6615d05e2d8..ea29e3516e6 100755 --- a/hack/lib/golang.sh +++ b/hack/lib/golang.sh @@ -248,6 +248,7 @@ kube::golang::setup_platforms # If you update this list, please also update build/BUILD. readonly KUBE_CLIENT_TARGETS=( cmd/kubectl + cmd/kubectl-convert ) readonly KUBE_CLIENT_BINARIES=("${KUBE_CLIENT_TARGETS[@]##*/}") readonly KUBE_CLIENT_BINARIES_WIN=("${KUBE_CLIENT_BINARIES[@]/%/.exe}") diff --git a/test/cmd/convert.sh b/test/cmd/convert.sh new file mode 100644 index 00000000000..e00ba4f7d6d --- /dev/null +++ b/test/cmd/convert.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash + +# Copyright 2021 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. + +set -o errexit +set -o nounset +set -o pipefail + +run_convert_tests() { + set -o nounset + set -o errexit + + ### Convert deployment YAML file locally without affecting the live deployment + # Pre-condition: no deployments exist + kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" '' + # Command + # Create a deployment (revision 1) + kubectl create -f hack/testdata/deployment-revision1.yaml "${kube_flags[@]:?}" + kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" 'nginx:' + kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + # Command + output_message=$(kubectl convert --local -f hack/testdata/deployment-revision1.yaml --output-version=apps/v1beta1 -o yaml "${kube_flags[@]:?}") + # Post-condition: apiVersion is still apps/v1 in the live deployment, but command output is the new value + kube::test::get_object_assert 'deployment nginx' "{{ .apiVersion }}" 'apps/v1' + kube::test::if_has_string "${output_message}" "apps/v1beta1" + # Clean up + kubectl delete deployment nginx "${kube_flags[@]:?}" + + ## Convert multiple busybox PODs recursively from directory of YAML files + # Command + output_message=$(! kubectl-convert -f hack/testdata/recursive/pod --recursive 2>&1 "${kube_flags[@]:?}") + # Post-condition: busybox0 & busybox1 PODs are converted, and since busybox2 is malformed, it should error + kube::test::if_has_string "${output_message}" "Object 'Kind' is missing" + + # check that convert command supports --template output + output_message=$(kubectl-convert "${kube_flags[@]:?}" -f hack/testdata/deployment-revision1.yaml --output-version=apps/v1beta2 --template="{{ .metadata.name }}:") + kube::test::if_has_string "${output_message}" 'nginx:' + + set +o nounset + set +o errexit +} diff --git a/test/cmd/legacy-script.sh b/test/cmd/legacy-script.sh index f8751056b03..e5e4249b474 100755 --- a/test/cmd/legacy-script.sh +++ b/test/cmd/legacy-script.sh @@ -33,6 +33,7 @@ source "${KUBE_ROOT}/test/cmd/authentication.sh" source "${KUBE_ROOT}/test/cmd/authorization.sh" source "${KUBE_ROOT}/test/cmd/batch.sh" source "${KUBE_ROOT}/test/cmd/certificate.sh" +source "${KUBE_ROOT}/test/cmd/convert.sh" source "${KUBE_ROOT}/test/cmd/core.sh" source "${KUBE_ROOT}/test/cmd/crd.sh" source "${KUBE_ROOT}/test/cmd/create.sh" @@ -298,7 +299,7 @@ setup() { kube::util::ensure-gnu-sed kube::log::status "Building kubectl" - make -C "${KUBE_ROOT}" WHAT="cmd/kubectl" + make -C "${KUBE_ROOT}" WHAT="cmd/kubectl cmd/kubectl-convert" # Check kubectl kube::log::status "Running kubectl with no options" @@ -561,6 +562,13 @@ runTests() { record_command run_kubectl_create_kustomization_directory_tests fi + ###################### + # Convert # + ###################### + if kube::test::if_supports_resource "${deployments}"; then + record_command run_convert_tests + fi + ###################### # Delete # ######################