mirror of
https://github.com/kevingruesser/bootstrap-vz.git
synced 2025-08-24 15:36:27 +00:00
Introduced a global manifest_vars dictionary
All manifest entries can now be accessed from the manifest itself
This commit is contained in:
parent
1c93094833
commit
8d32339fda
13 changed files with 80 additions and 71 deletions
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Add table
Reference in a new issue