G-SERVICE Docs
Архитектура ISP (OSS/BSS)

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-профиля, освобождение порта).

Поддерживаемые вендоры и протоколы

ВендорТип устройствПротокол управленияОсобенности
HuaweiOLT (MA56xx), BNG (ME60)SNMP v2c, Netconf/YANGONT auto-registration, service-port
MikroTikBRAS (CCR), Switch (CRS)RouterOS API (TLS)Rate-Limit, Address-List, Queue
EltexOLT (LTP-8X/16N), ONTCLI (SSH), SNMPGPON provisioning, ONU management
CiscoBNG (ASR), Switch (Catalyst)Netconf/YANG, IOS-XEISG/QoS policies, subscriber templates
JuniperBNG (MX), Switch (EX)Netconf/YANG (junos-ez)Dynamic profiles, CoS

Агрегат: ProvisioningTask

Loading diagram...

Vendor Adapter Pattern

Loading diagram...
// 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.activateActivateServiceCommandOMS
service.deactivateDeactivateServiceCommandOMS
access.suspendSuspendAccessCommandOMS, Billing (dunning)
access.resumeResumeAccessCommandOMS, Billing
speed.changeChangeSpeedCommandOMS (tariff change)

Доменные события

Exchange: provisioning.events (Topic)

Routing KeyСобытиеПотребители
provisioning.successProvisioningSuccessEventOMS (Saga next step)
provisioning.failedProvisioningFailedEventOMS (Saga compensation)
provisioning.rollbackProvisioningRollbackEventOMS

Reconciliation Loop

Loading diagram...

Background Jobs (river)

JobРасписаниеОписание
provisioning.reconcileКаждые 6 часовСверка expected vs actual на оборудовании
provisioning.stale_tasksКаждые 10 минRetry зависших задач (status=EXECUTING > 5 мин)
provisioning.cleanupЕжедневноАрхивация завершённых задач (> 30 дней)

Ссылки:

On this page