mirror of
https://github.com/kevingruesser/bootstrap-vz.git
synced 2025-08-24 15:36:27 +00:00

Up until now I didn't see the point of using spaces for indentation. However, the previous commit (a18bec3) was quite eye opening. Given that python is an indentation aware language, the amount of mistakes that went unnoticed because tabs and spaces were used at the same time (tabs for indentation and spaces for alignment) were unacceptable. E101,W191 have been re-enable in the tox flake8 checker and the documentation has been modified accordingly. The following files have been left as-is: * bootstrapvz/common/assets/extlinux/extlinux.conf * bootstrapvz/common/assets/init.d/expand-root * bootstrapvz/common/assets/init.d/generate-ssh-hostkeys * bootstrapvz/common/assets/init.d/squeeze/generate-ssh-hostkeys * bootstrapvz/plugins/docker_daemon/assets/init.d/docker * bootstrapvz/providers/ec2/assets/bin/growpart * bootstrapvz/providers/ec2/assets/grub.d/40_custom * bootstrapvz/providers/ec2/assets/init.d/ec2-get-credentials * bootstrapvz/providers/ec2/assets/init.d/ec2-run-user-data * docs/_static/taskoverview.coffee * docs/_static/taskoverview.less * tests/unit/subprocess.sh
71 lines
2.7 KiB
Python
71 lines
2.7 KiB
Python
from bootstrapvz.base import Task
|
|
from bootstrapvz.common import phases
|
|
from bootstrapvz.common.tools import log_check_call
|
|
|
|
|
|
class CreateDockerfileEntry(Task):
|
|
description = 'Creating the Dockerfile entry'
|
|
phase = phases.preparation
|
|
|
|
@classmethod
|
|
def run(cls, info):
|
|
info._docker['dockerfile'] = ''
|
|
|
|
|
|
class CreateImage(Task):
|
|
description = 'Creating docker image'
|
|
phase = phases.image_registration
|
|
|
|
@classmethod
|
|
def run(cls, info):
|
|
from pipes import quote
|
|
tar_cmd = ['tar', '--create', '--numeric-owner',
|
|
'--directory', info.volume.path, '.']
|
|
docker_cmd = ['docker', 'import', '--change', info._docker['dockerfile'], '-',
|
|
info.manifest.name.format(**info.manifest_vars)]
|
|
cmd = ' '.join(map(quote, tar_cmd)) + ' | ' + ' '.join(map(quote, docker_cmd))
|
|
[info._docker['image_id']] = log_check_call([cmd], shell=True)
|
|
|
|
|
|
class PopulateLabels(Task):
|
|
description = 'Populating docker labels'
|
|
phase = phases.image_registration
|
|
successors = [CreateImage]
|
|
|
|
@classmethod
|
|
def run(cls, info):
|
|
import pyrfc3339
|
|
from datetime import datetime
|
|
import pytz
|
|
labels = {}
|
|
labels['name'] = info.manifest.name.format(**info.manifest_vars)
|
|
# Inspired by https://github.com/projectatomic/ContainerApplicationGenericLabels
|
|
# See here for the discussion on the debian-cloud mailing list
|
|
# https://lists.debian.org/debian-cloud/2015/05/msg00071.html
|
|
labels['architecture'] = info.manifest.system['architecture']
|
|
labels['build-date'] = pyrfc3339.generate(datetime.utcnow().replace(tzinfo=pytz.utc))
|
|
if 'labels' in info.manifest.provider:
|
|
for label, value in info.manifest.provider['labels'].items():
|
|
labels[label] = value.format(**info.manifest_vars)
|
|
|
|
# pipes.quote converts newlines into \n rather than just prefixing
|
|
# it with a backslash, so we need to escape manually
|
|
def escape(value):
|
|
value = value.replace('"', '\\"')
|
|
value = value.replace('\n', '\\\n')
|
|
value = '"' + value + '"'
|
|
return value
|
|
kv_pairs = [label + '=' + escape(value) for label, value in labels.items()]
|
|
# Add some nice newlines and indentation
|
|
info._docker['dockerfile'] += 'LABEL ' + ' \\\n '.join(kv_pairs) + '\n'
|
|
|
|
|
|
class AppendManifestDockerfile(Task):
|
|
description = 'Appending Dockerfile instructions from the manifest'
|
|
phase = phases.image_registration
|
|
predecessors = [PopulateLabels]
|
|
successors = [CreateImage]
|
|
|
|
@classmethod
|
|
def run(cls, info):
|
|
info._docker['dockerfile'] += info.manifest.provider['dockerfile'] + '\n'
|