Merge pull request #57 from blueboxgroup/builder-drivers

Add ability to extend builders via builder drivers
This commit is contained in:
Jesse Keating 2015-11-04 12:05:22 -08:00
commit 4793c14b39
6 changed files with 64 additions and 5 deletions

3
CHANGELOG.md Normal file
View File

@ -0,0 +1,3 @@
2.1.0
-----
- feature: add builder drivers using stevedore

View File

@ -19,9 +19,12 @@ import os
import threading import threading
from giftwrap.gerrit import GerritReview from giftwrap.gerrit import GerritReview
from stevedore.driver import DriverManager
from stevedore.extension import ExtensionManager
from abc import abstractmethod, ABCMeta from abc import abstractmethod, ABCMeta
BUILDER_DRIVER_NAMESPACE = 'giftwrap.builder.drivers'
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -34,6 +37,12 @@ class Builder(object):
self._spec = spec self._spec = spec
self._thread_exit = [] self._thread_exit = []
@staticmethod
def builder_names(ext_mgr=None):
if not ext_mgr:
ext_mgr = ExtensionManager(BUILDER_DRIVER_NAMESPACE)
return ext_mgr.names()
def _get_venv_pip_path(self, venv_path): def _get_venv_pip_path(self, venv_path):
return os.path.join(venv_path, 'bin/pip') return os.path.join(venv_path, 'bin/pip')
@ -182,5 +191,8 @@ class BuilderFactory:
@staticmethod @staticmethod
def create_builder(builder_type, build_spec): def create_builder(builder_type, build_spec):
targetclass = "%sBuilder" % builder_type.capitalize() driver_mgr = DriverManager(namespace=BUILDER_DRIVER_NAMESPACE,
return globals()[targetclass](build_spec) name=builder_type,
invoke_args=(build_spec,),
invoke_on_load=True)
return driver_mgr.driver

View File

@ -19,7 +19,7 @@ import logging
import signal import signal
import sys import sys
from giftwrap.builders import BuilderFactory from giftwrap.builders import Builder, BuilderFactory
from giftwrap.build_spec import BuildSpec from giftwrap.build_spec import BuildSpec
from giftwrap.color import ColorStreamHandler from giftwrap.color import ColorStreamHandler
@ -80,7 +80,7 @@ def main():
description='build giftwrap packages') description='build giftwrap packages')
build_subcmd.add_argument('-m', '--manifest', required=True) build_subcmd.add_argument('-m', '--manifest', required=True)
build_subcmd.add_argument('-v', '--version') build_subcmd.add_argument('-v', '--version')
build_subcmd.add_argument('-t', '--type', choices=('docker', 'package'), build_subcmd.add_argument('-t', '--type', choices=Builder.builder_names(),
required=True) required=True)
build_subcmd.add_argument('-s', '--synchronous', dest='parallel', build_subcmd.add_argument('-s', '--synchronous', dest='parallel',
action='store_false') action='store_false')

View File

@ -0,0 +1,39 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2015, Craig Tracey
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import copy
import unittest2 as unittest
from giftwrap.builders import Builder, BUILDER_DRIVER_NAMESPACE
from stevedore import extension
BASE_DRIVERS = set(['docker', 'package'])
class TestBuilder(unittest.TestCase):
def test_default_drivers(self):
drivers = set(Builder.builder_names())
self.assertEqual(drivers, BASE_DRIVERS)
def test_additional_drivers(self):
em = extension.ExtensionManager(BUILDER_DRIVER_NAMESPACE)
em.extensions.append(extension.Extension('test', None, None, None))
drivers = set(Builder.builder_names(em))
base_drivers = copy.copy(BASE_DRIVERS)
base_drivers.add('test')
self.assertEqual(drivers, base_drivers)

View File

@ -9,3 +9,4 @@ requests
pygerrit pygerrit
docker-py docker-py
virtualenv virtualenv
stevedore

View File

@ -1,6 +1,6 @@
[metadata] [metadata]
name = giftwrap name = giftwrap
version = 2.0.0 version = 2.1.0
summary = giftwrap - A tool to build full-stack native system packages. summary = giftwrap - A tool to build full-stack native system packages.
description-file = description-file =
README.md README.md
@ -23,6 +23,10 @@ setup-hooks =
console_scripts = console_scripts =
giftwrap = giftwrap.shell:main giftwrap = giftwrap.shell:main
giftwrap.builder.drivers =
package = giftwrap.builders.package_builder:PackageBuilder
docker = giftwrap.builders.docker_builder:DockerBuilder
[files] [files]
packages = packages =
giftwrap giftwrap