Skip to content

Commit ee04449

Browse files
afrindclaude
andcommitted
Move admin_port from CLI flag to config file
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent bbc1812 commit ee04449

9 files changed

Lines changed: 41 additions & 5 deletions

File tree

config.example.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,6 @@ cache:
1818
enabled: true # Enable relay cache
1919
max_tracks: 100 # Max number of cached tracks
2020
max_groups_per_track: 3 # Max groups per track in cache
21+
22+
admin:
23+
port: 9669 # HTTP admin server port

include/o_rly/config/config.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <cstddef>
4+
#include <cstdint>
45
#include <string>
56
#include <variant>
67

@@ -33,6 +34,7 @@ struct ListenerConfig {
3334
struct Config {
3435
ListenerConfig listener;
3536
CacheConfig cache;
37+
uint16_t adminPort;
3638
};
3739

3840
} // namespace openmoq::o_rly::config

include/o_rly/config/loader/parsed_config.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,17 @@ struct ParsedCacheConfig {
4949
max_groups_per_track;
5050
};
5151

52+
struct ParsedAdminConfig {
53+
rfl::Description<"HTTP admin server port, 1-65535", uint16_t> port;
54+
};
55+
5256
struct ParsedConfig {
5357
rfl::Description<
5458
"Listener definitions (currently exactly one supported)",
5559
std::vector<ParsedListenerConfig>>
5660
listeners;
5761
rfl::Description<"Relay cache settings", ParsedCacheConfig> cache;
62+
rfl::Description<"Admin HTTP server settings", ParsedAdminConfig> admin;
5863
};
5964

6065
} // namespace openmoq::o_rly::config

src/config/config_resolver.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ folly::Expected<ResolvedConfig, std::string> resolveConfig(const ParsedConfig& c
6363
}
6464
}
6565

66+
// Admin port validation
67+
if (config.admin.value().port.value() == 0) {
68+
errors.push_back("admin.port must be 1-65535, got 0");
69+
}
70+
6671
// Cache validation
6772
const auto& cache = config.cache.value();
6873
if (cache.enabled.value()) {
@@ -108,6 +113,7 @@ folly::Expected<ResolvedConfig, std::string> resolveConfig(const ParsedConfig& c
108113
Config{
109114
.listener = std::move(resolvedListener),
110115
.cache = cacheConfig,
116+
.adminPort = config.admin.value().port.value(),
111117
},
112118
.warnings = std::move(warnings),
113119
};

src/main.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
DEFINE_string(config, "", "Path to config file (required)");
1616
DEFINE_bool(strict_config, false, "Reject unknown config fields");
17-
DEFINE_int32(admin_port, 9669, "HTTP admin port");
1817

1918
namespace {
2019

@@ -121,10 +120,10 @@ int main(int argc, char* argv[]) {
121120
// === 7. Start health checks / admin endpoints ===
122121
openmoq::o_rly::admin::AdminServer adminServer;
123122
openmoq::o_rly::admin::registerBuiltinRoutes(adminServer);
124-
if (!adminServer.start(static_cast<uint16_t>(FLAGS_admin_port))) {
125-
XLOG(FATAL) << "Failed to start admin server on port " << FLAGS_admin_port;
123+
if (!adminServer.start(config.adminPort)) {
124+
XLOG(FATAL) << "Failed to start admin server on port " << config.adminPort;
126125
}
127-
XLOG(INFO) << "Admin server listening on port " << FLAGS_admin_port;
126+
XLOG(INFO) << "Admin server listening on port " << config.adminPort;
128127

129128
// === 8. Start serving ===
130129
// Bind listeners, accept connections, enter event loop

tests/config/config_resolver_test.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ ParsedCacheConfig makeDefaultCache() {
1717
return cache;
1818
}
1919

20+
ParsedAdminConfig makeDefaultAdmin() {
21+
ParsedAdminConfig admin;
22+
admin.port = uint16_t{9669};
23+
return admin;
24+
}
25+
2026
// Build a minimal valid insecure listener config.
2127
ParsedConfig makeMinimalInsecureConfig(std::string name = "test") {
2228
ParsedConfig cfg;
@@ -34,6 +40,7 @@ ParsedConfig makeMinimalInsecureConfig(std::string name = "test") {
3440
lc.endpoint = std::string("/moq-relay");
3541
cfg.listeners.value().push_back(std::move(lc));
3642
cfg.cache = makeDefaultCache();
43+
cfg.admin = makeDefaultAdmin();
3744
return cfg;
3845
}
3946

@@ -42,6 +49,7 @@ ParsedConfig makeMinimalInsecureConfig(std::string name = "test") {
4249
TEST(ResolveConfig, NoListeners) {
4350
ParsedConfig cfg;
4451
cfg.cache = makeDefaultCache();
52+
cfg.admin = makeDefaultAdmin();
4553
auto result = resolveConfig(cfg);
4654
ASSERT_TRUE(result.hasError());
4755
EXPECT_THAT(result.error(), HasSubstr("At least one listener"));
@@ -114,6 +122,7 @@ TEST(ResolveConfig, FullTls) {
114122
lc.moqt_versions = std::vector<uint32_t>{14, 16};
115123
cfg.listeners.value().push_back(std::move(lc));
116124
cfg.cache = makeDefaultCache();
125+
cfg.admin = makeDefaultAdmin();
117126

118127
auto result = resolveConfig(cfg);
119128
ASSERT_TRUE(result.hasValue());

tests/config/loader_test.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ TEST(ConfigLoader, MinimalConfig) {
2929
enabled: true
3030
max_tracks: 100
3131
max_groups_per_track: 3
32+
admin:
33+
port: 9669
3234
)");
3335

3436
auto cfg = loadConfig(yaml.path());
@@ -65,6 +67,8 @@ TEST(ConfigLoader, FullConfig) {
6567
enabled: true
6668
max_tracks: 200
6769
max_groups_per_track: 5
70+
admin:
71+
port: 9669
6872
)");
6973

7074
auto cfg = loadConfig(yaml.path());
@@ -122,6 +126,8 @@ TEST(ConfigLoader, LoadFromFile) {
122126
enabled: false
123127
max_tracks: 100
124128
max_groups_per_track: 3
129+
admin:
130+
port: 9669
125131
)");
126132

127133
auto cfg = loadConfig(yaml.path());
@@ -156,6 +162,8 @@ TEST(ConfigLoader, UnknownFieldIgnoredNonStrict) {
156162
enabled: true
157163
max_tracks: 100
158164
max_groups_per_track: 3
165+
admin:
166+
port: 9669
159167
)");
160168

161169
EXPECT_NO_THROW(loadConfig(yaml.path()));
@@ -177,6 +185,8 @@ TEST(ConfigLoader, UnknownFieldRejectedStrict) {
177185
enabled: true
178186
max_tracks: 100
179187
max_groups_per_track: 3
188+
admin:
189+
port: 9669
180190
)");
181191

182192
EXPECT_THROW(loadConfig(yaml.path(), /*strict=*/true), std::runtime_error);

tests/test.config.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ cache:
1212
enabled: true
1313
max_tracks: 100
1414
max_groups_per_track: 3
15+
admin:
16+
port: 9669

tests/test_admin_info.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ if [[ ! -x "$BINARY" ]]; then
1212
fi
1313

1414
# Start o_rly with test config in the background.
15-
"$BINARY" --config="$TESTDIR/test.config.yaml" --admin_port="$ADMIN_PORT" &
15+
"$BINARY" --config="$TESTDIR/test.config.yaml" &
1616
O_RLY_PID=$!
1717
trap 'kill "$O_RLY_PID" 2>/dev/null; wait "$O_RLY_PID" 2>/dev/null || true' EXIT
1818

0 commit comments

Comments
 (0)