def _extract_conf(self, cfg): """Extract cluster nodes configuration""" conf = {"default": {}} for key, val in cfg.iteritems(): if key == 'default': conf['default'].update(val) elif isinstance(val, dict): if isinstance(key, int): rset = RangeSet.fromone(key) else: try: rset = RangeSet(key) except RangeSetParseError as err: _LOGGER.warning( "Error in configuration file:" " %s. Ingnoring this part", err) continue for idx in rset: conf[idx] = val else: conf['default'][key] = val try: conf = clustdock.format_dict(conf, **self.__dict__) except KeyError: _LOGGER.exception("Key not found:") return conf
def _iterbase(self): """Iterator on single, one-item NodeSetBase objects.""" for pat, ivec, pad, autostep in self._iter(): rset = None # 'no node index' by default if ivec is not None: assert len(ivec) > 0 if len(ivec) == 1: rset = RangeSet.fromone(ivec[0], pad[0] or 0, autostep) else: rset = RangeSetND([ivec], pad, autostep) yield NodeSetBase(pat, rset)
def testFromOneConstructor(self): """test RangeSet.fromone() constructor""" rgs = RangeSet.fromone(42) self.assertEqual(str(rgs), "42") self.assertEqual(len(rgs), 1) # also support slice object (v1.6+) rgs = RangeSet.fromone(slice(42)) self.assertEqual(str(rgs), "0-41") self.assertEqual(len(rgs), 42) self.assertRaises(ValueError, RangeSet.fromone, slice(12, None)) rgs = RangeSet.fromone(slice(42, 43)) self.assertEqual(str(rgs), "42") self.assertEqual(len(rgs), 1) rgs = RangeSet.fromone(slice(42, 48)) self.assertEqual(str(rgs), "42-47") self.assertEqual(len(rgs), 6) rgs = RangeSet.fromone(slice(42, 57, 2)) self.assertEqual(str(rgs), "42,44,46,48,50,52,54,56") rgs.autostep = 3 self.assertEqual(str(rgs), "42-56/2") self.assertEqual(len(rgs), 8)
def nsiter(self): """Object-based NodeSet iterator on single nodes.""" for pat, ivec, pad, autostep in self._iter(): nodeset = self.__class__() if ivec is not None: if len(ivec) == 1: nodeset._add_new(pat, \ RangeSet.fromone(ivec[0], pad[0] or 0)) else: nodeset._add_new(pat, RangeSetND([ivec], None, autostep)) else: nodeset._add_new(pat, None) yield nodeset
def _scan_string_single(self, nsstr, autostep): """Single node scan, returns (pat, list of rangesets)""" # ignore whitespace(s) node = nsstr.strip() if len(node) == 0: raise NodeSetParseError(nsstr, "empty node name") # single node parsing pfx_nd = [mobj.groups() for mobj in self.base_node_re.finditer(node)] pfx_nd = pfx_nd[:-1] if not pfx_nd: raise NodeSetParseError(node, "parse error") # pfx+sfx cannot be empty if len(pfx_nd) == 1 and len(pfx_nd[0][0]) == 0: raise NodeSetParseError(node, "empty node name") pat = "" rangesets = [] for pfx, idx in pfx_nd: if idx: # optimization: process single index padding directly pad = 0 if int(idx) != 0: idxs = idx.lstrip("0") if len(idx) - len(idxs) > 0: pad = len(idx) idxint = int(idxs) else: if len(idx) > 1: pad = len(idx) idxint = 0 if idxint > 1e100: raise NodeSetParseRangeError( \ RangeSetParseError(idx, "invalid rangeset index")) # optimization: use numerical RangeSet constructor pat += "%s%%s" % pfx rangesets.append(RangeSet.fromone(idxint, pad, autostep)) else: # undefined pad means no node index pat += pfx return pat, rangesets