- README 추가
This commit is contained in:
parent
2aa1f0c225
commit
9e722d02c4
|
@ -0,0 +1,97 @@
|
||||||
|
# [BlokWorks] Device Deployer Service #
|
||||||
|
사용자에게 Command 를 입력받아 MQTT 를 발행하고 배포된 앱의 정보를 저장하고, 조회하는 Spring boot 기반 Java 애플리케이션입니다.
|
||||||
|
|
||||||
|
## 기반 기술 ##
|
||||||
|
|
||||||
|
---
|
||||||
|
* Java 17
|
||||||
|
* Spring Boot 3.1.3
|
||||||
|
* Gradle 8.2.1
|
||||||
|
|
||||||
|
## 주요 의존성 ##
|
||||||
|
|
||||||
|
---
|
||||||
|
* MQTT
|
||||||
|
* PostgreSQL
|
||||||
|
|
||||||
|
## 빌드 ##
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 프로젝트 패키징 ###
|
||||||
|
|
||||||
|
Gradle을 사용하여 패키징합니다.
|
||||||
|
```shell
|
||||||
|
$ ./gradlew clean build -x test
|
||||||
|
```
|
||||||
|
|
||||||
|
### 도커 빌드 ###
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
FROM amazoncorretto:17.0.6-al2023
|
||||||
|
EXPOSE 8081
|
||||||
|
ADD ./build/libs/*.jar device-deployer.jar
|
||||||
|
ENTRYPOINT ["java", "-jar", "/device-deployer.jar"]
|
||||||
|
```
|
||||||
|
|
||||||
|
Image Registry로 사용할 AWS ECR에 로그인을 합니다.
|
||||||
|
```shell
|
||||||
|
$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 003960268191.dkr.ecr.ap-northeast-2.amazonaws.com
|
||||||
|
```
|
||||||
|
|
||||||
|
패키징된 jar 파일을 Docker image로 빌드합니다.
|
||||||
|
```shell
|
||||||
|
$ docker build --platform linux/amd64 -t device-deployer:0.0.7-SNAPSHOT .
|
||||||
|
$ docker tag sdt-cloud/device-deployer:0.0.7-SNAPSHOT 003960268191.dkr.ecr.ap-northeast-2.amazonaws.com/sdt-cloud/device-deployer:{{version}}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 이미지 업로드 ###
|
||||||
|
|
||||||
|
빌드 및 태깅된 Docker image를 Image Registry에 업로드 합니다.
|
||||||
|
```shell
|
||||||
|
$ docker push 003960268191.dkr.ecr.ap-northeast-2.amazonaws.com/sdt-cloud/device-deployer:{{version}}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 구동 ##
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 사전 구동 애플리케이션 및 모듈 ###
|
||||||
|
|
||||||
|
1. MQTT 컨테이너 모듈
|
||||||
|
- 사용자의 Command 를 Edge(Device)에게 전달하기 위한 Message Queue 입니다.
|
||||||
|
2. PostgreSQL 컨테이너 모듈
|
||||||
|
- 실행된 Command 의 정보를 저장하고 조회할 수 있는 RDB 입니다.
|
||||||
|
|
||||||
|
|
||||||
|
### 설정 정보 ###
|
||||||
|
설정 정보 등록은 설정 관리 애플리케이션의 POST /configuration API 를 이용합니다.
|
||||||
|
|
||||||
|
| 옵션 | 설명 | 필수 여부 | 기본값 |
|
||||||
|
|:--------------------------:|:-----------------------------------:|:-----:|:---:|
|
||||||
|
| server.port | 서버 포트 | O | - |
|
||||||
|
| inbound.mqtt.url | MQTT 모듈의 url | O | - |
|
||||||
|
| inbound.mqtt.username | MQTT 모듈의 username | O | - |
|
||||||
|
| inbound.mqtt.password | MQTT 모듈의 password | O | - |
|
||||||
|
| inbound.mqtt.topics | MQTT 모듈이 구독할 Inference 결과 데이터 topic | O | - |
|
||||||
|
| spring.datasource.uri | PostgreSQL 모듈의 연결을 위한 URI | O | - |
|
||||||
|
| spring.datasource.username | PostgreSQL 모듈의 username | O | - |
|
||||||
|
| spring.datasource.pssword | PostgreSQL 모듈의 password | O | - |
|
||||||
|
|
||||||
|
### 배포 ###
|
||||||
|
배포는 k8s manifest로 작성한 deploy.yaml을 이용합니다.
|
||||||
|
Deployment 오브젝트에 반드시 명시해야 하는 설정 정보(`env`)는 아래와 같습니다.
|
||||||
|
|
||||||
|
| 옵션 | 설명 | 필수 여부 | 예시 |
|
||||||
|
|:-----------------------------:|:-------------------------------------------------:|:-----:|:-----------------------------------------------------------------------------------------------------------------------------------------:|
|
||||||
|
| SPRING_PROFILES_ACTIVE | 구동 profile | O | k8s |
|
||||||
|
| SERVER_PORT | 애플리케이션이 등록될 포트 | O | 8085 |
|
||||||
|
| POSTGRES_CREDENTIALS_URL | PostgreSQL의 URL | O | jdbc:postgresql://localhost:5432/blokworks |
|
||||||
|
| POSTGRES_CREDENTIALS_USERNAME | PostgreSQL의 계정 | O | sdt |
|
||||||
|
| POSTGRES_CREDENTIALS_PASSWORD | PostgreSQL의 비밀번호 | O | 2xxxxx |
|
||||||
|
| IAM_AMQP_HOST | RabbitMQ의 URL | O | rabbitmq.sdt-cloud.svc.cluster.local |
|
||||||
|
| IAM_AMQP_PORT | RabbitMQ의 포트 | O | 5672 |
|
||||||
|
| IAM_AMQP_USERNAME | RabbitMQ에 접속할 계정 | O | guest |
|
||||||
|
| IAM_AMQP_PASSWORD | RabbitMQ에 접속할 비밀번호 | O | guest |
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.application;
|
package inc.sdt.blokworks.devicedeployer.application;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
||||||
import inc.sdt.blokworks.devicedeployer.presentation.GiteaApiRequestHandler;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.application;
|
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.Process;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundProcessMessagePayload;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.data.domain.Page;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import reactor.core.publisher.Mono;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class DefaultProcessService implements ProcessService{
|
|
||||||
private final Logger log;
|
|
||||||
private final ProcessRepositoryDelegate processRepositoryDelegate;
|
|
||||||
|
|
||||||
public DefaultProcessService(ProcessRepositoryDelegate processRepositoryDelegate) {
|
|
||||||
this.log = LoggerFactory.getLogger(this.getClass());
|
|
||||||
this.processRepositoryDelegate = processRepositoryDelegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Mono<Void> apply(InboundProcessMessagePayload inboundProcessMessagePayload) {
|
|
||||||
log.info("[apply] inboundProcessMessagePayload = {}", inboundProcessMessagePayload);
|
|
||||||
// 프로세스 저장
|
|
||||||
return Mono.just(inboundProcessMessagePayload)
|
|
||||||
.doOnNext(processRepositoryDelegate)
|
|
||||||
.then();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Page<Process> getAll(String assetCode, int page, int size) {
|
|
||||||
log.info("[getAll] assetCode = {}, page = {}, size = {}", assetCode, page, size);
|
|
||||||
return processRepositoryDelegate.findAllByAssetCode(assetCode, page, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,7 +1,6 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.application;
|
package inc.sdt.blokworks.devicedeployer.application;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
|
@ -1,15 +1,9 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.application;
|
package inc.sdt.blokworks.devicedeployer.application;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.SubCommandType;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.presentation.GiteaApiRequestHandler;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class DeployCommandInvoker {
|
public class DeployCommandInvoker {
|
||||||
|
|
|
@ -7,8 +7,6 @@ import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundDeployMessage
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Optional;
|
|
||||||
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>> {
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.application;
|
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.Process;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundProcessMessagePayload;
|
|
||||||
import org.springframework.data.domain.Page;
|
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
public interface ProcessRepositoryDelegate extends Consumer<InboundProcessMessagePayload> {
|
|
||||||
Process save(Process process);
|
|
||||||
Page<Process> findAllByAssetCode(String assetCode, int page, int size);
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.application;
|
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.Process;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundProcessMessagePayload;
|
|
||||||
import org.springframework.data.domain.Page;
|
|
||||||
import reactor.core.publisher.Mono;
|
|
||||||
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
public interface ProcessService extends Function<InboundProcessMessagePayload, Mono<Void>> {
|
|
||||||
Page<Process> getAll(String assetCode, int page, int size);
|
|
||||||
}
|
|
|
@ -1,63 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.domain;
|
|
||||||
|
|
||||||
public class Port {
|
|
||||||
private String protocol;
|
|
||||||
private Integer hostPort;
|
|
||||||
private Integer containerPort;
|
|
||||||
|
|
||||||
protected Port() {}
|
|
||||||
|
|
||||||
public String getProtocol() {
|
|
||||||
return protocol;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getHostPort() {
|
|
||||||
return hostPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getContainerPort() {
|
|
||||||
return containerPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Port{" +
|
|
||||||
"protocol='" + protocol + '\'' +
|
|
||||||
", hostPort=" + hostPort +
|
|
||||||
", containerPort=" + containerPort +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Builder builder() {
|
|
||||||
return new Builder();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static final class Builder {
|
|
||||||
private String protocol;
|
|
||||||
private Integer hostPort;
|
|
||||||
private Integer containerPort;
|
|
||||||
|
|
||||||
public Builder protocol(String protocol) {
|
|
||||||
this.protocol = protocol;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder hostPort(Integer hostPort) {
|
|
||||||
this.hostPort = hostPort;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder containerPort(Integer containerPort) {
|
|
||||||
this.containerPort = containerPort;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Port build() {
|
|
||||||
Port port = new Port();
|
|
||||||
port.protocol = this.protocol;
|
|
||||||
port.hostPort = this.hostPort;
|
|
||||||
port.containerPort = this.containerPort;
|
|
||||||
return port;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,139 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.domain;
|
|
||||||
|
|
||||||
public class Process {
|
|
||||||
private String assetCode;
|
|
||||||
private Integer pid;
|
|
||||||
private String name;
|
|
||||||
private Integer cpu;
|
|
||||||
private Integer memory;
|
|
||||||
private Integer network;
|
|
||||||
private Long processedAt;
|
|
||||||
private OperationType operationType;
|
|
||||||
|
|
||||||
protected Process() {}
|
|
||||||
|
|
||||||
public Process(String assetCode, Integer pid, String name, Integer cpu, Integer memory, Integer network, Long processedAt, OperationType operationType) {
|
|
||||||
this.assetCode = assetCode;
|
|
||||||
this.pid = pid;
|
|
||||||
this.name = name;
|
|
||||||
this.cpu = cpu;
|
|
||||||
this.memory = memory;
|
|
||||||
this.network = network;
|
|
||||||
this.processedAt = processedAt;
|
|
||||||
this.operationType = operationType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAssetCode() {
|
|
||||||
return assetCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getPid() {
|
|
||||||
return pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getCpu() {
|
|
||||||
return cpu;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getMemory() {
|
|
||||||
return memory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getNetwork() {
|
|
||||||
return network;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getProcessedAt() {
|
|
||||||
return processedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OperationType getOperationType() {
|
|
||||||
return operationType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Process{" +
|
|
||||||
"assetCode='" + assetCode + '\'' +
|
|
||||||
", pid=" + pid +
|
|
||||||
", name='" + name + '\'' +
|
|
||||||
", cpu=" + cpu +
|
|
||||||
", memory=" + memory +
|
|
||||||
", network=" + network +
|
|
||||||
", processedAt=" + processedAt +
|
|
||||||
", operationType=" + operationType +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Builder builder() {
|
|
||||||
return new Builder();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static final class Builder {
|
|
||||||
private String assetCode;
|
|
||||||
private Integer pid;
|
|
||||||
private String name;
|
|
||||||
private Integer cpu;
|
|
||||||
private Integer memory;
|
|
||||||
private Integer network;
|
|
||||||
private Long processedAt;
|
|
||||||
private OperationType operationType;
|
|
||||||
|
|
||||||
public Builder assetCode(String assetCode) {
|
|
||||||
this.assetCode = assetCode;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder pid(Integer pid) {
|
|
||||||
this.pid = pid;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder name(String name) {
|
|
||||||
this.name = name;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder cpu(Integer cpu) {
|
|
||||||
this.cpu = cpu;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder memory(Integer memory) {
|
|
||||||
this.memory = memory;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder network(Integer network) {
|
|
||||||
this.network = network;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder processedAt(Long processedAt) {
|
|
||||||
this.processedAt = processedAt;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder operationType(OperationType operationType) {
|
|
||||||
this.operationType = operationType;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Process build() {
|
|
||||||
Process process = new Process();
|
|
||||||
process.assetCode = this.assetCode;
|
|
||||||
process.pid = this.pid;
|
|
||||||
process.name = this.name;
|
|
||||||
process.cpu = this.cpu;
|
|
||||||
process.memory = this.memory;
|
|
||||||
process.network = this.network;
|
|
||||||
process.processedAt = this.processedAt;
|
|
||||||
process.operationType = this.operationType;
|
|
||||||
return process;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.infrastructure.mqtt;
|
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.Status;
|
|
||||||
|
|
||||||
public record InboundProcessMessagePayload(
|
|
||||||
Status status,
|
|
||||||
String assetCode,
|
|
||||||
Integer pid,
|
|
||||||
String name,
|
|
||||||
Integer cpu,
|
|
||||||
Integer memory,
|
|
||||||
Integer network,
|
|
||||||
Long processedAt
|
|
||||||
) {
|
|
||||||
}
|
|
|
@ -1,7 +1,6 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.infrastructure.mqtt;
|
package inc.sdt.blokworks.devicedeployer.infrastructure.mqtt;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.CommandType;
|
import inc.sdt.blokworks.devicedeployer.domain.CommandType;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.DeviceType;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.SubCommandType;
|
import inc.sdt.blokworks.devicedeployer.domain.SubCommandType;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
|
@ -1,78 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.infrastructure.relational;
|
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.OperationType;
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
|
|
||||||
@Entity(name = "app_process")
|
|
||||||
class ProcessEntity {
|
|
||||||
@Id
|
|
||||||
@GeneratedValue(strategy = GenerationType.UUID)
|
|
||||||
@Column(name = "process_id", length = 36)
|
|
||||||
private String id;
|
|
||||||
@Column(name = "asset_code", length = 255)
|
|
||||||
private String assetCode;
|
|
||||||
@Column(name = "pid")
|
|
||||||
private Integer pid;
|
|
||||||
@Column(name = "app_name", length = 255)
|
|
||||||
private String appName;
|
|
||||||
@Column(name = "cpu")
|
|
||||||
private Integer cpu;
|
|
||||||
@Column(name = "memory")
|
|
||||||
private Integer memory;
|
|
||||||
@Column(name = "network")
|
|
||||||
private Integer network;
|
|
||||||
@Column(name = "processed_at")
|
|
||||||
private Long processedAt;
|
|
||||||
@Column(name = "operation_type")
|
|
||||||
@Enumerated(EnumType.STRING)
|
|
||||||
private OperationType operationType;
|
|
||||||
|
|
||||||
protected ProcessEntity() {}
|
|
||||||
|
|
||||||
public ProcessEntity(String assetCode, Integer pid, String appName, Integer cpu, Integer memory, Integer network, Long processedAt, OperationType operationType) {
|
|
||||||
this.assetCode = assetCode;
|
|
||||||
this.pid = pid;
|
|
||||||
this.appName = appName;
|
|
||||||
this.cpu = cpu;
|
|
||||||
this.memory = memory;
|
|
||||||
this.network = network;
|
|
||||||
this.processedAt = processedAt;
|
|
||||||
this.operationType = operationType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAssetCode() {
|
|
||||||
return assetCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getPid() {
|
|
||||||
return pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAppName() {
|
|
||||||
return appName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getCpu() {
|
|
||||||
return cpu;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getMemory() {
|
|
||||||
return memory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getNetwork() {
|
|
||||||
return network;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getProcessedAt() {
|
|
||||||
return processedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OperationType getOperationType() {
|
|
||||||
return operationType;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
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;
|
|
||||||
|
|
||||||
public interface ProcessJpaRepository extends JpaRepository<ProcessEntity, String> {
|
|
||||||
Page<ProcessEntity> findAllByAssetCode(String assetCode, Pageable pageable);
|
|
||||||
}
|
|
|
@ -1,84 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.infrastructure.relational;
|
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.application.ProcessRepositoryDelegate;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.OperationType;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.Process;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.infrastructure.mqtt.InboundProcessMessagePayload;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
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;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
public class ProcessRelationalRepository implements ProcessRepositoryDelegate {
|
|
||||||
private final Logger log;
|
|
||||||
private final ProcessJpaRepository processJpaRepository;
|
|
||||||
|
|
||||||
public ProcessRelationalRepository(ProcessJpaRepository processJpaRepository) {
|
|
||||||
this.log = LoggerFactory.getLogger(this.getClass());
|
|
||||||
this.processJpaRepository = processJpaRepository;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void accept(InboundProcessMessagePayload payload) {
|
|
||||||
this.save(this.fromMessage(payload));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Process save(Process process) {
|
|
||||||
log.info("[save] process = {}", process);
|
|
||||||
ProcessEntity entity = this.toEntity(process);
|
|
||||||
processJpaRepository.save(entity);
|
|
||||||
return process;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Page<Process> findAllByAssetCode(String assetCode, int page, int size) {
|
|
||||||
log.info("[findAllByAssetCode] assetCode = {}", assetCode);
|
|
||||||
Pageable pageable = page < 0 ? Pageable.unpaged() : PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "processedAt"));
|
|
||||||
return processJpaRepository.findAllByAssetCode(assetCode, pageable)
|
|
||||||
.map(this::fromEntity);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ProcessEntity toEntity(Process process) {
|
|
||||||
return new ProcessEntity(
|
|
||||||
process.getAssetCode(),
|
|
||||||
process.getPid(),
|
|
||||||
process.getName(),
|
|
||||||
process.getCpu(),
|
|
||||||
process.getMemory(),
|
|
||||||
process.getNetwork(),
|
|
||||||
process.getProcessedAt(),
|
|
||||||
OperationType.START
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Process fromEntity(ProcessEntity entity) {
|
|
||||||
return Process.builder()
|
|
||||||
.assetCode(entity.getAssetCode())
|
|
||||||
.pid(entity.getPid())
|
|
||||||
.name(entity.getAppName())
|
|
||||||
.cpu(entity.getCpu())
|
|
||||||
.memory(entity.getMemory())
|
|
||||||
.network(entity.getNetwork())
|
|
||||||
.processedAt(entity.getProcessedAt())
|
|
||||||
.operationType(entity.getOperationType())
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Process fromMessage(InboundProcessMessagePayload payload) {
|
|
||||||
return Process.builder()
|
|
||||||
.assetCode(payload.assetCode())
|
|
||||||
.pid(payload.pid())
|
|
||||||
.name(payload.name())
|
|
||||||
.cpu(payload.cpu())
|
|
||||||
.memory(payload.memory())
|
|
||||||
.network(payload.network())
|
|
||||||
.processedAt(payload.processedAt())
|
|
||||||
.operationType(OperationType.START)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,10 +1,7 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.presentation;
|
package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.CommandType;
|
import inc.sdt.blokworks.devicedeployer.domain.CommandType;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.DeviceType;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.SubCommandType;
|
import inc.sdt.blokworks.devicedeployer.domain.SubCommandType;
|
||||||
import org.wildfly.common.annotation.NotNull;
|
|
||||||
import org.wildfly.common.annotation.Nullable;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ package inc.sdt.blokworks.devicedeployer.presentation;
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.CommandType;
|
import inc.sdt.blokworks.devicedeployer.domain.CommandType;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
import inc.sdt.blokworks.devicedeployer.domain.OutboundMessage;
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.SubCommandType;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.presentation;
|
|
||||||
|
|
||||||
public record PortResource(
|
|
||||||
String protocol,
|
|
||||||
Integer hostPort,
|
|
||||||
Integer containerPort
|
|
||||||
) {
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.presentation;
|
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.Port;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
public class PortResourceConverter {
|
|
||||||
public PortResource toResource(Port port) {
|
|
||||||
return new PortResource(
|
|
||||||
port.getProtocol(),
|
|
||||||
port.getHostPort(),
|
|
||||||
port.getContainerPort()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Port fromResource(PortResource resource) {
|
|
||||||
return Port.builder()
|
|
||||||
.protocol(resource.protocol())
|
|
||||||
.hostPort(resource.hostPort())
|
|
||||||
.containerPort(resource.containerPort())
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.presentation;
|
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.application.ProcessService;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.Process;
|
|
||||||
import inc.sdt.blokworks.devicedeployer.infrastructure.amqp.ResourceMapping;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.data.domain.Page;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.stereotype.Controller;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
public class ProcessController {
|
|
||||||
private final Logger log;
|
|
||||||
|
|
||||||
private final ProcessService processService;
|
|
||||||
private final ProcessResourceConverter processResourceConverter;
|
|
||||||
|
|
||||||
public ProcessController(ProcessService processService,
|
|
||||||
ProcessResourceConverter processResourceConverter) {
|
|
||||||
this.log = LoggerFactory.getLogger(this.getClass());
|
|
||||||
this.processService = processService;
|
|
||||||
this.processResourceConverter = processResourceConverter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 배포된 앱 내의 프로세스 정보 조회 (페이지 조회)
|
|
||||||
* @param assetCode 자산 코드
|
|
||||||
*/
|
|
||||||
@ResourceMapping(name = "Get_App_Process", method = "GET", uri = "/assets/{code}/apps/process", description = "배포된 앱의 프로세스 정보 조회")
|
|
||||||
@ResponseStatus(HttpStatus.OK)
|
|
||||||
@GetMapping("/assets/{assetCode}/apps/process")
|
|
||||||
public PageableResponse<ProcessResource> get(@PathVariable String 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<Process> process = processService.getAll(assetCode, page, size);
|
|
||||||
return PageableResponse.from(process, processResourceConverter::toResource);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.presentation;
|
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.OperationType;
|
|
||||||
|
|
||||||
record ProcessResource(
|
|
||||||
String assetCode,
|
|
||||||
Integer pid,
|
|
||||||
String name,
|
|
||||||
Integer cpu,
|
|
||||||
Integer memory,
|
|
||||||
Integer network,
|
|
||||||
Long processedAt,
|
|
||||||
OperationType operationType
|
|
||||||
) {
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
package inc.sdt.blokworks.devicedeployer.presentation;
|
|
||||||
|
|
||||||
import inc.sdt.blokworks.devicedeployer.domain.Process;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
public class ProcessResourceConverter {
|
|
||||||
public Process fromResource(ProcessResource resource) {
|
|
||||||
return Process.builder()
|
|
||||||
.assetCode(resource.assetCode())
|
|
||||||
.name(resource.name())
|
|
||||||
.pid(resource.pid())
|
|
||||||
.cpu(resource.cpu())
|
|
||||||
.memory(resource.memory())
|
|
||||||
.network(resource.network())
|
|
||||||
.processedAt(resource.processedAt())
|
|
||||||
.operationType(resource.operationType())
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProcessResource toResource(Process process) {
|
|
||||||
return new ProcessResource(
|
|
||||||
process.getAssetCode(),
|
|
||||||
process.getPid(),
|
|
||||||
process.getName(),
|
|
||||||
process.getCpu(),
|
|
||||||
process.getMemory(),
|
|
||||||
process.getNetwork(),
|
|
||||||
process.getProcessedAt(),
|
|
||||||
process.getOperationType()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue