From 11dee73b0fd6f6aaa3f117316f45a46c51c542ef Mon Sep 17 00:00:00 2001 From: giancarlo Date: Fri, 16 Oct 2020 17:22:37 +0200 Subject: [PATCH] First Release --- Dockerfile | 52 +++++++++++++++++++++++++++++++++++ README.md | 58 +++++++++++++++++++++++++++++++++++++++ sortapp | 14 ++++++++++ src/StorageHubCL.R | 62 ++++++++++++++++++++++++++++++++++++++++++ src/install_packages.R | 13 +++++++++ src/sortapp.R | 46 +++++++++++++++++++++++++++++++ 6 files changed, 245 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100755 sortapp create mode 100644 src/StorageHubCL.R create mode 100644 src/install_packages.R create mode 100644 src/sortapp.R diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9b12d1c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,52 @@ +# Dockerfile +# +# version: 1.0 +# author: Giancarlo Panichi +# date: 2020/10/09 + +# R images +# see for more image: +# https://hub.docker.com/u/rocker/ +# + +# Version-stable build of R, rstudio, and R packages ~2.48GB +# FROM rocker/tidyverse:latest + +# +# In this case I will use the r-base image by adding some debian packages +# necessary for the correct build of the image. +# In this case I will obtain an image of ~1.2GB. +# Better ad-hoc solutions can be found to reduce the image size. +# +# Base Version ~824MB +FROM rocker/r-base:latest + +RUN apt-get update -qq && apt-get -y --no-install-recommends install \ + libssl-dev \ + libxml2-dev \ + libcairo2-dev \ + libssh2-1-dev \ + libsasl2-dev \ + libcurl4-openssl-dev + + +## create directories +RUN mkdir -p /code +WORKDIR /code +RUN mkdir -p src + +## copy files +COPY /src/* src/ +COPY sortapp . +RUN chmod +x sortapp + +## install R-packages +RUN Rscript src/install_packages.R + + +## create a link +WORKDIR / +RUN ln -sf /code/sortapp /usr/bin/sortapp + +# RUN Script +# CMD sortapp diff --git a/README.md b/README.md new file mode 100644 index 0000000..1bc48d5 --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +# SortAppR + +SortAppR is a simple example that allows you to sort a file in input. +Starting from this example, you can first create an simple script R and then a docker image in which it is installed the created script. +This example declare the sortapp command as entrypoint. +So once you can use this command at command line to run the example: + +``` +sortapp +``` + +The image created in this way can be executed in a container with the following command: + +``` +docker run -i -t --rm --name sortappr-cont sortappr sortapp +``` + +To be able to create an image from this application you need to have Docker and Docker-Compose installed on your machine and the relative python packages, see: +[Docker](https://docs.docker.com/engine/), +[Docker-Compose](https://docs.docker.com/compose/install/) and +[Docker Package for Python](https://pypi.org/project/docker/). + +## Useful Commands + +### Create Docker Image +``` +docker build -t sortappr . +``` + +### Save Docker Image in file +``` +docker save sortappr | gzip > sortappr.tar.gz +``` + +### Publish Docker Image on DockerHub +Re-tagging an existing local image: + +``` +docker tag sortappr /[:] +``` + +Login in DockerHub(use your Docker ID): + +``` +docker login +``` + +Now you can push this repository to the registry designated by its name or tag: + +``` +docker push /: +``` + +Then logout for security: + +``` +docker logout +``` diff --git a/sortapp b/sortapp new file mode 100755 index 0000000..095db92 --- /dev/null +++ b/sortapp @@ -0,0 +1,14 @@ +#!/bin/bash +# +# SortApp +# +# version: 1.0 +# author: Giancarlo Panichi +# date: 2020/10/09 +# +echo "Run Rscript" +echo "Token: " $1 +echo "FileItemId: " $2 +echo "TempFolderItemId" $3 + +Rscript /code/src/sortapp.R $1 $2 $3 diff --git a/src/StorageHubCL.R b/src/StorageHubCL.R new file mode 100644 index 0000000..4d4f546 --- /dev/null +++ b/src/StorageHubCL.R @@ -0,0 +1,62 @@ +# +# StorageHubCL.R +# +# version: 1.0 +# author: Giancarlo Panichi +# date: 2020/10/09 + +# GoogleVIS is very verbose +#suppressPackageStartupMessages(library(googleVis)) + +library(XML) +require(XML) +library(jsonlite) +library(stringr) +library(httr) +require("httr") + + +discoverStorageHub<-function(){ + + urlString = paste("http://registry.d4science.org/icproxy/gcube/service/GCoreEndpoint/DataAccess/StorageHub?gcube-token=",token,sep="") + got<-GET(urlString, timeout(1*3600)) + xmlfile <- xmlTreeParse(got) + class(xmlfile) + xmltop = xmlRoot(xmlfile) + + listxpath = xpathSApply(xmltop, "//Results/Result") + print(listxpath) + listx<-(rapply(listxpath, function(x) head(x, 1))) + if (length(listx)>0){ + storagehubEP<<-as.character(listx[which(listx=="Endpoint")[[1]]+3]) + }else{ + cat("Found no storage ub endpoint\n") + } + +} + + +downloadSH<-function(itemid,filename){ + cat("About to download",itemid,"\n") + cat("Downloading...\n") + reqDownload<<-paste(sep="",storagehubEP,"/items/",itemid,"/download?exclude=hl:accounting&gcube-token=",token); + download.file(url = reqDownload, destfile = filename, method="wget", quiet = T, mode = "w",cacheOK = FALSE) + cat("All done.\n") +} + +uploadSH<-function(folderitemid,localfilename,filename, descr){ + cat("About to upload: [folder=",folderitemid,", filename=",filename,"\n") + cat("Uploading...\n") + reqUpload<<-paste(storagehubEP,"/items/",folderitemid,"/create/FILE?gcube-token=",token,sep=""); + + print(reqUpload) + res<-POST(reqUpload, + body=list(name=filename, description=descr, file=upload_file(localfilename)), + add_headers("Content-Type" = "multipart/form-data"), + verbose()) + print(res) + cat("All done.\n") + +} + + diff --git a/src/install_packages.R b/src/install_packages.R new file mode 100644 index 0000000..cca5491 --- /dev/null +++ b/src/install_packages.R @@ -0,0 +1,13 @@ +# Install Packages +# +# Uncomment and add necessary packages +# +#install.packages("devtools", repos = "http://cran.rstudio.com/",dependencies=TRUE) +#install.packages("dplyr", dependencies=TRUE) +#install.packages("ggplot2", dependencies=TRUE) +#install.packages("forcats", dependencies=TRUE) +install.packages("XML", dependencies=TRUE) +install.packages("jsonline", dependencies=TRUE) +install.packages("stringr", dependencies=TRUE) +install.packages("httr", dependencies=TRUE) + diff --git a/src/sortapp.R b/src/sortapp.R new file mode 100644 index 0000000..b34323a --- /dev/null +++ b/src/sortapp.R @@ -0,0 +1,46 @@ +# +# SortAppr.R +# +# version: 1.0 +# author: Giancarlo Panichi +# date: 2020/10/09 + + +print("Start SortApp.R") + +args <- commandArgs(trailingOnly = TRUE) +print(args) + +print(paste("current dir: ",getwd()),sep="") +setwd("/code/src") +print(paste("working dir: ",getwd()),sep="") + +source("StorageHubCL.R") + +token<-args[1] +itemid<-args[2] +tempfolderitemid<-args[3] + +filename<-"sortableelements.txt" + +discoverStorageHub() +downloadSH(itemid,filename) + + +print("Read from SH...") +print("Read data from file...") +df <- read.table("sortableelements.txt",header = FALSE) +print("Sort data...") +df <- df[order(df[,1]),] +print(df) +print("Write data to file...") +write.table(df, "result.txt", append = FALSE, sep = " ", dec = ".", + row.names = FALSE, col.names = FALSE) +print("Save on SH...") + +uploadSH(tempfolderitemid,"result.txt","result.txt","SortApp result") + +print("SortApp.R done") + + +