Aller au contenu

Lancement du Projet ImageValidator

Le second billet sur mon projet de créer avec vous, un outil pour valider les images de machines virtuelles (VM) avant de les déployer sur un cloud. C’est un projet passionnant qui va nous permettre d’utiliser des bibliothèques spécialisées sur la manipulation des images de VM entre autre.

Dans ce billet, je vous explique comment j’ai posé les bases du projet, avec son hébergement sur GitHub. Je vous explique aussi comment j’ai construit la base du code en faisant des choix techniques.

Choix des librairies Python

Pour simplifier l’écriture du code sur la gestion des arguments et options de la CLI, j’ai fait le choix d’utiliser Click. Click est une bibliothèque Python qui permet de créer des applications en ligne de commande de manière simplifiée. Cette bibliothèque permet de définir des commandes, options, et arguments, tout en gérant les erreurs de saisie et en affichant automatiquement l’aide. Voici un exemple de base pour illustrer l’utilisation de Click.

Pour la gestion des logs, je fais appel pour le moment au module logging.

Hébergement du projet sur GitHub

La première étape a consisté à créer un dépôt GitHub pour centraliser tout ce qui touche au projet. Un bon dépôt GitHub permet non seulement de gérer le code, mais aussi de collaborer, documenter et organiser les tâches à accomplir.

1. Création du dépôt

J’ai choisi le nom ImageValidator et ajouté une description simple pour clarifier son objectif (validation de la conformité des images VM pour le cloud).-J’ai également renseigné la section About et ajouté des mots-clés comme Python, cloud, et libguestfs pour augmenter la visibilité du projet.

2. Documentation initiale avec le README.md

Le README.md est l’un des fichiers les plus importants pour tout projet open source. Voici ce que j’ai inclus dans ce fichier pour bien démarrer :

  • Introduction au projet : J’explique pourquoi l’outil est utile et quels problèmes il résout.
  • Prérequis : Une liste des dépendances comme Python, libguestfs, et pyyaml, pour que chaque contributeur puisse rapidement préparer son environnement.
  • Installation : Des instructions pour cloner le dépôt et installer les dépendances.
  • Contributions : Des instructions pour contribuer au projet.
  • Licence : J’ai inclus la licence MIT pour permettre à tout le monde de contribuer au projet.

3. Création de la structure du projet

J’ai commencé par créer la structure de répertoires suivante :

  • CHANGELOG.md
  • LICENSE
  • README.md
  • config.yaml
  • launch_image_validator.py
  • renovate.json
  • requirements.txt
  • setup.py
  • Répertoiresrc/
    • Répertoireimagevalidator
      • init .py
      • config.py
      • imagevm.py
      • log_config.py
      • main.py

Comme vous le remarquez, j’utilise direnv pour gérer l’environnement virtuel Python. Voici le contenu du fichier .envrc :

Terminal window
layout_python3

Un petit coup de :

Terminal window
direnv allow

Et j’ai mon environnement Python prêt à l’emploi.

Pour installer les librairies nécessaires au projet, j’ai utilisé la commande suivante :

Terminal window
pip install click pyyaml setuptools

Pour installer guestfs, j’ai utilisé la commande suivante en installant au préalable KVM sur la machine :

Terminal window
sudo apt install libguestfs-tools libguestfs-dev
pip install http://libguestfs.org/download/python/guestfs-1.40.2.tar.gz

J’ai créé ensuite le fichier requirements.txt avec la commande suivante :

Terminal window
pip freeze >requirements.txt

J’ai vérifié le contenu du fichier requirements.txt auquel j’ai ajouté la dernière version de flake8 pour le Lint du code Python (encore un sujet à détailler) :

click==8.1.7
flake8==7.1.1
guestfs @ http://libguestfs.org/download/python/guestfs-1.40.2.tar.gz#sha256=1822b0921ac85cfcf484faf07b762b86512be93b836108af0f3a4c959f820332
PyYAML==6.0.2
setuptools==75.3.0

Ensuite, j’ai créé le fichier src/main.py qui contient le code de base du script. J’ai également créé le fichier src/config.py qui contient le chargement du fichier de configuration de l’application et log_config.py qui contient la mise en place les logs.

src/main.py
import click
from imagevalidator.config import Config
from imagevalidator.log_config import setup_logging
@click.command()
@click.option("--config", "-c",
default="config.yaml",
help="Path to the config file",
show_default=True)
def main(config):
config = Config(config)
setup_logging(config.get("logging"))
if __name__ == "__main__":
main()
src/imagevalidator/config.py
src/log_config.py
import logging
def setup_logging(logging_config):
log_format = logging_config.get(
"format", "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
log_level = logging_config.get("level", "INFO").upper()
logging.basicConfig(
format=log_format,
level=getattr(logging, log_level, logging.INFO),
datefmt="%Y-%m-%d %H:%M:%S",
)
logging.info("Logging configuré avec succès")

Le fichier de configuration config.yaml est un fichier YAML qui contient les informations nécessaires pour valider les images VM. Voici un exemple de fichier de configuration (non validé) :

clouds:
- name: outscale
region: eu-west-2
user: outscale
# Listes des cloud cible
logging:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
level: INFO
# Listes des tests
tests:
services:
- cloud-init
- sshd

J’ai créé aussi à la racine du projet le fichier setup.py qui contient les instructions pour installer le projet.

from setuptools import setup, find_packages
setup(
name='image-validator',
version='0.1.0',
description='Validate images for cloud',
author='Stéphane ROBERT',
author_email='robert.stephane.28@gmail.com',
url='https://github.com/stephrobert/imagevalidator',
packages=find_packages(exclude=['tests']),
install_requires=[
'click',
'guestfs',
'pyyaml',
],
entry_points={
'console_scripts': [
'imagevalidator=src:main',
],
},
classifiers=[
"Programming Language :: Python :: 3",
"Operating System :: Linux",
],
python_requires='>=3.10',
)

Ce fichier est utilisé pour installer localement le projet avec pip install -e. et packager le projet avec python setup.py sdist bdist_wheel. Enfin, j’ai créé le fichier .gitignore qui contient les fichiers et dossiers que je ne veux pas inclure dans le projet.

4. Mise en place du pipeline CI/CD avec GitHub Actions

Pour garder le code propre et robuste, j’ai configuré un pipeline CI/CD avec GitHub Actions. Cela permet d’automatiser pour le moment la qualité du code à chaque push. Voici comment je l’ai configuré :

name: Lint
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8
- name: Lint with flake8
run: |
flake8 .

J’ai activé l’application Renovate pour automatiser la mise à jour des dépendances. À chaque nouvelle version d’une des dépendances Renovate crée une pull request pour mettre à jour le projet.

5. Création des issues pour organiser les étapes

Les issues sont essentielles pour structurer le travail dès le début. Elles permettent de diviser le projet en tâches claires et d’avoir une vue d’ensemble sur les étapes à venir. Voici des idées d’issues que je pourrais créer pour lancer le projet :

  • Installer et configurer guestfs : Documenter l’installation de cette bibliothèque essentielle pour manipuler les disques de VM avec les étapes pour faciliter la prise en main.
  • Chargement d’une image avec libguestfs : Cette première étape sera le cœur de l’application. Pour optimiser le fonctionnement, nous créerons une classe qui se chargera lors de l’initialisation de l’application de charger l’image qui sera saisi dans la ligne de commande. À la sortie de l’application, il faudra fermer cette image correctement.
  • Rapports de conformité : Il est prévu de générer un rapport de conformité pour chaque image analysée.

6. Création d’un fil de discussion

Pour discuter du projet, j’ai aussi activé le fil de discussion dans ce projet. Nous pouvons, par exemple parler des objectifs principaux du projet ou me proposer de nouvelles fonctionnalités. Sentez-vous libre de le faire.

Vous voulez contribuer ?

Si vous souhaitez contribuer au projet, il suffit de cloner le projet sur votre machine et de suivre les étapes décrites dans le fichier README.md.

Je suis ouvert à toutes les propositions et remarques. Il suffit de se rendre sur le fil de discussions du projet.

Conclusion

Cette première phase de création du projet ImageValidator est essentielle pour poser des bases solides. En créant un dépôt bien structuré, en organisant les issues et en mettant en place une documentation, je pense avoir préparé le terrain pour que le projet puisse grandir et accueillir des contributeurs.