Browse code

Split functions-common: python functions

Move Python-related functions into inc/python

Should be transparent to all callers as it is sourced from functions-common

Change-Id: I88043830cef9211b4e0baa91bfcc7a92125afa9f

Dean Troyer authored on 2015/01/31 05:38:35
Showing 3 changed files
... ...
@@ -13,6 +13,7 @@
13 13
 # Include the common functions
14 14
 FUNC_DIR=$(cd $(dirname "${BASH_SOURCE:-$0}") && pwd)
15 15
 source ${FUNC_DIR}/functions-common
16
+source ${FUNC_DIR}/inc/python
16 17
 
17 18
 # Save trace setting
18 19
 XTRACE=$(set +o | grep xtrace)
... ...
@@ -15,7 +15,6 @@
15 15
 # - OpenStack Functions
16 16
 # - Package Functions
17 17
 # - Process Functions
18
-# - Python Functions
19 18
 # - Service Functions
20 19
 # - System Functions
21 20
 #
... ...
@@ -1590,204 +1589,6 @@ function screen_stop {
1590 1590
 }
1591 1591
 
1592 1592
 
1593
-# Python Functions
1594
-# ================
1595
-
1596
-# Get the path to the pip command.
1597
-# get_pip_command
1598
-function get_pip_command {
1599
-    which pip || which pip-python
1600
-
1601
-    if [ $? -ne 0 ]; then
1602
-        die $LINENO "Unable to find pip; cannot continue"
1603
-    fi
1604
-}
1605
-
1606
-# Get the path to the direcotry where python executables are installed.
1607
-# get_python_exec_prefix
1608
-function get_python_exec_prefix {
1609
-    if is_fedora || is_suse; then
1610
-        echo "/usr/bin"
1611
-    else
1612
-        echo "/usr/local/bin"
1613
-    fi
1614
-}
1615
-
1616
-# Wrapper for ``pip install`` to set cache and proxy environment variables
1617
-# Uses globals ``OFFLINE``, ``TRACK_DEPENDS``, ``*_proxy``
1618
-# pip_install package [package ...]
1619
-function pip_install {
1620
-    local xtrace=$(set +o | grep xtrace)
1621
-    set +o xtrace
1622
-    local offline=${OFFLINE:-False}
1623
-    if [[ "$offline" == "True" || -z "$@" ]]; then
1624
-        $xtrace
1625
-        return
1626
-    fi
1627
-
1628
-    if [[ -z "$os_PACKAGE" ]]; then
1629
-        GetOSVersion
1630
-    fi
1631
-    if [[ $TRACK_DEPENDS = True && ! "$@" =~ virtualenv ]]; then
1632
-        # TRACK_DEPENDS=True installation creates a circular dependency when
1633
-        # we attempt to install virtualenv into a virualenv, so we must global
1634
-        # that installation.
1635
-        source $DEST/.venv/bin/activate
1636
-        local cmd_pip=$DEST/.venv/bin/pip
1637
-        local sudo_pip="env"
1638
-    else
1639
-        local cmd_pip=$(get_pip_command)
1640
-        local sudo_pip="sudo -H"
1641
-    fi
1642
-
1643
-    local pip_version=$(python -c "import pip; \
1644
-                        print(pip.__version__.strip('.')[0])")
1645
-    if (( pip_version<6 )); then
1646
-        die $LINENO "Currently installed pip version ${pip_version} does not" \
1647
-            "meet minimum requirements (>=6)."
1648
-    fi
1649
-
1650
-    $xtrace
1651
-    $sudo_pip \
1652
-        http_proxy=${http_proxy:-} \
1653
-        https_proxy=${https_proxy:-} \
1654
-        no_proxy=${no_proxy:-} \
1655
-        $cmd_pip install \
1656
-        $@
1657
-
1658
-    INSTALL_TESTONLY_PACKAGES=$(trueorfalse False INSTALL_TESTONLY_PACKAGES)
1659
-    if [[ "$INSTALL_TESTONLY_PACKAGES" == "True" ]]; then
1660
-        local test_req="$@/test-requirements.txt"
1661
-        if [[ -e "$test_req" ]]; then
1662
-            $sudo_pip \
1663
-                http_proxy=${http_proxy:-} \
1664
-                https_proxy=${https_proxy:-} \
1665
-                no_proxy=${no_proxy:-} \
1666
-                $cmd_pip install \
1667
-                -r $test_req
1668
-        fi
1669
-    fi
1670
-}
1671
-
1672
-# should we use this library from their git repo, or should we let it
1673
-# get pulled in via pip dependencies.
1674
-function use_library_from_git {
1675
-    local name=$1
1676
-    local enabled=1
1677
-    [[ ,${LIBS_FROM_GIT}, =~ ,${name}, ]] && enabled=0
1678
-    return $enabled
1679
-}
1680
-
1681
-# setup a library by name. If we are trying to use the library from
1682
-# git, we'll do a git based install, otherwise we'll punt and the
1683
-# library should be installed by a requirements pull from another
1684
-# project.
1685
-function setup_lib {
1686
-    local name=$1
1687
-    local dir=${GITDIR[$name]}
1688
-    setup_install $dir
1689
-}
1690
-
1691
-# setup a library by name in editiable mode. If we are trying to use
1692
-# the library from git, we'll do a git based install, otherwise we'll
1693
-# punt and the library should be installed by a requirements pull from
1694
-# another project.
1695
-#
1696
-# use this for non namespaced libraries
1697
-function setup_dev_lib {
1698
-    local name=$1
1699
-    local dir=${GITDIR[$name]}
1700
-    setup_develop $dir
1701
-}
1702
-
1703
-# this should be used if you want to install globally, all libraries should
1704
-# use this, especially *oslo* ones
1705
-function setup_install {
1706
-    local project_dir=$1
1707
-    setup_package_with_req_sync $project_dir
1708
-}
1709
-
1710
-# this should be used for projects which run services, like all services
1711
-function setup_develop {
1712
-    local project_dir=$1
1713
-    setup_package_with_req_sync $project_dir -e
1714
-}
1715
-
1716
-# determine if a project as specified by directory is in
1717
-# projects.txt. This will not be an exact match because we throw away
1718
-# the namespacing when we clone, but it should be good enough in all
1719
-# practical ways.
1720
-function is_in_projects_txt {
1721
-    local project_dir=$1
1722
-    local project_name=$(basename $project_dir)
1723
-    return grep "/$project_name\$" $REQUIREMENTS_DIR/projects.txt >/dev/null
1724
-}
1725
-
1726
-# ``pip install -e`` the package, which processes the dependencies
1727
-# using pip before running `setup.py develop`
1728
-#
1729
-# Updates the dependencies in project_dir from the
1730
-# openstack/requirements global list before installing anything.
1731
-#
1732
-# Uses globals ``TRACK_DEPENDS``, ``REQUIREMENTS_DIR``, ``UNDO_REQUIREMENTS``
1733
-# setup_develop directory
1734
-function setup_package_with_req_sync {
1735
-    local project_dir=$1
1736
-    local flags=$2
1737
-
1738
-    # Don't update repo if local changes exist
1739
-    # Don't use buggy "git diff --quiet"
1740
-    # ``errexit`` requires us to trap the exit code when the repo is changed
1741
-    local update_requirements=$(cd $project_dir && git diff --exit-code >/dev/null || echo "changed")
1742
-
1743
-    if [[ $update_requirements != "changed" ]]; then
1744
-        if [[ "$REQUIREMENTS_MODE" == "soft" ]]; then
1745
-            if is_in_projects_txt $project_dir; then
1746
-                (cd $REQUIREMENTS_DIR; \
1747
-                    python update.py $project_dir)
1748
-            else
1749
-                # soft update projects not found in requirements project.txt
1750
-                (cd $REQUIREMENTS_DIR; \
1751
-                    python update.py -s $project_dir)
1752
-            fi
1753
-        else
1754
-            (cd $REQUIREMENTS_DIR; \
1755
-                python update.py $project_dir)
1756
-        fi
1757
-    fi
1758
-
1759
-    setup_package $project_dir $flags
1760
-
1761
-    # We've just gone and possibly modified the user's source tree in an
1762
-    # automated way, which is considered bad form if it's a development
1763
-    # tree because we've screwed up their next git checkin. So undo it.
1764
-    #
1765
-    # However... there are some circumstances, like running in the gate
1766
-    # where we really really want the overridden version to stick. So provide
1767
-    # a variable that tells us whether or not we should UNDO the requirements
1768
-    # changes (this will be set to False in the OpenStack ci gate)
1769
-    if [ $UNDO_REQUIREMENTS = "True" ]; then
1770
-        if [[ $update_requirements != "changed" ]]; then
1771
-            (cd $project_dir && git reset --hard)
1772
-        fi
1773
-    fi
1774
-}
1775
-
1776
-# ``pip install -e`` the package, which processes the dependencies
1777
-# using pip before running `setup.py develop`
1778
-# Uses globals ``STACK_USER``
1779
-# setup_develop_no_requirements_update directory
1780
-function setup_package {
1781
-    local project_dir=$1
1782
-    local flags=$2
1783
-
1784
-    pip_install $flags $project_dir
1785
-    # ensure that further actions can do things like setup.py sdist
1786
-    if [[ "$flags" == "-e" ]]; then
1787
-        safe_chown -R $STACK_USER $1/*.egg-info
1788
-    fi
1789
-}
1790
-
1791 1593
 # Plugin Functions
1792 1594
 # =================
1793 1595
 
1794 1596
new file mode 100644
... ...
@@ -0,0 +1,223 @@
0
+#!/bin/bash
1
+#
2
+# **inc/python** - Python-related functions
3
+#
4
+# Support for pip/setuptools interfaces and virtual environments
5
+#
6
+# External functions used:
7
+# - GetOSVersion
8
+# - is_fedora
9
+# - is_suse
10
+# - safe_chown
11
+
12
+# Save trace setting
13
+INC_PY_TRACE=$(set +o | grep xtrace)
14
+set +o xtrace
15
+
16
+
17
+# Python Functions
18
+# ================
19
+
20
+# Get the path to the pip command.
21
+# get_pip_command
22
+function get_pip_command {
23
+    which pip || which pip-python
24
+
25
+    if [ $? -ne 0 ]; then
26
+        die $LINENO "Unable to find pip; cannot continue"
27
+    fi
28
+}
29
+
30
+# Get the path to the direcotry where python executables are installed.
31
+# get_python_exec_prefix
32
+function get_python_exec_prefix {
33
+    if is_fedora || is_suse; then
34
+        echo "/usr/bin"
35
+    else
36
+        echo "/usr/local/bin"
37
+    fi
38
+}
39
+
40
+# Wrapper for ``pip install`` to set cache and proxy environment variables
41
+# Uses globals ``INSTALL_TESTONLY_PACKAGES``, ``OFFLINE``, ``TRACK_DEPENDS``,
42
+# ``*_proxy``
43
+# pip_install package [package ...]
44
+function pip_install {
45
+    local xtrace=$(set +o | grep xtrace)
46
+    set +o xtrace
47
+    local offline=${OFFLINE:-False}
48
+    if [[ "$offline" == "True" || -z "$@" ]]; then
49
+        $xtrace
50
+        return
51
+    fi
52
+
53
+    if [[ -z "$os_PACKAGE" ]]; then
54
+        GetOSVersion
55
+    fi
56
+    if [[ $TRACK_DEPENDS = True && ! "$@" =~ virtualenv ]]; then
57
+        # TRACK_DEPENDS=True installation creates a circular dependency when
58
+        # we attempt to install virtualenv into a virualenv, so we must global
59
+        # that installation.
60
+        source $DEST/.venv/bin/activate
61
+        local cmd_pip=$DEST/.venv/bin/pip
62
+        local sudo_pip="env"
63
+    else
64
+        local cmd_pip=$(get_pip_command)
65
+        local sudo_pip="sudo -H"
66
+    fi
67
+
68
+    local pip_version=$(python -c "import pip; \
69
+                        print(pip.__version__.strip('.')[0])")
70
+    if (( pip_version<6 )); then
71
+        die $LINENO "Currently installed pip version ${pip_version} does not" \
72
+            "meet minimum requirements (>=6)."
73
+    fi
74
+
75
+    $xtrace
76
+    $sudo_pip \
77
+        http_proxy=${http_proxy:-} \
78
+        https_proxy=${https_proxy:-} \
79
+        no_proxy=${no_proxy:-} \
80
+        $cmd_pip install \
81
+        $@
82
+
83
+    INSTALL_TESTONLY_PACKAGES=$(trueorfalse False INSTALL_TESTONLY_PACKAGES)
84
+    if [[ "$INSTALL_TESTONLY_PACKAGES" == "True" ]]; then
85
+        local test_req="$@/test-requirements.txt"
86
+        if [[ -e "$test_req" ]]; then
87
+            $sudo_pip \
88
+                http_proxy=${http_proxy:-} \
89
+                https_proxy=${https_proxy:-} \
90
+                no_proxy=${no_proxy:-} \
91
+                $cmd_pip install \
92
+                -r $test_req
93
+        fi
94
+    fi
95
+}
96
+
97
+# should we use this library from their git repo, or should we let it
98
+# get pulled in via pip dependencies.
99
+function use_library_from_git {
100
+    local name=$1
101
+    local enabled=1
102
+    [[ ,${LIBS_FROM_GIT}, =~ ,${name}, ]] && enabled=0
103
+    return $enabled
104
+}
105
+
106
+# setup a library by name. If we are trying to use the library from
107
+# git, we'll do a git based install, otherwise we'll punt and the
108
+# library should be installed by a requirements pull from another
109
+# project.
110
+function setup_lib {
111
+    local name=$1
112
+    local dir=${GITDIR[$name]}
113
+    setup_install $dir
114
+}
115
+
116
+# setup a library by name in editiable mode. If we are trying to use
117
+# the library from git, we'll do a git based install, otherwise we'll
118
+# punt and the library should be installed by a requirements pull from
119
+# another project.
120
+#
121
+# use this for non namespaced libraries
122
+function setup_dev_lib {
123
+    local name=$1
124
+    local dir=${GITDIR[$name]}
125
+    setup_develop $dir
126
+}
127
+
128
+# this should be used if you want to install globally, all libraries should
129
+# use this, especially *oslo* ones
130
+function setup_install {
131
+    local project_dir=$1
132
+    setup_package_with_req_sync $project_dir
133
+}
134
+
135
+# this should be used for projects which run services, like all services
136
+function setup_develop {
137
+    local project_dir=$1
138
+    setup_package_with_req_sync $project_dir -e
139
+}
140
+
141
+# determine if a project as specified by directory is in
142
+# projects.txt. This will not be an exact match because we throw away
143
+# the namespacing when we clone, but it should be good enough in all
144
+# practical ways.
145
+function is_in_projects_txt {
146
+    local project_dir=$1
147
+    local project_name=$(basename $project_dir)
148
+    return grep "/$project_name\$" $REQUIREMENTS_DIR/projects.txt >/dev/null
149
+}
150
+
151
+# ``pip install -e`` the package, which processes the dependencies
152
+# using pip before running `setup.py develop`
153
+#
154
+# Updates the dependencies in project_dir from the
155
+# openstack/requirements global list before installing anything.
156
+#
157
+# Uses globals ``TRACK_DEPENDS``, ``REQUIREMENTS_DIR``, ``UNDO_REQUIREMENTS``
158
+# setup_develop directory
159
+function setup_package_with_req_sync {
160
+    local project_dir=$1
161
+    local flags=$2
162
+
163
+    # Don't update repo if local changes exist
164
+    # Don't use buggy "git diff --quiet"
165
+    # ``errexit`` requires us to trap the exit code when the repo is changed
166
+    local update_requirements=$(cd $project_dir && git diff --exit-code >/dev/null || echo "changed")
167
+
168
+    if [[ $update_requirements != "changed" ]]; then
169
+        if [[ "$REQUIREMENTS_MODE" == "soft" ]]; then
170
+            if is_in_projects_txt $project_dir; then
171
+                (cd $REQUIREMENTS_DIR; \
172
+                    python update.py $project_dir)
173
+            else
174
+                # soft update projects not found in requirements project.txt
175
+                (cd $REQUIREMENTS_DIR; \
176
+                    python update.py -s $project_dir)
177
+            fi
178
+        else
179
+            (cd $REQUIREMENTS_DIR; \
180
+                python update.py $project_dir)
181
+        fi
182
+    fi
183
+
184
+    setup_package $project_dir $flags
185
+
186
+    # We've just gone and possibly modified the user's source tree in an
187
+    # automated way, which is considered bad form if it's a development
188
+    # tree because we've screwed up their next git checkin. So undo it.
189
+    #
190
+    # However... there are some circumstances, like running in the gate
191
+    # where we really really want the overridden version to stick. So provide
192
+    # a variable that tells us whether or not we should UNDO the requirements
193
+    # changes (this will be set to False in the OpenStack ci gate)
194
+    if [ $UNDO_REQUIREMENTS = "True" ]; then
195
+        if [[ $update_requirements != "changed" ]]; then
196
+            (cd $project_dir && git reset --hard)
197
+        fi
198
+    fi
199
+}
200
+
201
+# ``pip install -e`` the package, which processes the dependencies
202
+# using pip before running `setup.py develop`
203
+# Uses globals ``STACK_USER``
204
+# setup_develop_no_requirements_update directory
205
+function setup_package {
206
+    local project_dir=$1
207
+    local flags=$2
208
+
209
+    pip_install $flags $project_dir
210
+    # ensure that further actions can do things like setup.py sdist
211
+    if [[ "$flags" == "-e" ]]; then
212
+        safe_chown -R $STACK_USER $1/*.egg-info
213
+    fi
214
+}
215
+
216
+
217
+# Restore xtrace
218
+$INC_PY_TRACE
219
+
220
+# Local variables:
221
+# mode: shell-script
222
+# End: