From b5bfc6c2810638d4cf22595c6716d0187eee3006 Mon Sep 17 00:00:00 2001 From: Phillip Wittrock Date: Thu, 3 Mar 2016 09:22:43 -0800 Subject: [PATCH] Move serve_hostname testing image to k8s test/images from contrib/for-demos --- test/images/serve_hostname/Dockerfile | 20 ++++ test/images/serve_hostname/Makefile | 37 +++++++ test/images/serve_hostname/README.md | 10 ++ test/images/serve_hostname/serve_hostname.go | 105 +++++++++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 test/images/serve_hostname/Dockerfile create mode 100644 test/images/serve_hostname/Makefile create mode 100644 test/images/serve_hostname/README.md create mode 100644 test/images/serve_hostname/serve_hostname.go diff --git a/test/images/serve_hostname/Dockerfile b/test/images/serve_hostname/Dockerfile new file mode 100644 index 0000000000..113ffd94d3 --- /dev/null +++ b/test/images/serve_hostname/Dockerfile @@ -0,0 +1,20 @@ +# Copyright 2016 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM busybox +MAINTAINER Tim Hockin +ADD serve_hostname /serve_hostname +ADD serve_hostname.go /serve_hostname.go +EXPOSE 9376 +ENTRYPOINT ["/serve_hostname"] diff --git a/test/images/serve_hostname/Makefile b/test/images/serve_hostname/Makefile new file mode 100644 index 0000000000..ec08bf9b8f --- /dev/null +++ b/test/images/serve_hostname/Makefile @@ -0,0 +1,37 @@ +# Copyright 2016 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +all: serve_hostname + +TAG = v1.4 +PREFIX = gcr.io/google_containers +TEST_PREFIX = gcr.io/_b_k8s_authenticated_test + +serve_hostname: serve_hostname.go + CGO_ENABLED=0 go build -a -installsuffix cgo --ldflags '-w' ./serve_hostname.go + +container: serve_hostname + docker build -t $(PREFIX)/serve_hostname:$(TAG) . + if [ -n "$(TEST_PREFIX)" ]; then \ + docker tag -f $(PREFIX)/serve_hostname:$(TAG) $(TEST_PREFIX)/serve_hostname:$(TAG); \ + fi + +push: + gcloud docker push $(PREFIX)/serve_hostname:$(TAG) + if [ -n "$(TEST_PREFIX)" ]; then \ + gcloud docker push $(TEST_PREFIX)/serve_hostname:$(TAG); \ + fi + +clean: + rm -f serve_hostname diff --git a/test/images/serve_hostname/README.md b/test/images/serve_hostname/README.md new file mode 100644 index 0000000000..3a49c57ad5 --- /dev/null +++ b/test/images/serve_hostname/README.md @@ -0,0 +1,10 @@ +serve_hostname +============== + +Util app to serve your hostname on TCP and/or UDP. Useful for testing. + + +[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/contrib/for-demos/serve_hostname/README.md?pixel)]() + + +[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/test/images/serve_hostname/README.md?pixel)]() diff --git a/test/images/serve_hostname/serve_hostname.go b/test/images/serve_hostname/serve_hostname.go new file mode 100644 index 0000000000..e00151ce80 --- /dev/null +++ b/test/images/serve_hostname/serve_hostname.go @@ -0,0 +1,105 @@ +/* +Copyright 2014 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// A small utility to just serve the hostname on TCP and/or UDP. +package main + +import ( + "flag" + "fmt" + "log" + "net" + "net/http" + "os" + "os/signal" + "syscall" +) + +var ( + doTCP = flag.Bool("tcp", false, "Serve raw over TCP.") + doUDP = flag.Bool("udp", false, "Serve raw over UDP.") + doHTTP = flag.Bool("http", true, "Serve HTTP.") + port = flag.Int("port", 9376, "Port number.") +) + +func main() { + flag.Parse() + + if *doHTTP && (*doTCP || *doUDP) { + log.Fatalf("Can't server TCP/UDP mode and HTTP mode at the same time") + } + + hostname, err := os.Hostname() + if err != nil { + log.Fatalf("Error from os.Hostname(): %s", err) + } + + if *doTCP { + listener, err := net.Listen("tcp", fmt.Sprintf(":%d", *port)) + if err != nil { + log.Fatalf("Error from net.Listen(): %s", err) + } + go func() { + for { + conn, err := listener.Accept() + if err != nil { + log.Fatalf("Error from Accept(): %s", err) + } + log.Printf("TCP request from %s", conn.RemoteAddr().String()) + conn.Write([]byte(hostname)) + conn.Close() + } + }() + } + if *doUDP { + addr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", *port)) + if err != nil { + log.Fatalf("Error from net.ResolveUDPAddr(): %s", err) + } + sock, err := net.ListenUDP("udp", addr) + if err != nil { + log.Fatalf("Error from ListenUDP(): %s", err) + } + go func() { + var buffer [16]byte + for { + _, cliAddr, err := sock.ReadFrom(buffer[0:]) + if err != nil { + log.Fatalf("Error from ReadFrom(): %s", err) + } + log.Printf("UDP request from %s", cliAddr.String()) + sock.WriteTo([]byte(hostname), cliAddr) + } + }() + } + if *doHTTP { + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + log.Printf("HTTP request from %s", r.RemoteAddr) + fmt.Fprintf(w, "%s", hostname) + }) + go func() { + // Run in a closure so http.ListenAndServe doesn't block + log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil)) + }() + } + + // Write to stdout after receiving SIGTERM and SIGINT to help with debugging kubernetes issue #21605 + signals := make(chan os.Signal) + signal.Notify(signals, syscall.SIGTERM, syscall.SIGINT) + sig := <-signals + // Keep behavior consistent with how the signal is handled by default (default is to panic) + log.Panicf("Terminating after receiving signal: %s.\n", sig) +}