* fix(template) : Change `Ethernet3`configuration * fix(Template): Missing Underlay configuration * Fix(template) : error 'ipam.models.ip.IPAddress DoesNotExist * fix(routing) : ! IP routing not enabled * fix(leaves template): adding ip routing and multi-agent model
117 lines
4.0 KiB
Python
117 lines
4.0 KiB
Python
"""
|
|
Script principal pour la création de fabric VXLAN dans NetBox
|
|
"""
|
|
|
|
import sys
|
|
import getpass
|
|
import logging
|
|
from typing import Dict
|
|
|
|
from config import FabricConfig
|
|
from exceptions import FabricError
|
|
from fabric_creator import VXLANFabricCreator
|
|
from helpers.netbox_backend import NetBoxBackend
|
|
|
|
# Configuration du logging
|
|
logging.basicConfig(
|
|
level=logging.DEBUG,
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def get_user_input() -> Dict:
|
|
"""
|
|
Récupère les entrées utilisateur pour la configuration de la fabric
|
|
|
|
Returns:
|
|
Dict: Dictionnaire contenant les paramètres de configuration
|
|
|
|
Raises:
|
|
FabricError: Si les entrées sont invalides
|
|
"""
|
|
try:
|
|
return {
|
|
'netbox_url': input("NetBox URL: ").strip(),
|
|
'netbox_token': getpass.getpass("NetBox API Token: "),
|
|
'num_buildings': int(input("Number of buildings (1-5): ").strip()),
|
|
'spine_type_slug': input("Spine device type slug: ").strip(),
|
|
'leaf_type_slug': input("Leaf device type slug: ").strip(),
|
|
'access_type_slug': input("Access switch device type slug: ").strip(),
|
|
}
|
|
except ValueError as error:
|
|
raise FabricError(f"Invalid input: {str(error)}")
|
|
|
|
def validate_input(fabric_config: Dict) -> None:
|
|
"""
|
|
Valide les entrées utilisateur pour la configuration de la fabric
|
|
|
|
Args:
|
|
fabric_config: Dictionnaire contenant les paramètres de configuration
|
|
|
|
Raises:
|
|
FabricError: Si la validation échoue
|
|
"""
|
|
# Validation des paramètres de connexion NetBox
|
|
if not all([fabric_config['netbox_url'], fabric_config['netbox_token']]):
|
|
raise FabricError("NetBox URL and token are required")
|
|
|
|
# Validation du nombre de bâtiments
|
|
if not 1 <= fabric_config['num_buildings'] <= 5:
|
|
raise FabricError("Number of buildings must be between 1 and 5")
|
|
|
|
# Validation des types d'équipements
|
|
required_device_types = [
|
|
fabric_config['spine_type_slug'],
|
|
fabric_config['leaf_type_slug'],
|
|
fabric_config['access_type_slug']
|
|
]
|
|
if not all(required_device_types):
|
|
raise FabricError("All device type slugs are required")
|
|
|
|
def main():
|
|
"""Point d'entrée principal du script"""
|
|
try:
|
|
# 1. Récupération des entrées utilisateur
|
|
fabric_config = get_user_input()
|
|
validate_input(fabric_config)
|
|
|
|
# 2. Initialisation de la connexion NetBox
|
|
netbox_backend = NetBoxBackend(
|
|
fabric_config['netbox_url'],
|
|
fabric_config['netbox_token']
|
|
)
|
|
|
|
if not netbox_backend.check_connection():
|
|
raise FabricError("Failed to connect to NetBox")
|
|
|
|
# 3. Configuration de la fabric
|
|
fabric_settings = FabricConfig(
|
|
site_code="", # Sera défini plus tard
|
|
num_buildings=fabric_config['num_buildings'],
|
|
spine_type=fabric_config['spine_type_slug'],
|
|
leaf_type=fabric_config['leaf_type_slug'],
|
|
access_type=fabric_config['access_type_slug']
|
|
)
|
|
|
|
# 4. Création de la fabric
|
|
fabric_creator = VXLANFabricCreator(netbox_backend)
|
|
fabric_creator.config = fabric_settings
|
|
fabric_result = fabric_creator.create_fabric()
|
|
|
|
# 5. Affichage du résultat
|
|
logger.info("=== Fabric Creation Completed ===")
|
|
logger.info(f"Site: {fabric_result['site'].name}")
|
|
logger.info("Spines: %s", [spine.name for spine in fabric_result['spines']])
|
|
logger.info("Leaves: %s", [leaf.name for leaf in fabric_result['leaves']])
|
|
logger.info("Access Switches: %s",
|
|
[access.name for access in fabric_result['access_switches']])
|
|
|
|
except FabricError as fabric_error:
|
|
logger.error("Fabric creation error: %s", str(fabric_error))
|
|
sys.exit(1)
|
|
except Exception as unexpected_error:
|
|
logger.error("Unexpected error: %s", str(unexpected_error))
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main() |