Migrate config to cameleer.server.* naming convention
All checks were successful
CI / cleanup-branch (push) Has been skipped
CI / build (push) Successful in 1m52s
CI / docker (push) Successful in 1m30s
CI / deploy-feature (push) Has been skipped
CI / deploy (push) Successful in 37s

Move all configuration properties under the cameleer.server.* namespace
with all-lowercase dot-separated names and mechanical env var mapping
(dots→underscores, uppercase). This aligns with the agent's convention
(cameleer.agent.*) and establishes a predictable pattern across all
components.

Changes:
- Move 6 config prefixes under cameleer.server.*: agent-registry,
  ingestion, security, license, clickhouse, and cameleer.tenant/runtime/indexer
- Rename all kebab-case properties to concatenated lowercase
  (e.g., bootstrap-token → bootstraptoken, jar-storage-path → jarstoragepath)
- Update all env vars to CAMELEER_SERVER_* mechanical mapping
- Fix container-cpu-request/container-cpu-shares mismatch bug
- Remove displayName from AgentRegistrationRequest (redundant with instanceId)
- Update agent container env vars to CAMELEER_AGENT_* convention
- Update K8s manifests and CI workflow for new env var names
- Update CLAUDE.md, HOWTO.md, SERVER-CAPABILITIES.md documentation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-04-11 18:10:51 +02:00
parent 3b95dc777b
commit 8fe48bbf02
35 changed files with 217 additions and 251 deletions

View File

@@ -26,12 +26,12 @@ class AgentRegistryServiceTest {
@Test
void registerNewAgent_createsWithLiveState() {
AgentInfo agent = registry.register("agent-1", "Order Agent", "order-svc", "default",
AgentInfo agent = registry.register("agent-1", "agent-1", "order-svc", "default",
"1.0.0", List.of("route1", "route2"), Map.of("feature", "tracing"));
assertThat(agent).isNotNull();
assertThat(agent.instanceId()).isEqualTo("agent-1");
assertThat(agent.displayName()).isEqualTo("Order Agent");
assertThat(agent.displayName()).isEqualTo("agent-1");
assertThat(agent.applicationId()).isEqualTo("order-svc");
assertThat(agent.version()).isEqualTo("1.0.0");
assertThat(agent.routeIds()).containsExactly("route1", "route2");
@@ -44,14 +44,14 @@ class AgentRegistryServiceTest {
@Test
void reRegisterSameId_updatesMetadataAndTransitionsToLive() {
registry.register("agent-1", "Old Name", "old-group", "default",
registry.register("agent-1", "agent-1", "old-group", "default",
"1.0.0", List.of("route1"), Map.of());
AgentInfo updated = registry.register("agent-1", "New Name", "new-group", "default",
AgentInfo updated = registry.register("agent-1", "agent-1", "new-group", "default",
"2.0.0", List.of("route1", "route2"), Map.of("new", "cap"));
assertThat(updated.instanceId()).isEqualTo("agent-1");
assertThat(updated.displayName()).isEqualTo("New Name");
assertThat(updated.displayName()).isEqualTo("agent-1");
assertThat(updated.applicationId()).isEqualTo("new-group");
assertThat(updated.version()).isEqualTo("2.0.0");
assertThat(updated.routeIds()).containsExactly("route1", "route2");
@@ -62,11 +62,11 @@ class AgentRegistryServiceTest {
@Test
void reRegisterSameId_updatesRegisteredAtAndLastHeartbeat() {
AgentInfo first = registry.register("agent-1", "Name", "group", "default",
AgentInfo first = registry.register("agent-1", "agent-1", "group", "default",
"1.0.0", List.of(), Map.of());
Instant firstRegisteredAt = first.registeredAt();
AgentInfo second = registry.register("agent-1", "Name", "group", "default",
AgentInfo second = registry.register("agent-1", "agent-1", "group", "default",
"1.0.0", List.of(), Map.of());
assertThat(second.registeredAt()).isAfterOrEqualTo(firstRegisteredAt);
@@ -79,7 +79,7 @@ class AgentRegistryServiceTest {
@Test
void heartbeatKnownAgent_returnsTrue() {
registry.register("agent-1", "Name", "group", "default", "1.0.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "group", "default", "1.0.0", List.of(), Map.of());
boolean result = registry.heartbeat("agent-1");
@@ -88,7 +88,7 @@ class AgentRegistryServiceTest {
@Test
void heartbeatKnownAgent_updatesLastHeartbeat() {
registry.register("agent-1", "Name", "group", "default", "1.0.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "group", "default", "1.0.0", List.of(), Map.of());
Instant before = registry.findById("agent-1").lastHeartbeat();
registry.heartbeat("agent-1");
@@ -106,7 +106,7 @@ class AgentRegistryServiceTest {
@Test
void heartbeatStaleAgent_transitionsToLive() {
registry.register("agent-1", "Name", "group", "default", "1.0.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "group", "default", "1.0.0", List.of(), Map.of());
registry.transitionState("agent-1", AgentState.STALE);
assertThat(registry.findById("agent-1").state()).isEqualTo(AgentState.STALE);
@@ -171,7 +171,7 @@ class AgentRegistryServiceTest {
@Test
void transitionState_setsStaleTransitionTimeWhenGoingStale() {
registry.register("agent-1", "Name", "group", "default", "1.0.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "group", "default", "1.0.0", List.of(), Map.of());
registry.transitionState("agent-1", AgentState.STALE);
@@ -186,8 +186,8 @@ class AgentRegistryServiceTest {
@Test
void findAll_returnsAllAgents() {
registry.register("agent-1", "A1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-2", "A2", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-2", "agent-2", "g", "default", "1.0", List.of(), Map.of());
List<AgentInfo> all = registry.findAll();
@@ -197,8 +197,8 @@ class AgentRegistryServiceTest {
@Test
void findByState_filtersCorrectly() {
registry.register("agent-1", "A1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-2", "A2", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-2", "agent-2", "g", "default", "1.0", List.of(), Map.of());
registry.transitionState("agent-2", AgentState.STALE);
List<AgentInfo> live = registry.findByState(AgentState.LIVE);
@@ -217,7 +217,7 @@ class AgentRegistryServiceTest {
@Test
void findById_knownReturnsAgent() {
registry.register("agent-1", "A1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "g", "default", "1.0", List.of(), Map.of());
AgentInfo result = registry.findById("agent-1");
@@ -231,7 +231,7 @@ class AgentRegistryServiceTest {
@Test
void addCommand_createsPendingCommand() {
registry.register("agent-1", "A1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "g", "default", "1.0", List.of(), Map.of());
AgentCommand cmd = registry.addCommand("agent-1", CommandType.CONFIG_UPDATE, "{\"key\":\"val\"}");
@@ -246,7 +246,7 @@ class AgentRegistryServiceTest {
@Test
void addCommand_notifiesEventListener() {
registry.register("agent-1", "A1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "g", "default", "1.0", List.of(), Map.of());
AtomicReference<AgentCommand> received = new AtomicReference<>();
registry.setEventListener((agentId, command) -> received.set(command));
@@ -259,7 +259,7 @@ class AgentRegistryServiceTest {
@Test
void acknowledgeCommand_transitionsStatus() {
registry.register("agent-1", "A1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "g", "default", "1.0", List.of(), Map.of());
AgentCommand cmd = registry.addCommand("agent-1", CommandType.REPLAY, "{}");
boolean acked = registry.acknowledgeCommand("agent-1", cmd.id());
@@ -269,7 +269,7 @@ class AgentRegistryServiceTest {
@Test
void acknowledgeCommand_unknownReturnsFalse() {
registry.register("agent-1", "A1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "g", "default", "1.0", List.of(), Map.of());
boolean acked = registry.acknowledgeCommand("agent-1", "nonexistent-cmd");
@@ -278,7 +278,7 @@ class AgentRegistryServiceTest {
@Test
void findPendingCommands_returnsOnlyPending() {
registry.register("agent-1", "A1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "g", "default", "1.0", List.of(), Map.of());
AgentCommand cmd1 = registry.addCommand("agent-1", CommandType.CONFIG_UPDATE, "{}");
AgentCommand cmd2 = registry.addCommand("agent-1", CommandType.DEEP_TRACE, "{}");
registry.acknowledgeCommand("agent-1", cmd1.id());
@@ -291,7 +291,7 @@ class AgentRegistryServiceTest {
@Test
void markDelivered_updatesStatus() {
registry.register("agent-1", "A1", "g", "default", "1.0", List.of(), Map.of());
registry.register("agent-1", "agent-1", "g", "default", "1.0", List.of(), Map.of());
AgentCommand cmd = registry.addCommand("agent-1", CommandType.CONFIG_UPDATE, "{}");
registry.markDelivered("agent-1", cmd.id());
@@ -305,7 +305,7 @@ class AgentRegistryServiceTest {
void expireOldCommands_removesExpiredPendingCommands() {
// Use 1ms expiry for test
AgentRegistryService shortRegistry = new AgentRegistryService(90_000, 300_000, 1);
shortRegistry.register("agent-1", "A1", "g", "default", "1.0", List.of(), Map.of());
shortRegistry.register("agent-1", "agent-1", "g", "default", "1.0", List.of(), Map.of());
shortRegistry.addCommand("agent-1", CommandType.CONFIG_UPDATE, "{}");
try { Thread.sleep(5); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }