Skip to content

Commit

Permalink
AMBARI-24609. Ability to install common ambari python libraries to ma…
Browse files Browse the repository at this point in the history
…ven repository (local / remote). (apache#2273)

* AMBARI-24609. Ability to install common ambari python libraries to maven repository (local / remote).

* AMBARI-24609. Review changes.
  • Loading branch information
oleewere authored Sep 10, 2018
1 parent 7cc5c9d commit 68d0b64
Show file tree
Hide file tree
Showing 2 changed files with 211 additions and 7 deletions.
182 changes: 182 additions & 0 deletions install-ambari-python.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.

# requires: pip setuptools wheel

readlinkf(){
# get real path on mac OSX
perl -MCwd -e 'print Cwd::abs_path shift' "$1";
}

if [ "$(uname -s)" = 'Linux' ]; then
SCRIPT_DIR="`dirname "$(readlink -f "$0")"`"
else
SCRIPT_DIR="`dirname "$(readlinkf "$0")"`"
fi

function print_help() {
cat << EOF
Usage: ./install-ambari-python.sh [additional options]
-c, --clean clean generated python distribution directories
-d, --deploy deploy ambari-python artifact to maven remote repository
-v, --version <version> override ambari-python artifact versison
-i, --repository-id <id> repository id in settings.xml for remote repository
-r, --repository-url <url> repository url of remote repository
-h, --help print help
EOF
}

function get_python_artifact_file() {
local artifact_file=$(ls $SCRIPT_DIR/dist/ | head -n 1)
echo $artifact_file
}

function get_version() {
local artifact_file=$(get_python_artifact_file)
local artifact_version=$(echo $artifact_file | perl -lne '/ambari-python-(.*?)\.tar\.gz/ && print $1')
echo $artifact_version
}

function clean() {
if [[ -d "$SCRIPT_DIR/dist" ]]; then
echo "Removing '$SCRIPT_DIR/dist' directoy ..."
rm -r "$SCRIPT_DIR/dist"
echo "Directory '$SCRIPT_DIR/dist' successfully deleted."
fi
if [[ -d "$SCRIPT_DIR/ambari_python.egg-info" ]]; then
echo "Removing '$SCRIPT_DIR/ambari_python.egg-info' directoy ..."
rm -r "$SCRIPT_DIR/ambari_python.egg-info"
echo "Directory '$SCRIPT_DIR/ambari_python.egg-info' successfully deleted."
fi
if [[ -d "$SCRIPT_DIR/target/ambari-python-dist" ]]; then
echo "Removing '$SCRIPT_DIR/target/ambari-python' directoy ..."
rm -r "$SCRIPT_DIR/target/ambari-python-dist"
echo "Directory '$SCRIPT_DIR/target/ambari-python' successfully deleted."
fi
}

function generate_site_packages() {
local version="$1"
pip install $SCRIPT_DIR/dist/ambari-python-$version.tar.gz -I --install-option="--prefix=$SCRIPT_DIR/target/ambari-python-dist"
}

function archive_python_dist() {
local artifact="$1"
local site_packages_dir=$(find $SCRIPT_DIR/target/ambari-python-dist -name "site-packages")
local base_dir="`dirname $site_packages_dir`" # use this to make it work with different python versions
if [[ -f "$SCRIPT_DIR/target/$artifact" ]]; then
echo "Removing '$SCRIPT_DIR/target/$artifact' file ..."
echo "File '$SCRIPT_DIR/target/$artifact' successfully deleted."
fi
tar -zcf $SCRIPT_DIR/target/$artifact -C $base_dir site-packages
}

function install() {
local artifact_file="$1"
local version="$2"
mvn install:install-file -Dfile=$artifact_file -DgeneratePom=true -Dversion=$version -DartifactId=ambari-python -DgroupId=org.apache.ambari -Dpackaging=tar.gz
}

function deploy() {
local artifact_file="$1"
local version="$2"
local repo_id="$3"
local repo_url="$4"
mvn deploy:deploy-file -Dfile=$artifact_file -Dpackaging=tar.gz -DgeneratePom=true -Dversion=$version -DartifactId=ambari-python -DgroupId=org.apache.ambari -Durl="$repo_url" -DrepositoryId="$repo_url"
}

function run_setup_py() {
local version="$1"
if [[ ! -z "$version" ]]; then
env AMBARI_VERSION="$version" python setup.py sdist
else
python setup.py sdist
fi
}

function main() {
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-d|--deploy)
local DEPLOY="true"
shift 1
;;
-c|--clean)
local CLEAN="true"
shift 1
;;
-v|--version)
local VERSION="$2"
shift 2
;;
-i|--repository-id)
local REPOSITORY_ID="$2"
shift 2
;;
-r|--repository-url)
local REPOSITORY_URL="$2"
shift 2
;;
-h|--help)
shift 1
print_help
exit 0
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done

if [[ -z "$DEPLOY" ]] ; then
DEPLOY="false"
fi

clean
if [[ "$CLEAN" == "true" ]]; then
return 0
fi

run_setup_py "$VERSION"
local artifact_name=$(get_python_artifact_file)
local artifact_version=$(get_version)

generate_site_packages "$artifact_version"
archive_python_dist "$artifact_name"

install "$SCRIPT_DIR/target/$artifact_name" "$artifact_version"

if [[ "$DEPLOY" == "true" ]] ; then
if [[ -z "$REPOSITORY_ID" ]] ; then
echo "Repository id option is required for deploying ambari-python artifact (-i or --repository-id)"
exit 1
fi
if [[ -z "$REPOSITORY_URL" ]] ; then
echo "Repository url option is required for deploying ambari-python artifact (-r or --repository-url)"
exit 1
fi
deploy "$SCRIPT_DIR/target/$artifact_name" "$artifact_version" "$REPOSITORY_ID" "$REPOSITORY_URL"
else
echo "Skip deploying ambari-python artifact to remote repository."
fi
}

main ${1+"$@"}
36 changes: 29 additions & 7 deletions setup.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,35 @@ def create_package_dir_map():

return package_dirs

__version__ = "3.0.0.dev0"
__version__ = "2.0.0.0-SNAPSHOT"

def get_version():
ambari_version = os.environ["AMBARI_VERSION"] if "AMBARI_VERSION" in os.environ else __version__
print ambari_version
return ambari_version
"""
Obtain ambari version during the build from pom.xml, which will be stored in PKG-INFO file.
During installation from pip, pom.xml is not included in the distribution but PKG-INFO is, so it can be used
instead of pom.xml file. If for some reason both are not exists use the default __version__ variable.
All of these can be overridden by AMBARI_VERSION environment variable.
"""
base_dir = dirname(__file__)
if "AMBARI_VERSION" in os.environ:
return os.environ["AMBARI_VERSION"]
elif os.path.exists(os.path.join(base_dir, 'pom.xml')):
from xml.etree import ElementTree as et
ns = "http://maven.apache.org/POM/4.0.0"
et.register_namespace('', ns)
tree = et.ElementTree()
tree.parse(os.path.join(base_dir, 'pom.xml'))
parent_version_tag = tree.getroot().find("{%s}version" % ns)
return parent_version_tag.text if parent_version_tag is not None else __version__
elif os.path.exists(os.path.join(base_dir, 'PKG-INFO')):
import re
version = None
version_re = re.compile('^Version: (.+)$', re.M)
with open(os.path.join(base_dir, 'PKG-INFO')) as f:
version = version_re.search(f.read()).group(1)
return version if version is not None else __version__
else:
return __version__

"""
Example usage:
Expand All @@ -64,9 +88,7 @@ def get_version():
python setup.py sdist -d "my/dist/location" upload -r "http://localhost:8080"
Installing from pip:
- pip install --extra-index-url=http://localhost:8080 ambari-python==2.7.1 // 3.0.0.dev0 is the snapshot version
Note: using 'export AMBARI_VERSION=2.7.1' before commands you can redefine the package version, but you will need this export during the pip install as well
- pip install --extra-index-url=http://localhost:8080 ambari-python==2.7.1.0 // 2.0.0.0-SNAPSHOT is the snapshot version
"""
setup(
name = "ambari-python",
Expand Down

0 comments on commit 68d0b64

Please sign in to comment.