Skip to content

Commit

Permalink
Merge pull request #17 from fan9704/feat_network_service
Browse files Browse the repository at this point in the history
✨ feat(rabbitmq) Client service
  • Loading branch information
fan9704 authored Jun 18, 2024
2 parents c56c56b + 16d722b commit 12c2fb1
Show file tree
Hide file tree
Showing 12 changed files with 249 additions and 13 deletions.
18 changes: 18 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@
<properties>
<java.version>17</java.version>
</properties>
<repositories>
<repository>
<id>lumaserv</id>
<url>https://maven.lumaserv.cloud</url>
</repository>
</repositories>
<dependencies>
<!--DevTools-->
<dependency>
Expand Down Expand Up @@ -93,12 +99,24 @@
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!--Proxmox-->
<dependency>
<groupId>com.lumaserv</groupId>
<artifactId>proxmox-ve-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.lumaserv</groupId>-->
<!-- <artifactId>proxmox4j</artifactId>-->
<!-- <version>0.0.2-SNAPSHOT</version>-->
<!-- </dependency>-->
<!--Proxmox-->
<!--AMQP-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
<!--AMQP-->
</dependencies>

<build>
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/fkt/network/NetworkApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class NetworkApplication {
private static final Logger log = LoggerFactory.getLogger(NetworkApplication.class);
public static void main(String[] args) {
Expand Down
71 changes: 71 additions & 0 deletions src/main/java/com/fkt/network/configs/RabbitMQConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.fkt.network.configs;


import com.fkt.network.services.NATQueueClientService;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.MessageListenerContainer;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@ConditionalOnExpression("${spring.rabbitmq.enable}")
public class RabbitMQConfig {

@Value("${fkt.rabbitmq.receive.queue}")
String queueName;

@Value("${spring.rabbitmq.username}")
String username;

@Value("${spring.rabbitmq.password}")
private String password;
@Value("${rabbitmq.exchange.name:client}")
private String exchange;

@Value("${rabbitmq.routing.json.key:140.96.83.14}")
private String routingJsonKey;
@Bean
Queue queue() {
return new Queue(this.queueName, false);
}
@Bean
public TopicExchange exchange(){
return new TopicExchange(this.exchange);
}
//TODO:Auto Bind
@Bean
public Binding jsonBinding(){
return BindingBuilder
.bind(queue())
.to(exchange())
.with(routingJsonKey);
}
//create MessageListenerContainer using default connection factory
@Bean
MessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory ) {
SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
simpleMessageListenerContainer.setConnectionFactory(connectionFactory);
simpleMessageListenerContainer.setQueues(queue());
simpleMessageListenerContainer.setMessageListener(new NATQueueClientService());
return simpleMessageListenerContainer;

}
@Bean
public MessageConverter converter(){
return new Jackson2JsonMessageConverter();
}
@Bean
public AmqpTemplate amqpTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(converter());
return rabbitTemplate;
}
}
23 changes: 23 additions & 0 deletions src/main/java/com/fkt/network/dtos/request/BeatAMQPRequestDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.fkt.network.dtos.request;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class BeatAMQPRequestDTO {
private String hostIp;
private String backendUrl;
private String frontendUrl;
private String note;

public BeatAMQPRequestDTO(String hostIp){
this.backendUrl = "http://"+hostIp+":9990";
this.frontendUrl = "http://"+hostIp;
this.hostIp = hostIp;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.fkt.network.dtos.request;

import lombok.*;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.lang.Nullable;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class NetworkRecordAMQPRequestDTO {
private String outputIp;
private String outputPort;

private String inputIp;
private String inputPort;
private String protocol = "TCP";


private String note;


private String fullNetworkRecord;
private String operation;
}
29 changes: 22 additions & 7 deletions src/main/java/com/fkt/network/models/NetworkRecord.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@


import com.fkt.network.dtos.NetworkRecordCreateDTO;
import com.fkt.network.dtos.request.NetworkRecordAMQPRequestDTO;
import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
Expand Down Expand Up @@ -52,13 +53,27 @@ public String getFullNetworkRecord(){
);
}
public NetworkRecordCreateDTO networkRecordToDTO(){
NetworkRecordCreateDTO dto = new NetworkRecordCreateDTO();
dto.setInputIp(this.getInputIp());
dto.setInputPort(this.getInputPort());
dto.setOutputIp(this.getOutputIp());
dto.setOutputPort(this.getOutputPort());
dto.setNote(this.getNote());
dto.setProtocol(this.getProtocol());
NetworkRecordCreateDTO dto = new NetworkRecordCreateDTO(
getOutputIp(),
getOutputPort(),
getInputIp(),
getInputPort(),
getProtocol(),
getNote()
);
return dto;
}
public NetworkRecordAMQPRequestDTO toAMQPDTO(String operation){
NetworkRecordAMQPRequestDTO dto = new NetworkRecordAMQPRequestDTO(
getOutputIp(),
getOutputPort(),
getInputIp(),
getInputPort(),
getProtocol(),
getNote(),
getFullNetworkRecord(),
operation
);
return dto;
}
}
32 changes: 32 additions & 0 deletions src/main/java/com/fkt/network/services/BeatService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.fkt.network.services;

import com.fkt.network.dtos.request.BeatAMQPRequestDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.amqp.rabbit.core.RabbitTemplate;

@Service
public class BeatService {
private RabbitTemplate rabbitTemplate;
@Value("${rabbitmq.exchange.name:client}")
private String exchange;

@Value("${rabbitmq.routing.key:127.0.0.1}")
private String routingKey;
@Value("{host.ip}")
private String hostIp;
@Autowired
public BeatService(RabbitTemplate rabbitTemplate){
this.rabbitTemplate = rabbitTemplate;
}
@Scheduled(fixedRate = 10000)

public void publishMessagePeriodically() {
BeatAMQPRequestDTO dto = new BeatAMQPRequestDTO(this.hostIp);
rabbitTemplate.convertAndSend(this.exchange, this.routingKey, dto);
System.out.println("Sent Beat'" + dto + "'");
}
}
14 changes: 14 additions & 0 deletions src/main/java/com/fkt/network/services/NATQueueClientService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.fkt.network.services;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.stereotype.Service;

@Service
@ConditionalOnExpression("${spring.rabbitmq.enable}")
public class NATQueueClientService implements MessageListener{
public void onMessage(Message message) {
System.out.println("Consuming Message - " + new String(message.getBody()));
}
}
12 changes: 11 additions & 1 deletion src/main/java/com/fkt/network/services/NetworkRecordService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
import com.fkt.network.dtos.response.ExecuteCommandResponseDTO;
import com.fkt.network.models.NetworkRecord;
import com.fkt.network.repositories.NetworkRecordRepository;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
Expand All @@ -22,10 +25,13 @@
public class NetworkRecordService {
private NetworkRecordRepository repository;
private NATService natService;
private final RabbitTemplate rabbitTemplate;
@Autowired
public NetworkRecordService(NetworkRecordRepository repository,NATService natService){
public NetworkRecordService(NetworkRecordRepository repository, NATService natService, RabbitTemplate rabbitTemplate){
this.repository = repository;
this.natService = natService;
this.rabbitTemplate = rabbitTemplate;
rabbitTemplate.setMessageConverter( new Jackson2JsonMessageConverter());
}

public ResponseEntity<List<NetworkRecord>> findAllNetworkRecord(){
Expand All @@ -37,6 +43,8 @@ public ResponseEntity<NetworkRecord> create_service(NetworkRecordCreateDTO dto)
if(networkRecord == null){
return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
}else{
//TODO: Handler Disable AMQP
rabbitTemplate.convertAndSend("client","140.96.83.14",networkRecord.toAMQPDTO("create"));
return new ResponseEntity<>(networkRecord, HttpStatus.CREATED);
}
}
Expand Down Expand Up @@ -99,6 +107,7 @@ public ResponseEntity<NetworkRecord> patch_network_record_by_id(String id, Netwo
createSuccess=this.natService.execute_nat_prerouting(newNetworkRecordDTO,true) && this.natService.execute_nat_postrouting(newNetworkRecordDTO,true);
}
System.out.println("Create New Record Status:"+createSuccess);
//TODO:Send AMQP DTO
return new ResponseEntity<>(this.repository.save(newNetworkRecord),HttpStatus.OK);
}else{
return new ResponseEntity<>(null,HttpStatus.NOT_FOUND);
Expand Down Expand Up @@ -150,6 +159,7 @@ public ResponseEntity<?> delete_nat_service(String id) throws IOException {
System.out.println("Delete TCP POSTROUTEING:"+delete_postrouting_success);
}
this.repository.deleteById(id);
//TODO:Send Delete AMQP DTO
return new ResponseEntity<>(null,HttpStatus.OK);

}else{
Expand Down
10 changes: 8 additions & 2 deletions src/main/resources/application-dev.properties
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
# Mongo Config
spring.data.mongodb.auto-index-creation=true
spring.data.mongodb.host=${MONGO_DB_HOST:127.0.0.1}
spring.data.mongodb.port=${MONGO_DB_PORT:27017}
spring.data.mongodb.username=${MONGO_DB_USERNAME:test}
spring.data.mongodb.password=${MONGO_DB_PASSWORD:123456}
spring.data.mongodb.database=${MONGO_DB_DATABASE:network}
spring.data.mongodb.authentication-database=admin

# Proxmox Config
pve.host=${PVE_HOST:127.0.0.1}
pve.username=${PVE_USERNAME:root}
pve.password=${PVE_PASSWORD:123456}
pve.password=${PVE_PASSWORD:123456}
# RabbitMQ Config
spring.rabbitmq.host=${RABBIT_MQ_HOST:127.0.0.1}
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
11 changes: 9 additions & 2 deletions src/main/resources/application-test.properties
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
# Mongo Config
spring.data.mongodb.auto-index-creation=true
spring.data.mongodb.host=${MONGO_DB_HOST:127.0.0.1}
spring.data.mongodb.port=${MONGO_DB_PORT:27017}
spring.data.mongodb.username=${MONGO_DB_USERNAME:test}
spring.data.mongodb.password=${MONGO_DB_PASSWORD:123456}
spring.data.mongodb.database=${MONGO_DB_DATABASE:network_test}
spring.data.mongodb.authentication-database=admin

# Proxmox Config
pve.host=127.0.0.1
pve.username=root
pve.password=123456
pve.password=123456
# RabbitMQ Config
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.enable=false
15 changes: 14 additions & 1 deletion src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,17 @@ host.ip=${HOST_IP:127.0.0.1}
iptables.operate=true
iptables.legacy=${IPTABLES_LEGACY:true}
debug=false
server.port=9990
server.port=9990
# RabbitMQ Config
spring.rabbitmq.host=${RABBIT_MQ_HOST:127.0.0.1}
spring.rabbitmq.port=${RABBIT_MQ_PORT:5672}
spring.rabbitmq.username=${RABBIT_MQ_USERNAME:guest}
spring.rabbitmq.password=${RABBIT_MQ_PASSWORD:guest}
spring.rabbitmq.enable=${RABBIT_MQ_ENABLE:false}
fkt.rabbitmq.receive.queue=nat.master
fkt.rabbitmq.send.queue=nat.client
rabbitmq.exchange.name=client
rabbitmq.routing.key=${HOST_IP:127.0.0.1}
# Feature Toggle Config
network.controller.enabled=true
proxmox.controller.enabled=false

0 comments on commit 12c2fb1

Please sign in to comment.