FIX: Ligato building mechanics for rls1901
[csit.git] / resources / libraries / bash / function / gather.sh
1 # Copyright (c) 2018 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
5 #
6 #     http://www.apache.org/licenses/LICENSE-2.0
7 #
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
13
14 set -exuo pipefail
15
16 # This library defines functions used mainly by "bootstrap" entry scripts.
17 # Generally, the functions assume "common.sh" library has been sourced already.
18
19 # Keep functions ordered alphabetically, please.
20
21 # TODO: Add a link to bash style guide.
22
23
24 function gather_build () {
25
26     set -exuo pipefail
27
28     # Variables read:
29     # - TEST_CODE - String affecting test selection, usually jenkins job name.
30     # - DOWNLOAD_DIR - Path to directory pybot takes the build to test from.
31     # Variables set:
32     # - DUT - CSIT test/ subdirectory containing suites to execute.
33     # Directories updated:
34     # - ${DOWNLOAD_DIR} - Files needed by tests are gathered here.
35     # Functions called:
36     # - die - Print to stderr and exit, defined in common.sh
37     # - gather_dpdk, gather_vpp, gather_ligato - See their definitions.
38     # Multiple other side effects are possible,
39     # see functions called from here for their current description.
40
41     # TODO: Separate DUT-from-TEST_CODE from gather-for-DUT,
42     #   when the first one becomes relevant for per_patch.
43
44     pushd "${DOWNLOAD_DIR}" || die "Pushd failed."
45     case "${TEST_CODE}" in
46         *"hc2vpp"*)
47             DUT="hc2vpp"
48             # FIXME: Avoid failing on empty ${DOWNLOAD_DIR}.
49             ;;
50         *"vpp"*)
51             DUT="vpp"
52             gather_vpp || die "The function should have died on error."
53             ;;
54         *"ligato"*)
55             DUT="kubernetes"
56             gather_ligato || die "The function should have died on error."
57             ;;
58         *"dpdk"*)
59             DUT="dpdk"
60             gather_dpdk || die "The function should have died on error."
61             ;;
62         *)
63             die "Unable to identify DUT type from: ${TEST_CODE}"
64             ;;
65     esac
66     popd || die "Popd failed."
67 }
68
69
70 function gather_dpdk () {
71
72     set -exuo pipefail
73
74     # Ensure latest DPDK archive is downloaded.
75     #
76     # Variables read:
77     # - TEST_CODE - The test selection string from environment or argument.
78     # Hardcoded:
79     # - dpdk archive name to download if TEST_CODE is not time based.
80     # Directories updated:
81     # - ./ - Assumed ${DOWNLOAD_DIR}, dpdk-*.tar.xz is downloaded if not there.
82     # Functions called:
83     # - die - Print to stderr and exit, defined in common.sh
84
85     dpdk_repo="https://fast.dpdk.org/rel"
86     # Use downloaded packages with specific version
87     if [[ "${TEST_CODE}" == *"daily"* ]] || \
88        [[ "${TEST_CODE}" == *"weekly"* ]] || \
89        [[ "${TEST_CODE}" == *"timed"* ]];
90     then
91         echo "Downloading latest DPDK packages from repo..."
92         # URL is not in quotes, calling command from variable keeps them.
93         wget_command=("wget" "--no-check-certificate" "-nv" "-O" "-")
94         wget_command+=("${dpdk_repo}")
95         dpdk_stable_ver="$("${wget_command[@]}" | grep -v "2015"\
96             | grep -Eo 'dpdk-[^\"]+xz' | tail -1)" || {
97             die "Composite piped command failed."
98         }
99     else
100         echo "Downloading DPDK packages of specific version from repo..."
101         # TODO: Can we autodetect this based on what CSIT-stable VPP uses?
102         dpdk_stable_ver="dpdk-18.11.tar.xz"
103     fi
104     # TODO: Use "wget -N" instead checking for file presence?
105     if [[ ! -f "${dpdk_stable_ver}" ]]; then
106         wget -nv --no-check-certificate "${dpdk_repo}/${dpdk_stable_ver}" || {
107             die "Failed to get DPDK package from: ${dpdk_repo}"
108         }
109     fi
110 }
111
112
113 function gather_ligato () {
114
115     set -exuo pipefail
116
117     # Pull & extract docker image ligato/vpp-agent and put it to
118     # ${DOWNLOAD_DIR}/.
119     #
120     # Access rights needed for:
121     # - "sudo" without password.
122     # - With sudo:
123     #   - "docker" commands have everything they needs.
124     # Variables read:
125     # - DOWNLOAD_DIR - Path to directory pybot takes the build to test from.
126     # - CSIT_DIR - Path to existing root of local CSIT git repository.
127     # Files read:
128     # - ${CSIT_DIR}/VPP_AGENT_STABLE_VER - Vpp agent version to use.
129     # Directories updated:
130     # - ${DOWNLOAD_DIR} - Docker image stored.
131     # System consequences:
132     # - Docker package is installed.
133     # - Presumably dockerd process is started.
134     # Other hardcoded values:
135     # - Docker image file name to download and install.
136     # Functions called:
137     # - die - Print to stderr and exit, defined in common_functions.sh
138
139     vpp_agent_ver="$(< "${CSIT_DIR}/VPP_AGENT_STABLE_VER")" || {
140         die "Failed to read vpp-agent stable VPP version!"
141     }
142
143     # Install Docker.
144     curl -fsSL https://get.docker.com | sudo bash || {
145         die "Failed to install Docker package!"
146     }
147
148     pushd "${DOWNLOAD_DIR}" || die "Change directory failed!"
149     # Download vpp_agent docker image.
150     sudo docker pull "${vpp_agent_ver}" || die "Docker pull failed!"
151     # Export Docker image.
152     sudo docker save "${vpp_agent_ver}" | gzip > "prod_vpp_agent.tar.gz" || {
153         die "Failed to save Docker image!"
154     }
155     popd || die "Change directory failed!"
156 }
157
158
159 function gather_vpp () {
160
161     set -exuo pipefail
162
163     # Variables read:
164     # - BASH_FUNCTION_DIR - Bash directory with functions.
165     # - TEST_CODE - The test selection string from environment or argument.
166     # - DOWNLOAD_DIR - Path to directory pybot takes the build to test from.
167     # - CSIT_DIR - Path to existing root of local CSIT git repository.
168     # Files read:
169     # - ${CSIT_DIR}/DPDK_STABLE_VER - DPDK version to use
170     #   by csit-vpp not-timed jobs.
171     # - ${CSIT_DIR}/VPP_STABLE_VER_UBUNTU - VPP version to use by those.
172     # - ../vpp*.deb - Relative to ${DOWNLOAD_DIR}, copied for vpp-csit jobs.
173     # Directories updated:
174     # - ${DOWNLOAD_DIR}, vpp-*.deb files are copied here for vpp-csit jobs.
175     # - ./ - Assumed ${DOWNLOAD_DIR}, vpp-*.deb files
176     #   are downloaded here for csit-vpp.
177     # Functions called:
178     # - die - Print to stderr and exit, defined in common_functions.sh
179     # Bash scripts executed:
180     # - ${CSIT_DIR}/resources/tools/scripts/download_install_vpp_pkgs.sh
181     #   - Should download and extract requested files to ./.
182
183     case "${TEST_CODE}" in
184         # Not csit-vpp as this code is re-used by ligato gathering.
185         "csit-"*)
186             # Use downloaded packages with specific version.
187             if [[ "${TEST_CODE}" == *"daily"* ]] || \
188                ([[ "${TEST_CODE}" == *"weekly"* ]] && \
189                 [[ "${TEST_CODE}" != *"device"* ]]) || \
190                [[ "${TEST_CODE}" == *"semiweekly"* ]];
191             then
192                 warn "Downloading latest VPP packages from Packagecloud."
193             else
194                 warn "Downloading stable VPP packages from Packagecloud."
195                 if [[ "${TEST_CODE}" == *"device"* ]];
196                 then
197                     VPP_VERSION="$(<"${CSIT_DIR}/VPP_STABLE_VER_UBUNTU_BIONIC")" || {
198                         die "Read VPP stable version failed."
199                     }
200                 else
201                     VPP_VERSION="$(<"${CSIT_DIR}/VPP_STABLE_VER_UBUNTU")" || {
202                         die "Read VPP stable version failed."
203                     }
204                 fi
205             fi
206             source "${BASH_FUNCTION_DIR}/artifacts.sh" || die "Source failed."
207             download_artifacts || die
208             ;;
209         "vpp-csit-"*)
210             # Use locally built packages.
211             mv "${DOWNLOAD_DIR}"/../"vpp"*".deb" "${DOWNLOAD_DIR}"/ || {
212                 die "Move command failed."
213             }
214             ;;
215         *)
216             die "Unable to identify job type from: ${TEST_CODE}"
217             ;;
218     esac
219 }