public virtual void TestContainerLimits() { LinuxContainerExecutor mockLCE = new TestCgroupsLCEResourcesHandler.MockLinuxContainerExecutor (); TestCgroupsLCEResourcesHandler.CustomCgroupsLCEResourceHandler handler = new TestCgroupsLCEResourcesHandler.CustomCgroupsLCEResourceHandler (); handler.generateLimitsMode = true; YarnConfiguration conf = new YarnConfiguration(); int numProcessors = 4; ResourceCalculatorPlugin plugin = Org.Mockito.Mockito.Mock <ResourceCalculatorPlugin >(); Org.Mockito.Mockito.DoReturn(numProcessors).When(plugin).GetNumProcessors(); handler.SetConf(conf); handler.InitConfig(); // create mock cgroup FilePath cgroupMountDir = CreateMockCgroupMount(cgroupDir); // create mock mtab FilePath mockMtab = CreateMockMTab(cgroupDir); // setup our handler and call init() handler.SetMtabFile(mockMtab.GetAbsolutePath()); handler.Init(mockLCE, plugin); // check values // default case - files shouldn't exist, strict mode off by default ContainerId id = ContainerId.FromString("container_1_1_1_1"); handler.PreExecute(id, Resource.NewInstance(1024, 1)); FilePath containerDir = new FilePath(cgroupMountDir, id.ToString()); NUnit.Framework.Assert.IsTrue(containerDir.Exists()); NUnit.Framework.Assert.IsTrue(containerDir.IsDirectory()); FilePath periodFile = new FilePath(containerDir, "cpu.cfs_period_us"); FilePath quotaFile = new FilePath(containerDir, "cpu.cfs_quota_us"); NUnit.Framework.Assert.IsFalse(periodFile.Exists()); NUnit.Framework.Assert.IsFalse(quotaFile.Exists()); // no files created because we're using all cpu FileUtils.DeleteQuietly(containerDir); conf.SetBoolean(YarnConfiguration.NmLinuxContainerCgroupsStrictResourceUsage, true ); handler.InitConfig(); handler.PreExecute(id, Resource.NewInstance(1024, YarnConfiguration.DefaultNmVcores )); NUnit.Framework.Assert.IsTrue(containerDir.Exists()); NUnit.Framework.Assert.IsTrue(containerDir.IsDirectory()); periodFile = new FilePath(containerDir, "cpu.cfs_period_us"); quotaFile = new FilePath(containerDir, "cpu.cfs_quota_us"); NUnit.Framework.Assert.IsFalse(periodFile.Exists()); NUnit.Framework.Assert.IsFalse(quotaFile.Exists()); // 50% of CPU FileUtils.DeleteQuietly(containerDir); conf.SetBoolean(YarnConfiguration.NmLinuxContainerCgroupsStrictResourceUsage, true ); handler.InitConfig(); handler.PreExecute(id, Resource.NewInstance(1024, YarnConfiguration.DefaultNmVcores / 2)); NUnit.Framework.Assert.IsTrue(containerDir.Exists()); NUnit.Framework.Assert.IsTrue(containerDir.IsDirectory()); periodFile = new FilePath(containerDir, "cpu.cfs_period_us"); quotaFile = new FilePath(containerDir, "cpu.cfs_quota_us"); NUnit.Framework.Assert.IsTrue(periodFile.Exists()); NUnit.Framework.Assert.IsTrue(quotaFile.Exists()); NUnit.Framework.Assert.AreEqual(500 * 1000, ReadIntFromFile(periodFile)); NUnit.Framework.Assert.AreEqual(1000 * 1000, ReadIntFromFile(quotaFile)); // CGroups set to 50% of CPU, container set to 50% of YARN CPU FileUtils.DeleteQuietly(containerDir); conf.SetBoolean(YarnConfiguration.NmLinuxContainerCgroupsStrictResourceUsage, true ); conf.SetInt(YarnConfiguration.NmResourcePercentagePhysicalCpuLimit, 50); handler.InitConfig(); handler.Init(mockLCE, plugin); handler.PreExecute(id, Resource.NewInstance(1024, YarnConfiguration.DefaultNmVcores / 2)); NUnit.Framework.Assert.IsTrue(containerDir.Exists()); NUnit.Framework.Assert.IsTrue(containerDir.IsDirectory()); periodFile = new FilePath(containerDir, "cpu.cfs_period_us"); quotaFile = new FilePath(containerDir, "cpu.cfs_quota_us"); NUnit.Framework.Assert.IsTrue(periodFile.Exists()); NUnit.Framework.Assert.IsTrue(quotaFile.Exists()); NUnit.Framework.Assert.AreEqual(1000 * 1000, ReadIntFromFile(periodFile)); NUnit.Framework.Assert.AreEqual(1000 * 1000, ReadIntFromFile(quotaFile)); FileUtils.DeleteQuietly(cgroupDir); }
public static ContainerId ToContainerId(string containerIdStr) { return(ContainerId.FromString(containerIdStr)); }