Compare commits

...

2 Commits

10 changed files with 94 additions and 197 deletions

View File

@ -3,5 +3,4 @@ encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
encoding//target/generated-sources/gwt=UTF-8
encoding/<project>=UTF-8

26
CHANGELOG.md Normal file
View File

@ -0,0 +1,26 @@
# Changelog for RStudio Wrapper Portlet
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [v1.5.0] - 2021-04-21
- RStudio instance allocation takes into account the number of instance available in the VO and not in the context and assign the RStudio instance balancing the load.
- The user is always redirected to the same endpoint, until a gCore Endpoint disappears, if so a new allocation is calculated.
## [v1.3.1] - 2019-10-07
- RStudio instances returned over https now
## [v1.3.0] -2017-02-21
- RStudio instance allocation takes into account the number of instance available in the given context and assign the RStudio instance balancing the load.
- Added possibility to look for service endpoint RConnector resource in the scope
## [v1.0.0] -2016-04-11
- First release

26
FUNDING.md Normal file
View File

@ -0,0 +1,26 @@
# Acknowledgments
The projects leading to this software have received funding from a series of European Union programmes including:
- the Sixth Framework Programme for Research and Technological Development
- [DILIGENT](https://cordis.europa.eu/project/id/004260) (grant no. 004260).
- the Seventh Framework Programme for research, technological development and demonstration
- [D4Science](https://cordis.europa.eu/project/id/212488) (grant no. 212488);
- [D4Science-II](https://cordis.europa.eu/project/id/239019) (grant no.239019);
- [ENVRI](https://cordis.europa.eu/project/id/283465) (grant no. 283465);
- [iMarine](https://cordis.europa.eu/project/id/283644) (grant no. 283644);
- [EUBrazilOpenBio](https://cordis.europa.eu/project/id/288754) (grant no. 288754).
- the H2020 research and innovation programme
- [SoBigData](https://cordis.europa.eu/project/id/654024) (grant no. 654024);
- [PARTHENOS](https://cordis.europa.eu/project/id/654119) (grant no. 654119);
- [EGI-Engage](https://cordis.europa.eu/project/id/654142) (grant no. 654142);
- [ENVRI PLUS](https://cordis.europa.eu/project/id/654182) (grant no. 654182);
- [BlueBRIDGE](https://cordis.europa.eu/project/id/675680) (grant no. 675680);
- [PerformFISH](https://cordis.europa.eu/project/id/727610) (grant no. 727610);
- [AGINFRA PLUS](https://cordis.europa.eu/project/id/731001) (grant no. 731001);
- [DESIRA](https://cordis.europa.eu/project/id/818194) (grant no. 818194);
- [ARIADNEplus](https://cordis.europa.eu/project/id/823914) (grant no. 823914);
- [RISIS 2](https://cordis.europa.eu/project/id/824091) (grant no. 824091);
- [EOSC-Pillar](https://cordis.europa.eu/project/id/857650) (grant no. 857650);
- [Blue Cloud](https://cordis.europa.eu/project/id/862409) (grant no. 862409);
- [SoBigData-PlusPlus](https://cordis.europa.eu/project/id/871042) (grant no. 871042);

View File

@ -1 +0,0 @@
${gcube.license}

View File

@ -1,62 +0,0 @@
The gCube System - ${name}
--------------------------------------------------
${description}
${gcube.description}
${gcube.funding}
Version
--------------------------------------------------
${version} (${buildDate})
Please see the file named "changelog.xml" in this directory for the release notes.
Authors
--------------------------------------------------
* Massimiliano Assante (massimiliano.assante@isti.cnr.it), Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" - CNR, Pisa (Italy).
Maintainers
-----------
* Massimiliano Assante (massimiliano.assante@isti.cnr.it), Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" - CNR, Pisa (Italy).
Download information
--------------------------------------------------
Source code is available from SVN:
${scm.url}
Binaries can be downloaded from the gCube website:
${gcube.website}
Installation
--------------------------------------------------
Installation documentation is available on-line in the gCube Wiki:
${gcube.wikiRoot}
Documentation
--------------------------------------------------
Documentation is available on-line in the gCube Wiki:
${gcube.wikiRoot}
Support
--------------------------------------------------
Bugs and support requests can be reported in the gCube issue tracking tool:
${gcube.issueTracking}
Licensing
--------------------------------------------------
This software is licensed under the terms you may find in the file named "LICENSE" in this directory.

View File

@ -1,25 +0,0 @@
<ReleaseNotes>
<Changeset component="org.gcube.portlet.user.rstudio-wrapper-portlet.1-3-1"
date="2019-10-07">
<Change>RStudio instances returned over https now
</Change>
<Change>Ported to Java8 and gwt 2.8.2
</Change>
</Changeset>
<Changeset component="org.gcube.portlet.user.rstudio-wrapper-portlet.1-3-0"
date="2017-02-21">
<Change>RStudio instance allocation takes into account the number of instance available in the given context and assign the RStudio instance balancing the load.
</Change>
</Changeset>
<Changeset component="org.gcube.portlet.user.rstudio-wrapper-portlet.1-2-0"
date="2016-09-15">
<Change>added possibility to look for service endpoint RConnector
resource in the
scope
</Change>
</Changeset>
<Changeset component="org.gcube.portlet.user.rstudio-wrapper-portlet.1-0-0"
date="2016-04-11">
<Change>First Release</Change>
</Changeset>
</ReleaseNotes>

View File

@ -1,31 +0,0 @@
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>servicearchive</id>
<formats>
<format>tar.gz</format>
</formats>
<baseDirectory>/</baseDirectory>
<fileSets>
<fileSet>
<directory>${distroDirectory}</directory>
<outputDirectory>/</outputDirectory>
<useDefaultExcludes>true</useDefaultExcludes>
<includes>
<include>README</include>
<include>LICENSE</include>
<include>changelog.xml</include>
<include>profile.xml</include>
</includes>
<fileMode>755</fileMode>
<filtered>true</filtered>
</fileSet>
</fileSets>
<files>
<file>
<source>target/${build.finalName}.${project.packaging}</source>
<outputDirectory>/${artifactId}</outputDirectory>
</file>
</files>
</assembly>

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ID></ID>
<Type>Service</Type>
<Profile>
<Description>${description}</Description>
<Class>PortletUser</Class>
<Name>${artifactId}</Name>
<Version>${version}</Version>
<Packages>
<Software>
<Name>${artifactId}</Name>
<Version>${version}</Version>
<MavenCoordinates>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
</MavenCoordinates>
<Files>
<File>target/${build.finalName}.war</File>
</Files>
</Software>
</Packages>
</Profile>
</Resource>

View File

@ -12,7 +12,7 @@
<groupId>org.gcube.portlets.user</groupId>
<artifactId>rstudio-wrapper-portlet</artifactId>
<packaging>war</packaging>
<version>1.4.0</version>
<version>1.5.0</version>
<name>RStudio Wrapper Portlet</name>
<scm>
<connection>scm:git:https://code-repo.d4science.org/gCubeSystem/${project.artifactId}.git</connection>
@ -34,7 +34,7 @@
<dependency>
<groupId>org.gcube.distribution</groupId>
<artifactId>maven-portal-bom</artifactId>
<version>3.6.0</version>
<version>3.6.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
@ -72,7 +72,7 @@
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>common-scope-maps</artifactId>
<scope>compile</scope>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.gcube.data.analysis</groupId>

View File

@ -185,58 +185,48 @@ public class RStudioServiceImpl extends RemoteServiceServlet implements RStudioS
_log.info("User " + curUser.getFullname() + " has RStudio Instance set and is valid, returning rConnector URL " + toReturn);
}
else {//need to find the RStudio
//check first if there is an instance allocated on another scope
_log.info("User " + curUser.getFullname() + " DOES NOT have RStudio Instance set for this context "+context + " check if she as an instance assigned on another context");
if (! userRStudioInstances.isEmpty()) {
String theFirstInstance = userRStudioInstances.values().iterator().next();
toReturn = getRConnectorURL(theFirstInstance, token);
_log.info("Found instance: "+ theFirstInstance);
writeRStudioInstanceInScope(um, curUser, context, theFirstInstance);
_log.debug("User " + curUser.getFullname() + " RStudio gCore Instance set reused = " + theFirstInstance + " for new context " + context);
}
else { //no instance allocated on another scope
_log.info("User " + curUser.getFullname() + " DOES NOT have RStudio Instance set or the instance previous set no longer exists, calculating allocation ... ");
HashMap<String, Integer> rStudioDistributionMap = new HashMap<>();
for (GCoreEndpoint res : gCoreResources) {
String hostedOn = extractGCoreEndpointHostAndPort(res);
rStudioDistributionMap.put(hostedOn, 0);
}
List<GCubeUser> vreUsers = um.listUsersByGroup(pContext.getCurrentGroupId(getThreadLocalRequest()), false);
_log.debug("VRE " + context + " has totalUsers = " + vreUsers.size());
for (GCubeUser gCubeUser : vreUsers) {
if (getUserRStudioInstances(um,gCubeUser).get(context) != null) {
String hostedOn = getUserRStudioInstances(um,gCubeUser).get(context);
if (rStudioDistributionMap.containsKey(hostedOn)) {
int noToSet = rStudioDistributionMap.get(hostedOn)+1;
rStudioDistributionMap.put(hostedOn, noToSet);
}
}
}
_log.debug("VRE - RStudio allocaiton map as follows: ");
int min = 0;
int i = 0;
String host2Select = "";
for (String host : rStudioDistributionMap.keySet()) {
_log.debug("Host " + host + " has # users=" + rStudioDistributionMap.get(host));
if (i==0) {
host2Select = host;
min = rStudioDistributionMap.get(host);
} else {
int usersNo = rStudioDistributionMap.get(host);
if (usersNo < min) {
_log.debug("Host " + host + " has LESS users than " + host2Select + " updating");
host2Select = host;
}
}
i++;
}
writeRStudioInstanceInScope(um, curUser, context, host2Select);
_log.debug("User " + curUser.getFullname() + " RStudio gCore Instance set calculated = " + host2Select + " for context " + context);
toReturn = getRConnectorURL(host2Select, token);
_log.info("User " + curUser.getFullname() + " DOES NOT have RStudio Instance set or the instance previous set no longer exists, calculating allocation ... ");
HashMap<String, Integer> rStudioDistributionMap = new HashMap<>();
for (GCoreEndpoint res : gCoreResources) {
String hostedOn = extractGCoreEndpointHostAndPort(res);
rStudioDistributionMap.put(hostedOn, 0);
}
_log.debug("User " + curUser.getFullname() + " has RStudio gCore Instance set, returning rConnector URL " + toReturn);
List<GCubeUser> vreUsers = um.listUsersByGroup(pContext.getCurrentGroupId(getThreadLocalRequest()), false);
_log.debug("VRE " + context + " has totalUsers = " + vreUsers.size());
for (GCubeUser gCubeUser : vreUsers) {
if (getUserRStudioInstances(um,gCubeUser).get(context) != null) {
String hostedOn = getUserRStudioInstances(um,gCubeUser).get(context);
if (rStudioDistributionMap.containsKey(hostedOn)) {
int noToSet = rStudioDistributionMap.get(hostedOn)+1;
rStudioDistributionMap.put(hostedOn, noToSet);
}
}
}
_log.debug("VRE - RStudio allocation map as follows: ");
int min = 0;
int i = 0;
String host2Select = "";
for (String host : rStudioDistributionMap.keySet()) {
_log.debug("Host " + host + " has # users=" + rStudioDistributionMap.get(host));
if (i==0) {
host2Select = host;
min = rStudioDistributionMap.get(host);
} else {
int usersNo = rStudioDistributionMap.get(host);
if (usersNo < min) {
_log.debug("Host " + host + " has LESS users than " + host2Select + " updating");
host2Select = host;
}
}
i++;
}
writeRStudioInstanceInScope(um, curUser, context, host2Select);
_log.debug("User " + curUser.getFullname() + " RStudio gCore Instance set calculated = " + host2Select + " for context " + context);
toReturn = getRConnectorURL(host2Select, token);
}
_log.debug("User " + curUser.getFullname() + " has RStudio gCore Instance set, returning rConnector URL " + toReturn);
} catch (Exception e) {
e.printStackTrace();