Dedicated deployable configuration catalog server for
com.mbreissi.edgecommons.ConfigComponent, implemented as a Rust binary.
It bootstraps from the component's own non-CONFIG_COMPONENT config source, loads a catalog from
component.global.configComponent.catalogSource, and manually serves the reserved
CONFIG_COMPONENT rendezvous:
ecv1/{device}/config/cmd/get-configurationecv1/{device}/config/cmd/update-catalog
Successful GET replies are raw lineage bundles:
{
"lineageVersion": 1,
"catalogVersion": "2026-07-08T00:00:00Z",
"component": "opcua-adapter",
"layers": [
{
"id": "enterprise/acme",
"kind": "scope",
"scope": { "enterprise": "acme" },
"config": { "logging": { "level": "INFO" } }
},
{
"id": "line/line-7",
"kind": "scope",
"scope": {
"enterprise": "acme",
"site": "integration-lab",
"zone": "assembly",
"line": "line-7"
},
"config": { "component": { "global": { "pollIntervalMs": 1000 } } }
},
{
"id": "component/opcua-adapter",
"kind": "component",
"component": "opcua-adapter",
"config": { "component": { "token": "opcua-adapter" } }
}
]
}The server does not merge layers. Clients merge and validate their own effective config.
Start a local MQTT broker, then run:
cargo run -- \
--platform HOST \
--transport MQTT test-configs/standalone-messaging.json \
-c FILE test-configs/config.json \
-t gw-01The crate pins the edgecommons Rust library by git rev in Cargo.toml, so it builds from a standalone
clone. For local development against a sibling core/libs/rust checkout, add a gitignored
.cargo/config.toml:
[patch."https://github.com/edgecommons/edgecommons.git"]
edgecommons = { path = "../core/libs/rust" }
[net]
git-fetch-with-cli = trueCI never sees that file, so it resolves the committed pin. Cargo.lock is committed (git-sourced).
v1 supports JSON catalogs from a local file, a Kubernetes ConfigMap-mounted file, or an environment variable:
{
"component": {
"token": "edgecommons-config-component",
"global": {
"configComponent": {
"catalogSource": {
"type": "file",
"path": "/greengrass/v2/work/com.mbreissi.edgecommons.ConfigComponent/catalog.json",
"watch": true
},
"pushOnCatalogReload": true,
"allowVolatileCatalogUpdates": false
}
}
}
}Supported source descriptors:
{ "type": "file", "path": "/path/to/catalog.json", "watch": true }{ "type": "configmap", "path": "/etc/edgecommons/catalog.json", "watch": true }{ "type": "configmap", "mountDir": "/etc/edgecommons", "key": "catalog.json", "watch": true }{ "type": "env", "name": "EDGECOMMONS_CONFIG_CATALOG" }File, ConfigMap, and environment-loaded catalogs may omit version and provenance; the source
derives them from the content hash and source identity. ConfigMap is read/watch only. Kubernetes
updates the ConfigMap; the ConfigComponent observes the mounted file change, updates its active
cache, and serves the new catalog. The component does not write back to a ConfigMap.
Message updates are complete catalog replacements delivered to
ecv1/{device}/config/cmd/update-catalog. The request body contains version and catalog,
and the two versions must match. This interface is disabled by default and is intended only for
debug, verification, and test environments. Enable it with:
{
"component": {
"global": {
"configComponent": {
"allowVolatileCatalogUpdates": true
}
}
}
}When enabled, the component validates the replacement, promotes it only to the active in-memory
cache, acknowledges with {"ok":true,"version":...}, and pushes complete set-config bundles when
configured. It never writes message-delivered catalogs to the file or ConfigMap source, so the
override does not survive restart. Invalid or disabled updates return
{"ok":false,"error":{"code":...,"message":...}} and keep the previous active catalog.
The GDK custom build script builds a Linux Greengrass artifact with the greengrass feature:
gdk component buildOn Windows, build and test the default standalone feature locally with cargo test and cargo build.
The Greengrass IPC feature remains Linux-only because the Greengrass IPC SDK is Linux-only.
Business Source License 1.1 (BUSL-1.1). See LICENSE.