docs: mark Plan 3 (runtime management port) as completed
All checks were successful
CI / build (push) Successful in 1m25s
CI / docker (push) Successful in 11s

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:
hsiegeln
2026-04-09 08:58:15 +02:00
parent 63e6c6b1b5
commit 538591989c

View File

@@ -1,6 +1,8 @@
# Plan 3: Runtime Management in the Server # 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. **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:** **Files:**
- Modify: `cameleer3-server-app/pom.xml` - Modify: `cameleer3-server-app/pom.xml`
- [ ] **Step 1: Add docker-java dependency** - [x] **Step 1: Add docker-java dependency**
```xml ```xml
<dependency> <dependency>
@@ -93,12 +95,12 @@ src/main/resources/db/migration/
</dependency> </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` Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn compile -pl cameleer3-server-app`
Expected: BUILD SUCCESS. Expected: BUILD SUCCESS.
- [ ] **Step 3: Commit** - [x] **Step 3: Commit**
```bash ```bash
git add cameleer3-server-app/pom.xml git add cameleer3-server-app/pom.xml
@@ -112,7 +114,7 @@ git commit -m "chore: add docker-java dependency for runtime orchestration"
**Files:** **Files:**
- Create: `cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql` - Create: `cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql`
- [ ] **Step 1: Write migration** - [x] **Step 1: Write migration**
```sql ```sql
-- V3__runtime_management.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'); INSERT INTO environments (slug, display_name) VALUES ('default', 'Default');
``` ```
- [ ] **Step 2: Commit** - [x] **Step 2: Commit**
```bash ```bash
git add cameleer3-server-app/src/main/resources/db/migration/V3__runtime_management.sql 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:** **Files:**
- Create all records in `cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/` - 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 ```java
// Environment.java // Environment.java
@@ -233,7 +235,7 @@ package com.cameleer3.server.core.runtime;
public enum RoutingMode { path, subdomain } public enum RoutingMode { path, subdomain }
``` ```
- [ ] **Step 2: Commit** - [x] **Step 2: Commit**
```bash ```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/ 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:** **Files:**
- Create repository interfaces and RuntimeOrchestrator in `core/runtime/` - Create repository interfaces and RuntimeOrchestrator in `core/runtime/`
- [ ] **Step 1: Create repository interfaces** - [x] **Step 1: Create repository interfaces**
```java ```java
// EnvironmentRepository.java // EnvironmentRepository.java
@@ -299,7 +301,7 @@ public interface DeploymentRepository {
} }
``` ```
- [ ] **Step 2: Create RuntimeOrchestrator interface** - [x] **Step 2: Create RuntimeOrchestrator interface**
```java ```java
// RuntimeOrchestrator.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 ```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/ 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:** **Files:**
- Create service classes in `core/runtime/` - Create service classes in `core/runtime/`
- [ ] **Step 1: Create EnvironmentService** - [x] **Step 1: Create EnvironmentService**
```java ```java
package com.cameleer3.server.core.runtime; package com.cameleer3.server.core.runtime;
@@ -390,7 +392,7 @@ public class EnvironmentService {
} }
``` ```
- [ ] **Step 2: Create AppService** - [x] **Step 2: Create AppService**
```java ```java
package com.cameleer3.server.core.runtime; package com.cameleer3.server.core.runtime;
@@ -473,7 +475,7 @@ public class AppService {
} }
``` ```
- [ ] **Step 3: Create DeploymentService** - [x] **Step 3: Create DeploymentService**
```java ```java
package com.cameleer3.server.core.runtime; package com.cameleer3.server.core.runtime;
@@ -531,7 +533,7 @@ public class DeploymentService {
} }
``` ```
- [ ] **Step 4: Commit** - [x] **Step 4: Commit**
```bash ```bash
git add cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/ 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:** **Files:**
- Create all Postgres repositories in `app/storage/` - 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). 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 - `UUID.randomUUID()` for ID generation
- `Timestamp.from(Instant)` for timestamp parameters - `Timestamp.from(Instant)` for timestamp parameters
- [ ] **Step 2: Wire beans** - [x] **Step 2: Wire beans**
Create `RuntimeBeanConfig.java` in `app/config/`: 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` Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn test -pl cameleer3-server-app`
Expected: PASS (Flyway applies V3 migration, context loads). Expected: PASS (Flyway applies V3 migration, context loads).
- [ ] **Step 4: Commit** - [x] **Step 4: Commit**
```bash ```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/Postgres*Repository.java 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/DisabledRuntimeOrchestrator.java`
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/RuntimeOrchestratorAutoConfig.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 ```java
package com.cameleer3.server.app.runtime; 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: Port from SaaS `DockerRuntimeOrchestrator.java`, adapted:
- Uses docker-java `DockerClientImpl` with zerodep transport - 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 ```java
package com.cameleer3.server.app.runtime; package com.cameleer3.server.app.runtime;
@@ -713,7 +715,7 @@ public class RuntimeOrchestratorAutoConfig {
} }
``` ```
- [ ] **Step 4: Commit** - [x] **Step 4: Commit**
```bash ```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/ 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:** **Files:**
- Create: `cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DeploymentExecutor.java` - 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 ```java
package com.cameleer3.server.app.runtime; 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`: Add to `RuntimeBeanConfig.java` or create `AsyncConfig.java`:
@@ -836,7 +838,7 @@ public TaskExecutor deploymentTaskExecutor() {
} }
``` ```
- [ ] **Step 3: Commit** - [x] **Step 3: Commit**
```bash ```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DeploymentExecutor.java 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: `AppController.java` (under `/api/v1/apps`, OPERATOR role)
- Create: `DeploymentController.java` (under `/api/v1/apps/{appId}/deployments`, 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). 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. 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. 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()`: Add to `SecurityConfig.filterChain()`:
```java ```java
@@ -902,7 +904,7 @@ Add to `SecurityConfig.filterChain()`:
.requestMatchers("/api/v1/apps/**").hasAnyRole("OPERATOR", "ADMIN") .requestMatchers("/api/v1/apps/**").hasAnyRole("OPERATOR", "ADMIN")
``` ```
- [ ] **Step 5: Commit** - [x] **Step 5: Commit**
```bash ```bash
git add cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/EnvironmentAdminController.java 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:** **Files:**
- Modify: `cameleer3-server-app/src/main/resources/application.yml` - Modify: `cameleer3-server-app/src/main/resources/application.yml`
- [ ] **Step 1: Add runtime config properties** - [x] **Step 1: Add runtime config properties**
```yaml ```yaml
cameleer: cameleer:
@@ -935,12 +937,12 @@ cameleer:
routing-domain: ${CAMELEER_ROUTING_DOMAIN:localhost} 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` Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn clean verify`
Expected: PASS. Expected: PASS.
- [ ] **Step 3: Commit** - [x] **Step 3: Commit**
```bash ```bash
git add cameleer3-server-app/src/main/resources/application.yml 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 ### 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`. 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. 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. 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 ```bash
git add cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/ 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 ### 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` Run: `cd /c/Users/Hendrik/Documents/projects/cameleer3-server && mvn clean verify`
Expected: All tests PASS. 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. Fresh Testcontainers PostgreSQL should apply V1 + V2 + V3 without errors.
- [ ] **Step 3: Commit any remaining fixes** - [x] **Step 3: Commit any remaining fixes**
```bash ```bash
git add -A git add -A