aboutsummaryrefslogtreecommitdiff
path: root/zen/cmds/projectstore.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-01-13 07:08:02 -0800
committerGitHub <[email protected]>2023-01-13 07:08:02 -0800
commit61f18d2de7f37aa03aa09d55562d05c6da033eb2 (patch)
tree217828004ee4417b6f2be80a7bf778b808798e4d /zen/cmds/projectstore.cpp
parentAdd info (GET) endpoints for structured cache (#211) (diff)
downloadarchived-zen-61f18d2de7f37aa03aa09d55562d05c6da033eb2.tar.xz
archived-zen-61f18d2de7f37aa03aa09d55562d05c6da033eb2.zip
zen command line tool improvements (#212)
- Feature: zen command line tool `cache-info` to show cache, namespace or bucket info - Feature: zen command line tool `project-info` to show store, project or oplog info - Feature: zen command line tool `project-drop` to drop project or oplog - Feature: zen command line tool `gc` to trigger a GC run - Feature: zen command line tool `gc-info` to check status of GC - Improvement: zen command line tool now fails on any unrecognized arguments - Improvement: zen command line tool now displays extra help for all sub-commands - Improvement: host address can now be configured for zen command line tool `drop` command changelog
Diffstat (limited to 'zen/cmds/projectstore.cpp')
-rw-r--r--zen/cmds/projectstore.cpp132
1 files changed, 132 insertions, 0 deletions
diff --git a/zen/cmds/projectstore.cpp b/zen/cmds/projectstore.cpp
new file mode 100644
index 000000000..d83bff53c
--- /dev/null
+++ b/zen/cmds/projectstore.cpp
@@ -0,0 +1,132 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#include "projectstore.h"
+
+#include <zencore/filesystem.h>
+#include <zencore/logging.h>
+#include <zenhttp/httpcommon.h>
+#include <zenutil/zenserverprocess.h>
+
+#include <memory>
+
+ZEN_THIRD_PARTY_INCLUDES_START
+#include <cpr/cpr.h>
+ZEN_THIRD_PARTY_INCLUDES_END
+
+DropProjectCommand::DropProjectCommand()
+{
+ m_Options.add_options()("h,help", "Print help");
+ m_Options.add_option("", "u", "hosturl", "Host URL", cxxopts::value(m_HostName)->default_value("http://localhost:1337"), "<hosturl>");
+ m_Options.add_option("", "p", "project", "Namnspace name", cxxopts::value(m_ProjectName), "<projectname>");
+ m_Options.add_option("", "o", "oplog", "Oplog name", cxxopts::value(m_OplogName), "<oplogname>");
+ m_Options.parse_positional({"{project}", "{oplog}"});
+}
+
+DropProjectCommand::~DropProjectCommand() = default;
+
+int
+DropProjectCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
+{
+ ZEN_UNUSED(GlobalOptions);
+
+ if (!ParseOptions(argc, argv))
+ {
+ return 0;
+ }
+
+ if (m_ProjectName.empty())
+ {
+ throw cxxopts::OptionParseException("Drop command requires a project");
+ }
+
+ cpr::Session Session;
+ if (m_OplogName.empty())
+ {
+ ZEN_CONSOLE("Dropping project '{}' from '{}'", m_ProjectName, m_HostName);
+ Session.SetUrl({fmt::format("{}/prj/{}", m_HostName, m_ProjectName)});
+ }
+ else
+ {
+ ZEN_CONSOLE("Dropping oplog '{}/{}' from '{}'", m_ProjectName, m_OplogName, m_HostName);
+ Session.SetUrl({fmt::format("{}/prj/{}/oplog/{}", m_HostName, m_ProjectName, m_OplogName)});
+ }
+
+ cpr::Response Result = Session.Delete();
+
+ if (zen::IsHttpSuccessCode(Result.status_code))
+ {
+ ZEN_CONSOLE("OK: drop succeeded");
+ return 0;
+ }
+
+ if (Result.status_code)
+ {
+ ZEN_ERROR("Drop failed: {}: {} ({})", Result.status_code, Result.reason, Result.text);
+ }
+ else
+ {
+ ZEN_ERROR("Drop failed: {}", Result.error.message);
+ }
+
+ return 1;
+}
+
+ProjectInfoCommand::ProjectInfoCommand()
+{
+ m_Options.add_options()("h,help", "Print help");
+ m_Options.add_option("", "u", "hosturl", "Host URL", cxxopts::value(m_HostName)->default_value("http://localhost:1337"), "<hosturl>");
+ m_Options.add_option("", "p", "project", "Namnspace name", cxxopts::value(m_ProjectName), "<projectname>");
+ m_Options.add_option("", "o", "oplog", "Oplog name", cxxopts::value(m_OplogName), "<oplogname>");
+ m_Options.parse_positional({"{project}", "{oplog}"});
+}
+
+ProjectInfoCommand::~ProjectInfoCommand() = default;
+
+int
+ProjectInfoCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
+{
+ ZEN_UNUSED(GlobalOptions);
+
+ if (!ParseOptions(argc, argv))
+ {
+ return 0;
+ }
+
+ cpr::Session Session;
+ Session.SetHeader(cpr::Header{{"Accept", "application/json"}});
+ if (m_ProjectName.empty())
+ {
+ ZEN_CONSOLE("Info from '{}'", m_HostName);
+ Session.SetUrl({fmt::format("{}/prj", m_HostName)});
+ }
+ else if (m_OplogName.empty())
+ {
+ ZEN_CONSOLE("Info on project '{}' from '{}'", m_ProjectName, m_HostName);
+ Session.SetUrl({fmt::format("{}/prj/{}", m_HostName, m_ProjectName)});
+ }
+ else
+ {
+ ZEN_CONSOLE("Info on oplog '{}/{}' from '{}'", m_ProjectName, m_OplogName, m_HostName);
+ Session.SetUrl({fmt::format("{}/prj/{}/oplog/{}", m_HostName, m_ProjectName, m_OplogName)});
+ }
+
+ cpr::Response Result = Session.Get();
+
+ if (zen::IsHttpSuccessCode(Result.status_code))
+ {
+ ZEN_CONSOLE("{}", Result.text);
+
+ return 0;
+ }
+
+ if (Result.status_code)
+ {
+ ZEN_ERROR("Info failed: {}: {} ({})", Result.status_code, Result.reason, Result.text);
+ }
+ else
+ {
+ ZEN_ERROR("Info failed: {}", Result.error.message);
+ }
+
+ return 1;
+}