diff --git a/examples/manifest.yml b/examples/manifest.yml index 9386cf0..dcec485 100644 --- a/examples/manifest.yml +++ b/examples/manifest.yml @@ -11,3 +11,8 @@ settings: projects: - name: glance gitref: stable/mitaka + fpm_options: + # Additional FPM options: https://github.com/jordansissel/fpm/wiki#usage + - '--architecture all' + - '--provides some-package' + - '--replaces second-package' diff --git a/giftwrap/build_spec.py b/giftwrap/build_spec.py index 57a016c..543175a 100644 --- a/giftwrap/build_spec.py +++ b/giftwrap/build_spec.py @@ -28,6 +28,10 @@ class BuildSpec(object): self.version = version self.build_type = build_type manifest_settings = self._manifest['settings'] + if 'projects' in self._manifest: + self.fpm_options = \ + self._get_project_requirements(self._manifest['projects'], + 'fpm_options') if version: manifest_settings['version'] = version if build_type: @@ -38,6 +42,15 @@ class BuildSpec(object): self.settings = Settings.factory(manifest_settings) self.projects = self._render_projects(limit_projects) + @staticmethod + def _get_project_requirements(projects, cmd): + pkg_req = [] + for project in projects: + if cmd in project: + (pkg_req.append(project[cmd]) + if project[cmd] is not None else False) + return pkg_req + def _render_projects(self, limit_projects): projects = [] if 'projects' in self._manifest: diff --git a/giftwrap/builders/package_builder.py b/giftwrap/builders/package_builder.py index bdc8ac6..7fe1f3d 100644 --- a/giftwrap/builders/package_builder.py +++ b/giftwrap/builders/package_builder.py @@ -103,7 +103,8 @@ class PackageBuilder(Builder): pkg = Package(project.package_name, project.version, project.install_path, self._spec.settings.output_dir, self._spec.settings.force_overwrite, - project.system_dependencies) + project.system_dependencies, + self._spec.fpm_options) pkg.build() def _finalize_build(self): diff --git a/giftwrap/openstack_project.py b/giftwrap/openstack_project.py index 0d21ac9..7f2a799 100644 --- a/giftwrap/openstack_project.py +++ b/giftwrap/openstack_project.py @@ -39,7 +39,7 @@ class OpenstackProject(object): gitdepth=None, venv_command=None, install_command=None, install_path=None, package_name=None, stackforge=False, system_dependencies=[], pip_dependencies=[], - postinstall_dependencies=[]): + postinstall_dependencies=[], fpm_options=None): self._settings = settings self.name = name self._version = version @@ -55,6 +55,7 @@ class OpenstackProject(object): self.system_dependencies = system_dependencies self.pip_dependencies = pip_dependencies self.postinstall_dependencies = postinstall_dependencies + self.fpm_options = fpm_options @property def version(self): diff --git a/giftwrap/package.py b/giftwrap/package.py index e3b2367..80dfc64 100644 --- a/giftwrap/package.py +++ b/giftwrap/package.py @@ -29,13 +29,14 @@ SUPPORTED_DISTROS = { class Package(object): def __init__(self, name, version, install_path, output_dir, - overwrite=False, dependencies=None): + overwrite=False, dependencies=None, fpm_options=None): self.name = name self.version = version self.install_path = install_path self.output_dir = output_dir self.overwrite = overwrite self.dependencies = dependencies + self.fpm_options = fpm_options def _get_platform_target(self): current_distro = platform.linux_distribution()[0] @@ -46,6 +47,15 @@ class Package(object): raise Exception("Sorry, '%s' is an unsupported distribution" % current_distro) + def _add_commands(self, command_type): + # You can have defined multiple projects in yaml, iterate on projects + # and add to the command strings declared in yaml e.g.: copy_file + command = '' + for project in command_type: + for cmd in project: + command += '%s ' % cmd + return command + def build(self): target = self._get_platform_target() overwrite = '' @@ -60,6 +70,19 @@ class Package(object): os.makedirs(self.output_dir) # not wrapping in a try block - handled by caller - execute("fpm %s -s dir -t %s -n %s -v %s %s %s" % (overwrite, - target, self.name, self.version, deps, self.install_path), - self.output_dir) + execute_command = "fpm %s -s dir -t %s -n %s -v %s " % (overwrite, + target, + self.name, + self.version) + + if self.fpm_options: + # Adding fpm options e.g.: like architecture, description, etc. + # More actions have been described: + # https://github.com/jordansissel/fpm/wiki#usage + execute_command += self._add_commands(self.fpm_options) + execute(execute_command, self.output_dir) + else: + # Execute standard command + execute_command = "%s %s %s" % (execute_command, deps, + self.install_path) + execute(execute_command, self.output_dir) diff --git a/giftwrap/tests/test_buildspec.py b/giftwrap/tests/test_buildspec.py index d79eeaa..a4069f6 100644 --- a/giftwrap/tests/test_buildspec.py +++ b/giftwrap/tests/test_buildspec.py @@ -59,3 +59,26 @@ class TestBuildSpec(unittest.TestCase): self.assertEqual(2, len(bs.projects)) for project in bs.projects: self.assertEqual('99', project.version) + + def test_build_spec_projects_with_fpm_options(self): + fpm_options = ['--architecture all', '--replaces some-package', + '--provides funny-package', + '--depends very-funny-package'] + manifest = { + 'settings': {}, + 'projects': [ + { + 'name': 'project1', + 'fpm_options': fpm_options, + }, + ], + } + with tempfile.TemporaryFile(mode='w+') as tf: + version = '0' + yaml.safe_dump(manifest, tf) + tf.flush() + tf.seek(0) + bs = build_spec.BuildSpec(tf, version) + self.assertEqual(1, len(bs.projects)) + for project in bs.projects: + self.assertEqual(fpm_options, project.fpm_options)