# ---------------------------------------------------------------------------
# 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.
# ---------------------------------------------------------------------------

name: openshift-builder

on:
  pull_request:
    branches:
      - master
  push:
    branches:
      - master

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2
    - name: Cleanup
      run: |
        ls -lart
        echo "Initial status:"
        df -h

        echo "Cleaning up resources:"
        sudo swapoff -a
        sudo rm -f /swapfile
        sudo apt clean
        docker rmi $(docker image ls -aq)

        echo "Final status:"
        df -h
    - name: Set up JDK 11
      uses: joschi/setup-jdk@v2
      with:
        java-version: "11"
    - name: Set Go
      uses: actions/setup-go@v1
      with:
        go-version: 1.13.x
    - name: Get OpenShift Client (oc)
      run: |
        export OPENSHIFT_VERSION=v3.11.0
        export OPENSHIFT_COMMIT=0cbc58b
        export MAVEN_OPTS=-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn

        # set docker0 to promiscuous mode
        sudo ip link set docker0 promisc on

        # Download and install the oc binary
        sudo mount --make-shared /

        sudo apt-get install resolvconf
        echo "nameserver 8.8.8.8" | sudo tee /etc/resolvconf/resolv.conf.d/head > /dev/null
        echo "nameserver 8.8.4.4" | sudo tee /etc/resolvconf/resolv.conf.d/head > /dev/null
        sudo service resolvconf restart

        sudo service docker stop
        sudo echo '{"insecure-registries": ["172.30.0.0/16"]}' | sudo tee /etc/docker/daemon.json > /dev/null
        sudo service docker start

        DOWNLOAD_URL=https://github.com/openshift/origin/releases/download/$OPENSHIFT_VERSION/openshift-origin-client-tools-$OPENSHIFT_VERSION-$OPENSHIFT_COMMIT-linux-64bit.tar.gz
        wget -O client.tar.gz ${DOWNLOAD_URL}
        tar xvzOf client.tar.gz > oc.bin
        sudo mv oc.bin /usr/local/bin/oc
        sudo chmod 755 /usr/local/bin/oc

    - name: Start OpenShift Cluster
      run: |
        # Figure out this host's IP address
        IP_ADDR="$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)"

        # Setup cluster dir
        sudo mkdir -p /home/runner/lib/oc
        sudo chmod 777 /home/runner/lib/oc
        cd /home/runner/lib/oc

        # Start OpenShift
        oc cluster up --public-hostname=$IP_ADDR --enable=persistent-volumes,registry,router
        oc login -u system:admin

        # Wait until we have a ready node in openshift
        TIMEOUT=0
        TIMEOUT_COUNT=60
        until [ $TIMEOUT -eq $TIMEOUT_COUNT ]; do
          if [ -n "$(oc get nodes | grep Ready)" ]; then
            break
          fi
          echo "openshift is not up yet"
          TIMEOUT=$((TIMEOUT+1))
          sleep 5
        done

        if [ $TIMEOUT -eq $TIMEOUT_COUNT ]; then
          echo "Failed to start openshift"
          exit 1
        fi

        echo "openshift is deployed and reachable"

    - name: Info
      run: |
        oc describe nodes
    - name: Run IT
      #env:
      #  TEST_DOCKER_HUB_USERNAME: ${{ secrets.TEST_DOCKER_HUB_USERNAME }}
      #  TEST_DOCKER_HUB_PASSWORD: ${{ secrets.TEST_DOCKER_HUB_PASSWORD }}
      #  TEST_GITHUB_PACKAGES_REPO: ${{ secrets.TEST_GITHUB_PACKAGES_REPO }}
      #  TEST_GITHUB_PACKAGES_USERNAME: ${{ secrets.TEST_GITHUB_PACKAGES_USERNAME }}
      #  TEST_GITHUB_PACKAGES_PASSWORD: ${{ secrets.TEST_GITHUB_PACKAGES_PASSWORD }}
      run: |
        # Compute registry parameters
        echo "Build project"
        make build-kamel

        echo "Adding maven artifacts to the image context"
        make PACKAGE_ARTIFACTS_STRATEGY=download package-artifacts

        echo "Copying binary file to docker dir"
        mkdir -p ./build/_output/bin
        cp ./kamel ./build/_output/bin/

        echo "Building the images"
        export IMAGE=docker.io/apache/camel-k:$(make version)
        docker build -t "${IMAGE}" -f build/Dockerfile .

        # Make the Apache Snapshots or Apache Staging repository enabled by default
        export KAMEL_INSTALL_MAVEN_REPOSITORIES=$(make get-staging-repo)

        echo "installing camel k cluster resources"
        ./kamel install --cluster-setup

        # Login as normal user
        oc login -u developer

        # Then run integration tests
        make test-builder
