|
|
@@ -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 |
|
|
} |