Module demo_api.scripts.generate_data

Script utilitaire pour générer des données factices avec Faker. Permet de générer des utilisateurs et VMs réalistes pour les tests et démonstrations.

Functions

def main()
Expand source code
def main():
    """Point d'entrée principal"""

    # Gérer -h comme alias pour --help
    if "-h" in sys.argv and "--help" not in sys.argv:
        sys.argv[sys.argv.index("-h")] = "--help"

    try:
        app()
    except KeyboardInterrupt:
        typer.echo("\n⚠️  Génération interrompue")
    except Exception as e:
        typer.echo(f"❌ Erreur: {e}")
        raise typer.Exit(1)

Point d'entrée principal

def preview(user_count: int = <typer.models.OptionInfo object>,
max_vms: int = <typer.models.OptionInfo object>) ‑> None
Expand source code
@app.command()
def preview(
    user_count: int = typer.Option(
        5, "--users", "-u", help="Nombre d'utilisateurs à prévisualiser", min=1, max=20
    ),
    max_vms: int = typer.Option(
        3, "--max-vms", help="Nombre maximum de VMs par utilisateur", min=0, max=10
    ),
) -> None:
    """
    👀 Prévisualiser les données générées sans les sauvegarder

    Affiche un aperçu des données qui seraient générées.

    Exemples:

    .. code-block:: shell
        python generate_data.py preview
        python generate_data.py preview --users 10 --max-vms 2
    """
    typer.echo(
        f"👀 Prévisualisation de {user_count} utilisateurs avec 0-{max_vms} VMs chacun..."
    )

    try:
        # Générer les données pour prévisualisation
        users_data = DataGenerator.generate_users_with_vms(
            user_count=user_count, vm_per_user_range=(0, max_vms)
        )

        typer.echo(f"\n📋 Aperçu des données générées:")
        typer.echo("=" * 60)

        for i, user in enumerate(users_data, 1):
            typer.echo(f"\n👤 Utilisateur {i}:")
            typer.echo(f"   • Nom: {user['name']}")
            typer.echo(f"   • Email: {user['email']}")
            typer.echo(f"   • Créé le: {user['created_at']}")
            typer.echo(f"   • VMs: {len(user['vms'])}")

            if user["vms"]:
                typer.echo(f"   🖥️ VMs:")
                for j, vm in enumerate(user["vms"], 1):
                    typer.echo(f"      {j}. {vm['name']} ({vm['operating_system']})")
                    typer.echo(
                        f"         CPU: {vm['cpu_cores']} cœurs, RAM: {vm['ram_gb']}GB, Disque: {vm['disk_gb']}GB"
                    )
                    typer.echo(f"         Statut: {vm['status']}")

        total_vms = sum(len(user["vms"]) for user in users_data)
        typer.echo(f"\n📊 Résumé:")
        typer.echo(f"   • Utilisateurs: {len(users_data)}")
        typer.echo(f"   • VMs totales: {total_vms}")
        typer.echo(f"   • Moyenne VMs/utilisateur: {total_vms / len(users_data):.1f}")

    except Exception as e:
        logger.error("Erreur lors de la prévisualisation", error=str(e))
        typer.echo(f"❌ Erreur lors de la prévisualisation: {e}")
        raise typer.Exit(1)

👀 Prévisualiser les données générées sans les sauvegarder

Affiche un aperçu des données qui seraient générées.

Exemples:

.. code-block:: shell python generate_data.py preview python generate_data.py preview –users 10 –max-vms 2

def users_with_vms(user_count: int = <typer.models.OptionInfo object>,
min_vms: int = <typer.models.OptionInfo object>,
max_vms: int = <typer.models.OptionInfo object>,
output_file: str = <typer.models.OptionInfo object>,
verbose: bool = <typer.models.OptionInfo object>) ‑> None
Expand source code
@app.command()
def users_with_vms(
    user_count: int = typer.Option(
        50, "--users", "-u", help="Nombre d'utilisateurs à générer", min=1, max=1000
    ),
    min_vms: int = typer.Option(
        0, "--min-vms", help="Nombre minimum de VMs par utilisateur", min=0, max=10
    ),
    max_vms: int = typer.Option(
        5, "--max-vms", help="Nombre maximum de VMs par utilisateur", min=0, max=20
    ),
    output_file: str = typer.Option(
        "vm_users.json", "--output", "-o", help="Fichier de sortie JSON"
    ),
    verbose: bool = typer.Option(False, "--verbose", "-v", help="Mode verbeux"),
) -> None:
    """
    🎯 Générer des utilisateurs avec leurs VMs

    Génère un dataset complet d'utilisateurs français avec des VMs réalistes.
    Les données sont sauvegardées dans un fichier JSON.

    Exemples:

    .. code-block:: shell

        python generate_data.py users-with-vms
        python generate_data.py users-with-vms --users 100 --max-vms 3
        python generate_data.py users-with-vms -u 25 -o mon_dataset.json --verbose
    """
    if min_vms > max_vms:
        typer.echo("❌ Le nombre minimum de VMs ne peut pas être supérieur au maximum")
        raise typer.Exit(1)

    typer.echo(
        f"🎲 Génération de {user_count} utilisateurs avec {min_vms}-{max_vms} VMs chacun..."
    )

    try:
        # Générer les données
        users_data = DataGenerator.generate_users_with_vms(
            user_count=user_count, vm_per_user_range=(min_vms, max_vms)
        )

        # Sauvegarder dans le fichier JSON
        output_path = Path(output_file)
        with open(output_path, "w", encoding="utf-8") as f:
            json.dump(users_data, f, indent=4, ensure_ascii=False, default=str)

        # Statistiques
        total_vms = sum(len(user["vms"]) for user in users_data)
        users_with_vms_count = len([u for u in users_data if u["vms"]])

        typer.echo(f"✅ Données générées avec succès !")
        typer.echo(f"📊 Statistiques:")
        typer.echo(f"   • Utilisateurs: {len(users_data)}")
        typer.echo(f"   • VMs totales: {total_vms}")
        typer.echo(f"   • Utilisateurs avec VMs: {users_with_vms_count}")
        typer.echo(f"   • Moyenne VMs/utilisateur: {total_vms / len(users_data):.1f}")
        typer.echo(f"📁 Fichier sauvegardé: {output_path.absolute()}")

        if verbose:
            typer.echo("\n🔍 Aperçu des données générées:")
            for i, user in enumerate(users_data[:3]):
                typer.echo(
                    f"   {i + 1}. {user['name']} ({user['email']}) - {len(user['vms'])} VMs"
                )
            if len(users_data) > 3:
                typer.echo(f"   ... et {len(users_data) - 3} autres utilisateurs")

    except Exception as e:
        logger.error("Erreur lors de la génération des données", error=str(e))
        typer.echo(f"❌ Erreur lors de la génération: {e}")
        raise typer.Exit(1)

🎯 Générer des utilisateurs avec leurs VMs

Génère un dataset complet d'utilisateurs français avec des VMs réalistes. Les données sont sauvegardées dans un fichier JSON.

Exemples:

.. code-block:: shell

python generate_data.py users-with-vms
python generate_data.py users-with-vms --users 100 --max-vms 3
python generate_data.py users-with-vms -u 25 -o mon_dataset.json --verbose
def version() ‑> None
Expand source code
@app.command()
def version() -> None:
    """📋 Afficher la version du générateur"""
    typer.echo("generate-data v1.0.0")
    typer.echo("Powered by Faker 🎲")

📋 Afficher la version du générateur

def vms_only(vm_count: int = <typer.models.OptionInfo object>,
user_ids: str = <typer.models.OptionInfo object>,
output_file: str = <typer.models.OptionInfo object>,
verbose: bool = <typer.models.OptionInfo object>) ‑> None
Expand source code
@app.command()
def vms_only(
    vm_count: int = typer.Option(
        100, "--vms", "-v", help="Nombre de VMs à générer", min=1, max=5000
    ),
    user_ids: str = typer.Option(
        "1,2,3,4,5",
        "--user-ids",
        "-u",
        help="IDs des utilisateurs (séparés par des virgules)",
    ),
    output_file: str = typer.Option(
        "vms_only.json", "--output", "-o", help="Fichier de sortie JSON"
    ),
    verbose: bool = typer.Option(False, "--verbose", "-v", help="Mode verbeux"),
) -> None:
    """
    🖥️ Générer uniquement des VMs pour des utilisateurs existants

    Génère des VMs réalistes et les associe à des utilisateurs existants.

    Exemples:

    .. code-block:: shell

        python generate_data.py vms-only
        python generate_data.py vms-only --vms 200 --user-ids "1,2,3,4,5,6,7,8,9,10"
        python generate_data.py vms-only -v 50 -u "1,2,3" -o mes_vms.json
    """
    try:
        # Parser les IDs des utilisateurs
        user_ids_list = [int(uid.strip()) for uid in user_ids.split(",") if uid.strip()]

        if not user_ids_list:
            typer.echo("❌ Aucun ID d'utilisateur valide fourni")
            raise typer.Exit(1)

        typer.echo(
            f"🖥️ Génération de {vm_count} VMs pour les utilisateurs {user_ids_list}..."
        )

        # Générer les VMs
        vms_data = DataGenerator.generate_vms_only(vm_count, user_ids_list)

        # Sauvegarder dans le fichier JSON
        output_path = Path(output_file)
        with open(output_path, "w", encoding="utf-8") as f:
            json.dump(vms_data, f, indent=4, ensure_ascii=False, default=str)

        # Statistiques par utilisateur
        user_vm_counts: dict[int, int] = {}
        for vm in vms_data:
            user_id = vm["user_id"]
            user_vm_counts[user_id] = user_vm_counts.get(user_id, 0) + 1

        typer.echo(f"✅ VMs générées avec succès !")
        typer.echo(f"📊 Statistiques:")
        typer.echo(f"   • VMs totales: {len(vms_data)}")
        typer.echo(f"   • Utilisateurs concernés: {len(user_vm_counts)}")
        typer.echo(f"📁 Fichier sauvegardé: {output_path.absolute()}")

        if verbose:
            typer.echo("\n🔍 Répartition par utilisateur:")
            for user_id, count in sorted(user_vm_counts.items()):
                typer.echo(f"   • Utilisateur {user_id}: {count} VMs")

    except ValueError as e:
        typer.echo(f"❌ Erreur dans les IDs d'utilisateurs: {e}")
        raise typer.Exit(1)
    except Exception as e:
        logger.error("Erreur lors de la génération des VMs", error=str(e))
        typer.echo(f"❌ Erreur lors de la génération: {e}")
        raise typer.Exit(1)

🖥️ Générer uniquement des VMs pour des utilisateurs existants

Génère des VMs réalistes et les associe à des utilisateurs existants.

Exemples:

.. code-block:: shell

python generate_data.py vms-only
python generate_data.py vms-only --vms 200 --user-ids "1,2,3,4,5,6,7,8,9,10"
python generate_data.py vms-only -v 50 -u "1,2,3" -o mes_vms.json