diff --git a/muranodashboard/openstack/__init__.py b/muranodashboard/openstack/__init__.py index e69de29bb..7d93825c6 100644 --- a/muranodashboard/openstack/__init__.py +++ b/muranodashboard/openstack/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2013 Mirantis, 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. diff --git a/muranodashboard/openstack/common/__init__.py b/muranodashboard/openstack/common/__init__.py index e69de29bb..7d93825c6 100644 --- a/muranodashboard/openstack/common/__init__.py +++ b/muranodashboard/openstack/common/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2013 Mirantis, 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. diff --git a/muranodashboard/openstack/common/setup.py b/muranodashboard/openstack/common/setup.py deleted file mode 100644 index dec74fd0d..000000000 --- a/muranodashboard/openstack/common/setup.py +++ /dev/null @@ -1,367 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2011 OpenStack Foundation. -# 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 _parse_git_mailmap(git_dir, mailmap='.mailmap'): - mailmap = os.path.join(os.path.dirname(git_dir), mailmap) - return parse_mailmap(mailmap) - - -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) - out = output.communicate() - if output.returncode and throw_on_error: - raise Exception("%s returned %d" % cmd, output.returncode) - if len(out) == 0: - return None - if len(out[0].strip()) == 0: - return None - return out[0].strip() - - -def _get_git_directory(): - parent_dir = os.path.dirname(__file__) - while True: - git_dir = os.path.join(parent_dir, '.git') - if os.path.exists(git_dir): - return git_dir - parent_dir, child = os.path.split(parent_dir) - if not child: # reached to root dir - return None - - -def write_git_changelog(): - """Write a changelog based on the git changelog.""" - new_changelog = 'ChangeLog' - git_dir = _get_git_directory() - if not os.getenv('SKIP_WRITE_GIT_CHANGELOG'): - if git_dir: - git_log_cmd = 'git --git-dir=%s log' % git_dir - changelog = _run_shell_command(git_log_cmd) - mailmap = _parse_git_mailmap(git_dir) - 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' - git_dir = _get_git_directory() - if not os.getenv('SKIP_GENERATE_AUTHORS'): - if git_dir: - # don't include jenkins email address in AUTHORS file - git_log_cmd = ("git --git-dir=" + git_dir + - " log --format='%aN <%aE>' | sort -u | " - "egrep -v '" + jenkins_email + "'") - changelog = _run_shell_command(git_log_cmd) - signed_cmd = ("git log --git-dir=" + git_dir + - " | grep -i Co-authored-by: | sort -u") - signed_entries = _run_shell_command(signed_cmd) - if signed_entries: - new_entries = "\n".join( - [signed.split(":", 1)[1].strip() - for signed in signed_entries.split("\n") if signed]) - changelog = "\n".join((changelog, new_entries)) - mailmap = _parse_git_mailmap(git_dir) - 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(git_dir): - """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 --git-dir=%s describe --always" % git_dir) - if "-" in describe: - return describe.rsplit("-", 2)[-2] - - # no tags found - revlist = _run_shell_command( - "git --git-dir=%s rev-list --abbrev-commit HEAD" % git_dir) - 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.""" - - git_dir = _get_git_directory() - if git_dir: - if pre_version: - try: - return _run_shell_command( - "git --git-dir=" + git_dir + " describe --exact-match", - throw_on_error=True).replace('-', '.') - except Exception: - sha = _run_shell_command( - "git --git-dir=" + git_dir + " log -n1 --pretty=format:%h") - return "%s.a%s.g%s" % (pre_version, _get_revno(git_dir), sha) - else: - return _run_shell_command( - "git --git-dir=" + git_dir + " 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/muranodashboard/openstack/common/version.py b/muranodashboard/openstack/common/version.py deleted file mode 100644 index b8914b2dd..000000000 --- a/muranodashboard/openstack/common/version.py +++ /dev/null @@ -1,94 +0,0 @@ - -# Copyright 2012 OpenStack Foundation -# 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 __str__(self): - """Make the VersionInfo object behave like a string.""" - return self.version_string() - - def __repr__(self): - """Include the name.""" - return "VersionInfo(%s:%s)" % (self.package, self.version_string()) - - def _get_version_from_pkg_resources(self): - """Get the version of the package from the pkg_resources record - associated with the package.""" - try: - requirement = pkg_resources.Requirement.parse(self.package) - provider = pkg_resources.get_provider(requirement) - return provider.version - except pkg_resources.DistributionNotFound: - # The most likely cause for this is running tests in a tree - # produced from a tarball where the package itself has not been - # installed into anything. Revert to setup-time logic. - from muranodashboard.openstack.common import setup - return setup.get_version(self.package) - - 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/muranodashboard/panel/overrides.py b/muranodashboard/panel/overrides.py index 94b34a5f0..68263716d 100644 --- a/muranodashboard/panel/overrides.py +++ b/muranodashboard/panel/overrides.py @@ -14,7 +14,7 @@ import horizon -from panel import Panel +from muranodashboard.panel.panel import Panel project = horizon.get_dashboard('project') project.register(Panel) diff --git a/muranodashboard/panel/views.py b/muranodashboard/panel/views.py index 5268615ab..28c7d375a 100644 --- a/muranodashboard/panel/views.py +++ b/muranodashboard/panel/views.py @@ -77,6 +77,11 @@ class Wizard(ModalFormMixin, SessionWizardView): 'The environment is deploying.') redirect = reverse("horizon:project:murano:index") exceptions.handle(self.request, msg, redirect=redirect) + except Exception: + redirect = reverse("horizon:project:murano:index") + exceptions.handle(self.request, + _('Sorry, you can\'t create service right now.', + redirect=redirect)) else: message = "The %s service successfully created." % slug messages.success(self.request, message) diff --git a/muranodashboard/version.py b/muranodashboard/version.py index 2ddbc31b1..0929d1242 100644 --- a/muranodashboard/version.py +++ b/muranodashboard/version.py @@ -15,6 +15,6 @@ # under the License. -from muranodashboard.openstack.common import version as common_version - -version_info = common_version.VersionInfo('muranodashboard') +from pbr import version +__version_info = version.VersionInfo('muranodashboard') +__version__ = __version_info.cached_version_string() diff --git a/openstack-common.conf b/openstack-common.conf index 4ff77ce75..cb79251d8 100644 --- a/openstack-common.conf +++ b/openstack-common.conf @@ -1,7 +1,10 @@ [DEFAULT] # The list of modules to copy from openstack-common -modules=setup,importutils,version +module=setup +module=importutils +module=timeutils + # The base module to hold the copy of openstack.common base=muranodashboard diff --git a/packages/python-portasclient-2013.1.a345.ga70b44e.tar.gz b/packages/python-portasclient-2013.1.a345.ga70b44e.tar.gz deleted file mode 100644 index 92ff304b7..000000000 Binary files a/packages/python-portasclient-2013.1.a345.ga70b44e.tar.gz and /dev/null differ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..37f1132d6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,12 @@ +# Core Requirements +d2to1>=0.2.10,<0.3 +pbr>=0.5,<1.0 + +bunch +iso8601>=0.1.4 +six +PyYAML +django-pipeline +django-floppyforms==1.1 +ordereddict +http://tarballs.openstack.org/python-muranoclient/python-muranoclient-release-0.2.tar.gz#egg=pythonmuranoclient-0.2 diff --git a/setup.cfg b/setup.cfg index 79034b3c6..6372d4d44 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,8 +1,56 @@ +# Copyright (c) 2013 Mirantis, 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. + + +[metadata] +name = muranodashboard +summary = The Murano Dashboard +description-file = + README.rst +license = Apache License, Version 2.0 +author = Mirantis, Inc. +author-email = murano-all@lists.openstack.org +home-page = htts://launchpad.net/murano +classifier = + Development Status :: 5 - Production/Stable + Framework :: Django + Topic :: Internet :: WWW/HTTP + Environment :: OpenStack + Intended Audience :: Developers + Intended Audience :: Information Technology + License :: OSI Approved :: Apache Software License + Operating System :: OS Independent + Programming Language :: Python + +[files] +packages = + muranodashboard + +[global] +setup-hooks = + pbr.hooks.setup_hook + [build_sphinx] all_files = 1 build-dir = doc/build source-dir = doc/source +[egg_info] +tag_build = +tag_date = 0 +tag_svn_revision = 0 + [nosetests] verbosity=2 detailed-errors=1 diff --git a/setup.py b/setup.py index 42cc59f4b..292dff401 100755 --- a/setup.py +++ b/setup.py @@ -21,31 +21,11 @@ import setuptools -from muranodashboard.openstack.common import setup - -requires = setup.parse_requirements() -depend_links = setup.parse_dependency_links() -project = 'muranodashboard' setuptools.setup( - name=project, - version=setup.get_version(project, '2013.1'), - description="The Murano Dashboard.", - license='Apache 2.0', - author='Mirantis Inc', - author_email='tnurlygayanov@mirantis.com', - url='https://github.com/stackforge/murano-dashboard', - packages=setuptools.find_packages(exclude=['bin']), - cmdclass=setup.get_cmdclass(), - include_package_data=True, - install_requires=requires, - dependency_links=depend_links, - classifiers=['Development Status :: 5 - Production/Stable', - 'Framework :: Django', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: Apache Software License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Topic :: Internet :: WWW/HTTP', - 'Environment :: OpenStack'] + setup_requires=[ + 'd2to1>=0.2.10,<0.3', + 'pbr>=0.5,<0.6' + ], + d2to1=True, ) diff --git a/setup.sh b/setup.sh index 21b40f13b..580095000 100644 --- a/setup.sh +++ b/setup.sh @@ -17,14 +17,14 @@ LOGLVL=1 SERVICE_CONTENT_DIRECTORY=`cd $(dirname "$0") && pwd` -DJBLETS_ZIP_URL=https://github.com/tsufiev/djblets/archive PREREQ_PKGS="wget make git python-pip python-dev python-mysqldb libxml2-dev libxslt-dev unzip" SERVICE_SRV_NAME="murano-dashboard" GIT_CLONE_DIR=`echo $SERVICE_CONTENT_DIRECTORY | sed -e "s/$SERVICE_SRV_NAME//"` HORIZON_CONFIGS="/opt/stack/horizon/openstack_dashboard/settings.py,/usr/share/openstack-dashboard/openstack_dashboard/settings.py" +DJBLETS_ZIP_URL=https://github.com/tsufiev/djblets/archive # Functions -# Loger function +# Logger function log() { MSG=$1 @@ -77,7 +77,7 @@ modify_horizon_config() { exit fi else - log "\"$1\" already has our data, you can change it manualy and restart apache2 service" + log "\"$1\" already has our data, you can change it manually and restart apache2 service" fi else if [ -z $REMOVE ];then @@ -99,6 +99,8 @@ HORIZON_CONFIG['exceptions']['not_found'] = EXTENDED_NOT_FOUND_EXCEPTIONS HORIZON_CONFIG['exceptions']['unauthorized'] = EXTENDED_UNAUTHORIZED_EXCEPTIONS HORIZON_CONFIG['customization_module'] = 'muranodashboard.panel.overrides' INSTALLED_APPS += ('muranodashboard','djblets','djblets.datagrid','djblets.util','floppyforms',) +#if murano-api set up with ssl uncomment next strings +#MURANO_API_INSECURE = True #END_MURANO_DASHBOARD EOF if [ $? -ne 0 ];then @@ -157,7 +159,7 @@ CLONE_FROM_GIT=$1 # End clone from git section fi -# Setupping... +# Installing... log "Running setup.py" #MRN_CND_SPY=$GIT_CLONE_DIR/$SERVICE_SRV_NAME/setup.py MRN_CND_SPY=$SERVICE_CONTENT_DIRECTORY/setup.py @@ -231,15 +233,6 @@ preinst() dpkg -s $_PKG > /dev/null 2>&1 if [ $? -ne 0 ]; then log "Package \"$_PKG\" is not installed." - fi -# python-muranoclient - _PREREQ=python-muranoclient - pip freeze | grep $_PREREQ - if [ $? -ne 0 ]; then - log "\"$_PREREQ\" package not found, please install it first (\"https://github.com/stackforge/python-muranoclient\"), exiting!!!" - exit 1 - else - log "\"$_PREREQ\" found, doing next steps...." fi } diff --git a/tools/test-requires b/test-requirements.txt similarity index 52% rename from tools/test-requires rename to test-requirements.txt index c1da7cae2..0ee4aef3d 100644 --- a/tools/test-requires +++ b/test-requirements.txt @@ -14,5 +14,8 @@ pylint selenium # Docs Requirements -sphinx -docutils==0.9.1 # for bug 1091333, remove after sphinx >1.1.3 is released. +sphinx>=1.1.2 +docutils==0.9.1 +# for bug 1091333, remove after sphinx >1.1.3 is released. +# docutils installs Django 1.5.2 and it's unappropriated +Django>=1.4,<1.5 diff --git a/tools/install_venv.py b/tools/install_venv.py index 392cafd01..a4e622406 100644 --- a/tools/install_venv.py +++ b/tools/install_venv.py @@ -1,69 +1,75 @@ -# 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 -# not use this file except in compliance with the License. You may obtain -# a copy of the License at +# 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 +# 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. +# 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 subprocess +import ConfigParser import sys -import install_venv_common as install_venv +import install_venv_common as install_venv # flake8: noqa -def print_help(): +def print_help(project, venv, root): help = """ - Dashboard development environment setup is complete. + %(project)s development environment setup is complete. - Dashboard development uses virtualenv to track and manage Python dependencies - while in development and testing. + %(project)s development uses virtualenv to track and manage Python + dependencies while in development and testing. - To activate the Dashboard virtualenv for the extent of your current shell session - you can run: + To activate the %(project)s virtualenv for the extent of your current shell + session you can run: - $ source .venv/bin/activate + $ source %(venv)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 + $ %(root)s/tools/with_venv.sh - Also, make test will automatically use the virtualenv. """ - print help + print help % dict(project=project, venv=venv, root=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') - pip_requires = os.path.join(root, 'tools', 'pip-requires') - test_requires = os.path.join(root, 'tools', 'test-requires') + if os.environ.get('venv'): + venv = os.environ['venv'] + + test_requires = os.path.join(root, 'test-requirements.txt') + pip_requires = os.path.join(root, 'requirements.txt') + py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1]) - project = 'muranodashboard' - install = install_venv.InstallVenv(root, venv, pip_requires, test_requires, - py_version, project) + setup_cfg = ConfigParser.ConfigParser() + setup_cfg.read('setup.cfg') + project = setup_cfg.get('metadata', 'name') + + install = install_venv.InstallVenv(root, venv, pip_requires, + test_requires, py_version, project) options = install.parse_args(argv) install.check_python_version() install.check_dependencies() install.create_virtualenv(no_site_packages=options.no_site_packages) install.install_dependencies() install.post_process() - print_help() + print_help(project, venv, root) if __name__ == '__main__': main(sys.argv) diff --git a/tools/install_venv_common.py b/tools/install_venv_common.py index 1ea3b2dfb..27d09fda7 100644 --- a/tools/install_venv_common.py +++ b/tools/install_venv_common.py @@ -28,13 +28,12 @@ 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 @@ -70,11 +69,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() @@ -93,11 +94,6 @@ class InstallVenv(object): else: self.run_command(['virtualenv', '-q', self.venv]) print 'done.' - print 'Installing pip in venv...', - 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,20 +107,14 @@ class InstallVenv(object): print 'Installing dependencies with pip (this can take a while)...' # First things first, make sure our venv has the latest pip and - # distribute. - # NOTE: we keep pip at version 1.1 since the most recent version causes - # the .venv creation to fail. See: - # https://bugs.launchpad.net/nova/+bug/1047120 - self.pip_install('pip==1.1') - self.pip_install('distribute') + # setuptools + # change pip version to latest after bug with pytz will be resolved + # https://bugs.launchpad.net/pytz/+bug/1204837 + self.pip_install('pip==1.3.1') + self.pip_install('setuptools') - # Install greenlet by hand - just listing it in the requires file does - # not - # get it installed in the right order - self.pip_install('greenlet') - - self.pip_install('-r', self.test_requires) - self.pip_install('-r', self.pip_requires) + self.pip_install('-r', self.requirements) + self.pip_install('-r', self.test_requirements) def post_process(self): self.get_distro().post_process() diff --git a/tools/pip-requires b/tools/pip-requires deleted file mode 100644 index 77021caa1..000000000 --- a/tools/pip-requires +++ /dev/null @@ -1,12 +0,0 @@ -# Core Requirements -Django>=1.4,<1.5 -anyjson -#Fix for bug https://bugs.launchpad.net/python-keystoneclient/+bug/1116740 -requests==0.14.2 -bunch -iso8601>=0.1.4 -six -django-pipeline -django-floppyforms==1.1 -PyYAML -ordereddict diff --git a/tox.ini b/tox.ini index d01b9b762..6d4bd714f 100644 --- a/tox.ini +++ b/tox.ini @@ -8,9 +8,8 @@ setenv = VIRTUAL_ENV={envdir} NOSE_OPENSTACK_RED=0.05 NOSE_OPENSTACK_YELLOW=0.025 NOSE_OPENSTACK_SHOW_ELAPSED=1 -deps = -r{toxinidir}/tools/pip-requires - -r{toxinidir}/tools/test-requires -commands = +deps = -r{toxinidir}/requirements.txt + -r{toxinidir}/test-requirements.txt [testenv:pep8] deps = pep8==1.3.3 @@ -32,7 +31,8 @@ downloadcache = ~/cache/pip [flake8] # H301 one import per line # H302 import only modules -ignore = H301,H302,F403 +# H201 no 'except:' at least use 'except Exception:' +ignore = H301,H302,F403,H201 show-source = true builtins = _ exclude=.build,.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,tools