Loading CMakeLists.txt +30 −1 Original line number Diff line number Diff line Loading @@ -97,6 +97,10 @@ include(FetchContent) # that are substituted when generating defaults.cpp below include(GNUInstallDirs) # CMakeDependentOption defines cmake_dependent_option() which is used to # define options that depend on other options include(CMakeDependentOption) # Make sure that CMake can find our internal modules list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") Loading Loading @@ -149,6 +153,21 @@ message(STATUS "[${PROJECT_NAME}] server bind port: ${CARGO_BIND_PORT}") option(CARGO_BUILD_TESTS "Build tests (disabled by default)" OFF) ### MPI options that should be passed to ${MPIEXEC_EXECUTABLE} when starting ### the server via the `cargoctl` script set(CARGOCTL_MPIEXEC_OPTIONS "--map-by node --oversubscribe" CACHE STRING "Options passed to `${MPIEXEC_EXECUTABLE}` by `cargoctl` when starting the server") ### systemd support option(CARGO_SYSTEMD_SUPPORT "Enable systemd support (enabled by default)" ON) cmake_dependent_option( CARGO_SYSTEMD_INSTALL_UNIT_FILES "Install systemd unit files (disabled by default)" OFF "CARGO_SYSTEMD_SUPPORT" OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # ############################################################################## Loading Loading @@ -320,9 +339,13 @@ else () endif () add_subdirectory(etc) add_subdirectory(cli) add_subdirectory(lib) add_subdirectory(src) add_subdirectory(util) if(CARGO_SYSTEMD_SUPPORT) add_subdirectory(systemd) endif() if(CARGO_BUILD_TESTS) add_subdirectory(tests) Loading @@ -334,6 +357,11 @@ endif() # using find_package() # ############################################################################## set(BIN_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH "Path where ${PROJECT_NAME} binaries will be installed") set(DATA_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}" CACHE PATH "Path where ${PROJECT_NAME} data files will be installed") include(CMakePackageConfigHelpers) configure_package_config_file( Loading @@ -341,6 +369,7 @@ configure_package_config_file( "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${PROJECT_VERSION}" PATH_VARS BIN_INSTALL_DIR DATA_INSTALL_DIR ) write_basic_package_version_file( Loading cli/CMakeLists.txt 0 → 100644 +92 −0 Original line number Diff line number Diff line ################################################################################ # Copyright 2022-2023, 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 Cargo. # # # # Cargo 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. # # # # Cargo 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 Cargo. If not, see <https://www.gnu.org/licenses/>. # # # # SPDX-License-Identifier: GPL-3.0-or-later # ################################################################################ ################################################################################ ## cargoctl: A CLI tool to interact with a Cargo server # TODO: This is a hack: `cargoctl` needs to know the full path to the # installed `cargo` and `cargo_shutdown` programs but CMake doesn't seem to # provide a way to get this information at this stage. Thus, we set it manually # here :( set(CARGO_PROGRAM ${CMAKE_INSTALL_FULL_BINDIR}/cargo) set(CARGO_SHUTDOWN_PROGRAM ${CMAKE_INSTALL_FULL_BINDIR}/cargo_shutdown) configure_file(cargoctl.in cargoctl @ONLY) ################################################################################ ## cargo_ping: A CLI tool to check if a Cargo server is running add_executable(cargo_ping) target_sources(cargo_ping PRIVATE ping.cpp ) target_link_libraries(cargo_ping PUBLIC fmt::fmt CLI11::CLI11 net::rpc_client cargo ) ################################################################################ ## cargo_shutdown: A CLI tool to shutdown a Cargo server add_executable(cargo_shutdown) target_sources(cargo_shutdown PRIVATE shutdown.cpp ) target_link_libraries(cargo_shutdown PUBLIC fmt::fmt CLI11::CLI11 net::rpc_client cargo ) ################################################################################ ## ccp: A CLI tool to request a Cargo server to copy files between storage tiers add_executable(ccp) target_sources(ccp PRIVATE copy.cpp ) target_link_libraries(ccp PUBLIC fmt::fmt CLI11::CLI11 net::rpc_client cargo ) install(TARGETS cargo_ping cargo_shutdown ccp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/cargoctl DESTINATION ${CMAKE_INSTALL_BINDIR}) cli/cargoctl.in 0 → 100755 +172 −0 Original line number Diff line number Diff line #!/bin/bash ################################################################################ # Copyright 2022-2023, 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 Cargo. # # # # Cargo 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. # # # # Cargo 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 Cargo. If not, see <https://www.gnu.org/licenses/>. # # # # SPDX-License-Identifier: GPL-3.0-or-later # ################################################################################ progname=$(basename "$0") usage() { echo "Usage: $progname COMMAND <OPTIONS>" echo "" echo " -h, --help: Show this help message and exit" echo "" echo "Valid commands:" echo "" echo "Start a Cargo server listening on a address <ADDR>, with <N> workers " echo "distributed over a pool of hosts <host1, host2, ..., hostN>:" echo " $progname start -s <ADDR> -H <host1,host2,...,hostN> -n <N> " echo "" echo "NOTE: ADDR must be a valid Mercury address, and host1, host2, ..., " echo "hostN must be valid hostnames. Also, ADDR should refer to one of the " echo "defined hosts in the host pool." echo "" echo "Stop a Cargo server listening on a given address <ADDR>:" echo " $progname stop -s <ADDR>" exit 1 } start() { if [ $# -eq 0 ]; then echo "$progname: ERROR: No options provided" >&2 usage fi local OPTIND opt workers address while getopts ":s:H:n:" opt; do case $opt in s) address="$OPTARG" ;; H) hosts="$OPTARG" ;; n) workers="$OPTARG" ;; \?) echo "$progname: Invalid option: '-$OPTARG'" >&2 usage ;; :) echo "Option -$OPTARG requires an argument." >&2 usage ;; esac done if [ -z "$workers" ]; then echo "$progname: ERROR: Number of workers not provided" >&2 usage fi if [ -z "$address" ]; then echo "$progname: ERROR: Bind address not provided" >&2 usage fi echo "Starting the Cargo server" echo " Hosts: $hosts" echo " Workers: $workers" echo " Master address: $address" if ! @MPIEXEC_EXECUTABLE@ \ -H "$hosts" \ -np "$workers" \ @CARGOCTL_MPIEXEC_OPTIONS@ \ @CARGO_PROGRAM@ --listen "$address"; then echo "Failed to start the Cargo server" exit 1 fi } stop() { if [ $# -eq 0 ]; then echo "$progname: ERROR: No options provided" >&2 usage fi local OPTIND opt address while getopts ":s:" opt; do case $opt in s) address="$OPTARG" ;; \?) echo "$progname: Invalid option: '-$OPTARG'" >&2 usage ;; :) echo "Option -$OPTARG requires an argument." >&2 usage ;; esac done if [ -z "$address" ]; then echo "$progname: ERROR: Server address not provided" >&2 usage fi echo "Stopping the Cargo server at $address" @CARGO_SHUTDOWN_PROGRAM@ -s "$address" } main() { if [ $# -lt 1 ]; then usage fi echo "Running $progname $*" local cmd for arg in "$@"; do case $arg in "-h" | "--help") usage ;; *) ;; esac done while [ $# -gt 0 ]; do case $1 in "start" | "stop") cmd="$1" shift "$cmd" "$@" exit 0 ;; *) echo "$progname: Invalid option: $1" >&2 usage ;; esac done } main "$@" util/copy.cpp→cli/copy.cpp +0 −0 File moved. View file util/ping.cpp→cli/ping.cpp +0 −0 File moved. View file Loading
CMakeLists.txt +30 −1 Original line number Diff line number Diff line Loading @@ -97,6 +97,10 @@ include(FetchContent) # that are substituted when generating defaults.cpp below include(GNUInstallDirs) # CMakeDependentOption defines cmake_dependent_option() which is used to # define options that depend on other options include(CMakeDependentOption) # Make sure that CMake can find our internal modules list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") Loading Loading @@ -149,6 +153,21 @@ message(STATUS "[${PROJECT_NAME}] server bind port: ${CARGO_BIND_PORT}") option(CARGO_BUILD_TESTS "Build tests (disabled by default)" OFF) ### MPI options that should be passed to ${MPIEXEC_EXECUTABLE} when starting ### the server via the `cargoctl` script set(CARGOCTL_MPIEXEC_OPTIONS "--map-by node --oversubscribe" CACHE STRING "Options passed to `${MPIEXEC_EXECUTABLE}` by `cargoctl` when starting the server") ### systemd support option(CARGO_SYSTEMD_SUPPORT "Enable systemd support (enabled by default)" ON) cmake_dependent_option( CARGO_SYSTEMD_INSTALL_UNIT_FILES "Install systemd unit files (disabled by default)" OFF "CARGO_SYSTEMD_SUPPORT" OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # ############################################################################## Loading Loading @@ -320,9 +339,13 @@ else () endif () add_subdirectory(etc) add_subdirectory(cli) add_subdirectory(lib) add_subdirectory(src) add_subdirectory(util) if(CARGO_SYSTEMD_SUPPORT) add_subdirectory(systemd) endif() if(CARGO_BUILD_TESTS) add_subdirectory(tests) Loading @@ -334,6 +357,11 @@ endif() # using find_package() # ############################################################################## set(BIN_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH "Path where ${PROJECT_NAME} binaries will be installed") set(DATA_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}" CACHE PATH "Path where ${PROJECT_NAME} data files will be installed") include(CMakePackageConfigHelpers) configure_package_config_file( Loading @@ -341,6 +369,7 @@ configure_package_config_file( "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${PROJECT_VERSION}" PATH_VARS BIN_INSTALL_DIR DATA_INSTALL_DIR ) write_basic_package_version_file( Loading
cli/CMakeLists.txt 0 → 100644 +92 −0 Original line number Diff line number Diff line ################################################################################ # Copyright 2022-2023, 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 Cargo. # # # # Cargo 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. # # # # Cargo 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 Cargo. If not, see <https://www.gnu.org/licenses/>. # # # # SPDX-License-Identifier: GPL-3.0-or-later # ################################################################################ ################################################################################ ## cargoctl: A CLI tool to interact with a Cargo server # TODO: This is a hack: `cargoctl` needs to know the full path to the # installed `cargo` and `cargo_shutdown` programs but CMake doesn't seem to # provide a way to get this information at this stage. Thus, we set it manually # here :( set(CARGO_PROGRAM ${CMAKE_INSTALL_FULL_BINDIR}/cargo) set(CARGO_SHUTDOWN_PROGRAM ${CMAKE_INSTALL_FULL_BINDIR}/cargo_shutdown) configure_file(cargoctl.in cargoctl @ONLY) ################################################################################ ## cargo_ping: A CLI tool to check if a Cargo server is running add_executable(cargo_ping) target_sources(cargo_ping PRIVATE ping.cpp ) target_link_libraries(cargo_ping PUBLIC fmt::fmt CLI11::CLI11 net::rpc_client cargo ) ################################################################################ ## cargo_shutdown: A CLI tool to shutdown a Cargo server add_executable(cargo_shutdown) target_sources(cargo_shutdown PRIVATE shutdown.cpp ) target_link_libraries(cargo_shutdown PUBLIC fmt::fmt CLI11::CLI11 net::rpc_client cargo ) ################################################################################ ## ccp: A CLI tool to request a Cargo server to copy files between storage tiers add_executable(ccp) target_sources(ccp PRIVATE copy.cpp ) target_link_libraries(ccp PUBLIC fmt::fmt CLI11::CLI11 net::rpc_client cargo ) install(TARGETS cargo_ping cargo_shutdown ccp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/cargoctl DESTINATION ${CMAKE_INSTALL_BINDIR})
cli/cargoctl.in 0 → 100755 +172 −0 Original line number Diff line number Diff line #!/bin/bash ################################################################################ # Copyright 2022-2023, 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 Cargo. # # # # Cargo 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. # # # # Cargo 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 Cargo. If not, see <https://www.gnu.org/licenses/>. # # # # SPDX-License-Identifier: GPL-3.0-or-later # ################################################################################ progname=$(basename "$0") usage() { echo "Usage: $progname COMMAND <OPTIONS>" echo "" echo " -h, --help: Show this help message and exit" echo "" echo "Valid commands:" echo "" echo "Start a Cargo server listening on a address <ADDR>, with <N> workers " echo "distributed over a pool of hosts <host1, host2, ..., hostN>:" echo " $progname start -s <ADDR> -H <host1,host2,...,hostN> -n <N> " echo "" echo "NOTE: ADDR must be a valid Mercury address, and host1, host2, ..., " echo "hostN must be valid hostnames. Also, ADDR should refer to one of the " echo "defined hosts in the host pool." echo "" echo "Stop a Cargo server listening on a given address <ADDR>:" echo " $progname stop -s <ADDR>" exit 1 } start() { if [ $# -eq 0 ]; then echo "$progname: ERROR: No options provided" >&2 usage fi local OPTIND opt workers address while getopts ":s:H:n:" opt; do case $opt in s) address="$OPTARG" ;; H) hosts="$OPTARG" ;; n) workers="$OPTARG" ;; \?) echo "$progname: Invalid option: '-$OPTARG'" >&2 usage ;; :) echo "Option -$OPTARG requires an argument." >&2 usage ;; esac done if [ -z "$workers" ]; then echo "$progname: ERROR: Number of workers not provided" >&2 usage fi if [ -z "$address" ]; then echo "$progname: ERROR: Bind address not provided" >&2 usage fi echo "Starting the Cargo server" echo " Hosts: $hosts" echo " Workers: $workers" echo " Master address: $address" if ! @MPIEXEC_EXECUTABLE@ \ -H "$hosts" \ -np "$workers" \ @CARGOCTL_MPIEXEC_OPTIONS@ \ @CARGO_PROGRAM@ --listen "$address"; then echo "Failed to start the Cargo server" exit 1 fi } stop() { if [ $# -eq 0 ]; then echo "$progname: ERROR: No options provided" >&2 usage fi local OPTIND opt address while getopts ":s:" opt; do case $opt in s) address="$OPTARG" ;; \?) echo "$progname: Invalid option: '-$OPTARG'" >&2 usage ;; :) echo "Option -$OPTARG requires an argument." >&2 usage ;; esac done if [ -z "$address" ]; then echo "$progname: ERROR: Server address not provided" >&2 usage fi echo "Stopping the Cargo server at $address" @CARGO_SHUTDOWN_PROGRAM@ -s "$address" } main() { if [ $# -lt 1 ]; then usage fi echo "Running $progname $*" local cmd for arg in "$@"; do case $arg in "-h" | "--help") usage ;; *) ;; esac done while [ $# -gt 0 ]; do case $1 in "start" | "stop") cmd="$1" shift "$cmd" "$@" exit 0 ;; *) echo "$progname: Invalid option: $1" >&2 usage ;; esac done } main "$@"