- Интерфейс пользователя конкретной площадки (plant) отражает содержимое модели данных интферфейса (state), хранящейся в Redis в виде JSON структуры. Название ключа по которому хранятся эти данные:
rfab:plant:<plid>
, где<plid>
- идентификатор площадки. Модель на фронтенде автоматически синхронизируется с моделью интерфейса в базе.
Кроме того, для каждой площадки в Redis накапливается, хранится и обновляется, по мере получения от ядра, дополнительная информация. Она передаётся на фронтенд и отображаются в интерфейсе только по запросу пользователя. Это статистика по каждой полке и дополнительные данные об устройствах в слотах:
-
Статистика по полкам хранится в хешах, доступных по ключу
rfab:jbodstat:<plid>
, по каждой площадке отдельно. В качестве названий полей используются индексы полок. -
Дополнительные данные об устройствах в слотах храняться также в отдельных хешах по каждой площадке, доступных по ключам
rfab:dutinfo:<plid>
. Названиями полей хеша являются строки вида jbod_idx:slot_idx, где bod_idx - индекс полки, slot_idx - индекс слота.
Получение данных от ядра системы для формирования и обновления моделей интерфейсов предполагается для каждой площадки отдельно, по каналам Redis, c названиями rfab:update:<plid>
. Сообщения в формате JSON вида {"type": "тип данных", "data": "содержимое"}
обрабатываются следующим образом, в зависимости от значения поля type
:
-
state
- Установка состояния интерфейса, полное обновление. Полеdata
должно содержать полную модель состояния интерфейса, которая будет сохранена в Redis по ключуrfab:plant:<plid>
, перезаписав ранее хранившуюся там модель, если таковая была. Пример содержимого поляdata
можно получить здесь http://fab.rlab.ru:9000/docs#/default/getPlant_plant__plid__get после ввода идентификатора площадки (тестовый = 1) и отправки запроса. После получения данных этого типа, помимо обновление информации в базе, происходит обновление модели на фронтенде. -
update
- Частичное обновление состояния интерфейса. Полеdata
должно содержать JSON структуру, аналогичную модели данных интерфейса, но содержащую только ту информацию, которой требуется перезаписать соответствующие части модели. Пример сообщения с обновлением номера "wwn1" у полки с индексом "0":{"type": "update", "data": { "jbods": { "0": {"wwn1": "11111111111"}}}}
. Результатом такого сообщения также будет обновление модели и в базе и на фронтенде. -
jbodstat
- Полное обновление (перезапись) в Redis статистики для полок, информация для которых присутствует в поле "data". Например, обновление статистики для полки с индексом "1":{ "type": "jbodstat", "data": {"1": "Some jbod statistic"}}
. Эти данные на фронтенд в автоматическом режиме не передаются. -
dutinfo
- Полное обновление (перезапись) в Redis дополнительной информации об устройствах в слотах, информация о которых присутствует в поле "data". Например, обновление статистики для слота с индексом "3" в полке с индексом "1":{ "type": "dutinfo", "data": {"1": { "3": "Some hard drive information"}}}
. Эти данные на фронтенд в автоматическом режиме также не передаются.
Взаимодействие пользователя с элементами управления порождает сообщения, направляемые в канал rfab:action:<plid>
в формате {"action": "тип действия", "data": "содержимое"}
. На данный момент реализованы следующие типы:
-
chosentest
- Выбор теста. В полеdata
передаётся номер теста. -
abort
- Прекращение теста. В поле data в виде ассоциативного массива JSON передаётся индекс jbod и индексы слотов. Пример:{"action": "reset", "data": {"0": [4, 11, 12]}}
. В данном случае передаются индексы слотов "4", "11", "12", находящихся в полке с индексом "0". -
reset
- Сброс слота. Формат поляdata
аналогиченabort
.
rfab:err
rfab:log
- Стандартный порт 6379
- Установить значение ключа
set <имя_ключа> 'строка, новое значение ключа'
- Считать значение ключа
get <имя_ключа>
- Подписаться на канал
subscribe <имя канала>
- Отправить в канал
publish <имя канала> 'строка для отправки'
{"type": "update", "data": {"name": "Relaible drives IIInc.", "jbods": {"1": {"state":1,"descr":"ASCII substring of unreasonably indeterminate length","slots":{"0":{"idx":0,"state":3,"status":"Some new status information","scode":1,"progress":8173,"mdl":"1111111111111111111","sn":"2222222222222","itf":1,"link":"700200","grade":1}}}}}}
{"type": "state","data": {"name":"Relaible drives Inc.","testoptions":{"1":"Proper test","2":"Solid test","3":"Precise test"},"chosentest":1,"jbods":{"0":{"idx":0,"wwn0":"d78349CE8cEC0B06","wwn1":"97aeEdFf5c6b4bEb","sasaddr":"7249bCEA9EB4B5C9","mdl":"JBMD165FSL","sn":"0Ed0f16D","fw":"2.5.3","state":1,"descr":"ASCII string of reasonably indeterminate length","slots":{"0":{"idx":0,"state":3,"status":"Some status information","scode":1,"progress":8173,"mdl":"MDYJWC81452273502395496404","sn":"0eeA3B3Bedaa328E88C0","itf":1,"link":"100500","grade":1},"1":{"idx":1,"state":3,"status":"Some status information","scode":1,"progress":8342,"mdl":"MDKQDM81942482392560070384","sn":"061b9e88d6f71fDbfCfD","itf":1,"link":"100500","grade":1},"2":{"idx":2,"state":3,"status":"Some status information","scode":1,"progress":6757,"mdl":"MDWWFW01432111199019671529","sn":"ec3dA29fF7DD1eE93AD3","itf":1,"link":"100500","grade":1},"3":{"idx":3,"state":3,"status":"Some status information","scode":1,"progress":8541,"mdl":"MDVDBJ71180341079693407656","sn":"cD32d14fE2cF3f941D89","itf":1,"link":"100500","grade":1},"4":{"idx":4,"state":3,"status":"Some status information","scode":1,"progress":4812,"mdl":"MDRXXE17470786929054561432","sn":"2572E5cf86876ECaEcdf","itf":1,"link":"100500","grade":1},"5":{"idx":5,"state":3,"status":"Some status information","scode":1,"progress":7154,"mdl":"MDZZDL44738531438380934889","sn":"De2A8AF473FB89e7eba4","itf":1,"link":"100500","grade":1}}},"1":{"idx":1,"wwn0":"bCB3ed3afe3792a1","wwn1":"56FFf7CaaFC0BeaF","sasaddr":"cF9De39E6eA4cbe6","mdl":"JBMD679CPU","sn":"31dF4058","fw":"0.0.5","state":1,"descr":"ASCII string of reasonably indeterminate length","slots":{"0":{"idx":0,"state":3,"status":"Some status information","scode":1,"progress":8013,"mdl":"MDMRHV75261097233364887179","sn":"16C1bc4EFC0fC435D2dD","itf":1,"link":"100500","grade":1},"1":{"idx":1,"state":3,"status":"Some status information","scode":1,"progress":9757,"mdl":"MDWVLB47110444233359900976","sn":"13D8dbd329fBe841b8fA","itf":1,"link":"100500","grade":1},"2":{"idx":2,"state":3,"status":"Some status information","scode":1,"progress":6336,"mdl":"MDTOBJ40556208791675178469","sn":"EACEf4f9DE10f1D1CC7A","itf":1,"link":"100500","grade":1},"3":{"idx":3,"state":3,"status":"Some status information","scode":1,"progress":9889,"mdl":"MDMFGD14140327235699520176","sn":"a2bF313e9243aE3Ab3b0","itf":1,"link":"100500","grade":1},"4":{"idx":4,"state":3,"status":"Some status information","scode":1,"progress":3901,"mdl":"MDXPNH75058258999509691698","sn":"4aAC3cf4A6eF495Fb66f","itf":1,"link":"100500","grade":1},"5":{"idx":5,"state":3,"status":"Some status information","scode":1,"progress":5974,"mdl":"MDMDIM57064247568351302700","sn":"aC357cEaC0e9cAA80850","itf":1,"link":"100500","grade":1}}}}}}