diff --git a/install/helm/agones/templates/crds/_gameserverspecvalidation.yaml b/install/helm/agones/templates/crds/_gameserverspecvalidation.yaml index cd794389bf..1ed768d7f5 100644 --- a/install/helm/agones/templates/crds/_gameserverspecvalidation.yaml +++ b/install/helm/agones/templates/crds/_gameserverspecvalidation.yaml @@ -148,4 +148,30 @@ properties: type: integer minimum: 1 maximum: 2147483648 + alpha: + type: object + title: Alpha properties for the GameServer + properties: + players: + type: object + title: Configuration of player capacity + properties: + initialCapacity: + type: integer + title: The intial player capacity that this Game Server has + minimum: 0 + webhook: + type: object + title: webhook to call when a player connects or disconnects + properties: + service: + properties: + name: + type: string + namespace: + type: string + path: + type: string + url: + type: string {{- end }} \ No newline at end of file diff --git a/install/yaml/install.yaml b/install/yaml/install.yaml index 4d14eb8e23..9177a4f9de 100644 --- a/install/yaml/install.yaml +++ b/install/yaml/install.yaml @@ -394,6 +394,32 @@ spec: type: integer minimum: 1 maximum: 2147483648 + alpha: + type: object + title: Alpha properties for the GameServer + properties: + players: + type: object + title: Configuration of player capacity + properties: + initialCapacity: + type: integer + title: The intial player capacity that this Game Server has + minimum: 0 + webhook: + type: object + title: webhook to call when a player connects or disconnects + properties: + service: + properties: + name: + type: string + namespace: + type: string + path: + type: string + url: + type: string subresources: # status enables the status subresource. status: {} @@ -678,6 +704,32 @@ spec: type: integer minimum: 1 maximum: 2147483648 + alpha: + type: object + title: Alpha properties for the GameServer + properties: + players: + type: object + title: Configuration of player capacity + properties: + initialCapacity: + type: integer + title: The intial player capacity that this Game Server has + minimum: 0 + webhook: + type: object + title: webhook to call when a player connects or disconnects + properties: + service: + properties: + name: + type: string + namespace: + type: string + path: + type: string + url: + type: string --- # Source: agones/templates/crds/gameserverallocationpolicy.yaml @@ -973,6 +1025,32 @@ spec: type: integer minimum: 1 maximum: 2147483648 + alpha: + type: object + title: Alpha properties for the GameServer + properties: + players: + type: object + title: Configuration of player capacity + properties: + initialCapacity: + type: integer + title: The intial player capacity that this Game Server has + minimum: 0 + webhook: + type: object + title: webhook to call when a player connects or disconnects + properties: + service: + properties: + name: + type: string + namespace: + type: string + path: + type: string + url: + type: string subresources: # status enables the status subresource. status: {} diff --git a/pkg/apis/agones/v1/gameserver.go b/pkg/apis/agones/v1/gameserver.go index bdc38d9a0a..66e89f8e0e 100644 --- a/pkg/apis/agones/v1/gameserver.go +++ b/pkg/apis/agones/v1/gameserver.go @@ -19,12 +19,12 @@ import ( "fmt" "net" - "github.com/mattbaird/jsonpatch" - "agones.dev/agones/pkg" "agones.dev/agones/pkg/apis" "agones.dev/agones/pkg/apis/agones" + "github.com/mattbaird/jsonpatch" "github.com/pkg/errors" + admregv1b "k8s.io/api/admissionregistration/v1beta1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -150,6 +150,20 @@ type GameServerSpec struct { SdkServer SdkServer `json:"sdkServer,omitempty"` // Template describes the Pod that will be created for the GameServer Template corev1.PodTemplateSpec `json:"template"` + // AlphaSpec describes the alpha properties for the GameServer + Alpha AlphaSpec `json:"alpha,omitempty"` +} + +// AlphaSpec is the alpha properties of the GameServer +type AlphaSpec struct { + Players PlayersSpec `json:"players"` +} + +// PlayersSpec tracks the initial player capacity, and what webhooks to send events to when there are +// connection/disconnection events. +type PlayersSpec struct { + InitialCapacity int64 `json:"initialCapacity,omitempty"` + Webhook *admregv1b.WebhookClientConfig `json:"webhook,omitempty"` } // GameServerState is the state for the GameServer @@ -210,6 +224,7 @@ type GameServerStatus struct { Address string `json:"address"` NodeName string `json:"nodeName"` ReservedUntil *metav1.Time `json:"reservedUntil"` + Alpha AlphaStatus `json:"alpha"` } // GameServerStatusPort shows the port that was allocated to a @@ -219,6 +234,17 @@ type GameServerStatusPort struct { Port int32 `json:"port"` } +// AlphaStatus is the alpha status values for a GameServer +type AlphaStatus struct { + Players PlayerStatus `json:"players"` +} + +// PlayerStatus stores the current player capacity values +type PlayerStatus struct { + Count int64 `json:"count"` + Capacity int64 `json:"capacity"` +} + // ApplyDefaults applies default values to the GameServer if they are not already populated func (gs *GameServer) ApplyDefaults() { // VersionAnnotation is the annotation that stores @@ -230,7 +256,7 @@ func (gs *GameServer) ApplyDefaults() { gs.ObjectMeta.Finalizers = append(gs.ObjectMeta.Finalizers, agones.GroupName) gs.Spec.ApplyDefaults() - gs.applyStateDefaults() + gs.applyStatusDefaults() } // ApplyDefaults applies default values to the GameServerSpec if they are not already populated @@ -277,15 +303,16 @@ func (gss *GameServerSpec) applyHealthDefaults() { } } -// applyStateDefaults applies state defaults -func (gs *GameServer) applyStateDefaults() { +// applyStatusDefaults applies Status defaults +func (gs *GameServer) applyStatusDefaults() { if gs.Status.State == "" { gs.Status.State = GameServerStateCreating - // applyStateDefaults() should be called after applyPortDefaults() + // applyStatusDefaults() should be called after applyPortDefaults() if gs.HasPortPolicy(Dynamic) || gs.HasPortPolicy(Passthrough) { gs.Status.State = GameServerStatePortAllocation } } + gs.Status.Alpha.Players.Capacity = gs.Spec.Alpha.Players.InitialCapacity } // applyPortDefaults applies default values for all ports diff --git a/pkg/apis/agones/v1/gameserver_test.go b/pkg/apis/agones/v1/gameserver_test.go index ffe6bc13ee..e9a0bae2dc 100644 --- a/pkg/apis/agones/v1/gameserver_test.go +++ b/pkg/apis/agones/v1/gameserver_test.go @@ -62,12 +62,13 @@ func TestGameServerApplyDefaults(t *testing.T) { t.Parallel() type expected struct { - protocol corev1.Protocol - state GameServerState - policy PortPolicy - health Health - scheduling apis.SchedulingStrategy - sdkServer SdkServer + protocol corev1.Protocol + state GameServerState + policy PortPolicy + health Health + scheduling apis.SchedulingStrategy + sdkServer SdkServer + alphaPlayerCapacity int64 } data := map[string]struct { gameServer GameServer @@ -77,6 +78,7 @@ func TestGameServerApplyDefaults(t *testing.T) { "set basic defaults on a very simple gameserver": { gameServer: GameServer{ Spec: GameServerSpec{ + Alpha: AlphaSpec{Players: PlayersSpec{InitialCapacity: 10}}, Ports: []GameServerPort{{ContainerPort: 999}}, Template: corev1.PodTemplateSpec{ Spec: corev1.PodSpec{Containers: []corev1.Container{ @@ -100,6 +102,7 @@ func TestGameServerApplyDefaults(t *testing.T) { GRPCPort: 9357, HTTPPort: 9358, }, + alphaPlayerCapacity: 10, }, }, "defaults on passthrough": { @@ -333,6 +336,7 @@ func TestGameServerApplyDefaults(t *testing.T) { assert.Equal(t, test.expected.scheduling, test.gameServer.Spec.Scheduling) assert.Equal(t, test.expected.health, test.gameServer.Spec.Health) assert.Equal(t, test.expected.sdkServer, test.gameServer.Spec.SdkServer) + assert.Equal(t, test.expected.alphaPlayerCapacity, test.gameServer.Status.Alpha.Players.Capacity) }) } } diff --git a/pkg/apis/agones/v1/zz_generated.deepcopy.go b/pkg/apis/agones/v1/zz_generated.deepcopy.go index 840f0f1482..bb4f9ebeea 100644 --- a/pkg/apis/agones/v1/zz_generated.deepcopy.go +++ b/pkg/apis/agones/v1/zz_generated.deepcopy.go @@ -21,9 +21,44 @@ package v1 import ( + v1beta1 "k8s.io/api/admissionregistration/v1beta1" runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlphaSpec) DeepCopyInto(out *AlphaSpec) { + *out = *in + in.Players.DeepCopyInto(&out.Players) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlphaSpec. +func (in *AlphaSpec) DeepCopy() *AlphaSpec { + if in == nil { + return nil + } + out := new(AlphaSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlphaStatus) DeepCopyInto(out *AlphaStatus) { + *out = *in + out.Players = in.Players + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlphaStatus. +func (in *AlphaStatus) DeepCopy() *AlphaStatus { + if in == nil { + return nil + } + out := new(AlphaStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Fleet) DeepCopyInto(out *Fleet) { *out = *in @@ -301,6 +336,7 @@ func (in *GameServerSpec) DeepCopyInto(out *GameServerSpec) { out.Health = in.Health out.SdkServer = in.SdkServer in.Template.DeepCopyInto(&out.Template) + in.Alpha.DeepCopyInto(&out.Alpha) return } @@ -326,6 +362,7 @@ func (in *GameServerStatus) DeepCopyInto(out *GameServerStatus) { in, out := &in.ReservedUntil, &out.ReservedUntil *out = (*in).DeepCopy() } + out.Alpha = in.Alpha return } @@ -389,6 +426,43 @@ func (in *Health) DeepCopy() *Health { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlayerStatus) DeepCopyInto(out *PlayerStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlayerStatus. +func (in *PlayerStatus) DeepCopy() *PlayerStatus { + if in == nil { + return nil + } + out := new(PlayerStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlayersSpec) DeepCopyInto(out *PlayersSpec) { + *out = *in + if in.Webhook != nil { + in, out := &in.Webhook, &out.Webhook + *out = new(v1beta1.WebhookClientConfig) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlayersSpec. +func (in *PlayersSpec) DeepCopy() *PlayersSpec { + if in == nil { + return nil + } + out := new(PlayersSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SdkServer) DeepCopyInto(out *SdkServer) { *out = *in diff --git a/site/content/en/docs/Reference/agones_crd_api_reference.html b/site/content/en/docs/Reference/agones_crd_api_reference.html index f2099a04bc..a10ac5334d 100644 --- a/site/content/en/docs/Reference/agones_crd_api_reference.html +++ b/site/content/en/docs/Reference/agones_crd_api_reference.html @@ -2534,6 +2534,19 @@

GameServer

Template describes the Pod that will be created for the GameServer

+ + +alpha
+ + +AlphaSpec + + + + +

AlphaSpec describes the alpha properties for the GameServer

+ + @@ -2662,6 +2675,68 @@

GameServerSet +

AlphaSpec +

+

+(Appears on: +GameServerSpec) +

+

+

AlphaSpec is the alpha properties of the GameServer

+

+ + + + + + + + + + + + + +
FieldDescription
+players
+ + +PlayersSpec + + +
+
+

AlphaStatus +

+

+(Appears on: +GameServerStatus) +

+

+

AlphaStatus is the alpha status values for a GameServer

+

+ + + + + + + + + + + + + +
FieldDescription
+players
+ + +PlayerStatus + + +
+

FleetSpec

@@ -3098,6 +3173,19 @@

GameServerSpec

Template describes the Pod that will be created for the GameServer

+ + +alpha
+ + +AlphaSpec + + + + +

AlphaSpec describes the alpha properties for the GameServer

+ +

GameServerState @@ -3183,6 +3271,18 @@

GameServerStatus + + +alpha
+ + +AlphaStatus + + + + + +

GameServerStatusPort @@ -3346,6 +3446,19 @@

GameServerTemplateSpec

Template describes the Pod that will be created for the GameServer

+ + +alpha
+ + +AlphaSpec + + + + +

AlphaSpec describes the alpha properties for the GameServer

+ + @@ -3414,6 +3527,87 @@

Health +

PlayerStatus +

+

+(Appears on: +AlphaStatus) +

+

+

PlayerStatus stores the current player capacity values

+

+ + + + + + + + + + + + + + + + + +
FieldDescription
+count
+ +int64 + +
+
+capacity
+ +int64 + +
+
+

PlayersSpec +

+

+(Appears on: +AlphaSpec) +

+

+

PlayersSpec tracks the initial player capacity, and what webhooks to send events to when there are +connection/disconnection events.

+

+ + + + + + + + + + + + + + + + + +
FieldDescription
+initialCapacity
+ +int64 + +
+
+webhook
+ + +Kubernetes admissionregistration/v1beta1.WebhookClientConfig + + +
+

PortPolicy (string alias)