From ea06fe3afc11a4833d307f75c6f398c128fc99da Mon Sep 17 00:00:00 2001 From: Samuel Ortiz Date: Wed, 24 Nov 2021 17:06:12 +0100 Subject: [PATCH 1/2] virtcontainers: Add a Network API skeleton for Darwin Empty for now. Fixes: #6051 Signed-off-by: Samuel Ortiz Signed-off-by: Eric Ernst --- src/runtime/virtcontainers/network_darwin.go | 101 +++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/runtime/virtcontainers/network_darwin.go diff --git a/src/runtime/virtcontainers/network_darwin.go b/src/runtime/virtcontainers/network_darwin.go new file mode 100644 index 0000000000..b86150f24e --- /dev/null +++ b/src/runtime/virtcontainers/network_darwin.go @@ -0,0 +1,101 @@ +// Copyright (c) 2023 Apple Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// + +package virtcontainers + +import ( + "context" + "errors" + + "github.com/vishvananda/netlink" + + persistapi "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/persist/api" +) + +var endpointNotSupported error = errors.New("Unsupported endpoint on Darwin") + +// DarwinNetwork represents a sandbox networking setup. +type DarwinNetwork struct { + networkID string + interworkingModel NetInterworkingModel + networkCreated bool + eps []Endpoint +} + +func NewNetwork(configs ...*NetworkConfig) (Network, error) { + if len(configs) > 1 { + return nil, errors.New("too many network configurations") + } + + // Empty constructor + if len(configs) == 0 { + return &DarwinNetwork{}, nil + } + + config := configs[0] + if config == nil { + return nil, errors.New("missing network configuration") + } + + return &DarwinNetwork{ + config.NetworkID, + config.InterworkingModel, + config.NetworkCreated, + []Endpoint{}, + }, nil +} + +func LoadNetwork(netInfo persistapi.NetworkInfo) Network { + network := DarwinNetwork{ + networkID: netInfo.NetworkID, + networkCreated: netInfo.NetworkCreated, + } + + return &network +} + +func (n *DarwinNetwork) AddEndpoints(context.Context, *Sandbox, []NetworkInfo, bool) ([]Endpoint, error) { + return nil, endpointNotSupported +} + +func (n *DarwinNetwork) RemoveEndpoints(context.Context, *Sandbox, []Endpoint, bool) error { + return endpointNotSupported +} + +func (n *DarwinNetwork) Run(context.Context, func() error) error { + return nil +} + +func (n *DarwinNetwork) NetworkID() string { + return n.networkID +} + +func (n *DarwinNetwork) NetworkCreated() bool { + return n.networkCreated +} + +func (n *DarwinNetwork) NetMonitorThread() int { + return 0 +} + +func (n *DarwinNetwork) SetNetMonitorThread(pid int) { + return +} + +func (n *DarwinNetwork) Endpoints() []Endpoint { + return n.eps +} + +func (n *DarwinNetwork) SetEndpoints(endpoints []Endpoint) { + n.eps = endpoints +} + +func validGuestRoute(route netlink.Route) bool { + return true +} + +func validGuestNeighbor(route netlink.Neigh) bool { + return true +} From a9626682af8350ccde96eb33deb995fed5d3e9d3 Mon Sep 17 00:00:00 2001 From: Samuel Ortiz Date: Wed, 24 Nov 2021 17:15:06 +0100 Subject: [PATCH 2/2] virtcontainers: resourcecontrol: Add skeleton for Darwin Cgroups do not exist on Darwin, so use an empty implementation for resourcecontrol for the time being. In the process, ensure that the utilized cgroup handling (ie, isSystemdCgroup) is kept in general file, since we use this to help assess/constrain the container spec we pass to the guest. Fixes: #6051 Signed-off-by: Samuel Ortiz Signed-off-by: Eric Ernst --- .../pkg/resourcecontrol/cgroups_darwin.go | 86 +++++++++++++++++++ src/runtime/pkg/resourcecontrol/controller.go | 3 +- src/runtime/pkg/resourcecontrol/utils.go | 3 + .../pkg/resourcecontrol/utils_linux.go | 3 - 4 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 src/runtime/pkg/resourcecontrol/cgroups_darwin.go diff --git a/src/runtime/pkg/resourcecontrol/cgroups_darwin.go b/src/runtime/pkg/resourcecontrol/cgroups_darwin.go new file mode 100644 index 0000000000..50cde8e5d0 --- /dev/null +++ b/src/runtime/pkg/resourcecontrol/cgroups_darwin.go @@ -0,0 +1,86 @@ +// Copyright (c) 2023 Apple Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// + +package resourcecontrol + +import ( + "errors" + + "github.com/opencontainers/runtime-spec/specs-go" +) + +type DarwinResourceController struct{} + +func RenameCgroupPath(path string) (string, error) { + return "", errors.New("RenameCgroupPath not supported on Darwin") +} + +func NewResourceController(path string, resources *specs.LinuxResources) (ResourceController, error) { + return &DarwinResourceController{}, nil +} + +func NewSandboxResourceController(path string, resources *specs.LinuxResources, sandboxCgroupOnly bool) (ResourceController, error) { + return &DarwinResourceController{}, nil +} + +func LoadResourceController(path string) (ResourceController, error) { + return &DarwinResourceController{}, nil +} + +func (c *DarwinResourceController) Delete() error { + return nil +} + +func (c *DarwinResourceController) Stat() (interface{}, error) { + return nil, nil +} + +func (c *DarwinResourceController) AddProcess(pid int, subsystems ...string) error { + return nil +} + +func (c *DarwinResourceController) AddThread(pid int, subsystems ...string) error { + return nil +} + +func (c *DarwinResourceController) AddTask(pid int, subsystems ...string) error { + return nil +} + +func (c *DarwinResourceController) Update(resources *specs.LinuxResources) error { + return nil +} + +func (c *DarwinResourceController) MoveTo(path string) error { + return nil +} + +func (c *DarwinResourceController) ID() string { + return "" +} + +func (c *DarwinResourceController) Parent() string { + return "" +} + +func (c *DarwinResourceController) Type() ResourceControllerType { + return DarwinResourceControllerType +} + +func (c *DarwinResourceController) AddDevice(deviceHostPath string) error { + return nil +} + +func (c *DarwinResourceController) RemoveDevice(deviceHostPath string) error { + return nil +} + +func (c *DarwinResourceController) UpdateCpuSet(cpuset, memset string) error { + return nil +} + +func (c *DarwinResourceController) Path() string { + return "" +} diff --git a/src/runtime/pkg/resourcecontrol/controller.go b/src/runtime/pkg/resourcecontrol/controller.go index f43599a7fc..e59767f5c8 100644 --- a/src/runtime/pkg/resourcecontrol/controller.go +++ b/src/runtime/pkg/resourcecontrol/controller.go @@ -25,7 +25,8 @@ func SetLogger(logger *logrus.Entry) { type ResourceControllerType string const ( - LinuxCgroups ResourceControllerType = "cgroups" + LinuxCgroups ResourceControllerType = "cgroups" + DarwinResourceControllerType ResourceControllerType = "darwin" ) // String converts a resource type to a string. diff --git a/src/runtime/pkg/resourcecontrol/utils.go b/src/runtime/pkg/resourcecontrol/utils.go index 449a89e9aa..4e1f029e04 100644 --- a/src/runtime/pkg/resourcecontrol/utils.go +++ b/src/runtime/pkg/resourcecontrol/utils.go @@ -19,6 +19,9 @@ var ( ErrCgroupMode = errors.New("cgroup controller type error") ) +// DefaultResourceControllerID runtime-determined location in the cgroups hierarchy. +const DefaultResourceControllerID = "/vc" + func DeviceToCgroupDeviceRule(device string) (*devices.Rule, error) { var st unix.Stat_t deviceRule := devices.Rule{ diff --git a/src/runtime/pkg/resourcecontrol/utils_linux.go b/src/runtime/pkg/resourcecontrol/utils_linux.go index a3e7ef7105..b3d889d865 100644 --- a/src/runtime/pkg/resourcecontrol/utils_linux.go +++ b/src/runtime/pkg/resourcecontrol/utils_linux.go @@ -17,9 +17,6 @@ import ( "github.com/opencontainers/runc/libcontainer/cgroups/systemd" ) -// DefaultResourceControllerID runtime-determined location in the cgroups hierarchy. -const DefaultResourceControllerID = "/vc" - // ValidCgroupPathV1 returns a valid cgroup path for cgroup v1. // see https://github.com/opencontainers/runtime-spec/blob/master/config-linux.md#cgroups-path func ValidCgroupPathV1(path string, systemdCgroup bool) (string, error) {