# Semana 5: routing dentro de una red. Se usa dentro del contenedor del curso.
#
#   make           compila dijkstra y dv_sim
#   make test      compila, levanta las tres topologías una tras otra y corre las
#                  pruebas (test_*.py); siempre destruye lo que levantó. Lo que depende
#                  del laboratorio usa lab/ y se salta hasta que lo completen
#   make up-six    levanta el grafo de seis nodos con OSPF (six/six.clab.yml)
#   make up-ospf   levanta la red del laboratorio, sin OSPF (ospf/ospf.clab.yml)
#   make up-areas  levanta la red de tres áreas (areas/areas.clab.yml)
#   make up-range  la misma red, con abr1 resumiendo el área 1
#   make down      destruye las tres topologías y sus redes de Docker
#   make clean     lo anterior, y borra los binarios

CC = gcc
CFLAGS = -Wall -Wextra -std=c17 -O2 -g
PROGRAMS = dijkstra dv_sim
TOPOLOGIES = six ospf areas

.PHONY: all test up-six up-ospf up-areas up-range down clean

all: $(PROGRAMS)

%: %.c
	$(CC) $(CFLAGS) -o $@ $<

test: all
	@status=0; PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -p 'test_*.py' -v || status=$$?; \
	  $(MAKE) --no-print-directory down; exit $$status

up-%:
	cd $* && containerlab deploy -t $*.clab.yml --reconfigure

up-range:
	cd areas && ABR1_CONF=frr-range.conf containerlab deploy -t areas.clab.yml --reconfigure

down:
	@for t in $(TOPOLOGIES); do \
	  (cd $$t && containerlab destroy -t $$t.clab.yml --cleanup >/dev/null 2>&1 || true); \
	  docker network rm redes-w05-$$t >/dev/null 2>&1 || true; \
	done

clean: down
	rm -f $(PROGRAMS)
	rm -rf __pycache__ six/clab-w05-six ospf/clab-w05-ospf areas/clab-w05-areas
