Skip to content

Instantly share code, notes, and snippets.

@kvaps
Created August 5, 2019 16:33
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 kvaps/f1b1b723b31bb24e854d92f449859987 to your computer and use it in GitHub Desktop.
Save kvaps/f1b1b723b31bb24e854d92f449859987 to your computer and use it in GitHub Desktop.
Helper script for easy migration from Ksonnet to Qbec
#!/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