@@ -15,6 +15,7 @@ import (
1515 "k8s.io/client-go/rest"
1616 "k8s.io/client-go/tools/cache"
1717
18+ "agones-minecraft/config"
1819 k8s "agones-minecraft/services/k8s"
1920)
2021
@@ -58,14 +59,26 @@ const (
5859 // volumes
5960
6061 DefaultDataVolumeName string = "world-vol"
62+
63+ // annotations
64+
65+ HostnameAnnotation string = "external-dns.alpha.kubernetes.io/hostname"
66+ SRVServiceAnnotation string = "external-dns.alpha.kubernetes.io/gameserver-service"
67+ JavaSRVServiceName string = "minecraft"
68+ CustomSubdomainAnnotation string = "external-dns.alpha.kubernetes.io/gameserver-subdomain"
69+
70+ // labels
71+
72+ EditionLabel string = "edition"
6173)
6274
6375var agonesClient * AgonesClient
6476
6577// Agones clientset wrapper
6678type AgonesClient struct {
67- clientSet * versioned.Clientset
68- informer v1Informers.GameServerInformer
79+ clientSet * versioned.Clientset
80+ informer v1Informers.GameServerInformer
81+ recordStore GameServerDNSRecordStore
6982}
7083
7184// Initializes Agones client
@@ -88,30 +101,22 @@ func Client() *AgonesClient {
88101func New (config * rest.Config ) (* AgonesClient , error ) {
89102 agonesClient , err := versioned .NewForConfig (config )
90103 gameServerInformer := NewGameServerInformer (agonesClient )
104+ recordStore := NewGameServerDNSRecordStore (gameServerInformer )
91105 if err != nil {
92106 return nil , err
93107 }
94108
95- return & AgonesClient {agonesClient , gameServerInformer }, nil
109+ return & AgonesClient {agonesClient , gameServerInformer , recordStore }, nil
96110}
97111
98112// Gets a GameServer by name
99113func (c * AgonesClient ) Get (serverName string ) (* agonesv1.GameServer , error ) {
100114 return c .informer .Lister ().GameServers (metav1 .NamespaceDefault ).Get (serverName )
101-
102- // return c.clientSet.
103- // AgonesV1().
104- // GameServers(metav1.NamespaceDefault).
105- // Get(context.Background(), serverName, metav1.GetOptions{})
106115}
107116
108117// Gets all GameServers for default namespace
109118func (c * AgonesClient ) List () ([]* agonesv1.GameServer , error ) {
110119 return c .informer .Lister ().GameServers (metav1 .NamespaceDefault ).List (labels .Everything ())
111- // return c.clientSet.
112- // AgonesV1().
113- // GameServers(metav1.NamespaceDefault).
114- // List(context.Background(), metav1.ListOptions{})
115120}
116121
117122// Creates a new GameServer
@@ -130,15 +135,58 @@ func (c *AgonesClient) Delete(serverName string) error {
130135 Delete (context .Background (), serverName , metav1.DeleteOptions {})
131136}
132137
138+ func (c * AgonesClient ) HostnameAvailable (domain , subdomain string ) bool {
139+ hostname := fmt .Sprintf ("%s.%s" , subdomain , domain )
140+ _ , ok := c .recordStore .Get (hostname )
141+ return ! ok
142+ }
143+
144+ func (c * AgonesClient ) ListRecords () []string {
145+ return c .recordStore .List ()
146+ }
147+
148+ func SetHostname (gs * agonesv1.GameServer , domain , subdomain string ) {
149+ anno := gs .GetAnnotations ()
150+ anno [CustomSubdomainAnnotation ] = subdomain
151+ anno [HostnameAnnotation ] = domain
152+ gs .SetAnnotations (anno )
153+ }
154+
155+ func GetDomainName (gs * agonesv1.GameServer ) string {
156+ return gs .Annotations [HostnameAnnotation ]
157+ }
158+
159+ func GetSubdomain (gs * agonesv1.GameServer ) (string , bool ) {
160+ v , ok := gs .Annotations [CustomSubdomainAnnotation ]
161+ return v , ok
162+ }
163+
164+ func GetHostname (gs * agonesv1.GameServer ) string {
165+ subdomain := gs .Name
166+ if domain , ok := gs .Annotations [CustomSubdomainAnnotation ]; ok {
167+ subdomain = domain
168+ }
169+ domain := gs .Annotations [HostnameAnnotation ]
170+ return fmt .Sprintf ("%s.%s" , subdomain , domain )
171+ }
172+
173+ func GetDNSZone () string {
174+ return config .GetDNSZone ()
175+ }
176+
133177// Initializes a new default Java Minecraft server
134178// Agones v1 GameServer object
135179func NewJavaServer () * agonesv1.GameServer {
136180 return & agonesv1.GameServer {
137181 ObjectMeta : metav1.ObjectMeta {
138182 GenerateName : DefaultGenerateName ,
139183 Namespace : metav1 .NamespaceDefault ,
184+ Annotations : map [string ]string {
185+ HostnameAnnotation : GetDNSZone (),
186+ SRVServiceAnnotation : JavaSRVServiceName ,
187+ },
140188 Labels : map [string ]string {
141- "edition" : JavaEdition ,
189+ EditionLabel : JavaEdition ,
142190 },
143191 },
144192 Spec : agonesv1.GameServerSpec {
@@ -233,8 +281,12 @@ func NewBedrockServer() *agonesv1.GameServer {
233281 ObjectMeta : metav1.ObjectMeta {
234282 GenerateName : DefaultGenerateName ,
235283 Namespace : metav1 .NamespaceDefault ,
284+ Annotations : map [string ]string {
285+ HostnameAnnotation : GetDNSZone (),
286+ SRVServiceAnnotation : JavaSRVServiceName ,
287+ },
236288 Labels : map [string ]string {
237- "edition" : BedrockEdition ,
289+ EditionLabel : BedrockEdition ,
238290 },
239291 },
240292 Spec : agonesv1.GameServerSpec {
0 commit comments