Introduced a global manifest_vars dictionary

All manifest entries can now be accessed from the manifest itself
This commit is contained in:
Anders Ingemann 2013-12-29 16:48:55 +01:00
parent 1c93094833
commit 8d32339fda
13 changed files with 80 additions and 71 deletions

View file

@ -14,10 +14,39 @@ class BootstrapInformation(object):
from fs import load_volume from fs import load_volume
self.volume = load_volume(self.manifest.volume) self.volume = load_volume(self.manifest.volume)
from pkg.source import SourceLists class DictClass(dict):
self.source_lists = SourceLists(self.manifest) def __getattr__(self, name):
from pkg.package import PackageList return self[name]
self.packages = PackageList(self.source_lists, self.manifest)
def __setattr__(self, name, value):
self[name] = value
def set_manifest_vars(obj, data):
for key, value in data.iteritems():
if isinstance(value, dict):
obj[key] = DictClass()
set_manifest_vars(obj[key], value)
continue
if not isinstance(value, list):
obj[key] = value
self.manifest_vars = {}
self.manifest_vars['apt_mirror'] = 'http://http.debian.net/debian'
set_manifest_vars(self.manifest_vars, self.manifest.data)
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 key in time_vars:
self.manifest_vars[key] = now.strftime(key)
from pkg.sourceslist import SourceLists
self.source_lists = SourceLists(self.manifest.packages, self.manifest_vars)
from pkg.packagelist import PackageList
self.packages = PackageList(self.manifest.packages, self.manifest_vars,
default_target=manifest.system['release'], source_lists=self.source_lists)
self.include_packages = set() self.include_packages = set()
self.exclude_packages = set() self.exclude_packages = set()

View file

@ -45,12 +45,14 @@ class Manifest(object):
raise ManifestError(e.message, self, e.path) raise ManifestError(e.message, self, e.path)
def parse(self, data): def parse(self, data):
self.data = data
self.provider = data['provider'] self.provider = data['provider']
self.bootstrapper = data['bootstrapper'] self.bootstrapper = data['bootstrapper']
if 'mirror' not in self.bootstrapper: if 'mirror' not in self.bootstrapper:
self.bootstrapper['mirror'] = 'http://http.debian.net/debian' self.bootstrapper['mirror'] = 'http://http.debian.net/debian'
self.volume = data['volume'] self.volume = data['volume']
self.system = data['system'] self.system = data['system']
self.packages = data['packages']
self.plugins = data['plugins'] if 'plugins' in data else {} self.plugins = data['plugins'] if 'plugins' in data else {}
def load_plugins(self, data): def load_plugins(self, data):

View file

@ -3,30 +3,31 @@ from exceptions import PackageError
class PackageList(object): class PackageList(object):
def __init__(self, sources_list, manifest): def __init__(self, data, manifest_vars, default_target, source_lists):
self.sources_list = sources_list self.manifest_vars = manifest_vars
self.default_target = manifest.system['release'] self.source_lists = source_lists
self.default_target = default_target
self.remote = {} self.remote = {}
self.local = set() self.local = set()
if 'remote' in manifest.packages: if 'remote' in data:
manifest_vars = {'release': manifest.system['release'], for package in data['remote']:
'architecture': manifest.system['architecture']}
for package in manifest.packages['remote']:
target = None target = None
if isinstance(package, dict): if isinstance(package, dict):
name = package['name'].format(**manifest_vars) name = package['name'].format(**self.manifest_vars)
if 'target' in package: if 'target' in package:
target = package['target'].format(**manifest_vars) target = package['target'].format(**self.manifest_vars)
else: else:
name = package.format(**manifest_vars) name = package.format(**self.manifest_vars)
self.add(name, target) self.add(name, target)
if 'local' in manifest.packages: if 'local' in data:
for package_path in manifest.packages['local']: for package_path in data['local']:
self.local.add(package_path) self.local.add(package_path)
def add(self, name, target=None): def add(self, name, target=None):
if target is None: if target is None:
target = self.default_target target = self.default_target
name = name.format(**self.manifest_vars)
target = target.format(**self.manifest_vars)
if name in self.remote: if name in self.remote:
if self.remote[name] != target: if self.remote[name] != target:
msg = ('The package {name} was already added to the package list, ' msg = ('The package {name} was already added to the package list, '
@ -34,7 +35,7 @@ class PackageList(object):
raise PackageError(msg) raise PackageError(msg)
return return
if not self.sources_list.target_exists(target): if not self.source_lists.target_exists(target):
msg = ('The target release {target} was not found in the sources list').format(target=target) msg = ('The target release {target} was not found in the sources list').format(target=target)
raise PackageError(msg) raise PackageError(msg)
self.remote[name] = target self.remote[name] = target

View file

@ -2,18 +2,17 @@
class SourceLists(object): class SourceLists(object):
def __init__(self, manifest): def __init__(self, data, manifest_vars):
self.sources = {} self.sources = {}
self.manifest_vars = {'release': manifest.system['release'], self.manifest_vars = manifest_vars
'architecture': manifest.system['architecture'], if 'sources' in data:
'apt_mirror': 'http://http.debian.net/debian'} for name, lines in data['sources'].iteritems():
if 'sources' in manifest.packages:
for name, lines in manifest.packages['sources'].iteritems():
for line in lines: for line in lines:
self.add_source(name, '{line}\n'.format(line=line.format(**self.manifest_vars))) self.add_source(name, '{line}\n'.format(line=line.format(**self.manifest_vars)))
def add_source(self, name, line): def add_source(self, name, line):
name = name.format(**self.manifest_vars) name = name.format(**self.manifest_vars)
line = line.format(**self.manifest_vars)
if name not in self.sources: if name not in self.sources:
self.sources[name] = [] self.sources[name] = []
self.sources[name].append(Source(line)) self.sources[name].append(Source(line))

View file

@ -19,17 +19,7 @@ class MoveImage(Task):
phase = phases.image_registration phase = phases.image_registration
def run(self, info): def run(self, info):
manifest_vars = {'release': info.manifest.system['release'], image_name = info.manifest.image['name'].format(**info.manifest_vars)
'architecture': info.manifest.system['architecture']}
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:
manifest_vars[var] = now.strftime(var)
image_name = info.manifest.image['name'].format(**manifest_vars)
filename = '{image_name}.{ext}'.format(image_name=image_name, ext=info.volume.extension) filename = '{image_name}.{ext}'.format(image_name=image_name, ext=info.volume.extension)
import os.path import os.path

View file

@ -10,8 +10,8 @@
"workspace": "/target" "workspace": "/target"
}, },
"image": { "image": {
"name": "debian-{release}-{architecture}-{virtualization}-{%Y}-{%m}-{%d}-ebs", "name": "debian-{system.release}-{system.architecture}-{virtualization}-{%Y}-{%m}-{%d}-ebs",
"description": "Debian {release} {architecture}" "description": "Debian {system.release} {system.architecture}"
}, },
"system": { "system": {
"release": "wheezy", "release": "wheezy",
@ -33,13 +33,13 @@
"packages": { "packages": {
"sources": { "sources": {
"backports": [ "backports": [
"deb {apt_mirror} {release}-backports main", "deb {apt_mirror} {system.release}-backports main",
"deb-src {apt_mirror} {release}-backports main" "deb-src {apt_mirror} {system.release}-backports main"
] ]
}, },
"remote": [ "remote": [
"sudo", "sudo",
{ "name": "cloud-init", "target": "{release}-backports" } { "name": "cloud-init", "target": "{system.release}-backports" }
] ]
}, },
"plugins": { "plugins": {

View file

@ -10,8 +10,8 @@
"workspace": "/target" "workspace": "/target"
}, },
"image": { "image": {
"name": "debian-{release}-{architecture}-{virtualization}-{%Y}-{%m}-{%d}-ebs", "name": "debian-{system.release}-{system.architecture}-{virtualization}-{%Y}-{%m}-{%d}-ebs",
"description": "Debian {release} {architecture}" "description": "Debian {system.release} {system.architecture}"
}, },
"system": { "system": {
"release": "wheezy", "release": "wheezy",
@ -33,13 +33,13 @@
"packages": { "packages": {
"sources": { "sources": {
"backports": [ "backports": [
"deb {apt_mirror} {release}-backports main", "deb {apt_mirror} {system.release}-backports main",
"deb-src {apt_mirror} {release}-backports main" "deb-src {apt_mirror} {system.release}-backports main"
] ]
}, },
"remote": [ "remote": [
"sudo", "sudo",
{ "name": "cloud-init", "target": "{release}-backports" } { "name": "cloud-init", "target": "{system.release}-backports" }
] ]
}, },
"plugins": { "plugins": {

View file

@ -10,8 +10,8 @@
"workspace": "/target" "workspace": "/target"
}, },
"image": { "image": {
"name": "debian-{release}-{architecture}-{virtualization}-{%Y}-{%m}-{%d}-ebs", "name": "debian-{system.release}-{system.architecture}-{virtualization}-{%Y}-{%m}-{%d}-ebs",
"description": "Debian {release} {architecture}" "description": "Debian {system.release} {system.architecture}"
}, },
"system": { "system": {
"release": "wheezy", "release": "wheezy",
@ -33,13 +33,13 @@
"packages": { "packages": {
"sources": { "sources": {
"backports": [ "backports": [
"deb {apt_mirror} {release}-backports main", "deb {apt_mirror} {system.release}-backports main",
"deb-src {apt_mirror} {release}-backports main" "deb-src {apt_mirror} {system.release}-backports main"
] ]
}, },
"remote": [ "remote": [
"sudo", "sudo",
{ "name": "cloud-init", "target": "{release}-backports" } { "name": "cloud-init", "target": "{system.release}-backports" }
] ]
}, },
"plugins": { "plugins": {

View file

@ -10,8 +10,8 @@
"workspace": "/target" "workspace": "/target"
}, },
"image": { "image": {
"name": "debian-{release}-{architecture}-{virtualization}-{%y}{%m}{%d}", "name": "debian-{system.release}-{system.architecture}-{virtualization}-{%y}{%m}{%d}",
"description": "Debian {release} {architecture} AMI ({virtualization})" "description": "Debian {system.release} {system.architecture} AMI ({virtualization})"
}, },
"system": { "system": {
"release": "wheezy", "release": "wheezy",

View file

@ -10,8 +10,8 @@
"workspace": "/target" "workspace": "/target"
}, },
"image": { "image": {
"name": "debian-{release}-{architecture}-{virtualization}-{%y}{%m}{%d}", "name": "debian-{system.release}-{system.architecture}-{virtualization}-{%y}{%m}{%d}",
"description": "Debian {release} {architecture} AMI ({virtualization})" "description": "Debian {system.release} {system.architecture} AMI ({virtualization})"
}, },
"system": { "system": {
"release": "wheezy", "release": "wheezy",

View file

@ -13,8 +13,8 @@
"workspace": "/target" "workspace": "/target"
}, },
"image": { "image": {
"name": "debian-{release}-{architecture}-{virtualization}-{%y}{%m}{%d}", "name": "debian-{system.release}-{system.architecture}-{virtualization}-{%y}{%m}{%d}",
"description": "Debian {release} {architecture} AMI", "description": "Debian {system.release} {system.architecture} AMI",
"bucket": "debian-amis" "bucket": "debian-amis"
}, },
"system": { "system": {

View file

@ -5,8 +5,8 @@
// "guest_additions": "/root/images/VBoxGuestAdditions.iso" // "guest_additions": "/root/images/VBoxGuestAdditions.iso"
}, },
"image": { "image": {
"name": "debian-{release}-{architecture}-{%y}{%m}{%d}", "name": "debian-{system.release}-{system.architecture}-{%y}{%m}{%d}",
"description": "Debian {release} {architecture}" "description": "Debian {system.release} {system.architecture}"
}, },
"system": { "system": {
"release": "wheezy", "release": "wheezy",

View file

@ -16,20 +16,8 @@ class AMIName(Task):
predecessors = [Connect] predecessors = [Connect]
def run(self, info): def run(self, info):
image_vars = {'release': info.manifest.system['release'], ami_name = info.manifest.image['name'].format(**info.manifest_vars)
'architecture': info.manifest.system['architecture'], ami_description = info.manifest.image['description'].format(**info.manifest_vars)
'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() images = info.connection.get_all_images()
for image in images: for image in images: