1+ import logging
2+ from datetime import datetime
3+
14from cid .exceptions import CidCritical
25
6+ logger = logging .getLogger (__name__ )
7+
38class AthenaStore ():
49 def __init__ (self , athena , view_name = 'cid_parameters' ):
510 self .athena = athena
611 self .view_name = view_name
712
813 def dump (self , data ):
9- ''' load from athena
14+ ''' dump data to athena
1015 '''
11- # FIXME: make it multi view
12- self .athena .query (self ._generate_view_query (data , self .view_name ))
16+ try :
17+ # FIXME: make it multi view
18+ self .athena .query (self ._generate_view_query (data , self .view_name ))
19+ except (CidCritical , Exception ) as exc :
20+ logger .debug (f'failed to save parameters store: { exc } ' )
1321
1422 def load (self ):
1523 ''' load from athena
@@ -44,8 +52,37 @@ def _generate_view_query(self, data, name):
4452class ParametersController (AthenaStore ):
4553 def load_parameters (self , context ):
4654 data = self .load ()
47- return { line .get ('parameter' ):line .get ('value' ) for line in data }
55+ context_parameters = {}
56+ any_parameters = {}
57+ # get any context and then override with specific context
58+ for line in sorted (data , key = lambda x : x .get ('date' , '' )): # latest should override
59+ any_parameters [line .get ('parameter' )] = line .get ('value' )
60+ if line .get ('context' ) == str (context ):
61+ context_parameters [line .get ('parameter' )] = line .get ('value' )
62+ return any_parameters | context_parameters
4863
4964 def dump_parameters (self , params , context = None ):
50- data = [{'parameter' : key , 'value' : ',' .join (val ) if isinstance (val , list ) else val , 'context' : str (context ) } for key , val in params .items ()]
65+ data = self .load ()
66+ logger .trace (f'loaded parameters { data } ' )
67+ params = dict (params )
68+ date = datetime .now ().strftime ("%Y-%m-%d %H:%M:%S" )
69+
70+ #Update parameters if they are present already
71+ for line in data :
72+ for key , val in list (params .items ()):
73+ if line .get ('context' ) == str (context ) and line .get ('parameter' ) == key :
74+ line ['value' ] = val
75+ line ['date' ] = date
76+ del params [key ]
77+
78+ #add parameters that are new
79+ for key , val in list (params .items ()):
80+ data .append ({
81+ 'parameter' : key ,
82+ 'value' : ',' .join ([str (v ) for v in val ]) if isinstance (val , list ) else str (val ),
83+ 'context' : str (context ),
84+ 'date' : date
85+ })
86+
87+ logger .trace (f'dumping parameters { data } ' )
5188 self .dump (data )
0 commit comments