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
|
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)) {
|
||||||
|
|
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
|
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
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