From 500e8be3ccda2f34e5df82f4c0d160d9b714cb3d Mon Sep 17 00:00:00 2001 From: Eleni Mathioulaki <emathioulaki@athenarc.gr> Date: Mon, 3 Jul 2023 20:02:02 +0200 Subject: [PATCH] replace awk script with spack-python --- .gitlab-ci.yml | 4 +- install_spack_env.sh | 3 +- site-config/ymerge.py | 14 +------ site-config/ymerge.sh | 89 ------------------------------------------- 4 files changed, 5 insertions(+), 105 deletions(-) delete mode 100644 site-config/ymerge.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3343fcfa..753ec194 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -199,7 +199,7 @@ build-spack-env-on-runner: - spack env create $SPACK_DEV_ENV - spack env activate $SPACK_DEV_ENV - rm -rf $SPACK_ENV/site-config && cp -r site-config $SPACK_ENV - - bash site-config/ymerge.sh spack.yaml site-config/$SYSTEMNAME/spack.yaml > $SPACK_ENV/spack.yaml + - spack-python site-config/ymerge.py spack.yaml site-config/$SYSTEMNAME/spack.yaml > $SPACK_ENV/spack.yaml - spack install -y -j2 --fresh --test root after_script: - mkdir spack_logs @@ -274,7 +274,7 @@ sync-gitlab-spack-instance: # update environment site-configs - rm -rf $SPACK_ENV/site-config && cp -r site-config $SPACK_ENV # update spack.yaml: merge top-level and site-specific spack.yaml files - - bash site-config/ymerge.sh spack.yaml site-config/$SYSTEMNAME/spack.yaml > $SPACK_ENV/spack.yaml + - spack-python site-config/ymerge.py spack.yaml site-config/$SYSTEMNAME/spack.yaml > $SPACK_ENV/spack.yaml # There is a known spack bug (https://github.com/spack/spack/issues/29447) in installing test dependencies for installation tests. The workaround suggested # in the issue is to NOT concretize separately, but simply remove the .lock file and let the enironment be concretized by the spack install command: - rm $SPACK_ROOT/var/spack/environments/$SPACK_NFS_ENV/spack.lock || echo "No spack.lock file" diff --git a/install_spack_env.sh b/install_spack_env.sh index 95cddb7c..58c5c6e1 100644 --- a/install_spack_env.sh +++ b/install_spack_env.sh @@ -59,8 +59,7 @@ rm -rf $SPACK_ENV/site-config && cp -r $EBRAINS_REPO/site-config $SPACK_ENV # update spack.yaml: merge top-level and site-specific spack.yaml files # TODO: find a more robust way to do this (maybe with yq? but we need to download the binary) # TODO: or add pyyaml to dependencies and use python script -# python3 $EBRAINS_REPO/site-config/ymerge.py $EBRAINS_REPO/spack.yaml $EBRAINS_REPO/site-config/$SYSTEMNAME/spack.yaml > $SPACK_ENV/spack.yaml -bash $EBRAINS_REPO/site-config/ymerge.sh $EBRAINS_REPO/spack.yaml $EBRAINS_REPO/site-config/$SYSTEMNAME/spack.yaml > $SPACK_ENV/spack.yaml +spack-python $EBRAINS_REPO/site-config/ymerge.py $EBRAINS_REPO/spack.yaml $EBRAINS_REPO/site-config/$SYSTEMNAME/spack.yaml > $SPACK_ENV/spack.yaml # There is a known spack bug (https://github.com/spack/spack/issues/29447) in installing test dependencies # for installation tests. The workaround suggested in the issue is to NOT concretize separately, but simply diff --git a/site-config/ymerge.py b/site-config/ymerge.py index d515f69e..23a1f0a6 100644 --- a/site-config/ymerge.py +++ b/site-config/ymerge.py @@ -1,14 +1,4 @@ -import yaml import sys +from spack.config import merge_yaml, read_config_file, syaml -with open(sys.argv[1], 'r') as f: - env = yaml.load(f, yaml.SafeLoader) -with open(sys.argv[2], 'r') as f: - site_env = yaml.load(f, yaml.SafeLoader) - -for k in site_env['spack'].keys(): - if k in env['spack'].keys(): - if isinstance(env['spack'][k], list): env['spack'][k].extend(site_env['spack'][k]) - else: env['spack'][k] = site_env['spack'][k] - -yaml.dump(env, sys.stdout) +print(syaml.dump(merge_yaml(read_config_file(sys.argv[1]), read_config_file(sys.argv[2])))) diff --git a/site-config/ymerge.sh b/site-config/ymerge.sh deleted file mode 100644 index 5e09e287..00000000 --- a/site-config/ymerge.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/sh - -flatten='BEGIN { - KEYSEP = "\000" -} - -BEGINFILE { - level = 0 - indent = 0 -} - -/^ *#/ { - next -} - -/^ *-/ { - sub(/^ */, "", $0) - sub(/^- */, "- ", $0) - print level_to_key[level] KEYSEP $0 - next -} - -/:/ { - match($0, /^ *([^ ]+:) *(.*)/, parts) - key = parts[1] - value = parts[2] - this_indent = get_indent($0) - if (this_indent < indent && ! (this_indent in indent_to_level)) { - print("Malformed YAML") > (/dev/) stderr - exit 1 - } - indent = this_indent - if (indent in indent_to_level) { - level = indent_to_level[indent] - } else { - indent_to_level[indent] = ++level - } - level_to_key[level] = level > 1 ? level_to_key[level - 1] KEYSEP key : key - if (value != "") { - print level_to_key[level] KEYSEP value - } - next -} - - -function get_indent(line) -{ - n = length(line) - sub(/^ */, "", line) - return (n - length(line)) -} -' - -pprint='BEGIN { - FS = "\000" - level = 0 - BASE_INDENT = " " -} - -{ - for (i = 1; i < NF; i++) { - if ($i != prev_key[i]) { - break - } - } - indent = "" - for (j = 1; j < i; j++) { - indent = indent BASE_INDENT - } - for (; i < NF - 1; i++) { - print indent $i - indent = indent BASE_INDENT - prev_key[i] = $i - } - if ($NF ~ /^- /) { - if (prev_key[NF - 1] != $(NF - 1)) { - print indent $(NF - 1) - print indent BASE_INDENT $NF - } else { - print indent $NF - } - } else { - print indent $(NF - 1), $NF - } - prev_key[NF - 1] = $(NF - 1) -} -' - -awk "$flatten" "$@" | sort -u | awk "$pprint" -- GitLab