# VLAN Management ## Задачи * Учет VLAN * Выделение свободного VLAN * Provisioning * Визуализация VLAN ## ResourcePool Пул динамически выделяемых ресурсов. * `name` - уникальное имя * `description` - описание * `type` - тип ресурса, возможноые варинты: * `vlan` * `ip` * `is_unique` - выделяемый VLAN ID уникален в пределах пула * `strategy` - стратегия выделения * `first` - первый свободный * `last` - последний свободный * `random` - случайный * `api_code` - код пула для API. Связка (`type`, `api_code`) уникальна * `api_role` - требуемая роль для API Key * `notification_group` - NotificationGroup для уведомлений * `warn_threshold` - Порог в % для уведомления о заполнении. ## VLANFilter Именованный фильтр VLAN: * `name` - уникальное имя * `description` - описание * `include_rules` - набор правил для включения в фильтр * `from_vlan` - начальный vlan * `to_vlan` - конечный vlan * `exclude_rules` - набор правил для включения в фильтр * `from_vlan` - начальный vlan * `to_vlan` - конечный vlan Замечание: * Необходимо реализовать метод .to_str(), преобразовывающий фильтр в общепонятный формат. ## VLANTemplate Шаблон VLAN. * `name` - уникальное имя * `description` - описаниие * `type` - тип: * `global` - глобальный. Все изменения отображаются на всех L2Domain * `l2_domain` - используется в L2Domain * `manual` - ручное применение * vlans - список VLAN * `vlan` - VLAN ID * `name` - Имя * `description` - Описаниие * `profile` - VLAN Profile При изменении VLANTemplate все изменения автоматически применяются ко всем зависимым L2Domain ## L2DomainProfile Групповые настройки `L2Domain` * `name` - уникальное имя * `description` - описание * `workflow` - ссылка на Workflow * `style` - стииль оттображения * `pools` - динамические пулы * `pool` - Ссылка на динамические пулы * `description` - описаниие * `vlan_filter` - ссылка на VLANFilter * `local_filter` - VLANFilter локальных VLAN * `template` - опциональная ссылка на VLANTemplate типа `l2_domain` * `labels` - Метки * `effective_labels` - эффективные метки Замечания: * Пул должеж быть уникален в пределах L2DomainProfile * vlan filter в пределах L2DomainProfile не могут пересекаться * При изменении template он автоматически применяется ко всем зависимым L2Domain ## L2Domain Общее пространство меток. Считается, что L2 пакет может проходить по VLAN внутри L2Domain без переписывания заголовка, * `name` - уникальное имя * `profile` - ссылка на L2DomainProfile * `description` - описание * `state` - ссылка на текущее состояние workflow * `pools` - динамические пулы * `pool` - Ссылка на динамические пулы * `description` - описаниие * `vlan_filter` - ссылка на VLANFilter * `local_filter` - VLANFilter локальных VLAN * `template` - опциональная ссылка на VLANTemplate типа `l2_domain` * `discovery_vlan_profile` - VLANProfile для автоматически создаваемых VLAN в процессе discovery * `labels` - Метки * `effective_labels` - эффективные метки * `remote_system` - ссылка на внешнюю систему * `remote_id` - id внешней системы * `bi_id` Замечания: * Эффективные пулы получаются комбинацией пулов профиля и домена, при этом пулы домена перекрывают пулы профиля * Эффективные шаблоны получаются комбинацией шаблонов профиля и домена, при эттом шаблон домена перекрывает шаблон профиля. * Имя пула должно быть уникально в пределах L2Domain * vlan filter в пределах L2DomainProfile не могут пересекаться * Фильтр для локальных VLAN получается композицией фильтров профиля и домена. При этом exclude rules всегда взаимно перебивают include ## VLANProfile Групповые настройки `VLAN` * `name` - название * `description` - описание * `workflow` - ссылка на Workflow * `style` - стиль отображения * `labels` - Метки * `effective_labels` - эффективные метки ## VLAN * `l2_domain` - ссылка на L2Domain * `vlan` - VLAN ID (тег) * `description` - описание * `name` - имя * `remote_system` - ссылка на внешнюю систему * `remote_id` - id внешней системы * `bi_id` Методы: ``` def get_effective_style(self) -> Optional[Style]: ... ``` ## LocalVLAN Локальные VLAN (существуют только в пределах одного managed object), не учавствуют в discovery и provisionning. Локальные VLAN попадают под диапазон `local_filter` из L2Domain, не должны светиться на nni портах. ## ManagedObject Добавляется опциональное поле: * `l2_domain` - ссылка на L2 domain ## SubInterface Добавляется опциональное поле: * `l2_domain` - ссылка на L2 domain ## Prefix Добавляется опциональное поле: * `vlan` - ссылка на связанный VLAN ## vlan_status Таблица в ClickHouse с историе состояние VLAN. Использует движок Replacing Merge Tree * `date` * `ts` * `managed_object` - bi id managed object * `l2_domain` - bi id l2_domain * `vlan_id` - vlan id * `name` - локальное имя VLAN * `is_local` - признак локального vlan * `pool` - имя пула заполняется во время vlan discovery. ## Inventory hwlimits ## nbi API ### request_vlans Запрос одного или нескольких VLAN из одного или нескольких L2Domain. VLAN создаются только если есть возможность зарезервировать их сразу во всех L2Domain. Возвращаемые VLAN ID для всех доменов совпадают. API Key должен иметь роль `api_role` из пула. Запрос: ```json { "l2_domains": [ {"id": "XXXX"}, {"remote_system": "XXXX", "remote_id": "XXXX"} ], "pool": "api_code", "names": [ {"name": "test"}, {"name": "test2"}, {"name": "test3", "description": "XXX", "profile": "XXXX"} ] } ``` Ответ: ```json { "status": true, "result": [ {"id": "XXXXX", "vlan": 12}, {"id": "XXXXX", "vlan": 13}, {"id": "XXXXX", "vlan": 14}, ] } ``` ## Вопросы * Связь между L2Domain - Неконсистентность трансляций при >1 связи между доменами - link.l2_domains? * Правила трансляциии меток при переходе через границу - 1:1 по линкам и сабам * Интеграция с VPN * Discovery * Расхождение в локальных названиях * Fine-grained access * Multicast * Network Map - множественные раскладки * Вынести приоритеты методов discovery * bioseg ## Общие замечания * Ограничение в 4096 вланов на устройство (`Route Instance`) * Ограничение в 4096 вланов распространяется в том числе на сервисный влан * Минимальная информация для `Provisioning` - требующие соединение *Интерфейсы* (`Interface`) * Для дискавери доступны: * VLAN * Привязка влана к интерфейсу * Два толкования `VLAN` * Как запись в базе устройства * Как `VPN` объединяющий несколько портов на разных устройствах ### Пул ресурсов, Resource Pool (VLAN Pool) Решает задачу учёта и выделения свободных ресурсов. Должны быть глобальны (создаются на систему) и привязываются к соответствующему ресурсу. * Имя пула * Ресурс * Политика выделения ресурсов: * В порядке возрастания * В порядке убывания * В случайном порядке * Назначение: Пользовательские, Управления, Мультикаст * Права для пользователя (группы) Привязка пользователя/группы позволит делегировать выдачу ресурса оператору. Возможно, стоит добавить в пул (`Resource Pool`) настройку `Global` либо завести для этого отдельный пул. Ресурсы, добавленные в этот пул будут зарезервированы для всех пулов в системе. В случае вланов это позволит зарезервировать `Multicast` вланы ### L2 Domain * Может быть назначен устройству и сабинтерфейсу, назначение сабинтерфейсу переопределяет тот, который на устройстве * `local_filter` не требуется * Доступны в `L2 Domain` вланы (`VLAN`) определяются через пересечение пула вланов (`VLAN Pool`) и связанного с ним фильтра * Если пулов несколько, то набор вланов определяется через *объединение* ### Трансляция Вланов и Связь между L2 Domain (доменами) Связь между L2 доменами (`L2 Domain`) аналогично сегментам (`Network Segment`) проходит по линкам между устройствами с разными доменами. При этом переход между доменами требует наличия правил трансляции вланов. **Правила трансляции** привязываются к домену в котором находится устройство или сабинтерфейс на котором настроены правила. Сами правила описывают трансляции, применяемы между доменами: * Домен (`L2 Domain`) - соседний домен (в который или из которого осуществляется переход) * `VLAN Expression` - строковое выражение, описывающее вланы, к которым применяется трансляция * `Direction` - направление, на которое действуют правила * `In` - переход из соседнего домена в текущий * `Out` - переход из текущего домена в соседний * `Rule` * `Stack` - назначить влан при переходе через границу доменов * `Map` - транслировать в влан при переходе через границу доменов * `Vlan` - при переходе `In` из локального `L2 Domain`, если `Out` - из выбранного `L2 Domain` :::info При отсутствии правил возможна трансляция 1:1 ::: ### Интеграция с VPN Явная (путём указания ссылки на `VPN`) интеграция с `VPN` не нужна. Точкой входа и точкой выхода `VPN` является сабинтерфейс, и если при трассировке пути мы натыкаемся на участок `L2`, то система самостоятельно должна предложить возможность применения `L2 Домена`, например, для случая если оборудование не поддерживает `L3 VPN`, либо его применение запрещено настройкой. В любом случае это требует построенной топологии. ### Discovery Дискавери вланов разбивается на 2 задачи: 1. Сбор вланов для L2 доменов 2. Создание и привязка L2 доменов По умолчанию в системе создан L2 домен `default` и к нему привязан пул с фильтром вланов (`VLAN Filter`) от 1 до 4096. Это позволит при запуске опроса собраться вланы с устройств. Для сбора в профиле домена (`L2 Domain Profile`) необходимо предусмотреть политику сбора (`Vlan Discovery Policy`): * `Disable` - не собирать вланы для данного L2 сегмента * `Status only` - собирать и только обновлять статусы - `Workflow` * `Create from VLAN Database` - собирать вланы из базы вланов устройства * `Create from Switcport` - собирать вланы разрешённых на портах Сбор правил трансляции вланов возможен на основе `ConfDB`, либо артефактов из `Interface Discovery` ### Улучшения Упрощения управления