diff --git a/.github/workflows/agent_ci.yml b/.github/workflows/agent_ci.yml index 15f282e..9272a78 100644 --- a/.github/workflows/agent_ci.yml +++ b/.github/workflows/agent_ci.yml @@ -4,20 +4,12 @@ on: push: branches: [ "main", "devel" ] paths: - - 'source/agent/**' - - 'libs/**' - - 'CMakeLists.txt' - - 'vcpkg.json' - - 'CMakePresets.json' + - 'sources/agent/' - '.github/workflows/agent_ci.yml' pull_request: branches: [ "main", "devel" ] paths: - - 'source/agent/**' - - 'libs/**' - - 'CMakeLists.txt' - - 'vcpkg.json' - - 'CMakePresets.json' + - 'sources/agent/' - '.github/workflows/agent_ci.yml' jobs: @@ -31,26 +23,36 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Setup C++ tools + uses: aminya/setup-cpp@v1 + with: + clang-format: true + cppcheck: true - - name: Install build tools - run: | - sudo apt-get update - sudo apt-get install -y build-essential cmake clang-format cppcheck + - name: Cache vcpkg + uses: actions/cache@v4 + with: + path: | + ~/.cache/vcpkg + sources/agent/build/vcpkg_installed + key: vcpkg-${{ runner.os }}-${{ hashFiles('sources/agent/vcpkg.json') }} - name: Setup vcpkg uses: lukka/run-vcpkg@v11 with: - vcpkgJsonGlob: 'vcpkg.json' + vcpkgJsonGlob: 'sources/agent/vcpkg.json' - name: Check Code Formatting run: | - find source/agent -name "*.cc" -o -name "*.h" | xargs clang-format --dry-run --Werror -style=Google + find sources/agent/src -name "*.cc" -o -name "*.h" | xargs clang-format --dry-run --Werror -style=Google - name: CMake Configure - run: cmake --preset default + working-directory: sources/agent + run: cmake --preset default -DCMAKE_BUILD_TYPE=Release - name: Build - run: cmake --build --preset default + working-directory: sources/agent + run: cmake --build --preset default -j$(nproc) - name: Analyze Logic run: | @@ -59,5 +61,5 @@ jobs: --suppress=missingIncludeSystem \ --inline-suppr \ --force \ - -i build \ - source/agent + -i sources/agent/build \ + sources/agent \ No newline at end of file diff --git a/.gitignore b/.gitignore index 086cdb0..8d39e29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,13 @@ +# --- Shared --- .vscode/ +*.code-workspace +# --- Agent --- build/ -out/ -bin/ - .cache/ compile_commands.json +sources/agent/agent.conf +.clang-format +# --- Server --- +sources/server/generated/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 9fc5327..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,79 +0,0 @@ -cmake_minimum_required(VERSION 3.16) - -project(volta LANGUAGES CXX) - -set(CMAKE_CXX_STANDARD 20) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -find_package(protobuf CONFIG REQUIRED) -find_package(gRPC CONFIG REQUIRED) -find_package(fmt CONFIG REQUIRED) -find_package(tomlplusplus CONFIG REQUIRED) - -set(PROTO_DIR ${CMAKE_SOURCE_DIR}/libs/proto) -set(PROTO_FILE ${PROTO_DIR}/volta.proto) -set(LOCAL_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/libs/include") - -get_target_property(GRPC_CPP_PLUGIN gRPC::grpc_cpp_plugin LOCATION) - -set(PROTO_SRC "${CMAKE_CURRENT_BINARY_DIR}/volta.pb.cc") -set(PROTO_HDR "${CMAKE_CURRENT_BINARY_DIR}/volta.pb.h") -set(GRPC_SRC "${CMAKE_CURRENT_BINARY_DIR}/volta.grpc.pb.cc") -set(GRPC_HDR "${CMAKE_CURRENT_BINARY_DIR}/volta.grpc.pb.h") - -add_custom_command( - OUTPUT "${PROTO_SRC}" "${PROTO_HDR}" "${GRPC_SRC}" "${GRPC_HDR}" - - COMMAND protobuf::protoc - - ARGS --cpp_out="${CMAKE_CURRENT_BINARY_DIR}" - --grpc_out="${CMAKE_CURRENT_BINARY_DIR}" - --plugin=protoc-gen-grpc="${GRPC_CPP_PLUGIN}" - -I "${PROTO_DIR}" - "${PROTO_FILE}" - - DEPENDS "${PROTO_FILE}" gRPC::grpc_cpp_plugin - COMMENT "Generating C++ code from volta.proto..." -) - -add_library(volta_proto ${PROTO_SRC} ${PROTO_HDR} ${GRPC_SRC} ${GRPC_HDR}) - -target_include_directories(volta_proto PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) - -target_link_libraries(volta_proto PRIVATE - protobuf::libprotobuf - gRPC::grpc++ - gRPC::grpc++_reflection - fmt::fmt - tomlplusplus::tomlplusplus - ${CMAKE_DL_LIBS} -) - -include_directories("${LOCAL_INCLUDE_DIR}/nvidia") - -add_subdirectory(source/agent) -#add_subdirectory(source/server) - -# --- Custom Tools Targets --- -find_program(CLANG_FORMAT_EXE clang-format) - -if(CLANG_FORMAT_EXE) - # clang-format - add_custom_target(format - COMMAND find source/agent -name "*.cc" -o -name "*.h" | xargs ${CLANG_FORMAT_EXE} -i -style=Google - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Running clang-format on source files..." - VERBATIM - ) - - # optional: check formatting - add_custom_target(check-format - COMMAND find source/agent -name "*.cc" -o -name "*.h" | xargs ${CLANG_FORMAT_EXE} --dry-run --Werror -style=Google - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Checking code formatting..." - VERBATIM - ) -else() - message(WARNING "clang-format not found! 'make format' will not be available.") -endif() diff --git a/scripts/hooks/pre-commit b/scripts/hooks/pre-commit new file mode 100644 index 0000000..dd496c6 --- /dev/null +++ b/scripts/hooks/pre-commit @@ -0,0 +1,23 @@ +#!/bin/bash + +REPO_ROOT=$(git rev-parse --show-toplevel) +BUILD_DIR="$REPO_ROOT/sources/agent/build" + +if [ ! -d "$BUILD_DIR" ]; then + echo "Build directory not found: $BUILD_DIR" + echo "Run cmake --preset debug in sources/agent first." + exit 1 +fi + +# Sprawdź tylko pliki staged do commita +STAGED=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(cc|h)$') + +if [ -z "$STAGED" ]; then + exit 0 +fi + +cmake --build "$BUILD_DIR" --target check-format +if [ $? -ne 0 ]; then + echo "Formatting errors found. Run 'cmake --build $BUILD_DIR --target format' to fix." + exit 1 +fi \ No newline at end of file diff --git a/source/agent/CMakeLists.txt b/source/agent/CMakeLists.txt deleted file mode 100644 index bb23533..0000000 --- a/source/agent/CMakeLists.txt +++ /dev/null @@ -1,59 +0,0 @@ -set(AGENT_NAME volta_agent) -add_executable(${AGENT_NAME}) - -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - message(STATUS "Debug build - adding DEBUG macro") - target_compile_definitions(${AGENT_NAME} PRIVATE DEBUG) -endif() - -file(GLOB_RECURSE AGENT_SOURCES "src/*.cc") -target_sources(${AGENT_NAME} PRIVATE ${AGENT_SOURCES}) - -target_include_directories(${AGENT_NAME} PRIVATE src) - -target_link_libraries(${AGENT_NAME} PRIVATE volta_proto) - -find_package(Threads REQUIRED) -find_package(Protobuf REQUIRED) -find_package(gRPC REQUIRED) -find_package(tomlplusplus REQUIRED) - -target_link_libraries(${AGENT_NAME} PRIVATE - Threads::Threads - gRPC::grpc++ - protobuf::libprotobuf - tomlplusplus::tomlplusplus -) - -find_path(NVML_INCLUDE_DIR nvml.h - PATHS ${CMAKE_SOURCE_DIR}/libs/include/nvidia - /usr/include - /usr/local/cuda/include -) - -find_library(NVML_LIBRARY NAMES nvidia-ml nvml - PATHS /usr/lib /usr/lib64 /usr/local/lib -) - -if(NVML_INCLUDE_DIR AND NVML_LIBRARY) - message(STATUS "Found Real NVML: ${NVML_LIBRARY}") - target_include_directories(${AGENT_NAME} PRIVATE ${NVML_INCLUDE_DIR}) - target_link_libraries(${AGENT_NAME} PRIVATE ${NVML_LIBRARY}) - target_compile_definitions(${AGENT_NAME} PRIVATE HAVE_NVML) -else() - message(STATUS "NVML library not found. Using STUB for compilation.") - add_library(nvml_stub STATIC ${CMAKE_SOURCE_DIR}/libs/stubs/nvml_stub.cc) - target_include_directories(nvml_stub PRIVATE ${CMAKE_SOURCE_DIR}/libs/include/nvidia) - target_link_libraries(${AGENT_NAME} PRIVATE nvml_stub) - target_compile_definitions(${AGENT_NAME} PRIVATE HAVE_NVML) - target_include_directories(${AGENT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/libs/include/nvidia) -endif() - -configure_file( - ${CMAKE_SOURCE_DIR}/agent.conf - ${CMAKE_CURRENT_BINARY_DIR}/agent.conf - COPYONLY -) - -# 5. TODO: find rocm_smi and oneapi level_zero -# 6. TODO: find PMU (libpfm) diff --git a/sources/agent/CMakeLists.txt b/sources/agent/CMakeLists.txt new file mode 100644 index 0000000..2ead23e --- /dev/null +++ b/sources/agent/CMakeLists.txt @@ -0,0 +1,167 @@ +cmake_minimum_required(VERSION 3.16) + +project(volta_agent LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "13.0") + message(FATAL_ERROR "GCC 13+ required (found ${CMAKE_CXX_COMPILER_VERSION})") +endif() + +# --- Dependencies --- +find_package(gRPC CONFIG REQUIRED) +find_package(protobuf CONFIG REQUIRED) +find_package(fmt CONFIG REQUIRED) +find_package(tomlplusplus CONFIG REQUIRED) +find_package(Threads REQUIRED) + +# --- Proto / gRPC code generation --- +set(PROTO_DIR ${CMAKE_SOURCE_DIR}/../proto) +set(PROTO_FILE ${PROTO_DIR}/volta.proto) + +get_target_property(GRPC_CPP_PLUGIN gRPC::grpc_cpp_plugin LOCATION) + +set(PROTO_SRC "${CMAKE_CURRENT_BINARY_DIR}/volta.pb.cc") +set(PROTO_HDR "${CMAKE_CURRENT_BINARY_DIR}/volta.pb.h") +set(GRPC_SRC "${CMAKE_CURRENT_BINARY_DIR}/volta.grpc.pb.cc") +set(GRPC_HDR "${CMAKE_CURRENT_BINARY_DIR}/volta.grpc.pb.h") + +add_custom_command( + OUTPUT "${PROTO_SRC}" "${PROTO_HDR}" "${GRPC_SRC}" "${GRPC_HDR}" + COMMAND protobuf::protoc + ARGS --cpp_out="${CMAKE_CURRENT_BINARY_DIR}" + --grpc_out="${CMAKE_CURRENT_BINARY_DIR}" + --plugin=protoc-gen-grpc="${GRPC_CPP_PLUGIN}" + -I "${PROTO_DIR}" + "${PROTO_FILE}" + DEPENDS "${PROTO_FILE}" gRPC::grpc_cpp_plugin + COMMENT "Generating C++ code from volta.proto..." +) + +add_library(volta_proto STATIC ${PROTO_SRC} ${PROTO_HDR} ${GRPC_SRC} ${GRPC_HDR}) + +target_include_directories(volta_proto PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) + +target_link_libraries(volta_proto PUBLIC + protobuf::libprotobuf + gRPC::grpc++ + gRPC::grpc++_reflection +) + +# --- Agent executable --- +add_executable(volta_agent) + +target_compile_options(volta_agent PRIVATE -std=c++20) + +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + message(STATUS "Debug build - adding DEBUG macro") + target_compile_definitions(volta_agent PRIVATE DEBUG) +endif() + +file(GLOB_RECURSE AGENT_SOURCES "src/*.cc") +target_sources(volta_agent PRIVATE ${AGENT_SOURCES}) + +target_include_directories(volta_agent PRIVATE + src + ${CMAKE_SOURCE_DIR}/libs/include/nvidia +) + +target_link_libraries(volta_agent PRIVATE + volta_proto + Threads::Threads + fmt::fmt + tomlplusplus::tomlplusplus +) + +# --- NVML --- +find_path(NVML_INCLUDE_DIR nvml.h + PATHS + ${CMAKE_SOURCE_DIR}/libs/include/nvidia + /usr/include + /usr/local/cuda/include +) + +find_library(NVML_LIBRARY NAMES nvidia-ml nvml + PATHS /usr/lib /usr/lib64 /usr/local/lib +) + +if(NVML_INCLUDE_DIR AND NVML_LIBRARY) + message(STATUS "Found NVML: ${NVML_LIBRARY}") + target_include_directories(volta_agent PRIVATE ${NVML_INCLUDE_DIR}) + target_link_libraries(volta_agent PRIVATE ${NVML_LIBRARY}) +else() + message(STATUS "NVML not found - using stub") + add_library(nvml_stub STATIC ${CMAKE_SOURCE_DIR}/libs/stubs/nvml_stub.cc) + target_include_directories(nvml_stub PRIVATE ${CMAKE_SOURCE_DIR}/libs/include/nvidia) + target_link_libraries(volta_agent PRIVATE nvml_stub) + target_include_directories(volta_agent PRIVATE ${CMAKE_SOURCE_DIR}/libs/include/nvidia) +endif() + +target_compile_definitions(volta_agent PRIVATE HAVE_NVML) + +# --- Config file --- +if(NOT EXISTS ${CMAKE_SOURCE_DIR}/agent.conf) + if(EXISTS ${CMAKE_SOURCE_DIR}/agent.example.conf) + message(STATUS "agent.conf not found - copying from agent.example.conf") + file(COPY ${CMAKE_SOURCE_DIR}/agent.example.conf + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/agent.example.conf + ${CMAKE_CURRENT_BINARY_DIR}/agent.conf) + else() + message(WARNING "Neither agent.conf nor agent.example.conf found") + endif() +else() + add_custom_command( + TARGET volta_agent POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_SOURCE_DIR}/agent.conf + ${CMAKE_CURRENT_BINARY_DIR}/agent.conf + COMMENT "Copying agent.conf..." + ) +endif() + +# --- Formatting --- +find_program(CLANG_FORMAT_EXE clang-format) + +if(CLANG_FORMAT_EXE) + add_custom_target(format + COMMAND find src -name "*.cc" -o -name "*.h" | xargs ${CLANG_FORMAT_EXE} -i -style=Google + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Running clang-format on agent sources..." + VERBATIM + ) + add_custom_target(check-format + COMMAND find src -name "*.cc" -o -name "*.h" | xargs ${CLANG_FORMAT_EXE} --dry-run --Werror -style=Google + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Checking agent source formatting..." + VERBATIM + ) +else() + message(WARNING "clang-format not found - 'make format' unavailable") +endif() + +# TODO: find rocm_smi and oneapi level_zero +# TODO: find PMU (libpfm) + +# --- Scripts --- +find_program(GIT_EXE git) +if(GIT_EXE) + execute_process( + COMMAND ${GIT_EXE} rev-parse --show-toplevel + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_ROOT + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(EXISTS ${GIT_ROOT}/.git) + configure_file( + ${GIT_ROOT}/scripts/hooks/pre-commit + ${GIT_ROOT}/.git/hooks/pre-commit + COPYONLY + ) + file(CHMOD ${GIT_ROOT}/.git/hooks/pre-commit + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE) + message(STATUS "Git pre-commit hook installed") + endif() +endif() \ No newline at end of file diff --git a/CMakePresets.json b/sources/agent/CMakePresets.json similarity index 99% rename from CMakePresets.json rename to sources/agent/CMakePresets.json index 1c408bf..c5fa5b1 100644 --- a/CMakePresets.json +++ b/sources/agent/CMakePresets.json @@ -16,4 +16,4 @@ "configurePreset": "default" } ] -} +} \ No newline at end of file diff --git a/source/agent/README.md b/sources/agent/README.md similarity index 100% rename from source/agent/README.md rename to sources/agent/README.md diff --git a/agent.conf b/sources/agent/agent.example.conf similarity index 100% rename from agent.conf rename to sources/agent/agent.example.conf diff --git a/libs/include/nvidia/nvml.h b/sources/agent/libs/include/nvidia/nvml.h similarity index 100% rename from libs/include/nvidia/nvml.h rename to sources/agent/libs/include/nvidia/nvml.h diff --git a/libs/stubs/nvml_stub.cc b/sources/agent/libs/stubs/nvml_stub.cc similarity index 100% rename from libs/stubs/nvml_stub.cc rename to sources/agent/libs/stubs/nvml_stub.cc diff --git a/source/agent/src/collectors/collector.h b/sources/agent/src/collectors/collector.h similarity index 100% rename from source/agent/src/collectors/collector.h rename to sources/agent/src/collectors/collector.h diff --git a/source/agent/src/collectors/nvml_collector.cc b/sources/agent/src/collectors/nvml_collector.cc similarity index 100% rename from source/agent/src/collectors/nvml_collector.cc rename to sources/agent/src/collectors/nvml_collector.cc diff --git a/source/agent/src/collectors/nvml_collector.h b/sources/agent/src/collectors/nvml_collector.h similarity index 100% rename from source/agent/src/collectors/nvml_collector.h rename to sources/agent/src/collectors/nvml_collector.h diff --git a/source/agent/src/collectors/proc_stat_collector.cc b/sources/agent/src/collectors/proc_stat_collector.cc similarity index 100% rename from source/agent/src/collectors/proc_stat_collector.cc rename to sources/agent/src/collectors/proc_stat_collector.cc diff --git a/source/agent/src/collectors/proc_stat_collector.h b/sources/agent/src/collectors/proc_stat_collector.h similarity index 100% rename from source/agent/src/collectors/proc_stat_collector.h rename to sources/agent/src/collectors/proc_stat_collector.h diff --git a/source/agent/src/collectors/ram_collector.cc b/sources/agent/src/collectors/ram_collector.cc similarity index 100% rename from source/agent/src/collectors/ram_collector.cc rename to sources/agent/src/collectors/ram_collector.cc diff --git a/source/agent/src/collectors/ram_collector.h b/sources/agent/src/collectors/ram_collector.h similarity index 100% rename from source/agent/src/collectors/ram_collector.h rename to sources/agent/src/collectors/ram_collector.h diff --git a/source/agent/src/config/config.h b/sources/agent/src/config/config.h similarity index 100% rename from source/agent/src/config/config.h rename to sources/agent/src/config/config.h diff --git a/source/agent/src/config/config_loader.cc b/sources/agent/src/config/config_loader.cc similarity index 100% rename from source/agent/src/config/config_loader.cc rename to sources/agent/src/config/config_loader.cc diff --git a/source/agent/src/config/config_loader.h b/sources/agent/src/config/config_loader.h similarity index 100% rename from source/agent/src/config/config_loader.h rename to sources/agent/src/config/config_loader.h diff --git a/source/agent/src/main.cc b/sources/agent/src/main.cc similarity index 95% rename from source/agent/src/main.cc rename to sources/agent/src/main.cc index e44c31e..09b6424 100644 --- a/source/agent/src/main.cc +++ b/sources/agent/src/main.cc @@ -44,7 +44,7 @@ int main() { scheduler.Run(); } catch (const std::exception& e) { - std::cerr << "CRITICAL ERROR: " << e.what() << std::endl; + // std::cerr << "CRITICAL ERROR: " << e.what() << std::endl; return 1; } return 0; diff --git a/source/agent/src/metric.h b/sources/agent/src/metric.h similarity index 100% rename from source/agent/src/metric.h rename to sources/agent/src/metric.h diff --git a/source/agent/src/platform/cpu_info.h b/sources/agent/src/platform/cpu_info.h similarity index 100% rename from source/agent/src/platform/cpu_info.h rename to sources/agent/src/platform/cpu_info.h diff --git a/source/agent/src/platform/gpu_info.h b/sources/agent/src/platform/gpu_info.h similarity index 100% rename from source/agent/src/platform/gpu_info.h rename to sources/agent/src/platform/gpu_info.h diff --git a/source/agent/src/platform/hardware_info.h b/sources/agent/src/platform/hardware_info.h similarity index 100% rename from source/agent/src/platform/hardware_info.h rename to sources/agent/src/platform/hardware_info.h diff --git a/source/agent/src/platform/platform_detector.cc b/sources/agent/src/platform/platform_detector.cc similarity index 100% rename from source/agent/src/platform/platform_detector.cc rename to sources/agent/src/platform/platform_detector.cc diff --git a/source/agent/src/platform/platform_detector.h b/sources/agent/src/platform/platform_detector.h similarity index 100% rename from source/agent/src/platform/platform_detector.h rename to sources/agent/src/platform/platform_detector.h diff --git a/source/agent/src/scheduler.cc b/sources/agent/src/scheduler.cc similarity index 100% rename from source/agent/src/scheduler.cc rename to sources/agent/src/scheduler.cc diff --git a/source/agent/src/scheduler.h b/sources/agent/src/scheduler.h similarity index 100% rename from source/agent/src/scheduler.h rename to sources/agent/src/scheduler.h diff --git a/source/agent/src/utils/utils.cc b/sources/agent/src/utils/utils.cc similarity index 100% rename from source/agent/src/utils/utils.cc rename to sources/agent/src/utils/utils.cc diff --git a/source/agent/src/utils/utils.h b/sources/agent/src/utils/utils.h similarity index 100% rename from source/agent/src/utils/utils.h rename to sources/agent/src/utils/utils.h diff --git a/vcpkg.json b/sources/agent/vcpkg.json similarity index 100% rename from vcpkg.json rename to sources/agent/vcpkg.json diff --git a/source/dashboard/README.md b/sources/dashboard/README.md similarity index 100% rename from source/dashboard/README.md rename to sources/dashboard/README.md diff --git a/libs/proto/volta.proto b/sources/proto/volta.proto similarity index 100% rename from libs/proto/volta.proto rename to sources/proto/volta.proto diff --git a/source/server/README.md b/sources/server/README.md similarity index 100% rename from source/server/README.md rename to sources/server/README.md