23
23
import io .fabric8 .kubernetes .api .model .ObjectMeta ;
24
24
import io .fabric8 .kubernetes .api .model .ObjectReferenceBuilder ;
25
25
import io .fabric8 .kubernetes .client .KubernetesClient ;
26
+ import io .fabric8 .kubernetes .client .KubernetesClientException ;
27
+ import org .slf4j .Logger ;
28
+ import org .slf4j .LoggerFactory ;
26
29
27
30
import javax .annotation .Nullable ;
28
31
32
+ import java .net .HttpURLConnection ;
29
33
import java .time .Duration ;
30
34
import java .time .Instant ;
31
35
import java .util .Map ;
36
+ import java .util .Optional ;
32
37
import java .util .function .Consumer ;
33
38
import java .util .function .Predicate ;
34
39
37
42
* https://github.com/EnMasseProject/enmasse/blob/master/k8s-api/src/main/java/io/enmasse/k8s/api/KubeEventLogger.java
38
43
*/
39
44
public class EventUtils {
45
+ private static final Logger LOG = LoggerFactory .getLogger (EventUtils .class );
40
46
41
47
public static String generateEventName (
42
48
HasMetadata target ,
@@ -108,7 +114,7 @@ public static boolean createIfNotExists(
108
114
return false ;
109
115
} else {
110
116
Event event = buildEvent (target , type , reason , message , component , eventName );
111
- eventListener . accept (client . resource ( event ).createOrReplace () );
117
+ createOrReplaceEvent (client , event ).ifPresent ( eventListener );
112
118
return true ;
113
119
}
114
120
}
@@ -139,7 +145,7 @@ public static boolean createOrUpdateEventWithLabels(
139
145
} else {
140
146
Event event = buildEvent (target , type , reason , message , component , eventName );
141
147
setLabels (event , labels );
142
- eventListener . accept (client . resource ( event ).createOrReplace () );
148
+ createOrReplaceEvent (client , event ).ifPresent ( eventListener );
143
149
return true ;
144
150
}
145
151
}
@@ -154,7 +160,7 @@ private static void updatedEventWithLabels(
154
160
existing .setCount (existing .getCount () + 1 );
155
161
existing .setMessage (message );
156
162
setLabels (existing , labels );
157
- eventListener . accept (client . resource ( existing ).createOrReplace () );
163
+ createOrReplaceEvent (client , existing ).ifPresent ( eventListener );
158
164
}
159
165
160
166
private static void setLabels (Event existing , @ Nullable Map <String , String > labels ) {
@@ -213,4 +219,20 @@ private static boolean labelCheck(
213
219
|| (existing .getMetadata () != null
214
220
&& dedupePredicate .test (existing .getMetadata ().getLabels ()));
215
221
}
222
+
223
+ private static Optional <Event > createOrReplaceEvent (KubernetesClient client , Event event ) {
224
+ try {
225
+ Event createdEvent = client .resource (event ).createOrReplace ();
226
+ return Optional .of (createdEvent );
227
+ } catch (KubernetesClientException e ) {
228
+ if (e .getCode () == HttpURLConnection .HTTP_FORBIDDEN ) {
229
+ // fail the reconcile when events cannot be delivered, unless FORBIDDEN
230
+ // which can be a result of recoverable rbac issue, or namespace is terminating
231
+ LOG .warn ("Cannot create or update events, proceeding." , e );
232
+ } else {
233
+ throw e ;
234
+ }
235
+ }
236
+ return Optional .empty ();
237
+ }
216
238
}
0 commit comments