Merge pull request #2647 from shin-/preexisting_volume_detection_rb1
Support for external volumes
This commit is contained in:
commit
153185eadb
7 changed files with 188 additions and 17 deletions
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue