diff options
| author | Jared Morrow <jared@basho.com> | 2014-05-21 15:36:57 -0600 | 
|---|---|---|
| committer | Jared Morrow <jared@basho.com> | 2014-05-21 15:36:57 -0600 | 
| commit | 755c6023d181b4aa87a581ac71e96d2de90a015f (patch) | |
| tree | 59816f0f73785b5d75904b72036d1e2df3aa7834 | |
| parent | 618161b8d8b4636a207b299e46592e10bc01d569 (diff) | |
| parent | 81ed1611af693fb9b4483a55c437a5c9d743966c (diff) | |
Merge pull request #52 from shino/slim-release-support
Slim release support
| -rwxr-xr-x[-rw-r--r--] | priv/templates/simplenode.install_upgrade.escript | 8 | ||||
| -rw-r--r-- | priv/templates/simplenode.reltool.config | 2 | ||||
| -rwxr-xr-x | priv/templates/simplenode.runner | 46 | ||||
| -rw-r--r-- | src/rebar_rel_utils.erl | 8 | ||||
| -rw-r--r-- | src/rebar_reltool.erl | 33 | 
5 files changed, 80 insertions, 17 deletions
| diff --git a/priv/templates/simplenode.install_upgrade.escript b/priv/templates/simplenode.install_upgrade.escript index 56cea19..0d4cbe3 100644..100755 --- a/priv/templates/simplenode.install_upgrade.escript +++ b/priv/templates/simplenode.install_upgrade.escript @@ -6,6 +6,14 @@  -define(TIMEOUT, 60000).  -define(INFO(Fmt,Args), io:format(Fmt,Args)). +%% TODO: This script currently does NOT support slim releases. +%% Necessary steps to upgrade a slim release are as follows: +%% 1. unpack relup archive manually +%% 2. copy releases directory and necessary libraries +%% 3. using release_hander:set_unpacked/2 . +%% For more details, see https://github.com/rebar/rebar/pull/52 +%% and https://github.com/rebar/rebar/issues/202 +  main([NodeName, Cookie, ReleasePackage]) ->      TargetNode = start_distribution(NodeName, Cookie),      {ok, Vsn} = rpc:call(TargetNode, release_handler, unpack_release, diff --git a/priv/templates/simplenode.reltool.config b/priv/templates/simplenode.reltool.config index bac7270..eae8ab3 100644 --- a/priv/templates/simplenode.reltool.config +++ b/priv/templates/simplenode.reltool.config @@ -32,7 +32,7 @@  {overlay, [             {mkdir, "log/sasl"},             {copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"}, -           {copy, "files/nodetool", "\{\{erts_vsn\}\}/bin/nodetool"}, +           {copy, "files/nodetool", "releases/\{\{rel_vsn\}\}/nodetool"},             {copy, "{{nodeid}}/bin/start_clean.boot",                    "\{\{erts_vsn\}\}/bin/start_clean.boot"},             {copy, "files/{{nodeid}}", "bin/{{nodeid}}"}, diff --git a/priv/templates/simplenode.runner b/priv/templates/simplenode.runner index 032eb28..595a1ea 100755 --- a/priv/templates/simplenode.runner +++ b/priv/templates/simplenode.runner @@ -130,11 +130,43 @@ cd $USE_DIR  # Make sure log directory exists  mkdir -p $USE_DIR/log -# Add ERTS bin dir to our path -ERTS_PATH=$RUNNER_BASE_DIR/erts-$ERTS_VSN/bin +RUNNER_SCRIPT_DATA= +if [ -e "$RUNNER_BASE_DIR/releases/$APP_VSN/runner_script.data" ]; then +    RUNNER_SCRIPT_DATA=`cat $RUNNER_BASE_DIR/releases/$APP_VSN/runner_script.data` +fi -# Setup command to control the node -NODETOOL="$ERTS_PATH/escript $ERTS_PATH/nodetool $NAME_ARG $COOKIE_ARG" +if [ -z "$RUNNER_SCRIPT_DATA" ]; then +    ROOTDIR=$RUNNER_BASE_DIR +    ERTS_PATH=$RUNNER_BASE_DIR/erts-$ERTS_VSN/bin +    if [ -e "$RUNNER_BASE_DIR/releases/$APP_VSN/nodetool" ]; then +        NODETOOL="$ERTS_PATH/escript $RUNNER_BASE_DIR/releases/$APP_VSN/nodetool $NAME_ARG $COOKIE_ARG" +    else +        NODETOOL="$ERTS_PATH/escript $ERTS_PATH/nodetool $NAME_ARG $COOKIE_ARG" +    fi +    SLIM_ARGS= +elif [ "$RUNNER_SCRIPT_DATA" = "slim" ]; then +    # Setup system paths +    SYSTEM_ERL_PATH=`which erl` +    if [ ! -x "$SYSTEM_ERL_PATH" ]; then +        echo "Failed to find erl. Is Erlang/OTP available in PATH?" +        exit 1 +    fi +    SYSTEM_HOME_BIN=${SYSTEM_ERL_PATH%/*} +    ROOTDIR=$SYSTEM_HOME_BIN/../lib/erlang +    ERTS_PATH=$ROOTDIR/erts-$ERTS_VSN/bin +    unset SYSTEM_ERL_PATH +    unset SYSTEM_HOME_BIN + +    LOCAL_ERTS_PATH=$RUNNER_BASE_DIR/erts-$ERTS_VSN/bin +    NODETOOL="$ERTS_PATH/escript $RUNNER_BASE_DIR/releases/$APP_VSN/nodetool $NAME_ARG $COOKIE_ARG" +    unset LOCAL_ERL_PATH + +    # Setup additional arguments for slim release +    SLIM_ARGS="-boot_var RELTOOL_EXT_LIB $RUNNER_BASE_DIR/lib -sasl releases_dir \"$RUNNER_BASE_DIR/releases\"" +else +    echo "Unknown runner_script.data" +    exit 1 +fi  # Setup remote shell command to control node  REMSH="$ERTS_PATH/erl -hidden $REMSH_NAME_ARG $REMSH_REMSH_ARG $COOKIE_ARG" @@ -310,11 +342,10 @@ case "$1" in                  ;;          esac          # Setup beam-required vars -        ROOTDIR=$RUNNER_BASE_DIR          BINDIR=$ROOTDIR/erts-$ERTS_VSN/bin          EMU=beam          PROGNAME=`echo $0 | sed 's/.*\\///'` -        CMD="$BINDIR/erlexec -boot $RUNNER_BASE_DIR/releases/$APP_VSN/$BOOTFILE -mode embedded -config $CONFIG_PATH -args_file $VMARGS_PATH" +        CMD="$BINDIR/erlexec $SLIM_ARGS -boot $RUNNER_BASE_DIR/releases/$APP_VSN/$BOOTFILE -mode embedded -config $CONFIG_PATH -args_file $VMARGS_PATH"          export EMU          export ROOTDIR          export BINDIR @@ -339,11 +370,10 @@ case "$1" in          FOREGROUNDOPTIONS="-noinput +Bd"          # Setup beam-required vars -        ROOTDIR=$RUNNER_BASE_DIR          BINDIR=$ROOTDIR/erts-$ERTS_VSN/bin          EMU=beam          PROGNAME=`echo $0 | sed 's/.*\///'` -        CMD="$BINDIR/erlexec $FOREGROUNDOPTIONS -boot $RUNNER_BASE_DIR/releases/$APP_VSN/$BOOTFILE -config $CONFIG_PATH -args_file $VMARGS_PATH" +        CMD="$BINDIR/erlexec $SLIM_ARGS $FOREGROUNDOPTIONS -boot $RUNNER_BASE_DIR/releases/$APP_VSN/$BOOTFILE -config $CONFIG_PATH -args_file $VMARGS_PATH"          export EMU          export ROOTDIR          export BINDIR diff --git a/src/rebar_rel_utils.erl b/src/rebar_rel_utils.erl index 085dbd9..5d99948 100644 --- a/src/rebar_rel_utils.erl +++ b/src/rebar_rel_utils.erl @@ -37,6 +37,7 @@           get_rel_file_path/2,           load_config/2,           get_sys_tuple/1, +         get_excl_lib_tuple/1,           get_target_dir/2,           get_root_dir/2,           get_target_parent_dir/2]). @@ -144,6 +145,13 @@ get_sys_tuple(ReltoolConfig) ->      end.  %% +%% Look for the {excl_lib, ...} tuple in sys tuple of the reltool.config file. +%% Without this present, return false. +%% +get_excl_lib_tuple(ReltoolConfig) -> +    lists:keyfind(excl_lib, 1, element(2, get_sys_tuple(ReltoolConfig))). + +%%  %% Look for {target_dir, TargetDir} in the reltool config file; if none is  %% found, use the name of the release as the default target directory.  %% diff --git a/src/rebar_reltool.erl b/src/rebar_reltool.erl index 9f9488e..fdaa7e0 100644 --- a/src/rebar_reltool.erl +++ b/src/rebar_reltool.erl @@ -147,15 +147,12 @@ process_overlay(Config, ReltoolConfig) ->                                                      OverlayVars1),      %% Finally, overlay the files specified by the overlay section -    case lists:keyfind(overlay, 1, ReltoolConfig) of -        {overlay, Overlay} when is_list(Overlay) -> +    case overlay_files(ReltoolConfig) of +        [] -> +            ok; +        Overlay ->              execute_overlay(Overlay, OverlayVars, rebar_utils:get_cwd(), -                            TargetDir); -        false -> -            ?INFO("No {overlay, [...]} found in reltool.config.\n", []); -        _ -> -            ?ABORT("{overlay, [...]} entry in reltool.config " -                   "must be a list.\n", []) +                            TargetDir)      end.  %% @@ -292,6 +289,26 @@ dump_spec(Config, Spec) ->      end. +overlay_files(ReltoolConfig) -> +    Original = case lists:keyfind(overlay, 1, ReltoolConfig) of +                   {overlay, Overlay} when is_list(Overlay) -> +                       Overlay; +                   false -> +                       ?INFO("No {overlay, [...]} found in reltool.config.\n", []), +                       []; +                   _ -> +                       ?ABORT("{overlay, [...]} entry in reltool.config " +                              "must be a list.\n", []) +               end, +    SlimAddition = case rebar_rel_utils:get_excl_lib_tuple(ReltoolConfig) of +                       {excl_lib, otp_root} -> +                           [{create, "releases/{{rel_vsn}}/runner_script.data", +                             "slim\n"}]; +                       false -> +                           [] +                   end, +    Original ++ SlimAddition. +  %% TODO: Merge functionality here with rebar_templater  execute_overlay([], _Vars, _BaseDir, _TargetDir) -> | 
