commit 6c5e520a9461b8562fd2e3db1abc35f3ece98503 Author: giancarlo Date: Tue Sep 22 11:51:39 2020 +0200 Added SortApp project diff --git a/.project b/.project new file mode 100644 index 0000000..db765bd --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + sortapp + + + + + + org.python.pydev.PyDevBuilder + + + + + + org.python.pydev.pythonNature + + diff --git a/.pydevproject b/.pydevproject new file mode 100644 index 0000000..0391d06 --- /dev/null +++ b/.pydevproject @@ -0,0 +1,10 @@ + + +python interpreter +Default + + + +/${PROJECT_DIR_NAME}/src + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..9035696 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +encoding//src/sortapp/issupport.py=utf-8 +encoding//src/sortapp/sortapp.py=utf-8 +encoding//src/sortapp/storagehub/storagehubcommand.py=utf-8 +encoding//src/sortapp/storagehub/storagehubcommanditemdownload.py=utf-8 +encoding//src/sortapp/storagehub/storagehubcommanditemupload.py=utf-8 +encoding/setup.py=utf-8 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a360bc3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +# Base +FROM python:3.6-alpine + +RUN apk add --no-cache bash + +# Istall deps +COPY ./requirements.txt / +RUN pip3 install -r requirements.txt + + +# Install dist package sortapp +COPY ./dist/sortapp-1.0.0.tar.gz / + +RUN pip3 install sortapp-1.0.0.tar.gz + +# +#RUN rm sortapp-1.0.0.tar.gz +#RUN rm requirements.txt +#RUN rm -r /root/.cache + +### Alternative ### +# Create a working directory and Bundle app source +# WORKDIR /sortapp +# COPY src/sortapp /sortapp + +# Copy all subfolder +#ADD . / + +# Autorun +# CMD [ "python3", "./sortapp.py" ] diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..a0f6c0f --- /dev/null +++ b/LICENSE.md @@ -0,0 +1 @@ +#Mit License \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..c28ab72 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +include README.md +include LICENSE.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..c7ae6e1 --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +#SortAPP + +SortApp is simple example that sort a file in input. +Starting from this example, you can first create an installable package via pip3 and then a docker image in which it is installed the created package. +The package declares the sortapp command as entrypoint. +So once the package is installed 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 sortapp-cont sortapp sortapp + + +##Useful Commands + +###Create Distribution Package +python3 setup.py sdist --formats=gztar + +###Create Docker Image +docker build -t sortapp . + +###Save Docker Image in file +docker save sortapp | gzip > sortapp.tar.gz + +###Publish Docker Image on DockerHub +Name your local images using: +By re-tagging an existing local image: + +- docker tag sortapp /[:] + +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/dist/sortapp-1.0.0.tar.gz b/dist/sortapp-1.0.0.tar.gz new file mode 100644 index 0000000..dc366b2 Binary files /dev/null and b/dist/sortapp-1.0.0.tar.gz differ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1a4188b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +###### Requirements without Version Specifiers ###### +requests + +###### Requirements with Version Specifiers ###### diff --git a/runexample.txt b/runexample.txt new file mode 100644 index 0000000..86bbe08 --- /dev/null +++ b/runexample.txt @@ -0,0 +1,10 @@ +python3 + +Token +xxxx-xxxx-xxxx-xxxx-xxxx + +FileItemId +548eade8-25cf-4978-9f61-0f0c652900be + +FolderItemId +32c0422f-a777-4452-adea-007347ec4484 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..d27259a --- /dev/null +++ b/setup.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# @author: Giancarlo Panichi +# +# Created on 2020/06/12 +# +import setuptools + +with open("README.md", "r") as freadme: + l_description = freadme.read() + +with open("LICENSE.md", "r") as flicense: + license_description = flicense.read() + + +setuptools.setup( + name="sortapp", + version="1.0.0", + author="Giancarlo Panichi", + author_email="giancarlo.panichi@isti.cnr.it", + description="A application for sort un text file", + long_description=l_description, + long_description_content_type="text/markdown", + license=license_description, + url="https://code-repo.d4science.org/gCubeSystem/sortapp", + package_dir={"": "src"}, + packages=setuptools.find_packages(where="src"), + entry_points={ + 'console_scripts': ['sortapp=sortapp.sortapp:main'] + }, + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ], + platforms=["Linux"], + python_requires='>=3.6', +) \ No newline at end of file diff --git a/src/sortapp.egg-info/PKG-INFO b/src/sortapp.egg-info/PKG-INFO new file mode 100644 index 0000000..43a5a50 --- /dev/null +++ b/src/sortapp.egg-info/PKG-INFO @@ -0,0 +1,38 @@ +Metadata-Version: 2.1 +Name: sortapp +Version: 1.0.0 +Summary: A application for sort un text file +Home-page: https://code-repo.d4science.org/gCubeSystem/sortapp +Author: Giancarlo Panichi +Author-email: giancarlo.panichi@isti.cnr.it +License: #Mit License +Description: #SortAPP + + SortApp is simple example that sort a file in input. + Starting from this example, you can first create an installable package via pip3 and then a docker image in which it is installed the created package. + The package declares the sortapp command as entrypoint. + So once the package is installed 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 sortapp-cont sortapp-img sortapp + + + ##Useful Commands + + ###Create Distribution Package + python3 setup.py sdist --formats=gztar + + ###Create Docker Image + docker build -t sortapp-img . + + ###Save Docker Image in file + docker save sortapp-img | gzip > sortapp-img.tar.gz +Platform: Linux +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Requires-Python: >=3.6 +Description-Content-Type: text/markdown diff --git a/src/sortapp.egg-info/SOURCES.txt b/src/sortapp.egg-info/SOURCES.txt new file mode 100644 index 0000000..a0d2233 --- /dev/null +++ b/src/sortapp.egg-info/SOURCES.txt @@ -0,0 +1,17 @@ +LICENSE.md +MANIFEST.in +README.md +setup.py +src/sortapp/__init__.py +src/sortapp/__main__.py +src/sortapp/issupport.py +src/sortapp/sortapp.py +src/sortapp.egg-info/PKG-INFO +src/sortapp.egg-info/SOURCES.txt +src/sortapp.egg-info/dependency_links.txt +src/sortapp.egg-info/entry_points.txt +src/sortapp.egg-info/top_level.txt +src/sortapp/storagehub/__init__.py +src/sortapp/storagehub/storagehubcommand.py +src/sortapp/storagehub/storagehubcommanditemdownload.py +src/sortapp/storagehub/storagehubcommanditemupload.py \ No newline at end of file diff --git a/src/sortapp.egg-info/dependency_links.txt b/src/sortapp.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/sortapp.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/sortapp.egg-info/entry_points.txt b/src/sortapp.egg-info/entry_points.txt new file mode 100644 index 0000000..ababc04 --- /dev/null +++ b/src/sortapp.egg-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +sortapp = sortapp.sortapp:main + diff --git a/src/sortapp.egg-info/top_level.txt b/src/sortapp.egg-info/top_level.txt new file mode 100644 index 0000000..3071513 --- /dev/null +++ b/src/sortapp.egg-info/top_level.txt @@ -0,0 +1 @@ +sortapp diff --git a/src/sortapp/__init__.py b/src/sortapp/__init__.py new file mode 100644 index 0000000..a6f9542 --- /dev/null +++ b/src/sortapp/__init__.py @@ -0,0 +1 @@ +print("sortapp init") \ No newline at end of file diff --git a/src/sortapp/__main__.py b/src/sortapp/__main__.py new file mode 100644 index 0000000..e177ffa --- /dev/null +++ b/src/sortapp/__main__.py @@ -0,0 +1,2 @@ +print('__main__.py executed') + diff --git a/src/sortapp/issupport.py b/src/sortapp/issupport.py new file mode 100644 index 0000000..c084e7c --- /dev/null +++ b/src/sortapp/issupport.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# @author: Giancarlo Panichi +# +# Created on 2018/06/15 +# +import requests +from xml.etree import ElementTree + +class ISSupport: + + def __init__(self): + # dev + #self.serviceUrl = "https://node10-d-d4s.d4science.org" + # prod + self.serviceUrl = "http://registry.d4science.org" + self.storageHubServiceClass = "DataAccess" + self.storageHubServiceName = "StorageHub" + + def discoverStorageHub(self,gcubeToken): + print("Discover StorageHub") + urlString = self.serviceUrl + "/icproxy/gcube/service/GCoreEndpoint/" + self.storageHubServiceClass + "/" + self.storageHubServiceName + "?gcube-token=" + gcubeToken + r = requests.get(urlString) + print(r.status_code) + print(r.text) + if r.status_code!=200: + print("Error discovering StorageHub: "+r.status_code) + raise Exception("Error retrieving StorageHub url info: "+r.status_code) + else: + root = ElementTree.fromstring(r.text) + print(root) + gcoreEndpoint=root.findall("Result/Resource/Profile/AccessPoint/RunningInstanceInterfaces/Endpoint") + print(gcoreEndpoint) + for child in gcoreEndpoint: + print(child.tag, child.attrib) + if child.attrib["EntryName"]=="org.gcube.data.access.storagehub.StorageHub": + print("Endpoint Found") + print(child.text) + return child.text + + print("Error discovering StorageHub url not found") + raise Exception("Error retrieving StorageHub url not found!") + + def __str__(self): + return 'ISSupport[serviceUrl=' + str(self.serviceUrl) + ']' diff --git a/src/sortapp/sortapp.py b/src/sortapp/sortapp.py new file mode 100644 index 0000000..e378c38 --- /dev/null +++ b/src/sortapp/sortapp.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# @author: Giancarlo Panichi +# +# Created on 2020/06/12 +# +import sys +from .issupport import ISSupport +from .storagehub.storagehubcommanditemdownload import StorageHubCommandItemDownload +from .storagehub.storagehubcommanditemupload import StorageHubCommandItemUpload + + +class SortApp: + + def __init__(self): + self.gcubeToken = sys.argv[1] + self.fileItemId = sys.argv[2] + self.tempFolderItemId = sys.argv[3] + self.destinationFile = "elements.txt" + self.storageHubUrl = None + + def main(self): + print(self) + issup = ISSupport() + self.storageHubUrl = issup.discoverStorageHub(self.gcubeToken) + self.executeSort() + + def executeSort(self): + print("Execute Sort") + print('gcubeToken: ' + self.gcubeToken) + print('fileItemId: ' + self.fileItemId) + + if not self.gcubeToken: + raise Exception('Error Token is null') + + if not self.fileItemId: + raise Exception('Error File Item Id is null') + + cmdItemDownload = StorageHubCommandItemDownload(self.gcubeToken, self.storageHubUrl, + self.fileItemId, self.destinationFile) + cmdItemDownload.execute() + + with open(self.destinationFile, 'r') as f: + elementsList = [line.strip() for line in f] + + print ("Elements found: ") + print(*elementsList, sep="\n") + + #if self.elementsOrder and self.elementsOrder == 'Desc': + # elementsList.sort(reverse=True) + #else: + elementsList.sort(reverse=False) + + print ("Elements sorted: ") + print(*elementsList, sep="\n") + + with open(self.destinationFile, 'w') as out_file: + out_file.write('\n'.join(elementsList)) + + print("Elements saved in file: " + self.destinationFile) + + cmdItemUpload = StorageHubCommandItemUpload(self.gcubeToken, self.storageHubUrl, self.tempFolderItemId, + self.destinationFile, self.destinationFile, self.destinationFile) + cmdItemUpload.execute() + + def __str__(self): + return 'Sort App' + + +def main(): + print('SortApp main()') + sortApp = SortApp() + sortApp.main() + + +main() + diff --git a/src/sortapp/storagehub/__init__.py b/src/sortapp/storagehub/__init__.py new file mode 100644 index 0000000..f8d2b9f --- /dev/null +++ b/src/sortapp/storagehub/__init__.py @@ -0,0 +1 @@ +print("sortapp/storagehub init") \ No newline at end of file diff --git a/src/sortapp/storagehub/storagehubcommand.py b/src/sortapp/storagehub/storagehubcommand.py new file mode 100644 index 0000000..22aaf8a --- /dev/null +++ b/src/sortapp/storagehub/storagehubcommand.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# @author: Giancarlo Panichi +# +# Created on 2018/06/15 +# + +class StorageHubCommand: + def execute(self): + print("StorageHubCommand") + def __str__(self): + return 'StorageHubCommand' + \ No newline at end of file diff --git a/src/sortapp/storagehub/storagehubcommanditemdownload.py b/src/sortapp/storagehub/storagehubcommanditemdownload.py new file mode 100644 index 0000000..1ae09b8 --- /dev/null +++ b/src/sortapp/storagehub/storagehubcommanditemdownload.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# @author: Giancarlo Panichi +# +# Created on 2018/06/15 +# +import requests +from .storagehubcommand import StorageHubCommand + + +class StorageHubCommandItemDownload(StorageHubCommand): + + def __init__(self, gcubeToken, storageHubUrl, itemId, destinationFile): + self.gcubeToken = gcubeToken + self.storageHubUrl = storageHubUrl + self.itemId = itemId + self.destinationFile = destinationFile + + def execute(self): + print("Execute StorageHubCommandItemDownload") + print(self.storageHubUrl + "/items/" + self.itemId + "/download?"); + + urlString = self.storageHubUrl + "/items/" + self.itemId + "/download?gcube-token=" + self.gcubeToken + r = requests.get(urlString) + print(r.status_code) + if r.status_code != 200: + print("Error in execute StorageHubCommandItemDownload: " + r.status_code) + raise Exception("Error in execute StorageHubCommandItemDownload: " + r.status_code) + with open(self.destinationFile, 'w') as file: + file.write(r.text) + + def __str__(self): + return ('StorageHubCommandItemDownload[storageHubUrl=' + str(self.storageHubUrl) + + 'itemId=' + self.itemId + + ', destinationFile=' + self.destinationFile + ']') diff --git a/src/sortapp/storagehub/storagehubcommanditemupload.py b/src/sortapp/storagehub/storagehubcommanditemupload.py new file mode 100644 index 0000000..2b8b825 --- /dev/null +++ b/src/sortapp/storagehub/storagehubcommanditemupload.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# @author: Giancarlo Panichi +# +# Created on 2018/06/15 +# +import requests +from .storagehubcommand import StorageHubCommand + + +class StorageHubCommandItemUpload(StorageHubCommand): + + def __init__(self, gcubeToken, storageHubUrl, folderItemId, file, filename, fileDescription): + self.gcubeToken = gcubeToken + self.folderItemId = folderItemId + self.storageHubUrl = storageHubUrl + self.file = file + self.filename = filename + self.fileDescription = fileDescription + + def execute(self): + print("Execute StorageHubCommandItemUpload") + print(self.storageHubUrl + "/items/" + self.folderItemId + "/create/FILE?"); + + filedata = {'name': self.filename, 'description': self.fileDescription, "file": ("file", open(self.file, "rb"))} + + urlString = self.storageHubUrl + "/items/" + self.folderItemId + "/create/FILE?gcube-token=" + self.gcubeToken + r = requests.post(urlString, files=filedata) + print(r) + print(r.status_code) + if r.status_code != 200: + print("Error in execute StorageHubCommandItemUpload: " + r.status_code) + raise Exception("Error in execute StorageHubCommandItemUpload: " + r.status_code) + print(str(r.text)) + return r.text + + def __str__(self): + return ('StorageHubCommandItemUpload[itemId=' + self.folderItemId + + ', storageHubUrl=' + str(self.storageHubUrl) + + ', folderItemId=' + str(self.folderItemId) + + ', filename=' + str(self.filename) + + ', fileDescription=' + str(self.fileDescription) + ']')