Cleanup broker and cbs blueprints
[dcaegen2/platform/blueprints.git] / mvn-phase-script.sh
1 #!/bin/bash
2
3 # ================================================================================
4 # Copyright (c) 2017 AT&T Intellectual Property. All rights reserved.
5 # ================================================================================
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 #     http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 # ============LICENSE_END=========================================================
18 #
19 # ECOMP is a trademark and service mark of AT&T Intellectual Property.
20
21 set -ex
22
23
24 echo "running script: [$0] for module [$1] at stage [$2]"
25
26 MVN_PROJECT_MODULEID="$1"
27 MVN_PHASE="$2"
28
29
30 FQDN="${MVN_PROJECT_GROUPID}.${MVN_PROJECT_ARTIFACTID}"
31 if [ "$MVN_PROJECT_MODULEID" == "__" ]; then
32   MVN_PROJECT_MODULEID=""
33 fi
34
35 if [[ "$MVN_PROJECT_VERSION" == *SNAPSHOT ]]; then
36   echo "=> for SNAPSHOT artifact build"
37   MVN_DEPLOYMENT_TYPE='SNAPSHOT'
38 else
39   echo "=> for STAGING/RELEASE artifact build"
40   MVN_DEPLOYMENT_TYPE='STAGING'
41 fi
42 echo "MVN_DEPLOYMENT_TYPE is             [$MVN_DEPLOYMENT_TYPE]"
43
44
45 TIMESTAMP=$(date +%C%y%m%dT%H%M%S)
46
47 # expected environment variables
48 if [ -z "${MVN_NEXUSPROXY}" ]; then
49     echo "MVN_NEXUSPROXY environment variable not set.  Cannot proceed"
50     exit
51 fi
52
53 MVN_NEXUSPROXY_HOST=$(echo "$MVN_NEXUSPROXY" |cut -f3 -d'/' | cut -f1 -d':')
54 echo "=> Nexus Proxy at $MVN_NEXUSPROXY_HOST, $MVN_NEXUSPROXY"
55
56 if [ -z "$WORKSPACE" ]; then
57     WORKSPACE=$(pwd)
58 fi
59
60 # mvn phase in life cycle
61 MVN_PHASE="$2"
62
63
64 echo "MVN_PROJECT_MODULEID is            [$MVN_PROJECT_MODULEID]"
65 echo "MVN_PHASE is                       [$MVN_PHASE]"
66 echo "MVN_PROJECT_GROUPID is             [$MVN_PROJECT_GROUPID]"
67 echo "MVN_PROJECT_ARTIFACTID is          [$MVN_PROJECT_ARTIFACTID]"
68 echo "MVN_PROJECT_VERSION is             [$MVN_PROJECT_VERSION]"
69 echo "MVN_NEXUSPROXY is                  [$MVN_NEXUSPROXY]"
70 echo "MVN_RAWREPO_BASEURL_UPLOAD is      [$MVN_RAWREPO_BASEURL_UPLOAD]"
71 echo "MVN_RAWREPO_BASEURL_DOWNLOAD is    [$MVN_RAWREPO_BASEURL_DOWNLOAD]"
72 MVN_RAWREPO_HOST=$(echo "$MVN_RAWREPO_BASEURL_UPLOAD" | cut -f3 -d'/' |cut -f1 -d':')
73 echo "MVN_RAWREPO_HOST is                [$MVN_RAWREPO_HOST]"
74 echo "MVN_RAWREPO_SERVERID is            [$MVN_RAWREPO_SERVERID]"
75 echo "MVN_DOCKERREGISTRY_DAILY is        [$MVN_DOCKERREGISTRY_DAILY]"
76 echo "MVN_DOCKERREGISTRY_RELEASE is      [$MVN_DOCKERREGISTRY_RELEASE]"
77
78 clean_templated_files() 
79 {
80   TEMPLATE_FILES=$(find . -name "*-template")
81   for F in $TEMPLATE_FILES; do
82     F2=$(echo "$F" | sed 's/-template$//')
83     rm -f "$F2"
84   done
85 }
86
87
88 expand_templates() 
89 {
90   # set up env variables, get ready for template resolution
91   # NOTE: CCSDK artifacts do not distinguish REALESE vs SNAPSHOTs
92   export ONAPTEMPLATE_RAWREPOURL_org_onap_ccsdk_platform_plugins_releases="$MVN_RAWREPO_BASEURL_DOWNLOAD/org.onap.ccsdk.platform.plugins"
93   export ONAPTEMPLATE_RAWREPOURL_org_onap_ccsdk_platform_plugins_snapshots="$MVN_RAWREPO_BASEURL_DOWNLOAD/org.onap.ccsdk.platform.plugins"
94   export ONAPTEMPLATE_RAWREPOURL_org_onap_ccsdk_platform_blueprints_releases="$MVN_RAWREPO_BASEURL_DOWNLOAD/org.onap.ccsdk.platform.blueprints"
95   export ONAPTEMPLATE_RAWREPOURL_org_onap_ccsdk_platform_blueprints_snapshots="$MVN_RAWREPO_BASEURL_DOWNLOAD/org.onap.ccsdk.platform.blueprints"
96  
97   export ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_releases="$MVN_RAWREPO_BASEURL_DOWNLOAD/org.onap.dcaegen2/releases"
98   export ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_snapshots="$MVN_RAWREPO_BASEURL_DOWNLOAD/org.onap.dcaegen2/snapshots"
99   export ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_platform_plugins_releases="$MVN_RAWREPO_BASEURL_DOWNLOAD/org.onap.dcaegen2.platform.plugins/releases"
100   export ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_platform_plugins_snapshots="$MVN_RAWREPO_BASEURL_DOWNLOAD/org.onap.dcaegen2.platform.plugins/snapshots"
101   export ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_platform_blueprints_releases="$MVN_RAWREPO_BASEURL_DOWNLOAD/org.onap.dcaegen2.platform.blueprints/releases"
102   export ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_platform_blueprints_snapshots="$MVN_RAWREPO_BASEURL_DOWNLOAD/org.onap.dcaegen2.platform.blueprints/snapshots"
103
104   export ONAPTEMPLATE_PYPIURL_org_onap_dcaegen2="${MVN_NEXUSPROXY}/content/sites/pypi"
105
106   export ONAPTEMPLATE_DOCKERREGURL_org_onap_dcaegen2_releases="$MVN_DOCKERREGISTRY_DAILY"
107   export ONAPTEMPLATE_DOCKERREGURL_org_onap_dcaegen2_snapshots="$MVN_DOCKERREGISTRY_DAILY/snapshots"
108
109
110   TEMPLATE_FILES=$(find . -name "*-template")
111   for F in $TEMPLATE_FILES; do
112     F2=$(echo "$F" | sed 's/-template$//')
113     cp "$F" "$F2"
114     MOD=$(stat --format '%a' "$F")
115     chmod "$MOD" "$F2"
116   done
117    
118
119   TEMPLATES=$(env |grep ONAPTEMPLATE)
120   if [ -z "$TEMPLATES" ]; then
121     return 0
122   fi
123
124   echo "====> Expanding the following template from environment variables "
125   echo "[$TEMPLATES]"
126   SELFFILE=$(echo "$0" | rev | cut -f1 -d '/' | rev)
127   for TEMPLATE in $TEMPLATES; do
128     KEY=$(echo "$TEMPLATE" | cut -f1 -d'=')
129     VALUE=$(echo "$TEMPLATE" | cut -f2 -d'=')
130     VALUE2=$(echo "$TEMPLATE" | cut -f2 -d'=' |sed 's/\//\\\//g')
131     FILES=$(grep -rlv "$KEY")
132
133     if [ -z "$FILES" ]; then
134       continue
135     fi
136
137     # assuming FILES is not longer than 2M bytes, the limit for variable value max size on this VM
138     for F in $FILES; do
139       if [[ $F == *"$SELFFILE" ]]; then
140         continue
141       fi
142       if [[ "$F" == *-template ]]; then
143         continue
144       fi
145
146       echo "======> Resolving template $KEY to value $VALUE for file $F"
147       sed -i "s/{{[[:space:]]*$KEY[[:space:]]*}}/$VALUE2/g" "$F"
148       #cat "$F"
149     done
150
151     #if [ ! -z "$FILES" ]; then
152     #   echo "====> Expanding template $VALUE to value $VALUE"
153     #   #CMD="grep -rl \"$VALUE\" | tr '\n' '\0' | xargs -0 sed -i \"s/{{[[:space:]]*$VALUE[[:space:]]*}}/$VALUE/g\""
154     #   grep -rl "$KEY" | tr '\n' '\0' | xargs -0 sed -i 's/$KEY/$VALUE2/g'
155     #   #echo $CMD
156     #   #eval $CMD
157     #fi
158   done
159   echo "====> Done template expanding"
160 }
161
162 test_templates()
163 {
164     # make certain that the type references exist
165     TMP=$(mktemp)
166     trap 'rm -f $TMP' 0 1 2 3 15
167     find . -name '*-template' | sed -e 's/-template$//' |
168     while read file
169     do
170         egrep '^  - .?https?://' < $file
171     done  | awk '{print $2}' | sed -e 's/"//g' | sort -u |
172     while read url
173     do
174         curl -L -w '%{http_code}' -s -o /dev/null "$url" > $TMP
175         case $(< $TMP) in
176             2* ) ;;
177             * ) echo ">>>>>>>>>>>>>>>> $url not found <<<<<<<<<<<<<<<<" ;;
178         esac
179     done
180 }
181
182
183 run_tox_test() 
184
185   set -x
186   CURDIR=$(pwd)
187   TOXINIS=$(find . -name "tox.ini")
188   for TOXINI in "${TOXINIS[@]}"; do
189     DIR=$(echo "$TOXINI" | rev | cut -f2- -d'/' | rev)
190     cd "${CURDIR}/${DIR}"
191     rm -rf ./venv-tox ./.tox
192     virtualenv ./venv-tox
193     source ./venv-tox/bin/activate
194     pip install --upgrade pip
195     pip install --upgrade tox argparse
196     pip freeze
197     tox
198     deactivate
199     rm -rf ./venv-tox ./.tox
200   done
201 }
202
203 build_wagons() 
204 {
205   rm -rf ./*.wgn venv-pkg
206
207   SETUPFILES=$(find . -name "setup.py")
208   for SETUPFILE in $SETUPFILES; do
209     PLUGIN_DIR=$(echo "$SETUPFILE" |rev | cut -f 2- -d '/' |rev)
210     PLUGIN_NAME=$(grep 'name' "$SETUPFILE" | cut -f2 -d'=' | sed 's/[^0-9a-zA-Z\.]*//g')
211     PLUGIN_VERSION=$(grep 'version' "$SETUPFILE" | cut -f2 -d'=' | sed 's/[^0-9\.]*//g')
212
213     echo "In $PLUGIN_DIR, $PLUGIN_NAME, $PLUGIN_VERSION"
214
215     virtualenv ./venv-pkg
216     source ./venv-pkg/bin/activate
217     pip install --upgrade pip
218     pip install wagon
219     wagon create --format tar.gz "$PLUGIN_DIR"
220     deactivate
221     rm -rf venv-pkg
222
223     PKG_FILE_NAMES=( "${PLUGIN_NAME}-${PLUGIN_VERSION}"*.wgn )
224     echo Built package: "${PKG_FILE_NAMES[@]}"
225   done
226 }
227
228
229 upload_raw_file() 
230 {
231   # Extract the username and password to the nexus repo from the settings file
232   USER=$(xpath -q -e "//servers/server[id='$MVN_RAWREPO_SERVERID']/username/text()" "$SETTINGS_FILE")
233   PASS=$(xpath -q -e "//servers/server[id='$MVN_RAWREPO_SERVERID']/password/text()" "$SETTINGS_FILE")
234   NETRC=$(mktemp)
235   echo "machine $MVN_RAWREPO_HOST login $USER password $PASS" > "$NETRC"
236
237   REPO="$MVN_RAWREPO_BASEURL_UPLOAD"
238
239   OUTPUT_FILE=$1
240   EXT=$(echo "$OUTPUT_FILE" | rev |cut -f1 -d '.' |rev)
241   if [ "$EXT" == 'yaml' ]; then
242     OUTPUT_FILE_TYPE='text/x-yaml'
243   elif [ "$EXT" == 'sh' ]; then
244     OUTPUT_FILE_TYPE='text/x-shellscript'
245   elif [ "$EXT" == 'gz' ]; then
246     OUTPUT_FILE_TYPE='application/gzip'
247   elif [ "$EXT" == 'wgn' ]; then
248     OUTPUT_FILE_TYPE='application/gzip'
249   else
250     OUTPUT_FILE_TYPE='application/octet-stream'
251   fi
252
253
254   if [ "$MVN_DEPLOYMENT_TYPE" == 'SNAPSHOT' ]; then
255     SEND_TO="${REPO}/${FQDN}/snapshots"
256   elif [ "$MVN_DEPLOYMENT_TYPE" == 'STAGING' ]; then
257     SEND_TO="${REPO}/${FQDN}/releases"
258   else
259     echo "Unreconfnized deployment type, quit"
260     exit 1
261   fi
262   if [ ! -z $MVN_PROJECT_MODULEID ]; then
263     SEND_TO="$SEND_TO/$MVN_PROJECT_MODULEID"
264   fi 
265
266   echo "Sending ${OUTPUT_FILE} to Nexus: ${SEND_TO}"
267   curl -vkn --netrc-file "${NETRC}" --upload-file "${OUTPUT_FILE}" -X PUT -H "Content-Type: $OUTPUT_FILE_TYPE" "${SEND_TO}/${OUTPUT_FILE}-${MVN_PROJECT_VERSION}-${TIMESTAMP}"
268   curl -vkn --netrc-file "${NETRC}" --upload-file "${OUTPUT_FILE}" -X PUT -H "Content-Type: $OUTPUT_FILE_TYPE" "${SEND_TO}/${OUTPUT_FILE}-${MVN_PROJECT_VERSION}"
269   curl -vkn --netrc-file "${NETRC}" --upload-file "${OUTPUT_FILE}" -X PUT -H "Content-Type: $OUTPUT_FILE_TYPE" "${SEND_TO}/${OUTPUT_FILE}"
270 }
271
272
273
274 upload_wagons_and_type_yamls()
275 {
276   WAGONS=$(ls -1 ./*.wgn)
277   for WAGON in $WAGONS ; do
278     WAGON_NAME=$(echo "$WAGON" | cut -f1 -d '-')
279     WAGON_VERSION=$(echo "$WAGON" | cut -f2 -d '-')
280     WAGON_TYPEFILE=$(grep -rl "$WAGON_NAME" | grep yaml | head -1)
281    
282     upload_raw_file "$WAGON"
283     upload_raw_file "$WAGON_TYPEFILE"
284   done
285 }
286
287 upload_files_of_extension()
288 {
289   FILES=$(ls -1 ./*."$1")
290   for F in $FILES ; do
291     upload_raw_file "$F"
292   done
293 }
294
295
296
297 build_and_push_docker()
298 {
299   IMAGENAME="onap/${FQDN}.${MVN_PROJECT_MODULEID}"
300   IMAGENAME=$(echo "$IMAGENAME" | sed -e 's/_*$//g' -e 's/\.*$//g')
301
302   # use the major and minor version of the MVN artifact version as docker image version
303   VERSION="${MVN_PROJECT_VERSION//[^0-9.]/}"
304   VERSION2=$(echo "$VERSION" | cut -f1-2 -d'.')
305
306   LFQI="${IMAGENAME}:${VERSION}-${TIMESTAMP}"
307   BUILD_PATH="${WORKSPACE}"
308   # build a docker image
309   docker build --rm -f "${WORKSPACE}"/Dockerfile -t "${LFQI}" "${BUILD_PATH}"
310
311   REPO=""
312   if [ $MVN_DEPLOYMENT_TYPE == "SNAPSHOT" ]; then
313      REPO=$MVN_DOCKERREGISTRY_DAILY
314   elif [ $MVN_DEPLOYMENT_TYPE == "STAGING" ]; then
315      # there seems to be no staging docker registry?  set to use SNAPSHOT also
316      #REPO=$MVN_DOCKERREGISTRY_RELEASE
317      REPO=$MVN_DOCKERREGISTRY_DAILY
318   else
319      echo "Fail to determine DEPLOYMENT_TYPE"
320      REPO=$MVN_DOCKERREGISTRY_DAILY
321   fi
322   echo "DEPLOYMENT_TYPE is: $MVN_DEPLOYMENT_TYPE, repo is $REPO"
323
324   if [ ! -z "$REPO" ]; then
325     USER=$(xpath -e "//servers/server[id='$REPO']/username/text()" "$SETTINGS_FILE")
326     PASS=$(xpath -e "//servers/server[id='$REPO']/password/text()" "$SETTINGS_FILE")
327     if [ -z "$USER" ]; then
328       echo "Error: no user provided"
329     fi
330     if [ -z "$PASS" ]; then
331       echo "Error: no password provided"
332     fi
333     [ -z "$PASS" ] && PASS_PROVIDED="<empty>" || PASS_PROVIDED="<password>"
334     echo docker login "$REPO" -u "$USER" -p "$PASS_PROVIDED"
335     docker login "$REPO" -u "$USER" -p "$PASS"
336
337     if [ $MVN_DEPLOYMENT_TYPE == "SNAPSHOT" ]; then
338       REPO="$REPO/snapshots"
339     elif [ $MVN_DEPLOYMENT_TYPE == "STAGING" ]; then
340       # there seems to be no staging docker registry?  set to use SNAPSHOT also
341       #REPO=$MVN_DOCKERREGISTRY_RELEASE
342       REPO="$REPO"
343     else
344       echo "Fail to determine DEPLOYMENT_TYPE"
345       REPO="$REPO/unknown"
346     fi
347
348     OLDTAG="${LFQI}"
349     PUSHTAGS="${REPO}/${IMAGENAME}:${VERSION2}-${TIMESTAMP} ${REPO}/${IMAGENAME}:${VERSION2} ${REPO}/${IMAGENAME}:${VERSION2}-latest"
350     for NEWTAG in ${PUSHTAGS}
351     do
352       echo "tagging ${OLDTAG} to ${NEWTAG}"
353       docker tag "${OLDTAG}" "${NEWTAG}"
354       echo "pushing ${NEWTAG}"
355       docker push "${NEWTAG}"
356       OLDTAG="${NEWTAG}"
357     done
358   fi
359
360 }
361
362
363
364 # Customize the section below for each project
365 case $MVN_PHASE in
366 clean)
367   echo "==> clean phase script"
368   clean_templated_files
369   rm -rf ./venv-* ./*.wgn
370   ;;
371 generate-sources)
372   echo "==> generate-sources phase script"
373   expand_templates
374   ;;
375 compile)
376   echo "==> compile phase script"
377   ;;
378 test)
379   echo "==> test phase script"
380   test_templates
381   ;;
382 package)
383   echo "==> package phase script"
384   ;;
385 install)
386   echo "==> install phase script"
387   ;;
388 deploy)
389   echo "==> deploy phase script"
390   upload_files_of_extension yaml
391
392   case $MVN_PROJECT_MODULEID in
393   bootstrap)
394     build_and_push_docker
395     ;;
396   scripts)
397     upload_files_of_extension sh
398     ;;
399   *)
400     echo "====> unknown mvn project module"
401     ;;
402   esac
403   ;;
404 *)
405   echo "==> unprocessed phase"
406   ;;
407 esac
408