Pull to refresh

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

Reading time3 min
Views3.6K
Я хочу рассказать о юной, но многообещающей библиотеке, родившейся в компании 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. Всё только начинается!
Tags:
Hubs:
+6
Comments0

Articles

Change theme settings