parent
02bb5611f4
commit
59cb705c10
|
@ -3,7 +3,7 @@ package inc.sdt.blokworks.devicedeployer.application;
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
|
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.DeployMessage;
|
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.OperationType;
|
import inc.sdt.blokworks.devicedeployer.domain.OperationType;
|
||||||
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundDeployMessagePayload;
|
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundDeployMessagePayload;
|
||||||
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.OutboundMessagePayload;
|
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.OutboundMessagePayload;
|
||||||
|
@ -12,6 +12,7 @@ import org.eclipse.paho.client.mqttv3.MqttException;
|
||||||
import org.eclipse.paho.client.mqttv3.MqttMessage;
|
import org.eclipse.paho.client.mqttv3.MqttMessage;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
@ -32,15 +33,14 @@ public class DefaultDeployerService implements DeployerService{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void publish(DeployMessage deployMessage, String assetCode) {
|
public void publish(OutboundMessage deployMessage, String assetCode) {
|
||||||
log.info("[publish]");
|
log.info("[publish]");
|
||||||
try {
|
try {
|
||||||
OutboundMessagePayload payload = new OutboundMessagePayload(
|
OutboundMessagePayload payload = new OutboundMessagePayload(
|
||||||
deployMessage.getUrl(),
|
deployMessage.getUrl(),
|
||||||
deployMessage.getName(),
|
deployMessage.getName(),
|
||||||
deployMessage.getPorts(),
|
|
||||||
deployMessage.getEnv(),
|
|
||||||
deployMessage.getCommand(),
|
deployMessage.getCommand(),
|
||||||
|
deployMessage.getEnv(),
|
||||||
OperationType.DEPLOY,
|
OperationType.DEPLOY,
|
||||||
deployMessage.getRequestId()
|
deployMessage.getRequestId()
|
||||||
);
|
);
|
||||||
|
@ -59,10 +59,18 @@ public class DefaultDeployerService implements DeployerService{
|
||||||
public Mono<Void> apply(InboundDeployMessagePayload inboundDeployMessagePayload) {
|
public Mono<Void> apply(InboundDeployMessagePayload inboundDeployMessagePayload) {
|
||||||
log.info("[apply] inboundDeployMessagePayload = {}", inboundDeployMessagePayload);
|
log.info("[apply] inboundDeployMessagePayload = {}", inboundDeployMessagePayload);
|
||||||
// 배포된 앱 정보 저장
|
// 배포된 앱 정보 저장
|
||||||
deployerRepositoryDelegate.save(fromMessage(inboundDeployMessagePayload));
|
// request Id 판별
|
||||||
|
|
||||||
|
AssetApp assetApp = deployerRepositoryDelegate.save(fromMessage(inboundDeployMessagePayload));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Page<AssetApp> getAll(String assetCode, int page, int size) {
|
||||||
|
log.debug("[getAll] assetCode = {}, page = {}, size = {}", assetCode, page, size);
|
||||||
|
return deployerRepositoryDelegate.findAllByAssetCode(assetCode, page, size);
|
||||||
|
}
|
||||||
|
|
||||||
private AssetApp fromMessage(InboundDeployMessagePayload payload) {
|
private AssetApp fromMessage(InboundDeployMessagePayload payload) {
|
||||||
return AssetApp.builder()
|
return AssetApp.builder()
|
||||||
.assetCode(payload.assetCode())
|
.assetCode(payload.assetCode())
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.application;
|
package inc.sdt.blokworks.devicedeployer.application;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
|
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.DeployMessage;
|
import org.springframework.data.domain.Page;
|
||||||
|
|
||||||
public interface DeployerRepositoryDelegate {
|
public interface DeployerRepositoryDelegate {
|
||||||
AssetApp save(AssetApp assetApp);
|
AssetApp save(AssetApp assetApp);
|
||||||
|
Page<AssetApp> findAllByAssetCode(String assetCode, int page, int size);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.application;
|
package inc.sdt.blokworks.devicedeployer.application;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.DeployMessage;
|
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
|
||||||
|
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
||||||
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundDeployMessagePayload;
|
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundDeployMessagePayload;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
public interface DeployerService extends Function<InboundDeployMessagePayload, Mono<Void>> {
|
public interface DeployerService extends Function<InboundDeployMessagePayload, Mono<Void>> {
|
||||||
void publish(DeployMessage assetApp, String assetCode);
|
void publish(OutboundMessage assetApp, String assetCode);
|
||||||
|
Page<AssetApp> getAll(String assetCode, int page, int size);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.domain;
|
package inc.sdt.blokworks.devicedeployer.domain;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
|
||||||
|
|
||||||
public class AssetApp {
|
public class AssetApp {
|
||||||
private String assetCode;
|
private String assetCode;
|
||||||
private String name;
|
private String name;
|
||||||
|
|
|
@ -3,16 +3,15 @@ package inc.sdt.blokworks.devicedeployer.domain;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class DeployMessage {
|
public class OutboundMessage {
|
||||||
private String url;
|
private String url;
|
||||||
private String name;
|
private String name;
|
||||||
private Set<Port> ports;
|
|
||||||
private HashMap<String, String> env;
|
private HashMap<String, String> env;
|
||||||
private String command;
|
private String command;
|
||||||
private OperationType operationType;
|
private OperationType operationType;
|
||||||
private String requestId;
|
private String requestId;
|
||||||
|
|
||||||
protected DeployMessage() {}
|
protected OutboundMessage() {}
|
||||||
|
|
||||||
public String getUrl() {
|
public String getUrl() {
|
||||||
return url;
|
return url;
|
||||||
|
@ -22,10 +21,6 @@ public class DeployMessage {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Port> getPorts() {
|
|
||||||
return ports;
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashMap<String, String> getEnv() {
|
public HashMap<String, String> getEnv() {
|
||||||
return env;
|
return env;
|
||||||
}
|
}
|
||||||
|
@ -51,7 +46,6 @@ public class DeployMessage {
|
||||||
return "AssetApp{" +
|
return "AssetApp{" +
|
||||||
"url='" + url + '\'' +
|
"url='" + url + '\'' +
|
||||||
", name='" + name + '\'' +
|
", name='" + name + '\'' +
|
||||||
", ports=" + ports +
|
|
||||||
", env=" + env +
|
", env=" + env +
|
||||||
", command='" + command + '\'' +
|
", command='" + command + '\'' +
|
||||||
", operationType=" + operationType +
|
", operationType=" + operationType +
|
||||||
|
@ -66,7 +60,6 @@ public class DeployMessage {
|
||||||
public static final class Builder {
|
public static final class Builder {
|
||||||
private String url;
|
private String url;
|
||||||
private String name;
|
private String name;
|
||||||
private Set<Port> ports;
|
|
||||||
private HashMap<String, String> env;
|
private HashMap<String, String> env;
|
||||||
private String command;
|
private String command;
|
||||||
private OperationType operationType;
|
private OperationType operationType;
|
||||||
|
@ -82,11 +75,6 @@ public class DeployMessage {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder ports(Set<Port> ports) {
|
|
||||||
this.ports = ports;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder env(HashMap<String, String> env) {
|
public Builder env(HashMap<String, String> env) {
|
||||||
this.env = env;
|
this.env = env;
|
||||||
return this;
|
return this;
|
||||||
|
@ -107,11 +95,10 @@ public class DeployMessage {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DeployMessage build() {
|
public OutboundMessage build() {
|
||||||
DeployMessage deployMessage = new DeployMessage();
|
OutboundMessage deployMessage = new OutboundMessage();
|
||||||
deployMessage.url = this.url;
|
deployMessage.url = this.url;
|
||||||
deployMessage.name = this.name;
|
deployMessage.name = this.name;
|
||||||
deployMessage.ports = this.ports;
|
|
||||||
deployMessage.env = this.env;
|
deployMessage.env = this.env;
|
||||||
deployMessage.command = this.command;
|
deployMessage.command = this.command;
|
||||||
deployMessage.operationType = this.operationType;
|
deployMessage.operationType = this.operationType;
|
|
@ -8,6 +8,7 @@ public record InboundDeployMessagePayload(
|
||||||
String name,
|
String name,
|
||||||
Long size,
|
Long size,
|
||||||
Long releasedAt,
|
Long releasedAt,
|
||||||
Long modifiedAt
|
Long modifiedAt,
|
||||||
|
String requestId
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,8 @@ import java.util.Set;
|
||||||
public record OutboundMessagePayload(
|
public record OutboundMessagePayload(
|
||||||
String url,
|
String url,
|
||||||
String name,
|
String name,
|
||||||
Set<Port> ports,
|
|
||||||
HashMap<String, String> env,
|
|
||||||
String command,
|
String command,
|
||||||
|
HashMap<String, String> env,
|
||||||
OperationType operationType,
|
OperationType operationType,
|
||||||
String requestId
|
String requestId
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -23,8 +23,7 @@ class AssetAppEntity {
|
||||||
|
|
||||||
protected AssetAppEntity() {}
|
protected AssetAppEntity() {}
|
||||||
|
|
||||||
public AssetAppEntity(String id, String assetCode, String name, long size, Long releasedAt, Long modifiedAt) {
|
public AssetAppEntity(String assetCode, String name, long size, Long releasedAt, Long modifiedAt) {
|
||||||
this.id = id;
|
|
||||||
this.assetCode = assetCode;
|
this.assetCode = assetCode;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.size = size;
|
this.size = size;
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.infrastructure.relational;
|
package inc.sdt.blokworks.devicedeployer.infrastructure.relational;
|
||||||
|
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
public interface AssetAppJpaRepository extends JpaRepository<AssetAppEntity, String> {
|
public interface AssetAppJpaRepository extends JpaRepository<AssetAppEntity, String> {
|
||||||
|
Page<AssetAppEntity> findAllByAssetCode(String assetCode, Pageable pageable);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,12 @@ package inc.sdt.blokworks.devicedeployer.infrastructure.relational;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.application.DeployerRepositoryDelegate;
|
import inc.sdt.blokworks.devicedeployer.application.DeployerRepositoryDelegate;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
|
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.DeployMessage;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.PageRequest;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.data.domain.Sort;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
|
@ -17,10 +20,40 @@ public class AssetAppRelationalRepository implements DeployerRepositoryDelegate
|
||||||
this.assetAppJpaRepository = assetAppJpaRepository;
|
this.assetAppJpaRepository = assetAppJpaRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 앱 정보 저장
|
||||||
@Override
|
@Override
|
||||||
public AssetApp save(AssetApp deployMessage) {
|
public AssetApp save(AssetApp assetApp) {
|
||||||
|
AssetAppEntity entity = this.toEntity(assetApp);
|
||||||
|
assetAppJpaRepository.save(entity);
|
||||||
|
return assetApp;
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
@Override
|
||||||
|
public Page<AssetApp> findAllByAssetCode(String assetCode, int page, int size) {
|
||||||
|
log.debug("[findAllByAssetCode] assetCode = {}", assetCode);
|
||||||
|
Pageable pageable = page < 0 ? Pageable.unpaged() : PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "releasedAt"));
|
||||||
|
return assetAppJpaRepository.findAllByAssetCode(assetCode, pageable)
|
||||||
|
.map(this::fromEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
private AssetAppEntity toEntity(AssetApp assetApp) {
|
||||||
|
return new AssetAppEntity(
|
||||||
|
assetApp.getAssetCode(),
|
||||||
|
assetApp.getName(),
|
||||||
|
assetApp.getSize(),
|
||||||
|
assetApp.getReleaseAt(),
|
||||||
|
assetApp.getModifiedAt()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private AssetApp fromEntity(AssetAppEntity entity) {
|
||||||
|
return AssetApp.builder()
|
||||||
|
.assetCode(entity.getAssetCode())
|
||||||
|
.name(entity.getName())
|
||||||
|
.size(entity.getSize())
|
||||||
|
.releasedAt(entity.getReleasedAt())
|
||||||
|
.modifiedAt(entity.getModifiedAt())
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,10 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.presentation;
|
package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
import org.wildfly.common.annotation.NotNull;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
record AssetAppResource(
|
record AssetAppResource(
|
||||||
@NotNull
|
String assetCode,
|
||||||
String url,
|
|
||||||
@NotNull
|
|
||||||
String name,
|
String name,
|
||||||
Set<PortResource> ports,
|
Long size,
|
||||||
HashMap<String, String> env,
|
Long releaseAt,
|
||||||
String command
|
Long modifiedAt
|
||||||
) {
|
) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,41 +1,28 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.presentation;
|
package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.DeployMessage;
|
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class AssetAppResourceConverter {
|
public class AssetAppResourceConverter {
|
||||||
private final PortResourceConverter portResourceConverter;
|
|
||||||
|
|
||||||
public AssetAppResourceConverter(PortResourceConverter portResourceConverter) {
|
public AssetApp fromResource(AssetAppResource resource) {
|
||||||
this.portResourceConverter = portResourceConverter;
|
return AssetApp.builder()
|
||||||
|
.assetCode(resource.assetCode())
|
||||||
|
.name(resource.name())
|
||||||
|
.size(resource.size())
|
||||||
|
.releasedAt(resource.releaseAt())
|
||||||
|
.modifiedAt(resource.modifiedAt())
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public AssetAppResource toResource(DeployMessage deployMessage) {
|
public AssetAppResource toResource(AssetApp assetApp) {
|
||||||
return new AssetAppResource(
|
return new AssetAppResource(
|
||||||
deployMessage.getUrl(),
|
assetApp.getAssetCode(),
|
||||||
deployMessage.getName(),
|
assetApp.getName(),
|
||||||
deployMessage.getPorts() != null
|
assetApp.getSize(),
|
||||||
? deployMessage.getPorts().stream().map(portResourceConverter::toResource).collect(Collectors.toSet())
|
assetApp.getReleaseAt(),
|
||||||
: null,
|
assetApp.getModifiedAt()
|
||||||
deployMessage.getEnv(),
|
|
||||||
deployMessage.getCommand()
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DeployMessage fromResource(AssetAppResource resource) {
|
|
||||||
return DeployMessage.builder()
|
|
||||||
.url(resource.url())
|
|
||||||
.name(resource.name())
|
|
||||||
.ports(resource.ports() != null
|
|
||||||
? resource.ports().stream().map(portResourceConverter::fromResource).collect(Collectors.toSet())
|
|
||||||
: new HashSet<>())
|
|
||||||
.env(resource.env())
|
|
||||||
.command(resource.command())
|
|
||||||
.build();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,33 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.presentation;
|
package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.application.DeployerService;
|
import inc.sdt.blokworks.devicedeployer.application.DeployerService;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.DeployMessage;
|
import inc.sdt.blokworks.devicedeployer.domain.AssetApp;
|
||||||
|
import inc.sdt.blokworks.devicedeployer.domain.OperationType;
|
||||||
|
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
||||||
|
import jakarta.servlet.http.HttpSession;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
public class DeployerController {
|
public class DeployerController {
|
||||||
private final Logger log;
|
private final Logger log;
|
||||||
private final DeployerService deployerService;
|
private final DeployerService deployerService;
|
||||||
private final AssetAppResourceConverter appResourceConverter;
|
private final OutboundMessageResourceConverter outboundMessageResourceConverter;
|
||||||
|
private final AssetAppResourceConverter assetAppResourceConverter;
|
||||||
|
|
||||||
public DeployerController(DeployerService deployerService,
|
public DeployerController(DeployerService deployerService,
|
||||||
AssetAppResourceConverter appResourceConverter) {
|
OutboundMessageResourceConverter outboundMessageResourceConverter,
|
||||||
|
AssetAppResourceConverter assetAppResourceConverter) {
|
||||||
this.log = LoggerFactory.getLogger(this.getClass());
|
this.log = LoggerFactory.getLogger(this.getClass());
|
||||||
this.deployerService = deployerService;
|
this.deployerService = deployerService;
|
||||||
this.appResourceConverter = appResourceConverter;
|
this.outboundMessageResourceConverter = outboundMessageResourceConverter;
|
||||||
|
this.assetAppResourceConverter = assetAppResourceConverter;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -29,20 +38,24 @@ public class DeployerController {
|
||||||
@ResponseStatus(HttpStatus.CREATED)
|
@ResponseStatus(HttpStatus.CREATED)
|
||||||
@PostMapping("/assets/{assetCode}/apps")
|
@PostMapping("/assets/{assetCode}/apps")
|
||||||
public void deploy(@PathVariable String assetCode,
|
public void deploy(@PathVariable String assetCode,
|
||||||
@Valid @RequestBody AssetAppResource assetAppResource) {
|
@Valid @RequestBody OutboundMessageResource assetAppResource) {
|
||||||
log.info("[deploy] assetCode = {}, assetAppResource = {}", assetCode, assetAppResource);
|
log.info("[deploy] assetCode = {}, assetAppResource = {}", assetCode, assetAppResource);
|
||||||
DeployMessage deployMessage = appResourceConverter.fromResource(assetAppResource);
|
OutboundMessage outboundMessage = outboundMessageResourceConverter.fromResource(assetAppResource);
|
||||||
deployMessage.setRequestId("requestId");
|
outboundMessage.setRequestId("requestId");
|
||||||
deployerService.publish(appResourceConverter.fromResource(assetAppResource), assetCode);
|
deployerService.publish(outboundMessageResourceConverter.fromResource(assetAppResource), assetCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 배포된 앱 정보 조회
|
* 배포된 앱 정보 조회 (페이지 조회)
|
||||||
* @param assetCode 자산 코드
|
* @param assetCode 자산 코드
|
||||||
*/
|
*/
|
||||||
@ResponseStatus(HttpStatus.OK)
|
@ResponseStatus(HttpStatus.OK)
|
||||||
@GetMapping("/assets/{assetCode}/apps")
|
@GetMapping("/assets/{assetCode}/apps")
|
||||||
public void get(@PathVariable String assetCode) {
|
public PageableResponse<AssetAppResource> get(@PathVariable String assetCode,
|
||||||
log.info("[get] assetCode = {}", assetCode);
|
@RequestParam(required = false, defaultValue = "0") int page,
|
||||||
|
@RequestParam(required = false, defaultValue = "20") int size) {
|
||||||
|
log.info("[get] assetCode = {}, page = {}, size = {}", assetCode, page, size);
|
||||||
|
Page<AssetApp> assetApps = deployerService.getAll(assetCode, page, size);
|
||||||
|
return PageableResponse.from(assetApps, assetAppResourceConverter::toResource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.presentation;
|
package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import inc.sdt.blokworks.devicedeployer.application.DeployerService;
|
import inc.sdt.blokworks.devicedeployer.application.DeployerService;
|
||||||
import inc.sdt.blokworks.devicedeployer.application.ProcessService;
|
import inc.sdt.blokworks.devicedeployer.application.ProcessService;
|
||||||
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundDeployMessagePayload;
|
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundDeployMessagePayload;
|
||||||
|
@ -8,6 +9,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.integration.annotation.MessageEndpoint;
|
import org.springframework.integration.annotation.MessageEndpoint;
|
||||||
import org.springframework.integration.annotation.ServiceActivator;
|
import org.springframework.integration.annotation.ServiceActivator;
|
||||||
|
import org.springframework.integration.mqtt.support.MqttHeaders;
|
||||||
import org.springframework.messaging.Message;
|
import org.springframework.messaging.Message;
|
||||||
|
|
||||||
@MessageEndpoint
|
@MessageEndpoint
|
||||||
|
@ -15,16 +17,19 @@ public class MqttMessageHandler {
|
||||||
private final Logger log;
|
private final Logger log;
|
||||||
private final DeployerService deployerService;
|
private final DeployerService deployerService;
|
||||||
private final ProcessService processService;
|
private final ProcessService processService;
|
||||||
|
private final ObjectMapper objectMapper;
|
||||||
private final MqttMessageConverter<InboundDeployMessagePayload> deployMessagePayloadConverter;
|
private final MqttMessageConverter<InboundDeployMessagePayload> deployMessagePayloadConverter;
|
||||||
private final MqttMessageConverter<InboundProcessMessagePayload> processMessagePayloadConverter;
|
private final MqttMessageConverter<InboundProcessMessagePayload> processMessagePayloadConverter;
|
||||||
|
|
||||||
public MqttMessageHandler(DeployerService deployerService,
|
public MqttMessageHandler(DeployerService deployerService,
|
||||||
ProcessService processService,
|
ProcessService processService,
|
||||||
|
ObjectMapper objectMapper,
|
||||||
MqttMessageConverter<InboundDeployMessagePayload> deployMessagePayloadConverter,
|
MqttMessageConverter<InboundDeployMessagePayload> deployMessagePayloadConverter,
|
||||||
MqttMessageConverter<InboundProcessMessagePayload> processMessagePayloadConverter) {
|
MqttMessageConverter<InboundProcessMessagePayload> processMessagePayloadConverter) {
|
||||||
this.log = LoggerFactory.getLogger(this.getClass());
|
this.log = LoggerFactory.getLogger(this.getClass());
|
||||||
this.deployerService = deployerService;
|
this.deployerService = deployerService;
|
||||||
this.processService = processService;
|
this.processService = processService;
|
||||||
|
this.objectMapper = objectMapper;
|
||||||
this.deployMessagePayloadConverter = deployMessagePayloadConverter;
|
this.deployMessagePayloadConverter = deployMessagePayloadConverter;
|
||||||
this.processMessagePayloadConverter = processMessagePayloadConverter;
|
this.processMessagePayloadConverter = processMessagePayloadConverter;
|
||||||
}
|
}
|
||||||
|
@ -34,7 +39,20 @@ public class MqttMessageHandler {
|
||||||
log.debug("[handleMessage] message={}", message);
|
log.debug("[handleMessage] message={}", message);
|
||||||
|
|
||||||
if(!message.getPayload().contains("pid")) {
|
if(!message.getPayload().contains("pid")) {
|
||||||
|
String topic = String.valueOf(message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC));
|
||||||
|
String id = topic.split("/")[1];
|
||||||
|
|
||||||
|
log.info("[handleMessage] topic = {}, id = {}", topic, id);
|
||||||
|
|
||||||
deployMessagePayloadConverter.convertFromByte(message.getPayload(), InboundDeployMessagePayload.class)
|
deployMessagePayloadConverter.convertFromByte(message.getPayload(), InboundDeployMessagePayload.class)
|
||||||
|
.map(p -> new InboundDeployMessagePayload(
|
||||||
|
p.status(),
|
||||||
|
p.assetCode(),
|
||||||
|
p.name(),
|
||||||
|
p.size(),
|
||||||
|
p.releasedAt(),
|
||||||
|
p.modifiedAt(),
|
||||||
|
id))
|
||||||
.flatMap(deployerService)
|
.flatMap(deployerService)
|
||||||
.subscribe();
|
.subscribe();
|
||||||
}else {
|
}else {
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
|
import org.wildfly.common.annotation.NotNull;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
record OutboundMessageResource(
|
||||||
|
@NotNull
|
||||||
|
String url,
|
||||||
|
@NotNull
|
||||||
|
String name,
|
||||||
|
String command,
|
||||||
|
HashMap<String, String> env
|
||||||
|
) {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
|
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class OutboundMessageResourceConverter {
|
||||||
|
|
||||||
|
public OutboundMessageResource toResource(OutboundMessage outboundMessage) {
|
||||||
|
return new OutboundMessageResource(
|
||||||
|
outboundMessage.getUrl(),
|
||||||
|
outboundMessage.getName(),
|
||||||
|
outboundMessage.getCommand(),
|
||||||
|
outboundMessage.getEnv()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OutboundMessage fromResource(OutboundMessageResource resource) {
|
||||||
|
return OutboundMessage.builder()
|
||||||
|
.url(resource.url())
|
||||||
|
.name(resource.name())
|
||||||
|
.command(resource.command())
|
||||||
|
.env(resource.env())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
|
interface PageableResource {
|
||||||
|
long getTotalElements();
|
||||||
|
int getTotalPages();
|
||||||
|
int getSize();
|
||||||
|
int getPage();
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
|
||||||
|
class PageableResourceImpl implements PageableResource {
|
||||||
|
private final long totalElements;
|
||||||
|
private final int totalPages;
|
||||||
|
private final int size;
|
||||||
|
private final int page;
|
||||||
|
|
||||||
|
PageableResourceImpl(long totalElements, int totalPages, int size, int page) {
|
||||||
|
this.totalElements = totalElements;
|
||||||
|
this.totalPages = totalPages;
|
||||||
|
this.size = size;
|
||||||
|
this.page = page;
|
||||||
|
}
|
||||||
|
|
||||||
|
static <T> PageableResourceImpl from(Page<T> page) {
|
||||||
|
return new PageableResourceImpl(
|
||||||
|
page.getTotalElements(),
|
||||||
|
page.getTotalPages(),
|
||||||
|
page.getSize(),
|
||||||
|
page.getPageable().getPageNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getTotalElements() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getTotalPages() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSize() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPage() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
class PageableResponse<T> {
|
||||||
|
private final List<T> content;
|
||||||
|
private final PageableResource pageable;
|
||||||
|
|
||||||
|
PageableResponse(List<T> content, PageableResource pageable) {
|
||||||
|
this.content = content;
|
||||||
|
this.pageable = pageable;
|
||||||
|
}
|
||||||
|
|
||||||
|
static <T, U> PageableResponse<U> from(Page<T> page, Function<T, U> converter) {
|
||||||
|
return new PageableResponse<>(page.map(converter).getContent(), PageableResourceImpl.from(page));
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PageableResource getPageable() {
|
||||||
|
return pageable;
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,9 +16,5 @@ inbound:
|
||||||
username: sdt
|
username: sdt
|
||||||
password: 251327
|
password: 251327
|
||||||
topics:
|
topics:
|
||||||
- /assets/+/apps/process
|
- /assets/+/command-req/+
|
||||||
- /assets/+/apps/deploy
|
- /assets/+/apps/process
|
||||||
outbound:
|
|
||||||
mqtt:
|
|
||||||
topic:
|
|
||||||
- /assets/+/command-req/+
|
|
|
@ -12,9 +12,5 @@ inbound:
|
||||||
username: sdt
|
username: sdt
|
||||||
password: 251327
|
password: 251327
|
||||||
topics:
|
topics:
|
||||||
- /assets/+/apps/process
|
- /assets/+/command-req/+
|
||||||
- /assets/+/apps/deploy
|
- /assets/+/apps/process
|
||||||
outbound:
|
|
||||||
mqtt:
|
|
||||||
topic:
|
|
||||||
- /assets/+/command-req/+
|
|
Loading…
Reference in New Issue