1package runconfig // import "github.com/docker/docker/runconfig"
2
3import (
4	"fmt"
5
6	"github.com/docker/docker/api/types/container"
7	"github.com/docker/docker/pkg/sysinfo"
8)
9
10// DefaultDaemonNetworkMode returns the default network stack the daemon should
11// use.
12func DefaultDaemonNetworkMode() container.NetworkMode {
13	return container.NetworkMode("nat")
14}
15
16// IsPreDefinedNetwork indicates if a network is predefined by the daemon
17func IsPreDefinedNetwork(network string) bool {
18	return !container.NetworkMode(network).IsUserDefined()
19}
20
21// validateNetMode ensures that the various combinations of requested
22// network settings are valid.
23func validateNetMode(c *container.Config, hc *container.HostConfig) error {
24	if hc == nil {
25		return nil
26	}
27
28	err := validateNetContainerMode(c, hc)
29	if err != nil {
30		return err
31	}
32
33	if hc.NetworkMode.IsContainer() && hc.Isolation.IsHyperV() {
34		return fmt.Errorf("Using the network stack of another container is not supported while using Hyper-V Containers")
35	}
36
37	return nil
38}
39
40// validateIsolation performs platform specific validation of the
41// isolation in the hostconfig structure. Windows supports 'default' (or
42// blank), 'process', or 'hyperv'.
43func validateIsolation(hc *container.HostConfig) error {
44	// We may not be passed a host config, such as in the case of docker commit
45	if hc == nil {
46		return nil
47	}
48	if !hc.Isolation.IsValid() {
49		return fmt.Errorf("Invalid isolation: %q. Windows supports 'default', 'process', or 'hyperv'", hc.Isolation)
50	}
51	return nil
52}
53
54// validateQoS performs platform specific validation of the Qos settings
55func validateQoS(hc *container.HostConfig) error {
56	return nil
57}
58
59// validateResources performs platform specific validation of the resource settings
60func validateResources(hc *container.HostConfig, si *sysinfo.SysInfo) error {
61	// We may not be passed a host config, such as in the case of docker commit
62	if hc == nil {
63		return nil
64	}
65	if hc.Resources.CPURealtimePeriod != 0 {
66		return fmt.Errorf("Windows does not support CPU real-time period")
67	}
68	if hc.Resources.CPURealtimeRuntime != 0 {
69		return fmt.Errorf("Windows does not support CPU real-time runtime")
70	}
71	return nil
72}
73
74// validatePrivileged performs platform specific validation of the Privileged setting
75func validatePrivileged(hc *container.HostConfig) error {
76	// We may not be passed a host config, such as in the case of docker commit
77	if hc == nil {
78		return nil
79	}
80	if hc.Privileged {
81		return fmt.Errorf("Windows does not support privileged mode")
82	}
83	return nil
84}
85
86// validateReadonlyRootfs performs platform specific validation of the ReadonlyRootfs setting
87func validateReadonlyRootfs(hc *container.HostConfig) error {
88	// We may not be passed a host config, such as in the case of docker commit
89	if hc == nil {
90		return nil
91	}
92	if hc.ReadonlyRootfs {
93		return fmt.Errorf("Windows does not support root filesystem in read-only mode")
94	}
95	return nil
96}
97