From ebd8f71fdbd4d33d4ad0b6da0cb986b21222781d Mon Sep 17 00:00:00 2001 From: Anders Ingemann Date: Thu, 9 Jan 2014 17:21:29 +0100 Subject: [PATCH] Fix bug in packages stanza (fixes #126) Created 3 new tasks: AddManifestSources AddRemoteManifestPackages AddLocalManifestPackages They are added independently depending on what is specified in the manifest. --- base/bootstrapinfo.py | 4 ++-- base/pkg/packagelist.py | 11 +-------- base/pkg/sourceslist.py | 6 +---- common/task_sets.py | 32 ++++++++++++++++++--------- common/tasks/apt.py | 38 ++++++++++++++++++++++++++++++++ providers/ec2/__init__.py | 2 +- providers/virtualbox/__init__.py | 2 +- 7 files changed, 65 insertions(+), 30 deletions(-) diff --git a/base/bootstrapinfo.py b/base/bootstrapinfo.py index 82695bd..e74cae4 100644 --- a/base/bootstrapinfo.py +++ b/base/bootstrapinfo.py @@ -45,9 +45,9 @@ class BootstrapInformation(object): self.manifest_vars[key] = now.strftime(key) from pkg.sourceslist import SourceLists - self.source_lists = SourceLists(self.manifest.packages, self.manifest_vars) + self.source_lists = SourceLists(self.manifest_vars) from pkg.packagelist import PackageList - self.packages = PackageList(self.manifest.packages, self.manifest_vars, self.source_lists) + self.packages = PackageList(self.manifest_vars, self.source_lists) self.include_packages = set() self.exclude_packages = set() diff --git a/base/pkg/packagelist.py b/base/pkg/packagelist.py index 9fb0917..1037374 100644 --- a/base/pkg/packagelist.py +++ b/base/pkg/packagelist.py @@ -3,20 +3,11 @@ from exceptions import PackageError class PackageList(object): - def __init__(self, data, manifest_vars, source_lists): + def __init__(self, manifest_vars, source_lists): self.manifest_vars = manifest_vars self.source_lists = source_lists self.remote = {} self.local = set() - if 'remote' in data: - for package in data['remote']: - if isinstance(package, dict): - self.add(package['name'], package.get('target', None)) - else: - self.add(package, None) - if 'local' in data: - for package_path in data['local']: - self.local.add(package_path) def add(self, name, target=None): if target is None: diff --git a/base/pkg/sourceslist.py b/base/pkg/sourceslist.py index e31a81a..7dc6486 100644 --- a/base/pkg/sourceslist.py +++ b/base/pkg/sourceslist.py @@ -2,13 +2,9 @@ class SourceLists(object): - def __init__(self, data, manifest_vars): + def __init__(self, manifest_vars): self.sources = {} self.manifest_vars = manifest_vars - if 'sources' in data: - for name, lines in data['sources'].iteritems(): - for line in lines: - self.add(name, line) def add(self, name, line): name = name.format(**self.manifest_vars) diff --git a/common/task_sets.py b/common/task_sets.py index e8ca038..dac378c 100644 --- a/common/task_sets.py +++ b/common/task_sets.py @@ -45,17 +45,27 @@ ssh_set = [security.DisableSSHPasswordAuthentication, cleanup.ShredHostkeys, ] -apt_set = [apt.AddDefaultSources, - apt.WriteSources, - apt.DisableDaemonAutostart, - apt.AptUpdate, - apt.AptUpgrade, - packages.InstallRemotePackages, - packages.InstallLocalPackages, - apt.PurgeUnusedPackages, - apt.AptClean, - apt.EnableDaemonAutostart, - ] + +def get_apt_set(manifest): + base = [apt.AddDefaultSources, + apt.WriteSources, + apt.DisableDaemonAutostart, + apt.AptUpdate, + apt.AptUpgrade, + packages.InstallRemotePackages, + packages.InstallLocalPackages, + apt.PurgeUnusedPackages, + apt.AptClean, + apt.EnableDaemonAutostart, + ] + if 'sources' in manifest.packages: + base.append(apt.AddManifestSources) + if 'remote' in manifest.packages: + base.append(apt.AddRemoteManifestPackages) + if 'local' in manifest.packages: + base.append(apt.AddLocalManifestPackages) + return base + locale_set = [locale.LocaleBootstrapPackage, locale.GenerateLocale, diff --git a/common/tasks/apt.py b/common/tasks/apt.py index d654f0d..97bef76 100644 --- a/common/tasks/apt.py +++ b/common/tasks/apt.py @@ -5,9 +5,22 @@ import locale import os +class AddManifestSources(Task): + description = 'Adding sources from the manifest' + phase = phases.preparation + + @classmethod + def run(cls, info): + if 'sources' in info.manifest.packages: + for name, lines in info.manifest.packages['sources'].iteritems(): + for line in lines: + info.source_lists.add(name, line) + + class AddDefaultSources(Task): description = 'Adding default release sources' phase = phases.preparation + predecessors = [AddManifestSources] @classmethod def run(cls, info): @@ -22,6 +35,31 @@ class AddDefaultSources(Task): info.source_lists.add('main', 'deb-src {apt_mirror} {system.release}-updates main') +class AddRemoteManifestPackages(Task): + description = 'Adding remote packages from the manifest' + phase = phases.preparation + predecessors = [AddDefaultSources] + + @classmethod + def run(cls, info): + for package in info.manifest.packages['remote']: + if isinstance(package, dict): + info.packages.add(package['name'], package.get('target', None)) + else: + info.packages.add(package, None) + + +class AddLocalManifestPackages(Task): + description = 'Adding local packages from the manifest' + phase = phases.preparation + predecessors = [AddDefaultSources] + + @classmethod + def run(cls, info): + for package_path in info.manifest.packages['local']: + info.packages.add_local(package_path) + + class WriteSources(Task): description = 'Writing aptitude sources to disk' phase = phases.package_installation diff --git a/providers/ec2/__init__.py b/providers/ec2/__init__.py index 6f6488e..63795f0 100644 --- a/providers/ec2/__init__.py +++ b/providers/ec2/__init__.py @@ -52,7 +52,7 @@ def resolve_tasks(taskset, manifest): import common.task_sets taskset.update(common.task_sets.base_set) taskset.update(common.task_sets.mounting_set) - taskset.update(common.task_sets.apt_set) + taskset.update(common.task_sets.get_apt_set(manifest)) taskset.update(common.task_sets.locale_set) taskset.update(common.task_sets.ssh_set) diff --git a/providers/virtualbox/__init__.py b/providers/virtualbox/__init__.py index e7f05ef..6a3f329 100644 --- a/providers/virtualbox/__init__.py +++ b/providers/virtualbox/__init__.py @@ -26,7 +26,7 @@ def resolve_tasks(tasklist, manifest): tasklist.update(common.task_sets.base_set) tasklist.update(common.task_sets.volume_set) tasklist.update(common.task_sets.mounting_set) - tasklist.update(common.task_sets.apt_set) + tasklist.update(common.task_sets.get_apt_set(manifest)) tasklist.update(common.task_sets.locale_set) tasklist.update(common.task_sets.bootloader_set.get(manifest.system['bootloader']))