Implement Server CRUD with bool type fix and auto-increment IDs
CRITICAL FIX: Changed boolean fields from int32 to bool type - Enabled, DeactivateEcho, DeactivateLiveCheck now use proper bool type (type code 1) - Previous int32 implementation (type code 4) caused servers to be written but not recognized by GeViSet - Fixed field order to match working reference implementation Server CRUD Implementation: - Create, Read, Update, Delete operations via gRPC and REST API - Auto-increment server ID logic to prevent conflicts - Proper field ordering: Alias, DeactivateEcho, DeactivateLiveCheck, Enabled, Host, Password, User Files Added/Modified: - src/sdk-bridge/GeViScopeBridge/Services/ConfigurationServiceImplementation.cs (bool type fix, CRUD methods) - src/sdk-bridge/Protos/configuration.proto (protocol definitions) - src/api/routers/configuration.py (REST endpoints) - src/api/protos/ (generated protobuf files) - SERVER_CRUD_IMPLEMENTATION.md (comprehensive documentation) Verified: - Servers persist correctly in GeViSoft configuration - Servers visible in GeViSet with correct boolean values - Action mappings CRUD functional - All test scripts working (server_manager.py, cleanup_to_base.py, add_claude_test_data.py) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
204
SERVER_CRUD_IMPLEMENTATION.md
Normal file
204
SERVER_CRUD_IMPLEMENTATION.md
Normal file
@@ -0,0 +1,204 @@
|
||||
# Server CRUD Implementation
|
||||
|
||||
## Overview
|
||||
|
||||
Full CRUD (Create, Read, Update, Delete) implementation for GeViSoft G-Core server management via gRPC SDK Bridge and REST API.
|
||||
|
||||
## Critical Implementation Details
|
||||
|
||||
### Boolean Type Fix
|
||||
|
||||
**Issue**: Initial implementation used `int32` type for boolean fields (Enabled, DeactivateEcho, DeactivateLiveCheck), causing servers to be written but not recognized by GeViSet.
|
||||
|
||||
**Solution**: Changed to proper `bool` type (type code 1) instead of `int32` (type code 4).
|
||||
|
||||
**Affected Files**:
|
||||
- `src/sdk-bridge/GeViScopeBridge/Services/ConfigurationServiceImplementation.cs`
|
||||
- Lines 1062-1078: CreateServer method
|
||||
- Lines 1194-1200: UpdateServer method
|
||||
- Lines 1344-1383: UpdateOrAddChild helper (added bool handling)
|
||||
|
||||
### Field Order Requirements
|
||||
|
||||
Server configuration nodes must have fields in specific order:
|
||||
1. Alias (string)
|
||||
2. DeactivateEcho (bool)
|
||||
3. DeactivateLiveCheck (bool)
|
||||
4. Enabled (bool)
|
||||
5. Host (string)
|
||||
6. Password (string)
|
||||
7. User (string)
|
||||
|
||||
**Reference**: Working implementation in `C:\DEV\COPILOT_codex\geviset_parser.py` lines 389-404
|
||||
|
||||
### Auto-Increment Server IDs
|
||||
|
||||
**Implementation**: `server_manager.py` demonstrates proper ID management:
|
||||
- Reads existing servers from configuration
|
||||
- Finds highest numeric server ID
|
||||
- Increments by 1 for new server ID
|
||||
- Skips non-numeric IDs gracefully
|
||||
|
||||
```python
|
||||
def get_next_server_id(servers):
|
||||
numeric_ids = []
|
||||
for server in servers:
|
||||
try:
|
||||
numeric_ids.append(int(server['id']))
|
||||
except ValueError:
|
||||
pass
|
||||
if not numeric_ids:
|
||||
return "1"
|
||||
return str(max(numeric_ids) + 1)
|
||||
```
|
||||
|
||||
## API Endpoints
|
||||
|
||||
### REST API (FastAPI)
|
||||
|
||||
**Base Path**: `/api/v1/configuration`
|
||||
|
||||
- `GET /servers` - List all G-Core servers
|
||||
- `GET /servers/{server_id}` - Get single server by ID
|
||||
- `POST /servers` - Create new server
|
||||
- `PUT /servers/{server_id}` - Update existing server
|
||||
- `DELETE /servers/{server_id}` - Delete server
|
||||
|
||||
**Implementation**: `src/api/routers/configuration.py` lines 278-460
|
||||
|
||||
### gRPC API
|
||||
|
||||
**Service**: `ConfigurationService`
|
||||
|
||||
Methods:
|
||||
- `CreateServer(CreateServerRequest)` → `ServerOperationResponse`
|
||||
- `UpdateServer(UpdateServerRequest)` → `ServerOperationResponse`
|
||||
- `DeleteServer(DeleteServerRequest)` → `ServerOperationResponse`
|
||||
- `ReadConfigurationTree()` → Configuration tree with all servers
|
||||
|
||||
**Implementation**: `src/sdk-bridge/GeViScopeBridge/Services/ConfigurationServiceImplementation.cs`
|
||||
|
||||
## Server Data Structure
|
||||
|
||||
```protobuf
|
||||
message ServerData {
|
||||
string id = 1; // Server ID (numeric string recommended)
|
||||
string alias = 2; // Display name
|
||||
string host = 3; // IP address or hostname
|
||||
string user = 4; // Username (default: "admin")
|
||||
string password = 5; // Password
|
||||
bool enabled = 6; // Enable/disable server
|
||||
bool deactivate_echo = 7; // Deactivate echo (default: false)
|
||||
bool deactivate_live_check = 8; // Deactivate live check (default: false)
|
||||
}
|
||||
```
|
||||
|
||||
## Test Scripts
|
||||
|
||||
### Production Scripts
|
||||
|
||||
1. **server_manager.py** - Complete server lifecycle management
|
||||
- Lists existing servers
|
||||
- Auto-increments IDs
|
||||
- Creates, deletes servers
|
||||
- Manages action mappings
|
||||
- Cleanup functionality
|
||||
|
||||
2. **cleanup_to_base.py** - Restore configuration to base state
|
||||
- Deletes test servers (2, 3)
|
||||
- Preserves original server (1)
|
||||
- Quick reset for testing
|
||||
|
||||
3. **add_claude_test_data.py** - Add test data with "Claude" prefix
|
||||
- Creates 3 servers: Claude Server Alpha/Beta/Gamma
|
||||
- Creates 2 action mappings
|
||||
- All identifiable by "Claude" prefix
|
||||
|
||||
4. **check_and_add_mapping.py** - Verify and add action mappings
|
||||
- Lists existing Claude mappings
|
||||
- Adds missing mappings
|
||||
- Ensures complete test data
|
||||
|
||||
### Legacy Test Scripts
|
||||
|
||||
- `test_server_creation.py` - Direct gRPC server creation test
|
||||
- `add_server_and_mapping.py` - Combined server and mapping creation
|
||||
|
||||
## Verification Process
|
||||
|
||||
### Testing Workflow
|
||||
|
||||
1. **Start Services**:
|
||||
```bash
|
||||
cd C:\GEVISOFT
|
||||
start GeViServer.exe console
|
||||
|
||||
cd C:\DEV\COPILOT\geutebruck-api\src\sdk-bridge\GeViScopeBridge\bin\Debug\net8.0
|
||||
start GeViScopeBridge.exe
|
||||
```
|
||||
|
||||
2. **Run Test Script**:
|
||||
```bash
|
||||
python server_manager.py
|
||||
```
|
||||
|
||||
3. **Stop Services** (required before GeViSet connection):
|
||||
```powershell
|
||||
Stop-Process -Name GeViScopeBridge -Force
|
||||
Stop-Process -Name python -Force
|
||||
Stop-Process -Name GeViServer -Force
|
||||
```
|
||||
|
||||
4. **Verify in GeViSet**:
|
||||
- Connect to GeViServer
|
||||
- Check Configuration → GeViGCoreServer
|
||||
- Verify servers appear with correct bool values
|
||||
|
||||
### Known Issues & Solutions
|
||||
|
||||
**Issue**: Port 50051 (gRPC) in use
|
||||
- **Solution**: Stop SDK Bridge process
|
||||
|
||||
**Issue**: SetupClient connection refused (Error 307)
|
||||
- **Cause**: GeViSet already connected (only one SetupPort client allowed)
|
||||
- **Solution**: Disconnect GeViSet, retry SetupClient
|
||||
|
||||
**Issue**: Servers created but not visible in GeViSet
|
||||
- **Root Cause**: Using int32 instead of bool type
|
||||
- **Solution**: Use proper bool type as documented above
|
||||
|
||||
## Action Mapping CRUD
|
||||
|
||||
Action mappings can also be managed via the same ConfigurationService.
|
||||
|
||||
**Endpoints**:
|
||||
- `GET /api/v1/configuration/action-mappings` - List all mappings
|
||||
- `GET /api/v1/configuration/action-mappings/{mapping_id}` - Get single mapping
|
||||
- `POST /api/v1/configuration/action-mappings` - Create mapping
|
||||
- `PUT /api/v1/configuration/action-mappings/{mapping_id}` - Update mapping
|
||||
- `DELETE /api/v1/configuration/action-mappings/{mapping_id}` - Delete mapping
|
||||
|
||||
**Note**: Mapping IDs are 1-based ordinal positions in the MappingRules list.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- GeViServer must be running
|
||||
- SDK Bridge requires GeViServer connection
|
||||
- REST API requires SDK Bridge on localhost:50051
|
||||
- GeViSet requires exclusive SetupPort (7703) access
|
||||
|
||||
## Success Metrics
|
||||
|
||||
✅ Servers persist correctly in GeViSoft configuration
|
||||
✅ Servers visible in GeViSet with correct boolean values
|
||||
✅ Auto-increment ID logic prevents conflicts
|
||||
✅ All CRUD operations functional via gRPC and REST
|
||||
✅ Action mappings create, read, update, delete working
|
||||
✅ Configuration changes survive GeViServer restart
|
||||
|
||||
## References
|
||||
|
||||
- Working Python parser: `C:\DEV\COPILOT_codex\geviset_parser.py`
|
||||
- SDK Bridge implementation: `src/sdk-bridge/GeViScopeBridge/Services/ConfigurationServiceImplementation.cs`
|
||||
- REST API: `src/api/routers/configuration.py`
|
||||
- Protocol definitions: `src/api/protos/configuration.proto`
|
||||
Reference in New Issue
Block a user