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
331 lines
9.8 KiB
JSON
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|