Merge pull request #110 from jhowardmsft/factorgetrootids

Refactors getRootIDs
This commit is contained in:
Michael Crosby 2016-02-26 11:04:05 -08:00
commit 2644a7dfd5
6 changed files with 68 additions and 23 deletions

View file

@ -246,14 +246,14 @@ func (c *container) Exec(pid string, spec specs.Process, s Stdio) (Process, erro
return p, nil return p, nil
} }
func (c *container) readSpec() (*specs.LinuxSpec, error) { func (c *container) readSpec() (*platformSpec, error) {
var spec specs.LinuxSpec var spec platformSpec
f, err := os.Open(filepath.Join(c.bundle, "config.json")) f, err := os.Open(filepath.Join(c.bundle, "config.json"))
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer f.Close() 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 nil, err
} }
return &spec, nil return &spec, nil
@ -389,25 +389,6 @@ func (c *container) getLibctContainer() (libcontainer.Container, error) {
return f.Load(c.id) 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 { func hostIDFromMap(id uint32, mp []specs.IDMapping) int {
for _, m := range mp { for _, m := range mp {
if (id >= m.ContainerID) && (id <= (m.ContainerID + m.Size - 1)) { if (id >= m.ContainerID) && (id <= (m.ContainerID + m.Size - 1)) {

View 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
}

View file

@ -0,0 +1,5 @@
package runtime
func getRootIDs(s *platformSpec) (int, int, error) {
return 0, 0, nil
}

View file

@ -44,7 +44,7 @@ type processConfig struct {
id string id string
root string root string
processSpec specs.Process processSpec specs.Process
spec *specs.LinuxSpec spec *platformSpec
c *container c *container
stdio Stdio stdio Stdio
exec bool exec bool

5
runtime/spec_linux.go Normal file
View file

@ -0,0 +1,5 @@
package runtime
import "github.com/opencontainers/specs"
type platformSpec specs.LinuxSpec

32
runtime/spec_windows.go Normal file
View 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