summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKiall Mac Innes <kiall@hp.com>2013-05-31 21:32:24 +0100
committerKiall Mac Innes <kiall@hp.com>2013-05-31 21:41:45 +0100
commit28becedeeefbaf30d60a55fef0d7117aa112ba8f (patch)
treea5ad466b2709200bf81eb3d065cfb26230f500a9
parent0c7535e4b9a10a21d131ba1a46c91183e624201d (diff)
downloaddesignate-28becedeeefbaf30d60a55fef0d7117aa112ba8f.tar.gz
Switch to PBR
Change-Id: Ib62c6ab685c1bcf14ed363031010c4a145098df6
-rw-r--r--moniker/openstack/common/setup.py335
-rw-r--r--moniker/openstack/common/version.py79
-rw-r--r--moniker/version.py4
-rw-r--r--openstack-common.conf2
-rw-r--r--requirements.txt (renamed from tools/pip-requires)9
-rw-r--r--setup.cfg114
-rwxr-xr-xsetup.py95
-rw-r--r--test-requirements.txt (renamed from tools/test-requires)4
-rw-r--r--tools/install_venv.py17
-rw-r--r--tools/install_venv_common.py62
-rw-r--r--tools/patch_tox_venv.py39
-rw-r--r--tools/pip-options7
-rw-r--r--tools/setup-requires0
-rw-r--r--tox.ini8
14 files changed, 158 insertions, 617 deletions
diff --git a/moniker/openstack/common/setup.py b/moniker/openstack/common/setup.py
deleted file mode 100644
index cc8b99e3..00000000
--- 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 3653ad0d..00000000
--- 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 53fb7557..4888e0cf 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 3ddf8228..34d3c389 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
index 43fecb5c..2cebea20 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 4e67216e..4e863028 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 7896f05d..25702851 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
index 424c6855..835f5230 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 096a95b0..16c4f744 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 8123f891..42a44e8c 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 7a8f8fbb..00000000
--- 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 9bd4fbf0..00000000
--- 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 e69de29b..00000000
--- a/tools/setup-requires
+++ /dev/null
diff --git a/tox.ini b/tox.ini
index 4de48102..05b4aac7 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}