libStorageMgmt — универсальная библиотека управления хранилищами

от автора

Я хочу рассказать о юной, но многообещающей библиотеке, родившейся в компании Redhat, призваной упростить жизнь сисадминам больших и разнородных датацентров. Библиотека работает с хранилищами данных разных производителей (на данный момент Linux, NetApp, Nexenta, EMC) используя одни и те же команды. Для примера, что бы создать файловую систему на любом из хранилищ, достаточно запусить:

 # 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 я разработал плагин для этой библиотеки. Я хочу поделиться опытом, а главное призвать разработать плагины для других хранилищ!

Сделать это достаточно просто, и подробно расписано в документации. Не буду повторять тексты, приведу лишь пару ссылок:

Я приведу пример шаблона на 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *