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 @@
Template describes the Pod that will be created for the GameServer
+alpha
+
+
+AlphaSpec
+
+
+AlphaSpec describes the alpha properties for the GameServer
++(Appears on: +GameServerSpec) +
++
AlphaSpec is the alpha properties of the GameServer
+ +Field | +Description | +
---|---|
+players
+
+
+PlayersSpec
+
+
+ |
++ | +
+(Appears on: +GameServerStatus) +
++
AlphaStatus is the alpha status values for a GameServer
+ +Field | +Description | +
---|---|
+players
+
+
+PlayerStatus
+
+
+ |
++ | +
@@ -3098,6 +3173,19 @@
Template describes the Pod that will be created for the GameServer
+alpha
+
+
+AlphaSpec
+
+
+AlphaSpec describes the alpha properties for the GameServer
+alpha
+
+
+AlphaStatus
+
+
+Template describes the Pod that will be created for the GameServer
+alpha
+
+
+AlphaSpec
+
+
+AlphaSpec describes the alpha properties for the GameServer
++(Appears on: +AlphaStatus) +
++
PlayerStatus stores the current player capacity values
+ +Field | +Description | +
---|---|
+count
+
+int64
+
+ |
++ | +
+capacity
+
+int64
+
+ |
++ | +
+(Appears on: +AlphaSpec) +
++
PlayersSpec tracks the initial player capacity, and what webhooks to send events to when there are +connection/disconnection events.
+ +Field | +Description | +
---|---|
+initialCapacity
+
+int64
+
+ |
++ | +
+webhook
+
+
+Kubernetes admissionregistration/v1beta1.WebhookClientConfig
+
+
+ |
++ | +
string
alias)