From c16cc483183290aa84071eae22d491573de469e7 Mon Sep 17 00:00:00 2001 From: Jesse Keating Date: Thu, 9 Jun 2016 13:08:31 -0700 Subject: [PATCH] Introduce upper constraints This is a global setting that will apply across every project, a constraint on the versions of things that can be installed via pip. This is a first pass, adding basic functionality, by allowing a single constraint URL to be provided. Future iterations of this feature may be tied to a "superrepo" that contains all the projects _and_ the constraints for those projects all in one place. Change-Id: Ib5c2dd441b9294b775e755e595486a671d8de57f --- giftwrap/builders/__init__.py | 25 +++++++++++++++++++++++++ giftwrap/builders/docker_builder.py | 10 ++++++++-- giftwrap/builders/package_builder.py | 10 ++++++++-- giftwrap/settings.py | 3 ++- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/giftwrap/builders/__init__.py b/giftwrap/builders/__init__.py index 5ebd7c2..fb91c4c 100644 --- a/giftwrap/builders/__init__.py +++ b/giftwrap/builders/__init__.py @@ -18,6 +18,8 @@ import logging import os import threading +import requests + from giftwrap.gerrit import GerritReview from stevedore.driver import DriverManager from stevedore.extension import ExtensionManager @@ -36,6 +38,7 @@ class Builder(object): self._temp_src_dir = None self._spec = spec self._thread_exit = [] + self._constraints_path = None @staticmethod def builder_names(ext_mgr=None): @@ -55,6 +58,25 @@ class Builder(object): "Error was: %s", e) return [] + def _get_upper_constraints(self): + try: + curl = self._spec.settings.upper_constraints + response = requests.get(curl) + + response.raise_for_status() + + constraints = response.text.encode('utf-8') + + cfile = os.path.join(self._temp_src_dir, 'constraints.txt') + + with open(cfile, 'w') as f: + f.write(constraints) + + return cfile + + except Exception as e: + raise Exception("Unable to construct constraints. Error: %s" % e) + def _build_project(self, project): try: self._prepare_project_build(project) @@ -81,6 +103,9 @@ class Builder(object): if self._spec.settings.include_config: self._copy_sample_config(src_clone_dir, project) + if self._spec.settings.upper_constraints: + self._constraints_path = self._get_upper_constraints() + self._install_project(project.install_path, src_clone_dir) if project.postinstall_dependencies: diff --git a/giftwrap/builders/docker_builder.py b/giftwrap/builders/docker_builder.py index db90711..2c6e4a0 100644 --- a/giftwrap/builders/docker_builder.py +++ b/giftwrap/builders/docker_builder.py @@ -84,8 +84,11 @@ class DockerBuilder(Builder): def _install_pip_dependencies(self, venv_path, dependencies): pip_path = self._get_venv_pip_path(venv_path) + install = "install" + if self._constraints_path: + install = "%s -c %s" % (install, self._constraints_path) for dependency in dependencies: - self._execute("%s install %s" % (pip_path, dependency)) + self._execute("%s %s %s" % (pip_path, install, dependency)) def _copy_sample_config(self, src_clone_dir, project): src_config = os.path.join(src_clone_dir, 'etc') @@ -96,7 +99,10 @@ class DockerBuilder(Builder): def _install_project(self, venv_path, src_clone_dir): pip_path = self._get_venv_pip_path(venv_path) - self._execute("%s install %s" % (pip_path, src_clone_dir)) + install = "install" + if self._constraints_path: + install = "%s -c %s" % (install, self._constraints_path) + self._execute("%s %s %s" % (pip_path, install, src_clone_dir)) def _finalize_project_build(self, project): self._commands.append("rm -rf %s" % self._temp_dir) diff --git a/giftwrap/builders/package_builder.py b/giftwrap/builders/package_builder.py index 12d2cf0..4bb357d 100644 --- a/giftwrap/builders/package_builder.py +++ b/giftwrap/builders/package_builder.py @@ -70,8 +70,11 @@ class PackageBuilder(Builder): def _install_pip_dependencies(self, venv_path, dependencies): pip_path = self._get_venv_pip_path(venv_path) + install = "install" + if self._constraints_path: + install = "%s -c %s" % (install, self._constraints_path) for dependency in dependencies: - self._execute("%s install %s" % (pip_path, dependency)) + self._execute("%s %s %s" % (pip_path, install, dependency)) def _copy_sample_config(self, src_clone_dir, project): src_config = os.path.join(src_clone_dir, 'etc') @@ -87,7 +90,10 @@ class PackageBuilder(Builder): def _install_project(self, venv_path, src_clone_dir): pip_path = self._get_venv_pip_path(venv_path) - self._execute("%s install %s" % (pip_path, src_clone_dir)) + install = "install" + if self._constraints_path: + install = "%s -c %s" % (install, self._constraints_path) + self._execute("%s %s %s" % (pip_path, install, src_clone_dir)) def _finalize_project_build(self, project): # build the package diff --git a/giftwrap/settings.py b/giftwrap/settings.py index d6962e1..c2691af 100644 --- a/giftwrap/settings.py +++ b/giftwrap/settings.py @@ -31,7 +31,7 @@ class Settings(object): package_name_format=None, version=None, base_path=None, install_path=None, gerrit_dependencies=True, force_overwrite=False, output_dir=None, include_config=True, - parallel_build=True): + parallel_build=True, upper_constraints=None): if not version: raise Exception("'version' is a required settings") self.build_type = build_type @@ -44,6 +44,7 @@ class Settings(object): self._output_dir = output_dir self.include_config = include_config self.parallel_build = parallel_build + self.upper_constraints = upper_constraints @property def package_name_format(self):