[WIP] more kubernetes impl

This commit is contained in:
ACoolName 2025-04-06 20:55:55 +03:00
parent fce36b701f
commit 658789cccb
5 changed files with 69 additions and 9 deletions

View File

@ -843,12 +843,14 @@ k8s.io/client-go v0.32.1/go.mod h1:aTTKZY7MdxUaJ/KiUs8D+GssR9zJZi77ZqtzcGXIiDg=
k8s.io/code-generator v0.32.1/go.mod h1:zaILfm00CVyP/6/pJMJ3zxRepXkxyDfUV5SNG4CjZI4= k8s.io/code-generator v0.32.1/go.mod h1:zaILfm00CVyP/6/pJMJ3zxRepXkxyDfUV5SNG4CjZI4=
k8s.io/component-base v0.31.1/go.mod h1:WGeaw7t/kTsqpVTaCoVEtillbqAhF2/JgvO0LDOMa0w= k8s.io/component-base v0.31.1/go.mod h1:WGeaw7t/kTsqpVTaCoVEtillbqAhF2/JgvO0LDOMa0w=
k8s.io/component-base v0.32.1/go.mod h1:j1iMMHi/sqAHeG5z+O9BFNCF698a1u0186zkjMZQ28w= k8s.io/component-base v0.32.1/go.mod h1:j1iMMHi/sqAHeG5z+O9BFNCF698a1u0186zkjMZQ28w=
k8s.io/component-base v0.32.3/go.mod h1:LWi9cR+yPAv7cu2X9rZanTiFKB2kHA+JjmhkKjCZRpI=
k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/kms v0.32.1/go.mod h1:Bk2evz/Yvk0oVrvm4MvZbgq8BD34Ksxs2SRHn4/UiOM= k8s.io/kms v0.32.1/go.mod h1:Bk2evz/Yvk0oVrvm4MvZbgq8BD34Ksxs2SRHn4/UiOM=
k8s.io/kms v0.32.3/go.mod h1:Bk2evz/Yvk0oVrvm4MvZbgq8BD34Ksxs2SRHn4/UiOM=
k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE= mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE=

View File

@ -76,7 +76,7 @@ func (im *InstanceManager) GetImage(ctx context.Context, imageId string) (*insta
} }
if imageLabels.Type != Game { if imageLabels.Type != Game {
return nil, fmt.Errorf("Image not found") return nil, fmt.Errorf("image not found")
} }
image := convertImageInspectToInstanceImage(imageInspect) image := convertImageInspectToInstanceImage(imageInspect)
@ -93,6 +93,9 @@ func (im *InstanceManager) ListImages(ctx context.Context) ([]instancemanager.Im
rawImages, err := im.client.ImageList(ctx, image.ListOptions{ rawImages, err := im.client.ImageList(ctx, image.ListOptions{
Filters: *imageFilters, Filters: *imageFilters,
}) })
if err != nil {
return nil, err
}
images := make([]instancemanager.Image, len(rawImages)) images := make([]instancemanager.Image, len(rawImages))
@ -177,6 +180,9 @@ func (im *InstanceManager) ListServers(ctx context.Context) ([]instancemanager.S
} }
containers, err := im.containerList(ctx, ContainerLabels{Type: Game}, false) containers, err := im.containerList(ctx, ContainerLabels{Type: Game}, false)
if err != nil {
return nil, err
}
for _, container := range containers { for _, container := range containers {
rawLabels, err := json.Marshal(container.Labels) rawLabels, err := json.Marshal(container.Labels)
@ -226,7 +232,7 @@ func (im *InstanceManager) StartServer(ctx context.Context,
} }
if server.Running { if server.Running {
return fmt.Errorf("Server %s already running", serverId) return fmt.Errorf("server %s already running", serverId)
} }
containerLabels := ContainerLabels{ containerLabels := ContainerLabels{
@ -236,7 +242,7 @@ func (im *InstanceManager) StartServer(ctx context.Context,
volumes := make(map[string]struct{}) volumes := make(map[string]struct{})
var portMapping nat.PortMap = make(nat.PortMap) portMapping := make(nat.PortMap)
image, err := im.GetImage(ctx, imageId) image, err := im.GetImage(ctx, imageId)
if err != nil { if err != nil {
return err return err
@ -319,6 +325,9 @@ func (im *InstanceManager) StartServer(ctx context.Context,
func (im *InstanceManager) StopServer(ctx context.Context, serverId string) error { func (im *InstanceManager) StopServer(ctx context.Context, serverId string) error {
runningContainers, err := im.containerList(ctx, ContainerLabels{VolumeId: serverId, Type: Game}, false) runningContainers, err := im.containerList(ctx, ContainerLabels{VolumeId: serverId, Type: Game}, false)
if err != nil {
return err
}
for _, rawContainer := range runningContainers { for _, rawContainer := range runningContainers {
err = im.client.ContainerStop(ctx, rawContainer.ID, container.StopOptions{}) err = im.client.ContainerStop(ctx, rawContainer.ID, container.StopOptions{})
@ -393,7 +402,7 @@ func (im *InstanceManager) InteractiveTerminal(ctx context.Context, serverId str
} }
if !server.Running { if !server.Running {
return nil, fmt.Errorf("Server %s not running", server.Id) return nil, fmt.Errorf("server %s not running", server.Id)
} }
rawContainers, err := im.containerList(ctx, ContainerLabels{VolumeId: serverId, Type: Game}, false) rawContainers, err := im.containerList(ctx, ContainerLabels{VolumeId: serverId, Type: Game}, false)
@ -402,7 +411,7 @@ func (im *InstanceManager) InteractiveTerminal(ctx context.Context, serverId str
} }
if len(rawContainers) == 0 { if len(rawContainers) == 0 {
return nil, fmt.Errorf("Server %s not running and wasn't caught", server.Id) return nil, fmt.Errorf("server %s not running and wasn't caught", server.Id)
} }
rawContainer := rawContainers[0] rawContainer := rawContainers[0]
@ -431,7 +440,7 @@ func (im *InstanceManager) ResizeTerminal(ctx context.Context, serverId string,
} }
if len(containers) == 0 { if len(containers) == 0 {
return fmt.Errorf("Server %s not running", serverId) return fmt.Errorf("server %s not running", serverId)
} }
err = im.client.ContainerResize(context.TODO(), containers[0].ID, container.ResizeOptions{Height: height, Width: width}) err = im.client.ContainerResize(context.TODO(), containers[0].ID, container.ResizeOptions{Height: height, Width: width})
@ -449,7 +458,7 @@ func (im *InstanceManager) GetFileBrowser(ctx context.Context, serverId string)
} }
if len(containers) == 0 { if len(containers) == 0 {
return nil, fmt.Errorf("File Browser for server %s is not running", serverId) return nil, fmt.Errorf("file Browser for server %s is not running", serverId)
} }
rawContainer := containers[0] rawContainer := containers[0]

View File

@ -57,6 +57,7 @@ require (
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/api v0.32.3 // indirect k8s.io/api v0.32.3 // indirect
k8s.io/apimachinery v0.32.3 // indirect k8s.io/apimachinery v0.32.3 // indirect
k8s.io/apiserver v0.32.3
k8s.io/klog/v2 v2.130.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect

View File

@ -155,6 +155,8 @@ k8s.io/apiextensions-apiserver v0.32.1 h1:hjkALhRUeCariC8DiVmb5jj0VjIc1N0DREP32+
k8s.io/apiextensions-apiserver v0.32.1/go.mod h1:sxWIGuGiYov7Io1fAS2X06NjMIk5CbRHc2StSmbaQto= k8s.io/apiextensions-apiserver v0.32.1/go.mod h1:sxWIGuGiYov7Io1fAS2X06NjMIk5CbRHc2StSmbaQto=
k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U=
k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
k8s.io/apiserver v0.32.3 h1:kOw2KBuHOA+wetX1MkmrxgBr648ksz653j26ESuWNY8=
k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc=
k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU=
k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=

View File

@ -9,7 +9,11 @@ import (
"git.acooldomain.co/server-manager/backend/models" "git.acooldomain.co/server-manager/backend/models"
servermanagerv1 "git.acooldomain.co/server-manager/kubernetes-operator/api/v1alpha1" servermanagerv1 "git.acooldomain.co/server-manager/kubernetes-operator/api/v1alpha1"
"github.com/buildkite/shellwords" "github.com/buildkite/shellwords"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apiserver/pkg/storage/names"
names "k8s.io/apiserver/pkg/storage/names"
clientgoscheme "k8s.io/client-go/kubernetes/scheme" clientgoscheme "k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
@ -19,6 +23,8 @@ type InstanceManager struct {
instancemanager.InstanceManager instancemanager.InstanceManager
Config models.KubernetesInstanceManagerConfig Config models.KubernetesInstanceManagerConfig
client client.Client client client.Client
restCfg *rest.Config
coreV1Cli *kubernetes.Clientset
} }
func convertServerManagerImage(image *servermanagerv1.Image) *instancemanager.Image { func convertServerManagerImage(image *servermanagerv1.Image) *instancemanager.Image {
@ -167,17 +173,57 @@ func (i *InstanceManager) StopServer(ctx context.Context, serverId string) error
} }
func (i *InstanceManager) CreateServer(ctx context.Context) (*instancemanager.Server, error) { func (i *InstanceManager) CreateServer(ctx context.Context) (*instancemanager.Server, error) {
return nil, nil name := names.SimpleNameGenerator.GenerateName("")
err := i.client.Create(ctx, &servermanagerv1.ServerManager{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: i.Config.Namespace,
},
Spec: servermanagerv1.ServerManagerSpec{
Storage: "10Gi",
Server: servermanagerv1.ServerSpec{
Image: "",
On: false,
},
},
})
if err != nil {
return nil, err
}
serverManager := &instancemanager.Server{
Id: name,
Running: false,
RunningImage: nil,
RunningCommand: "",
}
return serverManager, nil
} }
func (i *InstanceManager) DeleteServer(ctx context.Context, serverId string) error { func (i *InstanceManager) DeleteServer(ctx context.Context, serverId string) error {
serverManager := &servermanagerv1.ServerManager{}
err := i.client.Get(ctx, client.ObjectKey{Name: serverId, Namespace: i.Config.Namespace}, serverManager)
if err != nil {
if errors.IsNotFound(err) {
return nil
} else {
return err
}
}
err = i.client.Create(ctx, serverManager)
if err != nil {
return err
}
return nil return nil
} }
// Terminal // Terminal
// Status Changing // Status Changing
func (i *InstanceManager) InteractiveTerminal(ctx context.Context, serverId string) (*net.Conn, error) { func (i *InstanceManager) InteractiveTerminal(ctx context.Context, serverId string) (*net.Conn, error) {
i.client.RESTMapper()
return nil, nil return nil, nil
} }