diff --git a/.gitignore b/.gitignore index 3598e611a25ae558ec4aef823985397aa55a414d..1725a5cdd344e9fb1f4596707a182d504f40faf9 100644 --- a/.gitignore +++ b/.gitignore @@ -111,3 +111,4 @@ tests/check_cdo_selectors /tests/check_memlock MaestroConfig.cmake dst +/tests/check_multi_drc_init.sh diff --git a/configure.ac b/configure.ac index 220dd6e8f53ab93ec973ac96a5d7e01b5721eeef..49e7e8c4b5e4986b8bcead76f77407a458d6b5a9 100644 --- a/configure.ac +++ b/configure.ac @@ -585,6 +585,7 @@ dnl AC_SUBST does not preserve executable bit on scripts, so do dnl substitution and chmod in 2 phases m4_define([TESTSCRIPTS], [tests/check_pm_declare.sh \ + tests/check_multi_drc_init.sh \ tests/check_pm_declare_group.sh \ tests/check_pm_interlock.sh \ tests/check_pm_collision.sh \ diff --git a/maestro/drc.c b/maestro/drc.c index b7ee5c02f38a79ef37245889ce9cf1ebc03f5dbf..9665c970f228e2c017773f2f1af4b81d182ed99c 100644 --- a/maestro/drc.c +++ b/maestro/drc.c @@ -149,6 +149,25 @@ mstro_drc_init_internal(mstro_drc_info result, return; } + +/* parse network credential and return its oob representation without + * the prefix string to the caller if successful */ +static mstro_status +mstro__parse_network_credential(const char *netcred, + /* fixme: update to a more general type */ + const char * *result) +{ + assert(netcred!=NULL); + if(strncasecmp(netcred,"drc:",4)!=0) { + /* FIXME: this needs expansion if we were to support other kinds */ + ERR("Unsupported or invalid network credential: |%s|\n", netcred); + return MSTRO_INVARG; + } + *result = netcred + 4; /* the part after "drc:" */ + return MSTRO_OK; +} + + /** obtain DRC credentials */ mstro_status mstro_drc_init(mstro_drc_info *result_p) @@ -156,11 +175,28 @@ mstro_drc_init(mstro_drc_info *result_p) mstro_status stat = MSTRO_UNIMPL; if(result_p==NULL) return MSTRO_INVOUT; - + + /* check for ENV override (reuse of existing DRC creds) */ + char *external_token=getenv(MSTRO_ENV_NETWORK_CREDENTIALS); + if(external_token) { + const char * oob_string=NULL; + stat = mstro__parse_network_credential(external_token, &oob_string); + if(stat != MSTRO_OK) { + WARN("Ignoring unparsable network credential\n"); + goto full_init; + } else { + DEBUG("Attempting init with externally provided network credential\n"); + stat = mstro_drc_init_from_oob_string(result_p, oob_string); + goto BAILOUT; + } + } +full_init: *result_p = malloc(sizeof(struct mstro_drc_info_)); if(*result_p) { int ret; drc_info_handle_t info; + + char *do_nonflex = getenv(MSTRO_ENV_DRC_NON_FLEX); if(do_nonflex!=NULL && atoi(do_nonflex)!=0 && do_nonflex[0]!='f' && do_nonflex[0]!='F' // fAlSe @@ -169,7 +205,8 @@ mstro_drc_init(mstro_drc_info *result_p) // if user requests it: use non-flex credentials ret = drc_acquire(&(*result_p)->drc_id, 0); } else { - // default: flex credentials, to allow multiple jobs on the same node ("DRC node insecure mode") + // default: flex credentials, to allow multiple jobs on the same + // node ("DRC node insecure mode") ret = drc_acquire(&(*result_p)->drc_id, DRC_FLAGS_FLEX_CREDENTIAL); } diff --git a/tests/Makefile.am b/tests/Makefile.am index 42b1b3b7d5f4861363b8cf9ef93f34aa92e304c2..bda6463dd95c857f7d918bd5ca23a929a7eba373 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -60,7 +60,7 @@ TESTS = check_version check_init check_uuid \ check_symtab \ check_events \ check_protobuf_c \ - check_transport_gfs \ + check_transport_gfs \ check_layout \ check_declare \ check_pool_local \ @@ -73,6 +73,7 @@ TESTS = check_version check_init check_uuid \ check_subscribe_local \ run_demo.sh \ check_pool_manager \ + check_multi_drc_init.sh \ check_pm_collision.sh \ check_pm_reentrant_client.sh \ check_pm_declare.sh \ diff --git a/tests/check_multi_drc_init.sh.in b/tests/check_multi_drc_init.sh.in new file mode 100644 index 0000000000000000000000000000000000000000..9516f59ddff129d1f529766008850cb9f964a661 --- /dev/null +++ b/tests/check_multi_drc_init.sh.in @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +# +# Run pool manager twice and re-use the network credential from the first round for the second startup +# + +# Copyright (C) 2021 Hewlett-Packard (Schweiz) GmbH +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# aggressive error tracing +set -euo pipefail + +# set a workflow name +MSTRO_WORKFLOW_NAME="check_multi_drc_init_wf_$$" +export MSTRO_WORKFLOW_NAME + +# ensure error and warnings get colors +MSTRO_LOG_COLOR_ERRORS=1 +export MSTRO_LOG_COLOR_ERRORS + + +PM_CMD="@top_builddir@/tests/check_pool_manager" + +CREDMSG="$( ${PM_CMD} |grep "Got PM Net Cred:")" + +CRED="$(echo ${CREDMSG} |cut -f2 -d\|)" + +if test x"$CRED" = x; then + exit 99 +fi + +env MSTRO_NETWORK_CREDENTIALS="${CRED}" ${PM_CMD} || exit 99 +