diff --git a/.zuul.yaml b/.zuul.yaml new file mode 100644 index 0000000000..98ed52add8 --- /dev/null +++ b/.zuul.yaml @@ -0,0 +1,28 @@ +- project: + name: kubernetes-sigs/cluster-api-provider-openstack + check: + jobs: + - cluster-api-provider-openstack-current-acceptance-test-v1.18 + +- job: + name: cluster-api-provider-openstack-conformance-pr + parent: init-test + timeout: 36000 + description: | + Test CAPO & Kubernetes + run: .zuul/playbooks/run.yaml + nodeset: ubuntu-bionic-large + vars: + go_version: '1.13.8' + k8s_log_dir: '{{ ansible_user_dir }}/workspace/logs/_artifacts' + k8s_os_capi_provider_src_dir: '{{ ansible_user_dir }}/src/sigs.k8s.io/cluster-api-provider-openstack' + extra_args: '' + +- job: + name: cluster-api-provider-openstack-current-acceptance-test-v1.18 + parent: cluster-api-provider-openstack-conformance-pr + description: | + Test CAPO current against Kubernetes release-1.18 + vars: + k8s_version_series: '1.18' + extra_args: '--use-ci-artifacts' diff --git a/.zuul/playbooks/run.yaml b/.zuul/playbooks/run.yaml new file mode 100644 index 0000000000..d2425a2678 --- /dev/null +++ b/.zuul/playbooks/run.yaml @@ -0,0 +1,90 @@ +- hosts: all + become: yes + pre_tasks: + - name: Enable nested virt + shell: + cmd: | + # enable nested virt + cat /sys/module/kvm_intel/parameters/nested + sudo rmmod kvm-intel + sudo sh -c "echo 'options kvm-intel nested=y' >> /etc/modprobe.d/dist.conf" + sudo modprobe kvm-intel + cat /sys/module/kvm_intel/parameters/nested + modinfo kvm_intel | grep nested + roles: + - move-k8s-repo-to-k8s-specific-dir + - config-golang + - clone-devstack-gate-to-workspace + - role: create-devstack-local-conf + enable_services: + - 'nova' + - 'neutron' + - 'keystone' + - 'glance' + - role: install-devstack + environment: + USE_PYTHON3: 'True' + DEVSTACK_GATE_LIBVIRT_TYPE: 'kvm' + OS_BRANCH: 'stable/train' + OVERRIDE_ENABLED_SERVICES: 'dstat,etcd3,g-api,g-reg,key,mysql,n-api,n-api-meta,n-cond,n-cpu,n-novnc,n-sch,placement-api,q-agt,q-dhcp,q-l3,q-meta,q-metering,q-svc,rabbit' + tasks: + - name: Run kubernetes E2E conformance tests with ClusterAPI OpenStack + shell: + cmd: | + set -xeo pipefail + + source /opt/stack/new/devstack/openrc admin admin + + # Print some infos + nova hypervisor-stats + openstack host list + openstack usage list + openstack project list + openstack network list + openstack subnet list + openstack image list + openstack flavor list + openstack server list + openstack availability zone list + openstack domain list + + openstack flavor delete m1.small + openstack flavor create --ram 4096 --disk 10 --vcpus 2 --public --id 2 m1.small --property hw_rng:allowed='True' + openstack flavor delete m1.medium + openstack flavor create --ram 6144 --disk 10 --vcpus 4 --public --id 3 m1.medium --property hw_rng:allowed='True' + + # Switch to demo project + source /opt/stack/new/devstack/openrc admin demo + + # Create clouds.yaml + cat << EOF >> /tmp/clouds.yaml + clouds: + capi-quickstart: + auth: + username: ${OS_USERNAME} + password: ${OS_PASSWORD} + user_domain_id: ${OS_USER_DOMAIN_NAME} + auth_url: ${OS_AUTH_URL} + domain_id: default + project_name: demo + verify: false + region_name: RegionOne + EOF + cat /tmp/clouds.yaml + + export ARTIFACTS=/home/zuul/workspace/logs/_artifacts + export KUBERNETES_VERSION_SERIES={{ k8s_version_series }} + export OPENSTACK_CONTROLPLANE_IP="172.24.5.24" + export OPENSTACK_DNS_NAMESERVERS=8.8.8.8 + export CONTROL_PLANE_MACHINE_COUNT=1 + export WORKER_MACHINE_COUNT=1 + + ./hack/ci/e2e-conformance.sh --install-prereqs --run-tests-parallel --delete-cluster {{ extra_args }} + + # Print some infos + ps aux + df -h + + executable: /bin/bash + chdir: '{{ k8s_os_capi_provider_src_dir }}' + environment: '{{ global_env }}' diff --git a/Makefile b/Makefile index c31c10a38a..5f6c13e47a 100644 --- a/Makefile +++ b/Makefile @@ -301,7 +301,7 @@ OPENSTACK_EXTERNAL_NETWORK_ID ?= "" OPENSTACK_DNS_NAMESERVERS ?= "" OPENSTACK_IMAGE_NAME ?= "ubuntu-1910-kube-v1.17.3" OPENSTACK_SSH_AUTHORIZED_KEY ?= "" -OPENSTACK_NODE_MACHINE_FLAVOR ?= "m1.medium" +OPENSTACK_NODE_MACHINE_FLAVOR ?= "m1.small" OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR ?= "m1.medium" CLUSTER_NAME ?= "capi-quickstart" OPENSTACK_CLUSTER_TEMPLATE ?= "./templates/cluster-template-without-lb.yaml" @@ -311,7 +311,7 @@ WORKER_MACHINE_COUNT ?= "3" LOAD_IMAGE=$(CONTROLLER_IMG)-$(ARCH):$(TAG) .PHONY: create-cluster -create-cluster: $(CLUSTERCTL) $(ENVSUBST) ## Create a development Kubernetes cluster on OpenStack in a KIND management cluster. +create-cluster: $(CLUSTERCTL) $(KUSTOMIZE) $(ENVSUBST) ## Create a development Kubernetes cluster on OpenStack in a KIND management cluster. # Create clusterctl.yaml to use local OpenStack provider mkdir -p ./out/infrastructure-openstack/v0.3.0 @@ -339,7 +339,7 @@ create-cluster: $(CLUSTERCTL) $(ENVSUBST) ## Create a development Kubernetes clu # (Re-)deploy CAPO provider MANIFEST_IMG=$(CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) $(MAKE) set-manifest-image - kustomize build config > ./out/infrastructure-openstack/v0.3.0/infrastructure-components.yaml + $(KUSTOMIZE) build config > ./out/infrastructure-openstack/v0.3.0/infrastructure-components.yaml $(CLUSTERCTL) delete --infrastructure openstack --include-namespace --namespace capo-system || true kubectl wait --for=delete ns/capo-system || true $(CLUSTERCTL) init --config ./out/clusterctl.yaml --infrastructure openstack @@ -356,6 +356,10 @@ create-cluster: $(CLUSTERCTL) $(ENVSUBST) ## Create a development Kubernetes clu kubectl wait --for condition=established --timeout=60s crds/openstackmachinetemplates.infrastructure.cluster.x-k8s.io kubectl wait --for condition=established --timeout=60s crds/openstackclusters.infrastructure.cluster.x-k8s.io + # Wait until everything is really ready, as we had some problems with pods being ready but not yet + # available when deploying the cluster. + sleep 5 + # Create Cluster. kubectl create ns $(CLUSTER_NAME) || true PULL_POLICY=$(PULL_POLICY) \ @@ -375,19 +379,41 @@ create-cluster: $(CLUSTERCTL) $(ENVSUBST) ## Create a development Kubernetes clu --from=$(OPENSTACK_CLUSTER_TEMPLATE) \ --kubernetes-version $(KUBERNETES_VERSION) \ --control-plane-machine-count=$(CONTROL_PLANE_MACHINE_COUNT) \ - --worker-machine-count=$(WORKER_MACHINE_COUNT) \ - --target-namespace=$(CLUSTER_NAME) | kubectl apply -f - + --worker-machine-count=$(WORKER_MACHINE_COUNT) > ./hack/ci/e2e-conformance/cluster.yaml + + # Patch Kubernetes version + cat ./hack/ci/e2e-conformance/e2e-conformance_patch.yaml.tpl | \ + sed "s|\$${OPENSTACK_CLOUD_PROVIDER_CONF_B64}|$(OPENSTACK_CLOUD_PROVIDER_CONF_B64)|" | \ + sed "s|\$${OPENSTACK_CLOUD_CACERT_B64}|$(OPENSTACK_CLOUD_CACERT_B64)|" | \ + sed "s|\$${KUBERNETES_VERSION}|$(KUBERNETES_VERSION)|" | \ + sed "s|\$${CLUSTER_NAME}|$(CLUSTER_NAME)|" \ + > ./hack/ci/e2e-conformance/e2e-conformance_patch.yaml + $(KUSTOMIZE) build --reorder=none hack/ci/e2e-conformance > ./out/cluster.yaml + + # Deploy cluster + kubectl apply -f ./out/cluster.yaml # Wait for the kubeconfig to become available. - timeout 300 bash -c "while ! kubectl -n $(CLUSTER_NAME) get secrets | grep $(CLUSTER_NAME)-kubeconfig; do sleep 1; done" + timeout 300 bash -c "while ! kubectl get secrets | grep $(CLUSTER_NAME)-kubeconfig; do sleep 10; done" # Get kubeconfig and store it locally. - kubectl -n $(CLUSTER_NAME) get secrets $(CLUSTER_NAME)-kubeconfig -o json | jq -r .data.value | base64 --decode > ./kubeconfig - timeout 900 bash -c "while ! kubectl --kubeconfig=./kubeconfig get nodes | grep master; do sleep 1; done" + kubectl get secrets $(CLUSTER_NAME)-kubeconfig -o json | jq -r .data.value | base64 --decode > ./kubeconfig + timeout 900 bash -c "while ! kubectl --kubeconfig=./kubeconfig get nodes | grep master; do sleep 10; done" # Deploy calico curl https://docs.projectcalico.org/manifests/calico.yaml | sed "s/veth_mtu:.*/veth_mtu: \"1400\"/g" | \ kubectl --kubeconfig=./kubeconfig apply -f - +.PHONY: delete-cluster +delete-cluster: + kubectl delete cluster --all --ignore-not-found + + kubectl get machinedeployment,kubeadmcontrolplane,cluster + + @if [[ `kubectl get machinedeployment,kubeadmcontrolplane,cluster | wc -l` -gt 0 ]]; then \ + echo "Error: not all resources have been deleted correctly"; \ + exit 1; \ + fi + .PHONY: kind-reset kind-reset: ## Destroys the "clusterapi" kind cluster. kind delete cluster --name=clusterapi || true diff --git a/hack/ci/ci-bootstrap.yaml b/hack/ci/ci-bootstrap.yaml deleted file mode 100644 index f8052a898a..0000000000 --- a/hack/ci/ci-bootstrap.yaml +++ /dev/null @@ -1,90 +0,0 @@ -preKubeadmCommands: - - bash -c /tmp/kubeadm-bootstrap.sh -files: - - path: /tmp/kubeadm-bootstrap.sh - owner: "root:root" - permissions: "0744" - content: | - #!/bin/bash - - set -o nounset - set -o pipefail - set -o errexit - - [[ $(id -u) != 0 ]] && SUDO="sudo" || SUDO="" - - GSUTIL=gsutil - if ! command -v ${GSUTIL} > /dev/null; then - curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=~/gcloud --disable-prompts > /dev/null 2>&1 - GSUTIL=~/gcloud/google-cloud-sdk/bin/gsutil - # For faster downloads - pip install --no-cache-dir -U crcmod - fi - ${GSUTIL} version - - # This test installs debian packages that are a result of the CI and release builds. - # It runs '... --version' commands to verify that the binaries are correctly installed - # and finally uninstalls the packages. - # For the release packages it tests all versions in the support skew. - - LINE_SEPARATOR="*************************************************" - echo "$LINE_SEPARATOR" - - CI_VERSION=${CI_VERSION:-""} - if [[ "${CI_VERSION}" != "" ]]; then - CI_DIR=/tmp/k8s-ci - mkdir -p $CI_DIR - - declare -a PACKAGES_TO_TEST=("kubectl" "kubelet" "kubeadm") - PACKAGE_EXT="deb" - declare -a CONTAINERS_TO_TEST=("kube-apiserver" "kube-controller-manager" "kube-proxy" "kube-scheduler") - CONTAINER_EXT="tar" - - echo "* testing CI version $CI_VERSION" - - # Check for semver - if [[ "${CI_VERSION}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - CI_URL="gs://kubernetes-release/release/$CI_VERSION/bin/linux/amd64" - - VERSION_WITHOUT_PREFIX="${CI_VERSION#v}" - - DEBIAN_FRONTEND=noninteractive apt-get install -y apt-transport-https curl - curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - - echo 'deb https://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list - apt-get update - - # replace . with \. - VERSION_REGEX="${VERSION_WITHOUT_PREFIX//./\\.}" - PACKAGE_VERSION="$(apt-cache madison kubelet|grep ${VERSION_REGEX}- | head -n1 | cut -d '|' -f 2 | tr -d '[:space:]')" - - for CI_PACKAGE in "${PACKAGES_TO_TEST[@]}"; do - echo "* installing package: $CI_PACKAGE ${PACKAGE_VERSION}" - DEBIAN_FRONTEND=noninteractive apt-get install -y $CI_PACKAGE=$PACKAGE_VERSION - done - else - CI_URL="gs://kubernetes-release-dev/ci/$CI_VERSION-bazel/bin/linux/amd64" - - for CI_PACKAGE in "${PACKAGES_TO_TEST[@]}"; do - echo "* downloading package: $CI_URL/$CI_PACKAGE.$PACKAGE_EXT" - ${GSUTIL} cp "$CI_URL/$CI_PACKAGE.$PACKAGE_EXT" "$CI_DIR/$CI_PACKAGE.$PACKAGE_EXT" - ${SUDO} dpkg -i "$CI_DIR/$CI_PACKAGE.$PACKAGE_EXT" || echo "* ignoring expected 'dpkg -i' result" - done - fi - - for CI_CONTAINER in "${CONTAINERS_TO_TEST[@]}"; do - echo "* downloading package: $CI_URL/$CI_CONTAINER.$CONTAINER_EXT" - ${GSUTIL} cp "$CI_URL/$CI_CONTAINER.$CONTAINER_EXT" "$CI_DIR/$CI_CONTAINER.$CONTAINER_EXT" - ${SUDO} ctr -n k8s.io images import "$CI_DIR/$CI_CONTAINER.$CONTAINER_EXT" || echo "* ignoring expected 'ctr images import' result" - ${SUDO} ctr -n k8s.io images tag k8s.gcr.io/$CI_CONTAINER-amd64:"${CI_VERSION//+/_}" k8s.gcr.io/$CI_CONTAINER:"${CI_VERSION//+/_}" - ${SUDO} ctr -n k8s.io images tag k8s.gcr.io/$CI_CONTAINER-amd64:"${CI_VERSION//+/_}" gcr.io/kubernetes-ci-images/$CI_CONTAINER:"${CI_VERSION//+/_}" - done - fi - - echo "* checking binary versions" - - echo "ctr version: " $(ctr version) - echo "kubeadm version: " $(kubeadm version -o=short) - echo "kubectl version: " $(kubectl version --client=true --short=true) - echo "kubelet version: " $(kubelet --version) - - echo "$LINE_SEPARATOR" diff --git a/hack/ci/e2e-conformance.sh b/hack/ci/e2e-conformance.sh index 5e398fdec7..a75a17a20f 100755 --- a/hack/ci/e2e-conformance.sh +++ b/hack/ci/e2e-conformance.sh @@ -24,61 +24,92 @@ OPENSTACK_SSH_PRIVATE_KEY_PATH=${OPENSTACK_SSH_PRIVATE_KEY_PATH:-"/tmp/id_rsa"} OPENSTACK_IMAGE_NAME="ubuntu-1910-kube-v1.17.3" OPENSTACK_CONTROLPLANE_IP=${OPENSTACK_CONTROLPLANE_IP:-"192.168.200.195"} OPENSTACK_DNS_NAMESERVERS=${OPENSTACK_DNS_NAMESERVERS:-"192.168.200.1"} +OPENSTACK_NODE_MACHINE_FLAVOR=${OPENSTACK_NODE_MACHINE_FLAVOR:-"m1.small"} +OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR=${OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR:-"m1.medium"} +OPENSTACK_CLUSTER_TEMPLATE=${OPENSTACK_CLUSTER_TEMPLATE:-"./templates/cluster-template-without-lb.yaml"} CLUSTER_NAME=${CLUSTER_NAME:-"capi-quickstart"} -KUBERNETES_VERSION=${KUBERNETES_VERSION:-"v1.17.3"} +KUBERNETES_VERSION_SERIES=${KUBERNETES_VERSION_SERIES:-"1.17"} TIMESTAMP=$(date +"%Y-%m-%dT%H:%M:%SZ") ARTIFACTS="${ARTIFACTS:-${PWD}/_artifacts}" REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)" -# dump logs from kind and all the nodes -dump-logs() { +LOGS_KIND_DUMPED=false +LOGS_CAPO_DUMPED=false + +dump_kind_logs() { + set -x + + if [[ "${LOGS_KIND_DUMPED}" == "true" ]]; + then + echo "kind logs already dumped" + return 0 + fi + LOGS_KIND_DUMPED=true echo "Dump logs" mkdir -p "${ARTIFACTS}/logs" - # log version information echo "=== versions ===" echo "kind : $(kind version)" || true echo "bootstrap cluster:" kubectl version || true - echo "deployed cluster:" - kubectl --kubeconfig=${PWD}/kubeconfig version || true echo "" # dump all the info from the CAPI related CRDs - kubectl get \ - clusters,openstackclusters,machines,openstackmachines,kubeadmconfigs,machinedeployments,openstackmachinetemplates,kubeadmconfigtemplates,machinesets \ - --all-namespaces -o yaml >> "${ARTIFACTS}/logs/capo.info" || true + kubectl get clusters,openstackclusters,machines,openstackmachines,kubeadmconfigs,machinedeployments,openstackmachinetemplates,kubeadmconfigtemplates,machinesets --all-namespaces -o yaml > "${ARTIFACTS}/logs/kind-capo.txt" || true + + # dump cluster info for kind + kubectl cluster-info dump > "${ARTIFACTS}/logs/kind-cluster.txt" || true + kubectl get secrets -o yaml -A > "${ARTIFACTS}/logs/kind-cluster-secrets.txt" || true # dump images info - echo "images in docker" >> "${ARTIFACTS}/logs/images.info" - docker images >> "${ARTIFACTS}/logs/images.info" - echo "images from bootstrap using containerd CLI" >> "${ARTIFACTS}/logs/images.info" - docker exec clusterapi-control-plane ctr -n k8s.io images list >> "${ARTIFACTS}/logs/images.info" || true - echo "images in bootstrap cluster using kubectl CLI" >> "${ARTIFACTS}/logs/images.info" + echo "images in docker" >> "${ARTIFACTS}/logs/images.txt" + docker images >> "${ARTIFACTS}/logs/images.txt" + echo "images from bootstrap using containerd CLI" >> "${ARTIFACTS}/logs/images.txt" + docker exec clusterapi-control-plane ctr -n k8s.io images list >> "${ARTIFACTS}/logs/images.txt" || true + echo "images in bootstrap cluster using kubectl CLI" >> "${ARTIFACTS}/logs/images.txt" (kubectl get pods --all-namespaces -o json \ - | jq --raw-output '.items[].spec.containers[].image' | sort) >> "${ARTIFACTS}/logs/images.info" || true - echo "images in deployed cluster using kubectl CLI" >> "${ARTIFACTS}/logs/images.info" - (kubectl --kubeconfig="${PWD}"/kubeconfig get pods --all-namespaces -o json \ - | jq --raw-output '.items[].spec.containers[].image' | sort) >> "${ARTIFACTS}/logs/images.info" || true - - # dump cluster info for kind - kubectl cluster-info dump > "${ARTIFACTS}/logs/kind-cluster.info" || true + | jq --raw-output '.items[].spec.containers[].image' | sort) >> "${ARTIFACTS}/logs/images.txt" || true # export all logs from kind kind "export" logs --name="clusterapi" "${ARTIFACTS}/logs" || true + set +x +} + +dump_capo_logs() { + set -x + + if [[ "${LOGS_CAPO_DUMPED}" == "true" ]]; + then + echo "capo logs already dumped" + return 0 + fi + LOGS_CAPO_DUMPED=true + + echo "Dump logs" + mkdir -p "${ARTIFACTS}/logs" + + echo "=== versions ===" + echo "capo cluster:" + kubectl --kubeconfig=${PWD}/kubeconfig version || true + echo "" + + # dump images info + echo "images in deployed cluster using kubectl CLI" >> "${ARTIFACTS}/logs/images.txt" + (kubectl --kubeconfig="${PWD}"/kubeconfig get pods --all-namespaces -o json \ + | jq --raw-output '.items[].spec.containers[].image' | sort) >> "${ARTIFACTS}/logs/images.txt" || true # dump OpenStack info - echo "" > "${ARTIFACTS}/logs/openstack-cluster.info" - echo "=== OpenStack compute instances list ===" >> "${ARTIFACTS}/logs/openstack-cluster.info" || true - openstack server list >> "${ARTIFACTS}/logs/openstack-cluster.info" || true - echo "=== OpenStack compute instances show ===" >> "${ARTIFACTS}/logs/openstack-cluster.info" || true - openstack server list -f value -c Name | xargs -I% openstack server show % >> "${ARTIFACTS}/logs/openstack-cluster.info" || true - echo "=== cluster-info dump ===" >> "${ARTIFACTS}/logs/openstack-cluster.info" || true - kubectl --kubeconfig=${PWD}/kubeconfig cluster-info dump >> "${ARTIFACTS}/logs/openstack-cluster.info" || true + echo "" > "${ARTIFACTS}/logs/openstack-cluster.txt" + echo "=== OpenStack compute instances list ===" >> "${ARTIFACTS}/logs/openstack-cluster.txt" || true + openstack server list >> "${ARTIFACTS}/logs/openstack-cluster.txt" || true + echo "=== OpenStack compute instances show ===" >> "${ARTIFACTS}/logs/openstack-cluster.txt" || true + openstack server list -f value -c Name | xargs -I% openstack server show % >> "${ARTIFACTS}/logs/openstack-cluster.txt" || true + echo "=== cluster-info dump ===" >> "${ARTIFACTS}/logs/openstack-cluster.txt" || true + kubectl --kubeconfig=${PWD}/kubeconfig cluster-info dump >> "${ARTIFACTS}/logs/openstack-cluster.txt" || true + kubectl --kubeconfig=${PWD}/kubeconfig get secrets -o yaml -A > "${ARTIFACTS}/logs/openstack-cluster-secrets.txt" || true - set -x jump_node_name=$(openstack server list -f value -c Name | grep ${CLUSTER_NAME}-control-plane | head -n 1) jump_node=$(openstack server show ${jump_node_name} -f value -c addresses | awk '{print $2}') for node in $(openstack server list -f value -c Name) @@ -89,10 +120,10 @@ dump-logs() { openstack console log show "${node}" > "${dir}/console.log" || true - ssh-to-node "${node}" "${jump_node}" "sudo chmod -R a+r /var/log" || true - PROXY_COMMAND="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=30 -x -W %h:22 -i ${OPENSTACK_SSH_PRIVATE_KEY_PATH} capo@${jump_node}" node=$(openstack port show ${node} -f json -c fixed_ips | jq '.fixed_ips[0].ip_address' -r) + + ssh-to-node "${node}" "${jump_node}" "sudo chmod -R a+r /var/log" || true scp -r -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=30 -o ProxyCommand="${PROXY_COMMAND}" -i ${OPENSTACK_SSH_PRIVATE_KEY_PATH} \ "capo@${node}:/var/log/cloud-init.log" "capo@${node}:/var/log/cloud-init-output.log" \ "capo@${node}:/var/log/pods" "capo@${node}:/var/log/containers" \ @@ -100,7 +131,7 @@ dump-logs() { ssh-to-node "${node}" "${jump_node}" "sudo journalctl --output=short-precise -k" > "${dir}/kern.log" || true ssh-to-node "${node}" "${jump_node}" "sudo journalctl --output=short-precise" > "${dir}/systemd.log" || true - ssh-to-node "${node}" "${jump_node}" "sudo crictl version && sudo crictl info" > "${dir}/containerd.info" || true + ssh-to-node "${node}" "${jump_node}" "sudo crictl version && sudo crictl info" > "${dir}/containerd.txt" || true ssh-to-node "${node}" "${jump_node}" "sudo journalctl --no-pager -u cloud-final" > "${dir}/cloud-final.log" || true ssh-to-node "${node}" "${jump_node}" "sudo journalctl --no-pager -u kubelet.service" > "${dir}/kubelet.log" || true ssh-to-node "${node}" "${jump_node}" "sudo journalctl --no-pager -u containerd.service" > "${dir}/containerd.log" || true @@ -111,6 +142,11 @@ dump-logs() { set +x } +function dump_logs() { + dump_kind_logs + dump_capo_logs +} + # SSH to a node by name ($1) via jump server ($2) and run a command ($3). function ssh-to-node() { local node="$1" @@ -124,26 +160,6 @@ function ssh-to-node() { capo@"${node}" "${cmd}" } -# cleanup all resources we use -cleanup() { - # KIND_IS_UP is true once we: kind create - if [[ "${KIND_IS_UP:-}" = true ]]; then - timeout 600 kubectl \ - delete cluster "${CLUSTER_NAME}" || true - timeout 600 kubectl \ - wait --for=delete -n ${CLUSTER_NAME} cluster/"${CLUSTER_NAME}" || true - make kind-reset || true - fi - # clean up e2e.test symlink - (cd "$(go env GOPATH)/src/k8s.io/kubernetes" && rm -f _output/bin/e2e.test) || true -} - -# our exit handler (trap) -exit-handler() { - dump-logs - cleanup -} - upload_image() { echo "Upload image" @@ -162,8 +178,10 @@ upload_image() { return fi + source_image_url="https://github.com/kubernetes-sigs/cluster-api-provider-openstack/releases/download/v0.3.0/ubuntu-1910-kube-v1.17.3.qcow2" + echo "Download image ${OPENSTACK_IMAGE_NAME} from ${source_image_url}" tmp_source_image=/tmp/ubuntu-1910.ova.qcow2 - wget -q -c https://github.com/sbueringer/image-builder/releases/download/v1.17.3-04/ubuntu-1910-kube-v1.17.3.qcow2 -O ${tmp_source_image} + wget -q -c ${source_image_url} -O ${tmp_source_image} echo "Uploading image ${tmp_source_image} as ${OPENSTACK_IMAGE_NAME}" openstack image create --disk-format qcow2 \ @@ -180,93 +198,54 @@ install_prereqs() { sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io jq # docker socket already works because OpenLab runs via root - - # Install go - sudo snap install go --classic # Install yq - GO111MODULE=on go get github.com/mikefarah/yq/v2 + go get github.com/mikefarah/yq/v2 + go get -u github.com/go-bindata/go-bindata/... - source "${REPO_ROOT}/hack/ensure-go.sh" source "${REPO_ROOT}/hack/ensure-kubectl.sh" source "${REPO_ROOT}/hack/ensure-kind.sh" - source "${REPO_ROOT}/hack/ensure-kustomize.sh" - - # Kubernetes does not build with modern bazel - #sudo apt install curl - #curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add - - #echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list - #sudo apt update && sudo apt install bazel - bazel_version=0.28.1 - wget -q https://github.com/bazelbuild/bazel/releases/download/${bazel_version}/bazel-${bazel_version}-installer-linux-x86_64.sh - chmod +x bazel-${bazel_version}-installer-linux-x86_64.sh - ./bazel-${bazel_version}-installer-linux-x86_64.sh --user - - # Bazel is installed in /root/bin - export PATH="/root/bin:${PATH}" } # build kubernetes / node image, e2e binaries build() { - # possibly enable bazel build caching before building kubernetes - if [[ "${BAZEL_REMOTE_CACHE_ENABLED:-false}" == "true" ]]; then - create_bazel_cache_rcs.sh || true - fi - if [[ ! -d "$(go env GOPATH)/src/k8s.io/kubernetes" ]]; then mkdir -p $(go env GOPATH)/src/k8s.io cd $(go env GOPATH)/src/k8s.io git clone https://github.com/kubernetes/kubernetes.git cd kubernetes - git checkout release-1.17 + if [[ "${KUBERNETES_VERSION_SERIES}" == "master" ]] + then + git checkout master + else + git checkout "release-${KUBERNETES_VERSION_SERIES}" + fi fi pushd "$(go env GOPATH)/src/k8s.io/kubernetes" - # make sure we have e2e requirements - bazel build //cmd/kubectl //vendor/github.com/onsi/ginkgo/ginkgo - - # ensure the e2e script will find our binaries ... + # re-create _output/bin folder + rm -rf "${PWD}/_output/bin" mkdir -p "${PWD}/_output/bin/" - rm -f "${PWD}/_output/bin/e2e.test" - # use go build for local execution if no bazel version is installed which is that old - if bazel --version | grep "0.28.1" - then - bazel build //test/e2e:e2e.test - cp "${PWD}/bazel-bin/test/e2e/e2e.test" "${PWD}/_output/bin/e2e.test" - else - go test -c ./test/e2e/ - cp "./e2e.test" "${PWD}/_output/bin/e2e.test" - fi - PATH="$(dirname "$(find "${PWD}/bazel-bin/" -name kubectl -type f)"):${PATH}" + go build -o ./_output/bin/kubectl ./cmd/kubectl + + ./hack/generate-bindata.sh + go test -o ./_output/bin/e2e.test -c ./test/e2e/ + + go build -o ./_output/bin/ginkgo ./vendor/github.com/onsi/ginkgo/ginkgo + + PATH="$(go env GOPATH)/src/k8s.io/kubernetes/_output/bin:${PATH}" export PATH + popd # attempt to release some memory after building sync || true sudo sh -c "echo 1 > /proc/sys/vm/drop_caches" || true - popd -} - -# generate manifests needed for creating the GCP cluster to run the tests -generate_manifests() { cd ${REPO_ROOT} - if ! command -v kustomize >/dev/null 2>&1; then - (cd ./hack/tools/ && GO111MODULE=on go install sigs.k8s.io/kustomize/kustomize/v3) - fi - - echo "Build Docker Images & Generating Manifests" - - # Enable the bits to inject a script that can pull newer versions of kubernetes - if [[ -n ${CI_VERSION:-} || -n ${USE_CI_ARTIFACTS:-} ]]; then - if ! grep -i -wq "patchesStrategicMerge" "templates/kustomization.yaml"; then - echo "patchesStrategicMerge:" >> "templates/kustomization.yaml" - echo "- kustomizeversions.yaml" >> "templates/kustomization.yaml" - fi - fi - + echo "Build Docker Images" make modules docker-build } @@ -284,6 +263,15 @@ create_cluster() { # exports the b64 env vars used below source ${REPO_ROOT}/templates/env.rc ${OPENSTACK_CLOUD_YAML_FILE} ${CLUSTER_NAME} + # KUBERNETES_VERSION will be used via e2e-conformance_patch.yaml + # TODO: revert to https://dl.k8s.io/ci/latest-green.txt once https://github.com/kubernetes/release/issues/897 is fixed. + if [[ "${KUBERNETES_VERSION_SERIES}" == "master" ]] + then + KUBERNETES_VERSION=$(curl -sSL https://dl.k8s.io/ci/k8s-master.txt) + else + KUBERNETES_VERSION=$(curl -sSL https://dl.k8s.io/ci/latest-${KUBERNETES_VERSION_SERIES}.txt) + fi + OPENSTACK_CLOUD_CACERT_B64=${OPENSTACK_CLOUD_CACERT_B64} \ OPENSTACK_CLOUD_PROVIDER_CONF_B64=${OPENSTACK_CLOUD_PROVIDER_CONF_B64} \ OPENSTACK_CLOUD_YAML_B64=${OPENSTACK_CLOUD_YAML_B64} \ @@ -292,19 +280,20 @@ create_cluster() { OPENSTACK_SSH_AUTHORIZED_KEY="$(cat ${OPENSTACK_SSH_AUTHORIZED_KEY_PATH})" \ OPENSTACK_CONTROLPLANE_IP=${OPENSTACK_CONTROLPLANE_IP} \ OPENSTACK_DNS_NAMESERVERS=${OPENSTACK_DNS_NAMESERVERS} \ + OPENSTACK_CLUSTER_TEMPLATE=${OPENSTACK_CLUSTER_TEMPLATE} \ KUBERNETES_VERSION=${KUBERNETES_VERSION} \ make create-cluster # Wait till all machines are running (bail out at 30 mins) attempt=0 while true; do - kubectl get machines -n "${CLUSTER_NAME}" - read running total <<< $(kubectl get machines -n "${CLUSTER_NAME}" \ + kubectl get machines + read running total <<< $(kubectl get machines \ -o json | jq -r '.items[].status.phase' | awk 'BEGIN{count=0} /(r|R)unning/{count++} END{print count " " NR}') ; if [[ ${total} == ${running} ]]; then return 0 fi - read failed total <<< $(kubectl get machines -n "${CLUSTER_NAME}" \ + read failed total <<< $(kubectl get machines \ -o json | jq -r '.items[].status.phase' | awk 'BEGIN{count=0} /(f|F)ailed/{count++} END{print count " " NR}') ; if [[ ! ${failed} -eq 0 ]]; then echo "$failed machines (out of $total) in cluster failed ... bailing out" @@ -319,6 +308,15 @@ create_cluster() { sleep 10 attempt=$((attempt+1)) done + + # Wait till all pods and nodes are ready + kubectl wait --for=condition=Ready --timeout=15m pods -n kube-system --kubeconfig="$KUBECONFIG" --all + kubectl wait --for=condition=Ready --timeout=5m node --kubeconfig="$KUBECONFIG" --all +} + +delete_cluster() { + CLUSTER_NAME=${CLUSTER_NAME} \ + make delete-cluster } # run e2es with kubetest @@ -333,6 +331,7 @@ run_tests() { # if we set PARALLEL=true, skip serial tests set --ginkgo-parallel if [[ "${PARALLEL:-false}" == "true" ]]; then export GINKGO_PARALLEL=y + export GINKGO_PARALLEL_NODES=5 echo "Running tests in parallel" if [[ -z "${SKIP}" ]]; then SKIP="\\[Serial\\]" @@ -347,16 +346,13 @@ run_tests() { -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.taints}{"\n"}{end}' \ | grep -cv "node-role.kubernetes.io/master" )" - # wait for all the nodes to be ready - kubectl wait --for=condition=Ready node --kubeconfig="$KUBECONFIG" --all || true - # setting this env prevents ginkgo e2e from trying to run provider setup export KUBERNETES_CONFORMANCE_TEST="y" # run the tests (cd "$(go env GOPATH)/src/k8s.io/kubernetes" && ./hack/ginkgo-e2e.sh \ '--provider=skeleton' "--num-nodes=${NUM_NODES}" \ "--ginkgo.focus=${FOCUS}" "--ginkgo.skip=${SKIP}" \ - "--report-dir=${ARTIFACTS}" '--disable-log-dump=true') + "--report-dir=${ARTIFACTS}" '--disable-log-dump=true' | tee ${ARTIFACTS}/e2e.log) unset KUBECONFIG unset KUBERNETES_CONFORMANCE_TEST @@ -369,10 +365,6 @@ main() { if [[ "$arg" == "--verbose" ]]; then set -o xtrace fi - if [[ "$arg" == "--clean" ]]; then - cleanup - return 0 - fi if [[ "$arg" == "--install-prereqs" ]]; then INSTALL_PREREQS="1" fi @@ -391,12 +383,15 @@ main() { if [[ "$arg" == "--run-tests-parallel" ]]; then export PARALLEL="true" fi + if [[ "$arg" == "--delete-cluster" ]]; then + DELETE_CLUSTER="1" + fi done # create temp dir and setup cleanup SKIP_CLEANUP=${SKIP_CLEANUP:-""} if [[ -z "${SKIP_CLEANUP}" ]]; then - trap exit-handler EXIT + trap dump_logs EXIT fi # ensure artifacts exists when not in CI export ARTIFACTS @@ -419,13 +414,21 @@ main() { fi build - generate_manifests create_cluster if [[ -z "${SKIP_RUN_TESTS:-}" ]]; then echo "Running tests..." run_tests fi + + DELETE_CLUSTER=${DELETE_CLUSTER:-""} + if [[ "${DELETE_CLUSTER}" == "yes" || "${DELETE_CLUSTER}" == "1" ]]; then + echo "Dumping logs" + dump_logs + + echo "Deleting cluster..." + delete_cluster + fi } main "$@" diff --git a/hack/ci/e2e-conformance/.gitignore b/hack/ci/e2e-conformance/.gitignore new file mode 100644 index 0000000000..0c83aa43a1 --- /dev/null +++ b/hack/ci/e2e-conformance/.gitignore @@ -0,0 +1,2 @@ +cluster.yaml +e2e-conformance_patch.yaml diff --git a/hack/ci/e2e-conformance/e2e-conformance_patch.yaml.tpl b/hack/ci/e2e-conformance/e2e-conformance_patch.yaml.tpl new file mode 100644 index 0000000000..cbbba7c684 --- /dev/null +++ b/hack/ci/e2e-conformance/e2e-conformance_patch.yaml.tpl @@ -0,0 +1,195 @@ +apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 +kind: KubeadmControlPlane +metadata: + name: "${CLUSTER_NAME}-control-plane" +spec: + kubeadmConfigSpec: + clusterConfiguration: + kubernetesVersion: "${KUBERNETES_VERSION}" + initConfiguration: + nodeRegistration: + kubeletExtraArgs: + v: "8" + joinConfiguration: + nodeRegistration: + kubeletExtraArgs: + v: "8" + verbosity: 8 + preKubeadmCommands: + - bash -c /tmp/kubeadm-bootstrap.sh + files: + - path: /etc/kubernetes/cloud.conf + owner: root + permissions: "0600" + content: ${OPENSTACK_CLOUD_PROVIDER_CONF_B64} + encoding: base64 + - path: /etc/certs/cacert + owner: root + permissions: "0600" + content: ${OPENSTACK_CLOUD_CACERT_B64} + encoding: base64 + - path: /tmp/kubeadm-bootstrap.sh + owner: "root:root" + permissions: "0744" + content: | + #!/bin/bash + + set -o nounset + set -o pipefail + set -o errexit + set -e + + [[ $(id -u) != 0 ]] && SUDO="sudo" || SUDO="" + + # This script installs binaries and containers that are a result of the CI and release builds. + # It runs '... --version' commands to verify that the binaries are correctly installed + + LINE_SEPARATOR="*************************************************" + echo "$LINE_SEPARATOR" + + echo "$(date): stopping kubelet" + ${SUDO} systemctl stop kubelet + + echo "$(date): debug output" + ps aux + top -b -n 1 + + CI_VERSION=${CI_VERSION:-"${KUBERNETES_VERSION}"} + if [[ "${CI_VERSION}" != "" ]]; then + CI_DIR=/tmp/k8s-ci + mkdir -p $CI_DIR + # replace + with %2B for the URL + CI_URL="https://storage.googleapis.com/kubernetes-release-dev/ci/${CI_VERSION//+/%2B}/bin/linux/amd64" + declare -a BINARIES_TO_TEST=("kubectl" "kubelet" "kubeadm") + declare -a CONTAINERS_TO_TEST=("kube-apiserver" "kube-controller-manager" "kube-scheduler" "kube-proxy") + CONTAINER_EXT="tar" + + echo "* testing CI version $CI_VERSION" + + for CI_BINARY in "${BINARIES_TO_TEST[@]}"; do + echo "$(date): downloading binary $CI_URL/$CI_BINARY" + # move old binary away to avoid err "Text file busy" + ${SUDO} mv /usr/bin/${CI_BINARY} /usr/bin/${CI_BINARY}.bak + ${SUDO} curl --retry 5 -sS "${CI_URL}/${CI_BINARY}" -o "${CI_DIR}/${CI_BINARY}" + ${SUDO} cp ${CI_DIR}/${CI_BINARY} /usr/bin/${CI_BINARY} + ${SUDO} chmod +x /usr/bin/${CI_BINARY} + echo "$(date): downloading binary $CI_URL/$CI_BINARY finished" + done + + for CI_CONTAINER in "${CONTAINERS_TO_TEST[@]}"; do + echo "$(date): downloading container $CI_URL/$CI_CONTAINER.$CONTAINER_EXT" + ${SUDO} curl --retry 5 -sS "${CI_URL}/$CI_CONTAINER.$CONTAINER_EXT" -o "$CI_DIR/$CI_CONTAINER.$CONTAINER_EXT" + ${SUDO} ctr -n k8s.io images import "$CI_DIR/$CI_CONTAINER.$CONTAINER_EXT" || echo "* ignoring expected 'ctr images import' result" + ${SUDO} ctr -n k8s.io images tag k8s.gcr.io/$CI_CONTAINER-amd64:"${CI_VERSION//+/_}" k8s.gcr.io/$CI_CONTAINER:"${CI_VERSION//+/_}" + ${SUDO} ctr -n k8s.io images tag k8s.gcr.io/$CI_CONTAINER-amd64:"${CI_VERSION//+/_}" gcr.io/kubernetes-ci-images/$CI_CONTAINER:"${CI_VERSION//+/_}" + echo "$(date): downloading container $CI_URL/$CI_CONTAINER.$CONTAINER_EXT finished" + done + fi + + echo "$(date): checking binary versions" + + echo "ctr version: " $(ctr version) + echo "kubeadm version: " $(kubeadm version -o=short) + echo "kubectl version: " $(kubectl version --client=true --short=true) + echo "kubelet version: " $(kubelet --version) + + echo "$LINE_SEPARATOR" + version: "${KUBERNETES_VERSION}" +--- +apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 +kind: KubeadmConfigTemplate +metadata: + name: ${CLUSTER_NAME}-md-0 +spec: + template: + spec: + verbosity: 8 + preKubeadmCommands: + - bash -c /tmp/kubeadm-bootstrap.sh + files: + - content: ${OPENSTACK_CLOUD_PROVIDER_CONF_B64} + encoding: base64 + owner: root + path: /etc/kubernetes/cloud.conf + permissions: "0600" + - content: ${OPENSTACK_CLOUD_CACERT_B64} + encoding: base64 + owner: root + path: /etc/certs/cacert + permissions: "0600" + - path: /tmp/kubeadm-bootstrap.sh + owner: "root:root" + permissions: "0744" + content: | + #!/bin/bash + + set -o nounset + set -o pipefail + set -o errexit + set -e + + [[ $(id -u) != 0 ]] && SUDO="sudo" || SUDO="" + + # This script installs binaries and containers that are a result of the CI and release builds. + # It runs '... --version' commands to verify that the binaries are correctly installed + + LINE_SEPARATOR="*************************************************" + echo "$LINE_SEPARATOR" + + echo "$(date): stopping kubelet" + ${SUDO} systemctl stop kubelet + + echo "$(date): debug output" + ps aux + top -b -n 1 + + CI_VERSION=${CI_VERSION:-"${KUBERNETES_VERSION}"} + if [[ "${CI_VERSION}" != "" ]]; then + CI_DIR=/tmp/k8s-ci + mkdir -p $CI_DIR + # replace + with %2B for the URL + CI_URL="https://storage.googleapis.com/kubernetes-release-dev/ci/${CI_VERSION//+/%2B}/bin/linux/amd64" + declare -a BINARIES_TO_TEST=("kubectl" "kubelet" "kubeadm") + declare -a CONTAINERS_TO_TEST=("kube-proxy") + CONTAINER_EXT="tar" + + echo "* testing CI version $CI_VERSION" + + for CI_BINARY in "${BINARIES_TO_TEST[@]}"; do + echo "$(date): downloading binary $CI_URL/$CI_BINARY" + # move old binary away to avoid err "Text file busy" + ${SUDO} mv /usr/bin/${CI_BINARY} /usr/bin/${CI_BINARY}.bak + ${SUDO} curl --retry 5 -sS "${CI_URL}/${CI_BINARY}" -o "${CI_DIR}/${CI_BINARY}" + ${SUDO} cp ${CI_DIR}/${CI_BINARY} /usr/bin/${CI_BINARY} + ${SUDO} chmod +x /usr/bin/${CI_BINARY} + echo "$(date): downloading binary $CI_URL/$CI_BINARY finished" + done + + for CI_CONTAINER in "${CONTAINERS_TO_TEST[@]}"; do + echo "$(date): downloading container $CI_URL/$CI_CONTAINER.$CONTAINER_EXT" + ${SUDO} curl --retry 5 -sS "${CI_URL}/$CI_CONTAINER.$CONTAINER_EXT" -o "$CI_DIR/$CI_CONTAINER.$CONTAINER_EXT" + ${SUDO} ctr -n k8s.io images import "$CI_DIR/$CI_CONTAINER.$CONTAINER_EXT" || echo "* ignoring expected 'ctr images import' result" + ${SUDO} ctr -n k8s.io images tag k8s.gcr.io/$CI_CONTAINER-amd64:"${CI_VERSION//+/_}" k8s.gcr.io/$CI_CONTAINER:"${CI_VERSION//+/_}" + ${SUDO} ctr -n k8s.io images tag k8s.gcr.io/$CI_CONTAINER-amd64:"${CI_VERSION//+/_}" gcr.io/kubernetes-ci-images/$CI_CONTAINER:"${CI_VERSION//+/_}" + echo "$(date): downloading container $CI_URL/$CI_CONTAINER.$CONTAINER_EXT finished" + done + fi + + echo "$(date): checking binary versions" + + echo "ctr version: " $(ctr version) + echo "kubeadm version: " $(kubeadm version -o=short) + echo "kubectl version: " $(kubectl version --client=true --short=true) + echo "kubelet version: " $(kubelet --version) + + echo "$LINE_SEPARATOR" +--- +apiVersion: cluster.x-k8s.io/v1alpha3 +kind: MachineDeployment +metadata: + name: "${CLUSTER_NAME}-md-0" +spec: + clusterName: "${CLUSTER_NAME}" + template: + spec: + version: "${KUBERNETES_VERSION}" diff --git a/hack/ci/e2e-conformance/kustomization.yaml b/hack/ci/e2e-conformance/kustomization.yaml new file mode 100644 index 0000000000..f1dc1161ea --- /dev/null +++ b/hack/ci/e2e-conformance/kustomization.yaml @@ -0,0 +1,26 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: +- cluster.yaml +patchesStrategicMerge: +- e2e-conformance_patch.yaml +patchesJSON6902: +# sets the password of the capo user to capo +- target: + group: bootstrap.cluster.x-k8s.io + version: v1alpha3 + kind: KubeadmConfigTemplate + name: capi-quickstart-md-0 + patch: |- + - op: replace + path: /spec/template/spec/users/0/passwd + value: '$1$SaltSalt$JQx8irEe3sMOl/Lu8y7oZ1' +- target: + group: controlplane.cluster.x-k8s.io + version: v1alpha3 + kind: KubeadmControlPlane + name: capi-quickstart-control-plane + patch: |- + - op: replace + path: /spec/kubeadmConfigSpec/users/0/passwd + value: '$1$SaltSalt$JQx8irEe3sMOl/Lu8y7oZ1' diff --git a/hack/ensure-kind.sh b/hack/ensure-kind.sh index 6aa6d14683..ee8f3f50b8 100755 --- a/hack/ensure-kind.sh +++ b/hack/ensure-kind.sh @@ -33,6 +33,7 @@ verify_kind_version() { fi curl -sLo "${GOPATH_BIN}/kind" https://github.com/kubernetes-sigs/kind/releases/download/${MINIMUM_KIND_VERSION}/kind-linux-amd64 chmod +x "${GOPATH_BIN}/kind" + echo 'kind installed' else echo "Missing required binary in path: kind" return 2 diff --git a/hack/ensure-kubectl.sh b/hack/ensure-kubectl.sh index 9d0673f26a..9ad037828d 100755 --- a/hack/ensure-kubectl.sh +++ b/hack/ensure-kubectl.sh @@ -33,6 +33,7 @@ verify_kubectl_version() { echo 'kubectl not found, installing' curl -sLo "${GOPATH_BIN}/kubectl" https://storage.googleapis.com/kubernetes-release/release/${MINIMUM_KUBECTL_VERSION}/bin/linux/amd64/kubectl chmod +x "${GOPATH_BIN}/kubectl" + echo 'kubectl installed' else echo "Missing required binary in path: kubectl" return 2 diff --git a/hack/ensure-kustomize.sh b/hack/ensure-kustomize.sh index 1c3d0ab67c..ba9b88dd62 100755 --- a/hack/ensure-kustomize.sh +++ b/hack/ensure-kustomize.sh @@ -33,6 +33,7 @@ verify_kustomize_version() { fi curl -sLo "${GOPATH_BIN}/kustomize" https://github.com/kubernetes-sigs/kustomize/releases/download/v${MINIMUM_KUSTOMIZE_VERSION}/kustomize_${MINIMUM_KUSTOMIZE_VERSION}_linux_amd64 chmod +x "${GOPATH_BIN}/kustomize" + echo "kustomize installed" else echo "Missing required binary in path: kustomize" return 2 diff --git a/templates/kustomization.yaml b/templates/kustomization.yaml deleted file mode 100644 index 5e058e123c..0000000000 --- a/templates/kustomization.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -namespace: default -resources: - - cluster-template.yaml diff --git a/templates/kustomizeversions.yaml b/templates/kustomizeversions.yaml deleted file mode 100644 index 25c2d885f9..0000000000 --- a/templates/kustomizeversions.yaml +++ /dev/null @@ -1,167 +0,0 @@ -apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 -kind: KubeadmControlPlane -metadata: - name: "${CLUSTER_NAME}-control-plane" -spec: - kubeadmConfigSpec: - clusterConfiguration: - kubernetesVersion: "ci/latest" - preKubeadmCommands: - - bash -c /tmp/kubeadm-bootstrap.sh - files: - - path: /tmp/kubeadm-bootstrap.sh - owner: "root:root" - permissions: "0744" - content: | - #!/bin/bash - - set -o nounset - set -o pipefail - set -o errexit - - [[ $(id -u) != 0 ]] && SUDO="sudo" || SUDO="" - - GSUTIL=gsutil - if ! command -v ${GSUTIL} > /dev/null; then - curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=~/gcloud --disable-prompts > /dev/null 2>&1 - GSUTIL=~/gcloud/google-cloud-sdk/bin/gsutil - fi - ${GSUTIL} version - - # This test installs debian packages that are a result of the CI and release builds. - # It runs '... --version' commands to verify that the binaries are correctly installed - # and finally uninstalls the packages. - # For the release packages it tests all versions in the support skew. - - LINE_SEPARATOR="*************************************************" - echo "$LINE_SEPARATOR" - - CI_VERSION=${CI_VERSION:-""} - if [[ "${CI_VERSION}" != "" ]]; then - CI_DIR=/tmp/k8s-ci - mkdir -p $CI_DIR - CI_URL="gs://kubernetes-release-dev/ci/$CI_VERSION-bazel/bin/linux/amd64" - declare -a PACKAGES_TO_TEST=("kubectl" "kubelet" "kubeadm") - PACKAGE_EXT="deb" - declare -a CONTAINERS_TO_TEST=("kube-apiserver" "kube-controller-manager" "kube-proxy" "kube-scheduler") - CONTAINER_EXT="tar" - - echo "* testing CI version $CI_VERSION" - - for CI_PACKAGE in "${PACKAGES_TO_TEST[@]}"; do - echo "* downloading package: $CI_URL/$CI_PACKAGE.$PACKAGE_EXT" - ${GSUTIL} cp "$CI_URL/$CI_PACKAGE.$PACKAGE_EXT" "$CI_DIR/$CI_PACKAGE.$PACKAGE_EXT" - ${SUDO} dpkg -i "$CI_DIR/$CI_PACKAGE.$PACKAGE_EXT" || echo "* ignoring expected 'dpkg -i' result" - done - - for CI_CONTAINER in "${CONTAINERS_TO_TEST[@]}"; do - echo "* downloading package: $CI_URL/$CI_CONTAINER.$CONTAINER_EXT" - ${GSUTIL} cp "$CI_URL/$CI_CONTAINER.$CONTAINER_EXT" "$CI_DIR/$CI_CONTAINER.$CONTAINER_EXT" - ${SUDO} ctr -n k8s.io images import "$CI_DIR/$CI_CONTAINER.$CONTAINER_EXT" || echo "* ignoring expected 'ctr images import' result" - ${SUDO} ctr -n k8s.io images tag k8s.gcr.io/$CI_CONTAINER-amd64:"${CI_VERSION//+/_}" k8s.gcr.io/$CI_CONTAINER:"${CI_VERSION//+/_}" - ${SUDO} ctr -n k8s.io images tag k8s.gcr.io/$CI_CONTAINER-amd64:"${CI_VERSION//+/_}" gcr.io/kubernetes-ci-images/$CI_CONTAINER:"${CI_VERSION//+/_}" - done - fi - - echo "* checking binary versions" - - echo "ctr version: " $(ctr version) - echo "kubeadm version: " $(kubeadm version -o=short) - echo "kubectl version: " $(kubectl version --client=true --short=true) - echo "kubelet version: " $(kubelet --version) - - echo "$LINE_SEPARATOR" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: OpenStackMachineTemplate -metadata: - name: "${CLUSTER_NAME}-control-plane" - namespace: ${CLUSTER_NAME} -spec: - template: - spec: - image: ${OPENSTACK_IMAGE_NAME} ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 -kind: KubeadmConfigTemplate -metadata: - name: ${CLUSTER_NAME}-md-0 - namespace: ${CLUSTER_NAME} -spec: - template: - spec: - preKubeadmCommands: - - bash -c /tmp/kubeadm-bootstrap.sh - files: - - path: /tmp/kubeadm-bootstrap.sh - owner: "root:root" - permissions: "0744" - content: | - #!/bin/bash - - set -o nounset - set -o pipefail - set -o errexit - - [[ $(id -u) != 0 ]] && SUDO="sudo" || SUDO="" - - GSUTIL=gsutil - if ! command -v ${GSUTIL} > /dev/null; then - curl -sSL https://sdk.cloud.google.com > /tmp/gcl && bash /tmp/gcl --install-dir=~/gcloud --disable-prompts > /dev/null 2>&1 - GSUTIL=~/gcloud/google-cloud-sdk/bin/gsutil - fi - ${GSUTIL} version - - # This test installs debian packages that are a result of the CI and release builds. - # It runs '... --version' commands to verify that the binaries are correctly installed - # and finally uninstalls the packages. - # For the release packages it tests all versions in the support skew. - - LINE_SEPARATOR="*************************************************" - echo "$LINE_SEPARATOR" - - CI_VERSION=${CI_VERSION:-""} - if [[ "${CI_VERSION}" != "" ]]; then - CI_DIR=/tmp/k8s-ci - mkdir -p $CI_DIR - CI_URL="gs://kubernetes-release-dev/ci/$CI_VERSION-bazel/bin/linux/amd64" - declare -a PACKAGES_TO_TEST=("kubectl" "kubelet" "kubeadm") - PACKAGE_EXT="deb" - declare -a CONTAINERS_TO_TEST=("kube-apiserver" "kube-controller-manager" "kube-proxy" "kube-scheduler") - CONTAINER_EXT="tar" - - echo "* testing CI version $CI_VERSION" - - for CI_PACKAGE in "${PACKAGES_TO_TEST[@]}"; do - echo "* downloading package: $CI_URL/$CI_PACKAGE.$PACKAGE_EXT" - ${GSUTIL} cp "$CI_URL/$CI_PACKAGE.$PACKAGE_EXT" "$CI_DIR/$CI_PACKAGE.$PACKAGE_EXT" - ${SUDO} dpkg -i "$CI_DIR/$CI_PACKAGE.$PACKAGE_EXT" || echo "* ignoring expected 'dpkg -i' result" - done - - for CI_CONTAINER in "${CONTAINERS_TO_TEST[@]}"; do - echo "* downloading package: $CI_URL/$CI_CONTAINER.$CONTAINER_EXT" - ${GSUTIL} cp "$CI_URL/$CI_CONTAINER.$CONTAINER_EXT" "$CI_DIR/$CI_CONTAINER.$CONTAINER_EXT" - ${SUDO} ctr -n k8s.io images import "$CI_DIR/$CI_CONTAINER.$CONTAINER_EXT" || echo "* ignoring expected 'ctr images import' result" - ${SUDO} ctr -n k8s.io images tag k8s.gcr.io/$CI_CONTAINER-amd64:"${CI_VERSION//+/_}" k8s.gcr.io/$CI_CONTAINER:"${CI_VERSION//+/_}" - ${SUDO} ctr -n k8s.io images tag k8s.gcr.io/$CI_CONTAINER-amd64:"${CI_VERSION//+/_}" gcr.io/kubernetes-ci-images/$CI_CONTAINER:"${CI_VERSION//+/_}" - done - fi - - echo "* checking binary versions" - - echo "ctr version: " $(ctr version) - echo "kubeadm version: " $(kubeadm version -o=short) - echo "kubectl version: " $(kubectl version --client=true --short=true) - echo "kubelet version: " $(kubelet --version) - - echo "$LINE_SEPARATOR" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: OpenStackMachineTemplate -metadata: - name: ${CLUSTER_NAME}-md-0 - namespace: ${CLUSTER_NAME} -spec: - template: - spec: - image: ${OPENSTACK_IMAGE_NAME}