diff --git a/src/runtime/virtcontainers/fs_share.go b/src/runtime/virtcontainers/fs_share.go new file mode 100644 index 0000000000..fa8374c3b8 --- /dev/null +++ b/src/runtime/virtcontainers/fs_share.go @@ -0,0 +1,77 @@ +// Copyright (c) 2022 Apple Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// + +package virtcontainers + +import ( + "context" + + "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/pkg/agent/protocols/grpc" +) + +// fsShareTracingTags defines tags for the trace span +var fsShareTracingTags = map[string]string{ + "source": "runtime", + "package": "virtcontainers", + "subsystem": "fs_share", +} + +// SharedFile represents the outcome of a host filesystem sharing +// operation. +type SharedFile struct { + storage *grpc.Storage + guestPath string +} + +type FilesystemSharer interface { + // Prepare will set the host filesystem up, making it ready + // to share container files and directories with the guest. + // It will be called before any container is running. + // + // For example, the Linux implementation would create and + // prepare the host shared folders, and also make all + // sandbox mounts ready to be shared. + // + // Implementation of this method must be idempotent and be + // ready to potentially be called several times in a row, + // without symmetric calls to Cleanup in between. + Prepare(context.Context) error + + // Cleanup cleans the host filesystem up from the initial + // setup created by Prepare. + // It will be called after all containers are terminated. + // + // Implementation of this method must be idempotent and be + // ready to potentially be called several times in a row, + // without symmetric calls to Prepare in between. + Cleanup(context.Context) error + + // ShareFile shares a file (a regular file or a directory) + // from the host filesystem with a container running in the + // guest. The host file to be shared is described by the + // Mount argument. + // This method should be called for each container file to + // be shared with the guest. + // + // The returned SharedFile pointer describes how the file + // should be shared between the host and the guest. If it + // is nil, then the shared filed described by the Mount + // argument will be ignored by the guest, i.e. it will NOT + // be shared with the guest. + ShareFile(context.Context, *Container, *Mount) (*SharedFile, error) + + // UnshareFile stops sharing a container file, described by + // the Mount argument. + UnshareFile(context.Context, *Container, *Mount) error + + // ShareRootFilesystem shares a container bundle rootfs with + // the Kata guest, allowing the kata agent to eventually start + // the container from that shared rootfs. + ShareRootFilesystem(context.Context, *Container) (*SharedFile, error) + + // UnshareRootFilesystem stops sharing a container bundle + // rootfs. + UnshareRootFilesystem(context.Context, *Container) error +}