Created
August 5, 2019 16:33
-
-
Save kvaps/f1b1b723b31bb24e854d92f449859987 to your computer and use it in GitHub Desktop.
Helper script for easy migration from Ksonnet to Qbec
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/bash | |
function parse_yaml { | |
local prefix=$2 | |
local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') | |
sed -ne "s|^\($s\):|\1|" \ | |
-e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \ | |
-e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 | | |
awk -F$fs '{ | |
indent = length($1)/2; | |
vname[indent] = $2; | |
for (i in vname) {if (i > indent) {delete vname[i]}} | |
if (length($3) > 0) { | |
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")} | |
printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3); | |
} | |
}' | |
} | |
eval $(parse_yaml app.yaml) | |
envs=$(compgen -v | sed -n 's/^environments_\(.*\)_path/\1/p') | |
if [ "$1" = "rm" ]; then | |
( | |
set -x | |
rm -f "./app.yaml" | |
rm -fr "./lib/" | |
) | |
for env in $envs; do | |
( | |
set -x | |
rm -fr "./environments/$env/" | |
) | |
done | |
exit 0 | |
fi | |
cat > qbec.yaml <<EOT | |
apiVersion: qbec.io/v1alpha1 | |
kind: App | |
metadata: | |
name: $name | |
spec: | |
environments: | |
EOT | |
for env in $envs; do | |
cat >> qbec.yaml <<EOT | |
$env: | |
defaultNamespace: $(eval echo "\$environments_${env}_destination_namespace") | |
server: $(eval echo "\$environments_${env}_destination_server") | |
EOT | |
done | |
cat >> qbec.yaml <<EOT | |
vars: {} | |
EOT | |
cat > params.libsonnet <<EOT | |
// this file returns the params for the current qbec environment | |
// you need to add an entry here every time you add a new environment. | |
local env = std.extVar('qbec.io/env'); | |
local paramsMap = { | |
_: import './environments/base.libsonnet', | |
EOT | |
for env in $envs; do | |
cat >> params.libsonnet <<EOT | |
$env: import './environments/$env.libsonnet', | |
EOT | |
done | |
cat >> params.libsonnet <<EOT | |
}; | |
if std.objectHas(paramsMap, env) then paramsMap[env] else error 'environment ' + env + ' not defined in ' + std.thisFile | |
EOT | |
for env in $envs; do | |
cat > environments/$env.libsonnet <<EOT | |
// | |
// ======= globals.libsonnet ======= | |
// | |
EOT | |
sed 's|^|// |' environments/$env/globals.libsonnet >> environments/$env.libsonnet | |
cat >> environments/$env.libsonnet <<EOT | |
// | |
// ======== params.libsonnet ======= | |
// | |
EOT | |
sed 's|^|// |' environments/$env/params.libsonnet >> environments/$env.libsonnet | |
cat >> environments/$env.libsonnet <<EOT | |
// ================================= | |
// this file has the param overrides for the default environment | |
local base = import './base.libsonnet'; | |
base { | |
components +: { | |
} | |
} | |
EOT | |
done | |
for component in $(ls -1 components/*.jsonnet); do | |
sed -i "s|local params = std.extVar('__ksonnet/params')\(.*\);|local p = import '../params.libsonnet';\nlocal params = p\1;|" $component | |
sed -i "s|^local env = std.extVar('__ksonnet/environments');|local env = { name: std.extVar('qbec.io/env'), namespace: std.extVar('qbec.io/defaultNs') };|" $component | |
done | |
if [ -f "components/params.libsonnet" ]; then | |
mv components/params.libsonnet environments/base.libsonnet | |
fi | |
echo "Main structure created, please update your environment parameters manually:" | |
for env in base $envs; do | |
echo " ./environments/$env.libsonnet" | |
done | |
echo | |
echo "Then run \`$(basename $0) rm\` to remove:" | |
echo " ./app.yaml" | |
echo " ./lib/" | |
for env in $envs; do | |
echo " ./environments/$env/" | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment