2020-09-30 11:19:49 +02:00
|
|
|
package org.gcube.vremanagement.executor.ispublisher;
|
2020-09-29 11:10:35 +02:00
|
|
|
|
2020-10-01 12:51:57 +02:00
|
|
|
import java.util.List;
|
2020-09-29 11:10:35 +02:00
|
|
|
import java.util.Map;
|
|
|
|
import java.util.UUID;
|
|
|
|
|
2020-09-30 16:18:46 +02:00
|
|
|
import org.gcube.informationsystem.model.impl.properties.HeaderImpl;
|
2020-09-29 11:10:35 +02:00
|
|
|
import org.gcube.informationsystem.model.impl.properties.PropagationConstraintImpl;
|
2020-10-14 16:25:46 +02:00
|
|
|
import org.gcube.informationsystem.model.reference.entities.Facet;
|
2020-09-29 11:10:35 +02:00
|
|
|
import org.gcube.informationsystem.model.reference.entities.Resource;
|
|
|
|
import org.gcube.informationsystem.model.reference.properties.PropagationConstraint;
|
|
|
|
import org.gcube.informationsystem.model.reference.properties.PropagationConstraint.AddConstraint;
|
|
|
|
import org.gcube.informationsystem.model.reference.properties.PropagationConstraint.RemoveConstraint;
|
2020-09-30 16:18:46 +02:00
|
|
|
import org.gcube.informationsystem.resourceregistry.api.exceptions.AvailableInAnotherContextException;
|
|
|
|
import org.gcube.informationsystem.resourceregistry.api.exceptions.NotFoundException;
|
2020-09-29 11:10:35 +02:00
|
|
|
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
|
2020-10-01 12:51:57 +02:00
|
|
|
import org.gcube.informationsystem.resourceregistry.client.Direction;
|
2020-09-29 11:10:35 +02:00
|
|
|
import org.gcube.informationsystem.resourceregistry.client.ResourceRegistryClient;
|
|
|
|
import org.gcube.informationsystem.resourceregistry.client.ResourceRegistryClientFactory;
|
|
|
|
import org.gcube.informationsystem.resourceregistry.publisher.ResourceRegistryPublisher;
|
|
|
|
import org.gcube.informationsystem.resourceregistry.publisher.ResourceRegistryPublisherFactory;
|
|
|
|
import org.gcube.resourcemanagement.model.impl.entities.facets.SimplePropertyFacetImpl;
|
|
|
|
import org.gcube.resourcemanagement.model.impl.entities.facets.SoftwareFacetImpl;
|
|
|
|
import org.gcube.resourcemanagement.model.impl.entities.resources.RunningPluginImpl;
|
2020-10-14 16:25:46 +02:00
|
|
|
import org.gcube.resourcemanagement.model.impl.relations.consistsof.IsIdentifiedByImpl;
|
2020-12-02 18:11:44 +01:00
|
|
|
import org.gcube.resourcemanagement.model.impl.relations.isrelatedto.ActivatesImpl;
|
2020-09-30 15:47:49 +02:00
|
|
|
import org.gcube.resourcemanagement.model.impl.relations.isrelatedto.EnablesImpl;
|
2020-09-29 11:10:35 +02:00
|
|
|
import org.gcube.resourcemanagement.model.reference.entities.facets.SimplePropertyFacet;
|
|
|
|
import org.gcube.resourcemanagement.model.reference.entities.facets.SoftwareFacet;
|
|
|
|
import org.gcube.resourcemanagement.model.reference.entities.resources.EService;
|
|
|
|
import org.gcube.resourcemanagement.model.reference.entities.resources.RunningPlugin;
|
2020-09-30 15:47:49 +02:00
|
|
|
import org.gcube.resourcemanagement.model.reference.entities.resources.Service;
|
|
|
|
import org.gcube.resourcemanagement.model.reference.entities.resources.Software;
|
2020-10-14 16:25:46 +02:00
|
|
|
import org.gcube.resourcemanagement.model.reference.relations.consistsof.IsIdentifiedBy;
|
2020-12-02 18:11:44 +01:00
|
|
|
import org.gcube.resourcemanagement.model.reference.relations.isrelatedto.Activates;
|
2020-09-30 15:47:49 +02:00
|
|
|
import org.gcube.resourcemanagement.model.reference.relations.isrelatedto.Enables;
|
2020-09-29 11:10:35 +02:00
|
|
|
import org.gcube.smartgears.context.application.ApplicationContext;
|
2020-09-30 11:19:49 +02:00
|
|
|
import org.gcube.vremanagement.executor.plugin.Plugin;
|
|
|
|
import org.gcube.vremanagement.executor.pluginmanager.PluginManager;
|
2020-09-29 11:10:35 +02:00
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
2020-10-14 14:57:33 +02:00
|
|
|
public class RestISPublisher extends ISPublisher {
|
2020-09-29 11:10:35 +02:00
|
|
|
|
|
|
|
private static Logger logger = LoggerFactory.getLogger(RestISPublisher.class);
|
|
|
|
|
|
|
|
protected final UUID eServiceUUID;
|
2020-09-30 16:18:46 +02:00
|
|
|
protected ResourceRegistryClient resourceRegistryClient;
|
|
|
|
protected ResourceRegistryPublisher resourceRegistryPublisher;
|
2020-09-29 11:10:35 +02:00
|
|
|
|
2020-10-01 12:51:57 +02:00
|
|
|
|
|
|
|
|
2020-09-29 11:10:35 +02:00
|
|
|
public RestISPublisher(ApplicationContext applicationContext) {
|
|
|
|
super(applicationContext);
|
|
|
|
this.eServiceUUID = UUID.fromString(applicationContext.id());
|
2020-09-30 16:18:46 +02:00
|
|
|
this.resourceRegistryClient = ResourceRegistryClientFactory.create();
|
|
|
|
this.resourceRegistryPublisher = ResourceRegistryPublisherFactory.create();
|
2020-09-29 11:10:35 +02:00
|
|
|
}
|
|
|
|
|
2020-09-30 16:18:46 +02:00
|
|
|
@SuppressWarnings("unused")
|
2020-10-01 12:51:57 +02:00
|
|
|
protected RunningPlugin publishRunningPluginWithRelations(Plugin plugin, UUID pluginUUID) throws Exception {
|
2020-09-30 16:18:46 +02:00
|
|
|
|
|
|
|
RunningPlugin runningPlugin = new RunningPluginImpl();
|
2020-10-01 12:51:57 +02:00
|
|
|
runningPlugin.setHeader(new HeaderImpl(pluginUUID));
|
2020-09-30 16:18:46 +02:00
|
|
|
|
|
|
|
SoftwareFacet softwareFacet = new SoftwareFacetImpl();
|
|
|
|
softwareFacet.setGroup(plugin.getGroup());
|
2020-10-01 12:51:57 +02:00
|
|
|
softwareFacet.setName(plugin.getName());
|
2020-09-30 16:18:46 +02:00
|
|
|
softwareFacet.setVersion(plugin.getVersion());
|
|
|
|
softwareFacet.setDescription(plugin.getDescription());
|
2020-10-14 16:25:46 +02:00
|
|
|
|
2020-10-14 18:16:49 +02:00
|
|
|
IsIdentifiedBy<Resource, Facet> isIdentifiedBy = new IsIdentifiedByImpl<Resource, Facet>(runningPlugin, softwareFacet);
|
|
|
|
runningPlugin.addFacet(isIdentifiedBy);
|
2020-09-30 16:18:46 +02:00
|
|
|
|
|
|
|
Map<String,String> pluginCapabilities = plugin.getSupportedCapabilities();
|
2020-10-13 15:33:26 +02:00
|
|
|
if(pluginCapabilities!=null) {
|
|
|
|
for(String capabilityName : pluginCapabilities.keySet()) {
|
|
|
|
SimplePropertyFacet simplePropertyFacet = new SimplePropertyFacetImpl();
|
|
|
|
simplePropertyFacet.setName(capabilityName);
|
|
|
|
simplePropertyFacet.setValue(pluginCapabilities.get(capabilityName));
|
|
|
|
runningPlugin.addFacet(simplePropertyFacet);
|
|
|
|
}
|
2020-09-30 16:18:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
EService smartExecutorEService = resourceRegistryClient.getInstance(EService.class, eServiceUUID);
|
|
|
|
PropagationConstraint usesPropagationConstraint = new PropagationConstraintImpl();
|
|
|
|
usesPropagationConstraint.setAddConstraint(AddConstraint.propagate);
|
|
|
|
usesPropagationConstraint.setRemoveConstraint(RemoveConstraint.cascade);
|
|
|
|
|
2020-12-02 18:11:44 +01:00
|
|
|
Activates<EService, RunningPlugin> activates = new ActivatesImpl<EService, RunningPlugin>(smartExecutorEService, runningPlugin, usesPropagationConstraint);
|
2020-09-30 16:18:46 +02:00
|
|
|
try {
|
2020-12-02 18:11:44 +01:00
|
|
|
resourceRegistryPublisher.createIsRelatedTo(activates);
|
2020-09-30 16:18:46 +02:00
|
|
|
} catch (ResourceRegistryException e) {
|
2020-10-01 12:51:57 +02:00
|
|
|
logger.error("Unable to publish %s instace %s for plugin %s. I'm going to stop the service.", Resource.NAME, RunningPlugin.NAME, plugin.getName());
|
2020-09-30 16:18:46 +02:00
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
|
|
|
|
org.gcube.resourcemanagement.model.reference.entities.resources.Plugin pluginResource = null;
|
|
|
|
if(pluginResource!=null) { // The if allows not commenting the following code in the meanwhile the pluginResource retrieving is properly coded
|
|
|
|
PropagationConstraint enablesPropagationConstraint = new PropagationConstraintImpl();
|
|
|
|
enablesPropagationConstraint.setAddConstraint(AddConstraint.propagate);
|
|
|
|
enablesPropagationConstraint.setRemoveConstraint(RemoveConstraint.keep);
|
|
|
|
Enables<Service, Software> enables = new EnablesImpl<Service, Software>(runningPlugin, pluginResource, enablesPropagationConstraint);
|
|
|
|
try {
|
|
|
|
resourceRegistryPublisher.createIsRelatedTo(enables);
|
|
|
|
} catch (ResourceRegistryException e) {
|
2020-10-01 12:51:57 +02:00
|
|
|
logger.error("Unable to publish %s instace %s for plugin %s. I'm going to stop the service.", Resource.NAME, RunningPlugin.NAME, plugin.getName());
|
2020-09-30 16:18:46 +02:00
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return runningPlugin;
|
|
|
|
}
|
|
|
|
|
2020-09-29 11:10:35 +02:00
|
|
|
@Override
|
2020-09-30 11:19:49 +02:00
|
|
|
public void publishPlugins(Map<String, Class<? extends Plugin>> availablePlugins) throws Exception {
|
2020-10-14 11:25:52 +02:00
|
|
|
PluginManager pluginManager = PluginManager.getInstance();
|
2020-09-30 16:18:46 +02:00
|
|
|
|
2020-09-29 11:10:35 +02:00
|
|
|
for(String pluginName : availablePlugins.keySet()) {
|
|
|
|
|
2020-10-14 11:25:52 +02:00
|
|
|
Plugin plugin = pluginManager.getPlugin(pluginName);
|
|
|
|
UUID pluginUUID = pluginManager.getPluginUUID(pluginName);
|
2020-09-29 11:10:35 +02:00
|
|
|
|
2020-09-30 16:18:46 +02:00
|
|
|
RunningPlugin runningPlugin;
|
2020-09-30 15:47:49 +02:00
|
|
|
|
2020-09-29 11:10:35 +02:00
|
|
|
try {
|
2020-10-01 12:51:57 +02:00
|
|
|
runningPlugin = resourceRegistryClient.getInstance(RunningPlugin.class, pluginUUID);
|
2020-09-30 16:18:46 +02:00
|
|
|
} catch (NotFoundException e) {
|
2020-10-01 12:51:57 +02:00
|
|
|
runningPlugin = publishRunningPluginWithRelations(plugin, pluginUUID);
|
2020-09-30 16:18:46 +02:00
|
|
|
} catch (AvailableInAnotherContextException e) {
|
|
|
|
runningPlugin = new RunningPluginImpl();
|
2020-10-01 12:51:57 +02:00
|
|
|
runningPlugin.setHeader(new HeaderImpl(pluginUUID));
|
2020-10-01 15:38:48 +02:00
|
|
|
resourceRegistryPublisher.addToCurrentContext(runningPlugin);
|
2020-09-29 11:10:35 +02:00
|
|
|
} catch (ResourceRegistryException e) {
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-10-01 12:51:57 +02:00
|
|
|
public void unpublishPlugins(boolean force) throws Exception {
|
|
|
|
if(force) {
|
2020-12-02 18:11:44 +01:00
|
|
|
List<RunningPlugin> runningPlugins = resourceRegistryClient.getRelatedResourcesFromReferenceResource(RunningPlugin.class, Activates.class, EService.class, this.eServiceUUID, Direction.IN, true);
|
2020-10-01 12:51:57 +02:00
|
|
|
for(RunningPlugin runningPlugin : runningPlugins) {
|
|
|
|
resourceRegistryPublisher.delete(runningPlugin);
|
|
|
|
}
|
|
|
|
}else {
|
|
|
|
logger.info("The Plugin will be removed when the Eservice will be removed thanks to propagation contraints. Nothing to do");
|
|
|
|
}
|
|
|
|
|
2020-09-29 11:10:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|