Browse Source

Move Config and HostConfig from runconfig to types/container.

- Make the API client library completely standalone.
- Move windows partition isolation detection to the client, so the
  driver doesn't use external types.

Signed-off-by: David Calavera <david.calavera@gmail.com>
David Calavera 9 years ago
parent
commit
7ac4232e70
65 changed files with 732 additions and 686 deletions
  1. 2 2
      api/client/client.go
  2. 3 3
      api/client/commit.go
  3. 4 5
      api/client/create.go
  4. 13 3
      api/client/lib/container_create.go
  5. 2 2
      api/client/lib/image_build.go
  6. 3 3
      api/server/router/build/build_routes.go
  7. 2 2
      api/server/router/container/backend.go
  8. 2 1
      api/server/router/container/container_routes.go
  9. 4 3
      api/server/router/local/image.go
  10. 2 2
      api/types/client.go
  11. 5 7
      api/types/configs.go
  12. 38 0
      api/types/container/config.go
  13. 228 0
      api/types/container/host_config.go
  14. 87 0
      api/types/container/hostconfig_unix.go
  15. 75 0
      api/types/container/hostconfig_windows.go
  16. 5 5
      api/types/types.go
  17. 2 2
      api/types/versions/v1p19/types.go
  18. 2 2
      api/types/versions/v1p20/types.go
  19. 3 3
      builder/builder.go
  20. 5 5
      builder/dockerfile/builder.go
  21. 3 3
      builder/dockerfile/internals.go
  22. 2 2
      builder/image.go
  23. 7 6
      container/container.go
  24. 3 3
      container/container_unit_test.go
  25. 3 3
      container/monitor.go
  26. 2 2
      daemon/config.go
  27. 10 9
      daemon/container_operations_unix.go
  28. 13 1
      daemon/container_operations_windows.go
  29. 3 3
      daemon/create.go
  30. 2 2
      daemon/create_unix.go
  31. 2 2
      daemon/create_windows.go
  32. 9 8
      daemon/daemon.go
  33. 2 2
      daemon/daemon_experimental.go
  34. 2 2
      daemon/daemon_stub.go
  35. 2 2
      daemon/daemon_test.go
  36. 11 10
      daemon/daemon_unix.go
  37. 5 5
      daemon/daemon_unix_test.go
  38. 10 10
      daemon/daemon_windows.go
  39. 2 2
      daemon/daemonbuilder/builder.go
  40. 2 2
      daemon/daemonbuilder/image.go
  41. 2 2
      daemon/delete_test.go
  42. 8 10
      daemon/execdriver/driver_windows.go
  43. 3 3
      daemon/execdriver/windows/info.go
  44. 1 8
      daemon/execdriver/windows/run.go
  45. 7 7
      daemon/execdriver/windows/windows.go
  46. 2 2
      daemon/import.go
  47. 2 1
      daemon/start.go
  48. 2 2
      daemon/volumes.go
  49. 3 3
      image/image.go
  50. 2 2
      integration-cli/docker_api_containers_test.go
  51. 2 2
      integration-cli/docker_cli_inspect_test.go
  52. 3 1
      runconfig/compare.go
  53. 26 25
      runconfig/compare_test.go
  54. 3 36
      runconfig/config.go
  55. 5 4
      runconfig/config_test.go
  56. 7 5
      runconfig/config_unix.go
  57. 5 3
      runconfig/config_windows.go
  58. 5 232
      runconfig/hostconfig.go
  59. 14 34
      runconfig/hostconfig_test.go
  60. 7 91
      runconfig/hostconfig_unix.go
  61. 6 41
      runconfig/hostconfig_windows.go
  62. 2 1
      runconfig/merge.go
  63. 4 3
      runconfig/merge_test.go
  64. 18 29
      runconfig/parse.go
  65. 11 10
      runconfig/parse_test.go

+ 2 - 2
api/client/client.go

@@ -9,9 +9,9 @@ import (
 
 
 	"github.com/docker/docker/api/client/lib"
 	"github.com/docker/docker/api/client/lib"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/filters"
 	"github.com/docker/docker/api/types/filters"
 	"github.com/docker/docker/api/types/registry"
 	"github.com/docker/docker/api/types/registry"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 // apiClient is an interface that clients that talk with a docker server must implement.
 // apiClient is an interface that clients that talk with a docker server must implement.
@@ -19,7 +19,7 @@ type apiClient interface {
 	ClientVersion() string
 	ClientVersion() string
 	ContainerAttach(options types.ContainerAttachOptions) (types.HijackedResponse, error)
 	ContainerAttach(options types.ContainerAttachOptions) (types.HijackedResponse, error)
 	ContainerCommit(options types.ContainerCommitOptions) (types.ContainerCommitResponse, error)
 	ContainerCommit(options types.ContainerCommitOptions) (types.ContainerCommitResponse, error)
-	ContainerCreate(config *runconfig.ContainerConfigWrapper, containerName string) (types.ContainerCreateResponse, error)
+	ContainerCreate(config *container.Config, hostConfig *container.HostConfig, containerName string) (types.ContainerCreateResponse, error)
 	ContainerDiff(containerID string) ([]types.ContainerChange, error)
 	ContainerDiff(containerID string) ([]types.ContainerChange, error)
 	ContainerExecAttach(execID string, config types.ExecConfig) (types.HijackedResponse, error)
 	ContainerExecAttach(execID string, config types.ExecConfig) (types.HijackedResponse, error)
 	ContainerExecCreate(config types.ExecConfig) (types.ContainerExecCreateResponse, error)
 	ContainerExecCreate(config types.ExecConfig) (types.ContainerExecCreateResponse, error)

+ 3 - 3
api/client/commit.go

@@ -6,11 +6,11 @@ import (
 	"fmt"
 	"fmt"
 
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/docker/opts"
 	"github.com/docker/docker/opts"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
 	"github.com/docker/docker/reference"
 	"github.com/docker/docker/reference"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 // CmdCommit creates a new image from a container's changes.
 // CmdCommit creates a new image from a container's changes.
@@ -54,9 +54,9 @@ func (cli *DockerCli) CmdCommit(args ...string) error {
 		}
 		}
 	}
 	}
 
 
-	var config *runconfig.Config
+	var config *container.Config
 	if *flConfig != "" {
 	if *flConfig != "" {
-		config = &runconfig.Config{}
+		config = &container.Config{}
 		if err := json.Unmarshal([]byte(*flConfig), config); err != nil {
 		if err := json.Unmarshal([]byte(*flConfig), config); err != nil {
 			return err
 			return err
 		}
 		}

+ 4 - 5
api/client/create.go

@@ -7,6 +7,7 @@ import (
 
 
 	"github.com/docker/docker/api/client/lib"
 	"github.com/docker/docker/api/client/lib"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	Cli "github.com/docker/docker/cli"
 	Cli "github.com/docker/docker/cli"
 	"github.com/docker/docker/pkg/jsonmessage"
 	"github.com/docker/docker/pkg/jsonmessage"
 	"github.com/docker/docker/reference"
 	"github.com/docker/docker/reference"
@@ -78,9 +79,7 @@ func newCIDFile(path string) (*cidFile, error) {
 	return &cidFile{path: path, file: f}, nil
 	return &cidFile{path: path, file: f}, nil
 }
 }
 
 
-func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runconfig.HostConfig, cidfile, name string) (*types.ContainerCreateResponse, error) {
-	mergedConfig := runconfig.MergeConfigs(config, hostConfig)
-
+func (cli *DockerCli) createContainer(config *container.Config, hostConfig *container.HostConfig, cidfile, name string) (*types.ContainerCreateResponse, error) {
 	var containerIDFile *cidFile
 	var containerIDFile *cidFile
 	if cidfile != "" {
 	if cidfile != "" {
 		var err error
 		var err error
@@ -108,7 +107,7 @@ func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runc
 	}
 	}
 
 
 	//create the container
 	//create the container
-	response, err := cli.client.ContainerCreate(mergedConfig, name)
+	response, err := cli.client.ContainerCreate(config, hostConfig, name)
 	//if image not found try to pull it
 	//if image not found try to pull it
 	if err != nil {
 	if err != nil {
 		if lib.IsErrImageNotFound(err) {
 		if lib.IsErrImageNotFound(err) {
@@ -125,7 +124,7 @@ func (cli *DockerCli) createContainer(config *runconfig.Config, hostConfig *runc
 			}
 			}
 			// Retry
 			// Retry
 			var retryErr error
 			var retryErr error
-			response, retryErr = cli.client.ContainerCreate(mergedConfig, name)
+			response, retryErr = cli.client.ContainerCreate(config, hostConfig, name)
 			if retryErr != nil {
 			if retryErr != nil {
 				return nil, retryErr
 				return nil, retryErr
 			}
 			}

+ 13 - 3
api/client/lib/container_create.go

@@ -6,19 +6,29 @@ import (
 	"strings"
 	"strings"
 
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/runconfig"
+	"github.com/docker/docker/api/types/container"
 )
 )
 
 
+type configWrapper struct {
+	*container.Config
+	HostConfig *container.HostConfig
+}
+
 // ContainerCreate creates a new container based in the given configuration.
 // ContainerCreate creates a new container based in the given configuration.
 // It can be associated with a name, but it's not mandatory.
 // It can be associated with a name, but it's not mandatory.
-func (cli *Client) ContainerCreate(config *runconfig.ContainerConfigWrapper, containerName string) (types.ContainerCreateResponse, error) {
+func (cli *Client) ContainerCreate(config *container.Config, hostConfig *container.HostConfig, containerName string) (types.ContainerCreateResponse, error) {
 	var response types.ContainerCreateResponse
 	var response types.ContainerCreateResponse
 	query := url.Values{}
 	query := url.Values{}
 	if containerName != "" {
 	if containerName != "" {
 		query.Set("name", containerName)
 		query.Set("name", containerName)
 	}
 	}
 
 
-	serverResp, err := cli.post("/containers/create", query, config, nil)
+	body := configWrapper{
+		Config:     config,
+		HostConfig: hostConfig,
+	}
+
+	serverResp, err := cli.post("/containers/create", query, body, nil)
 	if err != nil {
 	if err != nil {
 		if serverResp != nil && serverResp.statusCode == 404 && strings.Contains(err.Error(), config.Image) {
 		if serverResp != nil && serverResp.statusCode == 404 && strings.Contains(err.Error(), config.Image) {
 			return response, imageNotFoundError{config.Image}
 			return response, imageNotFoundError{config.Image}

+ 2 - 2
api/client/lib/image_build.go

@@ -10,7 +10,7 @@ import (
 	"strings"
 	"strings"
 
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/runconfig"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/go-units"
 	"github.com/docker/go-units"
 )
 )
 
 
@@ -73,7 +73,7 @@ func imageBuildOptionsToQuery(options types.ImageBuildOptions) (url.Values, erro
 		query.Set("pull", "1")
 		query.Set("pull", "1")
 	}
 	}
 
 
-	if !runconfig.IsolationLevel.IsDefault(runconfig.IsolationLevel(options.Isolation)) {
+	if !container.IsolationLevel.IsDefault(container.IsolationLevel(options.Isolation)) {
 		query.Set("isolation", options.Isolation)
 		query.Set("isolation", options.Isolation)
 	}
 	}
 
 

+ 3 - 3
api/server/router/build/build_routes.go

@@ -14,6 +14,7 @@ import (
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
 	"github.com/docker/docker/api/server/httputils"
 	"github.com/docker/docker/api/server/httputils"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/builder"
 	"github.com/docker/docker/builder"
 	"github.com/docker/docker/builder/dockerfile"
 	"github.com/docker/docker/builder/dockerfile"
 	"github.com/docker/docker/daemon/daemonbuilder"
 	"github.com/docker/docker/daemon/daemonbuilder"
@@ -24,7 +25,6 @@ import (
 	"github.com/docker/docker/pkg/streamformatter"
 	"github.com/docker/docker/pkg/streamformatter"
 	"github.com/docker/docker/pkg/ulimit"
 	"github.com/docker/docker/pkg/ulimit"
 	"github.com/docker/docker/reference"
 	"github.com/docker/docker/reference"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/utils"
 	"github.com/docker/docker/utils"
 	"golang.org/x/net/context"
 	"golang.org/x/net/context"
 )
 )
@@ -144,8 +144,8 @@ func (br *buildRouter) postBuild(ctx context.Context, w http.ResponseWriter, r *
 		buildConfig.ShmSize = &shmSize
 		buildConfig.ShmSize = &shmSize
 	}
 	}
 
 
-	if i := runconfig.IsolationLevel(r.FormValue("isolation")); i != "" {
-		if !runconfig.IsolationLevel.IsValid(i) {
+	if i := container.IsolationLevel(r.FormValue("isolation")); i != "" {
+		if !container.IsolationLevel.IsValid(i) {
 			return errf(fmt.Errorf("Unsupported isolation: %q", i))
 			return errf(fmt.Errorf("Unsupported isolation: %q", i))
 		}
 		}
 		buildConfig.Isolation = i
 		buildConfig.Isolation = i

+ 2 - 2
api/server/router/container/backend.go

@@ -5,11 +5,11 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/daemon"
 	"github.com/docker/docker/daemon"
 	"github.com/docker/docker/daemon/exec"
 	"github.com/docker/docker/daemon/exec"
 	"github.com/docker/docker/pkg/archive"
 	"github.com/docker/docker/pkg/archive"
 	"github.com/docker/docker/pkg/version"
 	"github.com/docker/docker/pkg/version"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 // execBackend includes functions to implement to provide exec functionality.
 // execBackend includes functions to implement to provide exec functionality.
@@ -39,7 +39,7 @@ type stateBackend interface {
 	ContainerResize(name string, height, width int) error
 	ContainerResize(name string, height, width int) error
 	ContainerRestart(name string, seconds int) error
 	ContainerRestart(name string, seconds int) error
 	ContainerRm(name string, config *types.ContainerRmConfig) error
 	ContainerRm(name string, config *types.ContainerRmConfig) error
-	ContainerStart(name string, hostConfig *runconfig.HostConfig) error
+	ContainerStart(name string, hostConfig *container.HostConfig) error
 	ContainerStop(name string, seconds int) error
 	ContainerStop(name string, seconds int) error
 	ContainerUnpause(name string) error
 	ContainerUnpause(name string) error
 	ContainerWait(name string, timeout time.Duration) (int, error)
 	ContainerWait(name string, timeout time.Duration) (int, error)

+ 2 - 1
api/server/router/container/container_routes.go

@@ -13,6 +13,7 @@ import (
 	"github.com/docker/distribution/registry/api/errcode"
 	"github.com/docker/distribution/registry/api/errcode"
 	"github.com/docker/docker/api/server/httputils"
 	"github.com/docker/docker/api/server/httputils"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	timetypes "github.com/docker/docker/api/types/time"
 	timetypes "github.com/docker/docker/api/types/time"
 	"github.com/docker/docker/daemon"
 	"github.com/docker/docker/daemon"
 	derr "github.com/docker/docker/errors"
 	derr "github.com/docker/docker/errors"
@@ -162,7 +163,7 @@ func (s *containerRouter) postContainersStart(ctx context.Context, w http.Respon
 	// net/http otherwise seems to swallow any headers related to chunked encoding
 	// net/http otherwise seems to swallow any headers related to chunked encoding
 	// including r.TransferEncoding
 	// including r.TransferEncoding
 	// allow a nil body for backwards compatibility
 	// allow a nil body for backwards compatibility
-	var hostConfig *runconfig.HostConfig
+	var hostConfig *container.HostConfig
 	if r.Body != nil && (r.ContentLength > 0 || r.ContentLength == -1) {
 	if r.Body != nil && (r.ContentLength > 0 || r.ContentLength == -1) {
 		if err := httputils.CheckForJSON(r); err != nil {
 		if err := httputils.CheckForJSON(r); err != nil {
 			return err
 			return err

+ 4 - 3
api/server/router/local/image.go

@@ -12,6 +12,7 @@ import (
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/digest"
 	"github.com/docker/docker/api/server/httputils"
 	"github.com/docker/docker/api/server/httputils"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/builder/dockerfile"
 	"github.com/docker/docker/builder/dockerfile"
 	derr "github.com/docker/docker/errors"
 	derr "github.com/docker/docker/errors"
 	"github.com/docker/docker/pkg/ioutils"
 	"github.com/docker/docker/pkg/ioutils"
@@ -43,7 +44,7 @@ func (s *router) postCommit(ctx context.Context, w http.ResponseWriter, r *http.
 		return err
 		return err
 	}
 	}
 	if c == nil {
 	if c == nil {
-		c = &runconfig.Config{}
+		c = &container.Config{}
 	}
 	}
 
 
 	if !s.daemon.Exists(cname) {
 	if !s.daemon.Exists(cname) {
@@ -162,8 +163,8 @@ func (s *router) postImagesCreate(ctx context.Context, w http.ResponseWriter, r
 		// 'err' MUST NOT be defined within this block, we need any error
 		// 'err' MUST NOT be defined within this block, we need any error
 		// generated from the download to be available to the output
 		// generated from the download to be available to the output
 		// stream processing below
 		// stream processing below
-		var newConfig *runconfig.Config
-		newConfig, err = dockerfile.BuildFromConfig(&runconfig.Config{}, r.Form["changes"])
+		var newConfig *container.Config
+		newConfig, err = dockerfile.BuildFromConfig(&container.Config{}, r.Form["changes"])
 		if err != nil {
 		if err != nil {
 			return err
 			return err
 		}
 		}

+ 2 - 2
api/types/client.go

@@ -5,9 +5,9 @@ import (
 	"io"
 	"io"
 	"net"
 	"net"
 
 
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/filters"
 	"github.com/docker/docker/api/types/filters"
 	"github.com/docker/docker/pkg/ulimit"
 	"github.com/docker/docker/pkg/ulimit"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 // ContainerAttachOptions holds parameters to attach to a container.
 // ContainerAttachOptions holds parameters to attach to a container.
@@ -28,7 +28,7 @@ type ContainerCommitOptions struct {
 	Author         string
 	Author         string
 	Changes        []string
 	Changes        []string
 	Pause          bool
 	Pause          bool
-	Config         *runconfig.Config
+	Config         *container.Config
 }
 }
 
 
 // ContainerExecInspect holds information returned by exec inspect.
 // ContainerExecInspect holds information returned by exec inspect.

+ 5 - 7
api/types/configs.go

@@ -1,18 +1,16 @@
 package types
 package types
 
 
+import "github.com/docker/docker/api/types/container"
+
 // configs holds structs used for internal communication between the
 // configs holds structs used for internal communication between the
 // frontend (such as an http server) and the backend (such as the
 // frontend (such as an http server) and the backend (such as the
 // docker daemon).
 // docker daemon).
 
 
-import (
-	"github.com/docker/docker/runconfig"
-)
-
 // ContainerCreateConfig is the parameter set to ContainerCreate()
 // ContainerCreateConfig is the parameter set to ContainerCreate()
 type ContainerCreateConfig struct {
 type ContainerCreateConfig struct {
 	Name            string
 	Name            string
-	Config          *runconfig.Config
-	HostConfig      *runconfig.HostConfig
+	Config          *container.Config
+	HostConfig      *container.HostConfig
 	AdjustCPUShares bool
 	AdjustCPUShares bool
 }
 }
 
 
@@ -33,7 +31,7 @@ type ContainerCommitConfig struct {
 	Comment string
 	Comment string
 	// merge container config into commit config before commit
 	// merge container config into commit config before commit
 	MergeConfigs bool
 	MergeConfigs bool
-	Config       *runconfig.Config
+	Config       *container.Config
 }
 }
 
 
 // ExecConfig is a small subset of the Config struct that hold the configuration
 // ExecConfig is a small subset of the Config struct that hold the configuration

+ 38 - 0
api/types/container/config.go

@@ -0,0 +1,38 @@
+package container
+
+import (
+	"github.com/docker/docker/api/types/strslice"
+	"github.com/docker/go-connections/nat"
+)
+
+// Config contains the configuration data about a container.
+// It should hold only portable information about the container.
+// Here, "portable" means "independent from the host we are running on".
+// Non-portable information *should* appear in HostConfig.
+// All fields added to this struct must be marked `omitempty` to keep getting
+// predictable hashes from the old `v1Compatibility` configuration.
+type Config struct {
+	Hostname        string                // Hostname
+	Domainname      string                // Domainname
+	User            string                // User that will run the command(s) inside the container
+	AttachStdin     bool                  // Attach the standard input, makes possible user interaction
+	AttachStdout    bool                  // Attach the standard output
+	AttachStderr    bool                  // Attach the standard error
+	ExposedPorts    map[nat.Port]struct{} `json:",omitempty"` // List of exposed ports
+	PublishService  string                `json:",omitempty"` // Name of the network service exposed by the container
+	Tty             bool                  // Attach standard streams to a tty, including stdin if it is not closed.
+	OpenStdin       bool                  // Open stdin
+	StdinOnce       bool                  // If true, close stdin after the 1 attached client disconnects.
+	Env             []string              // List of environment variable to set in the container
+	Cmd             *strslice.StrSlice    // Command to run when starting the container
+	ArgsEscaped     bool                  `json:",omitempty"` // True if command is already escaped (Windows specific)
+	Image           string                // Name of the image as it was passed by the operator (eg. could be symbolic)
+	Volumes         map[string]struct{}   // List of volumes (mounts) used for the container
+	WorkingDir      string                // Current directory (PWD) in the command will be launched
+	Entrypoint      *strslice.StrSlice    // Entrypoint to run when starting the container
+	NetworkDisabled bool                  `json:",omitempty"` // Is network disabled
+	MacAddress      string                `json:",omitempty"` // Mac Address of the container
+	OnBuild         []string              // ONBUILD metadata that were defined on the image Dockerfile
+	Labels          map[string]string     // List of labels set to this container
+	StopSignal      string                `json:",omitempty"` // Signal to stop a container
+}

+ 228 - 0
api/types/container/host_config.go

@@ -0,0 +1,228 @@
+package container
+
+import (
+	"strings"
+
+	"github.com/docker/docker/api/types/blkiodev"
+	"github.com/docker/docker/api/types/strslice"
+	"github.com/docker/docker/pkg/ulimit"
+	"github.com/docker/go-connections/nat"
+)
+
+// NetworkMode represents the container network stack.
+type NetworkMode string
+
+// IsolationLevel represents the isolation level of a container. The supported
+// values are platform specific
+type IsolationLevel string
+
+// IsDefault indicates the default isolation level of a container. On Linux this
+// is the native driver. On Windows, this is a Windows Server Container.
+func (i IsolationLevel) IsDefault() bool {
+	return strings.ToLower(string(i)) == "default" || string(i) == ""
+}
+
+// IpcMode represents the container ipc stack.
+type IpcMode string
+
+// IsPrivate indicates whether the container uses it's private ipc stack.
+func (n IpcMode) IsPrivate() bool {
+	return !(n.IsHost() || n.IsContainer())
+}
+
+// IsHost indicates whether the container uses the host's ipc stack.
+func (n IpcMode) IsHost() bool {
+	return n == "host"
+}
+
+// IsContainer indicates whether the container uses a container's ipc stack.
+func (n IpcMode) IsContainer() bool {
+	parts := strings.SplitN(string(n), ":", 2)
+	return len(parts) > 1 && parts[0] == "container"
+}
+
+// Valid indicates whether the ipc stack is valid.
+func (n IpcMode) Valid() bool {
+	parts := strings.Split(string(n), ":")
+	switch mode := parts[0]; mode {
+	case "", "host":
+	case "container":
+		if len(parts) != 2 || parts[1] == "" {
+			return false
+		}
+	default:
+		return false
+	}
+	return true
+}
+
+// Container returns the name of the container ipc stack is going to be used.
+func (n IpcMode) Container() string {
+	parts := strings.SplitN(string(n), ":", 2)
+	if len(parts) > 1 {
+		return parts[1]
+	}
+	return ""
+}
+
+// UTSMode represents the UTS namespace of the container.
+type UTSMode string
+
+// IsPrivate indicates whether the container uses it's private UTS namespace.
+func (n UTSMode) IsPrivate() bool {
+	return !(n.IsHost())
+}
+
+// IsHost indicates whether the container uses the host's UTS namespace.
+func (n UTSMode) IsHost() bool {
+	return n == "host"
+}
+
+// Valid indicates whether the UTS namespace is valid.
+func (n UTSMode) Valid() bool {
+	parts := strings.Split(string(n), ":")
+	switch mode := parts[0]; mode {
+	case "", "host":
+	default:
+		return false
+	}
+	return true
+}
+
+// PidMode represents the pid stack of the container.
+type PidMode string
+
+// IsPrivate indicates whether the container uses it's private pid stack.
+func (n PidMode) IsPrivate() bool {
+	return !(n.IsHost())
+}
+
+// IsHost indicates whether the container uses the host's pid stack.
+func (n PidMode) IsHost() bool {
+	return n == "host"
+}
+
+// Valid indicates whether the pid stack is valid.
+func (n PidMode) Valid() bool {
+	parts := strings.Split(string(n), ":")
+	switch mode := parts[0]; mode {
+	case "", "host":
+	default:
+		return false
+	}
+	return true
+}
+
+// DeviceMapping represents the device mapping between the host and the container.
+type DeviceMapping struct {
+	PathOnHost        string
+	PathInContainer   string
+	CgroupPermissions string
+}
+
+// RestartPolicy represents the restart policies of the container.
+type RestartPolicy struct {
+	Name              string
+	MaximumRetryCount int
+}
+
+// IsNone indicates whether the container has the "no" restart policy.
+// This means the container will not automatically restart when exiting.
+func (rp *RestartPolicy) IsNone() bool {
+	return rp.Name == "no"
+}
+
+// IsAlways indicates whether the container has the "always" restart policy.
+// This means the container will automatically restart regardless of the exit status.
+func (rp *RestartPolicy) IsAlways() bool {
+	return rp.Name == "always"
+}
+
+// IsOnFailure indicates whether the container has the "on-failure" restart policy.
+// This means the contain will automatically restart of exiting with a non-zero exit status.
+func (rp *RestartPolicy) IsOnFailure() bool {
+	return rp.Name == "on-failure"
+}
+
+// IsUnlessStopped indicates whether the container has the
+// "unless-stopped" restart policy. This means the container will
+// automatically restart unless user has put it to stopped state.
+func (rp *RestartPolicy) IsUnlessStopped() bool {
+	return rp.Name == "unless-stopped"
+}
+
+// LogConfig represents the logging configuration of the container.
+type LogConfig struct {
+	Type   string
+	Config map[string]string
+}
+
+// Resources contains container's resources (cgroups config, ulimits...)
+type Resources struct {
+	// Applicable to all platforms
+	CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers)
+
+	// Applicable to UNIX platforms
+	CgroupParent         string // Parent cgroup.
+	BlkioWeight          uint16 // Block IO weight (relative weight vs. other containers)
+	BlkioWeightDevice    []*blkiodev.WeightDevice
+	BlkioDeviceReadBps   []*blkiodev.ThrottleDevice
+	BlkioDeviceWriteBps  []*blkiodev.ThrottleDevice
+	BlkioDeviceReadIOps  []*blkiodev.ThrottleDevice
+	BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice
+	CPUPeriod            int64            `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period
+	CPUQuota             int64            `json:"CpuQuota"`  // CPU CFS (Completely Fair Scheduler) quota
+	CpusetCpus           string           // CpusetCpus 0-2, 0,1
+	CpusetMems           string           // CpusetMems 0-2, 0,1
+	Devices              []DeviceMapping  // List of devices to map inside the container
+	KernelMemory         int64            // Kernel memory limit (in bytes)
+	Memory               int64            // Memory limit (in bytes)
+	MemoryReservation    int64            // Memory soft limit (in bytes)
+	MemorySwap           int64            // Total memory usage (memory + swap); set `-1` to disable swap
+	MemorySwappiness     *int64           // Tuning container memory swappiness behaviour
+	OomKillDisable       bool             // Whether to disable OOM Killer or not
+	Ulimits              []*ulimit.Ulimit // List of ulimits to be set in the container
+}
+
+// HostConfig the non-portable Config structure of a container.
+// Here, "non-portable" means "dependent of the host we are running on".
+// Portable information *should* appear in Config.
+type HostConfig struct {
+	// Applicable to all platforms
+	Binds           []string      // List of volume bindings for this container
+	ContainerIDFile string        // File (path) where the containerId is written
+	LogConfig       LogConfig     // Configuration of the logs for this container
+	NetworkMode     NetworkMode   // Network mode to use for the container
+	PortBindings    nat.PortMap   // Port mapping between the exposed port (container) and the host
+	RestartPolicy   RestartPolicy // Restart policy to be used for the container
+	VolumeDriver    string        // Name of the volume driver used to mount volumes
+	VolumesFrom     []string      // List of volumes to take from other container
+
+	// Applicable to UNIX platforms
+	CapAdd          *strslice.StrSlice // List of kernel capabilities to add to the container
+	CapDrop         *strslice.StrSlice // List of kernel capabilities to remove from the container
+	DNS             []string           `json:"Dns"`        // List of DNS server to lookup
+	DNSOptions      []string           `json:"DnsOptions"` // List of DNSOption to look for
+	DNSSearch       []string           `json:"DnsSearch"`  // List of DNSSearch to look for
+	ExtraHosts      []string           // List of extra hosts
+	GroupAdd        []string           // List of additional groups that the container process will run as
+	IpcMode         IpcMode            // IPC namespace to use for the container
+	Links           []string           // List of links (in the name:alias form)
+	OomScoreAdj     int                // Container preference for OOM-killing
+	OomKillDisable  bool               // Whether to disable OOM Killer or not
+	PidMode         PidMode            // PID namespace to use for the container
+	Privileged      bool               // Is the container in privileged mode
+	PublishAllPorts bool               // Should docker publish all exposed port for the container
+	ReadonlyRootfs  bool               // Is the container root filesystem in read-only
+	SecurityOpt     []string           // List of string values to customize labels for MLS systems, such as SELinux.
+	Tmpfs           map[string]string  `json:",omitempty"` // List of tmpfs (mounts) used for the container
+	UTSMode         UTSMode            // UTS namespace to use for the container
+	ShmSize         *int64             // Total shm memory usage
+
+	// Applicable to Windows
+	ConsoleSize [2]int         // Initial console size
+	Isolation   IsolationLevel // Isolation level of the container (eg default, hyperv)
+
+	// Contains container's resources (cgroups, ulimits)
+	Resources
+}

+ 87 - 0
api/types/container/hostconfig_unix.go

@@ -0,0 +1,87 @@
+// +build !windows
+
+package container
+
+import "strings"
+
+// IsValid indicates is an isolation level is valid
+func (i IsolationLevel) IsValid() bool {
+	return i.IsDefault()
+}
+
+// IsPrivate indicates whether container uses it's private network stack.
+func (n NetworkMode) IsPrivate() bool {
+	return !(n.IsHost() || n.IsContainer())
+}
+
+// IsDefault indicates whether container uses the default network stack.
+func (n NetworkMode) IsDefault() bool {
+	return n == "default"
+}
+
+// NetworkName returns the name of the network stack.
+func (n NetworkMode) NetworkName() string {
+	if n.IsBridge() {
+		return "bridge"
+	} else if n.IsHost() {
+		return "host"
+	} else if n.IsContainer() {
+		return "container"
+	} else if n.IsNone() {
+		return "none"
+	} else if n.IsDefault() {
+		return "default"
+	} else if n.IsUserDefined() {
+		return n.UserDefined()
+	}
+	return ""
+}
+
+// IsBridge indicates whether container uses the bridge network stack
+func (n NetworkMode) IsBridge() bool {
+	return n == "bridge"
+}
+
+// IsHost indicates whether container uses the host network stack.
+func (n NetworkMode) IsHost() bool {
+	return n == "host"
+}
+
+// IsContainer indicates whether container uses a container network stack.
+func (n NetworkMode) IsContainer() bool {
+	parts := strings.SplitN(string(n), ":", 2)
+	return len(parts) > 1 && parts[0] == "container"
+}
+
+// IsNone indicates whether container isn't using a network stack.
+func (n NetworkMode) IsNone() bool {
+	return n == "none"
+}
+
+// ConnectedContainer is the id of the container which network this container is connected to.
+func (n NetworkMode) ConnectedContainer() string {
+	parts := strings.SplitN(string(n), ":", 2)
+	if len(parts) > 1 {
+		return parts[1]
+	}
+	return ""
+}
+
+// IsUserDefined indicates user-created network
+func (n NetworkMode) IsUserDefined() bool {
+	return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer()
+}
+
+// IsPreDefinedNetwork indicates if a network is predefined by the daemon
+func IsPreDefinedNetwork(network string) bool {
+	n := NetworkMode(network)
+	return n.IsBridge() || n.IsHost() || n.IsNone()
+}
+
+//UserDefined indicates user-created network
+func (n NetworkMode) UserDefined() string {
+	if n.IsUserDefined() {
+		return string(n)
+	}
+	return ""
+}

+ 75 - 0
api/types/container/hostconfig_windows.go

@@ -0,0 +1,75 @@
+package container
+
+import (
+	"fmt"
+	"strings"
+)
+
+// IsDefault indicates whether container uses the default network stack.
+func (n NetworkMode) IsDefault() bool {
+	return n == "default"
+}
+
+// IsHyperV indicates the use of a Hyper-V partition for isolation
+func (i IsolationLevel) IsHyperV() bool {
+	return strings.ToLower(string(i)) == "hyperv"
+}
+
+// IsProcess indicates the use of process isolation
+func (i IsolationLevel) IsProcess() bool {
+	return strings.ToLower(string(i)) == "process"
+}
+
+// IsValid indicates is an isolation level is valid
+func (i IsolationLevel) IsValid() bool {
+	return i.IsDefault() || i.IsHyperV() || i.IsProcess()
+}
+
+// DefaultDaemonNetworkMode returns the default network stack the daemon should
+// use.
+func DefaultDaemonNetworkMode() NetworkMode {
+	return NetworkMode("default")
+}
+
+// NetworkName returns the name of the network stack.
+func (n NetworkMode) NetworkName() string {
+	if n.IsDefault() {
+		return "default"
+	}
+	return ""
+}
+
+// IsPreDefinedNetwork indicates if a network is predefined by the daemon
+func IsPreDefinedNetwork(network string) bool {
+	return false
+}
+
+// ValidateNetMode ensures that the various combinations of requested
+// network settings are valid.
+func ValidateNetMode(c *Config, hc *HostConfig) error {
+	// We may not be passed a host config, such as in the case of docker commit
+	if hc == nil {
+		return nil
+	}
+	parts := strings.Split(string(hc.NetworkMode), ":")
+	switch mode := parts[0]; mode {
+	case "default", "none":
+	default:
+		return fmt.Errorf("invalid --net: %s", hc.NetworkMode)
+	}
+	return nil
+}
+
+// ValidateIsolationLevel performs platform specific validation of the
+// isolation level in the hostconfig structure. Windows supports 'default' (or
+// blank), 'process', or 'hyperv'.
+func ValidateIsolationLevel(hc *HostConfig) error {
+	// We may not be passed a host config, such as in the case of docker commit
+	if hc == nil {
+		return nil
+	}
+	if !hc.Isolation.IsValid() {
+		return fmt.Errorf("invalid --isolation: %q. Windows supports 'default', 'process', or 'hyperv'", hc.Isolation)
+	}
+	return nil
+}

+ 5 - 5
api/types/types.go

@@ -4,10 +4,10 @@ import (
 	"os"
 	"os"
 	"time"
 	"time"
 
 
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/network"
 	"github.com/docker/docker/api/types/network"
 	"github.com/docker/docker/api/types/registry"
 	"github.com/docker/docker/api/types/registry"
 	"github.com/docker/docker/pkg/version"
 	"github.com/docker/docker/pkg/version"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/go-connections/nat"
 	"github.com/docker/go-connections/nat"
 )
 )
 
 
@@ -103,10 +103,10 @@ type ImageInspect struct {
 	Comment         string
 	Comment         string
 	Created         string
 	Created         string
 	Container       string
 	Container       string
-	ContainerConfig *runconfig.Config
+	ContainerConfig *container.Config
 	DockerVersion   string
 	DockerVersion   string
 	Author          string
 	Author          string
-	Config          *runconfig.Config
+	Config          *container.Config
 	Architecture    string
 	Architecture    string
 	Os              string
 	Os              string
 	Size            int64
 	Size            int64
@@ -283,7 +283,7 @@ type ContainerJSONBase struct {
 	ProcessLabel    string
 	ProcessLabel    string
 	AppArmorProfile string
 	AppArmorProfile string
 	ExecIDs         []string
 	ExecIDs         []string
-	HostConfig      *runconfig.HostConfig
+	HostConfig      *container.HostConfig
 	GraphDriver     GraphDriverData
 	GraphDriver     GraphDriverData
 	SizeRw          *int64 `json:",omitempty"`
 	SizeRw          *int64 `json:",omitempty"`
 	SizeRootFs      *int64 `json:",omitempty"`
 	SizeRootFs      *int64 `json:",omitempty"`
@@ -293,7 +293,7 @@ type ContainerJSONBase struct {
 type ContainerJSON struct {
 type ContainerJSON struct {
 	*ContainerJSONBase
 	*ContainerJSONBase
 	Mounts          []MountPoint
 	Mounts          []MountPoint
-	Config          *runconfig.Config
+	Config          *container.Config
 	NetworkSettings *NetworkSettings
 	NetworkSettings *NetworkSettings
 }
 }
 
 

+ 2 - 2
api/types/versions/v1p19/types.go

@@ -3,8 +3,8 @@ package v1p19
 
 
 import (
 import (
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/versions/v1p20"
 	"github.com/docker/docker/api/types/versions/v1p20"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/go-connections/nat"
 	"github.com/docker/go-connections/nat"
 )
 )
 
 
@@ -20,7 +20,7 @@ type ContainerJSON struct {
 
 
 // ContainerConfig is a backcompatibility struct for APIs prior to 1.20.
 // ContainerConfig is a backcompatibility struct for APIs prior to 1.20.
 type ContainerConfig struct {
 type ContainerConfig struct {
-	*runconfig.Config
+	*container.Config
 
 
 	MacAddress      string
 	MacAddress      string
 	NetworkDisabled bool
 	NetworkDisabled bool

+ 2 - 2
api/types/versions/v1p20/types.go

@@ -3,7 +3,7 @@ package v1p20
 
 
 import (
 import (
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/runconfig"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/go-connections/nat"
 	"github.com/docker/go-connections/nat"
 )
 )
 
 
@@ -17,7 +17,7 @@ type ContainerJSON struct {
 
 
 // ContainerConfig is a backcompatibility struct used in ContainerJSON for the API 1.20
 // ContainerConfig is a backcompatibility struct used in ContainerJSON for the API 1.20
 type ContainerConfig struct {
 type ContainerConfig struct {
-	*runconfig.Config
+	*container.Config
 
 
 	MacAddress      string
 	MacAddress      string
 	NetworkDisabled bool
 	NetworkDisabled bool

+ 3 - 3
builder/builder.go

@@ -10,7 +10,7 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/runconfig"
+	"github.com/docker/docker/api/types/container"
 )
 )
 
 
 // Context represents a file system tree.
 // Context represents a file system tree.
@@ -113,7 +113,7 @@ type Backend interface {
 	// Kill stops the container execution abruptly.
 	// Kill stops the container execution abruptly.
 	ContainerKill(containerID string, sig uint64) error
 	ContainerKill(containerID string, sig uint64) error
 	// Start starts a new container
 	// Start starts a new container
-	ContainerStart(containerID string, hostConfig *runconfig.HostConfig) error
+	ContainerStart(containerID string, hostConfig *container.HostConfig) error
 	// ContainerWait stops processing until the given container is stopped.
 	// ContainerWait stops processing until the given container is stopped.
 	ContainerWait(containerID string, timeout time.Duration) (int, error)
 	ContainerWait(containerID string, timeout time.Duration) (int, error)
 
 
@@ -135,5 +135,5 @@ type Backend interface {
 type ImageCache interface {
 type ImageCache interface {
 	// GetCachedImage returns a reference to a cached image whose parent equals `parent`
 	// GetCachedImage returns a reference to a cached image whose parent equals `parent`
 	// and runconfig equals `cfg`. A cache miss is expected to return an empty ID and a nil error.
 	// and runconfig equals `cfg`. A cache miss is expected to return an empty ID and a nil error.
-	GetCachedImage(parentID string, cfg *runconfig.Config) (imageID string, err error)
+	GetCachedImage(parentID string, cfg *container.Config) (imageID string, err error)
 }
 }

+ 5 - 5
builder/dockerfile/builder.go

@@ -10,11 +10,11 @@ import (
 	"sync"
 	"sync"
 
 
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/builder"
 	"github.com/docker/docker/builder"
 	"github.com/docker/docker/builder/dockerfile/parser"
 	"github.com/docker/docker/builder/dockerfile/parser"
 	"github.com/docker/docker/pkg/stringid"
 	"github.com/docker/docker/pkg/stringid"
 	"github.com/docker/docker/pkg/ulimit"
 	"github.com/docker/docker/pkg/ulimit"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 var validCommitCommands = map[string]bool{
 var validCommitCommands = map[string]bool{
@@ -52,7 +52,7 @@ type Config struct {
 	ForceRemove bool
 	ForceRemove bool
 	Pull        bool
 	Pull        bool
 	BuildArgs   map[string]string // build-time args received in build context for expansion/substitution and commands in 'run'.
 	BuildArgs   map[string]string // build-time args received in build context for expansion/substitution and commands in 'run'.
-	Isolation   runconfig.IsolationLevel
+	Isolation   container.IsolationLevel
 
 
 	// resource constraints
 	// resource constraints
 	// TODO: factor out to be reused with Run ?
 	// TODO: factor out to be reused with Run ?
@@ -81,7 +81,7 @@ type Builder struct {
 	context builder.Context
 	context builder.Context
 
 
 	dockerfile       *parser.Node
 	dockerfile       *parser.Node
-	runConfig        *runconfig.Config // runconfig for cmd, run, entrypoint etc.
+	runConfig        *container.Config // runconfig for cmd, run, entrypoint etc.
 	flags            *BFlags
 	flags            *BFlags
 	tmpContainers    map[string]struct{}
 	tmpContainers    map[string]struct{}
 	image            string // imageID
 	image            string // imageID
@@ -114,7 +114,7 @@ func NewBuilder(config *Config, docker builder.Backend, context builder.Context,
 		Stderr:           os.Stderr,
 		Stderr:           os.Stderr,
 		docker:           docker,
 		docker:           docker,
 		context:          context,
 		context:          context,
-		runConfig:        new(runconfig.Config),
+		runConfig:        new(container.Config),
 		tmpContainers:    map[string]struct{}{},
 		tmpContainers:    map[string]struct{}{},
 		cancelled:        make(chan struct{}),
 		cancelled:        make(chan struct{}),
 		id:               stringid.GenerateNonCryptoID(),
 		id:               stringid.GenerateNonCryptoID(),
@@ -206,7 +206,7 @@ func (b *Builder) Cancel() {
 // - call parse.Parse() to get AST root from Dockerfile entries
 // - call parse.Parse() to get AST root from Dockerfile entries
 // - do build by calling builder.dispatch() to call all entries' handling routines
 // - do build by calling builder.dispatch() to call all entries' handling routines
 // TODO: remove?
 // TODO: remove?
-func BuildFromConfig(config *runconfig.Config, changes []string) (*runconfig.Config, error) {
+func BuildFromConfig(config *container.Config, changes []string) (*container.Config, error) {
 	ast, err := parser.Parse(bytes.NewBufferString(strings.Join(changes, "\n")))
 	ast, err := parser.Parse(bytes.NewBufferString(strings.Join(changes, "\n")))
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err

+ 3 - 3
builder/dockerfile/internals.go

@@ -21,6 +21,7 @@ import (
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
 	"github.com/docker/docker/api"
 	"github.com/docker/docker/api"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/strslice"
 	"github.com/docker/docker/api/types/strslice"
 	"github.com/docker/docker/builder"
 	"github.com/docker/docker/builder"
 	"github.com/docker/docker/builder/dockerfile/parser"
 	"github.com/docker/docker/builder/dockerfile/parser"
@@ -34,7 +35,6 @@ import (
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/pkg/tarsum"
 	"github.com/docker/docker/pkg/tarsum"
 	"github.com/docker/docker/pkg/urlutil"
 	"github.com/docker/docker/pkg/urlutil"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 func (b *Builder) commit(id string, autoCmd *strslice.StrSlice, comment string) error {
 func (b *Builder) commit(id string, autoCmd *strslice.StrSlice, comment string) error {
@@ -476,7 +476,7 @@ func (b *Builder) create() (string, error) {
 	}
 	}
 	b.runConfig.Image = b.image
 	b.runConfig.Image = b.image
 
 
-	resources := runconfig.Resources{
+	resources := container.Resources{
 		CgroupParent: b.CgroupParent,
 		CgroupParent: b.CgroupParent,
 		CPUShares:    b.CPUShares,
 		CPUShares:    b.CPUShares,
 		CPUPeriod:    b.CPUPeriod,
 		CPUPeriod:    b.CPUPeriod,
@@ -489,7 +489,7 @@ func (b *Builder) create() (string, error) {
 	}
 	}
 
 
 	// TODO: why not embed a hostconfig in builder?
 	// TODO: why not embed a hostconfig in builder?
-	hostConfig := &runconfig.HostConfig{
+	hostConfig := &container.HostConfig{
 		Isolation: b.Isolation,
 		Isolation: b.Isolation,
 		ShmSize:   b.ShmSize,
 		ShmSize:   b.ShmSize,
 		Resources: resources,
 		Resources: resources,

+ 2 - 2
builder/image.go

@@ -1,9 +1,9 @@
 package builder
 package builder
 
 
-import "github.com/docker/docker/runconfig"
+import "github.com/docker/docker/api/types/container"
 
 
 // Image represents a Docker image used by the builder.
 // Image represents a Docker image used by the builder.
 type Image interface {
 type Image interface {
 	ID() string
 	ID() string
-	Config() *runconfig.Config
+	Config() *container.Config
 }
 }

+ 7 - 6
container/container.go

@@ -11,6 +11,7 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/daemon/exec"
 	"github.com/docker/docker/daemon/exec"
 	"github.com/docker/docker/daemon/execdriver"
 	"github.com/docker/docker/daemon/execdriver"
 	"github.com/docker/docker/daemon/logger"
 	"github.com/docker/docker/daemon/logger"
@@ -43,7 +44,7 @@ type CommonContainer struct {
 	Created         time.Time
 	Created         time.Time
 	Path            string
 	Path            string
 	Args            []string
 	Args            []string
-	Config          *runconfig.Config
+	Config          *containertypes.Config
 	ImageID         image.ID `json:"Image"`
 	ImageID         image.ID `json:"Image"`
 	NetworkSettings *network.Settings
 	NetworkSettings *network.Settings
 	LogPath         string
 	LogPath         string
@@ -56,8 +57,8 @@ type CommonContainer struct {
 	HasBeenStartedBefore   bool
 	HasBeenStartedBefore   bool
 	HasBeenManuallyStopped bool // used for unless-stopped restart policy
 	HasBeenManuallyStopped bool // used for unless-stopped restart policy
 	MountPoints            map[string]*volume.MountPoint
 	MountPoints            map[string]*volume.MountPoint
-	HostConfig             *runconfig.HostConfig `json:"-"` // do not serialize the host config in the json, otherwise we'll make the container unportable
-	Command                *execdriver.Command   `json:"-"`
+	HostConfig             *containertypes.HostConfig `json:"-"` // do not serialize the host config in the json, otherwise we'll make the container unportable
+	Command                *execdriver.Command        `json:"-"`
 	monitor                *containerMonitor
 	monitor                *containerMonitor
 	ExecCommands           *exec.Store `json:"-"`
 	ExecCommands           *exec.Store `json:"-"`
 	// logDriver for closing
 	// logDriver for closing
@@ -139,7 +140,7 @@ func (container *Container) ToDiskLocking() error {
 
 
 // readHostConfig reads the host configuration from disk for the container.
 // readHostConfig reads the host configuration from disk for the container.
 func (container *Container) readHostConfig() error {
 func (container *Container) readHostConfig() error {
-	container.HostConfig = &runconfig.HostConfig{}
+	container.HostConfig = &containertypes.HostConfig{}
 	// If the hostconfig file does not exist, do not read it.
 	// If the hostconfig file does not exist, do not read it.
 	// (We still have to initialize container.HostConfig,
 	// (We still have to initialize container.HostConfig,
 	// but that's OK, since we just did that above.)
 	// but that's OK, since we just did that above.)
@@ -261,7 +262,7 @@ func (container *Container) exposes(p nat.Port) bool {
 }
 }
 
 
 // GetLogConfig returns the log configuration for the container.
 // GetLogConfig returns the log configuration for the container.
-func (container *Container) GetLogConfig(defaultConfig runconfig.LogConfig) runconfig.LogConfig {
+func (container *Container) GetLogConfig(defaultConfig containertypes.LogConfig) containertypes.LogConfig {
 	cfg := container.HostConfig.LogConfig
 	cfg := container.HostConfig.LogConfig
 	if cfg.Type != "" || len(cfg.Config) > 0 { // container has log driver configured
 	if cfg.Type != "" || len(cfg.Config) > 0 { // container has log driver configured
 		if cfg.Type == "" {
 		if cfg.Type == "" {
@@ -274,7 +275,7 @@ func (container *Container) GetLogConfig(defaultConfig runconfig.LogConfig) runc
 }
 }
 
 
 // StartLogger starts a new logger driver for the container.
 // StartLogger starts a new logger driver for the container.
-func (container *Container) StartLogger(cfg runconfig.LogConfig) (logger.Logger, error) {
+func (container *Container) StartLogger(cfg containertypes.LogConfig) (logger.Logger, error) {
 	c, err := logger.GetLogDriver(cfg.Type)
 	c, err := logger.GetLogDriver(cfg.Type)
 	if err != nil {
 	if err != nil {
 		return nil, derr.ErrorCodeLoggingFactory.WithArgs(err)
 		return nil, derr.ErrorCodeLoggingFactory.WithArgs(err)

+ 3 - 3
container/container_unit_test.go

@@ -3,14 +3,14 @@ package container
 import (
 import (
 	"testing"
 	"testing"
 
 
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/pkg/signal"
 	"github.com/docker/docker/pkg/signal"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 func TestContainerStopSignal(t *testing.T) {
 func TestContainerStopSignal(t *testing.T) {
 	c := &Container{
 	c := &Container{
 		CommonContainer: CommonContainer{
 		CommonContainer: CommonContainer{
-			Config: &runconfig.Config{},
+			Config: &container.Config{},
 		},
 		},
 	}
 	}
 
 
@@ -26,7 +26,7 @@ func TestContainerStopSignal(t *testing.T) {
 
 
 	c = &Container{
 	c = &Container{
 		CommonContainer: CommonContainer{
 		CommonContainer: CommonContainer{
-			Config: &runconfig.Config{StopSignal: "SIGKILL"},
+			Config: &container.Config{StopSignal: "SIGKILL"},
 		},
 		},
 	}
 	}
 	s = c.StopSignal()
 	s = c.StopSignal()

+ 3 - 3
container/monitor.go

@@ -9,11 +9,11 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/daemon/execdriver"
 	"github.com/docker/docker/daemon/execdriver"
 	derr "github.com/docker/docker/errors"
 	derr "github.com/docker/docker/errors"
 	"github.com/docker/docker/pkg/promise"
 	"github.com/docker/docker/pkg/promise"
 	"github.com/docker/docker/pkg/stringid"
 	"github.com/docker/docker/pkg/stringid"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/utils"
 	"github.com/docker/docker/utils"
 )
 )
 
 
@@ -51,7 +51,7 @@ type containerMonitor struct {
 	container *Container
 	container *Container
 
 
 	// restartPolicy is the current policy being applied to the container monitor
 	// restartPolicy is the current policy being applied to the container monitor
-	restartPolicy runconfig.RestartPolicy
+	restartPolicy container.RestartPolicy
 
 
 	// failureCount is the number of times the container has failed to
 	// failureCount is the number of times the container has failed to
 	// start in a row
 	// start in a row
@@ -79,7 +79,7 @@ type containerMonitor struct {
 
 
 // StartMonitor initializes a containerMonitor for this container with the provided supervisor and restart policy
 // StartMonitor initializes a containerMonitor for this container with the provided supervisor and restart policy
 // and starts the container's process.
 // and starts the container's process.
-func (container *Container) StartMonitor(s supervisor, policy runconfig.RestartPolicy) error {
+func (container *Container) StartMonitor(s supervisor, policy container.RestartPolicy) error {
 	container.monitor = &containerMonitor{
 	container.monitor = &containerMonitor{
 		supervisor:    s,
 		supervisor:    s,
 		container:     container,
 		container:     container,

+ 2 - 2
daemon/config.go

@@ -1,9 +1,9 @@
 package daemon
 package daemon
 
 
 import (
 import (
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/opts"
 	"github.com/docker/docker/opts"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 const (
 const (
@@ -27,7 +27,7 @@ type CommonConfig struct {
 	GraphDriver   string
 	GraphDriver   string
 	GraphOptions  []string
 	GraphOptions  []string
 	Labels        []string
 	Labels        []string
-	LogConfig     runconfig.LogConfig
+	LogConfig     container.LogConfig
 	Mtu           int
 	Mtu           int
 	Pidfile       string
 	Pidfile       string
 	RemappedRoot  string
 	RemappedRoot  string

+ 10 - 9
daemon/container_operations_unix.go

@@ -13,6 +13,7 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
+	containertypes "github.com/docker/docker/api/types/container"
 	networktypes "github.com/docker/docker/api/types/network"
 	networktypes "github.com/docker/docker/api/types/network"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/daemon/execdriver"
 	"github.com/docker/docker/daemon/execdriver"
@@ -460,7 +461,7 @@ func (daemon *Daemon) updateNetworkSettings(container *container.Container, n li
 		container.NetworkSettings = &network.Settings{Networks: make(map[string]*networktypes.EndpointSettings)}
 		container.NetworkSettings = &network.Settings{Networks: make(map[string]*networktypes.EndpointSettings)}
 	}
 	}
 
 
-	if !container.HostConfig.NetworkMode.IsHost() && runconfig.NetworkMode(n.Type()).IsHost() {
+	if !container.HostConfig.NetworkMode.IsHost() && containertypes.NetworkMode(n.Type()).IsHost() {
 		return runconfig.ErrConflictHostNetwork
 		return runconfig.ErrConflictHostNetwork
 	}
 	}
 
 
@@ -474,12 +475,12 @@ func (daemon *Daemon) updateNetworkSettings(container *container.Container, n li
 			// Avoid duplicate config
 			// Avoid duplicate config
 			return nil
 			return nil
 		}
 		}
-		if !runconfig.NetworkMode(sn.Type()).IsPrivate() ||
-			!runconfig.NetworkMode(n.Type()).IsPrivate() {
+		if !containertypes.NetworkMode(sn.Type()).IsPrivate() ||
+			!containertypes.NetworkMode(n.Type()).IsPrivate() {
 			return runconfig.ErrConflictSharedNetwork
 			return runconfig.ErrConflictSharedNetwork
 		}
 		}
-		if runconfig.NetworkMode(sn.Name()).IsNone() ||
-			runconfig.NetworkMode(n.Name()).IsNone() {
+		if containertypes.NetworkMode(sn.Name()).IsNone() ||
+			containertypes.NetworkMode(n.Name()).IsNone() {
 			return runconfig.ErrConflictNoNetwork
 			return runconfig.ErrConflictNoNetwork
 		}
 		}
 	}
 	}
@@ -493,7 +494,7 @@ func (daemon *Daemon) updateEndpointNetworkSettings(container *container.Contain
 		return err
 		return err
 	}
 	}
 
 
-	if container.HostConfig.NetworkMode == runconfig.NetworkMode("bridge") {
+	if container.HostConfig.NetworkMode == containertypes.NetworkMode("bridge") {
 		container.NetworkSettings.Bridge = daemon.configStore.Bridge.Iface
 		container.NetworkSettings.Bridge = daemon.configStore.Bridge.Iface
 	}
 	}
 
 
@@ -625,7 +626,7 @@ func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName
 		return runconfig.ErrConflictSharedNetwork
 		return runconfig.ErrConflictSharedNetwork
 	}
 	}
 
 
-	if runconfig.NetworkMode(idOrName).IsBridge() &&
+	if containertypes.NetworkMode(idOrName).IsBridge() &&
 		daemon.configStore.DisableBridge {
 		daemon.configStore.DisableBridge {
 		container.Config.NetworkDisabled = true
 		container.Config.NetworkDisabled = true
 		return nil
 		return nil
@@ -706,7 +707,7 @@ func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, n li
 		return derr.ErrorCodeNotRunning.WithArgs(container.ID)
 		return derr.ErrorCodeNotRunning.WithArgs(container.ID)
 	}
 	}
 
 
-	if container.HostConfig.NetworkMode.IsHost() && runconfig.NetworkMode(n.Type()).IsHost() {
+	if container.HostConfig.NetworkMode.IsHost() && containertypes.NetworkMode(n.Type()).IsHost() {
 		return runconfig.ErrConflictHostNetwork
 		return runconfig.ErrConflictHostNetwork
 	}
 	}
 
 
@@ -955,7 +956,7 @@ func killProcessDirectly(container *container.Container) error {
 	return nil
 	return nil
 }
 }
 
 
-func getDevicesFromPath(deviceMapping runconfig.DeviceMapping) (devs []*configs.Device, err error) {
+func getDevicesFromPath(deviceMapping containertypes.DeviceMapping) (devs []*configs.Device, err error) {
 	device, err := devices.DeviceFromPath(deviceMapping.PathOnHost, deviceMapping.CgroupPermissions)
 	device, err := devices.DeviceFromPath(deviceMapping.PathOnHost, deviceMapping.CgroupPermissions)
 	// if there was no error, return the device
 	// if there was no error, return the device
 	if err == nil {
 	if err == nil {

+ 13 - 1
daemon/container_operations_windows.go

@@ -7,6 +7,7 @@ import (
 
 
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/daemon/execdriver"
 	"github.com/docker/docker/daemon/execdriver"
+	"github.com/docker/docker/daemon/execdriver/windows"
 	derr "github.com/docker/docker/errors"
 	derr "github.com/docker/docker/errors"
 	"github.com/docker/docker/layer"
 	"github.com/docker/docker/layer"
 	"github.com/docker/libnetwork"
 	"github.com/docker/libnetwork"
@@ -103,6 +104,16 @@ func (daemon *Daemon) populateCommand(c *container.Container, env []string) erro
 	}
 	}
 	layerFolder := m["dir"]
 	layerFolder := m["dir"]
 
 
+	var hvPartition bool
+	// Work out the isolation (whether it is a hypervisor partition)
+	if c.HostConfig.Isolation.IsDefault() {
+		// Not specified by caller. Take daemon default
+		hvPartition = windows.DefaultIsolation.IsHyperV()
+	} else {
+		// Take value specified by caller
+		hvPartition = c.HostConfig.Isolation.IsHyperV()
+	}
+
 	c.Command = &execdriver.Command{
 	c.Command = &execdriver.Command{
 		CommonCommand: execdriver.CommonCommand{
 		CommonCommand: execdriver.CommonCommand{
 			ID:            c.ID,
 			ID:            c.ID,
@@ -119,8 +130,9 @@ func (daemon *Daemon) populateCommand(c *container.Container, env []string) erro
 		LayerFolder: layerFolder,
 		LayerFolder: layerFolder,
 		LayerPaths:  layerPaths,
 		LayerPaths:  layerPaths,
 		Hostname:    c.Config.Hostname,
 		Hostname:    c.Config.Hostname,
-		Isolation:   c.HostConfig.Isolation,
+		Isolation:   string(c.HostConfig.Isolation),
 		ArgsEscaped: c.Config.ArgsEscaped,
 		ArgsEscaped: c.Config.ArgsEscaped,
+		HvPartition: hvPartition,
 	}
 	}
 
 
 	return nil
 	return nil

+ 3 - 3
daemon/create.go

@@ -3,12 +3,12 @@ package daemon
 import (
 import (
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
 	derr "github.com/docker/docker/errors"
 	derr "github.com/docker/docker/errors"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/pkg/idtools"
 	"github.com/docker/docker/pkg/idtools"
 	"github.com/docker/docker/pkg/stringid"
 	"github.com/docker/docker/pkg/stringid"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/volume"
 	"github.com/docker/docker/volume"
 	"github.com/opencontainers/runc/libcontainer/label"
 	"github.com/opencontainers/runc/libcontainer/label"
 )
 )
@@ -25,7 +25,7 @@ func (daemon *Daemon) ContainerCreate(params types.ContainerCreateConfig) (types
 	}
 	}
 
 
 	if params.HostConfig == nil {
 	if params.HostConfig == nil {
-		params.HostConfig = &runconfig.HostConfig{}
+		params.HostConfig = &containertypes.HostConfig{}
 	}
 	}
 	err = daemon.adaptContainerSettings(params.HostConfig, params.AdjustCPUShares)
 	err = daemon.adaptContainerSettings(params.HostConfig, params.AdjustCPUShares)
 	if err != nil {
 	if err != nil {
@@ -111,7 +111,7 @@ func (daemon *Daemon) create(params types.ContainerCreateConfig) (*container.Con
 	return container, nil
 	return container, nil
 }
 }
 
 
-func (daemon *Daemon) generateSecurityOpt(ipcMode runconfig.IpcMode, pidMode runconfig.PidMode) ([]string, error) {
+func (daemon *Daemon) generateSecurityOpt(ipcMode containertypes.IpcMode, pidMode containertypes.PidMode) ([]string, error) {
 	if ipcMode.IsHost() || pidMode.IsHost() {
 	if ipcMode.IsHost() || pidMode.IsHost() {
 		return label.DisableSecOpt(), nil
 		return label.DisableSecOpt(), nil
 	}
 	}

+ 2 - 2
daemon/create_unix.go

@@ -6,17 +6,17 @@ import (
 	"os"
 	"os"
 	"path/filepath"
 	"path/filepath"
 
 
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
 	derr "github.com/docker/docker/errors"
 	derr "github.com/docker/docker/errors"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/pkg/stringid"
 	"github.com/docker/docker/pkg/stringid"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/volume"
 	"github.com/docker/docker/volume"
 	"github.com/opencontainers/runc/libcontainer/label"
 	"github.com/opencontainers/runc/libcontainer/label"
 )
 )
 
 
 // createContainerPlatformSpecificSettings performs platform specific container create functionality
 // createContainerPlatformSpecificSettings performs platform specific container create functionality
-func (daemon *Daemon) createContainerPlatformSpecificSettings(container *container.Container, config *runconfig.Config, hostConfig *runconfig.HostConfig, img *image.Image) error {
+func (daemon *Daemon) createContainerPlatformSpecificSettings(container *container.Container, config *containertypes.Config, hostConfig *containertypes.HostConfig, img *image.Image) error {
 	if err := daemon.Mount(container); err != nil {
 	if err := daemon.Mount(container); err != nil {
 		return err
 		return err
 	}
 	}

+ 2 - 2
daemon/create_windows.go

@@ -3,15 +3,15 @@ package daemon
 import (
 import (
 	"fmt"
 	"fmt"
 
 
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/pkg/stringid"
 	"github.com/docker/docker/pkg/stringid"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/volume"
 	"github.com/docker/docker/volume"
 )
 )
 
 
 // createContainerPlatformSpecificSettings performs platform specific container create functionality
 // createContainerPlatformSpecificSettings performs platform specific container create functionality
-func (daemon *Daemon) createContainerPlatformSpecificSettings(container *container.Container, config *runconfig.Config, hostConfig *runconfig.HostConfig, img *image.Image) error {
+func (daemon *Daemon) createContainerPlatformSpecificSettings(container *container.Container, config *containertypes.Config, hostConfig *containertypes.HostConfig, img *image.Image) error {
 	for spec := range config.Volumes {
 	for spec := range config.Volumes {
 
 
 		mp, err := volume.ParseMountSpec(spec, hostConfig.VolumeDriver)
 		mp, err := volume.ParseMountSpec(spec, hostConfig.VolumeDriver)

+ 9 - 8
daemon/daemon.go

@@ -21,6 +21,7 @@ import (
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/digest"
 	"github.com/docker/docker/api"
 	"github.com/docker/docker/api"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/filters"
 	"github.com/docker/docker/api/types/filters"
 	registrytypes "github.com/docker/docker/api/types/registry"
 	registrytypes "github.com/docker/docker/api/types/registry"
 	"github.com/docker/docker/api/types/strslice"
 	"github.com/docker/docker/api/types/strslice"
@@ -148,7 +149,7 @@ type Daemon struct {
 	driver                    graphdriver.Driver
 	driver                    graphdriver.Driver
 	execDriver                execdriver.Driver
 	execDriver                execdriver.Driver
 	statsCollector            *statsCollector
 	statsCollector            *statsCollector
-	defaultLogConfig          runconfig.LogConfig
+	defaultLogConfig          containertypes.LogConfig
 	RegistryService           *registry.Service
 	RegistryService           *registry.Service
 	EventsService             *events.Events
 	EventsService             *events.Events
 	netController             libnetwork.NetworkController
 	netController             libnetwork.NetworkController
@@ -390,7 +391,7 @@ func (daemon *Daemon) restore() error {
 	return nil
 	return nil
 }
 }
 
 
-func (daemon *Daemon) mergeAndVerifyConfig(config *runconfig.Config, img *image.Image) error {
+func (daemon *Daemon) mergeAndVerifyConfig(config *containertypes.Config, img *image.Image) error {
 	if img != nil && img.Config != nil {
 	if img != nil && img.Config != nil {
 		if err := runconfig.Merge(config, img.Config); err != nil {
 		if err := runconfig.Merge(config, img.Config); err != nil {
 			return err
 			return err
@@ -472,7 +473,7 @@ func (daemon *Daemon) generateNewName(id string) (string, error) {
 	return name, nil
 	return name, nil
 }
 }
 
 
-func (daemon *Daemon) generateHostname(id string, config *runconfig.Config) {
+func (daemon *Daemon) generateHostname(id string, config *containertypes.Config) {
 	// Generate default hostname
 	// Generate default hostname
 	if config.Hostname == "" {
 	if config.Hostname == "" {
 		config.Hostname = id[:12]
 		config.Hostname = id[:12]
@@ -488,7 +489,7 @@ func (daemon *Daemon) getEntrypointAndArgs(configEntrypoint *strslice.StrSlice,
 	return cmdSlice[0], cmdSlice[1:]
 	return cmdSlice[0], cmdSlice[1:]
 }
 }
 
 
-func (daemon *Daemon) newContainer(name string, config *runconfig.Config, imgID image.ID) (*container.Container, error) {
+func (daemon *Daemon) newContainer(name string, config *containertypes.Config, imgID image.ID) (*container.Container, error) {
 	var (
 	var (
 		id             string
 		id             string
 		err            error
 		err            error
@@ -507,7 +508,7 @@ func (daemon *Daemon) newContainer(name string, config *runconfig.Config, imgID
 	base.Path = entrypoint
 	base.Path = entrypoint
 	base.Args = args //FIXME: de-duplicate from config
 	base.Args = args //FIXME: de-duplicate from config
 	base.Config = config
 	base.Config = config
-	base.HostConfig = &runconfig.HostConfig{}
+	base.HostConfig = &containertypes.HostConfig{}
 	base.ImageID = imgID
 	base.ImageID = imgID
 	base.NetworkSettings = &network.Settings{IsAnonymousEndpoint: noExplicitName}
 	base.NetworkSettings = &network.Settings{IsAnonymousEndpoint: noExplicitName}
 	base.Name = name
 	base.Name = name
@@ -1366,7 +1367,7 @@ func (daemon *Daemon) GetRemappedUIDGID() (int, int) {
 // of the image with imgID, that had the same config when it was
 // of the image with imgID, that had the same config when it was
 // created. nil is returned if a child cannot be found. An error is
 // created. nil is returned if a child cannot be found. An error is
 // returned if the parent image cannot be found.
 // returned if the parent image cannot be found.
-func (daemon *Daemon) ImageGetCached(imgID image.ID, config *runconfig.Config) (*image.Image, error) {
+func (daemon *Daemon) ImageGetCached(imgID image.ID, config *containertypes.Config) (*image.Image, error) {
 	// Retrieve all images
 	// Retrieve all images
 	imgs := daemon.Map()
 	imgs := daemon.Map()
 
 
@@ -1402,7 +1403,7 @@ func tempDir(rootDir string, rootUID, rootGID int) (string, error) {
 	return tmpDir, idtools.MkdirAllAs(tmpDir, 0700, rootUID, rootGID)
 	return tmpDir, idtools.MkdirAllAs(tmpDir, 0700, rootUID, rootGID)
 }
 }
 
 
-func (daemon *Daemon) setHostConfig(container *container.Container, hostConfig *runconfig.HostConfig) error {
+func (daemon *Daemon) setHostConfig(container *container.Container, hostConfig *containertypes.HostConfig) error {
 	container.Lock()
 	container.Lock()
 	if err := parseSecurityOpt(container, hostConfig); err != nil {
 	if err := parseSecurityOpt(container, hostConfig); err != nil {
 		container.Unlock()
 		container.Unlock()
@@ -1444,7 +1445,7 @@ func setDefaultMtu(config *Config) {
 
 
 // verifyContainerSettings performs validation of the hostconfig and config
 // verifyContainerSettings performs validation of the hostconfig and config
 // structures.
 // structures.
-func (daemon *Daemon) verifyContainerSettings(hostConfig *runconfig.HostConfig, config *runconfig.Config) ([]string, error) {
+func (daemon *Daemon) verifyContainerSettings(hostConfig *containertypes.HostConfig, config *containertypes.Config) ([]string, error) {
 
 
 	// First perform verification of settings common across all platforms.
 	// First perform verification of settings common across all platforms.
 	if config != nil {
 	if config != nil {

+ 2 - 2
daemon/daemon_experimental.go

@@ -9,9 +9,9 @@ import (
 	"runtime"
 	"runtime"
 
 
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/pkg/directory"
 	"github.com/docker/docker/pkg/directory"
 	"github.com/docker/docker/pkg/idtools"
 	"github.com/docker/docker/pkg/idtools"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 func setupRemappedRoot(config *Config) ([]idtools.IDMap, []idtools.IDMap, error) {
 func setupRemappedRoot(config *Config) ([]idtools.IDMap, []idtools.IDMap, error) {
@@ -99,7 +99,7 @@ func setupDaemonRoot(config *Config, rootDir string, rootUID, rootGID int) error
 	return nil
 	return nil
 }
 }
 
 
-func (daemon *Daemon) verifyExperimentalContainerSettings(hostConfig *runconfig.HostConfig, config *runconfig.Config) ([]string, error) {
+func (daemon *Daemon) verifyExperimentalContainerSettings(hostConfig *container.HostConfig, config *container.Config) ([]string, error) {
 	if hostConfig.Privileged && daemon.configStore.RemappedRoot != "" {
 	if hostConfig.Privileged && daemon.configStore.RemappedRoot != "" {
 		return nil, fmt.Errorf("Privileged mode is incompatible with user namespace mappings")
 		return nil, fmt.Errorf("Privileged mode is incompatible with user namespace mappings")
 	}
 	}

+ 2 - 2
daemon/daemon_stub.go

@@ -5,9 +5,9 @@ package daemon
 import (
 import (
 	"os"
 	"os"
 
 
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/pkg/idtools"
 	"github.com/docker/docker/pkg/idtools"
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/pkg/system"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 func setupRemappedRoot(config *Config) ([]idtools.IDMap, []idtools.IDMap, error) {
 func setupRemappedRoot(config *Config) ([]idtools.IDMap, []idtools.IDMap, error) {
@@ -23,6 +23,6 @@ func setupDaemonRoot(config *Config, rootDir string, rootUID, rootGID int) error
 	return nil
 	return nil
 }
 }
 
 
-func (daemon *Daemon) verifyExperimentalContainerSettings(hostConfig *runconfig.HostConfig, config *runconfig.Config) ([]string, error) {
+func (daemon *Daemon) verifyExperimentalContainerSettings(hostConfig *container.HostConfig, config *container.Config) ([]string, error) {
 	return nil, nil
 	return nil, nil
 }
 }

+ 2 - 2
daemon/daemon_test.go

@@ -7,10 +7,10 @@ import (
 	"path/filepath"
 	"path/filepath"
 	"testing"
 	"testing"
 
 
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/pkg/graphdb"
 	"github.com/docker/docker/pkg/graphdb"
 	"github.com/docker/docker/pkg/truncindex"
 	"github.com/docker/docker/pkg/truncindex"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/volume"
 	"github.com/docker/docker/volume"
 	volumedrivers "github.com/docker/docker/volume/drivers"
 	volumedrivers "github.com/docker/docker/volume/drivers"
 	"github.com/docker/docker/volume/local"
 	"github.com/docker/docker/volume/local"
@@ -141,7 +141,7 @@ func initDaemonWithVolumeStore(tmp string) (*Daemon, error) {
 
 
 func TestParseSecurityOpt(t *testing.T) {
 func TestParseSecurityOpt(t *testing.T) {
 	container := &container.Container{}
 	container := &container.Container{}
-	config := &runconfig.HostConfig{}
+	config := &containertypes.HostConfig{}
 
 
 	// test apparmor
 	// test apparmor
 	config.SecurityOpt = []string{"apparmor:test_profile"}
 	config.SecurityOpt = []string{"apparmor:test_profile"}

+ 11 - 10
daemon/daemon_unix.go

@@ -13,6 +13,7 @@ import (
 
 
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
 	pblkiodev "github.com/docker/docker/api/types/blkiodev"
 	pblkiodev "github.com/docker/docker/api/types/blkiodev"
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/daemon/graphdriver"
 	"github.com/docker/docker/daemon/graphdriver"
 	derr "github.com/docker/docker/errors"
 	derr "github.com/docker/docker/errors"
@@ -43,7 +44,7 @@ const (
 	linuxMinMemory = 4194304
 	linuxMinMemory = 4194304
 )
 )
 
 
-func getBlkioWeightDevices(config *runconfig.HostConfig) ([]*blkiodev.WeightDevice, error) {
+func getBlkioWeightDevices(config *containertypes.HostConfig) ([]*blkiodev.WeightDevice, error) {
 	var stat syscall.Stat_t
 	var stat syscall.Stat_t
 	var blkioWeightDevices []*blkiodev.WeightDevice
 	var blkioWeightDevices []*blkiodev.WeightDevice
 
 
@@ -58,7 +59,7 @@ func getBlkioWeightDevices(config *runconfig.HostConfig) ([]*blkiodev.WeightDevi
 	return blkioWeightDevices, nil
 	return blkioWeightDevices, nil
 }
 }
 
 
-func parseSecurityOpt(container *container.Container, config *runconfig.HostConfig) error {
+func parseSecurityOpt(container *container.Container, config *containertypes.HostConfig) error {
 	var (
 	var (
 		labelOpts []string
 		labelOpts []string
 		err       error
 		err       error
@@ -85,7 +86,7 @@ func parseSecurityOpt(container *container.Container, config *runconfig.HostConf
 	return err
 	return err
 }
 }
 
 
-func getBlkioReadIOpsDevices(config *runconfig.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
+func getBlkioReadIOpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
 	var blkioReadIOpsDevice []*blkiodev.ThrottleDevice
 	var blkioReadIOpsDevice []*blkiodev.ThrottleDevice
 	var stat syscall.Stat_t
 	var stat syscall.Stat_t
 
 
@@ -100,7 +101,7 @@ func getBlkioReadIOpsDevices(config *runconfig.HostConfig) ([]*blkiodev.Throttle
 	return blkioReadIOpsDevice, nil
 	return blkioReadIOpsDevice, nil
 }
 }
 
 
-func getBlkioWriteIOpsDevices(config *runconfig.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
+func getBlkioWriteIOpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
 	var blkioWriteIOpsDevice []*blkiodev.ThrottleDevice
 	var blkioWriteIOpsDevice []*blkiodev.ThrottleDevice
 	var stat syscall.Stat_t
 	var stat syscall.Stat_t
 
 
@@ -115,7 +116,7 @@ func getBlkioWriteIOpsDevices(config *runconfig.HostConfig) ([]*blkiodev.Throttl
 	return blkioWriteIOpsDevice, nil
 	return blkioWriteIOpsDevice, nil
 }
 }
 
 
-func getBlkioReadBpsDevices(config *runconfig.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
+func getBlkioReadBpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
 	var blkioReadBpsDevice []*blkiodev.ThrottleDevice
 	var blkioReadBpsDevice []*blkiodev.ThrottleDevice
 	var stat syscall.Stat_t
 	var stat syscall.Stat_t
 
 
@@ -130,7 +131,7 @@ func getBlkioReadBpsDevices(config *runconfig.HostConfig) ([]*blkiodev.ThrottleD
 	return blkioReadBpsDevice, nil
 	return blkioReadBpsDevice, nil
 }
 }
 
 
-func getBlkioWriteBpsDevices(config *runconfig.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
+func getBlkioWriteBpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
 	var blkioWriteBpsDevice []*blkiodev.ThrottleDevice
 	var blkioWriteBpsDevice []*blkiodev.ThrottleDevice
 	var stat syscall.Stat_t
 	var stat syscall.Stat_t
 
 
@@ -175,7 +176,7 @@ func checkKernel() error {
 
 
 // adaptContainerSettings is called during container creation to modify any
 // adaptContainerSettings is called during container creation to modify any
 // settings necessary in the HostConfig structure.
 // settings necessary in the HostConfig structure.
-func (daemon *Daemon) adaptContainerSettings(hostConfig *runconfig.HostConfig, adjustCPUShares bool) error {
+func (daemon *Daemon) adaptContainerSettings(hostConfig *containertypes.HostConfig, adjustCPUShares bool) error {
 	if adjustCPUShares && hostConfig.CPUShares > 0 {
 	if adjustCPUShares && hostConfig.CPUShares > 0 {
 		// Handle unsupported CPUShares
 		// Handle unsupported CPUShares
 		if hostConfig.CPUShares < linuxMinCPUShares {
 		if hostConfig.CPUShares < linuxMinCPUShares {
@@ -209,7 +210,7 @@ func (daemon *Daemon) adaptContainerSettings(hostConfig *runconfig.HostConfig, a
 	return nil
 	return nil
 }
 }
 
 
-func verifyContainerResources(resources *runconfig.Resources) ([]string, error) {
+func verifyContainerResources(resources *containertypes.Resources) ([]string, error) {
 	warnings := []string{}
 	warnings := []string{}
 	sysInfo := sysinfo.New(true)
 	sysInfo := sysinfo.New(true)
 
 
@@ -349,7 +350,7 @@ func verifyContainerResources(resources *runconfig.Resources) ([]string, error)
 
 
 // verifyPlatformContainerSettings performs platform-specific validation of the
 // verifyPlatformContainerSettings performs platform-specific validation of the
 // hostconfig and config structures.
 // hostconfig and config structures.
-func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *runconfig.HostConfig, config *runconfig.Config) ([]string, error) {
+func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *containertypes.HostConfig, config *containertypes.Config) ([]string, error) {
 	warnings := []string{}
 	warnings := []string{}
 	sysInfo := sysinfo.New(true)
 	sysInfo := sysinfo.New(true)
 
 
@@ -680,7 +681,7 @@ func setupInitLayer(initLayer string, rootUID, rootGID int) error {
 }
 }
 
 
 // registerLinks writes the links to a file.
 // registerLinks writes the links to a file.
-func (daemon *Daemon) registerLinks(container *container.Container, hostConfig *runconfig.HostConfig) error {
+func (daemon *Daemon) registerLinks(container *container.Container, hostConfig *containertypes.HostConfig) error {
 	if hostConfig == nil || hostConfig.Links == nil {
 	if hostConfig == nil || hostConfig.Links == nil {
 		return nil
 		return nil
 	}
 	}

+ 5 - 5
daemon/daemon_unix_test.go

@@ -7,7 +7,7 @@ import (
 	"os"
 	"os"
 	"testing"
 	"testing"
 
 
-	"github.com/docker/docker/runconfig"
+	"github.com/docker/docker/api/types/container"
 )
 )
 
 
 func TestAdjustCPUShares(t *testing.T) {
 func TestAdjustCPUShares(t *testing.T) {
@@ -21,8 +21,8 @@ func TestAdjustCPUShares(t *testing.T) {
 		root:       tmp,
 		root:       tmp,
 	}
 	}
 
 
-	hostConfig := &runconfig.HostConfig{
-		Resources: runconfig.Resources{CPUShares: linuxMinCPUShares - 1},
+	hostConfig := &container.HostConfig{
+		Resources: container.Resources{CPUShares: linuxMinCPUShares - 1},
 	}
 	}
 	daemon.adaptContainerSettings(hostConfig, true)
 	daemon.adaptContainerSettings(hostConfig, true)
 	if hostConfig.CPUShares != linuxMinCPUShares {
 	if hostConfig.CPUShares != linuxMinCPUShares {
@@ -59,8 +59,8 @@ func TestAdjustCPUSharesNoAdjustment(t *testing.T) {
 		root:       tmp,
 		root:       tmp,
 	}
 	}
 
 
-	hostConfig := &runconfig.HostConfig{
-		Resources: runconfig.Resources{CPUShares: linuxMinCPUShares - 1},
+	hostConfig := &container.HostConfig{
+		Resources: container.Resources{CPUShares: linuxMinCPUShares - 1},
 	}
 	}
 	daemon.adaptContainerSettings(hostConfig, false)
 	daemon.adaptContainerSettings(hostConfig, false)
 	if hostConfig.CPUShares != linuxMinCPUShares-1 {
 	if hostConfig.CPUShares != linuxMinCPUShares-1 {

+ 10 - 10
daemon/daemon_windows.go

@@ -9,6 +9,7 @@ import (
 	"strings"
 	"strings"
 
 
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/daemon/graphdriver"
 	"github.com/docker/docker/daemon/graphdriver"
 	"github.com/docker/docker/dockerversion"
 	"github.com/docker/docker/dockerversion"
@@ -18,7 +19,6 @@ import (
 	// register the windows graph driver
 	// register the windows graph driver
 	"github.com/docker/docker/daemon/graphdriver/windows"
 	"github.com/docker/docker/daemon/graphdriver/windows"
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/pkg/system"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/libnetwork"
 	"github.com/docker/libnetwork"
 	blkiodev "github.com/opencontainers/runc/libcontainer/configs"
 	blkiodev "github.com/opencontainers/runc/libcontainer/configs"
 )
 )
@@ -30,27 +30,27 @@ const (
 	windowsMaxCPUShares  = 10000
 	windowsMaxCPUShares  = 10000
 )
 )
 
 
-func getBlkioWeightDevices(config *runconfig.HostConfig) ([]*blkiodev.WeightDevice, error) {
+func getBlkioWeightDevices(config *containertypes.HostConfig) ([]*blkiodev.WeightDevice, error) {
 	return nil, nil
 	return nil, nil
 }
 }
 
 
-func parseSecurityOpt(container *container.Container, config *runconfig.HostConfig) error {
+func parseSecurityOpt(container *container.Container, config *containertypes.HostConfig) error {
 	return nil
 	return nil
 }
 }
 
 
-func getBlkioReadIOpsDevices(config *runconfig.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
+func getBlkioReadIOpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
 	return nil, nil
 	return nil, nil
 }
 }
 
 
-func getBlkioWriteIOpsDevices(config *runconfig.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
+func getBlkioWriteIOpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
 	return nil, nil
 	return nil, nil
 }
 }
 
 
-func getBlkioReadBpsDevices(config *runconfig.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
+func getBlkioReadBpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
 	return nil, nil
 	return nil, nil
 }
 }
 
 
-func getBlkioWriteBpsDevices(config *runconfig.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
+func getBlkioWriteBpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
 	return nil, nil
 	return nil, nil
 }
 }
 
 
@@ -64,7 +64,7 @@ func checkKernel() error {
 
 
 // adaptContainerSettings is called during container creation to modify any
 // adaptContainerSettings is called during container creation to modify any
 // settings necessary in the HostConfig structure.
 // settings necessary in the HostConfig structure.
-func (daemon *Daemon) adaptContainerSettings(hostConfig *runconfig.HostConfig, adjustCPUShares bool) error {
+func (daemon *Daemon) adaptContainerSettings(hostConfig *containertypes.HostConfig, adjustCPUShares bool) error {
 	if hostConfig == nil {
 	if hostConfig == nil {
 		return nil
 		return nil
 	}
 	}
@@ -82,7 +82,7 @@ func (daemon *Daemon) adaptContainerSettings(hostConfig *runconfig.HostConfig, a
 
 
 // verifyPlatformContainerSettings performs platform-specific validation of the
 // verifyPlatformContainerSettings performs platform-specific validation of the
 // hostconfig and config structures.
 // hostconfig and config structures.
-func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *runconfig.HostConfig, config *runconfig.Config) ([]string, error) {
+func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *containertypes.HostConfig, config *containertypes.Config) ([]string, error) {
 	return nil, nil
 	return nil, nil
 }
 }
 
 
@@ -131,7 +131,7 @@ func (daemon *Daemon) initNetworkController(config *Config) (libnetwork.NetworkC
 
 
 // registerLinks sets up links between containers and writes the
 // registerLinks sets up links between containers and writes the
 // configuration out for persistence. As of Windows TP4, links are not supported.
 // configuration out for persistence. As of Windows TP4, links are not supported.
-func (daemon *Daemon) registerLinks(container *container.Container, hostConfig *runconfig.HostConfig) error {
+func (daemon *Daemon) registerLinks(container *container.Container, hostConfig *containertypes.HostConfig) error {
 	return nil
 	return nil
 }
 }
 
 

+ 2 - 2
daemon/daemonbuilder/builder.go

@@ -11,6 +11,7 @@ import (
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
 	"github.com/docker/docker/api"
 	"github.com/docker/docker/api"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/builder"
 	"github.com/docker/docker/builder"
 	"github.com/docker/docker/daemon"
 	"github.com/docker/docker/daemon"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/image"
@@ -21,7 +22,6 @@ import (
 	"github.com/docker/docker/pkg/urlutil"
 	"github.com/docker/docker/pkg/urlutil"
 	"github.com/docker/docker/reference"
 	"github.com/docker/docker/reference"
 	"github.com/docker/docker/registry"
 	"github.com/docker/docker/registry"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 // Docker implements builder.Backend for the docker Daemon object.
 // Docker implements builder.Backend for the docker Daemon object.
@@ -182,7 +182,7 @@ func (d Docker) BuilderCopy(cID string, destPath string, src builder.FileInfo, d
 
 
 // GetCachedImage returns a reference to a cached image whose parent equals `parent`
 // GetCachedImage returns a reference to a cached image whose parent equals `parent`
 // and runconfig equals `cfg`. A cache miss is expected to return an empty ID and a nil error.
 // and runconfig equals `cfg`. A cache miss is expected to return an empty ID and a nil error.
-func (d Docker) GetCachedImage(imgID string, cfg *runconfig.Config) (string, error) {
+func (d Docker) GetCachedImage(imgID string, cfg *container.Config) (string, error) {
 	cache, err := d.Daemon.ImageGetCached(image.ID(imgID), cfg)
 	cache, err := d.Daemon.ImageGetCached(image.ID(imgID), cfg)
 	if cache == nil || err != nil {
 	if cache == nil || err != nil {
 		return "", err
 		return "", err

+ 2 - 2
daemon/daemonbuilder/image.go

@@ -1,8 +1,8 @@
 package daemonbuilder
 package daemonbuilder
 
 
 import (
 import (
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/image"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 type imgWrap struct {
 type imgWrap struct {
@@ -13,6 +13,6 @@ func (img imgWrap) ID() string {
 	return string(img.inner.ID())
 	return string(img.inner.ID())
 }
 }
 
 
-func (img imgWrap) Config() *runconfig.Config {
+func (img imgWrap) Config() *container.Config {
 	return img.inner.Config
 	return img.inner.Config
 }
 }

+ 2 - 2
daemon/delete_test.go

@@ -6,8 +6,8 @@ import (
 	"testing"
 	"testing"
 
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 func TestContainerDoubleDelete(t *testing.T) {
 func TestContainerDoubleDelete(t *testing.T) {
@@ -26,7 +26,7 @@ func TestContainerDoubleDelete(t *testing.T) {
 		CommonContainer: container.CommonContainer{
 		CommonContainer: container.CommonContainer{
 			ID:     "test",
 			ID:     "test",
 			State:  container.NewState(),
 			State:  container.NewState(),
-			Config: &runconfig.Config{},
+			Config: &containertypes.Config{},
 		},
 		},
 	}
 	}
 	daemon.containers.Add(container.ID, container)
 	daemon.containers.Add(container.ID, container)

+ 8 - 10
daemon/execdriver/driver_windows.go

@@ -1,9 +1,6 @@
 package execdriver
 package execdriver
 
 
-import (
-	"github.com/docker/docker/runconfig"
-	"github.com/docker/go-connections/nat"
-)
+import "github.com/docker/go-connections/nat"
 
 
 // Mount contains information for a mount operation.
 // Mount contains information for a mount operation.
 type Mount struct {
 type Mount struct {
@@ -52,12 +49,13 @@ type Command struct {
 
 
 	// Fields below here are platform specific
 	// Fields below here are platform specific
 
 
-	FirstStart  bool                     `json:"first_start"`  // Optimisation for first boot of Windows
-	Hostname    string                   `json:"hostname"`     // Windows sets the hostname in the execdriver
-	LayerFolder string                   `json:"layer_folder"` // Layer folder for a command
-	LayerPaths  []string                 `json:"layer_paths"`  // Layer paths for a command
-	Isolation   runconfig.IsolationLevel `json:"isolation"`    // Isolation level for the container
-	ArgsEscaped bool                     `json:"args_escaped"` // True if args are already escaped
+	FirstStart  bool     `json:"first_start"`  // Optimisation for first boot of Windows
+	Hostname    string   `json:"hostname"`     // Windows sets the hostname in the execdriver
+	LayerFolder string   `json:"layer_folder"` // Layer folder for a command
+	LayerPaths  []string `json:"layer_paths"`  // Layer paths for a command
+	Isolation   string   `json:"isolation"`    // Isolation level for the container
+	ArgsEscaped bool     `json:"args_escaped"` // True if args are already escaped
+	HvPartition bool     `json:"hv_partition"` // True if it's an hypervisor partition
 }
 }
 
 
 // ExitStatus provides exit reasons for a container.
 // ExitStatus provides exit reasons for a container.

+ 3 - 3
daemon/execdriver/windows/info.go

@@ -3,14 +3,14 @@
 package windows
 package windows
 
 
 import (
 import (
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/daemon/execdriver"
 	"github.com/docker/docker/daemon/execdriver"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 type info struct {
 type info struct {
 	ID        string
 	ID        string
 	driver    *Driver
 	driver    *Driver
-	isolation runconfig.IsolationLevel
+	isolation container.IsolationLevel
 }
 }
 
 
 // Info implements the exec driver Driver interface.
 // Info implements the exec driver Driver interface.
@@ -18,7 +18,7 @@ func (d *Driver) Info(id string) execdriver.Info {
 	return &info{
 	return &info{
 		ID:        id,
 		ID:        id,
 		driver:    d,
 		driver:    d,
-		isolation: defaultIsolation,
+		isolation: DefaultIsolation,
 	}
 	}
 }
 }
 
 

+ 1 - 8
daemon/execdriver/windows/run.go

@@ -104,14 +104,7 @@ func (d *Driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, hooks execd
 		HostName:                c.Hostname,
 		HostName:                c.Hostname,
 	}
 	}
 
 
-	// Work out the isolation (whether it is a hypervisor partition)
-	if c.Isolation.IsDefault() {
-		// Not specified by caller. Take daemon default
-		cu.HvPartition = defaultIsolation.IsHyperV()
-	} else {
-		// Take value specified by caller
-		cu.HvPartition = c.Isolation.IsHyperV()
-	}
+	cu.HvPartition = c.HvPartition
 
 
 	if cu.HvPartition {
 	if cu.HvPartition {
 		cu.SandboxPath = filepath.Dir(c.LayerFolder)
 		cu.SandboxPath = filepath.Dir(c.LayerFolder)

+ 7 - 7
daemon/execdriver/windows/windows.go

@@ -8,10 +8,10 @@ import (
 	"sync"
 	"sync"
 
 
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/daemon/execdriver"
 	"github.com/docker/docker/daemon/execdriver"
 	"github.com/docker/docker/dockerversion"
 	"github.com/docker/docker/dockerversion"
 	"github.com/docker/docker/pkg/parsers"
 	"github.com/docker/docker/pkg/parsers"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 // This is a daemon development variable only and should not be
 // This is a daemon development variable only and should not be
@@ -22,11 +22,11 @@ var dummyMode bool
 // This allows the daemon to force kill (HCS terminate) rather than shutdown
 // This allows the daemon to force kill (HCS terminate) rather than shutdown
 var forceKill bool
 var forceKill bool
 
 
-// defaultIsolation allows users to specify a default isolation mode for
+// DefaultIsolation allows users to specify a default isolation mode for
 // when running a container on Windows. For example docker daemon -D
 // when running a container on Windows. For example docker daemon -D
 // --exec-opt isolation=hyperv will cause Windows to always run containers
 // --exec-opt isolation=hyperv will cause Windows to always run containers
 // as Hyper-V containers unless otherwise specified.
 // as Hyper-V containers unless otherwise specified.
-var defaultIsolation runconfig.IsolationLevel = "process"
+var DefaultIsolation container.IsolationLevel = "process"
 
 
 // Define name and version for windows
 // Define name and version for windows
 var (
 var (
@@ -48,7 +48,7 @@ type Driver struct {
 
 
 // Name implements the exec driver Driver interface.
 // Name implements the exec driver Driver interface.
 func (d *Driver) Name() string {
 func (d *Driver) Name() string {
-	return fmt.Sprintf("\n Name: %s\n Build: %s \n Default Isolation: %s", DriverName, Version, defaultIsolation)
+	return fmt.Sprintf("\n Name: %s\n Build: %s \n Default Isolation: %s", DriverName, Version, DefaultIsolation)
 }
 }
 
 
 // NewDriver returns a new windows driver, called from NewDriver of execdriver.
 // NewDriver returns a new windows driver, called from NewDriver of execdriver.
@@ -77,11 +77,11 @@ func NewDriver(root string, options []string) (*Driver, error) {
 			}
 			}
 
 
 		case "isolation":
 		case "isolation":
-			if !runconfig.IsolationLevel(val).IsValid() {
+			if !container.IsolationLevel(val).IsValid() {
 				return nil, fmt.Errorf("Unrecognised exec driver option 'isolation':'%s'", val)
 				return nil, fmt.Errorf("Unrecognised exec driver option 'isolation':'%s'", val)
 			}
 			}
-			if runconfig.IsolationLevel(val).IsHyperV() {
-				defaultIsolation = "hyperv"
+			if container.IsolationLevel(val).IsHyperV() {
+				DefaultIsolation = "hyperv"
 			}
 			}
 			logrus.Infof("Windows default isolation level: '%s'", val)
 			logrus.Infof("Windows default isolation level: '%s'", val)
 		default:
 		default:

+ 2 - 2
daemon/import.go

@@ -8,6 +8,7 @@ import (
 	"runtime"
 	"runtime"
 	"time"
 	"time"
 
 
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/dockerversion"
 	"github.com/docker/docker/dockerversion"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/layer"
 	"github.com/docker/docker/layer"
@@ -15,14 +16,13 @@ import (
 	"github.com/docker/docker/pkg/progress"
 	"github.com/docker/docker/pkg/progress"
 	"github.com/docker/docker/pkg/streamformatter"
 	"github.com/docker/docker/pkg/streamformatter"
 	"github.com/docker/docker/reference"
 	"github.com/docker/docker/reference"
-	"github.com/docker/docker/runconfig"
 )
 )
 
 
 // ImportImage imports an image, getting the archived layer data either from
 // ImportImage imports an image, getting the archived layer data either from
 // inConfig (if src is "-"), or from a URI specified in src. Progress output is
 // inConfig (if src is "-"), or from a URI specified in src. Progress output is
 // written to outStream. Repository and tag names can optionally be given in
 // written to outStream. Repository and tag names can optionally be given in
 // the repo and tag arguments, respectively.
 // the repo and tag arguments, respectively.
-func (daemon *Daemon) ImportImage(src string, newRef reference.Named, msg string, inConfig io.ReadCloser, outStream io.Writer, config *runconfig.Config) error {
+func (daemon *Daemon) ImportImage(src string, newRef reference.Named, msg string, inConfig io.ReadCloser, outStream io.Writer, config *container.Config) error {
 	var (
 	var (
 		sf      = streamformatter.NewJSONStreamFormatter()
 		sf      = streamformatter.NewJSONStreamFormatter()
 		archive io.ReadCloser
 		archive io.ReadCloser

+ 2 - 1
daemon/start.go

@@ -4,13 +4,14 @@ import (
 	"runtime"
 	"runtime"
 
 
 	"github.com/Sirupsen/logrus"
 	"github.com/Sirupsen/logrus"
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
 	derr "github.com/docker/docker/errors"
 	derr "github.com/docker/docker/errors"
 	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/runconfig"
 )
 )
 
 
 // ContainerStart starts a container.
 // ContainerStart starts a container.
-func (daemon *Daemon) ContainerStart(name string, hostConfig *runconfig.HostConfig) error {
+func (daemon *Daemon) ContainerStart(name string, hostConfig *containertypes.HostConfig) error {
 	container, err := daemon.GetContainer(name)
 	container, err := daemon.GetContainer(name)
 	if err != nil {
 	if err != nil {
 		return err
 		return err

+ 2 - 2
daemon/volumes.go

@@ -7,10 +7,10 @@ import (
 	"strings"
 	"strings"
 
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/daemon/execdriver"
 	"github.com/docker/docker/daemon/execdriver"
 	derr "github.com/docker/docker/errors"
 	derr "github.com/docker/docker/errors"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/volume"
 	"github.com/docker/docker/volume"
 	"github.com/opencontainers/runc/libcontainer/label"
 	"github.com/opencontainers/runc/libcontainer/label"
 )
 )
@@ -71,7 +71,7 @@ func (m mounts) parts(i int) int {
 // 2. Select the volumes mounted from another containers. Overrides previously configured mount point destination.
 // 2. Select the volumes mounted from another containers. Overrides previously configured mount point destination.
 // 3. Select the bind mounts set by the client. Overrides previously configured mount point destinations.
 // 3. Select the bind mounts set by the client. Overrides previously configured mount point destinations.
 // 4. Cleanup old volumes that are about to be reassigned.
 // 4. Cleanup old volumes that are about to be reassigned.
-func (daemon *Daemon) registerMountPoints(container *container.Container, hostConfig *runconfig.HostConfig) error {
+func (daemon *Daemon) registerMountPoints(container *container.Container, hostConfig *containertypes.HostConfig) error {
 	binds := map[string]bool{}
 	binds := map[string]bool{}
 	mountPoints := map[string]*volume.MountPoint{}
 	mountPoints := map[string]*volume.MountPoint{}
 
 

+ 3 - 3
image/image.go

@@ -7,7 +7,7 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/digest"
-	"github.com/docker/docker/runconfig"
+	"github.com/docker/docker/api/types/container"
 )
 )
 
 
 // ID is the content-addressable ID of an image.
 // ID is the content-addressable ID of an image.
@@ -30,13 +30,13 @@ type V1Image struct {
 	// Container is the id of the container used to commit
 	// Container is the id of the container used to commit
 	Container string `json:"container,omitempty"`
 	Container string `json:"container,omitempty"`
 	// ContainerConfig  is the configuration of the container that is committed into the image
 	// ContainerConfig  is the configuration of the container that is committed into the image
-	ContainerConfig runconfig.Config `json:"container_config,omitempty"`
+	ContainerConfig container.Config `json:"container_config,omitempty"`
 	// DockerVersion specifies version on which image is built
 	// DockerVersion specifies version on which image is built
 	DockerVersion string `json:"docker_version,omitempty"`
 	DockerVersion string `json:"docker_version,omitempty"`
 	// Author of the image
 	// Author of the image
 	Author string `json:"author,omitempty"`
 	Author string `json:"author,omitempty"`
 	// Config is the configuration of the container received from the client
 	// Config is the configuration of the container received from the client
-	Config *runconfig.Config `json:"config,omitempty"`
+	Config *container.Config `json:"config,omitempty"`
 	// Architecture is the hardware that the image is build and runs on
 	// Architecture is the hardware that the image is build and runs on
 	Architecture string `json:"architecture,omitempty"`
 	Architecture string `json:"architecture,omitempty"`
 	// OS is the operating system used to build and run the image
 	// OS is the operating system used to build and run the image

+ 2 - 2
integration-cli/docker_api_containers_test.go

@@ -16,10 +16,10 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/pkg/integration"
 	"github.com/docker/docker/pkg/integration"
 	"github.com/docker/docker/pkg/integration/checker"
 	"github.com/docker/docker/pkg/integration/checker"
 	"github.com/docker/docker/pkg/stringid"
 	"github.com/docker/docker/pkg/stringid"
-	"github.com/docker/docker/runconfig"
 	"github.com/go-check/check"
 	"github.com/go-check/check"
 )
 )
 
 
@@ -678,7 +678,7 @@ func UtilCreateNetworkMode(c *check.C, networkMode string) {
 
 
 	var containerJSON types.ContainerJSON
 	var containerJSON types.ContainerJSON
 	c.Assert(json.Unmarshal(body, &containerJSON), checker.IsNil)
 	c.Assert(json.Unmarshal(body, &containerJSON), checker.IsNil)
-	c.Assert(containerJSON.HostConfig.NetworkMode, checker.Equals, runconfig.NetworkMode(networkMode), check.Commentf("Mismatched NetworkMode"))
+	c.Assert(containerJSON.HostConfig.NetworkMode, checker.Equals, containertypes.NetworkMode(networkMode), check.Commentf("Mismatched NetworkMode"))
 }
 }
 
 
 func (s *DockerSuite) TestContainerApiCreateWithCpuSharesCpuset(c *check.C) {
 func (s *DockerSuite) TestContainerApiCreateWithCpuSharesCpuset(c *check.C) {

+ 2 - 2
integration-cli/docker_cli_inspect_test.go

@@ -9,8 +9,8 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/pkg/integration/checker"
 	"github.com/docker/docker/pkg/integration/checker"
-	"github.com/docker/docker/runconfig"
 	"github.com/go-check/check"
 	"github.com/go-check/check"
 )
 )
 
 
@@ -281,7 +281,7 @@ func (s *DockerSuite) TestInspectTimesAsRFC3339Nano(c *check.C) {
 func (s *DockerSuite) TestInspectLogConfigNoType(c *check.C) {
 func (s *DockerSuite) TestInspectLogConfigNoType(c *check.C) {
 	testRequires(c, DaemonIsLinux)
 	testRequires(c, DaemonIsLinux)
 	dockerCmd(c, "create", "--name=test", "--log-opt", "max-file=42", "busybox")
 	dockerCmd(c, "create", "--name=test", "--log-opt", "max-file=42", "busybox")
-	var logConfig runconfig.LogConfig
+	var logConfig container.LogConfig
 
 
 	out, err := inspectFieldJSON("test", "HostConfig.LogConfig")
 	out, err := inspectFieldJSON("test", "HostConfig.LogConfig")
 	c.Assert(err, checker.IsNil, check.Commentf("%v", out))
 	c.Assert(err, checker.IsNil, check.Commentf("%v", out))

+ 3 - 1
runconfig/compare.go

@@ -1,8 +1,10 @@
 package runconfig
 package runconfig
 
 
+import "github.com/docker/docker/api/types/container"
+
 // Compare two Config struct. Do not compare the "Image" nor "Hostname" fields
 // Compare two Config struct. Do not compare the "Image" nor "Hostname" fields
 // If OpenStdin is set, then it differs
 // If OpenStdin is set, then it differs
-func Compare(a, b *Config) bool {
+func Compare(a, b *container.Config) bool {
 	if a == nil || b == nil ||
 	if a == nil || b == nil ||
 		a.OpenStdin || b.OpenStdin {
 		a.OpenStdin || b.OpenStdin {
 		return false
 		return false

+ 26 - 25
runconfig/compare_test.go

@@ -3,6 +3,7 @@ package runconfig
 import (
 import (
 	"testing"
 	"testing"
 
 
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/strslice"
 	"github.com/docker/docker/api/types/strslice"
 	"github.com/docker/go-connections/nat"
 	"github.com/docker/go-connections/nat"
 )
 )
@@ -43,11 +44,11 @@ func TestCompare(t *testing.T) {
 	labels2 := map[string]string{"LABEL1": "value1", "LABEL2": "value3"}
 	labels2 := map[string]string{"LABEL1": "value1", "LABEL2": "value3"}
 	labels3 := map[string]string{"LABEL1": "value1", "LABEL2": "value2", "LABEL3": "value3"}
 	labels3 := map[string]string{"LABEL1": "value1", "LABEL2": "value2", "LABEL3": "value3"}
 
 
-	sameConfigs := map[*Config]*Config{
+	sameConfigs := map[*container.Config]*container.Config{
 		// Empty config
 		// Empty config
-		&Config{}: {},
+		&container.Config{}: {},
 		// Does not compare hostname, domainname & image
 		// Does not compare hostname, domainname & image
-		&Config{
+		&container.Config{
 			Hostname:   "host1",
 			Hostname:   "host1",
 			Domainname: "domain1",
 			Domainname: "domain1",
 			Image:      "image1",
 			Image:      "image1",
@@ -59,23 +60,23 @@ func TestCompare(t *testing.T) {
 			User:       "user",
 			User:       "user",
 		},
 		},
 		// only OpenStdin
 		// only OpenStdin
-		&Config{OpenStdin: false}: {OpenStdin: false},
+		&container.Config{OpenStdin: false}: {OpenStdin: false},
 		// only env
 		// only env
-		&Config{Env: envs1}: {Env: envs1},
+		&container.Config{Env: envs1}: {Env: envs1},
 		// only cmd
 		// only cmd
-		&Config{Cmd: cmd1}: {Cmd: cmd1},
+		&container.Config{Cmd: cmd1}: {Cmd: cmd1},
 		// only labels
 		// only labels
-		&Config{Labels: labels1}: {Labels: labels1},
+		&container.Config{Labels: labels1}: {Labels: labels1},
 		// only exposedPorts
 		// only exposedPorts
-		&Config{ExposedPorts: ports1}: {ExposedPorts: ports1},
+		&container.Config{ExposedPorts: ports1}: {ExposedPorts: ports1},
 		// only entrypoints
 		// only entrypoints
-		&Config{Entrypoint: entrypoint1}: {Entrypoint: entrypoint1},
+		&container.Config{Entrypoint: entrypoint1}: {Entrypoint: entrypoint1},
 		// only volumes
 		// only volumes
-		&Config{Volumes: volumes1}: {Volumes: volumes1},
+		&container.Config{Volumes: volumes1}: {Volumes: volumes1},
 	}
 	}
-	differentConfigs := map[*Config]*Config{
+	differentConfigs := map[*container.Config]*container.Config{
 		nil: nil,
 		nil: nil,
-		&Config{
+		&container.Config{
 			Hostname:   "host1",
 			Hostname:   "host1",
 			Domainname: "domain1",
 			Domainname: "domain1",
 			Image:      "image1",
 			Image:      "image1",
@@ -87,30 +88,30 @@ func TestCompare(t *testing.T) {
 			User:       "user2",
 			User:       "user2",
 		},
 		},
 		// only OpenStdin
 		// only OpenStdin
-		&Config{OpenStdin: false}: {OpenStdin: true},
-		&Config{OpenStdin: true}:  {OpenStdin: false},
+		&container.Config{OpenStdin: false}: {OpenStdin: true},
+		&container.Config{OpenStdin: true}:  {OpenStdin: false},
 		// only env
 		// only env
-		&Config{Env: envs1}: {Env: envs2},
+		&container.Config{Env: envs1}: {Env: envs2},
 		// only cmd
 		// only cmd
-		&Config{Cmd: cmd1}: {Cmd: cmd2},
+		&container.Config{Cmd: cmd1}: {Cmd: cmd2},
 		// not the same number of parts
 		// not the same number of parts
-		&Config{Cmd: cmd1}: {Cmd: cmd3},
+		&container.Config{Cmd: cmd1}: {Cmd: cmd3},
 		// only labels
 		// only labels
-		&Config{Labels: labels1}: {Labels: labels2},
+		&container.Config{Labels: labels1}: {Labels: labels2},
 		// not the same number of labels
 		// not the same number of labels
-		&Config{Labels: labels1}: {Labels: labels3},
+		&container.Config{Labels: labels1}: {Labels: labels3},
 		// only exposedPorts
 		// only exposedPorts
-		&Config{ExposedPorts: ports1}: {ExposedPorts: ports2},
+		&container.Config{ExposedPorts: ports1}: {ExposedPorts: ports2},
 		// not the same number of ports
 		// not the same number of ports
-		&Config{ExposedPorts: ports1}: {ExposedPorts: ports3},
+		&container.Config{ExposedPorts: ports1}: {ExposedPorts: ports3},
 		// only entrypoints
 		// only entrypoints
-		&Config{Entrypoint: entrypoint1}: {Entrypoint: entrypoint2},
+		&container.Config{Entrypoint: entrypoint1}: {Entrypoint: entrypoint2},
 		// not the same number of parts
 		// not the same number of parts
-		&Config{Entrypoint: entrypoint1}: {Entrypoint: entrypoint3},
+		&container.Config{Entrypoint: entrypoint1}: {Entrypoint: entrypoint3},
 		// only volumes
 		// only volumes
-		&Config{Volumes: volumes1}: {Volumes: volumes2},
+		&container.Config{Volumes: volumes1}: {Volumes: volumes2},
 		// not the same number of labels
 		// not the same number of labels
-		&Config{Volumes: volumes1}: {Volumes: volumes3},
+		&container.Config{Volumes: volumes1}: {Volumes: volumes3},
 	}
 	}
 	for config1, config2 := range sameConfigs {
 	for config1, config2 := range sameConfigs {
 		if !Compare(config1, config2) {
 		if !Compare(config1, config2) {

+ 3 - 36
runconfig/config.go

@@ -5,48 +5,15 @@ import (
 	"fmt"
 	"fmt"
 	"io"
 	"io"
 
 
-	"github.com/docker/docker/api/types/strslice"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/volume"
 	"github.com/docker/docker/volume"
-	"github.com/docker/go-connections/nat"
 )
 )
 
 
-// Config contains the configuration data about a container.
-// It should hold only portable information about the container.
-// Here, "portable" means "independent from the host we are running on".
-// Non-portable information *should* appear in HostConfig.
-// All fields added to this struct must be marked `omitempty` to keep getting
-// predictable hashes from the old `v1Compatibility` configuration.
-type Config struct {
-	Hostname        string                // Hostname
-	Domainname      string                // Domainname
-	User            string                // User that will run the command(s) inside the container
-	AttachStdin     bool                  // Attach the standard input, makes possible user interaction
-	AttachStdout    bool                  // Attach the standard output
-	AttachStderr    bool                  // Attach the standard error
-	ExposedPorts    map[nat.Port]struct{} `json:",omitempty"` // List of exposed ports
-	PublishService  string                `json:",omitempty"` // Name of the network service exposed by the container
-	Tty             bool                  // Attach standard streams to a tty, including stdin if it is not closed.
-	OpenStdin       bool                  // Open stdin
-	StdinOnce       bool                  // If true, close stdin after the 1 attached client disconnects.
-	Env             []string              // List of environment variable to set in the container
-	Cmd             *strslice.StrSlice    // Command to run when starting the container
-	ArgsEscaped     bool                  `json:",omitempty"` // True if command is already escaped (Windows specific)
-	Image           string                // Name of the image as it was passed by the operator (eg. could be symbolic)
-	Volumes         map[string]struct{}   // List of volumes (mounts) used for the container
-	WorkingDir      string                // Current directory (PWD) in the command will be launched
-	Entrypoint      *strslice.StrSlice    // Entrypoint to run when starting the container
-	NetworkDisabled bool                  `json:",omitempty"` // Is network disabled
-	MacAddress      string                `json:",omitempty"` // Mac Address of the container
-	OnBuild         []string              // ONBUILD metadata that were defined on the image Dockerfile
-	Labels          map[string]string     // List of labels set to this container
-	StopSignal      string                `json:",omitempty"` // Signal to stop a container
-}
-
 // DecodeContainerConfig decodes a json encoded config into a ContainerConfigWrapper
 // DecodeContainerConfig decodes a json encoded config into a ContainerConfigWrapper
 // struct and returns both a Config and an HostConfig struct
 // struct and returns both a Config and an HostConfig struct
 // Be aware this function is not checking whether the resulted structs are nil,
 // Be aware this function is not checking whether the resulted structs are nil,
 // it's your business to do so
 // it's your business to do so
-func DecodeContainerConfig(src io.Reader) (*Config, *HostConfig, error) {
+func DecodeContainerConfig(src io.Reader) (*container.Config, *container.HostConfig, error) {
 	var w ContainerConfigWrapper
 	var w ContainerConfigWrapper
 
 
 	decoder := json.NewDecoder(src)
 	decoder := json.NewDecoder(src)
@@ -85,7 +52,7 @@ func DecodeContainerConfig(src io.Reader) (*Config, *HostConfig, error) {
 
 
 // validateVolumesAndBindSettings validates each of the volumes and bind settings
 // validateVolumesAndBindSettings validates each of the volumes and bind settings
 // passed by the caller to ensure they are valid.
 // passed by the caller to ensure they are valid.
-func validateVolumesAndBindSettings(c *Config, hc *HostConfig) error {
+func validateVolumesAndBindSettings(c *container.Config, hc *container.HostConfig) error {
 
 
 	// Ensure all volumes and binds are valid.
 	// Ensure all volumes and binds are valid.
 	for spec := range c.Volumes {
 	for spec := range c.Volumes {

+ 5 - 4
runconfig/config_test.go

@@ -9,6 +9,7 @@ import (
 	"strings"
 	"strings"
 	"testing"
 	"testing"
 
 
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/strslice"
 	"github.com/docker/docker/api/types/strslice"
 )
 )
 
 
@@ -101,16 +102,16 @@ func TestDecodeContainerConfigIsolation(t *testing.T) {
 
 
 // callDecodeContainerConfigIsolation is a utility function to call
 // callDecodeContainerConfigIsolation is a utility function to call
 // DecodeContainerConfig for validating isolation levels
 // DecodeContainerConfig for validating isolation levels
-func callDecodeContainerConfigIsolation(isolation string) (*Config, *HostConfig, error) {
+func callDecodeContainerConfigIsolation(isolation string) (*container.Config, *container.HostConfig, error) {
 	var (
 	var (
 		b   []byte
 		b   []byte
 		err error
 		err error
 	)
 	)
 	w := ContainerConfigWrapper{
 	w := ContainerConfigWrapper{
-		Config: &Config{},
-		HostConfig: &HostConfig{
+		Config: &container.Config{},
+		HostConfig: &container.HostConfig{
 			NetworkMode: "none",
 			NetworkMode: "none",
-			Isolation:   IsolationLevel(isolation)},
+			Isolation:   container.IsolationLevel(isolation)},
 	}
 	}
 	if b, err = json.Marshal(w); err != nil {
 	if b, err = json.Marshal(w); err != nil {
 		return nil, nil, fmt.Errorf("Error on marshal %s", err.Error())
 		return nil, nil, fmt.Errorf("Error on marshal %s", err.Error())

+ 7 - 5
runconfig/config_unix.go

@@ -2,18 +2,20 @@
 
 
 package runconfig
 package runconfig
 
 
+import "github.com/docker/docker/api/types/container"
+
 // ContainerConfigWrapper is a Config wrapper that hold the container Config (portable)
 // ContainerConfigWrapper is a Config wrapper that hold the container Config (portable)
 // and the corresponding HostConfig (non-portable).
 // and the corresponding HostConfig (non-portable).
 type ContainerConfigWrapper struct {
 type ContainerConfigWrapper struct {
-	*Config
-	InnerHostConfig *HostConfig `json:"HostConfig,omitempty"`
-	Cpuset          string      `json:",omitempty"` // Deprecated. Exported for backwards compatibility.
-	*HostConfig                 // Deprecated. Exported to read attributes from json that are not in the inner host config structure.
+	*container.Config
+	InnerHostConfig       *container.HostConfig `json:"HostConfig,omitempty"`
+	Cpuset                string                `json:",omitempty"` // Deprecated. Exported for backwards compatibility.
+	*container.HostConfig                       // Deprecated. Exported to read attributes from json that are not in the inner host config structure.
 }
 }
 
 
 // getHostConfig gets the HostConfig of the Config.
 // getHostConfig gets the HostConfig of the Config.
 // It's mostly there to handle Deprecated fields of the ContainerConfigWrapper
 // It's mostly there to handle Deprecated fields of the ContainerConfigWrapper
-func (w *ContainerConfigWrapper) getHostConfig() *HostConfig {
+func (w *ContainerConfigWrapper) getHostConfig() *container.HostConfig {
 	hc := w.HostConfig
 	hc := w.HostConfig
 
 
 	if hc == nil && w.InnerHostConfig != nil {
 	if hc == nil && w.InnerHostConfig != nil {

+ 5 - 3
runconfig/config_windows.go

@@ -1,13 +1,15 @@
 package runconfig
 package runconfig
 
 
+import "github.com/docker/docker/api/types/container"
+
 // ContainerConfigWrapper is a Config wrapper that hold the container Config (portable)
 // ContainerConfigWrapper is a Config wrapper that hold the container Config (portable)
 // and the corresponding HostConfig (non-portable).
 // and the corresponding HostConfig (non-portable).
 type ContainerConfigWrapper struct {
 type ContainerConfigWrapper struct {
-	*Config
-	HostConfig *HostConfig `json:"HostConfig,omitempty"`
+	*container.Config
+	HostConfig *container.HostConfig `json:"HostConfig,omitempty"`
 }
 }
 
 
 // getHostConfig gets the HostConfig of the Config.
 // getHostConfig gets the HostConfig of the Config.
-func (w *ContainerConfigWrapper) getHostConfig() *HostConfig {
+func (w *ContainerConfigWrapper) getHostConfig() *container.HostConfig {
 	return w.HostConfig
 	return w.HostConfig
 }
 }

+ 5 - 232
runconfig/hostconfig.go

@@ -3,240 +3,13 @@ package runconfig
 import (
 import (
 	"encoding/json"
 	"encoding/json"
 	"io"
 	"io"
-	"strings"
 
 
-	"github.com/docker/docker/api/types/blkiodev"
-	"github.com/docker/docker/api/types/strslice"
-	"github.com/docker/docker/pkg/ulimit"
-	"github.com/docker/go-connections/nat"
+	"github.com/docker/docker/api/types/container"
 )
 )
 
 
-// KeyValuePair is a structure that hold a value for a key.
-type KeyValuePair struct {
-	Key   string
-	Value string
-}
-
-// NetworkMode represents the container network stack.
-type NetworkMode string
-
-// IsolationLevel represents the isolation level of a container. The supported
-// values are platform specific
-type IsolationLevel string
-
-// IsDefault indicates the default isolation level of a container. On Linux this
-// is the native driver. On Windows, this is a Windows Server Container.
-func (i IsolationLevel) IsDefault() bool {
-	return strings.ToLower(string(i)) == "default" || string(i) == ""
-}
-
-// IpcMode represents the container ipc stack.
-type IpcMode string
-
-// IsPrivate indicates whether the container uses it's private ipc stack.
-func (n IpcMode) IsPrivate() bool {
-	return !(n.IsHost() || n.IsContainer())
-}
-
-// IsHost indicates whether the container uses the host's ipc stack.
-func (n IpcMode) IsHost() bool {
-	return n == "host"
-}
-
-// IsContainer indicates whether the container uses a container's ipc stack.
-func (n IpcMode) IsContainer() bool {
-	parts := strings.SplitN(string(n), ":", 2)
-	return len(parts) > 1 && parts[0] == "container"
-}
-
-// Valid indicates whether the ipc stack is valid.
-func (n IpcMode) Valid() bool {
-	parts := strings.Split(string(n), ":")
-	switch mode := parts[0]; mode {
-	case "", "host":
-	case "container":
-		if len(parts) != 2 || parts[1] == "" {
-			return false
-		}
-	default:
-		return false
-	}
-	return true
-}
-
-// Container returns the name of the container ipc stack is going to be used.
-func (n IpcMode) Container() string {
-	parts := strings.SplitN(string(n), ":", 2)
-	if len(parts) > 1 {
-		return parts[1]
-	}
-	return ""
-}
-
-// UTSMode represents the UTS namespace of the container.
-type UTSMode string
-
-// IsPrivate indicates whether the container uses it's private UTS namespace.
-func (n UTSMode) IsPrivate() bool {
-	return !(n.IsHost())
-}
-
-// IsHost indicates whether the container uses the host's UTS namespace.
-func (n UTSMode) IsHost() bool {
-	return n == "host"
-}
-
-// Valid indicates whether the UTS namespace is valid.
-func (n UTSMode) Valid() bool {
-	parts := strings.Split(string(n), ":")
-	switch mode := parts[0]; mode {
-	case "", "host":
-	default:
-		return false
-	}
-	return true
-}
-
-// PidMode represents the pid stack of the container.
-type PidMode string
-
-// IsPrivate indicates whether the container uses it's private pid stack.
-func (n PidMode) IsPrivate() bool {
-	return !(n.IsHost())
-}
-
-// IsHost indicates whether the container uses the host's pid stack.
-func (n PidMode) IsHost() bool {
-	return n == "host"
-}
-
-// Valid indicates whether the pid stack is valid.
-func (n PidMode) Valid() bool {
-	parts := strings.Split(string(n), ":")
-	switch mode := parts[0]; mode {
-	case "", "host":
-	default:
-		return false
-	}
-	return true
-}
-
-// DeviceMapping represents the device mapping between the host and the container.
-type DeviceMapping struct {
-	PathOnHost        string
-	PathInContainer   string
-	CgroupPermissions string
-}
-
-// RestartPolicy represents the restart policies of the container.
-type RestartPolicy struct {
-	Name              string
-	MaximumRetryCount int
-}
-
-// IsNone indicates whether the container has the "no" restart policy.
-// This means the container will not automatically restart when exiting.
-func (rp *RestartPolicy) IsNone() bool {
-	return rp.Name == "no"
-}
-
-// IsAlways indicates whether the container has the "always" restart policy.
-// This means the container will automatically restart regardless of the exit status.
-func (rp *RestartPolicy) IsAlways() bool {
-	return rp.Name == "always"
-}
-
-// IsOnFailure indicates whether the container has the "on-failure" restart policy.
-// This means the contain will automatically restart of exiting with a non-zero exit status.
-func (rp *RestartPolicy) IsOnFailure() bool {
-	return rp.Name == "on-failure"
-}
-
-// IsUnlessStopped indicates whether the container has the
-// "unless-stopped" restart policy. This means the container will
-// automatically restart unless user has put it to stopped state.
-func (rp *RestartPolicy) IsUnlessStopped() bool {
-	return rp.Name == "unless-stopped"
-}
-
-// LogConfig represents the logging configuration of the container.
-type LogConfig struct {
-	Type   string
-	Config map[string]string
-}
-
-// Resources contains container's resources (cgroups config, ulimits...)
-type Resources struct {
-	// Applicable to all platforms
-	CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers)
-
-	// Applicable to UNIX platforms
-	CgroupParent         string // Parent cgroup.
-	BlkioWeight          uint16 // Block IO weight (relative weight vs. other containers)
-	BlkioWeightDevice    []*blkiodev.WeightDevice
-	BlkioDeviceReadBps   []*blkiodev.ThrottleDevice
-	BlkioDeviceWriteBps  []*blkiodev.ThrottleDevice
-	BlkioDeviceReadIOps  []*blkiodev.ThrottleDevice
-	BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice
-	CPUPeriod            int64            `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period
-	CPUQuota             int64            `json:"CpuQuota"`  // CPU CFS (Completely Fair Scheduler) quota
-	CpusetCpus           string           // CpusetCpus 0-2, 0,1
-	CpusetMems           string           // CpusetMems 0-2, 0,1
-	Devices              []DeviceMapping  // List of devices to map inside the container
-	KernelMemory         int64            // Kernel memory limit (in bytes)
-	Memory               int64            // Memory limit (in bytes)
-	MemoryReservation    int64            // Memory soft limit (in bytes)
-	MemorySwap           int64            // Total memory usage (memory + swap); set `-1` to disable swap
-	MemorySwappiness     *int64           // Tuning container memory swappiness behaviour
-	OomKillDisable       bool             // Whether to disable OOM Killer or not
-	Ulimits              []*ulimit.Ulimit // List of ulimits to be set in the container
-}
-
-// HostConfig the non-portable Config structure of a container.
-// Here, "non-portable" means "dependent of the host we are running on".
-// Portable information *should* appear in Config.
-type HostConfig struct {
-	// Applicable to all platforms
-	Binds           []string      // List of volume bindings for this container
-	ContainerIDFile string        // File (path) where the containerId is written
-	LogConfig       LogConfig     // Configuration of the logs for this container
-	NetworkMode     NetworkMode   // Network mode to use for the container
-	PortBindings    nat.PortMap   // Port mapping between the exposed port (container) and the host
-	RestartPolicy   RestartPolicy // Restart policy to be used for the container
-	VolumeDriver    string        // Name of the volume driver used to mount volumes
-	VolumesFrom     []string      // List of volumes to take from other container
-
-	// Applicable to UNIX platforms
-	CapAdd          *strslice.StrSlice // List of kernel capabilities to add to the container
-	CapDrop         *strslice.StrSlice // List of kernel capabilities to remove from the container
-	DNS             []string           `json:"Dns"`        // List of DNS server to lookup
-	DNSOptions      []string           `json:"DnsOptions"` // List of DNSOption to look for
-	DNSSearch       []string           `json:"DnsSearch"`  // List of DNSSearch to look for
-	ExtraHosts      []string           // List of extra hosts
-	GroupAdd        []string           // List of additional groups that the container process will run as
-	IpcMode         IpcMode            // IPC namespace to use for the container
-	Links           []string           // List of links (in the name:alias form)
-	OomScoreAdj     int                // Container preference for OOM-killing
-	PidMode         PidMode            // PID namespace to use for the container
-	Privileged      bool               // Is the container in privileged mode
-	PublishAllPorts bool               // Should docker publish all exposed port for the container
-	ReadonlyRootfs  bool               // Is the container root filesystem in read-only
-	SecurityOpt     []string           // List of string values to customize labels for MLS systems, such as SELinux.
-	Tmpfs           map[string]string  `json:",omitempty"` // List of tmpfs (mounts) used for the container
-	UTSMode         UTSMode            // UTS namespace to use for the container
-	ShmSize         *int64             // Total shm memory usage
-
-	// Applicable to Windows
-	ConsoleSize [2]int         // Initial console size
-	Isolation   IsolationLevel // Isolation level of the container (eg default, hyperv)
-
-	// Contains container's resources (cgroups, ulimits)
-	Resources
-}
-
 // DecodeHostConfig creates a HostConfig based on the specified Reader.
 // DecodeHostConfig creates a HostConfig based on the specified Reader.
 // It assumes the content of the reader will be JSON, and decodes it.
 // It assumes the content of the reader will be JSON, and decodes it.
-func DecodeHostConfig(src io.Reader) (*HostConfig, error) {
+func DecodeHostConfig(src io.Reader) (*container.HostConfig, error) {
 	decoder := json.NewDecoder(src)
 	decoder := json.NewDecoder(src)
 
 
 	var w ContainerConfigWrapper
 	var w ContainerConfigWrapper
@@ -252,10 +25,10 @@ func DecodeHostConfig(src io.Reader) (*HostConfig, error) {
 // to default if it is not populated. This ensures backwards compatibility after
 // to default if it is not populated. This ensures backwards compatibility after
 // the validation of the network mode was moved from the docker CLI to the
 // the validation of the network mode was moved from the docker CLI to the
 // docker daemon.
 // docker daemon.
-func SetDefaultNetModeIfBlank(hc *HostConfig) *HostConfig {
+func SetDefaultNetModeIfBlank(hc *container.HostConfig) *container.HostConfig {
 	if hc != nil {
 	if hc != nil {
-		if hc.NetworkMode == NetworkMode("") {
-			hc.NetworkMode = NetworkMode("default")
+		if hc.NetworkMode == container.NetworkMode("") {
+			hc.NetworkMode = container.NetworkMode("default")
 		}
 		}
 	}
 	}
 	return hc
 	return hc

+ 14 - 34
runconfig/hostconfig_test.go

@@ -7,11 +7,13 @@ import (
 	"fmt"
 	"fmt"
 	"io/ioutil"
 	"io/ioutil"
 	"testing"
 	"testing"
+
+	"github.com/docker/docker/api/types/container"
 )
 )
 
 
 // TODO Windows: This will need addressing for a Windows daemon.
 // TODO Windows: This will need addressing for a Windows daemon.
 func TestNetworkModeTest(t *testing.T) {
 func TestNetworkModeTest(t *testing.T) {
-	networkModes := map[NetworkMode][]bool{
+	networkModes := map[container.NetworkMode][]bool{
 		// private, bridge, host, container, none, default
 		// private, bridge, host, container, none, default
 		"":                         {true, false, false, false, false, false},
 		"":                         {true, false, false, false, false, false},
 		"something:weird":          {true, false, false, false, false, false},
 		"something:weird":          {true, false, false, false, false, false},
@@ -22,7 +24,7 @@ func TestNetworkModeTest(t *testing.T) {
 		"none":           {true, false, false, false, true, false},
 		"none":           {true, false, false, false, true, false},
 		"default":        {true, false, false, false, false, true},
 		"default":        {true, false, false, false, false, true},
 	}
 	}
-	networkModeNames := map[NetworkMode]string{
+	networkModeNames := map[container.NetworkMode]string{
 		"":                         "",
 		"":                         "",
 		"something:weird":          "something:weird",
 		"something:weird":          "something:weird",
 		"bridge":                   "bridge",
 		"bridge":                   "bridge",
@@ -58,7 +60,7 @@ func TestNetworkModeTest(t *testing.T) {
 }
 }
 
 
 func TestIpcModeTest(t *testing.T) {
 func TestIpcModeTest(t *testing.T) {
-	ipcModes := map[IpcMode][]bool{
+	ipcModes := map[container.IpcMode][]bool{
 		// private, host, container, valid
 		// private, host, container, valid
 		"":                         {true, false, false, true},
 		"":                         {true, false, false, true},
 		"something:weird":          {true, false, false, false},
 		"something:weird":          {true, false, false, false},
@@ -82,7 +84,7 @@ func TestIpcModeTest(t *testing.T) {
 			t.Fatalf("IpcMode.Valid for %v should have been %v but was %v", ipcMode, state[3], ipcMode.Valid())
 			t.Fatalf("IpcMode.Valid for %v should have been %v but was %v", ipcMode, state[3], ipcMode.Valid())
 		}
 		}
 	}
 	}
-	containerIpcModes := map[IpcMode]string{
+	containerIpcModes := map[container.IpcMode]string{
 		"":                      "",
 		"":                      "",
 		"something":             "",
 		"something":             "",
 		"something:weird":       "weird",
 		"something:weird":       "weird",
@@ -99,7 +101,7 @@ func TestIpcModeTest(t *testing.T) {
 }
 }
 
 
 func TestUTSModeTest(t *testing.T) {
 func TestUTSModeTest(t *testing.T) {
-	utsModes := map[UTSMode][]bool{
+	utsModes := map[container.UTSMode][]bool{
 		// private, host, valid
 		// private, host, valid
 		"":                {true, false, true},
 		"":                {true, false, true},
 		"something:weird": {true, false, false},
 		"something:weird": {true, false, false},
@@ -120,7 +122,7 @@ func TestUTSModeTest(t *testing.T) {
 }
 }
 
 
 func TestPidModeTest(t *testing.T) {
 func TestPidModeTest(t *testing.T) {
-	pidModes := map[PidMode][]bool{
+	pidModes := map[container.PidMode][]bool{
 		// private, host, valid
 		// private, host, valid
 		"":                {true, false, true},
 		"":                {true, false, true},
 		"something:weird": {true, false, false},
 		"something:weird": {true, false, false},
@@ -141,13 +143,13 @@ func TestPidModeTest(t *testing.T) {
 }
 }
 
 
 func TestRestartPolicy(t *testing.T) {
 func TestRestartPolicy(t *testing.T) {
-	restartPolicies := map[RestartPolicy][]bool{
+	restartPolicies := map[container.RestartPolicy][]bool{
 		// none, always, failure
 		// none, always, failure
-		RestartPolicy{}:                {false, false, false},
-		RestartPolicy{"something", 0}:  {false, false, false},
-		RestartPolicy{"no", 0}:         {true, false, false},
-		RestartPolicy{"always", 0}:     {false, true, false},
-		RestartPolicy{"on-failure", 0}: {false, false, true},
+		container.RestartPolicy{}:                {false, false, false},
+		container.RestartPolicy{"something", 0}:  {false, false, false},
+		container.RestartPolicy{"no", 0}:         {true, false, false},
+		container.RestartPolicy{"always", 0}:     {false, true, false},
+		container.RestartPolicy{"on-failure", 0}: {false, false, true},
 	}
 	}
 	for restartPolicy, state := range restartPolicies {
 	for restartPolicy, state := range restartPolicies {
 		if restartPolicy.IsNone() != state[0] {
 		if restartPolicy.IsNone() != state[0] {
@@ -161,28 +163,6 @@ func TestRestartPolicy(t *testing.T) {
 		}
 		}
 	}
 	}
 }
 }
-
-func TestMergeConfigs(t *testing.T) {
-	expectedHostname := "hostname"
-	expectedContainerIDFile := "containerIdFile"
-	config := &Config{
-		Hostname: expectedHostname,
-	}
-	hostConfig := &HostConfig{
-		ContainerIDFile: expectedContainerIDFile,
-	}
-	containerConfigWrapper := MergeConfigs(config, hostConfig)
-	if containerConfigWrapper.Config.Hostname != expectedHostname {
-		t.Fatalf("containerConfigWrapper config hostname expected %v got %v", expectedHostname, containerConfigWrapper.Config.Hostname)
-	}
-	if containerConfigWrapper.InnerHostConfig.ContainerIDFile != expectedContainerIDFile {
-		t.Fatalf("containerConfigWrapper hostconfig containerIdfile expected %v got %v", expectedContainerIDFile, containerConfigWrapper.InnerHostConfig.ContainerIDFile)
-	}
-	if containerConfigWrapper.Cpuset != "" {
-		t.Fatalf("Expected empty Cpuset, got %v", containerConfigWrapper.Cpuset)
-	}
-}
-
 func TestDecodeHostConfig(t *testing.T) {
 func TestDecodeHostConfig(t *testing.T) {
 	fixtures := []struct {
 	fixtures := []struct {
 		file string
 		file string

+ 7 - 91
runconfig/hostconfig_unix.go

@@ -6,109 +6,25 @@ import (
 	"fmt"
 	"fmt"
 	"runtime"
 	"runtime"
 	"strings"
 	"strings"
-)
-
-// IsValid indicates is an isolation level is valid
-func (i IsolationLevel) IsValid() bool {
-	return i.IsDefault()
-}
-
-// IsPrivate indicates whether container uses it's private network stack.
-func (n NetworkMode) IsPrivate() bool {
-	return !(n.IsHost() || n.IsContainer())
-}
 
 
-// IsDefault indicates whether container uses the default network stack.
-func (n NetworkMode) IsDefault() bool {
-	return n == "default"
-}
+	"github.com/docker/docker/api/types/container"
+)
 
 
 // DefaultDaemonNetworkMode returns the default network stack the daemon should
 // DefaultDaemonNetworkMode returns the default network stack the daemon should
 // use.
 // use.
-func DefaultDaemonNetworkMode() NetworkMode {
-	return NetworkMode("bridge")
-}
-
-// NetworkName returns the name of the network stack.
-func (n NetworkMode) NetworkName() string {
-	if n.IsBridge() {
-		return "bridge"
-	} else if n.IsHost() {
-		return "host"
-	} else if n.IsContainer() {
-		return "container"
-	} else if n.IsNone() {
-		return "none"
-	} else if n.IsDefault() {
-		return "default"
-	} else if n.IsUserDefined() {
-		return n.UserDefined()
-	}
-	return ""
-}
-
-// IsBridge indicates whether container uses the bridge network stack
-func (n NetworkMode) IsBridge() bool {
-	return n == "bridge"
-}
-
-// IsHost indicates whether container uses the host network stack.
-func (n NetworkMode) IsHost() bool {
-	return n == "host"
-}
-
-// IsContainer indicates whether container uses a container network stack.
-func (n NetworkMode) IsContainer() bool {
-	parts := strings.SplitN(string(n), ":", 2)
-	return len(parts) > 1 && parts[0] == "container"
-}
-
-// IsNone indicates whether container isn't using a network stack.
-func (n NetworkMode) IsNone() bool {
-	return n == "none"
-}
-
-// ConnectedContainer is the id of the container which network this container is connected to.
-func (n NetworkMode) ConnectedContainer() string {
-	parts := strings.SplitN(string(n), ":", 2)
-	if len(parts) > 1 {
-		return parts[1]
-	}
-	return ""
-}
-
-// IsUserDefined indicates user-created network
-func (n NetworkMode) IsUserDefined() bool {
-	return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer()
+func DefaultDaemonNetworkMode() container.NetworkMode {
+	return container.NetworkMode("bridge")
 }
 }
 
 
 // IsPreDefinedNetwork indicates if a network is predefined by the daemon
 // IsPreDefinedNetwork indicates if a network is predefined by the daemon
 func IsPreDefinedNetwork(network string) bool {
 func IsPreDefinedNetwork(network string) bool {
-	n := NetworkMode(network)
+	n := container.NetworkMode(network)
 	return n.IsBridge() || n.IsHost() || n.IsNone()
 	return n.IsBridge() || n.IsHost() || n.IsNone()
 }
 }
 
 
-//UserDefined indicates user-created network
-func (n NetworkMode) UserDefined() string {
-	if n.IsUserDefined() {
-		return string(n)
-	}
-	return ""
-}
-
-// MergeConfigs merges the specified container Config and HostConfig.
-// It creates a ContainerConfigWrapper.
-func MergeConfigs(config *Config, hostConfig *HostConfig) *ContainerConfigWrapper {
-	return &ContainerConfigWrapper{
-		config,
-		hostConfig,
-		"", nil,
-	}
-}
-
 // ValidateNetMode ensures that the various combinations of requested
 // ValidateNetMode ensures that the various combinations of requested
 // network settings are valid.
 // network settings are valid.
-func ValidateNetMode(c *Config, hc *HostConfig) error {
+func ValidateNetMode(c *container.Config, hc *container.HostConfig) error {
 	// We may not be passed a host config, such as in the case of docker commit
 	// We may not be passed a host config, such as in the case of docker commit
 	if hc == nil {
 	if hc == nil {
 		return nil
 		return nil
@@ -161,7 +77,7 @@ func ValidateNetMode(c *Config, hc *HostConfig) error {
 // ValidateIsolationLevel performs platform specific validation of the
 // ValidateIsolationLevel performs platform specific validation of the
 // isolation level in the hostconfig structure. Linux only supports "default"
 // isolation level in the hostconfig structure. Linux only supports "default"
 // which is LXC container isolation
 // which is LXC container isolation
-func ValidateIsolationLevel(hc *HostConfig) error {
+func ValidateIsolationLevel(hc *container.HostConfig) error {
 	// We may not be passed a host config, such as in the case of docker commit
 	// We may not be passed a host config, such as in the case of docker commit
 	if hc == nil {
 	if hc == nil {
 		return nil
 		return nil

+ 6 - 41
runconfig/hostconfig_windows.go

@@ -3,49 +3,14 @@ package runconfig
 import (
 import (
 	"fmt"
 	"fmt"
 	"strings"
 	"strings"
-)
-
-// IsDefault indicates whether container uses the default network stack.
-func (n NetworkMode) IsDefault() bool {
-	return n == "default"
-}
-
-// IsHyperV indicates the use of a Hyper-V partition for isolation
-func (i IsolationLevel) IsHyperV() bool {
-	return strings.ToLower(string(i)) == "hyperv"
-}
-
-// IsProcess indicates the use of process isolation
-func (i IsolationLevel) IsProcess() bool {
-	return strings.ToLower(string(i)) == "process"
-}
 
 
-// IsValid indicates is an isolation level is valid
-func (i IsolationLevel) IsValid() bool {
-	return i.IsDefault() || i.IsHyperV() || i.IsProcess()
-}
+	"github.com/docker/docker/api/types/container"
+)
 
 
 // DefaultDaemonNetworkMode returns the default network stack the daemon should
 // DefaultDaemonNetworkMode returns the default network stack the daemon should
 // use.
 // use.
-func DefaultDaemonNetworkMode() NetworkMode {
-	return NetworkMode("default")
-}
-
-// NetworkName returns the name of the network stack.
-func (n NetworkMode) NetworkName() string {
-	if n.IsDefault() {
-		return "default"
-	}
-	return ""
-}
-
-// MergeConfigs merges the specified container Config and HostConfig.
-// It creates a ContainerConfigWrapper.
-func MergeConfigs(config *Config, hostConfig *HostConfig) *ContainerConfigWrapper {
-	return &ContainerConfigWrapper{
-		config,
-		hostConfig,
-	}
+func DefaultDaemonNetworkMode() container.NetworkMode {
+	return container.NetworkMode("default")
 }
 }
 
 
 // IsPreDefinedNetwork indicates if a network is predefined by the daemon
 // IsPreDefinedNetwork indicates if a network is predefined by the daemon
@@ -55,7 +20,7 @@ func IsPreDefinedNetwork(network string) bool {
 
 
 // ValidateNetMode ensures that the various combinations of requested
 // ValidateNetMode ensures that the various combinations of requested
 // network settings are valid.
 // network settings are valid.
-func ValidateNetMode(c *Config, hc *HostConfig) error {
+func ValidateNetMode(c *container.Config, hc *container.HostConfig) error {
 	// We may not be passed a host config, such as in the case of docker commit
 	// We may not be passed a host config, such as in the case of docker commit
 	if hc == nil {
 	if hc == nil {
 		return nil
 		return nil
@@ -72,7 +37,7 @@ func ValidateNetMode(c *Config, hc *HostConfig) error {
 // ValidateIsolationLevel performs platform specific validation of the
 // ValidateIsolationLevel performs platform specific validation of the
 // isolation level in the hostconfig structure. Windows supports 'default' (or
 // isolation level in the hostconfig structure. Windows supports 'default' (or
 // blank), 'process', or 'hyperv'.
 // blank), 'process', or 'hyperv'.
-func ValidateIsolationLevel(hc *HostConfig) error {
+func ValidateIsolationLevel(hc *container.HostConfig) error {
 	// We may not be passed a host config, such as in the case of docker commit
 	// We may not be passed a host config, such as in the case of docker commit
 	if hc == nil {
 	if hc == nil {
 		return nil
 		return nil

+ 2 - 1
runconfig/merge.go

@@ -3,6 +3,7 @@ package runconfig
 import (
 import (
 	"strings"
 	"strings"
 
 
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/go-connections/nat"
 	"github.com/docker/go-connections/nat"
 )
 )
 
 
@@ -11,7 +12,7 @@ import (
 // by the cli.
 // by the cli.
 // It will mutate the specified user configuration (userConf) with the image
 // It will mutate the specified user configuration (userConf) with the image
 // configuration where the user configuration is incomplete.
 // configuration where the user configuration is incomplete.
-func Merge(userConf, imageConf *Config) error {
+func Merge(userConf, imageConf *container.Config) error {
 	if userConf.User == "" {
 	if userConf.User == "" {
 		userConf.User = imageConf.User
 		userConf.User = imageConf.User
 	}
 	}

+ 4 - 3
runconfig/merge_test.go

@@ -3,6 +3,7 @@ package runconfig
 import (
 import (
 	"testing"
 	"testing"
 
 
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/go-connections/nat"
 	"github.com/docker/go-connections/nat"
 )
 )
 
 
@@ -13,7 +14,7 @@ func TestMerge(t *testing.T) {
 	portsImage := make(nat.PortSet)
 	portsImage := make(nat.PortSet)
 	portsImage[newPortNoError("tcp", "1111")] = struct{}{}
 	portsImage[newPortNoError("tcp", "1111")] = struct{}{}
 	portsImage[newPortNoError("tcp", "2222")] = struct{}{}
 	portsImage[newPortNoError("tcp", "2222")] = struct{}{}
-	configImage := &Config{
+	configImage := &container.Config{
 		ExposedPorts: portsImage,
 		ExposedPorts: portsImage,
 		Env:          []string{"VAR1=1", "VAR2=2"},
 		Env:          []string{"VAR1=1", "VAR2=2"},
 		Volumes:      volumesImage,
 		Volumes:      volumesImage,
@@ -24,7 +25,7 @@ func TestMerge(t *testing.T) {
 	portsUser[newPortNoError("tcp", "3333")] = struct{}{}
 	portsUser[newPortNoError("tcp", "3333")] = struct{}{}
 	volumesUser := make(map[string]struct{})
 	volumesUser := make(map[string]struct{})
 	volumesUser["/test3"] = struct{}{}
 	volumesUser["/test3"] = struct{}{}
-	configUser := &Config{
+	configUser := &container.Config{
 		ExposedPorts: portsUser,
 		ExposedPorts: portsUser,
 		Env:          []string{"VAR2=3", "VAR3=3"},
 		Env:          []string{"VAR2=3", "VAR3=3"},
 		Volumes:      volumesUser,
 		Volumes:      volumesUser,
@@ -64,7 +65,7 @@ func TestMerge(t *testing.T) {
 	if err != nil {
 	if err != nil {
 		t.Error(err)
 		t.Error(err)
 	}
 	}
-	configImage2 := &Config{
+	configImage2 := &container.Config{
 		ExposedPorts: ports,
 		ExposedPorts: ports,
 	}
 	}
 
 

+ 18 - 29
runconfig/parse.go

@@ -6,6 +6,7 @@ import (
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
 
 
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/strslice"
 	"github.com/docker/docker/api/types/strslice"
 	"github.com/docker/docker/opts"
 	"github.com/docker/docker/opts"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
@@ -47,7 +48,7 @@ var (
 // Parse parses the specified args for the specified command and generates a Config,
 // Parse parses the specified args for the specified command and generates a Config,
 // a HostConfig and returns them with the specified command.
 // a HostConfig and returns them with the specified command.
 // If the specified args are not valid, it will return an error.
 // If the specified args are not valid, it will return an error.
-func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSet, error) {
+func Parse(cmd *flag.FlagSet, args []string) (*container.Config, *container.HostConfig, *flag.FlagSet, error) {
 	var (
 	var (
 		// FIXME: use utils.ListOpts for attach and volumes?
 		// FIXME: use utils.ListOpts for attach and volumes?
 		flAttach            = opts.NewListOpts(opts.ValidateAttach)
 		flAttach            = opts.NewListOpts(opts.ValidateAttach)
@@ -300,7 +301,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
 	}
 	}
 
 
 	// parse device mappings
 	// parse device mappings
-	deviceMappings := []DeviceMapping{}
+	deviceMappings := []container.DeviceMapping{}
 	for _, device := range flDevices.GetAll() {
 	for _, device := range flDevices.GetAll() {
 		deviceMapping, err := ParseDevice(device)
 		deviceMapping, err := ParseDevice(device)
 		if err != nil {
 		if err != nil {
@@ -321,17 +322,17 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
 		return nil, nil, cmd, err
 		return nil, nil, cmd, err
 	}
 	}
 
 
-	ipcMode := IpcMode(*flIpcMode)
+	ipcMode := container.IpcMode(*flIpcMode)
 	if !ipcMode.Valid() {
 	if !ipcMode.Valid() {
 		return nil, nil, cmd, fmt.Errorf("--ipc: invalid IPC mode")
 		return nil, nil, cmd, fmt.Errorf("--ipc: invalid IPC mode")
 	}
 	}
 
 
-	pidMode := PidMode(*flPidMode)
+	pidMode := container.PidMode(*flPidMode)
 	if !pidMode.Valid() {
 	if !pidMode.Valid() {
 		return nil, nil, cmd, fmt.Errorf("--pid: invalid PID mode")
 		return nil, nil, cmd, fmt.Errorf("--pid: invalid PID mode")
 	}
 	}
 
 
-	utsMode := UTSMode(*flUTSMode)
+	utsMode := container.UTSMode(*flUTSMode)
 	if !utsMode.Valid() {
 	if !utsMode.Valid() {
 		return nil, nil, cmd, fmt.Errorf("--uts: invalid UTS mode")
 		return nil, nil, cmd, fmt.Errorf("--uts: invalid UTS mode")
 	}
 	}
@@ -346,7 +347,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
 		return nil, nil, cmd, err
 		return nil, nil, cmd, err
 	}
 	}
 
 
-	resources := Resources{
+	resources := container.Resources{
 		CgroupParent:         *flCgroupParent,
 		CgroupParent:         *flCgroupParent,
 		Memory:               flMemory,
 		Memory:               flMemory,
 		MemoryReservation:    MemoryReservation,
 		MemoryReservation:    MemoryReservation,
@@ -369,7 +370,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
 		Devices:              deviceMappings,
 		Devices:              deviceMappings,
 	}
 	}
 
 
-	config := &Config{
+	config := &container.Config{
 		Hostname:     hostname,
 		Hostname:     hostname,
 		Domainname:   domainname,
 		Domainname:   domainname,
 		ExposedPorts: ports,
 		ExposedPorts: ports,
@@ -394,7 +395,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
 		StopSignal:      *flStopSignal,
 		StopSignal:      *flStopSignal,
 	}
 	}
 
 
-	hostConfig := &HostConfig{
+	hostConfig := &container.HostConfig{
 		Binds:           binds,
 		Binds:           binds,
 		ContainerIDFile: *flContainerIDFile,
 		ContainerIDFile: *flContainerIDFile,
 		OomScoreAdj:     *flOomScoreAdj,
 		OomScoreAdj:     *flOomScoreAdj,
@@ -412,7 +413,7 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
 		DNSOptions:     flDNSOptions.GetAllOrEmpty(),
 		DNSOptions:     flDNSOptions.GetAllOrEmpty(),
 		ExtraHosts:     flExtraHosts.GetAll(),
 		ExtraHosts:     flExtraHosts.GetAll(),
 		VolumesFrom:    flVolumesFrom.GetAll(),
 		VolumesFrom:    flVolumesFrom.GetAll(),
-		NetworkMode:    NetworkMode(*flNetMode),
+		NetworkMode:    container.NetworkMode(*flNetMode),
 		IpcMode:        ipcMode,
 		IpcMode:        ipcMode,
 		PidMode:        pidMode,
 		PidMode:        pidMode,
 		UTSMode:        utsMode,
 		UTSMode:        utsMode,
@@ -422,9 +423,9 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
 		RestartPolicy:  restartPolicy,
 		RestartPolicy:  restartPolicy,
 		SecurityOpt:    flSecurityOpt.GetAll(),
 		SecurityOpt:    flSecurityOpt.GetAll(),
 		ReadonlyRootfs: *flReadonlyRootfs,
 		ReadonlyRootfs: *flReadonlyRootfs,
-		LogConfig:      LogConfig{Type: *flLoggingDriver, Config: loggingOpts},
+		LogConfig:      container.LogConfig{Type: *flLoggingDriver, Config: loggingOpts},
 		VolumeDriver:   *flVolumeDriver,
 		VolumeDriver:   *flVolumeDriver,
-		Isolation:      IsolationLevel(*flIsolation),
+		Isolation:      container.IsolationLevel(*flIsolation),
 		ShmSize:        parsedShm,
 		ShmSize:        parsedShm,
 		Resources:      resources,
 		Resources:      resources,
 		Tmpfs:          tmpfs,
 		Tmpfs:          tmpfs,
@@ -477,8 +478,8 @@ func parseLoggingOpts(loggingDriver string, loggingOpts []string) (map[string]st
 }
 }
 
 
 // ParseRestartPolicy returns the parsed policy or an error indicating what is incorrect
 // ParseRestartPolicy returns the parsed policy or an error indicating what is incorrect
-func ParseRestartPolicy(policy string) (RestartPolicy, error) {
-	p := RestartPolicy{}
+func ParseRestartPolicy(policy string) (container.RestartPolicy, error) {
+	p := container.RestartPolicy{}
 
 
 	if policy == "" {
 	if policy == "" {
 		return p, nil
 		return p, nil
@@ -516,20 +517,8 @@ func ParseRestartPolicy(policy string) (RestartPolicy, error) {
 	return p, nil
 	return p, nil
 }
 }
 
 
-func parseKeyValueOpts(opts opts.ListOpts) ([]KeyValuePair, error) {
-	out := make([]KeyValuePair, opts.Len())
-	for i, o := range opts.GetAll() {
-		k, v, err := parsers.ParseKeyValueOpt(o)
-		if err != nil {
-			return nil, err
-		}
-		out[i] = KeyValuePair{Key: k, Value: v}
-	}
-	return out, nil
-}
-
-// ParseDevice parses a device mapping string to a DeviceMapping struct
-func ParseDevice(device string) (DeviceMapping, error) {
+// ParseDevice parses a device mapping string to a container.DeviceMapping struct
+func ParseDevice(device string) (container.DeviceMapping, error) {
 	src := ""
 	src := ""
 	dst := ""
 	dst := ""
 	permissions := "rwm"
 	permissions := "rwm"
@@ -548,14 +537,14 @@ func ParseDevice(device string) (DeviceMapping, error) {
 	case 1:
 	case 1:
 		src = arr[0]
 		src = arr[0]
 	default:
 	default:
-		return DeviceMapping{}, fmt.Errorf("Invalid device specification: %s", device)
+		return container.DeviceMapping{}, fmt.Errorf("Invalid device specification: %s", device)
 	}
 	}
 
 
 	if dst == "" {
 	if dst == "" {
 		dst = src
 		dst = src
 	}
 	}
 
 
-	deviceMapping := DeviceMapping{
+	deviceMapping := container.DeviceMapping{
 		PathOnHost:        src,
 		PathOnHost:        src,
 		PathInContainer:   dst,
 		PathInContainer:   dst,
 		CgroupPermissions: permissions,
 		CgroupPermissions: permissions,

+ 11 - 10
runconfig/parse_test.go

@@ -10,23 +10,24 @@ import (
 	"strings"
 	"strings"
 	"testing"
 	"testing"
 
 
+	"github.com/docker/docker/api/types/container"
 	flag "github.com/docker/docker/pkg/mflag"
 	flag "github.com/docker/docker/pkg/mflag"
 	"github.com/docker/go-connections/nat"
 	"github.com/docker/go-connections/nat"
 )
 )
 
 
-func parseRun(args []string) (*Config, *HostConfig, *flag.FlagSet, error) {
+func parseRun(args []string) (*container.Config, *container.HostConfig, *flag.FlagSet, error) {
 	cmd := flag.NewFlagSet("run", flag.ContinueOnError)
 	cmd := flag.NewFlagSet("run", flag.ContinueOnError)
 	cmd.SetOutput(ioutil.Discard)
 	cmd.SetOutput(ioutil.Discard)
 	cmd.Usage = nil
 	cmd.Usage = nil
 	return Parse(cmd, args)
 	return Parse(cmd, args)
 }
 }
 
 
-func parse(t *testing.T, args string) (*Config, *HostConfig, error) {
+func parse(t *testing.T, args string) (*container.Config, *container.HostConfig, error) {
 	config, hostConfig, _, err := parseRun(strings.Split(args+" ubuntu bash", " "))
 	config, hostConfig, _, err := parseRun(strings.Split(args+" ubuntu bash", " "))
 	return config, hostConfig, err
 	return config, hostConfig, err
 }
 }
 
 
-func mustParse(t *testing.T, args string) (*Config, *HostConfig) {
+func mustParse(t *testing.T, args string) (*container.Config, *container.HostConfig) {
 	config, hostConfig, err := parse(t, args)
 	config, hostConfig, err := parse(t, args)
 	if err != nil {
 	if err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
@@ -280,18 +281,18 @@ func TestDecodeContainerConfigVolumes(t *testing.T) {
 // passed into it. It returns a config and a hostconfig which can be
 // passed into it. It returns a config and a hostconfig which can be
 // validated to ensure DecodeContainerConfig has manipulated the structures
 // validated to ensure DecodeContainerConfig has manipulated the structures
 // correctly.
 // correctly.
-func callDecodeContainerConfig(volumes []string, binds []string) (*Config, *HostConfig, error) {
+func callDecodeContainerConfig(volumes []string, binds []string) (*container.Config, *container.HostConfig, error) {
 	var (
 	var (
 		b   []byte
 		b   []byte
 		err error
 		err error
-		c   *Config
-		h   *HostConfig
+		c   *container.Config
+		h   *container.HostConfig
 	)
 	)
 	w := ContainerConfigWrapper{
 	w := ContainerConfigWrapper{
-		Config: &Config{
+		Config: &container.Config{
 			Volumes: map[string]struct{}{},
 			Volumes: map[string]struct{}{},
 		},
 		},
-		HostConfig: &HostConfig{
+		HostConfig: &container.HostConfig{
 			NetworkMode: "none",
 			NetworkMode: "none",
 			Binds:       binds,
 			Binds:       binds,
 		},
 		},
@@ -450,7 +451,7 @@ func TestParseWithExpose(t *testing.T) {
 }
 }
 
 
 func TestParseDevice(t *testing.T) {
 func TestParseDevice(t *testing.T) {
-	valids := map[string]DeviceMapping{
+	valids := map[string]container.DeviceMapping{
 		"/dev/snd": {
 		"/dev/snd": {
 			PathOnHost:        "/dev/snd",
 			PathOnHost:        "/dev/snd",
 			PathInContainer:   "/dev/snd",
 			PathInContainer:   "/dev/snd",
@@ -546,7 +547,7 @@ func TestParseRestartPolicy(t *testing.T) {
 		"on-failure:invalid": `strconv.ParseInt: parsing "invalid": invalid syntax`,
 		"on-failure:invalid": `strconv.ParseInt: parsing "invalid": invalid syntax`,
 		"on-failure:2:5":     "restart count format is not valid, usage: 'on-failure:N' or 'on-failure'",
 		"on-failure:2:5":     "restart count format is not valid, usage: 'on-failure:N' or 'on-failure'",
 	}
 	}
-	valids := map[string]RestartPolicy{
+	valids := map[string]container.RestartPolicy{
 		"": {},
 		"": {},
 		"always": {
 		"always": {
 			Name:              "always",
 			Name:              "always",