Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rework package management to allow composition of dependencies #668

Open
1 of 3 tasks
smortex opened this issue Sep 15, 2023 · 0 comments
Open
1 of 3 tasks

Rework package management to allow composition of dependencies #668

smortex opened this issue Sep 15, 2023 · 0 comments

Comments

@smortex
Copy link
Member

smortex commented Sep 15, 2023

This issue has the purpose of tracking progress for improving the way the puppet-python module manage packages.

Issues we want to solve

In these example, we assume a control-repo with a profile::python class that wraps the puppet-python module with site-specific config:

class profile::python {
  class { 'python':
    ensure  => present,
    # ...
  }
}

System packages with dependencies on python-foo

The syslog-ng-mod-python package depend on python-venv. When this package is added to the catalog, puppet will install syslog-ng-mod-python, which will install python-venv as a dependency. On next run, python-venv is removed (because the python class default to ensure this package is absent) and syslog-ng-mod-python which depend on it is also removed.

To workaround this issue, we can skip management of the python-venv in the python module with:

class profile::python {
  class { 'python':
    # ...
    manage_venv_package => false, # python-venv is a dependency of syslog-ng-mod-python
  }
}

If another node need to have the venv package installed, we have a few solutions:

  1. Add a parameter to the profile::python and use Hiera to set it to a custom value on the nodes that must have different behavior;
  2. Duplicate and adjust the profile::python class (e.g. profile::python_with_venv) and include one or the other of these two conflicting profiles, leading to some duplication;
  3. Manage the python-venv package in the profile that need it, duplicating what the puppet-python module is supposed to manage.

None of these solutions is great.

Puppet modules needing a specific component

The puppet-puppetboard module rely on the puppet-python module. When installing from a venv, it include this code in the catalog:

    class { 'python':
      version => $python_version,
      dev     => 'present',
      venv    => 'present',
    }

This clash with the above profile::python. To cope with this, the module provide a manage_virtualenv parameter to skips this fragment and allow the user to handle this themself, with the same solutions and same drawbacks as seen in the previous example.

How puppetlabs-apache handle a similar issue

Apache has a lot of different modules, but each one is managed in a different class allowing to do some composition of the dependencies from another puppet module, e.g.:

class taiga::vhost {
  include apache
  include apache::mod::passenger

  # ...
}

For the end-user include taiga::vhost will do the right thing, and if they want to customize the apache::mod::passenger parameters, they can do this in their code:

class profile::taiga {
  class { 'apache::mod::passenger':
    # ... this would be in a passenger specific profile
  }

  class { 'taiga::vhost':
    # ...
  }
}

Roadmap

After this long context, I propose to rework the module package management to match what is done by puppetlabs-apache, make it easier to manage dependencies in consumer modules and avoid conflicts.

This is a three step process:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant