Add tools to build python wheels and wheel tarball

This update adds tools for building wheels for upstream python
modules, and generating a StarlingX wheels tarball.

Building upstream python modules is done within a docker container,
with a wheels.cfg configuration file that identifies the upstream
sources and expected python wheel output. The build-base-wheels.sh
tool will create the wheel builder image, launch it, and run the
build script.

The get-stx-wheels.sh tool will extract the python wheels built by
the StarlingX load.

The build-wheel-tarball.sh script will combine the wheels from the
base and StarlingX wheel sets into a single tarball that can be used
when building container images for StarlingX services.

Story: 2003907
Task: 27531
Change-Id: Icf6c63699a635d1173dcef9eb1d12ae7c4e39108
Signed-off-by: Don Penney <don.penney@windriver.com>
This commit is contained in:
Don Penney 2018-10-22 16:13:17 -04:00
parent 867323149e
commit 0ed04ca11c
6 changed files with 1110 additions and 0 deletions

View File

@ -0,0 +1,146 @@
#!/bin/bash
#
# Copyright (c) 2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# This utility sets up a docker image to build wheels
# for a set of upstream python modules.
#
# Required env vars
if [ -z "${MY_WORKSPACE}" -o -z "${MY_REPO}" ]; then
echo "Environment not setup for builds" >&2
exit 1
fi
DOCKER_PATH=${MY_REPO}/build-tools/build-wheels/docker
WHEELS_CFG=${DOCKER_PATH}/wheels.cfg
KEEP_IMAGE=no
KEEP_CONTAINER=no
OS=centos
OS_RELEASE=pike
function usage {
cat >&2 <<EOF
Usage:
$(basename $0) [ --os <os> ] [ --keep-image ] [ --keep-container ] [ --release <release> ]
Options:
--os: Specify base OS (eg. centos)
--keep-image: Skip deletion of the wheel build image in docker
--keep-container: Skip deletion of container used for the build
--release: Openstack release (default: pike)
EOF
}
OPTS=$(getopt -o h -l help,os:,keep-image,keep-container,release: -- "$@")
if [ $? -ne 0 ]; then
usage
exit 1
fi
eval set -- "${OPTS}"
while true; do
case $1 in
--)
# End of getopt arguments
shift
break
;;
--os)
OS=$2
shift 2
;;
--keep-image)
KEEP_IMAGE=yes
shift
;;
--keep-container)
KEEP_CONTAINER=yes
shift
;;
--release)
OS_RELEASE=$2
shift 2
;;
-h | --help )
usage
exit 1
;;
*)
usage
exit 1
;;
esac
done
BUILD_OUTPUT_PATH=${MY_WORKSPACE}/std/build-wheels-${OS}-${OS_RELEASE}/base
BUILD_IMAGE_NAME="${USER}-$(basename ${MY_WORKSPACE})-wheelbuilder:${OS}-${OS_RELEASE}"
DOCKER_FILE=${DOCKER_PATH}/${OS}-dockerfile
function supported_os_list {
for f in ${DOCKER_PATH}/*-dockerfile; do
echo $(basename ${f%-dockerfile})
done | xargs echo
}
if [ ! -f ${DOCKER_FILE} ]; then
echo "Unsupported OS specified: ${OS}" >&2
echo "Supported OS options: $(supported_os_list)" >&2
exit 1
fi
#
# Check build output directory for unexpected files,
# ie. wheels from old builds that are no longer in wheels.cfg
#
if [ -d ${BUILD_OUTPUT_PATH} ]; then
for f in ${BUILD_OUTPUT_PATH}/*; do
grep -q "^$(basename $f)|" ${WHEELS_CFG}
if [ $? -ne 0 ]; then
echo "Deleting stale file: $f"
rm -f $f
fi
done
else
mkdir -p ${BUILD_OUTPUT_PATH}
if [ $? -ne 0 ]; then
echo "Failed to create directory: ${BUILD_OUTPUT_PATH}" >&2
exit 1
fi
fi
# Create the builder image
docker build --build-arg OS_RELEASE=${OS_RELEASE} -t ${BUILD_IMAGE_NAME} -f ${DOCKER_PATH}/${OS}-dockerfile ${DOCKER_PATH}
if [ $? -ne 0 ]; then
echo "Failed to create build image in docker" >&2
exit 1
fi
# Run the image, executing the build-wheel.sh script
RM_OPT=
if [ "${KEEP_CONTAINER}" = "no" ]; then
RM_OPT="--rm"
fi
docker run ${RM_OPT} -v ${BUILD_OUTPUT_PATH}:/wheels -i -t ${BUILD_IMAGE_NAME} /docker-build-wheel.sh
if [ "${KEEP_IMAGE}" = "no" ]; then
# Delete the builder image
echo "Removing docker build image ${BUILD_IMAGE_NAME}"
docker image rm ${BUILD_IMAGE_NAME}
if [ $? -ne 0 ]; then
echo "Failed to delete build image from docker" >&2
fi
fi
# Check for failures
if [ -f ${BUILD_OUTPUT_PATH}/failed.lst ]; then
# Failures would already have been reported
exit 1
fi

View File

@ -0,0 +1,281 @@
#!/bin/bash
#
# Copyright (c) 2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# This utility builds the StarlingX wheel tarball
#
MY_SCRIPT_DIR=$(dirname $(readlink -f $0))
# Required env vars
if [ -z "${MY_WORKSPACE}" -o -z "${MY_REPO}" ]; then
echo "Environment not setup for builds" >&2
exit 1
fi
SUPPORTED_OS_ARGS=('centos')
function usage {
cat >&2 <<EOF
Usage:
$(basename $0) [ --os <os> ] [ --push ] [ --user <userid> ] [ --release <release> ]
Options:
--os: Specify base OS (valid options: ${SUPPORTED_OS_ARGS[@]})
--push: Push to docker repo
--user: Docker repo userid
--release: Openstack release (default: pike)
EOF
}
#
# Function to get an auth token from docker
#
function get_docker_token {
local auth_server="auth.docker.io"
local registry="registry.docker.io"
local scope="repository:${REPO_USER}/${IMAGE_NAME}:pull"
curl -k -sSL -X GET "https://${auth_server}/token?service=${registry}&scope=${scope}" \
| python -c '
import sys, yaml, json
y=yaml.load(sys.stdin.read())
print y["token"]
' 2>/dev/null
}
#
# Function to query docker for the highest current version
#
function get_current_version {
local registry_server="registry-1.docker.io"
local token=
token=$(get_docker_token)
curl -H "Authorization: Bearer ${token}" -k -sSL -X GET https://${registry_server}/v2/${REPO_USER}/${IMAGE_NAME}/tags/list \
| python -c '
import sys, yaml, json, re
y=yaml.load(sys.stdin.read())
print max([float(v) for v in filter(lambda x: re.search(r"\d+\.\d+", x), y["tags"])])
' 2>/dev/null
}
#
# Function to increment the image version above the current docker version
#
function increment_version {
local CUR_VERSION=
CUR_VERSION=$(get_current_version)
if [ -z "${CUR_VERSION}" ]; then
echo "0.1"
return
fi
echo "${CUR_VERSION}" | while IFS='.' read x y; do
let -i y++
echo "${x}.${y}"
done
}
OPTS=$(getopt -o h -l help,os:,push,user:,release: -- "$@")
if [ $? -ne 0 ]; then
usage
exit 1
fi
OS=centos
OS_RELEASE=pike
PUSH=no
REPO_USER=${USER}
# List of top-level services for images, which should not be listed in upper-constraints.txt
SKIP_CONSTRAINTS=(ceilometer cinder glance gnocchi heat horizon keystone neutron nova)
eval set -- "${OPTS}"
while true; do
case $1 in
--)
# End of getopt arguments
shift
break
;;
--os)
OS=$2
shift 2
;;
--push)
PUSH=yes
shift
;;
--user)
REPO_USER=$2
shift 2
;;
--release)
OS_RELEASE=$2
shift 2
;;
-h | --help )
usage
exit 1
;;
*)
usage
exit 1
;;
esac
done
# Validate the OS option
VALID_OS=1
for supported_os in ${SUPPORTED_OS_ARGS[@]}; do
if [ "$OS" = "${supported_os}" ]; then
VALID_OS=0
break
fi
done
if [ ${VALID_OS} -ne 0 ]; then
echo "Unsupported OS specified: ${OS}" >&2
echo "Supported OS options: ${SUPPORTED_OS_ARGS[@]}" >&2
exit 1
fi
# Build the base wheels and retrieve the StarlingX wheels
${MY_SCRIPT_DIR}/build-base-wheels.sh --os ${OS} --release ${OS_RELEASE}
if [ $? -ne 0 ]; then
echo "Failure running build-base-wheels.sh" >&2
exit 1
fi
${MY_SCRIPT_DIR}/get-stx-wheels.sh --os ${OS} --release ${OS_RELEASE}
if [ $? -ne 0 ]; then
echo "Failure running get-stx-wheels.sh" >&2
exit 1
fi
BUILD_OUTPUT_PATH=${MY_WORKSPACE}/std/build-wheels-${OS}-${OS_RELEASE}/tarball
if [ -d ${BUILD_OUTPUT_PATH} ]; then
# Wipe out the existing dir to ensure there are no stale files
rm -rf ${BUILD_OUTPUT_PATH}
fi
mkdir -p ${BUILD_OUTPUT_PATH}
cd ${BUILD_OUTPUT_PATH}
IMAGE_NAME=stx-${OS}-${OS_RELEASE}-wheels
TARBALL_FNAME=${MY_WORKSPACE}/std/build-wheels-${OS}-${OS_RELEASE}/${IMAGE_NAME}.tar
if [ -f ${TARBALL_FNAME} ]; then
rm -f ${TARBALL_FNAME}
fi
# Download the global-requirements.txt and upper-constraints.txt files
wget https://raw.githubusercontent.com/openstack/requirements/stable/${OS_RELEASE}/global-requirements.txt
if [ $? -ne 0 ]; then
echo "Failed to download global-requirements.txt" >&2
exit 1
fi
wget https://raw.githubusercontent.com/openstack/requirements/stable/${OS_RELEASE}/upper-constraints.txt
if [ $? -ne 0 ]; then
echo "Failed to download upper-constraints.txt" >&2
exit 1
fi
# Copy the base and stx wheels, updating upper-constraints.txt as necessary
for wheel in ../base/*.whl ../stx/wheels/*.whl; do
# Get the wheel name and version from the METADATA
METADATA=$(unzip -p ${wheel} '*/METADATA')
name=$(echo "${METADATA}" | grep '^Name:' | awk '{print $2}')
version=$(echo "${METADATA}" | grep '^Version:' | awk '{print $2}')
if [ -z "${name}" -o -z "${version}" ]; then
echo "Failed to parse name or version from $(readlink -f ${wheel})" >&2
exit 1
fi
echo "Adding ${name}-${version}..."
cp ${wheel} .
if [ $? -ne 0 ]; then
echo "Failed to copy $(readlink -f ${wheel})" >&2
exit 1
fi
# Update the upper-constraints file, if necessary
skip_constraint=1
for skip in ${SKIP_CONSTRAINTS[@]}; do
if [ "${name}" = "${skip}" ]; then
skip_constraint=0
continue
fi
done
if [ ${skip_constraint} -eq 0 ]; then
continue
fi
grep -q "^${name}===${version}\(;.*\)*$" upper-constraints.txt
if [ $? -eq 0 ]; then
# This version already exists in the upper-constraints.txt
continue
fi
grep -q "^${name}===" upper-constraints.txt
if [ $? -eq 0 ]; then
# Update the version
sed -i "s/^${name}===.*/${name}===${version}/" upper-constraints.txt
else
# Add the module
echo "${name}===${version}" >> upper-constraints.txt
fi
done
echo "Creating $(basename ${TARBALL_FNAME})..."
tar cf ${TARBALL_FNAME} *
if [ $? -ne 0 ]; then
echo "Failed to create the tarball" >&2
exit 1
fi
echo "Done."
if [ "${PUSH}" = "yes" ]; then
#
# Push generated wheels tarball to docker registry
#
VERSION=$(increment_version)
docker import ${TARBALL_FNAME} $REPO_USER/${IMAGE_NAME}:${VERSION}
if [ $? -ne 0 ]; then
echo "Failed command:" >&2
echo "docker import ${TARBALL_FNAME} $REPO_USER/${IMAGE_NAME}:${VERSION}" >&2
exit 1
fi
docker tag $REPO_USER/${IMAGE_NAME}:${VERSION} $REPO_USER/${IMAGE_NAME}:latest
if [ $? -ne 0 ]; then
echo "Failed command:" >&2
echo "docker tag $REPO_USER/${IMAGE_NAME}:${VERSION} $REPO_USER/${IMAGE_NAME}:latest" >&2
exit 1
fi
docker push $REPO_USER/${IMAGE_NAME}:${VERSION}
if [ $? -ne 0 ]; then
echo "Failed command:" >&2
echo "docker push $REPO_USER/${IMAGE_NAME}:${VERSION}" >&2
exit 1
fi
docker push $REPO_USER/${IMAGE_NAME}:latest
if [ $? -ne 0 ]; then
echo "Failed command:" >&2
echo "docker import ${TARBALL_FNAME} $REPO_USER/${IMAGE_NAME}:${VERSION}" >&2
exit 1
fi
fi
exit 0

View File

@ -0,0 +1,18 @@
FROM centos:7.5.1804
ARG OS_RELEASE=pike
# Install the necessary packages for building the python modules.
# Some of these are dependencies of the specific modules, and could
# instead be added to the wheels.cfg file in the future.
RUN yum install -y epel-release centos-release-openstack-queens ;\
yum install -y git gcc zip bzip2 unzip \
python python-devel python-pip python-wheel \
wget openldap-devel mariadb mariadb-devel \
libvirt libvirt-devel liberasurecode-devel nss-devel \
systemd-devel ;\
pip install --upgrade pip setuptools
COPY docker-build-wheel.sh /
COPY ${OS_RELEASE}-wheels.cfg /wheels.cfg

View File

@ -0,0 +1,301 @@
#!/bin/bash
#
# Copyright (c) 2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# This utility builds a set of python wheels for upstream packages,
# reading a source list from wheels.cfg
#
CFGFILE=/wheels.cfg
OUTPUTDIR=/wheels
FAILED_LOG=$OUTPUTDIR/failed.lst
#
# Function to log the start of a build
#
function startlog {
cat <<EOF
############################################################
Building $1
############################################################
EOF
}
#
# Function to find the line number for the first import
function first_import_line {
grep -nE '^(from|import)' setup.py \
| grep -v __future__ \
| head -1 \
| sed 's/:.*//'
}
#
# Function to update the python module to use setuptools.setup,
# in order to support building the wheel.
# This function is only called if fix_setup is specified for the
# module in wheels.cfg
#
function fix_setup {
echo "########### Running fix_setup"
# bugtrack_url is not supported by setuptools.setup
grep -q '^[[:space:]]*bugtrack_url=' setup.py
if [ $? -eq 0 ]; then
sed -i '/^[[:space:]]*bugtrack_url=/d' setup.py
fi
# If setuptools.setup is already being imported, nothing to do.
grep -q '^from setuptools import setup' setup.py
if [ $? -eq 0 ]; then
return
fi
# Look for various ways distutils.core.setup is being imported,
# and replace it with setuptools.setup, inserting the new import
# ahead of the first existing import.
grep -q '^from distutils.core import .*setup,' setup.py
if [ $? -eq 0 ]; then
cp setup.py setup.py.orig
sed -i 's/^\(from distutils.core import .*\)setup,/\1/' setup.py
line=$(first_import_line)
sed -i "${line}i from setuptools import setup" setup.py
return
fi
grep -q '^from distutils.core import setup' setup.py
if [ $? -eq 0 ]; then
cp setup.py setup.py.orig
line=$(first_import_line)
sed -i '/^from distutils.core import setup/d' setup.py
sed -i "${line}i from setuptools import setup" setup.py
return
fi
grep -q '^from distutils.core import .*setup' setup.py
if [ $? -eq 0 ]; then
cp setup.py setup.py.orig
line=$(first_import_line)
sed -i 's/^\(from distutils.core import .*\), setup/\1/' setup.py
sed -i "${line}i from setuptools import setup" setup.py
return
fi
grep -q '^import distutils.core as duc' setup.py
if [ $? -eq 0 ]; then
cp setup.py setup.py.orig
line=$(first_import_line)
sed -i "${line}i from setuptools import setup" setup.py
sed -i 's/duc.setup/setup/' setup.py
return
fi
# Insert it
cp setup.py setup.py.orig
line=$(first_import_line)
sed -i 's/^\(from distutils.core import .*\), setup/\1/' setup.py
sed -i "${line}i from setuptools import setup" setup.py
}
#
# Function to use git to clone the module source and build a wheel.
#
function from_git {
sed 's/#.*//' $CFGFILE | awk -F '|' '$2 == "git" { print $0; }' | \
while IFS='|' read wheelname stype gitrepo basedir branch fix; do
startlog $wheelname
if [ -f $OUTPUTDIR/$wheelname ]; then
echo "$wheelname already exists"
continue
fi
git clone $gitrepo
if [ $? -ne 0 ]; then
echo "Failure running: git clone $gitrepo"
echo $wheelname >> $FAILED_LOG
continue
fi
pushd $basedir
if [ $? -ne 0 ]; then
echo "Failure running: pushd $basedir"
echo $wheelname >> $FAILED_LOG
continue
fi
git checkout $branch
if [ $? -ne 0 ]; then
echo "Failure running: git checkout $branch"
echo $wheelname >> $FAILED_LOG
continue
fi
if [ "$fix" == "fix_setup" ]; then
fix_setup
fi
# Build the wheel
python setup.py bdist_wheel
cp dist/$wheelname $OUTPUTDIR || echo $wheelname >> $FAILED_LOG
popd
done
}
#
# Function to download a source tarball and build a wheel.
#
function from_tar {
sed 's/#.*//' $CFGFILE | awk -F '|' '$2 == "tar" { print $0; }' | \
while IFS='|' read wheelname stype wgetsrc basedir fix; do
startlog $wheelname
if [ -f $OUTPUTDIR/$wheelname ]; then
echo "$wheelname already exists"
continue
fi
tarball=$(basename $wgetsrc)
if [[ $tarball =~ gz$ ]]; then
taropts="xzf"
elif [[ $tarball =~ bz2$ ]]; then
taropts="xjf"
else
taropts="xf"
fi
wget $wgetsrc
if [ $? -ne 0 ]; then
echo "Failure running: wget $wgetsrc"
echo $wheelname >> $FAILED_LOG
continue
fi
tar $taropts $(basename $wgetsrc)
if [ $? -ne 0 ]; then
echo "Failure running: tar $taropts $(basename $wgetsrc)"
echo $wheelname >> $FAILED_LOG
continue
fi
pushd $basedir
if [ $? -ne 0 ]; then
echo "Failure running: pushd $basedir"
echo $wheelname >> $FAILED_LOG
continue
fi
if [ "$fix" == "fix_setup" ]; then
fix_setup
fi
# Build the wheel
python setup.py bdist_wheel
cp dist/$wheelname $OUTPUTDIR || echo $wheelname >> $FAILED_LOG
popd
done
}
#
# Function to download a source zip file and build a wheel.
#
function from_zip {
sed 's/#.*//' $CFGFILE | awk -F '|' '$2 == "zip" { print $0; }' | \
while IFS='|' read wheelname stype wgetsrc basedir fix; do
startlog $wheelname
if [ -f $OUTPUTDIR/$wheelname ]; then
echo "$wheelname already exists"
continue
fi
wget $wgetsrc
if [ $? -ne 0 ]; then
echo "Failure running: wget $wgetsrc"
echo $wheelname >> $FAILED_LOG
continue
fi
unzip $(basename $wgetsrc)
if [ $? -ne 0 ]; then
echo "Failure running: unzip $(basename $wgetsrc)"
echo $wheelname >> $FAILED_LOG
continue
fi
pushd $basedir
if [ $? -ne 0 ]; then
echo "Failure running: pushd $basedir"
echo $wheelname >> $FAILED_LOG
continue
fi
if [ "$fix" == "fix_setup" ]; then
fix_setup
fi
# Build the wheel
python setup.py bdist_wheel
cp dist/$wheelname $OUTPUTDIR || echo $wheelname >> $FAILED_LOG
popd
done
}
#
# Function to download an existing wheel from pypi.
#
function from_pypi {
sed 's/#.*//' $CFGFILE | awk -F '|' '$2 == "pypi" { print $0; }' | \
while IFS='|' read wheelname stype wgetsrc; do
startlog $wheelname
if [ -f $OUTPUTDIR/$wheelname ]; then
echo "$wheelname already exists"
continue
fi
wget $wgetsrc
if [ $? -ne 0 ]; then
echo "Failure running: wget $wgetsrc"
echo $wheelname >> $FAILED_LOG
continue
fi
cp $wheelname $OUTPUTDIR || echo $wheelname >> $FAILED_LOG
done
}
rm -f $FAILED_LOG
mkdir -p /build-wheels
cd /build-wheels
from_git
from_tar
from_zip
from_pypi
if [ -f $FAILED_LOG ]; then
let -i failures=$(cat $FAILED_LOG | wc -l)
cat <<EOF
############################################################
The following module(s) failed to build:
$(cat $FAILED_LOG)
Summary:
${failures} build failure(s).
EOF
exit 1
fi
cat <<EOF
############################################################
All wheels have been successfully built.
EOF
exit 0

View File

@ -0,0 +1,229 @@
#
# git: wheelname|git|git-source|basedir|branch
# tar: wheelname|tar|wget-source|basedir
# pypi: wheelname|pypi|wget-source
# zip: wheelname|zip|wget-source|basedir
#
# If fix_setup must be called, add |fix_setup at the end of the line
#
abclient-0.2.3-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/49/eb/091b02c1e36d68927adfb746706e2c80f7e7bfb3f16e3cbcfec2632118ab/abclient-0.2.3.tar.gz|abclient-0.2.3
alembic-0.9.3-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/90/4a/a783832723ea876232e4f9aa0034ad3c80d3fa22c5b5f320a6fe20e4ac8c/alembic-0.9.3.tar.gz|alembic-0.9.3
amqplib-1.0.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/75/b7/8c2429bf8d92354a0118614f9a4d15e53bc69ebedce534284111de5a0102/amqplib-1.0.2.tgz|amqplib-1.0.2
aniso8601-1.2.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/61/f3/74a5a8affb192863f5f6aa3dfb0059a97442ff683d44fcc842b509758129/aniso8601-1.2.1.tar.gz|aniso8601-1.2.1
anyjson-0.3.3-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/c3/4d/d4089e1a3dd25b46bebdb55a992b0797cff657b4477bc32ce28038fdecbc/anyjson-0.3.3.tar.gz|anyjson-0.3.3
backports.ssl_match_hostname-3.5.0.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/76/21/2dc61178a2038a5cb35d14b61467c6ac632791ed05131dda72c20e7b9e23/backports.ssl_match_hostname-3.5.0.1.tar.gz|backports.ssl_match_hostname-3.5.0.1|fix_setup
bottle-0.12.13-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/bd/99/04dc59ced52a8261ee0f965a8968717a255ea84a36013e527944dbf3468c/bottle-0.12.13.tar.gz|bottle-0.12.13
cassandra_driver-3.11.0-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/5a/96/a5b2458a0483d3cefdf13064d40119754c1552ea34b7f0e8c6e03e66eb0a/cassandra-driver-3.11.0.tar.gz|cassandra-driver-3.11.0
ceilometermiddleware-1.1.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/28/0a/90eb56515577f3b775290181ffcc5139d74d45e34860264de5f5fea148ed/ceilometermiddleware-1.1.0-py2-none-any.whl
Cheetah-2.4.4-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/cd/b0/c2d700252fc251e91c08639ff41a8a5203b627f4e0a2ae18a6b662ab32ea/Cheetah-2.4.4.tar.gz|Cheetah-2.4.4
click_repl-0.1.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/33/fe/c016964a64031b440d4ba9d02375931dedc8b2a3f9049cc1da5529424ee1/click-repl-0.1.2.tar.gz|click-repl-0.1.2
click_spinner-0.1.7-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/26/54/3fa581d2c510386b7a2e22bdd6cc8978ba0ee83fb2762c238cc7ac382f96/click-spinner-0.1.7.tar.gz|click-spinner-0.1.7
cliff_tablib-2.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/03/5e/5ee87834f3a77e6ca7a9d2009bb2214239ded4e5933ba3c6bd68340d053e/cliff-tablib-2.0.tar.gz|cliff-tablib-2.0
cmd2-0.7.5-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/99/18/0bfe8240ffaebd28b1bce5a48170404e32bc1de6e640c8e7f37f1e522edb/cmd2-0.7.5.tar.gz|cmd2-0.7.5
configparser-3.5.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/7c/69/c2ce7e91c89dc073eb1aa74c0621c3eefbffe8216b3f9af9d3885265c01c/configparser-3.5.0.tar.gz|configparser-3.5.0
construct-2.8.12-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/b5/78/3a49752baea1578019384a873adbec5782ab13ea71d066781a0c9c5d1e38/construct-2.8.12.tar.gz|construct-2.8.12
crc16-0.1.1-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/a6/e0/70a44c4385f2b33df82e518005aae16b5c1feaf082c73c0acebe3426fc0a/crc16-0.1.1.tar.gz|crc16-0.1.1|fix_setup
croniter-0.3.17-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/7d/55/e8fff5a04207aaf17bc98a1c25205e6f746cd5b47fa0ace7d1135956a8df/croniter-0.3.17.tar.gz|croniter-0.3.17
daiquiri-1.2.1-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/c8/4b/4ab3a9bac4d5f112c5a8150b3bf925dad82cef3c102fc70ba357c982fe88/daiquiri-1.2.1.tar.gz|daiquiri-1.2.1
demjson-2.2.4-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/96/67/6db789e2533158963d4af689f961b644ddd9200615b8ce92d6cad695c65a/demjson-2.2.4.tar.gz|demjson-2.2.4|fix_setup
deprecation-1.0.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/8c/e3/e5c66eba8fa2fd567065fa70ada98b990f449f74fb812b408fa7aafe82c9/deprecation-1.0.1.tar.gz|deprecation-1.0.1
django_floppyforms-1.7.0-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/8c/18/30a9137c7ae279a27ccdeb10f6fe8be18ee98551d01ec030b6cfe8b2d2e2/django-floppyforms-1.7.0.tar.gz|django-floppyforms-1.7.0
django_pyscss-2.0.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/4b/7f/d771802305184aac6010826f60a0b2ecaa3f57d19ab0e405f0c8db07e809/django-pyscss-2.0.2.tar.gz|django-pyscss-2.0.2
docopt-0.6.2-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz|docopt-0.6.2
dogpile.cache-0.6.4-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/b6/3d/35c05ca01c070bb70d9d422f2c4858ecb021b05b21af438fec5ccd7b945c/dogpile.cache-0.6.4.tar.gz|dogpile.cache-0.6.4
dulwich-0.17.3-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/d8/a9/6892b6ec7695b799b9730f633e9a2cbe854af0c5df1e75980e3a934ac3bc/dulwich-0.17.3.tar.gz|dulwich-0.17.3
enum_compat-0.0.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/95/6e/26bdcba28b66126f66cf3e4cd03bcd63f7ae330d29ee68b1f6b623550bfa/enum-compat-0.0.2.tar.gz|enum-compat-0.0.2
etcd3-0.6.2-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/25/91/fbda28c16739438da1648f8a5a486c638ac156c62979361f8974504cd57c/etcd3-0.6.2.tar.gz|etcd3-0.6.2
et_xmlfile-1.0.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/22/28/a99c42aea746e18382ad9fb36f64c1c1f04216f41797f2f0fa567da11388/et_xmlfile-1.0.1.tar.gz|et_xmlfile-1.0.1
exabgp-4.0.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/22/21/e4db9da8f4b73effb984c8c2a12708c4738e600a0a755201cb45840bc5d6/exabgp-4.0.2.tar.gz|exabgp-4.0.2
flask_keystone-0.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/1f/ca/3938de8c5f4a3d1c5dd4278bedb9d31d79816feba4d088293c620a366fb1/flask_keystone-0.2.tar.gz|flask_keystone-0.2
flask_oslolog-0.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/a7/62/fec02ce761b548b1289680bb1be1aa0bce2b2c4017d5b31bd6c67c78aef9/flask_oslolog-0.1.tar.gz|flask_oslolog-0.1
fortiosclient-0.0.2-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/36/16/ac5561bcb18725dd1a4a6e20205a6002904a0a5897b24ac3696e44a1c6fe/fortiosclient-0.0.2.tar.gz|fortiosclient-0.0.2
frozendict-1.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/4e/55/a12ded2c426a4d2bee73f88304c9c08ebbdbadb82569ebdd6a0c007cfd08/frozendict-1.2.tar.gz|frozendict-1.2
funcparserlib-0.3.6-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/cb/f7/b4a59c3ccf67c0082546eaeb454da1a6610e924d2e7a2a21f337ecae7b40/funcparserlib-0.3.6.tar.gz|funcparserlib-0.3.6
functools32-3.2.3.post2-py2-none-any.whl|git|https://github.com/MiCHiLU/python-functools32|python-functools32|3.2.3-2|fix_setup
future-0.16.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/00/2b/8d082ddfed935f3608cc61140df6dcbf0edea1bc3ab52fb6c29ae3e81e85/future-0.16.0.tar.gz|future-0.16.0
google_api_python_client-1.6.2-py2.py3-none-any.whl|pypi|https://files.pythonhosted.org/packages/08/85/e43f6d6cb7ea69b580cf2499ed91ea7a6c6eda5c2081305039d088957400/google_api_python_client-1.6.2-py2.py3-none-any.whl
happybase-1.1.0-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/8d/a4/9c1202ad4276d4e845594d534397c07082b90aee68c67f378fac38629e6f/happybase-1.1.0.tar.gz|happybase-1.1.0
heat_translator-0.9.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/7e/97/9d4facc3504d4a09dd0bf3df524823a1ba1038e80806e5eb9700ada83d3e/heat_translator-0.9.0-py2-none-any.whl
hiredis-0.2.0-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/1b/98/4766d85124b785ff1989ee1c79631a1b6ecfcb444ff39999a87877b2027e/hiredis-0.2.0.tar.gz|hiredis-0.2.0
httplib2-0.10.3-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/e4/2e/a7e27d2c36076efeb8c0e519758968b20389adf57a9ce3af139891af2696/httplib2-0.10.3.tar.gz|httplib2-0.10.3
instack_undercloud-7.4.14-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/87/9f/ada44ccb4477a2bfae942c51aae26becd32501578c138e8b754d032de541/instack_undercloud-7.4.14-py2-none-any.whl
ironic_lib-2.10.1-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/26/4c/55e778fcf3838874ac44abad1920f0a123920e30d719b2a873ead6884f58/ironic_lib-2.10.1-py2-none-any.whl
itsdangerous-0.24-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz|itsdangerous-0.24
jaeger_client-3.10.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/ee/1d/66cfa8ef438980e523c7ca3ed98c1b865b4e18df4167f32133ae3053c86c/jaeger-client-3.10.0.tar.gz|jaeger-client-3.10.0
jdcal-1.3-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/9b/fa/40beb2aa43a13f740dd5be367a10a03270043787833409c61b79e69f1dfd/jdcal-1.3.tar.gz|jdcal-1.3
jsonpath_rw-1.4.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/71/7c/45001b1f19af8c4478489fbae4fc657b21c4c669d7a5a036a86882581d85/jsonpath-rw-1.4.0.tar.gz|jsonpath-rw-1.4.0
krest-1.3.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/fb/d2/9dbbd3a76f2385041720a0eb51ddab676e688fa8bee8a1489470839616cf/krest-1.3.1.tar.gz|krest-1.3.1
#libvirt_python-4.4.0-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/2b/8d/1160cf34dc3d296896eb5c8f4944439ea368b87d2d2431f58d08d6bdf374/libvirt-python-4.4.0.tar.gz|libvirt-python-4.4.0|fix_setup
logutils-0.3.5-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/49/b2/b57450889bf73da26027f8b995fd5fbfab258ec24ef967e4c1892f7cb121/logutils-0.3.5.tar.gz|logutils-0.3.5|fix_setup
lz4-0.9.0-cp27-none-linux_x86_64.whl|git|https://github.com/python-lz4/python-lz4|python-lz4|v0.9.0
Mako-1.0.7-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/eb/f3/67579bb486517c0d49547f9697e36582cd19dafb5df9e687ed8e22de57fa/Mako-1.0.7.tar.gz|Mako-1.0.7
marathon-0.9.0-py2.py3-none-any.whl|pypi|https://files.pythonhosted.org/packages/09/f5/6b720d0206e38aa46d6e8cf85d85349887946129ae1613e5fbd6322e9506/marathon-0.9.0-py2.py3-none-any.whl
MarkupSafe-1.0-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz|MarkupSafe-1.0
mistral_lib-0.3.3-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/c0/c7/8fe02116323176c96d05f5579f194c51c367e1d9c027ef6a1756a2072913/mistral_lib-0.3.3-py2-none-any.whl
mox-0.5.3-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/0c/a1/64740c638cc5fae807022368f4141700518ee343b53eb3e90bf3cc15a4d4/mox-0.5.3.tar.gz|mox-0.5.3|fix_setup
mpmath-0.19-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/74/39/08b1b5c9848b498f922c7c92d31bb6edf00fe5a3bd87b04ebe1cc1d63948/mpmath-0.19.tar.gz|mpmath-0.19|fix_setup
msgpack_python-0.4.8-cp27-none-linux_x86_64.whl|git|https://github.com/msgpack/msgpack-python.git|msgpack-python|0.4.8
munch-2.2.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/92/58/c17cf679a2b9b65541cc71ba13a950289b7d34dd0967e34b8816a4d87044/munch-2.2.0.tar.gz|munch-2.2.0
MySQL_python-1.2.5-cp27-none-linux_x86_64.whl|git|https://github.com/farcepest/MySQLdb1.git|MySQLdb1|MySQLdb-1.2.5
ndg_httpsclient-0.4.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/a2/a7/ad1c1c48e35dc7545dab1a9c5513f49d5fa3b5015627200d2be27576c2a0/ndg_httpsclient-0.4.2.tar.gz|ndg_httpsclient-0.4.2
netifaces-0.10.6-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/72/01/ba076082628901bca750bf53b322a8ff10c1d757dc29196a8e6082711c9d/netifaces-0.10.6.tar.gz|netifaces-0.10.6
netmiko-1.4.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/d5/3f/8da410e8474c50a31265165f5197b3aad170560b1947970d375e72b1572f/netmiko-1.4.2.tar.gz|netmiko-1.4.2
networkx-1.11-py2.py3-none-any.whl|pypi|https://files.pythonhosted.org/packages/d3/2c/e473e54afc9fae58dfa97066ef6709a7e35a1dd1c28c5a3842989322be00/networkx-1.11-py2.py3-none-any.whl
neutron_lib-1.18.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/1d/62/347baad0aaf1ee1e62d0d5b54bae3d442da8813dba083e133b0143afc63f/neutron-lib-1.18.0.tar.gz|neutron-lib-1.18.0
nodeenv-1.1.4-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/f9/7e/499dc78da542865f9f3d91e8b660883eb6a55fb40a10aa9407af0be66242/nodeenv-1.1.4.tar.gz|nodeenv-1.1.4
nose_exclude-0.5.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/63/cf/90c4be56bf11b7bc8801086d9445baf731aa36b8e8fc5791731e8e604dcd/nose-exclude-0.5.0.tar.gz|nose-exclude-0.5.0
nosehtmloutput-0.0.5-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/0c/f7/6cb16c0b233d3f2d62be38ddb7d7c1bc967188c41575ecf0312e6575730d/nosehtmloutput-0.0.5.tar.gz|nosehtmloutput-0.0.5
oauthlib-2.0.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/fa/2e/25f25e6c69d97cf921f0a8f7d520e0ef336dd3deca0142c0b634b0236a90/oauthlib-2.0.2.tar.gz|oauthlib-2.0.2
odfpy-1.3.5-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/9d/32/1428fe19eba9e3ebedd00194ecb2c7261d7114aa72c9aed019097b746066/odfpy-1.3.5.tar.gz|odfpy-1.3.5
olefile-0.44-py2-none-any.whl|zip|https://files.pythonhosted.org/packages/35/17/c15d41d5a8f8b98cc3df25eb00c5cee76193114c78e5674df6ef4ac92647/olefile-0.44.zip|olefile-0.44|fix_setup
openpyxl-2.4.8-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/b7/b5/7478e4ac88daa2e43d613a040bd392b6a692a2fd9d4d29f7a8b463808185/openpyxl-2.4.8.tar.gz|openpyxl-2.4.8
openshift-0.6.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/6a/b3/319b8baacab75d8f21d3104344d8bc9b84bd7f97c9dc15c2cd0d1bdce718/openshift-0.6.2.tar.gz|openshift-0.6.2
openstack.nose_plugin-0.11-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/bc/83/e7c9b9297e1a501d2c2617f98d6176199570e8ee32f0e72669c8852c6c81/openstack.nose_plugin-0.11.tar.gz|openstack.nose_plugin-0.11
opentracing-1.3.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/06/c2/90b35a1abdc639a5c6000d8202c70217d60e80f5b328870efb73fda71115/opentracing-1.3.0.tar.gz|opentracing-1.3.0
ordereddict-1.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/53/25/ef88e8e45db141faa9598fbf7ad0062df8f50f881a36ed6a0073e1572126/ordereddict-1.1.tar.gz|ordereddict-1.1|fix_setup
os_brick-1.15.6-py2.py3-none-any.whl|pypi|https://files.pythonhosted.org/packages/53/79/bc1a78476f03747920ef2dc371dfea7dfc3ef918a34ef117aac9b787831c/os_brick-1.15.6-py2.py3-none-any.whl
osc_lib-1.7.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/81/5e/e9e84852731bcdffad63d491ded63dda038104a2d942e6d6e316ac5a6bf1/osc_lib-1.7.0-py2-none-any.whl
os_collect_config-7.2.2-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/63/bd/7fa7c575a9ad6b1ea2d30e21749737267d9951e16a7fecde218809948d2a/os_collect_config-7.2.2-py2-none-any.whl
osc_placement-1.3.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/75/89/0e4aeac5897d7e927742b5881656040689517b1a1014eab3138fb5dd53b1/osc-placement-1.3.0.tar.gz|osc-placement-1.3.0
os_net_config-7.3.8-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/f5/f0/17c140a29b5100db11cc186095aa48a90b3ab659844992cfbb5224f75704/os_net_config-7.3.8-py2-none-any.whl
osprofiler-1.11.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/80/46/395e951f6c5797f8a320e5df7a8217118b20ccf47441ae29c97b377ffd6c/osprofiler-1.11.0-py2-none-any.whl
os_service_types-1.0.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/44/b3/8d03e393fea829f654f737e740059b5f528ecbb991efba1859fa7133ae5e/os_service_types-1.0.0-py2-none-any.whl
os_vif-1.7.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/74/66/c2727e4bb7302029d2406065233c3069176edef803be721c3ccf44a0f9ed/os_vif-1.7.0-py2-none-any.whl
ovs-2.7.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/8a/14/c0cf1101406f24de2b72fd239ae638c489674d856c8d6dda41da2daa55ba/ovs-2.7.0.tar.gz|ovs-2.7.0
pathlib-1.0.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/ac/aa/9b065a76b9af472437a0059f77e8f962fe350438b927cb80184c32f075eb/pathlib-1.0.1.tar.gz|pathlib-1.0.1|fix_setup
pifpaf-1.9.2-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/38/4d/0e594192743aa7184051119951431e15e989cc222428d5a4856c528f57db/pifpaf-1.9.2.tar.gz|pifpaf-1.9.2
pika_pool-0.1.3-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/ec/48/50c8f02a3eef4cb824bec50661ec1713040402cc1b2a38954dc977a59c23/pika-pool-0.1.3.tar.gz|pika-pool-0.1.3
Pint-0.8.1-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/1e/40/6938f7d544eef208a8183c2c80624289e8a4f4e0aea43f4658b9527077de/Pint-0.8.1.tar.gz|Pint-0.8.1
ply-3.10-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/ce/3d/1f9ca69192025046f02a02ffc61bfbac2731aab06325a218370fd93e18df/ply-3.10.tar.gz|ply-3.10
positional-1.1.2-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/8c/16/64a4fa0967c486380468dca18867d22ac1c17bba06349e31ace77c7757f7/positional-1.1.2.tar.gz|positional-1.1.2
prettytable-0.7.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/e0/a1/36203205f77ccf98f3c6cf17cf068c972e6458d7e58509ca66da949ca347/prettytable-0.7.2.tar.gz|prettytable-0.7.2
proboscis-1.2.6.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/3c/c8/c187818ab8d0faecdc3c16c1e0b2e522f3b38570f0fb91dcae21662019d0/proboscis-1.2.6.0.tar.gz|proboscis-1.2.6.0
psutil-5.2.2-cp27-none-linux_x86_64.whl|git|https://github.com/giampaolo/psutil|psutil|release-5.2.2
PuLP-1.6.8-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/b5/87/71293d89377341551f2f331d259c0b7e7324b60ce37c597d0a42f0ebc18d/PuLP-1.6.8.tar.gz|PuLP-1.6.8
pycadf-2.6.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/59/95/9e12d47ce915d219d76af7a21095cb1f1f6bec2187abd4ea6c6ff066ff0a/pycadf-2.6.0-py2-none-any.whl
pycparser-2.18-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/8c/2d/aad7f16146f4197a11f8e91fb81df177adcc2073d36a17b1491fd09df6ed/pycparser-2.18.tar.gz|pycparser-2.18
pycrypto-2.6.1-cp27-none-linux_x86_64.whl|git|https://github.com/dlitz/pycrypto|pycrypto|v2.6.1|fix_setup
pycryptodome-3.4.6-cp27-none-linux_x86_64.whl|git|https://github.com/Legrandin/pycryptodome|pycryptodome|v3.4.6
pydot3-1.0.9-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/bb/49/7cb19ec1b3a984ee12f9fbb4ecb990bf9a197a2a69351f51c312e3ce2eb0/pydot3-1.0.9.tar.gz|pydot3-1.0.9
pydotplus-2.0.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/60/bf/62567830b700d9f6930e9ab6831d6ba256f7b0b730acb37278b0ccdffacf/pydotplus-2.0.2.tar.gz|pydotplus-2.0.2
pyeclib-1.5.0-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/e3/02/2814399e18c10f0ea6912bf7e7ce5e20c9482b4b5fae9f756c72c97cc144/pyeclib-1.5.0.tar.gz|pyeclib-1.5.0|fix_setup
pyinotify-0.9.6-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/e3/c0/fd5b18dde17c1249658521f69598f3252f11d9d7a980c5be8619970646e1/pyinotify-0.9.6.tar.gz|pyinotify-0.9.6
pykafka-2.6.0-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/b1/45/cbcf9eb496a47b45da661e016a5e68efb2239e09686ef48da3ccab4332eb/pykafka-2.6.0.tar.gz|pykafka-2.6.0
pykerberos-1.1.14-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/bf/64/dd86215662d7df0f4f35632849e3576646fe29416deb7766ee00e09bdad3/pykerberos-1.1.14.tar.gz|pykerberos-1.1.14
PyKMIP-0.6.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/6f/25/1ef48cd6a1aa926b454676c196d564ff4d37998366f53a3632cf004042f5/PyKMIP-0.6.0.tar.gz|PyKMIP-0.6.0
pyldap-2.4.37-cp27-none-linux_x86_64.whl|git|https://github.com/pyldap/pyldap.git|pyldap|pyldap-2.4.37
pylxd-2.2.4-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/74/4e/8874500407e457d400a80c8b99682e25ea7e9ff9c2109bff831874c45f2f/pylxd-2.2.4.tar.gz|pylxd-2.2.4
pyngus-2.2.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/9d/57/85aeeb73033b352d075ed5963c13bb48e46f5f0a8c55a3eff36ee8d800d8/pyngus-2.2.1.tar.gz|pyngus-2.2.1
pyperclip-1.5.27-py2-none-any.whl|zip|https://files.pythonhosted.org/packages/7b/a5/48eaa1f2d77f900679e9759d2c9ab44895e66e9612f7f6b5333273b68f29/pyperclip-1.5.27.zip|pyperclip-1.5.27
pyroute2-0.4.21-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/41/c5/2a42f2e0eab9178260f18e32549ad4634e61b4c1305b5654a55933b05a71/pyroute2-0.4.21.tar.gz|pyroute2-0.4.21|fix_setup
pysaml2-4.0.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/45/70/ee525fdedf7c4b2a7f6209689f9448f039a5c838c7d096b863158dc3432f/pysaml2-4.0.2.tar.gz|pysaml2-4.0.2
pyScss-1.3.4-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/1d/4a/221ae7561c8f51c4f28b2b172366ccd0820b14bb947350df82428dfce381/pyScss-1.3.4.tar.gz|pyScss-1.3.4
pysendfile-2.0.1-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/cd/3f/4aa268afd0252f06b3b487c296a066a01ddd4222a46b7a3748599c8fc8c3/pysendfile-2.0.1.tar.gz|pysendfile-2.0.1
pystache-0.5.4-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/d6/fd/eb8c212053addd941cc90baac307c00ac246ac3fce7166b86434c6eae963/pystache-0.5.4.tar.gz|pystache-0.5.4
python_barbicanclient-4.5.3-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/c8/ff/a742fa76028e98a5f4ff0bf6311c41c1a6eb5e1a49480658d715d139e9ad/python_barbicanclient-4.5.3-py2-none-any.whl
python_blazarclient-2.0.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/0d/e7/771352cad8d2749b5bef43c0303936a0b1d8e89ce7f1823c8589387b5d24/python-blazarclient-2.0.0.tar.gz|python-blazarclient-2.0.0
python_congressclient-1.8.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/64/06/9a891cfddc125fbe23e9fb7c373ab555bb41709cf150e189473ed243c503/python_congressclient-1.8.0-py2-none-any.whl
python_consul-0.7.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/82/01/0480ca4f42425cda93e4079b86852474dac4dde0ecacd263b9834f00c258/python-consul-0.7.0.tar.gz|python-consul-0.7.0
python_editor-1.0.3-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/65/1e/adf6e000ea5dc909aa420352d6ba37f16434c8a3c2fa030445411a1ed545/python-editor-1.0.3.tar.gz|python-editor-1.0.3
python_etcd-0.4.5-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/a1/da/616a4d073642da5dd432e5289b7c1cb0963cc5dde23d1ecb8d726821ab41/python-etcd-0.4.5.tar.gz|python-etcd-0.4.5
python_ironic_inspector_client-2.1.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/e0/9d/8d5f13a04dd703da86f28136d0270c69863d22fc318d450312c5557825c8/python_ironic_inspector_client-2.1.0-py2-none-any.whl
python_ldap-3.1.0-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/7f/1c/28d721dff2fcd2fef9d55b40df63a00be26ec8a11e8c6fc612ae642f9cfd/python-ldap-3.1.0.tar.gz|python-ldap-3.1.0
python_masakariclient-3.0.1-py2.py3-none-any.whl|pypi|https://files.pythonhosted.org/packages/8a/e7/761c08966072f45d1e61b1d808a78d801f260b637ee14baa0dc65aa39b16/python_masakariclient-3.0.1-py2.py3-none-any.whl
python_memcached-1.58-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/f7/62/14b2448cfb04427366f24104c9da97cf8ea380d7258a3233f066a951a8d8/python-memcached-1.58.tar.gz|python-memcached-1.58
python_mistralclient-3.1.4-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/86/de/4ecec4d539596d49c027ba6a0402e1b7cf8634355fd15500b623ee638847/python_mistralclient-3.1.4-py2-none-any.whl
python_nss-1.0.1-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/6b/29/629098e34951c358b1f04f13a70b3590eb0cf2df817d945bd05c4169d71b/python-nss-1.0.1.tar.bz2|python-nss-1.0.1|fix_setup
python_octaviaclient-1.2.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/08/e1/eb25b17a47ceb68218996e2050da4079734f23f01b915097d010baf8363f/python_octaviaclient-1.2.0-py2-none-any.whl
python_pcre-0.7-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/9d/af/61435bd163f01fe3709fca9b1f79e4978d8089ee671d2e004fc85e10de29/python-pcre-0.7.tar.gz|python-pcre-0.7|fix_setup
python_pytun-2.2.1-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/27/5e/2dca05dda9d181d7333c7e88ace46639940d4e689d3faea50c645e3af2e0/python-pytun-2.2.1.tar.gz|python-pytun-2.2.1|fix_setup
python_qpid_proton-0.17.0-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/75/6a/a11d448e99beba1e3bc4601b160f274f0d07074743bb7b0d31065b8e73e2/python-qpid-proton-0.17.0.tar.gz|python-qpid-proton-0.17.0|fix_setup
python_string_utils-0.6.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/5d/13/216f2d4a71307f5a4e5782f1f59e6e8e5d6d6c00eaadf9f92aeccfbb900c/python-string-utils-0.6.0.tar.gz|python-string-utils-0.6.0|fix_setup
python_vitrageclient-1.4.0-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/c5/87/77e0b16057c497d1968b6d88b72ee4ef3a9b68e7731c8f944fb025562fef/python_vitrageclient-1.4.0-py2-none-any.whl
python_zunclient-0.4.1-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/b0/1a/842fd60867cf35e0b9793d3496a5db3ecc49822c33343232c424d601f43f/python_zunclient-0.4.1-py2-none-any.whl
pyudev-0.21.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/bc/a2/31a07829acea8e70a28c247f43fa5d981229ae0f9edfeddedf52de00709b/pyudev-0.21.0.tar.gz|pyudev-0.21.0
PyYAML-3.12-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz|PyYAML-3.12
pyzabbix-0.7.4-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/c8/63/c2be17ad43a76907c69f521b68b6bea5dd954ed1274e4f1f4565e660efa2/pyzabbix-0.7.4.tar.gz|pyzabbix-0.7.4
qpid_python-1.36.0.post1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/2a/33/026ac50a29a85d5d54dd7784a98d624f6142cb07ce185ed268ef9bd3b6dc/qpid-python-1.36.0-1.tar.gz|qpid-python-1.36.0-1|fix_setup
rcssmin-1.0.6-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/e2/5f/852be8aa80d1c24de9b030cdb6532bc7e7a1c8461554f6edbe14335ba890/rcssmin-1.0.6.tar.gz|rcssmin-1.0.6|fix_setup
repoze.lru-0.6-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/6e/1e/aa15cc90217e086dc8769872c8778b409812ff036bf021b15795638939e4/repoze.lru-0.6.tar.gz|repoze.lru-0.6
requests_aws-0.1.8-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/5e/2f/4da17752036c04cf4c9af7a2da0d41ef2205043f1c61008006475aa24b8b/requests-aws-0.1.8.tar.gz|requests-aws-0.1.8
requests_unixsocket-0.1.5-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/f3/94/67d781fb32afbee0fffa0ad9e16ad0491f1a9c303e14790ae4e18f11be19/requests-unixsocket-0.1.5.tar.gz|requests-unixsocket-0.1.5
restructuredtext_lint-1.1.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/92/84/de4fadee001cad2d5de3286e5ee8bc40d80afb187bbed4c5e92361e1d0b6/restructuredtext_lint-1.1.1.tar.gz|restructuredtext_lint-1.1.1
retrying-1.3.3-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/44/ef/beae4b4ef80902f22e3af073397f079c96969c69b2c7d52a57ea9ae61c9d/retrying-1.3.3.tar.gz|retrying-1.3.3
rjsmin-1.0.12-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/10/9c/2c45f57d43258b05bf33cf8f6c8161ea5abf8b4776a5c59d12646727cd98/rjsmin-1.0.12.tar.gz|rjsmin-1.0.12|fix_setup
rtslib_fb-2.1.63-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/7b/11/1e851ad87dccbd91cc48e27dbe48a23f7671686bdc8caf1c2ba83126f1b3/rtslib-fb-2.1.63.tar.gz|rtslib-fb-2.1.63
#ryu-4.18-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/d9/7b/fa38d8cbd4939ca9ef504db1fc88bffd405e9ac9546ef4d8928054bebfe6/ryu-4.18.tar.gz|ryu-4.18
scandir-1.5-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/bd/f4/3143e0289faf0883228017dbc6387a66d0b468df646645e29e1eb89ea10e/scandir-1.5.tar.gz|scandir-1.5
scrypt-0.8.0-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/af/82/44b030646b9de44ba5a5c7e87b0419a4d44318ba18468f5292b9c16737ac/scrypt-0.8.0.tar.gz|scrypt-0.8.0
SecretStorage-2.3.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/a5/a5/0830cfe34a4cfd0d1c3c8b614ede1edb2aaf999091ac8548dd19cb352e79/SecretStorage-2.3.1.tar.gz|SecretStorage-2.3.1
semantic_version-2.6.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/72/83/f76958017f3094b072d8e3a72d25c3ed65f754cc607fdb6a7b33d84ab1d5/semantic_version-2.6.0.tar.gz|semantic_version-2.6.0
setproctitle-1.1.10-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/5a/0d/dc0d2234aacba6cf1a729964383e3452c52096dc695581248b548786f2b3/setproctitle-1.1.10.tar.gz|setproctitle-1.1.10
simplegeneric-0.8.1-py2-none-any.whl|zip|https://files.pythonhosted.org/packages/3d/57/4d9c9e3ae9a255cd4e1106bb57e24056d3d0709fc01b2e3e345898e49d5b/simplegeneric-0.8.1.zip|simplegeneric-0.8.1
simplejson-3.11.1-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/08/48/c97b668d6da7d7bebe7ea1817a6f76394b0ec959cb04214ca833c34359df/simplejson-3.11.1.tar.gz|simplejson-3.11.1
skydive_client-0.4.5-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/39/6d/e075910cd307370eaf989f4f3fb659e9a59b6207bcf65f8783efaf8c7e70/skydive-client-0.4.5.tar.gz|skydive-client-0.4.5
smmap-0.9.0-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/bc/aa/b744b3761fff1b10579df996a2d2e87f124ae07b8336e37edc89cc502f86/smmap-0.9.0.tar.gz|smmap-0.9.0
sphinxcontrib_fulltoc-1.2.0-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/8e/a6/d1297db9b75650681e5429e92e13df139ee6b64303ff1b2eea4ebd32c0a9/sphinxcontrib-fulltoc-1.2.0.tar.gz|sphinxcontrib-fulltoc-1.2.0
sphinxcontrib_pecanwsme-0.8.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/20/94/cc24541ae6ba18b4b8e33239cbcf11c5ff541da37da5cf4846d72c584afd/sphinxcontrib-pecanwsme-0.8.0.tar.gz|sphinxcontrib-pecanwsme-0.8.0
SQLAlchemy-1.1.12-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/16/a9/90c6b5f90d7d04beb88e7b60a44a12332d7ada4410caa81a03c2775b4122/SQLAlchemy-1.1.12.tar.gz|SQLAlchemy-1.1.12
SQLAlchemy_Utils-0.32.14-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/ce/46/eaf163b7f4db1e7dc648f1036902892c91a99f2ee7a5191af0eb9cf39a2e/SQLAlchemy-Utils-0.32.14.tar.gz|SQLAlchemy-Utils-0.32.14
stestr-2.0.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/e9/f8/8c2f7b2bcfbfc2c260893594c5af9a9486e11326fdecbc1f15b0c0b61f81/stestr-2.0.0.tar.gz|stestr-2.0.0
stomp.py-4.1.18-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/26/5c/6b10498b29cf846727d7554f323ef317815ada748daf3e0fad077bb572e3/stomp.py-4.1.18.tar.gz|stomp.py-4.1.18
subprocess32-3.5.2-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/c3/5f/7117737fc7114061837a4f51670d863dd7f7f9c762a6546fa8a0dcfe61c8/subprocess32-3.5.2.tar.gz|subprocess32-3.5.2
suds_jurko-0.6-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/bd/6f/54fbf0999a606680d27c69b1ad12dfff62768ecb9fe48524cebda6eb4423/suds-jurko-0.6.tar.bz2|suds-jurko-0.6
sushy-1.1.1-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/da/96/6d13c4439f74901f0e24b79534c9c742cf5bfd5f5253176a0020286b0dd4/sushy-1.1.1-py2-none-any.whl
sympy-1.1.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/91/26/4e477dbd1f9260eb743d9f221af3044648a8fb2fcf3f2f23daee4dc831a4/sympy-1.1.1.tar.gz|sympy-1.1.1
systemd_python-234-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/e8/a8/00ba0f605837a8f69523e6c3a4fb14675a6430c163f836540129c50b3aef/systemd-python-234.tar.gz|systemd-python-234|fix_setup
sysv_ipc-0.7.0-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/56/1b/ae0d5deb57192ee07d98bf08ac790eade1b0d8a98049fc6079f462feb28b/sysv_ipc-0.7.0.tar.gz|sysv_ipc-0.7.0|fix_setup
tablib-0.11.5-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/d6/b8/f606258ec113a2d244c0c7254c57d1dd0f5d2ba090c7d26216c4a354243b/tablib-0.11.5.tar.gz|tablib-0.11.5
tabulate-0.7.7-py2.py3-none-any.whl|pypi|https://files.pythonhosted.org/packages/a5/8d/86bf900d62216e2be7806d2ff4615cb7da54e13aeb7765549310c355cbae/tabulate-0.7.7-py2.py3-none-any.whl
Tempita-0.5.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/56/c8/8ed6eee83dbddf7b0fc64dd5d4454bc05e6ccaafff47991f73f2894d9ff4/Tempita-0.5.2.tar.gz|Tempita-0.5.2
tenacity-4.4.0-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/08/0c/9c3adb8f8a515201394c18d49daed795e61f03f9bcb24bbf09da6bbb704a/tenacity-4.4.0.tar.gz|tenacity-4.4.0
termcolor-1.1.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/8a/48/a76be51647d0eb9f10e2a4511bf3ffb8cc1e6b14e9e4fab46173aa79f981/termcolor-1.1.0.tar.gz|termcolor-1.1.0|fix_setup
testrepository-0.0.20-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/0c/85/f495b58b2b0ac907def07385219e9747b75840fa01280f228546a4a5ad7f/testrepository-0.0.20.tar.gz|testrepository-0.0.20
textfsm-0.4.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/a1/0d/a1b490503545b3b4600b965eae5d44cc2b6ce27cfb44f4debc563dbb56d3/textfsm-0.4.1.tar.gz|textfsm-0.4.1
thrift-0.11.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/c6/b4/510617906f8e0c5660e7d96fbc5585113f83ad547a3989b80297ac72a74c/thrift-0.11.0.tar.gz|thrift-0.11.0
thriftpy-0.3.9-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/f4/19/cca118cf7d2087310dbc8bd70dc7df0c1320f2652873a93d06d7ba356d4a/thriftpy-0.3.9.tar.gz|thriftpy-0.3.9
tinyrpc-0.5-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/6c/58/76f73176153bf86990381189e1d9b187a8406788d5365c1e2e4ecd078268/tinyrpc-0.5.tar.gz|tinyrpc-0.5
tornado-4.4.3-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/5c/0b/2e5cef0d30811532b27ece726fb66a41f63344af8b693c90cec9474d9022/tornado-4.4.3.tar.gz|tornado-4.4.3
tosca_parser-0.8.1-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/6c/88/b6ac1dd49caddd08903de6aa0a5b01acf15c524632829911fd05d0364703/tosca_parser-0.8.1-py2-none-any.whl
trollius-2.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/6e/72/5940cfb765488cfe1b62883a0d0e5438f4fc17cfefd4fb4654a5982be852/trollius-2.1.tar.gz|trollius-2.1
typing-3.6.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/17/75/3698d7992a828ad6d7be99c0a888b75ed173a9280e53dbae67326029b60e/typing-3.6.1.tar.gz|typing-3.6.1|fix_setup
tzlocal-1.4-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/db/53/1334a66eef27703f3bd14c9592f6468bc46ad4371b23bd9b7c25cece8f28/tzlocal-1.4.tar.gz|tzlocal-1.4
ujson-1.35-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/16/c4/79f3409bc710559015464e5f49b9879430d8f87498ecdc335899732e5377/ujson-1.35.tar.gz|ujson-1.35
unicodecsv-0.14.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/6f/a4/691ab63b17505a26096608cc309960b5a6bdf39e4ba1a793d5f9b1a53270/unicodecsv-0.14.1.tar.gz|unicodecsv-0.14.1
uWSGI-2.0.17.1-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/a2/c9/a2d5737f63cd9df4317a4acc15d1ddf4952e28398601d8d7d706c16381e0/uwsgi-2.0.17.1.tar.gz|uwsgi-2.0.17.1
voluptuous-0.10.5-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/c3/81/c84f8a3e723b760fdd1c41fc80201cb80cd29c1bce5159d8918c58df7d2a/voluptuous-0.10.5.tar.gz|voluptuous-0.10.5
warlock-1.2.0-py2.py3-none-any.whl|tar|https://files.pythonhosted.org/packages/0f/d4/408b936a3d9214b7685c35936bb59d9254c70ff319ee6a837b9efcf5615e/warlock-1.2.0.tar.gz|warlock-1.2.0
weakrefmethod-1.0.3-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/99/82/73a21e3eab9a1ff76d12375f7301fba5c6325b9598eed0ae5b0cf5243656/weakrefmethod-1.0.3.tar.gz|weakrefmethod-1.0.3
webcolors-1.7-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/1c/11/d9fb5a7c872a941ad8b30a4be191253d5a9028834c4d69eab55bb6bc60be/webcolors-1.7.tar.gz|webcolors-1.7|fix_setup
websockify-0.8.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/66/48/2e35166c957639ddb4cb11ce9783ad3ee9bf96f220354ce2684ee95feeb7/websockify-0.8.0.tar.gz|websockify-0.8.0
whereto-0.4.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/80/83/371a699ce90257608592dadca400a7ecd9a2db6137d78f6f433c7c5e3197/whereto-0.4.0.tar.gz|whereto-0.4.0
wrapt-1.10.10-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/a3/bb/525e9de0a220060394f4aa34fdf6200853581803d92714ae41fc3556e7d7/wrapt-1.10.10.tar.gz|wrapt-1.10.10|fix_setup
ws4py-0.4.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/b8/98/a90f1d96ffcb15dfc220af524ce23e0a5881258dafa197673357ce1683dd/ws4py-0.4.2.tar.gz|ws4py-0.4.2
wsgi_intercept-1.5.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/72/66/fc379742505328ace546e01e81c1a01a7a6284e1f08129035e543df1d0fd/wsgi_intercept-1.5.0.tar.gz|wsgi_intercept-1.5.0
xattr-0.9.2-cp27-none-linux_x86_64.whl|tar|https://files.pythonhosted.org/packages/18/37/2c68110bd5d52d656e7c3bad3003be78146d6cabf00cf8bdfc7d22029d7c/xattr-0.9.2.tar.gz|xattr-0.9.2
XenAPI-1.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/eb/ae/482b173c3d6d8d1c496be862a8a210eaf6d775cd288e08818c15a07259cc/XenAPI-1.2.tar.gz|XenAPI-1.2
xlrd-1.0.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/42/85/25caf967c2d496067489e0bb32df069a8361e1fd96a7e9f35408e56b3aab/xlrd-1.0.0.tar.gz|xlrd-1.0.0
XStatic-1.0.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/3e/30/726b61d07abd031b32db956adfbcf8924687e07879c1b63b777855c75289/XStatic-1.0.1.tar.gz|XStatic-1.0.1
XStatic_Angular_FileUpload-12.0.4.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/4d/fd/c3051915d2f12e8fa11f59c01162ce85e38eca15d9ec73a3d7b271b49744/XStatic-Angular-FileUpload-12.0.4.0.tar.gz|XStatic-Angular-FileUpload-12.0.4.0
XStatic_Angular_lrdragndrop-1.0.2.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/84/0e/171c9fc3e6e7ed7fbd05c25661ac053d41feab9f4045c35cccf1e5afc458/XStatic-Angular-lrdragndrop-1.0.2.2.tar.gz|XStatic-Angular-lrdragndrop-1.0.2.2
XStatic_Angular_Schema_Form-0.8.13.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/57/71/ceea2c0a72e2ee2d316d6ab1c06b21faa9f5cbc4b36a4127d7847b7079c5/XStatic-Angular-Schema-Form-0.8.13.0.tar.gz|XStatic-Angular-Schema-Form-0.8.13.0
XStatic_Bootstrap_Datepicker-1.3.1.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/91/4f/832f14478e714815bb3d44d01dfe8dbe19ccf9f823e0bc7ac1a8cf7fa6b3/XStatic-Bootstrap-Datepicker-1.3.1.0.tar.gz|XStatic-Bootstrap-Datepicker-1.3.1.0
XStatic_Hogan-2.0.0.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/21/fe/37d5c8247f24738e7e368d27ebf945de1ea29fbc3112ac5e75b1b7f1d0c9/XStatic-Hogan-2.0.0.2.tar.gz|XStatic-Hogan-2.0.0.2
XStatic_Jasmine-2.4.1.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/c2/83/c69e8a059f32f84d78270731ef096b440469b7cddc2208cf320574bd3431/XStatic-Jasmine-2.4.1.1.tar.gz|XStatic-Jasmine-2.4.1.1
XStatic_jQuery-1.10.2.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/f4/f3/b806d039ec4cd3ff601d7af49a18cb70697171c7b93030d4f1ffb881c174/XStatic-jQuery-1.10.2.1.tar.gz|XStatic-jQuery-1.10.2.1
XStatic_JQuery_Migrate-1.2.1.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/7c/fc/edbfcb4574ec3cf0b68a0613dd1904c9139e3bf6dede792d2e7edcf13023/XStatic-JQuery-Migrate-1.2.1.1.tar.gz|XStatic-JQuery-Migrate-1.2.1.1
XStatic_JQuery.quicksearch-2.0.3.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/ea/ab/f934d06a78ce2c6bb594e9a426f6966b3192c4c279467c9898be6fd284d3/XStatic-JQuery.quicksearch-2.0.3.1.tar.gz|XStatic-JQuery.quicksearch-2.0.3.1
XStatic_JQuery.TableSorter-2.14.5.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/c1/6c/d6b0807906af90536e793a3b23cca557869fa5a27156639f0029de8b1f1f/XStatic-JQuery.TableSorter-2.14.5.1.tar.gz|XStatic-JQuery.TableSorter-2.14.5.1
XStatic_jquery_ui-1.12.0.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/64/d6/3ae9619abb32a05951686bd657256ba417b4e96373d99a739a7ed39363ef/XStatic-jquery-ui-1.12.0.1.tar.gz|XStatic-jquery-ui-1.12.0.1
XStatic_Magic_Search-0.2.5.1-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/6d/00/d9bc1394ee71fe5eadaa58420919f69842ba48e39d2ee9f67cc5db94f178/XStatic-Magic-Search-0.2.5.1.tar.gz|XStatic-Magic-Search-0.2.5.1
XStatic_mdi-1.4.57.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/1f/88/cf7cc57a60949a7a717b3bcfcc64fdcaa73f8b17f305865e262bbe2b38d1/XStatic-mdi-1.4.57.0.tar.gz|XStatic-mdi-1.4.57.0
XStatic_objectpath-1.2.1.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/23/6c/56de25d9d3be430e7de2fcf4baac10279dad78d7b16cbda339cf014c2fe5/XStatic-objectpath-1.2.1.0.tar.gz|XStatic-objectpath-1.2.1.0
XStatic_Rickshaw-1.5.0.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/45/c6/39aa4d02ea96b04ff372d1e3558587155790b1c5444855a97b89c255be38/XStatic-Rickshaw-1.5.0.0.tar.gz|XStatic-Rickshaw-1.5.0.0
XStatic_Spin-1.2.5.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/af/21/cca7f0b7abfe008cdd03dd4c4255aad3087f4a892a010c0f6f1452d7344b/XStatic-Spin-1.2.5.2.tar.gz|XStatic-Spin-1.2.5.2
XStatic_term.js-0.0.7.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/63/7a/7bfec29f5f28fdda7170ebbbb2204aeb1d33d6050f3476a807590de06434/XStatic-term.js-0.0.7.0.tar.gz|XStatic-term.js-0.0.7.0
XStatic_tv4-1.2.7.0-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/2b/26/b07115af27b339c861b8c9a775a621524b421c898e26e015880dfb888c49/XStatic-tv4-1.2.7.0.tar.gz|XStatic-tv4-1.2.7.0
xvfbwrapper-0.2.9-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/57/b6/4920eabda9b49630dea58745e79f9919aba6408d460afe758bf6e9b21a04/xvfbwrapper-0.2.9.tar.gz|xvfbwrapper-0.2.9
zuul_sphinx-0.1.2-py2-none-any.whl|pypi|https://files.pythonhosted.org/packages/19/97/323b1f11abc780eb00a738dd183bab87451b8cab148b278639dd4969cb93/zuul_sphinx-0.1.2-py2-none-any.whl
zVMCloudConnector-1.2.2-py2-none-any.whl|tar|https://files.pythonhosted.org/packages/a1/da/f5a4432ebcbb630ce9a25d0ec81599fff7e473b5df7f73595783e39dba2d/zVMCloudConnector-1.2.2.tar.gz|zVMCloudConnector-1.2.2

View File

@ -0,0 +1,135 @@
#!/bin/bash
#
# Copyright (c) 2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# This utility retrieves StarlingX python wheels
# from the build output
#
# Required env vars
if [ -z "${MY_WORKSPACE}" -o -z "${MY_REPO}" ]; then
echo "Environment not setup for builds" >&2
exit 1
fi
OS=centos
OS_RELEASE=pike
function usage {
cat >&2 <<EOF
Usage:
$(basename $0) [ --os <os> ] [ --release <release> ]
Options:
--os: Specify base OS (eg. centos)
--release: Openstack release (default: pike)
EOF
}
OPTS=$(getopt -o h -l help,os:,release: -- "$@")
if [ $? -ne 0 ]; then
usage
exit 1
fi
eval set -- "${OPTS}"
while true; do
case $1 in
--)
# End of getopt arguments
shift
break
;;
--os)
OS=$2
shift 2
;;
--release)
OS_RELEASE=$2
shift 2
;;
-h | --help )
usage
exit 1
;;
*)
usage
exit 1
;;
esac
done
# Validate the OS option
SUPPORTED_OS_ARGS=('centos')
VALID_OS=1
for supported_os in ${SUPPORTED_OS_ARGS[@]}; do
if [ "$OS" = "${supported_os}" ]; then
VALID_OS=0
break
fi
done
if [ ${VALID_OS} -ne 0 ]; then
echo "Unsupported OS specified: ${OS}" >&2
echo "Supported OS options: ${SUPPORTED_OS_ARGS[@]}" >&2
exit 1
fi
source ${MY_REPO}/build-tools/git-utils.sh
function get_wheels_files {
find ${GIT_LIST} -maxdepth 1 -name "${OS}_wheels.inc"
}
WHEELS_FILES=$(get_wheels_files)
if [ $(echo -n "$WHEELS_FILES" | wc -l) -eq 0 ]; then
echo "Could not find ${OS} wheels.inc files" >&2
exit 1
fi
BUILD_OUTPUT_PATH=${MY_WORKSPACE}/std/build-wheels-${OS}-${OS_RELEASE}/stx
if [ -d ${BUILD_OUTPUT_PATH} ]; then
# Wipe out the existing dir to ensure there are no stale files
rm -rf ${BUILD_OUTPUT_PATH}
fi
mkdir -p ${BUILD_OUTPUT_PATH}
cd ${BUILD_OUTPUT_PATH}
# Extract the wheels
declare -a FAILED
for wheel in $(sed -e 's/#.*//' ${WHEELS_FILES} | sort -u); do
case $OS in
centos)
wheelfile=${MY_WORKSPACE}/std/rpmbuild/RPMS/${wheel}-[^-]*-[^-]*.rpm
if [ ! -f ${wheelfile} ]; then
echo "Could not find ${wheelfile}" >&2
FAILED+=($wheel)
continue
fi
echo Extracting ${wheelfile}
rpm2cpio ${wheelfile} | cpio -vidu
if [ ${PIPESTATUS[0]} -ne 0 -o ${PIPESTATUS[1]} -ne 0 ]; then
echo "Failed to extract content of ${wheelfile}" >&2
FAILED+=($wheel)
fi
;;
esac
done
if [ ${#FAILED[@]} -gt 0 ]; then
echo "Failed to find or extract one or more wheel packages:" >&2
for wheel in ${FAILED[@]}; do
echo "${wheel}" >&2
done
exit 1
fi
exit 0