diff --git a/deps/rabbitmq_ct_helpers/src/rabbit_ct_vm_helpers.erl b/deps/rabbitmq_ct_helpers/src/rabbit_ct_vm_helpers.erl index af32e36299..98505c93cc 100644 --- a/deps/rabbitmq_ct_helpers/src/rabbit_ct_vm_helpers.erl +++ b/deps/rabbitmq_ct_helpers/src/rabbit_ct_vm_helpers.erl @@ -32,6 +32,7 @@ ensure_terraform_cmd/1, determine_erlang_version/1, determine_erlang_git_ref/1, + determine_elixir_version/1, compute_code_path/1, find_terraform_ssh_key/1, set_terraform_files_suffix/1, @@ -71,6 +72,7 @@ setup_steps() -> fun ensure_terraform_cmd/1, fun determine_erlang_version/1, fun determine_erlang_git_ref/1, + fun determine_elixir_version/1, fun compute_code_path/1, fun find_terraform_ssh_key/1, fun set_terraform_files_suffix/1, @@ -159,6 +161,27 @@ determine_erlang_git_ref(Config) -> rabbit_ct_helpers:set_config( Config, {erlang_git_ref, GitRef}). +determine_elixir_version(Config) -> + Version = case rabbit_ct_helpers:get_config(Config, elixir_version) of + undefined -> + case os:getenv("ELIXIR_VERSION") of + false -> + Cmd = ["elixir", "-e", "IO.puts System.version"], + case rabbit_ct_helpers:exec(Cmd) of + {ok, Output} -> + string:strip(Output, right, $\n); + _ -> + "" + end; + V -> + V + end; + V -> + V + end, + ct:pal(?LOW_IMPORTANCE, "Elixir version: ~s", [Version]), + rabbit_ct_helpers:set_config(Config, {elixir_version, Version}). + compute_code_path(Config) -> EntireCodePath = code:get_path(), CodePath = rabbit_ct_broker_helpers:filter_out_erlang_code_path( @@ -480,6 +503,7 @@ destroy_terraform_vms(Config) -> terraform_var_flags(Config) -> ErlangVersion = ?config(erlang_version, Config), GitRef = ?config(erlang_git_ref, Config), + ElixirVersion = ?config(elixir_version, Config), SshKey = ?config(terraform_ssh_key, Config), Suffix = ?config(terraform_files_suffix, Config), EC2Region = ?config(terraform_aws_ec2_region, Config), @@ -508,6 +532,7 @@ terraform_var_flags(Config) -> [ {"-var=erlang_version=~s", [ErlangVersion]}, {"-var=erlang_git_ref=~s", [GitRef]}, + {"-var=elixir_version=~s", [ElixirVersion]}, {"-var=erlang_cookie=~s", [erlang:get_cookie()]}, {"-var=erlang_nodename=~s", [?ERLANG_REMOTE_NODENAME]}, {"-var=ssh_key=~s", [SshKey]}, diff --git a/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/main.tf b/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/main.tf index cb48fd5f2a..32832abf44 100644 --- a/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/main.tf +++ b/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/main.tf @@ -10,6 +10,7 @@ module "direct_vms" { instance_count = 0 erlang_version = "${var.erlang_version}" + elixir_version = "${var.elixir_version}" erlang_cookie = "${var.erlang_cookie}" erlang_nodename = "${var.erlang_nodename}" ssh_key = "${var.ssh_key}" diff --git a/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/setup-vms.sh b/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/setup-vms.sh index 75f66c3e07..f9f3cc9a3d 100755 --- a/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/setup-vms.sh +++ b/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/setup-vms.sh @@ -4,12 +4,12 @@ set -e usage() { - echo "Syntax: $(basename "$0") [-Dh] [-c ] [-s ] [ ...]" + echo "Syntax: $(basename "$0") [-Dh] [-c ] [-e ] [-s ] [ ...]" } instance_count=1 -while getopts "c:Dhs:" opt; do +while getopts "c:e:Dhs:" opt; do case $opt in h) usage @@ -18,6 +18,9 @@ while getopts "c:Dhs:" opt; do c) instance_count=$OPTARG ;; + e) + elixir_version=$OPTARG + ;; D) destroy=yes ;; @@ -49,6 +52,10 @@ shift terraform_dir=$(cd "$(dirname "$0")" && pwd) +erlang_nodename=control +dirs_archive=dirs-archive.tar.xz +instance_name_prefix="[$(basename "$0")/$USER] " + canonicalize_erlang_version() { version=$1 @@ -96,20 +103,12 @@ list_dirs_to_upload() { grep -q "^$dir/" "$sorted_manifest" || echo "$dir" done < "$sorted_manifest" > "$manifest" - awk ' - BEGIN { - printf "["; - } - { - if (NR > 1) { - printf ","; - } - printf "\"" $0 "\""; - } - END { - printf "]"; - } - ' "$manifest" + tar cf - -P \ + --exclude '.terraform*' \ + --exclude 'dirs-archive-*' \ + --exclude "$erlang_nodename@*" \ + -T "$manifest" \ + | xz --threads=0 > "$dirs_archive" rm "$manifest" "$sorted_manifest" } @@ -122,11 +121,13 @@ start_vms() { terraform apply \ -auto-approve=true \ -var="erlang_version=$erlang_branch" \ + -var="elixir_version=$elixir_version" \ -var="erlang_cookie=$erlang_cookie" \ - -var="erlang_nodename=control" \ + -var="erlang_nodename=$erlang_nodename" \ -var="ssh_key=$ssh_key" \ -var="instance_count=$instance_count" \ - -var='dirs_to_upload='"$dirs_to_upload" \ + -var="instance_name_prefix=\"$instance_name_prefix\"" \ + -var="upload_dirs_archive=$dirs_archive" \ "$terraform_dir" } @@ -134,11 +135,13 @@ destroy_vms() { terraform destroy \ -force \ -var="erlang_version=$erlang_branch" \ + -var="elixir_version=$elixir_version" \ -var="erlang_cookie=$erlang_cookie" \ - -var="erlang_nodename=control" \ + -var="erlang_nodename=$erlang_nodename" \ -var="ssh_key=$ssh_key" \ -var="instance_count=$instance_count" \ - -var='dirs_to_upload='"$dirs_to_upload" \ + -var="instance_name_prefix=\"$instance_name_prefix\"" \ + -var="upload_dirs_archive=$dirs_archive" \ "$terraform_dir" } @@ -161,8 +164,8 @@ if test -z "$ssh_key" || ! test -f "$ssh_key" || ! test -f "$ssh_key.pub"; then fi erlang_cookie=$(cat ~/.erlang.cookie) -dirs_to_upload=$(list_dirs_to_upload "$@") +list_dirs_to_upload "$@" init_terraform case "$destroy" in diff --git a/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/variables.tf b/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/variables.tf index 2c8632fd3c..b735ed7bbd 100644 --- a/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/variables.tf +++ b/deps/rabbitmq_ct_helpers/tools/terraform/autoscaling-group/variables.tf @@ -7,6 +7,13 @@ the underlying OS. EOF } +variable "elixir_version" { + default = "" + description = <] [-s ] [ ...]" + echo "Syntax: $(basename "$0") [-Dh] [-c ] [-e ] [-s ] [ ...]" } instance_count=1 -while getopts "c:Dhs:" opt; do +while getopts "c:e:Dhs:" opt; do case $opt in h) usage @@ -18,6 +18,9 @@ while getopts "c:Dhs:" opt; do c) instance_count=$OPTARG ;; + e) + elixir_version=$OPTARG + ;; D) destroy=yes ;; @@ -118,6 +121,7 @@ start_vms() { terraform apply \ -auto-approve=true \ -var="erlang_version=$erlang_branch" \ + -var="elixir_version=$elixir_version" \ -var="erlang_git_ref=$erlang_git_ref" \ -var="erlang_cookie=$erlang_cookie" \ -var="erlang_nodename=$erlang_nodename" \ @@ -132,6 +136,7 @@ destroy_vms() { terraform destroy \ -force \ -var="erlang_version=$erlang_branch" \ + -var="elixir_version=$elixir_version" \ -var="erlang_git_ref=$erlang_git_ref" \ -var="erlang_cookie=$erlang_cookie" \ -var="erlang_nodename=$erlang_nodename" \ diff --git a/deps/rabbitmq_ct_helpers/tools/terraform/direct-vms/templates/setup-erlang.sh b/deps/rabbitmq_ct_helpers/tools/terraform/direct-vms/templates/setup-erlang.sh index 31df550a00..28186b282f 100644 --- a/deps/rabbitmq_ct_helpers/tools/terraform/direct-vms/templates/setup-erlang.sh +++ b/deps/rabbitmq_ct_helpers/tools/terraform/direct-vms/templates/setup-erlang.sh @@ -19,6 +19,8 @@ readonly erlang_version='${erlang_version}' # shellcheck disable=SC2016 erlang_git_ref='${erlang_git_ref}' # shellcheck disable=SC2016 +readonly elixir_version='${elixir_version}' +# shellcheck disable=SC2016 readonly erlang_nodename='${erlang_nodename}' # shellcheck disable=SC2016 readonly default_user='${default_user}' @@ -67,6 +69,38 @@ EOF # Functions to take Erlang and Elixir from Debian packages. # -------------------------------------------------------------------- +determine_version_to_pin() { + package=$1 + min_version=$2 + + apt-cache policy "$package" | \ + awk ' +BEGIN { + version_to_pin = ""; +} +/^ ( |\*\*\*) [^ ]/ { + if ($1 == "***") { + version = $2; + } else { + version = $1; + } + + if (version_to_pin) { + exit; + } else if (match(version, /^'$min_version'([-.]|$)/)) { + version_to_pin = version; + } +} +END { + if (version_to_pin) { + print version_to_pin; + exit; + } else { + exit 1; + } +}' +} + setup_erlang_deb_repository() { # Setup repository to get Erlang. readonly esl_package=/tmp/erlang-solutions_1.0_all.deb @@ -89,6 +123,17 @@ apt_install_erlang() { } apt_install_elixir() { + if test "$elixir_version"; then + # Configure Elixir version pinning. + elixir_package_version=$(determine_version_to_pin elixir "$elixir_version") + + cat >/etc/apt/preferences.d/elixir <