diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..724cfa1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,38 @@ +name: ci + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + helm: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Helm + uses: azure/setup-helm@v4 + with: + version: v3.18.4 + + - name: helm lint + run: helm lint . --set cluster.name=test + + - name: Render snapshots and diff against committed copies + run: | + set -euo pipefail + mkdir -p /tmp/snapshots + helm template platform . --set cluster.name=test > /tmp/snapshots/default.yaml + helm template platform . --set cluster.name=test --set defaultFleet.enabled=false > /tmp/snapshots/no-default-fleet.yaml + helm template platform . --set cluster.name=test --set image.tag=v0.7.0 > /tmp/snapshots/custom-image.yaml + for snap in default no-default-fleet custom-image; do + if ! diff -u "tests/snapshots/${snap}.yaml" "/tmp/snapshots/${snap}.yaml"; then + echo "::error::tests/snapshots/${snap}.yaml drift detected. Regenerate with:" + echo " helm template platform . --set cluster.name=test [...] > tests/snapshots/${snap}.yaml" + exit 1 + fi + done + echo "All snapshots match." diff --git a/templates/NOTES.txt b/templates/NOTES.txt new file mode 100644 index 0000000..863295b --- /dev/null +++ b/templates/NOTES.txt @@ -0,0 +1,24 @@ +Grounds platform-dev workspace deployed for `{{ .Values.cluster.name }}`. + +Public hostname: + {{ .Values.cluster.name }}.platform.mc.grnds.io + +Verify the deploy: + kubectl -n {{ .Release.Namespace }} get deploy {{ include "platform-vcluster-template.velocityName" . }} + kubectl -n {{ .Release.Namespace }} get svc {{ include "platform-vcluster-template.velocityName" . }} +{{ if .Values.defaultFleet.enabled }} +Default Agones Fleet: + kubectl -n {{ .Release.Namespace }} get fleet {{ include "platform-vcluster-template.defaultFleetName" . }} + kubectl -n {{ .Release.Namespace }} get gameservers -l agones.dev/fleet={{ .Values.defaultFleet.name }} +{{ else }} +Default Fleet is disabled — push your own Agones Fleet to get a backend. +{{ end -}} + +Plugin-agones discovery config (env vars in ConfigMap {{ include "platform-vcluster-template.velocityName" . }}-agones-config): + GROUNDS_AGONES_NAMESPACE {{ .Values.agones.namespace | default "(POD_NAMESPACE via Downward API)" | quote }} + GROUNDS_AGONES_LABEL_SELECTOR {{ .Values.agones.labelSelector | default "(no filter)" | quote }} + GROUNDS_AGONES_LOBBY_LABEL {{ .Values.agones.lobbyLabel | default "(every running GS treated as lobby)" | quote }} + GROUNDS_AGONES_POLL_INTERVAL {{ .Values.agones.pollInterval | quote }} + +To follow logs: + kubectl -n {{ .Release.Namespace }} logs -f deploy/{{ include "platform-vcluster-template.velocityName" . }} diff --git a/tests/snapshots/custom-image.yaml b/tests/snapshots/custom-image.yaml new file mode 100644 index 0000000..70f6dbe --- /dev/null +++ b/tests/snapshots/custom-image.yaml @@ -0,0 +1,208 @@ +--- +# Source: platform-vcluster-template/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: platform-velocity + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +--- +# Source: platform-vcluster-template/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: platform-velocity-agones-config + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +data: + GROUNDS_AGONES_NAMESPACE: "" + GROUNDS_AGONES_LABEL_SELECTOR: "" + GROUNDS_AGONES_LOBBY_LABEL: "" + GROUNDS_AGONES_LOBBY_VALUE: "lobby" + GROUNDS_AGONES_RUNNING_STATES: "Ready,Allocated,Reserved" + GROUNDS_AGONES_POLL_INTERVAL: "2s" + GROUNDS_AGONES_ADDRESS_TYPE: "PodIP" + GROUNDS_AGONES_PORT: "25565" +--- +# Source: platform-vcluster-template/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: platform-velocity-agones + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +rules: + - apiGroups: ["agones.dev"] + resources: ["gameservers"] + verbs: ["get", "list", "watch"] +--- +# Source: platform-vcluster-template/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: platform-velocity-agones + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +subjects: + - kind: ServiceAccount + name: platform-velocity +roleRef: + kind: Role + name: platform-velocity-agones + apiGroup: rbac.authorization.k8s.io +--- +# Source: platform-vcluster-template/templates/velocity-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: platform-velocity + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity + annotations: + mc-router.itzg.me/externalServerName: "test.platform.mc.grnds.io" +spec: + type: ClusterIP + ports: + - name: mc + port: 25577 + targetPort: mc + protocol: TCP + selector: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: velocity +--- +# Source: platform-vcluster-template/templates/velocity-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: platform-velocity + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: velocity + template: + metadata: + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: velocity + annotations: + + checksum/agones-config: 3f012194fb55f62e56039216140f8b49610dc5fc463c1804f79a2b294e42e3fe + spec: + serviceAccountName: platform-velocity + containers: + - name: velocity + image: "ghcr.io/groundsgg/velocity:v0.7.0" + imagePullPolicy: IfNotPresent + ports: + - name: mc + containerPort: 25577 + protocol: TCP + envFrom: + - configMapRef: + name: platform-velocity-agones-config + env: + + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + + - name: GROUNDS_CLUSTER_NAME + value: "test" + readinessProbe: + tcpSocket: + port: mc + initialDelaySeconds: 30 + periodSeconds: 10 + livenessProbe: + tcpSocket: + port: mc + initialDelaySeconds: 60 + periodSeconds: 30 + resources: + limits: + cpu: 1000m + memory: 1Gi + requests: + cpu: 200m + memory: 512Mi +--- +# Source: platform-vcluster-template/templates/default-fleet.yaml +apiVersion: agones.dev/v1 +kind: Fleet +metadata: + name: platform-lobby + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: default-fleet +spec: + replicas: 1 + template: + metadata: + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: default-fleet + agones.dev/fleet: "lobby" + spec: + ports: + - name: default + portPolicy: Dynamic + containerPort: 7654 + protocol: UDP + template: + spec: + containers: + - name: simple-game-server + image: "gcr.io/agones-images/simple-game-server:0.30" + resources: + limits: + cpu: 500m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi diff --git a/tests/snapshots/default.yaml b/tests/snapshots/default.yaml new file mode 100644 index 0000000..03b87e3 --- /dev/null +++ b/tests/snapshots/default.yaml @@ -0,0 +1,208 @@ +--- +# Source: platform-vcluster-template/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: platform-velocity + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +--- +# Source: platform-vcluster-template/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: platform-velocity-agones-config + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +data: + GROUNDS_AGONES_NAMESPACE: "" + GROUNDS_AGONES_LABEL_SELECTOR: "" + GROUNDS_AGONES_LOBBY_LABEL: "" + GROUNDS_AGONES_LOBBY_VALUE: "lobby" + GROUNDS_AGONES_RUNNING_STATES: "Ready,Allocated,Reserved" + GROUNDS_AGONES_POLL_INTERVAL: "2s" + GROUNDS_AGONES_ADDRESS_TYPE: "PodIP" + GROUNDS_AGONES_PORT: "25565" +--- +# Source: platform-vcluster-template/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: platform-velocity-agones + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +rules: + - apiGroups: ["agones.dev"] + resources: ["gameservers"] + verbs: ["get", "list", "watch"] +--- +# Source: platform-vcluster-template/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: platform-velocity-agones + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +subjects: + - kind: ServiceAccount + name: platform-velocity +roleRef: + kind: Role + name: platform-velocity-agones + apiGroup: rbac.authorization.k8s.io +--- +# Source: platform-vcluster-template/templates/velocity-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: platform-velocity + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity + annotations: + mc-router.itzg.me/externalServerName: "test.platform.mc.grnds.io" +spec: + type: ClusterIP + ports: + - name: mc + port: 25577 + targetPort: mc + protocol: TCP + selector: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: velocity +--- +# Source: platform-vcluster-template/templates/velocity-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: platform-velocity + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: velocity + template: + metadata: + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: velocity + annotations: + + checksum/agones-config: 3f012194fb55f62e56039216140f8b49610dc5fc463c1804f79a2b294e42e3fe + spec: + serviceAccountName: platform-velocity + containers: + - name: velocity + image: "ghcr.io/groundsgg/velocity:0.6.0" + imagePullPolicy: IfNotPresent + ports: + - name: mc + containerPort: 25577 + protocol: TCP + envFrom: + - configMapRef: + name: platform-velocity-agones-config + env: + + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + + - name: GROUNDS_CLUSTER_NAME + value: "test" + readinessProbe: + tcpSocket: + port: mc + initialDelaySeconds: 30 + periodSeconds: 10 + livenessProbe: + tcpSocket: + port: mc + initialDelaySeconds: 60 + periodSeconds: 30 + resources: + limits: + cpu: 1000m + memory: 1Gi + requests: + cpu: 200m + memory: 512Mi +--- +# Source: platform-vcluster-template/templates/default-fleet.yaml +apiVersion: agones.dev/v1 +kind: Fleet +metadata: + name: platform-lobby + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: default-fleet +spec: + replicas: 1 + template: + metadata: + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: default-fleet + agones.dev/fleet: "lobby" + spec: + ports: + - name: default + portPolicy: Dynamic + containerPort: 7654 + protocol: UDP + template: + spec: + containers: + - name: simple-game-server + image: "gcr.io/agones-images/simple-game-server:0.30" + resources: + limits: + cpu: 500m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi diff --git a/tests/snapshots/no-default-fleet.yaml b/tests/snapshots/no-default-fleet.yaml new file mode 100644 index 0000000..c0d9807 --- /dev/null +++ b/tests/snapshots/no-default-fleet.yaml @@ -0,0 +1,168 @@ +--- +# Source: platform-vcluster-template/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: platform-velocity + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +--- +# Source: platform-vcluster-template/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: platform-velocity-agones-config + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +data: + GROUNDS_AGONES_NAMESPACE: "" + GROUNDS_AGONES_LABEL_SELECTOR: "" + GROUNDS_AGONES_LOBBY_LABEL: "" + GROUNDS_AGONES_LOBBY_VALUE: "lobby" + GROUNDS_AGONES_RUNNING_STATES: "Ready,Allocated,Reserved" + GROUNDS_AGONES_POLL_INTERVAL: "2s" + GROUNDS_AGONES_ADDRESS_TYPE: "PodIP" + GROUNDS_AGONES_PORT: "25565" +--- +# Source: platform-vcluster-template/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: platform-velocity-agones + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +rules: + - apiGroups: ["agones.dev"] + resources: ["gameservers"] + verbs: ["get", "list", "watch"] +--- +# Source: platform-vcluster-template/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: platform-velocity-agones + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +subjects: + - kind: ServiceAccount + name: platform-velocity +roleRef: + kind: Role + name: platform-velocity-agones + apiGroup: rbac.authorization.k8s.io +--- +# Source: platform-vcluster-template/templates/velocity-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: platform-velocity + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity + annotations: + mc-router.itzg.me/externalServerName: "test.platform.mc.grnds.io" +spec: + type: ClusterIP + ports: + - name: mc + port: 25577 + targetPort: mc + protocol: TCP + selector: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: velocity +--- +# Source: platform-vcluster-template/templates/velocity-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: platform-velocity + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/version: "0.6.0" + app.kubernetes.io/managed-by: Helm + helm.sh/chart: platform-vcluster-template-0.0.0 + app.kubernetes.io/component: velocity +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: velocity + template: + metadata: + labels: + app.kubernetes.io/name: platform-vcluster-template + app.kubernetes.io/instance: platform + app.kubernetes.io/component: velocity + annotations: + + checksum/agones-config: 3f012194fb55f62e56039216140f8b49610dc5fc463c1804f79a2b294e42e3fe + spec: + serviceAccountName: platform-velocity + containers: + - name: velocity + image: "ghcr.io/groundsgg/velocity:0.6.0" + imagePullPolicy: IfNotPresent + ports: + - name: mc + containerPort: 25577 + protocol: TCP + envFrom: + - configMapRef: + name: platform-velocity-agones-config + env: + + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + + - name: GROUNDS_CLUSTER_NAME + value: "test" + readinessProbe: + tcpSocket: + port: mc + initialDelaySeconds: 30 + periodSeconds: 10 + livenessProbe: + tcpSocket: + port: mc + initialDelaySeconds: 60 + periodSeconds: 30 + resources: + limits: + cpu: 1000m + memory: 1Gi + requests: + cpu: 200m + memory: 512Mi