kuryr-tempest-plugin/test_container/server.go
Yossi Boaron 3ae7eef13e Add support for UDP in kuryr/demo container
Update kuryr/demo container to support UDP server.
After this change, the kuryr/demo image runs both HTTP and UDP
servers.
The listeners ports values could be configured using pod's
environment variables.
And in addition, a simple udp client binary tool was added to
image, to use it, you should run :
udp_client <server's_ip> <server's port>

Change-Id: I9f2f2ad3273f947fecb776c0f56f6829df81aa67
2018-10-18 16:37:04 +03:00

105 lines
2.2 KiB
Go

package main
import (
"fmt"
"log"
"net"
"net/http"
"os"
"runtime"
"strconv"
"strings"
"sync"
)
func handler(w http.ResponseWriter, r *http.Request) {
hostname, err := os.Hostname()
log.Println("Received request")
if err == nil {
fmt.Fprintf(w, "%s: HELLO! I AM ALIVE!!!\n", hostname)
}
}
func send_udp_response(conn *net.UDPConn, addr *net.UDPAddr) {
hostname, err := os.Hostname()
if err == nil {
resp_str := fmt.Sprintf("%s: HELLO! I AM ALIVE!!!\n", hostname)
_, err := conn.WriteToUDP([]byte(resp_str), addr)
if err != nil {
log.Println("Failed to reply to client")
}
}
}
func run_udp_server(port int) {
p := make([]byte, 2048)
log.Println("Running UDP server")
ser, _ := net.ListenUDP("udp", &net.UDPAddr{IP: []byte{0, 0, 0, 0}, Port: port, Zone: ""})
defer ser.Close()
for {
_, remoteaddr, err := ser.ReadFromUDP(p)
if err != nil {
log.Println("We got an Error on reading")
continue
}
log.Println("Received UDP request")
send_udp_response(ser, remoteaddr)
}
}
func udp_handling(wg sync.WaitGroup) {
udpPort, udpPortPresent := os.LookupEnv("UDP_PORT")
var port_num int = 9090
if udpPortPresent {
port_num, _ = strconv.Atoi(strings.TrimSpace(udpPort))
}
run_udp_server(port_num)
}
func http_handling(wg sync.WaitGroup) {
defer wg.Done()
http.HandleFunc("/", handler)
httpsPort, httpsPortPresent := os.LookupEnv("HTTPS_PORT")
var port string
if httpsPortPresent {
port = ":" + strings.TrimSpace(httpsPort)
cert, certPresent := os.LookupEnv("HTTPS_CERT_PATH")
key, keyPresent := os.LookupEnv("HTTPS_KEY_PATH")
if !certPresent || !keyPresent {
log.Fatal("HTTPS_PORT configured but missing HTTPS_CERT_PATH and/or HTTPS_KEY_PATH")
}
log.Println("Running HTTPS server")
log.Fatal(http.ListenAndServeTLS(port, cert, key, nil))
} else {
httpPort, confPresent := os.LookupEnv("HTTP_PORT")
if confPresent {
port = ":" + strings.TrimSpace(httpPort)
} else {
port = ":8080"
}
log.Println("Running HTTP server")
log.Fatal(http.ListenAndServe(port, nil))
}
log.Println("Exit HTTP server...")
}
func main() {
runtime.GOMAXPROCS(2)
var wg sync.WaitGroup
wg.Add(2)
go http_handling(wg)
go udp_handling(wg)
wg.Wait()
}