hackathon/docs/config/hsp-config-schema-v1.json
Christoph Wagner a489c15cf5 feat: Add complete HSP implementation with integration tests passing
Initial implementation of HTTP Sender Plugin following TDD methodology
  with hexagonal architecture. All 313 tests passing (0 failures).

  This commit adds:
  - Complete domain model and port interfaces
  - All adapter implementations (HTTP, gRPC, file logging, config)
  - Application services (data collection, transmission, backpressure)
  - Comprehensive test suite with 18 integration tests

  Test fixes applied during implementation:
  - Fix base64 encoding validation in DataCollectionServiceIntegrationTest
  - Fix exception type handling in IConfigurationPortTest
  - Fix CompletionException unwrapping in IHttpPollingPortTest
  - Fix sequential batching in DataTransmissionServiceIntegrationTest
  - Add test adapter failure simulation for reconnection tests
  - Use adapter counters for gRPC verification

  Files added:
  - pom.xml with all dependencies (JUnit 5, Mockito, WireMock, gRPC, Jackson)
  - src/main/java: Domain model, ports, adapters, application services
  - src/test/java: Unit tests, integration tests, test utilities
2025-11-20 22:38:55 +01:00

331 lines
9.8 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://coreshield.siemens.com/schemas/hsp-config-v1.json",
"title": "HTTP Sender Plugin Configuration",
"description": "Configuration schema for HSP diagnostic data collection system",
"type": "object",
"required": [
"endpoints",
"grpc_connection",
"buffer"
],
"properties": {
"http_polling": {
"type": "object",
"description": "HTTP polling configuration",
"properties": {
"timeout_seconds": {
"type": "integer",
"description": "HTTP request timeout in seconds",
"default": 30,
"minimum": 1,
"maximum": 300
},
"retry_attempts": {
"type": "integer",
"description": "Number of retry attempts for failed requests",
"default": 3,
"minimum": 0,
"maximum": 10
},
"retry_interval_seconds": {
"type": "integer",
"description": "Interval between retry attempts in seconds",
"default": 5,
"minimum": 1,
"maximum": 60
},
"rate_limiting": {
"type": "object",
"description": "Rate limiting configuration (Phase 1.1)",
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable rate limiting for HTTP requests",
"default": true
},
"requests_per_second": {
"type": "number",
"description": "Maximum requests per second (global)",
"default": 10.0,
"exclusiveMinimum": 0,
"maximum": 1000.0
},
"per_endpoint": {
"type": "boolean",
"description": "Apply rate limit per endpoint (true) or globally (false)",
"default": true
}
},
"required": ["enabled", "requests_per_second"]
},
"backpressure": {
"type": "object",
"description": "Backpressure configuration (Phase 1.2)",
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable backpressure mechanism",
"default": true
},
"monitor_interval_ms": {
"type": "integer",
"description": "Buffer monitoring interval in milliseconds",
"default": 100,
"minimum": 10,
"maximum": 1000
},
"threshold_percent": {
"type": "number",
"description": "Buffer usage threshold to trigger backpressure (0-100)",
"default": 80.0,
"minimum": 0.0,
"maximum": 100.0
}
}
}
}
},
"endpoints": {
"type": "array",
"description": "List of HTTP endpoints to poll",
"minItems": 1,
"maxItems": 1000,
"items": {
"type": "object",
"required": ["url", "poll_interval_seconds"],
"properties": {
"url": {
"type": "string",
"description": "HTTP endpoint URL",
"format": "uri",
"pattern": "^https?://.+"
},
"poll_interval_seconds": {
"type": "integer",
"description": "Polling interval in seconds",
"minimum": 1,
"maximum": 3600
},
"enabled": {
"type": "boolean",
"description": "Enable polling for this endpoint",
"default": true
},
"rate_limit_override": {
"type": "number",
"description": "Per-endpoint rate limit override (requests per second)",
"exclusiveMinimum": 0,
"maximum": 1000.0
},
"priority": {
"type": "string",
"description": "Endpoint priority (for future use)",
"enum": ["low", "normal", "high", "critical"],
"default": "normal"
},
"metadata": {
"type": "object",
"description": "Additional endpoint metadata",
"properties": {
"device_id": {
"type": "string"
},
"location": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
},
"grpc_connection": {
"type": "object",
"description": "gRPC connection configuration",
"required": ["host", "port"],
"properties": {
"host": {
"type": "string",
"description": "gRPC server hostname",
"minLength": 1
},
"port": {
"type": "integer",
"description": "gRPC server port",
"minimum": 1,
"maximum": 65535
},
"receiver_id": {
"type": "integer",
"description": "Receiver ID for gRPC transmission",
"default": 99
},
"reconnect_interval_seconds": {
"type": "integer",
"description": "Reconnection interval on failure (seconds)",
"default": 5,
"minimum": 1,
"maximum": 60
},
"max_reconnect_attempts": {
"type": "integer",
"description": "Maximum reconnection attempts (0 = infinite)",
"default": 0,
"minimum": 0,
"maximum": 100
},
"tls": {
"type": "object",
"description": "TLS configuration (future enhancement)",
"properties": {
"enabled": {
"type": "boolean",
"default": false
},
"cert_path": {
"type": "string"
},
"key_path": {
"type": "string"
},
"ca_cert_path": {
"type": "string"
}
}
}
}
},
"buffer": {
"type": "object",
"description": "Circular buffer configuration",
"required": ["capacity"],
"properties": {
"capacity": {
"type": "integer",
"description": "Buffer capacity (number of messages)",
"default": 300,
"minimum": 10,
"maximum": 10000
},
"overflow_policy": {
"type": "string",
"description": "Behavior when buffer is full",
"enum": ["discard_oldest", "block", "discard_newest"],
"default": "discard_oldest"
},
"statistics_enabled": {
"type": "boolean",
"description": "Enable buffer statistics collection",
"default": true
}
}
},
"transmission": {
"type": "object",
"description": "Data transmission configuration",
"properties": {
"batch_size_bytes": {
"type": "integer",
"description": "Maximum batch size in bytes",
"default": 4194304,
"minimum": 1024,
"maximum": 10485760
},
"batch_timeout_seconds": {
"type": "integer",
"description": "Maximum time to accumulate batch (seconds)",
"default": 1,
"minimum": 1,
"maximum": 60
}
}
},
"health_check": {
"type": "object",
"description": "Health check endpoint configuration",
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable health check endpoint",
"default": true
},
"port": {
"type": "integer",
"description": "Health check HTTP server port",
"default": 8080,
"minimum": 1024,
"maximum": 65535
},
"path": {
"type": "string",
"description": "Health check endpoint path",
"default": "/health",
"pattern": "^/.+"
}
}
},
"logging": {
"type": "object",
"description": "Logging configuration",
"properties": {
"level": {
"type": "string",
"description": "Log level",
"enum": ["TRACE", "DEBUG", "INFO", "WARN", "ERROR"],
"default": "INFO"
},
"file_path": {
"type": "string",
"description": "Log file path (default: temp directory)",
"default": "${java.io.tmpdir}/hsp.log"
},
"max_file_size_mb": {
"type": "integer",
"description": "Maximum log file size in MB",
"default": 100,
"minimum": 1,
"maximum": 1000
},
"max_files": {
"type": "integer",
"description": "Maximum number of log files to keep",
"default": 5,
"minimum": 1,
"maximum": 100
}
}
},
"performance": {
"type": "object",
"description": "Performance tuning configuration",
"properties": {
"virtual_threads": {
"type": "boolean",
"description": "Use Java 25 virtual threads",
"default": true
},
"max_concurrent_polls": {
"type": "integer",
"description": "Maximum concurrent polling operations",
"default": 1000,
"minimum": 1,
"maximum": 10000
},
"memory_limit_mb": {
"type": "integer",
"description": "Memory usage limit in MB",
"default": 4096,
"minimum": 512,
"maximum": 16384
}
}
}
}
}