updated
This commit is contained in:
parent
766238c8e3
commit
be3d37d6c3
|
@ -0,0 +1,2 @@
|
||||||
|
[smartgears]
|
||||||
|
version = ${version}
|
|
@ -1,2 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<smartgears version="${project.version}"/>
|
|
15
pom.xml
15
pom.xml
|
@ -28,8 +28,8 @@
|
||||||
<tomcat.version>8.0.42</tomcat.version>
|
<tomcat.version>8.0.42</tomcat.version>
|
||||||
<jersey.version>2.25.1</jersey.version>
|
<jersey.version>2.25.1</jersey.version>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<maven.compiler.source>11</maven.compiler.source>
|
||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
<maven.compiler.target>11</maven.compiler.target>
|
||||||
</properties>
|
</properties>
|
||||||
<scm>
|
<scm>
|
||||||
<connection>scm:git:https://code-repo.d4science.org/gCubeSystem/common-smartgears.git</connection>
|
<connection>scm:git:https://code-repo.d4science.org/gCubeSystem/common-smartgears.git</connection>
|
||||||
|
@ -106,10 +106,6 @@
|
||||||
<groupId>org.gcube.common.security</groupId>
|
<groupId>org.gcube.common.security</groupId>
|
||||||
<artifactId>gcube-secrets</artifactId>
|
<artifactId>gcube-secrets</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>javax.ws.rs</groupId>
|
|
||||||
<artifactId>javax.ws.rs-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>javax.servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
@ -151,12 +147,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.core</groupId>
|
<groupId>org.glassfish.jersey.core</groupId>
|
||||||
<artifactId>jersey-client</artifactId>
|
<artifactId>jersey-client</artifactId>
|
||||||
<scope>test</scope>
|
<version>2.25.1</version>
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.tomcat.embed</groupId>
|
|
||||||
<artifactId>tomcat-embed-core</artifactId>
|
|
||||||
<version>${tomcat.version}</version>
|
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
package org.gcube.smartgears.configuration;
|
||||||
|
|
||||||
|
public class SmartgearsConfiguration {
|
||||||
|
|
||||||
|
private String version;
|
||||||
|
|
||||||
|
public SmartgearsConfiguration(String version) {
|
||||||
|
super();
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
}
|
|
@ -48,9 +48,9 @@ public class ApplicationConfiguration {
|
||||||
|
|
||||||
private boolean proxable = true;
|
private boolean proxable = true;
|
||||||
|
|
||||||
Set<GCubeExclude> excludes= null;
|
Set<GCubeExclude> excludes= new HashSet<>();
|
||||||
|
|
||||||
Set<GCubeInclude> includes= null;
|
Set<GCubeInclude> includes= new HashSet<>();
|
||||||
|
|
||||||
@NotEmpty @JsonProperty("persistence")
|
@NotEmpty @JsonProperty("persistence")
|
||||||
PersistenceConfiguration persistenceConfiguration;
|
PersistenceConfiguration persistenceConfiguration;
|
||||||
|
@ -103,12 +103,12 @@ public class ApplicationConfiguration {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String serviceClass() {
|
public String group() {
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public ApplicationConfiguration serviceClass(String group) {
|
public ApplicationConfiguration group(String group) {
|
||||||
this.group=group;
|
this.group=group;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,21 @@
|
||||||
package org.gcube.smartgears.configuration.application;
|
package org.gcube.smartgears.configuration.application;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
|
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import org.gcube.smartgears.configuration.PersistenceConfiguration;
|
||||||
import org.gcube.smartgears.handlers.application.ApplicationLifecycleHandler;
|
import org.gcube.smartgears.handlers.application.ApplicationLifecycleHandler;
|
||||||
import org.gcube.smartgears.handlers.application.RequestHandler;
|
import org.gcube.smartgears.handlers.application.RequestHandler;
|
||||||
import org.gcube.smartgears.handlers.application.lifecycle.ApplicationProfileManager;
|
import org.gcube.smartgears.handlers.application.lifecycle.ApplicationProfileManager;
|
||||||
import org.gcube.smartgears.handlers.application.request.RequestAccounting;
|
import org.gcube.smartgears.handlers.application.request.RequestAccounting;
|
||||||
import org.gcube.smartgears.handlers.application.request.RequestMetrics;
|
import org.gcube.smartgears.handlers.application.request.RequestMetrics;
|
||||||
import org.gcube.smartgears.handlers.application.request.RequestValidator;
|
import org.gcube.smartgears.handlers.application.request.RequestValidator;
|
||||||
|
import org.gcube.smartgears.persistence.LocalWriter;
|
||||||
|
import org.gcube.smartgears.persistence.LocalWriterConfiguration;
|
||||||
|
import org.gcube.smartgears.utils.Utils;
|
||||||
import org.yaml.snakeyaml.Yaml;
|
import org.yaml.snakeyaml.Yaml;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,9 +38,22 @@ public class ApplicationConfigurationBinder {
|
||||||
Yaml yaml = new Yaml();
|
Yaml yaml = new Yaml();
|
||||||
ObjectMapper mapper = new ObjectMapper();
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
String mapAsString = mapper.writeValueAsString(yaml.load(stream));
|
String mapAsString = mapper.writeValueAsString(yaml.load(stream));
|
||||||
|
|
||||||
return mapper.readValue(mapAsString, ApplicationConfiguration.class);
|
ApplicationConfiguration conf = mapper.readValue(mapAsString, ApplicationConfiguration.class);
|
||||||
}catch (Exception e) {
|
|
||||||
|
if (conf.persistenceConfiguration() == null) {
|
||||||
|
String location = String.format("%s/state/%s_%s", Utils.home(), conf.group(), conf.name());
|
||||||
|
File dir = new File(location);
|
||||||
|
if (!dir.exists())
|
||||||
|
dir.mkdirs();
|
||||||
|
|
||||||
|
conf.persistenceConfiguration(
|
||||||
|
new PersistenceConfiguration(LocalWriter.class, new LocalWriterConfiguration(location)));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
} catch (Exception e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,80 +68,79 @@ public class ApplicationConfigurationBinder {
|
||||||
public ApplicationHandlers bindHandlers(ClassLoader classLoader) {
|
public ApplicationHandlers bindHandlers(ClassLoader classLoader) {
|
||||||
|
|
||||||
List<RequestHandler> requestHandlers = new LinkedList<RequestHandler>();
|
List<RequestHandler> requestHandlers = new LinkedList<RequestHandler>();
|
||||||
|
|
||||||
//ADDING BASE Handler (order is important)
|
// ADDING BASE Handler (order is important)
|
||||||
requestHandlers.add(new RequestMetrics());
|
requestHandlers.add(new RequestMetrics());
|
||||||
requestHandlers.add(new RequestValidator());
|
requestHandlers.add(new RequestValidator());
|
||||||
requestHandlers.add(new RequestAccounting());
|
requestHandlers.add(new RequestAccounting());
|
||||||
|
|
||||||
//TODO scan RequestHAndler form classloader
|
// TODO scan RequestHAndler form classloader
|
||||||
|
|
||||||
|
|
||||||
List<ApplicationLifecycleHandler> lifecycleHandlers = new LinkedList<ApplicationLifecycleHandler>();
|
List<ApplicationLifecycleHandler> lifecycleHandlers = new LinkedList<ApplicationLifecycleHandler>();
|
||||||
|
|
||||||
//ADDING BASE Handler (order is important)
|
// ADDING BASE Handler (order is important)
|
||||||
lifecycleHandlers.add(new ApplicationProfileManager());
|
lifecycleHandlers.add(new ApplicationProfileManager());
|
||||||
|
|
||||||
|
// TODO scan ApplicationLifecycleHandler form classloader
|
||||||
//TODO scan ApplicationLifecycleHandler form classloader
|
|
||||||
|
|
||||||
return new ApplicationHandlers(lifecycleHandlers, requestHandlers);
|
return new ApplicationHandlers(lifecycleHandlers, requestHandlers);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the extensions of the application from their XML serialisation.
|
* Returns the extensions of the application from their XML serialisation.
|
||||||
*
|
*
|
||||||
* @param stream the serialisation
|
* @param stream the serialisation
|
||||||
* @return the extensions
|
* @return the extensions
|
||||||
* @throws RuntimeException if the serialisation is invalid
|
* @throws RuntimeException if the serialisation is invalid
|
||||||
|
*
|
||||||
public ApplicationExtensions bindExtensions(InputStream stream) {
|
* public ApplicationExtensions
|
||||||
|
* bindExtensions(InputStream stream) {
|
||||||
|
*
|
||||||
|
* //collects handler classes Set<Class<?>> classes =
|
||||||
|
* scanForExtensions();
|
||||||
|
*
|
||||||
|
* try {
|
||||||
|
*
|
||||||
|
* JAXBContext ctx =
|
||||||
|
* JAXBContext.newInstance(classes.toArray(new
|
||||||
|
* Class<?>[0]));
|
||||||
|
*
|
||||||
|
* return (ApplicationExtensions)
|
||||||
|
* ctx.createUnmarshaller().unmarshal(stream);
|
||||||
|
*
|
||||||
|
* } catch (JAXBException e) {
|
||||||
|
*
|
||||||
|
* throw unchecked(e);
|
||||||
|
*
|
||||||
|
* } finally { closeSafely(stream); } }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* private Set<Class<?>> scanForExtensions() throws
|
||||||
|
* RuntimeException {
|
||||||
|
*
|
||||||
|
* @SuppressWarnings("all")
|
||||||
|
* ServiceLoader<ApplicationExtension> handlerLoader =
|
||||||
|
* (ServiceLoader)
|
||||||
|
* ServiceLoader.load(ApplicationExtension.class);
|
||||||
|
*
|
||||||
|
* Set<Class<?>> scanned = new HashSet<Class<?>>();
|
||||||
|
*
|
||||||
|
* for (ApplicationExtension handler : handlerLoader) {
|
||||||
|
* Class<?> handlerClass = handler.getClass(); if
|
||||||
|
* (handlerClass.isInterface() ||
|
||||||
|
* handlerClass.getModifiers() == Modifier.ABSTRACT)
|
||||||
|
* continue; else scanned.add(handlerClass); }
|
||||||
|
*
|
||||||
|
* //add top-level configuration
|
||||||
|
* scanned.add(ApplicationExtensions.class);
|
||||||
|
*
|
||||||
|
* return scanned; }
|
||||||
|
*/
|
||||||
|
|
||||||
//collects handler classes
|
|
||||||
Set<Class<?>> classes = scanForExtensions();
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
JAXBContext ctx = JAXBContext.newInstance(classes.toArray(new Class<?>[0]));
|
|
||||||
|
|
||||||
return (ApplicationExtensions) ctx.createUnmarshaller().unmarshal(stream);
|
|
||||||
|
|
||||||
} catch (JAXBException e) {
|
|
||||||
|
|
||||||
throw unchecked(e);
|
|
||||||
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
closeSafely(stream);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private Set<Class<?>> scanForExtensions() throws RuntimeException {
|
|
||||||
|
|
||||||
@SuppressWarnings("all")
|
|
||||||
ServiceLoader<ApplicationExtension> handlerLoader = (ServiceLoader) ServiceLoader.load(ApplicationExtension.class);
|
|
||||||
|
|
||||||
Set<Class<?>> scanned = new HashSet<Class<?>>();
|
|
||||||
|
|
||||||
for (ApplicationExtension handler : handlerLoader) {
|
|
||||||
Class<?> handlerClass = handler.getClass();
|
|
||||||
if (handlerClass.isInterface() || handlerClass.getModifiers() == Modifier.ABSTRACT)
|
|
||||||
continue;
|
|
||||||
else
|
|
||||||
scanned.add(handlerClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
//add top-level configuration
|
|
||||||
scanned.add(ApplicationExtensions.class);
|
|
||||||
|
|
||||||
return scanned;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
public void scanForApplicationHandlers(ClassLoader currentClassLoader) {
|
public void scanForApplicationHandlers(ClassLoader currentClassLoader) {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ import org.gcube.smartgears.configuration.ComponentConfiguration;
|
||||||
import org.gcube.smartgears.configuration.ConfiguredWith;
|
import org.gcube.smartgears.configuration.ConfiguredWith;
|
||||||
import org.gcube.smartgears.configuration.PersistenceConfiguration;
|
import org.gcube.smartgears.configuration.PersistenceConfiguration;
|
||||||
import org.gcube.smartgears.configuration.ProxyAddress;
|
import org.gcube.smartgears.configuration.ProxyAddress;
|
||||||
|
import org.gcube.smartgears.configuration.SmartgearsConfiguration;
|
||||||
import org.gcube.smartgears.handlers.container.ContainerHandler;
|
import org.gcube.smartgears.handlers.container.ContainerHandler;
|
||||||
import org.gcube.smartgears.handlers.container.lifecycle.AccountingManager;
|
import org.gcube.smartgears.handlers.container.lifecycle.AccountingManager;
|
||||||
import org.gcube.smartgears.handlers.container.lifecycle.ContainerProfileManager;
|
import org.gcube.smartgears.handlers.container.lifecycle.ContainerProfileManager;
|
||||||
|
@ -194,4 +195,14 @@ public class ContainerConfigurationBinder {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SmartgearsConfiguration loadSmartgearsProperty() {
|
||||||
|
try {
|
||||||
|
Ini configurator = new Ini(this.getClass().getResourceAsStream("smartgears-config.ini"));
|
||||||
|
String version = configurator.get("smartgears").get("version");
|
||||||
|
return new SmartgearsConfiguration(version);
|
||||||
|
}catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,75 +0,0 @@
|
||||||
package org.gcube.smartgears.configuration.library;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.gcube.common.validator.ValidationError;
|
|
||||||
import org.gcube.common.validator.Validator;
|
|
||||||
import org.gcube.common.validator.ValidatorFactory;
|
|
||||||
import org.gcube.common.validator.annotations.NotEmpty;
|
|
||||||
|
|
||||||
public class SmartGearsConfiguration {
|
|
||||||
|
|
||||||
@NotEmpty
|
|
||||||
private String version;
|
|
||||||
|
|
||||||
public SmartGearsConfiguration(){
|
|
||||||
}
|
|
||||||
|
|
||||||
public String version() {
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SmartGearsConfiguration version(String version) {
|
|
||||||
this.version=version;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates this configuration
|
|
||||||
*
|
|
||||||
* @throws IllegalStateException if the configuration is invalid
|
|
||||||
*/
|
|
||||||
public void validate() {
|
|
||||||
|
|
||||||
List<String> msgs = new ArrayList<String>();
|
|
||||||
|
|
||||||
Validator validator = ValidatorFactory.validator();
|
|
||||||
|
|
||||||
for (ValidationError error : validator.validate(this))
|
|
||||||
msgs.add(error.toString());
|
|
||||||
|
|
||||||
if (!msgs.isEmpty())
|
|
||||||
throw new IllegalStateException("invalid configuration: "+msgs);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
final int prime = 31;
|
|
||||||
int result = 1;
|
|
||||||
result = prime * result + ((version == null) ? 0 : version.hashCode());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (this == obj)
|
|
||||||
return true;
|
|
||||||
if (obj == null)
|
|
||||||
return false;
|
|
||||||
if (getClass() != obj.getClass())
|
|
||||||
return false;
|
|
||||||
SmartGearsConfiguration other = (SmartGearsConfiguration) obj;
|
|
||||||
if (version == null) {
|
|
||||||
if (other.version != null)
|
|
||||||
return false;
|
|
||||||
} else if (!version.equals(other.version))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -75,7 +75,6 @@ public class HttpController extends HttpExtension {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void stop(){
|
public void stop(){
|
||||||
super.stop();
|
|
||||||
for (ApiResource resource : resources.values())
|
for (ApiResource resource : resources.values())
|
||||||
resource.stop();
|
resource.stop();
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServlet;
|
import javax.servlet.http.HttpServlet;
|
||||||
import javax.ws.rs.HttpMethod;
|
|
||||||
|
|
||||||
import org.gcube.common.validator.annotations.NotEmpty;
|
import org.gcube.common.validator.annotations.NotEmpty;
|
||||||
import org.gcube.smartgears.configuration.application.GCubeExclude;
|
import org.gcube.smartgears.configuration.application.GCubeExclude;
|
||||||
|
@ -26,12 +25,12 @@ public abstract class HttpExtension extends HttpServlet implements ApplicationEx
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public static enum Method {
|
public static enum Method {
|
||||||
GET(HttpMethod.GET),
|
GET("GET"),
|
||||||
PUT(HttpMethod.PUT),
|
PUT("PUT"),
|
||||||
POST(HttpMethod.POST),
|
POST("POST"),
|
||||||
HEAD(HttpMethod.HEAD),
|
HEAD("HEAD"),
|
||||||
DELETE(HttpMethod.DELETE),
|
DELETE("DELETE"),
|
||||||
OPTIONS(HttpMethod.OPTIONS);
|
OPTIONS("OPTIONS");
|
||||||
|
|
||||||
|
|
||||||
private String value;
|
private String value;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package org.gcube.smartgears.extensions.resource;
|
package org.gcube.smartgears.extensions.resource;
|
||||||
|
|
||||||
import static org.gcube.smartgears.Constants.application_xml;
|
import static org.gcube.smartgears.Constants.application_json;
|
||||||
import static org.gcube.smartgears.extensions.HttpExtension.Method.GET;
|
import static org.gcube.smartgears.extensions.HttpExtension.Method.GET;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -9,7 +9,7 @@ import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.gcube.common.resources.gcore.Resources;
|
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
|
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
|
||||||
import org.gcube.smartgears.extensions.ApiResource;
|
import org.gcube.smartgears.extensions.ApiResource;
|
||||||
import org.gcube.smartgears.extensions.ApiSignature;
|
import org.gcube.smartgears.extensions.ApiSignature;
|
||||||
|
@ -26,7 +26,7 @@ public class ConfigurationResource extends ApiResource {
|
||||||
|
|
||||||
public static final String mapping = "/configuration";
|
public static final String mapping = "/configuration";
|
||||||
|
|
||||||
private static final ApiSignature signature = handles(mapping).with(method(GET).produces(application_xml));
|
private static final ApiSignature signature = handles(mapping).with(method(GET).produces(application_json));
|
||||||
|
|
||||||
ConfigurationResource() {
|
ConfigurationResource() {
|
||||||
super(signature);
|
super(signature);
|
||||||
|
@ -37,7 +37,7 @@ public class ConfigurationResource extends ApiResource {
|
||||||
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
|
|
||||||
ApplicationConfiguration config = context().configuration();
|
ApplicationConfiguration config = context().configuration();
|
||||||
Resources.marshal(config,resp.getWriter());
|
new ObjectMapper().writeValue(resp.getWriter(), config);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.gcube.smartgears.extensions.ApiResource;
|
import org.gcube.smartgears.extensions.ApiResource;
|
||||||
import org.gcube.smartgears.extensions.ApiSignature;
|
import org.gcube.smartgears.extensions.ApiSignature;
|
||||||
|
import org.gcube.smartgears.provider.ProviderFactory;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -92,7 +93,7 @@ public class FrontPageResource extends ApiResource {
|
||||||
|
|
||||||
values.put("status", context().lifecycle().state().toString());
|
values.put("status", context().lifecycle().state().toString());
|
||||||
|
|
||||||
//values.put("smartgears-version", provider().smartgearsConfiguration().version());
|
values.put("smartgears-version", ProviderFactory.provider().smartgearsConfiguration().getVersion());
|
||||||
|
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@ import org.gcube.common.health.api.ReadinessChecker;
|
||||||
import org.gcube.smartgears.context.application.ApplicationContext;
|
import org.gcube.smartgears.context.application.ApplicationContext;
|
||||||
import org.gcube.smartgears.extensions.ApiResource;
|
import org.gcube.smartgears.extensions.ApiResource;
|
||||||
import org.gcube.smartgears.extensions.ApiSignature;
|
import org.gcube.smartgears.extensions.ApiSignature;
|
||||||
import org.gcube.smartgears.handlers.application.request.RequestError;
|
|
||||||
import org.gcube.smartgears.health.HealthManager;
|
import org.gcube.smartgears.health.HealthManager;
|
||||||
import org.gcube.smartgears.health.HealthResponse;
|
import org.gcube.smartgears.health.HealthResponse;
|
||||||
import org.gcube.smartgears.health.HealthTask;
|
import org.gcube.smartgears.health.HealthTask;
|
||||||
|
@ -39,8 +38,6 @@ public class HealthResource extends ApiResource {
|
||||||
|
|
||||||
public static final String mapping = "/health";
|
public static final String mapping = "/health";
|
||||||
|
|
||||||
public static final String readiness_mapping = "/readiness";
|
|
||||||
|
|
||||||
private static final ApiSignature signature = handles(mapping).with(method(GET).produces(application_json));
|
private static final ApiSignature signature = handles(mapping).with(method(GET).produces(application_json));
|
||||||
|
|
||||||
private HealthManager manager;
|
private HealthManager manager;
|
||||||
|
@ -71,14 +68,14 @@ public class HealthResource extends ApiResource {
|
||||||
manager.register((HealthCheck) readnessClass.getDeclaredConstructor().newInstance());
|
manager.register((HealthCheck) readnessClass.getDeclaredConstructor().newInstance());
|
||||||
log.info("added class {} to health manager", readnessClass.getCanonicalName());
|
log.info("added class {} to health manager", readnessClass.getCanonicalName());
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
log.error("healthChecher class {} cannot be instantiated", readnessClass.getCanonicalName(), e);
|
log.error("healthChecker class {} cannot be instantiated", readnessClass.getCanonicalName(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
task = new HealthTask(manager);
|
task = new HealthTask(manager);
|
||||||
|
|
||||||
timer = new Timer(true);
|
timer = new Timer(true);
|
||||||
|
|
||||||
timer.scheduleAtFixedRate(task, 0, 10000);
|
timer.scheduleAtFixedRate(task, 10000, 60000);
|
||||||
|
|
||||||
super.init(context);
|
super.init(context);
|
||||||
}
|
}
|
||||||
|
@ -93,14 +90,7 @@ public class HealthResource extends ApiResource {
|
||||||
PrintWriter out = resp.getWriter();
|
PrintWriter out = resp.getWriter();
|
||||||
resp.setContentType("application/json");
|
resp.setContentType("application/json");
|
||||||
resp.setCharacterEncoding("UTF-8");
|
resp.setCharacterEncoding("UTF-8");
|
||||||
Object response = null;
|
HealthResponse response = readiness();
|
||||||
|
|
||||||
String contextpath = req.getContextPath();
|
|
||||||
log.info("context path is {}", req.getContextPath());
|
|
||||||
if (contextpath.endsWith(readiness_mapping))
|
|
||||||
response = readiness();
|
|
||||||
else
|
|
||||||
RequestError.resource_notfound_error.fire();
|
|
||||||
|
|
||||||
new ObjectMapper().writeValue(out, response);
|
new ObjectMapper().writeValue(out, response);
|
||||||
|
|
||||||
|
@ -110,5 +100,6 @@ public class HealthResource extends ApiResource {
|
||||||
public HealthResponse readiness() {
|
public HealthResponse readiness() {
|
||||||
return task.getResponse();
|
return task.getResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -48,7 +48,7 @@ public class RequestAccounting extends RequestHandler {
|
||||||
startCallThreadLocal.set(System.currentTimeMillis());
|
startCallThreadLocal.set(System.currentTimeMillis());
|
||||||
|
|
||||||
log.info("REQUEST START ON {}:{}({}) CALLED FROM {}@{} IN SCOPE {} ", appContext.configuration().name(),
|
log.info("REQUEST START ON {}:{}({}) CALLED FROM {}@{} IN SCOPE {} ", appContext.configuration().name(),
|
||||||
appContext.configuration().serviceClass(), InnerMethodName.instance.get(), caller,
|
appContext.configuration().group(), InnerMethodName.instance.get(), caller,
|
||||||
e.request().getRemoteHost(), context);
|
e.request().getRemoteHost(), context);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ public class RequestAccounting extends RequestHandler {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
log.info("REQUEST SERVED ON {}:{}({}) CALLED FROM {}@{} IN SCOPE {} {}(CODE {}) IN {} millis",
|
log.info("REQUEST SERVED ON {}:{}({}) CALLED FROM {}@{} IN SCOPE {} {}(CODE {}) IN {} millis",
|
||||||
appContext.configuration().name(), appContext.configuration().serviceClass(),
|
appContext.configuration().name(), appContext.configuration().group(),
|
||||||
InnerMethodName.instance.get(), caller, callerIp, context, success ? "SUCCEDED" : "FAILED",
|
InnerMethodName.instance.get(), caller, callerIp, context, success ? "SUCCEDED" : "FAILED",
|
||||||
e.response().getStatus(), durationInMillis);
|
e.response().getStatus(), durationInMillis);
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ public class RequestAccounting extends RequestHandler {
|
||||||
serviceUsageRecord.setConsumerId(caller);
|
serviceUsageRecord.setConsumerId(caller);
|
||||||
serviceUsageRecord.setCallerQualifier(callerQualifier);
|
serviceUsageRecord.setCallerQualifier(callerQualifier);
|
||||||
serviceUsageRecord.setScope(gcubeContext);
|
serviceUsageRecord.setScope(gcubeContext);
|
||||||
serviceUsageRecord.setServiceClass(appContext.configuration().serviceClass());
|
serviceUsageRecord.setServiceClass(appContext.configuration().group());
|
||||||
serviceUsageRecord.setServiceName(appContext.configuration().name());
|
serviceUsageRecord.setServiceName(appContext.configuration().name());
|
||||||
|
|
||||||
serviceUsageRecord.setHost(appContext.container().configuration().hostname() + ":"
|
serviceUsageRecord.setHost(appContext.container().configuration().hostname() + ":"
|
||||||
|
|
|
@ -38,7 +38,6 @@ public class RequestMetrics extends RequestHandler {
|
||||||
public void handleResponse(ResponseEvent e) {
|
public void handleResponse(ResponseEvent e) {
|
||||||
String statusCode = Integer.toString(e.response().getStatus());
|
String statusCode = Integer.toString(e.response().getStatus());
|
||||||
Metrics.globalRegistry.timer(HTTP_REQUEST_METRICS_NAME, "status", statusCode).record(Duration.ofMillis(System.currentTimeMillis() - startCallThreadLocal.get()));
|
Metrics.globalRegistry.timer(HTTP_REQUEST_METRICS_NAME, "status", statusCode).record(Duration.ofMillis(System.currentTimeMillis() - startCallThreadLocal.get()));
|
||||||
Metrics.globalRegistry.counter(HTTP_REQUEST_METRICS_NAME, "status", statusCode);
|
|
||||||
startCallThreadLocal.remove();
|
startCallThreadLocal.remove();
|
||||||
log.debug("metrics for current call saved");
|
log.debug("metrics for current call saved");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
package org.gcube.smartgears.health;
|
package org.gcube.smartgears.health;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.gcube.common.health.api.HealthCheck;
|
import org.gcube.common.health.api.HealthCheck;
|
||||||
|
|
||||||
public class HealthManager {
|
public class HealthManager {
|
||||||
|
|
||||||
private List<HealthCheck> checks;
|
private List<HealthCheck> checks = new LinkedList<>();
|
||||||
|
|
||||||
public void register(HealthCheck check){
|
public void register(HealthCheck check){
|
||||||
checks.add(check);
|
checks.add(check);
|
||||||
|
|
|
@ -7,9 +7,13 @@ import java.util.stream.Collectors;
|
||||||
import org.gcube.common.health.api.HealthCheck;
|
import org.gcube.common.health.api.HealthCheck;
|
||||||
import org.gcube.common.health.api.Status;
|
import org.gcube.common.health.api.Status;
|
||||||
import org.gcube.common.health.api.response.HealthCheckResponse;
|
import org.gcube.common.health.api.response.HealthCheckResponse;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
public class HealthTask extends TimerTask{
|
public class HealthTask extends TimerTask{
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(HealthTask.class);
|
||||||
|
|
||||||
private HealthResponse response;
|
private HealthResponse response;
|
||||||
|
|
||||||
private HealthManager healthManager;
|
private HealthManager healthManager;
|
||||||
|
@ -20,12 +24,14 @@ public class HealthTask extends TimerTask{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
List<HealthCheck> checks = healthManager.getChecks();
|
List<HealthCheck> checks = healthManager.getChecks();
|
||||||
|
|
||||||
List<HealthCheckResponse> responses = checks.stream().map(c -> this.wrap(c)).collect(Collectors.toList());
|
List<HealthCheckResponse> responses = checks.stream().map(c -> this.wrap(c)).collect(Collectors.toList());
|
||||||
Status totalStatus = responses.stream().anyMatch(r -> r.getStatus().equals(Status.DOWN)) ? Status.DOWN : Status.UP;
|
Status totalStatus = responses.stream().anyMatch(r -> r.getStatus().equals(Status.DOWN)) ? Status.DOWN : Status.UP;
|
||||||
|
|
||||||
this.response = new HealthResponse(totalStatus, responses);
|
this.response = new HealthResponse(totalStatus, responses);
|
||||||
|
log.debug("health task executed with total status {}",totalStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
public HealthResponse getResponse() {
|
public HealthResponse getResponse() {
|
||||||
|
@ -36,7 +42,7 @@ public class HealthTask extends TimerTask{
|
||||||
try {
|
try {
|
||||||
return check.check();
|
return check.check();
|
||||||
}catch (Throwable t) {
|
}catch (Throwable t) {
|
||||||
return HealthCheckResponse.builder(check.getName()).down().withMessage("unexpected error executing check").build();
|
return HealthCheckResponse.builder(check.getName()).down().withMessage(t.getMessage()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ import javax.servlet.ServletContext;
|
||||||
import org.gcube.common.events.Hub;
|
import org.gcube.common.events.Hub;
|
||||||
import org.gcube.common.events.impl.DefaultHub;
|
import org.gcube.common.events.impl.DefaultHub;
|
||||||
import org.gcube.common.security.credentials.Credentials;
|
import org.gcube.common.security.credentials.Credentials;
|
||||||
|
import org.gcube.smartgears.configuration.SmartgearsConfiguration;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
|
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationConfigurationBinder;
|
import org.gcube.smartgears.configuration.application.ApplicationConfigurationBinder;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationHandlers;
|
import org.gcube.smartgears.configuration.application.ApplicationHandlers;
|
||||||
|
@ -276,9 +277,17 @@ public class DefaultProvider implements Provider {
|
||||||
return this.publishers;
|
return this.publishers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SmartgearsConfiguration smartgearsConfiguration() {
|
||||||
|
ContainerConfigurationBinder binder = new ContainerConfigurationBinder();
|
||||||
|
return binder.loadSmartgearsProperty();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @Override public AuthorizationProvider authorizationProvider() { return
|
* @Override public AuthorizationProvider authorizationProvider() { return
|
||||||
* containerContext.authorizationProvider(); }
|
* containerContext.authorizationProvider(); }
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.util.List;
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
|
import org.gcube.smartgears.configuration.SmartgearsConfiguration;
|
||||||
import org.gcube.smartgears.configuration.application.ApplicationHandlers;
|
import org.gcube.smartgears.configuration.application.ApplicationHandlers;
|
||||||
import org.gcube.smartgears.context.application.ApplicationContext;
|
import org.gcube.smartgears.context.application.ApplicationContext;
|
||||||
import org.gcube.smartgears.context.container.ContainerContext;
|
import org.gcube.smartgears.context.container.ContainerContext;
|
||||||
|
@ -67,5 +68,6 @@ public interface Provider {
|
||||||
|
|
||||||
List<ApplicationExtension> extensionsFor(ApplicationContext application);
|
List<ApplicationExtension> extensionsFor(ApplicationContext application);
|
||||||
|
|
||||||
|
SmartgearsConfiguration smartgearsConfiguration();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,7 +214,7 @@ public class Utils {
|
||||||
public static ServiceInfo getServiceInfo(ApplicationContext application){
|
public static ServiceInfo getServiceInfo(ApplicationContext application){
|
||||||
String hostedin = String.format("%s_%d", application.container().configuration().hostname(), application.container().configuration().port());
|
String hostedin = String.format("%s_%d", application.container().configuration().hostname(), application.container().configuration().port());
|
||||||
return
|
return
|
||||||
new ServiceInfo(new ServiceIdentifier(application.configuration().serviceClass(), application.configuration().name(), hostedin));
|
new ServiceInfo(new ServiceIdentifier(application.configuration().group(), application.configuration().name(), hostedin));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Throwable getCause(Throwable e) {
|
public static Throwable getCause(Throwable e) {
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
org.gcube.smartgears.extensions.resource.RemoteResource
|
|
|
@ -42,14 +42,14 @@ public class ConfigurationTest {
|
||||||
InputStream inputStream = this.getClass()
|
InputStream inputStream = this.getClass()
|
||||||
.getClassLoader()
|
.getClassLoader()
|
||||||
.getResourceAsStream("applicationTest.yaml");
|
.getResourceAsStream("applicationTest.yaml");
|
||||||
ApplicationConfiguration customer = yaml.load(inputStream);
|
yaml.load(inputStream);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void serialize() throws Exception{
|
public void serialize() throws Exception{
|
||||||
ApplicationConfiguration configuration =new ApplicationConfiguration();
|
ApplicationConfiguration configuration =new ApplicationConfiguration();
|
||||||
configuration.name("test").serviceClass("group").description("pippo").version("1.0.0").excludes(new GCubeExclude("/pippo/*"), new GCubeExclude(List.of("H1","H2"), "/trip"));
|
configuration.name("test").group("group").description("pippo").version("1.0.0").excludes(new GCubeExclude("/pippo/*"), new GCubeExclude(List.of("H1","H2"), "/trip"));
|
||||||
configuration.persistenceConfiguration(new PersistenceConfiguration(LocalWriter.class, new LocalWriterConfiguration("/tmp")));
|
configuration.persistenceConfiguration(new PersistenceConfiguration(LocalWriter.class, new LocalWriterConfiguration("/tmp")));
|
||||||
/*
|
/*
|
||||||
ObjectMapper mapper = new ObjectMapper();
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
|
Loading…
Reference in New Issue