Merge pull request #110 from jhowardmsft/factorgetrootids
Refactors getRootIDs
This commit is contained in:
commit
2644a7dfd5
6 changed files with 68 additions and 23 deletions
|
@ -246,14 +246,14 @@ func (c *container) Exec(pid string, spec specs.Process, s Stdio) (Process, erro
|
|||
return p, nil
|
||||
}
|
||||
|
||||
func (c *container) readSpec() (*specs.LinuxSpec, error) {
|
||||
var spec specs.LinuxSpec
|
||||
func (c *container) readSpec() (*platformSpec, error) {
|
||||
var spec platformSpec
|
||||
f, err := os.Open(filepath.Join(c.bundle, "config.json"))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
if err := json.NewDecoder(f).Decode(&spec); err != nil {
|
||||
if err := json.NewDecoder(f).Decode(&spec.Spec); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &spec, nil
|
||||
|
@ -389,25 +389,6 @@ func (c *container) getLibctContainer() (libcontainer.Container, error) {
|
|||
return f.Load(c.id)
|
||||
}
|
||||
|
||||
func getRootIDs(s *specs.LinuxSpec) (int, int, error) {
|
||||
if s == nil {
|
||||
return 0, 0, nil
|
||||
}
|
||||
var hasUserns bool
|
||||
for _, ns := range s.Linux.Namespaces {
|
||||
if ns.Type == specs.UserNamespace {
|
||||
hasUserns = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !hasUserns {
|
||||
return 0, 0, nil
|
||||
}
|
||||
uid := hostIDFromMap(0, s.Linux.UIDMappings)
|
||||
gid := hostIDFromMap(0, s.Linux.GIDMappings)
|
||||
return uid, gid, nil
|
||||
}
|
||||
|
||||
func hostIDFromMap(id uint32, mp []specs.IDMapping) int {
|
||||
for _, m := range mp {
|
||||
if (id >= m.ContainerID) && (id <= (m.ContainerID + m.Size - 1)) {
|
||||
|
|
22
runtime/container_linux.go
Normal file
22
runtime/container_linux.go
Normal file
|
@ -0,0 +1,22 @@
|
|||
package runtime
|
||||
|
||||
import "github.com/opencontainers/specs"
|
||||
|
||||
func getRootIDs(s *platformSpec) (int, int, error) {
|
||||
if s == nil {
|
||||
return 0, 0, nil
|
||||
}
|
||||
var hasUserns bool
|
||||
for _, ns := range s.Linux.Namespaces {
|
||||
if ns.Type == specs.UserNamespace {
|
||||
hasUserns = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !hasUserns {
|
||||
return 0, 0, nil
|
||||
}
|
||||
uid := hostIDFromMap(0, s.Linux.UIDMappings)
|
||||
gid := hostIDFromMap(0, s.Linux.GIDMappings)
|
||||
return uid, gid, nil
|
||||
}
|
5
runtime/container_windows.go
Normal file
5
runtime/container_windows.go
Normal file
|
@ -0,0 +1,5 @@
|
|||
package runtime
|
||||
|
||||
func getRootIDs(s *platformSpec) (int, int, error) {
|
||||
return 0, 0, nil
|
||||
}
|
|
@ -44,7 +44,7 @@ type processConfig struct {
|
|||
id string
|
||||
root string
|
||||
processSpec specs.Process
|
||||
spec *specs.LinuxSpec
|
||||
spec *platformSpec
|
||||
c *container
|
||||
stdio Stdio
|
||||
exec bool
|
||||
|
|
5
runtime/spec_linux.go
Normal file
5
runtime/spec_linux.go
Normal file
|
@ -0,0 +1,5 @@
|
|||
package runtime
|
||||
|
||||
import "github.com/opencontainers/specs"
|
||||
|
||||
type platformSpec specs.LinuxSpec
|
32
runtime/spec_windows.go
Normal file
32
runtime/spec_windows.go
Normal file
|
@ -0,0 +1,32 @@
|
|||
package runtime
|
||||
|
||||
type Spec struct {
|
||||
// Version is the version of the specification that is supported.
|
||||
Version string `json:"ociVersion"`
|
||||
// Platform is the host information for OS and Arch.
|
||||
// TEMPORARY HACK Platform Platform `json:"platform"`
|
||||
// Process is the container's main process.
|
||||
// TEMPORARY HACK Process Process `json:"process"`
|
||||
// Root is the root information for the container's filesystem.
|
||||
// TEMPORARY HACK Root Root `json:"root"`
|
||||
// Hostname is the container's host name.
|
||||
// TEMPORARY HACK Hostname string `json:"hostname,omitempty"`
|
||||
// Mounts profile configuration for adding mounts to the container's filesystem.
|
||||
// TEMPORARY HACK Mounts []Mount `json:"mounts"`
|
||||
// Hooks are the commands run at various lifecycle events of the container.
|
||||
// TEMPORARY HACK Hooks Hooks `json:"hooks"`
|
||||
}
|
||||
|
||||
// TODO Windows - Interim hack. Needs implementing.
|
||||
type WindowsSpec struct {
|
||||
Spec
|
||||
|
||||
// Windows is platform specific configuration for Windows based containers.
|
||||
Windows Windows `json:"windows"`
|
||||
}
|
||||
|
||||
// Windows contains platform specific configuration for Windows based containers.
|
||||
type Windows struct {
|
||||
}
|
||||
|
||||
type platformSpec WindowsSpec
|
Loading…
Reference in a new issue