dist: bionic

language: python
python:
- 3.6

env:
  global:
  - DB_NAME=ottertune
  - ADMIN_PASSWORD=changeme
  - ROOT=$TRAVIS_BUILD_DIR
  - WEB=$ROOT/server/website
  - CONTROLLER=$ROOT/client/controller
  - DRIVER=$ROOT/client/driver

matrix:
  include:
  - name: Docker
    env:
    - secure: "JdRlS4MAXv1wMBdQf98r4ugit1v0Emq7S/K3CpyP2jpj0QL0VFhPr/r3GFwq2BRM2y0vXQjD29AoZdiQLv4LULgp4AavcmL3kbD7SNNWileqCLbl3rHdGY1gNW4fYOYCPGMPxntYdm18vpXzoF/A81JUX0MMsw3Wh0dBtiQZQP7O4V+bX5hyuCqlxasfTI0Tl323MWao86I2nSmExvGTcYlissPKGb0+TS+qQjOshvJHtmv0PRxJ2a45fB1h1wkAqGKu0X7fXWAhoo9uPt4T9+oCW6bCklAZPbzm4wc3jurnQ//jS44ThtP4n+xH2mwwU9n0unMKl3I+so+R7nH7pE0YGTD+p/4p8lPXYCLlqllvuhNTf+JXLJoC+lIgQXl4qhtURPokohPxJXNRQRd1SWOyep85h9svX3Z+c3dj5160bM/ArB8jKuFtL1Cq/S7Je+liF3xE25BaFQ5P2DlVM1KxLbtvtaTAcvkxq/jr4zu7ZMAjJtDmF6hsuzflGYqNcElZlhMNtKoGeAfVNmpXvFoLt0Iezbafvc6izAqn/h6A+FKnCgmlOit+TyihqnAtIhj+TBgyOw0TFqJ4QKAb3pqL+FxFrH78yR/HGafNHBfvi6ND3b9BefQ0in2RimSSZbE90pdnxhtSxKUDch3hBd4Q0RxZbA/rRyiKQexxE9M="
    - secure: "MdkCbzD+Toqrnz++93EUDf7hOgkP4h8rU42lnHQ5iShnlnwYzMmI90jCFwF5DYThmaDleBn54EB8lsaFcdmjhrhPWPkDhcRZgRAdfCwq+OIV1lH3KbVwBeLnnfKeci+TNldWinoOgS3cFkz+uXm8tFcRZgGJ/IW8Tu/oD9QWZixP7Zyfp28GMzm+6Hmb1lVbpsnMwiKQQSyPQTv9NB4jG1pzvP45cID1WrmgZFYhpDWOrclcSmLSF4N0o7Fu2x6Ninz5FkHImOlbY47DVJAGxYQDDPOr63lM5T5aE++dnvNfk9wnJwTQ0wKErnLoRpMnc1O2YwajyamPTLmLafnoh4EbFl0WY0tG1Xi3B01fRbzbdi2htv+Ltk9UD2XjHmJEKgDOBXD9WzIDq20eRT1ArYZdfIrD71s9JPQ5KlOJiTYuKfRMiMs1cEDFxjiQOMFeGCROZ1w0v2syf6dBLBQqVeYnsNAGg8Nvrtcw9jfsORoA+AQffgy8s2gJGLCp0JYOTrgJ06hA63wMq11vq61WVOT6F/PSrUamaGtN+L+vZNW8mPPqHMejedB29o0CfP6q7pI8KGcaHmWxPQ4fS3E+dwuAA9EnuC9Z8miTQm/NyDJdkHOf6qvTs5L/UPesnQaCDe2eCPnEivv1NYgQN36boyHo2gBiypH8TlGljCdoJR0="
    - secure: "ANIFx1GJ3+O+zND5bIEkHDM86oGP5pkFPiWzCC+pEjTSxnF11cm0dTD4l4+QhV1i2RUYGZ0naD1dlantj9PuiHN1NkG9Gpd09edlhJSdSeYSuphMYqU0DEijxZTVl1IDBEgST16JPSc5x2Nz6urUJq5zmxnEeFG7UCfuHUWHdsMOhH6wKZ+am4/k7nfeZ1rtb5PXm9Xzy/6Hb9CBaMiAa+fQrPrVsLG+gFPOCdPveJXFi7O1qpWKo0GvWG6h3/XM1WuJTSC9lPRJ+d8akpbTYNW0anbDsAwD7Z0y+XCr96YB6VgDFvlPsnnePoA052pSt4cXkZSJKKyd6Vw2sXnjIX918ahgDh4gsaZzltAYOKnl49dT3ms2gljjTPs+YxJvC1//hPmAqlDpem7S4WeNhdVoyj1+eaFUpXbLWUFz9lC04EIBKb/hVJNADrW2w2g5wsVGcTinyweVk1uLqRMhHuyn2cec6d0kcJgDrWyA4f4IkXksPco+9dVU3f+nUH3dj9R7dUEHFvEngNdR7Oq9TiNkqp9RTbnuyjubQmPcCH42NW41DHCddRkWwT8FWxXOqYG7KfbGdy4gIP7XTCLRrovPqZM3rKy8Cr6ZzrFV9QvZV/I57rciDIzIU0jCiPEPHJxywK5QDrOv4GvMOWEdm05cFtytAK2t1laRB9dCQsI="
    - secure: "T5VGk+B5Go78zBygxM2jIrduh2lbHQaoxOTG0sdABOVmsYZBieIzNLe40dVW8jegGoVdTwlw0Rfp5nUs7uzut5MtUc1hbMYL5Gem0/RxZAF20zTffgDZhOYD1K7B3DsE4j68+I5GRq0JKUaOqvD+54ZIEHIKmiS9Sc2rUpp3n6hrLkKyPoW87wOVlGn10eAZ1QjnKAB7W3E4a5d22Wx2C1w1UxG+x5/LYkSGQB8WpXhBJZdWnUOyAetPutLFEvrfA5AW6rl1ebkYi6OOc/og29ZT9/y5gji0+hIBGcjI+Fs81FGiq2TT3dTqvAiK1r8x1RhMdRWLuMTb0t+LVcUhGs1J9KFGSixcDqyCbZtX4QyHGpGpJYO975iFHFfsZ/WnnD4YKFKT7UG6MRxSm5LZMhf8mIiVTYbs142X+LKpXhsiY10BrqHnWfMO97kqHu9ezCVwyFRycSQzQUju7vc5IYz7GOFnnjYfmN9h5E00BBzpLrXjlwykazZuDreZS5RP9A5xGgHioZHAEBXWDySEmGRoAzhXmteHQV0v04enqxXWuVSq0bNAf/bgFGFjtm9RwgWiQ5Iw7ZaCtF85kTrIc/34OUTqaR3xZhp0laX0J8oyHgg1ci0nzmwxd5v+xFY4qah/71cwN4vb5wqPvhFleVBuZxvyf+cShcxseBzEKmg="
    - secure: "h7ImM1Zi3QQZ1rQudwLVAEaBb6yc2RFw8jzyboq48Cgix3bGbeJxPHA32HGEF6cLQcI2nstyPpMelxptnbFf71kX0h4/KGLdoD4ZUXyHaNWkrDi92UOyYyxu0/b+SmlPUJHNsHndAXNijaMWA8hW0FqoYmmvbqI2mHWwpMo1QWypxALBgp/EDJ9TCySCAh6K0RSBzFt5Z3yBi4fNYiPRETOISF1nrOJqV4xvO5Mh6cb0P+7FALw3JAyOQjqmzbJHjiqk43/pDK6nX+n8/K6Lz+j/yISdLLxe8X9QmYUYWDSGvHdMFwrHcMFIgueCno2tgepQSVjZsLARJnhZXct2fd3XtWfVn2i9QwrxBQhC0KPnouYzoE0cH5jcE/Hnnvv6JgD5LyAqh+U5Njhpw3+g+yJoPQcDWty9amyF2sby/gBDdbh59u+TwaZupLTR8HoKeSNkOLDjWaHVr5hot8OajfXd8GZ5ViUFOUhVFX5TfjWIP7Y2ttXptDhTcTD+VnKHMEWbwu18FmLGuH15AiEuYLRfOMpBZaszbBLCQbnj9VwM9SOAHbW0Lab2jcv7PlhvIZjgyIeT310bgSuhWbWHLuDXJ6aHxTBvaKf5lw9casUhKIJbwpeWVIVk9U6mcR6IGCWCkRhJ8W6oU8bsOuHD4xkpHXKOmuSFun7KfoxPgeQ="
    - secure: "g3ZjRwFYcn03Lo52oXbSQfZ5N3e3sQbzLGfhJ8YYeTFFM22jMiZhsKyM8PtV7D3FmRIzRouX4G7SBNY7gOYXVEjiCfaTie60vuXhJvaEmOHYm5k4b9smcA43KGtqMwWNkBvXC7vrGRDwH1V29BwdvIxCdKwemOU2Ka2Ws0SfLMrlUTRPwUqqDzNs9wZMVAaZbolzSvl9LTKFuQssshLm4oCFZjHRKsBiD8G3JpB3tlOjzW5c4KzGiKvFwnhirVV0mSwDd3dHsp6nebXdQV6Z+zlxrouLTbOzm72cJ4SzLrzsJVCFGK//0GD6xm48kPNvjHylb99bDav6kk5swNpUSwT38SYZKX47fwDJH+TnHAB12izHN7ujSTdbBqqsh/bm8dUU13nylNydRuucPOWrdcyw5gjDcUdeP/uRrWE4syF/5TY26oyJ1CVpl8PruiY8RAKSFoBqwIv7S/T17lbvQgCzl8RiIwToYvRYqlkcROi0yPWC3MU3n4Q+9kYUFwee38SshZGHqEtemT3n4UALuan+a3Fc1yem4XJGKyJX1BJTAjcN62dBHgzI/0h9d7K8w7pEhLEeZjpTS+tQJOxXv1sgbyC7KBjRhVnFzuKr2zWJMnGnSp7UcTWrXVdT74IXrts99r/MdWjIQwWKbEEJucs5BitlTlvUXnanmCtrCts="
    - BACKEND=postgresql
    services:
    - docker
    before_install:
    - docker --version
    - docker-compose --version
    - env | sort
    install: true
    before_script:
    - sudo service mysql stop || true
    - sudo service postgresql stop || true
    - cd $ROOT/docker
    - docker-compose -f docker-compose.build.yml build --build-arg GIT_COMMIT=$TRAVIS_COMMIT
    - dcfile_mysql=docker-compose.mysql.yml
    - dcfile_postgres=docker-compose.postgresql.yml
    - BACKEND=mysql WEB_ENTRYPOINT="''" sh create-docker-compose.sh $dcfile_mysql
    - BACKEND=postgresql WEB_ENTRYPOINT="''" sh create-docker-compose.sh $dcfile_postgres 
    script:
    - docker-compose -f $dcfile_postgres run --workdir="/app" --no-deps --rm web bash -c "pip3 freeze"
    - docker-compose -f $dcfile_postgres run --workdir="/app/controller" --no-deps --rm driver gradle build
    - docker-compose -f $dcfile_postgres run --workdir="/app" --no-deps --rm web bash -c "python3 -m unittest discover -s analysis/tests -v"
    - docker-compose -f $dcfile_postgres run --rm web bash -c "./wait-for-it.sh && python3 manage.py makemigrations website && python3 manage.py test --noinput -v 2"
    - docker-compose -f $dcfile_postgres rm -f -s -v
    - docker-compose -f $dcfile_mysql run --rm web bash -c "./wait-for-it.sh && python3 manage.py makemigrations website && python3 manage.py test --noinput -v 2"
    - docker-compose -f $dcfile_mysql rm -f -s -v
    after_success: true
    before_deploy:
    - /$ROOT/.travis/before_deploy.sh
    deploy:
      provider: script
      script: /$ROOT/.travis/deploy.sh 
      on:
        repo: cmu-db/ottertune
        branch: master
    after_deploy:
    - curl -LO --retry 3 https://raw.github.com/mernst/plume-lib/master/bin/trigger-travis.sh
    - sh trigger-travis.sh --pro --branch master "$TRIGGER_USER" "$TRIGGER_REPO" "$TRIGGER_TOKEN"
    - docker logout

  - name: Unit Tests (MySQL v5.7)
    env:
    - BACKEND=mysql
    services:
    - mysql
    addons:
      apt:
        update: true
        packages:
        - mysql-server
        - python-mysqldb
        - rabbitmq-server
        - openjdk-11-jdk
        - gradle
        - checkstyle
    before_install:
    - mysql -e "CREATE DATABASE IF NOT EXISTS ${DB_NAME}"
    - sed -i '/psycopg2/d' $WEB/requirements.txt
    - echo "codecov" >> $WEB/requirements.txt

  - name: Unit Tests (PostgreSQL v9.6)
    env:
    - BACKEND=postgresql
    addons:
      postgresql: "9.6"
      apt:
        update: true
        packages:
        - rabbitmq-server
        - openjdk-11-jdk
        - gradle
        - checkstyle
    before_install:
    - psql -U postgres -c "CREATE DATABASE ${DB_NAME}"
    - sed -i '/mysqlclient/d' $WEB/requirements.txt
    - echo "codecov" >> $WEB/requirements.txt

  - name: Integration Tests (MySQL v5.7)
    env:
    - BACKEND=mysql
    services:
    - mysql
    addons:
      apt:
        update: true
        packages:
        - mysql-server
        - python-mysqldb
        - rabbitmq-server
    before_install:
    - mysql -e "CREATE DATABASE IF NOT EXISTS ${DB_NAME}"
    - sed -i '/psycopg2/d' $WEB/requirements.txt
    script:
    - cd $WEB && python manage.py runserver 0.0.0.0:8000 &
    - sleep 10 && cd $DRIVER && fab integration_tests
    after_success: true

  - name: Integration Tests (PostgreSQL v9.6)
    env:
    - BACKEND=postgresql
    addons:
      postgresql: "9.6"
      apt:
        update: true
        packages:
        - rabbitmq-server
    before_install:
    - psql -U postgres -c "CREATE DATABASE ${DB_NAME}"
    - sed -i '/mysqlclient/d' $WEB/requirements.txt
    script:
    - cd $WEB && python manage.py runserver 0.0.0.0:8000 &
    - sleep 10 && cd $DRIVER && fab integration_tests
    after_success: true

install:
- pip install -r $WEB/requirements.txt
- pip freeze
before_script:
- env | sort
- cd $WEB
- sed -i  "s|\('celery', 'db.*$\)|'console', \1|" website/settings/common.py
- cp $ROOT/docker/credentials.py website/settings
- cat website/settings/credentials.py
- python manage.py makemigrations
- python manage.py migrate
- python manage.py startcelery
- python manage.py createuser admin $ADMIN_PASSWORD --superuser
script:
- cd $ROOT/server && coverage run --omit="*/tests/*" -m unittest discover -s analysis/tests -v
- cd $WEB && coverage run manage.py test --noinput -v 2
- cd $CONTROLLER && gradle build
- cd $ROOT && git reset --soft ${TRAVIS_COMMIT_RANGE%...*} && git status && git
  log | head -n 1 && git lint
after_success:
- >
  codecov -F analysis -f "${ROOT}/server/.coverage" ||
  (sleep 5 && codecov -F analysis -f "${ROOT}/server/.coverage") ||
  (sleep 5 && codecov -F analysis -f "${ROOT}/server/.coverage") &&
  echo "Codecov did not collect coverage reports"
- >
  codecov -F website -f "${WEB}/.coverage" ||
  (sleep 5 && codecov -F website -f "${WEB}/.coverage") ||
  (sleep 5 && codecov -F website -f "${WEB}/.coverage") &&
  echo "Codecov did not collect coverage reports"
