77# except according to those terms.
88"""Module returning appropriate options per group of instances."""
99import logging
10+ import re
1011
1112from . import GroupService
1213
@@ -21,52 +22,34 @@ def __init__(self):
2122
2223 def run (self , name , metadata ):
2324 """Return dictionary with options for the group of instances."""
24- groups_by_priority = list (self .get_groups_with_priority (self .config ()))
25-
26- for priority , filters , group in sorted (groups_by_priority , key = lambda x : x [0 ]):
27- self .logger .debug ("Process group %s %s" , priority , filters )
28- for entry in filters :
29- if entry == "*" :
25+ for group in self .config ().get ("options" , []):
26+ self .logger .debug ("Process group %s" , group )
27+ entry = group .get ("match" )
28+ if not entry :
29+ self .logger .warning ("Unable to find 'match' key in %s" , group )
30+ continue
31+ if ":" not in entry :
32+ self .logger .warning (
33+ "Unable to parse 'match' value %s for %s" , entry , group ,
34+ )
35+ continue
36+ key , pattern = entry .split (":" , 1 )
37+ regex = re .compile (pattern )
38+ value = metadata
39+ for key_part in key .split ("." ):
40+ try :
41+ value = value .get (key_part )
42+ if not value :
43+ self .logger .debug ("Unable to find key %s" , key_part )
44+ break
45+ except (AttributeError , NameError ):
46+ self .logger .debug ("Unable to find key %s" , key_part )
47+ break
48+ if isinstance (value , str ) and regex .match (value ):
49+ self .logger .debug (
50+ "Match pattern %s and value %s" , pattern , value ,
51+ )
3052 result = group .get (name )
31- if result :
53+ if result is not None :
3254 return result
33- elif ":" in entry :
34- key , pattern = entry .split (":" , 1 )
35- value = metadata
36- for key_part in key .split ("." ):
37- try :
38- value = value .get (key_part )
39- if not value :
40- self .logger .debug ("Unable to find key %s" , key_part )
41- break
42- except Exception :
43- self .logger .debug ("Unable to find key %s" , key_part )
44- break
45- if pattern in value :
46- self .logger .debug (
47- "Match pattern %s and value %s" , pattern , value ,
48- )
49- result = group .get (name )
50- if result is not None :
51- return result
52- else :
53- self .logger .warning (
54- "Unable to find filter definition for %s" , group ,
55- )
5655 return {}
57-
58- def get_groups_with_priority (self , groups ):
59- """Extract priority for groups."""
60- for pattern in groups :
61- group = groups [pattern ]
62- if not isinstance (group , dict ):
63- logging .debug ("Skip group with pattern %s" , pattern )
64- continue
65- filters = pattern .split (" " , 1 )
66- priority = self .default_priority
67- if len (filters ) == 2 and filters [0 ].isdigit ():
68- priority = int (filters [0 ])
69- filters = filters [- 1 ].split ("," )
70- else :
71- filters = pattern
72- yield [priority , filters , group ]
0 commit comments