@@ -25,8 +25,8 @@ class LBProviderEvents(ObjectEvents):
25
25
26
26
27
27
class LBProvider (VersionedInterface ):
28
- """ API used to interact with the provider of loadbalancers.
29
- """
28
+ """API used to interact with the provider of loadbalancers."""
29
+
30
30
state = StoredState ()
31
31
on = LBProviderEvents ()
32
32
@@ -35,14 +35,15 @@ def __init__(self, charm, relation_name):
35
35
self .relation_name = relation_name
36
36
# just call this to enforce that only one app can be related
37
37
self .model .get_relation (relation_name )
38
- self .state .set_default (response_hashes = {},
39
- was_available = False )
40
-
41
- for event in (charm .on [relation_name ].relation_created ,
42
- charm .on [relation_name ].relation_joined ,
43
- charm .on [relation_name ].relation_changed ,
44
- charm .on [relation_name ].relation_departed ,
45
- charm .on [relation_name ].relation_broken ):
38
+ self .state .set_default (response_hashes = {}, was_available = False )
39
+
40
+ for event in (
41
+ charm .on [relation_name ].relation_created ,
42
+ charm .on [relation_name ].relation_joined ,
43
+ charm .on [relation_name ].relation_changed ,
44
+ charm .on [relation_name ].relation_departed ,
45
+ charm .on [relation_name ].relation_broken ,
46
+ ):
46
47
self .framework .observe (event , self ._check_provider )
47
48
48
49
def _check_provider (self , event ):
@@ -63,19 +64,19 @@ def relation(self):
63
64
return self .relations [0 ] if self .relations else None
64
65
65
66
def get_request (self , name ):
66
- """ Get or create a Load Balancer Request object.
67
+ """Get or create a Load Balancer Request object.
67
68
68
69
May raise a ModelError if unable to create a request.
69
70
"""
70
71
if not self .charm .unit .is_leader ():
71
- raise ModelError (' Unit is not leader' )
72
+ raise ModelError (" Unit is not leader" )
72
73
if not self .relation :
73
- raise ModelError (' Relation not available' )
74
+ raise ModelError (" Relation not available" )
74
75
schema = self ._schema (self .relation )
75
76
local_data = self .relation .data [self .app ]
76
77
remote_data = self .relation .data [self .relation .app ]
77
- request_key = ' request_' + name
78
- response_key = ' response_' + name
78
+ request_key = " request_" + name
79
+ response_key = " response_" + name
79
80
if request_key in local_data :
80
81
request_sdata = local_data [request_key ]
81
82
response_sdata = remote_data .get (response_key )
@@ -85,7 +86,7 @@ def get_request(self, name):
85
86
return request
86
87
87
88
def get_response (self , name ):
88
- """ Get a specific Load Balancer Response by name.
89
+ """Get a specific Load Balancer Response by name.
89
90
90
91
This is equivalent to `get_request(name).response`, except that it
91
92
will return `None` if the response is not available.
@@ -98,85 +99,85 @@ def get_response(self, name):
98
99
return request .response
99
100
100
101
def send_request (self , request ):
101
- """ Send a specific request.
102
+ """Send a specific request.
102
103
103
104
May raise a ModelError if unable to send the request.
104
105
"""
105
106
if not self .charm .unit .is_leader ():
106
- raise ModelError (' Unit is not leader' )
107
+ raise ModelError (" Unit is not leader" )
107
108
if not self .relation :
108
- raise ModelError (' Relation not available' )
109
+ raise ModelError (" Relation not available" )
109
110
# The sent_hash is used to tell when the provider's response has been
110
111
# updated to match our request. We can't used the request hash computed
111
112
# on the providing side because it may not match due to default values
112
113
# being filled in on that side (e.g., the backend addresses).
113
114
request .sent_hash = request .hash
114
- key = ' request_' + request .name
115
+ key = " request_" + request .name
115
116
self .relation .data [self .app ][key ] = request .dumps ()
116
117
117
118
def remove_request (self , name ):
118
- """ Remove a specific request.
119
+ """Remove a specific request.
119
120
120
121
May raise a ModelError if unable to remove the request.
121
122
"""
122
123
if not self .charm .unit .is_leader ():
123
- raise ModelError (' Unit is not leader' )
124
+ raise ModelError (" Unit is not leader" )
124
125
if not self .relation :
125
126
return
126
- key = ' request_' + name
127
+ key = " request_" + name
127
128
self .relation .data [self .app ].pop (key , None )
128
129
self .state .response_hashes .pop (name , None )
129
130
130
131
@property
131
132
def all_requests (self ):
132
- """ A list of all requests which have been made.
133
- """
133
+ """A list of all requests which have been made."""
134
134
requests = []
135
135
if self .relation :
136
136
for key in sorted (self .relation .data [self .app ].keys ()):
137
- if not key .startswith (' request_' ):
137
+ if not key .startswith (" request_" ):
138
138
continue
139
- requests .append (self .get_request (key [len (' request_' ) :]))
139
+ requests .append (self .get_request (key [len (" request_" ) :]))
140
140
return requests
141
141
142
142
@property
143
143
def revoked_responses (self ):
144
- """ A list of responses which are no longer available.
145
- """
146
- return [ request .response
147
- for request in self .all_requests
148
- if not request .response
149
- and request . name in self . state . response_hashes ]
144
+ """A list of responses which are no longer available."""
145
+ return [
146
+ request .response
147
+ for request in self .all_requests
148
+ if not request .response and request . name in self . state . response_hashes
149
+ ]
150
150
151
151
@cached_property
152
152
def all_responses (self ):
153
- """ A list of all responses which are available.
154
- """
155
- return [request .response
156
- for request in self .all_requests
157
- if request .response ]
153
+ """A list of all responses which are available."""
154
+ return [request .response for request in self .all_requests if request .response ]
158
155
159
156
@cached_property
160
157
def complete_responses (self ):
161
- """ A list of all responses which are up to date with their associated
158
+ """A list of all responses which are up to date with their associated
162
159
request.
163
160
"""
164
- return [request .response
165
- for request in self .all_requests
166
- if request .response .received_hash == request .sent_hash ]
161
+ return [
162
+ request .response
163
+ for request in self .all_requests
164
+ if request .response .received_hash == request .sent_hash
165
+ ]
167
166
168
167
@property
169
168
def new_responses (self ):
170
- """ A list of complete responses which have not yet been acknowledged as
169
+ """A list of complete responses which have not yet been acknowledged as
171
170
handled or which have changed.
172
171
"""
173
172
acked_responses = self .state .response_hashes
174
- return [response
175
- for response in self .complete_responses
176
- if response .hash != acked_responses .get (response .name )]
173
+ return [
174
+ response
175
+ for response in self .complete_responses
176
+ if response .hash != acked_responses .get (response .name )
177
+ ]
177
178
178
179
def ack_response (self , response ):
179
- """ Acknowledge that a given response has been handled.
180
+ """Acknowledge that a given response has been handled.
180
181
181
182
Can be called on a revoked response as well to remove it
182
183
from the revoked_responses list.
@@ -188,8 +189,9 @@ def ack_response(self, response):
188
189
if not self .is_changed :
189
190
try :
190
191
from charms .reactive import clear_flag
191
- prefix = 'endpoint.' + self .relation_name
192
- clear_flag (prefix + '.responses_changed' )
192
+
193
+ prefix = "endpoint." + self .relation_name
194
+ clear_flag (prefix + ".responses_changed" )
193
195
except ImportError :
194
196
pass # not being used in a reactive charm
195
197
@@ -206,9 +208,9 @@ def can_request(self):
206
208
return self .is_available and self .unit .is_leader ()
207
209
208
210
def manage_flags (self ):
209
- """ Used to interact with charms.reactive-base charms.
210
- """
211
+ """Used to interact with charms.reactive-base charms."""
211
212
from charms .reactive import toggle_flag
212
- prefix = 'endpoint.' + self .relation_name
213
- toggle_flag (prefix + '.available' , self .is_available )
214
- toggle_flag (prefix + '.responses_changed' , self .is_changed )
213
+
214
+ prefix = "endpoint." + self .relation_name
215
+ toggle_flag (prefix + ".available" , self .is_available )
216
+ toggle_flag (prefix + ".responses_changed" , self .is_changed )
0 commit comments