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

Small update to configuration template update

parent 2021264e
No related branches found
No related tags found
1 merge request!273Release 1.8.0 update
Pipeline #95408 passed
Showing
with 206 additions and 198 deletions
......@@ -193,7 +193,7 @@ public class DefaultAppLifecycleManager implements AppLifecycleManager {
for (Map.Entry<String, String> entry : map.entrySet()) {
if (entry.getValue() != null && !entry.getValue().isEmpty()) {
newMap.put(
entry.getKey().replace("#", "."),
entry.getKey().replace("_dot_", "."),
escapeCommasIfRequired(
addQuotationMarkIfRequired(
replaceHashWithQuote(entry.getValue())))
......
......@@ -55,7 +55,7 @@ public class AppDeploymentJob extends WebhookJob {
log.warn("Webhook does not exist. AppDeploymentJob is abandoned");
} catch (InvalidDeploymentIdException e) {
log.warn("Application Deployment does not exist. AppDeploymentJob is abandoned");
}catch (WebServiceCommunicationException e) {
} catch (WebServiceCommunicationException e) {
log.error("Failed to communicate with external system for the webhook of application deployment with id {}", deploymentIdStr);
throw new JobExecutionException("Failed communication with external system");
}
......
......@@ -14,7 +14,6 @@ import net.geant.nmaas.portal.persistent.repositories.UserRepository;
import net.geant.nmaas.portal.service.ApplicationService;
import net.geant.nmaas.portal.service.ConfigurationManager;
import net.geant.nmaas.portal.service.DomainService;
import net.geant.nmaas.portal.service.impl.FormioSanitizerService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
......@@ -35,158 +34,159 @@ import java.util.UUID;
@Slf4j
public class PortalConfig {
private final PasswordEncoder passwordEncoder;
@Bean
public InitializingBean insertDefaultUsers() {
return new InitializingBean() {
@Autowired
private UserRepository userRepository;
@Autowired
private DomainService domains;
@Value("${admin.password}")
String adminPassword;
@Value("${admin.email}")
String adminEmail;
@Value("${portal.config.defaultLanguage}")
private String defaultLanguage = "en";
@Override
@Transactional
public void afterPropertiesSet() {
domains.createGlobalDomain();
Optional<User> admin = userRepository.findByUsername("admin");
if (admin.isEmpty()) {
addUser("admin", adminPassword, adminEmail, Role.ROLE_SYSTEM_ADMIN);
}
}
private void addUser(String username, String password, String email, Role role) {
Optional<Domain> globalDomain = domains.getGlobalDomain();
if (globalDomain.isPresent()) {
User user = new User(username, true, passwordEncoder.encode(password), globalDomain.get(), role, true, true);
user.setEmail(email);
user.setSelectedLanguage(this.defaultLanguage);
userRepository.save(user);
}
}
};
}
@Bean
public InitializingBean insertDefaultTos() {
return new InitializingBean() {
@Autowired
private ContentRepository contentRepository;
@Autowired
private ResourceLoader resourceLoader;
@Override
@Transactional
public void afterPropertiesSet() {
Optional<Content> defaultAcceptableUsePolicy = contentRepository.findByName("aup");
if (defaultAcceptableUsePolicy.isEmpty()) {
try {
addContentToDatabase("aup", "Acceptable Use Policy", readContent("classpath:aup.txt"));
} catch (IOException err) {
throw new ProcessingException(err.getMessage());
}
}
Optional<Content> defaultPrivacyPolicy = contentRepository.findByName("privacy");
if (defaultPrivacyPolicy.isEmpty()) {
try {
addContentToDatabase("privacy", "Privacy Policy", readContent("classpath:privacy.txt"));
} catch (IOException err) {
throw new ProcessingException(err.getMessage());
}
}
}
private String readContent(String file) throws IOException {
return new String(resourceLoader.getResource(file).getInputStream().readAllBytes(), StandardCharsets.UTF_8);
}
private void addContentToDatabase(String name, String title, String content){
Content newContent = new Content(name, title, content);
contentRepository.save(newContent);
}
};
}
@Bean("portalConfiguration")
public InitializingBean saveDefaultPortalConfiguration() {
return new InitializingBean() {
@Value("${portal.config.maintenance:false}")
private boolean maintenance;
@Value("${portal.config.ssoLoginAllowed:false}")
private boolean ssoLoginAllowed;
@Value("${portal.config.defaultLanguage}")
private String defaultLanguage = "en";
@Value("${portal.config.testInstance:false}")
private boolean testInstance;
@Value("${portal.config.sendAppInstanceFailureEmails:false}")
private boolean sendAppInstanceFailureEmails;
@Value("${portal.config.appInstanceFailureEmailList}")
private String appInstanceFailureEmailList;
@Value("${portal.config.showDomainRegistrationSelector:true}")
private boolean showDomainRegistrationSelector;
@Value("${nmaas.service.deployment.parallel.limit}")
Integer bulkDeploymentPerPeriod;
@Value("${nmaas.service.bulk-deployment.cron}")
String bulkDeploymentCron;
@Value("${nmaas.service.health-check.cron}")
String healthCheckJobCron;
@Autowired
private ConfigurationManager configurationManager;
@Autowired
private ApplicationService applicationService;
@Override
public void afterPropertiesSet() {
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(";")))
.registrationDomainSelectionEnabled(this.showDomainRegistrationSelector)
.bulkDeploymentJobCron(bulkDeploymentCron)
.parallelDeploymentsLimit(bulkDeploymentPerPeriod)
.bulkDeploymentTimeThreshold(600)
.bulkDeploymentQueueRefresh(60)
.deploymentPrefix(UUID.randomUUID().toString().substring(0,3))
.healthCheckJobCron(healthCheckJobCron)
.build();
try {
this.configurationManager.setConfiguration(configurationView);
} catch (OnlyOneConfigurationSupportedException e) {
log.debug("Portal configuration already exists. Skipping initialization.");
}
applicationService.checkAllFormioTemplate();
}
};
}
private final PasswordEncoder passwordEncoder;
@Bean
public InitializingBean insertDefaultUsers() {
return new InitializingBean() {
@Autowired
private UserRepository userRepository;
@Autowired
private DomainService domains;
@Value("${admin.password}")
String adminPassword;
@Value("${admin.email}")
String adminEmail;
@Value("${portal.config.defaultLanguage}")
private String defaultLanguage = "en";
@Override
@Transactional
public void afterPropertiesSet() {
domains.createGlobalDomain();
Optional<User> admin = userRepository.findByUsername("admin");
if (admin.isEmpty()) {
addUser("admin", adminPassword, adminEmail, Role.ROLE_SYSTEM_ADMIN);
}
}
private void addUser(String username, String password, String email, Role role) {
Optional<Domain> globalDomain = domains.getGlobalDomain();
if (globalDomain.isPresent()) {
User user = new User(username, true, passwordEncoder.encode(password), globalDomain.get(), role, true, true);
user.setEmail(email);
user.setSelectedLanguage(this.defaultLanguage);
userRepository.save(user);
}
}
};
}
@Bean
public InitializingBean insertDefaultTos() {
return new InitializingBean() {
@Autowired
private ContentRepository contentRepository;
@Autowired
private ResourceLoader resourceLoader;
@Override
@Transactional
public void afterPropertiesSet() {
Optional<Content> defaultAcceptableUsePolicy = contentRepository.findByName("aup");
if (defaultAcceptableUsePolicy.isEmpty()) {
try {
addContentToDatabase("aup", "Acceptable Use Policy", readContent("classpath:aup.txt"));
} catch (IOException err) {
throw new ProcessingException(err.getMessage());
}
}
Optional<Content> defaultPrivacyPolicy = contentRepository.findByName("privacy");
if (defaultPrivacyPolicy.isEmpty()) {
try {
addContentToDatabase("privacy", "Privacy Policy", readContent("classpath:privacy.txt"));
} catch (IOException err) {
throw new ProcessingException(err.getMessage());
}
}
}
private String readContent(String file) throws IOException {
return new String(resourceLoader.getResource(file).getInputStream().readAllBytes(), StandardCharsets.UTF_8);
}
private void addContentToDatabase(String name, String title, String content) {
Content newContent = new Content(name, title, content);
contentRepository.save(newContent);
}
};
}
@Bean("portalConfiguration")
public InitializingBean saveDefaultPortalConfiguration() {
return new InitializingBean() {
@Value("${portal.config.maintenance:false}")
private boolean maintenance;
@Value("${portal.config.ssoLoginAllowed:false}")
private boolean ssoLoginAllowed;
@Value("${portal.config.defaultLanguage}")
private String defaultLanguage = "en";
@Value("${portal.config.testInstance:false}")
private boolean testInstance;
@Value("${portal.config.sendAppInstanceFailureEmails:false}")
private boolean sendAppInstanceFailureEmails;
@Value("${portal.config.appInstanceFailureEmailList}")
private String appInstanceFailureEmailList;
@Value("${portal.config.showDomainRegistrationSelector:true}")
private boolean showDomainRegistrationSelector;
@Value("${nmaas.service.deployment.parallel.limit}")
Integer bulkDeploymentPerPeriod;
@Value("${nmaas.service.bulk-deployment.cron}")
String bulkDeploymentCron;
@Value("${nmaas.service.health-check.cron}")
String healthCheckJobCron;
@Autowired
private ConfigurationManager configurationManager;
@Autowired
private ApplicationService applicationService;
@Override
public void afterPropertiesSet() {
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(";")))
.registrationDomainSelectionEnabled(this.showDomainRegistrationSelector)
.bulkDeploymentJobCron(bulkDeploymentCron)
.parallelDeploymentsLimit(bulkDeploymentPerPeriod)
.bulkDeploymentTimeThreshold(600)
.bulkDeploymentQueueRefresh(60)
.deploymentPrefix(UUID.randomUUID().toString().substring(0, 3))
.healthCheckJobCron(healthCheckJobCron)
.build();
try {
configurationManager.setConfiguration(configurationView);
} catch (OnlyOneConfigurationSupportedException e) {
log.debug("Portal configuration already exists. Skipping initialization.");
}
log.debug("Running application configuration templates update");
applicationService.checkAndUpdateAllConfigurationTemplates();
}
};
}
}
......@@ -326,7 +326,7 @@ public class ApplicationController extends AppBaseController {
application.setCreationDate(LocalDateTime.now());
this.applicationService.setMissingProperties(application, appId);
ApplicationServiceImpl.clearIds(application);
this.applicationService.checkAndUpdateFormioTemplate(application);
this.applicationService.checkAndUpdateConfigurationTemplate(application);
this.applicationService.update(application);
// create, add and persist new application version
......
......@@ -36,8 +36,18 @@ public interface ApplicationService {
boolean exists(String name, String version);
Application checkAndUpdateFormioTemplate(Application application);
/**
* Checks for an old tag used to represent a dot in configuration key string and replaces it with the new one if
* required.
*
* @param application Target application
*/
void checkAndUpdateConfigurationTemplate(Application application);
void checkAllFormioTemplate();
/**
* Checks for an old tag used to represent a dot in configuration key string and replaces it with the new one if
* required. Applies to all applications stored in the database.
*/
void checkAndUpdateAllConfigurationTemplates();
}
......@@ -41,7 +41,7 @@ public class ApplicationServiceImpl implements ApplicationService {
private final ApplicationRepository applicationRepository;
private final ApplicationEventPublisher eventPublisher;
private final FormioSanitizerService formioSanitizerService;
private final ConfigurationTemplateSanitizerService configurationTemplateSanitizerService;
@Override
......@@ -49,7 +49,7 @@ public class ApplicationServiceImpl implements ApplicationService {
@CachePut("applicationBaseS")
public Application update(Application application) {
checkApp(application);
checkAndUpdateFormioTemplate(application);
checkAndUpdateConfigurationTemplate(application);
Application saved = applicationRepository.save(application);
generateApplicationListUpdatedEvent(saved, UPDATED);
return saved;
......@@ -225,22 +225,22 @@ public class ApplicationServiceImpl implements ApplicationService {
}
@Override
public Application checkAndUpdateFormioTemplate(Application application) {
application.getConfigWizardTemplate().setTemplate(formioSanitizerService.sanitizeFormioJson(application.getConfigWizardTemplate().getTemplate()));
return application;
public void checkAndUpdateConfigurationTemplate(Application application) {
application.getConfigWizardTemplate().setTemplate(
configurationTemplateSanitizerService.sanitizeConfigurationJson(application.getConfigWizardTemplate().getTemplate())
);
}
@Override
public void checkAllFormioTemplate() {
log.warn("Checking formio template for # in keys ");
this.findAll().forEach(app -> {
log.warn("Sanitize formio wizards keys for app {}", app.getId());
if(app.getConfigWizardTemplate() != null) {
app.getConfigWizardTemplate().setTemplate(formioSanitizerService.sanitizeFormioJson(app.getConfigWizardTemplate().getTemplate()));
log.warn("sanitezed done", app.getConfigWizardTemplate().getTemplate());
public void checkAndUpdateAllConfigurationTemplates() {
findAll().forEach(app -> {
log.debug("Sanitize configuration template keys for app: {}", app.getId());
if (app.getConfigWizardTemplate() != null) {
app.getConfigWizardTemplate().setTemplate(configurationTemplateSanitizerService.sanitizeConfigurationJson(app.getConfigWizardTemplate().getTemplate()));
log.debug("Updated configuration template: {}", app.getConfigWizardTemplate().getTemplate());
}
if(app.getConfigUpdateWizardTemplate() != null) {
app.getConfigUpdateWizardTemplate().setTemplate(formioSanitizerService.sanitizeFormioJson(app.getConfigUpdateWizardTemplate().getTemplate()));
if (app.getConfigUpdateWizardTemplate() != null) {
app.getConfigUpdateWizardTemplate().setTemplate(configurationTemplateSanitizerService.sanitizeConfigurationJson(app.getConfigUpdateWizardTemplate().getTemplate()));
}
applicationRepository.save(app);
});
......
......@@ -4,24 +4,25 @@ package net.geant.nmaas.portal.service.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
public class FormioSanitizerService {
@RequiredArgsConstructor
public class ConfigurationTemplateSanitizerService {
private final ObjectMapper objectMapper;
private static final String OLD_KEY = "#";
private static final String NEW_KEY = "_dot_";
public FormioSanitizerService(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
private final ObjectMapper objectMapper;
public String sanitizeFormioJson(String json) {
public String sanitizeConfigurationJson(String json) {
try {
JsonNode root = objectMapper.readTree(json);
sanitizeKeysRecursively(root);
return objectMapper.writeValueAsString(root);
} catch (Exception e) {
throw new RuntimeException("Error parsing formio", e);
throw new RuntimeException("Error parsing configuration template", e);
}
}
......@@ -33,8 +34,8 @@ public class FormioSanitizerService {
ObjectNode objNode = (ObjectNode) node;
if (objNode.has("key")) {
String key = objNode.get("key").asText();
if (key.contains("#")) {
objNode.put("key", key.replace("#", "_dot_"));
if (key.contains(OLD_KEY)) {
objNode.put("key", key.replace(OLD_KEY, NEW_KEY));
}
}
......
......@@ -2,10 +2,9 @@ package net.geant.nmaas.orchestration;
import net.geant.nmaas.nmservice.NmServiceDeploymentStateChangeEvent;
import net.geant.nmaas.nmservice.deployment.NmServiceRepositoryManager;
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KServiceLifecycleManager;
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KubernetesRepositoryManager;
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.janitor.JanitorService;
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.KubernetesNmServiceInfo;
import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.janitor.JanitorService;
import net.geant.nmaas.orchestration.api.model.AppConfigurationView;
import net.geant.nmaas.orchestration.entities.AppConfiguration;
import net.geant.nmaas.orchestration.entities.AppDeployment;
......@@ -49,12 +48,10 @@ public class DefaultAppLifecycleManagerTest {
private final NmServiceRepositoryManager<KubernetesNmServiceInfo> serviceRepositoryManager = mock(KubernetesRepositoryManager.class);
private final JanitorService janitorService = mock(JanitorService.class);
private final AppTermsAcceptanceService appTermsAcceptanceService = mock(AppTermsAcceptanceService.class);
private final KServiceLifecycleManager kServiceLifecycleManager = mock(KServiceLifecycleManager.class);
private final ConfigurationManager configurationManager = mock(ConfigurationManager.class);
private DefaultAppLifecycleManager appLifecycleManager;
private final ConfigurationManager configurationManager = mock(ConfigurationManager.class);
@BeforeEach
void setup() {
appLifecycleManager = new DefaultAppLifecycleManager(repositoryManager, eventPublisher, serviceRepositoryManager, janitorService, appTermsAcceptanceService, configurationManager);
......@@ -190,22 +187,22 @@ public class DefaultAppLifecycleManagerTest {
}
@Test
void shouldReplaceHashToDotsInMapKeys() {
void shouldReplaceDotsToDotsInMapKeys() {
Map<String, String> input = new HashMap<>();
input.put("keywith#", "value");
input.put("keywith#inthemiddle", "value");
input.put("keywith#andnullvalue", null);
input.put("keywith#andemptyvalue", "");
input.put("keywith_dot_", "value");
input.put("keywith_dot_inthemiddle", "value");
input.put("keywith_dot_andnullvalue", null);
input.put("keywith_dot_andemptyvalue", "");
Map<String, String> output = DefaultAppLifecycleManager.replaceHashWithDotInMapKeysAndProcessValues(input);
assertThat(output.keySet().size(), is(2));
assertThat(output.size(), is(2));
assertThat(output.keySet().containsAll(Arrays.asList("keywith.", "keywith.inthemiddle")), is(true));
}
@Test
void shouldAddQuotesInMapValuesWhereRequired() {
Map<String, String> input = new HashMap<>();
input.put("keywith#", "value");
input.put("keywith#inthemiddle", "value, this value and another value");
input.put("keywith_dot_", "value");
input.put("keywith_dot_inthemiddle", "value, this value and another value");
Map<String, String> output = DefaultAppLifecycleManager.replaceHashWithDotInMapKeysAndProcessValues(input);
assertThat(output.values().containsAll(Arrays.asList("value", "\"value\\, this value and another value\"")), is(true));
}
......
......@@ -41,13 +41,13 @@ public class ApplicationServiceImplTest {
ApplicationRepository applicationRepository = mock(ApplicationRepository.class);
ApplicationEventPublisher eventPublisher = mock(ApplicationEventPublisher.class);
FormioSanitizerService formioSanitizerService = mock(FormioSanitizerService.class);
ConfigurationTemplateSanitizerService configurationTemplateSanitizerService = mock(ConfigurationTemplateSanitizerService.class);
ApplicationServiceImpl applicationService;
@BeforeEach
void setup(){
applicationService = new ApplicationServiceImpl(applicationRepository, eventPublisher, formioSanitizerService);
applicationService = new ApplicationServiceImpl(applicationRepository, eventPublisher, configurationTemplateSanitizerService);
}
@Test
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment