mirror of
https://github.com/aljazceru/kata-containers.git
synced 2026-02-18 21:14:37 +01:00
Merge pull request #617 from jodh-intel/add-vc-trace-support
Add virtcontainers trace support
This commit is contained in:
@@ -18,7 +18,6 @@ import (
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
vf "github.com/kata-containers/runtime/virtcontainers/factory"
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
@@ -96,15 +95,15 @@ func create(ctx context.Context, containerID, bundlePath, console, pidFilePath s
|
||||
runtimeConfig oci.RuntimeConfig) error {
|
||||
var err error
|
||||
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "create")
|
||||
span, ctx := trace(ctx, "create")
|
||||
defer span.Finish()
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
// Checks the MUST and MUST NOT from OCI runtime specification
|
||||
if bundlePath, err = validCreateParams(containerID, bundlePath); err != nil {
|
||||
if bundlePath, err = validCreateParams(ctx, containerID, bundlePath); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -129,16 +128,16 @@ func create(ctx context.Context, containerID, bundlePath, console, pidFilePath s
|
||||
},
|
||||
}
|
||||
kataLog.WithField("factory", factoryConfig).Info("load vm factory")
|
||||
f, err := vf.NewFactory(factoryConfig, true)
|
||||
f, err := vf.NewFactory(ctx, factoryConfig, true)
|
||||
if err != nil {
|
||||
kataLog.WithError(err).Warn("load vm factory failed, about to create new one")
|
||||
f, err = vf.NewFactory(factoryConfig, false)
|
||||
f, err = vf.NewFactory(ctx, factoryConfig, false)
|
||||
if err != nil {
|
||||
kataLog.WithError(err).Warn("create vm factory failed")
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
vci.SetFactory(f)
|
||||
vci.SetFactory(ctx, f)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,7 +253,7 @@ func setKernelParams(containerID string, runtimeConfig *oci.RuntimeConfig) error
|
||||
|
||||
func createSandbox(ctx context.Context, ociSpec oci.CompatOCISpec, runtimeConfig oci.RuntimeConfig,
|
||||
containerID, bundlePath, console string, disableOutput bool) (vc.Process, error) {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "createSandbox")
|
||||
span, ctx := trace(ctx, "createSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
err := setKernelParams(containerID, &runtimeConfig)
|
||||
@@ -267,14 +266,14 @@ func createSandbox(ctx context.Context, ociSpec oci.CompatOCISpec, runtimeConfig
|
||||
return vc.Process{}, err
|
||||
}
|
||||
|
||||
sandbox, err := vci.CreateSandbox(sandboxConfig)
|
||||
sandbox, err := vci.CreateSandbox(ctx, sandboxConfig)
|
||||
if err != nil {
|
||||
return vc.Process{}, err
|
||||
}
|
||||
|
||||
sid := sandbox.ID()
|
||||
kataLog = kataLog.WithField("sandbox", sid)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("sandbox", sid)
|
||||
|
||||
containers := sandbox.GetAllContainers()
|
||||
@@ -306,7 +305,7 @@ func setEphemeralStorageType(ociSpec oci.CompatOCISpec) oci.CompatOCISpec {
|
||||
func createContainer(ctx context.Context, ociSpec oci.CompatOCISpec, containerID, bundlePath,
|
||||
console string, disableOutput bool) (vc.Process, error) {
|
||||
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "createContainer")
|
||||
span, ctx := trace(ctx, "createContainer")
|
||||
defer span.Finish()
|
||||
|
||||
ociSpec = setEphemeralStorageType(ociSpec)
|
||||
@@ -322,10 +321,10 @@ func createContainer(ctx context.Context, ociSpec oci.CompatOCISpec, containerID
|
||||
}
|
||||
|
||||
kataLog = kataLog.WithField("sandbox", sandboxID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("sandbox", sandboxID)
|
||||
|
||||
_, c, err := vci.CreateContainer(sandboxID, contConfig)
|
||||
_, c, err := vci.CreateContainer(ctx, sandboxID, contConfig)
|
||||
if err != nil {
|
||||
return vc.Process{}, err
|
||||
}
|
||||
@@ -338,7 +337,7 @@ func createContainer(ctx context.Context, ociSpec oci.CompatOCISpec, containerID
|
||||
}
|
||||
|
||||
func createCgroupsFiles(ctx context.Context, containerID string, cgroupsDirPath string, cgroupsPathList []string, pid int) error {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "createCgroupsFiles")
|
||||
span, _ := trace(ctx, "createCgroupsFiles")
|
||||
defer span.Finish()
|
||||
|
||||
if len(cgroupsPathList) == 0 {
|
||||
@@ -384,7 +383,7 @@ func createCgroupsFiles(ctx context.Context, containerID string, cgroupsDirPath
|
||||
}
|
||||
|
||||
func createPIDFile(ctx context.Context, pidFilePath string, pid int) error {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "createPIDFile")
|
||||
span, _ := trace(ctx, "createPIDFile")
|
||||
defer span.Finish()
|
||||
|
||||
if pidFilePath == "" {
|
||||
|
||||
@@ -293,7 +293,7 @@ func TestCreateInvalidArgs(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -488,7 +488,7 @@ func TestCreateProcessCgroupsPathSuccessful(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -583,7 +583,7 @@ func TestCreateCreateCgroupsFilesFail(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -668,7 +668,7 @@ func TestCreateCreateCreatePidFileFail(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -739,7 +739,7 @@ func TestCreate(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -1028,7 +1028,7 @@ func TestCreateCreateContainer(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
testingImpl.CreateContainerFunc = func(sandboxID string, containerConfig vc.ContainerConfig) (vc.VCSandbox, vc.VCContainer, error) {
|
||||
testingImpl.CreateContainerFunc = func(ctx context.Context, sandboxID string, containerConfig vc.ContainerConfig) (vc.VCSandbox, vc.VCContainer, error) {
|
||||
return &vcmock.Sandbox{}, &vcmock.Container{}, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ import (
|
||||
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
@@ -60,15 +59,15 @@ EXAMPLE:
|
||||
}
|
||||
|
||||
func delete(ctx context.Context, containerID string, force bool) error {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "delete")
|
||||
span, ctx := trace(ctx, "delete")
|
||||
defer span.Finish()
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
// Checks the MUST and MUST NOT from OCI runtime specification
|
||||
status, sandboxID, err := getExistingContainerInfo(containerID)
|
||||
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -80,7 +79,7 @@ func delete(ctx context.Context, containerID string, force bool) error {
|
||||
"sandbox": sandboxID,
|
||||
})
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
|
||||
span.SetTag("container", containerID)
|
||||
span.SetTag("sandbox", sandboxID)
|
||||
@@ -134,21 +133,21 @@ func delete(ctx context.Context, containerID string, force bool) error {
|
||||
}
|
||||
|
||||
func deleteSandbox(ctx context.Context, sandboxID string) error {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "deleteSandbox")
|
||||
span, _ := trace(ctx, "deleteSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
status, err := vci.StatusSandbox(sandboxID)
|
||||
status, err := vci.StatusSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if oci.StateToOCIState(status.State) != oci.StateStopped {
|
||||
if _, err := vci.StopSandbox(sandboxID); err != nil {
|
||||
if _, err := vci.StopSandbox(ctx, sandboxID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := vci.DeleteSandbox(sandboxID); err != nil {
|
||||
if _, err := vci.DeleteSandbox(ctx, sandboxID); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -156,16 +155,16 @@ func deleteSandbox(ctx context.Context, sandboxID string) error {
|
||||
}
|
||||
|
||||
func deleteContainer(ctx context.Context, sandboxID, containerID string, forceStop bool) error {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "deleteContainer")
|
||||
span, _ := trace(ctx, "deleteContainer")
|
||||
defer span.Finish()
|
||||
|
||||
if forceStop {
|
||||
if _, err := vci.StopContainer(sandboxID, containerID); err != nil {
|
||||
if _, err := vci.StopContainer(ctx, sandboxID, containerID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := vci.DeleteContainer(sandboxID, containerID); err != nil {
|
||||
if _, err := vci.DeleteContainer(ctx, sandboxID, containerID); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -173,7 +172,7 @@ func deleteContainer(ctx context.Context, sandboxID, containerID string, forceSt
|
||||
}
|
||||
|
||||
func removeCgroupsPath(ctx context.Context, containerID string, cgroupsPathList []string) error {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "removeCgroupsPath")
|
||||
span, _ := trace(ctx, "removeCgroupsPath")
|
||||
defer span.Finish()
|
||||
|
||||
if len(cgroupsPathList) == 0 {
|
||||
|
||||
@@ -77,7 +77,7 @@ func TestDeleteMissingContainerTypeAnnotation(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{},
|
||||
@@ -104,7 +104,7 @@ func TestDeleteInvalidConfig(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -156,7 +156,7 @@ func TestDeleteSandbox(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -177,7 +177,7 @@ func TestDeleteSandbox(t *testing.T) {
|
||||
assert.Error(err)
|
||||
assert.True(vcmock.IsMockError(err))
|
||||
|
||||
testingImpl.StatusSandboxFunc = func(sandboxID string) (vc.SandboxStatus, error) {
|
||||
testingImpl.StatusSandboxFunc = func(ctx context.Context, sandboxID string) (vc.SandboxStatus, error) {
|
||||
return vc.SandboxStatus{
|
||||
ID: sandbox.ID(),
|
||||
State: vc.State{
|
||||
@@ -194,7 +194,7 @@ func TestDeleteSandbox(t *testing.T) {
|
||||
assert.Error(err)
|
||||
assert.True(vcmock.IsMockError(err))
|
||||
|
||||
testingImpl.StopSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StopSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -206,7 +206,7 @@ func TestDeleteSandbox(t *testing.T) {
|
||||
assert.Error(err)
|
||||
assert.True(vcmock.IsMockError(err))
|
||||
|
||||
testingImpl.DeleteSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.DeleteSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -234,7 +234,7 @@ func TestDeleteInvalidContainerType(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -273,7 +273,7 @@ func TestDeleteSandboxRunning(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -295,7 +295,7 @@ func TestDeleteSandboxRunning(t *testing.T) {
|
||||
assert.Error(err)
|
||||
assert.False(vcmock.IsMockError(err))
|
||||
|
||||
testingImpl.StatusSandboxFunc = func(sandboxID string) (vc.SandboxStatus, error) {
|
||||
testingImpl.StatusSandboxFunc = func(ctx context.Context, sandboxID string) (vc.SandboxStatus, error) {
|
||||
return vc.SandboxStatus{
|
||||
ID: sandbox.ID(),
|
||||
State: vc.State{
|
||||
@@ -304,7 +304,7 @@ func TestDeleteSandboxRunning(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.StopSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StopSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -318,7 +318,7 @@ func TestDeleteSandboxRunning(t *testing.T) {
|
||||
assert.Error(err)
|
||||
assert.True(vcmock.IsMockError(err))
|
||||
|
||||
testingImpl.DeleteSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.DeleteSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -353,7 +353,7 @@ func TestDeleteRunningContainer(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.MockContainers[0].ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -397,7 +397,7 @@ func TestDeleteRunningContainer(t *testing.T) {
|
||||
assert.Error(err)
|
||||
assert.True(vcmock.IsMockError(err))
|
||||
|
||||
testingImpl.DeleteContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.DeleteContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
return &vcmock.Container{}, nil
|
||||
}
|
||||
|
||||
@@ -436,7 +436,7 @@ func TestDeleteContainer(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.MockContainers[0].ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -470,7 +470,7 @@ func TestDeleteContainer(t *testing.T) {
|
||||
assert.Error(err)
|
||||
assert.True(vcmock.IsMockError(err))
|
||||
|
||||
testingImpl.DeleteContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.DeleteContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
return &vcmock.Container{}, nil
|
||||
}
|
||||
|
||||
@@ -536,7 +536,7 @@ func TestDeleteCLIFunctionSuccess(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -549,7 +549,7 @@ func TestDeleteCLIFunctionSuccess(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.StatusSandboxFunc = func(sandboxID string) (vc.SandboxStatus, error) {
|
||||
testingImpl.StatusSandboxFunc = func(ctx context.Context, sandboxID string) (vc.SandboxStatus, error) {
|
||||
return vc.SandboxStatus{
|
||||
ID: sandbox.ID(),
|
||||
State: vc.State{
|
||||
@@ -558,11 +558,11 @@ func TestDeleteCLIFunctionSuccess(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.StopSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StopSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
testingImpl.DeleteSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.DeleteSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ import (
|
||||
"time"
|
||||
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
@@ -142,7 +141,7 @@ information is displayed once every 5 seconds.`,
|
||||
return err
|
||||
}
|
||||
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "events")
|
||||
span, _ := trace(ctx, "events")
|
||||
defer span.Finish()
|
||||
|
||||
containerID := context.Args().First()
|
||||
@@ -151,7 +150,7 @@ information is displayed once every 5 seconds.`,
|
||||
}
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
duration := context.Duration("interval")
|
||||
@@ -159,7 +158,7 @@ information is displayed once every 5 seconds.`,
|
||||
return fmt.Errorf("duration interval must be greater than 0")
|
||||
}
|
||||
|
||||
status, sandboxID, err := getExistingContainerInfo(containerID)
|
||||
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -171,7 +170,7 @@ information is displayed once every 5 seconds.`,
|
||||
"sandbox": sandboxID,
|
||||
})
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
span.SetTag("sandbox", sandboxID)
|
||||
|
||||
@@ -196,7 +195,7 @@ information is displayed once every 5 seconds.`,
|
||||
}()
|
||||
|
||||
if context.Bool("stats") {
|
||||
s, err := vci.StatsContainer(sandboxID, containerID)
|
||||
s, err := vci.StatsContainer(ctx, sandboxID, containerID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -208,7 +207,7 @@ information is displayed once every 5 seconds.`,
|
||||
|
||||
go func() {
|
||||
for range time.Tick(context.Duration("interval")) {
|
||||
s, err := vci.StatsContainer(sandboxID, containerID)
|
||||
s, err := vci.StatsContainer(ctx, sandboxID, containerID)
|
||||
if err != nil {
|
||||
logrus.Error(err)
|
||||
continue
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"os"
|
||||
"testing"
|
||||
@@ -74,7 +75,7 @@ func TestEventsCLIFailure(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -104,7 +105,7 @@ func TestEventsCLISuccessful(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -116,7 +117,7 @@ func TestEventsCLISuccessful(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.StatsContainerFunc = func(sandboxID, containerID string) (vc.ContainerStats, error) {
|
||||
testingImpl.StatsContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStats, error) {
|
||||
return vc.ContainerStats{}, nil
|
||||
}
|
||||
|
||||
|
||||
13
cli/exec.go
13
cli/exec.go
@@ -17,7 +17,6 @@ import (
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
|
||||
specs "github.com/opencontainers/runtime-spec/specs-go"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
@@ -189,22 +188,22 @@ func generateExecParams(context *cli.Context, specProcess *oci.CompatOCIProcess)
|
||||
}
|
||||
|
||||
func execute(ctx context.Context, context *cli.Context) error {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "execute")
|
||||
span, ctx := trace(ctx, "execute")
|
||||
defer span.Finish()
|
||||
|
||||
containerID := context.Args().First()
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
status, sandboxID, err := getExistingContainerInfo(containerID)
|
||||
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
kataLog = kataLog.WithField("sandbox", sandboxID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("sandbox", sandboxID)
|
||||
|
||||
// Retrieve OCI spec configuration.
|
||||
@@ -222,7 +221,7 @@ func execute(ctx context.Context, context *cli.Context) error {
|
||||
containerID = params.cID
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
// container MUST be ready or running.
|
||||
@@ -258,7 +257,7 @@ func execute(ctx context.Context, context *cli.Context) error {
|
||||
Detach: noNeedForOutput(params.detach, params.ociProcess.Terminal),
|
||||
}
|
||||
|
||||
_, _, process, err := vci.EnterContainer(sandboxID, params.cID, cmd)
|
||||
_, _, process, err := vci.EnterContainer(ctx, sandboxID, params.cID, cmd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ func TestExecuteErrors(t *testing.T) {
|
||||
vcAnnotations.ContainerTypeKey: string(vc.PodSandbox),
|
||||
}
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, vc.State{}, annotations), nil
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ func TestExecuteErrors(t *testing.T) {
|
||||
}
|
||||
|
||||
containerState := vc.State{}
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, containerState, annotations), nil
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ func TestExecuteErrors(t *testing.T) {
|
||||
containerState = vc.State{
|
||||
State: vc.StatePaused,
|
||||
}
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, containerState, annotations), nil
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ func TestExecuteErrors(t *testing.T) {
|
||||
containerState = vc.State{
|
||||
State: vc.StateStopped,
|
||||
}
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, containerState, annotations), nil
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ func TestExecuteErrorReadingProcessJson(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -215,7 +215,7 @@ func TestExecuteErrorOpeningConsole(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -282,7 +282,7 @@ func TestExecuteWithFlags(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -299,7 +299,7 @@ func TestExecuteWithFlags(t *testing.T) {
|
||||
|
||||
assert.True(vcmock.IsMockError(err))
|
||||
|
||||
testingImpl.EnterContainerFunc = func(sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
testingImpl.EnterContainerFunc = func(ctx context.Context, sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
return &vcmock.Sandbox{}, &vcmock.Container{}, &vc.Process{}, nil
|
||||
}
|
||||
|
||||
@@ -316,7 +316,7 @@ func TestExecuteWithFlags(t *testing.T) {
|
||||
os.Remove(pidFilePath)
|
||||
|
||||
// Process ran and exited successfully
|
||||
testingImpl.EnterContainerFunc = func(sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
testingImpl.EnterContainerFunc = func(ctx context.Context, sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
// create a fake container process
|
||||
workload := []string{"cat", "/dev/null"}
|
||||
command := exec.Command(workload[0], workload[1:]...)
|
||||
@@ -372,7 +372,7 @@ func TestExecuteWithFlagsDetached(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -380,7 +380,7 @@ func TestExecuteWithFlagsDetached(t *testing.T) {
|
||||
testingImpl.StatusContainerFunc = nil
|
||||
}()
|
||||
|
||||
testingImpl.EnterContainerFunc = func(sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
testingImpl.EnterContainerFunc = func(ctx context.Context, sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
// create a fake container process
|
||||
workload := []string{"cat", "/dev/null"}
|
||||
command := exec.Command(workload[0], workload[1:]...)
|
||||
@@ -451,7 +451,7 @@ func TestExecuteWithInvalidProcessJson(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -503,7 +503,7 @@ func TestExecuteWithValidProcessJson(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -542,7 +542,7 @@ func TestExecuteWithValidProcessJson(t *testing.T) {
|
||||
|
||||
workload := []string{"cat", "/dev/null"}
|
||||
|
||||
testingImpl.EnterContainerFunc = func(sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
testingImpl.EnterContainerFunc = func(ctx context.Context, sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
// create a fake container process
|
||||
command := exec.Command(workload[0], workload[1:]...)
|
||||
err := command.Start()
|
||||
@@ -604,7 +604,7 @@ func TestExecuteWithEmptyEnvironmentValue(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -644,7 +644,7 @@ func TestExecuteWithEmptyEnvironmentValue(t *testing.T) {
|
||||
|
||||
workload := []string{"cat", "/dev/null"}
|
||||
|
||||
testingImpl.EnterContainerFunc = func(sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
testingImpl.EnterContainerFunc = func(ctx context.Context, sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
// create a fake container process
|
||||
command := exec.Command(workload[0], workload[1:]...)
|
||||
err := command.Start()
|
||||
|
||||
@@ -33,8 +33,13 @@ var factoryCLICommand = cli.Command{
|
||||
var initFactoryCommand = cli.Command{
|
||||
Name: "init",
|
||||
Usage: "initialize a VM factory based on kata-runtime configuration",
|
||||
Action: func(context *cli.Context) error {
|
||||
runtimeConfig, ok := context.App.Metadata["runtimeConfig"].(oci.RuntimeConfig)
|
||||
Action: func(c *cli.Context) error {
|
||||
ctx, err := cliContextToContext(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
runtimeConfig, ok := c.App.Metadata["runtimeConfig"].(oci.RuntimeConfig)
|
||||
if !ok {
|
||||
return errors.New("invalid runtime config")
|
||||
}
|
||||
@@ -50,7 +55,7 @@ var initFactoryCommand = cli.Command{
|
||||
},
|
||||
}
|
||||
kataLog.WithField("factory", factoryConfig).Info("create vm factory")
|
||||
_, err := vf.NewFactory(factoryConfig, false)
|
||||
_, err := vf.NewFactory(ctx, factoryConfig, false)
|
||||
if err != nil {
|
||||
kataLog.WithError(err).Error("create vm factory failed")
|
||||
return err
|
||||
@@ -68,8 +73,13 @@ var initFactoryCommand = cli.Command{
|
||||
var destroyFactoryCommand = cli.Command{
|
||||
Name: "destroy",
|
||||
Usage: "destroy the VM factory",
|
||||
Action: func(context *cli.Context) error {
|
||||
runtimeConfig, ok := context.App.Metadata["runtimeConfig"].(oci.RuntimeConfig)
|
||||
Action: func(c *cli.Context) error {
|
||||
ctx, err := cliContextToContext(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
runtimeConfig, ok := c.App.Metadata["runtimeConfig"].(oci.RuntimeConfig)
|
||||
if !ok {
|
||||
return errors.New("invalid runtime config")
|
||||
}
|
||||
@@ -85,12 +95,12 @@ var destroyFactoryCommand = cli.Command{
|
||||
},
|
||||
}
|
||||
kataLog.WithField("factory", factoryConfig).Info("load vm factory")
|
||||
f, err := vf.NewFactory(factoryConfig, true)
|
||||
f, err := vf.NewFactory(ctx, factoryConfig, true)
|
||||
if err != nil {
|
||||
kataLog.WithError(err).Error("load vm factory failed")
|
||||
// ignore error
|
||||
} else {
|
||||
f.CloseFactory()
|
||||
f.CloseFactory(ctx)
|
||||
}
|
||||
}
|
||||
fmt.Fprintln(defaultOutputFile, "vm factory destroyed")
|
||||
@@ -101,8 +111,13 @@ var destroyFactoryCommand = cli.Command{
|
||||
var statusFactoryCommand = cli.Command{
|
||||
Name: "status",
|
||||
Usage: "query the status of VM factory",
|
||||
Action: func(context *cli.Context) error {
|
||||
runtimeConfig, ok := context.App.Metadata["runtimeConfig"].(oci.RuntimeConfig)
|
||||
Action: func(c *cli.Context) error {
|
||||
ctx, err := cliContextToContext(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
runtimeConfig, ok := c.App.Metadata["runtimeConfig"].(oci.RuntimeConfig)
|
||||
if !ok {
|
||||
return errors.New("invalid runtime config")
|
||||
}
|
||||
@@ -118,11 +133,11 @@ var statusFactoryCommand = cli.Command{
|
||||
},
|
||||
}
|
||||
kataLog.WithField("factory", factoryConfig).Info("load vm factory")
|
||||
f, err := vf.NewFactory(factoryConfig, true)
|
||||
f, err := vf.NewFactory(ctx, factoryConfig, true)
|
||||
if err != nil {
|
||||
fmt.Fprintln(defaultOutputFile, "vm factory is off")
|
||||
} else {
|
||||
f.CloseFactory()
|
||||
f.CloseFactory(ctx)
|
||||
fmt.Fprintln(defaultOutputFile, "vm factory is on")
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -24,7 +24,6 @@ import (
|
||||
"syscall"
|
||||
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
@@ -288,7 +287,7 @@ var kataCheckCLICommand = cli.Command{
|
||||
return err
|
||||
}
|
||||
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "kata-check")
|
||||
span, _ := trace(ctx, "kata-check")
|
||||
defer span.Finish()
|
||||
|
||||
setCPUtype()
|
||||
|
||||
@@ -18,7 +18,6 @@ import (
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
|
||||
vcUtils "github.com/kata-containers/runtime/virtcontainers/utils"
|
||||
specs "github.com/opencontainers/runtime-spec/specs-go"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
@@ -411,7 +410,7 @@ var kataEnvCLICommand = cli.Command{
|
||||
return err
|
||||
}
|
||||
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "kata-env")
|
||||
span, _ := trace(ctx, "kata-env")
|
||||
defer span.Finish()
|
||||
|
||||
return handleSettings(defaultOutputFile, context)
|
||||
|
||||
15
cli/kill.go
15
cli/kill.go
@@ -14,7 +14,6 @@ import (
|
||||
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
@@ -98,15 +97,15 @@ var signals = map[string]syscall.Signal{
|
||||
}
|
||||
|
||||
func kill(ctx context.Context, containerID, signal string, all bool) error {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "kill")
|
||||
span, _ := trace(ctx, "kill")
|
||||
defer span.Finish()
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
// Checks the MUST and MUST NOT from OCI runtime specification
|
||||
status, sandboxID, err := getExistingContainerInfo(containerID)
|
||||
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -122,7 +121,7 @@ func kill(ctx context.Context, containerID, signal string, all bool) error {
|
||||
span.SetTag("container", containerID)
|
||||
span.SetTag("sandbox", sandboxID)
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
|
||||
signum, err := processSignal(signal)
|
||||
if err != nil {
|
||||
@@ -134,7 +133,7 @@ func kill(ctx context.Context, containerID, signal string, all bool) error {
|
||||
return fmt.Errorf("Container %s not ready, running or paused, cannot send a signal", containerID)
|
||||
}
|
||||
|
||||
if err := vci.KillContainer(sandboxID, containerID, signum, all); err != nil {
|
||||
if err := vci.KillContainer(ctx, sandboxID, containerID, signum, all); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -149,9 +148,9 @@ func kill(ctx context.Context, containerID, signal string, all bool) error {
|
||||
|
||||
switch containerType {
|
||||
case vc.PodSandbox:
|
||||
_, err = vci.StopSandbox(sandboxID)
|
||||
_, err = vci.StopSandbox(ctx, sandboxID)
|
||||
case vc.PodContainer:
|
||||
_, err = vci.StopContainer(sandboxID, containerID)
|
||||
_, err = vci.StopContainer(ctx, sandboxID, containerID)
|
||||
default:
|
||||
return fmt.Errorf("Invalid container type found")
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
@@ -19,15 +20,15 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
testKillContainerFuncReturnNil = func(sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
testKillContainerFuncReturnNil = func(ctx context.Context, sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
testStopContainerFuncReturnNil = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testStopContainerFuncReturnNil = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
return &vcmock.Container{}, nil
|
||||
}
|
||||
|
||||
testStopSandboxFuncReturnNil = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testStopSandboxFuncReturnNil = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return &vcmock.Sandbox{}, nil
|
||||
}
|
||||
)
|
||||
@@ -78,7 +79,7 @@ func testKillCLIFunctionTerminationSignalSuccessful(t *testing.T, sig string) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -97,7 +98,7 @@ func testKillCLIFunctionTerminationSignalSuccessful(t *testing.T, sig string) {
|
||||
vcAnnotations.ContainerTypeKey: string(vc.PodSandbox),
|
||||
}
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -131,7 +132,7 @@ func TestKillCLIFunctionNotTerminationSignalSuccessful(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, map[string]string{}), nil
|
||||
}
|
||||
|
||||
@@ -164,7 +165,7 @@ func TestKillCLIFunctionNoSignalSuccessful(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -183,7 +184,7 @@ func TestKillCLIFunctionNoSignalSuccessful(t *testing.T) {
|
||||
vcAnnotations.ContainerTypeKey: string(vc.PodSandbox),
|
||||
}
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -207,7 +208,7 @@ func TestKillCLIFunctionEnableAllSuccessful(t *testing.T) {
|
||||
vcAnnotations.ContainerTypeKey: string(vc.PodContainer),
|
||||
}
|
||||
|
||||
testingImpl.KillContainerFunc = func(sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
testingImpl.KillContainerFunc = func(ctx context.Context, sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
if !all {
|
||||
return fmt.Errorf("Expecting -all flag = true, Got false")
|
||||
}
|
||||
@@ -220,7 +221,7 @@ func TestKillCLIFunctionEnableAllSuccessful(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -240,7 +241,7 @@ func TestKillCLIFunctionEnableAllSuccessful(t *testing.T) {
|
||||
vcAnnotations.ContainerTypeKey: string(vc.PodSandbox),
|
||||
}
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, annotations), nil
|
||||
}
|
||||
|
||||
@@ -270,7 +271,7 @@ func TestKillCLIFunctionContainerNotExistFailure(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{}, nil
|
||||
}
|
||||
|
||||
@@ -297,7 +298,7 @@ func TestKillCLIFunctionInvalidSignalFailure(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, map[string]string{}), nil
|
||||
}
|
||||
|
||||
@@ -326,7 +327,7 @@ func TestKillCLIFunctionStatePausedSuccessful(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state,
|
||||
map[string]string{string(vcAnnotations.ContainerTypeKey): string(vc.PodContainer)}), nil
|
||||
}
|
||||
@@ -356,7 +357,7 @@ func TestKillCLIFunctionInvalidStateStoppedFailure(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, map[string]string{}), nil
|
||||
}
|
||||
|
||||
@@ -382,7 +383,7 @@ func TestKillCLIFunctionKillContainerFailure(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, map[string]string{}), nil
|
||||
}
|
||||
|
||||
|
||||
10
cli/list.go
10
cli/list.go
@@ -7,6 +7,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
@@ -16,7 +17,6 @@ import (
|
||||
"text/tabwriter"
|
||||
"time"
|
||||
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/urfave/cli"
|
||||
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
@@ -114,10 +114,10 @@ To list containers created using a non-default value for "--root":
|
||||
return err
|
||||
}
|
||||
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "list")
|
||||
span, ctx := trace(ctx, "list")
|
||||
defer span.Finish()
|
||||
|
||||
s, err := getContainers(context)
|
||||
s, err := getContainers(ctx, context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -301,7 +301,7 @@ func getDirOwner(dir string) (uint32, error) {
|
||||
return statType.Uid, nil
|
||||
}
|
||||
|
||||
func getContainers(context *cli.Context) ([]fullContainerState, error) {
|
||||
func getContainers(ctx context.Context, context *cli.Context) ([]fullContainerState, error) {
|
||||
runtimeConfig, ok := context.App.Metadata["runtimeConfig"].(oci.RuntimeConfig)
|
||||
if !ok {
|
||||
return nil, errors.New("invalid runtime config")
|
||||
@@ -309,7 +309,7 @@ func getContainers(context *cli.Context) ([]fullContainerState, error) {
|
||||
|
||||
latestHypervisorDetails := getHypervisorDetails(&runtimeConfig.HypervisorConfig)
|
||||
|
||||
sandboxList, err := vci.ListSandbox()
|
||||
sandboxList, err := vci.ListSandbox(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
@@ -380,7 +381,7 @@ func TestListGetContainersListSandboxFail(t *testing.T) {
|
||||
"runtimeConfig": runtimeConfig,
|
||||
}
|
||||
|
||||
_, err = getContainers(ctx)
|
||||
_, err = getContainers(context.Background(), ctx)
|
||||
assert.Error(err)
|
||||
assert.True(vcmock.IsMockError(err))
|
||||
}
|
||||
@@ -388,7 +389,7 @@ func TestListGetContainersListSandboxFail(t *testing.T) {
|
||||
func TestListGetContainers(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
testingImpl.ListSandboxFunc = func() ([]vc.SandboxStatus, error) {
|
||||
testingImpl.ListSandboxFunc = func(ctx context.Context) ([]vc.SandboxStatus, error) {
|
||||
// No pre-existing sandboxes
|
||||
return []vc.SandboxStatus{}, nil
|
||||
}
|
||||
@@ -411,7 +412,7 @@ func TestListGetContainers(t *testing.T) {
|
||||
"runtimeConfig": runtimeConfig,
|
||||
}
|
||||
|
||||
state, err := getContainers(ctx)
|
||||
state, err := getContainers(context.Background(), ctx)
|
||||
assert.NoError(err)
|
||||
assert.Equal(state, []fullContainerState(nil))
|
||||
}
|
||||
@@ -423,7 +424,7 @@ func TestListGetContainersSandboxWithoutContainers(t *testing.T) {
|
||||
MockID: testSandboxID,
|
||||
}
|
||||
|
||||
testingImpl.ListSandboxFunc = func() ([]vc.SandboxStatus, error) {
|
||||
testingImpl.ListSandboxFunc = func(ctx context.Context) ([]vc.SandboxStatus, error) {
|
||||
return []vc.SandboxStatus{
|
||||
{
|
||||
ID: sandbox.ID(),
|
||||
@@ -450,7 +451,7 @@ func TestListGetContainersSandboxWithoutContainers(t *testing.T) {
|
||||
"runtimeConfig": runtimeConfig,
|
||||
}
|
||||
|
||||
state, err := getContainers(ctx)
|
||||
state, err := getContainers(context.Background(), ctx)
|
||||
assert.NoError(err)
|
||||
assert.Equal(state, []fullContainerState(nil))
|
||||
}
|
||||
@@ -470,7 +471,7 @@ func TestListGetContainersSandboxWithContainer(t *testing.T) {
|
||||
err = os.MkdirAll(rootfs, testDirMode)
|
||||
assert.NoError(err)
|
||||
|
||||
testingImpl.ListSandboxFunc = func() ([]vc.SandboxStatus, error) {
|
||||
testingImpl.ListSandboxFunc = func(ctx context.Context) ([]vc.SandboxStatus, error) {
|
||||
return []vc.SandboxStatus{
|
||||
{
|
||||
ID: sandbox.ID(),
|
||||
@@ -497,7 +498,7 @@ func TestListGetContainersSandboxWithContainer(t *testing.T) {
|
||||
|
||||
ctx.App.Metadata["runtimeConfig"] = runtimeConfig
|
||||
|
||||
_, err = getContainers(ctx)
|
||||
_, err = getContainers(context.Background(), ctx)
|
||||
assert.NoError(err)
|
||||
}
|
||||
|
||||
@@ -538,7 +539,7 @@ func TestListCLIFunctionFormatFail(t *testing.T) {
|
||||
|
||||
rootfs := filepath.Join(tmpdir, "rootfs")
|
||||
|
||||
testingImpl.ListSandboxFunc = func() ([]vc.SandboxStatus, error) {
|
||||
testingImpl.ListSandboxFunc = func(ctx context.Context) ([]vc.SandboxStatus, error) {
|
||||
return []vc.SandboxStatus{
|
||||
{
|
||||
ID: sandbox.ID(),
|
||||
@@ -638,7 +639,7 @@ func TestListCLIFunctionQuiet(t *testing.T) {
|
||||
err = os.MkdirAll(rootfs, testDirMode)
|
||||
assert.NoError(err)
|
||||
|
||||
testingImpl.ListSandboxFunc = func() ([]vc.SandboxStatus, error) {
|
||||
testingImpl.ListSandboxFunc = func(ctx context.Context) ([]vc.SandboxStatus, error) {
|
||||
return []vc.SandboxStatus{
|
||||
{
|
||||
ID: sandbox.ID(),
|
||||
|
||||
55
cli/main.go
55
cli/main.go
@@ -208,23 +208,35 @@ func setupSignalHandler(ctx context.Context) {
|
||||
|
||||
// setExternalLoggers registers the specified logger with the external
|
||||
// packages which accept a logger to handle their own logging.
|
||||
func setExternalLoggers(logger *logrus.Entry) {
|
||||
func setExternalLoggers(ctx context.Context, logger *logrus.Entry) {
|
||||
var span opentracing.Span
|
||||
|
||||
// Only create a new span if a root span already exists. This is
|
||||
// required to ensure that this function will not disrupt the root
|
||||
// span logic by creating a span before the proper root span has been
|
||||
// created.
|
||||
|
||||
if opentracing.SpanFromContext(ctx) != nil {
|
||||
span, ctx = trace(ctx, "setExternalLoggers")
|
||||
defer span.Finish()
|
||||
}
|
||||
|
||||
// Set virtcontainers logger.
|
||||
vci.SetLogger(logger)
|
||||
vci.SetLogger(ctx, logger)
|
||||
|
||||
// Set vm factory logger.
|
||||
vf.SetLogger(logger)
|
||||
vf.SetLogger(ctx, logger)
|
||||
|
||||
// Set the OCI package logger.
|
||||
oci.SetLogger(logger)
|
||||
oci.SetLogger(ctx, logger)
|
||||
}
|
||||
|
||||
// beforeSubcommands is the function to perform preliminary checks
|
||||
// before command-line parsing occurs.
|
||||
func beforeSubcommands(context *cli.Context) error {
|
||||
handleShowConfig(context)
|
||||
func beforeSubcommands(c *cli.Context) error {
|
||||
handleShowConfig(c)
|
||||
|
||||
if userWantsUsage(context) || (context.NArg() == 1 && (context.Args()[0] == checkCmd)) {
|
||||
if userWantsUsage(c) || (c.NArg() == 1 && (c.Args()[0] == checkCmd)) {
|
||||
// No setup required if the user just
|
||||
// wants to see the usage statement or are
|
||||
// running a command that does not manipulate
|
||||
@@ -232,7 +244,7 @@ func beforeSubcommands(context *cli.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
if path := context.GlobalString("log"); path != "" {
|
||||
if path := c.GlobalString("log"); path != "" {
|
||||
f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND|os.O_SYNC, 0640)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -240,21 +252,21 @@ func beforeSubcommands(context *cli.Context) error {
|
||||
kataLog.Logger.Out = f
|
||||
}
|
||||
|
||||
switch context.GlobalString("log-format") {
|
||||
switch c.GlobalString("log-format") {
|
||||
case "text":
|
||||
// retain logrus's default.
|
||||
case "json":
|
||||
kataLog.Logger.Formatter = new(logrus.JSONFormatter)
|
||||
default:
|
||||
return fmt.Errorf("unknown log-format %q", context.GlobalString("log-format"))
|
||||
return fmt.Errorf("unknown log-format %q", c.GlobalString("log-format"))
|
||||
}
|
||||
|
||||
var traceRootSpan string
|
||||
|
||||
// Add the name of the sub-command to each log entry for easier
|
||||
// debugging.
|
||||
cmdName := context.Args().First()
|
||||
if context.App.Command(cmdName) != nil {
|
||||
cmdName := c.Args().First()
|
||||
if c.App.Command(cmdName) != nil {
|
||||
kataLog = kataLog.WithField("command", cmdName)
|
||||
|
||||
// Name for the root span (used for tracing) now the
|
||||
@@ -262,16 +274,19 @@ func beforeSubcommands(context *cli.Context) error {
|
||||
traceRootSpan = name + " " + cmdName
|
||||
}
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
// Since a context is required, pass a new (throw-away) one - we
|
||||
// cannot use the main context as tracing hasn't been enabled yet
|
||||
// (meaning any spans created at this point will be silently ignored).
|
||||
setExternalLoggers(context.Background(), kataLog)
|
||||
|
||||
ignoreLogging := false
|
||||
|
||||
if context.NArg() == 1 && context.Args()[0] == envCmd {
|
||||
if c.NArg() == 1 && c.Args()[0] == envCmd {
|
||||
// simply report the logging setup
|
||||
ignoreLogging = true
|
||||
}
|
||||
|
||||
configFile, runtimeConfig, err := loadConfiguration(context.GlobalString(configFilePathOption), ignoreLogging)
|
||||
configFile, runtimeConfig, err := loadConfiguration(c.GlobalString(configFilePathOption), ignoreLogging)
|
||||
if err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
@@ -283,13 +298,13 @@ func beforeSubcommands(context *cli.Context) error {
|
||||
// This delays collection of trace data slightly but benefits the user by
|
||||
// ensuring the first span is the name of the sub-command being
|
||||
// invoked from the command-line.
|
||||
err = setupTracing(context, traceRootSpan)
|
||||
err = setupTracing(c, traceRootSpan)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
args := strings.Join(context.Args(), " ")
|
||||
args := strings.Join(c.Args(), " ")
|
||||
|
||||
fields := logrus.Fields{
|
||||
"version": version,
|
||||
@@ -300,8 +315,8 @@ func beforeSubcommands(context *cli.Context) error {
|
||||
kataLog.WithFields(fields).Info()
|
||||
|
||||
// make the data accessible to the sub-commands.
|
||||
context.App.Metadata["runtimeConfig"] = runtimeConfig
|
||||
context.App.Metadata["configFile"] = configFile
|
||||
c.App.Metadata["runtimeConfig"] = runtimeConfig
|
||||
c.App.Metadata["configFile"] = configFile
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -340,6 +355,8 @@ func setupTracing(context *cli.Context, rootSpanName string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
span.SetTag("subsystem", "runtime")
|
||||
|
||||
// Associate the root span with the context
|
||||
ctx = opentracing.ContextWithSpan(ctx, span)
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
@@ -46,7 +47,12 @@ var addIfaceCommand = cli.Command{
|
||||
ArgsUsage: `add-iface <container-id> file or - for stdin`,
|
||||
Flags: []cli.Flag{},
|
||||
Action: func(context *cli.Context) error {
|
||||
return networkModifyCommand(context.Args().First(), context.Args().Get(1), interfaceType, true)
|
||||
ctx, err := cliContextToContext(context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return networkModifyCommand(ctx, context.Args().First(), context.Args().Get(1), interfaceType, true)
|
||||
},
|
||||
}
|
||||
|
||||
@@ -56,7 +62,12 @@ var delIfaceCommand = cli.Command{
|
||||
ArgsUsage: `del-iface <container-id> file or - for stdin`,
|
||||
Flags: []cli.Flag{},
|
||||
Action: func(context *cli.Context) error {
|
||||
return networkModifyCommand(context.Args().First(), context.Args().Get(1), interfaceType, false)
|
||||
ctx, err := cliContextToContext(context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return networkModifyCommand(ctx, context.Args().First(), context.Args().Get(1), interfaceType, false)
|
||||
},
|
||||
}
|
||||
|
||||
@@ -66,7 +77,12 @@ var listIfacesCommand = cli.Command{
|
||||
ArgsUsage: `list-ifaces <container-id>`,
|
||||
Flags: []cli.Flag{},
|
||||
Action: func(context *cli.Context) error {
|
||||
return networkListCommand(context.Args().First(), interfaceType)
|
||||
ctx, err := cliContextToContext(context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return networkListCommand(ctx, context.Args().First(), interfaceType)
|
||||
},
|
||||
}
|
||||
|
||||
@@ -76,7 +92,12 @@ var updateRoutesCommand = cli.Command{
|
||||
ArgsUsage: `update-routes <container-id> file or - for stdin`,
|
||||
Flags: []cli.Flag{},
|
||||
Action: func(context *cli.Context) error {
|
||||
return networkModifyCommand(context.Args().First(), context.Args().Get(1), routeType, true)
|
||||
ctx, err := cliContextToContext(context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return networkModifyCommand(ctx, context.Args().First(), context.Args().Get(1), routeType, true)
|
||||
},
|
||||
}
|
||||
|
||||
@@ -86,12 +107,17 @@ var listRoutesCommand = cli.Command{
|
||||
ArgsUsage: `list-routes <container-id>`,
|
||||
Flags: []cli.Flag{},
|
||||
Action: func(context *cli.Context) error {
|
||||
return networkListCommand(context.Args().First(), routeType)
|
||||
ctx, err := cliContextToContext(context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return networkListCommand(ctx, context.Args().First(), routeType)
|
||||
},
|
||||
}
|
||||
|
||||
func networkModifyCommand(containerID, input string, opType networkType, add bool) (err error) {
|
||||
status, sandboxID, err := getExistingContainerInfo(containerID)
|
||||
func networkModifyCommand(ctx context.Context, containerID, input string, opType networkType, add bool) (err error) {
|
||||
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -103,7 +129,7 @@ func networkModifyCommand(containerID, input string, opType networkType, add boo
|
||||
"sandbox": sandboxID,
|
||||
})
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
|
||||
// container MUST be running
|
||||
if status.State.State != vc.StateRunning {
|
||||
@@ -131,13 +157,13 @@ func networkModifyCommand(containerID, input string, opType networkType, add boo
|
||||
return err
|
||||
}
|
||||
if add {
|
||||
resultingInf, err = vci.AddInterface(sandboxID, inf)
|
||||
resultingInf, err = vci.AddInterface(ctx, sandboxID, inf)
|
||||
if err != nil {
|
||||
kataLog.WithField("resulting-interface", fmt.Sprintf("%+v", resultingInf)).
|
||||
WithError(err).Error("add interface failed")
|
||||
}
|
||||
} else {
|
||||
resultingInf, err = vci.RemoveInterface(sandboxID, inf)
|
||||
resultingInf, err = vci.RemoveInterface(ctx, sandboxID, inf)
|
||||
if err != nil {
|
||||
kataLog.WithField("resulting-interface", fmt.Sprintf("%+v", resultingInf)).
|
||||
WithError(err).Error("delete interface failed")
|
||||
@@ -149,7 +175,7 @@ func networkModifyCommand(containerID, input string, opType networkType, add boo
|
||||
if err = json.NewDecoder(f).Decode(&routes); err != nil {
|
||||
return err
|
||||
}
|
||||
resultingRoutes, err = vci.UpdateRoutes(sandboxID, routes)
|
||||
resultingRoutes, err = vci.UpdateRoutes(ctx, sandboxID, routes)
|
||||
json.NewEncoder(output).Encode(resultingRoutes)
|
||||
if err != nil {
|
||||
kataLog.WithField("resulting-routes", fmt.Sprintf("%+v", resultingRoutes)).
|
||||
@@ -159,8 +185,8 @@ func networkModifyCommand(containerID, input string, opType networkType, add boo
|
||||
return err
|
||||
}
|
||||
|
||||
func networkListCommand(containerID string, opType networkType) (err error) {
|
||||
status, sandboxID, err := getExistingContainerInfo(containerID)
|
||||
func networkListCommand(ctx context.Context, containerID string, opType networkType) (err error) {
|
||||
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -172,7 +198,7 @@ func networkListCommand(containerID string, opType networkType) (err error) {
|
||||
"sandbox": sandboxID,
|
||||
})
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
|
||||
// container MUST be running
|
||||
if status.State.State != vc.StateRunning {
|
||||
@@ -184,7 +210,7 @@ func networkListCommand(containerID string, opType networkType) (err error) {
|
||||
switch opType {
|
||||
case interfaceType:
|
||||
var interfaces []*grpc.Interface
|
||||
interfaces, err = vci.ListInterfaces(sandboxID)
|
||||
interfaces, err = vci.ListInterfaces(ctx, sandboxID)
|
||||
if err != nil {
|
||||
kataLog.WithField("existing-interfaces", fmt.Sprintf("%+v", interfaces)).
|
||||
WithError(err).Error("list interfaces failed")
|
||||
@@ -192,7 +218,7 @@ func networkListCommand(containerID string, opType networkType) (err error) {
|
||||
json.NewEncoder(file).Encode(interfaces)
|
||||
case routeType:
|
||||
var routes []*grpc.Route
|
||||
routes, err = vci.ListRoutes(sandboxID)
|
||||
routes, err = vci.ListRoutes(ctx, sandboxID)
|
||||
if err != nil {
|
||||
kataLog.WithField("resulting-routes", fmt.Sprintf("%+v", routes)).
|
||||
WithError(err).Error("update routes failed")
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
@@ -17,19 +18,19 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
testAddInterfaceFuncReturnNil = func(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
testAddInterfaceFuncReturnNil = func(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return nil, nil
|
||||
}
|
||||
testRemoveInterfaceFuncReturnNil = func(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
testRemoveInterfaceFuncReturnNil = func(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return nil, nil
|
||||
}
|
||||
testListInterfacesFuncReturnNil = func(sandboxID string) ([]*grpc.Interface, error) {
|
||||
testListInterfacesFuncReturnNil = func(ctx context.Context, sandboxID string) ([]*grpc.Interface, error) {
|
||||
return nil, nil
|
||||
}
|
||||
testUpdateRoutsFuncReturnNil = func(sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error) {
|
||||
testUpdateRoutsFuncReturnNil = func(ctx context.Context, sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error) {
|
||||
return nil, nil
|
||||
}
|
||||
testListRoutesFuncReturnNil = func(sandboxID string) ([]*grpc.Route, error) {
|
||||
testListRoutesFuncReturnNil = func(ctx context.Context, sandboxID string) ([]*grpc.Route, error) {
|
||||
return nil, nil
|
||||
}
|
||||
)
|
||||
@@ -51,7 +52,7 @@ func TestNetworkCliFunction(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, map[string]string{}), nil
|
||||
}
|
||||
|
||||
|
||||
19
cli/oci.go
19
cli/oci.go
@@ -21,7 +21,6 @@ import (
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
|
||||
"github.com/opencontainers/runc/libcontainer/utils"
|
||||
specs "github.com/opencontainers/runtime-spec/specs-go"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
@@ -47,7 +46,7 @@ var procMountInfo = "/proc/self/mountinfo"
|
||||
var ctrsMapTreePath = "/var/run/kata-containers/containers-mapping"
|
||||
|
||||
// getContainerInfo returns the container status and its sandbox ID.
|
||||
func getContainerInfo(containerID string) (vc.ContainerStatus, string, error) {
|
||||
func getContainerInfo(ctx context.Context, containerID string) (vc.ContainerStatus, string, error) {
|
||||
// container ID MUST be provided.
|
||||
if containerID == "" {
|
||||
return vc.ContainerStatus{}, "", fmt.Errorf("Missing container ID")
|
||||
@@ -64,7 +63,7 @@ func getContainerInfo(containerID string) (vc.ContainerStatus, string, error) {
|
||||
return vc.ContainerStatus{}, "", nil
|
||||
}
|
||||
|
||||
ctrStatus, err := vci.StatusContainer(sandboxID, containerID)
|
||||
ctrStatus, err := vci.StatusContainer(ctx, sandboxID, containerID)
|
||||
if err != nil {
|
||||
return vc.ContainerStatus{}, "", err
|
||||
}
|
||||
@@ -72,8 +71,8 @@ func getContainerInfo(containerID string) (vc.ContainerStatus, string, error) {
|
||||
return ctrStatus, sandboxID, nil
|
||||
}
|
||||
|
||||
func getExistingContainerInfo(containerID string) (vc.ContainerStatus, string, error) {
|
||||
cStatus, sandboxID, err := getContainerInfo(containerID)
|
||||
func getExistingContainerInfo(ctx context.Context, containerID string) (vc.ContainerStatus, string, error) {
|
||||
cStatus, sandboxID, err := getContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return vc.ContainerStatus{}, "", err
|
||||
}
|
||||
@@ -86,14 +85,14 @@ func getExistingContainerInfo(containerID string) (vc.ContainerStatus, string, e
|
||||
return cStatus, sandboxID, nil
|
||||
}
|
||||
|
||||
func validCreateParams(containerID, bundlePath string) (string, error) {
|
||||
func validCreateParams(ctx context.Context, containerID, bundlePath string) (string, error) {
|
||||
// container ID MUST be provided.
|
||||
if containerID == "" {
|
||||
return "", fmt.Errorf("Missing container ID")
|
||||
}
|
||||
|
||||
// container ID MUST be unique.
|
||||
cStatus, _, err := getContainerInfo(containerID)
|
||||
cStatus, _, err := getContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@@ -128,7 +127,7 @@ func validCreateParams(containerID, bundlePath string) (string, error) {
|
||||
// OCI runtime specification. It returns a list of complete paths
|
||||
// that should be created and used for every specified resource.
|
||||
func processCgroupsPath(ctx context.Context, ociSpec oci.CompatOCISpec, isSandbox bool) ([]string, error) {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "processCgroupsPath")
|
||||
span, _ := trace(ctx, "processCgroupsPath")
|
||||
defer span.Finish()
|
||||
|
||||
var cgroupsPathList []string
|
||||
@@ -377,7 +376,7 @@ func fetchContainerIDMapping(containerID string) (string, error) {
|
||||
}
|
||||
|
||||
func addContainerIDMapping(ctx context.Context, containerID, sandboxID string) error {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "addContainerIDMapping")
|
||||
span, _ := trace(ctx, "addContainerIDMapping")
|
||||
defer span.Finish()
|
||||
|
||||
if containerID == "" {
|
||||
@@ -404,7 +403,7 @@ func addContainerIDMapping(ctx context.Context, containerID, sandboxID string) e
|
||||
}
|
||||
|
||||
func delContainerIDMapping(ctx context.Context, containerID string) error {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "delContainerIDMapping")
|
||||
span, _ := trace(ctx, "delContainerIDMapping")
|
||||
defer span.Finish()
|
||||
|
||||
if containerID == "" {
|
||||
|
||||
@@ -66,7 +66,7 @@ var cgroupTestData = []cgroupTestDataType{
|
||||
|
||||
func TestGetContainerInfoContainerIDEmptyFailure(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
status, _, err := getContainerInfo("")
|
||||
status, _, err := getContainerInfo(context.Background(), "")
|
||||
|
||||
assert.Error(err, "This test should fail because containerID is empty")
|
||||
assert.Empty(status.ID, "Expected blank fullID, but got %v", status.ID)
|
||||
@@ -92,7 +92,7 @@ func TestGetContainerInfo(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return containerStatus, nil
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ func TestGetContainerInfo(t *testing.T) {
|
||||
testingImpl.StatusContainerFunc = nil
|
||||
}()
|
||||
|
||||
status, sandboxID, err := getContainerInfo(testContainerID)
|
||||
status, sandboxID, err := getContainerInfo(context.Background(), testContainerID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandboxID, sandbox.ID())
|
||||
assert.Equal(status, containerStatus)
|
||||
@@ -108,7 +108,7 @@ func TestGetContainerInfo(t *testing.T) {
|
||||
|
||||
func TestValidCreateParamsContainerIDEmptyFailure(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
_, err := validCreateParams("", "")
|
||||
_, err := validCreateParams(context.Background(), "", "")
|
||||
|
||||
assert.Error(err, "This test should fail because containerID is empty")
|
||||
assert.False(vcmock.IsMockError(err))
|
||||
@@ -116,7 +116,7 @@ func TestValidCreateParamsContainerIDEmptyFailure(t *testing.T) {
|
||||
|
||||
func TestGetExistingContainerInfoContainerIDEmptyFailure(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
status, _, err := getExistingContainerInfo("")
|
||||
status, _, err := getExistingContainerInfo(context.Background(), "")
|
||||
|
||||
assert.Error(err, "This test should fail because containerID is empty")
|
||||
assert.Empty(status.ID, "Expected blank fullID, but got %v", status.ID)
|
||||
@@ -133,7 +133,7 @@ func TestValidCreateParamsContainerIDNotUnique(t *testing.T) {
|
||||
err = os.MkdirAll(filepath.Join(ctrsMapTreePath, testContainerID, testSandboxID2), 0750)
|
||||
assert.NoError(err)
|
||||
|
||||
_, err = validCreateParams(testContainerID, "")
|
||||
_, err = validCreateParams(context.Background(), testContainerID, "")
|
||||
|
||||
assert.Error(err)
|
||||
assert.False(vcmock.IsMockError(err))
|
||||
@@ -153,7 +153,7 @@ func TestValidCreateParamsInvalidBundle(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
_, err = validCreateParams(testContainerID, bundlePath)
|
||||
_, err = validCreateParams(context.Background(), testContainerID, bundlePath)
|
||||
// bundle is ENOENT
|
||||
assert.Error(err)
|
||||
assert.False(vcmock.IsMockError(err))
|
||||
@@ -175,7 +175,7 @@ func TestValidCreateParamsBundleIsAFile(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
_, err = validCreateParams(testContainerID, bundlePath)
|
||||
_, err = validCreateParams(context.Background(), testContainerID, bundlePath)
|
||||
// bundle exists as a file, not a directory
|
||||
assert.Error(err)
|
||||
assert.False(vcmock.IsMockError(err))
|
||||
|
||||
13
cli/pause.go
13
cli/pause.go
@@ -9,7 +9,6 @@ package main
|
||||
import (
|
||||
"context"
|
||||
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
@@ -58,16 +57,16 @@ func toggle(c *cli.Context, pause bool) error {
|
||||
}
|
||||
|
||||
func toggleContainerPause(ctx context.Context, containerID string, pause bool) (err error) {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "pause")
|
||||
span, _ := trace(ctx, "pause")
|
||||
defer span.Finish()
|
||||
span.SetTag("pause", pause)
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
// Checks the MUST and MUST NOT from OCI runtime specification
|
||||
status, sandboxID, err := getExistingContainerInfo(containerID)
|
||||
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -79,14 +78,14 @@ func toggleContainerPause(ctx context.Context, containerID string, pause bool) (
|
||||
"sandbox": sandboxID,
|
||||
})
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
span.SetTag("sandbox", sandboxID)
|
||||
|
||||
if pause {
|
||||
err = vci.PauseContainer(sandboxID, containerID)
|
||||
err = vci.PauseContainer(ctx, sandboxID, containerID)
|
||||
} else {
|
||||
err = vci.ResumeContainer(sandboxID, containerID)
|
||||
err = vci.ResumeContainer(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
return err
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
@@ -16,11 +17,11 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
testPauseContainerFuncReturnNil = func(sandboxID, containerID string) error {
|
||||
testPauseContainerFuncReturnNil = func(ctx context.Context, sandboxID, containerID string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
testResumeContainerFuncReturnNil = func(sandboxID, containerID string) error {
|
||||
testResumeContainerFuncReturnNil = func(ctx context.Context, sandboxID, containerID string) error {
|
||||
return nil
|
||||
}
|
||||
)
|
||||
@@ -38,7 +39,7 @@ func TestPauseCLIFunctionSuccessful(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, map[string]string{}), nil
|
||||
}
|
||||
|
||||
@@ -84,7 +85,7 @@ func TestPauseCLIFunctionPauseContainerFailure(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, map[string]string{}), nil
|
||||
}
|
||||
|
||||
@@ -111,7 +112,7 @@ func TestResumeCLIFunctionSuccessful(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, map[string]string{}), nil
|
||||
}
|
||||
|
||||
@@ -156,7 +157,7 @@ func TestResumeCLIFunctionPauseContainerFailure(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return newSingleContainerStatus(testContainerID, state, map[string]string{}), nil
|
||||
}
|
||||
|
||||
|
||||
11
cli/ps.go
11
cli/ps.go
@@ -11,7 +11,6 @@ import (
|
||||
"fmt"
|
||||
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
@@ -51,7 +50,7 @@ var psCLICommand = cli.Command{
|
||||
}
|
||||
|
||||
func ps(ctx context.Context, containerID, format string, args []string) error {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "ps")
|
||||
span, _ := trace(ctx, "ps")
|
||||
defer span.Finish()
|
||||
|
||||
if containerID == "" {
|
||||
@@ -59,11 +58,11 @@ func ps(ctx context.Context, containerID, format string, args []string) error {
|
||||
}
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
// Checks the MUST and MUST NOT from OCI runtime specification
|
||||
status, sandboxID, err := getExistingContainerInfo(containerID)
|
||||
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -75,7 +74,7 @@ func ps(ctx context.Context, containerID, format string, args []string) error {
|
||||
"sandbox": sandboxID,
|
||||
})
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
span.SetTag("sandbox", sandboxID)
|
||||
|
||||
@@ -93,7 +92,7 @@ func ps(ctx context.Context, containerID, format string, args []string) error {
|
||||
|
||||
options.Format = format
|
||||
|
||||
msg, err := vci.ProcessListContainer(containerID, sandboxID, options)
|
||||
msg, err := vci.ProcessListContainer(ctx, containerID, sandboxID, options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ func TestPSFailure(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -93,7 +93,7 @@ func TestPSSuccessful(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
State: vc.State{
|
||||
State: vc.StateRunning,
|
||||
@@ -105,7 +105,7 @@ func TestPSSuccessful(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.ProcessListContainerFunc = func(sandboxID, containerID string, options vc.ProcessListOptions) (vc.ProcessList, error) {
|
||||
testingImpl.ProcessListContainerFunc = func(ctx context.Context, sandboxID, containerID string, options vc.ProcessListOptions) (vc.ProcessList, error) {
|
||||
return []byte("echo,sleep,grep"), nil
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ import (
|
||||
"syscall"
|
||||
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
@@ -82,7 +81,7 @@ var runCLICommand = cli.Command{
|
||||
|
||||
func run(ctx context.Context, containerID, bundle, console, consoleSocket, pidFile string, detach bool,
|
||||
runtimeConfig oci.RuntimeConfig) error {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "run")
|
||||
span, ctx := trace(ctx, "run")
|
||||
defer span.Finish()
|
||||
|
||||
consolePath, err := setupConsole(console, consoleSocket)
|
||||
|
||||
@@ -67,11 +67,11 @@ func TestRunInvalidArgs(t *testing.T) {
|
||||
}
|
||||
|
||||
// fake functions used to run containers
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
testingImpl.StartSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StartSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -230,12 +230,12 @@ func TestRunContainerSuccessful(t *testing.T) {
|
||||
flagCreate := false
|
||||
|
||||
// fake functions used to run containers
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
flagCreate = true
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
testingImpl.StartSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StartSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
@@ -244,7 +244,7 @@ func TestRunContainerSuccessful(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
// return an empty list on create
|
||||
if !flagCreate {
|
||||
return vc.ContainerStatus{}, nil
|
||||
@@ -260,7 +260,7 @@ func TestRunContainerSuccessful(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.StartContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.StartContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
// now we can kill the fake container workload
|
||||
err := d.process.Kill()
|
||||
assert.NoError(err)
|
||||
@@ -268,11 +268,11 @@ func TestRunContainerSuccessful(t *testing.T) {
|
||||
return d.sandbox.MockContainers[0], nil
|
||||
}
|
||||
|
||||
testingImpl.DeleteSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.DeleteSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
testingImpl.DeleteContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.DeleteContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
return d.sandbox.MockContainers[0], nil
|
||||
}
|
||||
|
||||
@@ -304,12 +304,12 @@ func TestRunContainerDetachSuccessful(t *testing.T) {
|
||||
flagCreate := false
|
||||
|
||||
// fake functions used to run containers
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
flagCreate = true
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
testingImpl.StartSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StartSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
@@ -318,7 +318,7 @@ func TestRunContainerDetachSuccessful(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
// return an empty list on create
|
||||
if !flagCreate {
|
||||
return vc.ContainerStatus{}, nil
|
||||
@@ -334,7 +334,7 @@ func TestRunContainerDetachSuccessful(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.StartContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.StartContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
// now we can kill the fake container workload
|
||||
err := d.process.Kill()
|
||||
assert.NoError(err)
|
||||
@@ -342,11 +342,11 @@ func TestRunContainerDetachSuccessful(t *testing.T) {
|
||||
return d.sandbox.MockContainers[0], nil
|
||||
}
|
||||
|
||||
testingImpl.DeleteSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.DeleteSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
testingImpl.DeleteContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.DeleteContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
return d.sandbox.MockContainers[0], nil
|
||||
}
|
||||
|
||||
@@ -375,12 +375,12 @@ func TestRunContainerDeleteFail(t *testing.T) {
|
||||
flagCreate := false
|
||||
|
||||
// fake functions used to run containers
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
flagCreate = true
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
testingImpl.StartSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StartSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
@@ -389,7 +389,7 @@ func TestRunContainerDeleteFail(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
// return an empty list on create
|
||||
if !flagCreate {
|
||||
return vc.ContainerStatus{}, nil
|
||||
@@ -405,7 +405,7 @@ func TestRunContainerDeleteFail(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.StartContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.StartContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
// now we can kill the fake container workload
|
||||
err := d.process.Kill()
|
||||
assert.NoError(err)
|
||||
@@ -413,12 +413,12 @@ func TestRunContainerDeleteFail(t *testing.T) {
|
||||
return d.sandbox.MockContainers[0], nil
|
||||
}
|
||||
|
||||
testingImpl.DeleteSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.DeleteSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
// return an error to provoke a failure in delete
|
||||
return nil, fmt.Errorf("DeleteSandboxFunc")
|
||||
}
|
||||
|
||||
testingImpl.DeleteContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.DeleteContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
// return an error to provoke a failure in delete
|
||||
return d.sandbox.MockContainers[0], fmt.Errorf("DeleteContainerFunc")
|
||||
}
|
||||
@@ -449,12 +449,12 @@ func TestRunContainerWaitFail(t *testing.T) {
|
||||
flagCreate := false
|
||||
|
||||
// fake functions used to run containers
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
flagCreate = true
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
testingImpl.StartSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StartSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
@@ -463,7 +463,7 @@ func TestRunContainerWaitFail(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
// return an empty list on create
|
||||
if !flagCreate {
|
||||
return vc.ContainerStatus{}, nil
|
||||
@@ -479,7 +479,7 @@ func TestRunContainerWaitFail(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.StartContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.StartContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
// now we can kill the fake container workload
|
||||
err := d.process.Kill()
|
||||
assert.NoError(err)
|
||||
@@ -490,12 +490,12 @@ func TestRunContainerWaitFail(t *testing.T) {
|
||||
return d.sandbox.MockContainers[0], nil
|
||||
}
|
||||
|
||||
testingImpl.DeleteSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.DeleteSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
// return an error to provoke a failure in delete
|
||||
return nil, fmt.Errorf("DeleteSandboxFunc")
|
||||
}
|
||||
|
||||
testingImpl.DeleteContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.DeleteContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
// return an error to provoke a failure in delete
|
||||
return d.sandbox.MockContainers[0], fmt.Errorf("DeleteContainerFunc")
|
||||
}
|
||||
@@ -530,12 +530,12 @@ func TestRunContainerStartFail(t *testing.T) {
|
||||
flagCreate := false
|
||||
|
||||
// fake functions used to run containers
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
flagCreate = true
|
||||
return d.sandbox, nil
|
||||
}
|
||||
|
||||
testingImpl.StartSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StartSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
// start fails
|
||||
return nil, fmt.Errorf("StartSandbox")
|
||||
}
|
||||
@@ -545,7 +545,7 @@ func TestRunContainerStartFail(t *testing.T) {
|
||||
defer os.RemoveAll(path)
|
||||
ctrsMapTreePath = path
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
// return an empty list on create
|
||||
if !flagCreate {
|
||||
return vc.ContainerStatus{}, nil
|
||||
@@ -595,7 +595,7 @@ func TestRunContainerStartFailExistingContainer(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
// return the container status
|
||||
return vc.ContainerStatus{
|
||||
ID: testContainerID,
|
||||
@@ -605,11 +605,11 @@ func TestRunContainerStartFailExistingContainer(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
testingImpl.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
testingImpl.StartSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StartSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
// force no containers
|
||||
sandbox.MockContainers = nil
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ import (
|
||||
"os"
|
||||
|
||||
"github.com/opencontainers/runc/libcontainer/specconv"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
@@ -78,7 +77,7 @@ generate a proper rootless spec file.`,
|
||||
return err
|
||||
}
|
||||
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "spec")
|
||||
span, _ := trace(ctx, "spec")
|
||||
defer span.Finish()
|
||||
|
||||
spec := specconv.Example()
|
||||
|
||||
13
cli/start.go
13
cli/start.go
@@ -12,7 +12,6 @@ import (
|
||||
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
@@ -48,15 +47,15 @@ var startCLICommand = cli.Command{
|
||||
}
|
||||
|
||||
func start(ctx context.Context, containerID string) (vc.VCSandbox, error) {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "start")
|
||||
span, _ := trace(ctx, "start")
|
||||
defer span.Finish()
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
// Checks the MUST and MUST NOT from OCI runtime specification
|
||||
status, sandboxID, err := getExistingContainerInfo(containerID)
|
||||
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -68,7 +67,7 @@ func start(ctx context.Context, containerID string) (vc.VCSandbox, error) {
|
||||
"sandbox": sandboxID,
|
||||
})
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
span.SetTag("sandbox", sandboxID)
|
||||
|
||||
@@ -78,10 +77,10 @@ func start(ctx context.Context, containerID string) (vc.VCSandbox, error) {
|
||||
}
|
||||
|
||||
if containerType.IsSandbox() {
|
||||
return vci.StartSandbox(sandboxID)
|
||||
return vci.StartSandbox(ctx, sandboxID)
|
||||
}
|
||||
|
||||
c, err := vci.StartContainer(sandboxID, containerID)
|
||||
c, err := vci.StartContainer(ctx, sandboxID, containerID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ func TestStartSandbox(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -75,7 +75,7 @@ func TestStartSandbox(t *testing.T) {
|
||||
assert.Error(err)
|
||||
assert.True(vcmock.IsMockError(err))
|
||||
|
||||
testingImpl.StartSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
testingImpl.StartSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return sandbox, nil
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ func TestStartMissingAnnotation(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{},
|
||||
@@ -132,7 +132,7 @@ func TestStartContainerSucessFailure(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: testContainerID,
|
||||
Annotations: map[string]string{
|
||||
@@ -149,7 +149,7 @@ func TestStartContainerSucessFailure(t *testing.T) {
|
||||
assert.Error(err)
|
||||
assert.True(vcmock.IsMockError(err))
|
||||
|
||||
testingImpl.StartContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.StartContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
return sandbox.MockContainers[0], nil
|
||||
}
|
||||
|
||||
@@ -206,7 +206,7 @@ func TestStartCLIFunctionSuccess(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: testContainerID,
|
||||
Annotations: map[string]string{
|
||||
@@ -215,7 +215,7 @@ func TestStartCLIFunctionSuccess(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
testingImpl.StartContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
testingImpl.StartContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
return sandbox.MockContainers[0], nil
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ import (
|
||||
"os"
|
||||
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
@@ -41,16 +40,16 @@ instance of a container.`,
|
||||
}
|
||||
|
||||
func state(ctx context.Context, containerID string) error {
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "state")
|
||||
span, _ := trace(ctx, "state")
|
||||
defer span.Finish()
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
|
||||
// Checks the MUST and MUST NOT from OCI runtime specification
|
||||
status, _, err := getExistingContainerInfo(containerID)
|
||||
status, _, err := getExistingContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ func TestStateSuccessful(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: testContainerID,
|
||||
Annotations: map[string]string{
|
||||
|
||||
@@ -76,3 +76,14 @@ func stopTracing(ctx context.Context) {
|
||||
// report all possible spans to the collector
|
||||
tracerCloser.Close()
|
||||
}
|
||||
|
||||
// trace creates a new tracing span based on the specified name and parent
|
||||
// context.
|
||||
func trace(parent context.Context, name string) (opentracing.Span, context.Context) {
|
||||
span, ctx := opentracing.StartSpanFromContext(parent, name)
|
||||
|
||||
span.SetTag("source", "runtime")
|
||||
span.SetTag("component", "cli")
|
||||
|
||||
return span, ctx
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
"github.com/docker/go-units"
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
"github.com/opencontainers/runtime-spec/specs-go"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
@@ -133,7 +132,7 @@ other options are ignored.
|
||||
return err
|
||||
}
|
||||
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "update")
|
||||
span, _ := trace(ctx, "update")
|
||||
defer span.Finish()
|
||||
|
||||
if context.Args().Present() == false {
|
||||
@@ -143,10 +142,10 @@ other options are ignored.
|
||||
containerID := context.Args().First()
|
||||
|
||||
kataLog = kataLog.WithField("container", containerID)
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
span.SetTag("container", containerID)
|
||||
|
||||
status, sandboxID, err := getExistingContainerInfo(containerID)
|
||||
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -158,7 +157,7 @@ other options are ignored.
|
||||
"sandbox": sandboxID,
|
||||
})
|
||||
|
||||
setExternalLoggers(kataLog)
|
||||
setExternalLoggers(ctx, kataLog)
|
||||
|
||||
span.SetTag("container", containerID)
|
||||
span.SetTag("sandbox", sandboxID)
|
||||
@@ -282,6 +281,6 @@ other options are ignored.
|
||||
r.Pids.Limit = int64(context.Int("pids-limit"))
|
||||
}
|
||||
|
||||
return vci.UpdateContainer(sandboxID, containerID, r)
|
||||
return vci.UpdateContainer(ctx, sandboxID, containerID, r)
|
||||
},
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
@@ -71,7 +72,7 @@ func TestUpdateCLIFailure(t *testing.T) {
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(path)
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -87,7 +88,7 @@ func TestUpdateCLIFailure(t *testing.T) {
|
||||
assert.Error(err)
|
||||
|
||||
// resources file does not exist
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -98,7 +99,7 @@ func TestUpdateCLIFailure(t *testing.T) {
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
testingImpl.UpdateContainerFunc = func(sandboxID, containerID string, resources specs.LinuxResources) error {
|
||||
testingImpl.UpdateContainerFunc = func(ctx context.Context, sandboxID, containerID string, resources specs.LinuxResources) error {
|
||||
return nil
|
||||
}
|
||||
defer func() {
|
||||
@@ -160,7 +161,7 @@ func TestUpdateCLISuccessful(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
testingImpl.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{
|
||||
ID: sandbox.ID(),
|
||||
Annotations: map[string]string{
|
||||
@@ -171,7 +172,7 @@ func TestUpdateCLISuccessful(t *testing.T) {
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
testingImpl.UpdateContainerFunc = func(sandboxID, containerID string, resources specs.LinuxResources) error {
|
||||
testingImpl.UpdateContainerFunc = func(ctx context.Context, sandboxID, containerID string, resources specs.LinuxResources) error {
|
||||
return nil
|
||||
}
|
||||
defer func() {
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
@@ -19,7 +18,7 @@ var versionCLICommand = cli.Command{
|
||||
return err
|
||||
}
|
||||
|
||||
span, _ := opentracing.StartSpanFromContext(ctx, "version")
|
||||
span, _ := trace(ctx, "version")
|
||||
defer span.Finish()
|
||||
|
||||
cli.VersionPrinter(context)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"syscall"
|
||||
|
||||
@@ -129,7 +130,7 @@ type agent interface {
|
||||
// init().
|
||||
// After init() is called, agent implementations should be initialized and ready
|
||||
// to handle all other Agent interface methods.
|
||||
init(sandbox *Sandbox, config interface{}) error
|
||||
init(ctx context.Context, sandbox *Sandbox, config interface{}) error
|
||||
|
||||
// capabilities should return a structure that specifies the capabilities
|
||||
// supported by the agent.
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"runtime"
|
||||
"syscall"
|
||||
@@ -14,6 +15,7 @@ import (
|
||||
deviceApi "github.com/kata-containers/runtime/virtcontainers/device/api"
|
||||
deviceConfig "github.com/kata-containers/runtime/virtcontainers/device/config"
|
||||
specs "github.com/opencontainers/runtime-spec/specs-go"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
@@ -23,8 +25,31 @@ func init() {
|
||||
|
||||
var virtLog = logrus.WithField("source", "virtcontainers")
|
||||
|
||||
// trace creates a new tracing span based on the specified name and parent
|
||||
// context.
|
||||
func trace(parent context.Context, name string) (opentracing.Span, context.Context) {
|
||||
span, ctx := opentracing.StartSpanFromContext(parent, name)
|
||||
|
||||
// Should not need to be changed (again).
|
||||
span.SetTag("source", "virtcontainers")
|
||||
span.SetTag("component", "virtcontainers")
|
||||
|
||||
// Should be reset as new subsystems are entered.
|
||||
span.SetTag("subsystem", "api")
|
||||
|
||||
return span, ctx
|
||||
}
|
||||
|
||||
func traceWithSubsys(ctx context.Context, subsys, name string) (opentracing.Span, context.Context) {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, name)
|
||||
|
||||
span.SetTag("subsystem", subsys)
|
||||
|
||||
return span, ctx
|
||||
}
|
||||
|
||||
// SetLogger sets the logger for virtcontainers package.
|
||||
func SetLogger(logger *logrus.Entry) {
|
||||
func SetLogger(ctx context.Context, logger *logrus.Entry) {
|
||||
fields := virtLog.Data
|
||||
virtLog = logger.WithFields(fields)
|
||||
|
||||
@@ -33,8 +58,11 @@ func SetLogger(logger *logrus.Entry) {
|
||||
|
||||
// CreateSandbox is the virtcontainers sandbox creation entry point.
|
||||
// CreateSandbox creates a sandbox and its containers. It does not start them.
|
||||
func CreateSandbox(sandboxConfig SandboxConfig, factory Factory) (VCSandbox, error) {
|
||||
s, err := createSandboxFromConfig(sandboxConfig, factory)
|
||||
func CreateSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Factory) (VCSandbox, error) {
|
||||
span, ctx := trace(ctx, "CreateSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
s, err := createSandboxFromConfig(ctx, sandboxConfig, factory)
|
||||
if err == nil {
|
||||
s.releaseStatelessSandbox()
|
||||
}
|
||||
@@ -42,11 +70,14 @@ func CreateSandbox(sandboxConfig SandboxConfig, factory Factory) (VCSandbox, err
|
||||
return s, err
|
||||
}
|
||||
|
||||
func createSandboxFromConfig(sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error) {
|
||||
func createSandboxFromConfig(ctx context.Context, sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error) {
|
||||
span, ctx := trace(ctx, "createSandboxFromConfig")
|
||||
defer span.Finish()
|
||||
|
||||
var err error
|
||||
|
||||
// Create the sandbox.
|
||||
s, err := createSandbox(sandboxConfig, factory)
|
||||
s, err := createSandbox(ctx, sandboxConfig, factory)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -104,7 +135,10 @@ func createSandboxFromConfig(sandboxConfig SandboxConfig, factory Factory) (*San
|
||||
|
||||
// DeleteSandbox is the virtcontainers sandbox deletion entry point.
|
||||
// DeleteSandbox will stop an already running container and then delete it.
|
||||
func DeleteSandbox(sandboxID string) (VCSandbox, error) {
|
||||
func DeleteSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
span, ctx := trace(ctx, "DeleteSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -116,7 +150,7 @@ func DeleteSandbox(sandboxID string) (VCSandbox, error) {
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
// Fetch the sandbox from storage and create it.
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -134,7 +168,10 @@ func DeleteSandbox(sandboxID string) (VCSandbox, error) {
|
||||
// FetchSandbox will find out and connect to an existing sandbox and
|
||||
// return the sandbox structure. The caller is responsible of calling
|
||||
// VCSandbox.Release() after done with it.
|
||||
func FetchSandbox(sandboxID string) (VCSandbox, error) {
|
||||
func FetchSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
span, ctx := trace(ctx, "FetchSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -146,7 +183,7 @@ func FetchSandbox(sandboxID string) (VCSandbox, error) {
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
// Fetch the sandbox from storage and create it.
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -168,7 +205,10 @@ func FetchSandbox(sandboxID string) (VCSandbox, error) {
|
||||
// StartSandbox will talk to the given hypervisor to start an existing
|
||||
// sandbox and all its containers.
|
||||
// It returns the sandbox ID.
|
||||
func StartSandbox(sandboxID string) (VCSandbox, error) {
|
||||
func StartSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
span, ctx := trace(ctx, "StartSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -180,7 +220,7 @@ func StartSandbox(sandboxID string) (VCSandbox, error) {
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
// Fetch the sandbox from storage and create it.
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -206,7 +246,10 @@ func startSandbox(s *Sandbox) (*Sandbox, error) {
|
||||
|
||||
// StopSandbox is the virtcontainers sandbox stopping entry point.
|
||||
// StopSandbox will talk to the given agent to stop an existing sandbox and destroy all containers within that sandbox.
|
||||
func StopSandbox(sandboxID string) (VCSandbox, error) {
|
||||
func StopSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
span, ctx := trace(ctx, "StopSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandbox
|
||||
}
|
||||
@@ -218,7 +261,7 @@ func StopSandbox(sandboxID string) (VCSandbox, error) {
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
// Fetch the sandbox from storage and create it.
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -245,8 +288,11 @@ func StopSandbox(sandboxID string) (VCSandbox, error) {
|
||||
|
||||
// RunSandbox is the virtcontainers sandbox running entry point.
|
||||
// RunSandbox creates a sandbox and its containers and then it starts them.
|
||||
func RunSandbox(sandboxConfig SandboxConfig, factory Factory) (VCSandbox, error) {
|
||||
s, err := createSandboxFromConfig(sandboxConfig, factory)
|
||||
func RunSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Factory) (VCSandbox, error) {
|
||||
span, ctx := trace(ctx, "RunSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
s, err := createSandboxFromConfig(ctx, sandboxConfig, factory)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -262,7 +308,10 @@ func RunSandbox(sandboxConfig SandboxConfig, factory Factory) (VCSandbox, error)
|
||||
}
|
||||
|
||||
// ListSandbox is the virtcontainers sandbox listing entry point.
|
||||
func ListSandbox() ([]SandboxStatus, error) {
|
||||
func ListSandbox(ctx context.Context) ([]SandboxStatus, error) {
|
||||
span, ctx := trace(ctx, "ListSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
dir, err := os.Open(configStoragePath)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
@@ -282,7 +331,7 @@ func ListSandbox() ([]SandboxStatus, error) {
|
||||
var sandboxStatusList []SandboxStatus
|
||||
|
||||
for _, sandboxID := range sandboxesID {
|
||||
sandboxStatus, err := StatusSandbox(sandboxID)
|
||||
sandboxStatus, err := StatusSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
@@ -294,7 +343,10 @@ func ListSandbox() ([]SandboxStatus, error) {
|
||||
}
|
||||
|
||||
// StatusSandbox is the virtcontainers sandbox status entry point.
|
||||
func StatusSandbox(sandboxID string) (SandboxStatus, error) {
|
||||
func StatusSandbox(ctx context.Context, sandboxID string) (SandboxStatus, error) {
|
||||
span, ctx := trace(ctx, "StatusSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return SandboxStatus{}, errNeedSandboxID
|
||||
}
|
||||
@@ -304,7 +356,7 @@ func StatusSandbox(sandboxID string) (SandboxStatus, error) {
|
||||
return SandboxStatus{}, err
|
||||
}
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
unlockSandbox(lockFile)
|
||||
return SandboxStatus{}, err
|
||||
@@ -346,7 +398,10 @@ func StatusSandbox(sandboxID string) (SandboxStatus, error) {
|
||||
|
||||
// CreateContainer is the virtcontainers container creation entry point.
|
||||
// CreateContainer creates a container on a given sandbox.
|
||||
func CreateContainer(sandboxID string, containerConfig ContainerConfig) (VCSandbox, VCContainer, error) {
|
||||
func CreateContainer(ctx context.Context, sandboxID string, containerConfig ContainerConfig) (VCSandbox, VCContainer, error) {
|
||||
span, ctx := trace(ctx, "CreateContainer")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return nil, nil, errNeedSandboxID
|
||||
}
|
||||
@@ -357,7 +412,7 @@ func CreateContainer(sandboxID string, containerConfig ContainerConfig) (VCSandb
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
@@ -374,7 +429,7 @@ func CreateContainer(sandboxID string, containerConfig ContainerConfig) (VCSandb
|
||||
// DeleteContainer is the virtcontainers container deletion entry point.
|
||||
// DeleteContainer deletes a Container from a Sandbox. If the container is running,
|
||||
// it needs to be stopped first.
|
||||
func DeleteContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
func DeleteContainer(ctx context.Context, sandboxID, containerID string) (VCContainer, error) {
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -389,7 +444,7 @@ func DeleteContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -400,7 +455,7 @@ func DeleteContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
|
||||
// StartContainer is the virtcontainers container starting entry point.
|
||||
// StartContainer starts an already created container.
|
||||
func StartContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
func StartContainer(ctx context.Context, sandboxID, containerID string) (VCContainer, error) {
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -415,7 +470,7 @@ func StartContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -431,7 +486,10 @@ func StartContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
|
||||
// StopContainer is the virtcontainers container stopping entry point.
|
||||
// StopContainer stops an already running container.
|
||||
func StopContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
func StopContainer(ctx context.Context, sandboxID, containerID string) (VCContainer, error) {
|
||||
span, ctx := trace(ctx, "StopContainer")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -446,7 +504,7 @@ func StopContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -469,7 +527,10 @@ func StopContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
|
||||
// EnterContainer is the virtcontainers container command execution entry point.
|
||||
// EnterContainer enters an already running container and runs a given command.
|
||||
func EnterContainer(sandboxID, containerID string, cmd Cmd) (VCSandbox, VCContainer, *Process, error) {
|
||||
func EnterContainer(ctx context.Context, sandboxID, containerID string, cmd Cmd) (VCSandbox, VCContainer, *Process, error) {
|
||||
span, ctx := trace(ctx, "EnterContainer")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return nil, nil, nil, errNeedSandboxID
|
||||
}
|
||||
@@ -484,7 +545,7 @@ func EnterContainer(sandboxID, containerID string, cmd Cmd) (VCSandbox, VCContai
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
@@ -500,7 +561,10 @@ func EnterContainer(sandboxID, containerID string, cmd Cmd) (VCSandbox, VCContai
|
||||
|
||||
// StatusContainer is the virtcontainers container status entry point.
|
||||
// StatusContainer returns a detailed container status.
|
||||
func StatusContainer(sandboxID, containerID string) (ContainerStatus, error) {
|
||||
func StatusContainer(ctx context.Context, sandboxID, containerID string) (ContainerStatus, error) {
|
||||
span, ctx := trace(ctx, "StatusContainer")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return ContainerStatus{}, errNeedSandboxID
|
||||
}
|
||||
@@ -514,7 +578,7 @@ func StatusContainer(sandboxID, containerID string) (ContainerStatus, error) {
|
||||
return ContainerStatus{}, err
|
||||
}
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
unlockSandbox(lockFile)
|
||||
return ContainerStatus{}, err
|
||||
@@ -587,7 +651,10 @@ func statusContainer(sandbox *Sandbox, containerID string) (ContainerStatus, err
|
||||
// KillContainer is the virtcontainers entry point to send a signal
|
||||
// to a container running inside a sandbox. If all is true, all processes in
|
||||
// the container will be sent the signal.
|
||||
func KillContainer(sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
func KillContainer(ctx context.Context, sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
span, ctx := trace(ctx, "KillContainer")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return errNeedSandboxID
|
||||
}
|
||||
@@ -602,7 +669,7 @@ func KillContainer(sandboxID, containerID string, signal syscall.Signal, all boo
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -625,19 +692,28 @@ func KillContainer(sandboxID, containerID string, signal syscall.Signal, all boo
|
||||
|
||||
// PauseSandbox is the virtcontainers pausing entry point which pauses an
|
||||
// already running sandbox.
|
||||
func PauseSandbox(sandboxID string) (VCSandbox, error) {
|
||||
return togglePauseSandbox(sandboxID, true)
|
||||
func PauseSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
span, ctx := trace(ctx, "PauseSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
return togglePauseSandbox(ctx, sandboxID, true)
|
||||
}
|
||||
|
||||
// ResumeSandbox is the virtcontainers resuming entry point which resumes
|
||||
// (or unpauses) and already paused sandbox.
|
||||
func ResumeSandbox(sandboxID string) (VCSandbox, error) {
|
||||
return togglePauseSandbox(sandboxID, false)
|
||||
func ResumeSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
span, ctx := trace(ctx, "ResumeSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
return togglePauseSandbox(ctx, sandboxID, false)
|
||||
}
|
||||
|
||||
// ProcessListContainer is the virtcontainers entry point to list
|
||||
// processes running inside a container
|
||||
func ProcessListContainer(sandboxID, containerID string, options ProcessListOptions) (ProcessList, error) {
|
||||
func ProcessListContainer(ctx context.Context, sandboxID, containerID string, options ProcessListOptions) (ProcessList, error) {
|
||||
span, ctx := trace(ctx, "ProcessListContainer")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -652,7 +728,7 @@ func ProcessListContainer(sandboxID, containerID string, options ProcessListOpti
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -669,7 +745,10 @@ func ProcessListContainer(sandboxID, containerID string, options ProcessListOpti
|
||||
|
||||
// UpdateContainer is the virtcontainers entry point to update
|
||||
// container's resources.
|
||||
func UpdateContainer(sandboxID, containerID string, resources specs.LinuxResources) error {
|
||||
func UpdateContainer(ctx context.Context, sandboxID, containerID string, resources specs.LinuxResources) error {
|
||||
span, ctx := trace(ctx, "UpdateContainer")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return errNeedSandboxID
|
||||
}
|
||||
@@ -684,7 +763,7 @@ func UpdateContainer(sandboxID, containerID string, resources specs.LinuxResourc
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -695,7 +774,10 @@ func UpdateContainer(sandboxID, containerID string, resources specs.LinuxResourc
|
||||
|
||||
// StatsContainer is the virtcontainers container stats entry point.
|
||||
// StatsContainer returns a detailed container stats.
|
||||
func StatsContainer(sandboxID, containerID string) (ContainerStats, error) {
|
||||
func StatsContainer(ctx context.Context, sandboxID, containerID string) (ContainerStats, error) {
|
||||
span, ctx := trace(ctx, "StatsContainer")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return ContainerStats{}, errNeedSandboxID
|
||||
}
|
||||
@@ -710,7 +792,7 @@ func StatsContainer(sandboxID, containerID string) (ContainerStats, error) {
|
||||
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return ContainerStats{}, err
|
||||
}
|
||||
@@ -719,7 +801,7 @@ func StatsContainer(sandboxID, containerID string) (ContainerStats, error) {
|
||||
return s.StatsContainer(containerID)
|
||||
}
|
||||
|
||||
func togglePauseContainer(sandboxID, containerID string, pause bool) error {
|
||||
func togglePauseContainer(ctx context.Context, sandboxID, containerID string, pause bool) error {
|
||||
if sandboxID == "" {
|
||||
return errNeedSandboxID
|
||||
}
|
||||
@@ -734,7 +816,7 @@ func togglePauseContainer(sandboxID, containerID string, pause bool) error {
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -754,17 +836,23 @@ func togglePauseContainer(sandboxID, containerID string, pause bool) error {
|
||||
}
|
||||
|
||||
// PauseContainer is the virtcontainers container pause entry point.
|
||||
func PauseContainer(sandboxID, containerID string) error {
|
||||
return togglePauseContainer(sandboxID, containerID, true)
|
||||
func PauseContainer(ctx context.Context, sandboxID, containerID string) error {
|
||||
span, ctx := trace(ctx, "PauseContainer")
|
||||
defer span.Finish()
|
||||
|
||||
return togglePauseContainer(ctx, sandboxID, containerID, true)
|
||||
}
|
||||
|
||||
// ResumeContainer is the virtcontainers container resume entry point.
|
||||
func ResumeContainer(sandboxID, containerID string) error {
|
||||
return togglePauseContainer(sandboxID, containerID, false)
|
||||
func ResumeContainer(ctx context.Context, sandboxID, containerID string) error {
|
||||
span, ctx := trace(ctx, "ResumeContainer")
|
||||
defer span.Finish()
|
||||
|
||||
return togglePauseContainer(ctx, sandboxID, containerID, false)
|
||||
}
|
||||
|
||||
// AddDevice will add a device to sandbox
|
||||
func AddDevice(sandboxID string, info deviceConfig.DeviceInfo) (deviceApi.Device, error) {
|
||||
func AddDevice(ctx context.Context, sandboxID string, info deviceConfig.DeviceInfo) (deviceApi.Device, error) {
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -775,7 +863,7 @@ func AddDevice(sandboxID string, info deviceConfig.DeviceInfo) (deviceApi.Device
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -784,7 +872,7 @@ func AddDevice(sandboxID string, info deviceConfig.DeviceInfo) (deviceApi.Device
|
||||
return s.AddDevice(info)
|
||||
}
|
||||
|
||||
func toggleInterface(sandboxID string, inf *grpc.Interface, add bool) (*grpc.Interface, error) {
|
||||
func toggleInterface(ctx context.Context, sandboxID string, inf *grpc.Interface, add bool) (*grpc.Interface, error) {
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -795,7 +883,7 @@ func toggleInterface(sandboxID string, inf *grpc.Interface, add bool) (*grpc.Int
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -806,17 +894,17 @@ func toggleInterface(sandboxID string, inf *grpc.Interface, add bool) (*grpc.Int
|
||||
}
|
||||
|
||||
// AddInterface is the virtcontainers add interface entry point.
|
||||
func AddInterface(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return toggleInterface(sandboxID, inf, true)
|
||||
func AddInterface(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return toggleInterface(ctx, sandboxID, inf, true)
|
||||
}
|
||||
|
||||
// RemoveInterface is the virtcontainers remove interface entry point.
|
||||
func RemoveInterface(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return toggleInterface(sandboxID, inf, false)
|
||||
func RemoveInterface(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return toggleInterface(ctx, sandboxID, inf, false)
|
||||
}
|
||||
|
||||
// ListInterfaces is the virtcontainers list interfaces entry point.
|
||||
func ListInterfaces(sandboxID string) ([]*grpc.Interface, error) {
|
||||
func ListInterfaces(ctx context.Context, sandboxID string) ([]*grpc.Interface, error) {
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -827,7 +915,7 @@ func ListInterfaces(sandboxID string) ([]*grpc.Interface, error) {
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -836,7 +924,7 @@ func ListInterfaces(sandboxID string) ([]*grpc.Interface, error) {
|
||||
}
|
||||
|
||||
// UpdateRoutes is the virtcontainers update routes entry point.
|
||||
func UpdateRoutes(sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error) {
|
||||
func UpdateRoutes(ctx context.Context, sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error) {
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -847,7 +935,7 @@ func UpdateRoutes(sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error)
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -855,7 +943,7 @@ func UpdateRoutes(sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error)
|
||||
}
|
||||
|
||||
// ListRoutes is the virtcontainers list routes entry point.
|
||||
func ListRoutes(sandboxID string) ([]*grpc.Route, error) {
|
||||
func ListRoutes(ctx context.Context, sandboxID string) ([]*grpc.Route, error) {
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
}
|
||||
@@ -866,7 +954,7 @@ func ListRoutes(sandboxID string) ([]*grpc.Route, error) {
|
||||
}
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,29 +6,59 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// cnm is a network implementation for the CNM plugin.
|
||||
type cnm struct {
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
func cnmLogger() *logrus.Entry {
|
||||
func (n *cnm) Logger() *logrus.Entry {
|
||||
return virtLog.WithField("subsystem", "cnm")
|
||||
}
|
||||
|
||||
func (n *cnm) trace(name string) (opentracing.Span, context.Context) {
|
||||
if n.ctx == nil {
|
||||
n.Logger().WithField("type", "bug").Error("trace called before context set")
|
||||
n.ctx = context.Background()
|
||||
}
|
||||
|
||||
span, ctx := opentracing.StartSpanFromContext(n.ctx, name)
|
||||
|
||||
span.SetTag("subsystem", "network")
|
||||
span.SetTag("type", "cnm")
|
||||
|
||||
return span, ctx
|
||||
}
|
||||
|
||||
// init initializes the network, setting a new network namespace for the CNM network.
|
||||
func (n *cnm) init(config NetworkConfig) (string, bool, error) {
|
||||
func (n *cnm) init(ctx context.Context, config NetworkConfig) (string, bool, error) {
|
||||
// Set context
|
||||
n.ctx = ctx
|
||||
|
||||
span, _ := n.trace("init")
|
||||
defer span.Finish()
|
||||
|
||||
return initNetworkCommon(config)
|
||||
}
|
||||
|
||||
// run runs a callback in the specified network namespace.
|
||||
func (n *cnm) run(networkNSPath string, cb func() error) error {
|
||||
span, _ := n.trace("run")
|
||||
defer span.Finish()
|
||||
|
||||
return runNetworkCommon(networkNSPath, cb)
|
||||
}
|
||||
|
||||
// add adds all needed interfaces inside the network namespace for the CNM network.
|
||||
func (n *cnm) add(sandbox *Sandbox, config NetworkConfig, netNsPath string, netNsCreated bool) (NetworkNamespace, error) {
|
||||
span, _ := n.trace("add")
|
||||
defer span.Finish()
|
||||
|
||||
endpoints, err := createEndpointsFromScan(netNsPath, config)
|
||||
if err != nil {
|
||||
return NetworkNamespace{}, err
|
||||
@@ -50,6 +80,18 @@ func (n *cnm) add(sandbox *Sandbox, config NetworkConfig, netNsPath string, netN
|
||||
// remove network endpoints in the network namespace. It also deletes the network
|
||||
// namespace in case the namespace has been created by us.
|
||||
func (n *cnm) remove(sandbox *Sandbox, networkNS NetworkNamespace, netNsCreated bool) error {
|
||||
// Set the context again.
|
||||
//
|
||||
// This is required since when deleting networks, the init() method is
|
||||
// not called since the network config state is simply read from disk.
|
||||
// However, the context part of that state is not stored fully since
|
||||
// context.Context is an interface type meaning all the trace metadata
|
||||
// stored in the on-disk network config file is missing.
|
||||
n.ctx = sandbox.ctx
|
||||
|
||||
span, _ := n.trace("remove")
|
||||
defer span.Finish()
|
||||
|
||||
if err := removeNetworkCommon(networkNS, netNsCreated); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -17,6 +18,7 @@ import (
|
||||
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/annotations"
|
||||
specs "github.com/opencontainers/runtime-spec/specs-go"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
"golang.org/x/sys/unix"
|
||||
|
||||
@@ -261,6 +263,8 @@ type Container struct {
|
||||
devices []ContainerDevice
|
||||
|
||||
systemMountsInfo SystemMountsInfo
|
||||
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
// ID returns the container identifier string.
|
||||
@@ -276,6 +280,19 @@ func (c *Container) Logger() *logrus.Entry {
|
||||
})
|
||||
}
|
||||
|
||||
func (c *Container) trace(name string) (opentracing.Span, context.Context) {
|
||||
if c.ctx == nil {
|
||||
c.Logger().WithField("type", "bug").Error("trace called before context set")
|
||||
c.ctx = context.Background()
|
||||
}
|
||||
|
||||
span, ctx := opentracing.StartSpanFromContext(c.ctx, name)
|
||||
|
||||
span.SetTag("subsystem", "container")
|
||||
|
||||
return span, ctx
|
||||
}
|
||||
|
||||
// Sandbox returns the sandbox handler related to this container.
|
||||
func (c *Container) Sandbox() VCSandbox {
|
||||
return c.sandbox
|
||||
@@ -468,7 +485,7 @@ func (c *Container) mountSharedDirMounts(hostSharedDir, guestSharedDir string) (
|
||||
filename := fmt.Sprintf("%s-%s-%s", c.id, hex.EncodeToString(randBytes), filepath.Base(m.Destination))
|
||||
mountDest := filepath.Join(hostSharedDir, c.sandbox.id, filename)
|
||||
|
||||
if err := bindMount(m.Source, mountDest, false); err != nil {
|
||||
if err := bindMount(c.ctx, m.Source, mountDest, false); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -503,8 +520,15 @@ func (c *Container) mountSharedDirMounts(hostSharedDir, guestSharedDir string) (
|
||||
}
|
||||
|
||||
func (c *Container) unmountHostMounts() error {
|
||||
var span opentracing.Span
|
||||
span, c.ctx = c.trace("unmountHostMounts")
|
||||
defer span.Finish()
|
||||
|
||||
for _, m := range c.mounts {
|
||||
if m.HostPath != "" {
|
||||
span, _ := c.trace("unmount")
|
||||
span.SetTag("host-path", m.HostPath)
|
||||
|
||||
logger := c.Logger().WithField("host-path", m.HostPath)
|
||||
if err := syscall.Unmount(m.HostPath, 0); err != nil {
|
||||
// Unable to unmount paths could be a really big problem here
|
||||
@@ -520,6 +544,8 @@ func (c *Container) unmountHostMounts() error {
|
||||
logger.WithError(err).Warn("Could not be removed")
|
||||
return err
|
||||
}
|
||||
|
||||
span.Finish()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -528,6 +554,9 @@ func (c *Container) unmountHostMounts() error {
|
||||
|
||||
// newContainer creates a Container structure from a sandbox and a container configuration.
|
||||
func newContainer(sandbox *Sandbox, contConfig ContainerConfig) (*Container, error) {
|
||||
span, _ := sandbox.trace("newContainer")
|
||||
defer span.Finish()
|
||||
|
||||
if contConfig.valid() == false {
|
||||
return &Container{}, fmt.Errorf("Invalid container configuration")
|
||||
}
|
||||
@@ -544,6 +573,7 @@ func newContainer(sandbox *Sandbox, contConfig ContainerConfig) (*Container, err
|
||||
state: State{},
|
||||
process: Process{},
|
||||
mounts: contConfig.Mounts,
|
||||
ctx: sandbox.ctx,
|
||||
}
|
||||
|
||||
state, err := c.sandbox.storage.fetchContainerState(c.sandboxID, c.id)
|
||||
@@ -790,6 +820,9 @@ func (c *Container) start() error {
|
||||
}
|
||||
|
||||
func (c *Container) stop() error {
|
||||
span, _ := c.trace("stop")
|
||||
defer span.Finish()
|
||||
|
||||
// In case the container status has been updated implicitly because
|
||||
// the container process has terminated, it might be possible that
|
||||
// someone try to stop the container, and we don't want to issue an
|
||||
@@ -811,6 +844,9 @@ func (c *Container) stop() error {
|
||||
}
|
||||
|
||||
defer func() {
|
||||
span, _ := c.trace("stopShim")
|
||||
defer span.Finish()
|
||||
|
||||
// If shim is still running something went wrong
|
||||
// Make sure we stop the shim process
|
||||
if running, _ := isShimRunning(c.process.Pid); running {
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
@@ -68,7 +69,7 @@ func Example_createAndStartSandbox() {
|
||||
Containers: []vc.ContainerConfig{container},
|
||||
}
|
||||
|
||||
_, err := vc.RunSandbox(sandboxConfig, nil)
|
||||
_, err := vc.RunSandbox(context.Background(), sandboxConfig, nil)
|
||||
if err != nil {
|
||||
fmt.Printf("Could not run sandbox: %s", err)
|
||||
}
|
||||
|
||||
@@ -5,11 +5,13 @@
|
||||
|
||||
package virtcontainers
|
||||
|
||||
import "context"
|
||||
|
||||
// Factory controls how a new VM is created.
|
||||
type Factory interface {
|
||||
// GetVM gets a new VM from the factory.
|
||||
GetVM(config VMConfig) (*VM, error)
|
||||
GetVM(ctx context.Context, config VMConfig) (*VM, error)
|
||||
|
||||
// CloseFactory closes and cleans up the factory.
|
||||
CloseFactory()
|
||||
CloseFactory(ctx context.Context)
|
||||
}
|
||||
|
||||
@@ -5,7 +5,11 @@
|
||||
|
||||
package base
|
||||
|
||||
import vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
import (
|
||||
"context"
|
||||
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
)
|
||||
|
||||
// FactoryBase is vm factory's internal base factory interfaces.
|
||||
// The difference between FactoryBase and Factory is that the Factory
|
||||
@@ -17,8 +21,8 @@ type FactoryBase interface {
|
||||
Config() vc.VMConfig
|
||||
|
||||
// GetBaseVM returns a paused VM created by the base factory.
|
||||
GetBaseVM() (*vc.VM, error)
|
||||
GetBaseVM(ctx context.Context) (*vc.VM, error)
|
||||
|
||||
// CloseFactory closes the base factory.
|
||||
CloseFactory()
|
||||
CloseFactory(ctx context.Context)
|
||||
}
|
||||
|
||||
13
virtcontainers/factory/cache/cache.go
vendored
13
virtcontainers/factory/cache/cache.go
vendored
@@ -7,6 +7,7 @@
|
||||
package cache
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
@@ -24,7 +25,7 @@ type cache struct {
|
||||
}
|
||||
|
||||
// New creates a new cached vm factory.
|
||||
func New(count uint, b base.FactoryBase) base.FactoryBase {
|
||||
func New(ctx context.Context, count uint, b base.FactoryBase) base.FactoryBase {
|
||||
if count < 1 {
|
||||
return b
|
||||
}
|
||||
@@ -36,10 +37,10 @@ func New(count uint, b base.FactoryBase) base.FactoryBase {
|
||||
c.wg.Add(1)
|
||||
go func() {
|
||||
for {
|
||||
vm, err := b.GetBaseVM()
|
||||
vm, err := b.GetBaseVM(ctx)
|
||||
if err != nil {
|
||||
c.wg.Done()
|
||||
c.CloseFactory()
|
||||
c.CloseFactory(ctx)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -62,7 +63,7 @@ func (c *cache) Config() vc.VMConfig {
|
||||
}
|
||||
|
||||
// GetBaseVM returns a base VM from cache factory's base factory.
|
||||
func (c *cache) GetBaseVM() (*vc.VM, error) {
|
||||
func (c *cache) GetBaseVM(ctx context.Context) (*vc.VM, error) {
|
||||
vm, ok := <-c.cacheCh
|
||||
if ok {
|
||||
return vm, nil
|
||||
@@ -71,13 +72,13 @@ func (c *cache) GetBaseVM() (*vc.VM, error) {
|
||||
}
|
||||
|
||||
// CloseFactory closes the cache factory.
|
||||
func (c *cache) CloseFactory() {
|
||||
func (c *cache) CloseFactory(ctx context.Context) {
|
||||
c.closeOnce.Do(func() {
|
||||
for len(c.closed) < cap(c.closed) { // send sufficient closed signal
|
||||
c.closed <- 0
|
||||
}
|
||||
c.wg.Wait()
|
||||
close(c.cacheCh)
|
||||
c.base.CloseFactory()
|
||||
c.base.CloseFactory(ctx)
|
||||
})
|
||||
}
|
||||
|
||||
9
virtcontainers/factory/cache/cache_test.go
vendored
9
virtcontainers/factory/cache/cache_test.go
vendored
@@ -6,6 +6,7 @@
|
||||
package cache
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
@@ -29,16 +30,18 @@ func TestTemplateFactory(t *testing.T) {
|
||||
HypervisorConfig: hyperConfig,
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
// New
|
||||
f := New(2, direct.New(vmConfig))
|
||||
f := New(ctx, 2, direct.New(ctx, vmConfig))
|
||||
|
||||
// Config
|
||||
assert.Equal(f.Config(), vmConfig)
|
||||
|
||||
// GetBaseVM
|
||||
_, err := f.GetBaseVM()
|
||||
_, err := f.GetBaseVM(ctx)
|
||||
assert.Nil(err)
|
||||
|
||||
// CloseFactory
|
||||
f.CloseFactory()
|
||||
f.CloseFactory(ctx)
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
package direct
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
vc "github.com/kata-containers/runtime/virtcontainers"
|
||||
"github.com/kata-containers/runtime/virtcontainers/factory/base"
|
||||
)
|
||||
@@ -16,7 +18,7 @@ type direct struct {
|
||||
}
|
||||
|
||||
// New returns a new direct vm factory.
|
||||
func New(config vc.VMConfig) base.FactoryBase {
|
||||
func New(ctx context.Context, config vc.VMConfig) base.FactoryBase {
|
||||
return &direct{config}
|
||||
}
|
||||
|
||||
@@ -26,8 +28,8 @@ func (d *direct) Config() vc.VMConfig {
|
||||
}
|
||||
|
||||
// GetBaseVM create a new VM directly.
|
||||
func (d *direct) GetBaseVM() (*vc.VM, error) {
|
||||
vm, err := vc.NewVM(d.config)
|
||||
func (d *direct) GetBaseVM(ctx context.Context) (*vc.VM, error) {
|
||||
vm, err := vc.NewVM(ctx, d.config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -42,5 +44,5 @@ func (d *direct) GetBaseVM() (*vc.VM, error) {
|
||||
}
|
||||
|
||||
// CloseFactory closes the direct vm factory.
|
||||
func (d *direct) CloseFactory() {
|
||||
func (d *direct) CloseFactory(ctx context.Context) {
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package direct
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
@@ -28,16 +29,18 @@ func TestTemplateFactory(t *testing.T) {
|
||||
HypervisorConfig: hyperConfig,
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
// New
|
||||
f := New(vmConfig)
|
||||
f := New(ctx, vmConfig)
|
||||
|
||||
// Config
|
||||
assert.Equal(f.Config(), vmConfig)
|
||||
|
||||
// GetBaseVM
|
||||
_, err := f.GetBaseVM()
|
||||
_, err := f.GetBaseVM(ctx)
|
||||
assert.Nil(err)
|
||||
|
||||
// CloseFactory
|
||||
f.CloseFactory()
|
||||
f.CloseFactory(ctx)
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package factory
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
@@ -14,6 +15,7 @@ import (
|
||||
"github.com/kata-containers/runtime/virtcontainers/factory/cache"
|
||||
"github.com/kata-containers/runtime/virtcontainers/factory/direct"
|
||||
"github.com/kata-containers/runtime/virtcontainers/factory/template"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
@@ -35,8 +37,19 @@ type factory struct {
|
||||
base base.FactoryBase
|
||||
}
|
||||
|
||||
func trace(parent context.Context, name string) (opentracing.Span, context.Context) {
|
||||
span, ctx := opentracing.StartSpanFromContext(parent, name)
|
||||
|
||||
span.SetTag("subsystem", "factory")
|
||||
|
||||
return span, ctx
|
||||
}
|
||||
|
||||
// NewFactory returns a working factory.
|
||||
func NewFactory(config Config, fetchOnly bool) (vc.Factory, error) {
|
||||
func NewFactory(ctx context.Context, config Config, fetchOnly bool) (vc.Factory, error) {
|
||||
span, _ := trace(ctx, "NewFactory")
|
||||
defer span.Finish()
|
||||
|
||||
err := config.validate()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -54,21 +67,21 @@ func NewFactory(config Config, fetchOnly bool) (vc.Factory, error) {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
b = template.New(config.VMConfig)
|
||||
b = template.New(ctx, config.VMConfig)
|
||||
}
|
||||
} else {
|
||||
b = direct.New(config.VMConfig)
|
||||
b = direct.New(ctx, config.VMConfig)
|
||||
}
|
||||
|
||||
if config.Cache > 0 {
|
||||
b = cache.New(config.Cache, b)
|
||||
b = cache.New(ctx, config.Cache, b)
|
||||
}
|
||||
|
||||
return &factory{b}, nil
|
||||
}
|
||||
|
||||
// SetLogger sets the logger for the factory.
|
||||
func SetLogger(logger logrus.FieldLogger) {
|
||||
func SetLogger(ctx context.Context, logger logrus.FieldLogger) {
|
||||
fields := logrus.Fields{
|
||||
"source": "virtcontainers",
|
||||
}
|
||||
@@ -117,7 +130,10 @@ func (f *factory) checkConfig(config vc.VMConfig) error {
|
||||
}
|
||||
|
||||
// GetVM returns a working blank VM created by the factory.
|
||||
func (f *factory) GetVM(config vc.VMConfig) (*vc.VM, error) {
|
||||
func (f *factory) GetVM(ctx context.Context, config vc.VMConfig) (*vc.VM, error) {
|
||||
span, _ := trace(ctx, "GetVM")
|
||||
defer span.Finish()
|
||||
|
||||
hypervisorConfig := config.HypervisorConfig
|
||||
err := config.Valid()
|
||||
if err != nil {
|
||||
@@ -128,11 +144,11 @@ func (f *factory) GetVM(config vc.VMConfig) (*vc.VM, error) {
|
||||
err = f.checkConfig(config)
|
||||
if err != nil {
|
||||
f.log().WithError(err).Info("fallback to direct factory vm")
|
||||
return direct.New(config).GetBaseVM()
|
||||
return direct.New(ctx, config).GetBaseVM(ctx)
|
||||
}
|
||||
|
||||
f.log().Info("get base VM")
|
||||
vm, err := f.base.GetBaseVM()
|
||||
vm, err := f.base.GetBaseVM(ctx)
|
||||
if err != nil {
|
||||
f.log().WithError(err).Error("failed to get base VM")
|
||||
return nil, err
|
||||
@@ -186,6 +202,6 @@ func (f *factory) GetVM(config vc.VMConfig) (*vc.VM, error) {
|
||||
}
|
||||
|
||||
// CloseFactory closes the factory.
|
||||
func (f *factory) CloseFactory() {
|
||||
f.base.CloseFactory()
|
||||
func (f *factory) CloseFactory(ctx context.Context) {
|
||||
f.base.CloseFactory(ctx)
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package factory
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
@@ -20,9 +21,10 @@ func TestNewFactory(t *testing.T) {
|
||||
|
||||
assert := assert.New(t)
|
||||
|
||||
_, err := NewFactory(config, true)
|
||||
ctx := context.Background()
|
||||
_, err := NewFactory(ctx, config, true)
|
||||
assert.Error(err)
|
||||
_, err = NewFactory(config, false)
|
||||
_, err = NewFactory(ctx, config, false)
|
||||
assert.Error(err)
|
||||
|
||||
config.VMConfig = vc.VMConfig{
|
||||
@@ -30,7 +32,7 @@ func TestNewFactory(t *testing.T) {
|
||||
AgentType: vc.NoopAgentType,
|
||||
}
|
||||
|
||||
_, err = NewFactory(config, false)
|
||||
_, err = NewFactory(ctx, config, false)
|
||||
assert.Error(err)
|
||||
|
||||
testDir, _ := ioutil.TempDir("", "vmfactory-tmp-")
|
||||
@@ -41,29 +43,29 @@ func TestNewFactory(t *testing.T) {
|
||||
}
|
||||
|
||||
// direct
|
||||
_, err = NewFactory(config, false)
|
||||
_, err = NewFactory(ctx, config, false)
|
||||
assert.Nil(err)
|
||||
_, err = NewFactory(config, true)
|
||||
_, err = NewFactory(ctx, config, true)
|
||||
assert.Nil(err)
|
||||
|
||||
// template
|
||||
config.Template = true
|
||||
_, err = NewFactory(config, false)
|
||||
_, err = NewFactory(ctx, config, false)
|
||||
assert.Nil(err)
|
||||
_, err = NewFactory(config, true)
|
||||
_, err = NewFactory(ctx, config, true)
|
||||
assert.Error(err)
|
||||
|
||||
// Cache
|
||||
config.Cache = 10
|
||||
_, err = NewFactory(config, false)
|
||||
_, err = NewFactory(ctx, config, false)
|
||||
assert.Nil(err)
|
||||
_, err = NewFactory(config, true)
|
||||
_, err = NewFactory(ctx, config, true)
|
||||
assert.Error(err)
|
||||
|
||||
config.Template = false
|
||||
_, err = NewFactory(config, false)
|
||||
_, err = NewFactory(ctx, config, false)
|
||||
assert.Nil(err)
|
||||
_, err = NewFactory(config, true)
|
||||
_, err = NewFactory(ctx, config, true)
|
||||
assert.Error(err)
|
||||
}
|
||||
|
||||
@@ -72,14 +74,15 @@ func TestFactorySetLogger(t *testing.T) {
|
||||
|
||||
testLog := logrus.WithFields(logrus.Fields{"testfield": "foobar"})
|
||||
testLog.Level = logrus.DebugLevel
|
||||
SetLogger(testLog)
|
||||
SetLogger(context.Background(), testLog)
|
||||
|
||||
var config Config
|
||||
config.VMConfig.HypervisorConfig = vc.HypervisorConfig{
|
||||
KernelPath: "foo",
|
||||
ImagePath: "bar",
|
||||
}
|
||||
vf, err := NewFactory(config, false)
|
||||
ctx := context.Background()
|
||||
vf, err := NewFactory(ctx, config, false)
|
||||
assert.Nil(err)
|
||||
|
||||
f, ok := vf.(*factory)
|
||||
@@ -166,66 +169,68 @@ func TestFactoryGetVM(t *testing.T) {
|
||||
HypervisorConfig: hyperConfig,
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
// direct factory
|
||||
f, err := NewFactory(Config{VMConfig: vmConfig}, false)
|
||||
f, err := NewFactory(ctx, Config{VMConfig: vmConfig}, false)
|
||||
assert.Nil(err)
|
||||
|
||||
_, err = f.GetVM(vmConfig)
|
||||
_, err = f.GetVM(ctx, vmConfig)
|
||||
assert.Nil(err)
|
||||
|
||||
f.CloseFactory()
|
||||
f.CloseFactory(ctx)
|
||||
|
||||
// template factory
|
||||
f, err = NewFactory(Config{Template: true, VMConfig: vmConfig}, false)
|
||||
f, err = NewFactory(ctx, Config{Template: true, VMConfig: vmConfig}, false)
|
||||
assert.Nil(err)
|
||||
|
||||
_, err = f.GetVM(vmConfig)
|
||||
_, err = f.GetVM(ctx, vmConfig)
|
||||
assert.Nil(err)
|
||||
|
||||
f.CloseFactory()
|
||||
f.CloseFactory(ctx)
|
||||
|
||||
// fetch template factory
|
||||
f, err = NewFactory(Config{Template: true, VMConfig: vmConfig}, false)
|
||||
f, err = NewFactory(ctx, Config{Template: true, VMConfig: vmConfig}, false)
|
||||
assert.Nil(err)
|
||||
|
||||
_, err = NewFactory(Config{Template: true, VMConfig: vmConfig}, true)
|
||||
_, err = NewFactory(ctx, Config{Template: true, VMConfig: vmConfig}, true)
|
||||
assert.Error(err)
|
||||
|
||||
_, err = f.GetVM(vmConfig)
|
||||
_, err = f.GetVM(ctx, vmConfig)
|
||||
assert.Nil(err)
|
||||
|
||||
f.CloseFactory()
|
||||
f.CloseFactory(ctx)
|
||||
|
||||
// cache factory over direct factory
|
||||
f, err = NewFactory(Config{Cache: 2, VMConfig: vmConfig}, false)
|
||||
f, err = NewFactory(ctx, Config{Cache: 2, VMConfig: vmConfig}, false)
|
||||
assert.Nil(err)
|
||||
|
||||
_, err = f.GetVM(vmConfig)
|
||||
_, err = f.GetVM(ctx, vmConfig)
|
||||
assert.Nil(err)
|
||||
|
||||
f.CloseFactory()
|
||||
f.CloseFactory(ctx)
|
||||
|
||||
// cache factory over template factory
|
||||
f, err = NewFactory(Config{Template: true, Cache: 2, VMConfig: vmConfig}, false)
|
||||
f, err = NewFactory(ctx, Config{Template: true, Cache: 2, VMConfig: vmConfig}, false)
|
||||
assert.Nil(err)
|
||||
|
||||
_, err = f.GetVM(vmConfig)
|
||||
_, err = f.GetVM(ctx, vmConfig)
|
||||
assert.Nil(err)
|
||||
|
||||
// CPU hotplug
|
||||
vmConfig.HypervisorConfig.DefaultVCPUs++
|
||||
_, err = f.GetVM(vmConfig)
|
||||
_, err = f.GetVM(ctx, vmConfig)
|
||||
assert.Nil(err)
|
||||
|
||||
// Memory hotplug
|
||||
vmConfig.HypervisorConfig.DefaultMemSz += 128
|
||||
_, err = f.GetVM(vmConfig)
|
||||
_, err = f.GetVM(ctx, vmConfig)
|
||||
assert.Nil(err)
|
||||
|
||||
// checkConfig fall back
|
||||
vmConfig.HypervisorConfig.Mlock = true
|
||||
_, err = f.GetVM(vmConfig)
|
||||
_, err = f.GetVM(ctx, vmConfig)
|
||||
assert.Nil(err)
|
||||
|
||||
f.CloseFactory()
|
||||
f.CloseFactory(ctx)
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
package template
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"syscall"
|
||||
@@ -37,20 +38,20 @@ func Fetch(config vc.VMConfig) (base.FactoryBase, error) {
|
||||
}
|
||||
|
||||
// New creates a new VM template factory.
|
||||
func New(config vc.VMConfig) base.FactoryBase {
|
||||
func New(ctx context.Context, config vc.VMConfig) base.FactoryBase {
|
||||
statePath := vc.RunVMStoragePath + "/template"
|
||||
t := &template{statePath, config}
|
||||
|
||||
err := t.prepareTemplateFiles()
|
||||
if err != nil {
|
||||
// fallback to direct factory if template is not supported.
|
||||
return direct.New(config)
|
||||
return direct.New(ctx, config)
|
||||
}
|
||||
|
||||
err = t.createTemplateVM()
|
||||
err = t.createTemplateVM(ctx)
|
||||
if err != nil {
|
||||
// fallback to direct factory if template is not supported.
|
||||
return direct.New(config)
|
||||
return direct.New(ctx, config)
|
||||
}
|
||||
|
||||
return t
|
||||
@@ -62,12 +63,12 @@ func (t *template) Config() vc.VMConfig {
|
||||
}
|
||||
|
||||
// GetBaseVM creates a new paused VM from the template VM.
|
||||
func (t *template) GetBaseVM() (*vc.VM, error) {
|
||||
return t.createFromTemplateVM()
|
||||
func (t *template) GetBaseVM(ctx context.Context) (*vc.VM, error) {
|
||||
return t.createFromTemplateVM(ctx)
|
||||
}
|
||||
|
||||
// CloseFactory cleans up the template VM.
|
||||
func (t *template) CloseFactory() {
|
||||
func (t *template) CloseFactory(ctx context.Context) {
|
||||
syscall.Unmount(t.statePath, 0)
|
||||
os.RemoveAll(t.statePath)
|
||||
}
|
||||
@@ -92,7 +93,7 @@ func (t *template) prepareTemplateFiles() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *template) createTemplateVM() error {
|
||||
func (t *template) createTemplateVM(ctx context.Context) error {
|
||||
// create the template vm
|
||||
config := t.config
|
||||
config.HypervisorConfig.BootToBeTemplate = true
|
||||
@@ -100,7 +101,7 @@ func (t *template) createTemplateVM() error {
|
||||
config.HypervisorConfig.MemoryPath = t.statePath + "/memory"
|
||||
config.HypervisorConfig.DevicesStatePath = t.statePath + "/state"
|
||||
|
||||
vm, err := vc.NewVM(config)
|
||||
vm, err := vc.NewVM(ctx, config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -122,14 +123,14 @@ func (t *template) createTemplateVM() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *template) createFromTemplateVM() (*vc.VM, error) {
|
||||
func (t *template) createFromTemplateVM(ctx context.Context) (*vc.VM, error) {
|
||||
config := t.config
|
||||
config.HypervisorConfig.BootToBeTemplate = false
|
||||
config.HypervisorConfig.BootFromTemplate = true
|
||||
config.HypervisorConfig.MemoryPath = t.statePath + "/memory"
|
||||
config.HypervisorConfig.DevicesStatePath = t.statePath + "/state"
|
||||
|
||||
return vc.NewVM(config)
|
||||
return vc.NewVM(ctx, config)
|
||||
}
|
||||
|
||||
func (t *template) checkTemplateVM() error {
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package template
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
@@ -29,14 +30,16 @@ func TestTemplateFactory(t *testing.T) {
|
||||
HypervisorConfig: hyperConfig,
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
// New
|
||||
f := New(vmConfig)
|
||||
f := New(ctx, vmConfig)
|
||||
|
||||
// Config
|
||||
assert.Equal(f.Config(), vmConfig)
|
||||
|
||||
// GetBaseVM
|
||||
_, err := f.GetBaseVM()
|
||||
_, err := f.GetBaseVM(ctx)
|
||||
assert.Nil(err)
|
||||
|
||||
// Fetch
|
||||
@@ -58,13 +61,13 @@ func TestTemplateFactory(t *testing.T) {
|
||||
err = tt.checkTemplateVM()
|
||||
assert.Nil(err)
|
||||
|
||||
err = tt.createTemplateVM()
|
||||
err = tt.createTemplateVM(ctx)
|
||||
assert.Nil(err)
|
||||
|
||||
_, err = tt.GetBaseVM()
|
||||
_, err = tt.GetBaseVM(ctx)
|
||||
assert.Nil(err)
|
||||
|
||||
// CloseFactory
|
||||
f.CloseFactory()
|
||||
tt.CloseFactory()
|
||||
f.CloseFactory(ctx)
|
||||
tt.CloseFactory(ctx)
|
||||
}
|
||||
|
||||
@@ -6,12 +6,14 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/kata-containers/runtime/virtcontainers/device/api"
|
||||
@@ -115,7 +117,7 @@ var RunVMStoragePath = filepath.Join("/run", storagePathSuffix, vmPathSuffix)
|
||||
// The default resource storage implementation is filesystem.
|
||||
type resourceStorage interface {
|
||||
// Create all resources for a sandbox
|
||||
createAllResources(sandbox *Sandbox) error
|
||||
createAllResources(ctx context.Context, sandbox *Sandbox) error
|
||||
|
||||
// Resources URIs functions return both the URI
|
||||
// for the actual resource and the URI base.
|
||||
@@ -155,14 +157,37 @@ type resourceStorage interface {
|
||||
|
||||
// filesystem is a resourceStorage interface implementation for a local filesystem.
|
||||
type filesystem struct {
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
// Logger returns a logrus logger appropriate for logging filesystem messages
|
||||
func (fs *filesystem) Logger() *logrus.Entry {
|
||||
return virtLog.WithField("subsystem", "filesystem")
|
||||
return virtLog.WithFields(logrus.Fields{
|
||||
"subsystem": "storage",
|
||||
"type": "filesystem",
|
||||
})
|
||||
}
|
||||
|
||||
func (fs *filesystem) createAllResources(sandbox *Sandbox) (err error) {
|
||||
func (fs *filesystem) trace(name string) (opentracing.Span, context.Context) {
|
||||
if fs.ctx == nil {
|
||||
fs.Logger().WithField("type", "bug").Error("trace called before context set")
|
||||
fs.ctx = context.Background()
|
||||
}
|
||||
|
||||
span, ctx := opentracing.StartSpanFromContext(fs.ctx, name)
|
||||
|
||||
span.SetTag("subsystem", "storage")
|
||||
span.SetTag("type", "filesystem")
|
||||
|
||||
return span, ctx
|
||||
}
|
||||
|
||||
func (fs *filesystem) createAllResources(ctx context.Context, sandbox *Sandbox) (err error) {
|
||||
fs.ctx = ctx
|
||||
|
||||
span, _ := fs.trace("createAllResources")
|
||||
defer span.Finish()
|
||||
|
||||
for _, resource := range []sandboxResource{stateFileType, configFileType} {
|
||||
_, path, _ := fs.sandboxURI(sandbox.id, resource)
|
||||
err = os.MkdirAll(path, dirMode)
|
||||
@@ -389,6 +414,33 @@ func resourceNeedsContainerID(sandboxSpecific bool, resource sandboxResource) bo
|
||||
}
|
||||
}
|
||||
|
||||
func resourceName(resource sandboxResource) string {
|
||||
switch resource {
|
||||
case agentFileType:
|
||||
return "agentFileType"
|
||||
case configFileType:
|
||||
return "configFileType"
|
||||
case devicesFileType:
|
||||
return "devicesFileType"
|
||||
case devicesIDFileType:
|
||||
return "devicesIDFileType"
|
||||
case hypervisorFileType:
|
||||
return "hypervisorFileType"
|
||||
case lockFileType:
|
||||
return "lockFileType"
|
||||
case mountsFileType:
|
||||
return "mountsFileType"
|
||||
case networkFileType:
|
||||
return "networkFileType"
|
||||
case processFileType:
|
||||
return "processFileType"
|
||||
case stateFileType:
|
||||
return "stateFileType"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
func resourceDir(sandboxSpecific bool, sandboxID, containerID string, resource sandboxResource) (string, error) {
|
||||
if sandboxID == "" {
|
||||
return "", errNeedSandboxID
|
||||
@@ -635,6 +687,17 @@ func (fs *filesystem) storeResource(sandboxSpecific bool, sandboxID, containerID
|
||||
}
|
||||
|
||||
func (fs *filesystem) fetchResource(sandboxSpecific bool, sandboxID, containerID string, resource sandboxResource, data interface{}) error {
|
||||
var span opentracing.Span
|
||||
|
||||
if fs.ctx != nil {
|
||||
span, _ = fs.trace("fetchResource")
|
||||
defer span.Finish()
|
||||
|
||||
span.SetTag("sandbox", sandboxID)
|
||||
span.SetTag("container", containerID)
|
||||
span.SetTag("resource", resourceName(resource))
|
||||
}
|
||||
|
||||
if err := fs.commonResourceChecks(sandboxSpecific, sandboxID, containerID, resource); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -715,6 +778,9 @@ func (fs *filesystem) storeHypervisorState(sandboxID string, state interface{})
|
||||
}
|
||||
|
||||
func (fs *filesystem) storeAgentState(sandboxID string, state interface{}) error {
|
||||
span, _ := fs.trace("storeAgentState")
|
||||
defer span.Finish()
|
||||
|
||||
agentFile, _, err := fs.resourceURI(true, sandboxID, "", agentFileType)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
@@ -55,7 +56,7 @@ func TestFilesystemCreateAllResourcesSuccessful(t *testing.T) {
|
||||
os.RemoveAll(runPath)
|
||||
}
|
||||
|
||||
err := fs.createAllResources(sandbox)
|
||||
err := fs.createAllResources(context.Background(), sandbox)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -102,7 +103,7 @@ func TestFilesystemCreateAllResourcesFailingSandboxIDEmpty(t *testing.T) {
|
||||
|
||||
sandbox := &Sandbox{}
|
||||
|
||||
err := fs.createAllResources(sandbox)
|
||||
err := fs.createAllResources(context.Background(), sandbox)
|
||||
if err == nil {
|
||||
t.Fatal()
|
||||
}
|
||||
@@ -120,7 +121,7 @@ func TestFilesystemCreateAllResourcesFailingContainerIDEmpty(t *testing.T) {
|
||||
containers: containers,
|
||||
}
|
||||
|
||||
err := fs.createAllResources(sandbox)
|
||||
err := fs.createAllResources(context.Background(), sandbox)
|
||||
if err == nil {
|
||||
t.Fatal()
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
@@ -24,6 +25,8 @@ var virtcLog *logrus.Entry
|
||||
var listFormat = "%s\t%s\t%s\t%s\n"
|
||||
var statusFormat = "%s\t%s\n"
|
||||
|
||||
var ctx = context.Background()
|
||||
|
||||
var (
|
||||
errNeedContainerID = errors.New("Container ID cannot be empty")
|
||||
errNeedSandboxID = errors.New("Sandbox ID cannot be empty")
|
||||
@@ -322,7 +325,7 @@ func runSandbox(context *cli.Context) error {
|
||||
return fmt.Errorf("Could not build sandbox config: %s", err)
|
||||
}
|
||||
|
||||
_, err = vc.RunSandbox(sandboxConfig, nil)
|
||||
_, err = vc.RunSandbox(ctx, sandboxConfig, nil)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not run sandbox: %s", err)
|
||||
}
|
||||
@@ -336,7 +339,7 @@ func createSandbox(context *cli.Context) error {
|
||||
return fmt.Errorf("Could not build sandbox config: %s", err)
|
||||
}
|
||||
|
||||
p, err := vc.CreateSandbox(sandboxConfig, nil)
|
||||
p, err := vc.CreateSandbox(ctx, sandboxConfig, nil)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not create sandbox: %s", err)
|
||||
}
|
||||
@@ -363,7 +366,7 @@ func checkContainerArgs(context *cli.Context, f func(context *cli.Context) error
|
||||
}
|
||||
|
||||
func deleteSandbox(context *cli.Context) error {
|
||||
p, err := vc.DeleteSandbox(context.String("id"))
|
||||
p, err := vc.DeleteSandbox(ctx, context.String("id"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not delete sandbox: %s", err)
|
||||
}
|
||||
@@ -374,7 +377,7 @@ func deleteSandbox(context *cli.Context) error {
|
||||
}
|
||||
|
||||
func startSandbox(context *cli.Context) error {
|
||||
p, err := vc.StartSandbox(context.String("id"))
|
||||
p, err := vc.StartSandbox(ctx, context.String("id"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not start sandbox: %s", err)
|
||||
}
|
||||
@@ -385,7 +388,7 @@ func startSandbox(context *cli.Context) error {
|
||||
}
|
||||
|
||||
func stopSandbox(context *cli.Context) error {
|
||||
p, err := vc.StopSandbox(context.String("id"))
|
||||
p, err := vc.StopSandbox(ctx, context.String("id"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not stop sandbox: %s", err)
|
||||
}
|
||||
@@ -396,7 +399,7 @@ func stopSandbox(context *cli.Context) error {
|
||||
}
|
||||
|
||||
func pauseSandbox(context *cli.Context) error {
|
||||
p, err := vc.PauseSandbox(context.String("id"))
|
||||
p, err := vc.PauseSandbox(ctx, context.String("id"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not pause sandbox: %s", err)
|
||||
}
|
||||
@@ -407,7 +410,7 @@ func pauseSandbox(context *cli.Context) error {
|
||||
}
|
||||
|
||||
func resumeSandbox(context *cli.Context) error {
|
||||
p, err := vc.ResumeSandbox(context.String("id"))
|
||||
p, err := vc.ResumeSandbox(ctx, context.String("id"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not resume sandbox: %s", err)
|
||||
}
|
||||
@@ -418,7 +421,7 @@ func resumeSandbox(context *cli.Context) error {
|
||||
}
|
||||
|
||||
func listSandboxes(context *cli.Context) error {
|
||||
sandboxStatusList, err := vc.ListSandbox()
|
||||
sandboxStatusList, err := vc.ListSandbox(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not list sandbox: %s", err)
|
||||
}
|
||||
@@ -437,7 +440,7 @@ func listSandboxes(context *cli.Context) error {
|
||||
}
|
||||
|
||||
func statusSandbox(context *cli.Context) error {
|
||||
sandboxStatus, err := vc.StatusSandbox(context.String("id"))
|
||||
sandboxStatus, err := vc.StatusSandbox(ctx, context.String("id"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not get sandbox status: %s", err)
|
||||
}
|
||||
@@ -610,7 +613,7 @@ func createContainer(context *cli.Context) error {
|
||||
Cmd: cmd,
|
||||
}
|
||||
|
||||
_, c, err := vc.CreateContainer(context.String("sandbox-id"), containerConfig)
|
||||
_, c, err := vc.CreateContainer(ctx, context.String("sandbox-id"), containerConfig)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not create container: %s", err)
|
||||
}
|
||||
@@ -621,7 +624,7 @@ func createContainer(context *cli.Context) error {
|
||||
}
|
||||
|
||||
func deleteContainer(context *cli.Context) error {
|
||||
c, err := vc.DeleteContainer(context.String("sandbox-id"), context.String("id"))
|
||||
c, err := vc.DeleteContainer(ctx, context.String("sandbox-id"), context.String("id"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not delete container: %s", err)
|
||||
}
|
||||
@@ -632,7 +635,7 @@ func deleteContainer(context *cli.Context) error {
|
||||
}
|
||||
|
||||
func startContainer(context *cli.Context) error {
|
||||
c, err := vc.StartContainer(context.String("sandbox-id"), context.String("id"))
|
||||
c, err := vc.StartContainer(ctx, context.String("sandbox-id"), context.String("id"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not start container: %s", err)
|
||||
}
|
||||
@@ -643,7 +646,7 @@ func startContainer(context *cli.Context) error {
|
||||
}
|
||||
|
||||
func stopContainer(context *cli.Context) error {
|
||||
c, err := vc.StopContainer(context.String("sandbox-id"), context.String("id"))
|
||||
c, err := vc.StopContainer(ctx, context.String("sandbox-id"), context.String("id"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not stop container: %s", err)
|
||||
}
|
||||
@@ -676,7 +679,7 @@ func enterContainer(context *cli.Context) error {
|
||||
Console: console,
|
||||
}
|
||||
|
||||
_, c, _, err := vc.EnterContainer(context.String("sandbox-id"), context.String("id"), cmd)
|
||||
_, c, _, err := vc.EnterContainer(ctx, context.String("sandbox-id"), context.String("id"), cmd)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not enter container: %s", err)
|
||||
}
|
||||
@@ -687,7 +690,7 @@ func enterContainer(context *cli.Context) error {
|
||||
}
|
||||
|
||||
func statusContainer(context *cli.Context) error {
|
||||
contStatus, err := vc.StatusContainer(context.String("sandbox-id"), context.String("id"))
|
||||
contStatus, err := vc.StatusContainer(ctx, context.String("sandbox-id"), context.String("id"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not get container status: %s", err)
|
||||
}
|
||||
@@ -926,7 +929,7 @@ func main() {
|
||||
}
|
||||
|
||||
// Set virtcontainers logger.
|
||||
vc.SetLogger(virtcLog)
|
||||
vc.SetLogger(ctx, virtcLog)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -7,15 +7,19 @@ package virtcontainers
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
vcAnnotations "github.com/kata-containers/runtime/virtcontainers/pkg/annotations"
|
||||
specs "github.com/opencontainers/runtime-spec/specs-go"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/opentracing/opentracing-go/log"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
@@ -48,7 +52,22 @@ func buildHookState(processID int, s *Sandbox) specs.State {
|
||||
}
|
||||
}
|
||||
|
||||
func (h *Hook) trace(ctx context.Context, name string) (opentracing.Span, context.Context) {
|
||||
return traceWithSubsys(ctx, "hook", name)
|
||||
}
|
||||
|
||||
func (h *Hooks) trace(ctx context.Context, name string) (opentracing.Span, context.Context) {
|
||||
return traceWithSubsys(ctx, "hooks", name)
|
||||
}
|
||||
|
||||
func (h *Hook) runHook(s *Sandbox) error {
|
||||
span, _ := h.trace(s.ctx, "runHook")
|
||||
defer span.Finish()
|
||||
|
||||
span.LogFields(
|
||||
log.String("hook-name", h.Path),
|
||||
log.String("hook-args", strings.Join(h.Args, " ")))
|
||||
|
||||
state := buildHookState(os.Getpid(), s)
|
||||
stateJSON, err := json.Marshal(state)
|
||||
if err != nil {
|
||||
@@ -100,6 +119,9 @@ func (h *Hook) runHook(s *Sandbox) error {
|
||||
}
|
||||
|
||||
func (h *Hooks) preStartHooks(s *Sandbox) error {
|
||||
span, _ := h.trace(s.ctx, "preStartHooks")
|
||||
defer span.Finish()
|
||||
|
||||
if len(h.PreStartHooks) == 0 {
|
||||
return nil
|
||||
}
|
||||
@@ -120,6 +142,9 @@ func (h *Hooks) preStartHooks(s *Sandbox) error {
|
||||
}
|
||||
|
||||
func (h *Hooks) postStartHooks(s *Sandbox) error {
|
||||
span, _ := h.trace(s.ctx, "postStartHooks")
|
||||
defer span.Finish()
|
||||
|
||||
if len(h.PostStartHooks) == 0 {
|
||||
return nil
|
||||
}
|
||||
@@ -140,6 +165,9 @@ func (h *Hooks) postStartHooks(s *Sandbox) error {
|
||||
}
|
||||
|
||||
func (h *Hooks) postStopHooks(s *Sandbox) error {
|
||||
span, _ := h.trace(s.ctx, "postStopHooks")
|
||||
defer span.Finish()
|
||||
|
||||
if len(h.PostStopHooks) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -90,6 +91,7 @@ func createTestSandbox() *Sandbox {
|
||||
annotationsLock: &sync.RWMutex{},
|
||||
config: c,
|
||||
id: testSandboxID,
|
||||
ctx: context.Background(),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/url"
|
||||
@@ -82,6 +83,8 @@ type hyper struct {
|
||||
state HyperAgentState
|
||||
|
||||
sockets []Socket
|
||||
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
type hyperstartProxyCmd struct {
|
||||
@@ -258,7 +261,10 @@ func fsMapFromDevices(c *Container) ([]*hyperstart.FsmapDescriptor, error) {
|
||||
}
|
||||
|
||||
// init is the agent initialization implementation for hyperstart.
|
||||
func (h *hyper) init(sandbox *Sandbox, config interface{}) (err error) {
|
||||
func (h *hyper) init(ctx context.Context, sandbox *Sandbox, config interface{}) (err error) {
|
||||
// save
|
||||
h.ctx = ctx
|
||||
|
||||
switch c := config.(type) {
|
||||
case HyperConfig:
|
||||
// Create agent sockets from paths provided through
|
||||
@@ -503,8 +509,8 @@ func (h *hyper) startOneContainer(sandbox *Sandbox, c *Container) error {
|
||||
container.Fstype = c.state.Fstype
|
||||
} else {
|
||||
|
||||
if err := bindMountContainerRootfs(defaultSharedDir, sandbox.id, c.id, c.rootFs, false); err != nil {
|
||||
bindUnmountAllRootfs(defaultSharedDir, sandbox)
|
||||
if err := bindMountContainerRootfs(c.ctx, defaultSharedDir, sandbox.id, c.id, c.rootFs, false); err != nil {
|
||||
bindUnmountAllRootfs(c.ctx, defaultSharedDir, sandbox)
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -514,7 +520,7 @@ func (h *hyper) startOneContainer(sandbox *Sandbox, c *Container) error {
|
||||
// Handle container mounts
|
||||
newMounts, err := c.mountSharedDirMounts(defaultSharedDir, "")
|
||||
if err != nil {
|
||||
bindUnmountAllRootfs(defaultSharedDir, sandbox)
|
||||
bindUnmountAllRootfs(c.ctx, defaultSharedDir, sandbox)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -599,7 +605,7 @@ func (h *hyper) stopOneContainer(sandboxID string, c Container) error {
|
||||
}
|
||||
|
||||
if c.state.Fstype == "" {
|
||||
if err := bindUnmountContainerRootfs(defaultSharedDir, sandboxID, c.id); err != nil {
|
||||
if err := bindUnmountContainerRootfs(c.ctx, defaultSharedDir, sandboxID, c.id); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ package virtcontainers
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"runtime"
|
||||
@@ -545,7 +546,8 @@ func RunningOnVMM(cpuInfoPath string) (bool, error) {
|
||||
// hypervisor is the virtcontainers hypervisor interface.
|
||||
// The default hypervisor implementation is Qemu.
|
||||
type hypervisor interface {
|
||||
init(id string, hypervisorConfig *HypervisorConfig, vmConfig Resources, storage resourceStorage) error
|
||||
init(ctx context.Context, id string, hypervisorConfig *HypervisorConfig, vmConfig Resources, storage resourceStorage) error
|
||||
|
||||
createSandbox() error
|
||||
startSandbox() error
|
||||
waitSandbox(timeout int) error
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"syscall"
|
||||
|
||||
"github.com/kata-containers/agent/protocols/grpc"
|
||||
@@ -25,152 +26,152 @@ type VCImpl struct {
|
||||
}
|
||||
|
||||
// SetLogger implements the VC function of the same name.
|
||||
func (impl *VCImpl) SetLogger(logger *logrus.Entry) {
|
||||
SetLogger(logger)
|
||||
func (impl *VCImpl) SetLogger(ctx context.Context, logger *logrus.Entry) {
|
||||
SetLogger(ctx, logger)
|
||||
}
|
||||
|
||||
// SetFactory implements the VC function of the same name.
|
||||
func (impl *VCImpl) SetFactory(factory Factory) {
|
||||
func (impl *VCImpl) SetFactory(ctx context.Context, factory Factory) {
|
||||
impl.factory = factory
|
||||
}
|
||||
|
||||
// CreateSandbox implements the VC function of the same name.
|
||||
func (impl *VCImpl) CreateSandbox(sandboxConfig SandboxConfig) (VCSandbox, error) {
|
||||
return CreateSandbox(sandboxConfig, impl.factory)
|
||||
func (impl *VCImpl) CreateSandbox(ctx context.Context, sandboxConfig SandboxConfig) (VCSandbox, error) {
|
||||
return CreateSandbox(ctx, sandboxConfig, impl.factory)
|
||||
}
|
||||
|
||||
// DeleteSandbox implements the VC function of the same name.
|
||||
func (impl *VCImpl) DeleteSandbox(sandboxID string) (VCSandbox, error) {
|
||||
return DeleteSandbox(sandboxID)
|
||||
func (impl *VCImpl) DeleteSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
return DeleteSandbox(ctx, sandboxID)
|
||||
}
|
||||
|
||||
// StartSandbox implements the VC function of the same name.
|
||||
func (impl *VCImpl) StartSandbox(sandboxID string) (VCSandbox, error) {
|
||||
return StartSandbox(sandboxID)
|
||||
func (impl *VCImpl) StartSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
return StartSandbox(ctx, sandboxID)
|
||||
}
|
||||
|
||||
// StopSandbox implements the VC function of the same name.
|
||||
func (impl *VCImpl) StopSandbox(sandboxID string) (VCSandbox, error) {
|
||||
return StopSandbox(sandboxID)
|
||||
func (impl *VCImpl) StopSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
return StopSandbox(ctx, sandboxID)
|
||||
}
|
||||
|
||||
// RunSandbox implements the VC function of the same name.
|
||||
func (impl *VCImpl) RunSandbox(sandboxConfig SandboxConfig) (VCSandbox, error) {
|
||||
return RunSandbox(sandboxConfig, impl.factory)
|
||||
func (impl *VCImpl) RunSandbox(ctx context.Context, sandboxConfig SandboxConfig) (VCSandbox, error) {
|
||||
return RunSandbox(ctx, sandboxConfig, impl.factory)
|
||||
}
|
||||
|
||||
// ListSandbox implements the VC function of the same name.
|
||||
func (impl *VCImpl) ListSandbox() ([]SandboxStatus, error) {
|
||||
return ListSandbox()
|
||||
func (impl *VCImpl) ListSandbox(ctx context.Context) ([]SandboxStatus, error) {
|
||||
return ListSandbox(ctx)
|
||||
}
|
||||
|
||||
// FetchSandbox will find out and connect to an existing sandbox and
|
||||
// return the sandbox structure.
|
||||
func (impl *VCImpl) FetchSandbox(sandboxID string) (VCSandbox, error) {
|
||||
return FetchSandbox(sandboxID)
|
||||
func (impl *VCImpl) FetchSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
return FetchSandbox(ctx, sandboxID)
|
||||
}
|
||||
|
||||
// StatusSandbox implements the VC function of the same name.
|
||||
func (impl *VCImpl) StatusSandbox(sandboxID string) (SandboxStatus, error) {
|
||||
return StatusSandbox(sandboxID)
|
||||
func (impl *VCImpl) StatusSandbox(ctx context.Context, sandboxID string) (SandboxStatus, error) {
|
||||
return StatusSandbox(ctx, sandboxID)
|
||||
}
|
||||
|
||||
// PauseSandbox implements the VC function of the same name.
|
||||
func (impl *VCImpl) PauseSandbox(sandboxID string) (VCSandbox, error) {
|
||||
return PauseSandbox(sandboxID)
|
||||
func (impl *VCImpl) PauseSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
return PauseSandbox(ctx, sandboxID)
|
||||
}
|
||||
|
||||
// ResumeSandbox implements the VC function of the same name.
|
||||
func (impl *VCImpl) ResumeSandbox(sandboxID string) (VCSandbox, error) {
|
||||
return ResumeSandbox(sandboxID)
|
||||
func (impl *VCImpl) ResumeSandbox(ctx context.Context, sandboxID string) (VCSandbox, error) {
|
||||
return ResumeSandbox(ctx, sandboxID)
|
||||
}
|
||||
|
||||
// CreateContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) CreateContainer(sandboxID string, containerConfig ContainerConfig) (VCSandbox, VCContainer, error) {
|
||||
return CreateContainer(sandboxID, containerConfig)
|
||||
func (impl *VCImpl) CreateContainer(ctx context.Context, sandboxID string, containerConfig ContainerConfig) (VCSandbox, VCContainer, error) {
|
||||
return CreateContainer(ctx, sandboxID, containerConfig)
|
||||
}
|
||||
|
||||
// DeleteContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) DeleteContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
return DeleteContainer(sandboxID, containerID)
|
||||
func (impl *VCImpl) DeleteContainer(ctx context.Context, sandboxID, containerID string) (VCContainer, error) {
|
||||
return DeleteContainer(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// StartContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) StartContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
return StartContainer(sandboxID, containerID)
|
||||
func (impl *VCImpl) StartContainer(ctx context.Context, sandboxID, containerID string) (VCContainer, error) {
|
||||
return StartContainer(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// StopContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) StopContainer(sandboxID, containerID string) (VCContainer, error) {
|
||||
return StopContainer(sandboxID, containerID)
|
||||
func (impl *VCImpl) StopContainer(ctx context.Context, sandboxID, containerID string) (VCContainer, error) {
|
||||
return StopContainer(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// EnterContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) EnterContainer(sandboxID, containerID string, cmd Cmd) (VCSandbox, VCContainer, *Process, error) {
|
||||
return EnterContainer(sandboxID, containerID, cmd)
|
||||
func (impl *VCImpl) EnterContainer(ctx context.Context, sandboxID, containerID string, cmd Cmd) (VCSandbox, VCContainer, *Process, error) {
|
||||
return EnterContainer(ctx, sandboxID, containerID, cmd)
|
||||
}
|
||||
|
||||
// StatusContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) StatusContainer(sandboxID, containerID string) (ContainerStatus, error) {
|
||||
return StatusContainer(sandboxID, containerID)
|
||||
func (impl *VCImpl) StatusContainer(ctx context.Context, sandboxID, containerID string) (ContainerStatus, error) {
|
||||
return StatusContainer(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// StatsContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) StatsContainer(sandboxID, containerID string) (ContainerStats, error) {
|
||||
return StatsContainer(sandboxID, containerID)
|
||||
func (impl *VCImpl) StatsContainer(ctx context.Context, sandboxID, containerID string) (ContainerStats, error) {
|
||||
return StatsContainer(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// KillContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) KillContainer(sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
return KillContainer(sandboxID, containerID, signal, all)
|
||||
func (impl *VCImpl) KillContainer(ctx context.Context, sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
return KillContainer(ctx, sandboxID, containerID, signal, all)
|
||||
}
|
||||
|
||||
// ProcessListContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) ProcessListContainer(sandboxID, containerID string, options ProcessListOptions) (ProcessList, error) {
|
||||
return ProcessListContainer(sandboxID, containerID, options)
|
||||
func (impl *VCImpl) ProcessListContainer(ctx context.Context, sandboxID, containerID string, options ProcessListOptions) (ProcessList, error) {
|
||||
return ProcessListContainer(ctx, sandboxID, containerID, options)
|
||||
}
|
||||
|
||||
// UpdateContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) UpdateContainer(sandboxID, containerID string, resources specs.LinuxResources) error {
|
||||
return UpdateContainer(sandboxID, containerID, resources)
|
||||
func (impl *VCImpl) UpdateContainer(ctx context.Context, sandboxID, containerID string, resources specs.LinuxResources) error {
|
||||
return UpdateContainer(ctx, sandboxID, containerID, resources)
|
||||
}
|
||||
|
||||
// PauseContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) PauseContainer(sandboxID, containerID string) error {
|
||||
return PauseContainer(sandboxID, containerID)
|
||||
func (impl *VCImpl) PauseContainer(ctx context.Context, sandboxID, containerID string) error {
|
||||
return PauseContainer(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// ResumeContainer implements the VC function of the same name.
|
||||
func (impl *VCImpl) ResumeContainer(sandboxID, containerID string) error {
|
||||
return ResumeContainer(sandboxID, containerID)
|
||||
func (impl *VCImpl) ResumeContainer(ctx context.Context, sandboxID, containerID string) error {
|
||||
return ResumeContainer(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// AddDevice will add a device to sandbox
|
||||
func (impl *VCImpl) AddDevice(sandboxID string, info config.DeviceInfo) (api.Device, error) {
|
||||
return AddDevice(sandboxID, info)
|
||||
func (impl *VCImpl) AddDevice(ctx context.Context, sandboxID string, info config.DeviceInfo) (api.Device, error) {
|
||||
return AddDevice(ctx, sandboxID, info)
|
||||
}
|
||||
|
||||
// AddInterface implements the VC function of the same name.
|
||||
func (impl *VCImpl) AddInterface(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return AddInterface(sandboxID, inf)
|
||||
func (impl *VCImpl) AddInterface(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return AddInterface(ctx, sandboxID, inf)
|
||||
}
|
||||
|
||||
// RemoveInterface implements the VC function of the same name.
|
||||
func (impl *VCImpl) RemoveInterface(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return RemoveInterface(sandboxID, inf)
|
||||
func (impl *VCImpl) RemoveInterface(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return RemoveInterface(ctx, sandboxID, inf)
|
||||
}
|
||||
|
||||
// ListInterfaces implements the VC function of the same name.
|
||||
func (impl *VCImpl) ListInterfaces(sandboxID string) ([]*grpc.Interface, error) {
|
||||
return ListInterfaces(sandboxID)
|
||||
func (impl *VCImpl) ListInterfaces(ctx context.Context, sandboxID string) ([]*grpc.Interface, error) {
|
||||
return ListInterfaces(ctx, sandboxID)
|
||||
}
|
||||
|
||||
// UpdateRoutes implements the VC function of the same name.
|
||||
func (impl *VCImpl) UpdateRoutes(sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error) {
|
||||
return UpdateRoutes(sandboxID, routes)
|
||||
func (impl *VCImpl) UpdateRoutes(ctx context.Context, sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error) {
|
||||
return UpdateRoutes(ctx, sandboxID, routes)
|
||||
}
|
||||
|
||||
// ListRoutes implements the VC function of the same name.
|
||||
func (impl *VCImpl) ListRoutes(sandboxID string) ([]*grpc.Route, error) {
|
||||
return ListRoutes(sandboxID)
|
||||
func (impl *VCImpl) ListRoutes(ctx context.Context, sandboxID string) ([]*grpc.Route, error) {
|
||||
return ListRoutes(ctx, sandboxID)
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"syscall"
|
||||
|
||||
@@ -18,40 +19,40 @@ import (
|
||||
|
||||
// VC is the Virtcontainers interface
|
||||
type VC interface {
|
||||
SetLogger(logger *logrus.Entry)
|
||||
SetFactory(Factory)
|
||||
SetLogger(ctx context.Context, logger *logrus.Entry)
|
||||
SetFactory(ctx context.Context, factory Factory)
|
||||
|
||||
CreateSandbox(sandboxConfig SandboxConfig) (VCSandbox, error)
|
||||
DeleteSandbox(sandboxID string) (VCSandbox, error)
|
||||
FetchSandbox(sandboxID string) (VCSandbox, error)
|
||||
ListSandbox() ([]SandboxStatus, error)
|
||||
PauseSandbox(sandboxID string) (VCSandbox, error)
|
||||
ResumeSandbox(sandboxID string) (VCSandbox, error)
|
||||
RunSandbox(sandboxConfig SandboxConfig) (VCSandbox, error)
|
||||
StartSandbox(sandboxID string) (VCSandbox, error)
|
||||
StatusSandbox(sandboxID string) (SandboxStatus, error)
|
||||
StopSandbox(sandboxID string) (VCSandbox, error)
|
||||
CreateSandbox(ctx context.Context, sandboxConfig SandboxConfig) (VCSandbox, error)
|
||||
DeleteSandbox(ctx context.Context, sandboxID string) (VCSandbox, error)
|
||||
FetchSandbox(ctx context.Context, sandboxID string) (VCSandbox, error)
|
||||
ListSandbox(ctx context.Context) ([]SandboxStatus, error)
|
||||
PauseSandbox(ctx context.Context, sandboxID string) (VCSandbox, error)
|
||||
ResumeSandbox(ctx context.Context, sandboxID string) (VCSandbox, error)
|
||||
RunSandbox(ctx context.Context, sandboxConfig SandboxConfig) (VCSandbox, error)
|
||||
StartSandbox(ctx context.Context, sandboxID string) (VCSandbox, error)
|
||||
StatusSandbox(ctx context.Context, sandboxID string) (SandboxStatus, error)
|
||||
StopSandbox(ctx context.Context, sandboxID string) (VCSandbox, error)
|
||||
|
||||
CreateContainer(sandboxID string, containerConfig ContainerConfig) (VCSandbox, VCContainer, error)
|
||||
DeleteContainer(sandboxID, containerID string) (VCContainer, error)
|
||||
EnterContainer(sandboxID, containerID string, cmd Cmd) (VCSandbox, VCContainer, *Process, error)
|
||||
KillContainer(sandboxID, containerID string, signal syscall.Signal, all bool) error
|
||||
StartContainer(sandboxID, containerID string) (VCContainer, error)
|
||||
StatusContainer(sandboxID, containerID string) (ContainerStatus, error)
|
||||
StatsContainer(sandboxID, containerID string) (ContainerStats, error)
|
||||
StopContainer(sandboxID, containerID string) (VCContainer, error)
|
||||
ProcessListContainer(sandboxID, containerID string, options ProcessListOptions) (ProcessList, error)
|
||||
UpdateContainer(sandboxID, containerID string, resources specs.LinuxResources) error
|
||||
PauseContainer(sandboxID, containerID string) error
|
||||
ResumeContainer(sandboxID, containerID string) error
|
||||
CreateContainer(ctx context.Context, sandboxID string, containerConfig ContainerConfig) (VCSandbox, VCContainer, error)
|
||||
DeleteContainer(ctx context.Context, sandboxID, containerID string) (VCContainer, error)
|
||||
EnterContainer(ctx context.Context, sandboxID, containerID string, cmd Cmd) (VCSandbox, VCContainer, *Process, error)
|
||||
KillContainer(ctx context.Context, sandboxID, containerID string, signal syscall.Signal, all bool) error
|
||||
StartContainer(ctx context.Context, sandboxID, containerID string) (VCContainer, error)
|
||||
StatusContainer(ctx context.Context, sandboxID, containerID string) (ContainerStatus, error)
|
||||
StatsContainer(ctx context.Context, sandboxID, containerID string) (ContainerStats, error)
|
||||
StopContainer(ctx context.Context, sandboxID, containerID string) (VCContainer, error)
|
||||
ProcessListContainer(ctx context.Context, sandboxID, containerID string, options ProcessListOptions) (ProcessList, error)
|
||||
UpdateContainer(ctx context.Context, sandboxID, containerID string, resources specs.LinuxResources) error
|
||||
PauseContainer(ctx context.Context, sandboxID, containerID string) error
|
||||
ResumeContainer(ctx context.Context, sandboxID, containerID string) error
|
||||
|
||||
AddDevice(sandboxID string, info config.DeviceInfo) (api.Device, error)
|
||||
AddDevice(ctx context.Context, sandboxID string, info config.DeviceInfo) (api.Device, error)
|
||||
|
||||
AddInterface(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error)
|
||||
RemoveInterface(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error)
|
||||
ListInterfaces(sandboxID string) ([]*grpc.Interface, error)
|
||||
UpdateRoutes(sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error)
|
||||
ListRoutes(sandboxID string) ([]*grpc.Route, error)
|
||||
AddInterface(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error)
|
||||
RemoveInterface(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error)
|
||||
ListInterfaces(ctx context.Context, sandboxID string) ([]*grpc.Interface, error)
|
||||
UpdateRoutes(ctx context.Context, sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error)
|
||||
ListRoutes(ctx context.Context, sandboxID string) ([]*grpc.Route, error)
|
||||
}
|
||||
|
||||
// VCSandbox is the Sandbox interface
|
||||
|
||||
@@ -24,6 +24,7 @@ import (
|
||||
ns "github.com/kata-containers/runtime/virtcontainers/pkg/nsenter"
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/uuid"
|
||||
"github.com/kata-containers/runtime/virtcontainers/utils"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"github.com/opencontainers/runtime-spec/specs-go"
|
||||
@@ -96,6 +97,21 @@ type kataAgent struct {
|
||||
proxyBuiltIn bool
|
||||
|
||||
vmSocket interface{}
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
func (k *kataAgent) trace(name string) (opentracing.Span, context.Context) {
|
||||
if k.ctx == nil {
|
||||
k.Logger().WithField("type", "bug").Error("trace called before context set")
|
||||
k.ctx = context.Background()
|
||||
}
|
||||
|
||||
span, ctx := opentracing.StartSpanFromContext(k.ctx, name)
|
||||
|
||||
span.SetTag("subsystem", "agent")
|
||||
span.SetTag("type", "kata")
|
||||
|
||||
return span, ctx
|
||||
}
|
||||
|
||||
func (k *kataAgent) Logger() *logrus.Entry {
|
||||
@@ -135,7 +151,13 @@ func (k *kataAgent) generateVMSocket(id string, c KataAgentConfig) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (k *kataAgent) init(sandbox *Sandbox, config interface{}) (err error) {
|
||||
func (k *kataAgent) init(ctx context.Context, sandbox *Sandbox, config interface{}) (err error) {
|
||||
// save
|
||||
k.ctx = sandbox.ctx
|
||||
|
||||
span, _ := k.trace("init")
|
||||
defer span.Finish()
|
||||
|
||||
switch c := config.(type) {
|
||||
case KataAgentConfig:
|
||||
if err := k.generateVMSocket(sandbox.id, c); err != nil {
|
||||
@@ -240,6 +262,9 @@ func (k *kataAgent) configure(h hypervisor, id, sharePath string, builtin bool,
|
||||
}
|
||||
|
||||
func (k *kataAgent) createSandbox(sandbox *Sandbox) error {
|
||||
span, _ := k.trace("createSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
return k.configure(sandbox.hypervisor, sandbox.id, k.getSharePath(sandbox.id), k.proxyBuiltIn, nil)
|
||||
}
|
||||
|
||||
@@ -321,6 +346,9 @@ func cmdEnvsToStringSlice(ev []EnvVar) []string {
|
||||
}
|
||||
|
||||
func (k *kataAgent) exec(sandbox *Sandbox, c Container, cmd Cmd) (*Process, error) {
|
||||
span, _ := k.trace("exec")
|
||||
defer span.Finish()
|
||||
|
||||
var kataProcess *grpc.Process
|
||||
|
||||
kataProcess, err := cmdToKataProcess(cmd)
|
||||
@@ -354,6 +382,8 @@ func (k *kataAgent) exec(sandbox *Sandbox, c Container, cmd Cmd) (*Process, erro
|
||||
}
|
||||
|
||||
func (k *kataAgent) generateInterfacesAndRoutes(networkNS NetworkNamespace) ([]*grpc.Interface, []*grpc.Route, error) {
|
||||
span, _ := k.trace("generateInterfacesAndRoutes")
|
||||
defer span.Finish()
|
||||
|
||||
if networkNS.NetNsPath == "" {
|
||||
return nil, nil, nil
|
||||
@@ -517,6 +547,9 @@ func (k *kataAgent) listRoutes() ([]*grpc.Route, error) {
|
||||
}
|
||||
|
||||
func (k *kataAgent) startProxy(sandbox *Sandbox) error {
|
||||
span, _ := k.trace("startProxy")
|
||||
defer span.Finish()
|
||||
|
||||
var err error
|
||||
|
||||
if k.proxy == nil {
|
||||
@@ -569,6 +602,9 @@ func (k *kataAgent) startProxy(sandbox *Sandbox) error {
|
||||
}
|
||||
|
||||
func (k *kataAgent) startSandbox(sandbox *Sandbox) error {
|
||||
span, _ := k.trace("startSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
err := k.startProxy(sandbox)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -642,6 +678,9 @@ func (k *kataAgent) startSandbox(sandbox *Sandbox) error {
|
||||
}
|
||||
|
||||
func (k *kataAgent) stopSandbox(sandbox *Sandbox) error {
|
||||
span, _ := k.trace("stopSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if k.proxy == nil {
|
||||
return errorMissingProxy
|
||||
}
|
||||
@@ -811,7 +850,7 @@ func (k *kataAgent) rollbackFailingContainerCreation(c *Container) {
|
||||
k.Logger().WithError(err2).Error("rollback failed unmountHostMounts()")
|
||||
}
|
||||
|
||||
if err2 := bindUnmountContainerRootfs(kataHostSharedDir, c.sandbox.id, c.id); err2 != nil {
|
||||
if err2 := bindUnmountContainerRootfs(k.ctx, kataHostSharedDir, c.sandbox.id, c.id); err2 != nil {
|
||||
k.Logger().WithError(err2).Error("rollback failed bindUnmountContainerRootfs()")
|
||||
}
|
||||
}
|
||||
@@ -861,7 +900,7 @@ func (k *kataAgent) buildContainerRootfs(sandbox *Sandbox, c *Container, rootPat
|
||||
// (kataGuestSharedDir) is already mounted in the
|
||||
// guest. We only need to mount the rootfs from
|
||||
// the host and it will show up in the guest.
|
||||
if err := bindMountContainerRootfs(kataHostSharedDir, sandbox.id, c.id, c.rootFs, false); err != nil {
|
||||
if err := bindMountContainerRootfs(k.ctx, kataHostSharedDir, sandbox.id, c.id, c.rootFs, false); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -869,6 +908,9 @@ func (k *kataAgent) buildContainerRootfs(sandbox *Sandbox, c *Container, rootPat
|
||||
}
|
||||
|
||||
func (k *kataAgent) createContainer(sandbox *Sandbox, c *Container) (p *Process, err error) {
|
||||
span, _ := k.trace("createContainer")
|
||||
defer span.Finish()
|
||||
|
||||
ociSpecJSON, ok := c.config.Annotations[vcAnnotations.ConfigJSONKey]
|
||||
if !ok {
|
||||
return nil, errorMissingOCISpec
|
||||
@@ -1101,6 +1143,9 @@ func (k *kataAgent) handlePidNamespace(grpcSpec *grpc.Spec, sandbox *Sandbox) (b
|
||||
}
|
||||
|
||||
func (k *kataAgent) startContainer(sandbox *Sandbox, c *Container) error {
|
||||
span, _ := k.trace("startContainer")
|
||||
defer span.Finish()
|
||||
|
||||
req := &grpc.StartContainerRequest{
|
||||
ContainerId: c.id,
|
||||
}
|
||||
@@ -1110,6 +1155,9 @@ func (k *kataAgent) startContainer(sandbox *Sandbox, c *Container) error {
|
||||
}
|
||||
|
||||
func (k *kataAgent) stopContainer(sandbox *Sandbox, c Container) error {
|
||||
span, _ := k.trace("stopContainer")
|
||||
defer span.Finish()
|
||||
|
||||
req := &grpc.RemoveContainerRequest{
|
||||
ContainerId: c.id,
|
||||
}
|
||||
@@ -1122,7 +1170,7 @@ func (k *kataAgent) stopContainer(sandbox *Sandbox, c Container) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := bindUnmountContainerRootfs(kataHostSharedDir, sandbox.id, c.id); err != nil {
|
||||
if err := bindUnmountContainerRootfs(k.ctx, kataHostSharedDir, sandbox.id, c.id); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -1261,6 +1309,9 @@ func (k *kataAgent) connect() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
span, _ := k.trace("connect")
|
||||
defer span.Finish()
|
||||
|
||||
// This is for the first connection only, to prevent race
|
||||
k.Lock()
|
||||
defer k.Unlock()
|
||||
@@ -1281,6 +1332,9 @@ func (k *kataAgent) connect() error {
|
||||
}
|
||||
|
||||
func (k *kataAgent) disconnect() error {
|
||||
span, _ := k.trace("disconnect")
|
||||
defer span.Finish()
|
||||
|
||||
k.Lock()
|
||||
defer k.Unlock()
|
||||
|
||||
@@ -1300,6 +1354,9 @@ func (k *kataAgent) disconnect() error {
|
||||
|
||||
// check grpc server is serving
|
||||
func (k *kataAgent) check() error {
|
||||
span, _ := k.trace("check")
|
||||
defer span.Finish()
|
||||
|
||||
_, err := k.sendReq(&grpc.CheckRequest{})
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Failed to check if grpc server is working: %s", err)
|
||||
@@ -1308,6 +1365,9 @@ func (k *kataAgent) check() error {
|
||||
}
|
||||
|
||||
func (k *kataAgent) waitProcess(c *Container, processID string) (int32, error) {
|
||||
span, _ := k.trace("waitProcess")
|
||||
defer span.Finish()
|
||||
|
||||
resp, err := k.sendReq(&grpc.WaitProcessRequest{
|
||||
ContainerId: c.id,
|
||||
ExecId: processID,
|
||||
@@ -1428,6 +1488,10 @@ func (k *kataAgent) installReqFunc(c *kataclient.AgentClient) {
|
||||
}
|
||||
|
||||
func (k *kataAgent) sendReq(request interface{}) (interface{}, error) {
|
||||
span, _ := k.trace("sendReq")
|
||||
span.SetTag("request", request)
|
||||
defer span.Finish()
|
||||
|
||||
if err := k.connect(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1443,7 +1507,7 @@ func (k *kataAgent) sendReq(request interface{}) (interface{}, error) {
|
||||
message := request.(proto.Message)
|
||||
k.Logger().WithField("name", msgName).WithField("req", message.String()).Debug("sending request")
|
||||
|
||||
return handler(context.Background(), request)
|
||||
return handler(k.ctx, request)
|
||||
}
|
||||
|
||||
// readStdout and readStderr are special that we cannot differentiate them with the request types...
|
||||
@@ -1473,7 +1537,7 @@ func (k *kataAgent) readProcessStderr(c *Container, processID string, data []byt
|
||||
type readFn func(context.Context, *grpc.ReadStreamRequest, ...golangGrpc.CallOption) (*grpc.ReadStreamResponse, error)
|
||||
|
||||
func (k *kataAgent) readProcessStream(containerID, processID string, data []byte, read readFn) (int, error) {
|
||||
resp, err := read(context.Background(), &grpc.ReadStreamRequest{
|
||||
resp, err := read(k.ctx, &grpc.ReadStreamRequest{
|
||||
ContainerId: containerID,
|
||||
ExecId: processID,
|
||||
Len: uint32(len(data))})
|
||||
|
||||
@@ -5,11 +5,13 @@
|
||||
|
||||
package virtcontainers
|
||||
|
||||
import "context"
|
||||
|
||||
type mockHypervisor struct {
|
||||
vCPUs uint32
|
||||
}
|
||||
|
||||
func (m *mockHypervisor) init(id string, hypervisorConfig *HypervisorConfig, vmConfig Resources, storage resourceStorage) error {
|
||||
func (m *mockHypervisor) init(ctx context.Context, id string, hypervisorConfig *HypervisorConfig, vmConfig Resources, storage resourceStorage) error {
|
||||
err := hypervisorConfig.valid()
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
@@ -25,8 +26,10 @@ func TestMockHypervisorInit(t *testing.T) {
|
||||
storage: &filesystem{},
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
// wrong config
|
||||
if err := m.init(sandbox.config.ID, &sandbox.config.HypervisorConfig, sandbox.config.VMConfig, sandbox.storage); err == nil {
|
||||
if err := m.init(ctx, sandbox.config.ID, &sandbox.config.HypervisorConfig, sandbox.config.VMConfig, sandbox.storage); err == nil {
|
||||
t.Fatal()
|
||||
}
|
||||
|
||||
@@ -37,7 +40,7 @@ func TestMockHypervisorInit(t *testing.T) {
|
||||
}
|
||||
|
||||
// right config
|
||||
if err := m.init(sandbox.config.ID, &sandbox.config.HypervisorConfig, sandbox.config.VMConfig, sandbox.storage); err != nil {
|
||||
if err := m.init(ctx, sandbox.config.ID, &sandbox.config.HypervisorConfig, sandbox.config.VMConfig, sandbox.storage); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ package virtcontainers
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -229,7 +230,10 @@ const mountPerm = os.FileMode(0755)
|
||||
// * evaluate all symlinks
|
||||
// * ensure the source exists
|
||||
// * recursively create the destination
|
||||
func bindMount(source, destination string, readonly bool) error {
|
||||
func bindMount(ctx context.Context, source, destination string, readonly bool) error {
|
||||
span, _ := trace(ctx, "bindMount")
|
||||
defer span.Finish()
|
||||
|
||||
if source == "" {
|
||||
return fmt.Errorf("source must be specified")
|
||||
}
|
||||
@@ -259,10 +263,13 @@ func bindMount(source, destination string, readonly bool) error {
|
||||
|
||||
// bindMountContainerRootfs bind mounts a container rootfs into a 9pfs shared
|
||||
// directory between the guest and the host.
|
||||
func bindMountContainerRootfs(sharedDir, sandboxID, cID, cRootFs string, readonly bool) error {
|
||||
func bindMountContainerRootfs(ctx context.Context, sharedDir, sandboxID, cID, cRootFs string, readonly bool) error {
|
||||
span, _ := trace(ctx, "bindMountContainerRootfs")
|
||||
defer span.Finish()
|
||||
|
||||
rootfsDest := filepath.Join(sharedDir, sandboxID, cID, rootfsDir)
|
||||
|
||||
return bindMount(cRootFs, rootfsDest, readonly)
|
||||
return bindMount(ctx, cRootFs, rootfsDest, readonly)
|
||||
}
|
||||
|
||||
// Mount describes a container mount.
|
||||
@@ -288,20 +295,26 @@ type Mount struct {
|
||||
BlockDeviceID string
|
||||
}
|
||||
|
||||
func bindUnmountContainerRootfs(sharedDir, sandboxID, cID string) error {
|
||||
func bindUnmountContainerRootfs(ctx context.Context, sharedDir, sandboxID, cID string) error {
|
||||
span, _ := trace(ctx, "bindUnmountContainerRootfs")
|
||||
defer span.Finish()
|
||||
|
||||
rootfsDest := filepath.Join(sharedDir, sandboxID, cID, rootfsDir)
|
||||
syscall.Unmount(rootfsDest, 0)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func bindUnmountAllRootfs(sharedDir string, sandbox *Sandbox) {
|
||||
func bindUnmountAllRootfs(ctx context.Context, sharedDir string, sandbox *Sandbox) {
|
||||
span, _ := trace(ctx, "bindUnmountAllRootfs")
|
||||
defer span.Finish()
|
||||
|
||||
for _, c := range sandbox.containers {
|
||||
c.unmountHostMounts()
|
||||
if c.state.Fstype == "" {
|
||||
// Need to check for error returned by this call.
|
||||
// See: https://github.com/containers/virtcontainers/issues/295
|
||||
bindUnmountContainerRootfs(sharedDir, sandbox.id, c.id)
|
||||
bindUnmountContainerRootfs(c.ctx, sharedDir, sandbox.id, c.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ package virtcontainers
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
@@ -212,7 +213,7 @@ func TestGetDeviceForPathBindMount(t *testing.T) {
|
||||
|
||||
defer os.Remove(dest)
|
||||
|
||||
err = bindMount(source, dest, false)
|
||||
err = bindMount(context.Background(), source, dest, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ package virtcontainers
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -1417,7 +1418,7 @@ func createEndpointsFromScan(networkNSPath string, config NetworkConfig) ([]Endp
|
||||
}
|
||||
|
||||
if isPhysical {
|
||||
cnmLogger().WithField("interface", netInfo.Iface.Name).Info("Physical network interface found")
|
||||
networkLogger().WithField("interface", netInfo.Iface.Name).Info("Physical network interface found")
|
||||
endpoint, err = createPhysicalEndpoint(netInfo)
|
||||
} else {
|
||||
var socketPath string
|
||||
@@ -1429,7 +1430,7 @@ func createEndpointsFromScan(networkNSPath string, config NetworkConfig) ([]Endp
|
||||
}
|
||||
|
||||
if socketPath != "" {
|
||||
cnmLogger().WithField("interface", netInfo.Iface.Name).Info("VhostUser network interface found")
|
||||
networkLogger().WithField("interface", netInfo.Iface.Name).Info("VhostUser network interface found")
|
||||
endpoint, err = createVhostUserEndpoint(netInfo, socketPath)
|
||||
} else {
|
||||
endpoint, err = createVirtualNetworkEndpoint(idx, netInfo.Iface.Name, config.InterworkingModel)
|
||||
@@ -1581,7 +1582,7 @@ func vhostUserSocketPath(info interface{}) (string, error) {
|
||||
// between VM netns and the host network physical interface.
|
||||
type network interface {
|
||||
// init initializes the network, setting a new network namespace.
|
||||
init(config NetworkConfig) (string, bool, error)
|
||||
init(ctx context.Context, config NetworkConfig) (string, bool, error)
|
||||
|
||||
// run runs a callback function in a specified network namespace.
|
||||
run(networkNSPath string, cb func() error) error
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"syscall"
|
||||
|
||||
"github.com/kata-containers/agent/protocols/grpc"
|
||||
@@ -23,7 +24,7 @@ func (n *noopAgent) startProxy(sandbox *Sandbox) error {
|
||||
}
|
||||
|
||||
// init initializes the Noop agent, i.e. it does nothing.
|
||||
func (n *noopAgent) init(sandbox *Sandbox, config interface{}) error {
|
||||
func (n *noopAgent) init(ctx context.Context, sandbox *Sandbox, config interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -14,14 +15,15 @@ func testCreateNoopContainer() (*Sandbox, *Container, error) {
|
||||
contID := "100"
|
||||
config := newTestSandboxConfigNoop()
|
||||
|
||||
p, err := CreateSandbox(config, nil)
|
||||
ctx := context.Background()
|
||||
p, err := CreateSandbox(ctx, config, nil)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
contConfig := newTestContainerConfigNoop(contID)
|
||||
|
||||
p, c, err := CreateContainer(p.ID(), contConfig)
|
||||
p, c, err := CreateContainer(ctx, p.ID(), contConfig)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
@@ -33,7 +35,7 @@ func TestNoopAgentInit(t *testing.T) {
|
||||
n := &noopAgent{}
|
||||
sandbox := &Sandbox{}
|
||||
|
||||
err := n.init(sandbox, nil)
|
||||
err := n.init(context.Background(), sandbox, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
package virtcontainers
|
||||
|
||||
import "context"
|
||||
|
||||
// noopNetwork a.k.a. NO-OP Network is an empty network implementation, for
|
||||
// testing and mocking purposes.
|
||||
type noopNetwork struct {
|
||||
@@ -12,7 +14,7 @@ type noopNetwork struct {
|
||||
|
||||
// init initializes the network, setting a new network namespace for the Noop network.
|
||||
// It does nothing.
|
||||
func (n *noopNetwork) init(config NetworkConfig) (string, bool, error) {
|
||||
func (n *noopNetwork) init(ctx context.Context, config NetworkConfig) (string, bool, error) {
|
||||
return "", true, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package hyperstart
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -123,7 +124,7 @@ type Hyperstart struct {
|
||||
var hyperLog = logrus.FieldLogger(logrus.New())
|
||||
|
||||
// SetLogger sets the logger for hyperstart package.
|
||||
func SetLogger(logger logrus.FieldLogger) {
|
||||
func SetLogger(ctx context.Context, logger logrus.FieldLogger) {
|
||||
hyperLog = logger.WithFields(logrus.Fields{
|
||||
"source": "virtcontainers",
|
||||
"subsystem": "hyperstart",
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package oci
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
@@ -134,7 +135,7 @@ var ociLog = logrus.WithFields(logrus.Fields{
|
||||
})
|
||||
|
||||
// SetLogger sets the logger for oci package.
|
||||
func SetLogger(logger *logrus.Entry) {
|
||||
func SetLogger(ctx context.Context, logger *logrus.Entry) {
|
||||
fields := ociLog.Data
|
||||
ociLog = logger.WithFields(fields)
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package vcmock
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"syscall"
|
||||
|
||||
@@ -32,266 +33,266 @@ import (
|
||||
const mockErrorPrefix = "vcmock forced failure"
|
||||
|
||||
// SetLogger implements the VC function of the same name.
|
||||
func (m *VCMock) SetLogger(logger *logrus.Entry) {
|
||||
func (m *VCMock) SetLogger(ctx context.Context, logger *logrus.Entry) {
|
||||
if m.SetLoggerFunc != nil {
|
||||
m.SetLoggerFunc(logger)
|
||||
m.SetLoggerFunc(ctx, logger)
|
||||
}
|
||||
}
|
||||
|
||||
// SetFactory implements the VC function of the same name.
|
||||
func (m *VCMock) SetFactory(factory vc.Factory) {
|
||||
func (m *VCMock) SetFactory(ctx context.Context, factory vc.Factory) {
|
||||
if m.SetFactoryFunc != nil {
|
||||
m.SetFactoryFunc(factory)
|
||||
m.SetFactoryFunc(ctx, factory)
|
||||
}
|
||||
}
|
||||
|
||||
// CreateSandbox implements the VC function of the same name.
|
||||
func (m *VCMock) CreateSandbox(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
func (m *VCMock) CreateSandbox(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
if m.CreateSandboxFunc != nil {
|
||||
return m.CreateSandboxFunc(sandboxConfig)
|
||||
return m.CreateSandboxFunc(ctx, sandboxConfig)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxConfig: %v", mockErrorPrefix, getSelf(), m, sandboxConfig)
|
||||
}
|
||||
|
||||
// DeleteSandbox implements the VC function of the same name.
|
||||
func (m *VCMock) DeleteSandbox(sandboxID string) (vc.VCSandbox, error) {
|
||||
func (m *VCMock) DeleteSandbox(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
if m.DeleteSandboxFunc != nil {
|
||||
return m.DeleteSandboxFunc(sandboxID)
|
||||
return m.DeleteSandboxFunc(ctx, sandboxID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// FetchSandbox implements the VC function of the same name.
|
||||
func (m *VCMock) FetchSandbox(sandboxID string) (vc.VCSandbox, error) {
|
||||
func (m *VCMock) FetchSandbox(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
if m.FetchSandboxFunc != nil {
|
||||
return m.FetchSandboxFunc(sandboxID)
|
||||
return m.FetchSandboxFunc(ctx, sandboxID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// StartSandbox implements the VC function of the same name.
|
||||
func (m *VCMock) StartSandbox(sandboxID string) (vc.VCSandbox, error) {
|
||||
func (m *VCMock) StartSandbox(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
if m.StartSandboxFunc != nil {
|
||||
return m.StartSandboxFunc(sandboxID)
|
||||
return m.StartSandboxFunc(ctx, sandboxID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// StopSandbox implements the VC function of the same name.
|
||||
func (m *VCMock) StopSandbox(sandboxID string) (vc.VCSandbox, error) {
|
||||
func (m *VCMock) StopSandbox(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
if m.StopSandboxFunc != nil {
|
||||
return m.StopSandboxFunc(sandboxID)
|
||||
return m.StopSandboxFunc(ctx, sandboxID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// RunSandbox implements the VC function of the same name.
|
||||
func (m *VCMock) RunSandbox(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
func (m *VCMock) RunSandbox(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
if m.RunSandboxFunc != nil {
|
||||
return m.RunSandboxFunc(sandboxConfig)
|
||||
return m.RunSandboxFunc(ctx, sandboxConfig)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxConfig: %v", mockErrorPrefix, getSelf(), m, sandboxConfig)
|
||||
}
|
||||
|
||||
// ListSandbox implements the VC function of the same name.
|
||||
func (m *VCMock) ListSandbox() ([]vc.SandboxStatus, error) {
|
||||
func (m *VCMock) ListSandbox(ctx context.Context) ([]vc.SandboxStatus, error) {
|
||||
if m.ListSandboxFunc != nil {
|
||||
return m.ListSandboxFunc()
|
||||
return m.ListSandboxFunc(ctx)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s", mockErrorPrefix, getSelf())
|
||||
}
|
||||
|
||||
// StatusSandbox implements the VC function of the same name.
|
||||
func (m *VCMock) StatusSandbox(sandboxID string) (vc.SandboxStatus, error) {
|
||||
func (m *VCMock) StatusSandbox(ctx context.Context, sandboxID string) (vc.SandboxStatus, error) {
|
||||
if m.StatusSandboxFunc != nil {
|
||||
return m.StatusSandboxFunc(sandboxID)
|
||||
return m.StatusSandboxFunc(ctx, sandboxID)
|
||||
}
|
||||
|
||||
return vc.SandboxStatus{}, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// PauseSandbox implements the VC function of the same name.
|
||||
func (m *VCMock) PauseSandbox(sandboxID string) (vc.VCSandbox, error) {
|
||||
func (m *VCMock) PauseSandbox(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
if m.PauseSandboxFunc != nil {
|
||||
return m.PauseSandboxFunc(sandboxID)
|
||||
return m.PauseSandboxFunc(ctx, sandboxID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// ResumeSandbox implements the VC function of the same name.
|
||||
func (m *VCMock) ResumeSandbox(sandboxID string) (vc.VCSandbox, error) {
|
||||
func (m *VCMock) ResumeSandbox(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
if m.ResumeSandboxFunc != nil {
|
||||
return m.ResumeSandboxFunc(sandboxID)
|
||||
return m.ResumeSandboxFunc(ctx, sandboxID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// CreateContainer implements the VC function of the same name.
|
||||
func (m *VCMock) CreateContainer(sandboxID string, containerConfig vc.ContainerConfig) (vc.VCSandbox, vc.VCContainer, error) {
|
||||
func (m *VCMock) CreateContainer(ctx context.Context, sandboxID string, containerConfig vc.ContainerConfig) (vc.VCSandbox, vc.VCContainer, error) {
|
||||
if m.CreateContainerFunc != nil {
|
||||
return m.CreateContainerFunc(sandboxID, containerConfig)
|
||||
return m.CreateContainerFunc(ctx, sandboxID, containerConfig)
|
||||
}
|
||||
|
||||
return nil, nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerConfig: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerConfig)
|
||||
}
|
||||
|
||||
// DeleteContainer implements the VC function of the same name.
|
||||
func (m *VCMock) DeleteContainer(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
func (m *VCMock) DeleteContainer(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
if m.DeleteContainerFunc != nil {
|
||||
return m.DeleteContainerFunc(sandboxID, containerID)
|
||||
return m.DeleteContainerFunc(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// StartContainer implements the VC function of the same name.
|
||||
func (m *VCMock) StartContainer(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
func (m *VCMock) StartContainer(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
if m.StartContainerFunc != nil {
|
||||
return m.StartContainerFunc(sandboxID, containerID)
|
||||
return m.StartContainerFunc(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// StopContainer implements the VC function of the same name.
|
||||
func (m *VCMock) StopContainer(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
func (m *VCMock) StopContainer(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
if m.StopContainerFunc != nil {
|
||||
return m.StopContainerFunc(sandboxID, containerID)
|
||||
return m.StopContainerFunc(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// EnterContainer implements the VC function of the same name.
|
||||
func (m *VCMock) EnterContainer(sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
func (m *VCMock) EnterContainer(ctx context.Context, sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
if m.EnterContainerFunc != nil {
|
||||
return m.EnterContainerFunc(sandboxID, containerID, cmd)
|
||||
return m.EnterContainerFunc(ctx, sandboxID, containerID, cmd)
|
||||
}
|
||||
|
||||
return nil, nil, nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v, cmd: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID, cmd)
|
||||
}
|
||||
|
||||
// StatusContainer implements the VC function of the same name.
|
||||
func (m *VCMock) StatusContainer(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
func (m *VCMock) StatusContainer(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
if m.StatusContainerFunc != nil {
|
||||
return m.StatusContainerFunc(sandboxID, containerID)
|
||||
return m.StatusContainerFunc(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
return vc.ContainerStatus{}, fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// StatsContainer implements the VC function of the same name.
|
||||
func (m *VCMock) StatsContainer(sandboxID, containerID string) (vc.ContainerStats, error) {
|
||||
func (m *VCMock) StatsContainer(ctx context.Context, sandboxID, containerID string) (vc.ContainerStats, error) {
|
||||
if m.StatsContainerFunc != nil {
|
||||
return m.StatsContainerFunc(sandboxID, containerID)
|
||||
return m.StatsContainerFunc(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
return vc.ContainerStats{}, fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// KillContainer implements the VC function of the same name.
|
||||
func (m *VCMock) KillContainer(sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
func (m *VCMock) KillContainer(ctx context.Context, sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
if m.KillContainerFunc != nil {
|
||||
return m.KillContainerFunc(sandboxID, containerID, signal, all)
|
||||
return m.KillContainerFunc(ctx, sandboxID, containerID, signal, all)
|
||||
}
|
||||
|
||||
return fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v, signal: %v, all: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID, signal, all)
|
||||
}
|
||||
|
||||
// ProcessListContainer implements the VC function of the same name.
|
||||
func (m *VCMock) ProcessListContainer(sandboxID, containerID string, options vc.ProcessListOptions) (vc.ProcessList, error) {
|
||||
func (m *VCMock) ProcessListContainer(ctx context.Context, sandboxID, containerID string, options vc.ProcessListOptions) (vc.ProcessList, error) {
|
||||
if m.ProcessListContainerFunc != nil {
|
||||
return m.ProcessListContainerFunc(sandboxID, containerID, options)
|
||||
return m.ProcessListContainerFunc(ctx, sandboxID, containerID, options)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// UpdateContainer implements the VC function of the same name.
|
||||
func (m *VCMock) UpdateContainer(sandboxID, containerID string, resources specs.LinuxResources) error {
|
||||
func (m *VCMock) UpdateContainer(ctx context.Context, sandboxID, containerID string, resources specs.LinuxResources) error {
|
||||
if m.UpdateContainerFunc != nil {
|
||||
return m.UpdateContainerFunc(sandboxID, containerID, resources)
|
||||
return m.UpdateContainerFunc(ctx, sandboxID, containerID, resources)
|
||||
}
|
||||
|
||||
return fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// PauseContainer implements the VC function of the same name.
|
||||
func (m *VCMock) PauseContainer(sandboxID, containerID string) error {
|
||||
func (m *VCMock) PauseContainer(ctx context.Context, sandboxID, containerID string) error {
|
||||
if m.PauseContainerFunc != nil {
|
||||
return m.PauseContainerFunc(sandboxID, containerID)
|
||||
return m.PauseContainerFunc(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
return fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// ResumeContainer implements the VC function of the same name.
|
||||
func (m *VCMock) ResumeContainer(sandboxID, containerID string) error {
|
||||
func (m *VCMock) ResumeContainer(ctx context.Context, sandboxID, containerID string) error {
|
||||
if m.ResumeContainerFunc != nil {
|
||||
return m.ResumeContainerFunc(sandboxID, containerID)
|
||||
return m.ResumeContainerFunc(ctx, sandboxID, containerID)
|
||||
}
|
||||
|
||||
return fmt.Errorf("%s: %s (%+v): sandboxID: %v, containerID: %v", mockErrorPrefix, getSelf(), m, sandboxID, containerID)
|
||||
}
|
||||
|
||||
// AddDevice implements the VC function of the same name.
|
||||
func (m *VCMock) AddDevice(sandboxID string, info config.DeviceInfo) (api.Device, error) {
|
||||
func (m *VCMock) AddDevice(ctx context.Context, sandboxID string, info config.DeviceInfo) (api.Device, error) {
|
||||
if m.AddDeviceFunc != nil {
|
||||
return m.AddDeviceFunc(sandboxID, info)
|
||||
return m.AddDeviceFunc(ctx, sandboxID, info)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// AddInterface implements the VC function of the same name.
|
||||
func (m *VCMock) AddInterface(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
func (m *VCMock) AddInterface(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
if m.AddInterfaceFunc != nil {
|
||||
return m.AddInterfaceFunc(sandboxID, inf)
|
||||
return m.AddInterfaceFunc(ctx, sandboxID, inf)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// RemoveInterface implements the VC function of the same name.
|
||||
func (m *VCMock) RemoveInterface(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
func (m *VCMock) RemoveInterface(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
if m.RemoveInterfaceFunc != nil {
|
||||
return m.RemoveInterfaceFunc(sandboxID, inf)
|
||||
return m.RemoveInterfaceFunc(ctx, sandboxID, inf)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// ListInterfaces implements the VC function of the same name.
|
||||
func (m *VCMock) ListInterfaces(sandboxID string) ([]*grpc.Interface, error) {
|
||||
func (m *VCMock) ListInterfaces(ctx context.Context, sandboxID string) ([]*grpc.Interface, error) {
|
||||
if m.ListInterfacesFunc != nil {
|
||||
return m.ListInterfacesFunc(sandboxID)
|
||||
return m.ListInterfacesFunc(ctx, sandboxID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// UpdateRoutes implements the VC function of the same name.
|
||||
func (m *VCMock) UpdateRoutes(sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error) {
|
||||
func (m *VCMock) UpdateRoutes(ctx context.Context, sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error) {
|
||||
if m.UpdateRoutesFunc != nil {
|
||||
return m.UpdateRoutesFunc(sandboxID, routes)
|
||||
return m.UpdateRoutesFunc(ctx, sandboxID, routes)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
}
|
||||
|
||||
// ListRoutes implements the VC function of the same name.
|
||||
func (m *VCMock) ListRoutes(sandboxID string) ([]*grpc.Route, error) {
|
||||
func (m *VCMock) ListRoutes(ctx context.Context, sandboxID string) ([]*grpc.Route, error) {
|
||||
if m.ListRoutesFunc != nil {
|
||||
return m.ListRoutesFunc(sandboxID)
|
||||
return m.ListRoutesFunc(ctx, sandboxID)
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package vcmock
|
||||
|
||||
import (
|
||||
"context"
|
||||
"reflect"
|
||||
"syscall"
|
||||
"testing"
|
||||
@@ -102,14 +103,15 @@ func TestVCMockSetLogger(t *testing.T) {
|
||||
logger := logrus.NewEntry(logrus.New())
|
||||
|
||||
assert.Equal(loggerTriggered, 0)
|
||||
m.SetLogger(logger)
|
||||
ctx := context.Background()
|
||||
m.SetLogger(ctx, logger)
|
||||
assert.Equal(loggerTriggered, 0)
|
||||
|
||||
m.SetLoggerFunc = func(logger logrus.FieldLogger) {
|
||||
m.SetLoggerFunc = func(ctx context.Context, logger *logrus.Entry) {
|
||||
loggerTriggered = 1
|
||||
}
|
||||
|
||||
m.SetLogger(logger)
|
||||
m.SetLogger(ctx, logger)
|
||||
assert.Equal(loggerTriggered, 1)
|
||||
}
|
||||
|
||||
@@ -119,22 +121,23 @@ func TestVCMockCreateSandbox(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.CreateSandboxFunc)
|
||||
|
||||
_, err := m.CreateSandbox(vc.SandboxConfig{})
|
||||
ctx := context.Background()
|
||||
_, err := m.CreateSandbox(ctx, vc.SandboxConfig{})
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.CreateSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
m.CreateSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
return &Sandbox{}, nil
|
||||
}
|
||||
|
||||
sandbox, err := m.CreateSandbox(vc.SandboxConfig{})
|
||||
sandbox, err := m.CreateSandbox(ctx, vc.SandboxConfig{})
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, &Sandbox{})
|
||||
|
||||
// reset
|
||||
m.CreateSandboxFunc = nil
|
||||
|
||||
_, err = m.CreateSandbox(vc.SandboxConfig{})
|
||||
_, err = m.CreateSandbox(ctx, vc.SandboxConfig{})
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -145,22 +148,23 @@ func TestVCMockDeleteSandbox(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.DeleteSandboxFunc)
|
||||
|
||||
_, err := m.DeleteSandbox(testSandboxID)
|
||||
ctx := context.Background()
|
||||
_, err := m.DeleteSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.DeleteSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
m.DeleteSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return &Sandbox{}, nil
|
||||
}
|
||||
|
||||
sandbox, err := m.DeleteSandbox(testSandboxID)
|
||||
sandbox, err := m.DeleteSandbox(ctx, testSandboxID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, &Sandbox{})
|
||||
|
||||
// reset
|
||||
m.DeleteSandboxFunc = nil
|
||||
|
||||
_, err = m.DeleteSandbox(testSandboxID)
|
||||
_, err = m.DeleteSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -171,22 +175,23 @@ func TestVCMockListSandbox(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.ListSandboxFunc)
|
||||
|
||||
_, err := m.ListSandbox()
|
||||
ctx := context.Background()
|
||||
_, err := m.ListSandbox(ctx)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.ListSandboxFunc = func() ([]vc.SandboxStatus, error) {
|
||||
m.ListSandboxFunc = func(ctx context.Context) ([]vc.SandboxStatus, error) {
|
||||
return []vc.SandboxStatus{}, nil
|
||||
}
|
||||
|
||||
sandboxes, err := m.ListSandbox()
|
||||
sandboxes, err := m.ListSandbox(ctx)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandboxes, []vc.SandboxStatus{})
|
||||
|
||||
// reset
|
||||
m.ListSandboxFunc = nil
|
||||
|
||||
_, err = m.ListSandbox()
|
||||
_, err = m.ListSandbox(ctx)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -197,22 +202,23 @@ func TestVCMockPauseSandbox(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.PauseSandboxFunc)
|
||||
|
||||
_, err := m.PauseSandbox(testSandboxID)
|
||||
ctx := context.Background()
|
||||
_, err := m.PauseSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.PauseSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
m.PauseSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return &Sandbox{}, nil
|
||||
}
|
||||
|
||||
sandbox, err := m.PauseSandbox(testSandboxID)
|
||||
sandbox, err := m.PauseSandbox(ctx, testSandboxID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, &Sandbox{})
|
||||
|
||||
// reset
|
||||
m.PauseSandboxFunc = nil
|
||||
|
||||
_, err = m.PauseSandbox(testSandboxID)
|
||||
_, err = m.PauseSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -223,22 +229,23 @@ func TestVCMockResumeSandbox(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.ResumeSandboxFunc)
|
||||
|
||||
_, err := m.ResumeSandbox(testSandboxID)
|
||||
ctx := context.Background()
|
||||
_, err := m.ResumeSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.ResumeSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
m.ResumeSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return &Sandbox{}, nil
|
||||
}
|
||||
|
||||
sandbox, err := m.ResumeSandbox(testSandboxID)
|
||||
sandbox, err := m.ResumeSandbox(ctx, testSandboxID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, &Sandbox{})
|
||||
|
||||
// reset
|
||||
m.ResumeSandboxFunc = nil
|
||||
|
||||
_, err = m.ResumeSandbox(testSandboxID)
|
||||
_, err = m.ResumeSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -249,22 +256,23 @@ func TestVCMockRunSandbox(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.RunSandboxFunc)
|
||||
|
||||
_, err := m.RunSandbox(vc.SandboxConfig{})
|
||||
ctx := context.Background()
|
||||
_, err := m.RunSandbox(ctx, vc.SandboxConfig{})
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.RunSandboxFunc = func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
m.RunSandboxFunc = func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) {
|
||||
return &Sandbox{}, nil
|
||||
}
|
||||
|
||||
sandbox, err := m.RunSandbox(vc.SandboxConfig{})
|
||||
sandbox, err := m.RunSandbox(ctx, vc.SandboxConfig{})
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, &Sandbox{})
|
||||
|
||||
// reset
|
||||
m.RunSandboxFunc = nil
|
||||
|
||||
_, err = m.RunSandbox(vc.SandboxConfig{})
|
||||
_, err = m.RunSandbox(ctx, vc.SandboxConfig{})
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -275,22 +283,23 @@ func TestVCMockStartSandbox(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.StartSandboxFunc)
|
||||
|
||||
_, err := m.StartSandbox(testSandboxID)
|
||||
ctx := context.Background()
|
||||
_, err := m.StartSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.StartSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
m.StartSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return &Sandbox{}, nil
|
||||
}
|
||||
|
||||
sandbox, err := m.StartSandbox(testSandboxID)
|
||||
sandbox, err := m.StartSandbox(ctx, testSandboxID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, &Sandbox{})
|
||||
|
||||
// reset
|
||||
m.StartSandboxFunc = nil
|
||||
|
||||
_, err = m.StartSandbox(testSandboxID)
|
||||
_, err = m.StartSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -301,22 +310,23 @@ func TestVCMockStatusSandbox(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.StatusSandboxFunc)
|
||||
|
||||
_, err := m.StatusSandbox(testSandboxID)
|
||||
ctx := context.Background()
|
||||
_, err := m.StatusSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.StatusSandboxFunc = func(sandboxID string) (vc.SandboxStatus, error) {
|
||||
m.StatusSandboxFunc = func(ctx context.Context, sandboxID string) (vc.SandboxStatus, error) {
|
||||
return vc.SandboxStatus{}, nil
|
||||
}
|
||||
|
||||
sandbox, err := m.StatusSandbox(testSandboxID)
|
||||
sandbox, err := m.StatusSandbox(ctx, testSandboxID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, vc.SandboxStatus{})
|
||||
|
||||
// reset
|
||||
m.StatusSandboxFunc = nil
|
||||
|
||||
_, err = m.StatusSandbox(testSandboxID)
|
||||
_, err = m.StatusSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -327,22 +337,23 @@ func TestVCMockStopSandbox(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.StopSandboxFunc)
|
||||
|
||||
_, err := m.StopSandbox(testSandboxID)
|
||||
ctx := context.Background()
|
||||
_, err := m.StopSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.StopSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) {
|
||||
m.StopSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
|
||||
return &Sandbox{}, nil
|
||||
}
|
||||
|
||||
sandbox, err := m.StopSandbox(testSandboxID)
|
||||
sandbox, err := m.StopSandbox(ctx, testSandboxID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, &Sandbox{})
|
||||
|
||||
// reset
|
||||
m.StopSandboxFunc = nil
|
||||
|
||||
_, err = m.StopSandbox(testSandboxID)
|
||||
_, err = m.StopSandbox(ctx, testSandboxID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -353,16 +364,17 @@ func TestVCMockCreateContainer(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.CreateContainerFunc)
|
||||
|
||||
ctx := context.Background()
|
||||
config := vc.ContainerConfig{}
|
||||
_, _, err := m.CreateContainer(testSandboxID, config)
|
||||
_, _, err := m.CreateContainer(ctx, testSandboxID, config)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.CreateContainerFunc = func(sandboxID string, containerConfig vc.ContainerConfig) (vc.VCSandbox, vc.VCContainer, error) {
|
||||
m.CreateContainerFunc = func(ctx context.Context, sandboxID string, containerConfig vc.ContainerConfig) (vc.VCSandbox, vc.VCContainer, error) {
|
||||
return &Sandbox{}, &Container{}, nil
|
||||
}
|
||||
|
||||
sandbox, container, err := m.CreateContainer(testSandboxID, config)
|
||||
sandbox, container, err := m.CreateContainer(ctx, testSandboxID, config)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, &Sandbox{})
|
||||
assert.Equal(container, &Container{})
|
||||
@@ -370,7 +382,7 @@ func TestVCMockCreateContainer(t *testing.T) {
|
||||
// reset
|
||||
m.CreateContainerFunc = nil
|
||||
|
||||
_, _, err = m.CreateContainer(testSandboxID, config)
|
||||
_, _, err = m.CreateContainer(ctx, testSandboxID, config)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -381,22 +393,23 @@ func TestVCMockDeleteContainer(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.DeleteContainerFunc)
|
||||
|
||||
_, err := m.DeleteContainer(testSandboxID, testContainerID)
|
||||
ctx := context.Background()
|
||||
_, err := m.DeleteContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.DeleteContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
m.DeleteContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
return &Container{}, nil
|
||||
}
|
||||
|
||||
container, err := m.DeleteContainer(testSandboxID, testContainerID)
|
||||
container, err := m.DeleteContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(container, &Container{})
|
||||
|
||||
// reset
|
||||
m.DeleteContainerFunc = nil
|
||||
|
||||
_, err = m.DeleteContainer(testSandboxID, testContainerID)
|
||||
_, err = m.DeleteContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -407,16 +420,17 @@ func TestVCMockEnterContainer(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.EnterContainerFunc)
|
||||
|
||||
ctx := context.Background()
|
||||
cmd := vc.Cmd{}
|
||||
_, _, _, err := m.EnterContainer(testSandboxID, testContainerID, cmd)
|
||||
_, _, _, err := m.EnterContainer(ctx, testSandboxID, testContainerID, cmd)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.EnterContainerFunc = func(sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
m.EnterContainerFunc = func(ctx context.Context, sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error) {
|
||||
return &Sandbox{}, &Container{}, &vc.Process{}, nil
|
||||
}
|
||||
|
||||
sandbox, container, process, err := m.EnterContainer(testSandboxID, testContainerID, cmd)
|
||||
sandbox, container, process, err := m.EnterContainer(ctx, testSandboxID, testContainerID, cmd)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, &Sandbox{})
|
||||
assert.Equal(container, &Container{})
|
||||
@@ -425,7 +439,7 @@ func TestVCMockEnterContainer(t *testing.T) {
|
||||
// reset
|
||||
m.EnterContainerFunc = nil
|
||||
|
||||
_, _, _, err = m.EnterContainer(testSandboxID, testContainerID, cmd)
|
||||
_, _, _, err = m.EnterContainer(ctx, testSandboxID, testContainerID, cmd)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -436,20 +450,21 @@ func TestVCMockKillContainer(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.KillContainerFunc)
|
||||
|
||||
ctx := context.Background()
|
||||
sig := syscall.SIGTERM
|
||||
|
||||
for _, all := range []bool{true, false} {
|
||||
err := m.KillContainer(testSandboxID, testContainerID, sig, all)
|
||||
err := m.KillContainer(ctx, testSandboxID, testContainerID, sig, all)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
|
||||
m.KillContainerFunc = func(sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
m.KillContainerFunc = func(ctx context.Context, sandboxID, containerID string, signal syscall.Signal, all bool) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, all := range []bool{true, false} {
|
||||
err := m.KillContainer(testSandboxID, testContainerID, sig, all)
|
||||
err := m.KillContainer(ctx, testSandboxID, testContainerID, sig, all)
|
||||
assert.NoError(err)
|
||||
}
|
||||
|
||||
@@ -457,7 +472,7 @@ func TestVCMockKillContainer(t *testing.T) {
|
||||
m.KillContainerFunc = nil
|
||||
|
||||
for _, all := range []bool{true, false} {
|
||||
err := m.KillContainer(testSandboxID, testContainerID, sig, all)
|
||||
err := m.KillContainer(ctx, testSandboxID, testContainerID, sig, all)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -469,22 +484,23 @@ func TestVCMockStartContainer(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.StartContainerFunc)
|
||||
|
||||
_, err := m.StartContainer(testSandboxID, testContainerID)
|
||||
ctx := context.Background()
|
||||
_, err := m.StartContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.StartContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
m.StartContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
return &Container{}, nil
|
||||
}
|
||||
|
||||
container, err := m.StartContainer(testSandboxID, testContainerID)
|
||||
container, err := m.StartContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(container, &Container{})
|
||||
|
||||
// reset
|
||||
m.StartContainerFunc = nil
|
||||
|
||||
_, err = m.StartContainer(testSandboxID, testContainerID)
|
||||
_, err = m.StartContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -495,22 +511,23 @@ func TestVCMockStatusContainer(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.StatusContainerFunc)
|
||||
|
||||
_, err := m.StatusContainer(testSandboxID, testContainerID)
|
||||
ctx := context.Background()
|
||||
_, err := m.StatusContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
m.StatusContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error) {
|
||||
return vc.ContainerStatus{}, nil
|
||||
}
|
||||
|
||||
status, err := m.StatusContainer(testSandboxID, testContainerID)
|
||||
status, err := m.StatusContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(status, vc.ContainerStatus{})
|
||||
|
||||
// reset
|
||||
m.StatusContainerFunc = nil
|
||||
|
||||
_, err = m.StatusContainer(testSandboxID, testContainerID)
|
||||
_, err = m.StatusContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -521,23 +538,24 @@ func TestVCMockStatsContainer(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.StatsContainerFunc)
|
||||
|
||||
_, err := m.StatsContainer(testSandboxID, testContainerID)
|
||||
ctx := context.Background()
|
||||
_, err := m.StatsContainer(ctx, testSandboxID, testContainerID)
|
||||
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.StatsContainerFunc = func(sandboxID, containerID string) (vc.ContainerStats, error) {
|
||||
m.StatsContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStats, error) {
|
||||
return vc.ContainerStats{}, nil
|
||||
}
|
||||
|
||||
stats, err := m.StatsContainer(testSandboxID, testContainerID)
|
||||
stats, err := m.StatsContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(stats, vc.ContainerStats{})
|
||||
|
||||
// reset
|
||||
m.StatsContainerFunc = nil
|
||||
|
||||
_, err = m.StatsContainer(testSandboxID, testContainerID)
|
||||
_, err = m.StatsContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -548,22 +566,23 @@ func TestVCMockStopContainer(t *testing.T) {
|
||||
m := &VCMock{}
|
||||
assert.Nil(m.StopContainerFunc)
|
||||
|
||||
_, err := m.StopContainer(testSandboxID, testContainerID)
|
||||
ctx := context.Background()
|
||||
_, err := m.StopContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.StopContainerFunc = func(sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
m.StopContainerFunc = func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error) {
|
||||
return &Container{}, nil
|
||||
}
|
||||
|
||||
container, err := m.StopContainer(testSandboxID, testContainerID)
|
||||
container, err := m.StopContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(container, &Container{})
|
||||
|
||||
// reset
|
||||
m.StopContainerFunc = nil
|
||||
|
||||
_, err = m.StopContainer(testSandboxID, testContainerID)
|
||||
_, err = m.StopContainer(ctx, testSandboxID, testContainerID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -579,24 +598,25 @@ func TestVCMockProcessListContainer(t *testing.T) {
|
||||
Args: []string{"-ef"},
|
||||
}
|
||||
|
||||
_, err := m.ProcessListContainer(testSandboxID, testContainerID, options)
|
||||
ctx := context.Background()
|
||||
_, err := m.ProcessListContainer(ctx, testSandboxID, testContainerID, options)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
processList := vc.ProcessList("hi")
|
||||
|
||||
m.ProcessListContainerFunc = func(sandboxID, containerID string, options vc.ProcessListOptions) (vc.ProcessList, error) {
|
||||
m.ProcessListContainerFunc = func(ctx context.Context, sandboxID, containerID string, options vc.ProcessListOptions) (vc.ProcessList, error) {
|
||||
return processList, nil
|
||||
}
|
||||
|
||||
pList, err := m.ProcessListContainer(testSandboxID, testContainerID, options)
|
||||
pList, err := m.ProcessListContainer(ctx, testSandboxID, testContainerID, options)
|
||||
assert.NoError(err)
|
||||
assert.Equal(pList, processList)
|
||||
|
||||
// reset
|
||||
m.ProcessListContainerFunc = nil
|
||||
|
||||
_, err = m.ProcessListContainer(testSandboxID, testContainerID, options)
|
||||
_, err = m.ProcessListContainer(ctx, testSandboxID, testContainerID, options)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -608,22 +628,23 @@ func TestVCMockFetchSandbox(t *testing.T) {
|
||||
config := &vc.SandboxConfig{}
|
||||
assert.Nil(m.FetchSandboxFunc)
|
||||
|
||||
_, err := m.FetchSandbox(config.ID)
|
||||
ctx := context.Background()
|
||||
_, err := m.FetchSandbox(ctx, config.ID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.FetchSandboxFunc = func(id string) (vc.VCSandbox, error) {
|
||||
m.FetchSandboxFunc = func(ctx context.Context, id string) (vc.VCSandbox, error) {
|
||||
return &Sandbox{}, nil
|
||||
}
|
||||
|
||||
sandbox, err := m.FetchSandbox(config.ID)
|
||||
sandbox, err := m.FetchSandbox(ctx, config.ID)
|
||||
assert.NoError(err)
|
||||
assert.Equal(sandbox, &Sandbox{})
|
||||
|
||||
// reset
|
||||
m.FetchSandboxFunc = nil
|
||||
|
||||
_, err = m.FetchSandbox(config.ID)
|
||||
_, err = m.FetchSandbox(ctx, config.ID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
@@ -636,21 +657,22 @@ func TestVCMockPauseContainer(t *testing.T) {
|
||||
config := &vc.SandboxConfig{}
|
||||
assert.Nil(m.PauseContainerFunc)
|
||||
|
||||
err := m.PauseContainer(config.ID, config.ID)
|
||||
ctx := context.Background()
|
||||
err := m.PauseContainer(ctx, config.ID, config.ID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.PauseContainerFunc = func(sid, cid string) error {
|
||||
m.PauseContainerFunc = func(ctx context.Context, sid, cid string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
err = m.PauseContainer(config.ID, config.ID)
|
||||
err = m.PauseContainer(ctx, config.ID, config.ID)
|
||||
assert.NoError(err)
|
||||
|
||||
// reset
|
||||
m.PauseContainerFunc = nil
|
||||
|
||||
err = m.PauseContainer(config.ID, config.ID)
|
||||
err = m.PauseContainer(ctx, config.ID, config.ID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -662,21 +684,22 @@ func TestVCMockResumeContainer(t *testing.T) {
|
||||
config := &vc.SandboxConfig{}
|
||||
assert.Nil(m.ResumeContainerFunc)
|
||||
|
||||
err := m.ResumeContainer(config.ID, config.ID)
|
||||
ctx := context.Background()
|
||||
err := m.ResumeContainer(ctx, config.ID, config.ID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.ResumeContainerFunc = func(sid, cid string) error {
|
||||
m.ResumeContainerFunc = func(ctx context.Context, sid, cid string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
err = m.ResumeContainer(config.ID, config.ID)
|
||||
err = m.ResumeContainer(ctx, config.ID, config.ID)
|
||||
assert.NoError(err)
|
||||
|
||||
// reset
|
||||
m.ResumeContainerFunc = nil
|
||||
|
||||
err = m.ResumeContainer(config.ID, config.ID)
|
||||
err = m.ResumeContainer(ctx, config.ID, config.ID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -697,18 +720,19 @@ func TestVCMockSetVMFactory(t *testing.T) {
|
||||
HypervisorConfig: hyperConfig,
|
||||
}
|
||||
|
||||
f, err := factory.NewFactory(factory.Config{VMConfig: vmConfig}, false)
|
||||
ctx := context.Background()
|
||||
f, err := factory.NewFactory(ctx, factory.Config{VMConfig: vmConfig}, false)
|
||||
assert.Nil(err)
|
||||
|
||||
assert.Equal(factoryTriggered, 0)
|
||||
m.SetFactory(f)
|
||||
m.SetFactory(ctx, f)
|
||||
assert.Equal(factoryTriggered, 0)
|
||||
|
||||
m.SetFactoryFunc = func(factory vc.Factory) {
|
||||
m.SetFactoryFunc = func(ctx context.Context, factory vc.Factory) {
|
||||
factoryTriggered = 1
|
||||
}
|
||||
|
||||
m.SetFactory(f)
|
||||
m.SetFactory(ctx, f)
|
||||
assert.Equal(factoryTriggered, 1)
|
||||
}
|
||||
|
||||
@@ -719,21 +743,22 @@ func TestVCMockAddInterface(t *testing.T) {
|
||||
config := &vc.SandboxConfig{}
|
||||
assert.Nil(m.AddInterfaceFunc)
|
||||
|
||||
_, err := m.AddInterface(config.ID, nil)
|
||||
ctx := context.Background()
|
||||
_, err := m.AddInterface(ctx, config.ID, nil)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.AddInterfaceFunc = func(sid string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
m.AddInterfaceFunc = func(ctx context.Context, sid string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
_, err = m.AddInterface(config.ID, nil)
|
||||
_, err = m.AddInterface(ctx, config.ID, nil)
|
||||
assert.NoError(err)
|
||||
|
||||
// reset
|
||||
m.AddInterfaceFunc = nil
|
||||
|
||||
_, err = m.AddInterface(config.ID, nil)
|
||||
_, err = m.AddInterface(ctx, config.ID, nil)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -745,21 +770,22 @@ func TestVCMockRemoveInterface(t *testing.T) {
|
||||
config := &vc.SandboxConfig{}
|
||||
assert.Nil(m.RemoveInterfaceFunc)
|
||||
|
||||
_, err := m.RemoveInterface(config.ID, nil)
|
||||
ctx := context.Background()
|
||||
_, err := m.RemoveInterface(ctx, config.ID, nil)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.RemoveInterfaceFunc = func(sid string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
m.RemoveInterfaceFunc = func(ctx context.Context, sid string, inf *grpc.Interface) (*grpc.Interface, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
_, err = m.RemoveInterface(config.ID, nil)
|
||||
_, err = m.RemoveInterface(ctx, config.ID, nil)
|
||||
assert.NoError(err)
|
||||
|
||||
// reset
|
||||
m.RemoveInterfaceFunc = nil
|
||||
|
||||
_, err = m.RemoveInterface(config.ID, nil)
|
||||
_, err = m.RemoveInterface(ctx, config.ID, nil)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -771,21 +797,22 @@ func TestVCMockListInterfaces(t *testing.T) {
|
||||
config := &vc.SandboxConfig{}
|
||||
assert.Nil(m.ListInterfacesFunc)
|
||||
|
||||
_, err := m.ListInterfaces(config.ID)
|
||||
ctx := context.Background()
|
||||
_, err := m.ListInterfaces(ctx, config.ID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.ListInterfacesFunc = func(sid string) ([]*grpc.Interface, error) {
|
||||
m.ListInterfacesFunc = func(ctx context.Context, sid string) ([]*grpc.Interface, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
_, err = m.ListInterfaces(config.ID)
|
||||
_, err = m.ListInterfaces(ctx, config.ID)
|
||||
assert.NoError(err)
|
||||
|
||||
// reset
|
||||
m.ListInterfacesFunc = nil
|
||||
|
||||
_, err = m.ListInterfaces(config.ID)
|
||||
_, err = m.ListInterfaces(ctx, config.ID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -797,21 +824,22 @@ func TestVCMockUpdateRoutes(t *testing.T) {
|
||||
config := &vc.SandboxConfig{}
|
||||
assert.Nil(m.UpdateRoutesFunc)
|
||||
|
||||
_, err := m.UpdateRoutes(config.ID, nil)
|
||||
ctx := context.Background()
|
||||
_, err := m.UpdateRoutes(ctx, config.ID, nil)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.UpdateRoutesFunc = func(sid string, routes []*grpc.Route) ([]*grpc.Route, error) {
|
||||
m.UpdateRoutesFunc = func(ctx context.Context, sid string, routes []*grpc.Route) ([]*grpc.Route, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
_, err = m.UpdateRoutes(config.ID, nil)
|
||||
_, err = m.UpdateRoutes(ctx, config.ID, nil)
|
||||
assert.NoError(err)
|
||||
|
||||
// reset
|
||||
m.UpdateRoutesFunc = nil
|
||||
|
||||
_, err = m.UpdateRoutes(config.ID, nil)
|
||||
_, err = m.UpdateRoutes(ctx, config.ID, nil)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
@@ -823,21 +851,22 @@ func TestVCMockListRoutes(t *testing.T) {
|
||||
config := &vc.SandboxConfig{}
|
||||
assert.Nil(m.ListRoutesFunc)
|
||||
|
||||
_, err := m.ListRoutes(config.ID)
|
||||
ctx := context.Background()
|
||||
_, err := m.ListRoutes(ctx, config.ID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
|
||||
m.ListRoutesFunc = func(sid string) ([]*grpc.Route, error) {
|
||||
m.ListRoutesFunc = func(ctx context.Context, sid string) ([]*grpc.Route, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
_, err = m.ListRoutes(config.ID)
|
||||
_, err = m.ListRoutes(ctx, config.ID)
|
||||
assert.NoError(err)
|
||||
|
||||
// reset
|
||||
m.ListRoutesFunc = nil
|
||||
|
||||
_, err = m.ListRoutes(config.ID)
|
||||
_, err = m.ListRoutes(ctx, config.ID)
|
||||
assert.Error(err)
|
||||
assert.True(IsMockError(err))
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package vcmock
|
||||
|
||||
import (
|
||||
"context"
|
||||
"syscall"
|
||||
|
||||
"github.com/kata-containers/agent/protocols/grpc"
|
||||
@@ -38,38 +39,38 @@ type Container struct {
|
||||
// VCMock is a type that provides an implementation of the VC interface.
|
||||
// It is used for testing.
|
||||
type VCMock struct {
|
||||
SetLoggerFunc func(logger logrus.FieldLogger)
|
||||
SetFactoryFunc func(factory vc.Factory)
|
||||
SetLoggerFunc func(ctx context.Context, logger *logrus.Entry)
|
||||
SetFactoryFunc func(ctx context.Context, factory vc.Factory)
|
||||
|
||||
CreateSandboxFunc func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error)
|
||||
DeleteSandboxFunc func(sandboxID string) (vc.VCSandbox, error)
|
||||
ListSandboxFunc func() ([]vc.SandboxStatus, error)
|
||||
FetchSandboxFunc func(sandboxID string) (vc.VCSandbox, error)
|
||||
PauseSandboxFunc func(sandboxID string) (vc.VCSandbox, error)
|
||||
ResumeSandboxFunc func(sandboxID string) (vc.VCSandbox, error)
|
||||
RunSandboxFunc func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error)
|
||||
StartSandboxFunc func(sandboxID string) (vc.VCSandbox, error)
|
||||
StatusSandboxFunc func(sandboxID string) (vc.SandboxStatus, error)
|
||||
StatsContainerFunc func(sandboxID, containerID string) (vc.ContainerStats, error)
|
||||
StopSandboxFunc func(sandboxID string) (vc.VCSandbox, error)
|
||||
CreateSandboxFunc func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error)
|
||||
DeleteSandboxFunc func(ctx context.Context, sandboxID string) (vc.VCSandbox, error)
|
||||
ListSandboxFunc func(ctx context.Context) ([]vc.SandboxStatus, error)
|
||||
FetchSandboxFunc func(ctx context.Context, sandboxID string) (vc.VCSandbox, error)
|
||||
PauseSandboxFunc func(ctx context.Context, sandboxID string) (vc.VCSandbox, error)
|
||||
ResumeSandboxFunc func(ctx context.Context, sandboxID string) (vc.VCSandbox, error)
|
||||
RunSandboxFunc func(ctx context.Context, sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error)
|
||||
StartSandboxFunc func(ctx context.Context, sandboxID string) (vc.VCSandbox, error)
|
||||
StatusSandboxFunc func(ctx context.Context, sandboxID string) (vc.SandboxStatus, error)
|
||||
StatsContainerFunc func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStats, error)
|
||||
StopSandboxFunc func(ctx context.Context, sandboxID string) (vc.VCSandbox, error)
|
||||
|
||||
CreateContainerFunc func(sandboxID string, containerConfig vc.ContainerConfig) (vc.VCSandbox, vc.VCContainer, error)
|
||||
DeleteContainerFunc func(sandboxID, containerID string) (vc.VCContainer, error)
|
||||
EnterContainerFunc func(sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error)
|
||||
KillContainerFunc func(sandboxID, containerID string, signal syscall.Signal, all bool) error
|
||||
StartContainerFunc func(sandboxID, containerID string) (vc.VCContainer, error)
|
||||
StatusContainerFunc func(sandboxID, containerID string) (vc.ContainerStatus, error)
|
||||
StopContainerFunc func(sandboxID, containerID string) (vc.VCContainer, error)
|
||||
ProcessListContainerFunc func(sandboxID, containerID string, options vc.ProcessListOptions) (vc.ProcessList, error)
|
||||
UpdateContainerFunc func(sandboxID, containerID string, resources specs.LinuxResources) error
|
||||
PauseContainerFunc func(sandboxID, containerID string) error
|
||||
ResumeContainerFunc func(sandboxID, containerID string) error
|
||||
CreateContainerFunc func(ctx context.Context, sandboxID string, containerConfig vc.ContainerConfig) (vc.VCSandbox, vc.VCContainer, error)
|
||||
DeleteContainerFunc func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error)
|
||||
EnterContainerFunc func(ctx context.Context, sandboxID, containerID string, cmd vc.Cmd) (vc.VCSandbox, vc.VCContainer, *vc.Process, error)
|
||||
KillContainerFunc func(ctx context.Context, sandboxID, containerID string, signal syscall.Signal, all bool) error
|
||||
StartContainerFunc func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error)
|
||||
StatusContainerFunc func(ctx context.Context, sandboxID, containerID string) (vc.ContainerStatus, error)
|
||||
StopContainerFunc func(ctx context.Context, sandboxID, containerID string) (vc.VCContainer, error)
|
||||
ProcessListContainerFunc func(ctx context.Context, sandboxID, containerID string, options vc.ProcessListOptions) (vc.ProcessList, error)
|
||||
UpdateContainerFunc func(ctx context.Context, sandboxID, containerID string, resources specs.LinuxResources) error
|
||||
PauseContainerFunc func(ctx context.Context, sandboxID, containerID string) error
|
||||
ResumeContainerFunc func(ctx context.Context, sandboxID, containerID string) error
|
||||
|
||||
AddDeviceFunc func(sandboxID string, info config.DeviceInfo) (api.Device, error)
|
||||
AddDeviceFunc func(ctx context.Context, sandboxID string, info config.DeviceInfo) (api.Device, error)
|
||||
|
||||
AddInterfaceFunc func(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error)
|
||||
RemoveInterfaceFunc func(sandboxID string, inf *grpc.Interface) (*grpc.Interface, error)
|
||||
ListInterfacesFunc func(sandboxID string) ([]*grpc.Interface, error)
|
||||
UpdateRoutesFunc func(sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error)
|
||||
ListRoutesFunc func(sandboxID string) ([]*grpc.Route, error)
|
||||
AddInterfaceFunc func(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error)
|
||||
RemoveInterfaceFunc func(ctx context.Context, sandboxID string, inf *grpc.Interface) (*grpc.Interface, error)
|
||||
ListInterfacesFunc func(ctx context.Context, sandboxID string) ([]*grpc.Interface, error)
|
||||
UpdateRoutesFunc func(ctx context.Context, sandboxID string, routes []*grpc.Route) ([]*grpc.Route, error)
|
||||
ListRoutesFunc func(ctx context.Context, sandboxID string) ([]*grpc.Route, error)
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
|
||||
govmmQemu "github.com/intel/govmm/qemu"
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/uuid"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/kata-containers/runtime/virtcontainers/device/config"
|
||||
@@ -67,6 +68,8 @@ type qemu struct {
|
||||
// fds is a list of file descriptors inherited by QEMU process
|
||||
// they'll be closed once QEMU process is running
|
||||
fds []*os.File
|
||||
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
const (
|
||||
@@ -152,6 +155,9 @@ func (q *qemu) kernelParameters() string {
|
||||
|
||||
// Adds all capabilities supported by qemu implementation of hypervisor interface
|
||||
func (q *qemu) capabilities() capabilities {
|
||||
span, _ := q.trace("capabilities")
|
||||
defer span.Finish()
|
||||
|
||||
return q.arch.capabilities()
|
||||
}
|
||||
|
||||
@@ -176,8 +182,28 @@ func (q *qemu) qemuPath() (string, error) {
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (q *qemu) trace(name string) (opentracing.Span, context.Context) {
|
||||
if q.ctx == nil {
|
||||
q.Logger().WithField("type", "bug").Error("trace called before context set")
|
||||
q.ctx = context.Background()
|
||||
}
|
||||
|
||||
span, ctx := opentracing.StartSpanFromContext(q.ctx, name)
|
||||
|
||||
span.SetTag("subsystem", "hypervisor")
|
||||
span.SetTag("type", "qemu")
|
||||
|
||||
return span, ctx
|
||||
}
|
||||
|
||||
// init intializes the Qemu structure.
|
||||
func (q *qemu) init(id string, hypervisorConfig *HypervisorConfig, vmConfig Resources, storage resourceStorage) error {
|
||||
func (q *qemu) init(ctx context.Context, id string, hypervisorConfig *HypervisorConfig, vmConfig Resources, storage resourceStorage) error {
|
||||
// save
|
||||
q.ctx = ctx
|
||||
|
||||
span, _ := q.trace("init")
|
||||
defer span.Finish()
|
||||
|
||||
err := hypervisorConfig.valid()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -298,7 +324,7 @@ func (q *qemu) createQmpSocket() ([]govmmQemu.QMPSocket, error) {
|
||||
}
|
||||
|
||||
q.qmpMonitorCh = qmpChannel{
|
||||
ctx: context.Background(),
|
||||
ctx: q.ctx,
|
||||
path: monitorSockPath,
|
||||
}
|
||||
|
||||
@@ -364,6 +390,9 @@ func (q *qemu) setupTemplate(knobs *govmmQemu.Knobs, memory *govmmQemu.Memory) g
|
||||
|
||||
// createSandbox is the Hypervisor sandbox creation implementation for govmmQemu.
|
||||
func (q *qemu) createSandbox() error {
|
||||
span, _ := q.trace("createSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
machine, err := q.getQemuMachine()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -467,6 +496,9 @@ func (q *qemu) createSandbox() error {
|
||||
|
||||
// startSandbox will start the Sandbox's VM.
|
||||
func (q *qemu) startSandbox() error {
|
||||
span, _ := q.trace("startSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if q.config.Debug {
|
||||
params := q.arch.kernelParameters(q.config.Debug)
|
||||
strParams := SerializeParams(params, "=")
|
||||
@@ -511,6 +543,9 @@ func (q *qemu) startSandbox() error {
|
||||
|
||||
// waitSandbox will wait for the Sandbox's VM to be up and running.
|
||||
func (q *qemu) waitSandbox(timeout int) error {
|
||||
span, _ := q.trace("waitSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if timeout < 0 {
|
||||
return fmt.Errorf("Invalid timeout %ds", timeout)
|
||||
}
|
||||
@@ -562,6 +597,9 @@ func (q *qemu) waitSandbox(timeout int) error {
|
||||
|
||||
// stopSandbox will stop the Sandbox's VM.
|
||||
func (q *qemu) stopSandbox() error {
|
||||
span, _ := q.trace("stopSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
q.Logger().Info("Stopping Sandbox")
|
||||
|
||||
err := q.qmpSetup()
|
||||
@@ -584,6 +622,9 @@ func (q *qemu) stopSandbox() error {
|
||||
}
|
||||
|
||||
func (q *qemu) togglePauseSandbox(pause bool) error {
|
||||
span, _ := q.trace("togglePauseSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
err := q.qmpSetup()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -864,6 +905,9 @@ func (q *qemu) hotplugDevice(devInfo interface{}, devType deviceType, op operati
|
||||
}
|
||||
|
||||
func (q *qemu) hotplugAddDevice(devInfo interface{}, devType deviceType) (interface{}, error) {
|
||||
span, _ := q.trace("hotplugAddDevice")
|
||||
defer span.Finish()
|
||||
|
||||
data, err := q.hotplugDevice(devInfo, devType, addDevice)
|
||||
if err != nil {
|
||||
return data, err
|
||||
@@ -873,6 +917,9 @@ func (q *qemu) hotplugAddDevice(devInfo interface{}, devType deviceType) (interf
|
||||
}
|
||||
|
||||
func (q *qemu) hotplugRemoveDevice(devInfo interface{}, devType deviceType) (interface{}, error) {
|
||||
span, _ := q.trace("hotplugRemoveDevice")
|
||||
defer span.Finish()
|
||||
|
||||
data, err := q.hotplugDevice(devInfo, devType, removeDevice)
|
||||
if err != nil {
|
||||
return data, err
|
||||
@@ -1030,15 +1077,24 @@ func (q *qemu) hotplugAddMemory(memDev *memoryDevice) error {
|
||||
}
|
||||
|
||||
func (q *qemu) pauseSandbox() error {
|
||||
span, _ := q.trace("pauseSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
return q.togglePauseSandbox(true)
|
||||
}
|
||||
|
||||
func (q *qemu) resumeSandbox() error {
|
||||
span, _ := q.trace("resumeSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
return q.togglePauseSandbox(false)
|
||||
}
|
||||
|
||||
// addDevice will add extra devices to Qemu command line.
|
||||
func (q *qemu) addDevice(devInfo interface{}, devType deviceType) error {
|
||||
span, _ := q.trace("addDevice")
|
||||
defer span.Finish()
|
||||
|
||||
switch v := devInfo.(type) {
|
||||
case Volume:
|
||||
q.qemuConfig.Devices = q.arch.append9PVolume(q.qemuConfig.Devices, v)
|
||||
@@ -1065,6 +1121,9 @@ func (q *qemu) addDevice(devInfo interface{}, devType deviceType) error {
|
||||
// getSandboxConsole builds the path of the console where we can read
|
||||
// logs coming from the sandbox.
|
||||
func (q *qemu) getSandboxConsole(id string) (string, error) {
|
||||
span, _ := q.trace("getSandboxConsole")
|
||||
defer span.Finish()
|
||||
|
||||
return utils.BuildSocketPath(RunVMStoragePath, id, consoleSocket)
|
||||
}
|
||||
|
||||
@@ -1101,6 +1160,9 @@ func (q *qemu) saveSandbox() error {
|
||||
}
|
||||
|
||||
func (q *qemu) disconnect() {
|
||||
span, _ := q.trace("disconnect")
|
||||
defer span.Finish()
|
||||
|
||||
q.qmpShutdown()
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
@@ -86,7 +87,7 @@ func TestQemuInit(t *testing.T) {
|
||||
t.Fatalf("Could not create parent directory %s: %v", parentDir, err)
|
||||
}
|
||||
|
||||
if err := q.init(sandbox.id, &sandbox.config.HypervisorConfig, sandbox.config.VMConfig, sandbox.storage); err != nil {
|
||||
if err := q.init(context.Background(), sandbox.id, &sandbox.config.HypervisorConfig, sandbox.config.VMConfig, sandbox.storage); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
@@ -117,7 +118,7 @@ func TestQemuInitMissingParentDirFail(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := q.init(sandbox.id, &sandbox.config.HypervisorConfig, sandbox.config.VMConfig, sandbox.storage); err != nil {
|
||||
if err := q.init(context.Background(), sandbox.id, &sandbox.config.HypervisorConfig, sandbox.config.VMConfig, sandbox.storage); err != nil {
|
||||
t.Fatalf("Qemu init() is not expected to fail because of missing parent directory for storage: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
@@ -17,6 +18,7 @@ import (
|
||||
|
||||
"github.com/containernetworking/plugins/pkg/ns"
|
||||
specs "github.com/opencontainers/runtime-spec/specs-go"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/kata-containers/agent/protocols/grpc"
|
||||
@@ -360,6 +362,19 @@ type SandboxConfig struct {
|
||||
Stateful bool
|
||||
}
|
||||
|
||||
func (s *Sandbox) trace(name string) (opentracing.Span, context.Context) {
|
||||
if s.ctx == nil {
|
||||
s.Logger().WithField("type", "bug").Error("trace called before context set")
|
||||
s.ctx = context.Background()
|
||||
}
|
||||
|
||||
span, ctx := opentracing.StartSpanFromContext(s.ctx, name)
|
||||
|
||||
span.SetTag("subsystem", "sandbox")
|
||||
|
||||
return span, ctx
|
||||
}
|
||||
|
||||
func (s *Sandbox) startProxy() error {
|
||||
|
||||
// If the proxy is KataBuiltInProxyType type, it needs to restart the proxy
|
||||
@@ -477,6 +492,8 @@ type Sandbox struct {
|
||||
shmSize uint64
|
||||
sharePidNs bool
|
||||
stateful bool
|
||||
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
// ID returns the sandbox identifier string.
|
||||
@@ -667,7 +684,10 @@ func (s *Sandbox) IOStream(containerID, processID string) (io.WriteCloser, io.Re
|
||||
return c.ioStream(processID)
|
||||
}
|
||||
|
||||
func createAssets(sandboxConfig *SandboxConfig) error {
|
||||
func createAssets(ctx context.Context, sandboxConfig *SandboxConfig) error {
|
||||
span, _ := trace(ctx, "createAssets")
|
||||
defer span.Finish()
|
||||
|
||||
kernel, err := newAsset(sandboxConfig, kernelAsset)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -701,12 +721,15 @@ func createAssets(sandboxConfig *SandboxConfig) error {
|
||||
// It will create and store the sandbox structure, and then ask the hypervisor
|
||||
// to physically create that sandbox i.e. starts a VM for that sandbox to eventually
|
||||
// be started.
|
||||
func createSandbox(sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error) {
|
||||
if err := createAssets(&sandboxConfig); err != nil {
|
||||
func createSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error) {
|
||||
span, ctx := trace(ctx, "createSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if err := createAssets(ctx, &sandboxConfig); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s, err := newSandbox(sandboxConfig, factory)
|
||||
s, err := newSandbox(ctx, sandboxConfig, factory)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -746,7 +769,10 @@ func createSandbox(sandboxConfig SandboxConfig, factory Factory) (*Sandbox, erro
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func newSandbox(sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error) {
|
||||
func newSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error) {
|
||||
span, ctx := trace(ctx, "newSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxConfig.valid() == false {
|
||||
return nil, fmt.Errorf("Invalid sandbox configuration")
|
||||
}
|
||||
@@ -778,6 +804,7 @@ func newSandbox(sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error)
|
||||
shmSize: sandboxConfig.ShmSize,
|
||||
sharePidNs: sandboxConfig.SharePidNs,
|
||||
stateful: sandboxConfig.Stateful,
|
||||
ctx: ctx,
|
||||
}
|
||||
|
||||
if err = globalSandboxList.addSandbox(s); err != nil {
|
||||
@@ -791,7 +818,7 @@ func newSandbox(sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error)
|
||||
}
|
||||
}()
|
||||
|
||||
if err = s.storage.createAllResources(s); err != nil {
|
||||
if err = s.storage.createAllResources(ctx, s); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -801,7 +828,7 @@ func newSandbox(sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error)
|
||||
}
|
||||
}()
|
||||
|
||||
if err = s.hypervisor.init(s.id, &sandboxConfig.HypervisorConfig, sandboxConfig.VMConfig, s.storage); err != nil {
|
||||
if err = s.hypervisor.init(ctx, s.id, &sandboxConfig.HypervisorConfig, sandboxConfig.VMConfig, s.storage); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -810,7 +837,7 @@ func newSandbox(sandboxConfig SandboxConfig, factory Factory) (*Sandbox, error)
|
||||
}
|
||||
|
||||
agentConfig := newAgentConfig(sandboxConfig.AgentType, sandboxConfig.AgentConfig)
|
||||
if err = s.agent.init(s, agentConfig); err != nil {
|
||||
if err = s.agent.init(ctx, s, agentConfig); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -823,6 +850,9 @@ func (s *Sandbox) storeSandboxDevices() error {
|
||||
|
||||
// storeSandbox stores a sandbox config.
|
||||
func (s *Sandbox) storeSandbox() error {
|
||||
span, _ := s.trace("storeSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
err := s.storage.storeSandboxResource(s.id, configFileType, *(s.config))
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -839,7 +869,7 @@ func (s *Sandbox) storeSandbox() error {
|
||||
}
|
||||
|
||||
// fetchSandbox fetches a sandbox config from a sandbox ID and returns a sandbox.
|
||||
func fetchSandbox(sandboxID string) (sandbox *Sandbox, err error) {
|
||||
func fetchSandbox(ctx context.Context, sandboxID string) (sandbox *Sandbox, err error) {
|
||||
virtLog.Info("fetch sandbox")
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandboxID
|
||||
@@ -857,7 +887,7 @@ func fetchSandbox(sandboxID string) (sandbox *Sandbox, err error) {
|
||||
}
|
||||
|
||||
// fetchSandbox is not suppose to create new sandbox VM.
|
||||
sandbox, err = createSandbox(config, nil)
|
||||
sandbox, err = createSandbox(ctx, config, nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create sandbox with config %+v: %v", config, err)
|
||||
}
|
||||
@@ -938,6 +968,9 @@ func (s *Sandbox) Delete() error {
|
||||
}
|
||||
|
||||
func (s *Sandbox) createNetwork() error {
|
||||
span, _ := s.trace("createNetwork")
|
||||
defer span.Finish()
|
||||
|
||||
var netNsPath string
|
||||
var netNsCreated bool
|
||||
var networkNS NetworkNamespace
|
||||
@@ -951,7 +984,7 @@ func (s *Sandbox) createNetwork() error {
|
||||
}()
|
||||
|
||||
// Initialize the network.
|
||||
netNsPath, netNsCreated, err = s.network.init(s.config.NetworkConfig)
|
||||
netNsPath, netNsCreated, err = s.network.init(s.ctx, s.config.NetworkConfig)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -977,6 +1010,9 @@ func (s *Sandbox) createNetwork() error {
|
||||
}
|
||||
|
||||
func (s *Sandbox) removeNetwork() error {
|
||||
span, _ := s.trace("removeNetwork")
|
||||
defer span.Finish()
|
||||
|
||||
return s.network.remove(s, s.networkNS, s.networkNS.NetNsCreated)
|
||||
}
|
||||
|
||||
@@ -1069,13 +1105,16 @@ func (s *Sandbox) ListRoutes() ([]*grpc.Route, error) {
|
||||
|
||||
// startVM starts the VM.
|
||||
func (s *Sandbox) startVM() error {
|
||||
span, ctx := s.trace("startVM")
|
||||
defer span.Finish()
|
||||
|
||||
s.Logger().Info("Starting VM")
|
||||
|
||||
// FIXME: This would break cached VMs. We need network hotplug and move
|
||||
// oci hooks and netns handling to cli. See #273.
|
||||
if err := s.network.run(s.networkNS.NetNsPath, func() error {
|
||||
if s.factory != nil {
|
||||
vm, err := s.factory.GetVM(VMConfig{
|
||||
vm, err := s.factory.GetVM(ctx, VMConfig{
|
||||
HypervisorType: s.config.HypervisorType,
|
||||
HypervisorConfig: s.config.HypervisorConfig,
|
||||
AgentType: s.config.AgentType,
|
||||
@@ -1109,6 +1148,9 @@ func (s *Sandbox) startVM() error {
|
||||
|
||||
// stopVM: stop the sandbox's VM
|
||||
func (s *Sandbox) stopVM() error {
|
||||
span, _ := s.trace("stopVM")
|
||||
defer span.Finish()
|
||||
|
||||
return s.hypervisor.stopSandbox()
|
||||
}
|
||||
|
||||
@@ -1291,6 +1333,9 @@ func (s *Sandbox) StatsContainer(containerID string) (ContainerStats, error) {
|
||||
// createContainers registers all containers to the proxy, create the
|
||||
// containers in the guest and starts one shim per container.
|
||||
func (s *Sandbox) createContainers() error {
|
||||
span, _ := s.trace("createContainers")
|
||||
defer span.Finish()
|
||||
|
||||
for _, contConfig := range s.config.Containers {
|
||||
newContainer, err := createContainer(s, contConfig)
|
||||
if err != nil {
|
||||
@@ -1330,6 +1375,9 @@ func (s *Sandbox) start() error {
|
||||
// stop stops a sandbox. The containers that are making the sandbox
|
||||
// will be destroyed.
|
||||
func (s *Sandbox) stop() error {
|
||||
span, _ := s.trace("stop")
|
||||
defer span.Finish()
|
||||
|
||||
if err := s.state.validTransition(s.state.State, StateStopped); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1510,7 +1558,10 @@ func (s *Sandbox) deleteContainersState() error {
|
||||
|
||||
// togglePauseSandbox pauses a sandbox if pause is set to true, else it resumes
|
||||
// it.
|
||||
func togglePauseSandbox(sandboxID string, pause bool) (*Sandbox, error) {
|
||||
func togglePauseSandbox(ctx context.Context, sandboxID string, pause bool) (*Sandbox, error) {
|
||||
span, ctx := trace(ctx, "togglePauseSandbox")
|
||||
defer span.Finish()
|
||||
|
||||
if sandboxID == "" {
|
||||
return nil, errNeedSandbox
|
||||
}
|
||||
@@ -1522,7 +1573,7 @@ func togglePauseSandbox(sandboxID string, pause bool) (*Sandbox, error) {
|
||||
defer unlockSandbox(lockFile)
|
||||
|
||||
// Fetch the sandbox from storage and create it.
|
||||
s, err := fetchSandbox(sandboxID)
|
||||
s, err := fetchSandbox(ctx, sandboxID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1544,6 +1595,9 @@ func togglePauseSandbox(sandboxID string, pause bool) (*Sandbox, error) {
|
||||
// HotplugAddDevice is used for add a device to sandbox
|
||||
// Sandbox implement DeviceReceiver interface from device/api/interface.go
|
||||
func (s *Sandbox) HotplugAddDevice(device api.Device, devType config.DeviceType) error {
|
||||
span, _ := s.trace("HotplugAddDevice")
|
||||
defer span.Finish()
|
||||
|
||||
switch devType {
|
||||
case config.DeviceVFIO:
|
||||
vfioDevices, ok := device.GetDeviceInfo().([]*config.VFIODev)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
@@ -51,7 +52,7 @@ func testCreateSandbox(t *testing.T, id string,
|
||||
Containers: containers,
|
||||
}
|
||||
|
||||
sandbox, err := createSandbox(sconfig, nil)
|
||||
sandbox, err := createSandbox(context.Background(), sconfig, nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Could not create sandbox: %s", err)
|
||||
}
|
||||
@@ -585,7 +586,7 @@ func TestSandboxSetSandboxAndContainerState(t *testing.T) {
|
||||
}
|
||||
|
||||
// force state to be read from disk
|
||||
p2, err := fetchSandbox(p.ID())
|
||||
p2, err := fetchSandbox(context.Background(), p.ID())
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to fetch sandbox %v: %v", p.ID(), err)
|
||||
}
|
||||
@@ -1184,7 +1185,7 @@ func TestSandboxAttachDevicesVFIO(t *testing.T) {
|
||||
}
|
||||
|
||||
containers[c.id].sandbox = &sandbox
|
||||
err = sandbox.storage.createAllResources(&sandbox)
|
||||
err = sandbox.storage.createAllResources(context.Background(), &sandbox)
|
||||
assert.Nil(t, err, "Error while create all resources for sandbox")
|
||||
|
||||
err = sandbox.storeSandboxDevices()
|
||||
@@ -1226,7 +1227,7 @@ func TestSandboxCreateAssets(t *testing.T) {
|
||||
HypervisorConfig: hc,
|
||||
}
|
||||
|
||||
err = createAssets(p)
|
||||
err = createAssets(context.Background(), p)
|
||||
assert.Nil(err)
|
||||
|
||||
a, ok := p.HypervisorConfig.customAssets[kernelAsset]
|
||||
@@ -1242,7 +1243,7 @@ func TestSandboxCreateAssets(t *testing.T) {
|
||||
HypervisorConfig: hc,
|
||||
}
|
||||
|
||||
err = createAssets(p)
|
||||
err = createAssets(context.Background(), p)
|
||||
assert.NotNil(err)
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
@@ -17,7 +18,7 @@ func TestBindMountInvalidSourceSymlink(t *testing.T) {
|
||||
source := filepath.Join(testDir, "fooFile")
|
||||
os.Remove(source)
|
||||
|
||||
err := bindMount(source, "", false)
|
||||
err := bindMount(context.Background(), source, "", false)
|
||||
if err == nil {
|
||||
t.Fatal()
|
||||
}
|
||||
@@ -39,7 +40,7 @@ func TestBindMountFailingMount(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = bindMount(source, "", false)
|
||||
err = bindMount(context.Background(), source, "", false)
|
||||
if err == nil {
|
||||
t.Fatal()
|
||||
}
|
||||
@@ -66,7 +67,7 @@ func TestBindMountSuccessful(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = bindMount(source, dest, false)
|
||||
err = bindMount(context.Background(), source, dest, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -95,7 +96,7 @@ func TestBindMountReadonlySuccessful(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = bindMount(source, dest, true)
|
||||
err = bindMount(context.Background(), source, dest, true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
@@ -73,7 +74,7 @@ func TestMain(m *testing.M) {
|
||||
logger.Logger.Level = logrus.DebugLevel
|
||||
}
|
||||
}
|
||||
SetLogger(logger)
|
||||
SetLogger(context.Background(), logger)
|
||||
|
||||
testDir, err = ioutil.TempDir("", "vc-tmp-")
|
||||
if err != nil {
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
@@ -41,7 +42,7 @@ func (c *VMConfig) Valid() error {
|
||||
}
|
||||
|
||||
// NewVM creates a new VM based on provided VMConfig.
|
||||
func NewVM(config VMConfig) (*VM, error) {
|
||||
func NewVM(ctx context.Context, config VMConfig) (*VM, error) {
|
||||
hypervisor, err := newHypervisor(config.HypervisorType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -61,7 +62,7 @@ func NewVM(config VMConfig) (*VM, error) {
|
||||
}
|
||||
}()
|
||||
|
||||
if err = hypervisor.init(id, &config.HypervisorConfig, Resources{}, &filesystem{}); err != nil {
|
||||
if err = hypervisor.init(ctx, id, &config.HypervisorConfig, Resources{}, &filesystem{}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package virtcontainers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
@@ -25,12 +26,14 @@ func TestNewVM(t *testing.T) {
|
||||
ImagePath: testDir,
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
var vm *VM
|
||||
_, err := NewVM(config)
|
||||
_, err := NewVM(ctx, config)
|
||||
assert.Error(err)
|
||||
|
||||
config.HypervisorConfig = hyperConfig
|
||||
vm, err = NewVM(config)
|
||||
vm, err = NewVM(ctx, config)
|
||||
assert.Nil(err)
|
||||
|
||||
// VM operations
|
||||
@@ -55,15 +58,15 @@ func TestNewVM(t *testing.T) {
|
||||
|
||||
// template VM
|
||||
config.HypervisorConfig.BootFromTemplate = true
|
||||
_, err = NewVM(config)
|
||||
_, err = NewVM(ctx, config)
|
||||
assert.Error(err)
|
||||
|
||||
config.HypervisorConfig.MemoryPath = testDir
|
||||
_, err = NewVM(config)
|
||||
_, err = NewVM(ctx, config)
|
||||
assert.Error(err)
|
||||
|
||||
config.HypervisorConfig.DevicesStatePath = testDir
|
||||
_, err = NewVM(config)
|
||||
_, err = NewVM(ctx, config)
|
||||
assert.Nil(err)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user