Read the image from the request
continuous-integration/drone/push Build is passing Details

pull/1/head
Clément FRÉVILLE 2 years ago
parent c8408620c0
commit 5435dc638d

@ -15,7 +15,7 @@ FetchContent_MakeAvailable(tomlplusplus)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/libzmq-pkg-config)
find_package(ZeroMQ QUIET)
add_executable(planificador src/host.cpp src/runner.cpp src/config.cpp src/main.cpp)
add_executable(planificador src/host.cpp src/runner.cpp src/network.cpp src/config.cpp src/main.cpp)
if (NOT ZeroMQ_FOUND)
message(STATUS "ZeroMQ not found, using bundled version")
FetchContent_Declare(

@ -1,4 +1,5 @@
#include "config.hpp"
#include "network.hpp"
#include "program.hpp"
#include "runner.hpp"
#include <filesystem>
@ -13,6 +14,9 @@
#include "host.hpp"
#include "zmq_addon.hpp"
static constexpr uint32_t JOB_ID_LEN = 32;
static constexpr uint32_t MIN_MESSAGE_LEN = JOB_ID_LEN + sizeof(uint32_t) * 2;
sk::runner_backend detect_backend() {
const char *const argv[] = {"docker", "stats", "--no-stream", nullptr};
pid_t pid;
@ -53,15 +57,27 @@ int main() {
while (true) {
zmq::message_t request;
receiver.recv(request);
if (request.size() < 32) {
if (request.size() < MIN_MESSAGE_LEN) {
std::cerr << "Invalid request" << std::endl;
break;
}
std::string_view jobId(static_cast<char *>(request.data()), JOB_ID_LEN);
uint32_t imageLen =
sk::read_uint32(static_cast<char *>(request.data()) + JOB_ID_LEN);
uint32_t codeLen =
sk::read_uint32(static_cast<char *>(request.data()) + JOB_ID_LEN + sizeof(uint32_t));
if (request.size() < MIN_MESSAGE_LEN + imageLen + codeLen) {
std::cerr << "Invalid request" << std::endl;
break;
}
std::string_view jobId(static_cast<char *>(request.data()), 32);
std::string requestString(static_cast<char *>(request.data()) + 32,
request.size() - 32);
std::string imageString(static_cast<char *>(request.data()) +
MIN_MESSAGE_LEN,
imageLen);
std::string requestString(static_cast<char *>(request.data()) +
MIN_MESSAGE_LEN + imageLen,
codeLen);
std::cout << "Executing " << request.size() << " bytes code.\n";
std::cout << "Executing " << codeLen << " bytes code.\n";
sk::program program{requestString,
"ghcr.io/moshell-lang/moshell:master"};
sk::run_result result = runner.run_blocking(program);
@ -69,9 +85,9 @@ int main() {
std::cout << "Result: " << result.out << std::endl;
// Send the job id and result.out to sink
zmq::message_t reply(32 + result.out.size());
memcpy(reply.data(), jobId.data(), 32);
memcpy(static_cast<char *>(reply.data()) + 32, result.out.data(),
zmq::message_t reply(JOB_ID_LEN + result.out.size());
memcpy(reply.data(), jobId.data(), JOB_ID_LEN);
memcpy(static_cast<char *>(reply.data()) + JOB_ID_LEN, result.out.data(),
result.out.size());
sender.send(reply, zmq::send_flags::none);
}

@ -0,0 +1,10 @@
#include "network.hpp"
namespace sk {
uint32_t read_uint32(const char *buffer) {
return static_cast<uint32_t>(buffer[3]) |
static_cast<uint32_t>(buffer[2]) << 8 |
static_cast<uint32_t>(buffer[1]) << 16 |
static_cast<uint32_t>(buffer[0]) << 24;
}
}

@ -0,0 +1,7 @@
#pragma once
#include <cstdint>
namespace sk {
uint32_t read_uint32(const char *buffer);
}
Loading…
Cancel
Save