Provisioning Service
Автоматическая настройка услуг на сетевом оборудовании: Vendor Adapter, state machine, reconciliation.
Provisioning Service
Bounded Context: Network Provisioning
Владелец данных: ProvisioningTask
Технологии: Go, PostgreSQL, ConnectRPC (read-only), RabbitMQ (consumer + publisher), river
Ответственность
Provisioning — мост между бизнес-логикой и физическим сетевым оборудованием. Переводит бизнес-команды («активировать услугу 100 Мбит») в вендор-специфичные конфигурации на OLT/BRAS/Switch. Аналог модулей Provisioning в Splynx и Провижининг в Hydra Billing, но с ключевым отличием: наша реализация построена на паттерне Desired State + Reconcile (как в Kubernetes), а не на императивном выполнении команд.
- Command Execution: Приём команд из RabbitMQ, трансляция в вендор-специфичные операции.
- Vendor Adapter: Абстракция над разным оборудованием (Huawei, MikroTik, Eltex, Cisco, Juniper). Новый вендор = новый адаптер, без изменения ядра.
- State Machine: Каждая задача проходит через deterministic FSM с полной трассировкой.
- Verification: После выполнения — проверка результата (RADIUS test-auth, SNMP poll, ping). Если верификация не прошла — автоматический retry или эскалация.
- Reconciliation: Периодическая сверка «что должно быть» vs «что настроено». Автоматическое исправление drift без участия оператора.
- Rollback: При сбое — компенсирующие действия (удаление RADIUS-профиля, освобождение порта).
Поддерживаемые вендоры и протоколы
| Вендор | Тип устройств | Протокол управления | Особенности |
|---|---|---|---|
| Huawei | OLT (MA56xx), BNG (ME60) | SNMP v2c, Netconf/YANG | ONT auto-registration, service-port |
| MikroTik | BRAS (CCR), Switch (CRS) | RouterOS API (TLS) | Rate-Limit, Address-List, Queue |
| Eltex | OLT (LTP-8X/16N), ONT | CLI (SSH), SNMP | GPON provisioning, ONU management |
| Cisco | BNG (ASR), Switch (Catalyst) | Netconf/YANG, IOS-XE | ISG/QoS policies, subscriber templates |
| Juniper | BNG (MX), Switch (EX) | Netconf/YANG (junos-ez) | Dynamic profiles, CoS |
Агрегат: ProvisioningTask
Vendor Adapter Pattern
// internal/provisioning/adapter/adapter.go
type VendorAdapter interface {
ActivateService(ctx context.Context, params ActivateParams) error
DeactivateService(ctx context.Context, params DeactivateParams) error
ChangeSpeed(ctx context.Context, params ChangeSpeedParams) error
SuspendAccess(ctx context.Context, params SuspendParams) error
ResumeAccess(ctx context.Context, params ResumeParams) error
Verify(ctx context.Context, params VerifyParams) (VerifyResult, error)
}
// Регистрация адаптеров
func NewVendorRouter(adapters map[string]VendorAdapter) *VendorRouter {
return &VendorRouter{adapters: adapters}
}ConnectRPC API (read-only)
service ProvisioningService {
rpc GetTaskStatus(GetTaskStatusRequest) returns (GetTaskStatusResponse);
rpc RetryTask(RetryTaskRequest) returns (RetryTaskResponse);
rpc ListTasks(ListTasksRequest) returns (ListTasksResponse);
}Основной вход — через RabbitMQ commands, не через RPC. RPC используется только для мониторинга и ручного retry.
Входящие команды (RabbitMQ)
Exchange: provisioning.commands (Direct) → Queue: provisioning.q.commands (Quorum)
| Routing Key | Команда | Источник |
|---|---|---|
service.activate | ActivateServiceCommand | OMS |
service.deactivate | DeactivateServiceCommand | OMS |
access.suspend | SuspendAccessCommand | OMS, Billing (dunning) |
access.resume | ResumeAccessCommand | OMS, Billing |
speed.change | ChangeSpeedCommand | OMS (tariff change) |
Доменные события
Exchange: provisioning.events (Topic)
| Routing Key | Событие | Потребители |
|---|---|---|
provisioning.success | ProvisioningSuccessEvent | OMS (Saga next step) |
provisioning.failed | ProvisioningFailedEvent | OMS (Saga compensation) |
provisioning.rollback | ProvisioningRollbackEvent | OMS |
Reconciliation Loop
Background Jobs (river)
| Job | Расписание | Описание |
|---|---|---|
provisioning.reconcile | Каждые 6 часов | Сверка expected vs actual на оборудовании |
provisioning.stale_tasks | Каждые 10 мин | Retry зависших задач (status=EXECUTING > 5 мин) |
provisioning.cleanup | Ежедневно | Архивация завершённых задач (> 30 дней) |
Ссылки:
- Protobuf-контракт: provisioning/v1/
- Слой OSS: OSS Layer
- Vendor Adapter: OSS Layer — Vendor Adapter