2015-12-14 10:39:53 -05:00
|
|
|
// +build linux
|
|
|
|
|
|
|
|
package volume
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
|
|
|
func TestParseMountRawPropagation(t *testing.T) {
|
2015-12-14 10:39:53 -05:00
|
|
|
var (
|
|
|
|
valid []string
|
|
|
|
invalid map[string]string
|
|
|
|
)
|
|
|
|
|
|
|
|
valid = []string{
|
|
|
|
"/hostPath:/containerPath:shared",
|
|
|
|
"/hostPath:/containerPath:rshared",
|
|
|
|
"/hostPath:/containerPath:slave",
|
|
|
|
"/hostPath:/containerPath:rslave",
|
|
|
|
"/hostPath:/containerPath:private",
|
|
|
|
"/hostPath:/containerPath:rprivate",
|
|
|
|
"/hostPath:/containerPath:ro,shared",
|
|
|
|
"/hostPath:/containerPath:ro,slave",
|
|
|
|
"/hostPath:/containerPath:ro,private",
|
|
|
|
"/hostPath:/containerPath:ro,z,shared",
|
|
|
|
"/hostPath:/containerPath:ro,Z,slave",
|
|
|
|
"/hostPath:/containerPath:Z,ro,slave",
|
|
|
|
"/hostPath:/containerPath:slave,Z,ro",
|
|
|
|
"/hostPath:/containerPath:Z,slave,ro",
|
|
|
|
"/hostPath:/containerPath:slave,ro,Z",
|
|
|
|
"/hostPath:/containerPath:rslave,ro,Z",
|
|
|
|
"/hostPath:/containerPath:ro,rshared,Z",
|
|
|
|
"/hostPath:/containerPath:ro,Z,rprivate",
|
|
|
|
}
|
|
|
|
invalid = map[string]string{
|
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
|
|
|
"/path:/path:ro,rshared,rslave": `invalid mode`,
|
|
|
|
"/path:/path:ro,z,rshared,rslave": `invalid mode`,
|
|
|
|
"/path:shared": "invalid volume specification",
|
|
|
|
"/path:slave": "invalid volume specification",
|
|
|
|
"/path:private": "invalid volume specification",
|
|
|
|
"name:/absolute-path:shared": "invalid volume specification",
|
|
|
|
"name:/absolute-path:rshared": "invalid volume specification",
|
|
|
|
"name:/absolute-path:slave": "invalid volume specification",
|
|
|
|
"name:/absolute-path:rslave": "invalid volume specification",
|
|
|
|
"name:/absolute-path:private": "invalid volume specification",
|
|
|
|
"name:/absolute-path:rprivate": "invalid volume specification",
|
2015-12-14 10:39:53 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, path := range valid {
|
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
|
|
|
if _, err := ParseMountRaw(path, "local"); err != nil {
|
|
|
|
t.Fatalf("ParseMountRaw(`%q`) should succeed: error %q", path, err)
|
2015-12-14 10:39:53 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for path, expectedError := range invalid {
|
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
|
|
|
if _, err := ParseMountRaw(path, "local"); err == nil {
|
|
|
|
t.Fatalf("ParseMountRaw(`%q`) should have failed validation. Err %v", path, err)
|
2015-12-14 10:39:53 -05:00
|
|
|
} else {
|
|
|
|
if !strings.Contains(err.Error(), expectedError) {
|
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
|
|
|
t.Fatalf("ParseMountRaw(`%q`) error should contain %q, got %v", path, expectedError, err.Error())
|
2015-12-14 10:39:53 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|