rok4 / core-python

Librairies Python génériques du projet ROK4
https://rok4.github.io/core-python/
Other
1 stars 1 forks source link

Example d'utilisation avec un stockage S3 #31

Open sylvainbeo opened 1 year ago

sylvainbeo commented 1 year ago

Bonjour,

J'utilise la librairie ROK4 dans le cadre d'un projet IGN. Jusqu'à présent, les tests ont été fait avec un mode FILE pour accéder aux pyramides ROK4.

Dans le code je définis le TMS

os.environ["ROK4_TMS_DIRECTORY"] = settings.ROK4_TMS_DIRECTORY

et j'initialise le descripteur :

pyramid_descriptor = Pyramid.from_descriptor(settings.ROK4_PYRAMID_DESCRIPTOR)

Aucun soucis, ça marche parfaitement (vu avec @Dolite ).

Je souhaite tester le même code mais avec un pyramide stockée dans un S3. Je me suis créé en local une configuration Minio à partir de https://hub.docker.com/r/rok4/dataset.

docker run -p 9000:9000 -p 9001:9001 rok4/dataset:minio

J'ai généré une key et une secretkey.

Comment dois-je adapter mon code pour aller chercher les infos dans ce stockage ? Est-ce que je dois continuer d'utiliser la fonction from_descriptor ?

J'ai cru voir qu'il fallait éventuellement préciser (?) :

os.environ["GPF_S3_URL"] = xxxx
os.environ["GPF_S3_KEY"] = xxx
os.environ["GPF_S3_SECRETKEY"] = xxxxx

Merci

XavDmz commented 1 year ago

Bonjour sylvainbeo,

En effet, les informations sur le stockages s3 sont fournies à la librairie à l'aide de variables d'environnement. Les variables sont les suivantes:

La fonction from_descriptor est compatible avec ce type de type de stockage. Le chemin du descripteur stocké sur un bucket s3 sera alors de la forme s3://<bucket_name>/<object_name>.

En attendant que la documentation générale de la librairie soit améliorée, la documentation développeur de la classe rok4.Storage fournit des informations supplémentaires sur les différentes formats de stockage supportés.

C'est cette classe Storage seule qui se charge de gérer ces formats, à la demande des autres classes qui n'ont aucune visibilité sur cette information. Le but est bien de minimiser mles adaptations de code en cas de changement de type de stockage.

sylvainbeo commented 1 year ago

@XavDmz Merci pour ces infos.

J'ai paramétré les 3 variables ROK4_S3_URL, ROK4_S3_KEY, ROK4_S3_SECRETKEY.

Quand je fais appel à :

pyramid_descriptor = Pyramid.from_descriptor('s3://pyramids@172.17.0.2:9000/ALTI.json')

# ou bien 

pyramid_descriptor = Pyramid.from_descriptor('s3://pyramids/ALTI.json')

J'ai l'erreur :

rok4.Exceptions.StorageError: Issue occured using a S3 storage : An error occurred (NoSuchBucket) when calling the GetObject operation: The specified bucket does not exist

Comme cité plus haut, j'utilise le docker contenant un minio et des pyramides déjà créées.

image

Le bucket pyramids est bien présent.

(A priori l'accès au S3 se fait bien, car avec des KEY et SECRET_KEY invalides, j'ai le bon message d'erreur).

Je ne suis pas très familier avec le stockage S3. Je suis preneur de toute infos.

Merci

sylvainbeo commented 1 year ago

@XavDmz Re, J'ai l'impression qu'il y a un petit bug dans la classe Storage.py

Le code ne devrait-il pas être :

data = s3_client.get_object(
                    Bucket=tray_name,
                    Key=base_name,
                )['Body'].read()
sylvainbeo commented 1 year ago

Ah mais en fait, je vois que dans la 1.6.0 il n'y a plus ce bug...comment se fait-il que le master l'ait toujours ?

XavDmz commented 1 year ago

Je ne suis pas non plus très familier du stockage s3. Pas encore. Du coup je suis aps sûr que j'aurais pu fournir des informations si l'erreur venait de ce dernier. (Pas rapidement en tout cas.)

Au sujet du bug de la classe Storage, visiblement la branche master est toujours sur la version 1.0.1. Je ne sais plus pourquoi les versions plus récentes ne sont disponibles que sur la branche develop.

sylvainbeo commented 1 year ago

Ok. Merci pour les précisions. Je testais avec la version 14.4. Je suis passé à la version 1.6.0, et ça résoud le bug.

A priori, la connexion se fait bien. J'ai aucune tuile retournée pour le moment, mais je pense que c'est parce que je n'interroge pas encore les bonnes données.

sylvainbeo commented 1 year ago

@XavDmz Je suis arrivé au bout de mon expérimentation avec succès.

A partir du RGEALTI, j'ai pu recréer un pyramide ROK4 sur un serveur S3, et utiliser la lib Python pour l'interroger.

Je pourrais en faire un tutoriel. Est-ce qu'une contribution de ma part serait souhaitable ? Si oui, à quel endroit ?

Merci

XavDmz commented 1 year ago

Désolé pour le délai, j'étais absent.

@XavDmz Je suis arrivé au bout de mon expérimentation avec succès.

A partir du RGEALTI, j'ai pu recréer un pyramide ROK4 sur un serveur S3, et utiliser la lib Python pour l'interroger.

C'est une bonne nouvelle.

Je pourrais en faire un tutoriel. Est-ce qu'une contribution de ma part serait souhaitable ?

Je pense que les contributions sont bienvenue, et que le projet est ouvert dans cet esprit.

Si oui, à quel endroit ?

D'après les infos que j'ai eu en interne, ce serait au format markdown au sein du projet rok4/rok4.github.io. Il faudrait y ajouter une section dédiée pour les tutoriels et exemples de bout en bout. J'en déduit qu'il faudrait au moins une page docs/tutorials.md, elle même référencée dans docs/index.md Par contre je suis pas sûr qu'une telle page dédiée. Peut-être ajouter un dossier dépendant docs/tutorials/ avec un fichier markdown par tutoriel ou lot de tutoriels serait plus lisible à long terme ?

@rok4/rok4-ign-team Comment voyez vous le format ? Je pourrais créer la structure une fois qu'elle sera définie.