diff --git a/openstack-common.conf b/openstack-common.conf index 208920ea51..516f3e072c 100644 --- a/openstack-common.conf +++ b/openstack-common.conf @@ -28,5 +28,14 @@ module=timeutils module=uuidutils module=versionutils +# The list of scripts to copy from oslo common code +script = tools/colorizer.py +script = tools/config/README +script = tools/config/check_uptodate.sh +script = tools/config/generate_sample.sh +script = tools/install_venv.py +script = tools/install_venv_common.py +script = tools/with_venv.sh + # The base module to hold the copy of openstack.common base=manila diff --git a/tools/colorizer.py b/tools/colorizer.py index f242c4d510..a16c620ca6 100755 --- a/tools/colorizer.py +++ b/tools/colorizer.py @@ -1,4 +1,5 @@ #!/usr/bin/env python + # Copyright (c) 2013, Nebula, Inc. # Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. @@ -44,14 +45,15 @@ import heapq import sys import unittest +import six import subunit import testtools class _AnsiColorizer(object): - """ANSI colorizer that wraps a stream object. + """Colorizer allows callers to write text in a particular color. - colorizer is an object that loosely wraps around a stream, allowing + A colorizer is an object that loosely wraps around a stream, allowing callers to write text to the stream in a particular color. Colorizer classes must implement C{supported()} and C{write(text, color)}. @@ -63,12 +65,10 @@ class _AnsiColorizer(object): self.stream = stream def supported(cls, stream=sys.stdout): - """Check if platform is supported. + """Check is the current platform supports coloring terminal output. A class method that returns True if the current platform supports - coloring terminal output using this method. - - Returns False otherwise. + coloring terminal output using this method. Returns False otherwise. """ if not stream.isatty(): return False # auto color only on TTYs @@ -118,7 +118,7 @@ class _Win32Colorizer(object): 'yellow': red | green | bold, 'magenta': red | blue | bold, 'cyan': green | blue | bold, - 'white': red | green | blue | bold + 'white': red | green | blue | bold, } def supported(cls, stream=sys.stdout): @@ -169,9 +169,9 @@ def get_elapsed_time_color(elapsed_time): return 'green' -class ManilaTestResult(testtools.TestResult): +class OpenStackTestResult(testtools.TestResult): def __init__(self, stream, descriptions, verbosity): - super(ManilaTestResult, self).__init__() + super(OpenStackTestResult, self).__init__() self.stream = stream self.showAll = verbosity > 1 self.num_slow_tests = 10 @@ -225,26 +225,26 @@ class ManilaTestResult(testtools.TestResult): self.colorizer.write(short_result, color) def addSuccess(self, test): - super(ManilaTestResult, self).addSuccess(test) + super(OpenStackTestResult, self).addSuccess(test) self._addResult(test, 'OK', 'green', '.', True) def addFailure(self, test, err): if test.id() == 'process-returncode': return - super(ManilaTestResult, self).addFailure(test, err) + super(OpenStackTestResult, self).addFailure(test, err) self._addResult(test, 'FAIL', 'red', 'F', False) def addError(self, test, err): - super(ManilaTestResult, self).addFailure(test, err) + super(OpenStackTestResult, self).addFailure(test, err) self._addResult(test, 'ERROR', 'red', 'E', False) def addSkip(self, test, reason=None, details=None): - super(ManilaTestResult, self).addSkip(test, reason, details) + super(OpenStackTestResult, self).addSkip(test, reason, details) self._addResult(test, 'SKIP', 'blue', 'S', True) def startTest(self, test): self.start_time = self._now() - super(ManilaTestResult, self).startTest(test) + super(OpenStackTestResult, self).startTest(test) def writeTestCase(self, cls): if not self.results.get(cls): @@ -274,7 +274,7 @@ class ManilaTestResult(testtools.TestResult): self.stopTestRun() def stopTestRun(self): - for cls in list(self.results.iterkeys()): + for cls in list(six.iterkeys(self.results)): self.writeTestCase(cls) self.stream.writeln() self.writeSlowTests() @@ -323,7 +323,8 @@ test = subunit.ProtocolTestCase(sys.stdin, passthrough=None) if sys.version_info[0:2] <= (2, 6): runner = unittest.TextTestRunner(verbosity=2) else: - runner = unittest.TextTestRunner(verbosity=2, resultclass=ManilaTestResult) + runner = unittest.TextTestRunner(verbosity=2, + resultclass=OpenStackTestResult) if runner.run(test).wasSuccessful(): exit_code = 0 diff --git a/tools/install_venv.py b/tools/install_venv.py index 7b7765454a..e96521ea23 100644 --- a/tools/install_venv.py +++ b/tools/install_venv.py @@ -1,10 +1,8 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - # Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # -# Copyright 2010 OpenStack, LLC +# Copyright 2010 OpenStack Foundation # Copyright 2013 IBM Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -19,47 +17,47 @@ # License for the specific language governing permissions and limitations # under the License. -"""Installation script for Manila's development virtualenv.""" - -from __future__ import print_function - -import optparse import os -import subprocess import sys -import install_venv_common as install_venv +import install_venv_common as install_venv # noqa -def print_help(): +def print_help(venv, root): help = """ - Manila development environment setup is complete. + OpenStack development environment setup is complete. - Manila development uses virtualenv to track and manage Python dependencies - while in development and testing. + OpenStack development uses virtualenv to track and manage Python + dependencies while in development and testing. - To activate the Manila virtualenv for the extent of your current shell + To activate the OpenStack virtualenv for the extent of your current shell session you can run: - $ source .venv/bin/activate + $ source %s/bin/activate Or, if you prefer, you can run commands in the virtualenv on a case by case basis by running: - $ tools/with_venv.sh + $ %s/tools/with_venv.sh Also, make test will automatically use the virtualenv. """ - print(help) + print(help % (venv, root)) def main(argv): root = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + + if os.environ.get('tools_path'): + root = os.environ['tools_path'] venv = os.path.join(root, '.venv') + if os.environ.get('venv'): + venv = os.environ['venv'] + pip_requires = os.path.join(root, 'requirements.txt') test_requires = os.path.join(root, 'test-requirements.txt') - project = 'Manila' py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1]) + project = 'OpenStack' install = install_venv.InstallVenv(root, venv, pip_requires, test_requires, py_version, project) options = install.parse_args(argv) @@ -67,7 +65,7 @@ def main(argv): install.check_dependencies() install.create_virtualenv(no_site_packages=options.no_site_packages) install.install_dependencies() - print_help() + print_help(venv, root) if __name__ == '__main__': main(sys.argv) diff --git a/tools/install_venv_common.py b/tools/install_venv_common.py index 4b4160ccf8..e279159abb 100644 --- a/tools/install_venv_common.py +++ b/tools/install_venv_common.py @@ -1,5 +1,3 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - # Copyright 2013 OpenStack Foundation # Copyright 2013 IBM Corp. # @@ -18,12 +16,15 @@ """Provides methods needed by installation script for OpenStack development virtual environments. +Since this script is used to bootstrap a virtualenv from the system's Python +environment, it should be kept strictly compatible with Python 2.6. + Synced in from openstack-common """ from __future__ import print_function -import argparse +import optparse import os import subprocess import sys @@ -31,12 +32,13 @@ import sys class InstallVenv(object): - def __init__(self, root, venv, pip_requires, test_requires, py_version, + def __init__(self, root, venv, requirements, + test_requirements, py_version, project): self.root = root self.venv = venv - self.pip_requires = pip_requires - self.test_requires = test_requires + self.requirements = requirements + self.test_requirements = test_requirements self.py_version = py_version self.project = project @@ -72,11 +74,13 @@ class InstallVenv(object): def get_distro(self): if (os.path.exists('/etc/fedora-release') or os.path.exists('/etc/redhat-release')): - return Fedora(self.root, self.venv, self.pip_requires, - self.test_requires, self.py_version, self.project) + return Fedora( + self.root, self.venv, self.requirements, + self.test_requirements, self.py_version, self.project) else: - return Distro(self.root, self.venv, self.pip_requires, - self.test_requires, self.py_version, self.project) + return Distro( + self.root, self.venv, self.requirements, + self.test_requirements, self.py_version, self.project) def check_dependencies(self): self.get_distro().install_virtualenv() @@ -95,11 +99,6 @@ class InstallVenv(object): else: self.run_command(['virtualenv', '-q', self.venv]) print('done.') - print('Installing pip in venv...', end=' ') - if not self.run_command(['tools/with_venv.sh', 'easy_install', - 'pip>1.0']).strip(): - self.die("Failed to install pip.") - print('done.') else: print("venv already exists...") pass @@ -111,18 +110,23 @@ class InstallVenv(object): def install_dependencies(self): print('Installing dependencies with pip (this can take a while)...') - self.pip_install('pip>=1.3') + + # First things first, make sure our venv has the latest pip and + # setuptools and pbr + self.pip_install('pip>=1.4') self.pip_install('setuptools') - self.pip_install('-r', self.pip_requires, '-r', self.test_requires) + self.pip_install('pbr') + + self.pip_install('-r', self.requirements, '-r', self.test_requirements) def parse_args(self, argv): """Parses command-line arguments.""" - parser = argparse.ArgumentParser() - parser.add_argument('-n', '--no-site-packages', - action='store_true', - help="Do not inherit packages from global Python " - "install") - return parser.parse_args(argv[1:]) + parser = optparse.OptionParser() + parser.add_option('-n', '--no-site-packages', + action='store_true', + help="Do not inherit packages from global Python " + "install.") + return parser.parse_args(argv[1:])[0] class Distro(InstallVenv): @@ -158,15 +162,11 @@ class Fedora(Distro): return self.run_command_with_code(['rpm', '-q', pkg], check_exit_code=False)[1] == 0 - def yum_install(self, pkg, **kwargs): - print("Attempting to install '%s' via yum" % pkg) - self.run_command(['sudo', 'yum', 'install', '-y', pkg], **kwargs) - def install_virtualenv(self): if self.check_cmd('virtualenv'): return if not self.check_pkg('python-virtualenv'): - self.yum_install('python-virtualenv', check_exit_code=False) + self.die("Please install 'python-virtualenv'.") super(Fedora, self).install_virtualenv() diff --git a/tools/with_venv.sh b/tools/with_venv.sh index 94e05c127d..7303990bd8 100755 --- a/tools/with_venv.sh +++ b/tools/with_venv.sh @@ -1,7 +1,7 @@ #!/bin/bash -tools_path=${tools_path:-$(dirname $0)} -venv_path=${venv_path:-${tools_path}} -venv_dir=${venv_name:-/../.venv} -TOOLS=${tools_path} -VENV=${venv:-${venv_path}/${venv_dir}} +TOOLS_PATH=${TOOLS_PATH:-$(dirname $0)} +VENV_PATH=${VENV_PATH:-${TOOLS_PATH}} +VENV_DIR=${VENV_NAME:-/../.venv} +TOOLS=${TOOLS_PATH} +VENV=${VENV:-${VENV_PATH}/${VENV_DIR}} source ${VENV}/bin/activate && "$@"