diff --git a/pkg/sdkserver/sdkserver.go b/pkg/sdkserver/sdkserver.go index fd9658dba0..7eab5af5fc 100644 --- a/pkg/sdkserver/sdkserver.go +++ b/pkg/sdkserver/sdkserver.go @@ -1383,12 +1383,17 @@ func (s *SDKServer) updatePlayerCapacity(ctx context.Context) error { gsCopy.Status.Players.Capacity = s.gsPlayerCapacity s.gsUpdateMutex.RUnlock() - gs, err = s.gameServerGetter.GameServers(s.namespace).Update(ctx, gsCopy, metav1.UpdateOptions{}) + patch, err := gs.Patch(gsCopy) if err != nil { return err } - s.recorder.Event(gs, corev1.EventTypeNormal, "PlayerCapacity", fmt.Sprintf("Set to %d", gs.Status.Players.Capacity)) - return nil + + gs, err = s.gameServerGetter.GameServers(s.namespace).Patch(ctx, gs.GetObjectMeta().GetName(), types.JSONPatchType, patch, metav1.PatchOptions{}) + if err == nil { + s.recorder.Event(gs, corev1.EventTypeNormal, "PlayerCapacity", fmt.Sprintf("Set to %d", gs.Status.Players.Capacity)) + } + + return err } // updateConnectedPlayers updates the Player IDs and Count fields in the GameServer's Status. @@ -1416,12 +1421,17 @@ func (s *SDKServer) updateConnectedPlayers(ctx context.Context) error { return nil } - gs, err = s.gameServerGetter.GameServers(s.namespace).Update(ctx, gsCopy, metav1.UpdateOptions{}) + patch, err := gs.Patch(gsCopy) if err != nil { return err } - s.recorder.Event(gs, corev1.EventTypeNormal, "PlayerCount", fmt.Sprintf("Set to %d", gs.Status.Players.Count)) - return nil + + gs, err = s.gameServerGetter.GameServers(s.namespace).Patch(ctx, gs.GetObjectMeta().GetName(), types.JSONPatchType, patch, metav1.PatchOptions{}) + if err == nil { + s.recorder.Event(gs, corev1.EventTypeNormal, "PlayerCount", fmt.Sprintf("Set to %d", gs.Status.Players.Count)) + } + + return err } // NewSDKServerContext returns a Context that cancels when SIGTERM or os.Interrupt diff --git a/pkg/sdkserver/sdkserver_test.go b/pkg/sdkserver/sdkserver_test.go index 5bedc75b88..6199e6ecc7 100644 --- a/pkg/sdkserver/sdkserver_test.go +++ b/pkg/sdkserver/sdkserver_test.go @@ -1863,30 +1863,32 @@ func TestSDKServerPlayerCapacity(t *testing.T) { sc, err := defaultSidecar(m) require.NoError(t, err) - m.AgonesClient.AddReactor("list", "gameservers", func(action k8stesting.Action) (bool, runtime.Object, error) { - gs := agonesv1.GameServer{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test", Namespace: "default", + gs := agonesv1.GameServer{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", Namespace: "default", + }, + Spec: agonesv1.GameServerSpec{ + SdkServer: agonesv1.SdkServer{ + LogLevel: "Debug", }, - Spec: agonesv1.GameServerSpec{ - SdkServer: agonesv1.SdkServer{ - LogLevel: "Debug", - }, - Players: &agonesv1.PlayersSpec{ - InitialCapacity: 10, - }, + Players: &agonesv1.PlayersSpec{ + InitialCapacity: 10, }, - } - gs.ApplyDefaults() + }, + } + gs.ApplyDefaults() + + m.AgonesClient.AddReactor("list", "gameservers", func(action k8stesting.Action) (bool, runtime.Object, error) { return true, &agonesv1.GameServerList{Items: []agonesv1.GameServer{*gs.DeepCopy()}}, nil }) updated := make(chan int64, 10) - m.AgonesClient.AddReactor("update", "gameservers", func(action k8stesting.Action) (bool, runtime.Object, error) { - ua := action.(k8stesting.UpdateAction) - gs := ua.GetObject().(*agonesv1.GameServer) - updated <- gs.Status.Players.Capacity - return true, gs, nil + m.AgonesClient.AddReactor("patch", "gameservers", func(action k8stesting.Action) (bool, runtime.Object, error) { + + gsCopy := PatchGameServer(t, action, &gs) + + updated <- gsCopy.Status.Players.Capacity + return true, gsCopy, nil }) assert.NoError(t, sc.WaitForConnection(ctx)) @@ -1920,7 +1922,7 @@ func TestSDKServerPlayerCapacity(t *testing.T) { case value := <-updated: assert.Equal(t, int64(20), value) case <-time.After(time.Minute): - assert.Fail(t, "Should have been updated") + assert.Fail(t, "Should have been patched") } agtesting.AssertEventContains(t, m.FakeRecorder.Events, "PlayerCapacity Set to 20") @@ -2014,30 +2016,31 @@ func TestSDKServerPlayerConnectAndDisconnect(t *testing.T) { require.NoError(t, err) capacity := int64(3) - m.AgonesClient.AddReactor("list", "gameservers", func(action k8stesting.Action) (bool, runtime.Object, error) { - gs := agonesv1.GameServer{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test", Namespace: "default", + gs := agonesv1.GameServer{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", Namespace: "default", + }, + Spec: agonesv1.GameServerSpec{ + SdkServer: agonesv1.SdkServer{ + LogLevel: "Debug", }, - Spec: agonesv1.GameServerSpec{ - SdkServer: agonesv1.SdkServer{ - LogLevel: "Debug", - }, - // this is here to give us a reference, so we know when sc.Run() has completed. - Players: &agonesv1.PlayersSpec{ - InitialCapacity: capacity, - }, + // this is here to give us a reference, so we know when sc.Run() has completed. + Players: &agonesv1.PlayersSpec{ + InitialCapacity: capacity, }, - } - gs.ApplyDefaults() - return true, &agonesv1.GameServerList{Items: []agonesv1.GameServer{gs}}, nil + }, + } + gs.ApplyDefaults() + + m.AgonesClient.AddReactor("list", "gameservers", func(action k8stesting.Action) (bool, runtime.Object, error) { + return true, &agonesv1.GameServerList{Items: []agonesv1.GameServer{*gs.DeepCopy()}}, nil }) + updated := make(chan *agonesv1.PlayerStatus, 10) - m.AgonesClient.AddReactor("update", "gameservers", func(action k8stesting.Action) (bool, runtime.Object, error) { - ua := action.(k8stesting.UpdateAction) - gs := ua.GetObject().(*agonesv1.GameServer) - updated <- gs.Status.Players - return true, gs, nil + m.AgonesClient.AddReactor("patch", "gameservers", func(action k8stesting.Action) (bool, runtime.Object, error) { + gsCopy := PatchGameServer(t, action, &gs) + updated <- gsCopy.Status.Players + return true, gsCopy, nil }) assert.NoError(t, sc.WaitForConnection(ctx))