Skip to content

Instantly share code, notes, and snippets.

@exu
Forked from jezell/kubernetes-websocket.go
Created September 16, 2022 11:26
Show Gist options
  • Save exu/d4ee719cc8e7a7d30a2545f51711700a to your computer and use it in GitHub Desktop.
Save exu/d4ee719cc8e7a7d30a2545f51711700a to your computer and use it in GitHub Desktop.

Revisions

  1. @jezell jezell created this gist Sep 25, 2016.
    85 changes: 85 additions & 0 deletions kubernetes-websocket.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,85 @@
    package main

    import (
    "bytes"
    "flag"
    "golang.org/x/net/websocket"
    "io"
    "k8s.io/client-go/1.4/rest"
    "k8s.io/client-go/1.4/tools/clientcmd"
    "log"
    "net/http"
    )

    var (
    kubeconfig = flag.String("kubeconfig", "/Users/myself/.kube/config", "absolute path to the kubeconfig file")
    )

    func main() {
    flag.Parse()
    // uses the current context in kubeconfig
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
    if err != nil {
    panic(err.Error())
    }
    apiURL := "wss://192.168.64.17:8443/api/v1/pods?watch=true"
    wsc, err := websocket.NewConfig(apiURL, apiURL)
    if err != nil {
    log.Fatal(err)
    }
    wsc.TlsConfig, err = rest.TLSConfigFor(config)
    if err != nil {
    log.Fatal(err)
    }
    wsc.Header, err = headersForConfig(config)
    if err != nil {
    log.Fatal(err)
    }

    wsConn, err := websocket.DialConfig(wsc)
    if err != nil {
    log.Fatal(err)
    }
    defer wsConn.Close()

    buf := &bytes.Buffer{}
    for {
    var msg []byte
    if err := websocket.Message.Receive(wsConn, &msg); err != nil {
    if err == io.EOF {
    break
    }
    log.Fatalf("Failed to read completely from websocket %v", err)
    }
    if len(msg) == 0 {
    continue
    }
    log.Printf("Read %v %v", len(msg), string(msg))
    buf.Write(msg)
    }

    if buf.String() != "container is alive\n" {
    log.Fatalf("Unexpected websocket logs:\n%s", buf.String())
    }
    }

    type extractRT struct {
    http.Header
    }

    func (rt *extractRT) RoundTrip(req *http.Request) (*http.Response, error) {
    rt.Header = req.Header
    return nil, nil
    }

    func headersForConfig(c *rest.Config) (http.Header, error) {
    extract := &extractRT{}
    rt, err := rest.HTTPWrappersForConfig(c, extract)
    if err != nil {
    return nil, err
    }
    if _, err := rt.RoundTrip(&http.Request{}); err != nil {
    return nil, err
    }
    return extract.Header, nil
    }