Skip to content

Commit

Permalink
Merge pull request #287 from craig-willis/console-fix
Browse files Browse the repository at this point in the history
Implemented exec using go client
  • Loading branch information
craig-willis authored Sep 6, 2019
2 parents 8db10d2 + f27b6f4 commit 9cd795a
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 94 deletions.
1 change: 1 addition & 0 deletions apiserver/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ COPY . /go/src/github.com/ndslabs/apiserver
RUN apt-get -qq update && \
apt-get -qq install bash build-essential git gcc && \
go get github.com/Masterminds/glide && \
go get github.com/docker/spdystream && \
cd /go/src/github.com/ndslabs/apiserver && ./build.sh docker

FROM debian:stretch
Expand Down
177 changes: 83 additions & 94 deletions apiserver/pkg/kube/kube.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,11 @@ import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"os"
"strings"
"time"

// Used by exec
//"net/url"
//restclient "k8s.io/client-go/rest"
//"k8s.io/apimachinery/pkg/util/remotecommand"
//remotecommandserver "k8s.io/kubernetes/pkg/kubelet/server/remotecommand"

"github.com/golang/glog"
"github.com/ndslabs/apiserver/pkg/config"
"github.com/ndslabs/apiserver/pkg/events"
Expand All @@ -36,6 +31,7 @@ import (
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/remotecommand"
)

var apiBase = "/api/v1"
Expand All @@ -58,6 +54,7 @@ type KubeHelper struct {
kubeGo kubernetes.Interface
authSignInURL string
authURL string
config *rest.Config
}

func NewKubeHelper(kubeBase string, username string, password string, tokenPath string, kConfig *rest.Config,
Expand All @@ -69,6 +66,7 @@ func NewKubeHelper(kubeBase string, username string, password string, tokenPath
kubeHelper := KubeHelper{}
kubeHelper.kubeBase = kubeBase
kubeHelper.client = &http.Client{Transport: tr}
kubeHelper.config = kConfig

// create the clientset
kubeGo, k8Err := kubernetes.NewForConfig(kConfig)
Expand Down Expand Up @@ -795,94 +793,85 @@ func (k *KubeHelper) WatchEvents(handler events.EventHandler) {

func (k *KubeHelper) Exec(pid string, pod string, container string, kube *KubeHelper) *websocket.Handler {

//url, err := url.Parse(
// k.kubeBase + apiBase + "/namespaces/" + pid + "/pods/" + pod +
// "/exec?container=" + container + "&command=" + defaultShell + "&tty=true&stdin=true&stdout=true&stderr=false")
//if err != nil {
// glog.Warning(err)
//}
//
//conf := &restclient.Config{
// Host: k.kubeBase,
// Insecure: true,
//}
//
//if len(k.token) > 0 {
// conf.BearerToken = string(k.token)
//} else {
// conf.Username = k.username
// conf.Password = k.password
//}
//
//e, err := remotecommand.NewExecutor(conf, "POST", url)
//if err != nil {
// glog.Warning(err)
//}
//
//wsHandler := websocket.Handler(func(ws *websocket.Conn) {
// defer ws.Close()
//
// outr, outw, err := os.Pipe()
// if err != nil {
// glog.Warning(err)
// return
// }
// defer outr.Close()
// defer outw.Close()
//
// inr, inw, err := os.Pipe()
// if err != nil {
// glog.Fatal(err)
// return
// }
// defer inr.Close()
// defer inw.Close()
//
// go func() {
// for {
//
// in := make([]byte, 2048)
// n, err := ws.Read(in)
// if err != nil {
// //glog.Error(err)
// return
// }
// inLen, err := inw.Write(in[:n])
// if err != nil {
// glog.Error(err)
// return
// }
// if inLen < n {
// panic("pty write overflow")
// }
// }
// }()
//
// go func() {
// for {
// out := make([]byte, 2048)
// n, err := outr.Read(out)
// if err != nil {
// //glog.Error(err)
// return
// }
// _, err = ws.Write(out[:n])
// if err != nil {
// glog.Error(err)
// return
// }
// }
// }()
//
// err = e.Stream(remotecommandserver.SupportedStreamingProtocols, inr, outw, nil, true)
// if err != nil {
// glog.Error(err)
// return
// }
//})
//
//return &wsHandler
return nil
execUrl, err := url.Parse(
k.kubeBase + apiBase + "/namespaces/" + pid + "/pods/" + pod +
"/exec?container=" + container + "&command=" + defaultShell + "&tty=true&stdin=true&stdout=true&stderr=false")
if err != nil {
glog.Warning(err)
}

e, err := remotecommand.NewSPDYExecutor(k.config, "POST", execUrl)
if err != nil {
glog.Warning(err)
}

wsHandler := websocket.Handler(func(ws *websocket.Conn) {
defer ws.Close()

outr, outw, err := os.Pipe()
if err != nil {
glog.Warning(err)
return
}
defer outr.Close()
defer outw.Close()

inr, inw, err := os.Pipe()
if err != nil {
glog.Fatal(err)
return
}
defer inr.Close()
defer inw.Close()

go func() {
for {

in := make([]byte, 2048)
n, err := ws.Read(in)
if err != nil {
glog.Error(err)
return
}
inLen, err := inw.Write(in[:n])
if err != nil {
glog.Error(err)
return
}
if inLen < n {
panic("pty write overflow")
}
}
}()

go func() {
for {
out := make([]byte, 2048)
n, err := outr.Read(out)
if err != nil {
glog.Error(err)
return
}
_, err = ws.Write(out[:n])
if err != nil {
glog.Error(err)
return
}
}
}()

err = e.Stream(remotecommand.StreamOptions{
Stdin: inr,
Stdout: outw,
Stderr: nil,
Tty: true})
if err != nil {
glog.Error(err)
return
}
})

return &wsHandler
}

func (k *KubeHelper) CreateIngress(pid string, domain string, service string, ports []v1.ServicePort, enableAuth bool) (*v1beta1.Ingress, error) {
Expand Down

0 comments on commit 9cd795a

Please sign in to comment.