2. Обзор приложений

_images/apps4.png

Концепция RUNOS это микросервисы, отвечающие за свою функцию. Поэтому RUNOS неотделим от своих приложений.

И так же поскольку контроллер управляет единой физической сетью, то при написании своих приложений вам необходимо знать, что делают другие приложения в сети, чтобы не возникло противоречий.

В данном разделе описаны основные приложения контроллера, их функции, и настройки, от каких приложений они зависят.

2.1. Loader

Формально Loader не является приложением. Это загрузчик приложений, он создает объекты приложений, читает конфигурационный файл network-settings.json и запускает необходимые приложения.

Loader проходит по списку services и инициализирует все сервисы и их зависимости.

Настройки

  • services [ list of service ] – список приложений, которые необходимо запустить.
  • loader : { threads [ number ] } – число потоков.

2.2. CoreApplication

2.2.1. Controller

Controller – основное приложение, отвечающие за регистрацию остальных приложений и предоставление им доступ к управления сетью.

ИМЯ : controller

Controller предоставляет два способа управления сетью :

  • Реактивный

    Возможность определить функцию обработчик PacketIn’ов.

    Каждое приложение имеет возможность зарегистрировать неограниченное число обработчиков. Они будут вызываться по очереди в соответствии с network-settings.json. Порядок определен в controller { pipeline = [] }.

    Предупреждение

    Каждый обработчик может прервать очередь выполнения. Поэтому важен порядок имен в network-settings.json.

    Для больших подробностей см. PacketMissHandler.

  • Проактивный

    Приложению выделяется канал для общения с коммутаторами. Приложения могут отправлять запросы на коммутатор и получать ответы. (См. StaticTransaction).

Настройки :

  • address [“0-255.0-255.0-255.0-255”] : ip адрес на котором работает контроллер.
  • port [number] : TCP порт, который слушает контроллер, и по которому к нему подключаются коммутаторы.
  • nthreads [number] : количество нитей на которых выполняется pipeline.
  • secure [true|false] : Использовать TLS для соединения с коммутаторами.

2.2.2. SwitchManager

Dependes of : Controller, RestListener.

Приложение предоставляет интерфейс к работе с абстракциями коммутаторов.

ИМЯ : switch-manager. REST ИМЯ : switch-manager. Displaed Name : Switch Manager.

switch-manager управляет объектами Switch, которые являются абстракцией коммутатора. Он позволяет получить объект Switch по dpid, или вектор Switch.

SwitchManager поддерживает Rest интерфейс :

Request : GET /api/switch-manager/switches/all

Reply : Информация о коммутаторах в сети.

SwitchManager поддерживает модель событий :

Коммутатор появился в сети, изменил состояние, исчез.

SwitchManager имеет свою web страницу

Web Страница : http://ControllerIp:8000/switch.html

2.2.3. LinkDiscovery

Dependes of : Controller, SwitchManager.

Приложение исследует соединения в сети.

Данное приложение необходимо для поддержания информации о топологии. Периодически отправляя LLDP пакеты, оно следит за состоянием соединений между коммутаторами.

LinkDiscovery работает в ControllerPipeline под именем link-discovery.

Обрабатывает LLDP пакеты и останавливает выполнение конвеера.

Остальные пакеты проходят LinkDiscovery без изменений.

Настройки :

  • poll-intervall [number] : Интервал (в секундах) через который отправляются LLDP пакеты.

2.2.4. STP

Dependes of : Controller, SwitchManager, LinkDiscovery, Topology

Предотвращает широковещательный шторм в сети, используя логику Spanning Tree протокола.

STP подменяет broadcast правило в конвеере контроллера.

Примечание

Не перегружайте broadcast правило, когда у вас включено приложение STP.

2.2.5. RestListener

Dependes of : Controller.

Обеспечивает Rest интерфейс для приложений.

Это приложение необходимо вам, если вы хотите добавить Rest интерфейс к вашему приложению.

ИМЯ : rest-listener.

RestListener позволяет вам зарагестрировать свое приложение c обработкой REST запросов, после которого вы сможете обращаться с запросами к своему приложение по адресу /api/your-application.

По умолчанию RestListener слушает 8000 порт.

Подробнее см. В работе с REST интерфейсом.

RestListener так же реализует модель событий. Подробнее см модель событий.

RestListener поддерживает некоторые встроенные запросы:

  • GET /apps # получить список всех приложений, которые поддерживают REST интерфейс

  • GET /timeout/<app_lsit>/<last_event>

    Получить события, которые зарегистрировали приложения с некоторого момента.

    • <app_list> = app_1&app_2&...&app_n список приложений, чьи события будут показываться.
    • <last_event> = unsinged integer, номер события, после которого нас интересуют новые события.

Настройки :

  • port [number] – порт который слушает RestListener.
  • web-dir [path-to-dir] – путь к директории, в которой расположены web страницы приложений.

2.3. Сервисы

2.3.1. Topology

Dependes of : LinkDiscovery, RestListener.

ИМЯ : topology REST ИМЯ : topology

Представление топологии сети.

Поддерживает REST интерфей:

GET /api/topology/links получить представление сети.

Имеет свою Web страницу : topology.html.

2.3.2. SimpleLearingSwitch

Dependes of : Controller.

Примечание

По умолчанию выключен.

ИМЯ : simple-learning-switch.

Реализация простого LearningL2Switch, где каждый коммутатор работает независимо от остальных, и содержит свою таблицу mac-port.

SimpleLearningSwitch обеспечивает доставку пакетов до адресатов.

Его основное преимущество, то что он не зависит от остальных приложений.

SimpleLearningSwitch Работает в controller pipeline под именем forwarding.

2.3.3. LearningSwitch

Dependes of : Controller, Topology.

ИМЯ : learning-switch.

Реализация усовершенствованного L2Switch, который знает топологию сети и отправляет пакет по кратчайшему пути, он обеспечивает доставку пактов до адресатов.

Примечание

Саму топологию строит приложение Topology, а LearningSwitch пользуется ею.

LearningSwitch работает в controller pipeline под именем forwarding и должен выполняться последним.

Примечание

SimpleLearningSwitch и LearningSwitch реализуют одну и ту же функциональность и не могут быть запущены одновременно на контроллере, поэтому их pipeline имена одинаковы.

2.3.4. SwitchStats

Dependes of : Controller, SwitchManager, RestListener.

Собирает статистику с коммутаторов.

ИМЯ : switch-stats.

Настройки :

  • poll-interval [number] - период сбора статистики

2.3.5. ArpHandler

Dependes of : Controller, SwitchManager, HostManager.

ИМЯ : arp-handler.

ArpHandler обрабатывает arp-request, и если он знает mac-адрес хоста, отправляет arp-reply, если не знает – передает управление дальше по pipeline.

ArpHandler работает в controller pipeline под именем arp-handler.

2.3.6. StaticFlowPusher

Dependes of : Controller, SwitchManager, RestListener.

ИМЯ : static-flow-pusher

Статическая установка правил на коммутаторы.

Возможна установка правил через REST интерфейс и из network-settings.json.

REST интерфейс :

POST /api/static-flow-pusher/newflow/<switch_id> {Json of new_flow}

Json поддерживает :

  • “in_port”
  • eth_src, eth_dst
  • eth_type
  • ip_src, ip_dst
  • out_port

Настройки

В настройках можно описывать правила следующим образом:

"flows" : [
  {
    "dpid": <switch>,
    "flows" : [

      ...

      {
        <set_of_match>
        <set_of_action>
        <set_of_config>
      }

      ...

    ]
  }
]

Где :

  • <switch> = “all” или dpid коммутатора в формате “0000000000001”.
  • <set_of_match> – Набор строк, указывающие поля пакета.
    • in_port : [number]
    • eth_src : [“ethernet_address”]
    • eth_dst : [“ethernet_address”]
    • ip_src : [“ip adress”]
    • ip_dst : [“ip_adress”]
  • <set_of_action> – действия с пакетом :
    • out_port : [number | “to-controller”] – отправить на указанный порт
  • <set_of_config> : набор конфигураций потока.
    • priority : [number] – приоритет потока
    • “idle” : [number] – тайм-аут простоя потока
    • “hard” : [number] – тайм-аут потока

2.4. REST

2.4.1. REST 2.0

2.4.1.1. RestMultipart

Dependes of : Controller, SwitchManager, RestListener.

Обработка запросов на получение. Сводятся к отправке на switch multipart request’ов.

Подробнее см. в разделе REST 2.0: приложения RestMultipart и RestFlowMod

2.4.1.2. RestFlowMod

Dependes of : Controller, SwitchManager, RestListener.

Обработка запросов на добавление, изменение, удаление. Сводятся к отправке на switch FlowMod-сообщений. Приемник rest-интерфейса StaticFlowPusher.

Подробнее см. в разделе REST 2.0: приложения RestMultipart и RestFlowMod

2.4.2. REST 1.0 (deprecated)

2.4.2.1. FlowManager

Dependes of : Controller, SwitchManager, RestListener.

ИМЯ : flow-manager.

REST ИМЯ : flow.

Исследует и удаляет потоки.

FlowManager опрашивает коммутаторы о правилах, которые установлены на них, и может удалить правила.

FlowManager обеспечивает REST интерфейс :

GET /api/flow/<switch_id>/all : получить информацию о потоках на коммутаторе

DELETE /api/flow/<switch_id>/<switch_id>/<flow_id> : удалить поток.

FlowManager поддерживает Модель событий.

2.4.2.2. HostManager

Dependes of : SwitchManager, RestListener.

ИМЯ : host-manager

Исследует хосты.

HostManager следит за пакетами, которые появляются в сети, и запоминает mac- и ip-адреса хостов.

Работает в pipeline под именем host-manager, читает необходимые поля, и передает управление дальше.

2.4.2.3. WebUIManager

Dependes of : SwitchManager, HostManager, RestListener.

Обеспечивает Web интерфейс контроллера.