Skip to content

Repository files navigation

EdgeCommons ConfigComponent

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-configuration
  • ecv1/{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.

Run Locally

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-01

The 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 = true

CI never sees that file, so it resolves the committed pin. Cargo.lock is committed (git-sourced).

Catalog Source

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.

Greengrass Build

The GDK custom build script builds a Linux Greengrass artifact with the greengrass feature:

gdk component build

On 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.

License

Business Source License 1.1 (BUSL-1.1). See LICENSE.

About

Dedicated EdgeCommons ConfigComponent

Resources

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages