Commit 9b9228a3 authored by Fotis Soldatos's avatar Fotis Soldatos
Browse files

Merge branch 'automation/implement-ztpUpdate-rpc' into 'develop'

feat(automation): implement ztpUpdate()

See merge request teraflow-h2020/controller!164
parents c9827f4e 92b76d6a
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ service AutomationService {
  rpc ZtpGetDeviceRole(DeviceRoleId) returns (DeviceRole) {}
  rpc ZtpGetDeviceRolesByDeviceId(context.DeviceId) returns (DeviceRoleList) {}
  rpc ZtpAdd(DeviceRole) returns (DeviceRoleState) {}
  rpc ZtpUpdate(DeviceRole) returns (DeviceRoleState) {}
  rpc ZtpUpdate(DeviceRoleConfig) returns (DeviceRoleState) {}
  rpc ZtpDelete(DeviceRole) returns (DeviceRoleState) {}
  rpc ZtpDeleteAll(context.Empty) returns (DeviceDeletionResult) {}
}
@@ -43,6 +43,11 @@ message DeviceRole {
  DeviceRoleType devRoleType = 2;
}

message DeviceRoleConfig {
  DeviceRole devRole = 1;
  context.DeviceConfig devConfig = 2;
}

message DeviceRoleList {
  repeated DeviceRole devRole = 1;
}
+17 −13
Original line number Diff line number Diff line
@@ -17,9 +17,12 @@
package eu.teraflow.automation;

import automation.Automation;
import automation.Automation.DeviceRoleConfig;
import automation.Automation.DeviceRoleState;
import context.ContextOuterClass;
import eu.teraflow.automation.context.model.Device;
import eu.teraflow.automation.model.DeviceRoleId;
import eu.teraflow.automation.model.DeviceState;
import io.quarkus.grpc.GrpcService;
import io.smallrye.mutiny.Uni;
import javax.inject.Inject;
@@ -56,17 +59,19 @@ public class AutomationGatewayImpl implements AutomationGateway {
        return automationService
                .addDevice(deviceId)
                .onItem()
                .transform(device -> transformToDeviceRoleState(device, devRoleId));
                .transform(device -> transformToDeviceRoleState(device, devRoleId, DeviceState.CREATED));
    }

    @Override
    public Uni<Automation.DeviceRoleState> ztpUpdate(Automation.DeviceRole request) {
        return Uni.createFrom()
                .item(
                        () ->
                                Automation.DeviceRoleState.newBuilder()
                                        .setDevRoleId(request.getDevRoleId())
                                        .build());
    public Uni<DeviceRoleState> ztpUpdate(DeviceRoleConfig request) {
        final var devRoleId = request.getDevRole().getDevRoleId().getDevRoleId().getUuid();
        final var deviceId = serializer.deserialize(request.getDevRole().getDevRoleId().getDevId());
        final var deviceConfig = serializer.deserialize(request.getDevConfig());

        return automationService
                .updateDevice(deviceId, deviceConfig)
                .onItem()
                .transform(device -> transformToDeviceRoleState(device, devRoleId, DeviceState.UPDATED));
    }

    @Override
@@ -84,16 +89,15 @@ public class AutomationGatewayImpl implements AutomationGateway {
        return Uni.createFrom().item(() -> Automation.DeviceDeletionResult.newBuilder().build());
    }

    // TODO When `DeviceRoleState` domain object will be created, move this method to Serializer class
    // and create related tests
    private Automation.DeviceRoleState transformToDeviceRoleState(Device device, String devRoleId) {

    private Automation.DeviceRoleState transformToDeviceRoleState(
            Device device, String devRoleId, DeviceState deviceState) {
        final var deviceRoleId = new DeviceRoleId(devRoleId, device.getDeviceId());
        final var serializeDeviceRoleId = serializer.serialize(deviceRoleId);
        final var serializedDeviceState = serializer.serialize(deviceState);

        return Automation.DeviceRoleState.newBuilder()
                .setDevRoleId(serializeDeviceRoleId)
                .setDevRoleState(Automation.ZtpDeviceState.ZTP_DEV_STATE_CREATED)
                .setDevRoleState(serializedDeviceState)
                .build();
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package eu.teraflow.automation;

import eu.teraflow.automation.context.model.Device;
import eu.teraflow.automation.context.model.DeviceConfig;
import io.smallrye.mutiny.Uni;

public interface AutomationService {
@@ -24,4 +25,6 @@ public interface AutomationService {
    Uni<Device> addDevice(String deviceId);

    Uni<Device> deleteDevice(String deviceId);

    Uni<Device> updateDevice(String deviceId, DeviceConfig deviceConfig);
}
+30 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package eu.teraflow.automation;

import eu.teraflow.automation.context.ContextService;
import eu.teraflow.automation.context.model.Device;
import eu.teraflow.automation.context.model.DeviceConfig;
import eu.teraflow.automation.device.DeviceService;
import io.smallrye.mutiny.Uni;
import javax.enterprise.context.ApplicationScoped;
@@ -27,6 +28,7 @@ import org.jboss.logging.Logger;
@ApplicationScoped
public class AutomationServiceImpl implements AutomationService {
    private static final Logger LOGGER = Logger.getLogger(AutomationServiceImpl.class);
    private static final String MESSAGE = "Retrieved %s";

    private final DeviceService deviceService;
    private final ContextService contextService;
@@ -43,14 +45,13 @@ public class AutomationServiceImpl implements AutomationService {
        final var deserializedDeviceUni = contextService.getDevice(deviceId);

        deserializedDeviceUni
                // TODO fix subscribe
                .subscribe()
                .with(
                        device -> {
                            final var id = deviceId;

                            if (!device.isEnabled()) {
                                LOGGER.infof("Retrieved %s", device);
                                LOGGER.infof(MESSAGE, device);

                                final var initialConfiguration =
                                        deviceService.getInitialConfiguration(device.getDeviceId());
@@ -91,7 +92,7 @@ public class AutomationServiceImpl implements AutomationService {
                        device -> {
                            final var id = deviceId;

                            LOGGER.infof("Retrieved %s", device);
                            LOGGER.infof(MESSAGE, device);

                            final var empty = deviceService.deleteDevice(device.getDeviceId());

@@ -102,4 +103,30 @@ public class AutomationServiceImpl implements AutomationService {

        return deserializedDeviceUni;
    }

    @Override
    public Uni<Device> updateDevice(String deviceId, DeviceConfig deviceConfig) {
        final var deserializedDeviceUni = contextService.getDevice(deviceId);

        deserializedDeviceUni
                .subscribe()
                .with(
                        device -> {
                            final var id = deviceId;

                            LOGGER.infof(MESSAGE, device);
                            device.setDeviceConfiguration(deviceConfig);
                            final var updatedDeviceIdUni = deviceService.configureDevice(device);

                            updatedDeviceIdUni
                                    .subscribe()
                                    .with(
                                            configuredDeviceId ->
                                                    LOGGER.infof(
                                                            "Device [%s] has been updated successfully with %s.\n",
                                                            id, deviceConfig));
                        });

        return deserializedDeviceUni;
    }
}
+3 −1
Original line number Diff line number Diff line
@@ -77,8 +77,10 @@ public class ContextSubscriber {
                                    LOGGER.infof("Received %s for device [%s]", event, deviceId);
                                    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().
                                case UNDEFINED:
                                    logWarningMessage(event, deviceId, eventType);
                                    break;
Loading