diff --git a/docker/nmaas-platform.properties.template b/docker/nmaas-platform.properties.template index 739790823a85ef0c127c4506d4545d57cab63ba0..62e2dcfd8f7f62b8adcde7979bac733ba5b47f39 100644 --- a/docker/nmaas-platform.properties.template +++ b/docker/nmaas-platform.properties.template @@ -145,3 +145,14 @@ kubernetes.deployment.smtpServerUsername=${SMTP_LOGIN} kubernetes.deployment.smtpServerPassword=${SMTP_PASSWORD} kubernetes.deployment.defaultStorageClass=${K8S_DEPLOYMENT_DEFAULT_STORAGE_CLASS} kubernetes.deployment.forceDedicatedWorkers=false + +# -------------------- # +# Portal configuration # +# -------------------- # +portal.config.maintenance=${PORTAL_MAINTENANCE_FLAG} +portal.config.ssoLoginAllowed=${PORTAL_SSO_ALLOWED_FLAG} +portal.config.defaultLanguage=${PORTAL_DEFAULT_LANG} +portal.config.testInstance=${PORTAL_TEST_INSTANCE_FLAG} +portal.config.sendAppInstanceFailureEmails=${PORTAL_SEND_FAILURE_NOTIF_FLAG} +# string - list of emails with ':' as a separator, e.g. admin1@nmaas.eu;admin2@nmaas.eu +portal.config.appInstanceFailureEmailList=${ADMIN_EMAIL} diff --git a/src/integrationTest/resources/application.properties b/src/integrationTest/resources/application.properties index c22d0274a7607b8392fe6c1278f934078bd01a9a..afefec08fba29ccca635a3b0e2a62bf43d703833 100644 --- a/src/integrationTest/resources/application.properties +++ b/src/integrationTest/resources/application.properties @@ -142,4 +142,15 @@ kubernetes.deployment.smtpServerHostname=test-postfix kubernetes.deployment.smtpServerPort=587 kubernetes.deployment.smtpServerUsername= kubernetes.deployment.smtpServerPassword= -kubernetes.deployment.defaultStorageClass=storageClass \ No newline at end of file +kubernetes.deployment.defaultStorageClass=storageClass + +# ------------------------ # +# Portal configuration # +# ------------------------ # +portal.config.maintenance=false +portal.config.ssoLoginAllowed=false +portal.config.defaultLanguage=en +portal.config.testInstance=false +portal.config.sendAppInstanceFailureEmails=false +# string - list of emails with ':' as a separator, e.g. admin1@nmaas.eu;admin2@nmaas.eu +portal.config.appInstanceFailureEmailList=admin@nmaas.eu \ No newline at end of file diff --git a/src/main/java/net/geant/nmaas/portal/PortalConfig.java b/src/main/java/net/geant/nmaas/portal/PortalConfig.java index eb218e201030b4f396cde15af7f35bbcd3d5a3d7..1658b874936f5b9157d4c770bd887198c8790838 100644 --- a/src/main/java/net/geant/nmaas/portal/PortalConfig.java +++ b/src/main/java/net/geant/nmaas/portal/PortalConfig.java @@ -1,10 +1,13 @@ package net.geant.nmaas.portal; +import lombok.extern.log4j.Log4j2; import net.geant.nmaas.monitor.MonitorManager; import net.geant.nmaas.monitor.ServiceType; import net.geant.nmaas.monitor.model.MonitorEntryView; import net.geant.nmaas.monitor.scheduling.ScheduleManager; +import net.geant.nmaas.portal.api.configuration.ConfigurationView; import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.exceptions.OnlyOneConfigurationSupportedException; import net.geant.nmaas.portal.persistent.entity.Content; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Role; @@ -31,6 +34,7 @@ import java.util.Optional; @Configuration @ComponentScan(basePackages={"net.geant.nmaas.portal.service"}) +@Log4j2 public class PortalConfig { private PasswordEncoder passwordEncoder; @@ -50,15 +54,15 @@ public class PortalConfig { @Autowired private DomainService domains; - @Autowired - private ConfigurationManager configurationManager; - @Value("${admin.password}") String adminPassword; @Value("${admin.email}") String adminEmail; + @Value("${portal.config.defaultLanguage}") + private String defaultLanguage = "en"; + @Override @Transactional public void afterPropertiesSet() { @@ -75,7 +79,7 @@ public class PortalConfig { if(globalDomain.isPresent()) { User user = new User(username, true, passwordEncoder.encode(password), globalDomain.get(), role, true, true); user.setEmail(email); - user.setSelectedLanguage(configurationManager.getConfiguration().getDefaultLanguage()); + user.setSelectedLanguage(this.defaultLanguage); userRepository.save(user); } } @@ -153,4 +157,43 @@ public class PortalConfig { } }; } + + @Bean + public InitializingBean saveDefaultPortalConfiguration() { + return new InitializingBean() { + + @Value("${portal.config.maintenance}") + private boolean maintenance = false; + @Value("${portal.config.ssoLoginAllowed}") + private boolean ssoLoginAllowed = false; + @Value("${portal.config.defaultLanguage}") + private String defaultLanguage = "en"; + @Value("${portal.config.testInstance}") + private boolean testInstance = false; + @Value("${portal.config.sendAppInstanceFailureEmails}") + private boolean sendAppInstanceFailureEmails = false; + @Value("${portal.config.appInstanceFailureEmailList}") + private String appInstanceFailureEmailList; + + @Autowired + private ConfigurationManager configurationManager; + + @Override + public void afterPropertiesSet() throws Exception { + ConfigurationView configurationView = ConfigurationView.builder() + .maintenance(this.maintenance) + .ssoLoginAllowed(this.ssoLoginAllowed) + .defaultLanguage(this.defaultLanguage) + .testInstance(this.testInstance) + .sendAppInstanceFailureEmails(this.sendAppInstanceFailureEmails) + .appInstanceFailureEmailList(Arrays.asList(this.appInstanceFailureEmailList.split(";"))) + .build(); + try { + this.configurationManager.setConfiguration(configurationView); + } catch (OnlyOneConfigurationSupportedException e) { + log.debug("Portal configuration already exists. Skipping initialization."); + } + } + }; + } } diff --git a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationController.java b/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationController.java index d00a517f1121e0e323a7c38e8b55272425a56165..d641cd5f0433ad7138aec700d6dbad988337fcd2 100644 --- a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationController.java +++ b/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationController.java @@ -29,8 +29,8 @@ public class ConfigurationController { @PostMapping @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')") @ResponseStatus(code = HttpStatus.CREATED) - public Long addConfiguration(@RequestBody @Valid ConfigurationView configuration) { - return this.configurationManager.addConfiguration(configuration); + public Long setConfiguration(@RequestBody @Valid ConfigurationView configuration) { + return this.configurationManager.setConfiguration(configuration); } @PutMapping(value="/{id}") diff --git a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java b/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java index 01b0e4939d615599ca61709889bfa1ed34eff55a..5e6bad24fcf7d2efa2d88ce22281b96f192633a4 100644 --- a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java +++ b/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java @@ -1,9 +1,6 @@ package net.geant.nmaas.portal.api.configuration; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import javax.validation.constraints.Email; import java.util.ArrayList; @@ -13,20 +10,22 @@ import java.util.List; @NoArgsConstructor @Getter @Setter +@Builder public class ConfigurationView { private Long id; + @Builder.Default private boolean maintenance = false; - + @Builder.Default private boolean ssoLoginAllowed = false; private String defaultLanguage; - + @Builder.Default private boolean testInstance = false; - + @Builder.Default private boolean sendAppInstanceFailureEmails = false; - + @Builder.Default private List<@Email String> appInstanceFailureEmailList = new ArrayList<>(); public ConfigurationView(boolean maintenance, boolean ssoLoginAllowed, String defaultLanguage, boolean testInstance, boolean sendAppInstanceFailureEmails, List<String> appInstanceFailureEmailList) { diff --git a/src/main/java/net/geant/nmaas/portal/service/ConfigurationManager.java b/src/main/java/net/geant/nmaas/portal/service/ConfigurationManager.java index 2f5f98f188d1ce6484926d59ac8e0a2144705921..6bd7ed09b62a3a6a01c8d935df194dca8460c447 100644 --- a/src/main/java/net/geant/nmaas/portal/service/ConfigurationManager.java +++ b/src/main/java/net/geant/nmaas/portal/service/ConfigurationManager.java @@ -4,7 +4,7 @@ import net.geant.nmaas.portal.api.configuration.ConfigurationView; public interface ConfigurationManager { - Long addConfiguration(ConfigurationView configuration); + Long setConfiguration(ConfigurationView configuration); ConfigurationView getConfiguration(); void updateConfiguration(Long id, ConfigurationView updatedConfiguration); } diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerImpl.java index 435721cc090bddf7ebd16f85b1b73783615bc64f..ff679c2ec75a081126f61688d574c0bc6385b63d 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerImpl.java @@ -13,7 +13,6 @@ import org.modelmapper.ModelMapper; import org.springframework.stereotype.Component; import org.springframework.web.context.annotation.ApplicationScope; -import java.util.ArrayList; import java.util.Optional; @ApplicationScope @@ -21,11 +20,11 @@ import java.util.Optional; @Component public class ConfigurationManagerImpl implements ConfigurationManager { - private ConfigurationRepository repository; + private final ConfigurationRepository repository; - private ModelMapper modelMapper; + private final ModelMapper modelMapper; - private InternationalizationSimpleRepository internationalizationRepository; + private final InternationalizationSimpleRepository internationalizationRepository; @Override public ConfigurationView getConfiguration(){ @@ -33,7 +32,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { } @Override - public Long addConfiguration(ConfigurationView configurationView) { + public Long setConfiguration(ConfigurationView configurationView) { if(repository.count() > 0){ throw new OnlyOneConfigurationSupportedException("Configuration already exists. It can be either removed or updated"); } @@ -57,10 +56,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { } private Configuration loadSingleConfiguration(){ - if(repository.count() == 0){ - addConfiguration(new ConfigurationView(false, true, "en", false, true, new ArrayList<>())); - } - else if(repository.count() > 1){ + if(repository.count() > 1 || repository.count() == 0){ throw new IllegalStateException("Found "+repository.count()+" configuration instead of one"); } return repository.findAll().get(0); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e304f188ba37252e0b4c384fc98cc494ffc8994c..f3c7bcaf593da9c8209ab3c430ef238c57858af5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -151,4 +151,15 @@ kubernetes.deployment.smtpServerHostname=nmaas-postfix kubernetes.deployment.smtpServerPort=587 kubernetes.deployment.smtpServerUsername= kubernetes.deployment.smtpServerPassword= -kubernetes.deployment.defaultStorageClass=storageClass \ No newline at end of file +kubernetes.deployment.defaultStorageClass=storageClass + +# ------------------------ # +# Portal configuration # +# ------------------------ # +portal.config.maintenance=false +portal.config.ssoLoginAllowed=false +portal.config.defaultLanguage=en +portal.config.testInstance=false +portal.config.sendAppInstanceFailureEmails=false +# string - list of emails with ':' as a separator, e.g. admin1@nmaas.eu;admin2@nmaas.eu +portal.config.appInstanceFailureEmailList=admin@nmaas.eu diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java index 6e56af4eb46a37a238ce60705347b4b9a3d1df3a..a493f43076a67d3446634f20a8dd0e4bd1968a63 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/ConfigurationManagerTest.java @@ -59,18 +59,18 @@ public class ConfigurationManagerTest { } @Test - public void shouldAddConfiguration(){ + public void shouldSetConfiguration(){ when(repository.count()).thenReturn(0L); - Long id = configurationManager.addConfiguration(modelMapper.map(config, ConfigurationView.class)); + Long id = configurationManager.setConfiguration(modelMapper.map(config, ConfigurationView.class)); assertEquals(config.getId(), id); verify(repository, times(1)).save(any()); } @Test - public void shouldNotAddMultipleConfig(){ + public void shouldNotSetConfigIfAlreadyExists(){ assertThrows(OnlyOneConfigurationSupportedException.class, () -> { when(repository.count()).thenReturn(1L); - configurationManager.addConfiguration(modelMapper.map(config, ConfigurationView.class)); + configurationManager.setConfiguration(modelMapper.map(config, ConfigurationView.class)); }); } diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 93c069adb27b4b974c9ffdbb3816dcf170f9e144..2f6e2e93aee0a97e87d2839642038bab32ac176c 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -139,4 +139,15 @@ kubernetes.deployment.smtpServerHostname=nmaas-postfix kubernetes.deployment.smtpServerPort=587 kubernetes.deployment.smtpServerUsername= kubernetes.deployment.smtpServerPassword= -kubernetes.deployment.defaultStorageClass=storageClass \ No newline at end of file +kubernetes.deployment.defaultStorageClass=storageClass + +# ------------------------ # +# Portal configuration # +# ------------------------ # +portal.config.maintenance=false +portal.config.ssoLoginAllowed=false +portal.config.defaultLanguage=en +portal.config.testInstance=false +portal.config.sendAppInstanceFailureEmails=false +# string - list of emails with ':' as a separator, e.g. admin1@nmaas.eu;admin2@nmaas.eu +portal.config.appInstanceFailureEmailList=admin@nmaas.eu \ No newline at end of file