From f9f3217cb82a56060f04f35f7f2d68d9260631ec Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Wed, 29 Jun 2022 09:11:29 +0200 Subject: [PATCH] Implementing connector --- pom.xml | 44 ++- .../resourceregistry/ContextUtility.java | 66 +---- .../resourceregistry/EServiceHandler.java | 275 ------------------ .../resourceregistry/HostingNodeHandler.java | 263 ----------------- .../resourcemanager/EServiceManager.java | 83 +++--- .../resourcemanager/HostingNodeManager.java | 52 ++-- .../resourceregistry/FacetBasedPublisher.java | 137 +++++++++ 7 files changed, 246 insertions(+), 674 deletions(-) delete mode 100644 src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java delete mode 100644 src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java create mode 100644 src/main/java/org/gcube/smartgears/publisher/resourceregistry/FacetBasedPublisher.java diff --git a/pom.xml b/pom.xml index 61450cb..7ea6486 100644 --- a/pom.xml +++ b/pom.xml @@ -38,14 +38,48 @@ + + + + + + + + + + + + + + + + + + + + org.gcube.information-system - resource-registry-publisher + information-system-model + [5.0.0-SNAPSHOT,6.0.0-SNAPSHOT) + + + org.gcube.resource-management + gcube-model + [4.0.0-SNAPSHOT,5.0.0-SNAPSHOT) org.gcube.information-system resource-registry-client + [4.1.0,5.0.0-SNAPSHOT) + + org.gcube.information-system + resource-registry-publisher + [4.1.0,5.0.0-SNAPSHOT) + + + org.gcube.core common-smartgears @@ -54,14 +88,6 @@ org.gcube.core common-events - - org.gcube.information-system - information-system-model - - - org.gcube.resource-management - gcube-model - javax.servlet javax.servlet-api diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/ContextUtility.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/ContextUtility.java index 500ea0d..6ca4a7b 100644 --- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/ContextUtility.java +++ b/src/main/java/org/gcube/smartgears/handler/resourceregistry/ContextUtility.java @@ -1,16 +1,9 @@ package org.gcube.smartgears.handler.resourceregistry; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; import java.util.UUID; -import org.gcube.common.authorization.client.proxy.AuthorizationProxy; -import org.gcube.common.authorization.library.provider.SecurityTokenProvider; -import org.gcube.common.scope.api.ScopeProvider; import org.gcube.informationsystem.resourceregistry.api.contexts.ContextCache; import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; -import org.gcube.smartgears.provider.ProviderFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,67 +14,10 @@ public class ContextUtility { private static Logger logger = LoggerFactory.getLogger(ContextUtility.class); - private static AuthorizationProxy authorizationProxy; - - static { - authorizationProxy = ProviderFactory.provider().authorizationProxy(); - } - - public static void resetContex() { - SecurityTokenProvider.instance.reset(); - ScopeProvider.instance.reset(); - } - - public static void setContextFromToken(String token) { - if (token == null || token.compareTo("") == 0) { - resetContex(); - } else { - SecurityTokenProvider.instance.set(token); - String scope = getContextName(token); - ScopeProvider.instance.set(scope); - } - - } - - public static String getCurrentContextName() { - String token = SecurityTokenProvider.instance.get(); - return getContextName(token); - } - - public static UUID getContextUUID(String token) throws ResourceRegistryException { + public static UUID getContextUUID(String contextFullName) throws ResourceRegistryException { ContextCache contextCache = ContextCache.getInstance(); - String contextFullName = getContextName(token); UUID contextUUID = contextCache.getUUIDByFullName(contextFullName); return contextUUID; } - - public static String getContextName(String token) { - try { - return authorizationProxy.get(token).getContext(); - } catch (Exception e) { - logger.error("Error retrieving context form token {}, it should never happen", token, e); - return null; - } - } - - public static SortedSet getContextFullNamesFromTokens(Set tokens){ - SortedSet contextFullNames = new TreeSet<>(); - for(String token : tokens) { - String contextFullName = getContextName(token); - contextFullNames.add(contextFullName); - } - return contextFullNames; - } - - public static SortedSet getContextUUIDFromTokens(Set tokens) throws ResourceRegistryException { - SortedSet contextsUUID = new TreeSet<>(); - ContextCache contextCache = ContextCache.getInstance(); - for(String token : tokens) { - String contextFullName = getContextName(token); - UUID contextUUID = contextCache.getUUIDByFullName(contextFullName); - contextsUUID.add(contextUUID); - } - return contextsUUID; - } } diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java deleted file mode 100644 index a84e7ea..0000000 --- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/EServiceHandler.java +++ /dev/null @@ -1,275 +0,0 @@ -package org.gcube.smartgears.handler.resourceregistry; - -import static org.gcube.common.events.Observes.Kind.resilient; -import static org.gcube.smartgears.handlers.ProfileEvents.addToContext; -import static org.gcube.smartgears.handlers.ProfileEvents.removeFromContext; -import static org.gcube.smartgears.lifecycle.application.ApplicationLifecycle.activation; -import static org.gcube.smartgears.lifecycle.application.ApplicationLifecycle.failure; -import static org.gcube.smartgears.lifecycle.application.ApplicationLifecycle.stop; -import static org.gcube.smartgears.utils.Utils.rethrowUnchecked; - -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; - -import org.gcube.common.authorization.library.provider.SecurityTokenProvider; -import org.gcube.common.events.Observes; -import org.gcube.informationsystem.model.reference.entities.Resource; -import org.gcube.informationsystem.model.reference.relations.ConsistsOf; -import org.gcube.informationsystem.resourceregistry.api.contexts.ContextCache; -import org.gcube.resourcemanagement.model.reference.entities.facets.StateFacet; -import org.gcube.resourcemanagement.model.reference.entities.resources.EService; -import org.gcube.smartgears.context.application.ApplicationContext; -import org.gcube.smartgears.handler.resourceregistry.resourcemanager.EServiceManager; -import org.gcube.smartgears.handlers.application.ApplicationLifecycleEvent.Start; -import org.gcube.smartgears.lifecycle.application.ApplicationLifecycle; -import org.gcube.smartgears.lifecycle.application.ApplicationState; -import org.gcube.smartgears.lifecycle.container.ContainerLifecycle; -import org.gcube.smartgears.utils.Utils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Manages the {@link EService} {@link Resource} of the application. - *

- * The manager: - *

    - *
  • creates the {@link EService} {@link Resource} and the facets it - * {@link ConsistsOf} when the application starts for the first time;
  • - *
  • update the {@link StateFacet} when the application becomes active, - * and at any lifecycle change thereafter;
  • - *
- *

- * - * @author Luca Frosini (ISTI-CNR) - */ -public class EServiceHandler { - - private static final Logger logger = LoggerFactory.getLogger(EServiceHandler.class); - - private ApplicationContext applicationContext; - private ScheduledFuture periodicUpdates; - - protected EServiceManager eServiceManager; - - public EServiceHandler() { - super(); - } - - public void onStart(Start event) { - try { - logger.info("{} onStart started", this.getClass().getSimpleName()); - this.applicationContext = event.context(); - init(); - registerObservers(); - schedulePeriodicUpdates(); - logger.info("{} onStart terminated", this.getClass().getSimpleName()); - } catch (Throwable re) { - logger.error("onStart failed", re); - } - } - - protected void removeResourceFromOldContexts(Set startContexts, Set resourceContexts) { - Set contextsToRemove = new HashSet<>(resourceContexts); - contextsToRemove.removeAll(startContexts); - for(UUID contextToRemove : contextsToRemove) { - try { - eServiceManager.removeFromContext(contextToRemove); - }catch (Exception e) { - try { - String contextFullName = ContextCache.getInstance().getContextFullNameByUUID(contextToRemove); - logger.warn("Unable to remove {} from Context {} UUID {}", EService.NAME, contextFullName, contextsToRemove, e); - }catch (Exception ex) { - logger.warn("Unable to remove {} from Context with UUID {}.", EService.NAME, contextsToRemove, e); - } - } - } - } - - private void init() { - ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); - String previousToken = SecurityTokenProvider.instance.get(); - try { - Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader()); - boolean create = true; - - Set startTokens = applicationContext.configuration().startTokens(); - - String firstToken = startTokens.iterator().next(); - ContextUtility.setContextFromToken(firstToken); - eServiceManager = new EServiceManager(applicationContext); - - - Set startContextsUUID = new HashSet<>(); - for (String token : startTokens) { - UUID contextUUID = ContextUtility.getContextUUID(token); - startContextsUUID.add(contextUUID); - if (create) { - eServiceManager.createEService(); - create = false; - } else { - eServiceManager.addToContext(contextUUID); - } - } - - Set resourceContextsUUID = eServiceManager.getContextsUUID().keySet(); - removeResourceFromOldContexts(startContextsUUID, resourceContextsUUID); - - } catch (Throwable e) { - rethrowUnchecked(e); - } finally { - ContextUtility.setContextFromToken(previousToken); - Thread.currentThread().setContextClassLoader(contextCL); - } - logger.info("{} init() terminated", this.getClass().getSimpleName()); - } - - private void registerObservers() { - - applicationContext.events().subscribe(new Object() { - - @Observes({ activation, stop, failure }) - void onChanged(ApplicationLifecycle lc) { - ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); - String previousToken = SecurityTokenProvider.instance.get(); - try { - Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader()); - if(previousToken==null) { - String token = applicationContext.configuration().startTokens().iterator().next(); - ContextUtility.setContextFromToken(token); - } - eServiceManager.updateFacets(); - } catch (Exception e) { - logger.error("Failed to update {} State", EService.NAME, e); - } finally { - ContextUtility.setContextFromToken(previousToken); - Thread.currentThread().setContextClassLoader(contextCL); - } - } - - @Observes(value = addToContext) - void addTo(String token) { - ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); - String previousToken = SecurityTokenProvider.instance.get(); - try { - Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader()); - ContextUtility.setContextFromToken(token); - UUID contextUUID = ContextUtility.getContextUUID(token); - eServiceManager.addToContext(contextUUID); - } catch (Exception e) { - logger.error("Failed to add {} to current context ({})", EService.NAME, - ContextUtility.getCurrentContextName(), e); - } finally { - ContextUtility.setContextFromToken(previousToken); - Thread.currentThread().setContextClassLoader(contextCL); - } - } - - @Observes(value = removeFromContext) - void removeFrom(String token) { - ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); - String previousToken = SecurityTokenProvider.instance.get(); - try { - Thread.currentThread().setContextClassLoader(EServiceHandler.class.getClassLoader()); - eServiceManager.removeFromCurrentContext(); - } catch (Exception e) { - logger.error("Failed to remove {} from current context ({})", - EService.NAME, ContextUtility.getCurrentContextName(), e); - } finally { - ContextUtility.setContextFromToken(previousToken); - Thread.currentThread().setContextClassLoader(contextCL); - } - - } - - }); - } - - private void schedulePeriodicUpdates() { - - // register to cancel updates - applicationContext.events().subscribe( - - new Object() { - - // we register it in response to lifecycle events so that we can - // stop and resume along with application - @Observes(value = { activation }, kind = resilient) - synchronized void restartPeriodicUpdates(final ApplicationLifecycle lc) { - - // already running - if (periodicUpdates != null) { - return; - } - - String applicationName = applicationContext.name(); - - if (lc.state() == ApplicationState.active) { - logger.info("Scheduling periodic updates of {} for application {}", - EService.NAME, applicationName); - } else { - logger.info("Resuming periodic updates of {} for application {}", - EService.NAME, applicationName); - } - - final Runnable updateTask = new Runnable() { - public void run() { - String previousToken = SecurityTokenProvider.instance.get(); - if (previousToken == null) { - String token = applicationContext.configuration().startTokens().iterator().next(); - ContextUtility.setContextFromToken(token); - } - try { - eServiceManager.updateFacets(); - } catch (Exception e) { - logger.error("Cannot complete periodic update of {} for application {}", EService.NAME, applicationName, e); - } finally { - ContextUtility.setContextFromToken(previousToken); - } - } - }; - - periodicUpdates = Utils.scheduledServicePool.scheduleAtFixedRate(updateTask, - Constants.application_republish_frequency_in_minutes, - Constants.application_republish_frequency_in_minutes, TimeUnit.MINUTES); - - /* - * The following line is used for testing purposes during development. - * If you uncomment this, you need to comment the line above - */ -// periodicUpdates = Utils.scheduledServicePool.scheduleAtFixedRate(updateTask, 120, 120, TimeUnit.SECONDS); - - } - - @Observes(value = { stop, failure }, kind = resilient) - synchronized void cancelPeriodicUpdates(ContainerLifecycle ignore) { - - if (periodicUpdates != null) { - - String applicationName = applicationContext.name(); - - logger.trace("Stopping periodic updates of {} for application {} ", - EService.NAME, applicationName); - - try { - periodicUpdates.cancel(true); - periodicUpdates = null; - } catch (Exception e) { - logger.warn("Could not stop periodic updates of {} for application {}", - EService.NAME, applicationName, e); - } - } - } - - }); - - } - - @Override - public String toString() { - return Constants.RESOURCE_MANAGEMENT; - } - -} diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java deleted file mode 100644 index 1dd0893..0000000 --- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/HostingNodeHandler.java +++ /dev/null @@ -1,263 +0,0 @@ -package org.gcube.smartgears.handler.resourceregistry; - -import static java.util.concurrent.TimeUnit.SECONDS; -import static org.gcube.common.events.Observes.Kind.resilient; -import static org.gcube.smartgears.handlers.ProfileEvents.addToContext; -import static org.gcube.smartgears.handlers.ProfileEvents.removeFromContext; -import static org.gcube.smartgears.lifecycle.container.ContainerLifecycle.activation; -import static org.gcube.smartgears.lifecycle.container.ContainerLifecycle.failure; -import static org.gcube.smartgears.lifecycle.container.ContainerLifecycle.part_activation; -import static org.gcube.smartgears.lifecycle.container.ContainerLifecycle.shutdown; -import static org.gcube.smartgears.lifecycle.container.ContainerLifecycle.stop; -import static org.gcube.smartgears.lifecycle.container.ContainerState.active; -import static org.gcube.smartgears.utils.Utils.rethrowUnchecked; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; - -import javax.xml.bind.annotation.XmlRootElement; - -import org.gcube.common.authorization.library.provider.SecurityTokenProvider; -import org.gcube.common.events.Observes; -import org.gcube.informationsystem.model.reference.entities.Facet; -import org.gcube.informationsystem.model.reference.entities.Resource; -import org.gcube.informationsystem.model.reference.relations.ConsistsOf; -import org.gcube.informationsystem.resourceregistry.api.contexts.ContextCache; -import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; -import org.gcube.resourcemanagement.model.reference.entities.facets.StateFacet; -import org.gcube.resourcemanagement.model.reference.entities.resources.HostingNode; -import org.gcube.smartgears.context.Property; -import org.gcube.smartgears.context.container.ContainerContext; -import org.gcube.smartgears.handler.resourceregistry.resourcemanager.HostingNodeManager; -import org.gcube.smartgears.handlers.container.ContainerHandler; -import org.gcube.smartgears.handlers.container.ContainerLifecycleEvent.Start; -import org.gcube.smartgears.lifecycle.container.ContainerLifecycle; -import org.gcube.smartgears.lifecycle.container.ContainerState; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Manages the {@link HostingNode} {@link Resource} of the application. - *

- * The manager: - *

    - *
  • creates the {@link HostingNode} {@link Resource} and the facets it - * {@link ConsistsOf} when the container starts for the first time;
  • - *
  • update the {@link StateFacet} when the application becomes - * active, and at any lifecycle change thereafter;
  • - *
  • schedule a periodic update of {@link Facet}s containing variables - * information.
  • - *
- *

- * - * @author Luca Frosini (ISTI-CNR) - */ -public class HostingNodeHandler { - - private static Logger logger = LoggerFactory.getLogger(HostingNodeHandler.class); - - private ContainerContext containerContext; - private ScheduledFuture periodicUpdates; - - protected HostingNodeManager hostingNodeManager; - - public HostingNodeHandler() { - super(); - - } - - public void onStart(Start event) { - try { - logger.info("{} onStart started", this.getClass().getSimpleName()); - this.containerContext = event.context(); - init(); - registerObservers(); - schedulePeriodicUpdates(); - logger.info("{} onStart terminated", this.getClass().getSimpleName()); - } catch (Throwable re) { - logger.error("onStart failed", re); - } - } - - protected void removeResourceFromOldContexts(Set startContexts, Set resourceContexts) throws ResourceRegistryException { - Set contextsToRemove = new HashSet<>(resourceContexts); - contextsToRemove.removeAll(startContexts); - for(UUID contextToRemove : contextsToRemove) { - hostingNodeManager.removeFromContext(contextToRemove); - } - } - - private void init() { - ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); - String previousToken = SecurityTokenProvider.instance.get(); - try { - Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader()); - boolean create = true; - - List startTokens = containerContext.configuration().startTokens(); - - String firstToken = startTokens.iterator().next(); - ContextUtility.setContextFromToken(firstToken); - hostingNodeManager = new HostingNodeManager(containerContext); - - Set startContextsUUID = new HashSet<>(); - for (String token : startTokens) { - UUID contextUUID = ContextUtility.getContextUUID(token); - startContextsUUID.add(contextUUID); - if (create) { - hostingNodeManager.createHostingNode(); - containerContext.properties().add(new Property(Constants.HOSTING_NODE_MANAGER_PROPERTY, hostingNodeManager)); - create = false; - } else { - hostingNodeManager.addToContext(contextUUID); - } - } - - Set resourceContextsUUID = hostingNodeManager.getContextsUUID().keySet(); - removeResourceFromOldContexts(startContextsUUID, resourceContextsUUID); - - } catch (Throwable e) { - rethrowUnchecked(e); - } finally { - ContextUtility.setContextFromToken(previousToken); - Thread.currentThread().setContextClassLoader(contextCL); - } - logger.info("{} init() terminated", this.getClass().getSimpleName()); - } - - private void registerObservers() { - - containerContext.events().subscribe(new Object() { - - @Observes({ activation, part_activation, shutdown, stop, failure }) - void onChanged(ContainerLifecycle cl) { - ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); - String previousToken = SecurityTokenProvider.instance.get(); - try { - Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader()); - if (previousToken == null) { - String token = containerContext.configuration().startTokens().iterator().next(); - ContextUtility.setContextFromToken(token); - } - hostingNodeManager.updateFacets(); - } catch (Exception e) { - logger.error("Failed to update {} State", HostingNode.NAME, e); - } finally { - ContextUtility.setContextFromToken(previousToken); - Thread.currentThread().setContextClassLoader(contextCL); - } - } - - @Observes(value = addToContext) - void addTo(String token) { - ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); - String previousToken = SecurityTokenProvider.instance.get(); - try { - Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader()); - ContextUtility.setContextFromToken(token); - UUID contextUUID = ContextUtility.getContextUUID(token); - hostingNodeManager.addToContext(contextUUID); - } catch (Exception e) { - logger.error("Failed to update Service State", e); - } finally { - ContextUtility.setContextFromToken(previousToken); - Thread.currentThread().setContextClassLoader(contextCL); - } - } - - @Observes(value = removeFromContext) - void removeFrom(String token) { - ClassLoader contextCL = Thread.currentThread().getContextClassLoader(); - String previousToken = SecurityTokenProvider.instance.get(); - try { - Thread.currentThread().setContextClassLoader(HostingNodeHandler.class.getClassLoader()); - ContextUtility.setContextFromToken(token); - UUID contextUUID = ContextUtility.getContextUUID(token); - hostingNodeManager.removeFromContext(contextUUID); - } catch (Exception e) { - logger.error("Failed to update Service State", e); - } finally { - ContextUtility.setContextFromToken(previousToken); - Thread.currentThread().setContextClassLoader(contextCL); - } - } - - }); - } - - private void schedulePeriodicUpdates() { - // register to cancel updates - containerContext.events().subscribe( - - new Object() { - - final ScheduledExecutorService service = Executors.newScheduledThreadPool(1); - - // we register it in response to lifecycle events so that we can - // stop and resume along with application - @Observes(value = { activation, part_activation }, kind = resilient) - synchronized void restartPeriodicUpdates(ContainerLifecycle cl) { - - // already running - if (periodicUpdates != null) { - return; - } - - if (cl.state() == active) { - logger.info("Scheduling periodic updates of {}", HostingNode.NAME); - } else { - logger.info("Resuming periodic updates of {}", HostingNode.NAME); - } - - final Runnable updateTask = new Runnable() { - public void run() { - String previousToken = SecurityTokenProvider.instance.get(); - if (previousToken == null) { - String token = containerContext.configuration().startTokens().iterator().next(); - ContextUtility.setContextFromToken(token); - } - try { - hostingNodeManager.updateFacets(); - } catch (Exception e) { - logger.error("Cannot complete periodic update of {}", HostingNode.NAME, e); - }finally { - ContextUtility.setContextFromToken(previousToken); - } - } - }; - - periodicUpdates = service.scheduleAtFixedRate(updateTask, 3, - containerContext.configuration().publicationFrequency(), SECONDS); - - } - - @Observes(value = { stop, failure, shutdown }, kind = resilient) - synchronized void cancelPeriodicUpdates(ContainerLifecycle cl) { - - if (periodicUpdates != null) { - logger.trace("Stopping periodic updates of {}", HostingNode.NAME); - try { - periodicUpdates.cancel(true); - service.shutdownNow(); - periodicUpdates = null; - } catch (Exception e) { - logger.warn("Could not stop periodic updates of {}", HostingNode.NAME, e); - } - } - } - - }); - - } - - @Override - public String toString() { - return Constants.RESOURCE_MANAGEMENT; - } - -} diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/EServiceManager.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/EServiceManager.java index 0e45143..06f9ce5 100644 --- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/EServiceManager.java +++ b/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/EServiceManager.java @@ -12,7 +12,8 @@ import java.util.UUID; import javax.servlet.ServletRegistration; -import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.security.providers.SecretManagerProvider; +import org.gcube.common.security.secrets.Secret; import org.gcube.informationsystem.model.impl.properties.HeaderImpl; import org.gcube.informationsystem.model.impl.properties.PropagationConstraintImpl; import org.gcube.informationsystem.model.reference.entities.Facet; @@ -58,6 +59,7 @@ import org.gcube.smartgears.configuration.container.ContainerConfiguration; import org.gcube.smartgears.context.application.ApplicationContext; import org.gcube.smartgears.handler.resourceregistry.Constants; import org.gcube.smartgears.handler.resourceregistry.ContextUtility; +import org.gcube.smartgears.security.AuthorizationProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,98 +84,101 @@ public class EServiceManager { } public void addEServiceToCurrentContext() throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { - String currentToken = SecurityTokenProvider.instance.get(); - UUID contextUUID = ContextUtility.getContextUUID(currentToken); + Secret secret = SecretManagerProvider.instance.get(); + String context = secret.getContext(); + UUID contextUUID = ContextUtility.getContextUUID(context); /* Trying to get a context which is not the current to properly invoke the addToContext without forcing the operation using addResourceToCurrentContext */ + AuthorizationProvider authorizationProvider = applicationContext.container().configuration().authorizationProvider(); + Set contexts = authorizationProvider.getContexts(); boolean anotherContextSet = false; - Set startTokens = applicationContext.configuration().startTokens(); - for (String token : startTokens) { - UUID anotherContextUUID = ContextUtility.getContextUUID(token); - if(anotherContextUUID.compareTo(contextUUID)!=0) { - ContextUtility.setContextFromToken(token); + for (String c : contexts) { + if(c.compareTo(context)!=0) { + Secret s = authorizationProvider.getSecretForContext(c); + SecretManagerProvider.instance.set(s); anotherContextSet = true; break; } } - UUID uuid = UUID.fromString(applicationContext.id()); + UUID uuid = UUID.fromString(applicationContext.id()); try { if(anotherContextSet) { resourceRegistryPublisher.addResourceToContext(EService.NAME, uuid, contextUUID, false); }else { - resourceRegistryPublisher.addResourceToCurrentContext(HostingNode.NAME, uuid, false); + resourceRegistryPublisher.addResourceToCurrentContext(EService.NAME, uuid, false); } - logger.info("{} with UUID {} successfully added to context ({})", EService.NAME, uuid, ContextUtility.getCurrentContextName()); + logger.info("{} with UUID {} successfully added to context ({})", EService.NAME, uuid, context); } catch (Exception e) { - logger.error("Unable to add {} with UUID {} to context ({})", EService.NAME, uuid, ContextUtility.getCurrentContextName(), e); - }finally { - ContextUtility.setContextFromToken(currentToken); + logger.error("Unable to add {} with UUID {} to context ({})", EService.NAME, uuid, context, e); } } + public void addHostingNodeToCurrentContext() throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { - String currentToken = SecurityTokenProvider.instance.get(); - UUID contextUUID = ContextUtility.getContextUUID(currentToken); + Secret secret = SecretManagerProvider.instance.get(); + String context = secret.getContext(); + UUID contextUUID = ContextUtility.getContextUUID(context); /* Trying to get a context which is not the current to properly invoke the addToContext without forcing the operation using addResourceToCurrentContext */ + AuthorizationProvider authorizationProvider = applicationContext.container().configuration().authorizationProvider(); + Set contexts = authorizationProvider.getContexts(); boolean anotherContextSet = false; - Set startTokens = applicationContext.configuration().startTokens(); - for (String token : startTokens) { - UUID anotherContextUUID = ContextUtility.getContextUUID(token); - if(anotherContextUUID.compareTo(contextUUID)!=0) { - ContextUtility.setContextFromToken(token); + for (String c : contexts) { + if(c.compareTo(context)!=0) { + Secret s = authorizationProvider.getSecretForContext(c); + SecretManagerProvider.instance.set(s); anotherContextSet = true; break; } } - UUID uuid = UUID.fromString(applicationContext.container().id()); + UUID uuid = UUID.fromString(applicationContext.container().id()); try { if(anotherContextSet) { - resourceRegistryPublisher.addResourceToContext(HostingNode.NAME, uuid, contextUUID, false); + resourceRegistryPublisher.addToContext(HostingNode.NAME, uuid, contextUUID, false); }else { resourceRegistryPublisher.addResourceToCurrentContext(HostingNode.NAME, uuid, false); } - logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName()); + logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, context); } catch (Exception e) { - logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e); - }finally { - ContextUtility.setContextFromToken(currentToken); + logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, context, e); } } public void addToContext(UUID contextUUID) throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { + String context = ContextCache.getInstance().getContextFullNameByUUID(contextUUID); UUID uuid = UUID.fromString(applicationContext.container().id()); try { resourceRegistryPublisher.addToContext(HostingNode.NAME, uuid, contextUUID, false); - logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName()); + logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, context); } catch (Exception e) { - logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e); + logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, context, e); } } public void removeFromCurrentContext() throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { + Secret secret = SecretManagerProvider.instance.get(); + String context = secret.getContext(); UUID uuid = UUID.fromString(applicationContext.container().id()); try { resourceRegistryPublisher.removeResourceFromCurrentContext(HostingNode.NAME, uuid, false); - logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, - ContextUtility.getCurrentContextName()); + logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, context); } catch (Exception e) { - logger.error("Unable to remove {} with UUID {} from context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e); + logger.error("Unable to remove {} with UUID {} from context ({})", HostingNode.NAME, uuid, context, e); } } public void removeFromContext(UUID contextUUID) throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { - String contextFullName = ContextCache.getInstance().getContextFullNameByUUID(contextUUID); + String context = ContextCache.getInstance().getContextFullNameByUUID(contextUUID); UUID uuid = UUID.fromString(applicationContext.container().id()); try { resourceRegistryPublisher.removeResourceFromContext(HostingNode.NAME, uuid, contextUUID, false); - logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, contextFullName); + logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, context); } catch (Exception e) { - logger.error("Unable to remove {} from context ({})", HostingNode.NAME, uuid, contextFullName, e); + logger.error("Unable to remove {} from context ({})", HostingNode.NAME, uuid, context, e); } } @@ -181,11 +186,11 @@ public class EServiceManager { ApplicationConfiguration configuration = applicationContext.configuration(); ContainerConfiguration container = applicationContext.container().configuration(); String baseAddress; - if (configuration.proxied()) { - String protocol = configuration.proxyAddress().protocol(); - String port = configuration.proxyAddress().port() != null ? ":" + configuration.proxyAddress().port() : ""; + if (configuration.proxable()) { + String protocol = configuration.proxyAddress().getProtocol(); + String port = configuration.proxyAddress().getPort() != null ? ":" + configuration.proxyAddress().getPort() : ""; - baseAddress = String.format("%s://%s%s%s", protocol, configuration.proxyAddress().hostname(), port, + baseAddress = String.format("%s://%s%s%s", protocol, configuration.proxyAddress().getHostname(), port, applicationContext.application().getContextPath()); } else { String protocol = container.protocol(); diff --git a/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/HostingNodeManager.java b/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/HostingNodeManager.java index 59a60ae..15c6f10 100644 --- a/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/HostingNodeManager.java +++ b/src/main/java/org/gcube/smartgears/handler/resourceregistry/resourcemanager/HostingNodeManager.java @@ -33,7 +33,8 @@ import javax.management.ObjectName; import javax.management.ReflectionException; import org.gcube.com.fasterxml.jackson.databind.JsonNode; -import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.security.providers.SecretManagerProvider; +import org.gcube.common.security.secrets.Secret; import org.gcube.informationsystem.model.impl.properties.HeaderImpl; import org.gcube.informationsystem.model.reference.entities.Facet; import org.gcube.informationsystem.model.reference.entities.Resource; @@ -82,6 +83,7 @@ import org.gcube.smartgears.context.container.ContainerContext; import org.gcube.smartgears.handler.resourceregistry.ContextUtility; import org.gcube.smartgears.lifecycle.container.ContainerState; import org.gcube.smartgears.provider.ProviderFactory; +import org.gcube.smartgears.security.AuthorizationProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -113,16 +115,18 @@ public class HostingNodeManager { } public void addToCurrentContext() throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { - String currentToken = SecurityTokenProvider.instance.get(); - UUID contextUUID = ContextUtility.getContextUUID(currentToken); + Secret secret = SecretManagerProvider.instance.get(); + String context = secret.getContext(); + UUID contextUUID = ContextUtility.getContextUUID(context); /* Trying to get a context which is not the current to properly invoke the addToContext without forcing the operation using addResourceToCurrentContext */ + AuthorizationProvider authorizationProvider = containerContext.configuration().authorizationProvider(); + Set contexts = authorizationProvider.getContexts(); boolean anotherContextSet = false; - List startTokens = containerContext.configuration().startTokens(); - for (String token : startTokens) { - UUID anotherContextUUID = ContextUtility.getContextUUID(token); - if(anotherContextUUID.compareTo(contextUUID)!=0) { - ContextUtility.setContextFromToken(token); + for (String c : contexts) { + if(c.compareTo(context)!=0) { + Secret s = authorizationProvider.getSecretForContext(c); + SecretManagerProvider.instance.set(s); anotherContextSet = true; break; } @@ -135,43 +139,45 @@ public class HostingNodeManager { }else { resourceRegistryPublisher.addResourceToCurrentContext(HostingNode.NAME, uuid, false); } - logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName()); + logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, context); } catch (Exception e) { - logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e); + logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, context, e); } } public void addToContext(UUID contextUUID) throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { + String context = ContextCache.getInstance().getContextFullNameByUUID(contextUUID); UUID uuid = UUID.fromString(containerContext.id()); try { resourceRegistryPublisher.addToContext(HostingNode.NAME, uuid, contextUUID, false); - logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName()); + logger.info("{} with UUID {} successfully added to context ({})", HostingNode.NAME, uuid, context); } catch (Exception e) { - logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e); + logger.error("Unable to add {} with UUID {} to context ({})", HostingNode.NAME, uuid, context, e); } } public void removeFromCurrentContext() throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { + Secret secret = SecretManagerProvider.instance.get(); + String context = secret.getContext(); UUID uuid = UUID.fromString(containerContext.id()); try { resourceRegistryPublisher.removeResourceFromCurrentContext(HostingNode.NAME, uuid, false); - logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, - ContextUtility.getCurrentContextName()); + logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, context); } catch (Exception e) { - logger.error("Unable to remove {} with UUID {} from context ({})", HostingNode.NAME, uuid, ContextUtility.getCurrentContextName(), e); + logger.error("Unable to remove {} with UUID {} from context ({})", HostingNode.NAME, uuid, context, e); } } public void removeFromContext(UUID contextUUID) throws ResourceNotFoundException, ContextNotFoundException, ResourceRegistryException { - String contextFullName = ContextCache.getInstance().getContextFullNameByUUID(contextUUID); + String context = ContextCache.getInstance().getContextFullNameByUUID(contextUUID); UUID uuid = UUID.fromString(containerContext.id()); try { resourceRegistryPublisher.removeResourceFromContext(HostingNode.NAME, uuid, contextUUID, false); - logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, contextFullName); + logger.info("{} with UUID {} successfully removed from context ({})", HostingNode.NAME, uuid, context); } catch (Exception e) { - logger.error("Unable to remove {} from context ({})", HostingNode.NAME, uuid, contextFullName, e); + logger.error("Unable to remove {} from context ({})", HostingNode.NAME, uuid, context, e); } } @@ -374,10 +380,10 @@ public class HostingNodeManager { LocationFacet locationFacet = new LocationFacetImpl(); Site site = containerConfiguration.site(); - locationFacet.setCountry(site.country()); - locationFacet.setLocation(site.location()); - locationFacet.setLatitude(site.latitude()); - locationFacet.setLongitude(site.longitude()); + locationFacet.setCountry(site.getCountry()); + locationFacet.setLocation(site.getLocation()); + locationFacet.setLatitude(site.getLatitude()); + locationFacet.setLongitude(site.getLongitude()); hostingNode.addFacet(locationFacet); logger.info("{} with UUID {} instantiated", HostingNode.NAME, uuid); @@ -434,7 +440,7 @@ public class HostingNodeManager { long total = 0; try { FileStore fileStore = Files - .getFileStore(Paths.get(containerContext.configuration().persistence().location())); + .getFileStore(Paths.get(containerContext.configuration().persistence().getLocation())); free = fileStore.getUsableSpace() / 1048576; // 1048576 = 1024*1024 // user to convert // bytes in MByte diff --git a/src/main/java/org/gcube/smartgears/publisher/resourceregistry/FacetBasedPublisher.java b/src/main/java/org/gcube/smartgears/publisher/resourceregistry/FacetBasedPublisher.java new file mode 100644 index 0000000..2d88788 --- /dev/null +++ b/src/main/java/org/gcube/smartgears/publisher/resourceregistry/FacetBasedPublisher.java @@ -0,0 +1,137 @@ +package org.gcube.smartgears.publisher.resourceregistry; + +import java.util.Set; +import java.util.UUID; + +import org.gcube.common.clients.config.Property; +import org.gcube.smartgears.context.application.ApplicationContext; +import org.gcube.smartgears.context.container.ContainerContext; +import org.gcube.smartgears.handler.resourceregistry.Constants; +import org.gcube.smartgears.handler.resourceregistry.ContextUtility; +import org.gcube.smartgears.handler.resourceregistry.resourcemanager.HostingNodeManager; +import org.gcube.smartgears.publishing.Publisher; +import org.gcube.smartgears.publishing.SmartgearsProfilePublisher; +import org.gcube.smartgears.security.AuthorizationProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@SmartgearsProfilePublisher +public class FacetBasedPublisher implements Publisher { + + + private static Logger logger = LoggerFactory.getLogger(FacetBasedPublisher.class); + + @Override + public boolean create(ContainerContext containerContext, Set contexts) { + // Used at startup and in add to context + HostingNodeManager hostingNodeManager = new HostingNodeManager(containerContext); + AuthorizationProvider authorizationProvider = containerContext.configuration().authorizationProvider(); + boolean first = true; + for (String context : contexts) { + UUID contextUUID = ContextUtility.getContextUUID(context); + if(first) { + hostingNodeManager.createHostingNode(); + containerContext.properties().add(new Property(Constants.HOSTING_NODE_MANAGER_PROPERTY, hostingNodeManager)); + first = false; + }else { + + } + } + return true; + } + + @Override + public boolean create(ApplicationContext applicationContext, Set contexts) { + // Used at startup and in add to context + return false; + } + + @Override + public boolean remove(ApplicationContext applicationContext, Set contexts) { + // Remove from contexts + return false; + } + + @Override + public boolean remove(ContainerContext containerContext, Set contexts) { + // Remove from contexts + return false; + } + + @Override + public boolean update(ApplicationContext applicationContext) { + // Periodic updates + return false; + } + + @Override + public boolean update(ContainerContext containerContext) { + // Periodic updates + return false; + } + + + +// @Override +// public boolean publishContainer(ContainerContext containerContext, Set contexts) { +// HostingNodeManager hostingNodeManager = new HostingNodeManager(containerContext); +// +// AuthorizationProvider authorizationProvider = containerContext.configuration().authorizationProvider(); +// Set authorizedContexts = authorizationProvider.getContexts(); +// for (String context : authorizedContexts) { +// +// } +// return true; +// } +// +// @Override +// public boolean publishApplication(ApplicationContext applicationContext, Set contexts) { +// EServiceManager eServiceManager = new EServiceManager(applicationContext); +// +// AuthorizationProvider provider = applicationContext.container().configuration().authorizationProvider(); +// +// for (String context : provider.getContexts()) +// try { +// logger.info("publishing application in context {}", context); +// AuthorizedTasks.executeSafely(new Runnable() { +// +// @Override +// public void run() { +// try { +// logger.info("(inside task)publishing application in context {}", context); +// String resource = toXml(enpoint); +// registry.getStubs().create(resource, enpoint.type().toString()); +// logger.debug("publisher resource in context {} : {}",context, resource); +// }catch (Exception e) { +// logger.error("erro publishing application", e); +// throw new RuntimeException(e); +// } +// +// } +// }, provider.getSecretForContext(context)); +// }catch (Throwable e) { +// logger.error("error publisshing application profile in context {}", context, e); +// } +// +// return true; +// } +// +// @Override +// public boolean unpublishContainer(ContainerContext container, Set contexts) { +// // TODO Auto-generated method stub +// return false; +// } +// +// @Override +// public boolean unpublishApplication(ApplicationContext application, Set contexts) { +// // TODO Auto-generated method stub +// return false; +// } +// +// private String toXml(Resource resource){ +// StringWriter writer = new StringWriter(); +// Resources.marshal(resource, writer); +// return writer.toString(); +// } + +}