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 1ce39f84be89c9de640fbd791ff103417be68e18..7ab5cf48dd4a9f2d50d2f5cffecf48911b8649e8 100644 --- a/src/main/java/net/geant/nmaas/externalservices/kubernetes/RemoteClusterManager.java +++ b/src/main/java/net/geant/nmaas/externalservices/kubernetes/RemoteClusterManager.java @@ -349,4 +349,8 @@ public class RemoteClusterManager implements ClusterMonitoringService { } + public boolean clusterExist(Long id) { + return clusterRepository.existsById(id); + } + } \ No newline at end of file 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..b4668e77e24b3174555110a00f1175ec6229f886 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; @@ -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) @@ -97,12 +99,25 @@ public class KubernetesManager implements ContainerOrchestrator { throw new NmServiceRequestVerificationException(iae.getMessage()); } - KubernetesNmServiceInfo serviceInfo = new KubernetesNmServiceInfo( - deploymentId, - appDeployment.getDeploymentName(), - appDeployment.getDomain(), - appDeployment.getDescriptiveDeploymentId() - ); + KubernetesNmServiceInfo serviceInfo; + //verify cluster + if(remoteClusterManager.clusterExist(appDeployment.getRemoteClusterId())) { + serviceInfo = new KubernetesNmServiceInfo( + deploymentId, + appDeployment.getDeploymentName(), + appDeployment.getDomain(), + appDeployment.getDescriptiveDeploymentId(), + remoteClusterManager.getCluster(appDeployment.getRemoteClusterId())); + } else { + serviceInfo = new KubernetesNmServiceInfo( + deploymentId, + appDeployment.getDeploymentName(), + appDeployment.getDomain(), + appDeployment.getDescriptiveDeploymentId() + ); + } + + 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/entities/KubernetesNmServiceInfo.java b/src/main/java/net/geant/nmaas/nmservice/deployment/containerorchestrators/kubernetes/entities/KubernetesNmServiceInfo.java index e2f56ccb6d5a2c1c28894c21616ad0fec369d6bf..7c77eb8654a021dc403df24eec1052bda5bc8075 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 @@ -2,6 +2,7 @@ package net.geant.nmaas.nmservice.deployment.containerorchestrators.kubernetes.e 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 +39,8 @@ public class KubernetesNmServiceInfo extends NmServiceInfo { @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) private Set<ServiceAccessMethod> accessMethods; + private KCluster remoteCluster; + public KubernetesNmServiceInfo () { super(); } @@ -46,4 +49,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/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/tasks/app/AppRequestVerificationTask.java b/src/main/java/net/geant/nmaas/orchestration/tasks/app/AppRequestVerificationTask.java index 3810ab4bbcf8f45dd015521e01b508f0d0dbd047..f7d1e2993767b4072f66086eae00a2cf6f0b13d0 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; @@ -29,6 +30,8 @@ public class AppRequestVerificationTask { private AppDeploymentRepository repository; private ApplicationRepository appRepository; + private RemoteClusterManager remoteClusterManager; + @EventListener @Loggable(LogLevel.INFO) @Transactional(propagation = Propagation.REQUIRES_NEW) @@ -39,6 +42,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.clusterExist(appDeployment.getRemoteClusterId())) { + throw new InvalidDeploymentIdException("Wrong remote cluster Id"); + } serviceDeployment.verifyRequest( deploymentId, appDeployment, 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 81365d8a6ed7c899f34f4ee9eeff9ac7f03351a2..0a2f7e395efbcbc596163f69b7c6ffceeacc5919 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 @@ -297,6 +297,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/service/impl/DomainServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/DomainServiceImpl.java index 5af2eeecbe42cc13ec5cc9c2f262f5fa23aa1f98..88cad0edcb8ff7dbb96d52536d6d811a61bb258d 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 @@ -200,7 +200,7 @@ public class DomainServiceImpl implements DomainService { eventPublisher.publishEvent(new DomainCreatedEvent(this, new DomainCreatedEvent.DomainSpec(saved.getId(), saved.getName(), saved.getCodename(), request.getAnnotations()))); } //call existing webhooks - webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_CREATION).forEach(id -> scheduleManager.createOneTimeJob(DomainCreationJob.class, "DomainCreation_" + id + "_" + saved.getId(), Map.of("webhookId", id, "domainId", saved.getId()))); +// webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_CREATION).forEach(id -> scheduleManager.createOneTimeJob(DomainCreationJob.class, "DomainCreation_" + id + "_" + saved.getId(), Map.of("webhookId", id, "domainId", saved.getId()))); return saved; } catch (Exception ex) { throw new ProcessingException("Unable to create new domain with given name or codename."); 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..8112568adee274e43652fcf6d9e3793c9baf3f30 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,7 +35,7 @@ public class AppRequestVerificationTaskTest { @BeforeEach public void setup() { - task = new AppRequestVerificationTask(deploy, deployments, applications); + task = new AppRequestVerificationTask(deploy, deployments, applications, remoteClusterManager); } @Test