|
@@ -12,6 +12,8 @@ import sys
|
|
|
|
|
|
import ruamel.yaml
|
|
|
|
|
|
+from compose.config.types import VolumeSpec
|
|
|
+
|
|
|
|
|
|
log = logging.getLogger('migrate')
|
|
|
|
|
@@ -82,10 +84,39 @@ def migrate(content):
|
|
|
|
|
|
data['version'] = 2
|
|
|
data['services'] = services
|
|
|
+ create_volumes_section(data)
|
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
+def create_volumes_section(data):
|
|
|
+ named_volumes = get_named_volumes(data['services'])
|
|
|
+ if named_volumes:
|
|
|
+ log.warn(
|
|
|
+ "Named volumes ({names}) must be explicitly declared. Creating a "
|
|
|
+ "'volumes' section with declarations.\n\n"
|
|
|
+ "For backwards-compatibility, they've been declared as external. "
|
|
|
+ "If you don't mind the volume names being prefixed with the "
|
|
|
+ "project name, you can remove the 'external' option from each one."
|
|
|
+ .format(names=', '.join(list(named_volumes))))
|
|
|
+
|
|
|
+ data['volumes'] = named_volumes
|
|
|
+
|
|
|
+
|
|
|
+def get_named_volumes(services):
|
|
|
+ volume_specs = [
|
|
|
+ VolumeSpec.parse(volume)
|
|
|
+ for service in services.values()
|
|
|
+ for volume in service.get('volumes', [])
|
|
|
+ ]
|
|
|
+ names = {
|
|
|
+ spec.external
|
|
|
+ for spec in volume_specs
|
|
|
+ if spec.is_named_volume
|
|
|
+ }
|
|
|
+ return {name: {'external': True} for name in names}
|
|
|
+
|
|
|
+
|
|
|
def write(stream, new_format, indent, width):
|
|
|
ruamel.yaml.dump(
|
|
|
new_format,
|