Layerapi2
1. General
The layerapi2 library is
the heart of mfext
layers system.
You should read the layerapi2 reference documentation.
2. How we use layerapi2 in MetWork?
2.1 Layer names
We use the following convention for layer names:
name@module_name_in_lowercase
For example: python3@mfserv
.
2.2 LAYERAPI2_LAYERS_PATH
First of all, we set in LAYERAPI2_LAYERS_PATH
:
${MFEXT_HOME}
${MFEXT_HOME}/opt
${MFMODULE_HOME}
(if the current module is notmfext
)${MFMODULE_HOME}/opt
(if the current module is notmfext
)${MFMODULE_RUNTIME_HOME}/var/plugins
(if the current module ismfserv
,mfbase
ormfdata
)
So we have a kind of layers inheritance. For example: mfserv => mfext
.
2.3 Special layers
In each module, we have two special layers:
root@module_name_in_lowercase
(example:root@mfext
)default@module_name_in_lowercase
) (example:default@mfdata
)
The first one is special because of its "layer home" (see next paragraph). And the
second is mainly an empty layer with dependencies. This layer is loaded
by default when you "source" the corresponding module (or when you log in as mfxxx
user).
So this "default" layer is used to select (with its dependencies) which layers are
loaded by default (have a look at its .layerapi2_dependencies
file).
In mfserv
, mfdata
and mfbase
modules, we have some other special layers:
plugin_foo@module_name_in_lowercase
For user-provided plugins (which are regular layers but with a custom "layer_home" (see next paragraph).
2.4 Layer homes
The layer home of foo@mfserv
(for example) is always:
${MFSERV_HOME}/opt/foo
There are two exceptions:
- one for
root@module_name_in_lowercase
(see "special layers") (for this one, its layer home is :${MFMODULE_HOME}
) - one for
plugin_foo@module_name_in_lowercase
(see "special layers") (for these layers, their layer home is${MFMODULE_RUNTIME_HOME}/var/plugins/foo
)
2.5 Real example
When we log in as mfserv
on a machine with a lot of layers, you can have something like this:
$ layers
- plugin_welcome@mfserv [/home/fab/metwork/mfserv/var/plugins/welcome]
- (*) default@mfserv [/home/fab/metwork/mfserv/build/opt/default]
- python2@mfserv [/home/fab/metwork/mfserv/build/opt/python2]
- nodejs@mfserv [/home/fab/metwork/mfserv/build/opt/nodejs]
- (*) python3@mfserv [/home/fab/metwork/mfserv/build/opt/python3]
- (*) root@mfserv [/home/fab/metwork/mfserv/build]
- (*) python3_vim@mfext [/home/fab/metwork/mfext/build/opt/python3_vim]
- python2_devtools@mfext [/home/fab/metwork/mfext/build/opt/python2_devtools]
- (*) core@mfext [/home/fab/metwork/mfext/build/opt/core]
- (*) tcltk@mfext [/home/fab/metwork/mfext/build/opt/tcltk]
- (*) default@mfext [/home/fab/metwork/mfext/build/opt/default]
- (*) devtools@mfext [/home/fab/metwork/mfext/build/opt/devtools]
- (*) openresty@mfext [/home/fab/metwork/mfext/build/opt/openresty]
- python2@mfext [/home/fab/metwork/mfext/build/opt/python2]
- (*) nodejs@mfext [/home/fab/metwork/mfext/build/opt/nodejs]
- (*) python3_core@mfext [/home/fab/metwork/mfext/build/opt/python3_core]
- python2_core@mfext [/home/fab/metwork/mfext/build/opt/python2_core]
- (*) scientific_core@mfext [/home/fab/metwork/mfext/build/opt/scientific_core]
- (*) python3_devtools@mfext [/home/fab/metwork/mfext/build/opt/python3_devtools]
- python3_circus@mfext [/home/fab/metwork/mfext/build/opt/python3_circus]
- (*) monitoring@mfext [/home/fab/metwork/mfext/build/opt/monitoring]
- python2_vim@mfext [/home/fab/metwork/mfext/build/opt/python2_vim]
- (*) python3@mfext [/home/fab/metwork/mfext/build/opt/python3]
- (*) java@mfext [/home/fab/metwork/mfext/build/opt/java]
- (*) vim@mfext [/home/fab/metwork/mfext/build/opt/vim]
- (*) root@mfext [/home/fab/metwork/mfext/build]
Note: you have (*) before the layer label if the corresponding layer is already loaded
We can see various layers of various modules installed. A lot of them are loaded.
You can also see a mfserv
plugins (of course not loaded).
2.6 Tools
Have a look at layerapi2 reference documentation for details but main tools available around layer system are:
2.6.1 layers
$ layers --help
Usage:
layers [OPTION?] - list installed layers
Help Options:
-h, --help Show help options
Application Options:
-r, --raw raw output
-m, --loaded-filter Loaded layer filter (default: no filter, possible values: yes, no)
2.6.2 is_layer_installed, is_layer_loaded
$ is_layer_installed --help
Usage:
is_layer_installed [OPTION?] LAYER LABEL - output 1 is the given layer is installed
Help Options:
-h, --help Show help options
$ is_layer_loaded --help
Usage:
is_layer_loaded [OPTION?] LAYER LABEL OR LAYER HOME - output 1 is the given layer is already loaded
Help Options:
-h, --help Show help options
2.6.3 layer_wrapper
$ layer_wrapper --help
Usage:
layer_wrapper [OPTION?] -- COMMAND [COMMAND_ARG1] [COMMAND_ARG2] [...] - wrapper to execute the given command in a process with some specific layers loaded
Help Options:
-h, --help Show help options
Application Options:
-d, --debug debug mode
-e, --empty unload all layers before
-c, --cwd change working directory to the last layer home
-x, --extra-env-prefix if set, add three environnement variables {PREFIX}_NAME, {PREFIX}_LABEL and {PREFIX}_DIR containing the last layer name, label and the last layer home
-E, --empty-env empty environnement (imply --empty)
-k, --empty-env-keeps coma separated list of env var to keep with --empty-env
-l, --layers coma separated list of layers labels/homes ('-' before the name of the layer means 'optional dependency')
-p, --prepend-env ENV_VAR,VALUE string to prepend VALUE in : separated ENV_VAR (like PATH) (can be used multiple times)
-f, --force-prepend do not check existing paths in prepend
--dont-load-optional don't load optional layers
2.6.4 layer_load, layer_unload
layer_load
and layer_unload
are two bash functions to load or unload
an installed layer.
For example:
layer_load python2@mfext