Skip to content
Snippets Groups Projects
Commit ed07f078 authored by Lukasz Lopatowski's avatar Lukasz Lopatowski
Browse files

Pull request #777: NMAAS-984 read initial portal configuration from properties

Merge in NMAAS/nmaas from NMAAS-984-read-initial-portal-configuration-from-properties to develop

* commit '57aa0f2f':
  NMAAS-984: Initializing only if configuration doesn't exist
  NMAAS-984 changes to avoid failing tests
  NMAAS-984 delegate initial configuration delegation to initializing bean
parents ff80cd27 57aa0f2f
Branches
Tags
No related merge requests found
Showing with 113 additions and 31 deletions
...@@ -145,3 +145,14 @@ kubernetes.deployment.smtpServerUsername=${SMTP_LOGIN} ...@@ -145,3 +145,14 @@ kubernetes.deployment.smtpServerUsername=${SMTP_LOGIN}
kubernetes.deployment.smtpServerPassword=${SMTP_PASSWORD} kubernetes.deployment.smtpServerPassword=${SMTP_PASSWORD}
kubernetes.deployment.defaultStorageClass=${K8S_DEPLOYMENT_DEFAULT_STORAGE_CLASS} kubernetes.deployment.defaultStorageClass=${K8S_DEPLOYMENT_DEFAULT_STORAGE_CLASS}
kubernetes.deployment.forceDedicatedWorkers=false 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}
...@@ -142,4 +142,15 @@ kubernetes.deployment.smtpServerHostname=test-postfix ...@@ -142,4 +142,15 @@ kubernetes.deployment.smtpServerHostname=test-postfix
kubernetes.deployment.smtpServerPort=587 kubernetes.deployment.smtpServerPort=587
kubernetes.deployment.smtpServerUsername= kubernetes.deployment.smtpServerUsername=
kubernetes.deployment.smtpServerPassword= kubernetes.deployment.smtpServerPassword=
kubernetes.deployment.defaultStorageClass=storageClass kubernetes.deployment.defaultStorageClass=storageClass
\ No newline at end of file
# ------------------------ #
# 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
package net.geant.nmaas.portal; package net.geant.nmaas.portal;
import lombok.extern.log4j.Log4j2;
import net.geant.nmaas.monitor.MonitorManager; import net.geant.nmaas.monitor.MonitorManager;
import net.geant.nmaas.monitor.ServiceType; import net.geant.nmaas.monitor.ServiceType;
import net.geant.nmaas.monitor.model.MonitorEntryView; import net.geant.nmaas.monitor.model.MonitorEntryView;
import net.geant.nmaas.monitor.scheduling.ScheduleManager; 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.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.Content;
import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Domain;
import net.geant.nmaas.portal.persistent.entity.Role; import net.geant.nmaas.portal.persistent.entity.Role;
...@@ -31,6 +34,7 @@ import java.util.Optional; ...@@ -31,6 +34,7 @@ import java.util.Optional;
@Configuration @Configuration
@ComponentScan(basePackages={"net.geant.nmaas.portal.service"}) @ComponentScan(basePackages={"net.geant.nmaas.portal.service"})
@Log4j2
public class PortalConfig { public class PortalConfig {
private PasswordEncoder passwordEncoder; private PasswordEncoder passwordEncoder;
...@@ -50,15 +54,15 @@ public class PortalConfig { ...@@ -50,15 +54,15 @@ public class PortalConfig {
@Autowired @Autowired
private DomainService domains; private DomainService domains;
@Autowired
private ConfigurationManager configurationManager;
@Value("${admin.password}") @Value("${admin.password}")
String adminPassword; String adminPassword;
@Value("${admin.email}") @Value("${admin.email}")
String adminEmail; String adminEmail;
@Value("${portal.config.defaultLanguage}")
private String defaultLanguage = "en";
@Override @Override
@Transactional @Transactional
public void afterPropertiesSet() { public void afterPropertiesSet() {
...@@ -75,7 +79,7 @@ public class PortalConfig { ...@@ -75,7 +79,7 @@ public class PortalConfig {
if(globalDomain.isPresent()) { if(globalDomain.isPresent()) {
User user = new User(username, true, passwordEncoder.encode(password), globalDomain.get(), role, true, true); User user = new User(username, true, passwordEncoder.encode(password), globalDomain.get(), role, true, true);
user.setEmail(email); user.setEmail(email);
user.setSelectedLanguage(configurationManager.getConfiguration().getDefaultLanguage()); user.setSelectedLanguage(this.defaultLanguage);
userRepository.save(user); userRepository.save(user);
} }
} }
...@@ -153,4 +157,43 @@ public class PortalConfig { ...@@ -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.");
}
}
};
}
} }
...@@ -29,8 +29,8 @@ public class ConfigurationController { ...@@ -29,8 +29,8 @@ public class ConfigurationController {
@PostMapping @PostMapping
@PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')") @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')")
@ResponseStatus(code = HttpStatus.CREATED) @ResponseStatus(code = HttpStatus.CREATED)
public Long addConfiguration(@RequestBody @Valid ConfigurationView configuration) { public Long setConfiguration(@RequestBody @Valid ConfigurationView configuration) {
return this.configurationManager.addConfiguration(configuration); return this.configurationManager.setConfiguration(configuration);
} }
@PutMapping(value="/{id}") @PutMapping(value="/{id}")
......
package net.geant.nmaas.portal.api.configuration; package net.geant.nmaas.portal.api.configuration;
import lombok.AllArgsConstructor; import lombok.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.Email; import javax.validation.constraints.Email;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -13,20 +10,22 @@ import java.util.List; ...@@ -13,20 +10,22 @@ import java.util.List;
@NoArgsConstructor @NoArgsConstructor
@Getter @Getter
@Setter @Setter
@Builder
public class ConfigurationView { public class ConfigurationView {
private Long id; private Long id;
@Builder.Default
private boolean maintenance = false; private boolean maintenance = false;
@Builder.Default
private boolean ssoLoginAllowed = false; private boolean ssoLoginAllowed = false;
private String defaultLanguage; private String defaultLanguage;
@Builder.Default
private boolean testInstance = false; private boolean testInstance = false;
@Builder.Default
private boolean sendAppInstanceFailureEmails = false; private boolean sendAppInstanceFailureEmails = false;
@Builder.Default
private List<@Email String> appInstanceFailureEmailList = new ArrayList<>(); private List<@Email String> appInstanceFailureEmailList = new ArrayList<>();
public ConfigurationView(boolean maintenance, boolean ssoLoginAllowed, String defaultLanguage, boolean testInstance, boolean sendAppInstanceFailureEmails, List<String> appInstanceFailureEmailList) { public ConfigurationView(boolean maintenance, boolean ssoLoginAllowed, String defaultLanguage, boolean testInstance, boolean sendAppInstanceFailureEmails, List<String> appInstanceFailureEmailList) {
......
...@@ -4,7 +4,7 @@ import net.geant.nmaas.portal.api.configuration.ConfigurationView; ...@@ -4,7 +4,7 @@ import net.geant.nmaas.portal.api.configuration.ConfigurationView;
public interface ConfigurationManager { public interface ConfigurationManager {
Long addConfiguration(ConfigurationView configuration); Long setConfiguration(ConfigurationView configuration);
ConfigurationView getConfiguration(); ConfigurationView getConfiguration();
void updateConfiguration(Long id, ConfigurationView updatedConfiguration); void updateConfiguration(Long id, ConfigurationView updatedConfiguration);
} }
...@@ -13,7 +13,6 @@ import org.modelmapper.ModelMapper; ...@@ -13,7 +13,6 @@ import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.ApplicationScope; import org.springframework.web.context.annotation.ApplicationScope;
import java.util.ArrayList;
import java.util.Optional; import java.util.Optional;
@ApplicationScope @ApplicationScope
...@@ -21,11 +20,11 @@ import java.util.Optional; ...@@ -21,11 +20,11 @@ import java.util.Optional;
@Component @Component
public class ConfigurationManagerImpl implements ConfigurationManager { 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 @Override
public ConfigurationView getConfiguration(){ public ConfigurationView getConfiguration(){
...@@ -33,7 +32,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { ...@@ -33,7 +32,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
} }
@Override @Override
public Long addConfiguration(ConfigurationView configurationView) { public Long setConfiguration(ConfigurationView configurationView) {
if(repository.count() > 0){ if(repository.count() > 0){
throw new OnlyOneConfigurationSupportedException("Configuration already exists. It can be either removed or updated"); throw new OnlyOneConfigurationSupportedException("Configuration already exists. It can be either removed or updated");
} }
...@@ -57,10 +56,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { ...@@ -57,10 +56,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
} }
private Configuration loadSingleConfiguration(){ private Configuration loadSingleConfiguration(){
if(repository.count() == 0){ if(repository.count() > 1 || repository.count() == 0){
addConfiguration(new ConfigurationView(false, true, "en", false, true, new ArrayList<>()));
}
else if(repository.count() > 1){
throw new IllegalStateException("Found "+repository.count()+" configuration instead of one"); throw new IllegalStateException("Found "+repository.count()+" configuration instead of one");
} }
return repository.findAll().get(0); return repository.findAll().get(0);
......
...@@ -151,4 +151,15 @@ kubernetes.deployment.smtpServerHostname=nmaas-postfix ...@@ -151,4 +151,15 @@ kubernetes.deployment.smtpServerHostname=nmaas-postfix
kubernetes.deployment.smtpServerPort=587 kubernetes.deployment.smtpServerPort=587
kubernetes.deployment.smtpServerUsername= kubernetes.deployment.smtpServerUsername=
kubernetes.deployment.smtpServerPassword= kubernetes.deployment.smtpServerPassword=
kubernetes.deployment.defaultStorageClass=storageClass kubernetes.deployment.defaultStorageClass=storageClass
\ No newline at end of file
# ------------------------ #
# 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
...@@ -59,18 +59,18 @@ public class ConfigurationManagerTest { ...@@ -59,18 +59,18 @@ public class ConfigurationManagerTest {
} }
@Test @Test
public void shouldAddConfiguration(){ public void shouldSetConfiguration(){
when(repository.count()).thenReturn(0L); 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); assertEquals(config.getId(), id);
verify(repository, times(1)).save(any()); verify(repository, times(1)).save(any());
} }
@Test @Test
public void shouldNotAddMultipleConfig(){ public void shouldNotSetConfigIfAlreadyExists(){
assertThrows(OnlyOneConfigurationSupportedException.class, () -> { assertThrows(OnlyOneConfigurationSupportedException.class, () -> {
when(repository.count()).thenReturn(1L); when(repository.count()).thenReturn(1L);
configurationManager.addConfiguration(modelMapper.map(config, ConfigurationView.class)); configurationManager.setConfiguration(modelMapper.map(config, ConfigurationView.class));
}); });
} }
......
...@@ -139,4 +139,15 @@ kubernetes.deployment.smtpServerHostname=nmaas-postfix ...@@ -139,4 +139,15 @@ kubernetes.deployment.smtpServerHostname=nmaas-postfix
kubernetes.deployment.smtpServerPort=587 kubernetes.deployment.smtpServerPort=587
kubernetes.deployment.smtpServerUsername= kubernetes.deployment.smtpServerUsername=
kubernetes.deployment.smtpServerPassword= kubernetes.deployment.smtpServerPassword=
kubernetes.deployment.defaultStorageClass=storageClass kubernetes.deployment.defaultStorageClass=storageClass
\ No newline at end of file
# ------------------------ #
# 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment