# VPNaaS Neutron to Sprut Инструмент для миграции VPNaaS (IPsec site-to-site) с Neutron-роутера OpenStack на «продвинутый» роутер (DC Router) в SDN **Sprut**. Каждый Neutron-роутер из входного CSV сопоставлен с advanced-роутером в Sprut. Переносятся все IPsec-туннели, IKE/IPsec policy и endpoint groups, связанные с этим Neutron-роутером; объекты других роутеров того же OpenStack-проекта не затрагиваются. ## Режимы запуска ### 1. Полный прогон (аудит + настройка Sprut) ```bash python3 -m ipsec_migrator [output.json] [--dry-run] ``` Выполняет всё последовательно: аудит конфигурации Neutron (STAGE 1) → сбор существующих объектов в Sprut (STAGE 2) → создание недостающих объектов и site connection'ов (STAGE 3–4). `output.json` необязателен, по умолчанию — `vpnaas_audit_.json` в текущей директории. ### 2. Только аудит (без обращений к Sprut на запись) ```bash python3 -m ipsec_migrator --audit-only [output.json] ``` Выполняет только STAGE 1: проверяет, что Neutron- и advanced-роутеры существуют, собирает полную конфигурацию VPNaaS из Neutron и пишет её в JSON-файл. STAGE 2–4 (создание объектов в Sprut) не запускаются — скрипт завершается сразу после записи аудита. ### 3. Dry-run по ранее собранному аудиту ```bash python3 -m ipsec_migrator --from-audit --dry-run ``` Пропускает повторный опрос OpenStack: все данные (IKE/IPsec policy, endpoint groups, VPN service, site connections) берутся из ранее сохранённого `audit.json`. Заново получает Keystone-токен и перепроверяет, что advanced-роутеры из аудита всё ещё существуют в Sprut (аудит мог быть сделан заранее). Дальше выполняются STAGE 2–4 в режиме симуляции: `GET`-запросы к Sprut выполняются по-настоящему (для сверки, что уже существует), но ни один объект не создаётся — вместо `POST` в лог пишется, что было бы отправлено (с маскированным PSK). ### 4. Реальная настройка продвинутого роутера по аудиту ```bash python3 -m ipsec_migrator --from-audit ``` **Рекомендуемый порядок для боевого прогона:** `--audit-only` → ревью получившегося `audit.json` → `--from-audit` (без `--dry-run`). Так реальное создание объектов в Sprut — отдельный, осознанный шаг после проверки того, что именно будет создано. ### Авто-создание целевого (advanced) роутера Если `advanced_router_id` пуст, порт сам создаёт DC Router в Sprut. В `input.csv` для порта вторая колонка (`advanced_router_id`) может быть пустой: ``` neutron_router_id1,advanced_router_id1 neutron_router_id2,,MS1,standard neutron_router_id3 ```