From ddbbef2944a9f6e805418b3dfe742ea41f281680 Mon Sep 17 00:00:00 2001 From: Marcin Copik Date: Tue, 15 Oct 2024 12:09:36 +0200 Subject: [PATCH] [control-plane] [sdk] Add a helper method to check app's existence --- CMakeLists.txt | 2 +- .../include/praas/control-plane/http.hpp | 6 +++++ .../include/praas/control-plane/worker.hpp | 2 ++ control-plane/src/http.cpp | 23 +++++++++++++++++++ control-plane/src/worker.cpp | 9 ++++++++ sdk/include/praas/sdk/praas.hpp | 2 ++ sdk/src/praas.cpp | 22 ++++++++++++++++++ tests/integration/invocation.cpp | 6 +++-- 8 files changed, 69 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d04a180..7fcf9fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -198,7 +198,7 @@ endforeach() if(PRAAS_WITH_TESTING) set(TESTS - #tests/integration/invocation.cpp + tests/integration/invocation.cpp tests/integration/allocation_invocation.cpp tests/integration/state_swap.cpp ) diff --git a/control-plane/include/praas/control-plane/http.hpp b/control-plane/include/praas/control-plane/http.hpp index d219ff6..730426b 100644 --- a/control-plane/include/praas/control-plane/http.hpp +++ b/control-plane/include/praas/control-plane/http.hpp @@ -26,6 +26,7 @@ namespace praas::control_plane { METHOD_LIST_BEGIN ADD_METHOD_TO(HttpServer::create_app, "/apps/{1}", drogon::Put); + ADD_METHOD_TO(HttpServer::get_app, "/apps/{1}", drogon::Get); ADD_METHOD_TO(HttpServer::delete_app, "/apps/{1}/delete", drogon::Post); ADD_METHOD_TO(HttpServer::create_process, "/apps/{1}/processes/{2}", drogon::Put); ADD_METHOD_TO(HttpServer::delete_process, "/apps/{1}/processes/{2}/delete", drogon::Post); @@ -47,6 +48,11 @@ namespace praas::control_plane { std::function&& callback, const std::string& app_name ); + void get_app( + const drogon::HttpRequestPtr& request, + std::function&& callback, const std::string& app_name + ); + void delete_app( const drogon::HttpRequestPtr& request, std::function&& callback, const std::string& app_name diff --git a/control-plane/include/praas/control-plane/worker.hpp b/control-plane/include/praas/control-plane/worker.hpp index bd442a1..fa3444a 100644 --- a/control-plane/include/praas/control-plane/worker.hpp +++ b/control-plane/include/praas/control-plane/worker.hpp @@ -69,6 +69,8 @@ namespace praas::control_plane::worker { //////////////////////////////////////////////////////////////////////////////// bool create_application(const std::string& app_name, ApplicationResources&& cloud_resources); + bool get_application(const std::string& app_name); + bool delete_application(const std::string& app_name); //////////////////////////////////////////////////////////////////////////////// diff --git a/control-plane/src/http.cpp b/control-plane/src/http.cpp index 2a8a0dd..2038633 100644 --- a/control-plane/src/http.cpp +++ b/control-plane/src/http.cpp @@ -89,6 +89,29 @@ namespace praas::control_plane { }); } + void HttpServer::get_app( + const drogon::HttpRequestPtr& request, + std::function&& callback, const std::string& app_name + ) + { + + _logger->info("Get application {}", app_name); + _workers.add_task([=, callback = std::move(callback), this]() { + + auto response = _workers.get_application(app_name); + if (!response) { + callback(failed_response("Application does not exist!", drogon::HttpStatusCode::k404NotFound)); + } + + Json::Value json; + json["application"] = app_name; + + auto resp = drogon::HttpResponse::newHttpJsonResponse(json); + resp->setStatusCode(drogon::HttpStatusCode::k200OK); + callback(resp); + }); + } + void HttpServer::delete_app( const drogon::HttpRequestPtr& request, std::function&& callback, const std::string& app_name diff --git a/control-plane/src/worker.cpp b/control-plane/src/worker.cpp index ef171f4..9397ac4 100644 --- a/control-plane/src/worker.cpp +++ b/control-plane/src/worker.cpp @@ -68,6 +68,15 @@ namespace praas::control_plane::worker { return true; } + bool + Workers::get_application(const std::string& app_name) + { + Resources::ROAccessor acc; + _resources.get_application(app_name, acc); + + return !acc.empty(); + } + bool Workers::delete_application(const std::string& app_name) { diff --git a/sdk/include/praas/sdk/praas.hpp b/sdk/include/praas/sdk/praas.hpp index 3204135..115dec3 100644 --- a/sdk/include/praas/sdk/praas.hpp +++ b/sdk/include/praas/sdk/praas.hpp @@ -17,6 +17,8 @@ namespace praas::sdk { bool create_application(const std::string& application, const std::string& cloud_resource_name); + bool get_application(const std::string& application); + bool delete_application(const std::string& application); std::optional create_process( diff --git a/sdk/src/praas.cpp b/sdk/src/praas.cpp index b3ccfaa..d4d126f 100644 --- a/sdk/src/praas.cpp +++ b/sdk/src/praas.cpp @@ -45,6 +45,28 @@ namespace praas::sdk { return p.get_future().get(); } + bool + PraaS::get_application(const std::string& application) + { + auto req = drogon::HttpRequest::newHttpRequest(); + req->setMethod(drogon::Get); + req->setPath(fmt::format("/apps/{}", application)); + + std::promise p; + + _http_client->sendRequest( + req, + [&](drogon::ReqResult result, const drogon::HttpResponsePtr& response) { + if (result == drogon::ReqResult::Ok) { + p.set_value(response->getStatusCode() == drogon::k200OK); + } else { + p.set_value(false); + } + } + ); + return p.get_future().get(); + } + bool PraaS::delete_application(const std::string& application) { auto req = drogon::HttpRequest::newHttpRequest(); diff --git a/tests/integration/invocation.cpp b/tests/integration/invocation.cpp index 890c800..935d0d2 100644 --- a/tests/integration/invocation.cpp +++ b/tests/integration/invocation.cpp @@ -44,9 +44,11 @@ TEST_F(IntegrationLocalInvocation, Invoke) { praas::common::http::HTTPClientFactory::initialize(1); { - praas::sdk::PraaS praas{fmt::format("http://127.0.0.1:{}", 8000)}; + praas::sdk::PraaS praas{fmt::format("http://127.0.0.1:{}", 9000)}; - ASSERT_TRUE(praas.create_application("test_invoc", "spcleth/praas-examples:hello-world-cpp")); + if(!praas.get_application("test_invoc")) { + ASSERT_TRUE(praas.create_application("test_invoc", "spcleth/praas-examples:hello-world-cpp")); + } auto invoc = praas.invoke("test_invoc", "hello-world", "");