rabbit_ct_vm_helpers, tools/terraform: Pin Elixir version

... if one is specified.

Out-of-the box, rabbit_ct_vm_helpers will take the version of the
Elixir installed on the host starting the testsuite.
This commit is contained in:
Jean-Sébastien Pédron 2018-08-27 13:09:45 +02:00
parent 06d3fe205a
commit dd0ea26787
8 changed files with 117 additions and 23 deletions

View File

@ -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]},

View File

@ -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}"

View File

@ -4,12 +4,12 @@
set -e
usage() {
echo "Syntax: $(basename "$0") [-Dh] [-c <instance_count>] [-s <ssh_key>] <erlang_version> [<erlang_app_dir> ...]"
echo "Syntax: $(basename "$0") [-Dh] [-c <instance_count>] [-e <elixir_version>] [-s <ssh_key>] <erlang_version> [<erlang_app_dir> ...]"
}
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

View File

@ -7,6 +7,13 @@ the underlying OS.
EOF
}
variable "elixir_version" {
default = ""
description = <<EOF
Elixir version to deploy on VMs. Default to the latest available.
EOF
}
variable "erlang_cookie" {
description = <<EOF
Erlang cookie to deploy on VMs.

View File

@ -172,6 +172,7 @@ data "template_file" "user_data" {
erlang_nodename = "${var.erlang_nodename}"
erlang_version = "${var.erlang_version}"
erlang_git_ref = "${var.erlang_git_ref}"
elixir_version = "${var.elixir_version}"
}
}

View File

@ -4,12 +4,12 @@
set -e
usage() {
echo "Syntax: $(basename "$0") [-Dh] [-c <instance_count>] [-s <ssh_key>] <erlang_version> [<erlang_app_dir> ...]"
echo "Syntax: $(basename "$0") [-Dh] [-c <instance_count>] [-e <elixir_version>] [-s <ssh_key>] <erlang_version> [<erlang_app_dir> ...]"
}
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" \

View File

@ -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 <<EOF
Package: elixir
Pin: version $elixir_package_version
Pin-Priority: 1000
EOF
fi
case "$debian_codename" in
wheezy)
# We don't install Elixir because we only use Debian Wheezy to

View File

@ -15,6 +15,13 @@ version is still required.
EOF
}
variable "elixir_version" {
default = ""
description = <<EOF
Elixir version to deploy on VMs. Default to the latest available.
EOF
}
variable "erlang_cookie" {
description = <<EOF
Erlang cookie to deploy on VMs.