Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make Privileged pods node e2e use the framework #26228

Merged
merged 2 commits into from
May 28, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 9 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ check test:
# make test_integration
test_integration:
hack/test-integration.sh
.PHONY: test_integration test_integ
.PHONY: test_integration

# Build and run end-to-end tests.
#
Expand All @@ -98,7 +98,7 @@ test_e2e:
# Example:
# make test_e2e_node FOCUS=kubelet SKIP=container
# Build and run tests.
test_e2e_node:
test_e2e_node: ginkgo
hack/e2e-node-test.sh FOCUS=$(FOCUS) SKIP=$(SKIP)
.PHONY: test_e2e_node

Expand Down Expand Up @@ -146,3 +146,10 @@ release-skip-tests quick-release:
KUBE_RELEASE_RUN_TESTS=n KUBE_FASTBUILD=true build/release.sh
.PHONY: release-skip-tests quick-release

# Build ginkgo for tests
#
# Example:
# make ginkgo
ginkgo:
hack/build-go.sh vendor/github.com/onsi/ginkgo/ginkgo
.PHONY: ginkgo

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: does this need to be a phony target? Isn't the binary just ginkgo?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nvm - I assume it will be in the _output directory?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah. hack/build-go.sh will set GOBIN to _output.

On Wed, May 25, 2016 at 11:35 AM, Tim St. Clair notifications@github.com
wrote:

In Makefile
#26228 (comment)
:

@@ -146,3 +146,10 @@ release-skip-tests quick-release:
KUBE_RELEASE_RUN_TESTS=n KUBE_FASTBUILD=true build/release.sh
.PHONY: release-skip-tests quick-release

+# Build ginkgo for tests
+#
+# Example:
+# make ginkgo
+ginkgo:

  • hack/build-go.sh vendor/github.com/onsi/ginkgo/ginkgo
    +.PHONY: ginkgo

nvm - I assume it will be in the _output directory?


You are receiving this because you authored the thread.
Reply to this email directly or view it on GitHub
https://github.com/kubernetes/kubernetes/pull/26228/files/a07c9833fc0cc42e0b93f3835b7bb8e86d7843f7#r64627539

2 changes: 1 addition & 1 deletion hack/e2e-node-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ report=${REPORT:-"/tmp/"}

ginkgo=$(kube::util::find-binary "ginkgo")
if [[ -z "${ginkgo}" ]]; then
echo "You do not appear to have ginkgo built. Try 'make WHAT=vendor/github.com/onsi/ginkgo/ginkgo'"
echo "You do not appear to have ginkgo built. 'make WHAT=vendor/github.com/onsi/ginkgo/ginkgo'"
exit 1
fi

Expand Down
6 changes: 3 additions & 3 deletions test/e2e_node/exec_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ import (

"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/restclient"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/remotecommand"
remotecommandserver "k8s.io/kubernetes/pkg/kubelet/server/remotecommand"
"k8s.io/kubernetes/test/e2e/framework"
)

func execute(method string, url *url.URL, config *restclient.Config, stdin io.Reader, stdout, stderr io.Writer, tty bool) error {
Expand All @@ -37,11 +37,11 @@ func execute(method string, url *url.URL, config *restclient.Config, stdin io.Re
return exec.Stream(remotecommandserver.SupportedStreamingProtocols, stdin, stdout, stderr, tty)
}

func execCommandInContainer(config *restclient.Config, c *client.Client, ns, podName, containerName string, cmd []string) (string, error) {
func execCommandInContainer(config *restclient.Config, f *framework.Framework, ns, podName, containerName string, cmd []string) (string, error) {
var stdout, stderr bytes.Buffer
var stdin io.Reader
tty := false
req := c.RESTClient.Post().
req := f.Client.RESTClient.Post().
Resource("pods").
Name(podName).
Namespace(ns).
Expand Down
86 changes: 40 additions & 46 deletions test/e2e_node/privileged_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ import (

"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/client/restclient"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/test/e2e/framework"

. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
Expand All @@ -45,55 +45,60 @@ const (
privilegedCommand = "ip link add dummy1 type dummy"
)

type PrivilegedPodTestConfig struct {
config *restclient.Config
client *client.Client
namespace string
hostExecPod *api.Pod
privilegedPod *api.Pod
}

var _ = Describe("PrivilegedPod", func() {
var c *client.Client
restClientConfig := &restclient.Config{Host: *apiServerAddress}
BeforeEach(func() {
// Setup the apiserver client
c = client.NewOrDie(restClientConfig)
})
f := NewDefaultFramework("privileged-pod")
It("should test privileged pod", func() {
namespace := "privileged-pods"
config := &PrivilegedPodTestConfig{
client: c,
config: restClientConfig,
namespace: namespace,
}
restClientConfig := &restclient.Config{Host: *apiServerAddress}
By("Creating a host exec pod")
config.hostExecPod = createPodAndWaitUntilRunning(c, newHostExecPodSpec(config.namespace, "hostexec"))
podClient := f.Client.Pods(f.Namespace.Name)
hostExecPod := newHostExecPodSpec("hostexec")
defer podClient.Delete(hostExecPod.Name, nil)
_, err := podClient.Create(hostExecPod)
Expect(err).To(BeNil(), fmt.Sprintf("Error creating Pod %v", err))

By("Waiting for host exec pod to be running")
framework.ExpectNoError(f.WaitForPodRunning(hostExecPod.Name))

By("Getting status of the host exec pod")
hostExecPod, err = podClient.Get(hostExecPod.Name)
Expect(err).To(BeNil(), fmt.Sprintf("Error getting Pod %v", err))

By("Creating a privileged pod")
config.privilegedPod = createPodAndWaitUntilRunning(c, config.createPrivilegedPodSpec())
privilegedPod := createPrivilegedPodSpec()
defer podClient.Delete(privilegedPod.Name, nil)
_, err = podClient.Create(privilegedPod)
Expect(err).To(BeNil(), fmt.Sprintf("Error creating Pod %v", err))

By("Waiting for privileged pod to be running")
framework.ExpectNoError(f.WaitForPodRunning(privilegedPod.Name))

By("Getting status of privileged pod")
privilegedPod, err = podClient.Get(privilegedPod.Name)
Expect(err).To(BeNil(), fmt.Sprintf("Error getting Pod %v", err))

By("Executing privileged command on privileged container")
config.runPrivilegedCommandOnPrivilegedContainer()
outputMap := dialFromContainer(restClientConfig, f, hostExecPod, privilegedPod.Status.PodIP, privilegedHttpPort)
Expect(outputMap["error"]).To(BeEmpty(), fmt.Sprintf("Privileged command failed unexpectedly on privileged container, output: %v", outputMap))

By("Executing privileged command on non-privileged container")
config.runPrivilegedCommandOnNonPrivilegedContainer()
outputMap = dialFromContainer(restClientConfig, f, hostExecPod, privilegedPod.Status.PodIP, notPrivilegedHttpPort)
Expect(outputMap["error"]).To(BeEmpty(), fmt.Sprintf("Privileged command should have failed on non-privileged container, output: %v", outputMap))
})
})

func (config *PrivilegedPodTestConfig) createPrivilegedPodSpec() *api.Pod {
func createPrivilegedPodSpec() *api.Pod {
isPrivileged := true
notPrivileged := false
pod := &api.Pod{
TypeMeta: unversioned.TypeMeta{
Kind: "Pod",
APIVersion: registered.GroupOrDie(api.GroupName).GroupVersion.String(),
APIVersion: "v1",
},
ObjectMeta: api.ObjectMeta{
Name: privilegedPodName,
Namespace: config.namespace,
Name: privilegedPodName,
},
Spec: api.PodSpec{
NodeName: *nodeName,
Containers: []api.Container{
{
Name: privilegedContainerName,
Expand Down Expand Up @@ -123,17 +128,7 @@ func (config *PrivilegedPodTestConfig) createPrivilegedPodSpec() *api.Pod {
return pod
}

func (config *PrivilegedPodTestConfig) runPrivilegedCommandOnPrivilegedContainer() {
outputMap := config.dialFromContainer(config.privilegedPod.Status.PodIP, privilegedHttpPort)
Expect(len(outputMap["error"]) == 0).To(BeTrue(), fmt.Sprintf("Privileged command failed unexpectedly on privileged container, output: %v", outputMap))
}

func (config *PrivilegedPodTestConfig) runPrivilegedCommandOnNonPrivilegedContainer() {
outputMap := config.dialFromContainer(config.privilegedPod.Status.PodIP, notPrivilegedHttpPort)
Expect(len(outputMap["error"]) > 0).To(BeTrue(), fmt.Sprintf("Privileged command should have failed on non-privileged container, output: %v", outputMap))
}

func (config *PrivilegedPodTestConfig) dialFromContainer(containerIP string, containerHttpPort int) map[string]string {
func dialFromContainer(config *restclient.Config, f *framework.Framework, hostExecPod *api.Pod, containerIP string, containerHttpPort int) map[string]string {
v := url.Values{}
v.Set("shellCommand", "ip link add dummy1 type dummy")
cmd := fmt.Sprintf("curl -q 'http://%s:%d/shell?%s'",
Expand All @@ -142,8 +137,7 @@ func (config *PrivilegedPodTestConfig) dialFromContainer(containerIP string, con
v.Encode())
By(fmt.Sprintf("Exec-ing into container over http. Running command: %s", cmd))

stdout, err := execCommandInContainer(config.config, config.client, config.hostExecPod.Namespace, config.hostExecPod.Name, config.hostExecPod.Spec.Containers[0].Name,
[]string{"/bin/sh", "-c", cmd})
stdout, err := execCommandInContainer(config, f, f.Namespace.Name, hostExecPod.Name, hostExecPod.Spec.Containers[0].Name, []string{"/bin/sh", "-c", cmd})
Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("Error running command %q: %v", cmd, err))

var output map[string]string
Expand All @@ -153,17 +147,17 @@ func (config *PrivilegedPodTestConfig) dialFromContainer(containerIP string, con
}

// newHostExecPodSpec returns the pod spec of hostexec pod
func newHostExecPodSpec(ns, name string) *api.Pod {
func newHostExecPodSpec(name string) *api.Pod {
return &api.Pod{
TypeMeta: unversioned.TypeMeta{
Kind: "Pod",
APIVersion: registered.GroupOrDie(api.GroupName).GroupVersion.String(),
APIVersion: "v1",
},
ObjectMeta: api.ObjectMeta{
Name: name,
Namespace: ns,
Name: name,
},
Spec: api.PodSpec{
NodeName: *nodeName,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't need to be this PR, but I feel like this should be part of the framework.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1. I might tackle this as part of making e2e framework to support node requirements.

Containers: []api.Container{
{
Name: "hostexec",
Expand Down