From b4dd5cf42cb466ca5d22332778d9cd3bc20c19e5 Mon Sep 17 00:00:00 2001
From: Ruslan Aliev <raliev@mirantis.com>
Date: Thu, 13 May 2021 13:00:28 -0500
Subject: [PATCH] Remove Kind-based validation with dry-run of phases

This validation approach is no longer needed and less
effective than static one, so it should be deleted to not
consume additional time and resources during the validation
process.

Change-Id: I88603723d9a423955bd88d23e7b8e2a8275d9dde
Signed-off-by: Ruslan Aliev <raliev@mirantis.com>
Closes: #543
---
 .../deployment/azure/11_build_kind_cluster.sh |   2 +-
 .../{document => deployment/kind}/get_kind.sh |   0
 .../kind}/start_kind.sh                       |   8 +-
 .../provider_common/01_install_kind.sh        |   2 +-
 tools/document/validate_site_docs.sh          | 148 ------------------
 tools/validate_docs                           |  69 ++++++--
 zuul.d/jobs.yaml                              |   2 +-
 7 files changed, 62 insertions(+), 169 deletions(-)
 rename tools/{document => deployment/kind}/get_kind.sh (100%)
 rename tools/{document => deployment/kind}/start_kind.sh (90%)
 delete mode 100755 tools/document/validate_site_docs.sh

diff --git a/tools/deployment/azure/11_build_kind_cluster.sh b/tools/deployment/azure/11_build_kind_cluster.sh
index e3df71bd5..93faea83e 100755
--- a/tools/deployment/azure/11_build_kind_cluster.sh
+++ b/tools/deployment/azure/11_build_kind_cluster.sh
@@ -23,7 +23,7 @@ REMOTE_WORK_DIR=/tmp
 
 # get kind
 echo "Fetching kind from ${KIND_URL}..."
-TMP=$(KIND_URL=${KIND_URL} ./tools/document/get_kind.sh)
+TMP=$(KIND_URL=${KIND_URL} ./tools/deployment/kind/get_kind.sh)
 export KIND=${TMP}/kind
 
 $KIND delete cluster --name capi-azure
diff --git a/tools/document/get_kind.sh b/tools/deployment/kind/get_kind.sh
similarity index 100%
rename from tools/document/get_kind.sh
rename to tools/deployment/kind/get_kind.sh
diff --git a/tools/document/start_kind.sh b/tools/deployment/kind/start_kind.sh
similarity index 90%
rename from tools/document/start_kind.sh
rename to tools/deployment/kind/start_kind.sh
index 79109b0e2..f899e4756 100755
--- a/tools/document/start_kind.sh
+++ b/tools/deployment/kind/start_kind.sh
@@ -18,21 +18,21 @@ set -xe
 # Usage
 # example 1: create a kind cluster, with name as airship
 #
-#              ./tools/document/start_kind.sh
+#              ./tools/deployment/kind/start_kind.sh
 #
 # example 2: create a kind cluster, with a custom name
 #
-#              CLUSTER=ephemeral-cluster ./tools/document/start_kind.sh
+#              CLUSTER=ephemeral-cluster ./tools/deployment/kind/start_kind.sh
 #
 # example 3: create a kind cluster, using custom name and config
 #
 #              CLUSTER=ephemeral-cluster KIND_CONFIG=./tools/deployment/templates/kind-cluster-with-extramounts.yaml \
-#              ./tools/document/start_kind.sh
+#              ./tools/deployment/kind/start_kind.sh
 #
 # example 4: create a kind cluster with name as airship, using custom config
 #
 #              KIND_CONFIG=./tools/deployment/templates/kind-cluster-with-extramounts.yaml \
-#              ./tools/document/start_kind.sh
+#              ./tools/deployment/kind/start_kind.sh
 
 : ${KIND:="/usr/local/bin/kind"}
 : ${CLUSTER:="airship"} # NB: kind prepends "kind-"
diff --git a/tools/deployment/provider_common/01_install_kind.sh b/tools/deployment/provider_common/01_install_kind.sh
index 629c16d6b..0d9532220 100755
--- a/tools/deployment/provider_common/01_install_kind.sh
+++ b/tools/deployment/provider_common/01_install_kind.sh
@@ -13,7 +13,7 @@
 
 : ${KIND_VERSION:="v0.9.0"}
 export KIND_URL="https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-$(uname)-amd64"
-TMP=$(KIND_URL=${KIND_URL} tools/document/get_kind.sh)
+TMP=$(KIND_URL=${KIND_URL} tools/deployment/kind/get_kind.sh)
 export KIND=${TMP}/kind
 sudo cp ${KIND} /usr/local/bin/
 ${KIND} version
\ No newline at end of file
diff --git a/tools/document/validate_site_docs.sh b/tools/document/validate_site_docs.sh
deleted file mode 100755
index cb9eeedd8..000000000
--- a/tools/document/validate_site_docs.sh
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/bin/bash
-
-# 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 -xe
-
-# The root of the manifest structure to be validated.
-# This corresponds to the targetPath in an airshipctl config
-: ${MANIFEST_ROOT:="$(basename "${PWD}")/manifests"}
-# The location of sites whose manifests should be validated.
-# This are relative to MANIFEST_ROOT above
-: ${MANIFEST_PATH:="manifests/site"}
-: ${SITE_ROOT:="$(basename "${PWD}")/${MANIFEST_PATH}"}
-: ${MANIFEST_REPO_URL:="https://review.opendev.org/airship/airshipctl"}
-: ${SITE:="test-workload"}
-: ${CONTEXT:="kind-airship"}
-: ${AIRSHIPKUBECONFIG:="${HOME}/.airship/kubeconfig"}
-: ${AIRSHIPKUBECONFIG_BACKUP:="${AIRSHIPKUBECONFIG}-backup"}
-: ${TOOLS_PATH:="${MANIFEST_ROOT}/airshipctl/tools"}
-
-: ${KUBECTL:="/usr/local/bin/kubectl"}
-TMP=$(mktemp -d)
-
-# Use the local project airshipctl binary as the default if it exists,
-# otherwise use the one on the PATH
-if [ -f "bin/airshipctl" ]; then
-  AIRSHIPCTL_DEFAULT="bin/airshipctl"
-else
-  AIRSHIPCTL_DEFAULT="$(which airshipctl)"
-fi
-
-: ${AIRSHIPCONFIG:="${TMP}/config"}
-: ${AIRSHIPCTL:="${AIRSHIPCTL_DEFAULT}"}
-ACTL="${AIRSHIPCTL} --airshipconf ${AIRSHIPCONFIG}"
-
-export KUBECONFIG="${AIRSHIPKUBECONFIG}"
-
-# TODO: use `airshipctl config` to do this once all the needed knobs are exposed
-# The non-default parts are to set the targetPath appropriately,
-# and to craft up cluster/contexts to avoid the need for automatic kubectl reconciliation
-function generate_airshipconf() {
-  cluster=$1
-
-  cat <<EOL >${AIRSHIPCONFIG}
-apiVersion: airshipit.org/v1alpha1
-contexts:
-  ${CONTEXT}_${cluster}:
-    manifest: ${CONTEXT}_${cluster}
-    managementConfiguration: default
-currentContext: ${CONTEXT}_${cluster}
-kind: Config
-managementConfiguration:
-  default:
-    insecure: true
-    systemActionRetries: 30
-    systemRebootDelay: 30
-    type: redfish
-manifests:
-  ${CONTEXT}_${cluster}:
-    phaseRepositoryName: primary
-    repositories:
-      primary:
-        checkout:
-          branch: master
-          commitHash: ""
-          force: false
-          tag: ""
-        url: ${MANIFEST_REPO_URL}
-    targetPath: ${MANIFEST_ROOT}
-    metadataPath: ${MANIFEST_PATH}/${SITE}/metadata.yaml
-EOL
-}
-
-function cleanup() {
-  ${KIND} delete cluster --name $CLUSTER
-  rm -rf ${TMP}
-
-  if [ -f "${AIRSHIPKUBECONFIG_BACKUP}" ]; then
-    echo "Restoring a backup copy of kubeconfig"
-    cp "${AIRSHIPKUBECONFIG_BACKUP}" "${AIRSHIPKUBECONFIG}"
-  fi
-}
-trap cleanup EXIT
-
-if [ -f "${AIRSHIPKUBECONFIG}" ]; then
-  echo "Making a backup copy of kubeconfig"
-  cp "${AIRSHIPKUBECONFIG}" "${AIRSHIPKUBECONFIG_BACKUP}"
-fi
-
-generate_airshipconf "default"
-
-phase_plans=$(airshipctl --airshipconf ${AIRSHIPCONFIG} plan list | grep "PhasePlan" | awk -F '/' '{print $2}' | awk '{print $1}')
-for plan in $phase_plans; do
-  # Perform static validation first, add support of all plans later
-  if [ "$plan" = "phasePlan" ]; then
-    airshipctl --airshipconf ${AIRSHIPCONFIG} plan validate $plan
-  fi
-
-  cluster_list=$(airshipctl --airshipconf ${AIRSHIPCONFIG} cluster list)
-  # Loop over all cluster types and phases for the given site
-  for cluster in $cluster_list; do
-    echo -e "\n**** Rendering phases for cluster: ${cluster}"
-
-    export CLUSTER="${cluster}"
-
-    # Start a fresh, empty kind cluster for validating documents
-    ${TOOLS_PATH}/document/start_kind.sh
-
-    generate_airshipconf ${cluster}
-
-    # A sequential list of potential phases.  A fancier attempt at this has been
-    # removed since it was choking in certain cases and got to be more trouble than was worth.
-    # This should be removed once we have a phase map that is smarter.
-    # In the meantime, as new phases are added, please add them here as well.
-    phases=$(airshipctl --airshipconf ${AIRSHIPCONFIG} phase list --plan $plan -c $cluster | grep Phase | awk -F '/' '{print $2}' | awk '{print $1}' || true)
-
-    for phase in $phases; do
-      # Guard against bootstrap or initinfra being missing, which could be the case for some configs
-      echo -e "\n*** Rendering ${cluster}/${phase}"
-
-      # step 1: actually apply all crds in the phase
-      # TODO: will need to loop through phases in order, eventually
-      # e.g., load CRDs from initinfra first, so they're present when validating later phases
-      ${AIRSHIPCTL} --airshipconf ${AIRSHIPCONFIG} phase render ${phase} -s executor -k CustomResourceDefinition >${TMP}/${phase}-crds.yaml
-
-      if [ -s ${TMP}/${phase}-crds.yaml ]; then
-        ${KUBECTL} --context ${CLUSTER} apply -f ${TMP}/${phase}-crds.yaml
-      fi
-
-      # step 2: dry-run the entire phase
-      ${ACTL} phase run --dry-run ${phase}
-
-    done
-    # Delete cluster kubeconfig
-    rm ${KUBECONFIG}
-    ${KIND} delete cluster --name $CLUSTER
-  done
-done
diff --git a/tools/validate_docs b/tools/validate_docs
index 2b1636856..64524bd45 100755
--- a/tools/validate_docs
+++ b/tools/validate_docs
@@ -24,26 +24,67 @@ set -xe
 : ${MANIFEST_PATH:="manifests/site"}
 : ${SITE_ROOTS:="$(basename "${PWD}")/${MANIFEST_PATH}"}
 : ${MANIFEST_REPO_URL:="https://review.opendev.org/airship/airshipctl"}
-: ${TOOLS_PATH:="${MANIFEST_ROOT}/airshipctl/tools"}
 
-# get kind
-echo "Fetching kind from ${KIND_URL}..."
-TMP=$(KIND_URL=${KIND_URL} ${TOOLS_PATH}/document/get_kind.sh)
-export KIND=${TMP}/kind
-export KUBECTL_URL
+# Name of specific site to be validated
+SITE_NAME=${SITE_NAME:-$1}
+TMP=$(mktemp -d)
 
-sites_to_skip=(az-test-site docker-test-site gcp-test-site openstack-test-site)
+# TODO: use `airshipctl config` to do this once all the needed knobs are exposed
+function generate_airshipconf() {
+  cat <<EOL >"${TMP}/$1.cfg"
+apiVersion: airshipit.org/v1alpha1
+contexts:
+  default_context:
+    manifest: default_manifest
+    managementConfiguration: default_mgmt_config
+currentContext: default_context
+kind: Config
+managementConfiguration:
+  default_mgmt_config:
+    insecure: true
+    systemActionRetries: 30
+    systemRebootDelay: 30
+    type: redfish
+manifests:
+  default_manifest:
+    phaseRepositoryName: primary
+    repositories:
+      primary:
+        checkout:
+          branch: master
+          commitHash: ""
+          force: false
+          tag: ""
+        url: ${MANIFEST_REPO_URL}
+    targetPath: ${MANIFEST_ROOT}
+    metadataPath: ${MANIFEST_PATH}/$1/metadata.yaml
+EOL
+}
 
 for site_root in ${SITE_ROOTS}; do
   for site in $(ls ${MANIFEST_ROOT}/${site_root}); do
-      if [[ " ${sites_to_skip[@]} " =~ " ${site} " ]]; then
-         continue
+    # TODO (raliev) remove this condition later
+    # Temporary solution to disable validation for outdated sites, this list will be removed eventually
+    sites_to_skip=(az-test-site docker-test-site gcp-test-site openstack-test-site)
+    if [[ " ${sites_to_skip[@]} " =~ " ${site} " ]]; then
+      continue
+    fi
+
+    # Validate only specific site if set
+    if [ ! -z "$SITE_NAME" ] && [ "$site" != "$SITE_NAME" ]; then
+      continue
+    fi
+
+    echo -e "\nValidating site: ${MANIFEST_ROOT}/${site_root}/${site}\n****************"
+    generate_airshipconf $site
+    phase_plans=$(airshipctl --airshipconf "${TMP}/$site.cfg" plan list | awk -F'/' '/PhasePlan/ {print $2}' | awk '{print $1}')
+    for plan in $phase_plans; do
+      # Perform static validation, add support of all plans later
+      # TODO (raliev) remove this condition later
+      if [ "$plan" = "phasePlan" ]; then
+        airshipctl --airshipconf "${TMP}/$site.cfg" plan validate $plan
       fi
-      echo -e "\nValidating site: ${MANIFEST_ROOT}/${site_root}/${site}\n****************"
-      MANIFEST_ROOT=${MANIFEST_ROOT} SITE_ROOT=${site_root} SITE=${site} \
-      MANIFEST_REPO_URL=${MANIFEST_REPO_URL} MANIFEST_PATH=${MANIFEST_PATH} MANIFEST_REPO_URL=${MANIFEST_REPO_URL} \
-      TOOLS_PATH=${TOOLS_PATH} \
-        ${TOOLS_PATH}/document/validate_site_docs.sh
       echo "Validation of site ${site} is successful!"
+    done
   done
 done
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 31fdb1583..5de84269d 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -172,7 +172,7 @@
         - ./tools/deployment/provider_common/02_install_jq.sh
         - ./tools/deployment/provider_common/03_install_pip.sh
         - ./tools/deployment/provider_common/04_install_yq.sh
-        - CLUSTER=ephemeral-cluster KIND_CONFIG=./tools/deployment/templates/kind-cluster-with-extramounts ./tools/document/start_kind.sh
+        - CLUSTER=ephemeral-cluster KIND_CONFIG=./tools/deployment/templates/kind-cluster-with-extramounts ./tools/deployment/kind/start_kind.sh
         - AIRSHIP_CONFIG_METADATA_PATH=manifests/site/docker-test-site/metadata.yaml SITE=docker-test-site EXTERNAL_KUBECONFIG="true" ./tools/deployment/22_test_configs.sh
         - ./tools/deployment/23_pull_documents.sh
         - PROVIDER=default SITE=docker-test-site ./tools/deployment/26_deploy_capi_ephemeral_node.sh