# LSMCLI_URI=nstor://admin@192.168.1.138/ lsmcli --create-fs=test --pool=data --size=5G
LSMCLI_URI является адресом назначения команды. В зависимости от «протокола» (nstor://) lsmcli понимает с каким типом хранилища придется общаться и загружает подходящий плагин. Плагин же выполняет всю необходимую работу.
Все команды lsm можно условно разделить на 3 категории:
- Работа с файловыми системами (создание, листинг, удаление)
- создание, удаление удалении NFS exports
- работа с volumes (iSCSI), назначение прав для инициаторов
LibStorageMgmt спроектирован так, что не хранит внутри каких-либо состояний и значений. Это сделано из-за возможных действий на самом хранилище минуя библиотеку. Запуск команды выполняет полный цикл необходимых операций на хранилище и сразу выдает результат (предусмотрен таймаут).
По просьбе компании Nexenta я разработал плагин для этой библиотеки. Я хочу поделиться опытом, а главное призвать разработать плагины для других хранилищ!
Сделать это достаточно просто, и подробно расписано в документации. Не буду повторять тексты, приведу лишь пару ссылок:
- Использование библиотеки sourceforge.net/p/libstoragemgmt/wiki/GettingStarted/
- Разработка плагина sourceforge.net/p/libstoragemgmt/wiki/WritingPlugins/
Я приведу пример шаблона на Python’е (писать можно и на C), заполнив который можно получить полноценный плагин:
Файл №1. lsm/anystorage_plugin:
import sys from lsm.anystorage import AnyStorage from lsm.pluginrunner import PluginRunner if __name__ == '__main__': PluginRunner(AnyStorage, sys.argv).run()
Файл №2. lsm/lsm/anystorage.py:
import urllib2 import urlparse import simplejson as json import base64 from iplugin import INfs, IStorageAreaNetwork from data import Pool, FileSystem, Snapshot, Capabilities, System, \ NfsExport, Volume, Initiator, AccessGroup from common import LsmError, ErrorNumber, md5 class AnyStorage(INfs, IStorageAreaNetwork): def __init__(self): self.password = None self.timeout = None def startup(self, uri, password, timeout, flags = 0): self.password = password or 'default_pass' self.timeout = timeout def pools(self, flags = 0): pools = [] # Add pools here # ... return pools
Плагин будет возвращать список пулов. Функция pools() должна возвращать спискок объектов класса Pool. Далее, lsm сам проводит обработку списка и выводит на экран (для lsmcli -l POOLS). Подобные классы существуют и для файловых систем, «снэпшотов», и т.д.
Описание всех остальных функций можно посмотреть в объявлении INfs, IStorageAreaNetwork (файл lsm/lsm/iplugin.py).
Если необходимо аварийно завершить работу, надо создать исключение на основе класса LsmError:
raise LsmError(ErrorNumber.INVALID_SS, "Cant'create snapshot %s" % snapshot_name)
Большинство функций должны возвращать None при успешном завершении, либо job_id при длительном исполнении. Пример длительной команды: репликация, которая может длится минуты и часы. В случае использования job_id — необходимо будет реализовать пару функций, которые позволят следить за job’ами (job_status(), job_free()).
В целом же код библиотеки lsm отлично документирован и имеет очень понятную структуру.
libStorageMgmt настолько молода, что даже не реализованы все функции работы с LVM Linux. Всё только начинается!
ссылка на оригинал статьи http://habrahabr.ru/post/167401/
Добавить комментарий