33from ansible .module_utils .basic import AnsibleModule
44from ansible .module_utils .helpers import ModuleRes , CartridgeException , cartridge_errcodes
55from ansible .module_utils .helpers import get_control_console
6+ from ansible .module_utils .helpers import dynamic_box_cfg_params , memory_size_box_cfg_params
67
78import os
89
1415}
1516
1617
18+ def serialize_dict (d ):
19+ parts = []
20+
21+ for k , v in d .items ():
22+ value_str = None
23+ if type (v ) == str :
24+ value_str = "'%s'" % v
25+ elif type (v ) == float or type (v ) == int :
26+ value_str = "%s" % v
27+ elif type (v ) == bool :
28+ value_str = 'true' if v else 'false'
29+ else :
30+ raise CartridgeException (
31+ cartridge_errcodes .BAD_VALUE_TYPE ,
32+ "Unknown value type: {}" % type (v )
33+ )
34+
35+ parts .append ("%s = %s" % (k , value_str ))
36+
37+ return '{ %s }' % ', ' .join (parts )
38+
39+
40+ def box_cfg_was_called (control_console ):
41+ return control_console .eval ('''
42+ return type(box.cfg) ~= 'function'
43+ ''' )
44+
45+
46+ def get_box_cfg (control_console ):
47+ return control_console .eval ('''
48+ return type(box.cfg) == 'table' and box.cfg or box.NULL
49+ ''' )
50+
51+
52+ def is_dynamic_param (param_name ):
53+ return param_name in dynamic_box_cfg_params
54+
55+
56+ def is_memory_size_param (param_name ):
57+ return param_name in memory_size_box_cfg_params
58+
59+
60+ def change_memory_size (param_name , cartridge_defaults , config , control_console ):
61+ new_memory_size = config .get (param_name , cartridge_defaults .get (param_name ))
62+
63+ if new_memory_size is None :
64+ return False
65+
66+ # Get current memory size
67+ current_memory_size = control_console .eval ('''
68+ return type(box.cfg) ~= 'function' and box.cfg.{} or box.NULL
69+ ''' .format (param_name ))
70+
71+ if current_memory_size is None :
72+ # box.cfg wasn't called
73+ return False
74+
75+ if new_memory_size <= current_memory_size :
76+ return False
77+
78+ # try to increase memory size
79+ increased = control_console .eval ('''
80+ local ok, err = pcall(function()
81+ box.cfg {{ {param_name} = {new_memory_size} }}
82+ end)
83+ if not ok then
84+ if tostring(err):find("cannot decrease memory size at runtime") == nil then
85+ error('failed to set {param_name}: ' .. tostring(err))
86+ end
87+ end
88+ return ok
89+ ''' .format (param_name = param_name , new_memory_size = new_memory_size ))
90+
91+ return increased
92+
93+
94+ def change_dynamic_params (cartridge_defaults , config , control_console ):
95+ params = dict ()
96+
97+ # Get current values
98+ current_box_cfg = get_box_cfg (control_console )
99+ if current_box_cfg is None :
100+ return False
101+
102+ for param_name , param_value in config .items ():
103+ if is_dynamic_param (param_name ) and not is_memory_size_param (param_name ):
104+ params .update ({param_name : param_value })
105+
106+ for param_name , param_value in cartridge_defaults .items ():
107+ if param_name in params :
108+ continue
109+ if is_dynamic_param (param_name ) and not is_memory_size_param (param_name ):
110+ params .update ({param_name : param_value })
111+
112+ if not params :
113+ return False
114+
115+ serialized_params = serialize_dict (params )
116+
117+ new_box_cfg = control_console .eval ('''
118+ box.cfg({serialized_params})
119+ return box.cfg
120+ ''' .format (serialized_params = serialized_params ))
121+
122+ changed = new_box_cfg != current_box_cfg
123+ return changed
124+
125+
17126def manage_instance (params ):
18127 config = params ['config' ]
19128 cartridge_defaults = params ['cartridge_defaults' ]
20129 control_sock = params ['control_sock' ]
21130
22- # Check if memtx_memory parameter is specified
23- if 'memtx_memory' not in config and 'memtx_memory' not in cartridge_defaults :
24- return ModuleRes (success = True , changed = False )
25-
26- new_memtx_memory = None
27- if 'memtx_memory' in config :
28- new_memtx_memory = config ['memtx_memory' ]
29- else :
30- new_memtx_memory = cartridge_defaults ['memtx_memory' ]
31-
32131 # Check if instance isn't started yet
33132 if not os .path .exists (control_sock ):
34133 return ModuleRes (success = True , changed = False )
@@ -46,31 +145,24 @@ def manage_instance(params):
46145
47146 raise e
48147
49- # Get current memtx memory
50- current_memtx_memory = control_console .eval ('''
51- return type(box.cfg) ~= 'function' and box.cfg.memtx_memory or box.NULL
52- ''' )
53- if current_memtx_memory is None :
54- # box.cfg wasn't called
148+ if not box_cfg_was_called (control_console ):
55149 return ModuleRes (success = True , changed = False )
56150
57- if new_memtx_memory <= current_memtx_memory :
58- return ModuleRes ( success = True , changed = False )
151+ # Change memory size
152+ memory_size_changed = False
59153
60- # try to increase memtx_memory
61- increased = control_console .eval ('''
62- local ok, err = pcall(function()
63- box.cfg {{ memtx_memory = {} }}
64- end)
65- if not ok then
66- if tostring(err):find("cannot decrease memory size at runtime") == nil then
67- error('failed to set memtx_memory: ' .. tostring(err))
68- end
69- end
70- return ok
71- ''' .format (new_memtx_memory ))
154+ for param_name in memory_size_box_cfg_params :
155+ if param_name in config or param_name in cartridge_defaults :
156+ memory_size_changed = memory_size_changed or change_memory_size (
157+ param_name , cartridge_defaults , config , control_console
158+ )
159+
160+ # Change dynamic params
161+ dynamic_params_changed = change_dynamic_params (cartridge_defaults , config , control_console )
162+
163+ changed = memory_size_changed or dynamic_params_changed
72164
73- return ModuleRes (success = True , changed = increased )
165+ return ModuleRes (success = True , changed = changed )
74166
75167
76168def main ():
0 commit comments