Last active
December 23, 2022 11:21
-
-
Save dberstein/a24b1c02df71d40c2384034c5bbb4c50 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
DEFAULT_CHART="${1:-grafana/loki-stack}" | |
REPO_NAME="${2:-grafana}" | |
REPO_URL="${3:-https://grafana.github.io/helm-charts}" | |
helm repo add "${REPO_NAME}" "${REPO_URL}" | |
helm search repo "${REPO_NAME}" | |
read -p "Chart? [${DEFAULT_CHART}]: " CHART | |
[ -z "${CHART}" ] && CHART="${DEFAULT_CHART}" | |
if [ 0 -eq $(helm search repo "${REPO_NAME}" | grep -c "^${CHART}\s") ]; then | |
>&2 echo "ERROR chart not found: ${CHART}" | |
exit 1 | |
fi | |
REPO_CHART=$(echo ${CHART} | sed -r 's#^'${REPO_NAME}'/##') | |
CHART_YAML="yaml/${CHART}.yaml" | |
CHART_YAML_DIR="$(dirname ${CHART_YAML})" | |
CHART_TF="tf/${CHART}.tf" | |
CHART_TF_DIR="$(dirname ${CHART_TF})" | |
# if [ -z "$(command -v dredger)" ]; then | |
# [ -d "$(dirname $0)/dredger" ] || (git clone https://github.com/synchronoss/dredger.git && cd dredger && make dredger) | |
# PATH="$(dirname $0)/dredger:$PATH" | |
# fi | |
# If tool k2tf not present ... | |
if [ -z "$(command -v k2tf)" ]; then | |
# ... build it from source and add directory to PATH ... | |
[ -d "$(dirname $0)/k2tf" ] || (git clone https://github.com/sl1pm4t/k2tf.git && cd k2tf && make build) | |
PATH="$(dirname $0)/k2tf:$PATH" | |
fi | |
# YAMLs ... | |
rm -rf "${CHART_YAML_DIR}" \ | |
&& mkdir -p "${CHART_YAML_DIR}" \ | |
&& helm --debug template '${var.repo_chart}' --namespace '${var.namespace}' --repo "${REPO_URL}" "${REPO_CHART}" > "${CHART_YAML}" | |
# ... proceed even if helm failed ... | |
( \ | |
cd "${CHART_YAML_DIR}" \ | |
&& csplit --quiet --prefix='split-' --suffix-format='%03d.yaml' -z --suppress-matched "$(basename ${CHART_YAML})" /---/ '{*}' \ | |
&& rm "$(basename ${CHART_YAML})"; \ | |
) \ | |
&& grep -HR '# Source:' "${CHART_YAML_DIR}" \ | |
| sed -r 's#^.*/(.*).yaml:[^:]*: (.*).yaml$#\1:\2#g' > "${CHART_YAML_DIR}/splits.txt" \ | |
&& awk -F: '{printf "(cd '${CHART_YAML_DIR}' && mv %s.yaml %s.yaml;)\n", $1, gensub("/", "-", "g", $2)}' "${CHART_YAML_DIR}/splits.txt" \ | |
| sh \ | |
&& rm "${CHART_YAML_DIR}/splits.txt" | |
# fix unquoted strings in array (role.yaml I'm looking at you) ... | |
for F in $(fgrep -lR '[${' "${CHART_YAML_DIR}"); do | |
sed -ri'' 's#\[(\s*\$\{[^}]*)}([^]]*)#['\''\1}\2'\''#g' $F | |
done | |
## TFs ... | |
rm -rf "${CHART_TF_DIR}" \ | |
&& mkdir -p "${CHART_TF_DIR}" \ | |
&& find "${CHART_YAML_DIR}" -type f -name '*.yaml' -exec basename {} \; \ | |
| xargs -I{} sh -c 'echo k2tf --overwrite-existing -f "'${CHART_YAML_DIR}'"/{} -o "'${CHART_TF_DIR}'/$(echo {}|sed "s#\.yaml#.tf#g")"' \ | |
| sh \ | |
&& cat <<EOS > "${CHART_TF_DIR}/variables.tf" | |
variable "repo_chart" { | |
type = string | |
default = "${REPO_CHART}" | |
} | |
variable "namespace" {} | |
EOS | |
# Adjustments ... | |
find "${CHART_TF_DIR}" -type f | xargs -i sed -i'' '/^$/d' {} | |
find "${CHART_TF_DIR}" -type f | xargs sed -ri'' 's#^resource "(kubernetes_)([^"].*)" "\$\$\{var\.repo_chart\}_(.*)$#resource "\1\2" "\2_\3#g' | |
find "${CHART_TF_DIR}" -type f | xargs sed -ri'' 's#\$\$\{var\.#${var.#g;s#empty_dir = \{\}#empty_dir {}#g' | |
# Validations ... | |
(cd "${CHART_TF_DIR}" && terraform fmt && terraform init && terraform validate) | |
PROVIDER_DIR="$(python3 -c 'import os; print(os.path.relpath(".", "'${CHART_TF_DIR}'"))')" | |
cat <<EOS | |
# Suggested command(s): | |
# | |
# ln -nsf "${PROVIDER_DIR}/provider.tf" "${CHART_TF_DIR}" && NS=some-namespace && (cd "${CHART_TF_DIR}" \\ | |
# && kubectl create namespace \$NS \\ | |
# && terraform apply -var=namespace=\$NS \\ | |
# ;) | |
EOS |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment