11
22import datetime
3+ from google .protobuf .duration_pb2 import Duration
34from crossplane .function .proto .v1 import run_function_pb2 as fnv1
45
56from . import protobuf
910
1011
1112class BaseComposite :
12- def __init__ (self , request , response , logger ):
13+ def __init__ (self , request , logger ):
1314 self .request = protobuf .Message (None , 'request' , request .DESCRIPTOR , request , 'Function Request' )
15+ response = fnv1 .RunFunctionResponse (
16+ meta = fnv1 .ResponseMeta (
17+ tag = request .meta .tag ,
18+ ttl = Duration (
19+ seconds = 60 ,
20+ ),
21+ ),
22+ desired = request .desired ,
23+ context = request .context ,
24+ )
1425 self .response = protobuf .Message (None , 'response' , response .DESCRIPTOR , response )
1526 self .logger = logger
1627 self .credentials = Credentials (self .request )
@@ -36,11 +47,23 @@ def __init__(self, request, response, logger):
3647
3748 @property
3849 def ttl (self ):
50+ if self .response .meta .ttl .nanos :
51+ return float (self .response .meta .ttl .seconds ) + (float (self .response .meta .ttl .nanos ) / 1000000000.0 )
3952 return self .response .meta .ttl .seconds
4053
4154 @ttl .setter
4255 def ttl (self , ttl ):
43- self .response .meta .ttl .seconds = ttl
56+ if isinstance (ttl , int ):
57+ self .response .meta .ttl .seconds = ttl
58+ self .response .meta .ttl .nanos = 0
59+ elif isinstance (ttl , float ):
60+ self .response .meta .ttl .seconds = int (ttl )
61+ if ttl .is_integer ():
62+ self .response .meta .ttl .nanos = 0
63+ else :
64+ self .response .meta .ttl .nanos = int ((ttl - self .response .meta .ttl .seconds ) * 1000000000 )
65+ else :
66+ raise ValueError ('ttl must be an int or float' )
4467
4568 @property
4669 def ready (self ):
@@ -73,22 +96,46 @@ def __getattr__(self, key):
7396 return self [key ]
7497
7598 def __getitem__ (self , key ):
76- return self ._request .credentials [key ]. credentials_data . data
99+ return Credential ( self ._request .credentials [key ])
77100
78101 def __bool__ (self ):
79- return bool (_request .credentials )
102+ return bool (self . _request .credentials )
80103
81104 def __len__ (self ):
82105 return len (self ._request .credentials )
83106
84107 def __contains__ (self , key ):
85- return key in _request .credentials
108+ return key in self . _request .credentials
86109
87110 def __iter__ (self ):
88111 for key , resource in self ._request .credentials :
89112 yield key , self [key ]
90113
91114
115+ class Credential :
116+ def __init__ (self , credential ):
117+ self .__dict__ ['_credential' ] = credential
118+
119+ def __getattr__ (self , key ):
120+ return self [key ]
121+
122+ def __getitem__ (self , key ):
123+ return self ._credential .credential_data .data [key ]
124+
125+ def __bool__ (self ):
126+ return bool (self ._credential .credential_data .data )
127+
128+ def __len__ (self ):
129+ return len (self ._credential .credential_data .data )
130+
131+ def __contains__ (self , key ):
132+ return key in self ._credential .credential_data .data
133+
134+ def __iter__ (self ):
135+ for key , resource in self ._credential .credential_data .data :
136+ yield key , self [key ]
137+
138+
92139class Resources :
93140 def __init__ (self , composite ):
94141 self .__dict__ ['_composite' ] = composite
@@ -587,7 +634,7 @@ def __len__(self):
587634 def __getitem__ (self , key ):
588635 if key >= len (self ._results ):
589636 return Event ()
590- return Event (self ._results [ix ])
637+ return Event (self ._results [key ])
591638
592639 def __iter__ (self ):
593640 for ix in range (len (self ._results )):
0 commit comments