From 28becedeeefbaf30d60a55fef0d7117aa112ba8f Mon Sep 17 00:00:00 2001 From: Kiall Mac Innes Date: Fri, 31 May 2013 21:32:24 +0100 Subject: [PATCH] Switch to PBR Change-Id: Ib62c6ab685c1bcf14ed363031010c4a145098df6 --- moniker/openstack/common/setup.py | 335 ------------------- moniker/openstack/common/version.py | 79 ----- moniker/version.py | 4 +- openstack-common.conf | 2 - tools/pip-requires => requirements.txt | 9 + setup.cfg | 114 ++++++- setup.py | 95 +----- tools/test-requires => test-requirements.txt | 4 +- tools/install_venv.py | 17 +- tools/install_venv_common.py | 62 ++-- tools/patch_tox_venv.py | 39 --- tools/pip-options | 7 - tools/setup-requires | 0 tox.ini | 8 +- 14 files changed, 158 insertions(+), 617 deletions(-) delete mode 100644 moniker/openstack/common/setup.py delete mode 100644 moniker/openstack/common/version.py rename tools/pip-requires => requirements.txt (50%) rename tools/test-requires => test-requirements.txt (65%) delete mode 100644 tools/patch_tox_venv.py delete mode 100644 tools/pip-options delete mode 100644 tools/setup-requires diff --git a/moniker/openstack/common/setup.py b/moniker/openstack/common/setup.py deleted file mode 100644 index cc8b99e3a..000000000 --- a/moniker/openstack/common/setup.py +++ /dev/null @@ -1,335 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2011 OpenStack LLC. -# Copyright 2012-2013 Hewlett-Packard Development Company, L.P. -# 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. - -""" -Utilities with minimum-depends for use in setup.py -""" - -import email -import os -import re -import subprocess -import sys - -from setuptools.command import sdist - - -def parse_mailmap(mailmap='.mailmap'): - mapping = {} - if os.path.exists(mailmap): - with open(mailmap, 'r') as fp: - for l in fp: - try: - canonical_email, alias = re.match( - r'[^#]*?(<.+>).*(<.+>).*', l).groups() - except AttributeError: - continue - mapping[alias] = canonical_email - return mapping - - -def canonicalize_emails(changelog, mapping): - """Takes in a string and an email alias mapping and replaces all - instances of the aliases in the string with their real email. - """ - for alias, email_address in mapping.iteritems(): - changelog = changelog.replace(alias, email_address) - return changelog - - -# Get requirements from the first file that exists -def get_reqs_from_files(requirements_files): - for requirements_file in requirements_files: - if os.path.exists(requirements_file): - with open(requirements_file, 'r') as fil: - return fil.read().split('\n') - return [] - - -def parse_requirements(requirements_files=['requirements.txt', - 'tools/pip-requires']): - requirements = [] - for line in get_reqs_from_files(requirements_files): - # For the requirements list, we need to inject only the portion - # after egg= so that distutils knows the package it's looking for - # such as: - # -e git://github.com/openstack/nova/master#egg=nova - if re.match(r'\s*-e\s+', line): - requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1', - line)) - # such as: - # http://github.com/openstack/nova/zipball/master#egg=nova - elif re.match(r'\s*https?:', line): - requirements.append(re.sub(r'\s*https?:.*#egg=(.*)$', r'\1', - line)) - # -f lines are for index locations, and don't get used here - elif re.match(r'\s*-f\s+', line): - pass - # argparse is part of the standard library starting with 2.7 - # adding it to the requirements list screws distro installs - elif line == 'argparse' and sys.version_info >= (2, 7): - pass - else: - requirements.append(line) - - return requirements - - -def parse_dependency_links(requirements_files=['requirements.txt', - 'tools/pip-requires']): - dependency_links = [] - # dependency_links inject alternate locations to find packages listed - # in requirements - for line in get_reqs_from_files(requirements_files): - # skip comments and blank lines - if re.match(r'(\s*#)|(\s*$)', line): - continue - # lines with -e or -f need the whole line, minus the flag - if re.match(r'\s*-[ef]\s+', line): - dependency_links.append(re.sub(r'\s*-[ef]\s+', '', line)) - # lines that are only urls can go in unmolested - elif re.match(r'\s*https?:', line): - dependency_links.append(line) - return dependency_links - - -def _run_shell_command(cmd, throw_on_error=False): - if os.name == 'nt': - output = subprocess.Popen(["cmd.exe", "/C", cmd], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - else: - output = subprocess.Popen(["/bin/sh", "-c", cmd], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - if output.returncode and throw_on_error: - raise Exception("%s returned %d" % cmd, output.returncode) - out = output.communicate() - if len(out) == 0: - return None - if len(out[0].strip()) == 0: - return None - return out[0].strip() - - -def write_git_changelog(): - """Write a changelog based on the git changelog.""" - new_changelog = 'ChangeLog' - if not os.getenv('SKIP_WRITE_GIT_CHANGELOG'): - if os.path.isdir('.git'): - git_log_cmd = 'git log --stat' - changelog = _run_shell_command(git_log_cmd) - mailmap = parse_mailmap() - with open(new_changelog, "w") as changelog_file: - changelog_file.write(canonicalize_emails(changelog, mailmap)) - else: - open(new_changelog, 'w').close() - - -def generate_authors(): - """Create AUTHORS file using git commits.""" - jenkins_email = 'jenkins@review.(openstack|stackforge).org' - old_authors = 'AUTHORS.in' - new_authors = 'AUTHORS' - if not os.getenv('SKIP_GENERATE_AUTHORS'): - if os.path.isdir('.git'): - # don't include jenkins email address in AUTHORS file - git_log_cmd = ("git log --format='%aN <%aE>' | sort -u | " - "egrep -v '" + jenkins_email + "'") - changelog = _run_shell_command(git_log_cmd) - mailmap = parse_mailmap() - with open(new_authors, 'w') as new_authors_fh: - new_authors_fh.write(canonicalize_emails(changelog, mailmap)) - if os.path.exists(old_authors): - with open(old_authors, "r") as old_authors_fh: - new_authors_fh.write('\n' + old_authors_fh.read()) - else: - open(new_authors, 'w').close() - - -_rst_template = """%(heading)s -%(underline)s - -.. automodule:: %(module)s - :members: - :undoc-members: - :show-inheritance: -""" - - -def get_cmdclass(): - """Return dict of commands to run from setup.py.""" - - cmdclass = dict() - - def _find_modules(arg, dirname, files): - for filename in files: - if filename.endswith('.py') and filename != '__init__.py': - arg["%s.%s" % (dirname.replace('/', '.'), - filename[:-3])] = True - - class LocalSDist(sdist.sdist): - """Builds the ChangeLog and Authors files from VC first.""" - - def run(self): - write_git_changelog() - generate_authors() - # sdist.sdist is an old style class, can't use super() - sdist.sdist.run(self) - - cmdclass['sdist'] = LocalSDist - - # If Sphinx is installed on the box running setup.py, - # enable setup.py to build the documentation, otherwise, - # just ignore it - try: - from sphinx.setup_command import BuildDoc - - class LocalBuildDoc(BuildDoc): - - builders = ['html', 'man'] - - def generate_autoindex(self): - print "**Autodocumenting from %s" % os.path.abspath(os.curdir) - modules = {} - option_dict = self.distribution.get_option_dict('build_sphinx') - source_dir = os.path.join(option_dict['source_dir'][1], 'api') - if not os.path.exists(source_dir): - os.makedirs(source_dir) - for pkg in self.distribution.packages: - if '.' not in pkg: - os.path.walk(pkg, _find_modules, modules) - module_list = modules.keys() - module_list.sort() - autoindex_filename = os.path.join(source_dir, 'autoindex.rst') - with open(autoindex_filename, 'w') as autoindex: - autoindex.write(""".. toctree:: - :maxdepth: 1 - -""") - for module in module_list: - output_filename = os.path.join(source_dir, - "%s.rst" % module) - heading = "The :mod:`%s` Module" % module - underline = "=" * len(heading) - values = dict(module=module, heading=heading, - underline=underline) - - print "Generating %s" % output_filename - with open(output_filename, 'w') as output_file: - output_file.write(_rst_template % values) - autoindex.write(" %s.rst\n" % module) - - def run(self): - if not os.getenv('SPHINX_DEBUG'): - self.generate_autoindex() - - for builder in self.builders: - self.builder = builder - self.finalize_options() - self.project = self.distribution.get_name() - self.version = self.distribution.get_version() - self.release = self.distribution.get_version() - BuildDoc.run(self) - - class LocalBuildLatex(LocalBuildDoc): - builders = ['latex'] - - cmdclass['build_sphinx'] = LocalBuildDoc - cmdclass['build_sphinx_latex'] = LocalBuildLatex - except ImportError: - pass - - return cmdclass - - -def _get_revno(): - """Return the number of commits since the most recent tag. - - We use git-describe to find this out, but if there are no - tags then we fall back to counting commits since the beginning - of time. - """ - describe = _run_shell_command("git describe --always") - if "-" in describe: - return describe.rsplit("-", 2)[-2] - - # no tags found - revlist = _run_shell_command("git rev-list --abbrev-commit HEAD") - return len(revlist.splitlines()) - - -def get_version_from_git(pre_version): - """Return a version which is equal to the tag that's on the current - revision if there is one, or tag plus number of additional revisions - if the current revision has no tag.""" - - if os.path.isdir('.git'): - if pre_version: - try: - return _run_shell_command( - "git describe --exact-match", - throw_on_error=True).replace('-', '.') - except Exception: - sha = _run_shell_command("git log -n1 --pretty=format:%h") - return "%s.a%s.g%s" % (pre_version, _get_revno(), sha) - else: - return _run_shell_command( - "git describe --always").replace('-', '.') - return None - - -def get_version_from_pkg_info(package_name): - """Get the version from PKG-INFO file if we can.""" - try: - pkg_info_file = open('PKG-INFO', 'r') - except (IOError, OSError): - return None - try: - pkg_info = email.message_from_file(pkg_info_file) - except email.MessageError: - return None - # Check to make sure we're in our own dir - if pkg_info.get('Name', None) != package_name: - return None - return pkg_info.get('Version', None) - - -def get_version(package_name, pre_version=None): - """Get the version of the project. First, try getting it from PKG-INFO, if - it exists. If it does, that means we're in a distribution tarball or that - install has happened. Otherwise, if there is no PKG-INFO file, pull the - version from git. - - We do not support setup.py version sanity in git archive tarballs, nor do - we support packagers directly sucking our git repo into theirs. We expect - that a source tarball be made from our git repo - or that if someone wants - to make a source tarball from a fork of our repo with additional tags in it - that they understand and desire the results of doing that. - """ - version = os.environ.get("OSLO_PACKAGE_VERSION", None) - if version: - return version - version = get_version_from_pkg_info(package_name) - if version: - return version - version = get_version_from_git(pre_version) - if version: - return version - raise Exception("Versioning for this project requires either an sdist" - " tarball, or access to an upstream git repository.") diff --git a/moniker/openstack/common/version.py b/moniker/openstack/common/version.py deleted file mode 100644 index 3653ad0d0..000000000 --- a/moniker/openstack/common/version.py +++ /dev/null @@ -1,79 +0,0 @@ - -# Copyright 2012 OpenStack LLC -# Copyright 2012-2013 Hewlett-Packard Development Company, L.P. -# -# 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. - -""" -Utilities for consuming the version from pkg_resources. -""" - -import pkg_resources - - -class VersionInfo(object): - - def __init__(self, package): - """Object that understands versioning for a package - :param package: name of the python package, such as glance, or - python-glanceclient - """ - self.package = package - self.release = None - self.version = None - self._cached_version = None - - def _get_version_from_pkg_resources(self): - """Get the version of the package from the pkg_resources record - associated with the package.""" - requirement = pkg_resources.Requirement.parse(self.package) - provider = pkg_resources.get_provider(requirement) - return provider.version - - def release_string(self): - """Return the full version of the package including suffixes indicating - VCS status. - """ - if self.release is None: - self.release = self._get_version_from_pkg_resources() - - return self.release - - def version_string(self): - """Return the short version minus any alpha/beta tags.""" - if self.version is None: - parts = [] - for part in self.release_string().split('.'): - if part[0].isdigit(): - parts.append(part) - else: - break - self.version = ".".join(parts) - - return self.version - - # Compatibility functions - canonical_version_string = version_string - version_string_with_vcs = release_string - - def cached_version_string(self, prefix=""): - """Generate an object which will expand in a string context to - the results of version_string(). We do this so that don't - call into pkg_resources every time we start up a program when - passing version information into the CONF constructor, but - rather only do the calculation when and if a version is requested - """ - if not self._cached_version: - self._cached_version = "%s%s" % (prefix, - self.version_string()) - return self._cached_version diff --git a/moniker/version.py b/moniker/version.py index 53fb75576..4888e0cfc 100644 --- a/moniker/version.py +++ b/moniker/version.py @@ -13,6 +13,6 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. -from moniker.openstack.common import version as common_version +import pbr.version -version_info = common_version.VersionInfo('moniker') +version_info = pbr.version.VersionInfo('moniker') diff --git a/openstack-common.conf b/openstack-common.conf index 3ddf82289..34d3c389d 100644 --- a/openstack-common.conf +++ b/openstack-common.conf @@ -21,11 +21,9 @@ module=processutils module=rootwrap module=rpc module=service -module=setup module=threadgroup module=timeutils module=uuidutils -module=version module=wsgi # The base module to hold the copy of openstack.common diff --git a/tools/pip-requires b/requirements.txt similarity index 50% rename from tools/pip-requires rename to requirements.txt index 43fecb5cb..2cebea208 100644 --- a/tools/pip-requires +++ b/requirements.txt @@ -1,3 +1,5 @@ +d2to1>=0.2.10,<0.3 +pbr>=0.5,<0.6 Flask>=0.8 eventlet jsonschema>=0.8,<1 @@ -7,6 +9,13 @@ PasteDeploy stevedore cliff +SQLAlchemy>=0.7.8,<=0.7.9 +sqlalchemy-migrate>=0.7.2 +kombu + +# Needed for Keystone Middleware +python-keystoneclient>=0.2.0 + # From OpenStack Common routes>=1.12.3 iso8601>=0.1.4 diff --git a/setup.cfg b/setup.cfg index 4e67216e1..4e8630280 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,17 +1,105 @@ -[nosetests] -cover-package=moniker -cover-html=true -cover-html-dir=../../cover -cover-erase=true -cover-inclusive=true -verbosity=2 -detailed-errors=1 -where=moniker/tests +[metadata] +name = moniker +version = 2013.1 +summary = DNS as a Service +description-file = + README.md +author = Kiall Mac Innes +author-email = kiall@managedit.ie +home-page = https://launchpad.net/moniker +classifier = + Environment :: OpenStack + Environment :: No Input/Output (Daemon) + Intended Audience :: Information Technology + Intended Audience :: System Administrators + License :: OSI Approved :: Apache Software License + Operating System :: POSIX :: Linux + Programming Language :: Python + Programming Language :: Python :: 2 + Programming Language :: Python :: 2.7 + Programming Language :: Python :: 2.6 + Topic :: Internet :: Name Service (DNS) + +[global] +setup-hooks = + pbr.hooks.setup_hook + +[files] +packages = + moniker +scripts = + bin/moniker-agent + bin/moniker-api + bin/moniker-central + bin/moniker-manage + bin/moniker-rootwrap + bin/moniker-sink + +[entry_points] +moniker.v1.controllers = + reports = moniker.v1.reports:ReportsController + diagnostics = moniker.v1.diagnostics:DiagnosticsController + domains = moniker.v1.domains:DomainsController + records = moniker.v1.records:RecordsController + servers = moniker.v1.servers:ServersController + +moniker.api.v1 = + domains = moniker.api.v1.domains:blueprint + limits = moniker.api.v1.limits:blueprint + records = moniker.api.v1.records:blueprint + servers = moniker.api.v1.servers:blueprint + tsigkeys = moniker.api.v1.tsigkeys:blueprint + +moniker.api.v1.extensions = + diagnostics = moniker.api.v1.extensions.diagnostics:blueprint + sync = moniker.api.v1.extensions.sync:blueprint + reports = moniker.api.v1.extensions.reports:blueprint + +moniker.storage = + sqlalchemy = moniker.storage.impl_sqlalchemy:SQLAlchemyStorage + +moniker.notification.handler = + nova_fixed = moniker.notification_handler.nova:NovaFixedHandler + quantum_floatingip = moniker.notification_handler.quantum:QuantumFloatingHandler + +moniker.backend = + bind9 = moniker.backend.impl_bind9:Bind9Backend + mysqlbind9 = moniker.backend.impl_mysqlbind9:MySQLBind9Backend + powerdns = moniker.backend.impl_powerdns:PowerDNSBackend + rpc = moniker.backend.impl_rpc:RPCBackend + dnsmasq = moniker.backend.impl_dnsmasq:DnsmasqBackend + fake = moniker.backend.impl_fake:FakeBackend + +moniker.quota = + storage = moniker.quota.impl_storage:StorageQuota + config = moniker.quota.impl_config:ConfigQuota + +moniker.manage = + database-init = moniker.manage.database:InitCommand + database-sync = moniker.manage.database:SyncCommand + powerdns database-init = moniker.manage.powerdns:DatabaseInitCommand + powerdns database-sync = moniker.manage.powerdns:DatabaseSyncCommand [build_sphinx] +all_files = 1 +build-dir = doc/build source-dir = doc/source -build-dir = doc/build -all_files = 1 -[upload_docs] -upload-dir = doc/build/html +[egg_info] +tag_build = +tag_date = 0 +tag_svn_revision = 0 + +[compile_catalog] +directory = moniker/locale +domain = moniker + +[update_catalog] +domain = moniker +output_dir = moniker/locale +input_file = moniker/locale/moniker.pot + +[extract_messages] +keywords = _ gettext ngettext l_ lazy_gettext +mapping_file = babel.cfg +output_file = moniker/locale/moniker.pot diff --git a/setup.py b/setup.py index 7896f05d3..25702851c 100755 --- a/setup.py +++ b/setup.py @@ -14,95 +14,8 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. -from setuptools import setup, find_packages -import textwrap -from moniker.openstack.common import setup as common_setup +import setuptools -install_requires = common_setup.parse_requirements(['tools/pip-requires']) -install_options = common_setup.parse_requirements(['tools/pip-options']) -tests_require = common_setup.parse_requirements(['tools/test-requires']) -setup_require = common_setup.parse_requirements(['tools/setup-requires']) -dependency_links = common_setup.parse_dependency_links([ - 'tools/pip-requires', - 'tools/pip-options', - 'tools/test-requires', - 'tools/setup-requires' -]) - -setup( - name='moniker', - version=common_setup.get_version('moniker'), - description='DNS as a Service', - author='Kiall Mac Innes', - author_email='kiall@managedit.ie', - url='https://launchpad.net/moniker', - packages=find_packages(exclude=['bin']), - include_package_data=True, - test_suite='nose.collector', - setup_requires=setup_require, - install_requires=install_requires, - tests_require=tests_require, - extras_require={ - 'test': tests_require, - 'optional': install_options, - }, - dependency_links=dependency_links, - scripts=[ - 'bin/moniker-agent', - 'bin/moniker-api', - 'bin/moniker-central', - 'bin/moniker-manage', - 'bin/moniker-rootwrap', - 'bin/moniker-sink', - ], - cmdclass=common_setup.get_cmdclass(), - entry_points=textwrap.dedent(""" - [moniker.api.v1] - domains = moniker.api.v1.domains:blueprint - limits = moniker.api.v1.limits:blueprint - records = moniker.api.v1.records:blueprint - servers = moniker.api.v1.servers:blueprint - tsigkeys = moniker.api.v1.tsigkeys:blueprint - - [moniker.api.v1.extensions] - diagnostics = moniker.api.v1.extensions.diagnostics:blueprint - sync = moniker.api.v1.extensions.sync:blueprint - reports = moniker.api.v1.extensions.reports:blueprint - - [moniker.storage] - sqlalchemy = moniker.storage.impl_sqlalchemy:SQLAlchemyStorage - - [moniker.notification.handler] - nova_fixed = moniker.notification_handler.nova:NovaFixedHandler - quantum_floatingip = moniker.notification_handler.quantum\ - :QuantumFloatingHandler - - [moniker.backend] - bind9 = moniker.backend.impl_bind9:Bind9Backend - mysqlbind9 = moniker.backend.impl_mysqlbind9:MySQLBind9Backend - powerdns = moniker.backend.impl_powerdns:PowerDNSBackend - rpc = moniker.backend.impl_rpc:RPCBackend - dnsmasq = moniker.backend.impl_dnsmasq:DnsmasqBackend - fake = moniker.backend.impl_fake:FakeBackend - - [moniker.quota] - storage = moniker.quota.impl_storage:StorageQuota - config = moniker.quota.impl_config:ConfigQuota - - [moniker.manage] - database-init = moniker.manage.database:InitCommand - database-sync = moniker.manage.database:SyncCommand - powerdns database-init = moniker.manage.powerdns:DatabaseInitCommand - powerdns database-sync = moniker.manage.powerdns:DatabaseSyncCommand - """), - classifiers=[ - 'Development Status :: 3 - Alpha', - 'Topic :: Internet :: Name Service (DNS)', - 'License :: OSI Approved :: Apache Software License', - 'Operating System :: POSIX :: Linux', - 'Programming Language :: Python :: 2.6', - 'Programming Language :: Python :: 2.7', - 'Environment :: No Input/Output (Daemon)', - 'Environment :: OpenStack', - ], -) +setuptools.setup( + setup_requires=['d2to1', 'pbr'], + d2to1=True) diff --git a/tools/test-requires b/test-requirements.txt similarity index 65% rename from tools/test-requires rename to test-requirements.txt index 424c68559..835f52307 100644 --- a/tools/test-requires +++ b/test-requirements.txt @@ -1,8 +1,6 @@ -unittest2 nose openstack.nose_plugin nosehtmloutput +unittest2 mox mock -sphinx -sphinxcontrib-httpdomain diff --git a/tools/install_venv.py b/tools/install_venv.py index 096a95b02..16c4f7444 100644 --- a/tools/install_venv.py +++ b/tools/install_venv.py @@ -21,7 +21,7 @@ # under the License. """ -Installation script for BillingStack's development virtualenv +Installation script for Moniker's development virtualenv """ import os @@ -33,12 +33,12 @@ import install_venv_common as install_venv def print_help(): help = """ - BillingStack development environment setup is complete. + Moniker development environment setup is complete. - BillingStack development uses virtualenv to track and manage Python dependencies + Moniker development uses virtualenv to track and manage Python dependencies while in development and testing. - To activate the BillingStack virtualenv for the extent of your current shell + To activate the Moniker virtualenv for the extent of your current shell session you can run: $ source .venv/bin/activate @@ -56,12 +56,11 @@ def print_help(): def main(argv): root = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) venv = os.path.join(root, '.venv') - pip_requires = os.path.join(root, 'tools', 'pip-requires') - pip_options = os.path.join(root, 'tools', 'pip-options') - test_requires = os.path.join(root, 'tools', 'test-requires') + pip_requires = os.path.join(root, 'requirements.txt') + test_requires = os.path.join(root, 'test-requirements.txt') py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1]) - project = 'quantum' - install = install_venv.InstallVenv(root, venv, pip_requires, pip_options, test_requires, + project = 'moniker' + install = install_venv.InstallVenv(root, venv, pip_requires, test_requires, py_version, project) options = install.parse_args(argv) install.check_python_version() diff --git a/tools/install_venv_common.py b/tools/install_venv_common.py index 8123f8915..42a44e8cd 100644 --- a/tools/install_venv_common.py +++ b/tools/install_venv_common.py @@ -18,10 +18,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 """ -import argparse +from __future__ import print_function + +import optparse import os import subprocess import sys @@ -29,18 +34,17 @@ import sys class InstallVenv(object): - def __init__(self, root, venv, pip_requires, pip_options, test_requires, - py_version, project): + def __init__(self, root, venv, pip_requires, test_requires, py_version, + project): self.root = root self.venv = venv self.pip_requires = pip_requires - self.pip_options = pip_options self.test_requires = test_requires self.py_version = py_version self.project = project def die(self, message, *args): - print >> sys.stderr, message % args + print(message % args, file=sys.stderr) sys.exit(1) def check_python_version(self): @@ -72,12 +76,10 @@ class InstallVenv(object): if (os.path.exists('/etc/fedora-release') or os.path.exists('/etc/redhat-release')): return Fedora(self.root, self.venv, self.pip_requires, - self.pip_options, self.test_requires, - self.py_version, self.project) + self.test_requires, self.py_version, self.project) else: return Distro(self.root, self.venv, self.pip_requires, - self.pip_options, self.test_requires, - self.py_version, self.project) + self.test_requires, self.py_version, self.project) def check_dependencies(self): self.get_distro().install_virtualenv() @@ -89,20 +91,20 @@ class InstallVenv(object): virtual environment. """ if not os.path.isdir(self.venv): - print 'Creating venv...', + print('Creating venv...', end=' ') if no_site_packages: self.run_command(['virtualenv', '-q', '--no-site-packages', self.venv]) else: self.run_command(['virtualenv', '-q', self.venv]) - print 'done.' - print 'Installing pip in 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.' + print('done.') else: - print "venv already exists..." + print("venv already exists...") pass def pip_install(self, *args): @@ -111,7 +113,7 @@ class InstallVenv(object): redirect_output=False) def install_dependencies(self): - print 'Installing dependencies with pip (this can take a while)...' + print('Installing dependencies with pip (this can take a while)...') # First things first, make sure our venv has the latest pip and # distribute. @@ -127,7 +129,6 @@ class InstallVenv(object): self.pip_install('greenlet') self.pip_install('-r', self.pip_requires) - self.pip_install('-r', self.pip_options) self.pip_install('-r', self.test_requires) def post_process(self): @@ -135,12 +136,12 @@ class InstallVenv(object): 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): @@ -154,12 +155,12 @@ class Distro(InstallVenv): return if self.check_cmd('easy_install'): - print 'Installing virtualenv via easy_install...', + print('Installing virtualenv via easy_install...', end=' ') if self.run_command(['easy_install', 'virtualenv']): - print 'Succeeded' + print('Succeeded') return else: - print 'Failed' + print('Failed') self.die('ERROR: virtualenv not found.\n\n%s development' ' requires virtualenv, please install it using your' @@ -184,10 +185,6 @@ 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 apply_patch(self, originalfile, patchfile): self.run_command(['patch', '-N', originalfile, patchfile], check_exit_code=False) @@ -197,7 +194,7 @@ class Fedora(Distro): 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() @@ -210,12 +207,13 @@ class Fedora(Distro): This can be removed when the fix is applied upstream. Nova: https://bugs.launchpad.net/nova/+bug/884915 - Upstream: https://bitbucket.org/which_linden/eventlet/issue/89 + Upstream: https://bitbucket.org/eventlet/eventlet/issue/89 + RHEL: https://bugzilla.redhat.com/958868 """ # Install "patch" program if it's not there if not self.check_pkg('patch'): - self.yum_install('patch') + self.die("Please install 'patch'.") # Apply the eventlet patch self.apply_patch(os.path.join(self.venv, 'lib', self.py_version, diff --git a/tools/patch_tox_venv.py b/tools/patch_tox_venv.py deleted file mode 100644 index 7a8f8fbbe..000000000 --- a/tools/patch_tox_venv.py +++ /dev/null @@ -1,39 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2013 Red Hat, Inc. -# -# 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 os -import sys - -import install_venv_common as install_venv - - -def main(argv): - root = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) - - venv = os.environ['VIRTUAL_ENV'] - - pip_requires = os.path.join(root, 'tools', 'pip-requires') - pip_options = os.path.join(root, 'tools', 'pip-options') - test_requires = os.path.join(root, 'tools', 'test-requires') - py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1]) - project = 'Quantum' - install = install_venv.InstallVenv(root, venv, pip_requires, pip_options, - test_requires, py_version, project) - #NOTE(dprince): For Tox we only run post_process (which patches files, etc) - install.post_process() - -if __name__ == '__main__': - main(sys.argv) diff --git a/tools/pip-options b/tools/pip-options deleted file mode 100644 index 9bd4fbf0a..000000000 --- a/tools/pip-options +++ /dev/null @@ -1,7 +0,0 @@ -# Optional Stuff that is used by default -SQLAlchemy>=0.7.8,<=0.7.9 -sqlalchemy-migrate>=0.7.2 -kombu - -# Needed for Keystone Middleware -python-keystoneclient>=0.2.0 diff --git a/tools/setup-requires b/tools/setup-requires deleted file mode 100644 index e69de29bb..000000000 diff --git a/tox.ini b/tox.ini index 4de48102d..05b4aac79 100644 --- a/tox.ini +++ b/tox.ini @@ -6,10 +6,9 @@ minversion = 1.4.0 downloadcache = ~/cache/pip [testenv] -deps = -r{toxinidir}/tools/setup-requires - -r{toxinidir}/tools/pip-requires - -r{toxinidir}/tools/pip-options - -r{toxinidir}/tools/test-requires +sitepackages = False +deps = -r{toxinidir}/requirements.txt + -r{toxinidir}/test-requirements.txt setenv = VIRTUAL_ENV={envdir} NOSE_WITH_OPENSTACK=1 NOSE_OPENSTACK_COLOR=1 @@ -17,7 +16,6 @@ setenv = VIRTUAL_ENV={envdir} NOSE_OPENSTACK_YELLOW=0.025 NOSE_OPENSTACK_SHOW_ELAPSED=1 commands = nosetests {posargs} -sitepackages = False [testenv:cover] deps = {[testenv]deps}