The Ganesha Library provides base classes that can be used by drivers to provision shares via NFS (NFSv3 and NFSv4), utilizing the NFS-Ganesha NFS server.
NFS-Ganesha 2.1 or newer.
The library has just modest requirements against general NFS-Ganesha (in the following: Ganesha) configuration; a best effort was made to remain agnostic towards it as much as possible. This section describes the few requirements.
Note that Ganesha’s concept of storage backend modules is called FSAL (“File System Abstraction Layer”). The FSAL the driver intends to leverage needs to be enabled in Ganesha config.
Beyond that (with default manila config) the following line is needed to be present in the Ganesha config file (that defaults to /etc/ganesha/ganesha.conf):
%include /etc/ganesha/export.d/INDEX.conf
The above paths can be customized through manila configuration as follows:
defaults to /etc/ganesha
to ganesha.conf in ganesha_config_dir
stored, defaults to export.d in ganesha_config_dir. The following line is required to be included (with value expanded) in the Ganesha config file (at ganesha_config_path):
%include <ganesha_export_dir>/INDEX.conf
A driver that wants to use the Ganesha Library has to inherit from driver.GaneshaMixin.
The driver has to contain a subclass of ganesha.GaneshaNASHelper, instantiate it along with the driver instance and delegate allow_access and deny_access methods to it (when appropriate, ie. when access_proto is NFS).
In the following we explain what has to be implemented by the ganesha.GaneshaNASHelper subclass (to which we refer as “helper class”).
Ganesha exports are described by so-called Ganesha export blocks (introduced in the 2.* release series), that is, snippets of Ganesha config specifying key-pair values.
The Ganesha Library generates sane default export blocks for the exports it manages, with one thing left blank, the so-called FSAL subblock. The helper class has to implement the _fsal_hook method which returns the FSAL subblock (in Python represented as a dict with string keys and values). It has one mandatory key, Name, to which the value should be the name of the FSAL (eg.: {"Name": "GLUSTER"}). Further content of it is optional and FSAL specific.
As noted, the Ganesha Library provides sane general defaults.
However, the driver is allowed to:
The config format for Ganesha Library is called export block template. They are syntactically either Ganesha export blocks, (please consult the Ganesha documentation about the format), or isomorphic JSON (as Ganesha export blocks are by-and-large equivalent to arrayless JSON), with two special placeholders for values: @config and @runtime. @config means a value that shall be filled from manila config, and @runtime means a value that’s filled at runtime with dynamic data.
As an example, we show the library’s defaults in JSON format (also valid Python literal):
{ "EXPORT": { "Export_Id": "@runtime", "Path": "@runtime", "FSAL": { "Name": "@config" }, "Pseudo": "@runtime", "SecType": "sys", "Tag": "@runtime", "CLIENT": { "Clients": "@runtime", "Access_Type": "RW" }, "Squash": "None" } }
The Ganesha Library takes these values from
manila/share/drivers/ganesha/conf/00-base-export-template.conf
where the same data is stored in Ganesha conf format (also supplied with comments).
For customization, the driver has to extend the _default_config_hook method as follows:
With respect to loading export blocks, that can be done through the utility method _load_conf_dir.