heat/heat_integrationtests/install-requirements
Pavlo Shchelokovskyy dd50ac6352 Create integration tests requirements on the fly
The problem of integration tests was that they use their own
requirements.txt that is unable to auto-sync with global requirements.

This patch removes dedicated requirements.txt and replaces it with a
stub file listing names (and possibly versions) of the packages needed.
Then a special script parses this stub file, and for every package
that is present in main project requirements files it pulls the versions
from main project requirements, generating and installing requirements
for the integration tests on the fly.

This will help keeping requirements for the integration tests always in
sync with main project requirements.

Change-Id: Ie79338cc10cc101fbf15b51c7923e3a7b8e4fbb4
Closes-Bug: #1490866
2016-03-25 13:40:50 +00:00

67 lines
2.5 KiB
Python
Executable File

#!/usr/bin/env python
# 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.
"""Generate and install requirements from stub file and source files."""
import argparse
import subprocess
import sys
import pip
parser = argparse.ArgumentParser(description='Sync requirements.')
parser.add_argument('--stub', metavar='STUBFILE',
required=True,
help="File with requirements stubs.")
parser.add_argument('--source', metavar='SOURCE',
required=True, action='append',
help="Source file to sync requirements from. "
"May be supplied several times.")
parser.add_argument('-t', '--target', metavar='TARGET',
required=True,
help="Target file to write synced requirements to.")
parser.add_argument('pipopts', metavar='PIP OPTIONS',
nargs=argparse.REMAINDER,
help='Options to pass to "pip install".')
args = parser.parse_args()
sources = {}
for requirements_file in args.source:
rqs = pip.req.req_file.parse_requirements(requirements_file,
session=False)
sources.update({s.name: s for s in rqs})
stubs = list(pip.req.req_file.parse_requirements(args.stub,
session=False))
reqs = []
for r in stubs:
if r.name in sources:
# safe-guard for future additions to stub file
if r.specifier:
sys.exit("ERROR: package '%(pkg)s' in stub file %(stub)s "
"has version specified but is also present "
"in provided sources requirements. "
"Please remove version from the stub file." % {
'pkg': r.name, 'stub': args.stub})
reqs.append(sources[r.name])
else:
reqs.append(r)
with open(args.target, 'w') as target:
target.write('\n'.join([str(r.req) for r in reqs]))
pip_install = ['pip', 'install', '-r', args.target]
pip_install.extend(args.pipopts)
sys.exit(subprocess.call(pip_install))