Skip to content

Instantly share code, notes, and snippets.

@dberstein
Last active December 23, 2022 11:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dberstein/a24b1c02df71d40c2384034c5bbb4c50 to your computer and use it in GitHub Desktop.
Save dberstein/a24b1c02df71d40c2384034c5bbb4c50 to your computer and use it in GitHub Desktop.
#!/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