Commit 60fdaa20 authored by Georgios P. Katsikas's avatar Georgios P. Katsikas
Browse files

feat: ztpUpdate RPC is also event-driven



This commit provides support for automated invokation
of the ztpUpdate RPC upon a DEVICE_UPDATED event.
When this event is triggered, the Automation component
fetches the associated device configuration and applies
it to the device.

Signed-off-by: default avatarGeorgios Katsikas <katsikas.gp@gmail.com>
parent bad7fd80
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -190,6 +190,7 @@ message DeviceList {
message DeviceEvent {
  Event event = 1;
  DeviceId device_id = 2;
  DeviceConfig device_config = 3;
}


+3 −3
Original line number Diff line number Diff line
@@ -78,9 +78,9 @@ public class ContextSubscriber {
                                    automationService.deleteDevice(deviceEvent.getDeviceId());
                                    break;
                                case UPDATE:
                                    // TODO a DeviceConfig object should be part of the DeviceEvent object in order
                                    // for automationService.updateDevice() to be triggered automatically like
                                    // addDevice().
                                    LOGGER.infof("Received %s for device [%s]", event, deviceId);
                                    automationService.updateDevice(
                                            deviceEvent.getDeviceId(), deviceEvent.getDeviceConfig().orElse(null));
                                case UNDEFINED:
                                    logWarningMessage(event, deviceId, eventType);
                                    break;
+3 −1
Original line number Diff line number Diff line
@@ -269,6 +269,7 @@ public class Serializer {

        builder.setDeviceId(deviceId);
        builder.setEvent(serialize(deviceEvent.getEvent()));
        builder.setDeviceConfig(serialize(deviceEvent.getDeviceConfig().orElse(null)));

        return builder.build();
    }
@@ -276,8 +277,9 @@ public class Serializer {
    public DeviceEvent deserialize(ContextOuterClass.DeviceEvent deviceEvent) {
        final var deviceId = deserialize(deviceEvent.getDeviceId());
        final var event = deserialize(deviceEvent.getEvent());
        final var deviceConfig = deserialize(deviceEvent.getDeviceConfig());

        return new DeviceEvent(deviceId, event);
        return new DeviceEvent(deviceId, event, deviceConfig);
    }

    public ContextOuterClass.ConfigActionEnum serialize(ConfigActionEnum configAction) {
+16 −1
Original line number Diff line number Diff line
@@ -16,14 +16,23 @@

package eu.teraflow.automation.context.model;

import java.util.Optional;

public class DeviceEvent {

    private final Event event;
    private final String deviceId;
    private final Optional<DeviceConfig> deviceConfig;

    public DeviceEvent(String deviceId, Event event) {
        this(deviceId, event, null);
    }

    public DeviceEvent(String deviceId, Event event, DeviceConfig deviceConfig) {
        this.event = event;
        this.deviceId = deviceId;
        this.deviceConfig =
                (deviceConfig == null) ? Optional.empty() : Optional.ofNullable(deviceConfig);
    }

    public Event getEvent() {
@@ -34,8 +43,14 @@ public class DeviceEvent {
        return deviceId;
    }

    public Optional<DeviceConfig> getDeviceConfig() {
        return deviceConfig;
    }

    @Override
    public String toString() {
        return String.format("%s[%s, %s]", getClass().getSimpleName(), deviceId, event.toString());
        return String.format(
                "%s[%s, %s, %s]",
                getClass().getSimpleName(), deviceId, event.toString(), deviceConfig.orElse(null));
    }
}
+85 −3
Original line number Diff line number Diff line
@@ -392,14 +392,51 @@ class SerializerTest {
                        .setTimestamp(expectedTimestamp)
                        .setEventType(ContextOuterClass.EventTypeEnum.EVENTTYPE_CREATE)
                        .build();

        final var expectedConfigRuleCustomA =
                ContextOuterClass.ConfigRule_Custom.newBuilder()
                        .setResourceKey("resourceKeyA")
                        .setResourceValue("resourceValueA")
                        .build();

        final var expectedConfigRuleCustomB =
                ContextOuterClass.ConfigRule_Custom.newBuilder()
                        .setResourceKey("resourceKeyB")
                        .setResourceValue("resourceValueB")
                        .build();

        final var expectedConfigRuleA =
                ContextOuterClass.ConfigRule.newBuilder()
                        .setAction(ContextOuterClass.ConfigActionEnum.CONFIGACTION_SET)
                        .setCustom(expectedConfigRuleCustomA)
                        .build();
        final var expectedConfigRuleB =
                ContextOuterClass.ConfigRule.newBuilder()
                        .setAction(ContextOuterClass.ConfigActionEnum.CONFIGACTION_DELETE)
                        .setCustom(expectedConfigRuleCustomB)
                        .build();

        final var expectedDeviceConfig =
                ContextOuterClass.DeviceConfig.newBuilder()
                        .addAllConfigRules(List.of(expectedConfigRuleA, expectedConfigRuleB))
                        .build();

        final var expectedDeviceEvent =
                ContextOuterClass.DeviceEvent.newBuilder()
                        .setDeviceId(expectedDeviceId)
                        .setEvent(expectedEvent)
                        .setDeviceConfig(expectedDeviceConfig)
                        .build();

        final var creationEvent = new Event(1, EventTypeEnum.CREATE);
        final var deviceEvent = new DeviceEvent("deviceId", creationEvent);
        final var configRuleCustomA = new ConfigRuleCustom("resourceKeyA", "resourceValueA");
        final var configRuleCustomB = new ConfigRuleCustom("resourceKeyB", "resourceValueB");
        final var configRuleTypeA = new ConfigRuleTypeCustom(configRuleCustomA);
        final var configRuleTypeB = new ConfigRuleTypeCustom(configRuleCustomB);
        final var configRuleA = new ConfigRule(ConfigActionEnum.SET, configRuleTypeA);
        final var configRuleB = new ConfigRule(ConfigActionEnum.DELETE, configRuleTypeB);
        final var deviceConfig = new DeviceConfig(List.of(configRuleA, configRuleB));
        final var deviceEvent = new DeviceEvent("deviceId", creationEvent, deviceConfig);
        final var serializedDeviceEvent = serializer.serialize(deviceEvent);

        assertThat(serializedDeviceEvent).usingRecursiveComparison().isEqualTo(expectedDeviceEvent);
@@ -412,7 +449,22 @@ class SerializerTest {
        final var expectedTimestamp = ContextOuterClass.Timestamp.newBuilder().setTimestamp(1).build();

        final var creationEvent = new Event(1, expectedEventType);
        final var expectedDeviceEvent = new DeviceEvent(dummyDeviceId, creationEvent);

        final var expectedConfigRuleCustomA = new ConfigRuleCustom("resourceKeyA", "resourceValueA");
        final var expectedConfigRuleCustomB = new ConfigRuleCustom("resourceKeyB", "resourceValueB");

        final var expectedConfigRuleTypeA = new ConfigRuleTypeCustom(expectedConfigRuleCustomA);
        final var expectedConfigRuleTypeB = new ConfigRuleTypeCustom(expectedConfigRuleCustomB);

        final var expectedConfigRuleA = new ConfigRule(ConfigActionEnum.SET, expectedConfigRuleTypeA);
        final var expectedConfigRuleB =
                new ConfigRule(ConfigActionEnum.DELETE, expectedConfigRuleTypeB);

        final var expectedDeviceConfig =
                new DeviceConfig(List.of(expectedConfigRuleA, expectedConfigRuleB));

        final var expectedDeviceEvent =
                new DeviceEvent(dummyDeviceId, creationEvent, expectedDeviceConfig);

        final var deviceUuid = Uuid.newBuilder().setUuid("deviceId");
        final var deviceId = DeviceId.newBuilder().setDeviceUuid(deviceUuid).build();
@@ -421,8 +473,38 @@ class SerializerTest {
                        .setTimestamp(expectedTimestamp)
                        .setEventType(ContextOuterClass.EventTypeEnum.EVENTTYPE_REMOVE)
                        .build();

        final var configRuleCustomA =
                ContextOuterClass.ConfigRule_Custom.newBuilder()
                        .setResourceKey("resourceKeyA")
                        .setResourceValue("resourceValueA")
                        .build();
        final var configRuleCustomB =
                ContextOuterClass.ConfigRule_Custom.newBuilder()
                        .setResourceKey("resourceKeyB")
                        .setResourceValue("resourceValueB")
                        .build();
        final var configRuleA =
                ContextOuterClass.ConfigRule.newBuilder()
                        .setAction(ContextOuterClass.ConfigActionEnum.CONFIGACTION_SET)
                        .setCustom(configRuleCustomA)
                        .build();
        final var configRuleB =
                ContextOuterClass.ConfigRule.newBuilder()
                        .setAction(ContextOuterClass.ConfigActionEnum.CONFIGACTION_DELETE)
                        .setCustom(configRuleCustomB)
                        .build();
        final var deviceConfig =
                ContextOuterClass.DeviceConfig.newBuilder()
                        .addAllConfigRules(List.of(configRuleA, configRuleB))
                        .build();

        final var serializedDeviceEvent =
                ContextOuterClass.DeviceEvent.newBuilder().setDeviceId(deviceId).setEvent(event).build();
                ContextOuterClass.DeviceEvent.newBuilder()
                        .setDeviceId(deviceId)
                        .setEvent(event)
                        .setDeviceConfig(deviceConfig)
                        .build();
        final var deviceEvent = serializer.deserialize(serializedDeviceEvent);

        assertThat(deviceEvent).usingRecursiveComparison().isEqualTo(expectedDeviceEvent);
Loading