From 8b20c3f26d8e1334d6c0470fdaf292c48fa97a30 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Thu, 23 Aug 2018 16:29:39 -0700 Subject: [PATCH] virtcontainers: storage: Separate storage interface from implementations The storage implementation of filesystem was in the same file where the resource storage interface was declared. It's more proper to separate implementations and interface into different files. Fixes #633 Signed-off-by: Sebastien Boeuf --- ...stem.go => filesystem_resource_storage.go} | 54 --------------- ...go => filesystem_resource_storage_test.go} | 0 virtcontainers/resource_storage.go | 67 +++++++++++++++++++ 3 files changed, 67 insertions(+), 54 deletions(-) rename virtcontainers/{filesystem.go => filesystem_resource_storage.go} (89%) rename virtcontainers/{filesystem_test.go => filesystem_resource_storage_test.go} (100%) create mode 100644 virtcontainers/resource_storage.go diff --git a/virtcontainers/filesystem.go b/virtcontainers/filesystem_resource_storage.go similarity index 89% rename from virtcontainers/filesystem.go rename to virtcontainers/filesystem_resource_storage.go index 0723a39bba..b2ccc77943 100644 --- a/virtcontainers/filesystem.go +++ b/virtcontainers/filesystem_resource_storage.go @@ -112,49 +112,6 @@ var runStoragePath = filepath.Join("/run", storagePathSuffix, sandboxPathSuffix) // It will contain all guest vm sockets and shared mountpoints. var RunVMStoragePath = filepath.Join("/run", storagePathSuffix, vmPathSuffix) -// resourceStorage is the virtcontainers resources (configuration, state, etc...) -// storage interface. -// The default resource storage implementation is filesystem. -type resourceStorage interface { - // Create all resources for a sandbox - createAllResources(ctx context.Context, sandbox *Sandbox) error - - // Resources URIs functions return both the URI - // for the actual resource and the URI base. - containerURI(sandboxID, containerID string, resource sandboxResource) (string, string, error) - sandboxURI(sandboxID string, resource sandboxResource) (string, string, error) - - // Sandbox resources - storeSandboxResource(sandboxID string, resource sandboxResource, data interface{}) error - deleteSandboxResources(sandboxID string, resources []sandboxResource) error - fetchSandboxConfig(sandboxID string) (SandboxConfig, error) - fetchSandboxState(sandboxID string) (State, error) - fetchSandboxNetwork(sandboxID string) (NetworkNamespace, error) - storeSandboxNetwork(sandboxID string, networkNS NetworkNamespace) error - fetchSandboxDevices(sandboxID string) ([]api.Device, error) - storeSandboxDevices(sandboxID string, devices []api.Device) error - - // Hypervisor resources - fetchHypervisorState(sandboxID string, state interface{}) error - storeHypervisorState(sandboxID string, state interface{}) error - - // Agent resources - fetchAgentState(sandboxID string, state interface{}) error - storeAgentState(sandboxID string, state interface{}) error - - // Container resources - storeContainerResource(sandboxID, containerID string, resource sandboxResource, data interface{}) error - deleteContainerResources(sandboxID, containerID string, resources []sandboxResource) error - fetchContainerConfig(sandboxID, containerID string) (ContainerConfig, error) - fetchContainerState(sandboxID, containerID string) (State, error) - fetchContainerProcess(sandboxID, containerID string) (Process, error) - storeContainerProcess(sandboxID, containerID string, process Process) error - fetchContainerMounts(sandboxID, containerID string) ([]Mount, error) - storeContainerMounts(sandboxID, containerID string, mounts []Mount) error - fetchContainerDevices(sandboxID, containerID string) ([]ContainerDevice, error) - storeContainerDevices(sandboxID, containerID string, devices []ContainerDevice) error -} - // filesystem is a resourceStorage interface implementation for a local filesystem. type filesystem struct { ctx context.Context @@ -246,17 +203,6 @@ func (fs *filesystem) storeFile(file string, data interface{}) error { return nil } -// TypedDevice is used as an intermediate representation for marshalling -// and unmarshalling Device implementations. -type TypedDevice struct { - Type string - - // Data is assigned the Device object. - // This being declared as RawMessage prevents it from being marshalled/unmarshalled. - // We do that explicitly depending on Type. - Data json.RawMessage -} - // storeDeviceIDFile is used to marshal and store device IDs to disk. func (fs *filesystem) storeDeviceIDFile(file string, data interface{}) error { if file == "" { diff --git a/virtcontainers/filesystem_test.go b/virtcontainers/filesystem_resource_storage_test.go similarity index 100% rename from virtcontainers/filesystem_test.go rename to virtcontainers/filesystem_resource_storage_test.go diff --git a/virtcontainers/resource_storage.go b/virtcontainers/resource_storage.go new file mode 100644 index 0000000000..e4f06ebc09 --- /dev/null +++ b/virtcontainers/resource_storage.go @@ -0,0 +1,67 @@ +// Copyright (c) 2018 Intel Corporation +// +// SPDX-License-Identifier: Apache-2.0 +// + +package virtcontainers + +import ( + "context" + "encoding/json" + + "github.com/kata-containers/runtime/virtcontainers/device/api" +) + +// TypedDevice is used as an intermediate representation for marshalling +// and unmarshalling Device implementations. +type TypedDevice struct { + Type string + + // Data is assigned the Device object. + // This being declared as RawMessage prevents it from being marshalled/unmarshalled. + // We do that explicitly depending on Type. + Data json.RawMessage +} + +// resourceStorage is the virtcontainers resources (configuration, state, etc...) +// storage interface. +// The default resource storage implementation is filesystem. +type resourceStorage interface { + // Create all resources for a sandbox + createAllResources(ctx context.Context, sandbox *Sandbox) error + + // Resources URIs functions return both the URI + // for the actual resource and the URI base. + containerURI(sandboxID, containerID string, resource sandboxResource) (string, string, error) + sandboxURI(sandboxID string, resource sandboxResource) (string, string, error) + + // Sandbox resources + storeSandboxResource(sandboxID string, resource sandboxResource, data interface{}) error + deleteSandboxResources(sandboxID string, resources []sandboxResource) error + fetchSandboxConfig(sandboxID string) (SandboxConfig, error) + fetchSandboxState(sandboxID string) (State, error) + fetchSandboxNetwork(sandboxID string) (NetworkNamespace, error) + storeSandboxNetwork(sandboxID string, networkNS NetworkNamespace) error + fetchSandboxDevices(sandboxID string) ([]api.Device, error) + storeSandboxDevices(sandboxID string, devices []api.Device) error + + // Hypervisor resources + fetchHypervisorState(sandboxID string, state interface{}) error + storeHypervisorState(sandboxID string, state interface{}) error + + // Agent resources + fetchAgentState(sandboxID string, state interface{}) error + storeAgentState(sandboxID string, state interface{}) error + + // Container resources + storeContainerResource(sandboxID, containerID string, resource sandboxResource, data interface{}) error + deleteContainerResources(sandboxID, containerID string, resources []sandboxResource) error + fetchContainerConfig(sandboxID, containerID string) (ContainerConfig, error) + fetchContainerState(sandboxID, containerID string) (State, error) + fetchContainerProcess(sandboxID, containerID string) (Process, error) + storeContainerProcess(sandboxID, containerID string, process Process) error + fetchContainerMounts(sandboxID, containerID string) ([]Mount, error) + storeContainerMounts(sandboxID, containerID string, mounts []Mount) error + fetchContainerDevices(sandboxID, containerID string) ([]ContainerDevice, error) + storeContainerDevices(sandboxID, containerID string, devices []ContainerDevice) error +}