forked from tarantool/tarantool
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch introduces initial support for roles. Dependencies are not currently supported for roles. In this regard, there is no strict order in which roles are performed. Part of tarantool#9078 @TarantoolBot document Title: Roles Roles are programs that run when a configuration is loaded or reloaded. Roles can be defined for each instance. If a role is defined more than once on an instance, it will still only run once. The roles will be executed in the order in which they are specified in the corresponding option. As with almost all other options, with the exception of those defined as "map", the roles for the lower scope will replace the roles for the higher scope. Value roles_cfg however defined as "map", so it will be merged. Roles must have three functions defined: validate(), apply() and stop(). Each of these functions must throw an error if it occurs. On each run, the role calls validate() and then apply(). If the roles were removed from the instance on reload, the role is stopped using the stop() function.
- Loading branch information
Showing
8 changed files
with
494 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
## feature/config | ||
|
||
* Introduced the initial support for roles - programs that run when | ||
a configuration is loaded or reloaded (gh-9078). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
local log = require('internal.config.utils.log') | ||
|
||
local last_loaded = {} | ||
local last_loaded_names_ordered = {} | ||
|
||
local function stop_roles(roles_to_skip) | ||
for id = #last_loaded_names_ordered, 1, -1 do | ||
local role_name = last_loaded_names_ordered[id] | ||
if roles_to_skip == nil or roles_to_skip[role_name] == nil then | ||
log.verbose('roles.apply: stop role ' .. role_name) | ||
local ok, err = pcall(last_loaded[role_name].stop) | ||
if not ok then | ||
error(('Error stopping role %s: %s'):format(role_name, err), 0) | ||
end | ||
end | ||
end | ||
end | ||
|
||
local function apply(config) | ||
local configdata = config._configdata | ||
local role_names = configdata:get('roles', {use_default = true}) | ||
if role_names == nil or next(role_names) == nil then | ||
stop_roles() | ||
return | ||
end | ||
|
||
-- Remove duplicates. | ||
local roles = {} | ||
local roles_ordered = {} | ||
for _, role_name in pairs(role_names) do | ||
if roles[role_name] == nil then | ||
table.insert(roles_ordered, role_name) | ||
end | ||
roles[role_name] = true | ||
end | ||
|
||
-- Stop removed roles. | ||
stop_roles(roles) | ||
|
||
-- Run roles. | ||
local roles_cfg = configdata:get('roles_cfg', {use_default = true}) or {} | ||
local loaded = {} | ||
local loaded_names_ordered = {} | ||
|
||
-- Load roles. | ||
for _, role_name in pairs(roles_ordered) do | ||
local role = last_loaded[role_name] | ||
if not role then | ||
log.verbose('roles.apply: load role ' .. role_name) | ||
role = require(role_name) | ||
local funcs = {'validate', 'apply', 'stop'} | ||
for _, func_name in pairs(funcs) do | ||
if type(role[func_name]) ~= 'function' then | ||
local err = 'Role %s does not contain function %s' | ||
error(err:format(role_name, func_name), 0) | ||
end | ||
end | ||
end | ||
loaded[role_name] = role | ||
table.insert(loaded_names_ordered, role_name) | ||
end | ||
|
||
-- Validate configs for all roles. | ||
for _, role_name in pairs(roles_ordered) do | ||
local ok, err = pcall(loaded[role_name].validate, roles_cfg[role_name]) | ||
if not ok then | ||
error(('Wrong config for role %s: %s'):format(role_name, err), 0) | ||
end | ||
end | ||
|
||
-- Apply configs for all roles. | ||
for _, role_name in pairs(roles_ordered) do | ||
log.verbose('roles.apply: apply config for role ' .. role_name) | ||
local ok, err = pcall(loaded[role_name].apply, roles_cfg[role_name]) | ||
if not ok then | ||
error(('Error applying role %s: %s'):format(role_name, err), 0) | ||
end | ||
end | ||
|
||
last_loaded = loaded | ||
last_loaded_names_ordered = loaded_names_ordered | ||
end | ||
|
||
return { | ||
name = 'roles', | ||
apply = apply, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.