11#
2- # Copyright (C) 2015-2017 Stephane Thiell <[email protected] > 2+ # Copyright (C) 2015-2019 Stephane Thiell <[email protected] > 33#
44# This file is part of ClusterShell.
55#
4242#
4343CFG_SECTION_TASK_DEFAULT = 'task.default'
4444CFG_SECTION_TASK_INFO = 'task.info'
45+ CFG_SECTION_NODESET = 'nodeset'
4546
4647#
4748# Functions
@@ -84,6 +85,20 @@ def config_paths(config_name):
8485 os .path .expanduser ('~/.config' )),
8586 'clustershell' , config_name )]
8687
88+ def _converter_integer_tuple (value ):
89+ """ConfigParser converter for tuple of integers"""
90+ # NOTE: compatible with ConfigParser 'converters' argument (Python 3.5+)
91+ return tuple (int (x ) for x in value .split (',' ) if x .strip ())
92+
93+ def _parser_get_integer_tuple (parser , section , option , ** kwargs ):
94+ """
95+ Compatible converter for parsing tuple of integers until we can use
96+ converters from new ConfigParser (Python 3.5+).
97+ """
98+ return _converter_integer_tuple (
99+ ConfigParser .get (parser , section , option , ** kwargs ))
100+
101+
87102#
88103# Classes
89104#
@@ -93,7 +108,13 @@ class Defaults(object):
93108
94109 The following attributes may be read at any time and also changed
95110 programmatically, for most of them **before** ClusterShell objects
96- are initialized (like Task):
111+ (Task or NodeSet) are initialized.
112+
113+ NodeSet defaults:
114+
115+ * fold_axis (tuple of axis integers; default is empty tuple ``()``)
116+
117+ Task defaults:
97118
98119 * stderr (boolean; default is ``False``)
99120 * stdin (boolean; default is ``True``)
@@ -181,12 +202,23 @@ class Defaults(object):
181202 #
182203 _TASK_INFO_PKEYS_BL = ['engine' , 'print_debug' ]
183204
205+ #
206+ # Default values for NodeSet
207+ #
208+ _NODESET = {"fold_axis" : ()}
209+
210+ #
211+ # Datatype converters for NodeSet defaults
212+ #
213+ _NODESET_CONVERTERS = {"fold_axis" : _parser_get_integer_tuple }
214+
184215 def __init__ (self , filenames ):
185216 """Initialize Defaults from config filenames"""
186217
187218 self ._task_default = self ._TASK_DEFAULT .copy ()
188219 self ._task_info = self ._TASK_INFO .copy ()
189220 self ._task_info_pkeys_bl = list (self ._TASK_INFO_PKEYS_BL )
221+ self ._nodeset = self ._NODESET .copy ()
190222
191223 config = ConfigParser ()
192224 parsed = config .read (filenames )
@@ -212,22 +244,34 @@ def _parse_config(self, config):
212244 except (NoSectionError , NoOptionError ):
213245 pass
214246
247+ # NodeSet
248+ for key , conv in self ._NODESET_CONVERTERS .items ():
249+ try :
250+ self ._nodeset [key ] = conv (config , CFG_SECTION_NODESET , key )
251+ except (NoSectionError , NoOptionError ):
252+ pass
253+
215254 def __getattr__ (self , name ):
216255 """Defaults attribute lookup"""
217256 if name in self ._task_default :
218257 return self ._task_default [name ]
219258 elif name in self ._task_info :
220259 return self ._task_info [name ]
260+ elif name in self ._nodeset :
261+ return self ._nodeset [name ]
221262 raise AttributeError (name )
222263
223264 def __setattr__ (self , name , value ):
224265 """Defaults attribute assignment"""
225- if name in ('_task_default' , '_task_info' , '_task_info_pkeys_bl' ):
266+ if name in ('_task_default' , '_task_info' , '_task_info_pkeys_bl' ,
267+ '_nodeset' ):
226268 object .__setattr__ (self , name , value )
227269 elif name in self ._task_default :
228270 self ._task_default [name ] = value
229271 elif name in self ._task_info :
230272 self ._task_info [name ] = value
273+ elif name in self ._nodeset :
274+ self ._nodeset [name ] = value
231275 else :
232276 raise AttributeError (name )
233277
0 commit comments