blob: f2d6a8f7081e3db842f6269ab2ecdc6b1f8091e9 [file] [log] [blame] [view]
---
orphan: true
---
# Server Cluster Shim
## Overview
The `ServerClusterShim` provides a way to adapt legacy (codegen/Ember-based)
server cluster implementations to the new `ServerClusterInterface`. It acts as
an intermediary layer, translating between the new interface methods and legacy
`emberAf...` calls. This allows developers to isolate the dependency on code
generation to the cluster layer, instead of leaking it into the data model
provider layer.
This `ServerClusterShim` enables us to develop a new Data Model Provider (fully
code-driven) that doesn't depend on codegen/Ember and can be tested against real
clusters (while the clusters themselves are not all migrated to fully
code-driven yet). This is meant to be a temporary option, until all cluster
implementations have been migrated to implement the new interface. This is an
effort that's currently in progress in the SDK.
## Usage
To use the `ServerClusterShim`, you need to:
- Have a ZAP file with all of the legacy clusters configured.
- Instantiate a `ServerClusterShim` providing the endpoint and cluster ID into
the constructor.
- You can either instantiate one `ServerClusterShim` for multiple
endpoint/cluster ID pairs or one for each cluster.
- Call `ServerClusterShim::Startup` to initialize the cluster with a
`ServerClusterContext`.
- Interact with the cluster by calling any of the `ServerClusterInterface`
methods such as:
- `ReadAttribute`, `WriteAttribute`, `InvokeCommand`, etc.
See some other examples in `TestServerClusterShim.cpp`.
```
// Instantiate a `ServerClusterShim`
ServerClusterShim cluster({ { endpointId, clusterId } });
// Startup with a ServerClusterContext
ServerClusterContext clusterContext{.provider = &provider, .storage = nullptr, .interactionContext = &imContext};
cluster.Startup(&clusterContext);
// Read Attributes (for example, feature map)
ReadOperation readOperation(endpointId, clusterId, Attributes::FeatureMap::Id);
std::unique_ptr<AttributeValueEncoder> encoder = readOperation.StartEncoding();
ASSERT_EQ(cluster.ReadAttribute(readOperation.GetRequest(), *encoder), CHIP_NO_ERROR);
ASSERT_EQ(readOperation.FinishEncoding(), CHIP_NO_ERROR);
// Validate after read
std::vector<DecodedAttributeData> attribute_data;
ASSERT_EQ(readOperation.GetEncodedIBs().Decode(attribute_data), CHIP_NO_ERROR);
```