diff --git a/build.gradle b/build.gradle index 34f0707183e6c6741a090eca85db187bd1d2d0cc..01fcd2bd5d732f7799c463021bad7883a366397c 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,7 @@ protobuf { } plugins { grpc { - artifact = 'io.grpc:protoc-gen-grpc-java:1.72.0' + artifact = 'io.grpc:protoc-gen-grpc-java:1.73.0' } } generateProtoTasks { @@ -132,9 +132,9 @@ dependencies { // GRPC communication with Janitor implementation('com.google.protobuf:protobuf-java:4.31.0') - implementation('io.grpc:grpc-netty-shaded:1.72.0') - implementation('io.grpc:grpc-protobuf:1.72.0') - implementation('io.grpc:grpc-stub:1.72.0') + implementation('io.grpc:grpc-netty-shaded:1.73.0') + implementation('io.grpc:grpc-protobuf:1.73.0') + implementation('io.grpc:grpc-stub:1.73.0') // CSV processing implementation('com.opencsv:opencsv:5.11') @@ -247,9 +247,7 @@ jacocoTestCoverageVerification { ] excludes = [ '**.model*', - '**.exceptions**', - '**.exception**', - 'net.geant.nmaas.portal.api.bulk' + '**.exceptions**' ] limit { counter = 'INSTRUCTION' @@ -260,8 +258,7 @@ jacocoTestCoverageVerification { rule { element = 'PACKAGE' includes = [ - 'net.geant.nmaas.orchestration.**', - 'net.geant.nmaas.portal.api.bulk' + 'net.geant.nmaas.orchestration.**' ] excludes = [ '**.model*', diff --git a/docker/logback.xml b/docker/logback.xml index 92f1b67a8c725b0f334bb7195c7d04dedf87ef3a..18dcc2d30c020a04c0b2a347b414e3e27e9c5653 100644 --- a/docker/logback.xml +++ b/docker/logback.xml @@ -84,6 +84,11 @@ <appender-ref ref="nmaas-console"/> </logger> + <logger name="io.fabric8.kubernetes.client" level="INFO" additivity="false"> + <appender-ref ref="nmaas-file"/> + <appender-ref ref="nmaas-console"/> + </logger> + <root level="DEBUG"> <appender-ref ref="nmaas-file" /> <appender-ref ref="nmaas-console" /> diff --git a/src/integrationTest/java/net/geant/nmaas/nmservice/deployment/ServiceDeploymentWithKubernetesTest.java b/src/integrationTest/java/net/geant/nmaas/nmservice/deployment/ServiceDeploymentWithKubernetesTest.java index 12221857a73a159df9d65fb982c435bbf841b09b..25cdb65cc27c6a5cf4f98c5fdc9bf95e8a570944 100644 --- a/src/integrationTest/java/net/geant/nmaas/nmservice/deployment/ServiceDeploymentWithKubernetesTest.java +++ b/src/integrationTest/java/net/geant/nmaas/nmservice/deployment/ServiceDeploymentWithKubernetesTest.java @@ -1,5 +1,6 @@ package net.geant.nmaas.nmservice.deployment; +import net.geant.nmaas.externalservices.kubernetes.RemoteClusterManager; import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KubernetesRepositoryManager; import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.*; import net.geant.nmaas.nmservice.deployment.exceptions.NmServiceRequestVerificationException; @@ -24,6 +25,8 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.core.IsNull.notNullValue; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; @ExtendWith(SpringExtension.class) @SpringBootTest @@ -35,6 +38,9 @@ class ServiceDeploymentWithKubernetesTest { @Autowired private KubernetesRepositoryManager repositoryManager; + @Autowired + private RemoteClusterManager remoteClusterManager; + private static final Identifier deploymentId = Identifier.newInstance(1L); @AfterEach @@ -93,6 +99,7 @@ class ServiceDeploymentWithKubernetesTest { .applicationId(Identifier.newInstance("appId")) .deploymentName("deploy") .configFileRepositoryRequired(false) + .remoteClusterId(1L) .appName("AppName").build(); } diff --git a/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java b/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java index d9dc7e03f7f7996863c85f78aacdb0e984ac3a25..d3ac198289fbdb5b1124718312dfaad70a3dcc39 100644 --- a/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java +++ b/src/integrationTest/java/net/geant/nmaas/portal/api/configuration/ConfigurationControllerTest.java @@ -2,6 +2,7 @@ package net.geant.nmaas.portal.api.configuration; import com.fasterxml.jackson.databind.ObjectMapper; import net.geant.nmaas.portal.api.BaseControllerTestSetup; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.api.i18n.api.InternationalizationView; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.persistent.entity.UsersHelper; diff --git a/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java b/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java index c4921e7bf0a844a2e0f32febb65c898b1033fc33..92c482a89f9902dbed4712118172894120d32300 100644 --- a/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java +++ b/src/integrationTest/java/net/geant/nmaas/portal/api/user/UsersControllerIntTest.java @@ -10,8 +10,8 @@ import net.geant.nmaas.portal.api.domain.PasswordReset; import net.geant.nmaas.portal.api.domain.UserRequest; import net.geant.nmaas.portal.api.domain.UserRoleView; import net.geant.nmaas.portal.api.domain.UserView; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.User; diff --git a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java index 99f48216d8a201f94a4ec36277bb1d4ac90d7dd6..c218c1adea52a5780b3c4b33d1089d6da8c28e89 100644 --- a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java +++ b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceIntTest.java @@ -2,10 +2,10 @@ package net.geant.nmaas.portal.service.impl; import jakarta.transaction.Transactional; import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.components.janitor.JanitorService; -import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS; import net.geant.nmaas.portal.api.bulk.BulkType; import net.geant.nmaas.portal.api.bulk.CsvDomain; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.api.domain.UserViewMinimal; import net.geant.nmaas.portal.persistent.entity.BulkDeployment; import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState; diff --git a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/DomainServiceIntTest.java b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/DomainServiceIntTest.java index 0fcdcdb8879f8e04a24329e0ddb01754f2834382..d0a09110d915da06f1b5e5094c82ef03b7ab576d 100644 --- a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/DomainServiceIntTest.java +++ b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/DomainServiceIntTest.java @@ -16,7 +16,6 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.ArrayList; -import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -52,7 +51,7 @@ public class DomainServiceIntTest { domainService.createDomain(domainRequest1); - assertThat(domainService.getDomains().stream().map(Domain::getName).collect(Collectors.toList())).contains("GLOBAL", "domainName"); + assertThat(domainService.getDomains().stream().map(Domain::getName).toList()).contains("GLOBAL", "domainName"); Long domainId = domainService.findDomain("domainName").orElseThrow().getId(); domainService.softRemoveDomain(domainId); diff --git a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/LocalFileStorageServiceTest.java b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/LocalFileStorageServiceTest.java index 3b01ff02670b783969f93724c56398aa27429fa1..110262496529de0191f98467ded48606ef4bda46 100644 --- a/src/integrationTest/java/net/geant/nmaas/portal/service/impl/LocalFileStorageServiceTest.java +++ b/src/integrationTest/java/net/geant/nmaas/portal/service/impl/LocalFileStorageServiceTest.java @@ -1,7 +1,7 @@ package net.geant.nmaas.portal.service.impl; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.StorageException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.StorageException; import net.geant.nmaas.portal.persistent.entity.FileInfo; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/src/main/java/net/geant/nmaas/dcn/deployment/api/DcnAdminController.java b/src/main/java/net/geant/nmaas/dcn/deployment/api/DcnAdminController.java index e7c0d3d8b13dae0d17522b2b75301a91c2e22fa8..373d58e4d55a9c9d790066d1a627167eb3b8326c 100644 --- a/src/main/java/net/geant/nmaas/dcn/deployment/api/DcnAdminController.java +++ b/src/main/java/net/geant/nmaas/dcn/deployment/api/DcnAdminController.java @@ -31,7 +31,7 @@ public class DcnAdminController { public List<DcnView> listAllDcns() { return dcnRepositoryManager.loadAllNetworks().stream() .map(DcnView::new) - .collect(Collectors.toList()); + .toList(); } } diff --git a/src/main/java/net/geant/nmaas/externalservices/kubernetes/RemoteClusterManager.java b/src/main/java/net/geant/nmaas/externalservices/kubernetes/RemoteClusterManager.java index 36ae7abb54274fa717b06109e22bd0bbf82b5a44..bf8c9f6a1db8dc3a6c1a2c250a9c070c78b3402e 100644 --- a/src/main/java/net/geant/nmaas/externalservices/kubernetes/RemoteClusterManager.java +++ b/src/main/java/net/geant/nmaas/externalservices/kubernetes/RemoteClusterManager.java @@ -151,11 +151,7 @@ public class RemoteClusterManager implements ClusterMonitoringService { .state(KClusterState.UNKNOWN) .contactEmail(view.getContactEmail()) .currentStateSince(OffsetDateTime.now()) - .domains(!view.getDomainNames().isEmpty() ? view.getDomainNames().stream().map(d -> { - Optional<Domain> dom = domainService.findDomain(d); - return dom.orElse(null); - } - ).toList() : Collections.emptyList()) + .domains(prepareList(view)) .build(), file); @@ -170,6 +166,17 @@ public class RemoteClusterManager implements ClusterMonitoringService { return null; } + private List<Domain> prepareList(RemoteClusterView view) { + if (view == null || view.getDomainNames() == null) { + return Collections.emptyList(); + } + return view.getDomainNames().stream().map(d -> { + Optional<Domain> dom = domainService.findDomain(d); + return dom.orElse(null); + } + ).toList(); + } + public RemoteClusterView updateCluster(RemoteClusterView cluster, Long id) { Optional<KCluster> entity = clusterRepository.findById(id); @@ -236,9 +243,11 @@ public class RemoteClusterManager implements ClusterMonitoringService { } } - private RemoteClusterView toView(KCluster KCluster) { - RemoteClusterView view = modelMapper.map(KCluster, RemoteClusterView.class); - view.setDomainNames(KCluster.getDomains().stream().map(Domain::getName).toList()); + private RemoteClusterView toView(KCluster kCluster) { + RemoteClusterView view = modelMapper.map(kCluster, RemoteClusterView.class); + if (Objects.nonNull(kCluster.getDomains())) { + view.setDomainNames(kCluster.getDomains().stream().map(Domain::getName).toList()); + } return view; } @@ -332,7 +341,7 @@ public class RemoteClusterManager implements ClusterMonitoringService { public void removeCluster(Long id) { try { - if(clusterRepository.existsById(id)) { + if (clusterRepository.existsById(id)) { this.clusterRepository.deleteById(id); } } catch (RuntimeException ex) { @@ -342,4 +351,8 @@ public class RemoteClusterManager implements ClusterMonitoringService { } + public boolean clusterExists(Long id) { + return clusterRepository.existsById(id); + } + } \ No newline at end of file diff --git a/src/main/java/net/geant/nmaas/kubernetes/KubernetesConnectorHelper.java b/src/main/java/net/geant/nmaas/kubernetes/KubernetesConnectorHelper.java index fb1391f8a1be91e1d2a13ee7bb755596cb89d523..ab2d4000520db7f7ab25f3a8bd1a472ea5fa1f4b 100644 --- a/src/main/java/net/geant/nmaas/kubernetes/KubernetesConnectorHelper.java +++ b/src/main/java/net/geant/nmaas/kubernetes/KubernetesConnectorHelper.java @@ -5,7 +5,7 @@ import io.fabric8.kubernetes.client.KubernetesClient; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.orchestration.AppDeploymentRepositoryManager; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.AppInstance; import net.geant.nmaas.portal.service.ApplicationInstanceService; import org.springframework.stereotype.Component; diff --git a/src/main/java/net/geant/nmaas/monitor/MonitorManager.java b/src/main/java/net/geant/nmaas/monitor/MonitorManager.java index 71f5d2895280a379110db9d0e23b4d3bcda23eaf..8dcb17fb1d591b5de80770e02352f0dbed9139ef 100644 --- a/src/main/java/net/geant/nmaas/monitor/MonitorManager.java +++ b/src/main/java/net/geant/nmaas/monitor/MonitorManager.java @@ -18,7 +18,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; @Component @RequiredArgsConstructor @@ -31,19 +30,19 @@ public class MonitorManager { public void createMonitorEntry(MonitorEntryView monitorEntryView) { validateMonitorEntryCreation(monitorEntryView); - this.repository.save(modelMapper.map(monitorEntryView, MonitorEntry.class)); + repository.save(modelMapper.map(monitorEntryView, MonitorEntry.class)); } public void updateMonitorEntry(MonitorEntryView monitorEntryView) { - MonitorEntry monitorEntry = this.repository.findByServiceName(monitorEntryView.getServiceName()) + MonitorEntry monitorEntry = repository.findByServiceName(monitorEntryView.getServiceName()) .orElseThrow(() -> new MonitorEntryNotFound(monitorEntryNotFoundMessage(monitorEntryView.getServiceName().getName()))); validateMonitorEntryUpdate(monitorEntryView); monitorEntryView.setId(monitorEntry.getId()); - this.repository.save(modelMapper.map(monitorEntryView, MonitorEntry.class)); + repository.save(modelMapper.map(monitorEntryView, MonitorEntry.class)); } public void updateMonitorEntry(Date lastCheck, ServiceType serviceType, MonitorStatus status) { - MonitorEntry monitorEntry = this.repository.findByServiceName(serviceType) + MonitorEntry monitorEntry = repository.findByServiceName(serviceType) .orElseThrow(() -> new MonitorEntryNotFound(monitorEntryNotFoundMessage(serviceType.getName()))); validateMonitorEntryUpdate(lastCheck, status); monitorEntry.setStatus(status); @@ -54,33 +53,33 @@ public class MonitorManager { } else if (status.equals(MonitorStatus.FAILURE)) { eventPublisher.publishEvent(new NotificationEvent(this, getMailAttributes(serviceType.getName()))); } - this.repository.save(monitorEntry); + repository.save(monitorEntry); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void deleteMonitorEntry(String serviceName) { - if (this.repository.existsByServiceName(ServiceType.valueOf(serviceName.toUpperCase()))) { - this.repository.deleteByServiceName(ServiceType.valueOf(serviceName.toUpperCase())); + if (repository.existsByServiceName(ServiceType.valueOf(serviceName.toUpperCase()))) { + repository.deleteByServiceName(ServiceType.valueOf(serviceName.toUpperCase())); } } public List<MonitorEntryView> getAllMonitorEntries() { - return this.repository.findAll().stream() - .map(entity -> this.modelMapper.map(entity, MonitorEntryView.class)) - .collect(Collectors.toList()); + return repository.findAll().stream() + .map(entity -> modelMapper.map(entity, MonitorEntryView.class)) + .toList(); } public MonitorEntryView getMonitorEntries(String serviceName) { - return this.repository.findByServiceName(ServiceType.valueOf(serviceName.toUpperCase())) - .map(entity -> this.modelMapper.map(entity, MonitorEntryView.class)) + return repository.findByServiceName(ServiceType.valueOf(serviceName.toUpperCase())) + .map(entity -> modelMapper.map(entity, MonitorEntryView.class)) .orElseThrow(() -> new MonitorEntryNotFound(monitorEntryNotFoundMessage(serviceName))); } public void changeJobState(String serviceName, boolean active) { - MonitorEntry monitorEntry = this.repository.findByServiceName(ServiceType.valueOf(serviceName.toUpperCase())) + MonitorEntry monitorEntry = repository.findByServiceName(ServiceType.valueOf(serviceName.toUpperCase())) .orElseThrow(() -> new MonitorEntryNotFound(monitorEntryNotFoundMessage(serviceName.toUpperCase()))); monitorEntry.setActive(active); - this.repository.save(monitorEntry); + repository.save(monitorEntry); } public boolean existsByServiceName(ServiceType serviceName) { diff --git a/src/main/java/net/geant/nmaas/nmservice/configuration/ConfigFilePreparer.java b/src/main/java/net/geant/nmaas/nmservice/configuration/ConfigFilePreparer.java index e7c1fff025a06360cc275dfa07c5e787aa6e6bfd..fb744fd443c03bd0746b7840ee693bdb9792e6ad 100644 --- a/src/main/java/net/geant/nmaas/nmservice/configuration/ConfigFilePreparer.java +++ b/src/main/java/net/geant/nmaas/nmservice/configuration/ConfigFilePreparer.java @@ -23,7 +23,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; import static net.geant.nmaas.nmservice.configuration.ConfigFilePreparerHelper.convertToFreemarkerTemplate; import static net.geant.nmaas.nmservice.configuration.ConfigFilePreparerHelper.createModelEntriesFromUserInput; @@ -94,7 +93,7 @@ class ConfigFilePreparer { } List<String> ipAddresses = devices.stream() .map(device -> (String) ((Map) device).get(DEFAULT_MANAGED_DEVICE_IP_ADDRESS_KEY)) - .collect(Collectors.toList()); + .toList(); nmServiceRepositoryManager.updateManagedDevices(deploymentId, ipAddresses); } diff --git a/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabEventsListener.java b/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabEventsListener.java index 34e4ce562525fbe35f3e7a931fed75cd80c1c12b..bbc39b7783117c54c3070ef0ec7a1cb5af8cb9af 100644 --- a/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabEventsListener.java +++ b/src/main/java/net/geant/nmaas/nmservice/configuration/gitlab/GitLabEventsListener.java @@ -9,7 +9,7 @@ import net.geant.nmaas.nmservice.configuration.gitlab.events.RemoveUserFromRepos import net.geant.nmaas.nmservice.configuration.gitlab.events.UserSshKeysUpdatedGitlabEvent; import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KubernetesRepositoryManager; import net.geant.nmaas.orchestration.Identifier; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java index 1cb6ce71487bd05b78fbade29f70dae91319b9af..d3fe9e1e81b0bc3140053a1c0bf6771d36569524 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManager.java @@ -4,6 +4,7 @@ import com.google.common.base.Strings; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManager; +import net.geant.nmaas.externalservices.kubernetes.RemoteClusterManager; import net.geant.nmaas.externalservices.kubernetes.entities.IngressControllerConfigOption; import net.geant.nmaas.gitlab.GitLabManager; import net.geant.nmaas.gitlab.exceptions.GitLabInvalidConfigurationException; @@ -39,7 +40,7 @@ import net.geant.nmaas.orchestration.entities.AppDeploymentSpec; import net.geant.nmaas.orchestration.entities.AppStorageVolume; import net.geant.nmaas.orchestration.exceptions.InvalidConfigurationException; import net.geant.nmaas.orchestration.exceptions.InvalidDeploymentIdException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.utils.logging.LogLevel; import net.geant.nmaas.utils.logging.Loggable; import org.apache.commons.lang3.StringUtils; @@ -81,6 +82,7 @@ public class KubernetesManager implements ContainerOrchestrator { private final KubernetesClusterIngressManager ingressManager; private final GitLabManager gitLabManager; private final JanitorService janitorService; + private final RemoteClusterManager remoteClusterManager; @Override @Loggable(LogLevel.INFO) @@ -96,6 +98,7 @@ public class KubernetesManager implements ContainerOrchestrator { } catch (IllegalArgumentException iae) { throw new NmServiceRequestVerificationException(iae.getMessage()); } + //todo KubernetesNmServiceInfo serviceInfo = new KubernetesNmServiceInfo( deploymentId, @@ -103,6 +106,11 @@ public class KubernetesManager implements ContainerOrchestrator { appDeployment.getDomain(), appDeployment.getDescriptiveDeploymentId() ); + //verify cluster + if(remoteClusterManager.clusterExists(appDeployment.getRemoteClusterId())) { + serviceInfo.setRemoteCluster(remoteClusterManager.getCluster(appDeployment.getRemoteClusterId())); + } + serviceInfo.setKubernetesTemplate(KubernetesTemplate.copy(appDeploymentSpec.getKubernetesTemplate())); serviceInfo.setStorageVolumes(generateTemplateStorageVolumes(appDeploymentSpec.getStorageVolumes())); serviceInfo.setAccessMethods(generateTemplateAccessMethods(appDeploymentSpec.getAccessMethods())); diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommand.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommand.java index f4ba07022f7d0a78e95fe8f4dcf31ab0dec71644..0aaf87e860233474089ba70039fbce2394495cdd 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommand.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommand.java @@ -16,6 +16,8 @@ public abstract class HelmCommand implements Command { protected static final String HELM_VERSION_2 = "v2"; protected static final String HELM_VERSION_3 = "v3"; + protected static final String OPTION_KUBECONFIG = "--kubeconfig"; + protected String command; @Override diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandExecutor.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandExecutor.java index 01a3fd9b4307cc5eea008c719b76d0442d1d6b4c..dfc719d8abda50051c29c5f4b2ed08aba522ece6 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandExecutor.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandExecutor.java @@ -46,11 +46,11 @@ public class HelmCommandExecutor { this.enableTls = enableTls; } - void executeHelmInstallCommand(String namespace, String releaseName, KubernetesTemplate template, Map<String, String> arguments) { - executeInstall(namespace, releaseName, template, arguments); + void executeHelmInstallCommand(String namespace, String releaseName, KubernetesTemplate template, Map<String, String> arguments, String kubeConfigPath) { + executeInstall(namespace, releaseName, template, arguments, kubeConfigPath); } - private void executeInstall(String namespace, String releaseName, KubernetesTemplate template, Map<String, String> arguments) { + private void executeInstall(String namespace, String releaseName, KubernetesTemplate template, Map<String, String> arguments, String kubeConfigPath) { try { HelmInstallCommand command = HelmInstallCommand.commandWithRepo( helmVersion, @@ -59,7 +59,8 @@ public class HelmCommandExecutor { arguments, constructChartNameWithRepo(template.getChart().getName()), template.getChart().getVersion(), - enableTls + enableTls, + kubeConfigPath ); commandExecutor.execute(command); } catch (CommandExecutionException e) { diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManager.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManager.java index 54f10b9f4871be7484741667bb567482f10e0476..f8b3e1aa50039a106cfb4eb9ee31e4646b46f4f4 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManager.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManager.java @@ -7,6 +7,7 @@ import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManag import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterNamespaceService; import net.geant.nmaas.externalservices.kubernetes.entities.IngressCertificateConfigOption; import net.geant.nmaas.externalservices.kubernetes.entities.IngressResourceConfigOption; +import net.geant.nmaas.externalservices.kubernetes.entities.KCluster; 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.entities.KubernetesNmServiceInfo; @@ -76,26 +77,41 @@ public class HelmKServiceManager implements KServiceLifecycleManager { namespaceService.namespace(serviceInfo.getDomain()), serviceInfo.getDescriptiveDeploymentId().getValue(), serviceInfo.getKubernetesTemplate(), - createArgumentsMap(serviceInfo) + createArgumentsMap(serviceInfo), + serviceInfo.getRemoteCluster() != null ? serviceInfo.getRemoteCluster().getPathConfigFile() : null ); } private Map<String, String> createArgumentsMap(KubernetesNmServiceInfo serviceInfo) { Map<String, String> arguments = new HashMap<>(); - if (deploymentManager.getForceDedicatedWorkers()) { - arguments.put(HELM_INSTALL_OPTION_DEDICATED_WORKERS, serviceInfo.getDomain()); - } + Set<ServiceStorageVolume> serviceStorageVolumes = serviceInfo.getStorageVolumes(); if (!serviceStorageVolumes.isEmpty()) { arguments.putAll(getPersistenceVariables(serviceStorageVolumes, deploymentManager.getStorageClass(serviceInfo.getDomain()), serviceInfo.getDescriptiveDeploymentId().getValue())); } - Set<ServiceAccessMethod> externalAccessMethods = serviceExternalAccessMethods(serviceInfo.getAccessMethods()); - if (!externalAccessMethods.isEmpty()) { - arguments.putAll(getIngressVariables(ingressManager.getResourceConfigOption(), externalAccessMethods, serviceInfo.getDomain())); + + if(serviceInfo.getRemoteCluster() == null) { + if (deploymentManager.getForceDedicatedWorkers()) { + arguments.put(HELM_INSTALL_OPTION_DEDICATED_WORKERS, serviceInfo.getDomain()); + } + Set<ServiceAccessMethod> externalAccessMethods = serviceExternalAccessMethods(serviceInfo.getAccessMethods()); + if (!externalAccessMethods.isEmpty()) { + arguments.putAll(getIngressVariables(ingressManager.getResourceConfigOption(), externalAccessMethods, serviceInfo.getDomain())); + } + } else { + if (serviceInfo.getRemoteCluster().getDeployment().getForceDedicatedWorkers()) { + arguments.put(HELM_INSTALL_OPTION_DEDICATED_WORKERS, serviceInfo.getDomain()); + } + Set<ServiceAccessMethod> externalAccessMethods = serviceExternalAccessMethods(serviceInfo.getAccessMethods()); + if (!externalAccessMethods.isEmpty()) { + arguments.putAll(getIngressVariables(serviceInfo.getRemoteCluster().getIngress().getResourceConfigOption(), externalAccessMethods, serviceInfo.getDomain())); + } } + if (serviceInfo.getAdditionalParameters() != null && !serviceInfo.getAdditionalParameters().isEmpty()) { arguments.putAll(removeRedundantParameters(serviceInfo.getAdditionalParameters())); } + return arguments; } diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/commands/HelmInstallCommand.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/commands/HelmInstallCommand.java index 940c89fa9b85beac192549668b1df98f86943d54..692e26b541fe15dc01aef97825bdc636b1dcdd7b 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/commands/HelmInstallCommand.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/commands/HelmInstallCommand.java @@ -25,8 +25,12 @@ public class HelmInstallCommand extends HelmCommand { * @param enableTls flag indicating if tls option should be added * @return complete command object */ - public static HelmInstallCommand commandWithRepo(String helmVersion, String namespace, String releaseName, Map<String, String> values, String chartName, String chartVersion, boolean enableTls) { + public static HelmInstallCommand commandWithRepo(String helmVersion, String namespace, String releaseName, Map<String, String> values, String chartName, String chartVersion, boolean enableTls, String kubeConfigPath) { StringBuilder sb = buildBaseInstallCommand(helmVersion, namespace, releaseName, values); + + if(kubeConfigPath != null && !kubeConfigPath.isEmpty()) { + sb.append(SPACE).append(OPTION_KUBECONFIG).append(SPACE).append(kubeConfigPath); + } if (chartName == null || chartName.isEmpty()) { throw new IllegalArgumentException("Chart name can't be null or empty"); } @@ -35,6 +39,7 @@ public class HelmInstallCommand extends HelmCommand { sb.append(SPACE).append(OPTION_VERSION).append(SPACE).append(chartVersion); } addTlsOptionIfRequired(helmVersion, enableTls, sb); + return new HelmInstallCommand(sb.toString()); } diff --git a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/KubernetesNmServiceInfo.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/KubernetesNmServiceInfo.java index e2f56ccb6d5a2c1c28894c21616ad0fec369d6bf..886ff994df77a43af404f210d40da1c9fbb70b62 100644 --- a/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/KubernetesNmServiceInfo.java +++ b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/KubernetesNmServiceInfo.java @@ -1,7 +1,10 @@ package net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import lombok.Getter; import lombok.Setter; +import net.geant.nmaas.externalservices.kubernetes.entities.KCluster; import net.geant.nmaas.nmservice.deployment.entities.NmServiceInfo; import net.geant.nmaas.orchestration.Identifier; @@ -38,6 +41,10 @@ public class KubernetesNmServiceInfo extends NmServiceInfo { @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) private Set<ServiceAccessMethod> accessMethods; + @ManyToOne + @JoinColumn(name = "k_cluster_id", referencedColumnName = "id") + private KCluster remoteCluster; + public KubernetesNmServiceInfo () { super(); } @@ -46,4 +53,9 @@ public class KubernetesNmServiceInfo extends NmServiceInfo { super(deploymentId, deploymentName, domain, descriptiveDeploymentId); } + public KubernetesNmServiceInfo(Identifier deploymentId, String deploymentName, String domain, Identifier descriptiveDeploymentId, KCluster kCluster) { + super(deploymentId, deploymentName, domain, descriptiveDeploymentId); + this.remoteCluster = kCluster; + } + } diff --git a/src/main/java/net/geant/nmaas/notifications/NotificationController.java b/src/main/java/net/geant/nmaas/notifications/NotificationController.java index d3e7619a84e71894702b3e76285ab523e8d18377..964b5f1647e54bbdbc0513a95bda937b55055f7e 100644 --- a/src/main/java/net/geant/nmaas/notifications/NotificationController.java +++ b/src/main/java/net/geant/nmaas/notifications/NotificationController.java @@ -1,7 +1,7 @@ package net.geant.nmaas.notifications; import net.geant.nmaas.notifications.templates.MailType; -import net.geant.nmaas.portal.api.exception.AuthenticationException; +import net.geant.nmaas.portal.api.exceptions.AuthenticationException; import net.geant.nmaas.utils.captcha.ValidateCaptcha; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; diff --git a/src/main/java/net/geant/nmaas/notifications/NotificationManager.java b/src/main/java/net/geant/nmaas/notifications/NotificationManager.java index 575d94cab5e409f9491cde4dc5e6b49381e6bacb..8686a47eb584cdbcbacbf409ad4bdfd49b8a5403 100644 --- a/src/main/java/net/geant/nmaas/notifications/NotificationManager.java +++ b/src/main/java/net/geant/nmaas/notifications/NotificationManager.java @@ -16,11 +16,11 @@ import net.geant.nmaas.notifications.templates.api.LanguageMailContentView; import net.geant.nmaas.notifications.templates.api.MailTemplateView; import net.geant.nmaas.notifications.types.persistence.entity.FormType; import net.geant.nmaas.notifications.types.service.FormTypeService; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.api.domain.UserView; import net.geant.nmaas.portal.api.domain.GroupAppListElement; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.Role; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.service.ConfigurationManager; diff --git a/src/main/java/net/geant/nmaas/notifications/types/service/FormTypeService.java b/src/main/java/net/geant/nmaas/notifications/types/service/FormTypeService.java index 21426f5f5f09d240b3fe1b6ac0bc6d37589663fe..6b7d6fce5416bd8624b2705f6cf7b6d79c00ab61 100644 --- a/src/main/java/net/geant/nmaas/notifications/types/service/FormTypeService.java +++ b/src/main/java/net/geant/nmaas/notifications/types/service/FormTypeService.java @@ -5,7 +5,6 @@ import net.geant.nmaas.notifications.types.model.FormTypeRequest; import net.geant.nmaas.notifications.types.model.FormTypeView; import net.geant.nmaas.notifications.types.persistence.entity.FormType; import net.geant.nmaas.notifications.types.persistence.repository.FormTypeRepository; -import net.geant.nmaas.portal.api.exception.ProcessingException; import net.geant.nmaas.portal.exceptions.DataConflictException; import org.springframework.stereotype.Service; diff --git a/src/main/java/net/geant/nmaas/orchestration/DefaultAppLifecycleManager.java b/src/main/java/net/geant/nmaas/orchestration/DefaultAppLifecycleManager.java index e7393519814c88b5b1b4cae451ce300cc56c9d7e..289409f9a5bd512c24d4f1d48464602ef5698bb6 100644 --- a/src/main/java/net/geant/nmaas/orchestration/DefaultAppLifecycleManager.java +++ b/src/main/java/net/geant/nmaas/orchestration/DefaultAppLifecycleManager.java @@ -22,7 +22,7 @@ import net.geant.nmaas.orchestration.events.app.AppUpgradeActionEvent; import net.geant.nmaas.orchestration.events.app.AppVerifyRequestActionEvent; import net.geant.nmaas.orchestration.events.app.AppVerifyServiceActionEvent; import net.geant.nmaas.orchestration.exceptions.InvalidDeploymentIdException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.service.ConfigurationManager; import net.geant.nmaas.utils.logging.LogLevel; import net.geant.nmaas.utils.logging.Loggable; diff --git a/src/main/java/net/geant/nmaas/orchestration/entities/AppDeployment.java b/src/main/java/net/geant/nmaas/orchestration/entities/AppDeployment.java index 73173f116825dda60fe71b772bb9897e0b37927f..6593de17059fffb3ba403dc82acdda17ed701325 100644 --- a/src/main/java/net/geant/nmaas/orchestration/entities/AppDeployment.java +++ b/src/main/java/net/geant/nmaas/orchestration/entities/AppDeployment.java @@ -127,6 +127,8 @@ public class AppDeployment { private Long instanceId; + private Long remoteClusterId; + /** * Globally unique descriptive application deployment identifier */ diff --git a/src/main/java/net/geant/nmaas/orchestration/jobs/DomainCreationJob.java b/src/main/java/net/geant/nmaas/orchestration/jobs/DomainCreationJob.java index a83c3537689faee10cfd2b22ed82cd1fe353b7bd..3d5d751dc1c2fdf6e29f30d5c7f278305e43e37a 100644 --- a/src/main/java/net/geant/nmaas/orchestration/jobs/DomainCreationJob.java +++ b/src/main/java/net/geant/nmaas/orchestration/jobs/DomainCreationJob.java @@ -4,7 +4,7 @@ import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.orchestration.exceptions.WebServiceCommunicationException; import net.geant.nmaas.portal.api.domain.DomainView; import net.geant.nmaas.portal.api.domain.WebhookEventDto; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.WebhookEventType; import net.geant.nmaas.portal.service.DomainService; diff --git a/src/main/java/net/geant/nmaas/orchestration/jobs/DomainGroupJob.java b/src/main/java/net/geant/nmaas/orchestration/jobs/DomainGroupJob.java index 7fe42451ebba65a1061e0981e789e9c0d823826a..0c4d59056de9625701219e18528b6407b18ae5ba 100644 --- a/src/main/java/net/geant/nmaas/orchestration/jobs/DomainGroupJob.java +++ b/src/main/java/net/geant/nmaas/orchestration/jobs/DomainGroupJob.java @@ -5,7 +5,7 @@ import net.geant.nmaas.orchestration.exceptions.WebServiceCommunicationException import net.geant.nmaas.portal.api.domain.DomainGroupView; import net.geant.nmaas.portal.api.domain.DomainGroupWebhookDto; import net.geant.nmaas.portal.api.domain.WebhookEventDto; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.WebhookEventType; import net.geant.nmaas.portal.service.WebhookEventService; import org.modelmapper.ModelMapper; diff --git a/src/main/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTask.java b/src/main/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTask.java index 3810ab4bbcf8f45dd015521e01b508f0d0dbd047..1da23840cb3c47d9147ad889a0c93a4cab44f3ee 100644 --- a/src/main/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTask.java +++ b/src/main/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTask.java @@ -2,6 +2,7 @@ package net.geant.nmaas.orchestration.tasks.app; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import net.geant.nmaas.externalservices.kubernetes.RemoteClusterManager; import net.geant.nmaas.nmservice.deployment.NmServiceDeploymentProvider; import net.geant.nmaas.orchestration.Identifier; import net.geant.nmaas.orchestration.entities.AppDeployment; @@ -18,6 +19,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import javax.naming.directory.InvalidAttributesException; import java.time.LocalDateTime; @Component @@ -29,6 +31,8 @@ public class AppRequestVerificationTask { private AppDeploymentRepository repository; private ApplicationRepository appRepository; + private RemoteClusterManager remoteClusterManager; + @EventListener @Loggable(LogLevel.INFO) @Transactional(propagation = Propagation.REQUIRES_NEW) @@ -39,6 +43,9 @@ public class AppRequestVerificationTask { final AppDeployment appDeployment = repository.findByDeploymentId(deploymentId).orElseThrow(() -> new InvalidDeploymentIdException(deploymentId)); final Application application = appRepository.findById(Long.valueOf(appDeployment.getApplicationId().getValue())).orElseThrow(() -> new InvalidApplicationIdException("Application for deployment " + deploymentId + " does not exist in repository")); + if(!remoteClusterManager.clusterExists(appDeployment.getRemoteClusterId())) { + throw new InvalidAttributesException("Wrong remote cluster Id"); + } serviceDeployment.verifyRequest( deploymentId, appDeployment, diff --git a/src/main/java/net/geant/nmaas/portal/PortalConfig.java b/src/main/java/net/geant/nmaas/portal/PortalConfig.java index 7ef5f2a31d94faafd298504562a4e0b487642d2a..ead54e07bbc8701edd2676988e175bf0aa466ccf 100644 --- a/src/main/java/net/geant/nmaas/portal/PortalConfig.java +++ b/src/main/java/net/geant/nmaas/portal/PortalConfig.java @@ -2,8 +2,8 @@ package net.geant.nmaas.portal; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.exceptions.OnlyOneConfigurationSupportedException; import net.geant.nmaas.portal.persistent.entity.Content; import net.geant.nmaas.portal.persistent.entity.Domain; diff --git a/src/main/java/net/geant/nmaas/portal/api/auth/BasicAuthController.java b/src/main/java/net/geant/nmaas/portal/api/auth/BasicAuthController.java index 4ad5fb8d28e7fe3fdb487374e803524e1cd0a95e..6cf9f0112655cd791eeb4497ed03f6e925661a0c 100644 --- a/src/main/java/net/geant/nmaas/portal/api/auth/BasicAuthController.java +++ b/src/main/java/net/geant/nmaas/portal/api/auth/BasicAuthController.java @@ -6,8 +6,8 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.portal.api.domain.Pong; -import net.geant.nmaas.portal.api.exception.AuthenticationException; -import net.geant.nmaas.portal.api.exception.SignupException; +import net.geant.nmaas.portal.api.exceptions.AuthenticationException; +import net.geant.nmaas.portal.api.exceptions.SignupException; import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.exceptions.UndergoingMaintenanceException; import net.geant.nmaas.portal.persistent.entity.Role; diff --git a/src/main/java/net/geant/nmaas/portal/api/auth/OIDCAuthController.java b/src/main/java/net/geant/nmaas/portal/api/auth/OIDCAuthController.java index 28424e79ce9d9a405bba5e4ffb2c85385ed00996..d06efefc8e71a09f3e8cc212ee97f8160f630179 100644 --- a/src/main/java/net/geant/nmaas/portal/api/auth/OIDCAuthController.java +++ b/src/main/java/net/geant/nmaas/portal/api/auth/OIDCAuthController.java @@ -4,10 +4,10 @@ import com.google.common.collect.ImmutableSet; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; -import net.geant.nmaas.portal.api.exception.AuthenticationException; -import net.geant.nmaas.portal.api.exception.ExternalUserCanNotBeLinked; -import net.geant.nmaas.portal.api.exception.ExternalUserMatchException; -import net.geant.nmaas.portal.api.exception.SignupException; +import net.geant.nmaas.portal.api.exceptions.AuthenticationException; +import net.geant.nmaas.portal.api.exceptions.ExternalUserCanNotBeLinked; +import net.geant.nmaas.portal.api.exceptions.ExternalUserMatchException; +import net.geant.nmaas.portal.api.exceptions.SignupException; import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.exceptions.UndergoingMaintenanceException; import net.geant.nmaas.portal.persistent.entity.Role; diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java b/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java index 5be222d8793b4c4e4729ee6bd36b488eb9cf4e4f..15fa7148f830547d4962c024ddd3a9b61fccf329 100644 --- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java +++ b/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java @@ -3,8 +3,13 @@ package net.geant.nmaas.portal.api.bulk; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import net.geant.nmaas.portal.api.bulk.model.BulkAppDetails; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentView; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS; +import net.geant.nmaas.portal.api.bulk.model.BulkQueueDetails; import net.geant.nmaas.portal.api.domain.UserViewMinimal; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.BulkDeployment; import net.geant.nmaas.portal.persistent.entity.BulkDeploymentEntry; import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState; @@ -151,7 +156,7 @@ public class BulkController { return ResponseEntity.ok(mapToViewList(filter(false, bulkDeploymentRepository.findByType(BulkType.DOMAIN))).stream() .filter(bulk -> bulk.getCreator().getId().equals(user.getId())) - .collect(Collectors.toList())); + .toList()); } @GetMapping("/apps") @@ -168,7 +173,7 @@ public class BulkController { return ResponseEntity.ok(mapToViewList(filter(false, bulkDeploymentRepository.findByType(BulkType.APPLICATION))).stream() .filter(bulk -> bulk.getCreator().getId().equals(user.getId())) - .collect(Collectors.toList())); + .toList()); } @DeleteMapping("/{id}") @@ -192,7 +197,6 @@ public class BulkController { if (removeApps) { bulkApplicationService.deleteAppInstancesFromBulk(bulk.get()); } -// bulkDeploymentRepository.delete(bulk.get()); bulk.get().setDeleted(true); bulk.get().setState(BulkDeploymentState.REMOVED); bulkDeploymentRepository.save(bulk.get()); @@ -202,13 +206,13 @@ public class BulkController { private List<BulkDeploymentViewS> mapToViewList(List<BulkDeployment> deployments) { return deployments.stream() .map(bulk -> mapToView(bulk, BulkDeploymentViewS.class)) - .collect(Collectors.toList()); + .toList(); } @GetMapping("/refresh/{id}") @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN') || hasRole('ROLE_GROUP_MANAGER')") public ResponseEntity<BulkDeploymentViewS> getRefreshedState(@PathVariable Long id) { - return ResponseEntity.ok(mapToView(this.bulkApplicationService.updateState(id))); + return ResponseEntity.ok(mapToView(bulkApplicationService.updateState(id))); } @GetMapping("/queue/{id}") @@ -220,7 +224,7 @@ public class BulkController { private List<BulkDeploymentViewS> mapToView(List<BulkDeployment> deployments) { return deployments.stream() .map(bulk -> mapToView(bulk, BulkDeploymentViewS.class)) - .collect(Collectors.toList()); + .toList(); } private <T extends BulkDeploymentViewS> T mapToView(BulkDeployment bulk, Class<T> viewType) { diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkAppDetails.java b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkAppDetails.java similarity index 92% rename from src/main/java/net/geant/nmaas/portal/api/bulk/BulkAppDetails.java rename to src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkAppDetails.java index 7873d255a029b736564169d8ee0fd7fd03a0e974..043962b16e16c08cd02a1f44b7dd41d13fe49741 100644 --- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkAppDetails.java +++ b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkAppDetails.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.bulk; +package net.geant.nmaas.portal.api.bulk.model; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentEntryView.java b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentEntryView.java similarity index 94% rename from src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentEntryView.java rename to src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentEntryView.java index 872e641c7580100976e3042be08764f9ae92d2d0..134e21d81bd3245c653e590bdfd66781cb19efe4 100644 --- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentEntryView.java +++ b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentEntryView.java @@ -1,10 +1,11 @@ -package net.geant.nmaas.portal.api.bulk; +package net.geant.nmaas.portal.api.bulk.model; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import net.geant.nmaas.portal.api.bulk.BulkType; import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState; import java.util.Map; diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentView.java b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentView.java similarity index 86% rename from src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentView.java rename to src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentView.java index 330b56895a48221d55a5c3c15d924038753f6b3b..a114625276dd05c064c8f746a85e6e0c684a146f 100644 --- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentView.java +++ b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentView.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.bulk; +package net.geant.nmaas.portal.api.bulk.model; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentViewS.java b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentViewS.java similarity index 90% rename from src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentViewS.java rename to src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentViewS.java index 78f4f6b944ff82c04a64f9cc66954cb7165c31b6..11e02e25c192f587fb63da591ec9e2aee6dcfd62 100644 --- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkDeploymentViewS.java +++ b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkDeploymentViewS.java @@ -1,9 +1,10 @@ -package net.geant.nmaas.portal.api.bulk; +package net.geant.nmaas.portal.api.bulk.model; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import net.geant.nmaas.portal.api.bulk.BulkType; import net.geant.nmaas.portal.api.domain.UserViewMinimal; import net.geant.nmaas.portal.persistent.entity.BulkDeploymentState; diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkQueueDetails.java b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkQueueDetails.java similarity index 89% rename from src/main/java/net/geant/nmaas/portal/api/bulk/BulkQueueDetails.java rename to src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkQueueDetails.java index 818dfdc3f5824f4cee8446783ed9f55862da374f..16b3cab1a5174ff3259fd2add702f8debfacaa6e 100644 --- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkQueueDetails.java +++ b/src/main/java/net/geant/nmaas/portal/api/bulk/model/BulkQueueDetails.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.bulk; +package net.geant.nmaas.portal.api.bulk.model; import lombok.AllArgsConstructor; 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 0b18e8e646d7d548690b4985293e4ecc3afb0edd..8595ef2fc33539125c4c8dafd02689d4b943bda7 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 @@ -1,28 +1,32 @@ package net.geant.nmaas.portal.api.configuration; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.exceptions.ConfigurationNotFoundException; import net.geant.nmaas.portal.exceptions.OnlyOneConfigurationSupportedException; import net.geant.nmaas.portal.service.ConfigurationManager; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import jakarta.validation.Valid; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/api/configuration") +@RequiredArgsConstructor public class ConfigurationController { - private ConfigurationManager configurationManager; - - @Autowired - public ConfigurationController(ConfigurationManager configurationManager) { - this.configurationManager = configurationManager; - } + private final ConfigurationManager configurationManager; @GetMapping - public ConfigurationView getConfiguration(){ + public ConfigurationView getConfiguration() { return this.configurationManager.getConfiguration(); } @@ -33,7 +37,7 @@ public class ConfigurationController { return this.configurationManager.setConfiguration(configuration); } - @PutMapping(value="/{id}") + @PutMapping(value = "/{id}") @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')") @ResponseStatus(code = HttpStatus.NO_CONTENT) public void updateConfiguration(@PathVariable("id") Long id, @RequestBody @Valid ConfigurationView configuration) { @@ -42,13 +46,13 @@ public class ConfigurationController { @ExceptionHandler(OnlyOneConfigurationSupportedException.class) @ResponseStatus(code = HttpStatus.NOT_FOUND) - public String handleOnlyOneConfigurationSupportedException(OnlyOneConfigurationSupportedException e){ + public String handleOnlyOneConfigurationSupportedException(OnlyOneConfigurationSupportedException e) { return e.getMessage(); } @ExceptionHandler(ConfigurationNotFoundException.class) @ResponseStatus(code = HttpStatus.NOT_ACCEPTABLE) - public String handleConfigurationNotFoundException(ConfigurationNotFoundException e){ + public String handleConfigurationNotFoundException(ConfigurationNotFoundException e) { return e.getMessage(); } } diff --git a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java b/src/main/java/net/geant/nmaas/portal/api/configuration/model/ConfigurationView.java similarity index 95% rename from src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java rename to src/main/java/net/geant/nmaas/portal/api/configuration/model/ConfigurationView.java index 893e6cd951067972adc76bb661d3dbbf62d3bc80..f2f4b13f606699a754406b1c76f1cffe30ccc5d7 100644 --- a/src/main/java/net/geant/nmaas/portal/api/configuration/ConfigurationView.java +++ b/src/main/java/net/geant/nmaas/portal/api/configuration/model/ConfigurationView.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.configuration; +package net.geant.nmaas.portal.api.configuration.model; import lombok.AllArgsConstructor; import lombok.Builder; @@ -57,5 +57,4 @@ public class ConfigurationView { private String healthCheckJobCron; - -} +} \ No newline at end of file diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/AuthenticationException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/AuthenticationException.java similarity index 92% rename from src/main/java/net/geant/nmaas/portal/api/exception/AuthenticationException.java rename to src/main/java/net/geant/nmaas/portal/api/exceptions/AuthenticationException.java index 7677611239f09541409c060b0d1c5093a207e5ca..36bdf79759f532e20c495ffe0008446ffcc85b2f 100644 --- a/src/main/java/net/geant/nmaas/portal/api/exception/AuthenticationException.java +++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/AuthenticationException.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.exception; +package net.geant.nmaas.portal.api.exceptions; public class AuthenticationException extends MarketException { diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserCanNotBeLinked.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserCanNotBeLinked.java similarity index 76% rename from src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserCanNotBeLinked.java rename to src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserCanNotBeLinked.java index 134b925a49acd3f65b0d90b00478c1d0442514fa..21b3c2b80f04e348aa872b1607009e94813c85ea 100644 --- a/src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserCanNotBeLinked.java +++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserCanNotBeLinked.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.exception; +package net.geant.nmaas.portal.api.exceptions; public class ExternalUserCanNotBeLinked extends RuntimeException { public ExternalUserCanNotBeLinked(String message) { diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserMatchException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserMatchException.java similarity index 77% rename from src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserMatchException.java rename to src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserMatchException.java index e17674047e9ea612ba68391c3cc3fa64d3b3dd7c..b498b95d77dc4c0d14cfb7037b684953e9d552b4 100644 --- a/src/main/java/net/geant/nmaas/portal/api/exception/ExternalUserMatchException.java +++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/ExternalUserMatchException.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.exception; +package net.geant.nmaas.portal.api.exceptions; public class ExternalUserMatchException extends RuntimeException { diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/MarketException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/MarketException.java similarity index 91% rename from src/main/java/net/geant/nmaas/portal/api/exception/MarketException.java rename to src/main/java/net/geant/nmaas/portal/api/exceptions/MarketException.java index 1dba432b59ce1ba6cbf7edcf0ea3aaf64eea3c97..9360530776d483550e086898a044c2dc45525c2b 100644 --- a/src/main/java/net/geant/nmaas/portal/api/exception/MarketException.java +++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/MarketException.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.exception; +package net.geant.nmaas.portal.api.exceptions; public class MarketException extends RuntimeException { diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/MissingElementException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/MissingElementException.java similarity index 92% rename from src/main/java/net/geant/nmaas/portal/api/exception/MissingElementException.java rename to src/main/java/net/geant/nmaas/portal/api/exceptions/MissingElementException.java index 391a0513750d39688ea98a96f27f209cbf80e598..d79ea86fd69f86173bd5ad8b4c2b268ca7c12f4f 100644 --- a/src/main/java/net/geant/nmaas/portal/api/exception/MissingElementException.java +++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/MissingElementException.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.exception; +package net.geant.nmaas.portal.api.exceptions; public class MissingElementException extends MarketException { diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/ProcessingException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/ProcessingException.java similarity index 91% rename from src/main/java/net/geant/nmaas/portal/api/exception/ProcessingException.java rename to src/main/java/net/geant/nmaas/portal/api/exceptions/ProcessingException.java index d63d2952174ca29fa201c18a0b33920b0e4ae5a8..4a95de29f9eae97045162a7d93b991320daea94d 100644 --- a/src/main/java/net/geant/nmaas/portal/api/exception/ProcessingException.java +++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/ProcessingException.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.exception; +package net.geant.nmaas.portal.api.exceptions; public class ProcessingException extends MarketException { diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/SignupException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/SignupException.java similarity index 91% rename from src/main/java/net/geant/nmaas/portal/api/exception/SignupException.java rename to src/main/java/net/geant/nmaas/portal/api/exceptions/SignupException.java index 3cb3ae8b6f5c7ba352738ef2c6cab2842653f2c6..f479d904660b924297795e7f5efeac008d00bc6a 100644 --- a/src/main/java/net/geant/nmaas/portal/api/exception/SignupException.java +++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/SignupException.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.exception; +package net.geant.nmaas.portal.api.exceptions; public class SignupException extends MarketException { diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/StorageException.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/StorageException.java similarity index 91% rename from src/main/java/net/geant/nmaas/portal/api/exception/StorageException.java rename to src/main/java/net/geant/nmaas/portal/api/exceptions/StorageException.java index ab19c1f76a3d34c61469772fa55b5ffd186d5643..0476bfda3ca4ef85224deee26ba0a62ce6ccb3f2 100644 --- a/src/main/java/net/geant/nmaas/portal/api/exception/StorageException.java +++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/StorageException.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.exception; +package net.geant.nmaas.portal.api.exceptions; public class StorageException extends MarketException { diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/ValidationError.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationError.java similarity index 92% rename from src/main/java/net/geant/nmaas/portal/api/exception/ValidationError.java rename to src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationError.java index 2a7d02b2101b6cd8c7896cd752eab06b677a50ce..ab23528c1f3a706888cc625d844cb847c19ce015 100644 --- a/src/main/java/net/geant/nmaas/portal/api/exception/ValidationError.java +++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationError.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.exception; +package net.geant.nmaas.portal.api.exceptions; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/net/geant/nmaas/portal/api/exception/ValidationErrorBuilder.java b/src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationErrorBuilder.java similarity index 91% rename from src/main/java/net/geant/nmaas/portal/api/exception/ValidationErrorBuilder.java rename to src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationErrorBuilder.java index 7b04d3dc4efa60bf503b90ed81701d78bfd54763..ad553cc40d3600ef6f509baec694496761040574 100644 --- a/src/main/java/net/geant/nmaas/portal/api/exception/ValidationErrorBuilder.java +++ b/src/main/java/net/geant/nmaas/portal/api/exceptions/ValidationErrorBuilder.java @@ -1,4 +1,4 @@ -package net.geant.nmaas.portal.api.exception; +package net.geant.nmaas.portal.api.exceptions; import org.springframework.validation.Errors; import org.springframework.validation.ObjectError; diff --git a/src/main/java/net/geant/nmaas/portal/api/info/ContentController.java b/src/main/java/net/geant/nmaas/portal/api/info/ContentController.java index aa4101ae8435d3fd8cee245d9950c34691dadf78..92ea95bfb782dbeb241e3d610f4285362301c41c 100644 --- a/src/main/java/net/geant/nmaas/portal/api/info/ContentController.java +++ b/src/main/java/net/geant/nmaas/portal/api/info/ContentController.java @@ -2,7 +2,7 @@ package net.geant.nmaas.portal.api.info; import lombok.AllArgsConstructor; import net.geant.nmaas.portal.api.domain.ContentView; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.Content; import net.geant.nmaas.portal.persistent.repositories.ContentRepository; import org.modelmapper.ModelMapper; diff --git a/src/main/java/net/geant/nmaas/portal/api/info/DashboardController.java b/src/main/java/net/geant/nmaas/portal/api/info/DashboardController.java index 2e423bde14dc0e2a9d60d0b7f6007ab906bbd3a4..540733ce0baa7c853cbeeac352c79303a3db9b8b 100644 --- a/src/main/java/net/geant/nmaas/portal/api/info/DashboardController.java +++ b/src/main/java/net/geant/nmaas/portal/api/info/DashboardController.java @@ -1,9 +1,7 @@ package net.geant.nmaas.portal.api.info; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import net.geant.nmaas.portal.api.domain.ContentView; -import net.geant.nmaas.portal.persistent.entity.Content; import net.geant.nmaas.portal.service.DashboardService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; @@ -15,38 +13,35 @@ import org.springframework.web.bind.annotation.RestController; import java.time.OffsetDateTime; @RestController -@AllArgsConstructor @RequestMapping("/api/dashboard") +@RequiredArgsConstructor @Slf4j public class DashboardController { - private DashboardService dashboardService; + private final DashboardService dashboardService; @GetMapping("/admin") @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')") - public DashboardView getDashboardAdmin( @RequestParam("startDate") OffsetDateTime startDate, - @RequestParam("end") OffsetDateTime endDate) { - checkDate(startDate,endDate); - DashboardView view = dashboardService.getSystemDashboard(startDate,endDate); - log.error("View : {}", view.toString()); - - return view; + public DashboardView getDashboardAdmin(@RequestParam("startDate") OffsetDateTime startDate, + @RequestParam("end") OffsetDateTime endDate) { + validateRequestedPeriod(startDate, endDate); + return dashboardService.getSystemDashboard(startDate, endDate); } @GetMapping("/domain/{id}") public DomainDashboardView getDashboardDomain(@PathVariable Long id) { - DomainDashboardView view = dashboardService.getSystemDomainDashboard(id); - log.error("View : {}", view.toString()); - return view; + return dashboardService.getDomainDashboard(id); } - private void checkDate(OffsetDateTime startDate, OffsetDateTime endDate) { - if(startDate == null || endDate == null) { + private void validateRequestedPeriod(OffsetDateTime startDate, OffsetDateTime endDate) { + if (startDate == null) { throw new IllegalArgumentException("Start date can not be null"); } - - if(startDate.isAfter(endDate)) { + if (endDate == null) { + throw new IllegalArgumentException("End date can not be null"); + } + if (startDate.isAfter(endDate)) { throw new IllegalArgumentException("Start date is after end date."); } } -} +} \ No newline at end of file diff --git a/src/main/java/net/geant/nmaas/portal/api/info/GeneralInformationController.java b/src/main/java/net/geant/nmaas/portal/api/info/GeneralInformationController.java index cd5c594332442a04c1f2c03da621c95653d4a154..c133e7f0f37ae08079b851200af39bb4951fe968 100644 --- a/src/main/java/net/geant/nmaas/portal/api/info/GeneralInformationController.java +++ b/src/main/java/net/geant/nmaas/portal/api/info/GeneralInformationController.java @@ -26,8 +26,8 @@ public class GeneralInformationController { @GetMapping(value = "/changelog", produces = "application/json") public FileSystemResource getChangelog() throws IOException { - Path tempJsonFile = Files.createTempFile("changelog",".json"); - try(InputStream inputStream = changelogPath.getInputStream()) { + Path tempJsonFile = Files.createTempFile("changelog", ".json"); + try (InputStream inputStream = changelogPath.getInputStream()) { Files.copy(inputStream, tempJsonFile, StandardCopyOption.REPLACE_EXISTING); } return new FileSystemResource(tempJsonFile); diff --git a/src/main/java/net/geant/nmaas/portal/api/market/ApiExceptionHandler.java b/src/main/java/net/geant/nmaas/portal/api/market/ApiExceptionHandler.java index c9600e4aa1f053eaa6e10a1b18e34d7202da081b..3f4d3f7df641854c2ea110a194d911b9f3c04caa 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/ApiExceptionHandler.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/ApiExceptionHandler.java @@ -5,12 +5,12 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.nmservice.configuration.exceptions.InvalidWebhookException; import net.geant.nmaas.portal.api.domain.ApiError; -import net.geant.nmaas.portal.api.exception.AuthenticationException; -import net.geant.nmaas.portal.api.exception.MarketException; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; -import net.geant.nmaas.portal.api.exception.SignupException; -import net.geant.nmaas.portal.api.exception.StorageException; +import net.geant.nmaas.portal.api.exceptions.AuthenticationException; +import net.geant.nmaas.portal.api.exceptions.MarketException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.SignupException; +import net.geant.nmaas.portal.api.exceptions.StorageException; import net.geant.nmaas.portal.api.security.exceptions.AuthenticationMethodNotSupportedException; import net.geant.nmaas.portal.api.security.exceptions.BasicAuthenticationException; import net.geant.nmaas.portal.api.security.exceptions.MissingTokenException; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/AppBaseController.java b/src/main/java/net/geant/nmaas/portal/api/market/AppBaseController.java index 6cebf6377def0c77e20fe0d050d729a5842cd600..5a3a690c0de93a89deda7f16ded84b9e3948ddd9 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/AppBaseController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/AppBaseController.java @@ -1,6 +1,6 @@ package net.geant.nmaas.portal.api.market; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.Application; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.ApplicationVersion; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/AppCommentsController.java b/src/main/java/net/geant/nmaas/portal/api/market/AppCommentsController.java index 522266fd026475c66e82baf45582e0c7feed2ee3..6dc27adeab260b35500e0b984b5f90b727565d34 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/AppCommentsController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/AppCommentsController.java @@ -3,8 +3,8 @@ package net.geant.nmaas.portal.api.market; import net.geant.nmaas.portal.api.domain.CommentRequest; import net.geant.nmaas.portal.api.domain.CommentView; import net.geant.nmaas.portal.api.domain.Id; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.Comment; import net.geant.nmaas.portal.persistent.entity.User; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/AppConfigurationController.java b/src/main/java/net/geant/nmaas/portal/api/market/AppConfigurationController.java index 6d57e463bc461a1d4b94e9e727041187f29ccf92..0864786a6cd058739788b97a3876d1e8cea1915b 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/AppConfigurationController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/AppConfigurationController.java @@ -7,8 +7,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.orchestration.AppLifecycleManager; import net.geant.nmaas.orchestration.api.model.AppConfigurationView; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.AppInstance; import net.geant.nmaas.portal.service.ApplicationInstanceService; import org.springframework.security.access.prepost.PreAuthorize; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/AppInstanceController.java b/src/main/java/net/geant/nmaas/portal/api/market/AppInstanceController.java index 735f43a87ef0fc8349ca0b2bf282487673ff621a..baf2bd768482b747cb5324077908a316321ae248 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/AppInstanceController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/AppInstanceController.java @@ -15,6 +15,18 @@ import net.geant.nmaas.orchestration.exceptions.InvalidDomainException; import net.geant.nmaas.portal.api.domain.*; import net.geant.nmaas.portal.api.exception.MissingElementException; import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.domain.AppInstanceBase; +import net.geant.nmaas.portal.api.domain.AppInstanceRequest; +import net.geant.nmaas.portal.api.domain.AppInstanceState; +import net.geant.nmaas.portal.api.domain.AppInstanceStatus; +import net.geant.nmaas.portal.api.domain.AppInstanceView; +import net.geant.nmaas.portal.api.domain.AppInstanceViewExtended; +import net.geant.nmaas.portal.api.domain.ApplicationBaseView; +import net.geant.nmaas.portal.api.domain.ConfigWizardTemplateView; +import net.geant.nmaas.portal.api.domain.Id; +import net.geant.nmaas.portal.api.domain.UserBase; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.exceptions.ApplicationSubscriptionNotActiveException; import net.geant.nmaas.portal.persistent.entity.*; import net.geant.nmaas.portal.service.*; @@ -263,6 +275,7 @@ public class AppInstanceController extends AppBaseController { .owner(principal.getName()) .appName(app.getName()) .descriptiveDeploymentId(createDescriptiveDeploymentId(domain.getCodename(), app.getName(), appInstance.getId())) + .remoteClusterId(clusterId) .build(); Identifier internalId = appLifecycleManager.deployApplication(appDeployment); diff --git a/src/main/java/net/geant/nmaas/portal/api/market/AppScreenshotsController.java b/src/main/java/net/geant/nmaas/portal/api/market/AppScreenshotsController.java index 91350476be89d25eff531c3b3c5fdc97556a11cd..9ce335b81b2990f902c10cb0df08c8377d39093a 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/AppScreenshotsController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/AppScreenshotsController.java @@ -3,7 +3,7 @@ package net.geant.nmaas.portal.api.market; import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.portal.api.domain.FileInfoView; import net.geant.nmaas.portal.api.domain.UserFile; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.FileInfo; import net.geant.nmaas.portal.service.ApplicationBaseService; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java b/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java index 36fd2187b5d173a4031e1108d6b33c2146ecb57c..5c769ca247a2411e3ffe6947243252285cb900eb 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java @@ -18,9 +18,9 @@ import net.geant.nmaas.portal.api.domain.ApplicationStateChangeRequest; import net.geant.nmaas.portal.api.domain.ApplicationView; import net.geant.nmaas.portal.api.domain.Id; import net.geant.nmaas.portal.api.domain.UserView; -import net.geant.nmaas.portal.api.exception.MarketException; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MarketException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.exceptions.ObjectAlreadyExistsException; import net.geant.nmaas.portal.persistent.entity.Application; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/BaseController.java b/src/main/java/net/geant/nmaas/portal/api/market/BaseController.java index 7d7e1107768ae008bb8d2dd0733a26275d78d4ba..c15fa53e9599f3216129c5adc652b26e4cb355a9 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/BaseController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/BaseController.java @@ -1,7 +1,7 @@ package net.geant.nmaas.portal.api.market; import lombok.RequiredArgsConstructor; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.service.UserService; import org.modelmapper.ModelMapper; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/DomainController.java b/src/main/java/net/geant/nmaas/portal/api/market/DomainController.java index 4e26d642830329e8fc8d5d3e3f84020c21ce04d7..6f30f0453639c31b1193962c287d04758e9134d1 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/DomainController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/DomainController.java @@ -15,8 +15,8 @@ import net.geant.nmaas.portal.api.domain.DomainRequest; import net.geant.nmaas.portal.api.domain.DomainView; import net.geant.nmaas.portal.api.domain.Id; import net.geant.nmaas.portal.api.domain.KeyValueView; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.exceptions.DataConflictException; import net.geant.nmaas.portal.exceptions.ObjectNotFoundException; import net.geant.nmaas.portal.persistent.entity.ApplicationStatePerDomain; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/GroupController.java b/src/main/java/net/geant/nmaas/portal/api/market/GroupController.java index fbee9be5dd4a3a7af684ff1669a8d86019d683fd..44bc969602efcef361308c6371d25fa9257bcfe4 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/GroupController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/GroupController.java @@ -5,7 +5,7 @@ import net.geant.nmaas.orchestration.exceptions.InvalidDomainException; import net.geant.nmaas.portal.api.domain.DomainGroupView; import net.geant.nmaas.portal.api.domain.Id; import net.geant.nmaas.portal.api.domain.UserViewMinimal; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.exceptions.DataConflictException; import net.geant.nmaas.portal.persistent.entity.Role; import net.geant.nmaas.portal.persistent.entity.User; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/RatingController.java b/src/main/java/net/geant/nmaas/portal/api/market/RatingController.java index 306f8aef49faf380768b11240272b1aa09bb7985..6e04c1b64c7894f0300a3cfb6f888fd543ec3a9a 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/RatingController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/RatingController.java @@ -3,7 +3,7 @@ package net.geant.nmaas.portal.api.market; import jakarta.validation.constraints.NotNull; import net.geant.nmaas.portal.api.domain.ApiResponse; import net.geant.nmaas.portal.api.domain.AppRateView; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.AppRate; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.User; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/RegistrationController.java b/src/main/java/net/geant/nmaas/portal/api/market/RegistrationController.java index feeb3dde9abcfb3dd97ce7c399bbd51bed025800..e7b4f533083495b916685cffa550e84a2c1cd9f0 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/RegistrationController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/RegistrationController.java @@ -8,8 +8,8 @@ import net.geant.nmaas.notifications.NotificationEvent; import net.geant.nmaas.notifications.templates.MailType; import net.geant.nmaas.portal.api.auth.Registration; import net.geant.nmaas.portal.api.domain.DomainBase; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.SignupException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.SignupException; import net.geant.nmaas.portal.exceptions.ObjectAlreadyExistsException; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Role; diff --git a/src/main/java/net/geant/nmaas/portal/api/market/WebhookEventController.java b/src/main/java/net/geant/nmaas/portal/api/market/WebhookEventController.java index 455af4018f383d63141969a0f29d191f5134c493..d816cf2479a841d7d1001dbd553e5f0a426aa666 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/WebhookEventController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/WebhookEventController.java @@ -5,7 +5,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.portal.api.domain.Id; import net.geant.nmaas.portal.api.domain.WebhookEventDto; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.WebhookEvent; import net.geant.nmaas.portal.service.WebhookEventService; import org.springframework.http.ResponseEntity; @@ -49,13 +49,13 @@ public class WebhookEventController { @PutMapping("/{id}") @Transactional @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')") - public void updateWebhook(@PathVariable Long id, @RequestBody @Valid WebhookEventDto webhook) { + public ResponseEntity<WebhookEventDto> updateWebhook(@PathVariable Long id, @RequestBody @Valid WebhookEventDto webhook) { if (!id.equals(webhook.getId())) { throw new ProcessingException(UNABLE_TO_CHANGE_WEBHOOK_EVENT); } try { - webhookEventService.update(webhook); + return ResponseEntity.ok(webhookEventService.update(webhook)); } catch (GeneralSecurityException e) { throw new RuntimeException(e); } diff --git a/src/main/java/net/geant/nmaas/portal/api/user/ProfileController.java b/src/main/java/net/geant/nmaas/portal/api/user/ProfileController.java index 64d8c5781c39e83b3e2a9788f713bb8e555e3352..842af0c334eedb751da1ccdca071a4104e0c4848 100644 --- a/src/main/java/net/geant/nmaas/portal/api/user/ProfileController.java +++ b/src/main/java/net/geant/nmaas/portal/api/user/ProfileController.java @@ -4,7 +4,7 @@ import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import net.geant.nmaas.portal.api.domain.UserRoleView; import net.geant.nmaas.portal.api.domain.UserView; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.service.UserService; import org.modelmapper.ModelMapper; diff --git a/src/main/java/net/geant/nmaas/portal/api/user/SSHKeysControllerAdvice.java b/src/main/java/net/geant/nmaas/portal/api/user/SSHKeysControllerAdvice.java index 022a3f6e8b225b394cb97d9f14b32a325c18ff8d..54973e59c62544a05b80caa8707728bc936039bb 100644 --- a/src/main/java/net/geant/nmaas/portal/api/user/SSHKeysControllerAdvice.java +++ b/src/main/java/net/geant/nmaas/portal/api/user/SSHKeysControllerAdvice.java @@ -1,7 +1,7 @@ package net.geant.nmaas.portal.api.user; -import net.geant.nmaas.portal.api.exception.ValidationError; -import net.geant.nmaas.portal.api.exception.ValidationErrorBuilder; +import net.geant.nmaas.portal.api.exceptions.ValidationError; +import net.geant.nmaas.portal.api.exceptions.ValidationErrorBuilder; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/net/geant/nmaas/portal/api/user/UsersController.java b/src/main/java/net/geant/nmaas/portal/api/user/UsersController.java index 350beec6ce096d2f71e9db2030bbbcd17a2876cf..f2a6103f6e605ee2732e5afebaa42348d8e0a919 100644 --- a/src/main/java/net/geant/nmaas/portal/api/user/UsersController.java +++ b/src/main/java/net/geant/nmaas/portal/api/user/UsersController.java @@ -14,8 +14,8 @@ import net.geant.nmaas.portal.api.domain.UserRequest; import net.geant.nmaas.portal.api.domain.UserRoleView; import net.geant.nmaas.portal.api.domain.UserView; import net.geant.nmaas.portal.api.domain.UserViewMinimal; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.exceptions.ObjectNotFoundException; import net.geant.nmaas.portal.persistent.entity.Domain; diff --git a/src/main/java/net/geant/nmaas/portal/exceptions/UndergoingMaintenanceException.java b/src/main/java/net/geant/nmaas/portal/exceptions/UndergoingMaintenanceException.java index b8ae9d26dc9d5a6ca9999da7d707f511f66a7772..9735e9ebcd9528aaffecbd28752f42eb5be023d8 100644 --- a/src/main/java/net/geant/nmaas/portal/exceptions/UndergoingMaintenanceException.java +++ b/src/main/java/net/geant/nmaas/portal/exceptions/UndergoingMaintenanceException.java @@ -1,6 +1,6 @@ package net.geant.nmaas.portal.exceptions; -import net.geant.nmaas.portal.api.exception.MarketException; +import net.geant.nmaas.portal.api.exceptions.MarketException; public class UndergoingMaintenanceException extends MarketException { public UndergoingMaintenanceException() { diff --git a/src/main/java/net/geant/nmaas/portal/persistent/entity/AppInstance.java b/src/main/java/net/geant/nmaas/portal/persistent/entity/AppInstance.java index 2bfe5aedce3c7bd727032af4ccec95e5e421247c..2aa48cf5cf5e8f4b937c5e2e0d9040f73bacec0d 100644 --- a/src/main/java/net/geant/nmaas/portal/persistent/entity/AppInstance.java +++ b/src/main/java/net/geant/nmaas/portal/persistent/entity/AppInstance.java @@ -1,17 +1,5 @@ package net.geant.nmaas.portal.persistent.entity; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import net.geant.nmaas.orchestration.Identifier; -import org.hibernate.annotations.JdbcType; -import org.hibernate.annotations.Type; -import org.hibernate.type.descriptor.jdbc.VarcharJdbcType; -import org.springframework.data.annotation.CreatedBy; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - import jakarta.persistence.Basic; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -23,6 +11,17 @@ import jakarta.persistence.Id; import jakarta.persistence.Lob; import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import net.geant.nmaas.orchestration.Identifier; +import org.hibernate.annotations.JdbcType; +import org.hibernate.type.descriptor.jdbc.VarcharJdbcType; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + import java.io.Serializable; import java.util.HashSet; import java.util.Set; @@ -34,74 +33,66 @@ import java.util.Set; @Setter public class AppInstance extends DomainAware implements Serializable { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - Long id; - - String name; - - @ManyToOne(fetch = FetchType.LAZY, optional = false) - Application application; - - @Basic(fetch = FetchType.LAZY) - @Lob - @JdbcType(VarcharJdbcType.class) - @Column(columnDefinition = "TEXT") - String configuration; - - @CreatedDate - @Column(name = "created_at", nullable = false, updatable = false) - Long createdAt; - - @CreatedBy - @ManyToOne(fetch = FetchType.LAZY) - private User owner; - - @Basic - Identifier internalId; - - @Basic - private boolean autoUpgradesEnabled; - - @Column(name = "previous_application_id") - private Long previousApplicationId; - - @ManyToMany(fetch = FetchType.LAZY) - private Set<User> members = new HashSet<>(); - - public AppInstance(Application application, Domain domain, String name, boolean autoUpgradesEnabled) { - this.application = application; - this.domain = domain; - this.name = name; - this.autoUpgradesEnabled = autoUpgradesEnabled; - } - - public AppInstance(Long id, Application application, Domain domain, String name, boolean autoUpgradesEnabled) { - this(application, domain, name, autoUpgradesEnabled); - this.id = id; - } - - public AppInstance(Application application, String name, Domain domain, User owner, boolean autoUpgradesEnabled) { - this(application, domain, name, autoUpgradesEnabled); - this.owner = owner; - } - - protected AppInstance(Long id, Application application, String name, Domain domain, boolean autoUpgradesEnabled, User owner) { - this(application, name, domain, owner, autoUpgradesEnabled); - this.id = id; - } - - public void addMember(User user) { - members.add(user); - } - - public void removeMember(User user) { - members.remove(user); - } - - @Override - public String toString() { - return "AppInstance{id=" + id + "}"; - } + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Long id; + + String name; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + Application application; + + @Basic(fetch = FetchType.LAZY) + @Lob + @JdbcType(VarcharJdbcType.class) + @Column(columnDefinition = "TEXT") + String configuration; + + @CreatedDate + @Column(name = "created_at", nullable = false, updatable = false) + Long createdAt; + + @CreatedBy + @ManyToOne(fetch = FetchType.LAZY) + private User owner; + + @Basic + Identifier internalId; + + @Basic + private boolean autoUpgradesEnabled; + + @Column(name = "previous_application_id") + private Long previousApplicationId; + + @ManyToMany(fetch = FetchType.LAZY) + private Set<User> members = new HashSet<>(); + + public AppInstance(Application application, Domain domain, String name, boolean autoUpgradesEnabled) { + this.application = application; + this.domain = domain; + this.name = name; + this.autoUpgradesEnabled = autoUpgradesEnabled; + } + + public AppInstance(Long id, Application application, Domain domain, String name, boolean autoUpgradesEnabled) { + this(application, domain, name, autoUpgradesEnabled); + this.id = id; + } + + public AppInstance(Application application, String name, Domain domain, User owner, boolean autoUpgradesEnabled) { + this(application, domain, name, autoUpgradesEnabled); + this.owner = owner; + } + + protected AppInstance(Long id, Application application, String name, Domain domain, boolean autoUpgradesEnabled, User owner) { + this(application, name, domain, owner, autoUpgradesEnabled); + this.id = id; + } + + @Override + public String toString() { + return "AppInstance{id=" + id + "}"; + } } diff --git a/src/main/java/net/geant/nmaas/portal/persistent/repositories/AppInstanceRepository.java b/src/main/java/net/geant/nmaas/portal/persistent/repositories/AppInstanceRepository.java index a502ee89db7b1e874753ce4fd667b1f2904ebce2..b6e1ef10ef7bfd9523f94d8f3295d00282b0caa9 100644 --- a/src/main/java/net/geant/nmaas/portal/persistent/repositories/AppInstanceRepository.java +++ b/src/main/java/net/geant/nmaas/portal/persistent/repositories/AppInstanceRepository.java @@ -17,47 +17,48 @@ import java.util.Optional; public interface AppInstanceRepository extends JpaRepository<AppInstance, Long> { - Optional<AppInstance> findByInternalId(Identifier internalId); + Optional<AppInstance> findByInternalId(Identifier internalId); - List<AppInstance> findAllByOwner(User user); - List<AppInstance> findAllByDomain(Domain domain); - List<AppInstance> findAllByOwnerAndDomain(User owner, Domain domain); + List<AppInstance> findAllByOwner(User user); - Page<AppInstance> findAllByDomain(Domain domain, Pageable pageable); - Page<AppInstance> findAllByOwner(User owner, Pageable pageable); - Page<AppInstance> findAllByOwnerAndDomain(User owner, Domain domain, Pageable pageable); + List<AppInstance> findAllByDomain(Domain domain); - List<AppInstance> findAllByApplication(Application application); + List<AppInstance> findAllByOwnerAndDomain(User owner, Domain domain); - @Query("select count(ai.id) FROM AppInstance ai JOIN AppDeployment ad on ad.deploymentId = ai.internalId where ad.state = 'APPLICATION_DEPLOYMENT_VERIFIED'") - int countAllRunning(); + Page<AppInstance> findAllByDomain(Domain domain, Pageable pageable); - @Query("select count(ai.id) FROM AppInstance ai JOIN AppDeployment ad on ad.deploymentId = ai.internalId where ad.state = 'APPLICATION_DEPLOYMENT_VERIFIED' and ai.application.name = ?1") - int countRunningByName(String name); + Page<AppInstance> findAllByOwner(User owner, Pageable pageable); - @Modifying - @Query("update AppInstance ai set ai.application = :application, ai.previousApplicationId = :previousApplicationId where ai.id = :id") - void updateApplication(@Param(value = "id") long id, @Param(value = "previousApplicationId") long previousApplicationId, @Param(value = "application") Application application); + Page<AppInstance> findAllByOwnerAndDomain(User owner, Domain domain, Pageable pageable); - @Query("SELECT COUNT(ai.id) FROM AppInstance ai JOIN AppDeployment ad ON ad.deploymentId = ai.internalId WHERE ai.name = :name AND ai.domain.codename = :domain AND ad.state NOT IN" + - "('APPLICATION_REMOVED'," + - "'APPLICATION_CONFIGURATION_REMOVAL_IN_PROGRESS'," + - "'APPLICATION_CONFIGURATION_REMOVED'," + - "'FAILED_APPLICATION_REMOVED')" ) - int isNameAvailableInDomain(@Param(value = "name") String name, @Param(value = "domain") String domain); + List<AppInstance> findAllByApplication(Application application); - @Query("select count(ai.id) FROM AppInstance ai where ai.createdAt >= :sinceTime") - int countAllDeployedSinceTime(@Param("sinceTime") long sinceTime); + @Query("select count(ai.id) FROM AppInstance ai JOIN AppDeployment ad on ad.deploymentId = ai.internalId where ad.state = 'APPLICATION_DEPLOYMENT_VERIFIED'") + int countAllRunning(); - @Query("select count(ai.id) FROM AppInstance ai where ai.createdAt >= :sinceTime AND ai.createdAt < :endTime") - int countAllDeployedSinceTime(@Param("sinceTime") long sinceTime, @Param("endTime") long endTime); + @Query("select count(ai.id) FROM AppInstance ai JOIN AppDeployment ad on ad.deploymentId = ai.internalId where ad.state = 'APPLICATION_DEPLOYMENT_VERIFIED' and ai.application.name = ?1") + int countRunningByName(String name); - @Query("select count(ai.id) FROM AppInstance ai JOIN AppDeployment ad on ad.deploymentId = ai.internalId where ai.application.name = ?1") - int countByName(String name); + @Modifying + @Query("update AppInstance ai set ai.application = :application, ai.previousApplicationId = :previousApplicationId where ai.id = :id") + void updateApplication(@Param(value = "id") Long id, @Param(value = "previousApplicationId") Long previousApplicationId, @Param(value = "application") Application application); - @Query("select ai FROM AppInstance ai where ai.createdAt >= :sinceTime AND ai.createdAt <= :endTime") - List<AppInstance> findAllInTimePeriod(@Param("sinceTime") long start, @Param("endTime") long endTime); + @Query("SELECT COUNT(ai.id) FROM AppInstance ai JOIN AppDeployment ad ON ad.deploymentId = ai.internalId WHERE ai.name = :name AND ai.domain.codename = :domain AND ad.state NOT IN" + + "('APPLICATION_REMOVED'," + + "'APPLICATION_CONFIGURATION_REMOVAL_IN_PROGRESS'," + + "'APPLICATION_CONFIGURATION_REMOVED'," + + "'FAILED_APPLICATION_REMOVED')") + int isNameAvailableInDomain(@Param(value = "name") String name, @Param(value = "domain") String domain); - int countAllByOwner(User user); + @Query(value = "SELECT COUNT(ai.id) FROM app_instance ai WHERE ai.created_at >= :sinceTime AND ai.created_at < :endTime", nativeQuery = true) + int countAllDeployedInTimePeriod(@Param("sinceTime") Long sinceTime, @Param("endTime") Long endTime); + + @Query("SELECT COUNT(ai.id) FROM AppInstance ai JOIN AppDeployment ad ON ad.deploymentId = ai.internalId WHERE ai.application.name = ?1") + int countByName(String name); + + @Query(value = "SELECT * FROM app_instance ai WHERE ai.created_at >= :sinceTime AND ai.created_at <= :endTime", nativeQuery = true) + List<AppInstance> findAllInTimePeriod(@Param("sinceTime") Long sinceTime, @Param("endTime") Long endTime); + + int countAllByOwner(User user); } diff --git a/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java b/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java index c5e01a24bfec1bcaa281a7700fc5cb1aa4264f13..588ee47f006cfc3609713b63e1b3bde59d64a3b3 100644 --- a/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java +++ b/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java @@ -3,10 +3,10 @@ package net.geant.nmaas.portal.service; import net.geant.nmaas.nmservice.deployment.bulks.BulkDeploymentQueueEntry; import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentReviewEvent; import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentStatusUpdateEvent; -import net.geant.nmaas.portal.api.bulk.BulkAppDetails; -import net.geant.nmaas.portal.api.bulk.BulkDeploymentView; -import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS; -import net.geant.nmaas.portal.api.bulk.BulkQueueDetails; +import net.geant.nmaas.portal.api.bulk.model.BulkAppDetails; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentView; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS; +import net.geant.nmaas.portal.api.bulk.model.BulkQueueDetails; import net.geant.nmaas.portal.api.bulk.CsvApplication; import net.geant.nmaas.portal.api.domain.UserViewMinimal; import net.geant.nmaas.portal.persistent.entity.BulkDeployment; diff --git a/src/main/java/net/geant/nmaas/portal/service/BulkDomainService.java b/src/main/java/net/geant/nmaas/portal/service/BulkDomainService.java index 93193b2aec45f57d764e6285c4acf3e082d8b9f5..e8907ae74c055cc888b03c776c8cace6745989a2 100644 --- a/src/main/java/net/geant/nmaas/portal/service/BulkDomainService.java +++ b/src/main/java/net/geant/nmaas/portal/service/BulkDomainService.java @@ -1,7 +1,7 @@ package net.geant.nmaas.portal.service; import net.geant.nmaas.portal.api.bulk.CsvDomain; -import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS; import net.geant.nmaas.portal.api.domain.UserViewMinimal; import java.util.List; 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 dc6c779c14773d91f9d9440e4183e28c68d91d2c..8355f3786669131b5e1b7a89a7368a0d625fd8ca 100644 --- a/src/main/java/net/geant/nmaas/portal/service/ConfigurationManager.java +++ b/src/main/java/net/geant/nmaas/portal/service/ConfigurationManager.java @@ -1,6 +1,6 @@ package net.geant.nmaas.portal.service; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; public interface ConfigurationManager { diff --git a/src/main/java/net/geant/nmaas/portal/service/DashboardService.java b/src/main/java/net/geant/nmaas/portal/service/DashboardService.java index 2c172aacac41010fb4b3e072ec1eb70b6afde746..16cc232b9d1956fa0c6c32e3401b005b9a840fd2 100644 --- a/src/main/java/net/geant/nmaas/portal/service/DashboardService.java +++ b/src/main/java/net/geant/nmaas/portal/service/DashboardService.java @@ -7,7 +7,8 @@ import java.time.OffsetDateTime; public interface DashboardService { - public DashboardView getSystemDashboard(OffsetDateTime startDate, OffsetDateTime endDate); + DashboardView getSystemDashboard(OffsetDateTime startDate, OffsetDateTime endDate); + + DomainDashboardView getDomainDashboard(Long domainId); - public DomainDashboardView getSystemDomainDashboard(Long domainId); } diff --git a/src/main/java/net/geant/nmaas/portal/service/WebhookEventService.java b/src/main/java/net/geant/nmaas/portal/service/WebhookEventService.java index 7d698b738b5f9b55340ceb6d5644366b918edda5..2a0be60f59facbd0d9040c6b0ca87779ab648c2f 100644 --- a/src/main/java/net/geant/nmaas/portal/service/WebhookEventService.java +++ b/src/main/java/net/geant/nmaas/portal/service/WebhookEventService.java @@ -1,7 +1,7 @@ package net.geant.nmaas.portal.service; import net.geant.nmaas.portal.api.domain.WebhookEventDto; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.api.security.EncryptionService; import net.geant.nmaas.portal.persistent.entity.WebhookEvent; import net.geant.nmaas.portal.persistent.entity.WebhookEventType; @@ -23,7 +23,7 @@ public class WebhookEventService { private static final String WEBHOOK_EVENT_NOT_FOUND = "WebhookEvent not found."; @Autowired - public WebhookEventService(WebhookEventRepository webhookRepository, EncryptionService encryptionService, ModelMapper modelMapper){ + public WebhookEventService(WebhookEventRepository webhookRepository, EncryptionService encryptionService, ModelMapper modelMapper) { this.webhookRepository = webhookRepository; this.encryptionService = encryptionService; this.modelMapper = modelMapper; @@ -35,10 +35,14 @@ public class WebhookEventService { return webhookRepository.save(webhookEvent); } - public void update(WebhookEventDto webhookEventDto) throws GeneralSecurityException { - WebhookEvent webhookEvent = webhookRepository.findById(webhookEventDto.getId()).orElseThrow(() -> new MissingElementException(WEBHOOK_EVENT_NOT_FOUND)); + public WebhookEventDto update(WebhookEventDto webhookEventDto) throws GeneralSecurityException { + WebhookEvent webhookEvent = webhookRepository.findById(webhookEventDto.getId()) + .orElseThrow(() -> new MissingElementException(WEBHOOK_EVENT_NOT_FOUND)); setWebhookEvent(webhookEvent, webhookEventDto); - webhookRepository.save(webhookEvent); + webhookEvent = webhookRepository.save(webhookEvent); + WebhookEventDto dto = modelMapper.map(webhookEvent, WebhookEventDto.class); + dto.setTokenValue(webhookEvent.getTokenValue() == null ? null : encryptionService.decrypt(webhookEvent.getTokenValue())); + return dto; } private void setWebhookEvent(WebhookEvent webhookEvent, WebhookEventDto webhookEventDto) throws GeneralSecurityException { @@ -49,20 +53,22 @@ public class WebhookEventService { webhookEvent.setAuthorizationHeader(webhookEventDto.getAuthorizationHeader()); } - public void remove(Long id){ - WebhookEvent webhookEvent = webhookRepository.findById(id).orElseThrow(() -> new MissingElementException(WEBHOOK_EVENT_NOT_FOUND)); + public void remove(Long id) { + WebhookEvent webhookEvent = webhookRepository.findById(id) + .orElseThrow(() -> new MissingElementException(WEBHOOK_EVENT_NOT_FOUND)); webhookRepository.delete(webhookEvent); } public List<WebhookEventDto> getAllWebhooks() { - return webhookRepository.findAll().stream().map(x -> - { + return webhookRepository.findAll().stream() + .map(x -> { try { - x.setTokenValue(x.getTokenValue() == null ? null : encryptionService.decrypt(x.getTokenValue())); + WebhookEventDto dto = modelMapper.map(x, WebhookEventDto.class); + dto.setTokenValue(x.getTokenValue() == null ? null : encryptionService.decrypt(x.getTokenValue())); + return dto; } catch (GeneralSecurityException e) { throw new RuntimeException(e); } - return modelMapper.map(x, WebhookEventDto.class); }).toList(); } @@ -73,7 +79,8 @@ public class WebhookEventService { public WebhookEventDto getById(Long id) throws GeneralSecurityException { WebhookEvent event = webhookRepository.findById(id) .orElseThrow(() -> new MissingElementException(String.format("WebhookEventType with id: %d cannot be found", id))); - event.setTokenValue(event.getTokenValue() == null ? null : encryptionService.decrypt(event.getTokenValue())); - return modelMapper.map(event, WebhookEventDto.class); + WebhookEventDto dto = modelMapper.map(event, WebhookEventDto.class); + dto.setTokenValue(event.getTokenValue() == null ? null : encryptionService.decrypt(event.getTokenValue())); + return dto; } } diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java index 5e77ddf1b9091ef1bf47c1e68634d9a8731267d5..966845551e30da0be562bcd652cd8e13bfb0f7a0 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceImpl.java @@ -5,8 +5,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.portal.api.domain.ApplicationBaseS; import net.geant.nmaas.portal.api.domain.ApplicationBaseViewS; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.events.ApplicationActivatedEvent; import net.geant.nmaas.portal.persistent.entity.AppDescription; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationServiceImpl.java index 63e7f6a666f5a21786a109824337d4f2bcfb27cb..db287957b3fa7e8164cb6b6c31b5e7e77dd008bd 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationServiceImpl.java @@ -3,11 +3,10 @@ package net.geant.nmaas.portal.service.impl; import freemarker.template.Configuration; import freemarker.template.Template; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.nmservice.configuration.entities.ConfigFileTemplate; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.events.ApplicationListUpdatedEvent; import net.geant.nmaas.portal.events.ApplicationListUpdatedEvent.ApplicationAction; import net.geant.nmaas.portal.persistent.entity.Application; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java index f7bd7b01231603ccc5750c1c855ad5379f98d57e..df81d1d38d459b83f775c712199f8b2ecdd1a1f0 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceImpl.java @@ -1,7 +1,7 @@ package net.geant.nmaas.portal.service.impl; import lombok.RequiredArgsConstructor; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.exceptions.ObjectNotFoundException; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.ApplicationSubscription; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java index fd28df8e20ce7f89e4866e94897c87a5a50d392c..32f03e8d3d6cc1249f5b6b586c95b991e8d10126 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java @@ -18,15 +18,15 @@ import net.geant.nmaas.orchestration.entities.AppDeployment; import net.geant.nmaas.orchestration.entities.AppDeploymentState; import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentReviewEvent; import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentStatusUpdateEvent; -import net.geant.nmaas.portal.api.bulk.BulkAppDetails; -import net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView; -import net.geant.nmaas.portal.api.bulk.BulkDeploymentView; -import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS; -import net.geant.nmaas.portal.api.bulk.BulkQueueDetails; +import net.geant.nmaas.portal.api.bulk.model.BulkAppDetails; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentView; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS; +import net.geant.nmaas.portal.api.bulk.model.BulkQueueDetails; import net.geant.nmaas.portal.api.bulk.BulkType; import net.geant.nmaas.portal.api.bulk.CsvApplication; import net.geant.nmaas.portal.api.domain.UserViewMinimal; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.exceptions.ObjectNotFoundException; import net.geant.nmaas.portal.persistent.entity.AppInstance; import net.geant.nmaas.portal.persistent.entity.Application; @@ -65,13 +65,13 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_ID; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_INSTANCE_ID; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_INSTANCE_NAME; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_NAME; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_CODENAME; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_NAME; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_ERROR_MESSAGE; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_ID; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_INSTANCE_ID; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_INSTANCE_NAME; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_APP_NAME; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_CODENAME; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_NAME; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_ERROR_MESSAGE; @Service @RequiredArgsConstructor diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java index d0717b5d7748ed73176a531b84274fb579adaa83..b097dbd1c113107f8f5b072b7c8c1a718f7b0e8c 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/BulkCsvProcessorImpl.java @@ -7,7 +7,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.geant.nmaas.portal.api.bulk.CsvApplication; import net.geant.nmaas.portal.api.bulk.CsvDomain; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.service.BulkCsvProcessor; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java index a2b66cdbabbc4e9c52ef203fa341feb205f3033e..98a472bf0d2239643eff38ca5d5f12cf3ad95bfa 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImpl.java @@ -6,7 +6,7 @@ import net.geant.nmaas.dcn.deployment.DcnDeploymentType; import net.geant.nmaas.dcn.deployment.entities.DcnDeploymentState; import net.geant.nmaas.dcn.deployment.entities.DcnInfo; import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManager; -import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS; import net.geant.nmaas.portal.api.bulk.CsvDomain; import net.geant.nmaas.portal.api.domain.DomainDcnDetailsView; import net.geant.nmaas.portal.api.domain.DomainGroupView; @@ -14,7 +14,7 @@ import net.geant.nmaas.portal.api.domain.DomainRequest; import net.geant.nmaas.portal.api.domain.DomainTechDetailsView; import net.geant.nmaas.portal.api.domain.KeyValueView; import net.geant.nmaas.portal.api.domain.UserViewMinimal; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.BulkDeployment; import net.geant.nmaas.portal.persistent.entity.BulkDeploymentEntry; import net.geant.nmaas.portal.persistent.entity.Domain; @@ -41,12 +41,12 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_CODENAME; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_ID; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_NAME; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_EMAIL; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_ID; -import static net.geant.nmaas.portal.api.bulk.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_NAME; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_CODENAME; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_ID; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_DOMAIN_NAME; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_EMAIL; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_ID; +import static net.geant.nmaas.portal.api.bulk.model.BulkDeploymentEntryView.BULK_ENTRY_DETAIL_KEY_USER_NAME; import static net.geant.nmaas.portal.api.bulk.BulkType.DOMAIN; import static net.geant.nmaas.portal.api.bulk.BulkType.USER; import static net.geant.nmaas.portal.persistent.entity.BulkDeploymentState.COMPLETED; 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 2c7c5427605a31c98b52b510ae0989c577862936..c5a2b7d997960b45168496c8f25dae7eb66fe02f 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 @@ -2,7 +2,7 @@ package net.geant.nmaas.portal.service.impl; import lombok.RequiredArgsConstructor; import net.geant.nmaas.nmservice.deployment.bulks.BulkDeploymentJob; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.exceptions.ConfigurationNotFoundException; import net.geant.nmaas.portal.exceptions.OnlyOneConfigurationSupportedException; import net.geant.nmaas.portal.persistent.entity.Configuration; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/ContentServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/ContentServiceImpl.java index 3f6aca341954a57cc0fdbf29fb1811eca0a6d35b..bb428308f16c808a5ca2603232edace47af0267b 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/ContentServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/ContentServiceImpl.java @@ -1,6 +1,6 @@ package net.geant.nmaas.portal.service.impl; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.exceptions.ObjectAlreadyExistsException; import net.geant.nmaas.portal.persistent.entity.Content; import net.geant.nmaas.portal.persistent.repositories.ContentRepository; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/CustomAccessTokenServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/CustomAccessTokenServiceImpl.java index ca7956860b059ca6ebd219563ad42581b23237c7..57b4b20b8b995266d02d0688b57060fa9d0be98d 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/CustomAccessTokenServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/CustomAccessTokenServiceImpl.java @@ -66,7 +66,7 @@ public class CustomAccessTokenServiceImpl implements CustomAccessTokenService { return userApiTokenRepository.findAllByUserId(userId).stream() .filter(userApiToken -> !userApiToken.isDeleted()) .map(this::mapToView) - .collect(Collectors.toList()); + .toList(); } private UserApiToken createNewToken(User user, String name) { diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/DashboardServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/DashboardServiceImpl.java index 28fbdaf017c9710e0be7153591416501c59ce9aa..a7ff9e208d249c6fae0d5004b0f490acae8a18da 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/DashboardServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/DashboardServiceImpl.java @@ -17,124 +17,119 @@ import net.geant.nmaas.portal.service.ApplicationInstanceService; import net.geant.nmaas.portal.service.DashboardService; import net.geant.nmaas.portal.service.DomainService; import net.geant.nmaas.portal.service.UserLoginRegisterService; -import net.geant.nmaas.portal.service.UserService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import java.time.Duration; import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; - @Service @RequiredArgsConstructor @Slf4j public class DashboardServiceImpl implements DashboardService { - private final UserService userService; private final UserRepository userRepository; private final DomainService domainService; private final DomainRepository domainRepository; private final ApplicationInstanceService applicationInstanceService; - private final AppInstanceRepository appInstanceRepo; + private final AppInstanceRepository appInstanceRepository; private final ApplicationBaseRepository applicationBaseRepository; private final UserLoginRegisterService userLoginRegisterService; - @Override public DashboardView getSystemDashboard(OffsetDateTime startDate, OffsetDateTime endDate) { + log.info("Processing dashboard data request for period {} - {}", startDate, endDate); - log.warn("Start date {} / end date {}", startDate, endDate); - - long startTimeStamp = startDate.toEpochSecond(); - long endTimeStamp = endDate.toEpochSecond(); - + long startTimeStamp = startDate.toEpochSecond() * 1000; + long endTimeStamp = endDate.toEpochSecond() * 1000; + log.info("Period in timestamps: {} - {}", startTimeStamp, endTimeStamp); List<String> baseNames = applicationBaseRepository.findAllNames(); Map<String, Integer> applicationDeploymentCountPerName = new HashMap<>(); - List<DashboardDeploymentsView> deploymentsViews = appInstanceRepo.findAllInTimePeriod(startTimeStamp, endTimeStamp) - .stream().map(entry -> DashboardDeploymentsView.builder().user(entry.getOwner().getUsername()) + List<DashboardDeploymentsView> deploymentsViews = appInstanceRepository.findAllInTimePeriod(startTimeStamp, endTimeStamp).stream() + .map(entry -> DashboardDeploymentsView.builder().user(entry.getOwner().getUsername()) .domainName(entry.getDomain().getName()) .applicationName(entry.getApplication().getName()) - .applicationVersion(entry.getApplication().getVersion()).build()).toList(); + .applicationVersion(entry.getApplication().getVersion()) + .build()) + .toList(); baseNames.forEach(name -> { - applicationDeploymentCountPerName.put(name, appInstanceRepo.countByName(name)); + applicationDeploymentCountPerName.put(name, appInstanceRepository.countByName(name)); }); - //filter not deployed application + // filter not deployed application applicationDeploymentCountPerName.entrySet().removeIf(app -> app.getValue() == 0); - log.info("Start stamp {} / end stamp {}", startTimeStamp, endTimeStamp); - return DashboardView.builder() + DashboardView systemView = DashboardView.builder() .domainsCount(domainRepository.count()) .userCount(userRepository.count()) - .instanceCount(appInstanceRepo.count()) - .instanceCountInPeriod(appInstanceRepo.countAllDeployedSinceTime(startTimeStamp, endTimeStamp)) + .instanceCount(appInstanceRepository.count()) + .instanceCountInPeriod(appInstanceRepository.countAllDeployedInTimePeriod(startTimeStamp, endTimeStamp)) .instanceCountInPeriodDetails(deploymentsViews) .popularApps(applicationDeploymentCountPerName).build(); + log.debug("Response: {}", systemView.toString()); + return systemView; } //TODO: Change username to pre @Override - public DomainDashboardView getSystemDomainDashboard(Long domainId) { + public DomainDashboardView getDomainDashboard(Long domainId) { + log.info("Processing dashboard data request for domain {}", domainId); Optional<Domain> domain = domainService.findDomain(domainId); Map<String, OffsetDateTime> userLogins = new HashMap<>(); Map<String, Integer> appsDeployed = new HashMap<>(); List<DomainDashboardView.DomainAppInstanceView> upgradePossible = new ArrayList<>(); - if(domain.isPresent()) { + if (domain.isPresent()) { Domain dom = domain.get(); List<User> domainUsers = domainService.getMembers(domainId); - List<AppInstance> apps = appInstanceRepo.findAllByDomain(dom); + List<AppInstance> apps = appInstanceRepository.findAllByDomain(dom); domainUsers.forEach(user -> { Optional<UserLoginRegister> register = userLoginRegisterService.getLastLogin(user); - if(register.isPresent()) { + if (register.isPresent()) { userLogins.put(this.getUserPreferredUsername(user), register.get().getDate()); - appsDeployed.put(this.getUserPreferredUsername(user), appInstanceRepo.countAllByOwner(user)); + appsDeployed.put(this.getUserPreferredUsername(user), appInstanceRepository.countAllByOwner(user)); } }); apps.forEach(app -> { - upgradePossible.add( DomainDashboardView.DomainAppInstanceView.builder() - .appId(app.getId()) - .appName(app.getApplication().getName()) - .instanceName(app.getName()) - .appVersion(app.getApplication().getVersion()) - .upgradePossible(applicationInstanceService.checkUpgradePossible(app.getId())).build()); + upgradePossible.add(DomainDashboardView.DomainAppInstanceView.builder() + .appId(app.getId()) + .appName(app.getApplication().getName()) + .instanceName(app.getName()) + .appVersion(app.getApplication().getVersion()) + .upgradePossible(applicationInstanceService.checkUpgradePossible(app.getId())).build()); }); - - - return DomainDashboardView.builder() + DomainDashboardView view = DomainDashboardView.builder() .userLogins(userLogins) .applicationDeployed(appsDeployed) .applicationUpgradeStatus(upgradePossible) .build(); + log.debug("Response: {}", view.toString()); + return view; } else { - log.error("Domain {} not present. Returning empty...", domainId ); + log.error("Domain {} not present. Returning empty...", domainId); return DomainDashboardView.builder().build(); } } - private String getUserPreferredUsername(User user) { String preferredUsername; - - if (user == null || StringUtils.isEmpty(user.getUsername())) { + if (StringUtils.isEmpty(user.getUsername())) { throw new IllegalArgumentException("User or username is not set"); } - if(user.getFirstname() != null && !user.getFirstname().isEmpty()) { + if (user.getFirstname() != null && !user.getFirstname().isEmpty()) { preferredUsername = user.getFirstname() + " " + user.getLastname(); - }else{ + } else { preferredUsername = user.getUsername(); } return preferredUsername; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceImpl.java index 2823c728ce858495ce6f708d8968d072848e1503..fec8af2e2b35cd89c5b0a9daeab8a3b643e446bd 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceImpl.java @@ -2,12 +2,11 @@ package net.geant.nmaas.portal.service.impl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import net.geant.nmaas.orchestration.jobs.DomainCreationJob; import net.geant.nmaas.orchestration.jobs.DomainGroupJob; import net.geant.nmaas.portal.api.domain.ApplicationStatePerDomainView; import net.geant.nmaas.portal.api.domain.DomainGroupView; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.ApplicationStatePerDomain; import net.geant.nmaas.portal.persistent.entity.Domain; @@ -29,7 +28,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -66,15 +64,15 @@ public class DomainGroupServiceImpl implements DomainGroupService { domainGroupEntity = domainGroupRepository.save(domainGroupEntity); //call existing webhooks - DomainGroupView domainGroupView = modelMapper.map(domainGroupEntity, DomainGroupView.class); - webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroupView.getId()+ "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "create","domainGroup",domainGroupView))); + //DomainGroupView domainGroupView = modelMapper.map(domainGroupEntity, DomainGroupView.class); + //webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroupView.getId() + "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "create", "domainGroup", domainGroupView))); return modelMapper.map(domainGroupEntity, DomainGroupView.class); } @Override public DomainGroupView addDomainsToGroup(List<Domain> domains, String groupCodeName) { DomainGroup domainGroup = domainGroupRepository.findByCodename(groupCodeName).orElseThrow(); - domains.forEach( domain -> { + domains.forEach(domain -> { log.debug("Adding domain {}/{} to group {}", domain.getName(), domain.getCodename(), groupCodeName); if (!domainGroup.getDomains().contains(domain)) { domainGroup.addDomain(domain); @@ -105,7 +103,7 @@ public class DomainGroupServiceImpl implements DomainGroupService { } domainGroupRepository.deleteById(domainGroupId); //call existing webhooks - webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroup.getId()+ "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "delete","domainGroup",domainGroupView))); + webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroup.getId() + "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "delete", "domainGroup", domainGroupView))); } @Override @@ -122,7 +120,7 @@ public class DomainGroupServiceImpl implements DomainGroupService { public List<DomainGroupView> getAllDomainGroups() { return domainGroupRepository.findAll().stream() .map(g -> modelMapper.map(g, DomainGroupView.class)) - .collect(Collectors.toList()); + .toList(); } @Override @@ -131,11 +129,14 @@ public class DomainGroupServiceImpl implements DomainGroupService { throw new ProcessingException(String.format("Wrong domain group identifier (%s)", domainGroupId)); } DomainGroup domainGroup = this.domainGroupRepository.findById(domainGroupId).orElseThrow(); -// updateRolesInDomainsByUsers(view); + // updateRolesInDomainsByUsers(view); domainGroup.setCodename(view.getCodename()); domainGroup.setName(view.getName()); - domainGroup.setManagers(view.getManagers().stream().map(user -> modelMapper.map(user, User.class)).collect(Collectors.toList())); - for (ApplicationStatePerDomain appState: domainGroup.getApplicationStatePerDomain()) { + domainGroup.setManagers(view.getManagers().stream() + .map(user -> modelMapper.map(user, User.class)) + .toList() + ); + for (ApplicationStatePerDomain appState : domainGroup.getApplicationStatePerDomain()) { for (ApplicationStatePerDomainView appStateView : view.getApplicationStatePerDomain()) { if (appState.getApplicationBase().getId().equals(appStateView.getApplicationBaseId())) { appState.applyChangedState(appStateView); @@ -147,7 +148,7 @@ public class DomainGroupServiceImpl implements DomainGroupService { //call existing webhooks DomainGroupView domainGroupView = modelMapper.map(domainGroup, DomainGroupView.class); - webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroupView.getId()+ "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "update","domainGroup",domainGroupView))); + webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE).forEach(id -> scheduleManager.createOneTimeJob(DomainGroupJob.class, "DomainGroup_" + id + "_" + domainGroupView.getId() + "_" + LocalDateTime.now(), Map.of("webhookId", id, "action", "update", "domainGroup", domainGroupView))); return domainGroupView; } @@ -158,15 +159,16 @@ public class DomainGroupServiceImpl implements DomainGroupService { } public void deleteAppBaseFromAllAppState(ApplicationBase base) { - domainGroupRepository.findAll().forEach(d -> { - d.getApplicationStatePerDomain().removeIf(state -> state.getApplicationBase().equals(base)); - }); + domainGroupRepository.findAll().forEach(d -> + d.getApplicationStatePerDomain().removeIf(state -> state.getApplicationBase().equals(base)) + ); } @Override public void deleteUserFromAllDomainsGroups(User user) { - domainGroupRepository.findAll().forEach(d -> { - d.getManagers().remove(user); - }); + domainGroupRepository.findAll().forEach(d -> + d.getManagers().remove(user) + ); } + } \ No newline at end of file diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java index 5af2eeecbe42cc13ec5cc9c2f262f5fa23aa1f98..b5709bdd619bf3e8a37e36533359525a66d95047 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java @@ -14,8 +14,8 @@ import net.geant.nmaas.portal.api.domain.DomainRequest; import net.geant.nmaas.portal.api.domain.KeyValueView; import net.geant.nmaas.portal.api.domain.UserView; import net.geant.nmaas.portal.api.domain.UserViewMinimal; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.events.DomainCreatedEvent; import net.geant.nmaas.portal.exceptions.ObjectNotFoundException; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; @@ -129,7 +129,7 @@ public class DomainServiceImpl implements DomainService { return domainRepository.findAll() .stream() .filter(domain -> !domain.isDeleted()) - .collect(Collectors.toList()); + .toList(); } @Override @@ -432,7 +432,7 @@ public class DomainServiceImpl implements DomainService { return this.userRoleRepository.findDomainMembers(domain).stream() .filter(user -> user.getRoles().stream().anyMatch(role -> role.getRole().name().equalsIgnoreCase(Role.ROLE_DOMAIN_ADMIN.name()) && role.getDomain().getCodename().equals(domain))) .map(user -> modelMapper.map(user, UserView.class)) - .collect(Collectors.toList()); + .toList(); } @Override @@ -453,7 +453,7 @@ public class DomainServiceImpl implements DomainService { app.setPvStorageSizeLimit(app.getPvStorageSizeLimit()); } return app; - }).collect(Collectors.toList()) + }).toList() ); return domain; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceImpl.java index d621b46b36d88e3525751a410973a507a8985469..f60288bb79ca37270922580b8788f2ff4f95f45c 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceImpl.java @@ -19,7 +19,6 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -109,7 +108,7 @@ public class InternationalizationServiceImpl implements InternationalizationServ return repository.findAll().stream() .map(InternationalizationSimple::getAsInternationalizationView) .map(lang -> modelMapper.map(lang, InternationalizationBriefView.class)) - .collect(Collectors.toList()); + .toList(); } @Override @@ -136,7 +135,7 @@ public class InternationalizationServiceImpl implements InternationalizationServ return repository.findAll().stream() .filter(InternationalizationSimple::isEnabled) .map(InternationalizationSimple::getLanguage) - .collect(Collectors.toList()); + .toList(); } @Override diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/K8sShellServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/K8sShellServiceImpl.java index db2fe3a606a21cb33e3be5bb42f2979de14111a1..fc436484ac09762059a56d446c4a8b993fdd8543 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/K8sShellServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/K8sShellServiceImpl.java @@ -5,7 +5,7 @@ import net.geant.nmaas.kubernetes.shell.PodSessionsStorage; import net.geant.nmaas.kubernetes.KubernetesConnectorHelper; import net.geant.nmaas.portal.api.domain.K8sPodInfo; import net.geant.nmaas.portal.api.domain.K8sShellCommandRequest; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.service.K8sShellService; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/LocalFileStorageService.java b/src/main/java/net/geant/nmaas/portal/service/impl/LocalFileStorageService.java index 5bf5164678369f6559510dfbcabb07da82ece4bd..1b4a448c874c0cc1199e060fb8d0f782ce3cae67 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/LocalFileStorageService.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/LocalFileStorageService.java @@ -1,8 +1,8 @@ package net.geant.nmaas.portal.service.impl; import lombok.extern.slf4j.Slf4j; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.StorageException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.StorageException; import net.geant.nmaas.portal.persistent.entity.FileInfo; import net.geant.nmaas.portal.persistent.repositories.FileInfoRepository; import net.geant.nmaas.portal.service.FileStorageService; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImpl.java index 4e3ad3a2d9fbfbef011d00afb86eff08870e1496..3f98f4e873e0452e6de22e9dc86a144eb431cd9b 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImpl.java @@ -2,9 +2,9 @@ package net.geant.nmaas.portal.service.impl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import net.geant.nmaas.portal.api.exception.ExternalUserMatchException; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.SignupException; +import net.geant.nmaas.portal.api.exceptions.ExternalUserMatchException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.SignupException; import net.geant.nmaas.portal.exceptions.ObjectAlreadyExistsException; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Role; diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java index 96d1e26e2f8021f420288e9175cdef1c499e1aea..1c399f22645b4c6c5bab06c52b4133c342b91145 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/UserServiceImpl.java @@ -11,9 +11,9 @@ import net.geant.nmaas.notifications.templates.MailType; import net.geant.nmaas.portal.api.auth.Registration; import net.geant.nmaas.portal.api.bulk.CsvDomain; import net.geant.nmaas.portal.api.domain.UserView; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; -import net.geant.nmaas.portal.api.exception.SignupException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.SignupException; import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Role; @@ -32,14 +32,10 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.security.SecureRandom; -import java.util.Base64; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; diff --git a/src/main/resources/db/migration/common/V1.8.0_20250527_1530__AddConnectionToCluster.sql b/src/main/resources/db/migration/common/V1.8.0_20250527_1530__AddConnectionToCluster.sql new file mode 100644 index 0000000000000000000000000000000000000000..a43ff1a50ab7bf88301362cd08387965221a17ab --- /dev/null +++ b/src/main/resources/db/migration/common/V1.8.0_20250527_1530__AddConnectionToCluster.sql @@ -0,0 +1,11 @@ +ALTER TABLE kubernetes_nm_service_info +ADD COLUMN k_cluster_id integer; + +ALTER TABLE kubernetes_nm_service_info +ADD CONSTRAINT fk_kubernetes_nm_service_info_kcluster +FOREIGN KEY (k_cluster_id) +REFERENCES k_cluster (id) +ON DELETE SET NULL; + +ALTER TABLE app_deployment +ADD COLUMN remote_cluster_id integer; \ No newline at end of file diff --git a/src/test/java/net/geant/nmaas/nmservice/bulk/BulkDeploymentJobServiceTest.java b/src/test/java/net/geant/nmaas/nmservice/bulk/BulkDeploymentJobServiceTest.java index d3534c007d62b1181c788de314623066c9b5aad5..320d0c717818391a9c5c9682881bb6ad1d284704 100644 --- a/src/test/java/net/geant/nmaas/nmservice/bulk/BulkDeploymentJobServiceTest.java +++ b/src/test/java/net/geant/nmaas/nmservice/bulk/BulkDeploymentJobServiceTest.java @@ -9,7 +9,7 @@ import net.geant.nmaas.orchestration.AppLifecycleManager; import net.geant.nmaas.orchestration.AppLifecycleState; import net.geant.nmaas.orchestration.Identifier; import net.geant.nmaas.orchestration.entities.AppDeploymentState; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.persistent.repositories.BulkDeploymentRepository; import net.geant.nmaas.portal.service.BulkApplicationService; import net.geant.nmaas.portal.service.ConfigurationManager; diff --git a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java index e731123936fbfa7898f805c50e70e49dbe1d8ce1..71dfd8bbe46d70db352e86aa141dea8486767566 100644 --- a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java +++ b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/KubernetesManagerTest.java @@ -2,6 +2,7 @@ package net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes; import com.google.common.collect.Sets; import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManager; +import net.geant.nmaas.externalservices.kubernetes.RemoteClusterManager; import net.geant.nmaas.externalservices.kubernetes.entities.IngressControllerConfigOption; import net.geant.nmaas.gitlab.GitLabManager; import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.components.cluster.DefaultKClusterValidator; @@ -69,6 +70,7 @@ public class KubernetesManagerTest { private final KubernetesClusterIngressManager ingressManager = mock(KubernetesClusterIngressManager.class); private final GitLabManager gitLabManager = mock(GitLabManager.class); private final JanitorService janitorService = mock(JanitorService.class); + private final RemoteClusterManager remoteClusterManager = mock(RemoteClusterManager.class); private static final Identifier DEPLOYMENT_ID = Identifier.newInstance("deploymentId"); @@ -82,7 +84,8 @@ public class KubernetesManagerTest { ingressResourceManager, ingressManager, gitLabManager, - janitorService + janitorService, + remoteClusterManager ); @BeforeEach diff --git a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandPreparationTest.java b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandPreparationTest.java index 74b90525221a703be60760041acfa9ccb517c425..9bd0e19eb80a4419e723e216700fddcc7187bc41 100644 --- a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandPreparationTest.java +++ b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmCommandPreparationTest.java @@ -57,7 +57,7 @@ public class HelmCommandPreparationTest { RELEASE_NAME, null, CHART_NAME_WITH_REPO, - null, false).asString(), + null, false, null).asString(), equalTo(CORRECT_HELM_INSTALL_COMMAND_USING_CHART_FROM_REPO)); assertThat( HelmInstallCommand.commandWithRepo( @@ -66,7 +66,7 @@ public class HelmCommandPreparationTest { RELEASE_NAME, null, CHART_NAME_WITH_REPO, - CHART_VERSION, false).asString(), + CHART_VERSION, false, null).asString(), equalTo(CORRECT_HELM_INSTALL_COMMAND_USING_CHART_FROM_REPO_WITH_VERSION)); } @@ -79,7 +79,7 @@ public class HelmCommandPreparationTest { RELEASE_NAME, null, CHART_NAME_WITH_REPO, - null, false).asString(), + null, false, null).asString(), equalTo(CORRECT_HELM_INSTALL_COMMAND_FOR_v3_USING_CHART_FROM_REPO)); assertThat( HelmInstallCommand.commandWithRepo( @@ -88,7 +88,7 @@ public class HelmCommandPreparationTest { RELEASE_NAME, null, CHART_NAME_WITH_REPO, - CHART_VERSION, false).asString(), + CHART_VERSION, false, null).asString(), equalTo(CORRECT_HELM_INSTALL_COMMAND_FOR_V3_USING_CHART_FROM_REPO_WITH_VERSION)); } @@ -101,7 +101,7 @@ public class HelmCommandPreparationTest { RELEASE_NAME, null, CHART_NAME_WITH_REPO, - null, true).asString(), + null, true, null).asString(), equalTo(CORRECT_HELM_INSTALL_COMMAND_USING_CHART_FROM_REPO + TLS)); assertThat( HelmInstallCommand.commandWithRepo( @@ -110,7 +110,7 @@ public class HelmCommandPreparationTest { RELEASE_NAME, null, CHART_NAME_WITH_REPO, - CHART_VERSION, true).asString(), + CHART_VERSION, true, null).asString(), equalTo(CORRECT_HELM_INSTALL_COMMAND_USING_CHART_FROM_REPO_WITH_VERSION + TLS)); } @@ -127,7 +127,7 @@ public class HelmCommandPreparationTest { arguments, CHART_NAME_WITH_REPO, CHART_VERSION, - false).asString(), + false, null).asString(), allOf(containsString(CORRECT_HELM_INSTALL_COMMAND_FIRST_PART), containsString("testPersistenceName"), containsString("testStorageClass")) @@ -147,7 +147,7 @@ public class HelmCommandPreparationTest { arguments, CHART_NAME_WITH_REPO, CHART_VERSION, - true).asString(), + true, null).asString(), allOf(containsString(CORRECT_HELM_INSTALL_COMMAND_FIRST_PART), containsString("testPersistenceName"), containsString("testStorageClass"), diff --git a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManagerTest.java b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManagerTest.java index 0ebf9adc9ddcfcaceebc693ebe1c5dfec3b704c1..f743955611888d0dc852135850bdb170cf8e77df 100644 --- a/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManagerTest.java +++ b/src/test/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/components/helm/HelmKServiceManagerTest.java @@ -5,6 +5,11 @@ import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManag import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterNamespaceService; import net.geant.nmaas.externalservices.kubernetes.entities.IngressCertificateConfigOption; import net.geant.nmaas.externalservices.kubernetes.entities.IngressResourceConfigOption; +import net.geant.nmaas.externalservices.kubernetes.entities.KCluster; +import net.geant.nmaas.externalservices.kubernetes.entities.KClusterDeployment; +import net.geant.nmaas.externalservices.kubernetes.entities.KClusterIngress; +import net.geant.nmaas.externalservices.kubernetes.entities.KClusterState; +import net.geant.nmaas.externalservices.kubernetes.entities.NamespaceConfigOption; import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.KubernetesRepositoryManager; import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.KubernetesNmServiceInfo; import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.entities.KubernetesTemplate; @@ -18,6 +23,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; +import java.time.OffsetDateTime; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -119,7 +125,8 @@ public class HelmKServiceManagerTest { eq("namespace"), eq("descriptiveDeploymentId"), k8sTemplateArg.capture(), - argumentsArg.capture() + argumentsArg.capture(), + eq(null) ); assertThat(argumentsArg.getValue()).isNotEmpty(); assertThat(argumentsArg.getValue().size()).isEqualTo(11); @@ -142,8 +149,9 @@ public class HelmKServiceManagerTest { verify(helmCommandExecutor, times(1)).executeHelmInstallCommand( eq("namespace"), eq("descriptiveDeploymentId"), - any(), - any() + any(KubernetesTemplate.class), + any(Map.class), + eq(null) ); } @@ -228,4 +236,63 @@ public class HelmKServiceManagerTest { ); } + @Test + void shouldDeployServiceWithKubeconfigPath() { + when(namespaceService.namespace("domain")).thenReturn("namespace"); + when(ingressManager.getResourceConfigOption()).thenReturn(IngressResourceConfigOption.DEPLOY_FROM_CHART); + when(ingressManager.getIngressPerDomain()).thenReturn(false); + when(ingressManager.getSupportedIngressClass()).thenReturn("testIngressClass"); + when(ingressManager.getTlsSupported()).thenReturn(true); + when(ingressManager.getIssuerOrWildcardName()).thenReturn("testIssuerName"); + when(ingressManager.getCertificateConfigOption()).thenReturn(IngressCertificateConfigOption.USE_LETSENCRYPT); + + + KClusterDeployment mockDeployment = KClusterDeployment.builder() + .namespaceConfigOption(NamespaceConfigOption.CREATE_NAMESPACE) + .defaultNamespace("default-namespace") + .defaultStorageClass("default-storage-class") + .smtpServerHostname("smtp.example.com") + .smtpServerPort(587) + .smtpServerUsername("user@example.com") + .smtpServerPassword("password") + .smtpFromDefaultDomain("example.com") + .forceDedicatedWorkers(true) + .build(); + + KClusterIngress mockIngress = KClusterIngress.builder().resourceConfigOption(IngressResourceConfigOption.NOT_USED).build(); + + + KCluster mockCluster = KCluster.builder() + .id(1L) + .name("TestCluster") + .codename("test-cluster") + .description("Mocked Kubernetes Cluster") + .creationDate(OffsetDateTime.now()) + .modificationDate(OffsetDateTime.now()) + .clusterConfigFile("mock-cluster-config") + .pathConfigFile("mock/path/to/kubeconfig") + .state(KClusterState.UNKNOWN) + .currentStateSince(OffsetDateTime.now()) + .contactEmail("test@example.com") + .deployment(mockDeployment) + .ingress(mockIngress) + .build(); + + KubernetesNmServiceInfo service = repositoryManager.loadService(deploymentId); + service.setRemoteCluster(mockCluster); + when(repositoryManager.loadService(deploymentId)).thenReturn(service); + + manager.deployService(deploymentId); + + ArgumentCaptor<String> kubeconfigPathArg = ArgumentCaptor.forClass(String.class); + verify(helmCommandExecutor, times(1)).executeHelmInstallCommand( + eq("namespace"), + eq("descriptiveDeploymentId"), + any(KubernetesTemplate.class), + any(Map.class), + kubeconfigPathArg.capture() + ); + assertThat(kubeconfigPathArg.getValue()).isEqualTo("mock/path/to/kubeconfig"); + } + } diff --git a/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java b/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java index fbcc4be5095906aa4a4b1a2ea81c88cf83234155..3d56deaea7c9ef53af4d3bef50d0ece400655a76 100644 --- a/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java +++ b/src/test/java/net/geant/nmaas/notifications/NotificationManagerTest.java @@ -7,9 +7,9 @@ import net.geant.nmaas.notifications.templates.api.LanguageMailContentView; import net.geant.nmaas.notifications.templates.api.MailTemplateView; import net.geant.nmaas.notifications.types.persistence.entity.FormType; import net.geant.nmaas.notifications.types.service.FormTypeService; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.api.domain.UserView; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Role; import net.geant.nmaas.portal.persistent.entity.User; diff --git a/src/test/java/net/geant/nmaas/notifications/types/service/FormTypeServiceTest.java b/src/test/java/net/geant/nmaas/notifications/types/service/FormTypeServiceTest.java index 550c228e702f2e0124e3efc5f6276a9a5c33237a..a26ad8a7cffa5ad4b9a0cad3e3b0082e80e335b4 100644 --- a/src/test/java/net/geant/nmaas/notifications/types/service/FormTypeServiceTest.java +++ b/src/test/java/net/geant/nmaas/notifications/types/service/FormTypeServiceTest.java @@ -3,7 +3,6 @@ package net.geant.nmaas.notifications.types.service; import net.geant.nmaas.notifications.types.model.FormTypeRequest; import net.geant.nmaas.notifications.types.persistence.entity.FormType; import net.geant.nmaas.notifications.types.persistence.repository.FormTypeRepository; -import net.geant.nmaas.portal.api.exception.ProcessingException; import net.geant.nmaas.portal.exceptions.DataConflictException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTaskTest.java b/src/test/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTaskTest.java index 6171c102318ac1bf8e99820409db14223e7b90f9..622f4cd25704c5a4af63235d9bd1389790545c55 100644 --- a/src/test/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTaskTest.java +++ b/src/test/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTaskTest.java @@ -1,5 +1,6 @@ package net.geant.nmaas.orchestration.tasks.app; +import net.geant.nmaas.externalservices.kubernetes.RemoteClusterManager; import net.geant.nmaas.nmservice.deployment.NmServiceDeploymentProvider; import net.geant.nmaas.orchestration.Identifier; import net.geant.nmaas.orchestration.entities.AppDeployment; @@ -25,6 +26,7 @@ public class AppRequestVerificationTaskTest { private NmServiceDeploymentProvider deploy = mock(NmServiceDeploymentProvider.class); private AppDeploymentRepository deployments = mock(AppDeploymentRepository.class); private ApplicationRepository applications = mock(ApplicationRepository.class); + private RemoteClusterManager remoteClusterManager = mock(RemoteClusterManager.class); private AppRequestVerificationTask task; @@ -33,13 +35,14 @@ public class AppRequestVerificationTaskTest { @BeforeEach public void setup() { - task = new AppRequestVerificationTask(deploy, deployments, applications); + task = new AppRequestVerificationTask(deploy, deployments, applications, remoteClusterManager); } @Test public void shouldTriggerRequestVerify() throws InterruptedException { when(deployments.findByDeploymentId(deploymentId)).thenReturn(Optional.of(AppDeployment.builder().applicationId(Identifier.newInstance(10L)).build())); when(applications.findById(any(Long.class))).thenReturn(Optional.of(new Application())); + when(remoteClusterManager.clusterExists(any())).thenReturn(true); task.trigger(new AppVerifyRequestActionEvent(this, deploymentId)); verify(deploy, times(1)).verifyRequest(any(Identifier.class), any(AppDeployment.class), isNull()); } diff --git a/src/test/java/net/geant/nmaas/portal/api/auth/BasicAuthControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/auth/BasicAuthControllerTest.java index bc1865721203c6455ec2781927f82781c2bc4c47..0ed54f97e8d22f1a5be6bf4c56a1e9570157e024 100644 --- a/src/test/java/net/geant/nmaas/portal/api/auth/BasicAuthControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/auth/BasicAuthControllerTest.java @@ -1,6 +1,6 @@ package net.geant.nmaas.portal.api.auth; -import net.geant.nmaas.portal.api.exception.AuthenticationException; +import net.geant.nmaas.portal.api.exceptions.AuthenticationException; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Role; import net.geant.nmaas.portal.persistent.entity.User; diff --git a/src/test/java/net/geant/nmaas/portal/api/auth/OIDCAuthControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/auth/OIDCAuthControllerTest.java index 091f1e1382c97e674a1d826c41ecc3242a5d9d26..271094369aae1404d65edd5b73f827095c4196cb 100644 --- a/src/test/java/net/geant/nmaas/portal/api/auth/OIDCAuthControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/auth/OIDCAuthControllerTest.java @@ -2,7 +2,7 @@ package net.geant.nmaas.portal.api.auth; import jakarta.servlet.http.HttpServletRequest; import jakarta.ws.rs.core.HttpHeaders; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Role; diff --git a/src/test/java/net/geant/nmaas/portal/api/bulk/BulkControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/bulk/BulkControllerTest.java index e34930b02f397b04252875ed8dfc5ed78f76b114..acba6d77ed335a7c4dc7f71a8e68d8c99d215d71 100644 --- a/src/test/java/net/geant/nmaas/portal/api/bulk/BulkControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/bulk/BulkControllerTest.java @@ -1,6 +1,7 @@ package net.geant.nmaas.portal.api.bulk; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.bulk.model.BulkDeploymentViewS; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.BulkDeployment; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.persistent.repositories.BulkDeploymentRepository; @@ -10,6 +11,7 @@ import net.geant.nmaas.portal.service.BulkDomainService; import net.geant.nmaas.portal.service.UserService; import org.junit.jupiter.api.Test; import org.modelmapper.ModelMapper; +import org.springframework.dao.PermissionDeniedDataAccessException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.mock.web.MockMultipartFile; @@ -22,10 +24,12 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; @@ -90,22 +94,19 @@ public class BulkControllerTest { when(principalMock.getName()).thenReturn("user"); when(userService.findByUsername("user")).thenReturn(Optional.of(new User("user"))); - ResponseEntity<BulkDeploymentViewS> response = bulkController.uploadApplications(principalMock, "applicationName", 2, file); + bulkController.uploadApplications(principalMock, "applicationName", 2, file); }); } @Test void shouldGetDomainBulksAsGroupManager() { when(principalMock.getName()).thenReturn("user"); - User user = new User("user"); - user.setId(10L); - when(userService.findByUsername("user")).thenReturn(Optional.of(user)); - when(userService.findById(10L)).thenReturn(Optional.of(user)); BulkDeployment viewS = new BulkDeployment(); viewS.setType(BulkType.DOMAIN); - viewS.setCreator(user); + viewS.setCreator(setUpMockUser("user", 10L)); viewS.setDeleted(false); when(bulkDeploymentRepository.findByType(BulkType.DOMAIN)).thenReturn(List.of(viewS)); + assertEquals(1, Objects.requireNonNull(bulkController.getDomainDeploymentRecordsRestrictedToOwner(principalMock).getBody()).size()); } @@ -135,4 +136,91 @@ public class BulkControllerTest { assertEquals(1, Objects.requireNonNull(bulkController.getAppDeploymentRecordsRestrictedToOwner(principalMock).getBody()).size()); } + @Test + void shouldNotRemoveNotFoundBulkDeployment() { + when(principalMock.getName()).thenReturn("user"); + setUpMockUser("user", 10L); + when(bulkDeploymentRepository.findById(5L)).thenReturn(Optional.empty()); + + ResponseEntity<Void> response = bulkController.removeBulkDeployment(5L, false, principalMock); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); + } + + @Test + void shouldRemoveBulkDeployment() { + when(principalMock.getName()).thenReturn("user"); + + BulkDeployment bulk = new BulkDeployment(); + bulk.setId(5L); + bulk.setType(BulkType.APPLICATION); + bulk.setCreator(setUpMockUser("user", 10L)); + bulk.setDeleted(false); + when(bulkDeploymentRepository.findById(5L)).thenReturn(Optional.of(bulk)); + + ResponseEntity<Void> response = bulkController.removeBulkDeployment(5L, false, principalMock); + + verifyNoInteractions(bulkApplicationService); + verify(bulkDeploymentRepository).save(any()); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + } + + @Test + void shouldRemoveBulkDeploymentWithApplications() { + when(principalMock.getName()).thenReturn("user"); + + BulkDeployment bulk = new BulkDeployment(); + bulk.setId(5L); + bulk.setType(BulkType.APPLICATION); + bulk.setCreator(setUpMockUser("user", 10L)); + bulk.setDeleted(false); + when(bulkDeploymentRepository.findById(5L)).thenReturn(Optional.of(bulk)); + + ResponseEntity<Void> response = bulkController.removeBulkDeployment(5L, true, principalMock); + + verify(bulkApplicationService).deleteAppInstancesFromBulk(bulk); + verify(bulkDeploymentRepository).save(any()); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + } + + @Test + void shouldForbidRemovalOfBulkDeploymentForNonCreator() { + when(principalMock.getName()).thenReturn("user"); + setUpMockUser("user", 10L); + + BulkDeployment bulk = new BulkDeployment(); + bulk.setId(5L); + bulk.setType(BulkType.APPLICATION); + bulk.setCreator(setUpMockUser("creator", 11L)); + bulk.setDeleted(false); + when(bulkDeploymentRepository.findById(5L)).thenReturn(Optional.of(bulk)); + + assertThrows(PermissionDeniedDataAccessException.class, () -> + bulkController.removeBulkDeployment(5L, true, principalMock) + ); + + verifyNoInteractions(bulkApplicationService); + verify(bulkDeploymentRepository, times(0)).save(any()); + } + + @Test + void shouldGetBulkDeploymentRefreshedState() { + BulkDeployment bulk = new BulkDeployment(); + bulk.setId(5L); + bulk.setType(BulkType.APPLICATION); + bulk.setCreator(setUpMockUser("creator", 11L)); + bulk.setDeleted(false); + when(bulkApplicationService.updateState(5L)).thenReturn(bulk); + + ResponseEntity<BulkDeploymentViewS> response = bulkController.getRefreshedState(5L); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + } + + private User setUpMockUser(String username, long id) { + User user = new User(username); + user.setId(id); + when(userService.findByUsername(username)).thenReturn(Optional.of(user)); + when(userService.findById(id)).thenReturn(Optional.of(user)); + return user; + } + } \ No newline at end of file diff --git a/src/test/java/net/geant/nmaas/portal/api/configuration/InitScriptsControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/configuration/InitScriptsControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..870572a8fffa1f2940bfdd81219759c903a1a22a --- /dev/null +++ b/src/test/java/net/geant/nmaas/portal/api/configuration/InitScriptsControllerTest.java @@ -0,0 +1,32 @@ +package net.geant.nmaas.portal.api.configuration; + +import net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.components.helm.InitScriptsStateService; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class InitScriptsControllerTest { + + private final InitScriptsStateService service = mock(InitScriptsStateService.class); + + private final InitScriptsController controller = new InitScriptsController(service); + + @Test + void shouldEnableFlagOnStart() { + assertThat(controller.isInitInProgress()).isFalse(); + controller.startInitScripts(); + assertThat(controller.isInitInProgress()).isTrue(); + } + + @Test + void shouldDisableFlagOnEnd() { + assertThat(controller.isInitInProgress()).isFalse(); + controller.endInitScripts(); + assertThat(controller.isInitInProgress()).isFalse(); + verify(service, times(1)).executeHelmRepoUpdate(); + } + +} diff --git a/src/test/java/net/geant/nmaas/portal/api/info/ContentControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/info/ContentControllerTest.java index ba5bc93d64aed5d8b77a4a1024ef097dc1a14c38..d9ed38be7b7ef7d8fbea0ab54090840fd117446e 100644 --- a/src/test/java/net/geant/nmaas/portal/api/info/ContentControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/info/ContentControllerTest.java @@ -1,7 +1,7 @@ package net.geant.nmaas.portal.api.info; import net.geant.nmaas.portal.api.domain.ContentView; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.Content; import net.geant.nmaas.portal.persistent.repositories.ContentRepository; import org.junit.jupiter.api.Test; diff --git a/src/test/java/net/geant/nmaas/portal/api/info/DashboardControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/info/DashboardControllerTest.java index bc11435c61a1723aa7a7f9cb4b467e0d1e33bfa6..7a2983bdef38a223b4654c9998ae9b0a4626e8e8 100644 --- a/src/test/java/net/geant/nmaas/portal/api/info/DashboardControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/info/DashboardControllerTest.java @@ -1,7 +1,5 @@ package net.geant.nmaas.portal.api.info; -import net.geant.nmaas.portal.api.info.DashboardView; -import net.geant.nmaas.portal.api.info.DomainDashboardView; import net.geant.nmaas.portal.service.DashboardService; import org.junit.jupiter.api.Test; @@ -34,7 +32,7 @@ public class DashboardControllerTest { Long domainId = 1L; DomainDashboardView domainDashboardView = DomainDashboardView.builder().build(); - when(dashboardService.getSystemDomainDashboard(domainId)).thenReturn(domainDashboardView); + when(dashboardService.getDomainDashboard(domainId)).thenReturn(domainDashboardView); DomainDashboardView result = dashboardController.getDashboardDomain(domainId); diff --git a/src/test/java/net/geant/nmaas/portal/api/market/AppBaseControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/AppBaseControllerTest.java index a5051424e55b79186dfd296fc1191f634441a8f7..2e83d830daecbedad90864df009b5d6630ed16a7 100644 --- a/src/test/java/net/geant/nmaas/portal/api/market/AppBaseControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/market/AppBaseControllerTest.java @@ -1,6 +1,6 @@ package net.geant.nmaas.portal.api.market; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.Application; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.service.ApplicationBaseService; diff --git a/src/test/java/net/geant/nmaas/portal/api/market/AppCommentsControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/AppCommentsControllerTest.java index 3fb9e121108dbb5328f1d6ec871b3260dfc5ca8a..a7aa16d2307fb1ce6769bdd513f08687aa369293 100644 --- a/src/test/java/net/geant/nmaas/portal/api/market/AppCommentsControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/market/AppCommentsControllerTest.java @@ -2,8 +2,8 @@ package net.geant.nmaas.portal.api.market; import net.geant.nmaas.portal.api.domain.CommentRequest; import net.geant.nmaas.portal.api.domain.CommentView; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.Comment; import net.geant.nmaas.portal.persistent.entity.User; diff --git a/src/test/java/net/geant/nmaas/portal/api/market/AppInstanceControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/AppInstanceControllerTest.java index 6cd0015acc4573aa191cb1c4aeb38e6971c9d33a..d49c0f32989bff4da8e590212dbe9f51250da45f 100644 --- a/src/test/java/net/geant/nmaas/portal/api/market/AppInstanceControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/market/AppInstanceControllerTest.java @@ -16,9 +16,8 @@ import net.geant.nmaas.portal.api.domain.AppInstanceView; import net.geant.nmaas.portal.api.domain.AppInstanceViewExtended; import net.geant.nmaas.portal.api.domain.ApplicationDTO; import net.geant.nmaas.portal.api.domain.DomainBase; -import net.geant.nmaas.portal.api.domain.Id; import net.geant.nmaas.portal.api.domain.UserBase; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.AppInstance; import net.geant.nmaas.portal.persistent.entity.Application; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; diff --git a/src/test/java/net/geant/nmaas/portal/api/market/AppScreenshotsControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/AppScreenshotsControllerTest.java index 97a8e8c4c603765e38472bb4d5f1397456b85240..e98bd899481f6e72701f5577e19522a29906039f 100644 --- a/src/test/java/net/geant/nmaas/portal/api/market/AppScreenshotsControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/market/AppScreenshotsControllerTest.java @@ -2,7 +2,7 @@ package net.geant.nmaas.portal.api.market; import net.geant.nmaas.portal.api.domain.FileInfoView; import net.geant.nmaas.portal.api.domain.UserFile; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.FileInfo; import net.geant.nmaas.portal.service.ApplicationBaseService; diff --git a/src/test/java/net/geant/nmaas/portal/api/market/RegistrationControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/RegistrationControllerTest.java index 36ccd7582a8edaed4ca224a9be0dfb7a7b3e00ca..cf4ca68fbaf3cd2d199656364a513955cf0ca1ae 100644 --- a/src/test/java/net/geant/nmaas/portal/api/market/RegistrationControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/market/RegistrationControllerTest.java @@ -2,8 +2,8 @@ package net.geant.nmaas.portal.api.market; import net.geant.nmaas.portal.api.auth.Registration; import net.geant.nmaas.portal.api.domain.DomainBase; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.SignupException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.SignupException; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.service.DomainService; diff --git a/src/test/java/net/geant/nmaas/portal/api/market/UsersControllerTest.java b/src/test/java/net/geant/nmaas/portal/api/market/UsersControllerTest.java index 9d2422f6fb347f4eb9833f5e6a13fb0e5b6573e3..4b70031a859db6b376533e8fc2289470f652365d 100644 --- a/src/test/java/net/geant/nmaas/portal/api/market/UsersControllerTest.java +++ b/src/test/java/net/geant/nmaas/portal/api/market/UsersControllerTest.java @@ -6,8 +6,8 @@ import net.geant.nmaas.portal.api.domain.UserRequest; import net.geant.nmaas.portal.api.domain.UserRoleView; import net.geant.nmaas.portal.api.domain.UserView; import net.geant.nmaas.portal.api.domain.UserViewMinimal; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.api.user.UsersController; import net.geant.nmaas.portal.exceptions.ObjectNotFoundException; diff --git a/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java b/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java index 8df5075e776a6f36868a1bcc1e90eb7b39222255..20c1a9c5c5b19e74e202f5e23d3241745d5ba877 100644 --- a/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java +++ b/src/test/java/net/geant/nmaas/portal/persistent/entity/ConfigurationTest.java @@ -1,6 +1,6 @@ package net.geant.nmaas.portal.persistent.entity; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import org.assertj.core.util.Lists; import org.junit.jupiter.api.Test; import org.modelmapper.ModelMapper; diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java index e62ab15033e142a87c38d3f8e1096ebe482a4ac0..e98ec9f4692ff0ec750b09b2c1bbacfbf1e70032 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationBaseServiceTest.java @@ -1,7 +1,7 @@ package net.geant.nmaas.portal.service.impl; import com.google.common.collect.Sets; -import net.geant.nmaas.portal.api.exception.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; import net.geant.nmaas.portal.events.ApplicationActivatedEvent; import net.geant.nmaas.portal.persistent.entity.AppDescription; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceTest.java index 7c4334a548f8fa4bd6590cba73752bc04a77ca3f..a16c680de53d16ef3174c1de70d346599d665d86 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/ApplicationSubscriptionServiceTest.java @@ -1,8 +1,8 @@ package net.geant.nmaas.portal.service.impl; import com.google.common.collect.ImmutableSet; -import net.geant.nmaas.portal.api.exception.MissingElementException; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.MissingElementException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.exceptions.ObjectNotFoundException; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.ApplicationState; diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImplTest.java index abbd3c311f4db04779cafa20347af1a39d94f149..cf03b5045b55c06772cd7be5143a522ccad875cb 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImplTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImplTest.java @@ -14,8 +14,7 @@ import net.geant.nmaas.orchestration.AppLifecycleState; import net.geant.nmaas.orchestration.Identifier; import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentReviewEvent; import net.geant.nmaas.orchestration.events.app.AppAutoDeploymentStatusUpdateEvent; -import net.geant.nmaas.portal.api.bulk.BulkQueueDetails; -import net.geant.nmaas.portal.api.bulk.BulkType; +import net.geant.nmaas.portal.api.bulk.model.BulkQueueDetails; import net.geant.nmaas.portal.api.bulk.CsvApplication; import net.geant.nmaas.portal.api.domain.UserViewMinimal; import net.geant.nmaas.portal.persistent.entity.AppInstance; diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java index fc458ce116dad04352c83a9634841a070001ba02..827f0f40a1dc23835fc709bcf47b4416797e3d5d 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/BulkDomainServiceImplTest.java @@ -5,7 +5,7 @@ import net.geant.nmaas.dcn.deployment.entities.DomainDcnDetails; import net.geant.nmaas.externalservices.kubernetes.KubernetesClusterIngressManager; import net.geant.nmaas.portal.api.bulk.BulkType; import net.geant.nmaas.portal.api.bulk.CsvDomain; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.api.domain.UserViewMinimal; import net.geant.nmaas.portal.persistent.entity.BulkDeployment; import net.geant.nmaas.portal.persistent.entity.BulkDeploymentEntry; 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 c0e41cd98b7cd093b04ef4389bdbf152a94110db..a160941b79b885ed18180ec921d0719dfe288535 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 @@ -1,7 +1,7 @@ package net.geant.nmaas.portal.service.impl; import net.geant.nmaas.nmservice.deployment.bulks.BulkDeploymentJob; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.api.i18n.api.InternationalizationView; import net.geant.nmaas.portal.exceptions.ConfigurationNotFoundException; import net.geant.nmaas.portal.exceptions.OnlyOneConfigurationSupportedException; diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/ContentServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/ContentServiceImplTest.java index 72ff1bdaa33f8572043d8b0971333b84a9e310bd..ef34ce3f662037da153660b66fd657d5d5c39e8d 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/ContentServiceImplTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/ContentServiceImplTest.java @@ -1,6 +1,6 @@ package net.geant.nmaas.portal.service.impl; -import net.geant.nmaas.portal.api.exception.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.exceptions.ObjectAlreadyExistsException; import net.geant.nmaas.portal.persistent.entity.Content; import net.geant.nmaas.portal.persistent.repositories.ContentRepository; diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/DashboardServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/DashboardServiceImplTest.java index f35951e6cfdf5e61ca16780fabfdf728afd51910..bd43f5975e33642dbb284d918ed93c0501783053 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/DashboardServiceImplTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/DashboardServiceImplTest.java @@ -13,7 +13,6 @@ import net.geant.nmaas.portal.persistent.repositories.UserRepository; import net.geant.nmaas.portal.service.ApplicationInstanceService; import net.geant.nmaas.portal.service.DomainService; import net.geant.nmaas.portal.service.UserLoginRegisterService; -import net.geant.nmaas.portal.service.UserService; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; @@ -25,43 +24,41 @@ import java.util.Optional; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; - public class DashboardServiceImplTest { - private final UserService userService = mock(UserService.class); private final UserRepository userRepository = mock(UserRepository.class); private final DomainService domainService = mock(DomainService.class); private final DomainRepository domainRepository = mock(DomainRepository.class); private final ApplicationInstanceService applicationInstanceService = mock(ApplicationInstanceService.class); - private final AppInstanceRepository appInstanceRepo = mock(AppInstanceRepository.class); + private final AppInstanceRepository appInstanceRepository = mock(AppInstanceRepository.class); private final ApplicationBaseRepository applicationBaseRepository = mock(ApplicationBaseRepository.class); private final UserLoginRegisterService userLoginRegisterService = mock(UserLoginRegisterService.class); private final DashboardServiceImpl dashboardService = new DashboardServiceImpl( - userService, userRepository, domainService, domainRepository, applicationInstanceService, - appInstanceRepo, + appInstanceRepository, applicationBaseRepository, userLoginRegisterService ); - @Test + @Test void getSystemDashboardShouldThrowExceptionWhenRepositoryFails() { when(domainRepository.count()).thenThrow(new RuntimeException("Database error")); - assertThrows(RuntimeException.class, () -> - dashboardService.getSystemDashboard(OffsetDateTime.now().minusDays(1), OffsetDateTime.now()) + assertThrows(RuntimeException.class, () -> + dashboardService.getSystemDashboard(OffsetDateTime.now().minusDays(1), OffsetDateTime.now()) ); } @Test - void getSystemDomainDashboardShouldReturnEmptyObjectWhenDomainIdIsNull() { - DomainDashboardView result = dashboardService.getSystemDomainDashboard(null); + void getDomainDashboardShouldReturnEmptyObjectWhenDomainIdIsNull() { + DomainDashboardView result = dashboardService.getDomainDashboard(null); assert result != null; assert result.getUserLogins() == null; @@ -70,15 +67,15 @@ public class DashboardServiceImplTest { } @Test - void getSystemDomainDashboardShouldHandleEmptyDomainUsers() { + void getDomainDashboardShouldHandleEmptyDomainUsers() { Long domainId = 1L; Domain domain = new Domain(domainId, "Test Domain", "test-domain"); when(domainService.findDomain(domainId)).thenReturn(Optional.of(domain)); when(domainService.getMembers(domainId)).thenReturn(Collections.emptyList()); - when(appInstanceRepo.findAllByDomain(domain)).thenReturn(Collections.emptyList()); + when(appInstanceRepository.findAllByDomain(domain)).thenReturn(Collections.emptyList()); - DomainDashboardView result = dashboardService.getSystemDomainDashboard(domainId); + DomainDashboardView result = dashboardService.getDomainDashboard(domainId); assert result != null; assert result.getUserLogins().isEmpty(); @@ -87,7 +84,7 @@ public class DashboardServiceImplTest { } @Test - void getSystemDomainDashboardShouldHandleEmptyAppInstances() { + void getDomainDashboardShouldHandleEmptyAppInstances() { Long domainId = 1L; Domain domain = new Domain(domainId, "Test Domain", "test-domain"); User user = new User("testUser", true); @@ -95,18 +92,18 @@ public class DashboardServiceImplTest { UserLoginRegister userLoginRegister = new UserLoginRegister( loginTime, user, - UserLoginRegisterType.SUCCESS, // Typ logowania - "127.0.0.1", // Adres IP + UserLoginRegisterType.SUCCESS, // login type + "127.0.0.1", // IP address "localhost", // Host "Mozilla/5.0" // User-Agent ); when(domainService.findDomain(domainId)).thenReturn(Optional.of(domain)); when(domainService.getMembers(domainId)).thenReturn(List.of(user)); - when(appInstanceRepo.findAllByDomain(domain)).thenReturn(Collections.emptyList()); + when(appInstanceRepository.findAllByDomain(domain)).thenReturn(Collections.emptyList()); when(userLoginRegisterService.getLastLogin(user)).thenReturn(Optional.of(userLoginRegister)); - DomainDashboardView result = dashboardService.getSystemDomainDashboard(domainId); + DomainDashboardView result = dashboardService.getDomainDashboard(domainId); assert result != null; assert !result.getUserLogins().isEmpty(); @@ -117,8 +114,8 @@ public class DashboardServiceImplTest { void getSystemDashboardShouldHandleEmptyBaseNames() { when(domainRepository.count()).thenReturn(5L); when(userRepository.count()).thenReturn(10L); - when(appInstanceRepo.count()).thenReturn(15L); - when(appInstanceRepo.countAllDeployedSinceTime(anyLong())).thenReturn((int) 3L); + when(appInstanceRepository.count()).thenReturn(15L); + when(appInstanceRepository.countAllDeployedInTimePeriod(anyLong(), anyLong())).thenReturn((int) 3L); when(applicationBaseRepository.findAllNames()).thenReturn(Collections.emptyList()); DashboardView result = dashboardService.getSystemDashboard(OffsetDateTime.now().minusDays(1), OffsetDateTime.now()); @@ -135,10 +132,10 @@ public class DashboardServiceImplTest { // Mock required repository methods when(domainRepository.count()).thenReturn(1L); when(userRepository.count()).thenReturn(1L); - when(appInstanceRepo.count()).thenReturn(1L); - when(appInstanceRepo.countAllDeployedSinceTime(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(1); + when(appInstanceRepository.count()).thenReturn(1L); + when(appInstanceRepository.countAllDeployedInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(1); when(applicationBaseRepository.findAllNames()).thenReturn(Collections.emptyList()); - when(appInstanceRepo.findAllInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(Collections.emptyList()); + when(appInstanceRepository.findAllInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(Collections.emptyList()); // Call the method dashboardService.getSystemDashboard(startDate, endDate); @@ -147,7 +144,7 @@ public class DashboardServiceImplTest { ArgumentCaptor<Long> startCaptor = ArgumentCaptor.forClass(Long.class); ArgumentCaptor<Long> endCaptor = ArgumentCaptor.forClass(Long.class); - org.mockito.Mockito.verify(appInstanceRepo).countAllDeployedSinceTime(startCaptor.capture(), endCaptor.capture()); + verify(appInstanceRepository).countAllDeployedInTimePeriod(startCaptor.capture(), endCaptor.capture()); long startTimestamp = startCaptor.getValue(); long endTimestamp = endCaptor.getValue(); @@ -164,12 +161,12 @@ public class DashboardServiceImplTest { long toTime = 2000L; int expectedCount = 7; - when(appInstanceRepo.countAllDeployedSinceTime(sinceTime, toTime)).thenReturn(expectedCount); + when(appInstanceRepository.countAllDeployedInTimePeriod(sinceTime, toTime)).thenReturn(expectedCount); - int actualCount = appInstanceRepo.countAllDeployedSinceTime(sinceTime, toTime); + int actualCount = appInstanceRepository.countAllDeployedInTimePeriod(sinceTime, toTime); assert actualCount == expectedCount; - org.mockito.Mockito.verify(appInstanceRepo).countAllDeployedSinceTime(sinceTime, toTime); + verify(appInstanceRepository).countAllDeployedInTimePeriod(sinceTime, toTime); } @Test @@ -179,17 +176,17 @@ public class DashboardServiceImplTest { when(domainRepository.count()).thenReturn(1L); when(userRepository.count()).thenReturn(1L); - when(appInstanceRepo.count()).thenReturn(1L); - when(appInstanceRepo.countAllDeployedSinceTime(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(5); + when(appInstanceRepository.count()).thenReturn(1L); + when(appInstanceRepository.countAllDeployedInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(5); when(applicationBaseRepository.findAllNames()).thenReturn(Collections.emptyList()); - when(appInstanceRepo.findAllInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(Collections.emptyList()); + when(appInstanceRepository.findAllInTimePeriod(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong())).thenReturn(Collections.emptyList()); dashboardService.getSystemDashboard(startDate, endDate); ArgumentCaptor<Long> sinceCaptor = ArgumentCaptor.forClass(Long.class); ArgumentCaptor<Long> toCaptor = ArgumentCaptor.forClass(Long.class); - org.mockito.Mockito.verify(appInstanceRepo).countAllDeployedSinceTime(sinceCaptor.capture(), toCaptor.capture()); + verify(appInstanceRepository).countAllDeployedInTimePeriod(sinceCaptor.capture(), toCaptor.capture()); long sinceTime = sinceCaptor.getValue(); long toTime = toCaptor.getValue(); diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java index 5fb8cb4c800f2519d943b89133014c20531a2147..6474a6f25bf394164ef732ce66d217ed2612ad59 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java @@ -15,8 +15,7 @@ import net.geant.nmaas.portal.api.domain.DomainRequest; import net.geant.nmaas.portal.api.domain.DomainTechDetailsView; import net.geant.nmaas.portal.api.domain.UserView; import net.geant.nmaas.portal.api.domain.UserViewMinimal; -import net.geant.nmaas.portal.api.exception.ProcessingException; -import net.geant.nmaas.portal.api.security.EncryptionService; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; import net.geant.nmaas.portal.events.DomainCreatedEvent; import net.geant.nmaas.portal.persistent.entity.ApplicationBase; import net.geant.nmaas.portal.persistent.entity.ApplicationStatePerDomain; @@ -36,7 +35,6 @@ import net.geant.nmaas.portal.service.ApplicationStatePerDomainService; import net.geant.nmaas.portal.service.DomainGroupService; import net.geant.nmaas.portal.service.DomainService; import net.geant.nmaas.portal.service.UserService; -import net.geant.nmaas.portal.service.WebhookEventService; import net.geant.nmaas.portal.service.impl.domains.DefaultCodenameValidator; import net.geant.nmaas.scheduling.ScheduleManager; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java index 2eeed20b72c80a81a8d2fb390502ffe7d48a1037..1600b477f213e6be82731958bc869a0313a1f25d 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/InternationalizationServiceTest.java @@ -1,6 +1,6 @@ package net.geant.nmaas.portal.service.impl; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; import net.geant.nmaas.portal.api.i18n.api.InternationalizationBriefView; import net.geant.nmaas.portal.api.i18n.api.InternationalizationView; import net.geant.nmaas.portal.persistent.repositories.InternationalizationSimpleRepository; diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImplTest.java index 44860c31d125ed4f211c28dc578e5e9e0727c0ee..60341bc08364c7c97a9ea50ff8d815436a1e70c1 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImplTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/OidcUserServiceImplTest.java @@ -1,7 +1,5 @@ package net.geant.nmaas.portal.service.impl; -import net.geant.nmaas.portal.api.exception.ExternalUserCanNotBeLinked; -import net.geant.nmaas.portal.api.exception.ExternalUserMatchException; import net.geant.nmaas.portal.persistent.entity.User; import net.geant.nmaas.portal.persistent.repositories.UserRepository; import net.geant.nmaas.portal.service.ConfigurationManager; diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java index 8219596559d4876dec1fa3d4a773c5fa838b93e1..19c57a42ed6a32c55dca8339e06928279dc89f76 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/UserServiceImplTest.java @@ -2,9 +2,9 @@ package net.geant.nmaas.portal.service.impl; import net.geant.nmaas.portal.api.auth.Registration; import net.geant.nmaas.portal.api.bulk.CsvDomain; -import net.geant.nmaas.portal.api.configuration.ConfigurationView; -import net.geant.nmaas.portal.api.exception.ProcessingException; -import net.geant.nmaas.portal.api.exception.SignupException; +import net.geant.nmaas.portal.api.configuration.model.ConfigurationView; +import net.geant.nmaas.portal.api.exceptions.ProcessingException; +import net.geant.nmaas.portal.api.exceptions.SignupException; import net.geant.nmaas.portal.api.security.JWTTokenService; import net.geant.nmaas.portal.persistent.entity.Domain; import net.geant.nmaas.portal.persistent.entity.Role; diff --git a/src/test/shell/data/i18n/de.json b/src/test/shell/data/i18n/de.json index ba1a92fa2ba7406eeef03e7564fde57ce33c1d38..da39ebf6f21962821bd320953016ce9481aa4939 100644 --- a/src/test/shell/data/i18n/de.json +++ b/src/test/shell/data/i18n/de.json @@ -1329,6 +1329,7 @@ "DOMAIN_GROUP_CHANGE" : "Domain group change", "NEW" : "Add webhook", "DETAILS" : "Webhooks details", - "SAVE" : "Save webhook" + "SAVE" : "Save", + "REMOVE" : "Remove" } } diff --git a/src/test/shell/data/i18n/en.json b/src/test/shell/data/i18n/en.json index ad5555bd15fa459359c3aacea8fa8ed12b24d46c..7e72dc93321aa42f566df167d0a7899a4cf16403 100644 --- a/src/test/shell/data/i18n/en.json +++ b/src/test/shell/data/i18n/en.json @@ -1324,7 +1324,7 @@ "TITLE_SHORT" : "Webhooks", "ID" : "Id", "NAME" : "Name", - "TARGET_URL" : "Target Url", + "TARGET_URL" : "Target url", "TYPE" : "Webhook type", "TOKEN" : "Token value", "AUTH" : "Authorization header", @@ -1334,6 +1334,7 @@ "DOMAIN_GROUP_CHANGE" : "Domain group change", "NEW" : "Add webhook", "DETAILS" : "Webhooks details", - "SAVE" : "Save webhook" + "SAVE" : "Save", + "REMOVE" : "Remove" } } diff --git a/src/test/shell/data/i18n/fr.json b/src/test/shell/data/i18n/fr.json index 49995a806b69f58e9bde6bb96fa918b483f93917..798c4dd6756eff885a9eee4173f511d8f7a15db5 100644 --- a/src/test/shell/data/i18n/fr.json +++ b/src/test/shell/data/i18n/fr.json @@ -1333,6 +1333,7 @@ "DOMAIN_GROUP_CHANGE" : "Domain group change", "NEW" : "Add webhook", "DETAILS" : "Webhooks details", - "SAVE" : "Save webhook" + "SAVE" : "Save", + "REMOVE" : "Remove" } } diff --git a/src/test/shell/data/i18n/pl.json b/src/test/shell/data/i18n/pl.json index 76d6f8a0133064520e1181739c7f5e976fd8fe02..c666060a7c33958662a64d5620f23ffa2e23cbf5 100644 --- a/src/test/shell/data/i18n/pl.json +++ b/src/test/shell/data/i18n/pl.json @@ -1333,7 +1333,7 @@ "DOMAIN_GROUP_CHANGE" : "Domain group change", "NEW" : "Add webhook", "DETAILS" : "Webhooks details", - "SAVE" : "Save webhook" - + "SAVE" : "Save", + "REMOVE" : "Remove" } }