Skip to content
This repository was archived by the owner on Jul 4, 2025. It is now read-only.

Commit d344f30

Browse files
committed
add update engine
1 parent dd2d649 commit d344f30

File tree

7 files changed

+109
-44
lines changed

7 files changed

+109
-44
lines changed

engine/cli/commands/engine_install_cmd.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#include "engine_install_cmd.h"
22
#include "server_start_cmd.h"
33
#include "utils/download_progress.h"
4-
#include "utils/engine_constants.h"
54
#include "utils/json_helper.h"
65
#include "utils/logging_utils.h"
76

@@ -33,7 +32,7 @@ bool EngineInstallCmd::Exec(const std::string& engine,
3332

3433
httplib::Client cli(host_ + ":" + std::to_string(port_));
3534
Json::Value json_data;
36-
json_data["version"] = version.empty() ? "latest" : version;
35+
json_data["version"] = version.empty() ? "latest" : version;
3736
auto data_str = json_data.toStyledString();
3837
cli.set_read_timeout(std::chrono::seconds(60));
3938
auto res = cli.Post("/v1/engines/install/" + engine, httplib::Headers(),

engine/common/event.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ inline DownloadEvent GetDownloadEventFromJson(const Json::Value& item_json) {
8585
}
8686
return ev;
8787
}
88-
}; // namespace cortex::event
88+
} // namespace cortex::event
8989

9090
constexpr std::size_t eventMaxSize =
9191
eventpp::maxSizeOf<cortex::event::Event, cortex::event::DownloadEvent,

engine/controllers/engines.cc

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,10 @@ void Engines::ListEngine(
6363
kTrtLlmEngine};
6464
Json::Value ret;
6565
for (const auto& engine : supported_engines) {
66-
std::cout << engine << std::endl;
67-
68-
auto result = engine_service_->GetInstalledEngineVariants(engine);
69-
if (result.has_error()) {
70-
continue;
71-
}
66+
auto installed_engines =
67+
engine_service_->GetInstalledEngineVariants(engine);
7268
Json::Value variants(Json::arrayValue);
73-
for (const auto& variant : result.value()) {
69+
for (const auto& variant : installed_engines) {
7470
variants.append(variant.ToJson());
7571
}
7672
ret[engine] = variants;
@@ -205,34 +201,39 @@ void Engines::GetEnginesInstalledVariants(
205201
std::function<void(const HttpResponsePtr&)>&& callback,
206202
const std::string& engine) const {
207203
auto result = engine_service_->GetInstalledEngineVariants(engine);
204+
Json::Value releases(Json::arrayValue);
205+
for (const auto& variant : result) {
206+
releases.append(variant.ToJson());
207+
}
208+
auto resp = cortex_utils::CreateCortexHttpJsonResponse(releases);
209+
resp->setStatusCode(k200OK);
210+
callback(resp);
211+
}
212+
213+
void Engines::UpdateEngine(
214+
const HttpRequestPtr& req,
215+
std::function<void(const HttpResponsePtr&)>&& callback,
216+
const std::string& engine) {
217+
auto result = engine_service_->UpdateEngine(engine);
208218
if (result.has_error()) {
209219
Json::Value res;
210220
res["message"] = result.error();
211221
auto resp = cortex_utils::CreateCortexHttpJsonResponse(res);
212222
resp->setStatusCode(k400BadRequest);
213223
callback(resp);
214224
} else {
215-
Json::Value releases(Json::arrayValue);
216-
for (const auto& variant : result.value()) {
217-
releases.append(variant.ToJson());
218-
}
219-
auto resp = cortex_utils::CreateCortexHttpJsonResponse(releases);
225+
auto resp =
226+
cortex_utils::CreateCortexHttpJsonResponse(result.value().ToJson());
220227
resp->setStatusCode(k200OK);
221228
callback(resp);
222229
}
223230
}
224231

225-
void Engines::UpdateEngine(
226-
const HttpRequestPtr& req,
227-
std::function<void(const HttpResponsePtr&)>&& callback,
228-
const std::string& engine) {}
229-
230232
void Engines::GetLatestEngineVersion(
231233
const HttpRequestPtr& req,
232234
std::function<void(const HttpResponsePtr&)>&& callback,
233235
const std::string& engine) {
234236
auto result = engine_service_->GetLatestEngineVersion(engine);
235-
std::cout << result->ToJson() << std::endl;
236237
if (result.has_error()) {
237238
Json::Value res;
238239
res["message"] = result.error();

engine/controllers/engines.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class Engines : public drogon::HttpController<Engines, false> {
1313
METHOD_LIST_BEGIN
1414

1515
// TODO: update this API
16-
METHOD_ADD(Engines::InstallEngine, "/install/{1}", Post);
16+
// METHOD_ADD(Engines::InstallEngine, "/install/{1}", Post);
1717
METHOD_ADD(Engines::UninstallEngine, "/{1}/{2}/{3}", Delete);
1818
METHOD_ADD(Engines::ListEngine, "", Get);
1919

@@ -22,7 +22,7 @@ class Engines : public drogon::HttpController<Engines, false> {
2222
METHOD_ADD(Engines::InstallEngineVariant, "/{1}/versions/{2}/{3}", Post);
2323
METHOD_ADD(Engines::GetEnginesInstalledVariants, "/{1}", Get);
2424

25-
METHOD_ADD(Engines::GetLatestEngineVersion, "/{1}/update", Get);
25+
// METHOD_ADD(Engines::GetLatestEngineVersion, "/{1}/update", Get);
2626
METHOD_ADD(Engines::UpdateEngine, "/{1}/update", Post);
2727
METHOD_ADD(Engines::SetDefaultEngineVariant, "/{1}/default/{2}/{3}", Post);
2828
METHOD_ADD(Engines::GetDefaultEngineVariant, "/{1}/default", Get);

engine/database/models.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,6 @@ cpp::result<bool, std::string> Models::AddModelEntry(ModelEntry new_entry,
178178
auto model_list = LoadModelListNoLock();
179179
if (model_list.has_error()) {
180180
CTL_WRN(model_list.error());
181-
std::cout << "Test: " << model_list.error();
182181
return cpp::fail(model_list.error());
183182
}
184183
if (IsUnique(model_list.value(), new_entry.model, new_entry.model_alias)) {

engine/services/engine_service.cc

Lines changed: 65 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#include "engine_service.h"
22
#include <cstdlib>
33
#include <filesystem>
4-
#include <iostream>
54
#include <optional>
65
#include "algorithm"
76
#include "utils/archive_utils.h"
@@ -74,6 +73,9 @@ cpp::result<void, std::string> EngineService::InstallEngineAsyncV2(
7473
const std::string& engine, const std::string& version,
7574
const std::string& variant_name) {
7675
auto ne = NormalizeEngine(engine);
76+
CTL_INF("InstallEngineAsyncV2: " << ne << ", " << version << ", "
77+
<< variant_name);
78+
7779
auto result = DownloadEngineV2(ne, version, variant_name, true /*async*/);
7880
if (result.has_error()) {
7981
return result;
@@ -173,7 +175,6 @@ cpp::result<bool, std::string> EngineService::UninstallEngineVariant(
173175
auto ne = NormalizeEngine(engine);
174176
auto engine_path =
175177
file_manager_utils::GetEnginesContainerPath() / ne / variant / version;
176-
std::cout << "engine_path: " << engine_path.string() << std::endl;
177178
if (!std::filesystem::exists(engine_path)) {
178179
return cpp::fail("Engine " + ne + " is not installed!");
179180
}
@@ -259,7 +260,7 @@ cpp::result<void, std::string> EngineService::DownloadEngineV2(
259260
.downloadUrl = selected_variant->browser_download_url,
260261
.localPath = variant_path,
261262
}}}};
262-
std::cout << downloadTask.ToString() << std::endl;
263+
263264
auto add_task_result = download_service_->AddTask(downloadTask, on_finished);
264265
if (res.has_error()) {
265266
return cpp::fail(res.error());
@@ -540,12 +541,8 @@ cpp::result<bool, std::string> EngineService::IsEngineVariantReady(
540541
auto ne = NormalizeEngine(engine);
541542
auto normalized_version = string_utils::RemoveSubstring(version, "v");
542543
auto installed_engines = GetInstalledEngineVariants(ne);
543-
if (installed_engines.has_error()) {
544-
return cpp::fail("Failed to get installed engines: " +
545-
installed_engines.error());
546-
}
547544

548-
for (const auto& installed_engine : installed_engines.value()) {
545+
for (const auto& installed_engine : installed_engines) {
549546
if (installed_engine.name == variant &&
550547
installed_engine.version == normalized_version) {
551548
return true;
@@ -564,8 +561,8 @@ EngineService::GetDefaultEngineVariant(const std::string& engine) {
564561
return default_variants_[ne];
565562
}
566563

567-
cpp::result<std::vector<EngineVariantResponse>, std::string>
568-
EngineService::GetInstalledEngineVariants(const std::string& engine) const {
564+
std::vector<EngineVariantResponse> EngineService::GetInstalledEngineVariants(
565+
const std::string& engine) const {
569566
auto ne = NormalizeEngine(engine);
570567
auto engines_variants_dir =
571568
file_manager_utils::GetEnginesContainerPath() / ne;
@@ -774,12 +771,6 @@ cpp::result<bool, std::string> EngineService::IsEngineReady(
774771
const std::string& engine) const {
775772
auto ne = NormalizeEngine(engine);
776773
auto installed_variants = GetInstalledEngineVariants(engine);
777-
if (installed_variants.has_error()) {
778-
CTL_WRN("Failed to get installed engine variants: " +
779-
installed_variants.error());
780-
return cpp::fail("Failed to get installed engine variants: " +
781-
installed_variants.error());
782-
}
783774

784775
auto os = hw_inf_.sys_inf->os;
785776
if (os == kMacOs && (ne == kOnnxRepo || ne == kTrtLlmRepo)) {
@@ -790,5 +781,62 @@ cpp::result<bool, std::string> EngineService::IsEngineReady(
790781
return cpp::fail("Engine " + engine + " is not supported on Linux");
791782
}
792783

793-
return installed_variants.value().size() > 0;
784+
return installed_variants.size() > 0;
785+
}
786+
787+
cpp::result<EngineUpdateResult, std::string> EngineService::UpdateEngine(
788+
const std::string& engine) {
789+
auto ne = NormalizeEngine(engine);
790+
auto default_variant = GetDefaultEngineVariant(ne);
791+
792+
if (default_variant.has_error()) {
793+
// if we don't have a default variant, just stop
794+
CTL_INF("No default variant found for " << ne << ". Exit update engine");
795+
return cpp::fail(default_variant.error());
796+
}
797+
CTL_INF("Default variant: " << default_variant->variant
798+
<< ", version: " + default_variant->version);
799+
800+
auto latest_version = GetLatestEngineVersion(ne);
801+
if (latest_version.has_error()) {
802+
// if can't get latest version, stop
803+
CTL_INF("Can't get latest version for "
804+
<< ne << " error: " << latest_version.error());
805+
return cpp::fail("Failed to get latest version: " + latest_version.error());
806+
}
807+
CTL_INF("Latest version: " + latest_version.value().name);
808+
809+
// check if local engines variants if latest version already exist
810+
auto installed_variants = GetInstalledEngineVariants(ne);
811+
812+
bool is_installed = false;
813+
for (const auto& v : installed_variants) {
814+
CTL_INF("Installed version: " + v.version);
815+
if (default_variant->variant == v.name &&
816+
v.version == latest_version.value().name) {
817+
is_installed = true;
818+
break;
819+
}
820+
}
821+
822+
if (is_installed) {
823+
CTL_INF("Engine " + ne + ", " + default_variant->variant +
824+
" is already up-to-date! Version " +
825+
latest_version.value().tag_name);
826+
return cpp::fail("Engine " + ne + ", " + default_variant->variant +
827+
" is already up-to-date! Version " +
828+
latest_version.value().tag_name);
829+
}
830+
831+
CTL_INF("Engine variant "
832+
<< default_variant->variant << " is not up-to-date! Current: "
833+
<< default_variant->version << ", latest: " << latest_version->name);
834+
835+
auto res = InstallEngineAsyncV2(engine, latest_version->tag_name,
836+
default_variant->variant);
837+
838+
return EngineUpdateResult{.engine = engine,
839+
.variant = default_variant->variant,
840+
.from = default_variant->version,
841+
.to = latest_version->name};
794842
}

engine/services/engine_service.h

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,22 @@ struct EngineVariantResponse {
4444
}
4545
};
4646

47+
struct EngineUpdateResult {
48+
std::string engine;
49+
std::string variant;
50+
std::string from;
51+
std::string to;
52+
53+
Json::Value ToJson() const {
54+
Json::Value root;
55+
root["engine"] = engine;
56+
root["variant"] = variant;
57+
root["from"] = from;
58+
root["to"] = to;
59+
return root;
60+
}
61+
};
62+
4763
namespace system_info_utils {
4864
struct SystemInfo;
4965
}
@@ -116,8 +132,8 @@ class EngineService {
116132
cpp::result<DefaultEngineVariant, std::string> GetDefaultEngineVariant(
117133
const std::string& engine);
118134

119-
cpp::result<std::vector<EngineVariantResponse>, std::string>
120-
GetInstalledEngineVariants(const std::string& engine) const;
135+
std::vector<EngineVariantResponse> GetInstalledEngineVariants(
136+
const std::string& engine) const;
121137

122138
bool IsEngineLoaded(const std::string& engine) const;
123139

@@ -137,6 +153,9 @@ class EngineService {
137153
const std::string& version,
138154
const std::string& path);
139155

156+
cpp::result<EngineUpdateResult, std::string> UpdateEngine(
157+
const std::string& engine);
158+
140159
private:
141160
cpp::result<bool, std::string> DownloadEngine(
142161
const std::string& engine, const std::string& version = "latest",
@@ -156,7 +175,6 @@ class EngineService {
156175
const std::string& engine, const std::string& version,
157176
const std::string& variant);
158177

159-
private:
160178
std::shared_ptr<DownloadService> download_service_;
161179

162180
struct HardwareInfo {

0 commit comments

Comments
 (0)