mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
Unify fake runtime helper in kuberuntime, rkt and dockertools.
This commit is contained in:
parent
7265908e7f
commit
0deec63d1a
@ -12,6 +12,7 @@ go_library(
|
||||
srcs = [
|
||||
"fake_cache.go",
|
||||
"fake_runtime.go",
|
||||
"fake_runtime_helper.go",
|
||||
"mockfileinfo.go",
|
||||
"os.go",
|
||||
"runtime_mock.go",
|
||||
@ -19,6 +20,7 @@ go_library(
|
||||
tags = ["automanaged"],
|
||||
deps = [
|
||||
"//pkg/api/v1:go_default_library",
|
||||
"//pkg/kubelet/cm:go_default_library",
|
||||
"//pkg/kubelet/container:go_default_library",
|
||||
"//pkg/util/term:go_default_library",
|
||||
"//pkg/volume:go_default_library",
|
||||
|
63
pkg/kubelet/container/testing/fake_runtime_helper.go
Normal file
63
pkg/kubelet/container/testing/fake_runtime_helper.go
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
package testing
|
||||
|
||||
import (
|
||||
kubetypes "k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/kubernetes/pkg/api/v1"
|
||||
"k8s.io/kubernetes/pkg/kubelet/cm"
|
||||
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
||||
)
|
||||
|
||||
// FakeRuntimeHelper implements RuntimeHelper interfaces for testing purposes.
|
||||
type FakeRuntimeHelper struct {
|
||||
DNSServers []string
|
||||
DNSSearches []string
|
||||
HostName string
|
||||
HostDomain string
|
||||
PodContainerDir string
|
||||
Err error
|
||||
}
|
||||
|
||||
func (f *FakeRuntimeHelper) GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (*kubecontainer.RunContainerOptions, error) {
|
||||
var opts kubecontainer.RunContainerOptions
|
||||
if len(container.TerminationMessagePath) != 0 {
|
||||
opts.PodContainerDir = f.PodContainerDir
|
||||
}
|
||||
return &opts, nil
|
||||
}
|
||||
|
||||
func (f *FakeRuntimeHelper) GetPodCgroupParent(pod *v1.Pod) (cm.CgroupName, string) {
|
||||
return "", ""
|
||||
}
|
||||
|
||||
func (f *FakeRuntimeHelper) GetClusterDNS(pod *v1.Pod) ([]string, []string, error) {
|
||||
return f.DNSServers, f.DNSSearches, f.Err
|
||||
}
|
||||
|
||||
// This is not used by docker runtime.
|
||||
func (f *FakeRuntimeHelper) GeneratePodHostNameAndDomain(pod *v1.Pod) (string, string, error) {
|
||||
return f.HostName, f.HostDomain, f.Err
|
||||
}
|
||||
|
||||
func (f *FakeRuntimeHelper) GetPodDir(podUID kubetypes.UID) string {
|
||||
return "/poddir/" + string(podUID)
|
||||
}
|
||||
|
||||
func (f *FakeRuntimeHelper) GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 {
|
||||
return nil
|
||||
}
|
@ -107,7 +107,6 @@ go_test(
|
||||
"//pkg/api/v1:go_default_library",
|
||||
"//pkg/apis/componentconfig:go_default_library",
|
||||
"//pkg/credentialprovider:go_default_library",
|
||||
"//pkg/kubelet/cm:go_default_library",
|
||||
"//pkg/kubelet/container:go_default_library",
|
||||
"//pkg/kubelet/container/testing:go_default_library",
|
||||
"//pkg/kubelet/events:go_default_library",
|
||||
|
@ -695,7 +695,7 @@ func (dm *DockerManager) runContainer(
|
||||
// here we just add a unique container id to make the path unique for different instances
|
||||
// of the same container.
|
||||
containerLogPath := path.Join(opts.PodContainerDir, cid)
|
||||
fs, err := os.Create(containerLogPath)
|
||||
fs, err := dm.os.Create(containerLogPath)
|
||||
if err != nil {
|
||||
// TODO: Clean up the previously created dir? return the error?
|
||||
utilruntime.HandleError(fmt.Errorf("error creating termination-log file %q: %v", containerLogPath, err))
|
||||
@ -706,7 +706,7 @@ func (dm *DockerManager) runContainer(
|
||||
// open(2) to create the file, so the final mode used is "mode &
|
||||
// ~umask". But we want to make sure the specified mode is used
|
||||
// in the file no matter what the umask is.
|
||||
if err := os.Chmod(containerLogPath, 0666); err != nil {
|
||||
if err := dm.os.Chmod(containerLogPath, 0666); err != nil {
|
||||
utilruntime.HandleError(fmt.Errorf("unable to set termination-log file permissions %q: %v", containerLogPath, err))
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,6 @@ import (
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
"k8s.io/kubernetes/pkg/api/v1"
|
||||
"k8s.io/kubernetes/pkg/apis/componentconfig"
|
||||
"k8s.io/kubernetes/pkg/kubelet/cm"
|
||||
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
||||
containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
|
||||
"k8s.io/kubernetes/pkg/kubelet/images"
|
||||
@ -86,49 +85,6 @@ func (f *fakeHTTP) Get(url string) (*http.Response, error) {
|
||||
return nil, f.err
|
||||
}
|
||||
|
||||
// fakeRuntimeHelper implementes kubecontainer.RuntimeHelper inter
|
||||
// faces for testing purposes.
|
||||
// TODO(random-liu): Move this into pkg/kubelet/container/testing
|
||||
type fakeRuntimeHelper struct{}
|
||||
|
||||
var _ kubecontainer.RuntimeHelper = &fakeRuntimeHelper{}
|
||||
|
||||
var testPodContainerDir string
|
||||
|
||||
func (f *fakeRuntimeHelper) GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (*kubecontainer.RunContainerOptions, error) {
|
||||
var opts kubecontainer.RunContainerOptions
|
||||
var err error
|
||||
if len(container.TerminationMessagePath) != 0 {
|
||||
testPodContainerDir, err = ioutil.TempDir(testTempDir, "fooPodContainerDir")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
opts.PodContainerDir = testPodContainerDir
|
||||
}
|
||||
return &opts, nil
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetPodCgroupParent(pod *v1.Pod) (cm.CgroupName, string) {
|
||||
return "", ""
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetClusterDNS(pod *v1.Pod) ([]string, []string, error) {
|
||||
return nil, nil, fmt.Errorf("not implemented")
|
||||
}
|
||||
|
||||
// This is not used by docker runtime.
|
||||
func (f *fakeRuntimeHelper) GeneratePodHostNameAndDomain(pod *v1.Pod) (string, string, error) {
|
||||
return "", "", nil
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetPodDir(kubetypes.UID) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 {
|
||||
return nil
|
||||
}
|
||||
|
||||
type fakeImageManager struct{}
|
||||
|
||||
func newFakeImageManager() images.ImageManager {
|
||||
@ -166,7 +122,7 @@ func createTestDockerManager(fakeHTTPClient *fakeHTTP, fakeDocker *FakeDockerCli
|
||||
0, 0, "",
|
||||
&containertest.FakeOS{},
|
||||
networkPlugin,
|
||||
&fakeRuntimeHelper{},
|
||||
&containertest.FakeRuntimeHelper{},
|
||||
fakeHTTPClient,
|
||||
flowcontrol.NewBackOff(time.Second, 300*time.Second))
|
||||
|
||||
@ -1275,6 +1231,9 @@ func TestPortForwardNoSuchContainer(t *testing.T) {
|
||||
|
||||
func TestSyncPodWithTerminationLog(t *testing.T) {
|
||||
dm, fakeDocker := newTestDockerManager()
|
||||
// Set test pod container directory.
|
||||
testPodContainerDir := "test/pod/container/dir"
|
||||
dm.runtimeHelper.(*containertest.FakeRuntimeHelper).PodContainerDir = testPodContainerDir
|
||||
container := v1.Container{
|
||||
Name: "bar",
|
||||
TerminationMessagePath: "/dev/somepath",
|
||||
@ -1293,8 +1252,6 @@ func TestSyncPodWithTerminationLog(t *testing.T) {
|
||||
"create", "start", "inspect_container",
|
||||
})
|
||||
|
||||
defer os.Remove(testPodContainerDir)
|
||||
|
||||
fakeDocker.Lock()
|
||||
if len(fakeDocker.Created) != 2 ||
|
||||
!matchString(t, "/k8s_POD\\.[a-f0-9]+_foo_new_", fakeDocker.Created[0]) ||
|
||||
|
@ -32,7 +32,6 @@ go_library(
|
||||
"//pkg/credentialprovider:go_default_library",
|
||||
"//pkg/kubelet/api:go_default_library",
|
||||
"//pkg/kubelet/api/v1alpha1/runtime:go_default_library",
|
||||
"//pkg/kubelet/cm:go_default_library",
|
||||
"//pkg/kubelet/container:go_default_library",
|
||||
"//pkg/kubelet/dockertools:go_default_library",
|
||||
"//pkg/kubelet/events:go_default_library",
|
||||
|
@ -17,19 +17,16 @@ limitations under the License.
|
||||
package kuberuntime
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
cadvisorapi "github.com/google/cadvisor/info/v1"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
kubetypes "k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/client-go/tools/record"
|
||||
"k8s.io/client-go/util/flowcontrol"
|
||||
"k8s.io/kubernetes/pkg/api/v1"
|
||||
"k8s.io/kubernetes/pkg/credentialprovider"
|
||||
internalapi "k8s.io/kubernetes/pkg/kubelet/api"
|
||||
"k8s.io/kubernetes/pkg/kubelet/cm"
|
||||
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
||||
"k8s.io/kubernetes/pkg/kubelet/images"
|
||||
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
|
||||
@ -47,42 +44,6 @@ func (f *fakeHTTP) Get(url string) (*http.Response, error) {
|
||||
return nil, f.err
|
||||
}
|
||||
|
||||
// fakeRuntimeHelper implements kubecontainer.RuntimeHelper interfaces for testing purposes.
|
||||
type fakeRuntimeHelper struct{}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetPodCgroupParent(pod *v1.Pod) (cm.CgroupName, string) {
|
||||
return "", ""
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (*kubecontainer.RunContainerOptions, error) {
|
||||
var opts kubecontainer.RunContainerOptions
|
||||
if len(container.TerminationMessagePath) != 0 {
|
||||
testPodContainerDir, err := ioutil.TempDir("", "fooPodContainerDir")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
opts.PodContainerDir = testPodContainerDir
|
||||
}
|
||||
return &opts, nil
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetClusterDNS(pod *v1.Pod) ([]string, []string, error) {
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
||||
// This is not used by docker runtime.
|
||||
func (f *fakeRuntimeHelper) GeneratePodHostNameAndDomain(pod *v1.Pod) (string, string, error) {
|
||||
return "", "", nil
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetPodDir(kubetypes.UID) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 {
|
||||
return nil
|
||||
}
|
||||
|
||||
type fakePodGetter struct {
|
||||
pods map[types.UID]*v1.Pod
|
||||
}
|
||||
@ -96,7 +57,7 @@ func (f *fakePodGetter) GetPodByUID(uid types.UID) (*v1.Pod, bool) {
|
||||
return pod, found
|
||||
}
|
||||
|
||||
func NewFakeKubeRuntimeManager(runtimeService internalapi.RuntimeService, imageService internalapi.ImageManagerService, machineInfo *cadvisorapi.MachineInfo, networkPlugin network.NetworkPlugin, osInterface kubecontainer.OSInterface) (*kubeGenericRuntimeManager, error) {
|
||||
func NewFakeKubeRuntimeManager(runtimeService internalapi.RuntimeService, imageService internalapi.ImageManagerService, machineInfo *cadvisorapi.MachineInfo, networkPlugin network.NetworkPlugin, osInterface kubecontainer.OSInterface, runtimeHelper kubecontainer.RuntimeHelper) (*kubeGenericRuntimeManager, error) {
|
||||
recorder := &record.FakeRecorder{}
|
||||
kubeRuntimeManager := &kubeGenericRuntimeManager{
|
||||
recorder: recorder,
|
||||
@ -106,7 +67,7 @@ func NewFakeKubeRuntimeManager(runtimeService internalapi.RuntimeService, imageS
|
||||
machineInfo: machineInfo,
|
||||
osInterface: osInterface,
|
||||
networkPlugin: networkPlugin,
|
||||
runtimeHelper: &fakeRuntimeHelper{},
|
||||
runtimeHelper: runtimeHelper,
|
||||
runtimeService: runtimeService,
|
||||
imageService: imageService,
|
||||
keyring: credentialprovider.NewDockerKeyring(),
|
||||
|
@ -58,7 +58,7 @@ func createTestRuntimeManager() (*apitest.FakeRuntimeService, *apitest.FakeImage
|
||||
network.UseDefaultMTU,
|
||||
)
|
||||
osInterface := &containertest.FakeOS{}
|
||||
manager, err := NewFakeKubeRuntimeManager(fakeRuntimeService, fakeImageService, machineInfo, networkPlugin, osInterface)
|
||||
manager, err := NewFakeKubeRuntimeManager(fakeRuntimeService, fakeImageService, machineInfo, networkPlugin, osInterface, &containertest.FakeRuntimeHelper{})
|
||||
return fakeRuntimeService, fakeImageService, manager, err
|
||||
}
|
||||
|
||||
|
@ -71,7 +71,6 @@ go_test(
|
||||
tags = ["automanaged"],
|
||||
deps = [
|
||||
"//pkg/api/v1:go_default_library",
|
||||
"//pkg/kubelet/cm:go_default_library",
|
||||
"//pkg/kubelet/container:go_default_library",
|
||||
"//pkg/kubelet/container/testing:go_default_library",
|
||||
"//pkg/kubelet/lifecycle:go_default_library",
|
||||
|
@ -28,8 +28,6 @@ import (
|
||||
"google.golang.org/grpc"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/kubernetes/pkg/api/v1"
|
||||
"k8s.io/kubernetes/pkg/kubelet/cm"
|
||||
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
||||
)
|
||||
|
||||
// fakeRktInterface mocks the rktapi.PublicAPIClient interface for testing purpose.
|
||||
@ -151,40 +149,6 @@ func (f *fakeSystemd) ResetFailedUnit(name string) error {
|
||||
return f.err
|
||||
}
|
||||
|
||||
// fakeRuntimeHelper implementes kubecontainer.RuntimeHelper interfaces for testing purpose.
|
||||
// TODO(random-liu): Move this into pkg/kubelet/container/testing
|
||||
type fakeRuntimeHelper struct {
|
||||
dnsServers []string
|
||||
dnsSearches []string
|
||||
hostName string
|
||||
hostDomain string
|
||||
err error
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (*kubecontainer.RunContainerOptions, error) {
|
||||
return nil, fmt.Errorf("Not implemented")
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetPodCgroupParent(pod *v1.Pod) (cm.CgroupName, string) {
|
||||
return "", ""
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetClusterDNS(pod *v1.Pod) ([]string, []string, error) {
|
||||
return f.dnsServers, f.dnsSearches, f.err
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GeneratePodHostNameAndDomain(pod *v1.Pod) (string, string, error) {
|
||||
return f.hostName, f.hostDomain, nil
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetPodDir(podUID types.UID) string {
|
||||
return "/poddir/" + string(podUID)
|
||||
}
|
||||
|
||||
func (f *fakeRuntimeHelper) GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 {
|
||||
return nil
|
||||
}
|
||||
|
||||
type fakeRktCli struct {
|
||||
sync.Mutex
|
||||
cmds []string
|
||||
|
@ -585,7 +585,7 @@ func TestGetPodStatus(t *testing.T) {
|
||||
fs := newFakeSystemd()
|
||||
fnp := nettest.NewMockNetworkPlugin(ctrl)
|
||||
fos := &containertesting.FakeOS{}
|
||||
frh := &fakeRuntimeHelper{}
|
||||
frh := &containertesting.FakeRuntimeHelper{}
|
||||
r := &Runtime{
|
||||
apisvc: fr,
|
||||
systemd: fs,
|
||||
@ -1391,7 +1391,12 @@ func TestGenerateRunCommand(t *testing.T) {
|
||||
for i, tt := range tests {
|
||||
testCaseHint := fmt.Sprintf("test case #%d", i)
|
||||
rkt.network = network.NewPluginManager(tt.networkPlugin)
|
||||
rkt.runtimeHelper = &fakeRuntimeHelper{tt.dnsServers, tt.dnsSearches, tt.hostName, "", tt.err}
|
||||
rkt.runtimeHelper = &containertesting.FakeRuntimeHelper{
|
||||
DNSServers: tt.dnsServers,
|
||||
DNSSearches: tt.dnsSearches,
|
||||
HostName: tt.hostName,
|
||||
Err: tt.err,
|
||||
}
|
||||
rkt.execer = &utilexec.FakeExec{CommandScript: []utilexec.FakeCommandAction{func(cmd string, args ...string) utilexec.Cmd {
|
||||
return utilexec.InitFakeCmd(&utilexec.FakeCmd{}, cmd, args...)
|
||||
}}}
|
||||
|
Loading…
Reference in New Issue
Block a user