func libcontainerConfigToContainerSpec(config *libcontainer.Config, mi *info.MachineInfo) info.ContainerSpec { var spec info.ContainerSpec spec.HasMemory = true spec.Memory.Limit = math.MaxUint64 spec.Memory.SwapLimit = math.MaxUint64 if config.Cgroups.Memory > 0 { spec.Memory.Limit = uint64(config.Cgroups.Memory) } if config.Cgroups.MemorySwap > 0 { spec.Memory.SwapLimit = uint64(config.Cgroups.MemorySwap) } // Get CPU info spec.HasCpu = true spec.Cpu.Limit = 1024 if config.Cgroups.CpuShares != 0 { spec.Cpu.Limit = uint64(config.Cgroups.CpuShares) } if config.Cgroups.CpusetCpus == "" { // All cores are active. spec.Cpu.Mask = fmt.Sprintf("0-%d", mi.NumCores-1) } else { spec.Cpu.Mask = config.Cgroups.CpusetCpus } spec.HasNetwork = true spec.HasDiskIo = true return spec }
func (self *rawContainerHandler) GetSpec() (info.ContainerSpec, error) { var spec info.ContainerSpec // The raw driver assumes unified hierarchy containers. // Get machine info. mi, err := self.machineInfoFactory.GetMachineInfo() if err != nil { return spec, err } // CPU. cpuRoot, ok := self.cgroupSubsystems.mountPoints["cpu"] if ok { cpuRoot = path.Join(cpuRoot, self.name) if utils.FileExists(cpuRoot) { spec.HasCpu = true spec.Cpu.Limit = readInt64(cpuRoot, "cpu.shares") } } // Cpu Mask. // This will fail for non-unified hierarchies. We'll return the whole machine mask in that case. cpusetRoot, ok := self.cgroupSubsystems.mountPoints["cpuset"] if ok { cpusetRoot = path.Join(cpusetRoot, self.name) if utils.FileExists(cpusetRoot) { spec.HasCpu = true spec.Cpu.Mask = readString(cpusetRoot, "cpuset.cpus") if spec.Cpu.Mask == "" { spec.Cpu.Mask = fmt.Sprintf("0-%d", mi.NumCores-1) } } } // Memory. memoryRoot, ok := self.cgroupSubsystems.mountPoints["memory"] if ok { memoryRoot = path.Join(memoryRoot, self.name) if utils.FileExists(memoryRoot) { spec.HasMemory = true spec.Memory.Limit = readInt64(memoryRoot, "memory.limit_in_bytes") spec.Memory.SwapLimit = readInt64(memoryRoot, "memory.memsw.limit_in_bytes") } } // Fs. if self.name == "/" || self.externalMounts != nil { spec.HasFilesystem = true } //Network if self.networkInterface != nil { spec.HasNetwork = true } return spec, nil }
func (self *rawContainerHandler) GetSpec() (info.ContainerSpec, error) { var spec info.ContainerSpec // The raw driver assumes unified hierarchy containers. // Get machine info. mi, err := self.machineInfoFactory.GetMachineInfo() if err != nil { return spec, err } // CPU. cpuRoot, ok := self.cgroupPaths["cpu"] if ok { if utils.FileExists(cpuRoot) { spec.HasCpu = true spec.Cpu.Limit = readInt64(cpuRoot, "cpu.shares") } } // Cpu Mask. // This will fail for non-unified hierarchies. We'll return the whole machine mask in that case. cpusetRoot, ok := self.cgroupPaths["cpuset"] if ok { if utils.FileExists(cpusetRoot) { spec.HasCpu = true spec.Cpu.Mask = readString(cpusetRoot, "cpuset.cpus") if spec.Cpu.Mask == "" { spec.Cpu.Mask = fmt.Sprintf("0-%d", mi.NumCores-1) } } } // Memory. memoryRoot, ok := self.cgroupPaths["memory"] if ok { if utils.FileExists(memoryRoot) { spec.HasMemory = true spec.Memory.Limit = readInt64(memoryRoot, "memory.limit_in_bytes") spec.Memory.SwapLimit = readInt64(memoryRoot, "memory.memsw.limit_in_bytes") } } // Fs. if self.name == "/" || self.externalMounts != nil { spec.HasFilesystem = true } //Network spec.HasNetwork = self.hasNetwork // DiskIo. if blkioRoot, ok := self.cgroupPaths["blkio"]; ok && utils.FileExists(blkioRoot) { spec.HasDiskIo = true } // Check physical network devices for root container. nd, err := self.GetRootNetworkDevices() if err != nil { return spec, err } if len(nd) != 0 { spec.HasNetwork = true } return spec, nil }