test images: Centralizes images into agnhost (part 1)

Centralizes the following images into agnhost:

- fakegitserver
- hostexec
- liveness
- logs-generator
- no-snat-test
- no-snat-test-proxy
- port-forward-tester
This commit is contained in:
Claudiu Belu 2019-05-20 14:15:10 -07:00
parent 99e2646067
commit 76550ea8b8
44 changed files with 373 additions and 506 deletions

View File

@ -17,17 +17,11 @@ filegroup(
"//test/images/crd-conversion-webhook:all-srcs",
"//test/images/echoserver:all-srcs",
"//test/images/entrypoint-tester:all-srcs",
"//test/images/fakegitserver:all-srcs",
"//test/images/inclusterclient:all-srcs",
"//test/images/liveness:all-srcs",
"//test/images/logs-generator:all-srcs",
"//test/images/metadata-concealment:all-srcs",
"//test/images/mounttest:all-srcs",
"//test/images/no-snat-test:all-srcs",
"//test/images/no-snat-test-proxy:all-srcs",
"//test/images/nonewprivs:all-srcs",
"//test/images/pets/peer-finder:all-srcs",
"//test/images/port-forward-tester:all-srcs",
"//test/images/porter:all-srcs",
"//test/images/regression-issue-74839:all-srcs",
"//test/images/resource-consumer:all-srcs",

View File

@ -17,10 +17,16 @@ go_library(
importpath = "k8s.io/kubernetes/test/images/agnhost",
deps = [
"//test/images/agnhost/dns:go_default_library",
"//test/images/agnhost/fakegitserver:go_default_library",
"//test/images/agnhost/liveness:go_default_library",
"//test/images/agnhost/logs-generator:go_default_library",
"//test/images/agnhost/net:go_default_library",
"//test/images/agnhost/netexec:go_default_library",
"//test/images/agnhost/nettest:go_default_library",
"//test/images/agnhost/no-snat-test:go_default_library",
"//test/images/agnhost/no-snat-test-proxy:go_default_library",
"//test/images/agnhost/pause:go_default_library",
"//test/images/agnhost/port-forward-tester:go_default_library",
"//test/images/agnhost/webhook:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library",
"//vendor/k8s.io/klog:go_default_library",
@ -39,10 +45,16 @@ filegroup(
srcs = [
":package-srcs",
"//test/images/agnhost/dns:all-srcs",
"//test/images/agnhost/fakegitserver:all-srcs",
"//test/images/agnhost/liveness:all-srcs",
"//test/images/agnhost/logs-generator:all-srcs",
"//test/images/agnhost/net:all-srcs",
"//test/images/agnhost/netexec:all-srcs",
"//test/images/agnhost/nettest:all-srcs",
"//test/images/agnhost/no-snat-test:all-srcs",
"//test/images/agnhost/no-snat-test-proxy:all-srcs",
"//test/images/agnhost/pause:all-srcs",
"//test/images/agnhost/port-forward-tester:all-srcs",
"//test/images/agnhost/webhook:all-srcs",
],
tags = ["automanaged"],

View File

@ -22,6 +22,10 @@ CROSS_BUILD_COPY qemu-QEMUARCH-static /usr/bin/
# - iproute2: includes ss used in NodePort tests
RUN apk --update add curl netcat-openbsd iproute2 && rm -rf /var/cache/apk/*
# from logs-generator
ENV LOGS_GENERATOR_LINES_TOTAL 1
ENV LOGS_GENERATOR_DURATION 1s
# PORT 8080 needed by: netexec, nettest
# PORT 8081 needed by: netexec
EXPOSE 8080 8081
@ -31,3 +35,4 @@ RUN mkdir /uploads
ADD agnhost agnhost
ENTRYPOINT ["/agnhost"]
CMD ["pause"]

View File

@ -17,18 +17,8 @@ cases for the same tested behaviour.
## Usage
The `agnhost` binary is a CLI with the following subcommands:
- `dns-suffix`: It will output the host's configured DNS suffix list, separated by commas.
- `dns-server-list`: It will output the host's configured DNS servers, separated by commas.
- `etc-hosts`: It will output the contents of host's `hosts` file. This file's location
is `/etc/hosts` on Linux, while on Windows it is `C:/Windows/System32/drivers/etc/hosts`.
- `pause`: It will pause the execution of the binary. This can be used for containers
which have to be kept in a `Running` state for various purposes, including executing
other `agnhost` commands.
- `help`: Prints the binary's help menu. Additionally, it can be followed by another
subcommand in order to get more information about that subcommand, including its
possible arguments.
The `agnhost` binary has several subcommands which are can be used to test different
Kubernetes features; their behaviour and output is not affected by the underlying OS.
For example, let's consider the following `pod.yaml` file:
@ -74,6 +64,123 @@ created with the `pause` argument instead, allowing us execute multiple commands
The `agnhost` binary is a CLI with the following subcommands:
### dns-server-list
It will output the host's configured DNS servers, separated by commas.
Usage:
```console
kubectl exec test-agnhost -- /agnhost dns-server-list
```
### dns-suffix
It will output the host's configured DNS suffix list, separated by commas.
Usage:
```console
kubectl exec test-agnhost -- /agnhost dns-suffix
```
### etc-hosts
It will output the contents of host's `hosts` file. This file's location is `/etc/hosts`
on Linux, while on Windows it is `C:/Windows/System32/drivers/etc/hosts`.
Usage:
```console
kubectl exec test-agnhost -- /agnhost etc-hosts
```
### fake-gitserver
Fakes a git server. When doing `git clone localhost:8000`, you will clone an empty git
repo named `8000` on local. You can also use `git clone localhost:8000 my-repo-name` to
rename that repo.
Usage:
```console
kubectl exec test-agnhost -- /agnhost fake-gitserver
```
### help
Prints the binary's help menu. Additionally, it can be followed by another subcommand
in order to get more information about that subcommand, including its possible arguments.
Usage:
```console
kubectl exec test-agnhost -- /agnhost help
```
### liveness
Starts a simple server that is alive for 10 seconds, then reports unhealthy for the rest
of its (hopefully) short existence.
Usage:
```console
kubectl exec test-agnhost -- /agnhost liveness
```
### logs-generator
The `logs-generator` subcommand is a tool to create predictable load on the logs delivery system.
It generates random lines with predictable format and predictable average length.
Each line can be later uniquely identified to ensure logs delivery.
Tool is parametrized with the total number of number that should be generated and the duration of
the generation process. For example, if you want to create a throughput of 100 lines per second
for a minute, you set total number of lines to 6000 and duration to 1 minute.
Parameters are passed through environment variables. There are no defaults, you should always
set up container parameters. Total number of line is parametrized through env variable
`LOGS_GENERATOR_LINES_TOTAL` and duration in go format is parametrized through env variable
`LOGS_GENERATOR_DURATION`.
Inside the container all log lines are written to the stdout.
Each line is on average 100 bytes long and follows this pattern:
```
2000-12-31T12:59:59Z <id> <method> /api/v1/namespaces/<namespace>/endpoints/<random_string> <random_number>
```
Where `<id>` refers to the number from 0 to `total_lines - 1`, which is unique for each
line in a given run of the container.
Examples:
```console
docker run -i \
gcr.io/kubernetes-e2e-test-images/agnhost:1.1 \
logs-generator --log-lines-total 10 --run-duration 1
```
```console
kubectl run logs-generator \
--generator=run-pod/v1 \
--image=gcr.io/kubernetes-e2e-test-images/agnhost:1.1 \
--restart=Never \
-- logs-generator -t 10 -d 1
```
[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/test/images/logs-generator/README.md?pixel)]()
### net
The goal of this Go project is to consolidate all low-level
@ -173,6 +280,93 @@ Usage:
kubectl exec test-agnhost -- /agnhost nettest [--port <port>] [--peers <peers>] [--service <service>] [--namespace <namespace>] [--delay-shutdown <delay>]
```
### no-snat-test
The subcommand requires the following environment variables to be set, and they should be
valid IP addresses:
- `POD_IP`
- `NODE_IP`
Serves the following endpoints on the given port (defaults to `8080`).
- `/whoami` - returns the request's IP address.
- `/checknosnat` - queries `ip/whoami` for each provided IP (`/checknosnat?ips=ip1,ip2`),
and if all the response bodies match the `POD_IP`, it will return a 200 response, 500 otherwise.
Usage:
```console
kubectl run test-agnhost \
--generator=run-pod/v1 \
--image=gcr.io/kubernetes-e2e-test-images/agnhost:1.1 \
--restart=Never \
--env "POD_IP=<POD_IP>" \
--env "NODE_IP=<NODE_IP>" \
-- no-snat-test [--port <port>]
```
### no-snat-test-proxy
Serves the `/checknosnat` endpoint on the given port (defaults to `31235`). The endpoint
proxies the request to the given `target` (`/checknosnat?target=target_ip&ips=ip1,ip2`
-> `target_ip/checknosnat?ips=ip1,ip2`) and will return the same status as the status
as the proxied request, or 500 on error.
Usage:
```console
kubectl exec test-agnhost -- /agnhost no-snat-test-proxy [--port <port>]
```
### pause
It will pause the execution of the binary. This can be used for containers
which have to be kept in a `Running` state for various purposes, including
executing other `agnhost` commands.
Usage:
```console
kubectl exec test-agnhost -- /agnhost pause
```
### port-forward-tester
Listens for TCP connections on a given address and port, optionally checks the data received,
and sends a configurable number of data chunks, with a configurable interval between chunks.
The subcommand is using the following environment variables:
- `BIND_ADDRESS` (optional): The address on which it will start listening for TCP connections (default value: `localhost`)
- `BIND_PORT`: The port on which it will start listening for TCP connections.
- `EXPECTED_CLIENT_DATA` (optional): If set, it will check that the request sends the same exact data.
- `CHUNKS`: How many chunks of data to write in the response.
- `CHUNK_SIZE`: The expected size of each written chunk of data. If it does not match the actual size of the written data, it will exit with the exit code `4`.
- `CHUNK_INTERVAL`: The amount of time to wait in between chunks.
Usage:
```console
kubectl run test-agnhost \
--generator=run-pod/v1 \
--image=gcr.io/kubernetes-e2e-test-images/agnhost:1.1 \
--restart=Never \
--env "BIND_ADDRESS=localhost" \
--env "BIND_PORT=8080" \
--env "EXPECTED_CLIENT_DATA='Hello there!'" \
--env "CHUNKS=1" \
--env "CHUNK_SIZE=10" \
--env "CHUNK_INTERVAL=1" \
-- port-forward-tester
```
### webhook (Kubernetes External Admission Webhook)
The subcommand tests MutatingAdmissionWebhook and ValidatingAdmissionWebhook. After deploying
@ -191,6 +385,6 @@ Usage:
## Image
The image can be found at `gcr.io/kubernetes-e2e-test-images/agnhost:2.1` for Linux
containers, and `e2eteam/agnhost:2.1` for Windows containers. In the future, the same
The image can be found at `gcr.io/kubernetes-e2e-test-images/agnhost:1.1` for Linux
containers, and `e2eteam/agnhost:1.1` for Windows containers. In the future, the same
repository can be used for both OSes.

View File

@ -23,10 +23,16 @@ import (
"k8s.io/klog"
"k8s.io/kubernetes/test/images/agnhost/dns"
"k8s.io/kubernetes/test/images/agnhost/fakegitserver"
"k8s.io/kubernetes/test/images/agnhost/liveness"
"k8s.io/kubernetes/test/images/agnhost/logs-generator"
"k8s.io/kubernetes/test/images/agnhost/net"
"k8s.io/kubernetes/test/images/agnhost/netexec"
"k8s.io/kubernetes/test/images/agnhost/nettest"
"k8s.io/kubernetes/test/images/agnhost/no-snat-test"
"k8s.io/kubernetes/test/images/agnhost/no-snat-test-proxy"
"k8s.io/kubernetes/test/images/agnhost/pause"
"k8s.io/kubernetes/test/images/agnhost/port-forward-tester"
"k8s.io/kubernetes/test/images/agnhost/webhook"
)
@ -35,10 +41,16 @@ func main() {
rootCmd.AddCommand(dns.CmdDNSSuffix)
rootCmd.AddCommand(dns.CmdDNSServerList)
rootCmd.AddCommand(dns.CmdEtcHosts)
rootCmd.AddCommand(fakegitserver.CmdFakeGitServer)
rootCmd.AddCommand(liveness.CmdLiveness)
rootCmd.AddCommand(logsgen.CmdLogsGenerator)
rootCmd.AddCommand(net.CmdNet)
rootCmd.AddCommand(netexec.CmdNetexec)
rootCmd.AddCommand(nettest.CmdNettest)
rootCmd.AddCommand(nosnat.CmdNoSnatTest)
rootCmd.AddCommand(nosnatproxy.CmdNoSnatTestProxy)
rootCmd.AddCommand(pause.CmdPause)
rootCmd.AddCommand(portforwardtester.CmdPortForwardTester)
rootCmd.AddCommand(webhook.CmdWebhook)
// NOTE(claudiub): Some tests are passing logging related flags, so we need to be able to

View File

@ -2,19 +2,14 @@ package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "fakegitserver",
embed = [":go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["gitserver.go"],
importpath = "k8s.io/kubernetes/test/images/fakegitserver",
importpath = "k8s.io/kubernetes/test/images/agnhost/fakegitserver",
deps = ["//vendor/github.com/spf13/cobra:go_default_library"],
)
filegroup(

View File

@ -14,13 +14,25 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
package main
package fakegitserver
import (
"io"
"net/http"
"github.com/spf13/cobra"
)
// CmdFakeGitServer is used by agnhost Cobra.
var CmdFakeGitServer = &cobra.Command{
Use: "fake-gitserver",
Short: "Fakes a git server",
Long: `When doing "git clone localhost:8000", you will clone an empty git repo named "8000" on local.
You can also use "git clone localhost:8000 my-repo-name" to rename that repo.`,
Args: cobra.MaximumNArgs(0),
Run: main,
}
func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "I am a fake git server")
@ -28,7 +40,7 @@ func hello(w http.ResponseWriter, r *http.Request) {
// When doing `git clone localhost:8000`, you will clone an empty git repo named "8000" on local.
// You can also use `git clone localhost:8000 my-repo-name` to rename that repo.
func main() {
func main(cmd *cobra.Command, args []string) {
http.HandleFunc("/", hello)
http.ListenAndServe(":8000", nil)
}

View File

@ -2,19 +2,16 @@ package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "liveness",
embed = [":go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["server.go"],
importpath = "k8s.io/kubernetes/test/images/liveness",
importpath = "k8s.io/kubernetes/test/images/agnhost/liveness",
deps = [
"//vendor/github.com/spf13/cobra:go_default_library",
],
)
filegroup(

View File

@ -16,7 +16,8 @@ limitations under the License.
// A simple server that is alive for 10 seconds, then reports unhealthy for
// the rest of its (hopefully) short existence.
package main
package liveness
import (
"fmt"
@ -24,9 +25,20 @@ import (
"net/http"
"net/url"
"time"
"github.com/spf13/cobra"
)
func main() {
// CmdLiveness is used by agnhost Cobra.
var CmdLiveness = &cobra.Command{
Use: "liveness",
Short: "Starts a server that is alive for 10 seconds",
Long: "A simple server that is alive for 10 seconds, then reports unhealthy for the rest of its (hopefully) short existence",
Args: cobra.MaximumNArgs(0),
Run: main,
}
func main(cmd *cobra.Command, args []string) {
started := time.Now()
http.HandleFunc("/started", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)

View File

@ -2,21 +2,16 @@ package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "logs-generator",
embed = [":go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["logs_generator.go"],
importpath = "k8s.io/kubernetes/test/images/logs-generator",
importpath = "k8s.io/kubernetes/test/images/agnhost/logs-generator",
deps = [
"//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library",
"//vendor/k8s.io/klog:go_default_library",
],
)

View File

@ -14,13 +14,14 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
package main
package logsgen
import (
"flag"
"fmt"
"time"
"github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/util/rand"
"k8s.io/klog"
)
@ -38,27 +39,35 @@ var (
}
)
// CmdLogsGenerator is used by agnhost Cobra.
var CmdLogsGenerator = &cobra.Command{
Use: "logs-generator",
Short: "Outputs lines of logs to stdout uniformly",
Long: "Outputs <linesTotal> lines of logs to stdout uniformly for <duration>",
Args: cobra.MaximumNArgs(2),
Run: generateLogs,
}
var (
linesTotal = flag.Int("log-lines-total", 0, "Total lines that should be generated by the end of the run")
duration = flag.Duration("run-duration", 0, "Total duration of the run")
linesTotal int
duration time.Duration
)
func main() {
flag.Parse()
if *linesTotal <= 0 {
klog.Fatalf("Invalid total number of lines: %d", *linesTotal)
}
if *duration <= 0 {
klog.Fatalf("Invalid duration: %v", *duration)
}
generateLogs(*linesTotal, *duration)
func init() {
CmdLogsGenerator.Flags().IntVarP(&linesTotal, "log-lines-total", "t", 0, "Total lines that should be generated by the end of the run")
CmdLogsGenerator.Flags().DurationVarP(&duration, "run-duration", "d", 0, "Total duration of the run")
}
// Outputs linesTotal lines of logs to stdout uniformly for duration
func generateLogs(linesTotal int, duration time.Duration) {
func generateLogs(cmd *cobra.Command, args []string) {
if linesTotal <= 0 {
klog.Fatalf("Invalid total number of lines: %d", linesTotal)
}
if duration <= 0 {
klog.Fatalf("Invalid duration: %v", duration)
}
delay := duration / time.Duration(linesTotal)
ticker := time.NewTicker(delay)

View File

@ -2,23 +2,16 @@ package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "no-snat-test",
embed = [":go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["main.go"],
importpath = "k8s.io/kubernetes/test/images/no-snat-test",
importpath = "k8s.io/kubernetes/test/images/agnhost/no-snat-test-proxy",
deps = [
"//staging/src/k8s.io/component-base/cli/flag:go_default_library",
"//staging/src/k8s.io/component-base/logs:go_default_library",
"//vendor/github.com/spf13/pflag:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library",
],
)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
package main
package nosnatproxy
import (
"fmt"
@ -22,32 +22,36 @@ import (
"net/http"
"os"
"github.com/spf13/pflag"
cliflag "k8s.io/component-base/cli/flag"
"github.com/spf13/cobra"
"k8s.io/component-base/logs"
)
// CmdNoSnatTestProxy is used by agnhost Cobra.
var CmdNoSnatTestProxy = &cobra.Command{
Use: "no-snat-test-proxy",
Short: "Creates a proxy for the /checknosnat endpoint",
Long: `Creates the /checknosnat endpoint which proxies the request to the given target (/checknosnat?target=target_ip&ips=ip1,ip2) and returns its response, or a 500 response on error.`,
Args: cobra.MaximumNArgs(1),
Run: main,
}
var port string
func init() {
CmdNoSnatTestProxy.Flags().StringVar(&port, "port", "31235", "The port to serve /checknosnat endpoint on.")
}
// This Pod's /checknosnat takes `target` and `ips` arguments, and queries {target}/checknosnat?ips={ips}
type masqTestProxy struct {
Port string
}
func newMasqTestProxy() *masqTestProxy {
return &masqTestProxy{
Port: "31235",
func main(cmd *cobra.Command, args []string) {
m := &masqTestProxy{
Port: port,
}
}
func (m *masqTestProxy) AddFlags(fs *pflag.FlagSet) {
fs.StringVar(&m.Port, "port", m.Port, "The port to serve /checknosnat endpoint on.")
}
func main() {
m := newMasqTestProxy()
m.AddFlags(pflag.CommandLine)
cliflag.InitFlags()
logs.InitLogs()
defer logs.FlushLogs()

View File

@ -2,23 +2,16 @@ package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "no-snat-test-proxy",
embed = [":go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["main.go"],
importpath = "k8s.io/kubernetes/test/images/no-snat-test-proxy",
importpath = "k8s.io/kubernetes/test/images/agnhost/no-snat-test",
deps = [
"//staging/src/k8s.io/component-base/cli/flag:go_default_library",
"//staging/src/k8s.io/component-base/logs:go_default_library",
"//vendor/github.com/spf13/pflag:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library",
],
)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
package main
package nosnat
import (
"fmt"
@ -24,11 +24,29 @@ import (
"os"
"strings"
"github.com/spf13/pflag"
cliflag "k8s.io/component-base/cli/flag"
"github.com/spf13/cobra"
"k8s.io/component-base/logs"
)
// CmdNoSnatTest is used by agnhost Cobra.
var CmdNoSnatTest = &cobra.Command{
Use: "no-snat-test",
Short: "Creates the /checknosnat and /whoami endpoints",
Long: `Serves the following endpoints on the given port (defaults to "8080").
- /whoami - returns the request's IP address.
- /checknosnat - queries "ip/whoami" for each provided IP ("/checknosnat?ips=ip1,ip2"),
and if all the response bodies match the "POD_IP" environment variable, it will return a 200 response, 500 otherwise.`,
Args: cobra.MaximumNArgs(1),
Run: main,
}
var port string
func init() {
CmdNoSnatTest.Flags().StringVar(&port, "port", "8080", "The port to serve /checknosnat and /whoami endpoints on.")
}
// ip = target for /whoami query
// rip = returned ip
// pip = this pod's ip
@ -38,21 +56,11 @@ type masqTester struct {
Port string
}
func newMasqTester() *masqTester {
return &masqTester{
Port: "8080",
func main(cmd *cobra.Command, args []string) {
m := &masqTester{
Port: port,
}
}
func (m *masqTester) AddFlags(fs *pflag.FlagSet) {
fs.StringVar(&m.Port, "port", m.Port, "The port to serve /checknosnat and /whoami endpoints on.")
}
func main() {
m := newMasqTester()
m.AddFlags(pflag.CommandLine)
cliflag.InitFlags()
logs.InitLogs()
defer logs.FlushLogs()

View File

@ -2,19 +2,14 @@ package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "port-forward-tester",
embed = [":go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["portforwardtester.go"],
importpath = "k8s.io/kubernetes/test/images/port-forward-tester",
importpath = "k8s.io/kubernetes/test/images/agnhost/port-forward-tester",
deps = ["//vendor/github.com/spf13/cobra:go_default_library"],
)
filegroup(

View File

@ -26,7 +26,8 @@ limitations under the License.
// Log messages are written to stdout at various stages of the binary's execution.
// Test code can retrieve this container's log and validate that the expected
// behavior is taking place.
package main
package portforwardtester
import (
"fmt"
@ -35,6 +36,8 @@ import (
"strconv"
"strings"
"time"
"github.com/spf13/cobra"
)
func getEnvInt(name string) int {
@ -58,7 +61,26 @@ func getEnvInt(name string) int {
// This timeout is somewhat arbitrary (~latency around the planet).
const rstAvoidanceDelay = 500 * time.Millisecond
func main() {
// CmdPortForwardTester is used by agnhost Cobra.
var CmdPortForwardTester = &cobra.Command{
Use: "port-forward-tester",
Short: "Creates a TCP server that sends chunks of data",
Long: `Listens for TCP connections on a given address and port, optionally checks the data received,
and sends a configurable number of data chunks, with a configurable interval between chunks.
The subcommand is using the following environment variables:
- BIND_ADDRESS (optional): The address on which it will start listening for TCP connections (default value: localhost)
- BIND_PORT: The port on which it will start listening for TCP connections.
- EXPECTED_CLIENT_DATA (optional): If set, it will check that the request sends the same exact data.
- CHUNKS: How many chunks of data to write in the response.
- CHUNK_SIZE: The expected size of each written chunk of data. If it does not match the actual size of the written data, it will exit with the exit code 4.
- CHUNK_INTERVAL: The amount of time to wait in between chunks.`,
Args: cobra.MaximumNArgs(0),
Run: main,
}
func main(cmd *cobra.Command, args []string) {
bindAddress := os.Getenv("BIND_ADDRESS")
if bindAddress == "" {
bindAddress = "localhost"

View File

@ -1,19 +0,0 @@
# Copyright 2016 The Kubernetes Authors.
#
# 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 scratch
COPY GITHASH.txt /
COPY fakegitserver /
ENTRYPOINT ["/fakegitserver"]

View File

@ -1,27 +0,0 @@
# Copyright 2016 The Kubernetes Authors.
#
# 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.
SRCS = fakegitserver
ARCH ?= amd64
TARGET ?= $(CURDIR)
GOLANG_VERSION ?= latest
SRC_DIR = $(notdir $(shell pwd))
export
IGNORE := $(shell git rev-parse HEAD > $(TARGET)/GITHASH.txt)
bin:
../image-util.sh bin $(SRCS)
.PHONY: bin

View File

@ -1 +0,0 @@
1.0

View File

@ -1,5 +0,0 @@
amd64=alpine:3.6
arm=arm32v6/alpine:3.6
arm64=arm64v8/alpine:3.6
ppc64le=ppc64le/alpine:3.6
s390x=s390x/alpine:3.6

View File

@ -1,25 +0,0 @@
# Copyright 2016 The Kubernetes Authors.
#
# 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 BASEIMAGE
CROSS_BUILD_COPY qemu-QEMUARCH-static /usr/bin/
# install necessary packages:
# - curl, nc: used by a lot of e2e tests
# - iproute2: includes ss used in NodePort tests
RUN apk --update add curl netcat-openbsd iproute2 && rm -rf /var/cache/apk/*
# wait forever
CMD while true; do sleep 1d; done

View File

@ -1 +0,0 @@
1.1

View File

@ -1,12 +0,0 @@
apiVersion: v1
kind: Pod
metadata:
name: hostexec
labels:
app: hostexec
spec:
containers:
- name: hostexec
image: gcr.io/kubernetes-e2e-test-images/hostexec-amd64:1.1
securityContext:
hostNetwork: true

View File

@ -1,17 +0,0 @@
# Copyright 2016 The Kubernetes Authors.
#
# 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 scratch
COPY liveness /server

View File

@ -1,25 +0,0 @@
# Copyright 2016 The Kubernetes Authors.
#
# 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.
SRCS = liveness
ARCH ?= amd64
TARGET ?= $(CURDIR)
GOLANG_VERSION ?= latest
SRC_DIR = $(notdir $(shell pwd))
export
bin:
../image-util.sh bin $(SRCS)
.PHONY: bin

View File

@ -1 +0,0 @@
1.1

View File

@ -1,4 +0,0 @@
amd64=busybox
arm=arm32v6/busybox
arm64=arm64v8/busybox
ppc64le=ppc64le/busybox

View File

@ -1,22 +0,0 @@
# Copyright 2016 The Kubernetes Authors.
#
# 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 BASEIMAGE
ENV LOGS_GENERATOR_LINES_TOTAL 1
ENV LOGS_GENERATOR_DURATION 1s
COPY logs-generator /
CMD ["sh", "-c", "/logs-generator --logtostderr --log-lines-total=${LOGS_GENERATOR_LINES_TOTAL} --run-duration=${LOGS_GENERATOR_DURATION}"]

View File

@ -1,25 +0,0 @@
# Copyright 2016 The Kubernetes Authors.
#
# 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.
SRCS=logs-generator
ARCH ?= amd64
TARGET ?= $(CURDIR)
GOLANG_VERSION ?= latest
SRC_DIR = $(notdir $(shell pwd))
export
bin:
../image-util.sh bin $(SRCS)
.PHONY: bin

View File

@ -1,57 +0,0 @@
# Logs Generator
## Overview
Logs generator is a tool to create predictable load on the logs delivery system.
It generates random lines with predictable format and predictable average length.
Each line can be later uniquely identified to ensure logs delivery.
## Usage
Tool is parametrized with the total number of number that should be generated and the duration of
the generation process. For example, if you want to create a throughput of 100 lines per second
for a minute, you set total number of lines to 6000 and duration to 1 minute.
Parameters are passed through environment variables. There are no defaults, you should always
set up container parameters. Total number of line is parametrized through env variable
`LOGS_GENERATOR_LINES_TOTAL` and duration in go format is parametrized through env variable
`LOGS_GENERATOR_DURATION`.
Inside the container all log lines are written to the stdout.
Each line is on average 100 bytes long and follows this pattern:
```
2000-12-31T12:59:59Z <id> <method> /api/v1/namespaces/<namespace>/endpoints/<random_string> <random_number>
```
Where `<id>` refers to the number from 0 to `total_lines - 1`, which is unique for each
line in a given run of the container.
## Image
Image is located in the public repository of Google Container Registry under the name
```
k8s.gcr.io/logs-generator:v0.1.1
```
## Examples
```
docker run -i \
-e "LOGS_GENERATOR_LINES_TOTAL=10" \
-e "LOGS_GENERATOR_DURATION=1s" \
k8s.gcr.io/logs-generator:v0.1.1
```
```
kubectl run logs-generator \
--generator=run-pod/v1 \
--image=k8s.gcr.io/logs-generator:v0.1.1 \
--restart=Never \
--env "LOGS_GENERATOR_LINES_TOTAL=1000" \
--env "LOGS_GENERATOR_DURATION=1m"
```
[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/test/images/logs-generator/README.md?pixel)]()

View File

@ -1 +0,0 @@
1.0

View File

@ -1,4 +0,0 @@
amd64=alpine:3.6
arm=arm32v6/alpine:3.6
arm64=arm64v8/alpine:3.6
ppc64le=ppc64le/alpine:3.6

View File

@ -1,19 +0,0 @@
# Copyright 2017 The Kubernetes Authors.
#
# 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 BASEIMAGE
COPY no-snat-test-proxy /
ENTRYPOINT ["/no-snat-test-proxy"]

View File

@ -1,25 +0,0 @@
# Copyright 2017 The Kubernetes Authors.
#
# 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.
SRCS=no-snat-test-proxy
ARCH ?= amd64
TARGET ?= $(CURDIR)
GOLANG_VERSION ?= latest
SRC_DIR = $(notdir $(shell pwd))
export
bin:
../image-util.sh bin $(SRCS)
.PHONY: bin

View File

@ -1 +0,0 @@
1.0

View File

@ -1,4 +0,0 @@
amd64=alpine:3.6
arm=arm32v6/alpine:3.6
arm64=arm64v8/alpine:3.6
ppc64le=ppc64le/alpine:3.6

View File

@ -1,19 +0,0 @@
# Copyright 2017 The Kubernetes Authors.
#
# 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 BASEIMAGE
COPY no-snat-test /
ENTRYPOINT ["/no-snat-test"]

View File

@ -1,25 +0,0 @@
# Copyright 2017 The Kubernetes Authors.
#
# 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.
SRCS=no-snat-test
ARCH ?= amd64
TARGET ?= $(CURDIR)
GOLANG_VERSION ?= latest
SRC_DIR = $(notdir $(shell pwd))
export
bin:
../image-util.sh bin $(SRCS)
.PHONY: bin

View File

@ -1 +0,0 @@
1.0

View File

@ -1 +0,0 @@
portforwardtester

View File

@ -1,18 +0,0 @@
# Copyright 2015 The Kubernetes Authors.
#
# 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 scratch
ADD portforwardtester portforwardtester
ADD portforwardtester.go portforwardtester.go
ENTRYPOINT ["/portforwardtester"]

View File

@ -1,25 +0,0 @@
# Copyright 2016 The Kubernetes Authors.
#
# 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.
SRCS=portforwardtester
ARCH ?= amd64
TARGET ?= $(CURDIR)
GOLANG_VERSION ?= latest
SRC_DIR = $(notdir $(shell pwd))
export
bin:
../image-util.sh bin $(SRCS)
.PHONY: bin

View File

@ -1 +0,0 @@
1.0