Commit 1a94dcdb authored by Christos Tranoris's avatar Christos Tranoris
Browse files

fix for #14

parent 80d15ab4
Loading
Loading
Loading
Loading
Loading
+5 −142
Original line number Diff line number Diff line
@@ -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;
  

  /**
@@ -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;
@@ -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) {
@@ -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);
      }
      
@@ -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 );  
    
  }
  
  

+516 −0

File added.

Preview size limit exceeded, changes collapsed.

+57 −8
Original line number Diff line number Diff line
@@ -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;
@@ -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")
@@ -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() );


  }