From 06c6c5932cd08c5645fb57f5f6a57fe9977272f6 Mon Sep 17 00:00:00 2001 From: Avgustin Marinov Date: Thu, 11 Apr 2024 16:39:31 +0300 Subject: [PATCH] SDK DMF Support - added demo (#1710) Signed-off-by: Marinov Avgustin --- hawkbit-sdk/hawkbit-sdk-demo/pom.xml | 5 + .../eclipse/hawkbit/sdk/demo/dmf/DmfApp.java | 101 ++++++++++++++++++ .../sdk/demo/multidevice/MultiDeviceApp.java | 2 +- .../eclipse/hawkbit/sdk/dmf/amqp/Amqp.java | 12 ++- 4 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 hawkbit-sdk/hawkbit-sdk-demo/src/main/java/org/eclipse/hawkbit/sdk/demo/dmf/DmfApp.java diff --git a/hawkbit-sdk/hawkbit-sdk-demo/pom.xml b/hawkbit-sdk/hawkbit-sdk-demo/pom.xml index 7b229a2f2..55559acb7 100644 --- a/hawkbit-sdk/hawkbit-sdk-demo/pom.xml +++ b/hawkbit-sdk/hawkbit-sdk-demo/pom.xml @@ -35,6 +35,11 @@ hawkbit-sdk-device ${project.version} + + org.eclipse.hawkbit + hawkbit-sdk-dmf + ${project.version} + org.eclipse.hawkbit hawkbit-mgmt-api diff --git a/hawkbit-sdk/hawkbit-sdk-demo/src/main/java/org/eclipse/hawkbit/sdk/demo/dmf/DmfApp.java b/hawkbit-sdk/hawkbit-sdk-demo/src/main/java/org/eclipse/hawkbit/sdk/demo/dmf/DmfApp.java new file mode 100644 index 000000000..6cad05284 --- /dev/null +++ b/hawkbit-sdk/hawkbit-sdk-demo/src/main/java/org/eclipse/hawkbit/sdk/demo/dmf/DmfApp.java @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2024 Bosch.IO GmbH and others + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.hawkbit.sdk.demo.dmf; + +import lombok.extern.slf4j.Slf4j; +import org.eclipse.hawkbit.sdk.Controller; +import org.eclipse.hawkbit.sdk.Tenant; +import org.eclipse.hawkbit.sdk.dmf.DmfController; +import org.eclipse.hawkbit.sdk.dmf.DmfTenant; +import org.eclipse.hawkbit.sdk.dmf.UpdateHandler; +import org.eclipse.hawkbit.sdk.dmf.amqp.Amqp; +import org.eclipse.hawkbit.sdk.dmf.amqp.AmqpProperties; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.amqp.RabbitProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.shell.standard.ShellComponent; +import org.springframework.shell.standard.ShellMethod; +import org.springframework.shell.standard.ShellOption; + +import java.util.Optional; + +/** + * Abstract class representing DDI device connecting directly to hawkVit. + */ +@Slf4j +@EnableConfigurationProperties({ RabbitProperties.class, AmqpProperties.class }) +@SpringBootApplication +public class DmfApp { + + public static void main(String[] args) { + SpringApplication.run(DmfApp.class, args); + } + + @Bean + Amqp amqp(final RabbitProperties rabbitProperties, final AmqpProperties amqpProperties) { + return new Amqp(rabbitProperties, amqpProperties); + } + + @ShellComponent + public static class Shell { + + private final UpdateHandler updateHandler; + private final DmfTenant dmfTenant; + + Shell(final Tenant tenant, final Optional updateHandler, final Amqp amqp) { + this.updateHandler = updateHandler.orElse(null); + dmfTenant = new DmfTenant(tenant, amqp); + } + + @ShellMethod(key = "start-one") + public void startOne(@ShellOption("--id") final String controllerId) { + if (dmfTenant.getController(controllerId).isEmpty()) { + dmfTenant.create( + Controller.builder().controllerId(controllerId).build(), + updateHandler).connect(); + } + } + + @ShellMethod(key = "stop-one") + public void stopOne(@ShellOption("--id") final String controllerId) { + dmfTenant.getController(controllerId).ifPresentOrElse( + DmfController::stop, + () -> { + throw new IllegalArgumentException("Controller with id " + controllerId + " not found!"); + }); + } + + @ShellMethod(key = "start") + public void start( + @ShellOption(value = "--prefix", defaultValue = "") final String prefix, + @ShellOption(value = "--offset", defaultValue = "0") final int offset, + @ShellOption(value = "--count") final int count) { + for (int i = 0; i < count; i++) { + startOne(toId(prefix, offset + i)); + } + } + + @ShellMethod(key = "stop") + public void stop( + @ShellOption(value = "--prefix", defaultValue = "") final String prefix, + @ShellOption(value = "--offset", defaultValue = "0") final int offset, + @ShellOption(value = "--count") final int count) { + for (int i = 0; i < count; i++) { + stopOne(toId(prefix, offset + i)); + } + } + + private static String toId(final String prefix, final int index) { + return String.format("%s%03d", prefix, index); + } + } +} \ No newline at end of file diff --git a/hawkbit-sdk/hawkbit-sdk-demo/src/main/java/org/eclipse/hawkbit/sdk/demo/multidevice/MultiDeviceApp.java b/hawkbit-sdk/hawkbit-sdk-demo/src/main/java/org/eclipse/hawkbit/sdk/demo/multidevice/MultiDeviceApp.java index 81fd9d57b..65ebc876c 100644 --- a/hawkbit-sdk/hawkbit-sdk-demo/src/main/java/org/eclipse/hawkbit/sdk/demo/multidevice/MultiDeviceApp.java +++ b/hawkbit-sdk/hawkbit-sdk-demo/src/main/java/org/eclipse/hawkbit/sdk/demo/multidevice/MultiDeviceApp.java @@ -140,4 +140,4 @@ public class MultiDeviceApp { return String.format("%s%03d", prefix, index); } } -} +} \ No newline at end of file diff --git a/hawkbit-sdk/hawkbit-sdk-dmf/src/main/java/org/eclipse/hawkbit/sdk/dmf/amqp/Amqp.java b/hawkbit-sdk/hawkbit-sdk-dmf/src/main/java/org/eclipse/hawkbit/sdk/dmf/amqp/Amqp.java index 300264965..82bc1e48f 100644 --- a/hawkbit-sdk/hawkbit-sdk-dmf/src/main/java/org/eclipse/hawkbit/sdk/dmf/amqp/Amqp.java +++ b/hawkbit-sdk/hawkbit-sdk-dmf/src/main/java/org/eclipse/hawkbit/sdk/dmf/amqp/Amqp.java @@ -11,6 +11,7 @@ package org.eclipse.hawkbit.sdk.dmf.amqp; import lombok.extern.slf4j.Slf4j; import org.eclipse.hawkbit.sdk.Tenant; +import org.eclipse.hawkbit.sdk.Tenant.DMF; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.boot.autoconfigure.amqp.RabbitProperties; @@ -37,16 +38,17 @@ public class Amqp { vHosts.values().forEach(VHost::stop); } - public VHost getVhost(final Tenant.DMF dmf) { - final String vHost = ObjectUtils.isEmpty(dmf.getVirtualHost()) ? - rabbitProperties.getVirtualHost() : dmf.getVirtualHost(); + public VHost getVhost(final DMF dmf) { + final String vHost = dmf == null || ObjectUtils.isEmpty(dmf.getVirtualHost()) ? + (rabbitProperties.getVirtualHost() == null ? "/" :rabbitProperties.getVirtualHost()) : + dmf.getVirtualHost(); return vHosts.computeIfAbsent(vHost, vh -> { final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(rabbitProperties.getHost()); connectionFactory.setUsername( - ObjectUtils.isEmpty(dmf.getUsername()) ? + dmf == null || ObjectUtils.isEmpty(dmf.getUsername()) ? rabbitProperties.getUsername() : dmf.getUsername()); connectionFactory.setPassword( - ObjectUtils.isEmpty(dmf.getPassword()) ? + dmf == null || ObjectUtils.isEmpty(dmf.getPassword()) ? rabbitProperties.getPassword() : dmf.getPassword()); connectionFactory.setVirtualHost(vHost); return new VHost(connectionFactory, amqpProperties);