diff --git a/test/e2e_node/BUILD b/test/e2e_node/BUILD index 9ee141f0096..d6d49105c1e 100644 --- a/test/e2e_node/BUILD +++ b/test/e2e_node/BUILD @@ -47,6 +47,7 @@ go_library( "//test/utils/image:go_default_library", "//vendor/github.com/blang/semver:go_default_library", "//vendor/github.com/coreos/go-systemd/util:go_default_library", + "//vendor/github.com/docker/docker/api/types:go_default_library", "//vendor/github.com/docker/docker/client:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", diff --git a/test/e2e_node/docker_util.go b/test/e2e_node/docker_util.go index 83c4177ff2c..135e465c977 100644 --- a/test/e2e_node/docker_util.go +++ b/test/e2e_node/docker_util.go @@ -22,6 +22,7 @@ import ( "github.com/blang/semver" systemdutil "github.com/coreos/go-systemd/util" + "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) @@ -73,20 +74,54 @@ func isDockerLiveRestoreSupported() (bool, error) { return version.GTE(semver.MustParse("1.26.0")), nil } +// getDockerInfo returns the Info struct for the running Docker daemon. +func getDockerInfo() (types.Info, error) { + var info types.Info + c, err := client.NewClient(defaultDockerEndpoint, "", nil, nil) + if err != nil { + return info, fmt.Errorf("failed to create docker client: %v", err) + } + info, err = c.Info(context.Background()) + if err != nil { + return info, fmt.Errorf("failed to get docker info: %v", err) + } + return info, nil +} + // isDockerLiveRestoreEnabled returns true if live-restore is enabled in the // Docker. func isDockerLiveRestoreEnabled() (bool, error) { - c, err := client.NewClient(defaultDockerEndpoint, "", nil, nil) + info, err := getDockerInfo() if err != nil { - return false, fmt.Errorf("failed to create docker client: %v", err) - } - info, err := c.Info(context.Background()) - if err != nil { - return false, fmt.Errorf("failed to get docker info: %v", err) + return false, err } return info.LiveRestoreEnabled, nil } +// getDockerLoggingDriver returns the name of the logging driver. +func getDockerLoggingDriver() (string, error) { + info, err := getDockerInfo() + if err != nil { + return "", err + } + return info.LoggingDriver, nil +} + +// isDockerSELinuxSupportEnabled checks whether the Docker daemon was started +// with SELinux support enabled. +func isDockerSELinuxSupportEnabled() (bool, error) { + info, err := getDockerInfo() + if err != nil { + return false, err + } + for _, s := range info.SecurityOptions { + if s == "selinux" { + return true, nil + } + } + return false, nil +} + // startDockerDaemon starts the Docker daemon. func startDockerDaemon() error { switch { diff --git a/test/e2e_node/log_path_test.go b/test/e2e_node/log_path_test.go index 62b64f04f86..2c01d8ac820 100644 --- a/test/e2e_node/log_path_test.go +++ b/test/e2e_node/log_path_test.go @@ -39,6 +39,30 @@ var _ = framework.KubeDescribe("ContainerLogPath", func() { f := framework.NewDefaultFramework("kubelet-container-log-path") Describe("Pod with a container", func() { Context("printed log to stdout", func() { + BeforeEach(func() { + if framework.TestContext.ContainerRuntime == "docker" { + // Container Log Path support requires JSON logging driver. + // It does not work when Docker daemon is logging to journald. + d, err := getDockerLoggingDriver() + framework.ExpectNoError(err) + if d != "json-file" { + framework.Skipf("Skipping because Docker daemon is using a logging driver other than \"json-file\": %s", d) + } + // Even if JSON logging is in use, this test fails if SELinux support + // is enabled, since the isolation provided by the SELinux policy + // prevents processes running inside Docker containers (under SELinux + // type svirt_lxc_net_t) from accessing the log files which are owned + // by Docker (and labeled with the container_var_lib_t type.) + // + // Therefore, let's also skip this test when running with SELinux + // support enabled. + e, err := isDockerSELinuxSupportEnabled() + framework.ExpectNoError(err) + if e { + framework.Skipf("Skipping because Docker daemon is running with SELinux support enabled") + } + } + }) It("should print log to correct log path", func() { podClient := f.PodClient() ns := f.Namespace.Name