Skip to content

Commit 57040f8

Browse files
authored
fix: Guard against invalid gameserver events (#1041)
1 parent 5953b80 commit 57040f8

File tree

1 file changed

+34
-7
lines changed

1 file changed

+34
-7
lines changed

src/config/providers/k8s.rs

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use std::{collections::BTreeSet, sync::Arc};
2020

2121
use futures::Stream;
2222
use k8s_openapi::api::core::v1::ConfigMap;
23-
use kube::runtime::watcher::Event;
23+
use kube::{core::DeserializeGuard, runtime::watcher::Event};
2424

2525
use agones::GameServer;
2626

@@ -104,10 +104,13 @@ fn configmap_events(
104104
fn gameserver_events(
105105
client: kube::Client,
106106
namespace: impl AsRef<str>,
107-
) -> impl Stream<Item = Result<Event<GameServer>, kube::runtime::watcher::Error>> {
107+
) -> impl Stream<Item = Result<Event<DeserializeGuard<GameServer>>, kube::runtime::watcher::Error>>
108+
{
108109
let gameservers_namespace = namespace.as_ref();
109-
let gameservers: kube::Api<GameServer> = kube::Api::namespaced(client, gameservers_namespace);
110-
let gs_writer = kube::runtime::reflector::store::Writer::<GameServer>::default();
110+
let gameservers: kube::Api<DeserializeGuard<GameServer>> =
111+
kube::Api::namespaced(client, gameservers_namespace);
112+
let gs_writer =
113+
kube::runtime::reflector::store::Writer::<DeserializeGuard<GameServer>>::default();
111114
let mut config = kube::runtime::watcher::Config::default()
112115
// Default timeout is 5 minutes, far too slow for us to react.
113116
.timeout(15)
@@ -134,7 +137,15 @@ pub fn update_endpoints_from_gameservers(
134137
for await event in gameserver_events(client, namespace) {
135138
let ads = address_selector.as_ref();
136139
match event? {
137-
Event::Apply(server) => {
140+
Event::Apply(result) => {
141+
let server = match result.0 {
142+
Ok(server) => server,
143+
Err(error) => {
144+
tracing::debug!(%error, "couldn't decode gameserver event");
145+
continue;
146+
}
147+
};
148+
138149
tracing::debug!("received applied event from k8s");
139150
if !server.is_allocated() {
140151
yield Ok(());
@@ -151,7 +162,15 @@ pub fn update_endpoints_from_gameservers(
151162
.replace(locality.clone(), endpoint);
152163
}
153164
Event::Init => {},
154-
Event::InitApply(server) => {
165+
Event::InitApply(result) => {
166+
let server = match result.0 {
167+
Ok(server) => server,
168+
Err(error) => {
169+
tracing::debug!(%error, "couldn't decode gameserver event");
170+
continue;
171+
}
172+
};
173+
155174
if server.is_allocated() {
156175
if let Some(ep) = server.endpoint(ads) {
157176
servers.insert(ep);
@@ -168,7 +187,15 @@ pub fn update_endpoints_from_gameservers(
168187

169188
config.clusters.write().insert(locality.clone(), std::mem::take(&mut servers));
170189
}
171-
Event::Delete(server) => {
190+
Event::Delete(result) => {
191+
let server = match result.0 {
192+
Ok(server) => server,
193+
Err(error) => {
194+
tracing::debug!(%error, "couldn't decode gameserver event");
195+
continue;
196+
}
197+
};
198+
172199
tracing::debug!("received delete event from k8s");
173200
let found = if let Some(endpoint) = server.endpoint(ads) {
174201
config.clusters.write().remove_endpoint(&endpoint)

0 commit comments

Comments
 (0)