mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 14:07:14 +00:00
Merge pull request #81170 from claudiubelu/test-images/centralize-image-to-agnhost-part-4
Centralizes images into agnhost (part 4)
This commit is contained in:
commit
e265afa2cd
@ -15,15 +15,12 @@ filegroup(
|
|||||||
"//test/images/apparmor-loader:all-srcs",
|
"//test/images/apparmor-loader:all-srcs",
|
||||||
"//test/images/echoserver:all-srcs",
|
"//test/images/echoserver:all-srcs",
|
||||||
"//test/images/metadata-concealment:all-srcs",
|
"//test/images/metadata-concealment:all-srcs",
|
||||||
"//test/images/mounttest:all-srcs",
|
|
||||||
"//test/images/nonewprivs:all-srcs",
|
"//test/images/nonewprivs:all-srcs",
|
||||||
"//test/images/pets/peer-finder:all-srcs",
|
"//test/images/pets/peer-finder:all-srcs",
|
||||||
"//test/images/regression-issue-74839:all-srcs",
|
"//test/images/regression-issue-74839:all-srcs",
|
||||||
"//test/images/resource-consumer:all-srcs",
|
"//test/images/resource-consumer:all-srcs",
|
||||||
"//test/images/resource-consumer-controller:all-srcs",
|
|
||||||
"//test/images/sample-apiserver:all-srcs",
|
"//test/images/sample-apiserver:all-srcs",
|
||||||
"//test/images/sample-device-plugin:all-srcs",
|
"//test/images/sample-device-plugin:all-srcs",
|
||||||
"//test/images/test-webserver:all-srcs",
|
|
||||||
],
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
)
|
)
|
||||||
|
@ -26,6 +26,7 @@ go_library(
|
|||||||
"//test/images/agnhost/inclusterclient:go_default_library",
|
"//test/images/agnhost/inclusterclient:go_default_library",
|
||||||
"//test/images/agnhost/liveness:go_default_library",
|
"//test/images/agnhost/liveness:go_default_library",
|
||||||
"//test/images/agnhost/logs-generator:go_default_library",
|
"//test/images/agnhost/logs-generator:go_default_library",
|
||||||
|
"//test/images/agnhost/mounttest:go_default_library",
|
||||||
"//test/images/agnhost/net:go_default_library",
|
"//test/images/agnhost/net:go_default_library",
|
||||||
"//test/images/agnhost/netexec:go_default_library",
|
"//test/images/agnhost/netexec:go_default_library",
|
||||||
"//test/images/agnhost/nettest:go_default_library",
|
"//test/images/agnhost/nettest:go_default_library",
|
||||||
@ -34,7 +35,9 @@ go_library(
|
|||||||
"//test/images/agnhost/pause:go_default_library",
|
"//test/images/agnhost/pause:go_default_library",
|
||||||
"//test/images/agnhost/port-forward-tester:go_default_library",
|
"//test/images/agnhost/port-forward-tester:go_default_library",
|
||||||
"//test/images/agnhost/porter:go_default_library",
|
"//test/images/agnhost/porter:go_default_library",
|
||||||
|
"//test/images/agnhost/resource-consumer-controller:go_default_library",
|
||||||
"//test/images/agnhost/serve-hostname:go_default_library",
|
"//test/images/agnhost/serve-hostname:go_default_library",
|
||||||
|
"//test/images/agnhost/test-webserver:go_default_library",
|
||||||
"//test/images/agnhost/webhook:go_default_library",
|
"//test/images/agnhost/webhook:go_default_library",
|
||||||
"//vendor/github.com/spf13/cobra:go_default_library",
|
"//vendor/github.com/spf13/cobra:go_default_library",
|
||||||
"//vendor/k8s.io/klog:go_default_library",
|
"//vendor/k8s.io/klog:go_default_library",
|
||||||
@ -62,6 +65,7 @@ filegroup(
|
|||||||
"//test/images/agnhost/inclusterclient:all-srcs",
|
"//test/images/agnhost/inclusterclient:all-srcs",
|
||||||
"//test/images/agnhost/liveness:all-srcs",
|
"//test/images/agnhost/liveness:all-srcs",
|
||||||
"//test/images/agnhost/logs-generator:all-srcs",
|
"//test/images/agnhost/logs-generator:all-srcs",
|
||||||
|
"//test/images/agnhost/mounttest:all-srcs",
|
||||||
"//test/images/agnhost/net:all-srcs",
|
"//test/images/agnhost/net:all-srcs",
|
||||||
"//test/images/agnhost/netexec:all-srcs",
|
"//test/images/agnhost/netexec:all-srcs",
|
||||||
"//test/images/agnhost/nettest:all-srcs",
|
"//test/images/agnhost/nettest:all-srcs",
|
||||||
@ -70,7 +74,9 @@ filegroup(
|
|||||||
"//test/images/agnhost/pause:all-srcs",
|
"//test/images/agnhost/pause:all-srcs",
|
||||||
"//test/images/agnhost/port-forward-tester:all-srcs",
|
"//test/images/agnhost/port-forward-tester:all-srcs",
|
||||||
"//test/images/agnhost/porter:all-srcs",
|
"//test/images/agnhost/porter:all-srcs",
|
||||||
|
"//test/images/agnhost/resource-consumer-controller:all-srcs",
|
||||||
"//test/images/agnhost/serve-hostname:all-srcs",
|
"//test/images/agnhost/serve-hostname:all-srcs",
|
||||||
|
"//test/images/agnhost/test-webserver:all-srcs",
|
||||||
"//test/images/agnhost/webhook:all-srcs",
|
"//test/images/agnhost/webhook:all-srcs",
|
||||||
],
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
|
@ -16,6 +16,10 @@ FROM BASEIMAGE
|
|||||||
|
|
||||||
CROSS_BUILD_COPY qemu-QEMUARCH-static /usr/bin/
|
CROSS_BUILD_COPY qemu-QEMUARCH-static /usr/bin/
|
||||||
|
|
||||||
|
# from dnsutils image
|
||||||
|
# install necessary packages:
|
||||||
|
# - bind-tools: contains dig, which can used in DNS tests.
|
||||||
|
# - CoreDNS: used in some DNS tests.
|
||||||
# from hostexec image
|
# from hostexec image
|
||||||
# install necessary packages:
|
# install necessary packages:
|
||||||
# - curl, nc: used by a lot of e2e tests
|
# - curl, nc: used by a lot of e2e tests
|
||||||
@ -26,10 +30,14 @@ RUN apk --update add bind-tools curl netcat-openbsd iproute2 iperf bash && rm -r
|
|||||||
&& ln -s /usr/bin/iperf /usr/local/bin/iperf \
|
&& ln -s /usr/bin/iperf /usr/local/bin/iperf \
|
||||||
&& ls -altrh /usr/local/bin/iperf
|
&& ls -altrh /usr/local/bin/iperf
|
||||||
|
|
||||||
# PORT 8080 needed by: netexec, nettest
|
ADD https://github.com/coredns/coredns/releases/download/v1.6.2/coredns_1.6.2_linux_BASEARCH.tgz /coredns.tgz
|
||||||
|
RUN tar -xzvf /coredns.tgz && rm -f /coredns.tgz
|
||||||
|
|
||||||
|
# PORT 80 needed by: test-webserver
|
||||||
|
# PORT 8080 needed by: netexec, nettest, resource-consumer, resource-consumer-controller
|
||||||
# PORT 8081 needed by: netexec
|
# PORT 8081 needed by: netexec
|
||||||
# PORT 9376 needed by: serve-hostname
|
# PORT 9376 needed by: serve-hostname
|
||||||
EXPOSE 8080 8081 9376
|
EXPOSE 80 8080 8081 9376
|
||||||
|
|
||||||
# from netexec
|
# from netexec
|
||||||
RUN mkdir /uploads
|
RUN mkdir /uploads
|
||||||
|
@ -40,7 +40,7 @@ For example, let's consider the following `pod.yaml` file:
|
|||||||
containers:
|
containers:
|
||||||
- args:
|
- args:
|
||||||
- dns-suffix
|
- dns-suffix
|
||||||
image: gcr.io/kubernetes-e2e-test-images/agnhost:2.8
|
image: gcr.io/kubernetes-e2e-test-images/agnhost:2.9
|
||||||
name: agnhost
|
name: agnhost
|
||||||
dnsConfig:
|
dnsConfig:
|
||||||
nameservers:
|
nameservers:
|
||||||
@ -290,14 +290,14 @@ Examples:
|
|||||||
|
|
||||||
```console
|
```console
|
||||||
docker run -i \
|
docker run -i \
|
||||||
gcr.io/kubernetes-e2e-test-images/agnhost:2.8 \
|
gcr.io/kubernetes-e2e-test-images/agnhost:2.9 \
|
||||||
logs-generator --log-lines-total 10 --run-duration 1s
|
logs-generator --log-lines-total 10 --run-duration 1s
|
||||||
```
|
```
|
||||||
|
|
||||||
```console
|
```console
|
||||||
kubectl run logs-generator \
|
kubectl run logs-generator \
|
||||||
--generator=run-pod/v1 \
|
--generator=run-pod/v1 \
|
||||||
--image=gcr.io/kubernetes-e2e-test-images/agnhost:2.8 \
|
--image=gcr.io/kubernetes-e2e-test-images/agnhost:2.9 \
|
||||||
--restart=Never \
|
--restart=Never \
|
||||||
-- logs-generator -t 10 -d 1s
|
-- logs-generator -t 10 -d 1s
|
||||||
```
|
```
|
||||||
@ -305,6 +305,37 @@ kubectl run logs-generator \
|
|||||||
[]()
|
[]()
|
||||||
|
|
||||||
|
|
||||||
|
### mounttest
|
||||||
|
|
||||||
|
The `mounttest` subcommand can be used to create files with various permissions, read files,
|
||||||
|
and output file system type, mode, owner, and permissions for any given file.
|
||||||
|
|
||||||
|
The subcommand can accept the following flags:
|
||||||
|
|
||||||
|
- `fs_type`: Path to print the FS type for.
|
||||||
|
- `file_mode`: Path to print the mode bits of.
|
||||||
|
- `file_perm`: Path to print the perms of.
|
||||||
|
- `file_owner`: Path to print the owning UID and GID of.
|
||||||
|
- `new_file_0644`: Path to write to and read from with perm 0644.
|
||||||
|
- `new_file_0666`: Path to write to and read from with perm 0666.
|
||||||
|
- `new_file_0660`: Path to write to and read from with perm 0660.
|
||||||
|
- `new_file_0777`: Path to write to and read from with perm 0777.
|
||||||
|
- `file_content`: Path to read the file content from.
|
||||||
|
- `file_content_in_loop`: Path to read the file content in loop from.
|
||||||
|
- `retry_time` (default: 180): Retry time during the loop.
|
||||||
|
- `break_on_expected_content` (default: true): Break out of loop on expected content (use with `--file_content_in_loop` flag only).
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
```console
|
||||||
|
kubectl exec test-agnhost -- /agnhost mounttest \
|
||||||
|
[--fs_type <path>] [--file_mode <path>] [--file_perm <path>] [--file_owner <path>] \
|
||||||
|
[--new_file_0644 <path>] [--new_file_0666 <path>] [--new_file_0660 <path>] [--new_file_0777 <path>] \
|
||||||
|
[--file_content <path>] [--file_content_in_loop <path>] \
|
||||||
|
[--retry_time <seconds>] [--break_on_expected_content <true_or_false>]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### net
|
### net
|
||||||
|
|
||||||
The goal of this Go project is to consolidate all low-level
|
The goal of this Go project is to consolidate all low-level
|
||||||
@ -424,7 +455,7 @@ Usage:
|
|||||||
```console
|
```console
|
||||||
kubectl run test-agnhost \
|
kubectl run test-agnhost \
|
||||||
--generator=run-pod/v1 \
|
--generator=run-pod/v1 \
|
||||||
--image=gcr.io/kubernetes-e2e-test-images/agnhost:2.8 \
|
--image=gcr.io/kubernetes-e2e-test-images/agnhost:2.9 \
|
||||||
--restart=Never \
|
--restart=Never \
|
||||||
--env "POD_IP=<POD_IP>" \
|
--env "POD_IP=<POD_IP>" \
|
||||||
--env "NODE_IP=<NODE_IP>" \
|
--env "NODE_IP=<NODE_IP>" \
|
||||||
@ -479,7 +510,7 @@ Usage:
|
|||||||
```console
|
```console
|
||||||
kubectl run test-agnhost \
|
kubectl run test-agnhost \
|
||||||
--generator=run-pod/v1 \
|
--generator=run-pod/v1 \
|
||||||
--image=gcr.io/kubernetes-e2e-test-images/agnhost:2.8 \
|
--image=gcr.io/kubernetes-e2e-test-images/agnhost:2.9 \
|
||||||
--restart=Never \
|
--restart=Never \
|
||||||
--env "BIND_ADDRESS=localhost" \
|
--env "BIND_ADDRESS=localhost" \
|
||||||
--env "BIND_PORT=8080" \
|
--env "BIND_PORT=8080" \
|
||||||
@ -517,6 +548,25 @@ Usage:
|
|||||||
[]()
|
[]()
|
||||||
|
|
||||||
|
|
||||||
|
### resource-consumer-controller
|
||||||
|
|
||||||
|
This subcommand starts an HTTP server that spreads requests around resource consumers. The HTTP server has the same endpoints and usage as the one spawned by the ``resource-consumer`` subcommand.
|
||||||
|
|
||||||
|
The subcommand can accept the following flags:
|
||||||
|
|
||||||
|
- `port` (default: 8080): The port number to listen to.
|
||||||
|
- `consumer-port` (default: 8080): Port number of consumers.
|
||||||
|
- `consumer-service-name` (default: `resource-consumer`): Name of service containing resource consumers.
|
||||||
|
- `consumer-service-namespace` (default: `default`): Namespace of service containing resource consumers.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
```console
|
||||||
|
kubectl exec test-agnhost -- /agnhost resource-consumer-controller \
|
||||||
|
[--port <port>] [--consumer-port <port>] [--consumer-service-name <service-name>] [--consumer-service-namespace <namespace>]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### serve-hostname
|
### serve-hostname
|
||||||
|
|
||||||
This is a small util app to serve your hostname on TCP and/or UDP. Useful for testing.
|
This is a small util app to serve your hostname on TCP and/or UDP. Useful for testing.
|
||||||
@ -542,6 +592,21 @@ Usage:
|
|||||||
[]()
|
[]()
|
||||||
|
|
||||||
|
|
||||||
|
### test-webserver
|
||||||
|
|
||||||
|
Starts a simple HTTP fileserver which serves any file specified in the URL path, if it exists.
|
||||||
|
|
||||||
|
The subcommand can accept the following flags:
|
||||||
|
|
||||||
|
- `port` (default: `80`): The port number to listen to.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
```console
|
||||||
|
kubectl exec test-agnhost -- /agnhost test-webserver [--port <port>]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### webhook (Kubernetes External Admission Webhook)
|
### webhook (Kubernetes External Admission Webhook)
|
||||||
|
|
||||||
The subcommand tests MutatingAdmissionWebhook and ValidatingAdmissionWebhook. After deploying
|
The subcommand tests MutatingAdmissionWebhook and ValidatingAdmissionWebhook. After deploying
|
||||||
@ -561,11 +626,11 @@ Usage:
|
|||||||
|
|
||||||
## Other tools
|
## Other tools
|
||||||
|
|
||||||
The image contains `iperf`.
|
The image contains `iperf`, `curl`, `dns-tools` (including `dig`), CoreDNS.
|
||||||
|
|
||||||
|
|
||||||
## Image
|
## Image
|
||||||
|
|
||||||
The image can be found at `gcr.io/kubernetes-e2e-test-images/agnhost:2.8` for Linux
|
The image can be found at `gcr.io/kubernetes-e2e-test-images/agnhost:2.9` for Linux
|
||||||
containers, and `e2eteam/agnhost:2.8` for Windows containers. In the future, the same
|
containers, and `e2eteam/agnhost:2.8` for Windows containers. In the future, the same
|
||||||
repository can be used for both OSes.
|
repository can be used for both OSes.
|
||||||
|
@ -1 +1 @@
|
|||||||
2.8
|
2.9
|
||||||
|
@ -32,6 +32,7 @@ import (
|
|||||||
"k8s.io/kubernetes/test/images/agnhost/inclusterclient"
|
"k8s.io/kubernetes/test/images/agnhost/inclusterclient"
|
||||||
"k8s.io/kubernetes/test/images/agnhost/liveness"
|
"k8s.io/kubernetes/test/images/agnhost/liveness"
|
||||||
"k8s.io/kubernetes/test/images/agnhost/logs-generator"
|
"k8s.io/kubernetes/test/images/agnhost/logs-generator"
|
||||||
|
"k8s.io/kubernetes/test/images/agnhost/mounttest"
|
||||||
"k8s.io/kubernetes/test/images/agnhost/net"
|
"k8s.io/kubernetes/test/images/agnhost/net"
|
||||||
"k8s.io/kubernetes/test/images/agnhost/netexec"
|
"k8s.io/kubernetes/test/images/agnhost/netexec"
|
||||||
"k8s.io/kubernetes/test/images/agnhost/nettest"
|
"k8s.io/kubernetes/test/images/agnhost/nettest"
|
||||||
@ -40,12 +41,14 @@ import (
|
|||||||
"k8s.io/kubernetes/test/images/agnhost/pause"
|
"k8s.io/kubernetes/test/images/agnhost/pause"
|
||||||
"k8s.io/kubernetes/test/images/agnhost/port-forward-tester"
|
"k8s.io/kubernetes/test/images/agnhost/port-forward-tester"
|
||||||
"k8s.io/kubernetes/test/images/agnhost/porter"
|
"k8s.io/kubernetes/test/images/agnhost/porter"
|
||||||
|
"k8s.io/kubernetes/test/images/agnhost/resource-consumer-controller"
|
||||||
"k8s.io/kubernetes/test/images/agnhost/serve-hostname"
|
"k8s.io/kubernetes/test/images/agnhost/serve-hostname"
|
||||||
|
"k8s.io/kubernetes/test/images/agnhost/test-webserver"
|
||||||
"k8s.io/kubernetes/test/images/agnhost/webhook"
|
"k8s.io/kubernetes/test/images/agnhost/webhook"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rootCmd := &cobra.Command{Use: "app", Version: "2.8"}
|
rootCmd := &cobra.Command{Use: "app", Version: "2.9"}
|
||||||
|
|
||||||
rootCmd.AddCommand(auditproxy.CmdAuditProxy)
|
rootCmd.AddCommand(auditproxy.CmdAuditProxy)
|
||||||
rootCmd.AddCommand(connect.CmdConnect)
|
rootCmd.AddCommand(connect.CmdConnect)
|
||||||
@ -59,6 +62,7 @@ func main() {
|
|||||||
rootCmd.AddCommand(inclusterclient.CmdInClusterClient)
|
rootCmd.AddCommand(inclusterclient.CmdInClusterClient)
|
||||||
rootCmd.AddCommand(liveness.CmdLiveness)
|
rootCmd.AddCommand(liveness.CmdLiveness)
|
||||||
rootCmd.AddCommand(logsgen.CmdLogsGenerator)
|
rootCmd.AddCommand(logsgen.CmdLogsGenerator)
|
||||||
|
rootCmd.AddCommand(mounttest.CmdMounttest)
|
||||||
rootCmd.AddCommand(net.CmdNet)
|
rootCmd.AddCommand(net.CmdNet)
|
||||||
rootCmd.AddCommand(netexec.CmdNetexec)
|
rootCmd.AddCommand(netexec.CmdNetexec)
|
||||||
rootCmd.AddCommand(nettest.CmdNettest)
|
rootCmd.AddCommand(nettest.CmdNettest)
|
||||||
@ -67,7 +71,9 @@ func main() {
|
|||||||
rootCmd.AddCommand(pause.CmdPause)
|
rootCmd.AddCommand(pause.CmdPause)
|
||||||
rootCmd.AddCommand(porter.CmdPorter)
|
rootCmd.AddCommand(porter.CmdPorter)
|
||||||
rootCmd.AddCommand(portforwardtester.CmdPortForwardTester)
|
rootCmd.AddCommand(portforwardtester.CmdPortForwardTester)
|
||||||
|
rootCmd.AddCommand(resconsumerctrl.CmdResourceConsumerController)
|
||||||
rootCmd.AddCommand(servehostname.CmdServeHostname)
|
rootCmd.AddCommand(servehostname.CmdServeHostname)
|
||||||
|
rootCmd.AddCommand(testwebserver.CmdTestWebserver)
|
||||||
rootCmd.AddCommand(webhook.CmdWebhook)
|
rootCmd.AddCommand(webhook.CmdWebhook)
|
||||||
|
|
||||||
// NOTE(claudiub): Some tests are passing logging related flags, so we need to be able to
|
// NOTE(claudiub): Some tests are passing logging related flags, so we need to be able to
|
||||||
|
@ -2,14 +2,18 @@ package(default_visibility = ["//visibility:public"])
|
|||||||
|
|
||||||
load(
|
load(
|
||||||
"@io_bazel_rules_go//go:def.bzl",
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
"go_binary",
|
|
||||||
"go_library",
|
"go_library",
|
||||||
)
|
)
|
||||||
|
|
||||||
go_library(
|
go_library(
|
||||||
name = "go_default_library",
|
name = "go_default_library",
|
||||||
srcs = ["mt.go"],
|
srcs = [
|
||||||
importpath = "k8s.io/kubernetes/test/images/mounttest",
|
"mt.go",
|
||||||
|
"mt_utils.go",
|
||||||
|
"mt_utils_windows.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/kubernetes/test/images/agnhost/mounttest",
|
||||||
|
deps = ["//vendor/github.com/spf13/cobra:go_default_library"],
|
||||||
)
|
)
|
||||||
|
|
||||||
filegroup(
|
filegroup(
|
||||||
@ -24,8 +28,3 @@ filegroup(
|
|||||||
srcs = [":package-srcs"],
|
srcs = [":package-srcs"],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
)
|
)
|
||||||
|
|
||||||
go_binary(
|
|
||||||
name = "mounttest",
|
|
||||||
embed = [":go_default_library"],
|
|
||||||
)
|
|
97
test/images/agnhost/mounttest/filePermissions.ps1
Normal file
97
test/images/agnhost/mounttest/filePermissions.ps1
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
# Copyright 2019 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.
|
||||||
|
|
||||||
|
Param(
|
||||||
|
[string]$FileName = $(throw "-FileName is required.")
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# read = read data | read attributes
|
||||||
|
$READ_PERMISSIONS = 0x0001 -bor 0x0080
|
||||||
|
|
||||||
|
# write = write data | append data | write attributes | write EA
|
||||||
|
$WRITE_PERMISSIONS = 0x0002 -bor 0x0004 -bor 0x0100 -bor 0x0010
|
||||||
|
|
||||||
|
# execute = read data | file execute
|
||||||
|
$EXECUTE_PERMISSIONS = 0x0001 -bor 0x0020
|
||||||
|
|
||||||
|
|
||||||
|
function GetFilePermissions($path) {
|
||||||
|
$objPath = "Win32_LogicalFileSecuritySetting='$path'"
|
||||||
|
$output = Invoke-WmiMethod -Namespace root/cimv2 -Path $objPath -Name GetSecurityDescriptor
|
||||||
|
|
||||||
|
if ($output.ReturnValue -ne 0) {
|
||||||
|
$retVal = $output.ReturnValue
|
||||||
|
Write-Error "GetSecurityDescriptor invocation failed with code: $retVal"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
$fileSD = $output.Descriptor
|
||||||
|
$fileOwnerGroup = $fileSD.Group
|
||||||
|
$fileOwner = $fileSD.Owner
|
||||||
|
|
||||||
|
if ($fileOwnerGroup.Name -eq $null -and $fileOwnerGroup.Domain -eq $null) {
|
||||||
|
# the file owner's group is not recognized. Check if the Owner itself is
|
||||||
|
# a group, and if so, default the group to it.
|
||||||
|
net user $fileOwner.Name > $null 2> $null
|
||||||
|
if (-not $?) {
|
||||||
|
$fileOwnerGroup = $fileOwner
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$userMask = 0
|
||||||
|
$groupMask = 0
|
||||||
|
$otherMask = 0
|
||||||
|
|
||||||
|
foreach ($ace in $fileSD.DACL) {
|
||||||
|
$mask = 0
|
||||||
|
if ($ace.AceType -ne 0) {
|
||||||
|
# not an Allow ACE, skip.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
# convert mask.
|
||||||
|
if ( ($ace.AccessMask -band $READ_PERMISSIONS) -eq $READ_PERMISSIONS ) {
|
||||||
|
$mask = $mask -bor 4
|
||||||
|
}
|
||||||
|
if ( ($ace.AccessMask -band $WRITE_PERMISSIONS) -eq $WRITE_PERMISSIONS ) {
|
||||||
|
$mask = $mask -bor 2
|
||||||
|
}
|
||||||
|
if ( ($ace.AccessMask -band $EXECUTE_PERMISSIONS) -eq $EXECUTE_PERMISSIONS ) {
|
||||||
|
$mask = $mask -bor 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# detect mask type.
|
||||||
|
if ($ace.Trustee.Equals($fileOwner)) {
|
||||||
|
$userMask = $mask
|
||||||
|
}
|
||||||
|
if ($ace.Trustee.Equals($fileOwnerGroup)) {
|
||||||
|
$groupMask = $mask
|
||||||
|
}
|
||||||
|
if ($ace.Trustee.Name.ToLower() -eq "users") {
|
||||||
|
$otherMask = $mask
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "$userMask$groupMask$otherMask"
|
||||||
|
}
|
||||||
|
|
||||||
|
$mask = GetFilePermissions($FileName)
|
||||||
|
if (-not $?) {
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# print the permission mask Linux-style.
|
||||||
|
echo "0$mask"
|
@ -1,5 +1,3 @@
|
|||||||
// +build linux
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2015 The Kubernetes Authors.
|
Copyright 2015 The Kubernetes Authors.
|
||||||
|
|
||||||
@ -16,17 +14,26 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package mounttest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"syscall"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CmdMounttest is used by agnhost Cobra.
|
||||||
|
var CmdMounttest = &cobra.Command{
|
||||||
|
Use: "mounttest",
|
||||||
|
Short: "Creates files with given permissions and outputs FS type, owner, mode, permissions, contents of files",
|
||||||
|
Long: "Creates files with specific file permissions, and outputs the filesystem type, owner, mode, permissions, content of the given files, if they exist.",
|
||||||
|
Args: cobra.MaximumNArgs(0),
|
||||||
|
Run: main,
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
fsTypePath = ""
|
fsTypePath = ""
|
||||||
fileModePath = ""
|
fileModePath = ""
|
||||||
@ -43,32 +50,30 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
flag.StringVar(&fsTypePath, "fs_type", "", "Path to print the fs type for")
|
CmdMounttest.Flags().StringVar(&fsTypePath, "fs_type", "", "Path to print the fs type for")
|
||||||
flag.StringVar(&fileModePath, "file_mode", "", "Path to print the mode bits of")
|
CmdMounttest.Flags().StringVar(&fileModePath, "file_mode", "", "Path to print the mode bits of")
|
||||||
flag.StringVar(&filePermPath, "file_perm", "", "Path to print the perms of")
|
CmdMounttest.Flags().StringVar(&filePermPath, "file_perm", "", "Path to print the perms of")
|
||||||
flag.StringVar(&fileOwnerPath, "file_owner", "", "Path to print the owning UID and GID of")
|
CmdMounttest.Flags().StringVar(&fileOwnerPath, "file_owner", "", "Path to print the owning UID and GID of")
|
||||||
flag.StringVar(&newFilePath0644, "new_file_0644", "", "Path to write to and read from with perm 0644")
|
CmdMounttest.Flags().StringVar(&newFilePath0644, "new_file_0644", "", "Path to write to and read from with perm 0644")
|
||||||
flag.StringVar(&newFilePath0666, "new_file_0666", "", "Path to write to and read from with perm 0666")
|
CmdMounttest.Flags().StringVar(&newFilePath0666, "new_file_0666", "", "Path to write to and read from with perm 0666")
|
||||||
flag.StringVar(&newFilePath0660, "new_file_0660", "", "Path to write to and read from with perm 0660")
|
CmdMounttest.Flags().StringVar(&newFilePath0660, "new_file_0660", "", "Path to write to and read from with perm 0660")
|
||||||
flag.StringVar(&newFilePath0777, "new_file_0777", "", "Path to write to and read from with perm 0777")
|
CmdMounttest.Flags().StringVar(&newFilePath0777, "new_file_0777", "", "Path to write to and read from with perm 0777")
|
||||||
flag.StringVar(&readFileContentPath, "file_content", "", "Path to read the file content from")
|
CmdMounttest.Flags().StringVar(&readFileContentPath, "file_content", "", "Path to read the file content from")
|
||||||
flag.StringVar(&readFileContentInLoopPath, "file_content_in_loop", "", "Path to read the file content in loop from")
|
CmdMounttest.Flags().StringVar(&readFileContentInLoopPath, "file_content_in_loop", "", "Path to read the file content in loop from")
|
||||||
flag.IntVar(&retryDuration, "retry_time", 180, "Retry time during the loop")
|
CmdMounttest.Flags().IntVar(&retryDuration, "retry_time", 180, "Retry time during the loop")
|
||||||
flag.BoolVar(&breakOnExpectedContent, "break_on_expected_content", true, "Break out of loop on expected content, (use with --file_content_in_loop flag only)")
|
CmdMounttest.Flags().BoolVar(&breakOnExpectedContent, "break_on_expected_content", true, "Break out of loop on expected content, (use with --file_content_in_loop flag only)")
|
||||||
}
|
}
|
||||||
|
|
||||||
// This program performs some tests on the filesystem as dictated by the
|
// This program performs some tests on the filesystem as dictated by the
|
||||||
// flags passed by the user.
|
// flags passed by the user.
|
||||||
func main() {
|
func main(cmd *cobra.Command, args []string) {
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
errs = []error{}
|
errs = []error{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Clear the umask so we can set any mode bits we want.
|
// Clear the umask so we can set any mode bits we want.
|
||||||
syscall.Umask(0000)
|
umask(0000)
|
||||||
|
|
||||||
// NOTE: the ordering of execution of the various command line
|
// NOTE: the ordering of execution of the various command line
|
||||||
// flags is intentional and allows a single command to:
|
// flags is intentional and allows a single command to:
|
||||||
@ -136,75 +141,6 @@ func main() {
|
|||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Defined by Linux (sys/statfs.h) - the type number for tmpfs mounts.
|
|
||||||
const linuxTmpfsMagic = 0x01021994
|
|
||||||
|
|
||||||
func fsType(path string) error {
|
|
||||||
if path == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
buf := syscall.Statfs_t{}
|
|
||||||
if err := syscall.Statfs(path, &buf); err != nil {
|
|
||||||
fmt.Printf("error from statfs(%q): %v\n", path, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if buf.Type == linuxTmpfsMagic {
|
|
||||||
fmt.Printf("mount type of %q: tmpfs\n", path)
|
|
||||||
} else {
|
|
||||||
fmt.Printf("mount type of %q: %v\n", path, buf.Type)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func fileMode(path string) error {
|
|
||||||
if path == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
fileinfo, err := os.Stat(path)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("error from Stat(%q): %v\n", path, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("mode of file %q: %v\n", path, fileinfo.Mode())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func filePerm(path string) error {
|
|
||||||
if path == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
fileinfo, err := os.Stat(path)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("error from Stat(%q): %v\n", path, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("perms of file %q: %v\n", path, fileinfo.Mode().Perm())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func fileOwner(path string) error {
|
|
||||||
if path == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
buf := syscall.Stat_t{}
|
|
||||||
if err := syscall.Stat(path, &buf); err != nil {
|
|
||||||
fmt.Printf("error from stat(%q): %v\n", path, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("owner UID of %q: %v\n", path, buf.Uid)
|
|
||||||
fmt.Printf("owner GID of %q: %v\n", path, buf.Gid)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func readFileContent(path string) error {
|
func readFileContent(path string) error {
|
||||||
if path == "" {
|
if path == "" {
|
||||||
return nil
|
return nil
|
98
test/images/agnhost/mounttest/mt_utils.go
Normal file
98
test/images/agnhost/mounttest/mt_utils.go
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
// +build !windows
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2019 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package mounttest
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func umask(mask int) int {
|
||||||
|
return syscall.Umask(mask)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Defined by Linux (sys/statfs.h) - the type number for tmpfs mounts.
|
||||||
|
const linuxTmpfsMagic = 0x01021994
|
||||||
|
|
||||||
|
func fsType(path string) error {
|
||||||
|
if path == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := syscall.Statfs_t{}
|
||||||
|
if err := syscall.Statfs(path, &buf); err != nil {
|
||||||
|
fmt.Printf("error from statfs(%q): %v\n", path, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf.Type == linuxTmpfsMagic {
|
||||||
|
fmt.Printf("mount type of %q: tmpfs\n", path)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("mount type of %q: %v\n", path, buf.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func fileMode(path string) error {
|
||||||
|
if path == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
fileinfo, err := os.Stat(path)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("error from Stat(%q): %v\n", path, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("mode of file %q: %v\n", path, fileinfo.Mode())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func filePerm(path string) error {
|
||||||
|
if path == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
fileinfo, err := os.Stat(path)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("error from Stat(%q): %v\n", path, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("perms of file %q: %v\n", path, fileinfo.Mode().Perm())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func fileOwner(path string) error {
|
||||||
|
if path == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := syscall.Stat_t{}
|
||||||
|
if err := syscall.Stat(path, &buf); err != nil {
|
||||||
|
fmt.Printf("error from stat(%q): %v\n", path, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("owner UID of %q: %v\n", path, buf.Uid)
|
||||||
|
fmt.Printf("owner GID of %q: %v\n", path, buf.Gid)
|
||||||
|
return nil
|
||||||
|
}
|
99
test/images/agnhost/mounttest/mt_utils_windows.go
Normal file
99
test/images/agnhost/mounttest/mt_utils_windows.go
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
// +build windows
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright 2019 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package mounttest
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func umask(mask int) int {
|
||||||
|
// noop for Windows.
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func fileOwner(path string) error {
|
||||||
|
// Windows does not have owner UID / GID. However, it has owner SID.
|
||||||
|
// not currently implemented in Kubernetes, so noop.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func fileMode(path string) error {
|
||||||
|
if path == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
permissions, err := getFilePerm(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("mode of Windows file %q: %v\n", path, permissions)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func filePerm(path string) error {
|
||||||
|
if path == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
permissions, err := getFilePerm(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("perms of Windows file %q: %v\n", path, permissions)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getFilePerm(path string) (os.FileMode, error) {
|
||||||
|
var (
|
||||||
|
out bytes.Buffer
|
||||||
|
errOut bytes.Buffer
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd := exec.Command("powershell.exe", "-NonInteractive", "./filePermissions.ps1",
|
||||||
|
"-FileName", path)
|
||||||
|
cmd.Stdout = &out
|
||||||
|
cmd.Stderr = &errOut
|
||||||
|
err := cmd.Run()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("error from PowerShell Script: %v, %v\n", err, errOut.String())
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
output := strings.TrimSpace(out.String())
|
||||||
|
val, err := strconv.ParseInt(output, 8, 32)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("error parsing string '%s' as int: %v\n", output, err)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.FileMode(val), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func fsType(path string) error {
|
||||||
|
// only NTFS is supported at the moment.
|
||||||
|
return nil
|
||||||
|
}
|
@ -2,20 +2,17 @@ package(default_visibility = ["//visibility:public"])
|
|||||||
|
|
||||||
load(
|
load(
|
||||||
"@io_bazel_rules_go//go:def.bzl",
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
"go_binary",
|
|
||||||
"go_library",
|
"go_library",
|
||||||
)
|
)
|
||||||
|
|
||||||
go_binary(
|
|
||||||
name = "controller",
|
|
||||||
embed = [":go_default_library"],
|
|
||||||
)
|
|
||||||
|
|
||||||
go_library(
|
go_library(
|
||||||
name = "go_default_library",
|
name = "go_default_library",
|
||||||
srcs = ["controller.go"],
|
srcs = ["controller.go"],
|
||||||
importpath = "k8s.io/kubernetes/test/images/resource-consumer-controller",
|
importpath = "k8s.io/kubernetes/test/images/agnhost/resource-consumer-controller",
|
||||||
deps = ["//test/images/resource-consumer/common:go_default_library"],
|
deps = [
|
||||||
|
"//test/images/resource-consumer/common:go_default_library",
|
||||||
|
"//vendor/github.com/spf13/cobra:go_default_library",
|
||||||
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
filegroup(
|
filegroup(
|
@ -14,10 +14,9 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package resconsumerctrl
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -25,18 +24,37 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"k8s.io/kubernetes/test/images/resource-consumer/common"
|
"k8s.io/kubernetes/test/images/resource-consumer/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
var port = flag.Int("port", 8080, "Port number.")
|
// CmdResourceConsumerController is used by agnhost Cobra.
|
||||||
var consumerPort = flag.Int("consumer-port", 8080, "Port number of consumers.")
|
var CmdResourceConsumerController = &cobra.Command{
|
||||||
var consumerServiceName = flag.String("consumer-service-name", "resource-consumer", "Name of service containing resource consumers.")
|
Use: "resource-consumer-controller",
|
||||||
var consumerServiceNamespace = flag.String("consumer-service-namespace", "default", "Namespace of service containing resource consumers.")
|
Short: "Starts a HTTP server that spreads requests around resource consumers",
|
||||||
|
Long: "Starts a HTTP server that spreads requests around resource consumers. The HTTP server has the same endpoints and usage as the one spawned by the \"resource-consumer\" subcommand.",
|
||||||
|
Args: cobra.MaximumNArgs(0),
|
||||||
|
Run: main,
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
var (
|
||||||
flag.Parse()
|
port int
|
||||||
|
consumerPort int
|
||||||
|
consumerServiceName string
|
||||||
|
consumerServiceNamespace string
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
CmdResourceConsumerController.Flags().IntVar(&port, "port", 8080, "Port number.")
|
||||||
|
CmdResourceConsumerController.Flags().IntVar(&consumerPort, "consumer-port", 8080, "Port number of consumers.")
|
||||||
|
CmdResourceConsumerController.Flags().StringVar(&consumerServiceName, "consumer-service-name", "resource-consumer", "Name of service containing resource consumers.")
|
||||||
|
CmdResourceConsumerController.Flags().StringVar(&consumerServiceNamespace, "consumer-service-namespace", "default", "Namespace of service containing resource consumers.")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main(cmd *cobra.Command, args []string) {
|
||||||
mgr := newController()
|
mgr := newController()
|
||||||
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), mgr))
|
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), mgr))
|
||||||
}
|
}
|
||||||
|
|
||||||
type controller struct {
|
type controller struct {
|
||||||
@ -196,7 +214,7 @@ func (c *controller) sendConsumeCustomMetric(w http.ResponseWriter, metric strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
func createConsumerURL(suffix string) string {
|
func createConsumerURL(suffix string) string {
|
||||||
return fmt.Sprintf("http://%s.%s.svc.cluster.local:%d%s", *consumerServiceName, *consumerServiceNamespace, *consumerPort, suffix)
|
return fmt.Sprintf("http://%s.%s.svc.cluster.local:%d%s", consumerServiceName, consumerServiceNamespace, consumerPort, suffix)
|
||||||
}
|
}
|
||||||
|
|
||||||
// sendOneConsumeCPURequest sends POST request for cpu consumption
|
// sendOneConsumeCPURequest sends POST request for cpu consumption
|
@ -2,19 +2,14 @@ package(default_visibility = ["//visibility:public"])
|
|||||||
|
|
||||||
load(
|
load(
|
||||||
"@io_bazel_rules_go//go:def.bzl",
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
"go_binary",
|
|
||||||
"go_library",
|
"go_library",
|
||||||
)
|
)
|
||||||
|
|
||||||
go_binary(
|
|
||||||
name = "test-webserver",
|
|
||||||
embed = [":go_default_library"],
|
|
||||||
)
|
|
||||||
|
|
||||||
go_library(
|
go_library(
|
||||||
name = "go_default_library",
|
name = "go_default_library",
|
||||||
srcs = ["test-webserver.go"],
|
srcs = ["test-webserver.go"],
|
||||||
importpath = "k8s.io/kubernetes/test/images/test-webserver",
|
importpath = "k8s.io/kubernetes/test/images/agnhost/test-webserver",
|
||||||
|
deps = ["//vendor/github.com/spf13/cobra:go_default_library"],
|
||||||
)
|
)
|
||||||
|
|
||||||
filegroup(
|
filegroup(
|
@ -14,23 +14,35 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// A tiny web server that serves a static file.
|
// Package testwebserver offers a tiny web server that serves a static file.
|
||||||
package main
|
package testwebserver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CmdTestWebserver is used by agnhost Cobra.
|
||||||
|
var CmdTestWebserver = &cobra.Command{
|
||||||
|
Use: "test-webserver",
|
||||||
|
Short: "Starts a simple HTTP fileserver",
|
||||||
|
Long: "Starts a simple HTTP fileserver on the given --port, which serves any file specified in the URL path, if it exists.",
|
||||||
|
Args: cobra.MaximumNArgs(0),
|
||||||
|
Run: main,
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
port = flag.Int("port", 80, "Port number.")
|
port int
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func init() {
|
||||||
flag.Parse()
|
CmdTestWebserver.Flags().IntVar(&port, "port", 80, "Port number.")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main(cmd *cobra.Command, args []string) {
|
||||||
fs := http.StripPrefix("/", http.FileServer(http.Dir("/")))
|
fs := http.StripPrefix("/", http.FileServer(http.Dir("/")))
|
||||||
|
|
||||||
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -45,7 +57,7 @@ func main() {
|
|||||||
fs.ServeHTTP(w, r)
|
fs.ServeHTTP(w, r)
|
||||||
})
|
})
|
||||||
|
|
||||||
go log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil))
|
go log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), nil))
|
||||||
|
|
||||||
select {}
|
select {}
|
||||||
}
|
}
|
@ -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
|
|
@ -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
|
|
||||||
|
|
||||||
CROSS_BUILD_COPY qemu-QEMUARCH-static /usr/bin/
|
|
||||||
|
|
||||||
RUN apk add --no-cache bind-tools dnsmasq
|
|
||||||
|
|
||||||
ADD https://github.com/coredns/coredns/releases/download/v1.5.0/coredns_1.5.0_linux_BASEARCH.tgz /coredns.tgz
|
|
||||||
RUN tar -xzvf /coredns.tgz && rm -f /coredns.tgz
|
|
@ -1,27 +0,0 @@
|
|||||||
# Copyright 2019 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
|
|
||||||
|
|
||||||
USER ContainerAdministrator
|
|
||||||
ENV chocolateyUseWindowsCompression false
|
|
||||||
RUN powershell -Command \
|
|
||||||
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')); \
|
|
||||||
choco feature disable --name showDownloadProgress; \
|
|
||||||
powershell -Command choco install bind-toolsonly --version 9.10.3 -y
|
|
||||||
RUN powershell -Command "\
|
|
||||||
wget -uri 'https://github.com/coredns/coredns/releases/download/v1.5.0/coredns_1.5.0_windows_amd64.tgz' -OutFile 'C:\coredns.tgz';\
|
|
||||||
tar -xzvf 'C:\coredns.tgz';\
|
|
||||||
Remove-Item 'C:\coredns.tgz'"
|
|
||||||
ADD hostname /bin/hostname.exe
|
|
@ -1 +0,0 @@
|
|||||||
1.2
|
|
@ -1,5 +1,5 @@
|
|||||||
amd64=gcr.io/kubernetes-e2e-test-images/test-webserver-amd64:1.0
|
amd64=gcr.io/kubernetes-e2e-test-images/agnhost-amd64:2.7
|
||||||
arm=gcr.io/kubernetes-e2e-test-images/test-webserver-arm:1.0
|
arm=gcr.io/kubernetes-e2e-test-images/agnhost-arm:2.7
|
||||||
arm64=gcr.io/kubernetes-e2e-test-images/test-webserver-arm64:1.0
|
arm64=gcr.io/kubernetes-e2e-test-images/agnhost-arm64:2.7
|
||||||
ppc64le=gcr.io/kubernetes-e2e-test-images/test-webserver-ppc64le:1.0
|
ppc64le=gcr.io/kubernetes-e2e-test-images/agnhost-ppc64le:2.7
|
||||||
s390x=gcr.io/kubernetes-e2e-test-images/test-webserver-s390x:1.0
|
s390x=gcr.io/kubernetes-e2e-test-images/agnhost-s390x:2.7
|
||||||
|
@ -1 +1 @@
|
|||||||
1.0
|
1.1
|
||||||
|
@ -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 mounttest /
|
|
||||||
ENTRYPOINT ["/mounttest"]
|
|
@ -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=mounttest
|
|
||||||
ARCH ?= amd64
|
|
||||||
TARGET ?= $(CURDIR)
|
|
||||||
GOLANG_VERSION ?= latest
|
|
||||||
SRC_DIR = $(notdir $(shell pwd))
|
|
||||||
export
|
|
||||||
|
|
||||||
bin:
|
|
||||||
../image-util.sh bin $(SRCS)
|
|
||||||
|
|
||||||
.PHONY: bin
|
|
@ -1 +0,0 @@
|
|||||||
1.0
|
|
@ -1,5 +1,5 @@
|
|||||||
amd64=gcr.io/kubernetes-e2e-test-images/test-webserver-amd64:1.0
|
amd64=gcr.io/kubernetes-e2e-test-images/agnhost-amd64:2.7
|
||||||
arm=gcr.io/kubernetes-e2e-test-images/test-webserver-arm:1.0
|
arm=gcr.io/kubernetes-e2e-test-images/agnhost-arm:2.7
|
||||||
arm64=gcr.io/kubernetes-e2e-test-images/test-webserver-arm64:1.0
|
arm64=gcr.io/kubernetes-e2e-test-images/agnhost-arm64:2.7
|
||||||
ppc64le=gcr.io/kubernetes-e2e-test-images/test-webserver-ppc64le:1.0
|
ppc64le=gcr.io/kubernetes-e2e-test-images/agnhost-ppc64le:2.7
|
||||||
s390x=gcr.io/kubernetes-e2e-test-images/test-webserver-s390x:1.0
|
s390x=gcr.io/kubernetes-e2e-test-images/agnhost-s390x:2.7
|
||||||
|
@ -1 +1 @@
|
|||||||
1.0
|
1.1
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
amd64=busybox
|
|
||||||
arm=arm32v6/busybox
|
|
||||||
arm64=arm64v8/busybox
|
|
||||||
ppc64le=ppc64le/busybox
|
|
||||||
s390x=s390x/busybox
|
|
@ -1,18 +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
|
|
||||||
ADD controller /controller
|
|
||||||
EXPOSE 8080
|
|
||||||
ENTRYPOINT ["/controller"]
|
|
@ -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=controller
|
|
||||||
ARCH ?= amd64
|
|
||||||
TARGET ?= $(CURDIR)
|
|
||||||
GOLANG_VERSION ?= latest
|
|
||||||
SRC_DIR = $(notdir $(shell pwd))
|
|
||||||
export
|
|
||||||
|
|
||||||
bin:
|
|
||||||
../image-util.sh bin $(SRCS)
|
|
||||||
|
|
||||||
.PHONY: bin
|
|
@ -1 +0,0 @@
|
|||||||
1.0
|
|
@ -1,19 +0,0 @@
|
|||||||
# Copyright 2014 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 test-webserver /
|
|
||||||
EXPOSE 80
|
|
||||||
ENTRYPOINT ["/test-webserver"]
|
|
@ -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 = test-webserver
|
|
||||||
ARCH ?= amd64
|
|
||||||
TARGET ?= $(CURDIR)
|
|
||||||
GOLANG_VERSION ?= latest
|
|
||||||
SRC_DIR = $(notdir $(shell pwd))
|
|
||||||
export
|
|
||||||
|
|
||||||
bin:
|
|
||||||
../image-util.sh bin $(SRCS)
|
|
||||||
|
|
||||||
.PHONY: bin
|
|
@ -1 +0,0 @@
|
|||||||
1.0
|
|
Loading…
Reference in New Issue
Block a user