added kubernetes - NOT TESTED
This commit is contained in:
@@ -2,29 +2,32 @@ package kubernetes
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
"io"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.acooldomain.co/server-manager/backend/instancemanager"
|
||||
"git.acooldomain.co/server-manager/backend/models"
|
||||
servermanagerv1 "git.acooldomain.co/server-manager/kubernetes-operator/api/v1alpha1"
|
||||
"github.com/buildkite/shellwords"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apiserver/pkg/storage/names"
|
||||
names "k8s.io/apiserver/pkg/storage/names"
|
||||
kubernetesclient "k8s.io/client-go/kubernetes"
|
||||
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
|
||||
"k8s.io/client-go/rest"
|
||||
"k8s.io/client-go/tools/remotecommand"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
)
|
||||
|
||||
type InstanceManager struct {
|
||||
instancemanager.InstanceManager
|
||||
Config models.KubernetesInstanceManagerConfig
|
||||
client client.Client
|
||||
Config models.KubernetesInstanceManagerConfig
|
||||
client client.Client
|
||||
restCfg *rest.Config
|
||||
coreV1Cli *kubernetes.Clientset
|
||||
coreV1Cli *kubernetesclient.Clientset
|
||||
}
|
||||
|
||||
func convertServerManagerImage(image *servermanagerv1.Image) *instancemanager.Image {
|
||||
@@ -222,32 +225,113 @@ func (i *InstanceManager) DeleteServer(ctx context.Context, serverId string) err
|
||||
|
||||
// Terminal
|
||||
// Status Changing
|
||||
func (i *InstanceManager) InteractiveTerminal(ctx context.Context, serverId string) (*net.Conn, error) {
|
||||
i.client.RESTMapper()
|
||||
return nil, nil
|
||||
}
|
||||
func (i *InstanceManager) InteractiveTerminal(ctx context.Context, serverId string) (*instancemanager.TerminalConnection, error) {
|
||||
stdinReader, stdinWriter := io.Pipe()
|
||||
stdoutReader, stdoutWriter := io.Pipe()
|
||||
resizeChan := make(chan remotecommand.TerminalSize, 1)
|
||||
queue := &sizeQueue{resizeChan: resizeChan}
|
||||
req := i.coreV1Cli.CoreV1().RESTClient().
|
||||
Post().
|
||||
Resource("pods").
|
||||
Namespace(i.Config.Namespace).
|
||||
Name(serverId).
|
||||
SubResource("attach").
|
||||
VersionedParams(&corev1.PodAttachOptions{
|
||||
Container: "server",
|
||||
Stdin: true,
|
||||
Stdout: true,
|
||||
Stderr: true,
|
||||
TTY: true,
|
||||
}, clientgoscheme.ParameterCodec)
|
||||
|
||||
func (i *InstanceManager) ResizeTerminal(ctx context.Context, serverId string, width uint, height uint) error {
|
||||
return nil
|
||||
executor, err := remotecommand.NewSPDYExecutor(i.restCfg, "POST", req.URL())
|
||||
go func() {
|
||||
defer stdoutWriter.Close()
|
||||
defer stdinReader.Close()
|
||||
_ = executor.StreamWithContext(ctx, remotecommand.StreamOptions{Stdin: stdinReader, Stdout: stdoutWriter, Stderr: stdoutWriter, Tty: true, TerminalSizeQueue: queue})
|
||||
}()
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
k := newKubeCon(stdinWriter, stdoutReader)
|
||||
|
||||
return &instancemanager.TerminalConnection{
|
||||
Conn: k,
|
||||
ResizerFunc: func(width uint, height uint) error {
|
||||
resizeChan <- remotecommand.TerminalSize{Width: uint16(width), Height: uint16(height)}
|
||||
return nil
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
// File Browser
|
||||
|
||||
// Read Only
|
||||
func (i *InstanceManager) GetFileBrowser(ctx context.Context, serverId string) (*models.FileBrowser, error) {
|
||||
return nil, nil
|
||||
serverManager := &servermanagerv1.ServerManager{}
|
||||
err := i.client.Get(ctx, client.ObjectKey{Namespace: i.Config.Namespace, Name: serverId}, serverManager)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &models.FileBrowser{ServerId: serverManager.Name, Id: serverManager.Name, Url: serverManager.Status.Browser.Url}, nil
|
||||
}
|
||||
|
||||
func (i *InstanceManager) ListFileBrowsers(ctx context.Context) ([]models.FileBrowser, error) {
|
||||
return nil, nil
|
||||
serverManagers := &servermanagerv1.ServerManagerList{}
|
||||
err := i.client.List(ctx, serverManagers, &client.ListOptions{Namespace: i.Config.Namespace})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
fileBrowsers := make([]models.FileBrowser, len(serverManagers.Items))
|
||||
for i, serverManager := range serverManagers.Items {
|
||||
fileBrowsers[i] = models.FileBrowser{ServerId: serverManager.Name, Id: serverManager.Name, Url: serverManager.Status.Browser.Url}
|
||||
}
|
||||
|
||||
return fileBrowsers, nil
|
||||
}
|
||||
|
||||
// Status Changing
|
||||
func (i *InstanceManager) StartFileBrowser(ctx context.Context, serverId string) (*models.FileBrowser, error) {
|
||||
return nil, nil
|
||||
serverManager := &servermanagerv1.ServerManager{}
|
||||
err := i.client.Get(ctx, client.ObjectKey{Namespace: i.Config.Namespace, Name: serverId}, serverManager)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = i.client.Update(ctx, serverManager)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
childContext, cancelFunc := context.WithTimeout(ctx, time.Second*30)
|
||||
defer cancelFunc()
|
||||
|
||||
for !serverManager.Status.Browser.Running {
|
||||
err = i.client.Get(childContext, client.ObjectKey{Name: serverId, Namespace: i.Config.Namespace}, serverManager)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return &models.FileBrowser{Url: serverManager.Status.Browser.Url, Id: serverManager.Name, ServerId: serverManager.Name}, nil
|
||||
}
|
||||
|
||||
func (i *InstanceManager) StopFileBrowser(ctx context.Context, serverId string) error {
|
||||
serverManager := &servermanagerv1.ServerManager{}
|
||||
err := i.client.Get(ctx, client.ObjectKey{Namespace: i.Config.Namespace, Name: serverId}, serverManager)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = i.client.Update(ctx, serverManager)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -266,10 +350,15 @@ func NewInstanceManager(config models.KubernetesInstanceManagerConfig) (*Instanc
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
coreV1Cli, err := kubernetesclient.NewForConfig(c)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &InstanceManager{client: client}, nil
|
||||
return &InstanceManager{
|
||||
client: client,
|
||||
coreV1Cli: coreV1Cli,
|
||||
restCfg: c,
|
||||
Config: config,
|
||||
}, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user