Loading src/main/java/org/etsi/osl/cridge/KubernetesClientResource.java +5 −142 Original line number Diff line number Diff line Loading @@ -51,13 +51,13 @@ public class KubernetesClientResource { @Autowired CatalogClient catalogClient; private KubernetesContextDefinition kubernetesContextDefinition = null; private ResourceSpecification kubernetesCRDV1ResourceSpec = null; private ResourceSpecification kubernetesCRV1ResourceSpec = null; private ResourceSpecification kubernetesSecretResourceSpec = null; /** Loading Loading @@ -108,10 +108,7 @@ public class KubernetesClientResource { KubernetesCRV1.OSL_KUBCRV1_RSPEC_CATEGORY, KubernetesCRV1.OSL_KUBCRV1_RSPEC_VERSION); kubernetesSecretResourceSpec = catalogClient.retrieveResourceSpecByNameCategoryVersion( KubernetesSecret.OSL_KUBSECRET_RSPEC_NAME, KubernetesSecret.OSL_KUBSECRET_RSPEC_CATEGORY, KubernetesSecret.OSL_KUBSECRET_RSPEC_VERSION); } return kubernetesContextDefinition; Loading Loading @@ -341,63 +338,8 @@ public class KubernetesClientResource { } KubernetesSecret KubernetesSecret2OpensliceResource(Secret secret) { String baseCRD = String.format( "%s@%s@%s@%s", secret.getKind(), secret.getApiVersion(), kubernetesClient.getConfiguration().getCurrentContext().getContext().getCluster(), kubernetesClient.getMasterUrl().toExternalForm()); KubernetesSecret kcrv = KubernetesSecret.builder() .osl_KUBCRD_RSPEC_UUID( kubernetesSecretResourceSpec.getUuid() ) .name( secret.getMetadata().getName() + "@" + secret.getMetadata().getNamespace() + "@" + kubernetesClient.getConfiguration().getCurrentContext().getContext().getCluster() + "@" + kubernetesClient.getMasterUrl().toExternalForm() ) .version( secret.getApiVersion() ) .currentContextCluster( kubernetesClient.getConfiguration().getCurrentContext().getContext().getCluster() ) .clusterMasterURL( kubernetesClient.getMasterUrl().toString() ) .fullResourceName( "" ) .namespace( Serialization.asJson( secret.getMetadata().getNamespace()) ) .kind( secret.getKind() ) .apiGroup( secret.getPlural() ) .uID( secret.getMetadata().getUid() ) .metadata(Serialization.asJson( secret.getMetadata()) ) //.metadata( gkr.getMetadata().toString() ) .description( String.format( "A secret in namespace %s on %s", secret.getMetadata().getNamespace(), baseCRD )) .build(); secret.getMetadata().getLabels().forEach((pk, pv) -> { logger.debug("\t label: {} {} ", pk, pv); kcrv.getProperties().put( pk , pv); }); if (secret.getData() != null) secret.getData().forEach((kPropName, vProVal) -> { logger.debug("propName={} propValue={} ", kPropName, vProVal ); kcrv.getData().put(kPropName, vProVal); }); if (secret.getStringData() != null) secret.getStringData().forEach((kPropName, vProVal) -> { logger.debug("propName={} propValue={} ", kPropName, vProVal ); kcrv.getProperties().put(kPropName, vProVal); }); kcrv.setDataObj( Serialization.asYaml( secret.getData() ) ); kcrv.setYaml( Serialization.asYaml( secret ) ); kcrv.setJson( Serialization.asJson( secret ) ); return kcrv; } public String deployCR(Map<String, Object> headers, String crspec) { Loading Loading @@ -475,7 +417,9 @@ public class KubernetesClientResource { */ if ( this.watchersForNamespaces.get(nameSpacename) == null ) { SharedIndexInformer<Secret> result = createWatchersFornamespace( nameSpacename, headers ); //SharedIndexInformer<Secret> result = createWatchersFornamespace( nameSpacename, headers ); NamespaceWatcher result = NamespaceWatcher.getNew( kubernetesClient, catalogClient, nameSpacename, headers); this.watchersForNamespaces.put(nameSpacename, result); } Loading @@ -498,87 +442,6 @@ public class KubernetesClientResource { } /** * if the equivalent namespace for the service order is successfully created the create * related wathcers for secrets, services, configmaps, pods, etc * 1) we need to create domainmodels for these * 2) we add them as support resources to our initial resource * @param nameSpacename * @param headers * @return */ private SharedIndexInformer<Secret> createWatchersFornamespace(String nameSpacename, Map<String, Object> headers) { //watcher for secrets SharedIndexInformer<Secret> shixInformer = this.getKubernetesClient() .secrets().inNamespace(nameSpacename).inform(new ResourceEventHandler<Secret>() { @Override public void onAdd(Secret obj) { logger.debug("Added Namespace watcher Resource Kind:{} Name:{} UID:{} Namespace:{}", obj.getKind(), obj.getMetadata().getName(), obj.getMetadata().getUid(), obj.getMetadata().getNamespace()); headers.forEach(((hname, hval) ->{ if (hval instanceof String s) { if ( hname.contains("org.etsi.osl")) { logger.debug("Header: {} = {} ", hname, s ); if ( obj.getMetadata() == null ) { obj.setMetadata( new ObjectMeta()); obj.getMetadata().setLabels( new HashMap<String, String>()); } obj.getMetadata().getLabels().put(hname, s); } } })); updateKubernetesSecretResourceInOSLCatalog( obj ); } @Override public void onUpdate(Secret oldObj, Secret newObj) { logger.debug("onUpdate Namespace watcher Resource Kind:{} Name:{} UID:{} Namespace:{}", newObj.getKind(), newObj.getMetadata().getName(), newObj.getMetadata().getUid(), newObj.getMetadata().getNamespace()); updateKubernetesSecretResourceInOSLCatalog( newObj ); } @Override public void onDelete(Secret obj, boolean deletedFinalStateUnknown) { logger.debug("onDelete Namespace watcher Resource Kind:{} Name:{} UID:{} Namespace:{}", obj.getKind(), obj.getMetadata().getName(), obj.getMetadata().getUid(), obj.getMetadata().getNamespace()); updateKubernetesSecretResourceInOSLCatalog( obj ); } }, 30 * 1000L); // resync period (set 0 for no resync); shixInformer.start(); return shixInformer; } private void updateKubernetesSecretResourceInOSLCatalog(Secret resource) { ResourceCreate rs = this .KubernetesSecret2OpensliceResource( resource ) .toResourceCreate(); catalogClient.createOrUpdateResourceByNameCategoryVersion( rs ); } Loading src/main/java/org/etsi/osl/cridge/NamespaceWatcher.java 0 → 100644 +516 −0 File added.Preview size limit exceeded, changes collapsed. Show changes src/test/java/org/etsi/osl/cridge/CridgeIntegrationTest.java +57 −8 Original line number Diff line number Diff line Loading @@ -41,11 +41,13 @@ import io.fabric8.kubernetes.api.model.NamedContextBuilder; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.api.model.Secret; import io.fabric8.kubernetes.api.model.SecretBuilder; import io.fabric8.kubernetes.api.model.ServiceList; import io.fabric8.kubernetes.api.model.WatchEvent; import io.fabric8.kubernetes.api.model.WatchEventBuilder; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinitionList; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinitionListBuilder; import io.fabric8.kubernetes.api.model.apiextensions.v1.ConversionRequestFluent.V1beta1ServiceReferenceObjectsNested; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; Loading Loading @@ -226,11 +228,60 @@ public class CridgeIntegrationTest { // server api expectations server.expect().get() .withPath("/api/v1/namespaces/orderid-xxx-xxx-xxx/secrets?resourceVersion=0") .andReturn(HttpURLConnection.HTTP_OK, crdMyCalc).once(); .andReturn(HttpURLConnection.HTTP_OK, crdMyCalc).always(); server.expect().get().withPath( "/api/v1/namespaces/orderid-xxx-xxx-xxx/secrets?allowWatchBookmarks=true&timeoutSeconds=600&watch=true") .andReturn(HttpURLConnection.HTTP_OK, crdMyCalc).once(); .andReturn(HttpURLConnection.HTTP_OK, crdMyCalc).always(); server.expect().get().withPath( "/api/v1/namespaces/orderid-xxx-xxx-xxx/services?allowWatchBookmarks=true&resourceVersion=12345&timeoutSeconds=600&watch=true") .andReturn(HttpURLConnection.HTTP_OK, "{\r\n" + " \"kind\": \"ServiceList\",\r\n" + " \"apiVersion\": \"v1\",\r\n" + " \"metadata\": {\r\n" + " \"resourceVersion\": \"12345\"\r\n" + " },\r\n" + " \"items\": []\r\n" + " }").always(); // server api expectations server.expect().get() .withPath("/api/v1/namespaces/orderid-xxx-xxx-xxx/services?resourceVersion=0") .andReturn(HttpURLConnection.HTTP_OK , "{\r\n" + " \"kind\": \"ServiceList\",\r\n" + " \"apiVersion\": \"v1\",\r\n" + " \"metadata\": {\r\n" + " \"resourceVersion\": \"12345\"\r\n" + " },\r\n" + " \"items\": []\r\n" + " }").always(); server.expect().get().withPath( "/api/v1/namespaces/orderid-xxx-xxx-xxx/configmaps?allowWatchBookmarks=true&resourceVersion=12345&timeoutSeconds=600&watch=true") .andReturn(HttpURLConnection.HTTP_OK, "{\r\n" + " \"kind\": \"ConfigMapList\",\r\n" + " \"apiVersion\": \"v1\",\r\n" + " \"metadata\": {\r\n" + " \"resourceVersion\": \"12345\"\r\n" + " },\r\n" + " \"items\": []\r\n" + " }").always(); // server api expectations server.expect().get() .withPath("/api/v1/namespaces/orderid-xxx-xxx-xxx/configmaps?resourceVersion=0") .andReturn(HttpURLConnection.HTTP_OK , "{\r\n" + " \"kind\": \"ConfigMapList\",\r\n" + " \"apiVersion\": \"v1\",\r\n" + " \"metadata\": {\r\n" + " \"resourceVersion\": \"12345\"\r\n" + " },\r\n" + " \"items\": []\r\n" + " }").always(); server.expect().get() .withPath("/apis/stable.example.com/v1/namespaces/orderid-xxx-xxx-xxx/mycalculators") Loading Loading @@ -393,11 +444,9 @@ public class CridgeIntegrationTest { .resource(secret1).create(); KubernetesSecret value = kubernetesClientResource.KubernetesSecret2OpensliceResource(secretCreated); assertEquals("Secret", value.getKind()); assertEquals("v1", value.getVersion()); assertEquals("Secret", secretCreated.getKind()); assertEquals("v1", secretCreated.getApiVersion() ); } Loading Loading
src/main/java/org/etsi/osl/cridge/KubernetesClientResource.java +5 −142 Original line number Diff line number Diff line Loading @@ -51,13 +51,13 @@ public class KubernetesClientResource { @Autowired CatalogClient catalogClient; private KubernetesContextDefinition kubernetesContextDefinition = null; private ResourceSpecification kubernetesCRDV1ResourceSpec = null; private ResourceSpecification kubernetesCRV1ResourceSpec = null; private ResourceSpecification kubernetesSecretResourceSpec = null; /** Loading Loading @@ -108,10 +108,7 @@ public class KubernetesClientResource { KubernetesCRV1.OSL_KUBCRV1_RSPEC_CATEGORY, KubernetesCRV1.OSL_KUBCRV1_RSPEC_VERSION); kubernetesSecretResourceSpec = catalogClient.retrieveResourceSpecByNameCategoryVersion( KubernetesSecret.OSL_KUBSECRET_RSPEC_NAME, KubernetesSecret.OSL_KUBSECRET_RSPEC_CATEGORY, KubernetesSecret.OSL_KUBSECRET_RSPEC_VERSION); } return kubernetesContextDefinition; Loading Loading @@ -341,63 +338,8 @@ public class KubernetesClientResource { } KubernetesSecret KubernetesSecret2OpensliceResource(Secret secret) { String baseCRD = String.format( "%s@%s@%s@%s", secret.getKind(), secret.getApiVersion(), kubernetesClient.getConfiguration().getCurrentContext().getContext().getCluster(), kubernetesClient.getMasterUrl().toExternalForm()); KubernetesSecret kcrv = KubernetesSecret.builder() .osl_KUBCRD_RSPEC_UUID( kubernetesSecretResourceSpec.getUuid() ) .name( secret.getMetadata().getName() + "@" + secret.getMetadata().getNamespace() + "@" + kubernetesClient.getConfiguration().getCurrentContext().getContext().getCluster() + "@" + kubernetesClient.getMasterUrl().toExternalForm() ) .version( secret.getApiVersion() ) .currentContextCluster( kubernetesClient.getConfiguration().getCurrentContext().getContext().getCluster() ) .clusterMasterURL( kubernetesClient.getMasterUrl().toString() ) .fullResourceName( "" ) .namespace( Serialization.asJson( secret.getMetadata().getNamespace()) ) .kind( secret.getKind() ) .apiGroup( secret.getPlural() ) .uID( secret.getMetadata().getUid() ) .metadata(Serialization.asJson( secret.getMetadata()) ) //.metadata( gkr.getMetadata().toString() ) .description( String.format( "A secret in namespace %s on %s", secret.getMetadata().getNamespace(), baseCRD )) .build(); secret.getMetadata().getLabels().forEach((pk, pv) -> { logger.debug("\t label: {} {} ", pk, pv); kcrv.getProperties().put( pk , pv); }); if (secret.getData() != null) secret.getData().forEach((kPropName, vProVal) -> { logger.debug("propName={} propValue={} ", kPropName, vProVal ); kcrv.getData().put(kPropName, vProVal); }); if (secret.getStringData() != null) secret.getStringData().forEach((kPropName, vProVal) -> { logger.debug("propName={} propValue={} ", kPropName, vProVal ); kcrv.getProperties().put(kPropName, vProVal); }); kcrv.setDataObj( Serialization.asYaml( secret.getData() ) ); kcrv.setYaml( Serialization.asYaml( secret ) ); kcrv.setJson( Serialization.asJson( secret ) ); return kcrv; } public String deployCR(Map<String, Object> headers, String crspec) { Loading Loading @@ -475,7 +417,9 @@ public class KubernetesClientResource { */ if ( this.watchersForNamespaces.get(nameSpacename) == null ) { SharedIndexInformer<Secret> result = createWatchersFornamespace( nameSpacename, headers ); //SharedIndexInformer<Secret> result = createWatchersFornamespace( nameSpacename, headers ); NamespaceWatcher result = NamespaceWatcher.getNew( kubernetesClient, catalogClient, nameSpacename, headers); this.watchersForNamespaces.put(nameSpacename, result); } Loading @@ -498,87 +442,6 @@ public class KubernetesClientResource { } /** * if the equivalent namespace for the service order is successfully created the create * related wathcers for secrets, services, configmaps, pods, etc * 1) we need to create domainmodels for these * 2) we add them as support resources to our initial resource * @param nameSpacename * @param headers * @return */ private SharedIndexInformer<Secret> createWatchersFornamespace(String nameSpacename, Map<String, Object> headers) { //watcher for secrets SharedIndexInformer<Secret> shixInformer = this.getKubernetesClient() .secrets().inNamespace(nameSpacename).inform(new ResourceEventHandler<Secret>() { @Override public void onAdd(Secret obj) { logger.debug("Added Namespace watcher Resource Kind:{} Name:{} UID:{} Namespace:{}", obj.getKind(), obj.getMetadata().getName(), obj.getMetadata().getUid(), obj.getMetadata().getNamespace()); headers.forEach(((hname, hval) ->{ if (hval instanceof String s) { if ( hname.contains("org.etsi.osl")) { logger.debug("Header: {} = {} ", hname, s ); if ( obj.getMetadata() == null ) { obj.setMetadata( new ObjectMeta()); obj.getMetadata().setLabels( new HashMap<String, String>()); } obj.getMetadata().getLabels().put(hname, s); } } })); updateKubernetesSecretResourceInOSLCatalog( obj ); } @Override public void onUpdate(Secret oldObj, Secret newObj) { logger.debug("onUpdate Namespace watcher Resource Kind:{} Name:{} UID:{} Namespace:{}", newObj.getKind(), newObj.getMetadata().getName(), newObj.getMetadata().getUid(), newObj.getMetadata().getNamespace()); updateKubernetesSecretResourceInOSLCatalog( newObj ); } @Override public void onDelete(Secret obj, boolean deletedFinalStateUnknown) { logger.debug("onDelete Namespace watcher Resource Kind:{} Name:{} UID:{} Namespace:{}", obj.getKind(), obj.getMetadata().getName(), obj.getMetadata().getUid(), obj.getMetadata().getNamespace()); updateKubernetesSecretResourceInOSLCatalog( obj ); } }, 30 * 1000L); // resync period (set 0 for no resync); shixInformer.start(); return shixInformer; } private void updateKubernetesSecretResourceInOSLCatalog(Secret resource) { ResourceCreate rs = this .KubernetesSecret2OpensliceResource( resource ) .toResourceCreate(); catalogClient.createOrUpdateResourceByNameCategoryVersion( rs ); } Loading
src/main/java/org/etsi/osl/cridge/NamespaceWatcher.java 0 → 100644 +516 −0 File added.Preview size limit exceeded, changes collapsed. Show changes
src/test/java/org/etsi/osl/cridge/CridgeIntegrationTest.java +57 −8 Original line number Diff line number Diff line Loading @@ -41,11 +41,13 @@ import io.fabric8.kubernetes.api.model.NamedContextBuilder; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.api.model.Secret; import io.fabric8.kubernetes.api.model.SecretBuilder; import io.fabric8.kubernetes.api.model.ServiceList; import io.fabric8.kubernetes.api.model.WatchEvent; import io.fabric8.kubernetes.api.model.WatchEventBuilder; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinitionList; import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinitionListBuilder; import io.fabric8.kubernetes.api.model.apiextensions.v1.ConversionRequestFluent.V1beta1ServiceReferenceObjectsNested; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientBuilder; Loading Loading @@ -226,11 +228,60 @@ public class CridgeIntegrationTest { // server api expectations server.expect().get() .withPath("/api/v1/namespaces/orderid-xxx-xxx-xxx/secrets?resourceVersion=0") .andReturn(HttpURLConnection.HTTP_OK, crdMyCalc).once(); .andReturn(HttpURLConnection.HTTP_OK, crdMyCalc).always(); server.expect().get().withPath( "/api/v1/namespaces/orderid-xxx-xxx-xxx/secrets?allowWatchBookmarks=true&timeoutSeconds=600&watch=true") .andReturn(HttpURLConnection.HTTP_OK, crdMyCalc).once(); .andReturn(HttpURLConnection.HTTP_OK, crdMyCalc).always(); server.expect().get().withPath( "/api/v1/namespaces/orderid-xxx-xxx-xxx/services?allowWatchBookmarks=true&resourceVersion=12345&timeoutSeconds=600&watch=true") .andReturn(HttpURLConnection.HTTP_OK, "{\r\n" + " \"kind\": \"ServiceList\",\r\n" + " \"apiVersion\": \"v1\",\r\n" + " \"metadata\": {\r\n" + " \"resourceVersion\": \"12345\"\r\n" + " },\r\n" + " \"items\": []\r\n" + " }").always(); // server api expectations server.expect().get() .withPath("/api/v1/namespaces/orderid-xxx-xxx-xxx/services?resourceVersion=0") .andReturn(HttpURLConnection.HTTP_OK , "{\r\n" + " \"kind\": \"ServiceList\",\r\n" + " \"apiVersion\": \"v1\",\r\n" + " \"metadata\": {\r\n" + " \"resourceVersion\": \"12345\"\r\n" + " },\r\n" + " \"items\": []\r\n" + " }").always(); server.expect().get().withPath( "/api/v1/namespaces/orderid-xxx-xxx-xxx/configmaps?allowWatchBookmarks=true&resourceVersion=12345&timeoutSeconds=600&watch=true") .andReturn(HttpURLConnection.HTTP_OK, "{\r\n" + " \"kind\": \"ConfigMapList\",\r\n" + " \"apiVersion\": \"v1\",\r\n" + " \"metadata\": {\r\n" + " \"resourceVersion\": \"12345\"\r\n" + " },\r\n" + " \"items\": []\r\n" + " }").always(); // server api expectations server.expect().get() .withPath("/api/v1/namespaces/orderid-xxx-xxx-xxx/configmaps?resourceVersion=0") .andReturn(HttpURLConnection.HTTP_OK , "{\r\n" + " \"kind\": \"ConfigMapList\",\r\n" + " \"apiVersion\": \"v1\",\r\n" + " \"metadata\": {\r\n" + " \"resourceVersion\": \"12345\"\r\n" + " },\r\n" + " \"items\": []\r\n" + " }").always(); server.expect().get() .withPath("/apis/stable.example.com/v1/namespaces/orderid-xxx-xxx-xxx/mycalculators") Loading Loading @@ -393,11 +444,9 @@ public class CridgeIntegrationTest { .resource(secret1).create(); KubernetesSecret value = kubernetesClientResource.KubernetesSecret2OpensliceResource(secretCreated); assertEquals("Secret", value.getKind()); assertEquals("v1", value.getVersion()); assertEquals("Secret", secretCreated.getKind()); assertEquals("v1", secretCreated.getApiVersion() ); } Loading