diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d3b2b0eb82d73db2b5ce6aa5eb7515023ad82089..3c3aba831edfe9456484c3d5b9560c0e89aede11 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,6 +32,8 @@ build: - compiled/lib/ - build/examples/ - build/tests/ + - build/src/scord/scord + - build/src/scord-ctl/scord-ctl # depending on your build setup it's most likely a good idea to cache outputs to reduce the build time cache: key: $CI_COMMIT_REF_SLUG @@ -48,11 +50,8 @@ rpc: - export ASAN_OPTIONS=detect_odr_violation=0 - export LSAN_OPTIONS=verbosity=1:log_threads=1:suppressions=${CI_PROJECT_DIR}/tests/LSanSuppress.supp - export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:${CI_PROJECT_DIR}/compiled/lib - - compiled/bin/scord -f --force-console & - - build/examples/cxx/ADM_ping ofi+tcp://127.0.0.1:52000 - cd build/examples/ - ctest -j$(nproc) --output-on-failure --output-junit rpc-report.xml - - pkill -TERM scord artifacts: expire_in: 1 week paths: diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 91d8ee9b4507035e0d417f5242731886b1de7a48..931da9ce2ee94591021a5cd2422413f860f6f0b8 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -22,5 +22,22 @@ # SPDX-License-Identifier: GPL-3.0-or-later # ################################################################################ +if(SCORD_BUILD_TESTS) + add_test(start_scord_daemon + ${CMAKE_SOURCE_DIR}/scripts/runner.sh start scord.pid + ${CMAKE_BINARY_DIR}/src/scord/scord -C -f + ) + + set_tests_properties(start_scord_daemon PROPERTIES FIXTURES_SETUP + scord_daemon) + + add_test(stop_scord_daemon + ${CMAKE_SOURCE_DIR}/scripts/runner.sh stop TERM scord.pid + ) + + set_tests_properties(stop_scord_daemon PROPERTIES FIXTURES_CLEANUP + scord_daemon) +endif() + add_subdirectory(c) add_subdirectory(cxx) diff --git a/examples/c/ADM_ping.c b/examples/c/ADM_ping.c new file mode 100644 index 0000000000000000000000000000000000000000..0140a9d1df80af7cb9e71440843632570ae4a8e5 --- /dev/null +++ b/examples/c/ADM_ping.c @@ -0,0 +1,49 @@ +/****************************************************************************** + * Copyright 2021-2022, Barcelona Supercomputing Center (BSC), Spain + * + * This software was partially supported by the EuroHPC-funded project ADMIRE + * (Project ID: 956748, https://www.admire-eurohpc.eu). + * + * This file is part of scord. + * + * scord is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * scord is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with scord. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + *****************************************************************************/ + +#include +#include +#include +#include + +int +main(int argc, char* argv[]) { + + if(argc != 2) { + fprintf(stderr, "ERROR: no location provided\n"); + fprintf(stderr, "Usage: ADM_ping \n"); + exit(EXIT_FAILURE); + } + + ADM_server_t server = ADM_server_create("tcp", argv[1]); + + ADM_return_t ret = ADM_ping(server); + + if(ret != ADM_SUCCESS) { + fprintf(stdout, "ADM_ping() remote procedure not completed " + "successfully\n"); + exit(EXIT_FAILURE); + } + exit(EXIT_SUCCESS); +} diff --git a/examples/c/CMakeLists.txt b/examples/c/CMakeLists.txt index dedc9f83234d46a0a15f659803c41e2e3971de61..7dd51efd1a417e3b2cb792bf00dbf224e0c0f13a 100644 --- a/examples/c/CMakeLists.txt +++ b/examples/c/CMakeLists.txt @@ -22,21 +22,33 @@ # SPDX-License-Identifier: GPL-3.0-or-later # ################################################################################ -list(APPEND examples_c ADM_register_job ADM_cancel_transfer ADM_connect_data_operation ADM_define_data_operation - ADM_deploy_adhoc_storage ADM_finalize_data_operation ADM_get_pending_transfers ADM_get_qos_constraints - ADM_get_statistics ADM_get_transfer_priority ADM_link_transfer_to_data_operation - ADM_register_adhoc_storage ADM_remove_adhoc_storage ADM_remove_job ADM_set_dataset_information - ADM_set_io_resources ADM_set_qos_constraints ADM_set_transfer_priority ADM_transfer_dataset - ADM_update_adhoc_storage ADM_update_job ADM_register_pfs_storage - ADM_update_pfs_storage ADM_remove_pfs_storage) - -# ADM_in_situ_ops ADM_in_transit_ops not implemented +list(APPEND examples_c + # ping + ADM_ping + # job + ADM_register_job ADM_update_job ADM_remove_job + # adhoc storage + ADM_register_adhoc_storage ADM_update_adhoc_storage ADM_remove_adhoc_storage + ADM_deploy_adhoc_storage + # pfs storage + ADM_register_pfs_storage ADM_update_pfs_storage ADM_remove_pfs_storage + # transfers + ADM_transfer_dataset ADM_get_transfer_priority ADM_set_transfer_priority + ADM_cancel_transfer ADM_get_pending_transfers + # qos + ADM_set_qos_constraints ADM_get_qos_constraints + # data operations + ADM_define_data_operation ADM_connect_data_operation + ADM_finalize_data_operation ADM_link_transfer_to_data_operation + # ADM_in_situ_ops ADM_in_transit_ops + # misc + ADM_get_statistics ADM_set_dataset_information ADM_set_io_resources + ) add_library(c_examples_common STATIC) target_sources(c_examples_common PUBLIC common.h PRIVATE common.c) target_link_libraries(c_examples_common common::api::types) - foreach(example IN LISTS examples_c) add_executable(${example}_c) target_sources(${example}_c PRIVATE ${example}.c) @@ -45,52 +57,9 @@ foreach(example IN LISTS examples_c) endforeach() if(SCORD_BUILD_TESTS) - add_test(ADM_register_job_c_test ADM_register_job ofi+tcp://127.0.0.1:52000) - - add_test(ADM_cancel_transfer_c_test ADM_cancel_transfer ofi+tcp://127.0.0.1:52000) - - add_test(ADM_connect_data_operation_c_test ADM_connect_data_operation ofi+tcp://127.0.0.1:52000) - - add_test(ADM_define_data_operation_c_test ADM_define_data_operation ofi+tcp://127.0.0.1:52000) - - add_test(ADM_deploy_adhoc_storage_c_test ADM_deploy_adhoc_storage ofi+tcp://127.0.0.1:52000) - - add_test(ADM_finalize_data_operation_c_test ADM_finalize_data_operation ofi+tcp://127.0.0.1:52000) - - add_test(ADM_get_pending_transfers_c_test ADM_get_pending_transfers ofi+tcp://127.0.0.1:52000) - - add_test(ADM_get_qos_constraints_c_test ADM_get_qos_constraints ofi+tcp://127.0.0.1:52000) - - add_test(ADM_get_statistics_c_test ADM_get_statistics ofi+tcp://127.0.0.1:52000) - - add_test(ADM_get_transfer_priority_c_test ADM_get_transfer_priority ofi+tcp://127.0.0.1:52000) - - add_test(ADM_link_transfer_to_data_operation_c_test ADM_link_transfer_to_data_operation ofi+tcp://127.0.0.1:52000) - - add_test(ADM_register_adhoc_storage_c_test ADM_register_adhoc_storage ofi+tcp://127.0.0.1:52000) - - add_test(ADM_register_pfs_storage_c_test ADM_register_pfs_storage ofi+tcp://127.0.0.1:52000) - - add_test(ADM_remove_adhoc_storage_c_test ADM_remove_adhoc_storage ofi+tcp://127.0.0.1:52000) - - add_test(ADM_remove_job_c_test ADM_remove_job ofi+tcp://127.0.0.1:52000) - - # TODO: ADM_remove_pfs_storage test is missing because is not working in cpp. - # Will be created when it works in cpp. - add_test(ADM_set_dataset_information_c_test ADM_set_dataset_information ofi+tcp://127.0.0.1:52000) - - add_test(ADM_set_io_resources_c_test ADM_set_io_resources ofi+tcp://127.0.0.1:52000) - - add_test(ADM_set_qos_constraints_c_test ADM_set_qos_constraints ofi+tcp://127.0.0.1:52000) - - add_test(ADM_set_transfer_priority_c_test ADM_set_transfer_priority ofi+tcp://127.0.0.1:52000) - - add_test(ADM_transfer_dataset_c_test ADM_transfer_dataset ofi+tcp://127.0.0.1:52000) - - add_test(ADM_update_adhoc_storage_c_test ADM_update_adhoc_storage ofi+tcp://127.0.0.1:52000) - - add_test(ADM_update_job_c_test ADM_update_job ofi+tcp://127.0.0.1:52000) - - # TODO: ADM_update_pfs_storage test is missing because is not working in cpp. - # Will be created when it works in cpp. + foreach(example IN LISTS examples_c) + add_test(${example}_c_test ${example} ofi+tcp://${SCORD_BIND_ADDRESS}:${SCORD_BIND_PORT}) + set_tests_properties(${example}_c_test + PROPERTIES FIXTURES_REQUIRED scord_daemon) + endforeach() endif() diff --git a/examples/cxx/CMakeLists.txt b/examples/cxx/CMakeLists.txt index 2428d8bd8b73eda058f43b0fe6c538f651663ad1..1263a187d39925463ae15daa020616c34333cfb5 100644 --- a/examples/cxx/CMakeLists.txt +++ b/examples/cxx/CMakeLists.txt @@ -23,19 +23,27 @@ ################################################################################ list(APPEND examples_cxx + # ping ADM_ping + # job ADM_register_job ADM_update_job ADM_remove_job - ADM_register_adhoc_storage ADM_update_adhoc_storage - ADM_remove_adhoc_storage ADM_deploy_adhoc_storage - ADM_register_pfs_storage ADM_update_pfs_storage - ADM_remove_pfs_storage - + # adhoc storage + ADM_register_adhoc_storage ADM_update_adhoc_storage ADM_remove_adhoc_storage + ADM_deploy_adhoc_storage + # pfs storage + ADM_register_pfs_storage ADM_update_pfs_storage ADM_remove_pfs_storage + # transfers + ADM_transfer_dataset ADM_get_transfer_priority ADM_set_transfer_priority + ADM_cancel_transfer ADM_get_pending_transfers + # qos + ADM_set_qos_constraints ADM_get_qos_constraints + # data operations + ADM_define_data_operation ADM_connect_data_operation + ADM_finalize_data_operation ADM_link_transfer_to_data_operation # ADM_in_situ_ops ADM_in_transit_ops - ADM_transfer_dataset - ADM_set_dataset_information ADM_set_io_resources ADM_get_transfer_priority - ADM_set_transfer_priority ADM_cancel_transfer ADM_get_pending_transfers - ADM_set_qos_constraints ADM_get_qos_constraints ADM_define_data_operation ADM_connect_data_operation - ADM_finalize_data_operation ADM_link_transfer_to_data_operation ADM_get_statistics) + #misc + ADM_get_statistics ADM_set_dataset_information ADM_set_io_resources + ) add_library(cxx_examples_common STATIC) target_sources(cxx_examples_common PUBLIC common.hpp PRIVATE common.cpp) @@ -50,50 +58,9 @@ foreach(example IN LISTS examples_cxx) endforeach() if(SCORD_BUILD_TESTS) - add_test(ADM_ping_test ADM_ping ofi+tcp://127.0.0.1:52000) - - add_test(ADM_cancel_transfer_cxx_test ADM_cancel_transfer ofi+tcp://127.0.0.1:52000) - set_tests_properties(ADM_cancel_transfer_cxx_test PROPERTIES LABELS "ADM_cancel_transfer;cxx") - - add_test(ADM_connect_data_operation_cxx_test ADM_connect_data_operation ofi+tcp://127.0.0.1:52000) - - add_test(ADM_define_data_operation_cxx_test ADM_define_data_operation ofi+tcp://127.0.0.1:52000) - - add_test(ADM_deploy_adhoc_storage_cxx_test ADM_deploy_adhoc_storage ofi+tcp://127.0.0.1:52000) - - add_test(ADM_finalize_data_operation_cxx_test ADM_finalize_data_operation ofi+tcp://127.0.0.1:52000) - - add_test(ADM_get_pending_transfers_cxx_test ADM_get_pending_transfers ofi+tcp://127.0.0.1:52000) - - add_test(ADM_get_qos_constraints_cxx_test ADM_get_qos_constraints ofi+tcp://127.0.0.1:52000) - - add_test(ADM_get_transfer_priority_cxx_test ADM_get_transfer_priority ofi+tcp://127.0.0.1:52000) - - add_test(ADM_link_transfer_to_data_operation_cxx_test ADM_link_transfer_to_data_operation ofi+tcp://127.0.0.1:52000) - - add_test(ADM_register_job_cxx_test ADM_register_job ofi+tcp://127.0.0.1:52000) - - add_test(ADM_register_pfs_storage_cxx_test ADM_register_pfs_storage ofi+tcp://127.0.0.1:52000) - - add_test(ADM_remove_adhoc_storage_cxx_test ADM_remove_adhoc_storage ofi+tcp://127.0.0.1:52000) - - add_test(ADM_remove_job_cxx_test ADM_remove_job ofi+tcp://127.0.0.1:52000) - - add_test(ADM_remove_pfs_storage_cxx_test ADM_remove_pfs_storage ofi+tcp://127.0.0.1:52000) - - add_test(ADM_set_dataset_information_cxx_test ADM_set_dataset_information ofi+tcp://127.0.0.1:52000) - - add_test(ADM_set_io_resources_cxx_test ADM_set_io_resources ofi+tcp://127.0.0.1:52000) - - add_test(ADM_set_qos_constraints_cxx_test ADM_set_qos_constraints ofi+tcp://127.0.0.1:52000) - - add_test(ADM_set_transfer_priority_cxx_test ADM_set_transfer_priority ofi+tcp://127.0.0.1:52000) - - add_test(ADM_transfer_dataset_cxx_test ADM_transfer_dataset ofi+tcp://127.0.0.1:52000) - - add_test(ADM_update_adhoc_storage_cxx_test ADM_update_adhoc_storage ofi+tcp://127.0.0.1:52000) - - add_test(ADM_update_job_cxx_test ADM_update_job ofi+tcp://127.0.0.1:52000) - - # TODO: add_test(ADM_update_pfs_storage_cxx_test ADM_update_pfs_storage ofi+tcp://127.0.0.1:52000 42) + foreach(example IN LISTS examples_cxx) + add_test(${example}_cxx_test ${example} ofi+tcp://${SCORD_BIND_ADDRESS}:${SCORD_BIND_PORT}) + set_tests_properties(${example}_cxx_test + PROPERTIES FIXTURES_REQUIRED scord_daemon) + endforeach() endif() diff --git a/scripts/runner.sh b/scripts/runner.sh new file mode 100755 index 0000000000000000000000000000000000000000..82c766d1002b1f02cf803e6becd32156f9416582 --- /dev/null +++ b/scripts/runner.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash + +function help() { + echo "Usage:" + echo " $(basename "$0") COMMAND" + echo "" + echo " Where COMMAND is one of:" + echo " start PIDFILE PROGRAM ARGS... Run PROGRAM and record its PID in PIDFILE" + echo " stop SIGNAL PIDFILE Send SIGNAL to the PID contained in PIDFILE" + echo " help Print this message" +} + +function readpid() { + + if [ $# -eq 0 ]; then + echo "FATAL: readpid(): Missing pifile" >&2 + exit 1 + fi + + pidfile="$1" + + read -r pid <"$pidfile" + echo $pid +} + +function run() { + + if [ $# -eq 0 ]; then + echo "FATAL: missing program pidfile" >&2 + elif [ $# -eq 1 ]; then + echo "FATAL: missing program to run" >&2 + help + exit 1 + fi + + pidfile="$1" + shift + + if [ -e "$pidfile" ]; then + pid=$(readpid "$pidfile") + echo "$pid" + + if pgrep --pidfile "$pidfile"; then + exit 1 + fi + fi + + "$@" 2>/dev/null 1>/dev/null 0"$pidfile" + sleep 1 + + if ! kill -0 $pid; then + echo "Process $pid does not seem to exist." >&2 + echo "The program below may not exist or may have crashed while starting:" >&2 + echo " $*" >&2 + exit 1 + fi + + exit 0 +} + +function stop() { + + if [ $# -eq 0 ]; then + echo "FATAL: missing signal" >&2 + exit 1 + elif [ $# -eq 1 ]; then + echo "FATAL: missing pidfile" >&2 + exit 1 + fi + + signal="$1" + pidfile="$2" + + if [ ! -e "$pidfile" ]; then + echo "FATAL: pidfile '$pidfile' does not exist" >&2 + exit 1 + fi + + if pkill "-$signal" --pidfile "$pidfile"; then + rm "$pidfile" + exit 0 + fi + exit 1 +} + +if [ $# -eq 0 ]; then + echo "FATAL: missing arguments" >&2 + help + exit 1 +fi + +case $1 in + +start) + shift + run "$@" + ;; + +stop) + shift + stop "$@" + ;; + +help) + help + exit 0 + ;; +esac