docs: mark Plan 3 (runtime management port) as completed
Verified 2026-04-09: all runtime management fully ported to cameleer3-server with enhancements beyond the original plan. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
# Plan 3: Runtime Management in the Server
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
> **Status: COMPLETED** — Verified 2026-04-09. All runtime management fully ported to cameleer3-server with enhancements beyond the original plan.
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [x]`) syntax for tracking.
|
||||
|
||||
**Goal:** Move environment management, app lifecycle, JAR upload, and Docker container orchestration from the SaaS layer into the server, so the server is a self-sufficient product that can deploy and manage Camel applications.
|
||||
|
||||
@@ -78,7 +80,7 @@ src/main/resources/db/migration/
|
||||
**Files:**
|
||||
- Modify: `cameleer3-server-app/pom.xml`
|
||||
|
||||
- [ ] **Step 1: Add docker-java dependency**
|
||||
- [x] **Step 1: Add docker-java dependency**
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
@@ -93,12 +95,12 @@ src/main/resources/db/migration/
|
||||
</dependency>
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Verify build**
|
||||
- [x] **Step 2: Verify build**
|
||||
|
||||
Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn compile -pl cameleer3-server-app`
|
||||
Expected: BUILD SUCCESS.
|
||||
|
||||
- [ ] **Step 3: Commit**
|
||||
- [x] **Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-app/pom.xml
|
||||
@@ -112,7 +114,7 @@ git commit -m "chore: add docker-java dependency for runtime orchestration"
|
||||
**Files:**
|
||||
- Create: `cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql`
|
||||
|
||||
- [ ] **Step 1: Write migration**
|
||||
- [x] **Step 1: Write migration**
|
||||
|
||||
```sql
|
||||
-- V3__runtime_management.sql
|
||||
@@ -171,7 +173,7 @@ CREATE INDEX idx_deployments_env_id ON deployments(environment_id);
|
||||
INSERT INTO environments (slug, display_name) VALUES ('default', 'Default');
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Commit**
|
||||
- [x] **Step 2: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql
|
||||
@@ -185,7 +187,7 @@ git commit -m "feat: add runtime management database schema (environments, apps,
|
||||
**Files:**
|
||||
- Create all records in `cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/`
|
||||
|
||||
- [ ] **Step 1: Create all domain records**
|
||||
- [x] **Step 1: Create all domain records**
|
||||
|
||||
```java
|
||||
// Environment.java
|
||||
@@ -233,7 +235,7 @@ package com.cameleer3.server.core.runtime;
|
||||
public enum RoutingMode { path, subdomain }
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Commit**
|
||||
- [x] **Step 2: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/
|
||||
@@ -247,7 +249,7 @@ git commit -m "feat: add runtime management domain records"
|
||||
**Files:**
|
||||
- Create repository interfaces and RuntimeOrchestrator in `core/runtime/`
|
||||
|
||||
- [ ] **Step 1: Create repository interfaces**
|
||||
- [x] **Step 1: Create repository interfaces**
|
||||
|
||||
```java
|
||||
// EnvironmentRepository.java
|
||||
@@ -299,7 +301,7 @@ public interface DeploymentRepository {
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Create RuntimeOrchestrator interface**
|
||||
- [x] **Step 2: Create RuntimeOrchestrator interface**
|
||||
|
||||
```java
|
||||
// RuntimeOrchestrator.java
|
||||
@@ -340,7 +342,7 @@ public record ContainerStatus(String state, boolean running, int exitCode, Strin
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Commit**
|
||||
- [x] **Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/
|
||||
@@ -354,7 +356,7 @@ git commit -m "feat: add runtime repository interfaces and RuntimeOrchestrator"
|
||||
**Files:**
|
||||
- Create service classes in `core/runtime/`
|
||||
|
||||
- [ ] **Step 1: Create EnvironmentService**
|
||||
- [x] **Step 1: Create EnvironmentService**
|
||||
|
||||
```java
|
||||
package com.cameleer3.server.core.runtime;
|
||||
@@ -390,7 +392,7 @@ public class EnvironmentService {
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Create AppService**
|
||||
- [x] **Step 2: Create AppService**
|
||||
|
||||
```java
|
||||
package com.cameleer3.server.core.runtime;
|
||||
@@ -473,7 +475,7 @@ public class AppService {
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Create DeploymentService**
|
||||
- [x] **Step 3: Create DeploymentService**
|
||||
|
||||
```java
|
||||
package com.cameleer3.server.core.runtime;
|
||||
@@ -531,7 +533,7 @@ public class DeploymentService {
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
- [x] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/
|
||||
@@ -545,7 +547,7 @@ git commit -m "feat: add EnvironmentService, AppService, DeploymentService"
|
||||
**Files:**
|
||||
- Create all Postgres repositories in `app/storage/`
|
||||
|
||||
- [ ] **Step 1: Implement all four repositories**
|
||||
- [x] **Step 1: Implement all four repositories**
|
||||
|
||||
Follow the pattern from `PostgresUserRepository.java` — `JdbcTemplate` with row mappers. Each repository implements its core interface with standard SQL (INSERT, SELECT, UPDATE, DELETE).
|
||||
|
||||
@@ -555,7 +557,7 @@ Key patterns to follow:
|
||||
- `UUID.randomUUID()` for ID generation
|
||||
- `Timestamp.from(Instant)` for timestamp parameters
|
||||
|
||||
- [ ] **Step 2: Wire beans**
|
||||
- [x] **Step 2: Wire beans**
|
||||
|
||||
Create `RuntimeBeanConfig.java` in `app/config/`:
|
||||
|
||||
@@ -594,12 +596,12 @@ public class RuntimeBeanConfig {
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Run tests**
|
||||
- [x] **Step 3: Run tests**
|
||||
|
||||
Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn test -pl cameleer3-server-app`
|
||||
Expected: PASS (Flyway applies V3 migration, context loads).
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
- [x] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/Postgres*Repository.java
|
||||
@@ -616,7 +618,7 @@ git commit -m "feat: implement PostgreSQL repositories for runtime management"
|
||||
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DisabledRuntimeOrchestrator.java`
|
||||
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/RuntimeOrchestratorAutoConfig.java`
|
||||
|
||||
- [ ] **Step 1: Implement DisabledRuntimeOrchestrator**
|
||||
- [x] **Step 1: Implement DisabledRuntimeOrchestrator**
|
||||
|
||||
```java
|
||||
package com.cameleer3.server.app.runtime;
|
||||
@@ -634,7 +636,7 @@ public class DisabledRuntimeOrchestrator implements RuntimeOrchestrator {
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Implement DockerRuntimeOrchestrator**
|
||||
- [x] **Step 2: Implement DockerRuntimeOrchestrator**
|
||||
|
||||
Port from SaaS `DockerRuntimeOrchestrator.java`, adapted:
|
||||
- Uses docker-java `DockerClientImpl` with zerodep transport
|
||||
@@ -680,7 +682,7 @@ public String startContainer(ContainerRequest request) {
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Implement RuntimeOrchestratorAutoConfig**
|
||||
- [x] **Step 3: Implement RuntimeOrchestratorAutoConfig**
|
||||
|
||||
```java
|
||||
package com.cameleer3.server.app.runtime;
|
||||
@@ -713,7 +715,7 @@ public class RuntimeOrchestratorAutoConfig {
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
- [x] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/
|
||||
@@ -727,7 +729,7 @@ git commit -m "feat: implement DockerRuntimeOrchestrator with volume-mount JAR d
|
||||
**Files:**
|
||||
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DeploymentExecutor.java`
|
||||
|
||||
- [ ] **Step 1: Implement async deployment pipeline**
|
||||
- [x] **Step 1: Implement async deployment pipeline**
|
||||
|
||||
```java
|
||||
package com.cameleer3.server.app.runtime;
|
||||
@@ -819,7 +821,7 @@ public class DeploymentExecutor {
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Add async config**
|
||||
- [x] **Step 2: Add async config**
|
||||
|
||||
Add to `RuntimeBeanConfig.java` or create `AsyncConfig.java`:
|
||||
|
||||
@@ -836,7 +838,7 @@ public TaskExecutor deploymentTaskExecutor() {
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Commit**
|
||||
- [x] **Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DeploymentExecutor.java
|
||||
@@ -852,11 +854,11 @@ git commit -m "feat: implement async DeploymentExecutor pipeline"
|
||||
- Create: `AppController.java` (under `/api/v1/apps`, OPERATOR role)
|
||||
- Create: `DeploymentController.java` (under `/api/v1/apps/{appId}/deployments`, OPERATOR role)
|
||||
|
||||
- [ ] **Step 1: Implement EnvironmentAdminController**
|
||||
- [x] **Step 1: Implement EnvironmentAdminController**
|
||||
|
||||
CRUD for environments. Path: `/api/v1/admin/environments`. Requires ADMIN role. Follows existing controller patterns (OpenAPI annotations, ResponseEntity).
|
||||
|
||||
- [ ] **Step 2: Implement AppController**
|
||||
- [x] **Step 2: Implement AppController**
|
||||
|
||||
App CRUD + JAR upload. Path: `/api/v1/apps`. Requires OPERATOR role. JAR upload via `multipart/form-data`. Returns app versions.
|
||||
|
||||
@@ -870,7 +872,7 @@ public ResponseEntity<AppVersion> uploadJar(@PathVariable UUID appId,
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Implement DeploymentController**
|
||||
- [x] **Step 3: Implement DeploymentController**
|
||||
|
||||
Deploy, stop, restart, promote, logs. Path: `/api/v1/apps/{appId}/deployments`. Requires OPERATOR role.
|
||||
|
||||
@@ -894,7 +896,7 @@ public ResponseEntity<Deployment> promote(@PathVariable UUID appId, @PathVariabl
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Add security rules to SecurityConfig**
|
||||
- [x] **Step 4: Add security rules to SecurityConfig**
|
||||
|
||||
Add to `SecurityConfig.filterChain()`:
|
||||
```java
|
||||
@@ -902,7 +904,7 @@ Add to `SecurityConfig.filterChain()`:
|
||||
.requestMatchers("/api/v1/apps/**").hasAnyRole("OPERATOR", "ADMIN")
|
||||
```
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
- [x] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/EnvironmentAdminController.java
|
||||
@@ -918,7 +920,7 @@ git commit -m "feat: add REST controllers for environment, app, and deployment m
|
||||
**Files:**
|
||||
- Modify: `cameleer3-server-app/src/main/resources/application.yml`
|
||||
|
||||
- [ ] **Step 1: Add runtime config properties**
|
||||
- [x] **Step 1: Add runtime config properties**
|
||||
|
||||
```yaml
|
||||
cameleer:
|
||||
@@ -935,12 +937,12 @@ cameleer:
|
||||
routing-domain: ${CAMELEER_ROUTING_DOMAIN:localhost}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Run full test suite**
|
||||
- [x] **Step 2: Run full test suite**
|
||||
|
||||
Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn clean verify`
|
||||
Expected: PASS.
|
||||
|
||||
- [ ] **Step 3: Commit**
|
||||
- [x] **Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-app/src/main/resources/application.yml
|
||||
@@ -951,19 +953,19 @@ git commit -m "feat: add runtime management configuration properties"
|
||||
|
||||
### Task 11: Integration Tests
|
||||
|
||||
- [ ] **Step 1: Write EnvironmentAdminController integration test**
|
||||
- [x] **Step 1: Write EnvironmentAdminController integration test**
|
||||
|
||||
Test CRUD operations for environments. Follows existing pattern from `AgentRegistrationControllerIT`.
|
||||
|
||||
- [ ] **Step 2: Write AppController integration test**
|
||||
- [x] **Step 2: Write AppController integration test**
|
||||
|
||||
Test app creation, JAR upload, version listing.
|
||||
|
||||
- [ ] **Step 3: Write DeploymentController integration test**
|
||||
- [x] **Step 3: Write DeploymentController integration test**
|
||||
|
||||
Test deployment creation (with `DisabledRuntimeOrchestrator` — verifies the deployment record is created even if Docker is unavailable). Full Docker tests require Docker-in-Docker and are out of scope for CI.
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
- [x] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/
|
||||
@@ -974,16 +976,16 @@ git commit -m "test: add integration tests for runtime management API"
|
||||
|
||||
### Task 12: Final Verification
|
||||
|
||||
- [ ] **Step 1: Run full build**
|
||||
- [x] **Step 1: Run full build**
|
||||
|
||||
Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn clean verify`
|
||||
Expected: All tests PASS.
|
||||
|
||||
- [ ] **Step 2: Verify schema applies cleanly**
|
||||
- [x] **Step 2: Verify schema applies cleanly**
|
||||
|
||||
Fresh Testcontainers PostgreSQL should apply V1 + V2 + V3 without errors.
|
||||
|
||||
- [ ] **Step 3: Commit any remaining fixes**
|
||||
- [x] **Step 3: Commit any remaining fixes**
|
||||
|
||||
```bash
|
||||
git add -A
|
||||
|
||||
Reference in New Issue
Block a user