package daemon import ( "fmt" "os" "syscall" "github.com/Sirupsen/logrus" "github.com/docker/docker/daemon/graphdriver" "github.com/docker/docker/daemon/graphdriver/windows" "github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/parsers" "github.com/docker/docker/runconfig" "github.com/docker/libnetwork" "github.com/microsoft/hcsshim" ) const DefaultVirtualSwitch = "Virtual Switch" func (daemon *Daemon) Changes(container *Container) ([]archive.Change, error) { return daemon.driver.Changes(container.ID, container.ImageID) } func (daemon *Daemon) Diff(container *Container) (archive.Archive, error) { return daemon.driver.Diff(container.ID, container.ImageID) } func parseSecurityOpt(container *Container, config *runconfig.HostConfig) error { return nil } func (daemon *Daemon) createRootfs(container *Container) error { // Step 1: create the container directory. // This doubles as a barrier to avoid race conditions. if err := os.Mkdir(container.root, 0700); err != nil { return err } if wd, ok := daemon.driver.(*windows.WindowsGraphDriver); ok { if container.ImageID != "" { // Get list of paths to parent layers. logrus.Debugln("createRootfs: Container has parent image:", container.ImageID) img, err := daemon.graph.Get(container.ImageID) if err != nil { return err } ids, err := daemon.graph.ParentLayerIds(img) if err != nil { return err } logrus.Debugf("Got image ids: %d", len(ids)) if err := hcsshim.CreateSandboxLayer(wd.Info(), container.ID, container.ImageID, wd.LayerIdsToPaths(ids)); err != nil { return err } } else { if err := daemon.driver.Create(container.ID, container.ImageID); err != nil { return err } } } else { // Fall-back code path to allow the use of the VFS driver for development if err := daemon.driver.Create(container.ID, container.ImageID); err != nil { return err } } return nil } func checkKernel() error { return nil } func (daemon *Daemon) adaptContainerSettings(hostConfig *runconfig.HostConfig) { // TODO Windows. } func (daemon *Daemon) verifyContainerSettings(hostConfig *runconfig.HostConfig, config *runconfig.Config) ([]string, error) { // TODO Windows. Verifications TBC return nil, nil } // checkConfigOptions checks for mutually incompatible config options func checkConfigOptions(config *Config) error { return nil } // checkSystem validates platform-specific requirements func checkSystem() error { var dwVersion uint32 // TODO Windows. May need at some point to ensure have elevation and // possibly LocalSystem. // Validate the OS version. Note that docker.exe must be manifested for this // call to return the correct version. dwVersion, err := syscall.GetVersion() if err != nil { return fmt.Errorf("Failed to call GetVersion()") } if int(dwVersion&0xFF) < 10 { return fmt.Errorf("This version of Windows does not support the docker daemon") } return nil } // configureKernelSecuritySupport configures and validate security support for the kernel func configureKernelSecuritySupport(config *Config, driverName string) error { return nil } func migrateIfDownlevel(driver graphdriver.Driver, root string) error { return nil } func configureVolumes(config *Config) error { // Windows does not support volumes at this time return nil } func configureSysInit(config *Config) (string, error) { // TODO Windows. return os.Getenv("TEMP"), nil } func isBridgeNetworkDisabled(config *Config) bool { return false } func initNetworkController(config *Config) (libnetwork.NetworkController, error) { // Set the name of the virtual switch if not specified by -b on daemon start if config.Bridge.VirtualSwitchName == "" { config.Bridge.VirtualSwitchName = DefaultVirtualSwitch } return nil, nil } func (daemon *Daemon) RegisterLinks(container *Container, hostConfig *runconfig.HostConfig) error { // TODO Windows. Factored out for network modes. There may be more // refactoring required here. if hostConfig == nil || hostConfig.Links == nil { return nil } for _, l := range hostConfig.Links { name, alias, err := parsers.ParseLink(l) if err != nil { return err } child, err := daemon.Get(name) if err != nil { //An error from daemon.Get() means this name could not be found return fmt.Errorf("Could not get container for %s", name) } if err := daemon.RegisterLink(container, child, alias); err != nil { return err } } // After we load all the links into the daemon // set them to nil on the hostconfig hostConfig.Links = nil if err := container.WriteHostConfig(); err != nil { return err } return nil } func (daemon *Daemon) newBaseContainer(id string) Container { return Container{ CommonContainer: CommonContainer{ ID: id, State: NewState(), execCommands: newExecStore(), root: daemon.containerRoot(id), }, } }