The Asset Library History module is an optional module that stores all changes made to Asset Library resources (devices, groups, policies and/or templates).
The following represents the architecture of the Asset Library History, along with required the Asset Library module.
The Asset Library broadcasts events which the Asset Library subcribes to. Upon receiving, the event is stored in its datastore for later retrieval.
The following endpoints are exposed:
Endpoint | Description |
---|---|
GET /{type}/{objectId}?timeAt=&timeFrom=&timeTo=&user=&event=&sort=&token=&limit= |
Returns the events for a specific object. |
GET /{type}?timeFrom=&timeTo=&user=&event=&sort=&token=&limit= |
Returns all configuration changes of a specific object type. |
{type}
represents the type of resource:devices
,groups
,deviceTemplates
,groupTemplates
orpolicies
.{objectId}
represents the unique identifier for the type of object, e.g.deviceId
for devices, orgroupPath
for groups.?timeAt
represents the state as at a specific time.?timeFrom
and?timeTo
represent a date/time range.?user
represents the author of changes.?event
represents the evet type, one ofcreate
,modify
ordelete
.?sort
represents a sort order, e.g.?sort=time::asc
.?token
and?limit
allow for paginating.
GET /devices/device001?timeAt=2018-05-01T00:00:00+00:00
{
"events": [{
"time": "2018-02-21T03:45:05+00:00",
"author": "deanhart",
"eventType": "modify",
"device": {
<device>
}
}]
}
GET /devices/device001
{
"events": [{
"time": "2018-02-21T03:45:05+00:00",
"author": "deanhart",
"eventType": "modify",
"device": {
<device>
}
}]
}
GET /groups/%2fsupplier%2fsup123?timeFrom=2018-05-01T00:00:00+00:00&sort=time::desc
{
"events": [{
"time": "2018-06-21T03:45:05+00:00",
"author": "deanhart",
"eventType": "modify",
"group": {
<group>
}
}, {
"time": "2018-05-20T00:15:00+00:00",
"author": "deanhart",
"eventType": "modify",
"group": {
<group>
}
}],
"pagination": {
"token": "a1b2c3d4e5f6"
}
}
GET /devices/device123?event=delete
{
"events": [{
"time": "2018-06-21T03:45:05+00:00",
"author": "deanhart",
"eventType": "delete",
"device": {
<device>
}
}]
}
Returning all configuration changes of devices between 03/15/2018 and 04/15/2018 performed by deanhart, limiting the result size returned
GET /devices?timeFrom=2018-03-15T00:00:00+00:00&timeTo=2018-04-15T00:00:00+00:00&user=deanhart&sort=time::desc&limit=2
{
"events": [{
"updatedAt": "2018-03-21T03:45:05+00:00",
"updatedBy": "deanhart",
"eventType": "modify",
"group": {
<group>
}
}, {
"updatedAt": "2018-03-20T00:15:00+00:00",
"updatedBy": "deanhart",
"eventType": "modify",
"group": {
<group>
}
}],
"pagination": {
"token": "a1b2c3d4e5f6"
}
}
DynamoDB is the datastore serving the Asset Library History module. A single DynamoDB table exists as follows:
Primary Key:
- Partition key:
{objectId}
- Sort key:
latest
|{time}
Attributes:
type
: string (devices | groups | policies | deviceTemplates | groupTemplates)time
: string (ISO-8601 UTC date formatted as a string)event
: string (create | modify | delete)user
: stringstate
: string (full json snapshot of the domain object, such as adevice
)
GSI:
- Partition key:
{type}
- Sort key:
{time}
The above partition/sort keys allow for the following queries to be made:
- Returning the configuration for device device001 as of 05/01/2018:
--table-name <tableName> \
--key-condition-expression "objectId = :deviceId AND time BETWEEN :from AND :to" \
--expression-attribute-values '{":deviceId":{"S":"device001"}, ":from":{"S":"2018-05-01T00:00:00+00:00"}, ":to":{"S":"2018-05-01T23:59:59+00:00"}}'
- Returning the latest known event for device device001:
--table-name <tableName> \
--key-condition-expression "objectId = :deviceId AND time = :version" \
--expression-attribute-values '{":deviceId":{"S":"device001"}, ":version":{"S":"latest"}}'
- Returning all configuration changes for the group /supplier/sup123 since 02/01/2018:
--table-name <tableName> \
--key-condition-expression "objectId = :groupPath AND time >= :time" \
--expression-attribute-values '{":groupPath":{"S":"/supplier/sup123"}, ":time":{"S":"2018-02-01"}}'
- Determining when a specific device was deleted:
--table-name <tableName> \
--key-condition-expression "objectId = :deviceId" \
--filter-expression "#e = :event" \
--expression-attribute-names '{"#e": "event"}' \
--expression-attribute-values '{":deviceId":{"S":"device001"}, ":event":{"S":"delete"}}'
- Returning all configuration changes of devices between 03/15/2018 and 04/15/2018 performed by deanhart:
--table-name <tableName> \
--index-name <gsi-name> \
--key-condition-expression "type = :type AND time BETWEEN :from AND :to" \
--filter-expression "#a = :author" \
--expression-attribute-names '{"#a": "author"}' \
--expression-attribute-values '{":type":{"S":"devices"}, ":from":{"S":"2018-05-01T00:00:00+00:00"}, ":to":{"S":"2018-05-01T23:59:59+00:00"}, ":author":{"S":"deanhart"}}'
The Asset Library History module subcribes to the Asset Library published events via an AWS Iot Rule. The action taken for each event is as follows:
Note: the saved
action below involves writing both a new event item with timestamp set appropriately, along with replicating the item to the latest
item.
Event | Actions |
---|---|
Device created | Saved |
Device updated | Latest version retrieved, changed attributes updated, saved |
Device deleted | Saved |
Device attached to group | Latest version retrieved, groups attribute updated, saved |
Device detached from group | Latest version retrieved, groups attribute updated, saved |
Device attached to another device | Latest version retrieved of both devices affected, changed attributes updated, saved |
Device detached from another device | Latest version retrieved of both devices affected, changed attributes updated, saved |
Device component created | Component saved. Latest version of parent retrieved, component list updated, saved |
Device component updated | Latest version retrieved, changed attributes updated, saved |
Device component deleted | Component saved. Latest version of parent retrieved, component list updated, saved |
Group created | Saved |
Group updated | Latest version retrieved, changed attributes updated, saved |
Group deleted | Saved |
Policy created | Saved |
Policy updated | Latest version retrieved, changed attributes updated, saved |
Policy deleted | Saved |
Device Template created | Saved |
Device Template updated | Latest version retrieved, changed attributes updated, saved |
Device Template published | Latest version retrieved, changed attributes updated, saved |
Device Template deleted | Saved |
Group Template created | Saved |
Group Template updated | Latest version retrieved, changed attributes updated, saved |
Group Template published | Latest version retrieved, changed attributes updated, saved |
Group Template deleted | Saved |