Merge "Remove unused jenkins/scripts scripts"
This commit is contained in:
commit
7ab9e5175e
@ -1,75 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
|
||||
# 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.
|
||||
|
||||
# Install all known OpenStackClient projects that have plugins. Then install
|
||||
# the proposed change to see if there are any conflicting commands.
|
||||
|
||||
# install openstackclient plugins from source to catch conflicts earlier
|
||||
function install_from_source {
|
||||
repo=$1
|
||||
root=$(mktemp -d)
|
||||
$zc --cache-dir /opt/git --workspace ${root} \
|
||||
https://git.openstack.org openstack/${repo}
|
||||
(cd ${root}/openstack/${repo} && $venv/bin/pip install .)
|
||||
rm -rf $root
|
||||
}
|
||||
|
||||
zc='/usr/zuul-env/bin/zuul-cloner'
|
||||
|
||||
# setup a virtual environment to install all the plugins
|
||||
venv_name='osc_plugins'
|
||||
trap "rm -rf $venv_name" EXIT
|
||||
virtualenv $venv_name
|
||||
venv=$(pwd)/$venv_name
|
||||
|
||||
# install known OpenStackClient plugins
|
||||
install_from_source python-openstackclient
|
||||
install_from_source python-barbicanclient
|
||||
install_from_source python-cloudkittyclient
|
||||
install_from_source python-congressclient
|
||||
install_from_source python-designateclient
|
||||
install_from_source python-heatclient
|
||||
install_from_source python-ironicclient
|
||||
install_from_source python-ironic-inspector-client
|
||||
install_from_source python-karborclient
|
||||
install_from_source python-mistralclient
|
||||
install_from_source python-muranoclient
|
||||
install_from_source python-neutronclient
|
||||
install_from_source python-octaviaclient
|
||||
install_from_source python-pankoclient
|
||||
install_from_source python-rsdclient
|
||||
install_from_source python-saharaclient
|
||||
install_from_source python-searchlightclient
|
||||
install_from_source python-senlinclient
|
||||
install_from_source python-tripleoclient
|
||||
install_from_source python-troveclient
|
||||
install_from_source python-vitrageclient
|
||||
install_from_source python-watcherclient
|
||||
install_from_source python-zaqarclient
|
||||
|
||||
echo "Begin freeze output from $venv virtualenv:"
|
||||
echo "======================================================================"
|
||||
$venv/bin/pip freeze
|
||||
echo "======================================================================"
|
||||
|
||||
# now check the current proposed change doesn't cause a conflict
|
||||
# we should already be in the project's root directory where setup.py exists
|
||||
echo "Installing the proposed change in directory: $(pwd)"
|
||||
$venv/bin/pip install -e .
|
||||
|
||||
echo "Testing development version of openstack client, version:"
|
||||
$venv/bin/openstack --version
|
||||
|
||||
# run the python script to actually check the commands now that we're setup
|
||||
$venv/bin/python /usr/local/jenkins/slave_scripts/check_osc_commands.py
|
@ -1,38 +0,0 @@
|
||||
#!/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.
|
||||
|
||||
import requests
|
||||
import requestsexceptions
|
||||
import yaml
|
||||
|
||||
|
||||
def main():
|
||||
requestsexceptions.squelch_warnings()
|
||||
data = yaml.load(open('openstack_catalog/web/static/assets.yaml'))
|
||||
|
||||
assets = {}
|
||||
for a in data['assets']:
|
||||
url = a.get('attributes', {}).get('url')
|
||||
if url:
|
||||
r = requests.head(url, allow_redirects=True)
|
||||
if r.status_code != 200:
|
||||
assets[a['name']] = {'active': False}
|
||||
|
||||
with open('openstack_catalog/web/static/assets_dead.yaml', 'w') as out:
|
||||
out.write(yaml.safe_dump({"assets": assets}))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -1,181 +0,0 @@
|
||||
#! /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.
|
||||
|
||||
"""
|
||||
This module will use `pkg_resources` to scan commands for all OpenStackClient
|
||||
plugins with the purpose of detecting duplicate commands.
|
||||
"""
|
||||
|
||||
import pkg_resources
|
||||
import traceback
|
||||
|
||||
|
||||
def find_duplicates():
|
||||
"""Find duplicates commands.
|
||||
|
||||
Here we use `pkg_resources` to find all modules. There will be many modules
|
||||
on a system, so we filter them out based on "openstack" since that is the
|
||||
prefix that OpenStackClient plugins will have.
|
||||
|
||||
Each module has various entry points, each OpenStackClient command will
|
||||
have an entrypoint. Each entry point has a short name (ep.name) which
|
||||
is the command the user types, as well as a long name (ep.module_name)
|
||||
which indicates from which module the entry point is from.
|
||||
|
||||
For example, the entry point and module for v3 user list is::
|
||||
|
||||
module => openstackclient.identity.v3
|
||||
ep.name => user_list
|
||||
ep.module_name => openstackclient.identity.v3.user
|
||||
|
||||
We keep a running tally of valid commands, duplicate commands and commands
|
||||
that failed to load.
|
||||
|
||||
The resultant data structure for valid commands should look like::
|
||||
|
||||
{'user_list':
|
||||
['openstackclient.identity.v3.user',
|
||||
'openstackclient.identity.v2.0.user']
|
||||
'flavor_list':
|
||||
[openstackclient.compute.v2.flavor']
|
||||
}
|
||||
|
||||
The same can be said for the duplicate and failed commands.
|
||||
"""
|
||||
|
||||
valid_cmds = {}
|
||||
duplicate_cmds = {}
|
||||
failed_cmds = {}
|
||||
|
||||
# find all modules on the system
|
||||
modules = set()
|
||||
for dist in pkg_resources.working_set:
|
||||
entry_map = pkg_resources.get_entry_map(dist)
|
||||
modules.update(set(entry_map.keys()))
|
||||
|
||||
for module in modules:
|
||||
# OpenStackClient plugins are prefixed with "openstack", skip otherwise
|
||||
if not module.startswith('openstack'):
|
||||
continue
|
||||
|
||||
# Iterate over all entry points
|
||||
for ep in pkg_resources.iter_entry_points(module):
|
||||
|
||||
# Check for a colon, since valid entrypoints will have one, for
|
||||
# example: quota_show = openstackclient.common.quota:ShowQuota
|
||||
# and plugin entrypoints will not, for
|
||||
# example: orchestration = heatclient.osc.plugin
|
||||
if ':' not in str(ep):
|
||||
continue
|
||||
|
||||
# cliff does a mapping between spaces and underscores
|
||||
ep_name = ep.name.replace(' ', '_')
|
||||
|
||||
try:
|
||||
ep.load()
|
||||
except Exception:
|
||||
exc_string = traceback.format_exc()
|
||||
message = "{}\n{}".format(ep.module_name, exc_string)
|
||||
failed_cmds.setdefault(ep_name, []).append(message)
|
||||
|
||||
if _is_valid_command(ep_name, ep.module_name, valid_cmds):
|
||||
valid_cmds.setdefault(ep_name, []).append(ep.module_name)
|
||||
else:
|
||||
duplicate_cmds.setdefault(ep_name, []).append(ep.module_name)
|
||||
|
||||
if duplicate_cmds:
|
||||
print("Duplicate commands found...")
|
||||
print(duplicate_cmds)
|
||||
return True
|
||||
if failed_cmds:
|
||||
print("Some commands failed to load...")
|
||||
print(failed_cmds)
|
||||
return True
|
||||
|
||||
overlap_cmds = _check_command_overlap(valid_cmds)
|
||||
if overlap_cmds:
|
||||
print("WARNING: Some commands overlap...")
|
||||
print(overlap_cmds)
|
||||
# FIXME(stevemar): when we determine why commands are overlapping
|
||||
# we can uncomment the line below.
|
||||
# return True
|
||||
|
||||
# Safely return False here with the full set of commands
|
||||
print("Final set of commands...")
|
||||
print(valid_cmds)
|
||||
print("Found no duplicate or overlapping commands, OK to merge!")
|
||||
return False
|
||||
|
||||
|
||||
def _check_command_overlap(valid_cmds):
|
||||
"""Determine if the entry point overlaps with another command.
|
||||
|
||||
For example, if one plugin creates the command "object1 action",
|
||||
and another plugin creates the command "object1 action object2",
|
||||
the object2 command is unreachable since it overlaps the
|
||||
namespace.
|
||||
"""
|
||||
overlap_cmds = {}
|
||||
for ep_name, ep_mods in valid_cmds.iteritems():
|
||||
# Skip openstack.cli.base client entry points
|
||||
for ep_mod in ep_mods:
|
||||
for ep_name_search in valid_cmds.keys():
|
||||
if ep_name_search.startswith(ep_name + "_"):
|
||||
overlap_cmds.setdefault(ep_name, []).append(ep_name_search)
|
||||
return overlap_cmds
|
||||
|
||||
|
||||
def _is_valid_command(ep_name, ep_module_name, valid_cmds):
|
||||
"""Determine if the entry point is valid.
|
||||
|
||||
Aside from a simple check to see if the entry point short name is in our
|
||||
tally, we also need to check for allowed duplicates. For instance, in the
|
||||
case of supporting multiple versions, then we want to allow for duplicate
|
||||
commands. Both the identity v2 and v3 APIs support `user_list`, so these
|
||||
are fine.
|
||||
|
||||
In order to determine if an entry point is a true duplicate we can check to
|
||||
see if the module name roughly matches the module name of the entry point
|
||||
that was initially added to the set of valid commands.
|
||||
|
||||
The following should trigger a match::
|
||||
|
||||
openstackclient.identity.v3.user and openstackclient.identity.v*.user
|
||||
|
||||
Whereas, the following should fail::
|
||||
|
||||
openstackclient.identity.v3.user and openstackclient.baremetal.v3.user
|
||||
|
||||
"""
|
||||
|
||||
if ep_name not in valid_cmds:
|
||||
return True
|
||||
else:
|
||||
# there already exists an entry in the dictionary for the command...
|
||||
module_parts = ep_module_name.split(".")
|
||||
for valid_module_name in valid_cmds[ep_name]:
|
||||
valid_module_parts = valid_module_name.split(".")
|
||||
if (module_parts[0] == valid_module_parts[0] and
|
||||
module_parts[1] == valid_module_parts[1] and
|
||||
module_parts[3] == valid_module_parts[3]):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Checking 'openstack' plug-ins")
|
||||
if find_duplicates():
|
||||
exit(1)
|
||||
else:
|
||||
exit(0)
|
@ -1,7 +0,0 @@
|
||||
#!/bin/bash -x
|
||||
lvremove -f /dev/main/last_root
|
||||
lvrename /dev/main/root last_root
|
||||
lvcreate -L20G -s -n root /dev/main/orig_root
|
||||
APPEND="$(cat /proc/cmdline)"
|
||||
kexec -l /vmlinuz --initrd=/initrd.img --append="$APPEND"
|
||||
nohup bash -c "sleep 2; kexec -e" </dev/null >/dev/null 2>&1 &
|
@ -1,44 +0,0 @@
|
||||
#!/bin/bash -x
|
||||
#
|
||||
# Copyright 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.
|
||||
#
|
||||
# Upload java packages to maven repositories
|
||||
|
||||
PROJECT=$1
|
||||
VERSION=$2
|
||||
META_DATA_FILE=$3
|
||||
PLUGIN_FILE=$4
|
||||
|
||||
# Strip project name and extension leaving only the version.
|
||||
VERSION=$(echo ${PLUGIN_FILE} | sed -n "s/${PROJECT}-\(.*\).jar/\1/p")
|
||||
|
||||
# generate pom file with version info
|
||||
POM_IN_ZIP=$(unzip -Z -1 ${PLUGIN_FILE}|grep pom.xml)
|
||||
unzip -o -j ${PLUGIN_FILE} ${POM_IN_ZIP}
|
||||
sed "s/\${{project-version}}/${VERSION}/g" <pom.xml >${META_DATA_FILE}
|
||||
|
||||
# deploy plugin artifacts from workspace to maven central repository
|
||||
MAVEN_REPO="https://oss.sonatype.org/content/groups/public/maven"
|
||||
MAVEN_REPO_CREDS="/home/jenkins/.mavencentral-curl"
|
||||
|
||||
curl -X PUT \
|
||||
--config ${MAVEN_REPO_CREDS} \
|
||||
--data-binary @${META_DATA_FILE} \
|
||||
-i "${MAVEN_REPO}/${PROJECT}/${VERSION}/${META_DATA_FILE}" > /dev/null 2>&1
|
||||
|
||||
curl -X PUT \
|
||||
--config ${MAVEN_REPO_CREDS} \
|
||||
--data-binary @${PLUGIN_FILE} \
|
||||
-i "${MAVEN_REPO}/${PROJECT}/${VERSION}/${PLUGIN_FILE}" > /dev/null 2>&1
|
@ -1,22 +0,0 @@
|
||||
#!/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.
|
||||
|
||||
import sys
|
||||
from subprocess import Popen, PIPE
|
||||
|
||||
p = Popen(["ping", sys.argv[1]], stdout=PIPE)
|
||||
while True:
|
||||
line = p.stdout.readline().strip()
|
||||
if 'bytes from' in line:
|
||||
p.terminate()
|
||||
sys.exit(0)
|
@ -1,269 +0,0 @@
|
||||
#! /usr/bin/env python
|
||||
# Copyright (C) 2011 OpenStack, LLC.
|
||||
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
|
||||
# Copyright (c) 2013 OpenStack Foundation
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import argparse
|
||||
import collections
|
||||
import contextlib
|
||||
import os
|
||||
import shlex
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
|
||||
requirement = None
|
||||
project = None
|
||||
|
||||
|
||||
def run_command(cmd):
|
||||
print(cmd)
|
||||
cmd_list = shlex.split(str(cmd))
|
||||
p = subprocess.Popen(cmd_list, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
(out, err) = p.communicate()
|
||||
if p.returncode != 0:
|
||||
raise SystemError(err)
|
||||
return (out.strip(), err.strip())
|
||||
|
||||
|
||||
class RequirementsList(object):
|
||||
def __init__(self, name, project):
|
||||
self.name = name
|
||||
self.reqs_by_file = {}
|
||||
self.project = project
|
||||
self.failed = False
|
||||
|
||||
@property
|
||||
def reqs(self):
|
||||
return {k: v for d in self.reqs_by_file.values()
|
||||
for k, v in d.items()}
|
||||
|
||||
def extract_reqs(self, content, strict):
|
||||
reqs = collections.defaultdict(set)
|
||||
parsed = requirement.parse(content)
|
||||
for name, entries in parsed.items():
|
||||
if not name:
|
||||
# Comments and other unprocessed lines
|
||||
continue
|
||||
list_reqs = [r for (r, line) in entries]
|
||||
# Strip the comments out before checking if there are duplicates
|
||||
list_reqs_stripped = [r._replace(comment='') for r in list_reqs]
|
||||
if strict and len(list_reqs_stripped) != len(set(
|
||||
list_reqs_stripped)):
|
||||
print("Requirements file has duplicate entries "
|
||||
"for package %s : %r." % (name, list_reqs))
|
||||
self.failed = True
|
||||
reqs[name].update(list_reqs)
|
||||
return reqs
|
||||
|
||||
def process(self, strict=True):
|
||||
"""Convert the project into ready to use data.
|
||||
|
||||
- an iterable of requirement sets to check
|
||||
- each set has the following rules:
|
||||
- each has a list of Requirements objects
|
||||
- duplicates are not permitted within that list
|
||||
"""
|
||||
print("Checking %(name)s" % {'name': self.name})
|
||||
# First, parse.
|
||||
for fname, content in self.project.get('requirements', {}).items():
|
||||
print("Processing %(fname)s" % {'fname': fname})
|
||||
if strict and not content.endswith('\n'):
|
||||
print("Requirements file %s does not "
|
||||
"end with a newline." % fname)
|
||||
self.reqs_by_file[fname] = self.extract_reqs(content, strict)
|
||||
|
||||
for name, content in project.extras(self.project).items():
|
||||
print("Processing .[%(extra)s]" % {'extra': name})
|
||||
self.reqs_by_file[name] = self.extract_reqs(content, strict)
|
||||
|
||||
|
||||
def grab_args():
|
||||
"""Grab and return arguments"""
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Check if project requirements have changed"
|
||||
)
|
||||
parser.add_argument('--local', action='store_true',
|
||||
help='check local changes (not yet in git)')
|
||||
parser.add_argument('branch', nargs='?', default='master',
|
||||
help='target branch for diffs')
|
||||
parser.add_argument('--zc', help='what zuul cloner to call')
|
||||
parser.add_argument('--reqs', help='use a specified requirements tree')
|
||||
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def tempdir():
|
||||
try:
|
||||
reqroot = tempfile.mkdtemp()
|
||||
yield reqroot
|
||||
finally:
|
||||
shutil.rmtree(reqroot)
|
||||
|
||||
|
||||
def install_and_load_requirements(reqroot, reqdir):
|
||||
sha = run_command("git --git-dir %s/.git rev-parse HEAD" % reqdir)[0]
|
||||
print("requirements git sha: %s" % sha)
|
||||
req_venv = os.path.join(reqroot, 'venv')
|
||||
req_pip = os.path.join(req_venv, 'bin/pip')
|
||||
req_lib = os.path.join(req_venv, 'lib/python2.7/site-packages')
|
||||
out, err = run_command("virtualenv " + req_venv)
|
||||
out, err = run_command(req_pip + " install " + reqdir)
|
||||
sys.path.append(req_lib)
|
||||
global project
|
||||
global requirement
|
||||
from openstack_requirements import project # noqa
|
||||
from openstack_requirements import requirement # noqa
|
||||
|
||||
|
||||
def _is_requirement_in_global_reqs(req, global_reqs):
|
||||
# Compare all fields except the extras field as the global
|
||||
# requirements should not have any lines with the extras syntax
|
||||
# example: oslo.db[xyz]<1.2.3
|
||||
for req2 in global_reqs:
|
||||
if (req.package == req2.package and
|
||||
req.location == req2.location and
|
||||
req.specifiers == req2.specifiers and
|
||||
req.markers == req2.markers and
|
||||
req.comment == req2.comment):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
args = grab_args()
|
||||
branch = args.branch
|
||||
failed = False
|
||||
|
||||
# build a list of requirements from the global list in the
|
||||
# openstack/requirements project so we can match them to the changes
|
||||
with tempdir() as reqroot:
|
||||
# Only clone requirements repo if no local repo is specified
|
||||
# on the command line.
|
||||
if args.reqs is None:
|
||||
reqdir = os.path.join(reqroot, "openstack/requirements")
|
||||
if args.zc is not None:
|
||||
zc = args.zc
|
||||
else:
|
||||
zc = '/usr/zuul-env/bin/zuul-cloner'
|
||||
out, err = run_command("%(zc)s "
|
||||
"--cache-dir /opt/git "
|
||||
"--workspace %(root)s "
|
||||
"https://git.openstack.org "
|
||||
"openstack/requirements"
|
||||
% dict(zc=zc, root=reqroot))
|
||||
print(out)
|
||||
print(err)
|
||||
else:
|
||||
reqdir = args.reqs
|
||||
|
||||
install_and_load_requirements(reqroot, reqdir)
|
||||
global_reqs = requirement.parse(
|
||||
open(reqdir + '/global-requirements.txt', 'rt').read())
|
||||
for k, entries in global_reqs.items():
|
||||
# Discard the lines: we don't need them.
|
||||
global_reqs[k] = set(r for (r, line) in entries)
|
||||
blacklist = requirement.parse(
|
||||
open(reqdir + '/blacklist.txt', 'rt').read())
|
||||
cwd = os.getcwd()
|
||||
# build a list of requirements in the proposed change,
|
||||
# and check them for style violations while doing so
|
||||
head = run_command("git rev-parse HEAD")[0]
|
||||
head_proj = project.read(cwd)
|
||||
head_reqs = RequirementsList('HEAD', head_proj)
|
||||
# Don't apply strict parsing rules to stable branches.
|
||||
# Reasoning is:
|
||||
# - devstack etc protect us from functional issues
|
||||
# - we're backporting to stable, so guarding against
|
||||
# aesthetics and DRY concerns is not our business anymore
|
||||
# - if in future we have other not-functional linty style
|
||||
# things to add, we don't want them to affect stable
|
||||
# either.
|
||||
head_strict = not branch.startswith('stable/')
|
||||
head_reqs.process(strict=head_strict)
|
||||
|
||||
if not args.local:
|
||||
# build a list of requirements already in the target branch,
|
||||
# so that we can create a diff and identify what's being changed
|
||||
run_command("git remote update")
|
||||
run_command("git checkout remotes/origin/%s" % branch)
|
||||
branch_proj = project.read(cwd)
|
||||
|
||||
# switch back to the proposed change now
|
||||
run_command("git checkout %s" % head)
|
||||
else:
|
||||
branch_proj = {'root': cwd}
|
||||
branch_reqs = RequirementsList(branch, branch_proj)
|
||||
# Don't error on the target branch being broken.
|
||||
branch_reqs.process(strict=False)
|
||||
|
||||
# iterate through the changing entries and see if they match the global
|
||||
# equivalents we want enforced
|
||||
for fname, freqs in head_reqs.reqs_by_file.items():
|
||||
print("Validating %(fname)s" % {'fname': fname})
|
||||
for name, reqs in freqs.items():
|
||||
counts = {}
|
||||
if (name in branch_reqs.reqs and
|
||||
reqs == branch_reqs.reqs[name]):
|
||||
# Unchanged [or a change that preserves a current value]
|
||||
continue
|
||||
if name in blacklist:
|
||||
# Blacklisted items are not synced and are managed
|
||||
# by project teams as they see fit, so no further
|
||||
# testing is needed.
|
||||
continue
|
||||
if name not in global_reqs:
|
||||
failed = True
|
||||
print("Requirement %s not in openstack/requirements" %
|
||||
str(reqs))
|
||||
continue
|
||||
if reqs == global_reqs[name]:
|
||||
continue
|
||||
for req in reqs:
|
||||
if req.extras:
|
||||
for extra in req.extras:
|
||||
counts[extra] = counts.get(extra, 0) + 1
|
||||
else:
|
||||
counts[''] = counts.get('', 0) + 1
|
||||
if not _is_requirement_in_global_reqs(
|
||||
req, global_reqs[name]):
|
||||
failed = True
|
||||
print("Requirement for package %s : %s does "
|
||||
"not match openstack/requirements value : %s" % (
|
||||
name, str(req), str(global_reqs[name])))
|
||||
for extra, count in counts.items():
|
||||
if count != len(global_reqs[name]):
|
||||
failed = True
|
||||
print("Package %s%s requirement does not match "
|
||||
"number of lines (%d) in "
|
||||
"openstack/requirements" % (
|
||||
name,
|
||||
('[%s]' % extra) if extra else '',
|
||||
len(global_reqs[name])))
|
||||
|
||||
# report the results
|
||||
if failed or head_reqs.failed or branch_reqs.failed:
|
||||
print("*** Incompatible requirement found!")
|
||||
print("*** See http://docs.openstack.org/developer/requirements")
|
||||
sys.exit(1)
|
||||
print("Updated requirements match openstack/requirements.")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -1,36 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
#
|
||||
# Copyright 2012 Hewlett-Packard Development Company, L.P.
|
||||
# Copyright 2013 OpenStack Foundation
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# Retrieve a python sdist and upload it to pypi with Curl.
|
||||
|
||||
PROJECT=$1
|
||||
TARBALL_SITE=$2
|
||||
TAG=$(echo $ZUUL_REF | sed 's/^refs.tags.//')
|
||||
|
||||
# Look in the setup.cfg to determine if a package name is specified, but
|
||||
# fall back on the project name if necessary
|
||||
DISTNAME=$(/usr/local/jenkins/slave_scripts/pypi-extract-name.py --tarball \
|
||||
|| echo $PROJECT)
|
||||
FILENAME="$DISTNAME-$TAG.tar.gz"
|
||||
|
||||
rm -rf *tar.gz
|
||||
curl --fail -o $FILENAME https://$TARBALL_SITE/$PROJECT/$FILENAME
|
||||
|
||||
# Make sure we actually got a gzipped file
|
||||
file -b $FILENAME | grep gzip
|
||||
|
||||
twine upload -r pypi $FILENAME
|
@ -1,38 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
#
|
||||
# Copyright 2012 Hewlett-Packard Development Company, L.P.
|
||||
# Copyright 2013 OpenStack Foundation
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# Retrieve supported python wheels and upload them to pypi with Curl.
|
||||
|
||||
PROJECT=$1
|
||||
TARBALL_SITE=$2
|
||||
TAG=$(echo $ZUUL_REF | sed 's/^refs.tags.//')
|
||||
|
||||
# Look in the setup.cfg to determine if a package name is specified, but
|
||||
# fall back on the project name if necessary
|
||||
DISTNAME=$(/usr/local/jenkins/slave_scripts/pypi-extract-name.py --wheel \
|
||||
|| echo $PROJECT)
|
||||
# Look in the setup.cfg to see if this is a universal wheel or not
|
||||
WHEELTYPE=$(/usr/local/jenkins/slave_scripts/pypi-extract-universal.py)
|
||||
FILENAME="$DISTNAME-$TAG-$WHEELTYPE-none-any.whl"
|
||||
|
||||
rm -rf *.whl
|
||||
curl --fail -o $FILENAME https://$TARBALL_SITE/$PROJECT/$FILENAME
|
||||
|
||||
# Make sure we actually got a wheel
|
||||
file -b $FILENAME | grep -i zip
|
||||
|
||||
twine upload -r pypi $FILENAME
|
@ -1,26 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
|
||||
# Run coverage via tox. Also, run pbr freeze on the
|
||||
# resulting environment at the end so that we have a record of exactly
|
||||
# what packages we ended up testing.
|
||||
|
||||
export NOSE_COVER_HTML=1
|
||||
export UPPER_CONSTRAINTS_FILE=$(pwd)/upper-constraints.txt
|
||||
|
||||
venv=${1:-cover}
|
||||
|
||||
# Workaround the combo of tox running setup.py outside of virtualenv
|
||||
# and RHEL having an old distribute. The next line can be removed
|
||||
# when either get fixed.
|
||||
python setup.py --version
|
||||
|
||||
tox -e$venv
|
||||
result=$?
|
||||
[ -e .tox/$venv/bin/pbr ] && freezecmd=pbr || freezecmd=pip
|
||||
|
||||
echo "Begin $freezecmd freeze output from test virtualenv:"
|
||||
echo "======================================================================"
|
||||
.tox/${venv}/bin/${freezecmd} freeze
|
||||
echo "======================================================================"
|
||||
|
||||
exit $result
|
@ -1,94 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
|
||||
# If a bundle file is present, call tox with the jenkins version of
|
||||
# the test environment so it is used. Otherwise, use the normal
|
||||
# (non-bundle) test environment. Also, run pbr freeze on the
|
||||
# resulting environment at the end so that we have a record of exactly
|
||||
# what packages we ended up testing.
|
||||
#
|
||||
|
||||
venv=${1:-venv}
|
||||
tags_handling=${2:both}
|
||||
|
||||
mkdir -p doc/build
|
||||
export UPPER_CONSTRAINTS_FILE=$(pwd)/upper-constraints.txt
|
||||
# The "python setup.py build_sphinx" is intentionally executed instead of
|
||||
# "tox -edocs", because it's the standard python project build interface
|
||||
# specified in OpenStack Project Testing Interface:
|
||||
# http://governance.openstack.org/reference/project-testing-interface.html
|
||||
tox -e$venv -- python setup.py build_sphinx
|
||||
result=$?
|
||||
|
||||
# If the build has not already failed and whereto is installed then
|
||||
# test the redirects defined in the project.
|
||||
if [ $result -eq 0 ]; then
|
||||
if [ -e .tox/$venv/bin/whereto ]; then
|
||||
tox -e $venv -- whereto doc/source/_extra/.htaccess doc/test/redirect-tests.txt
|
||||
result=$?
|
||||
fi
|
||||
fi
|
||||
|
||||
[ -e .tox/$venv/bin/pbr ] && freezecmd=pbr || freezecmd=pip
|
||||
|
||||
echo "Begin pbr freeze output from test virtualenv:"
|
||||
echo "======================================================================"
|
||||
.tox/${venv}/bin/${freezecmd} freeze
|
||||
echo "======================================================================"
|
||||
|
||||
MARKER_TEXT="Project: $ZUUL_PROJECT Ref: $ZUUL_REFNAME Build: $ZUUL_UUID Revision: $ZUUL_NEWREV"
|
||||
echo $MARKER_TEXT > doc/build/html/.root-marker
|
||||
|
||||
if [ -z "$ZUUL_REFNAME" ] || [ "$ZUUL_REFNAME" == "master" ] ; then
|
||||
: # Leave the docs where they are.
|
||||
elif echo $ZUUL_REFNAME | grep refs/tags/ >/dev/null ; then
|
||||
# Put tagged releases in proper location. All tagged builds get copied to
|
||||
# BUILD_DIR/tagname. If this is the latest tagged release the copy of files
|
||||
# at BUILD_DIR remains. When Jenkins copies this file the root developer
|
||||
# docs are always the latest release with older tags available under the
|
||||
# root in the tagname dir.
|
||||
TAG=$(echo $ZUUL_REFNAME | sed 's/refs.tags.//')
|
||||
if [ ! -z $TAG ] ; then
|
||||
# This is a hack to ignore the year.release tags in projects since
|
||||
# now all projects use semver based versions instead of date based
|
||||
# versions. The date versions will sort higher even though they
|
||||
# should not so we just special case it here.
|
||||
LATEST=$(git tag | sed -n -e '/^20[0-9]\{2\}\..*$/d' -e '/^[0-9]\+\(\.[0-9]\+\)*$/p' | sort -V | tail -1)
|
||||
# Now publish to / and /$TAG if this is the latest version for projects
|
||||
# and we are only publishing from the release pipeline,
|
||||
# or just /$TAG otherwise.
|
||||
if [ "$tags_handling" = "tags-only" -a "$TAG" = "$LATEST" ] ; then
|
||||
# Copy the docs into a subdir if this is a tagged build
|
||||
mkdir doc/build/$TAG
|
||||
cp -R doc/build/html/. doc/build/$TAG
|
||||
mv doc/build/$TAG doc/build/html/$TAG
|
||||
else
|
||||
# Move the docs into a subdir if this is a tagged build
|
||||
mv doc/build/html doc/build/tmp
|
||||
mkdir doc/build/html
|
||||
mv doc/build/tmp doc/build/html/$TAG
|
||||
fi
|
||||
fi
|
||||
elif echo $ZUUL_REFNAME | grep stable/ >/dev/null ; then
|
||||
# Put stable release changes in dir named after stable release under the
|
||||
# build dir. When Jenkins copies these files they will be accessible under
|
||||
# the developer docs root using the stable release's name.
|
||||
BRANCH=$(echo $ZUUL_REFNAME | sed 's/stable.//')
|
||||
if [ ! -z $BRANCH ] ; then
|
||||
# Move the docs into a subdir if this is a stable branch build
|
||||
mv doc/build/html doc/build/tmp
|
||||
mkdir doc/build/html
|
||||
mv doc/build/tmp doc/build/html/$BRANCH
|
||||
fi
|
||||
else
|
||||
# Put other branch changes in dir named after branch under the
|
||||
# build dir. When Jenkins copies these files they will be
|
||||
# accessible under the developer docs root using the branch name.
|
||||
# EG: feature/foo or milestone-proposed
|
||||
BRANCH=$ZUUL_REFNAME
|
||||
TOP=`dirname $BRANCH`
|
||||
mv doc/build/html doc/build/tmp
|
||||
mkdir -p doc/build/html/$TOP
|
||||
mv doc/build/tmp doc/build/html/$BRANCH
|
||||
fi
|
||||
|
||||
exit $result
|
@ -1,43 +0,0 @@
|
||||
#!/bin/bash -x
|
||||
|
||||
# Copyright 2013 OpenStack Foundation
|
||||
#
|
||||
# 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.
|
||||
|
||||
venv=${1:-pep8}
|
||||
|
||||
export UPPER_CONSTRAINTS_FILE=$(pwd)/upper-constraints.txt
|
||||
|
||||
virtualenv sdist_check && sdist_check/bin/pip install pbr && sdist_check/bin/python setup.py sdist
|
||||
sdistrc=$?
|
||||
rm -rf sdist_check
|
||||
|
||||
tox -v -e$venv
|
||||
rc=$?
|
||||
|
||||
[ -e .tox/$venv/bin/pbr ] && freezecmd=pbr || freezecmd=pip
|
||||
|
||||
echo "Begin $freezecmd freeze output from test virtualenv:"
|
||||
echo "======================================================================"
|
||||
.tox/${venv}/bin/${freezecmd} freeze
|
||||
echo "======================================================================"
|
||||
|
||||
if [ ! $sdistrc ] ; then
|
||||
echo "******************************************************************"
|
||||
echo "Project cannot create sdist tarball!!!"
|
||||
echo "To reproduce this locally, run: 'python setup.py sdist'"
|
||||
echo "******************************************************************"
|
||||
exit $sdistrc
|
||||
fi
|
||||
|
||||
exit $rc
|
@ -1,23 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
|
||||
# Copyright 2013 OpenStack Foundation
|
||||
#
|
||||
# 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.
|
||||
|
||||
venv=${1:-pylint}
|
||||
export UPPER_CONSTRAINTS_FILE=$(pwd)/upper-constraints.txt
|
||||
|
||||
set -o pipefail
|
||||
tox -v -e$venv | tee pylint.txt
|
||||
set +o pipefail
|
||||
|
@ -1,31 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
|
||||
# If a bundle file is present, call tox with the jenkins version of
|
||||
# the test environment so it is used. Otherwise, use the normal
|
||||
# (non-bundle) test environment. Also, run pbr freeze on the
|
||||
# resulting environment at the end so that we have a record of exactly
|
||||
# what packages we ended up testing.
|
||||
#
|
||||
|
||||
venv=venv
|
||||
|
||||
VDISPLAY=99
|
||||
DIMENSIONS='1280x1024x24'
|
||||
/usr/bin/Xvfb :${VDISPLAY} -screen 0 ${DIMENSIONS} 2>&1 > /dev/null &
|
||||
|
||||
set +e
|
||||
DISPLAY=:${VDISPLAY} NOSE_WITH_XUNIT=1 tox -e$venv -- \
|
||||
/bin/bash run_tests.sh -N --only-selenium
|
||||
result=$?
|
||||
|
||||
pkill Xvfb 2>&1 > /dev/null
|
||||
set -e
|
||||
|
||||
[ -e .tox/$venv/bin/pbr ] && freezecmd=pbr || freezecmd=pip
|
||||
|
||||
echo "Begin $freezecmd freeze output from test virtualenv:"
|
||||
echo "======================================================================"
|
||||
.tox/${venv}/bin/${freezecmd} freeze
|
||||
echo "======================================================================"
|
||||
|
||||
exit $result
|
@ -1,33 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
|
||||
# Copyright 2013 OpenStack Foundation
|
||||
#
|
||||
# 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.
|
||||
|
||||
venv=${1:-venv}
|
||||
|
||||
export UPPER_CONSTRAINTS_FILE=$(pwd)/upper-constraints.txt
|
||||
|
||||
rm -f dist/*.tar.gz
|
||||
tox -e$venv python setup.py sdist
|
||||
|
||||
FILES=dist/*.tar.gz
|
||||
for f in $FILES; do
|
||||
echo "SHA1sum for $f:"
|
||||
sha1sum $f | awk '{print $1}' > $f.sha1
|
||||
cat $f.sha1
|
||||
|
||||
echo "MD5sum for $f:"
|
||||
md5sum $f | awk '{print $1}' > $f.md5
|
||||
cat $f.md5
|
||||
done
|
@ -1,32 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
|
||||
# Copyright 2013 OpenStack Foundation
|
||||
#
|
||||
# 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.
|
||||
|
||||
venv=${1:-venv}
|
||||
|
||||
export UPPER_CONSTRAINTS_FILE=$(pwd)/upper-constraints.txt
|
||||
|
||||
rm -f dist/*.whl
|
||||
tox -e$venv pip install wheel
|
||||
tox -e$venv python setup.py bdist_wheel
|
||||
|
||||
FILES=dist/*.whl
|
||||
for f in $FILES; do
|
||||
echo -n "SHA1sum for $f: "
|
||||
sha1sum $f | awk '{print $1}' | tee $f.sha1
|
||||
|
||||
echo -n "MD5sum for $f: "
|
||||
md5sum $f | awk '{print $1}' | tee $f.md5
|
||||
done
|
@ -1,46 +0,0 @@
|
||||
#!/bin/bash -xe
|
||||
#
|
||||
# Copyright 2012 Hewlett-Packard Development Company, L.P.
|
||||
# Copyright 2013, 2016 OpenStack Foundation
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# Retrieve python tarballs/wheels and make detached OpenPGP signatures.
|
||||
|
||||
PROJECT=$1
|
||||
TARBALL_SITE=$2
|
||||
TAG=$(echo $ZUUL_REF | sed 's/^refs.tags.//')
|
||||
|
||||
# Look in the setup.cfg to determine if a package name is specified, but
|
||||
# fall back on the project name if necessary. Also look in the setup.cfg
|
||||
# to see if this is a universal wheel or not
|
||||
DISTNAME=$(/usr/local/jenkins/slave_scripts/pypi-extract-name.py --wheel \
|
||||
|| echo $PROJECT)
|
||||
TARBALL=$(/usr/local/jenkins/slave_scripts/pypi-extract-name.py \
|
||||
--tarball || echo $PROJECT)-${TAG}.tar.gz
|
||||
WHEEL=$(/usr/local/jenkins/slave_scripts/pypi-extract-name.py \
|
||||
--wheel || echo $PROJECT)-${TAG}-$( \
|
||||
/usr/local/jenkins/slave_scripts/pypi-extract-universal.py || \
|
||||
true)-none-any.whl
|
||||
|
||||
rm -rf *.asc *.tar.gz *.whl
|
||||
|
||||
curl --fail -o $TARBALL https://${TARBALL_SITE}/${PROJECT}/${TARBALL}
|
||||
file -b $TARBALL | grep gzip # Make sure we actually got a tarball
|
||||
gpg --armor --detach-sign $TARBALL
|
||||
|
||||
# Wheels are not mandatory, so only sign if we have one
|
||||
if curl --fail -o $WHEEL https://${TARBALL_SITE}/${PROJECT}/${WHEEL}; then
|
||||
file -b $WHEEL | grep -i zip # Make sure we actually got a wheel
|
||||
gpg --armor --detach-sign $WHEEL
|
||||
fi
|
@ -1,200 +0,0 @@
|
||||
#!/usr/bin/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.
|
||||
|
||||
# tardiff.py -- compare the tar package with git archive. Error out if
|
||||
# it's different. The files to exclude are stored in a file, one per line,
|
||||
# and it's passed as argument to this script.
|
||||
#
|
||||
# You should run this script from the project directory. For example, if
|
||||
# you are verifying the package for glance project, you should run this
|
||||
# script from that directory.
|
||||
|
||||
import getopt
|
||||
import sys
|
||||
import os
|
||||
import commands
|
||||
|
||||
|
||||
class OpenStackTarDiff:
|
||||
""" main class to verify tar generated in each openstack projects """
|
||||
|
||||
def __init__(self):
|
||||
self.init_vars()
|
||||
self.validate_args()
|
||||
self.check_env()
|
||||
|
||||
def check_env(self):
|
||||
""" exit if dist/ directory already exists """
|
||||
if not self.package and os.path.exists(self.dist_dir):
|
||||
self.error(
|
||||
"dist directory '%s' exist. Please remove it before "
|
||||
"running this script" % self.dist_dir)
|
||||
|
||||
def validate_args(self):
|
||||
try:
|
||||
opts = getopt.getopt(sys.argv[1:], 'hvp:e:',
|
||||
['help', 'verbose', 'package=',
|
||||
'exclude='])[0]
|
||||
except getopt.GetoptError:
|
||||
self.usage('invalid option selected')
|
||||
|
||||
for opt, value in opts:
|
||||
if (opt in ('-h', '--help')):
|
||||
self.usage()
|
||||
elif (opt in ('-e', '--exclude')):
|
||||
self.e_file = value
|
||||
elif (opt in ('-p', '--package')):
|
||||
self.package = value
|
||||
elif (opt in ('-v', '--verbose')):
|
||||
self.verbose = True
|
||||
else:
|
||||
self.usage('unknown option : ' + opt)
|
||||
if not self.e_file:
|
||||
self.usage('specify file name containing list of files to '
|
||||
'exclude in tar diff')
|
||||
if not os.path.exists(self.e_file):
|
||||
self.usage("file '%s' does not exist" % self.e_file)
|
||||
if self.package and not os.path.exists(self.package):
|
||||
self.usage("package '%s' specified, but does not "
|
||||
"exist" % self.package)
|
||||
|
||||
def init_vars(self):
|
||||
self.dist_dir = 'dist/'
|
||||
self.verbose = False
|
||||
|
||||
self.e_file = None
|
||||
self.project_name = None
|
||||
self.prefix = None
|
||||
self.package = None
|
||||
self.sdist_files = []
|
||||
self.exclude_files = []
|
||||
self.git_files = []
|
||||
self.missing_files = []
|
||||
|
||||
def verify(self):
|
||||
self.get_exclude_files()
|
||||
self.get_project_name()
|
||||
self.get_sdist_files()
|
||||
self.prefix = self.sdist_files[0]
|
||||
self.get_git_files()
|
||||
|
||||
for file in self.git_files:
|
||||
if os.path.basename(file) in self.exclude_files:
|
||||
self.debug("excluding file '%s'" % file)
|
||||
continue
|
||||
|
||||
if file not in self.sdist_files:
|
||||
self.missing_files.append(file)
|
||||
else:
|
||||
# self.debug("file %s matches" % file)
|
||||
pass
|
||||
if len(self.missing_files) > 0:
|
||||
self.error("files missing in package: %s" % self.missing_files)
|
||||
print("SUCCESS: Generated package '%s' is valid" % self.package)
|
||||
|
||||
def get_project_name(self):
|
||||
""" get git project name """
|
||||
self.project_name = os.path.basename(os.path.abspath(os.curdir))
|
||||
|
||||
def get_exclude_files(self):
|
||||
""" read the file and get file list """
|
||||
fh = open(self.e_file, 'r')
|
||||
content = fh.readlines()
|
||||
fh.close()
|
||||
self.debug("files to exclude: %s" % content)
|
||||
|
||||
# remove trailing new lines.
|
||||
self.exclude_files = [x.strip() for x in content]
|
||||
|
||||
def get_git_files(self):
|
||||
""" read file list from git archive """
|
||||
git_tar = os.path.join(os.getcwd(), '%s.tar' % self.project_name)
|
||||
try:
|
||||
a_cmd = ("git archive -o %s HEAD --prefix=%s" %
|
||||
(git_tar, self.prefix))
|
||||
self.debug("executing command '%s'" % a_cmd)
|
||||
(status, out) = commands.getstatusoutput(a_cmd)
|
||||
if status != 0:
|
||||
self.debug("command '%s' returned status '%s'" %
|
||||
(a_cmd, status))
|
||||
if os.path.exists(git_tar):
|
||||
os.unlink(git_tar)
|
||||
self.error('git archive failed: %s' % out)
|
||||
except Exception as err:
|
||||
if os.path.exists(git_tar):
|
||||
os.unlink(git_tar)
|
||||
self.error('git archive failed: %s' % err)
|
||||
|
||||
try:
|
||||
tar_cmd = "tar tf %s" % git_tar
|
||||
self.debug("executing command '%s'" % tar_cmd)
|
||||
(status, out) = commands.getstatusoutput(tar_cmd)
|
||||
if status != 0:
|
||||
self.error('invalid tar file: %s' % git_tar)
|
||||
self.git_files = out.split('\n')
|
||||
self.debug("Removing git archive ... %s ..." % git_tar)
|
||||
os.remove(git_tar)
|
||||
except Exception as err:
|
||||
self.error('unable to read tar: %s' % err)
|
||||
|
||||
def get_sdist_files(self):
|
||||
""" create package for project and get file list in it"""
|
||||
if not self.package:
|
||||
try:
|
||||
sdist_cmd = "python setup.py sdist"
|
||||
self.debug("executing command '%s'" % sdist_cmd)
|
||||
(status, out) = commands.getstatusoutput(sdist_cmd)
|
||||
if status != 0:
|
||||
self.error("command '%s' failed" % sdist_cmd)
|
||||
except Exception as err:
|
||||
self.error("command '%s' failed" % (sdist_cmd, err))
|
||||
|
||||
self.package = os.listdir(self.dist_dir)[0]
|
||||
self.package = os.path.join(self.dist_dir, self.package)
|
||||
tar_cmd = "tar tzf %s" % self.package
|
||||
try:
|
||||
self.debug("executing command '%s'" % tar_cmd)
|
||||
(status, out) = commands.getstatusoutput(tar_cmd)
|
||||
if status != 0:
|
||||
self.error("command '%s' failed" % tar_cmd)
|
||||
# self.debug(out)
|
||||
self.sdist_files = out.split('\n')
|
||||
except Exception as err:
|
||||
self.error("command '%s' failed: %s" % (tar_cmd, err))
|
||||
|
||||
def debug(self, msg):
|
||||
if self.verbose:
|
||||
sys.stdout.write('DEBUG: %s\n' % msg)
|
||||
|
||||
def error(self, msg):
|
||||
sys.stderr.write('ERROR: %s\n' % msg)
|
||||
sys.exit(1)
|
||||
|
||||
def usage(self, msg=None):
|
||||
if msg:
|
||||
stream = sys.stderr
|
||||
else:
|
||||
stream = sys.stdout
|
||||
stream.write("usage: %s [--help|h] [-v] "
|
||||
"[-p|--package=sdist_package.tar.gz] "
|
||||
"-e|--exclude=filename\n" % os.path.basename(sys.argv[0]))
|
||||
if msg:
|
||||
stream.write("\nERROR: " + msg + "\n")
|
||||
exitCode = 1
|
||||
else:
|
||||
exitCode = 0
|
||||
sys.exit(exitCode)
|
||||
|
||||
if __name__ == '__main__':
|
||||
tardiff = OpenStackTarDiff()
|
||||
tardiff.verify()
|
Loading…
Reference in New Issue
Block a user