mirror of
https://github.com/rancher/plugins.git
synced 2025-07-08 12:45:19 +00:00
116 lines
3.4 KiB
Go
116 lines
3.4 KiB
Go
// +build windows
|
|
|
|
package hcsoci
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/Microsoft/hcsshim/internal/schema2"
|
|
"github.com/Microsoft/hcsshim/internal/schemaversion"
|
|
specs "github.com/opencontainers/runtime-spec/specs-go"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func createLCOWSpec(coi *createOptionsInternal) (*specs.Spec, error) {
|
|
// Remarshal the spec to perform a deep copy.
|
|
j, err := json.Marshal(coi.Spec)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
spec := &specs.Spec{}
|
|
err = json.Unmarshal(j, spec)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// TODO
|
|
// Translate the mounts. The root has already been translated in
|
|
// allocateLinuxResources.
|
|
/*
|
|
for i := range spec.Mounts {
|
|
spec.Mounts[i].Source = "???"
|
|
spec.Mounts[i].Destination = "???"
|
|
}
|
|
*/
|
|
|
|
// Linux containers don't care about Windows aspects of the spec except the
|
|
// network namespace
|
|
spec.Windows = nil
|
|
if coi.Spec.Windows != nil &&
|
|
coi.Spec.Windows.Network != nil &&
|
|
coi.Spec.Windows.Network.NetworkNamespace != "" {
|
|
spec.Windows = &specs.Windows{
|
|
Network: &specs.WindowsNetwork{
|
|
NetworkNamespace: coi.Spec.Windows.Network.NetworkNamespace,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Hooks are not supported (they should be run in the host)
|
|
spec.Hooks = nil
|
|
|
|
// Clear unsupported features
|
|
if spec.Linux.Resources != nil {
|
|
spec.Linux.Resources.Devices = nil
|
|
spec.Linux.Resources.Memory = nil
|
|
spec.Linux.Resources.Pids = nil
|
|
spec.Linux.Resources.BlockIO = nil
|
|
spec.Linux.Resources.HugepageLimits = nil
|
|
spec.Linux.Resources.Network = nil
|
|
}
|
|
spec.Linux.Seccomp = nil
|
|
|
|
// Clear any specified namespaces
|
|
var namespaces []specs.LinuxNamespace
|
|
for _, ns := range spec.Linux.Namespaces {
|
|
switch ns.Type {
|
|
case specs.NetworkNamespace:
|
|
default:
|
|
ns.Path = ""
|
|
namespaces = append(namespaces, ns)
|
|
}
|
|
}
|
|
spec.Linux.Namespaces = namespaces
|
|
|
|
return spec, nil
|
|
}
|
|
|
|
// This is identical to hcsschema.ComputeSystem but HostedSystem is an LCOW specific type - the schema docs only include WCOW.
|
|
type linuxComputeSystem struct {
|
|
Owner string `json:"Owner,omitempty"`
|
|
SchemaVersion *hcsschema.Version `json:"SchemaVersion,omitempty"`
|
|
HostingSystemId string `json:"HostingSystemId,omitempty"`
|
|
HostedSystem *linuxHostedSystem `json:"HostedSystem,omitempty"`
|
|
Container *hcsschema.Container `json:"Container,omitempty"`
|
|
VirtualMachine *hcsschema.VirtualMachine `json:"VirtualMachine,omitempty"`
|
|
ShouldTerminateOnLastHandleClosed bool `json:"ShouldTerminateOnLastHandleClosed,omitempty"`
|
|
}
|
|
|
|
type linuxHostedSystem struct {
|
|
SchemaVersion *hcsschema.Version
|
|
OciBundlePath string
|
|
OciSpecification *specs.Spec
|
|
}
|
|
|
|
func createLinuxContainerDocument(coi *createOptionsInternal, guestRoot string) (interface{}, error) {
|
|
spec, err := createLCOWSpec(coi)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
logrus.Debugf("hcsshim::createLinuxContainerDoc: guestRoot:%s", guestRoot)
|
|
v2 := &linuxComputeSystem{
|
|
Owner: coi.actualOwner,
|
|
SchemaVersion: schemaversion.SchemaV21(),
|
|
ShouldTerminateOnLastHandleClosed: true,
|
|
HostingSystemId: coi.HostingSystem.ID(),
|
|
HostedSystem: &linuxHostedSystem{
|
|
SchemaVersion: schemaversion.SchemaV21(),
|
|
OciBundlePath: guestRoot,
|
|
OciSpecification: spec,
|
|
},
|
|
}
|
|
|
|
return v2, nil
|
|
}
|