diff options
| author | Dan Engelbrecht <[email protected]> | 2023-01-13 07:08:02 -0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-01-13 07:08:02 -0800 |
| commit | 61f18d2de7f37aa03aa09d55562d05c6da033eb2 (patch) | |
| tree | 217828004ee4417b6f2be80a7bf778b808798e4d /zen/cmds/projectstore.cpp | |
| parent | Add info (GET) endpoints for structured cache (#211) (diff) | |
| download | archived-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.cpp | 132 |
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; +} |