From c625560cc660ef1694b75134301ca8c18c38bd26 Mon Sep 17 00:00:00 2001 From: hyunjujeong Date: Mon, 4 Sep 2023 11:14:44 +0900 Subject: [PATCH] =?UTF-8?q?-=20Edge=20=EB=94=94=EB=B0=94=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B0=9B=EB=8A=94=20MQTT=20Message=20List?= =?UTF-8?q?ener=20=EB=B6=84=EA=B8=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/BashCommand.java | 9 +++- .../application/CommandInfo.java | 4 +- .../application/CommandInvoker.java | 43 +++++++++++++++++++ .../application/DefaultDeployerService.java | 42 ++---------------- .../application/DeployCommand.java | 27 ++++++++++++ .../application/DeployCommandInvoker.java | 28 ++++++++++++ .../application/DockerCommand.java | 19 ++++++++ .../application/JsonCommand.java | 17 ++++++++ .../application/SystemdCommand.java | 16 +++++++ .../domain/OutboundMessage.java | 4 +- .../presentation/DeployerController.java | 2 +- .../presentation/OutboundMessageResource.java | 5 +-- .../OutboundMessageResourceConverter.java | 1 + 13 files changed, 170 insertions(+), 47 deletions(-) create mode 100644 src/main/java/inc/sdt/blokworks/devicedeployer/application/CommandInvoker.java create mode 100644 src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployCommand.java create mode 100644 src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployCommandInvoker.java create mode 100644 src/main/java/inc/sdt/blokworks/devicedeployer/application/DockerCommand.java create mode 100644 src/main/java/inc/sdt/blokworks/devicedeployer/application/JsonCommand.java create mode 100644 src/main/java/inc/sdt/blokworks/devicedeployer/application/SystemdCommand.java diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/BashCommand.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/BashCommand.java index 31efdfc..ddf6367 100644 --- a/src/main/java/inc/sdt/blokworks/devicedeployer/application/BashCommand.java +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/BashCommand.java @@ -1,10 +1,15 @@ package inc.sdt.blokworks.devicedeployer.application; +import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage; +import org.springframework.stereotype.Component; + import java.util.LinkedHashMap; +@Component public class BashCommand implements CommandInfo{ @Override - public LinkedHashMap put() { - return null; + public LinkedHashMap put(OutboundMessage message, LinkedHashMap map) { + map.put("cmd", message.getCommand()); + return map; } } diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/CommandInfo.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/CommandInfo.java index 8a04e40..60cf095 100644 --- a/src/main/java/inc/sdt/blokworks/devicedeployer/application/CommandInfo.java +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/CommandInfo.java @@ -1,7 +1,9 @@ package inc.sdt.blokworks.devicedeployer.application; +import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage; + import java.util.LinkedHashMap; public interface CommandInfo { - LinkedHashMap put(); + LinkedHashMap put(OutboundMessage message, LinkedHashMap map); } diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/CommandInvoker.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/CommandInvoker.java new file mode 100644 index 0000000..d69635e --- /dev/null +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/CommandInvoker.java @@ -0,0 +1,43 @@ +package inc.sdt.blokworks.devicedeployer.application; + +import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; + +@Component +public class CommandInvoker { + private final BashCommand bashCommand; + private final SystemdCommand systemdCommand; + private final DockerCommand dockerCommand; + private final JsonCommand jsonCommand; + private final DeployCommandInvoker deployCommandInvoker; + + public CommandInvoker(BashCommand bashCommand, SystemdCommand systemdCommand, DockerCommand dockerCommand, JsonCommand jsonCommand, DeployCommandInvoker deployCommandInvoker) { + this.bashCommand = bashCommand; + this.systemdCommand = systemdCommand; + this.dockerCommand = dockerCommand; + this.jsonCommand = jsonCommand; + this.deployCommandInvoker = deployCommandInvoker; + } + + public LinkedHashMap invoke(OutboundMessage message, LinkedHashMap map) { + switch (message.getCommandType()) { + case bash -> { + return bashCommand.put(message, map); + } + case systemd -> { + return systemdCommand.put(message, map); + } + case docker -> { + return dockerCommand.put(message, map); + } + case deploy -> { + return deployCommandInvoker.invoke(message, map); + } + default -> { + return jsonCommand.put(message, map); + } + } + } +} diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/DefaultDeployerService.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DefaultDeployerService.java index cf241df..d0d5c9f 100644 --- a/src/main/java/inc/sdt/blokworks/devicedeployer/application/DefaultDeployerService.java +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DefaultDeployerService.java @@ -25,55 +25,29 @@ public class DefaultDeployerService implements DeployerService{ private final ObjectMapper objectMapper; private final DeployerRepositoryDelegate deployerRepositoryDelegate; private final DeployRequestRepositoryDelegate requestRepositoryDelegate; - private final String filePath; + private final CommandInvoker commandInvoker; public DefaultDeployerService(IMqttClient mqttClient, ObjectMapper objectMapper, DeployerRepositoryDelegate deployerRepositoryDelegate, DeployRequestRepositoryDelegate requestRepositoryDelegate, - @Value("${stackbase.api.host}") String filePath) { + CommandInvoker commandInvoker) { this.log = LoggerFactory.getLogger(this.getClass()); this.mqttClient = mqttClient; this.objectMapper = objectMapper; this.deployerRepositoryDelegate = deployerRepositoryDelegate; this.requestRepositoryDelegate = requestRepositoryDelegate; - this.filePath = filePath; + this.commandInvoker = commandInvoker; } @Override public void publish(OutboundMessage outboundMessage, String assetCode) { log.info("[publish] deployMessage = {}, assetCode = {}", outboundMessage, assetCode); - final String url = filePath + outboundMessage.getFileId(); final DeviceType deviceType = outboundMessage.getDeviceType(); LinkedHashMap commandInfo = new LinkedHashMap<>(); try { - - switch (outboundMessage.getCommandType()) { - case bash -> commandInfo.put("cmd", outboundMessage.getCommand()); - case systemd -> { - commandInfo.put("cmd", outboundMessage.getCommand()); - commandInfo.put("service", outboundMessage.getName()); - } - case docker -> { - commandInfo.put("cmd", "run"); - commandInfo.put("appName", ""); - commandInfo.put("name", outboundMessage.getName()); - commandInfo.put("image", outboundMessage.getImage()); - commandInfo.put("options", outboundMessage.getOptions()); - } - case deploy -> { - commandInfo.put("cmd", outboundMessage.getCommand()); - commandInfo.put("appName", outboundMessage.getName()); - commandInfo.put("fileUrl", url); - commandInfo.put("fileType", outboundMessage.getFileType()); - } - case json -> { - commandInfo.put("cmd", String.valueOf(outboundMessage.getCommandType())); - commandInfo.put("appName", outboundMessage.getName()); - commandInfo.put("parameter", outboundMessage.getParameters()); - } - } + commandInfo = commandInvoker.invoke(outboundMessage, commandInfo); OutboundMessagePayload payload = new OutboundMessagePayload( commandInfo, @@ -121,12 +95,4 @@ public class DefaultDeployerService implements DeployerService{ return deployerRepositoryDelegate.findAllByAssetCode(assetCode, page, size); } - private String convertToJson(Object obj) { - try { - return objectMapper.writeValueAsString(obj); - }catch (JsonProcessingException e) { - throw new IllegalArgumentException(); - } - } - } diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployCommand.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployCommand.java new file mode 100644 index 0000000..fb0d1af --- /dev/null +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployCommand.java @@ -0,0 +1,27 @@ +package inc.sdt.blokworks.devicedeployer.application; + +import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; + +@Component +public class DeployCommand implements CommandInfo { + private final String filePath; + + public DeployCommand(@Value("${stackbase.api.host}") String filePath) { + this.filePath = filePath; + } + + @Override + public LinkedHashMap put(OutboundMessage message, LinkedHashMap map) { + final String url = filePath + message.getFileId(); + map.put("cmd", message.getCommand()); + map.put("appName", message.getAppName()); + map.put("name", message.getName()); + map.put("fileUrl", url); + map.put("fileType", message.getFileType()); + return map; + } +} diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployCommandInvoker.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployCommandInvoker.java new file mode 100644 index 0000000..5f53f1d --- /dev/null +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DeployCommandInvoker.java @@ -0,0 +1,28 @@ +package inc.sdt.blokworks.devicedeployer.application; + +import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; + +@Component +public class DeployCommandInvoker { + private final DockerCommand dockerCommand; + private final DeployCommand deployCommand; + + public DeployCommandInvoker(DockerCommand dockerCommand, DeployCommand deployCommand) { + this.dockerCommand = dockerCommand; + this.deployCommand = deployCommand; + } + + public LinkedHashMap invoke(OutboundMessage message, LinkedHashMap map) { + switch (message.getSubCommandType()) { + case systemd -> { + return deployCommand.put(message, map); + } + default -> { + return dockerCommand.put(message, map); + } + } + } +} diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/DockerCommand.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DockerCommand.java new file mode 100644 index 0000000..30f6441 --- /dev/null +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/DockerCommand.java @@ -0,0 +1,19 @@ +package inc.sdt.blokworks.devicedeployer.application; + +import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; + +@Component +public class DockerCommand implements CommandInfo { + + @Override + public LinkedHashMap put(OutboundMessage message, LinkedHashMap map) { + map.put("cmd", message.getCommand()); + map.put("name", message.getName()); // container 이름 + map.put("image", message.getImage()); + map.put("options", message.getOptions()); + return map; + } +} diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/JsonCommand.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/JsonCommand.java new file mode 100644 index 0000000..8eea938 --- /dev/null +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/JsonCommand.java @@ -0,0 +1,17 @@ +package inc.sdt.blokworks.devicedeployer.application; + +import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; + +@Component +public class JsonCommand implements CommandInfo { + @Override + public LinkedHashMap put(OutboundMessage message, LinkedHashMap map) { + map.put("cmd", String.valueOf(message.getCommandType())); + map.put("appName", message.getAppName()); + map.put("parameter", message.getParameters()); + return map; + } +} diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/application/SystemdCommand.java b/src/main/java/inc/sdt/blokworks/devicedeployer/application/SystemdCommand.java new file mode 100644 index 0000000..dd6118c --- /dev/null +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/application/SystemdCommand.java @@ -0,0 +1,16 @@ +package inc.sdt.blokworks.devicedeployer.application; + +import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; + +@Component +public class SystemdCommand implements CommandInfo { + @Override + public LinkedHashMap put(OutboundMessage message, LinkedHashMap map) { + map.put("cmd", message.getCommand()); + map.put("service", message.getAppName()); + return map; + } +} diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/domain/OutboundMessage.java b/src/main/java/inc/sdt/blokworks/devicedeployer/domain/OutboundMessage.java index a4266c6..4b9888d 100644 --- a/src/main/java/inc/sdt/blokworks/devicedeployer/domain/OutboundMessage.java +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/domain/OutboundMessage.java @@ -5,8 +5,8 @@ import java.util.LinkedHashMap; public class OutboundMessage { private String fileId; private String fileType; - private String appName; - private String name; + private String appName; // 사용자가 정한 파일 이름 + private String name; // stackbase 에 저장된 파일 이름 private String image; private LinkedHashMap options; private String command; diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/DeployerController.java b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/DeployerController.java index d9868eb..27ceec9 100644 --- a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/DeployerController.java +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/DeployerController.java @@ -39,7 +39,7 @@ public class DeployerController { @ResponseStatus(HttpStatus.CREATED) @PostMapping("/assets/{assetCode}/apps") public void deploy(@PathVariable String assetCode, - @Valid @RequestBody OutboundMessageResource resource) { + @RequestBody OutboundMessageResource resource) { log.info("[deploy] assetCode = {}, resource = {}", assetCode, resource); String requestId = UUID.randomUUID().toString(); OutboundMessage outboundMessage = outboundMessageResourceConverter.fromResource(resource); diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/OutboundMessageResource.java b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/OutboundMessageResource.java index 4d71997..6fa4e54 100644 --- a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/OutboundMessageResource.java +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/OutboundMessageResource.java @@ -8,11 +8,10 @@ import org.wildfly.common.annotation.NotNull; import java.util.LinkedHashMap; record OutboundMessageResource( - @NotNull String fileId, String fileType, - @NotNull - String name, + String appName, // 사용자가 정한 파일 이름 + String name, // stackbase 에 저장된 파일 이름 String image, String command, DeviceType deviceType, diff --git a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/OutboundMessageResourceConverter.java b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/OutboundMessageResourceConverter.java index 243eff8..94ee875 100644 --- a/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/OutboundMessageResourceConverter.java +++ b/src/main/java/inc/sdt/blokworks/devicedeployer/presentation/OutboundMessageResourceConverter.java @@ -13,6 +13,7 @@ public class OutboundMessageResourceConverter { return OutboundMessage.builder() .fileId(resource.fileId()) .fileType(resource.fileType()) + .appName(resource.appName() == null ? "" : resource.appName()) .name(resource.name()) .image(resource.image() == null ? "" : resource.image()) .command(resource.command())