Skip to content
This repository has been archived by the owner on Jun 23, 2022. It is now read-only.

Commit

Permalink
feat: add http interface to get a specified config (#719)
Browse files Browse the repository at this point in the history
  • Loading branch information
levy5307 authored Jan 4, 2021
1 parent c31024a commit 5fe7ff1
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 0 deletions.
3 changes: 3 additions & 0 deletions include/dsn/utility/flags.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,7 @@ extern bool has_tag(const std::string &name, const flag_tag &tag);

// list all the flags
extern std::string list_all_flags();

// get the json string of a specified flag
extern error_with<std::string> get_flag_str(const std::string &flag_name);
} // namespace dsn
4 changes: 4 additions & 0 deletions src/http/builtin_http_calls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@ namespace dsn {
[](const http_request &req, http_response &resp) { update_config(req, resp); })
.with_help("Updates the value of a config");

register_http_call("config")
.with_callback([](const http_request &req, http_response &resp) { get_config(req, resp); })
.with_help("get the details of a specified config");

register_http_call("configs")
.with_callback(
[](const http_request &req, http_response &resp) { list_all_configs(req, resp); })
Expand Down
1 change: 1 addition & 0 deletions src/http/builtin_http_calls.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@ extern void update_config(const http_request &req, http_response &resp);

extern void list_all_configs(const http_request &req, http_response &resp);

extern void get_config(const http_request &req, http_response &resp);
} // namespace dsn
21 changes: 21 additions & 0 deletions src/http/config_http_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,25 @@ void list_all_configs(const http_request &req, http_response &resp)
resp.body = list_all_flags();
resp.status_code = http_status_code::ok;
}

void get_config(const http_request &req, http_response &resp)
{
std::string config_name;
for (const auto &p : req.query_args) {
if ("name" == p.first) {
config_name = p.second;
} else {
resp.status_code = http_status_code::bad_request;
return;
}
}

auto res = get_flag_str(config_name);
if (res.is_ok()) {
resp.body = res.get_value();
} else {
resp.body = res.get_error().description();
}
resp.status_code = http_status_code::ok;
}
} // namespace dsn
15 changes: 15 additions & 0 deletions src/utils/flags.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,16 @@ class flag_registry : public utils::singleton<flag_registry>
return it->second.has_tag(tag);
}

error_with<std::string> get_flag_str(const std::string &name) const
{
const auto iter = _flags.find(name);
if (iter == _flags.end()) {
return error_s::make(ERR_OBJECT_NOT_FOUND, fmt::format("{} is not found", name));
}

return iter->second.to_json();
}

std::string list_all_flags() const
{
utils::table_printer tp;
Expand Down Expand Up @@ -272,6 +282,11 @@ flag_tagger::flag_tagger(const char *name, const flag_tag &tag)
return flag_registry::instance().has_tag(name, tag);
}

/*extern*/ error_with<std::string> get_flag_str(const std::string &flag_name)
{
return flag_registry::instance().get_flag_str(flag_name);
}

/*extern*/ std::string list_all_flags() { return flag_registry::instance().list_all_flags(); }

} // namespace dsn
84 changes: 84 additions & 0 deletions src/utils/test/flag_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,5 +120,89 @@ TEST(flag_test, tag_flag)
res = has_tag("no_flag", flag_tag::FT_MUTABLE);
ASSERT_FALSE(res);
}

DSN_DEFINE_int32("flag_test", get_flag_int32, 5, "test get_flag_int32");
DSN_TAG_VARIABLE(get_flag_int32, FT_MUTABLE);
DSN_DEFINE_uint32("flag_test", get_flag_uint32, 5, "test get_flag_uint32");
DSN_TAG_VARIABLE(get_flag_uint32, FT_MUTABLE);
DSN_DEFINE_int64("flag_test", get_flag_int64, 5, "test get_flag_int64");
DSN_TAG_VARIABLE(get_flag_int64, FT_MUTABLE);
DSN_DEFINE_uint64("flag_test", get_flag_uint64, 5, "test get_flag_uint64");
DSN_TAG_VARIABLE(get_flag_uint64, FT_MUTABLE);
DSN_DEFINE_double("flag_test", get_flag_double, 5.12, "test get_flag_double");
DSN_TAG_VARIABLE(get_flag_double, FT_MUTABLE);
DSN_DEFINE_bool("flag_test", get_flag_bool, true, "test get_flag_bool");
DSN_TAG_VARIABLE(get_flag_bool, FT_MUTABLE);
DSN_DEFINE_string("flag_test", get_flag_string, "flag_string", "test get_flag_string");
DSN_TAG_VARIABLE(get_flag_string, FT_MUTABLE);

TEST(flag_test, get_config)
{
auto res = get_flag_str("get_flag_not_exist");
ASSERT_EQ(res.get_error().code(), ERR_OBJECT_NOT_FOUND);

std::string test_app = "get_flag_int32";
res = get_flag_str(test_app);
ASSERT_TRUE(res.is_ok());
ASSERT_EQ(
res.get_value(),
R"({"name":")" + test_app +
R"(","section":"flag_test","type":"FV_INT32","tags":"flag_tag::FT_MUTABLE","description":"test get_flag_int32","value":")" +
std::to_string(FLAGS_get_flag_int32) + R"("})" + "\n");

test_app = "get_flag_uint32";
res = get_flag_str(test_app);
ASSERT_TRUE(res.is_ok());
ASSERT_EQ(
res.get_value(),
R"({"name":")" + test_app +
R"(","section":"flag_test","type":"FV_UINT32","tags":"flag_tag::FT_MUTABLE","description":"test get_flag_uint32","value":")" +
std::to_string(FLAGS_get_flag_uint32) + R"("})" + "\n");

test_app = "get_flag_int64";
res = get_flag_str(test_app);
ASSERT_TRUE(res.is_ok());
ASSERT_EQ(
res.get_value(),
R"({"name":")" + test_app +
R"(","section":"flag_test","type":"FV_INT64","tags":"flag_tag::FT_MUTABLE","description":"test get_flag_int64","value":")" +
std::to_string(FLAGS_get_flag_int64) + R"("})" + "\n");

test_app = "get_flag_uint64";
res = get_flag_str(test_app);
ASSERT_TRUE(res.is_ok());
ASSERT_EQ(
res.get_value(),
R"({"name":")" + test_app +
R"(","section":"flag_test","type":"FV_UINT64","tags":"flag_tag::FT_MUTABLE","description":"test get_flag_uint64","value":")" +
std::to_string(FLAGS_get_flag_uint64) + R"("})" + "\n");

test_app = "get_flag_double";
res = get_flag_str(test_app);
ASSERT_TRUE(res.is_ok());
ASSERT_EQ(
res.get_value(),
R"({"name":")" + test_app +
R"(","section":"flag_test","type":"FV_DOUBLE","tags":"flag_tag::FT_MUTABLE","description":"test get_flag_double","value":"5.12"})" +
"\n");

test_app = "get_flag_bool";
res = get_flag_str(test_app);
ASSERT_TRUE(res.is_ok());
ASSERT_EQ(
res.get_value(),
R"({"name":")" + test_app +
R"(","section":"flag_test","type":"FV_BOOL","tags":"flag_tag::FT_MUTABLE","description":"test get_flag_bool","value":"true"})"
"\n");

test_app = "get_flag_string";
res = get_flag_str(test_app);
ASSERT_TRUE(res.is_ok());
ASSERT_EQ(
res.get_value(),
R"({"name":")" + test_app +
R"(","section":"flag_test","type":"FV_STRING","tags":"flag_tag::FT_MUTABLE","description":"test get_flag_string","value":")" +
FLAGS_get_flag_string + R"("})" + "\n");
}
} // namespace utils
} // namespace dsn

0 comments on commit 5fe7ff1

Please sign in to comment.