From 23297c630f09317d5ea77db9bd4f450c16504876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 9 Dec 2020 15:03:14 -0300 Subject: [PATCH] Use kind in github actions --- .github/workflows/ci.yaml | 26 ++++ Makefile | 4 + config/api/api.yaml | 32 +++++ config/api/kustomization.yaml | 3 + config/api/service.yaml | 14 ++ config/crd/kustomization.yaml | 1 + config/default/kustomization.yaml | 3 +- config/manager/kustomization.yaml | 1 + config/manager/manager.yaml | 11 +- config/rbac/kustomization.yaml | 1 + config/rbac/role.yaml | 78 +++++++++-- go.mod | 2 +- go.sum | 4 +- scripts/localkube-integration.sh | 221 ++++++------------------------ test/helpers.go | 16 ++- test/integration_test.go | 19 ++- 16 files changed, 229 insertions(+), 207 deletions(-) create mode 100644 config/api/api.yaml create mode 100644 config/api/kustomization.yaml create mode 100644 config/api/service.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5632a996a..1ab022ddb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -21,6 +21,32 @@ jobs: go-version: 1.13.x - run: make test + integration: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: engineerd/setup-kind@v0.5.0 + with: + version: "v0.9.0" + image: 'kindest/node:v1.17.11' + - uses: actions/setup-go@v1 + with: + go-version: 1.13.x + - uses: actions/cache@v2 + with: + path: | + ~/go/pkg/mod + ~/.cache/go-build + key: ${{ runner.os }}-goleak-${{ hashFiles('**/go.sum') }}-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-goleak-${{ hashFiles('**/go.sum') }}- + ${{ runner.os }}-goleak- + - name: Run integration tests + env: + GOPATH: /tmp/go + run: | + ./scripts/localkube-integration.sh + rpaas-api-docker-image: name: "Publish rpaas-api image on dockerhub" needs: diff --git a/Makefile b/Makefile index 652a2a971..119ff31de 100644 --- a/Makefile +++ b/Makefile @@ -103,3 +103,7 @@ KUSTOMIZE=$(GOBIN)/kustomize else KUSTOMIZE=$(shell which kustomize) endif + +build/plugin/rpaasv2: + @mkdir -p build/_output/bin/ + go build -o build/_output/bin/rpaasv2 ./cmd/plugin/rpaasv2 \ No newline at end of file diff --git a/config/api/api.yaml b/config/api/api.yaml new file mode 100644 index 000000000..62f9a70af --- /dev/null +++ b/config/api/api.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: api + labels: + name: rpaas-api +spec: + selector: + matchLabels: + name: rpaas-api + replicas: 1 + template: + metadata: + labels: + name: rpaas-api + spec: + containers: + - command: + - rpaas-api + image: tsuru/rpaas-api:latest + name: rpaas-api + ports: + - name: api + containerPort: 9999 + resources: + limits: + cpu: 100m + memory: 30Mi + requests: + cpu: 100m + memory: 20Mi + terminationGracePeriodSeconds: 10 diff --git a/config/api/kustomization.yaml b/config/api/kustomization.yaml new file mode 100644 index 000000000..25cea9651 --- /dev/null +++ b/config/api/kustomization.yaml @@ -0,0 +1,3 @@ +resources: +- api.yaml +- service.yaml diff --git a/config/api/service.yaml b/config/api/service.yaml new file mode 100644 index 000000000..590139a08 --- /dev/null +++ b/config/api/service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: api + labels: + name: rpaas-api +spec: + ports: + - name: api + port: 9999 + targetPort: 9999 + selector: + name: rpaas-api + type: LoadBalancer diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml index 44a75ff45..69df13b28 100644 --- a/config/crd/kustomization.yaml +++ b/config/crd/kustomization.yaml @@ -1,6 +1,7 @@ # This kustomization.yaml is not intended to be run by itself, # since it depends on service name and namespace that are out of this kustomize package. # It should be run by config/default +namePrefix: operator- resources: - bases/extensions.tsuru.io_rpaasinstances.yaml - bases/extensions.tsuru.io_rpaasplans.yaml diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml index 467cce00b..2fe0ae680 100644 --- a/config/default/kustomization.yaml +++ b/config/default/kustomization.yaml @@ -6,7 +6,7 @@ namespace: rpaas-operator-system # "wordpress" becomes "alices-wordpress". # Note that it should also match with the prefix (text before '-') of the namespace # field above. -namePrefix: rpaas-operator- +namePrefix: rpaas- # Labels to add to all resources and selectors. #commonLabels: @@ -16,6 +16,7 @@ bases: - ../crd - ../rbac - ../manager +- ../api # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in # crd/kustomization.yaml #- ../webhook diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index 5c5f0b84c..720470e7a 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -1,2 +1,3 @@ resources: - manager.yaml +namePrefix: operator- \ No newline at end of file diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index b6c85a52d..038000824 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -1,10 +1,3 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - control-plane: controller-manager - name: system ---- apiVersion: apps/v1 kind: Deployment metadata: @@ -24,10 +17,10 @@ spec: spec: containers: - command: - - /manager + - rpaas-operator args: - --enable-leader-election - image: controller:latest + image: tsuru/rpaas-operator:latest name: manager resources: limits: diff --git a/config/rbac/kustomization.yaml b/config/rbac/kustomization.yaml index 7c08e4d38..fe32760ad 100644 --- a/config/rbac/kustomization.yaml +++ b/config/rbac/kustomization.yaml @@ -1,3 +1,4 @@ +namePrefix: operator- resources: - role.yaml - role_binding.yaml diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index b4b740eb1..12602ff5d 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -4,25 +4,83 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: creationTimestamp: null - name: rpaas-operator + name: manager-role rules: - apiGroups: - - extensions.tsuru.io + - "" resources: - - rpaasinstances + - pods + - services + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + verbs: + - '*' +- apiGroups: + - "" + resources: + - namespaces verbs: + - get - create - - delete +- apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - '*' +- apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: - get - - list - - patch - - update - - watch + - create - apiGroups: - extensions.tsuru.io resources: + - rpaasinstances - rpaasinstances/status + - rpaasinstances/scale + - rpaasplans + - rpaasflavors + - rpaasportallocations verbs: + - '*' +- apiGroups: + - nginx.tsuru.io + resources: + - '*' + verbs: + - '*' +- apiGroups: + - autoscaling + resources: + - horizontalpodautoscalers + verbs: + - '*' +- apiGroups: + - batch + resources: + - jobs + - cronjobs + verbs: + - '*' +# NOTE: Pod exec is required by RPaaS API due to PR #83. +- apiGroups: [""] + resources: + - pods/exec + verbs: + - create +- apiGroups: + - metrics.k8s.io + resources: + - pods + verbs: + - list - get - - patch - - update diff --git a/go.mod b/go.mod index 3bc684890..c9476a4e6 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.7.1 github.com/stretchr/testify v1.6.1 - github.com/tsuru/nginx-operator v0.6.0 + github.com/tsuru/nginx-operator v0.6.3 github.com/uber/jaeger-client-go v2.25.0+incompatible github.com/uber/jaeger-lib v2.4.0+incompatible // indirect github.com/urfave/cli/v2 v2.0.0 diff --git a/go.sum b/go.sum index 8bd76fd60..821547d49 100644 --- a/go.sum +++ b/go.sum @@ -765,8 +765,8 @@ github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa h1:RC4maTWLK github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= github.com/tsuru/config v0.0.0-20200717192526-2a9a0efe5f28 h1:ZUM5bc/TSos0Vvts+klLmPBGWPp/n/WfF3lhrmn8u5g= github.com/tsuru/config v0.0.0-20200717192526-2a9a0efe5f28/go.mod h1:mj6t8JKWU51GScTT50XRmDj65T5XhTyNvO5FUNV5zS4= -github.com/tsuru/nginx-operator v0.6.0 h1:ksHY3CXmlJHfPjbXXS9EM2th/ABmX4KE/p/a0IHK22o= -github.com/tsuru/nginx-operator v0.6.0/go.mod h1:hOn1KtyfcYltDBeKKtzNhcfTiZa17VmBM9fmAE2n1Ek= +github.com/tsuru/nginx-operator v0.6.3 h1:S1Jo4C7649emvP975SihPa03Uyc/dLzQwM4nAlxkbH4= +github.com/tsuru/nginx-operator v0.6.3/go.mod h1:hOn1KtyfcYltDBeKKtzNhcfTiZa17VmBM9fmAE2n1Ek= github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.0+incompatible h1:fY7QsGQWiCt8pajv4r7JEvmATdCVaWxXbjwyYwsNaLQ= diff --git a/scripts/localkube-integration.sh b/scripts/localkube-integration.sh index 1933209d1..ff76f5b59 100755 --- a/scripts/localkube-integration.sh +++ b/scripts/localkube-integration.sh @@ -2,58 +2,8 @@ set -euo pipefail -download_operator_sdk() { - local version="${1}" - local destination="${2}" - local operator_sdk_bin="${destination}/operator-sdk" - [[ -f "${operator_sdk_bin}" ]] && [[ $("${operator_sdk_bin}" version) == *"${version}"* ]] && echo -n "${operator_sdk_bin}" && return - - local os="$(get_os)" - case ${os} in - linux) - os="linux-gnu";; - darwin) - os="apple-darwin";; - esac - - curl -sLo ${operator_sdk_bin} "https://github.com/operator-framework/operator-sdk/releases/download/${version}/operator-sdk-${version}-x86_64-${os}" - chmod +x ${operator_sdk_bin} - echo -n ${operator_sdk_bin} -} - -download_kubectl() { - local version="${1}" - local destination="${2}" - - local kubectl_bin="${destination}/kubectl" - - [[ -f "${kubectl_bin}" ]] && [[ $("${kubectl_bin}" version --client) == *"${version}"* ]] && echo -n "${kubectl_bin}" && return - - local os="$(get_os)" - local arch="$(get_arch)" - - curl -sLo ${kubectl_bin} "https://storage.googleapis.com/kubernetes-release/release/${version}/bin/${os}/${arch}/kubectl" - chmod +x ${kubectl_bin} - echo -n ${kubectl_bin} -} - -download_kind() { - local version="${1}" - local destination="${2}" - - local kind_bin="${destination}/kind" - - [[ -f "${kind_bin}" ]] && [[ $(${kind_bin} version) == *"${version}"* ]] && echo -n "${kind_bin}" && return - - local os="$(get_os)" - local arch="$(get_arch)" - - curl -sLo "${kind_bin}" "https://github.com/kubernetes-sigs/kind/releases/download/${version}/kind-${os}-${arch}" - chmod +x "${kind_bin}" - echo -n "${kind_bin}" -} get_os() { local os="$(uname -s)" @@ -79,38 +29,28 @@ get_arch() { esac } -create_k8s_cluster() { - local kind_bin="${1}" - local name="${2}" - local wait="${3:-"10m"}" - - clusters=$(kind get clusters) - - if [[ "${clusters}" == *"${cluster_name}"* ]]; then - - return - fi +function onerror() { + echo + echo "RPAAS OPERATOR LOGS:" + kubectl logs deploy/rpaas-operator-controller-manager -n ${rpaas_system_namespace} || true + echo + echo "NGINX OPERATOR LOGS:" + kubectl logs deploy/nginx-operator-controller -n ${rpaas_system_namespace} || true + echo + echo "RPAAS API LOGS:" + kubectl logs deploy/rpaas-api -n ${rpaas_system_namespace} || true + echo - ${kind_bin} create cluster \ - --name "${cluster_name}" --wait "10m" \ - --image "kindest/node:${KUBERNETES_VERSION}" + [[ -n ${kubectl_port_forward_pid} ]] && kill ${kubectl_port_forward_pid} } -delete_k8s_cluster() { - local kind_bin="${1}" - local name=${2} - - ${kind_bin} delete cluster --name "${name}" -} +trap onerror ERR run_nginx_operator() { - local kubectl_bin="${1}" - local namespace="${2}" - local kind_bin="${3}" - local cluster_name="${4}" - local tag="${5:-"integration"}" + local namespace="${1}" local nginx_operator_dir="${GOPATH}/src/github.com/tsuru/nginx-operator" local nginx_operator_revision=$(go mod download -json github.com/tsuru/nginx-operator | jq .Version -r | awk -F '-' '{print $NF}') + local tag=$(echo ${nginx_operator_revision} | tr v '\0') if [[ ! -d ${nginx_operator_dir} ]]; then mkdir -p $(dirname ${nginx_operator_dir}) @@ -121,137 +61,66 @@ run_nginx_operator() { git checkout ${nginx_operator_revision} popd - echo "Building container image of NGINX operator using tag \"${tag}\"..." - make -C ${nginx_operator_dir} build TAG="${tag}" - - ${kind_bin} load docker-image --name ${cluster_name} tsuru/nginx-operator:${tag} + echo "Pulling image of NGINX operator using tag \"${tag}\"..." + docker pull tsuru/nginx-operator:${tag} - ls ${nginx_operator_dir}/deploy/crds/*_crd.yaml | - xargs -I{} ${kubectl_bin} -n ${namespace} apply -f {} + kind load docker-image tsuru/nginx-operator:${tag} - ls ${nginx_operator_dir}/deploy/{role,service_account}.yaml | - xargs -I{} ${kubectl_bin} -n ${namespace} apply -f {} + (cd ${nginx_operator_dir}/config/default && kustomize edit set namespace ${namespace}) + (cd ${nginx_operator_dir}/config/default && kustomize edit set image tsuru/nginx-operator=tsuru/nginx-operator:${tag}) - sed -E "s/(namespace:) (.+)/\1 ${namespace}/" ${nginx_operator_dir}/deploy/role_binding.yaml | - ${kubectl_bin} -n ${namespace} apply -f - + kustomize build ${nginx_operator_dir}/config/default | kubectl -n ${namespace} apply -f - - sed -e 's/imagePullPolicy: Always/imagePullPolicy: Never/' ${nginx_operator_dir}/deploy/operator.yaml | - sed -E "s|(tsuru/nginx-operator):latest|\1:${tag}|" | - ${kubectl_bin} -n ${namespace} apply -f - + kubectl rollout status deployment/nginx-operator-controller -n ${namespace} } run_rpaas_operator() { - local kubectl_bin="${1}" - local namespace="${2}" - local kind_bin="${3}" - local cluster_name="${4}" - local tag="${5:-"integration"}" + local namespace="${1}" + local tag="${2:-"integration"}" echo "Building container images of RPaaS operator and API using tag \"${tag}\"..." - make build TAG="${tag}" + docker build -t "tsuru/rpaas-operator:${tag}" -f Dockerfile.operator . + docker build -t "tsuru/rpaas-api:${tag}" -f Dockerfile.api . echo tsuru/rpaas-{api,operator}:${tag} | tr ' ' '\n' | - xargs -I{} ${kind_bin} load docker-image --name ${cluster_name} {} + xargs -I{} kind load docker-image {} - ls ./deploy | grep -E ".+\.yaml" | grep -vE "api|operator" | - xargs -I{} ${kubectl_bin} -n ${namespace} apply -f ./deploy/{} + (cd ./config/default && kustomize edit set namespace ${namespace}) + (cd ./config/default && kustomize edit set image tsuru/rpaas-operator=tsuru/rpaas-operator:${tag}) + (cd ./config/default && kustomize edit set image tsuru/rpaas-api=tsuru/rpaas-api:${tag}) - sed -E "s/(namespace:) (.+)/\1 ${namespace}/" ./deploy/role_binding.yaml | - ${kubectl_bin} -n ${namespace} apply -f - + kustomize build ./config/default | kubectl -n ${namespace} apply -f - - sed -e 's/imagePullPolicy: Always/imagePullPolicy: Never/' deploy/operator.yaml | - sed -e "s|tsuru/rpaas-operator|&:${tag}|" | - ${kubectl_bin} -n ${namespace} apply -f - - - sed -e 's/imagePullPolicy: Always/imagePullPolicy: Never/' deploy/api.yaml | - sed -e "s|tsuru/rpaas-api|&:${tag}|" | - ${kubectl_bin} -n ${namespace} apply -f - - - ls ./deploy/crds/*_crd.yaml | - xargs -I{} ${kubectl_bin} -n ${namespace} apply -f {} + kubectl rollout status deployment/rpaas-api -n ${namespace} + kubectl rollout status deployment/rpaas-operator-controller-manager -n ${namespace} } -function onerror() { - echo - echo "RPAAS OPERATOR LOGS:" - ${kubectl_bin} logs deploy/rpaas-operator -n ${rpaas_system_namespace} - echo - echo "NGINX OPERATOR LOGS:" - ${kubectl_bin} logs deploy/nginx-operator -n ${rpaas_system_namespace} - echo - echo "RPAAS API LOGS:" - ${kubectl_bin} logs deploy/rpaas-api -n ${rpaas_system_namespace} - echo - - [[ -n ${kubectl_port_forward_pid} ]] && kill ${kubectl_port_forward_pid} -} - -trap onerror ERR - [[ -n ${DEBUG:-} ]] && set -x -# When KUBERNETES_VERSION isn't defined, use default -export KUBERNETES_VERSION="${KUBERNETES_VERSION:-"v1.14.3"}" -kind_version="v0.6.1" -operator_sdk_version="v0.13.0" - -local_tmp_dir="$(pwd)/.tmp" -mkdir -p "${local_tmp_dir}" -echo "Using temporary dir: ${local_tmp_dir}" -echo - -export PATH="${local_tmp_dir}:${PATH}" - -echo "Downloading the kind (Kubernetes-IN-Docker)..." -kind_bin="$(download_kind ${kind_version} ${local_tmp_dir})" -echo "kind path: ${kind_bin} " -echo "kind version: $(${kind_bin} version)" -echo - -cluster_name="rpaasv2-integration" -echo "Creating a Kubernetes cluster \"${cluster_name}\" with kubernetes ${KUBERNETES_VERSION}..." -create_k8s_cluster "${kind_bin}" "${cluster_name}" -echo - -echo "Downloading the kubectl..." -kubectl_bin="$(download_kubectl ${KUBERNETES_VERSION} ${local_tmp_dir})" -echo "kubectl path: ${kubectl_bin}" -echo "kubectl version: $(${kubectl_bin} version)" -echo - -${kubectl_bin} config use-context "kind-${cluster_name}" - -echo "Downloading the operator-sdk..." -operator_sdk_bin=$(download_operator_sdk ${operator_sdk_version} ${local_tmp_dir}) -echo "operator-sdk path: ${operator_sdk_bin}" -echo "operator-sdk version: $(${operator_sdk_bin} version)" -echo export GO111MODULE=on -echo $(which operator-sdk) - # show some info about Kubernetes cluster -${kubectl_bin} cluster-info -${kubectl_bin} get all +kubectl cluster-info +kubectl get all rpaas_system_namespace="rpaas-system" echo "Using namespace \"${rpaas_system_namespace}\" to run \"nginx-operator\" and \"rpaas-operator\"..." -${kubectl_bin} delete namespace "${rpaas_system_namespace}" || true -${kubectl_bin} create namespace "${rpaas_system_namespace}" +kubectl delete namespace "${rpaas_system_namespace}" || true +kubectl create namespace "${rpaas_system_namespace}" -run_nginx_operator "${kubectl_bin}" "${rpaas_system_namespace}" "${kind_bin}" "${cluster_name}" -run_rpaas_operator "${kubectl_bin}" "${rpaas_system_namespace}" "${kind_bin}" "${cluster_name}" +run_nginx_operator "${rpaas_system_namespace}" +run_rpaas_operator "${rpaas_system_namespace}" sleep 30s -${kubectl_bin} get deployment --all-namespaces -${kubectl_bin} get pods --all-namespaces +kubectl get deployment --all-namespaces +kubectl get pods --all-namespaces local_rpaas_api_port=39999 -${kubectl_bin} -n "${rpaas_system_namespace}" port-forward svc/rpaas-api ${local_rpaas_api_port}:9999 --address=127.0.0.1 & +kubectl -n "${rpaas_system_namespace}" port-forward svc/rpaas-api ${local_rpaas_api_port}:9999 --address=127.0.0.1 & kubectl_port_forward_pid=${!} sleep 10s @@ -261,8 +130,6 @@ make build/plugin/rpaasv2 RPAAS_PLUGIN_BIN=$(pwd)/build/_output/bin/rpaasv2 \ RPAAS_API_ADDRESS="http://127.0.0.1:${local_rpaas_api_port}" \ RPAAS_OPERATOR_INTEGRATION=1 \ -go test -test.v ./... - -kill ${kubectl_port_forward_pid} +go test -test.v ./test/... -# delete_k8s_cluster "${kind_bin}" "${cluster_name}" +kill ${kubectl_port_forward_pid} \ No newline at end of file diff --git a/test/helpers.go b/test/helpers.go index a467f0a3b..5f6a44f6a 100644 --- a/test/helpers.go +++ b/test/helpers.go @@ -16,6 +16,7 @@ import ( "regexp" "strconv" "strings" + "time" "github.com/tsuru/rpaas-operator/internal/pkg/rpaas" corev1 "k8s.io/api/core/v1" @@ -145,6 +146,19 @@ func kubectl(arg ...string) ([]byte, error) { return out, nil } +func kubectlWithRetry(args ...string) ([]byte, error) { + timeout := time.Now().Add(time.Second * 30) + for { + out, err := kubectl(args...) + + if err == nil || time.Now().After(timeout) { + return out, err + } + + time.Sleep(time.Second) + } +} + type rpaasApi struct { address string client *http.Client @@ -239,7 +253,7 @@ func (api *rpaasApi) health() (bool, error) { } func (api *rpaasApi) bind(appName, instanceName, host string) error { - data := url.Values{"app-host": []string{host}, "app-name": []string{appName}} + data := url.Values{"app-hosts": []string{host}, "app-name": []string{appName}} rsp, err := api.client.PostForm(fmt.Sprintf("%s/resources/%s/bind-app", api.address, instanceName), data) if err != nil { return err diff --git a/test/integration_test.go b/test/integration_test.go index 9c1a17854..e65547355 100644 --- a/test/integration_test.go +++ b/test/integration_test.go @@ -223,7 +223,7 @@ func Test_RpaasApi(t *testing.T) { require.NoError(t, err) }() - _, err = kubectl("wait", "--for=condition=Ready", "-l", "app=hello", "pod", "--timeout", "5m", "-n", namespaceName) + _, err = kubectlWithRetry("wait", "--for=condition=Ready", "-l", "app=hello", "pod", "--timeout", "5m", "-n", namespaceName) require.NoError(t, err) serviceName := fmt.Sprintf("svc/%s-service", instanceName) @@ -293,10 +293,15 @@ func Test_RpaasApi(t *testing.T) { require.NoError(t, err) }() - _, err = kubectl("wait", "--for=condition=Ready", "-l", "app=hello", "pod", "--timeout", "5m", "-n", namespaceName) - require.NoError(t, err) - _, err = kubectl("wait", "--for=condition=Ready", "-l", "app=echo-server", "pod", "--timeout", "5m", "-n", namespaceName) - require.NoError(t, err) + podLabels := []string{"app=hello", "app=echo-server"} + for _, podLabel := range podLabels { + _, err = kubectlWithRetry("wait", "--for=condition=Ready", "-l", podLabel, "pod", "--timeout", "5m", "-n", namespaceName) + if !assert.NoError(t, err) { + troubleshoot, err := kubectl("get", "pods", "-l", podLabel, "-n", namespaceName) + assert.NoError(t, err) + t.Errorf("Current pods: %s", string(troubleshoot)) + } + } serviceName := fmt.Sprintf("svc/%s-service", instanceName) servicePort := "80" @@ -457,6 +462,8 @@ func Test_RpaasApi(t *testing.T) { require.NoError(t, err) defer cleanFunc() + time.Sleep(time.Second) + configList, err := getConfigList(instanceName, namespaceName) require.NoError(t, err) assert.Equal(t, len(configList.Items), 1) @@ -553,7 +560,7 @@ func getReadyNginx(name, namespace string, expectedPods, expectedSvcs int) (*ngi waitArgs = append(waitArgs, fmt.Sprintf("pod/%s", pod.Name)) } - if _, err = kubectl(waitArgs...); err == nil { + if _, err = kubectlWithRetry(waitArgs...); err == nil { return nginx, nil } }