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:
parent
06d3fe205a
commit
dd0ea26787
|
|
@ -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]},
|
||||
|
|
|
|||
|
|
@ -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}"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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}"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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" \
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue