ImageRegistration task implemented

This commit is contained in:
Anders Ingemann 2013-07-07 20:28:24 +02:00
parent 58e560a893
commit 5dd8c27c6a
4 changed files with 86 additions and 7 deletions

View file

@ -11,7 +11,7 @@
"tarball": true "tarball": true
}, },
"image": { "image": {
"name" : "debian-{release}-{architecture}-{virtualization}-{year}{month}{day}", "name" : "debian-{release}-{architecture}-{virtualization}-{%y}{%M}{%d}",
"description": "Debian {release} {architecture} AMI ({virtualization})" "description": "Debian {release} {architecture} AMI ({virtualization})"
}, },
"system": { "system": {
@ -28,7 +28,7 @@
}, },
"plugins": { "plugins": {
"admin_user": { "admin_user": {
"enabled": true "enabled": false
}, },
"build_metadata": { "build_metadata": {
"enabled": false, "enabled": false,

View file

@ -3,6 +3,7 @@ import logging
from tasks import packages from tasks import packages
from tasks import connection from tasks import connection
from tasks import host from tasks import host
from tasks import ami
from tasks import ebs from tasks import ebs
from tasks import filesystem from tasks import filesystem
from tasks import bootstrap from tasks import bootstrap
@ -26,6 +27,7 @@ def tasks(tasklist, manifest):
host.CheckPackages(), host.CheckPackages(),
connection.GetCredentials(), connection.GetCredentials(),
host.GetInfo(), host.GetInfo(),
ami.AMIName(),
connection.Connect()) connection.Connect())
if manifest.volume['backing'].lower() == 'ebs': if manifest.volume['backing'].lower() == 'ebs':
tasklist.add(ebs.CreateVolume(), tasklist.add(ebs.CreateVolume(),
@ -35,7 +37,8 @@ def tasks(tasklist, manifest):
tasklist.add(filesystem.AddXFSProgs()) tasklist.add(filesystem.AddXFSProgs())
if manifest.volume['filesystem'].lower() in ['ext2', 'ext3', 'ext4']: if manifest.volume['filesystem'].lower() in ['ext2', 'ext3', 'ext4']:
tasklist.add(filesystem.TuneVolumeFS()) tasklist.add(filesystem.TuneVolumeFS())
tasklist.add(filesystem.CreateMountDir(), filesystem.MountVolume()) tasklist.add(filesystem.CreateMountDir(),
filesystem.MountVolume())
if manifest.bootstrapper['tarball']: if manifest.bootstrapper['tarball']:
tasklist.add(bootstrap.MakeTarball()) tasklist.add(bootstrap.MakeTarball())
tasklist.add(bootstrap.Bootstrap(), tasklist.add(bootstrap.Bootstrap(),
@ -68,10 +71,9 @@ def tasks(tasklist, manifest):
filesystem.DeleteMountDir()) filesystem.DeleteMountDir())
if manifest.volume['backing'].lower() == 'ebs': if manifest.volume['backing'].lower() == 'ebs':
tasklist.add(ebs.DetachVolume(), tasklist.add(ebs.DetachVolume(),
ebs.CreateSnapshot()) ebs.CreateSnapshot(),
ebs.DeleteVolume())
from common.tasks import TriggerRollback tasklist.add(ami.RegisterAMI())
tasklist.add(TriggerRollback())
def rollback_tasks(tasklist, tasks_completed, manifest): def rollback_tasks(tasklist, tasks_completed, manifest):

View file

@ -12,3 +12,4 @@ class Manifest(base.Manifest):
super(Manifest, self).parse(data) super(Manifest, self).parse(data)
self.credentials = data['credentials'] self.credentials = data['credentials']
self.virtualization = data['virtualization'] self.virtualization = data['virtualization']
self.image = data['image']

View file

@ -0,0 +1,76 @@
from base import Task
from common import phases
from ebs import CreateSnapshot
from connection import Connect
from common.exceptions import TaskError
class AMIName(Task):
description = 'Determining the AMI name'
phase = phases.preparation
after = [Connect]
def run(self, info):
image_vars = {'release': info.manifest.system['release'],
'architecture': info.manifest.system['architecture'],
'virtualization': info.manifest.virtualization,
'backing': info.manifest.volume['backing']}
from datetime import datetime
now = datetime.now()
time_vars = ['%a', '%A', '%b', '%B', '%c', '%d', '%f', '%H',
'%I', '%j', '%m', '%M', '%p', '%S', '%U', '%w',
'%W', '%x', '%X', '%y', '%Y', '%z', '%Z']
for var in time_vars:
image_vars[var] = now.strftime(var)
ami_name = info.manifest.image['name'].format(**image_vars)
ami_description = info.manifest.image['description'].format(**image_vars)
images = info.connection.get_all_images()
for image in images:
if ami_name == image.name:
msg = 'An image by the name {ami_name} already exists.'.format(ami_name=ami_name)
raise TaskError(msg)
info.ami_name = ami_name
info.ami_description = ami_description
class RegisterAMI(Task):
description = 'Registering the image as an AMI'
phase = phases.image_registration
after = [CreateSnapshot]
def run(self, info):
arch = {'i386': 'i386',
'amd64': 'x86_64'}.get(info.manifest.system['architecture'])
kernel_mapping = {'us-east-1': {'amd64': 'aki-88aa75e1',
'i386': 'aki-b6aa75df'},
'us-west-1': {'amd64': 'aki-f77e26b2',
'i386': 'aki-f57e26b0'},
'us-west-2': {'amd64': 'aki-fc37bacc',
'i386': 'aki-fa37baca'},
'eu-west-1': {'amd64': 'aki-71665e05',
'i386': 'aki-75665e01'},
'ap-southeast-1': {'amd64': 'aki-fe1354ac',
'i386': 'aki-f81354aa'},
'ap-southeast-2': {'amd64': 'aki-31990e0b',
'i386': 'aki-33990e09'},
'ap-northeast-1': {'amd64': 'aki-44992845',
'i386': 'aki-42992843'},
'sa-east-1': {'amd64': 'aki-c48f51d9',
'i386': 'aki-ca8f51d7'},
'us-gov-west-1': {'amd64': 'aki-79a4c05a',
'i386': 'aki-7ba4c058'}}
kernel_id = kernel_mapping.get(info.host['region']).get(info.manifest.system['architecture'])
from boto.ec2.blockdevicemapping import BlockDeviceType
from boto.ec2.blockdevicemapping import BlockDeviceMapping
block_device = BlockDeviceType(snapshot_id=info.snapshot.id, delete_on_termination=True,
size=int(info.manifest.volume['size']/1024))
block_device_map = BlockDeviceMapping()
block_device_map['/dev/sda1'] = block_device
info.image = info.connection.register_image(name=info.ami_name, description=info.ami_description,
architecture=arch, kernel_id=kernel_id,
root_device_name='/dev/sda1',
block_device_map=block_device_map)