From 61328a67c8e2fc0e662fd3b8f4ef4bc0adfe50dc Mon Sep 17 00:00:00 2001 From: Simon Grimme Date: Sat, 16 Mar 2019 21:42:17 +0100 Subject: [PATCH] implemented working container layer mostly tested but there may still be a few bugs, but i could run a few instances and connect to them from the game so thats a win i guess anyways this will be the first working release next step: containerize the backend itself --- pom.xml | 11 +-- .../backend/ACCServerManager.java | 8 +++ .../ApplicationConfiguration.java | 1 - .../controller/InstancesApiController.java | 9 ++- .../backend/exception/ConflictException.java | 11 +++ ...Exception.java => ContainerException.java} | 7 +- .../CouldNotStartContainerException.java | 13 ---- .../CouldNotStartInstanceException.java | 13 ---- .../IllegalInstanceStateException.java | 13 ++++ .../repository/InstanceRepository.java | 2 +- .../backend/service/ConfigService.java | 7 +- .../backend/service/ContainerService.java | 72 ++++++++++++------- .../backend/service/FileSystemService.java | 26 ++++--- .../backend/service/InfoService.java | 3 +- .../backend/service/InstanceService.java | 70 ++++++++++++++++-- src/main/resources/application.properties | 6 +- 16 files changed, 184 insertions(+), 88 deletions(-) create mode 100644 src/main/java/grimsi/accservermanager/backend/exception/ConflictException.java rename src/main/java/grimsi/accservermanager/backend/exception/{CouldNotCreateContainerException.java => ContainerException.java} (58%) delete mode 100644 src/main/java/grimsi/accservermanager/backend/exception/CouldNotStartContainerException.java delete mode 100644 src/main/java/grimsi/accservermanager/backend/exception/CouldNotStartInstanceException.java create mode 100644 src/main/java/grimsi/accservermanager/backend/exception/IllegalInstanceStateException.java diff --git a/pom.xml b/pom.xml index 8cf9101..b86d64d 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ swagger-spring 0.1.0 - 1.11 + 1.8 ${java.version} ${java.version} 2.7.0 @@ -63,15 +63,6 @@ org.springframework.boot spring-boot-starter-data-mongodb - - de.flapdoodle.embed - de.flapdoodle.embed.mongo - - - cz.jirutka.spring - embedmongo-spring - RELEASE - org.modelmapper modelmapper diff --git a/src/main/java/grimsi/accservermanager/backend/ACCServerManager.java b/src/main/java/grimsi/accservermanager/backend/ACCServerManager.java index 0578264..034c3fa 100644 --- a/src/main/java/grimsi/accservermanager/backend/ACCServerManager.java +++ b/src/main/java/grimsi/accservermanager/backend/ACCServerManager.java @@ -2,7 +2,10 @@ import grimsi.accservermanager.backend.configuration.ApplicationConfiguration; import grimsi.accservermanager.backend.dto.UserDto; +import grimsi.accservermanager.backend.repository.ConfigRepository; +import grimsi.accservermanager.backend.repository.InstanceRepository; import grimsi.accservermanager.backend.repository.UserRepository; +import grimsi.accservermanager.backend.service.FileSystemService; import grimsi.accservermanager.backend.service.UserService; import org.modelmapper.ModelMapper; import org.slf4j.Logger; @@ -23,6 +26,8 @@ public class ACCServerManager implements CommandLineRunner { @Autowired private UserRepository userRepository; @Autowired + private FileSystemService fileSystemService; + @Autowired private ApplicationConfiguration config; @Autowired private UserService userService; @@ -37,6 +42,9 @@ public void run(String... arg0) throws Exception { throw new ExitException(); } + fileSystemService.initFileSystem(); + log.info("Initialized filesystem."); + userRepository.deleteAll(); userService.registerUser(new UserDto(config.getUsername(), config.getPassword())); log.info("Created user with username '" + config.getUsername() + "' and pre-defined password."); diff --git a/src/main/java/grimsi/accservermanager/backend/configuration/ApplicationConfiguration.java b/src/main/java/grimsi/accservermanager/backend/configuration/ApplicationConfiguration.java index ce866f2..6edda24 100644 --- a/src/main/java/grimsi/accservermanager/backend/configuration/ApplicationConfiguration.java +++ b/src/main/java/grimsi/accservermanager/backend/configuration/ApplicationConfiguration.java @@ -20,7 +20,6 @@ public class ApplicationConfiguration { private String password; private String folderPath; private String serverExecutableName; - private String containerNamePrefix; private boolean containerNamePostfixEnabled; private String containerImage; } diff --git a/src/main/java/grimsi/accservermanager/backend/controller/InstancesApiController.java b/src/main/java/grimsi/accservermanager/backend/controller/InstancesApiController.java index 2894a3d..faf7d19 100644 --- a/src/main/java/grimsi/accservermanager/backend/controller/InstancesApiController.java +++ b/src/main/java/grimsi/accservermanager/backend/controller/InstancesApiController.java @@ -75,19 +75,22 @@ public ResponseEntity startInstanceById(@PathVariable("instanceId") String @Override public ResponseEntity stopInstanceById(@PathVariable("instanceId") String instanceId) { String accept = request.getHeader("Accept"); - return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + instanceService.stopInstance(instanceId); + return new ResponseEntity<>(HttpStatus.OK); } @Override public ResponseEntity pauseInstanceById(@PathVariable("instanceId") String instanceId) { String accept = request.getHeader("Accept"); - return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + instanceService.pauseInstance(instanceId); + return new ResponseEntity<>(HttpStatus.OK); } @Override public ResponseEntity resumeInstanceById(@PathVariable("instanceId") String instanceId) { String accept = request.getHeader("Accept"); - return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + instanceService.resumeInstance(instanceId); + return new ResponseEntity<>(HttpStatus.OK); } @Override diff --git a/src/main/java/grimsi/accservermanager/backend/exception/ConflictException.java b/src/main/java/grimsi/accservermanager/backend/exception/ConflictException.java new file mode 100644 index 0000000..02e3f59 --- /dev/null +++ b/src/main/java/grimsi/accservermanager/backend/exception/ConflictException.java @@ -0,0 +1,11 @@ +package grimsi.accservermanager.backend.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.CONFLICT) +public class ConflictException extends RuntimeException { + public ConflictException(String message){ + super(message); + } +} diff --git a/src/main/java/grimsi/accservermanager/backend/exception/CouldNotCreateContainerException.java b/src/main/java/grimsi/accservermanager/backend/exception/ContainerException.java similarity index 58% rename from src/main/java/grimsi/accservermanager/backend/exception/CouldNotCreateContainerException.java rename to src/main/java/grimsi/accservermanager/backend/exception/ContainerException.java index fa34a52..2cb0026 100644 --- a/src/main/java/grimsi/accservermanager/backend/exception/CouldNotCreateContainerException.java +++ b/src/main/java/grimsi/accservermanager/backend/exception/ContainerException.java @@ -1,12 +1,13 @@ package grimsi.accservermanager.backend.exception; + import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) -public class CouldNotCreateContainerException extends RuntimeException { +public class ContainerException extends RuntimeException{ - public CouldNotCreateContainerException(String reason){ - super(reason); + public ContainerException(String message){ + super(message); } } diff --git a/src/main/java/grimsi/accservermanager/backend/exception/CouldNotStartContainerException.java b/src/main/java/grimsi/accservermanager/backend/exception/CouldNotStartContainerException.java deleted file mode 100644 index 0cadf0f..0000000 --- a/src/main/java/grimsi/accservermanager/backend/exception/CouldNotStartContainerException.java +++ /dev/null @@ -1,13 +0,0 @@ -package grimsi.accservermanager.backend.exception; - - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) -public class CouldNotStartContainerException extends RuntimeException{ - - public CouldNotStartContainerException(String containerId, String message){ - super("Could not start container '" + containerId + "': " + message); - } -} diff --git a/src/main/java/grimsi/accservermanager/backend/exception/CouldNotStartInstanceException.java b/src/main/java/grimsi/accservermanager/backend/exception/CouldNotStartInstanceException.java deleted file mode 100644 index 1a8ee2c..0000000 --- a/src/main/java/grimsi/accservermanager/backend/exception/CouldNotStartInstanceException.java +++ /dev/null @@ -1,13 +0,0 @@ -package grimsi.accservermanager.backend.exception; - -import grimsi.accservermanager.backend.enums.InstanceState; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(HttpStatus.CONFLICT) -public class CouldNotStartInstanceException extends RuntimeException { - - public CouldNotStartInstanceException(String instanceId, InstanceState state) { - super("Cant start instance '" + instanceId + "' because its current state is '" + state + "'"); - } -} diff --git a/src/main/java/grimsi/accservermanager/backend/exception/IllegalInstanceStateException.java b/src/main/java/grimsi/accservermanager/backend/exception/IllegalInstanceStateException.java new file mode 100644 index 0000000..34c5313 --- /dev/null +++ b/src/main/java/grimsi/accservermanager/backend/exception/IllegalInstanceStateException.java @@ -0,0 +1,13 @@ +package grimsi.accservermanager.backend.exception; + +import grimsi.accservermanager.backend.enums.InstanceState; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.CONFLICT) +public class IllegalInstanceStateException extends RuntimeException { + + public IllegalInstanceStateException(String action, String instanceId, InstanceState state) { + super("Cant " + action + " instance '" + instanceId + "' because its current state is '" + state + "'"); + } +} diff --git a/src/main/java/grimsi/accservermanager/backend/repository/InstanceRepository.java b/src/main/java/grimsi/accservermanager/backend/repository/InstanceRepository.java index ec7e408..87b27ff 100644 --- a/src/main/java/grimsi/accservermanager/backend/repository/InstanceRepository.java +++ b/src/main/java/grimsi/accservermanager/backend/repository/InstanceRepository.java @@ -14,7 +14,7 @@ public interface InstanceRepository extends MongoRepository { Optional> findAllByConfig_Id(String configId); - Optional> findByState(InstanceState state); + Optional> findAllByState(InstanceState state); Optional findByContainer(String containerName); } diff --git a/src/main/java/grimsi/accservermanager/backend/service/ConfigService.java b/src/main/java/grimsi/accservermanager/backend/service/ConfigService.java index 201472c..4e1cd15 100644 --- a/src/main/java/grimsi/accservermanager/backend/service/ConfigService.java +++ b/src/main/java/grimsi/accservermanager/backend/service/ConfigService.java @@ -57,7 +57,12 @@ public void deleteById(String id) { if(instanceService.isConfigInUse(id)){ throw new ConfigInUseException(id); } - findById(id); + + Config config = configRepository.findById(id).orElseThrow(NotFoundException::new); + eventJsonRepository.deleteById(config.eventJson.id); + settingsJsonRepository.deleteById(config.settingsJson.id); + configurationJsonRepository.deleteById(config.configurationJson.id); + configRepository.deleteById(id); } diff --git a/src/main/java/grimsi/accservermanager/backend/service/ContainerService.java b/src/main/java/grimsi/accservermanager/backend/service/ContainerService.java index 5caf240..c584c37 100644 --- a/src/main/java/grimsi/accservermanager/backend/service/ContainerService.java +++ b/src/main/java/grimsi/accservermanager/backend/service/ContainerService.java @@ -6,21 +6,19 @@ import com.spotify.docker.client.messages.*; import grimsi.accservermanager.backend.configuration.ApplicationConfiguration; import grimsi.accservermanager.backend.dto.InstanceDto; -import grimsi.accservermanager.backend.enums.OperatingSystem; -import grimsi.accservermanager.backend.exception.CouldNotCreateContainerException; -import grimsi.accservermanager.backend.exception.CouldNotStartContainerException; -import org.modelmapper.internal.bytebuddy.asm.Advice; +import grimsi.accservermanager.backend.entity.Instance; +import grimsi.accservermanager.backend.exception.ContainerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; -import java.net.URI; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Service public class ContainerService { @@ -29,6 +27,8 @@ public class ContainerService { @Autowired InstanceService instanceService; @Autowired + FileSystemService fileSystemService; + @Autowired Environment env; @Autowired ApplicationConfiguration config; @@ -55,27 +55,38 @@ public ContainerService(UtilityService utilityService) { public void deployInstance(InstanceDto instance) { String[] ports = { - String.valueOf(instance.getConfig().getConfigurationJson().getTcpPort()), - String.valueOf(instance.getConfig().getConfigurationJson().getUdpPort())}; + (instance.getConfig().getConfigurationJson().getTcpPort() + "/tcp"), + (instance.getConfig().getConfigurationJson().getUdpPort() + "/udp") + }; Map> portBindings = new HashMap<>(); for (String port : ports) { portBindings.put(port, Collections.singletonList(PortBinding.of("0.0.0.0", port))); } - HostConfig hostConfig = HostConfig.builder().portBindings(portBindings).build(); + HostConfig hostConfig = HostConfig.builder() + .portBindings(portBindings) + .binds(fileSystemService.getInstanceFolderPath(instance) + ":/opt/server") + .build(); - try{ - docker.pull(config.getContainerImage()); - } catch (DockerException | InterruptedException e){ - throw new CouldNotCreateContainerException(e.getMessage()); - } + try{ + List images = docker.listImages().stream().filter( + image -> image.repoTags().stream() + .anyMatch(tag -> tag.equals(config.getContainerImage()) + ) + ).collect(Collectors.toList()); + + if(images.isEmpty()){ + docker.pull(config.getContainerImage()); + } + } catch (DockerException | InterruptedException e){ + throw new ContainerException("Could not find/pull image '" + config.getContainerImage() + "': " + e.getMessage()); + } final ContainerConfig containerConfig = ContainerConfig.builder() .hostConfig(hostConfig) .image(config.getContainerImage()) .exposedPorts(ports) - .cmd("sh", "-c", "while :; do sleep 1; done") .build(); try { @@ -86,7 +97,7 @@ public void deployInstance(InstanceDto instance) { instanceService.save(instance); } catch (DockerException | InterruptedException e) { - throw new CouldNotCreateContainerException(e.getMessage()); + throw new ContainerException("Could not create container for instance '" + instance.getId() + "': " + e.getMessage()); } } @@ -94,7 +105,7 @@ public void startInstance(InstanceDto instance) { try { docker.startContainer(instance.getContainer()); } catch (DockerException | InterruptedException e) { - throw new CouldNotStartContainerException(instance.getContainer(), e.getMessage()); + throw new ContainerException("Could not start container '" + instance.getContainer() +"': " + e.getMessage()); } } @@ -102,7 +113,7 @@ public void stopInstance(InstanceDto instance) { try { docker.stopContainer(instance.getContainer(), 10); } catch (DockerException | InterruptedException e) { - log.error(e.toString()); + throw new ContainerException("Could not stop container '" + instance.getContainer() +"': " + e.getMessage()); } } @@ -110,14 +121,28 @@ public void pauseInstance(InstanceDto instance) { try { docker.pauseContainer(instance.getContainer()); } catch (DockerException | InterruptedException e) { - log.error(e.toString()); + throw new ContainerException("Could not pause container '" + instance.getContainer() +"': " + e.getMessage()); } } public void resumeInstance(InstanceDto instance) { + try { + docker.unpauseContainer(instance.getContainer()); + } catch (DockerException | InterruptedException e){ + throw new ContainerException("Could not resume container '" + instance.getContainer() +"': " + e.getMessage()); + } + } + public void deleteInstance(InstanceDto instance){ + try { + stopInstance(instance); + docker.removeContainer(instance.getContainer()); + } catch (DockerException | InterruptedException e){ + throw new ContainerException("Could not delete container '" + instance.getContainer() +"': " + e.getMessage()); + } } + public ContainerStats getContainerStats(InstanceDto instance) { try { return docker.stats(instance.getContainer()); @@ -127,18 +152,13 @@ public ContainerStats getContainerStats(InstanceDto instance) { return null; } - public String buildContainerName(InstanceDto instance){ - String name = ""; - - /* Prefix */ - name = name.concat(config.getContainerNamePrefix()).concat("_"); - + private String buildContainerName(InstanceDto instance){ /* main part */ - name = name.concat(instance.getName()); + String name = instance.getName(); /* Postfix */ if(config.isContainerNamePostfixEnabled()){ - name = name.concat("_").concat(instance.getVersion()); + name = name.concat("-v").concat(instance.getVersion()); } return name; diff --git a/src/main/java/grimsi/accservermanager/backend/service/FileSystemService.java b/src/main/java/grimsi/accservermanager/backend/service/FileSystemService.java index ba606b7..2deab37 100644 --- a/src/main/java/grimsi/accservermanager/backend/service/FileSystemService.java +++ b/src/main/java/grimsi/accservermanager/backend/service/FileSystemService.java @@ -44,6 +44,14 @@ public class FileSystemService { private final String EVENT_JSON = "event.json"; private final String SETTINGS_JSON = "settings.json"; + public void initFileSystem(){ + File instanceRootFolder = new File(config.getFolderPath() + File.separator + INSTANCES_FOLDER); + /* create 'instances' folder */ + if(!instanceRootFolder.exists()){ + instanceRootFolder.mkdirs(); + } + } + public List getInstalledServerVersions(){ File serverRootFolder = new File(config.getFolderPath() + File.separator + SERVERS_FOLDER); @@ -60,15 +68,13 @@ public List getInstalledServerVersions(){ return Collections.emptyList(); } + public String getInstanceFolderPath(InstanceDto instance){ + return config.getFolderPath() + File.separator + INSTANCES_FOLDER + File.separator + instance.getName(); + } + public void createInstanceFolder(InstanceDto instance){ File instanceRootFolder = new File(config.getFolderPath() + File.separator + INSTANCES_FOLDER); File serverRootFolder = new File(config.getFolderPath() + File.separator + SERVERS_FOLDER); - - if(!instanceRootFolder.exists()){ - log.info("Creating folder '" + instanceRootFolder.getAbsolutePath() + "'."); - instanceRootFolder.mkdirs(); - } - File instanceFolder = new File(instanceRootFolder.getAbsolutePath() + File.separator + instance.getName()); try { @@ -86,13 +92,17 @@ public void createInstanceFolder(InstanceDto instance){ public void deleteInstanceFolder(InstanceDto instance){ File folderToDelete = new File(config.getFolderPath() + File.separator + INSTANCES_FOLDER + File.separator + instance.getName()); + deleteFolder(folderToDelete); + } + + private void deleteFolder(File folder){ try{ - Files.walk(folderToDelete.toPath()) + Files.walk(folder.toPath()) .map(Path::toFile) .sorted((o1, o2) -> -o1.compareTo(o2)) .forEach(File::delete); } catch (IOException e){ - throw new CouldNotDeleteFolderException(folderToDelete.toPath()); + throw new CouldNotDeleteFolderException(folder.toPath()); } } diff --git a/src/main/java/grimsi/accservermanager/backend/service/InfoService.java b/src/main/java/grimsi/accservermanager/backend/service/InfoService.java index 2b2d23d..b832ce8 100644 --- a/src/main/java/grimsi/accservermanager/backend/service/InfoService.java +++ b/src/main/java/grimsi/accservermanager/backend/service/InfoService.java @@ -20,7 +20,8 @@ public class InfoService { public SystemInfoDto getSystemInfo(){ SystemInfoDto systemInfo = new SystemInfoDto(); - systemInfo.setVersion("0.0.2"); + // TODO: get maven build-info plugin to work so this can be dynamically loaded + systemInfo.setVersion("0.1.0"); systemInfo.setSupportedAccVersions(fileSystemService.getInstalledServerVersions()); systemInfo.setMetricsEnabled(this.areMetricsEnabled()); systemInfo.setActiveInstances(instanceService.getActiveInstanceCount()); diff --git a/src/main/java/grimsi/accservermanager/backend/service/InstanceService.java b/src/main/java/grimsi/accservermanager/backend/service/InstanceService.java index 1b2ede3..814f5e7 100644 --- a/src/main/java/grimsi/accservermanager/backend/service/InstanceService.java +++ b/src/main/java/grimsi/accservermanager/backend/service/InstanceService.java @@ -3,7 +3,8 @@ import grimsi.accservermanager.backend.dto.InstanceDto; import grimsi.accservermanager.backend.entity.Instance; import grimsi.accservermanager.backend.enums.InstanceState; -import grimsi.accservermanager.backend.exception.CouldNotStartInstanceException; +import grimsi.accservermanager.backend.exception.ConflictException; +import grimsi.accservermanager.backend.exception.IllegalInstanceStateException; import grimsi.accservermanager.backend.exception.InstanceNotStoppedException; import grimsi.accservermanager.backend.exception.NotFoundException; import grimsi.accservermanager.backend.repository.InstanceRepository; @@ -60,6 +61,7 @@ public void deleteById(String id) { } fileSystemService.deleteInstanceFolder(instance); + containerService.deleteInstance(instance); instanceRepository.deleteById(id); } @@ -72,11 +74,17 @@ public InstanceDto create(InstanceDto instanceDto) { instance.state = InstanceState.STOPPED; - instance = instanceRepository.save(instance); - instanceDto = convertToDto(instance); instanceDto.setConfig(configService.findById(instanceDto.getConfig().getId())); + if(arePortsInUse(instanceDto)){ + + int tcpPort = instanceDto.getConfig().getConfigurationJson().getTcpPort(); + int udpPort = instanceDto.getConfig().getConfigurationJson().getUdpPort(); + + throw new ConflictException("Ports '" + tcpPort + "/tcp' and '" + udpPort + "/udp' are already in use by another instance."); + } + try{ fileSystemService.createInstanceFolder(instanceDto); containerService.deployInstance(instanceDto); @@ -100,7 +108,7 @@ public void startInstance(String instanceId){ InstanceDto instanceDto = findById(instanceId); if(instanceDto.getState() == InstanceState.RUNNING || instanceDto.getState() == InstanceState.PAUSED){ - throw new CouldNotStartInstanceException(instanceId, instanceDto.getState()); + throw new IllegalInstanceStateException("start", instanceId, instanceDto.getState()); } containerService.startInstance(instanceDto); @@ -110,17 +118,69 @@ public void startInstance(String instanceId){ } public void stopInstance(String instanceId){ + InstanceDto instanceDto = findById(instanceId); + + if(instanceDto.getState() != InstanceState.RUNNING){ + throw new IllegalInstanceStateException("stop", instanceId, instanceDto.getState()); + } + + containerService.stopInstance(instanceDto); + instanceDto.setState(InstanceState.STOPPED); + save(instanceDto); + } + + public void pauseInstance(String instanceId){ + InstanceDto instanceDto = findById(instanceId); + + if(instanceDto.getState() != InstanceState.RUNNING){ + throw new IllegalInstanceStateException("pause", instanceId, instanceDto.getState()); + } + + containerService.pauseInstance(instanceDto); + instanceDto.setState(InstanceState.PAUSED); + + save(instanceDto); + } + + public void resumeInstance(String instanceId){ + InstanceDto instanceDto = findById(instanceId); + + if(instanceDto.getState() != InstanceState.PAUSED){ + throw new IllegalInstanceStateException("resume", instanceId, instanceDto.getState()); + } + + containerService.resumeInstance(instanceDto); + instanceDto.setState(InstanceState.PAUSED); + + save(instanceDto); } public int getActiveInstanceCount(){ - return instanceRepository.findByState(InstanceState.RUNNING).orElseThrow(NotFoundException::new).size(); + return instanceRepository.findAllByState(InstanceState.RUNNING).orElseThrow(NotFoundException::new).size(); } public boolean isConfigInUse(String configId){ return !instanceRepository.findAllByConfig_Id(configId).get().isEmpty(); } + private boolean arePortsInUse(InstanceDto instanceDto){ + + int tcpPort = instanceDto.getConfig().getConfigurationJson().getTcpPort(); + int udpPort = instanceDto.getConfig().getConfigurationJson().getUdpPort(); + + List instances = findAll(); + + if(instances.isEmpty()){ + return false; + } + + return instances.stream().anyMatch(i -> ( + i.getConfig().getConfigurationJson().getTcpPort() == tcpPort || + i.getConfig().getConfigurationJson().getUdpPort() == udpPort + )); + } + public String getJsonSchema() { String schema = jsonSchemaService.getJsonSchema(InstanceDto.class); if (schema == null) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1109edd..3af70fe 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,10 +9,11 @@ management.endpoints.web.base-path= spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 spring.data.mongodb.database=accservermanager -# Jackson +# Spring spring.jackson.date-format=grimsi.accservermanager.backend.configuration.RFC3339DateFormat spring.jackson.serialization.write-dates-as-timestamps=false spring.jackson.mapper.accept-case-insensitive-enums=true +spring.cache.type=none # ACC Server Manager accservermanager.secret=${random.uuid} accservermanager.expiration-time=86400000 @@ -20,6 +21,5 @@ accservermanager.username=admin accservermanager.password=admin accservermanager.folder-path=C:/Users/simon/Desktop/accServerManager accservermanager.server-executable-name=accServer.exe -accservermanager.container-name-prefix=accserver accservermanager.container-name-postfix-enabled=true -accservermanager.container-image=alpine:latest +accservermanager.container-image=accserver:latest