Plugin OpenStack pour waldur-site-agent permettant la synchronisation en temps réel des utilisateurs entre Waldur et OpenStack Keystone.
- ✅ Synchronisation temps réel : Événements STOMP pour synchronisation instantanée
- ✅ Gestion des utilisateurs : Création automatique des utilisateurs OpenStack
- ✅ Attribution des rôles : Assignation automatique des rôles dans les projets
- ✅ Gestion des projets : Création/suppression de projets OpenStack
- ✅ Production-ready : Déploiement Kubernetes/k3s avec secrets management
- ✅ Retry automatique : Gestion des échecs avec exponential backoff
- Python 3.9+
- OpenStack avec Keystone API v3
- waldur-site-agent >= 0.7.0
- Accès admin à OpenStack Keystone
- (Optionnel) Cluster Kubernetes ou k3s pour le déploiement
┌─────────────────────────────────────────────────────────────┐
│ WALDUR CORE │
│ (Interface web + API + STOMP broker) │
└────────────────────────┬────────────────────────────────────┘
│ Événements STOMP:
│ - offering_user_added
│ - offering_user_removed
│ - resource_created
│ - resource_terminated
┌────────────▼────────────┐
│ waldur-site-agent │
│ Mode: event-process │ ← UN agent par site
│ │
│ Lit: config.yaml │
│ Traite: TOUS offerings │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ OpenStackBackend │
│ (Notre plugin) │
│ │
│ - add_users_to_resource │
│ - remove_users_... │
│ - create_resource │
│ - delete_resource │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ KeystoneClient │
│ (python-keystoneclient) │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ OpenStack Keystone │
│ (API v3) │
└──────────────────────────┘
- UN agent par site : L'agent tourne en un seul mode à la fois
- Configuration centralisée : Fichier
waldur-site-agent-config.yaml - Backend reçoit
backend_settings: Pas de variables d'environnement directes - Event processing : Synchronisation temps réel via STOMP
# Cloner le dépôt du plugin
git clone <repository-url>
cd owsa-agent
# Créer un environnement virtuel (recommandé)
uv venv
source .venv/bin/activate # ou: .venv\Scripts\activate sur Windows
# Installer le plugin en mode éditable
uv pip install -e .
# Vérifier que le plugin est découvert
python -c "from importlib.metadata import entry_points; \
eps = list(entry_points(group='waldur_site_agent.backends')); \
print([ep.name for ep in eps if ep.name == 'openstack'])"
# Devrait afficher: ['openstack']Pour tester localement, vous aurez besoin de waldur-site-agent:
# Dans le même venv
uv pip install git+https://github.com/waldur/waldur-site-agent.git@mainVoir la section Déploiement Kubernetes.
Créez /etc/waldur-agent/config.yaml (ou utilisez l'exemple dans examples/):
offerings:
- # Connexion Waldur
waldur_api_url: "https://waldur.example.com/api"
waldur_api_token: "${WALDUR_API_TOKEN}" # Depuis variable d'environnement
waldur_offering_uuid: "your-offering-uuid"
# Backend OpenStack
backend_type: "openstack"
# Configuration OpenStack Keystone
backend_settings:
auth_url: "https://keystone.example.com:5000/v3"
username: "admin"
password: "${OPENSTACK_PASSWORD}"
project_name: "admin"
domain_name: "Default"
default_role: "_member_"
create_users_if_not_exist: true
sync_user_emails: true
# Backends par fonction
membership_sync_backend: "openstack"
order_processing_backend: "openstack"
# Configuration STOMP (événements temps réel)
stomp_enabled: true
stomp_host: "waldur.example.com"
stomp_port: 61613
stomp_username: "agent"
stomp_password: "${STOMP_PASSWORD}"export WALDUR_API_TOKEN="your-waldur-api-token"
export OPENSTACK_PASSWORD="your-openstack-admin-password"
export STOMP_PASSWORD="your-stomp-password"waldur-site-agent run --mode event-process --config /etc/waldur-agent/config.yamlL'agent se connecte au broker STOMP et traite les événements en temps réel.
waldur-site-agent run --mode membership-sync --config /etc/waldur-agent/config.yamlUtile pour :
- Backup de sécurité (via cron)
- Synchronisation initiale
- Réconciliation périodique
- Cluster Kubernetes ou k3s
- kubectl configuré
# 1. Builder l'image Docker
cd /home/ahcene/work/owsa-agent
docker build -t waldur-site-agent-openstack:0.1.0 .
# 2. Charger l'image dans k3s
docker save waldur-site-agent-openstack:0.1.0 | sudo k3s ctr images import -
# 3. Créer le namespace
kubectl create namespace waldur-agent
# 4. Créer les secrets
kubectl create secret generic waldur-agent-secrets \
--from-literal=WALDUR_API_TOKEN='your-waldur-token' \
--from-literal=OPENSTACK_PASSWORD='your-openstack-password' \
--from-literal=STOMP_PASSWORD='your-stomp-password' \
-n waldur-agent
# 5. Éditer la ConfigMap avec vos valeurs
vim kubernetes/configmap.yaml
# Remplacer:
# - waldur.example.com → votre Waldur
# - keystone.example.com → votre OpenStack
# - your-openstack-offering-uuid-here → UUID réel
# 6. Appliquer la ConfigMap
kubectl apply -f kubernetes/configmap.yaml
# 7. 🎯 ÉTAPE CRITIQUE : Setup initial (UNE FOIS)
kubectl apply -f kubernetes/setup-job.yaml
kubectl logs -f job/waldur-load-components -n waldur-agent
# Attendre "Complete" avant de continuer
# 8. Déployer l'agent principal
kubectl apply -f kubernetes/deployment.yaml
# 9. Vérifier le déploiement
kubectl get pods -n waldur-agent
kubectl logs -f deployment/waldur-site-agent-openstack -n waldur-agentwaldur-load-components (étape 7) configure l'offering dans Waldur avec les composants définis (cpu, ram, etc.). Il DOIT être exécuté avec succès avant de déployer l'agent.
┌──────────────────────────────────────────┐
│ Namespace: waldur-agent │
│ │
│ ┌────────────────────────────────────┐ │
│ │ Deployment (replicas: 1) │ │
│ │ ┌──────────────────────────────┐ │ │
│ │ │ Pod: waldur-site-agent │ │ │
│ │ │ │ │ │
│ │ │ Mode: event-process │ │ │
│ │ │ Config: /etc/waldur-agent/ │ │ │
│ │ └──────────────────────────────┘ │ │
│ └────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────┐ │
│ │ ConfigMap: waldur-agent-config │ │
│ │ - config.yaml (non-sensible) │ │
│ └────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────┐ │
│ │ Secret: waldur-agent-secrets │ │
│ │ - WALDUR_API_TOKEN │ │
│ │ - OPENSTACK_PASSWORD │ │
│ │ - STOMP_PASSWORD │ │
│ └────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────┐ │
│ │ CronJob (optionnel): backup-sync │ │
│ │ Schedule: "0 * * * *" (1x/heure) │ │
│ └────────────────────────────────────┘ │
└──────────────────────────────────────────┘
Pour la production, utilisez l'une de ces méthodes sécurisées :
# Installer Sealed Secrets
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/controller.yaml
# Sceller un secret
kubectl create secret generic waldur-agent-secrets \
--from-literal=WALDUR_API_TOKEN='...' \
--dry-run=client -o yaml | \
kubeseal -o yaml > sealed-secret.yaml
# Commiter sealed-secret.yaml (il est chiffré!)
git add sealed-secret.yaml
git commit -m "Add sealed secrets"apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: waldur-agent-secrets
namespace: waldur-agent
spec:
refreshInterval: 1h
secretStoreRef:
name: vault-backend
kind: SecretStore
target:
name: waldur-agent-secrets
data:
- secretKey: WALDUR_API_TOKEN
remoteRef:
key: waldur/credentials
property: api_token# Logs en temps réel
kubectl logs -f deployment/waldur-site-agent-openstack -n waldur-agent
# Logs des 100 dernières lignes
kubectl logs --tail=100 deployment/waldur-site-agent-openstack -n waldur-agent
# Logs d'un pod spécifique
kubectl logs waldur-site-agent-openstack-xxx-yyy -n waldur-agent# État des pods
kubectl get pods -n waldur-agent
# Détails du déploiement
kubectl describe deployment waldur-site-agent-openstack -n waldur-agent
# Événements récents
kubectl get events -n waldur-agent --sort-by='.lastTimestamp'# 1. Éditer la ConfigMap
kubectl edit configmap waldur-agent-config -n waldur-agent
# 2. Redémarrer l'agent pour appliquer les changements
kubectl rollout restart deployment waldur-site-agent-openstack -n waldur-agent# Créer le nouveau secret
kubectl create secret generic waldur-agent-secrets \
--from-literal=WALDUR_API_TOKEN='new-token' \
--from-literal=OPENSTACK_PASSWORD='new-password' \
--from-literal=STOMP_PASSWORD='new-stomp-password' \
--dry-run=client -o yaml | kubectl apply -f -
# Redémarrer pour prendre en compte
kubectl rollout restart deployment waldur-site-agent-openstack -n waldur-agent# Accéder au shell du pod
kubectl exec -it deployment/waldur-site-agent-openstack -n waldur-agent -- /bin/bash
# Tester la connectivité OpenStack
kubectl exec -it deployment/waldur-site-agent-openstack -n waldur-agent -- \
openstack --os-auth-url https://keystone.example.com:5000/v3 \
--os-username admin \
--os-password xxx \
project list
# Vérifier la configuration montée
kubectl exec -it deployment/waldur-site-agent-openstack -n waldur-agent -- \
cat /etc/waldur-agent/config.yamlowsa-agent/
├── pyproject.toml # Configuration du package Python
├── README.md # Ce fichier
├── examples/
│ └── waldur-site-agent-config.yaml # Exemple de configuration complète
├── kubernetes/
│ ├── deployment.yaml # Déploiement K8s/k3s
│ ├── configmap.yaml # ConfigMap avec config de l'agent
│ └── secret.yaml # Template pour les secrets
└── waldur_site_agent_openstack/
├── __init__.py # Initialisation du package
├── config.py # Gestion de backend_settings
├── keystone_client.py # Client Keystone API (À FAIRE)
├── backends.py # Implémentation BaseBackend (À FAIRE)
└── utils.py # Utilitaires (retry, validation, etc.)
Les contributions sont les bienvenues !
MIT
Pour des questions ou problèmes :
- Issues GitHub : [Créer une issue]
- Documentation Waldur : https://docs.waldur.com
- Documentation waldur-site-agent : https://github.com/waldur/waldur-site-agent