Commit 0f50cbcc authored by Jonathan Schaeffer's avatar Jonathan Schaeffer
Browse files

PAssage à setup.py et Click

parent 8751fb64
# resif data reporter
Cet outil collecte sur un ou plusieurs espaces disques en structure SDS l'espace occupé par les réseaux sismo.
## À propos
- licence : Ce projet est livré sous licence GPLv3 ou plus
- auteur : Jonathan Schaeffer <jonathan.schaeffer@univ-grenoble-alpes.fr>
### Collecte des volumes
Les données sont dans un ou plusieurs dossier(s) contenant un sous-dossier par année et pour chaque année, un dossier par réseau.
Dans le rapport final, on souhaite distinguer les réseaux permanents des expériences temporaires.
La représentation des mesures dans influxdb aura la structure suivante :
Les données collectées sont écrites en YAML dans un fichier cache.
Les données sont ensuite écrites dans une base postgres ou influxdb.
## Configuration
Le script de collecte a besoin d'un fichier de configuration. Le fichier `config.yml.example` fournit toute la documentation nécessaire pour un paramétrage initial.
Par défaut, le script collecte les données (en faisant des `du`), les compile et les écrit dans le fichier `data.yaml`.
Si les données contenues dans `data.json` ne sont pas plus anciennes que ce que spécifie la configuration `data_cache_ttl` (en jour), alors le script scanne le fichier data.json pour le restituer et n'effectue pas le scan des volumes.
### Postgres
Quelle config sur le serveur postgres ? Quelle base et quelles tables créer ?
### Influxdb
Mêmes questions.
## Tester
### Lancer des tests unitaires
```shell
pip install -e .
pytest
```
### Lancer un docker postgres
```shell
docker pull postgres
docker run --name pg -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword -d postgres
```
### Lancer un docker pour influxdb
## Configuration
Un fichier de Configuration pour les tests :
``` yaml
volumes:
- path: /tmp/pytest-of-schaeffj/pytest-22/validated/
type: validated
- path: /tmp/pytest-of-schaeffj/pytest-22/bud
type: bud
postgres:
host: localhost
database: stats
port: 5432
user: postgres
password: mysecretpassword
influxdb:
measurement: resifstats
server: localhost
port: 8086
ssl: True
verify_ssl: False
user: user
password: secret
database: sandbox
metadata: # Information about the gathered data. Used to tag the timeserie values
permanent_networks: # List all permanent networks here. Otherwise, they will be considered as temporary
- CL
- GL
- MQ
- ND
- PF
- RD
- FR
- G
- RA
- WI
```
## Tester le programme complet :
python resif_data_reporter.py --config config.yml
#+Title: RESIF data reporter
Cet outil collecte sur un ou plusieurs espaces disques en structure SDS l'espace occupé par les réseaux sismo.
* À propos
- licence : Ce projet est livré sous licence GPLv3 ou plus
- auteur : Jonathan Schaeffer <jonathan.schaeffer@univ-grenoble-alpes.fr>
** Collecte des volumes
Les données sont dans un ou plusieurs dossier(s) contenant un sous-dossier par année et pour chaque année, un dossier par réseau.
Dans le rapport final, on souhaite distinguer les réseaux permanents des expériences temporaires.
La représentation des mesures dans influxdb aura la structure suivante :
#+BEGIN_EXAMPLE json
#+END_EXAMPLE
Les données collectées sont écrites en YAML dans un fichier cache.
Les données sont ensuite écrites dans une base postgres ou influxdb.
* Configuration
Le script de collecte a besoin d'un fichier de configuration. Le fichier =config.yml.example= fournit toute la documentation nécessaire pour un paramétrage initial.
Par défaut, le script collecte les données (en faisant des =du=), les compile et les écrit dans le fichier =data.yaml=.
Si les données contenues dans =data.json= ne sont pas plus anciennes que ce que spécifie la configuration =data_cache_ttl= (en jour), alors le script scanne le fichier data.json pour le restituer et n'effectue pas le scan des volumes.
** Postgres
Quelle config sur le serveur postgres ? Quelle base et quelles tables créer ?
** Influxdb
Mêmes questions.
* Tester
** Lancer des tests unitaires
: pytest
** Lancer un docker postgres
: docker pull postgres
: docker run --name pg -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword -d postgres
** Lancer un docker pour influxdb
** Configuration
Un fichier de Configuration pour les tests :
#+BEGIN_EXAMPLE yaml
volumes:
- path: /tmp/pytest-of-schaeffj/pytest-22/validated/
type: validated
- path: /tmp/pytest-of-schaeffj/pytest-22/bud
type: bud
postgres:
host: localhost
database: stats
port: 5432
user: postgres
password: mysecretpassword
influxdb:
measurement: resifstats
server: localhost
port: 8086
ssl: True
verify_ssl: False
user: user
password: secret
database: sandbox
metadata: # Information about the gathered data. Used to tag the timeserie values
permanent_networks: # List all permanent networks here. Otherwise, they will be considered as temporary
- CL
- GL
- MQ
- ND
- PF
- RD
- FR
- G
- RA
- WI
#+END_EXAMPLE
** Tester le programme complet :
: python resif_data_reporter.py --config config.yml
......@@ -4,7 +4,7 @@ idna==2.7
influxdb==5.2.0
python-dateutil==2.7.5
pytz==2018.7
PyYAML==3.13
PyYAML==5.1
requests==2.20.1
six==1.11.0
urllib3==1.24.1
......
#!/bin/env python2
# -*- coding: utf-8 -*-
import argparse
import logging.config
import os
import subprocess
......@@ -12,6 +11,7 @@ from pprint import pprint, pformat
import datetime
import psycopg2
from psycopg2.extras import execute_values
import click
logger = logging.getLogger(__name__)
......@@ -81,24 +81,21 @@ def scan_volumes(volumes):
return [ x for vol in volume_stats for x in vol ]
def main():
# Hardcoded list of possible configurations paths
paths = [f"{os.path.dirname(os.path.realpath(__file__))}/config.yml", "~/config/resif_data_reporter/config.yml", "/etc/resif_data_reporter/config.yml"]
parser = argparse.ArgumentParser(description="Scan volumes and get data statistics. Send data to postgres. Full documentation : https://gricad-gitlab.univ-grenoble-alpes.fr/OSUG/RESIF/validated_data_reporter")
parser.add_argument("--config", required=True, type=open, help=f"configuration file. Mandatory. See README for configuration exemples.")
args = parser.parse_args()
@click.command()
@click.option('--config-file', 'configfile', type=click.Path(), help='Configuration file path', envvar='CONFIG_FILE', show_default=True, default=f"{os.path.dirname(os.path.realpath(__file__))}/config.yml")
def cli(configfile):
try:
cfg = yaml.load(args.config)
cfg = yaml.load(configfile, Loader=yaml.CLoader)
except Error as e:
print(f"Error reading file args.config")
print(f"Error reading file {configfile}")
validate_config(cfg)
# At this point we ensure that configuration is sane.
logger_file = cfg['logger_file']
if not logger_file.startswith('/'):
logger_file = os.path.dirname(os.path.realpath(args.config.name))+'/'+logger_file
logger_file = os.path.dirname(os.path.realpath(configfile))+'/'+logger_file
logging.config.fileConfig(logger_file)
logger = logging.getLogger("resif_data_reporter")
logger.info("Starting")
......@@ -110,7 +107,7 @@ def main():
cache_file = cfg['cache_file']
try:
if not cache_file.startswith('/'):
cache_file = os.path.dirname(os.path.realpath(args.config.name))+'/'+cache_file
cache_file = os.path.dirname(os.path.realpath(configfile))+'/'+cache_file
with open(cache_file, 'r') as ymlfile:
cache = yaml.load(ymlfile)
# Compare volumes in cfg and in cache
......
from io import open
from setuptools import setup, find_packages
with open('resifdatareporter/__init__.py', 'r') as f:
for line in f:
if line.startswith('__version__'):
version = line.strip().split('=')[1].strip(' \'"')
break
else:
version = '0.0.1'
with open('README.md', 'r', encoding='utf-8') as f:
readme = f.read()
setup(
name='resifdatareporter',
version=version,
description='Scans the resif data repository and compute metrics. Sends the result in influxdb or postgres',
long_description=readme,
long_description_content_type="text/markdown",
author='Jonathan Schaeffer',
author_email='jonathan.schaeffer@univ-grenoble-alpes.fr',
maintainer='Jonathan Schaeffer',
maintainer_email='jonathan.schaeffer@univ-grenoble-alpes.fr',
url='https://gricad-gitlab.univ-grenoble-alpes.fr/OSUG/RESIF/resif_data_reporter',
license='GPL-3.0',
packages=find_packages(),
install_requires=[
'Click==7.0',
'python-dateutil==2.7.5',
'PyYAML==5.1',
'psycopg2-binary==2.7.6.1',
'influxdb==5.2.1',
],
keywords=[
'',
],
classifiers=[
'Development Status :: 4 - Beta',
'Intended Audience :: Developers',
'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',
'Natural Language :: English',
'Operating System :: OS Independent',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
],
tests_require=['coverage', 'pytest'],
entry_points='''
[console_scripts]
resifdatareporter=resifdatareporter.resifdatareporter:cli
'''
)
import pytest
from random import getrandbits
import subprocess
from resif_data_reporter import *
from resifdatareporter import resifdatareporter
import yaml
with open('config.yml.example', 'r') as ymlfile:
cfg = yaml.load(ymlfile)
cfg = yaml.load(ymlfile, Loader=yaml.CLoader)
document="""
volumes:
......@@ -31,8 +32,8 @@ def sds(tmpdir_factory):
def test_scan_volume(sds):
print(sds)
rd = scan_volume(sds+"/bud")
pprint(rd)
rd = resifdatareporter.scan_volume(sds+"/bud")
print(rd)
assert len(rd) > 0
# on pourrait faire des asserts plus compliqués mais bon ...
......@@ -44,7 +45,7 @@ volumes:
- path: %s/bud
type: bud
"""%(sds,sds)
volumes = yaml.load(volumes_desc)
data = scan_volumes(volumes['volumes'])
volumes = yaml.load(volumes_desc, Loader=yaml.CLoader)
data = resifdatareporter.scan_volumes(volumes['volumes'])
assert len(data) > 2
assert 'type' in data[0]
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment