Merge pull request #2647 from shin-/preexisting_volume_detection_rb1

Support for external volumes
This commit is contained in:
Joffrey F 2016-01-13 17:02:36 -08:00
commit 153185eadb
7 changed files with 188 additions and 17 deletions

View file

@ -273,6 +273,13 @@ def load_volumes(config_files):
for config_file in config_files:
for name, volume_config in config_file.config.get('volumes', {}).items():
volumes.update({name: volume_config})
external = volume_config.get('external')
if external:
if isinstance(external, dict):
volume_config['external_name'] = external.get('name')
else:
volume_config['external_name'] = name
return volumes

View file

@ -32,17 +32,32 @@
"definitions": {
"volume": {
"id": "#/definitions/volume",
"type": "object",
"properties": {
"driver": {"type": "string"},
"driver_opts": {
"type": "object",
"patternProperties": {
"^.+$": {"type": ["string", "number"]}
},
"additionalProperties": false
}
}
"oneOf": [{
"type": "object",
"properties": {
"driver": {"type": "string"},
"driver_opts": {
"type": "object",
"patternProperties": {
"^.+$": {"type": ["string", "number"]}
},
"additionalProperties": false
}
},
"additionalProperties": false
}, {
"type": "object",
"properties": {
"external": {
"type": ["boolean", "object"],
"properties": {
"name": {"type": "string"}
},
"additionalProperties": false
}
},
"additionalProperties": false
}]
}
},
"additionalProperties": false

View file

@ -77,7 +77,9 @@ class Project(object):
project.volumes.append(
Volume(
client=client, project=name, name=vol_name,
driver=data.get('driver'), driver_opts=data.get('driver_opts')
driver=data.get('driver'),
driver_opts=data.get('driver_opts'),
external_name=data.get('external_name')
)
)
return project
@ -235,6 +237,21 @@ class Project(object):
def initialize_volumes(self):
try:
for volume in self.volumes:
if volume.external:
log.debug(
'Volume {0} declared as external. No new '
'volume will be created.'.format(volume.name)
)
if not volume.exists():
raise ConfigurationError(
'Volume {name} declared as external, but could'
' not be found. Please create the volume manually'
' using `{command}{name}` and try again.'.format(
name=volume.full_name,
command='docker volume create --name='
)
)
continue
volume.create()
except NotFound:
raise ConfigurationError(

View file

@ -1,14 +1,18 @@
from __future__ import absolute_import
from __future__ import unicode_literals
from docker.errors import NotFound
class Volume(object):
def __init__(self, client, project, name, driver=None, driver_opts=None):
def __init__(self, client, project, name, driver=None, driver_opts=None,
external_name=None):
self.client = client
self.project = project
self.name = name
self.driver = driver
self.driver_opts = driver_opts
self.external_name = external_name
def create(self):
return self.client.create_volume(
@ -21,6 +25,19 @@ class Volume(object):
def inspect(self):
return self.client.inspect_volume(self.full_name)
def exists(self):
try:
self.inspect()
except NotFound:
return False
return True
@property
def external(self):
return bool(self.external_name)
@property
def full_name(self):
if self.external_name:
return self.external_name
return '{0}_{1}'.format(self.project, self.name)