diff --git a/src/main/java/org/etsi/osl/cridge/ActiveMQComponentConfig.java b/src/main/java/org/etsi/osl/cridge/ActiveMQComponentConfig.java index b961569f22b7d857e8c9693a0005e4b7f4768368..e58a3ec0a46e9e6e82cb3aa795c21f594f9fbd9e 100644 --- a/src/main/java/org/etsi/osl/cridge/ActiveMQComponentConfig.java +++ b/src/main/java/org/etsi/osl/cridge/ActiveMQComponentConfig.java @@ -23,7 +23,6 @@ package org.etsi.osl.cridge; import org.apache.camel.component.activemq.ActiveMQComponent; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - import jakarta.jms.ConnectionFactory; /** diff --git a/src/main/java/org/etsi/osl/cridge/CRRouteBuilder.java b/src/main/java/org/etsi/osl/cridge/CRRouteBuilder.java index e6cf5cb4e155d69582514ea36bff6432901061db..78ec06a93467a1a3af0ca0f050b753d36b043056 100644 --- a/src/main/java/org/etsi/osl/cridge/CRRouteBuilder.java +++ b/src/main/java/org/etsi/osl/cridge/CRRouteBuilder.java @@ -1,6 +1,7 @@ package org.etsi.osl.cridge; -import java.util.concurrent.ConcurrentHashMap; +import java.util.Date; +import java.util.concurrent.TimeUnit; import org.apache.camel.LoggingLevel; import org.apache.camel.builder.RouteBuilder; import org.slf4j.Logger; @@ -12,7 +13,6 @@ import io.fabric8.kubernetes.api.model.Namespace; import io.fabric8.kubernetes.api.model.NamespaceBuilder; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; -import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; import lombok.Getter; @Service @@ -57,17 +57,25 @@ public class CRRouteBuilder extends RouteBuilder{ .bean( kubernetesClientResource, "patchCR(${headers}, ${body})") .convertBodyTo( String.class ); - - from( "timer://processUpdateResources?period=60000" ) - .log(LoggingLevel.INFO, log, " process nameSpacesTobeDeleted!") - .to("log:DEBUG?showBody=true&showHeaders=true") - .bean( CRRouteBuilder.class , "processNameSpacesTobeDeleted()"); + // every 3600000 ms (60 minutes) + from( "timer://processUpdateResources?period=3600000" ) + .log(LoggingLevel.INFO, log, " process nameSpacesTobeDeleted!") + .to("log:DEBUG?showBody=true&showHeaders=true") + .bean( CRRouteBuilder.class , "processNameSpacesTobeDeleted()"); } public void processNameSpacesTobeDeleted() { - kubernetesClientResource.getNameSpacesTobeDeleted().forEach( (nameSpaceName, nameSpaceId) -> { + kubernetesClientResource.getNameSpacesTobeDeleted().forEach( (nameSpaceName, datetime) -> { + + Date currentTime = new Date(); //get current time + long diffInMillies = Math.abs(currentTime .getTime() - datetime.getTime()); + + long diff = TimeUnit.HOURS.convert(diffInMillies, TimeUnit.MILLISECONDS); + if (diff<=2) { //after 2 hours this namespace will be deleted + return; + } try (final KubernetesClient k8s = new KubernetesClientBuilder().build()) { logger.info("Trying to delete namespace {}", nameSpaceName); diff --git a/src/main/java/org/etsi/osl/cridge/CatalogClient.java b/src/main/java/org/etsi/osl/cridge/CatalogClient.java index 76eff954bdc667155ab9ff9da55a7b329025ca34..153284e57ef12aac9e10fe31bb3a3db3f08c71bf 100644 --- a/src/main/java/org/etsi/osl/cridge/CatalogClient.java +++ b/src/main/java/org/etsi/osl/cridge/CatalogClient.java @@ -3,21 +3,10 @@ package org.etsi.osl.cridge; import java.io.IOException; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; - -import org.apache.camel.LoggingLevel; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.model.dataformat.JsonLibrary; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import org.etsi.osl.model.DeploymentDescriptor; import org.etsi.osl.tmf.rcm634.model.LogicalResourceSpecification; import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; @@ -25,6 +14,11 @@ import org.etsi.osl.tmf.ri639.model.LogicalResource; import org.etsi.osl.tmf.ri639.model.Resource; import org.etsi.osl.tmf.ri639.model.ResourceCreate; import org.etsi.osl.tmf.ri639.model.ResourceUpdate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; /** * @author ctranoris diff --git a/src/main/java/org/etsi/osl/cridge/CridgeSpingBoot.java b/src/main/java/org/etsi/osl/cridge/CridgeSpingBoot.java index b3bfbb7fd0850afbeb504056ad036ffc49e41e10..9f12e88a6710bdc3c0f86b388b33bb5f949fac4c 100644 --- a/src/main/java/org/etsi/osl/cridge/CridgeSpingBoot.java +++ b/src/main/java/org/etsi/osl/cridge/CridgeSpingBoot.java @@ -19,42 +19,18 @@ */ package org.etsi.osl.cridge; -import java.util.Map; -import java.util.Objects; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.ExitCodeGenerator; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; -import org.springframework.context.event.ContextStoppedEvent; import org.springframework.scheduling.annotation.EnableScheduling; - -import io.fabric8.kubernetes.api.model.GenericKubernetesResource; -import io.fabric8.kubernetes.api.model.ListOptionsBuilder; -import io.fabric8.kubernetes.api.model.Node; -import io.fabric8.kubernetes.api.model.NodeList; -import io.fabric8.kubernetes.api.model.Pod; -import io.fabric8.kubernetes.api.model.PodList; -import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition; -import io.fabric8.kubernetes.client.DefaultKubernetesClient; +import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; -import io.fabric8.kubernetes.client.KubernetesClientException; -import io.fabric8.kubernetes.client.Watch; -import io.fabric8.kubernetes.client.Watcher; -import io.fabric8.kubernetes.client.WatcherException; -import io.fabric8.kubernetes.client.Watcher.Action; -import io.fabric8.kubernetes.client.dsl.base.ResourceDefinitionContext; -import io.fabric8.kubernetes.client.informers.ResourceEventHandler; -import io.fabric8.kubernetes.client.informers.SharedIndexInformer; -import io.fabric8.kubernetes.client.informers.SharedInformerFactory; /** * @author ctranoris @@ -64,38 +40,42 @@ import io.fabric8.kubernetes.client.informers.SharedInformerFactory; @SpringBootApplication public class CridgeSpingBoot implements CommandLineRunner { - private static ApplicationContext applicationContext; + private static ApplicationContext applicationContext; + + private static final Logger logger = + LoggerFactory.getLogger(CridgeSpingBoot.class.getSimpleName()); + - private static final Logger logger = LoggerFactory.getLogger(CridgeSpingBoot.class.getSimpleName()); + @Bean + KubernetesClient kubernetesClient() { + System.setProperty(Config.KUBERNETES_KUBECONFIG_FILE , "C:\\Users\\ctranoris\\.kube\\10.10.10.144.config"); + Config config = Config.autoConfigure(null); + return new KubernetesClientBuilder().withConfig(config).build(); + // return new KubernetesClientBuilder().build(); + } + @Override + public void run(String... arg0) throws Exception { + if (arg0.length > 0 && arg0[0].equals("exitcode")) { + throw new ExitException(); + } - @Bean - KubernetesClient kubernetesClient() { - return new KubernetesClientBuilder().build(); - } + } - @Override - public void run(String... arg0) throws Exception { - if (arg0.length > 0 && arg0[0].equals("exitcode")) { - throw new ExitException(); - } + public static void main(String[] args) throws Exception { - } + logger.info("=========== STARTING CRIDGE =============================="); + applicationContext = new SpringApplication(CridgeSpingBoot.class).run(args); + } - public static void main(String[] args) throws Exception { + class ExitException extends RuntimeException implements ExitCodeGenerator { + private static final long serialVersionUID = 1L; - logger.info("=========== STARTING CRIDGE =============================="); - applicationContext = new SpringApplication(CridgeSpingBoot.class).run(args); - } + @Override + public int getExitCode() { + return 10; + } + } - class ExitException extends RuntimeException implements ExitCodeGenerator { - private static final long serialVersionUID = 1L; - @Override - public int getExitCode() { - return 10; - } - } - - } diff --git a/src/main/java/org/etsi/osl/cridge/KubernetesClientResource.java b/src/main/java/org/etsi/osl/cridge/KubernetesClientResource.java index 88a9912ee01702edcf6af2ab17f4a164f8afc2c9..670953a178d45eef2b2407def6cccfe3dc9b1a9a 100644 --- a/src/main/java/org/etsi/osl/cridge/KubernetesClientResource.java +++ b/src/main/java/org/etsi/osl/cridge/KubernetesClientResource.java @@ -1,19 +1,24 @@ package org.etsi.osl.cridge; -import java.sql.Date; -import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.etsi.osl.domain.model.kubernetes.KubernetesCRDProperty; +import org.etsi.osl.domain.model.kubernetes.KubernetesCRDV1; +import org.etsi.osl.domain.model.kubernetes.KubernetesCRV1; +import org.etsi.osl.domain.model.kubernetes.KubernetesContextDefinition; +import org.etsi.osl.domain.model.kubernetes.KubernetesSecret; +import org.etsi.osl.tmf.common.model.EValueType; +import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; +import org.etsi.osl.tmf.ri639.model.ResourceCreate; +import org.etsi.osl.tmf.ri639.model.ResourceStatusType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.Namespace; import io.fabric8.kubernetes.api.model.NamespaceBuilder; @@ -24,25 +29,10 @@ import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition import io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaProps; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; -import io.fabric8.kubernetes.client.Watch; -import io.fabric8.kubernetes.client.Watcher; -import io.fabric8.kubernetes.client.WatcherException; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.fabric8.kubernetes.client.informers.SharedIndexInformer; -import io.fabric8.kubernetes.client.informers.SharedInformerFactory; import io.fabric8.kubernetes.client.utils.Serialization; -import org.etsi.osl.domain.model.DomainModelDefinition; -import org.etsi.osl.domain.model.kubernetes.KubernetesCRDProperty; -import org.etsi.osl.domain.model.kubernetes.KubernetesCRDV1; -import org.etsi.osl.domain.model.kubernetes.KubernetesCRV1; -import org.etsi.osl.domain.model.kubernetes.KubernetesContextDefinition; -import org.etsi.osl.domain.model.kubernetes.KubernetesSecret; -import org.etsi.osl.tmf.common.model.EValueType; -import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; -import org.etsi.osl.tmf.ri639.model.ResourceCreate; -import org.etsi.osl.tmf.ri639.model.ResourceStatusType; -import org.etsi.osl.tmf.ri639.model.ResourceUpdate; import lombok.Getter; /** @@ -71,8 +61,9 @@ public class KubernetesClientResource { /** * Garbage collect namespaces to be deleted + * Key is the name of the namespace and value the datetime requested. We need this to properly expire this */ - private ConcurrentHashMap<String, String> nameSpacesTobeDeleted = new ConcurrentHashMap<>(); + private ConcurrentHashMap<String, Date> nameSpacesTobeDeleted = new ConcurrentHashMap<>(); private Map<String, Object> watchersForNamespaces = new HashMap<>(); @@ -295,7 +286,7 @@ public class KubernetesClientResource { kcrv.setYaml( Serialization.asYaml( gkr ) ); kcrv.setJson( Serialization.asJson( gkr ) ); - kcrv.setCr_spec( Serialization.asJson( gkr ) ); + kcrv.setCr_spec_applied( Serialization.asJson( gkr ) ); return kcrv; @@ -427,11 +418,15 @@ public class KubernetesClientResource { } - - logger.debug("Deploy the following CR:" ); logger.debug("{}", crspec ); - + +// crspec = """ +// %s +// """.formatted( crspec ); +// +// logger.debug("Deploy the following CR NORMALIZED:" ); +// logger.debug("{}", crspec ); try (final KubernetesClient k8s = new KubernetesClientBuilder().build()) { @@ -486,6 +481,8 @@ public class KubernetesClientResource { this.watchersForNamespaces.put(nameSpacename, result); } + + logger.debug("{}", gkr.toString() ); Resource<GenericKubernetesResource> dummyObject = k8s.resource( gkr ); dummyObject.create(); @@ -610,7 +607,8 @@ public class KubernetesClientResource { logger.debug("============ DELETE crspec: result {} =============", result.toString() ); String nameSpacename = (String) headers.get("org.etsi.osl.namespace"); - this.nameSpacesTobeDeleted.put(nameSpacename, nameSpacename); + + this.nameSpacesTobeDeleted.put(nameSpacename, new Date() ); this.watchersForNamespaces.remove(nameSpacename); }catch (Exception e) { diff --git a/src/main/java/org/etsi/osl/cridge/WatcherService.java b/src/main/java/org/etsi/osl/cridge/WatcherService.java index 9cdc7f968fd55f989b2ca64785c2ee6b70e772ae..ffaa365bf017ca1868d496b311712646965b3943 100644 --- a/src/main/java/org/etsi/osl/cridge/WatcherService.java +++ b/src/main/java/org/etsi/osl/cridge/WatcherService.java @@ -2,22 +2,20 @@ package org.etsi.osl.cridge; import java.util.List; import java.util.Map; - +import org.etsi.osl.domain.model.kubernetes.KubernetesCRDV1; +import org.etsi.osl.tmf.ri639.model.Resource; +import org.etsi.osl.tmf.ri639.model.ResourceCreate; +import org.etsi.osl.tmf.ri639.model.ResourceUpdate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.context.event.ContextStartedEvent; import org.springframework.context.event.ContextStoppedEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; - import io.fabric8.kubernetes.api.model.GenericKubernetesResource; -import io.fabric8.kubernetes.api.model.Pod; -import io.fabric8.kubernetes.api.model.PodList; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition; -import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.Watch; import io.fabric8.kubernetes.client.Watcher; import io.fabric8.kubernetes.client.WatcherException; @@ -25,16 +23,6 @@ import io.fabric8.kubernetes.client.dsl.base.ResourceDefinitionContext; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.fabric8.kubernetes.client.informers.SharedIndexInformer; import io.fabric8.kubernetes.client.informers.SharedInformerFactory; -import org.etsi.osl.domain.model.kubernetes.KubernetesCRDV1; -import org.etsi.osl.domain.model.kubernetes.KubernetesContextDefinition; -import org.etsi.osl.tmf.common.model.EValueType; -import org.etsi.osl.tmf.rcm634.model.ResourceSpecification; -import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationCreate; -import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef; -import org.etsi.osl.tmf.ri639.model.Resource; -import org.etsi.osl.tmf.ri639.model.ResourceCreate; -import org.etsi.osl.tmf.ri639.model.ResourceUpdate; -import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; /** @@ -232,15 +220,27 @@ public class WatcherService { public void eventReceived(Action action, GenericKubernetesResource genericKubernetesResource) { watcherResourcesName = genericKubernetesResource.getKind(); + /** + * Ignore the following kinds! + */ + if ( genericKubernetesResource.getKind() .startsWith("IPAM") ) { + return; + } + + logger.debug("{} Resource Kind:{} Name:{} UID:{} Namespace:{}", action.name(), genericKubernetesResource.getKind(), genericKubernetesResource.getMetadata().getName(), genericKubernetesResource.getMetadata().getUid(), genericKubernetesResource.getMetadata().getNamespace()); + + genericKubernetesResource.getAdditionalProperties().forEach((pk, pv) -> { logger.debug("\t {} {} ", pk, pv); Map<String, Object> values = (Map<String, Object>) pv; values.forEach((speck, specv) -> logger.debug("\t {}={} ", speck, specv)); }); + + //ADDED, DELETED, MODIFIED, BOOKMARK, ERROR if ( action.name().equals( "ADDED" ) ) { updateGenericKubernetesResourceInOSLCatalog( genericKubernetesResource ); @@ -248,6 +248,7 @@ public class WatcherService { } else if ( action.name().equals( "MODIFIED" ) ) { updateGenericKubernetesResourceInOSLCatalog( genericKubernetesResource ); } else if ( action.name().equals( "DELETED" ) ) { + genericKubernetesResource.getMetadata().getLabels().put("org.etsi.osl.deleted", "DELETED"); updateGenericKubernetesResourceInOSLCatalog( genericKubernetesResource ); } else {