public Container( string id, string handle, IContainerUser user, IContainerDirectory directory, IContainerPropertyService propertyService, ILocalTcpPortManager tcpPortManager, JobObject jobObject, DiskQuotaControl diskQuotaControl, IProcessRunner processRunner, IProcessRunner constrainedProcessRunner, ProcessHelper processHelper, Dictionary<string, string> defaultEnvironment, ContainerHostDependencyHelper dependencyHelper ) { this.id = id; this.handle = handle; this.user = user; this.directory = directory; this.propertyService = propertyService; this.tcpPortManager = tcpPortManager; this.jobObject = jobObject; this.diskQuotaControl = diskQuotaControl; this.processRunner = processRunner; this.constrainedProcessRunner = constrainedProcessRunner; this.processHelper = processHelper; this.dependencyHelper = dependencyHelper; this.defaultEnvironment = defaultEnvironment ?? new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); this.currentState = ContainerState.Active; }
public Container( string id, string handle, IContainerUser user, IContainerDirectory directory, IContainerPropertyService propertyService, ILocalTcpPortManager tcpPortManager, JobObject jobObject, DiskQuotaControl diskQuotaControl, IProcessRunner processRunner, IProcessRunner constrainedProcessRunner, ProcessHelper processHelper, Dictionary <string, string> defaultEnvironment, ContainerHostDependencyHelper dependencyHelper ) { this.id = id; this.handle = handle; this.user = user; this.directory = directory; this.propertyService = propertyService; this.tcpPortManager = tcpPortManager; this.jobObject = jobObject; this.diskQuotaControl = diskQuotaControl; this.processRunner = processRunner; this.constrainedProcessRunner = constrainedProcessRunner; this.processHelper = processHelper; this.dependencyHelper = dependencyHelper; this.defaultEnvironment = defaultEnvironment ?? new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); this.currentState = ContainerState.Active; }
public IContainer CreateContainer(string id, string handle, IContainerUser user, IContainerDirectory directory, IContainerPropertyService propertyService, ILocalTcpPortManager tcpPortManager, JobObject jobObject, IContainerDiskQuota containerDiskQuota, IProcessRunner processRunner, IProcessRunner constrainedProcessRunner, ProcessHelper processHelper, Dictionary <string, string> defaultEnvironment, ContainerHostDependencyHelper dependencyHelper, BindMount[] bindMounts) { return(new Container( id, handle, user, directory, propertyService, tcpPortManager, jobObject, containerDiskQuota, processRunner, constrainedProcessRunner, processHelper, defaultEnvironment, dependencyHelper, bindMounts )); }
public ContainerTests() { ConstrainedProcessRunner = Substitute.For <IProcessRunner>(); ContainerEnvironment = new Dictionary <string, string>() { { "Handle", "handle" } }; Directory = Substitute.For <IContainerDirectory>(); JobObject = Substitute.For <JobObject>(); JobObject.GetCpuStatistics().Returns(new CpuStatistics { TotalKernelTime = TimeSpan.Zero, TotalUserTime = TimeSpan.Zero, }); JobObject.GetProcessIds().Returns(new int[0]); ProcessHelper = Substitute.For <ProcessHelper>(); ProcessRunner = Substitute.For <IProcessRunner>(); ContainerPropertiesService = Substitute.For <IContainerPropertyService>(); TcpPortManager = Substitute.For <ILocalTcpPortManager>(); User = Substitute.For <IContainerUser>(); _containerUsername = string.Concat("container-username-", Guid.NewGuid().ToString()); User.UserName.Returns(_containerUsername); DiskQuotaControl = Substitute.For <DiskQuotaControl>(); DependencyHelper = Substitute.For <ContainerHostDependencyHelper>(); Container = new Container( string.Concat("id-", Guid.NewGuid()), string.Concat("handle-", Guid.NewGuid()), User, Directory, ContainerPropertiesService, TcpPortManager, JobObject, DiskQuotaControl, ProcessRunner, ConstrainedProcessRunner, ProcessHelper, ContainerEnvironment, DependencyHelper); }
public IContainer CreateContainer(string id, string handle, IContainerUser user, IContainerDirectory directory, IContainerPropertyService propertyService, ILocalTcpPortManager tcpPortManager, JobObject jobObject, IContainerDiskQuota containerDiskQuota, IProcessRunner processRunner, IProcessRunner constrainedProcessRunner, ProcessHelper processHelper, Dictionary <string, string> defaultEnvironment, ContainerHostDependencyHelper dependencyHelper, BindMount[] bindMounts) { if (handle == "KnownBadHandle") { var badContainer = Substitute.For <IContainer>(); badContainer.Handle.Returns("KnownBadHandle"); badContainer.When(x => x.Destroy()).Do(x => { if (destroyCount++ == 0) { throw new Exception(); } }); return(badContainer); } else { return(new Container( id, handle, user, directory, propertyService, tcpPortManager, jobObject, containerDiskQuota, processRunner, constrainedProcessRunner, processHelper, defaultEnvironment, dependencyHelper, bindMounts )); } }
IContainer RestoreContainerFromPath(string containerPath) { var id = Path.GetFileName(containerPath); var user = ContainerUser.Restore(userManager, id); var directory = ContainerDirectory.Restore(fileSystem, containerPath); var jobObjectName = id; var jobObject = new JobObject(jobObjectName); var environment = new Dictionary <string, string>(); var processHelper = new ProcessHelper(); var containerDiskQuota = diskQuotaManager.CreateDiskQuotaControl(directory, user.SID); var dependencyHelper = new ContainerHostDependencyHelper(); var bindMounts = new[] { new BindMount() }; var container = new Container( id, id, // TODO: Recover the handle from container metadata user, directory, containerPropertiesService, tcpPortManager, jobObject, containerDiskQuota, processRunner, processRunner, processHelper, environment, dependencyHelper, bindMounts); return(container); }
IContainer RestoreContainerFromPath(string containerPath) { var id = Path.GetFileName(containerPath); var user = ContainerUser.Restore(userManager, id); var directory = ContainerDirectory.Restore(fileSystem, containerPath); var jobObjectName = id; var jobObject = new JobObject(jobObjectName); var environment = new Dictionary <string, string>(); var processHelper = new ProcessHelper(); var diskQuotaControl = new DiskQuotaControl(); diskQuotaControl.UserNameResolution = UserNameResolutionConstants.dqResolveNone; diskQuotaControl.Initialize(directory.Volume, true); var dependencyHelper = new ContainerHostDependencyHelper(); var container = new Container( id, id, // TODO: Recover the handle from container metadata user, directory, containerPropertiesService, tcpPortManager, jobObject, diskQuotaControl, processRunner, processRunner, processHelper, environment, dependencyHelper); return(container); }
internal ContainerHostService(FileSystemManager fileSystem, IProcessRunner processRunner, ContainerHostDependencyHelper dependencyHelper) { this.fileSystem = fileSystem; this.processRunner = processRunner; this.dependencyHelper = dependencyHelper; }
public IContainer CreateContainer(ContainerSpec containerSpec) { Guard.NotNull(containerSpec, "containerSpec"); UndoStack undoStack = new UndoStack(); IContainer container; try { var handle = containerSpec.Handle; if (String.IsNullOrEmpty(handle)) { handle = handleHelper.GenerateHandle(); } var id = handleHelper.GenerateId(handle); var user = ContainerUser.Create(userManager, id); undoStack.Push(() => user.Delete()); var directory = directoryFactory.Create(fileSystem, containerBasePath, id); directory.CreateSubdirectories(user); undoStack.Push(directory.Destroy); directory.CreateBindMounts(containerSpec.BindMounts, user); var jobObject = new JobObject(id); undoStack.Push(() => jobObject.Dispose()); var containerHostClient = containerHostService.StartContainerHost(id, directory, jobObject, user.GetCredential()); undoStack.Push(() => containerHostClient.Shutdown()); var constrainedProcessRunner = new ConstrainedProcessRunner(containerHostClient); undoStack.Push(() => constrainedProcessRunner.Dispose()); var processHelper = new ProcessHelper(); var dependencyHelper = new ContainerHostDependencyHelper(); var diskQuotaControl = diskQuotaManager.CreateDiskQuotaControl(directory); container = new Container( id, handle, user, directory, containerPropertiesService, tcpPortManager, jobObject, diskQuotaControl, processRunner, constrainedProcessRunner, processHelper, containerSpec.Environment, dependencyHelper); containerPropertiesService.SetProperties(container, containerSpec.Properties); lock (containers) { containers.Add(container); } } catch (Exception e) { try { undoStack.UndoAll(); throw; } catch (AggregateException undoException) { throw new AggregateException(new[] { e, undoException }); } } return(container); }
IContainer RestoreContainerFromPath(string containerPath) { var id = Path.GetFileName(containerPath); var user = ContainerUser.Restore(userManager, id); var directory = ContainerDirectory.Restore(fileSystem, containerPath); var jobObjectName = id; var jobObject = new JobObject(jobObjectName); var environment = new Dictionary<string, string>(); var processHelper = new ProcessHelper(); var diskQuotaControl = new DiskQuotaControl(); diskQuotaControl.UserNameResolution = UserNameResolutionConstants.dqResolveNone; diskQuotaControl.Initialize(directory.Volume, true); var dependencyHelper = new ContainerHostDependencyHelper(); var container = new Container( id, id, // TODO: Recover the handle from container metadata user, directory, containerPropertiesService, tcpPortManager, jobObject, diskQuotaControl, processRunner, processRunner, processHelper, environment, dependencyHelper); return container; }
public IContainer CreateContainer(ContainerSpec containerSpec) { Guard.NotNull(containerSpec, "containerSpec"); UndoStack undoStack = new UndoStack(); IContainer container; try { var handle = containerSpec.Handle; if (String.IsNullOrEmpty(handle)) handle = handleHelper.GenerateHandle(); var id = handleHelper.GenerateId(handle); var user = ContainerUser.Create(userManager, id); undoStack.Push(() => user.Delete()); var directory = directoryFactory.Create(fileSystem, containerBasePath, id); directory.CreateSubdirectories(user); undoStack.Push(directory.Destroy); directory.CreateBindMounts(containerSpec.BindMounts, user); var jobObject = new JobObject(id); undoStack.Push(() => jobObject.Dispose()); var containerHostClient = containerHostService.StartContainerHost(id, directory, jobObject, user.GetCredential()); undoStack.Push(() => containerHostClient.Shutdown()); var constrainedProcessRunner = new ConstrainedProcessRunner(containerHostClient); undoStack.Push(() => constrainedProcessRunner.Dispose()); var processHelper = new ProcessHelper(); var dependencyHelper = new ContainerHostDependencyHelper(); var diskQuotaControl = diskQuotaManager.CreateDiskQuotaControl(directory); container = new Container( id, handle, user, directory, containerPropertiesService, tcpPortManager, jobObject, diskQuotaControl, processRunner, constrainedProcessRunner, processHelper, containerSpec.Environment, dependencyHelper); containerPropertiesService.SetProperties(container, containerSpec.Properties); lock (containers) { containers.Add(container); } } catch (Exception e) { try { undoStack.UndoAll(); throw; } catch (AggregateException undoException) { throw new AggregateException(new[] { e, undoException }); } } return container; }