name: Test Notebook Controller
on:
  pull_request:
    paths:
    - tests/install_KinD_create_KinD_cluster_install_kustomize.sh
    - .github/workflows/notebook_controller_m2m_test.yaml
    - applications/jupyter/**
    - common/oauth2-proxy/**
    - common/istio*/**
    - tests/istio*
    - tests/oauth2-proxy_install.sh
    - tests/multi_tenancy_install.sh

permissions:
  contents: read
  actions: read

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Install KinD, Create KinD cluster and Install kustomize
      run: ./tests/install_KinD_create_KinD_cluster_install_kustomize.sh

    - name: Install kubectl
      run: ./tests/kubectl_install.sh

    - name: Create kubeflow namespace
      run: kustomize build common/kubeflow-namespace/base | kubectl apply -f -

    - name: Install Istio
      run: ./tests/istio-cni_install.sh

    - name: Install oauth2-proxy
      run: ./tests/oauth2-proxy_install.sh

    - name: Install kubeflow-istio-resources
      run: kustomize build common/istio/kubeflow-istio-resources/base | kubectl apply -f -

    - name: Install KF Multi Tenancy
      run: ./tests/multi_tenancy_install.sh

    - name: Build & Apply manifests
      run: |
        kustomize build applications/jupyter/jupyter-web-app/upstream/overlays/istio/ | kubectl apply -f -
        kustomize build applications/jupyter/notebook-controller/upstream/overlays/kubeflow/ | kubectl apply -f -
        kubectl wait --for=condition=Ready pods --all --all-namespaces --timeout=300s \
          --field-selector=status.phase!=Succeeded

    - name: Create KF Profile
      run: kustomize build common/user-namespace/base | kubectl apply -f -

    - name: Port forward
      run: |
        INGRESS_GATEWAY_SERVICE=$(kubectl get svc --namespace istio-system --selector="app=istio-ingressgateway" --output jsonpath='{.items[0].metadata.name}')
        nohup kubectl port-forward --namespace istio-system svc/${INGRESS_GATEWAY_SERVICE} 8080:80 &
        while ! curl localhost:8080; do echo waiting for port-forwarding; sleep 1; done; echo port-forwarding ready

    - name: List notebooks over API with authorized SA Token
      run: |
        KF_PROFILE=kubeflow-user-example-com
        TOKEN="$(kubectl -n $KF_PROFILE create token default-editor)"

        STATUS_CODE=$(curl -v \
          --silent --output /dev/stderr --write-out "%{http_code}" \
          "localhost:8080/jupyter/api/namespaces/${KF_PROFILE}/notebooks" \
          -H "Authorization: Bearer ${TOKEN}")

        if test $STATUS_CODE -ne 200; then
          echo "Error, this call should be authorized to list notebooks in namespace ${KF_PROFILE}."
          exit 1
        fi

    - name: List notebooks over API with unauthorized SA Token
      run: |
        KF_PROFILE=kubeflow-user-example-com
        TOKEN="$(kubectl -n default create token default)"

        STATUS_CODE=$(curl -v \
          --silent --output /dev/stderr --write-out "%{http_code}" \
          "localhost:8080/jupyter/api/namespaces/${KF_PROFILE}/notebooks" \
          -H "Authorization: Bearer ${TOKEN}")

        if test $STATUS_CODE -ne 403; then
          echo "Error, this call should fail to list notebooks in namespace ${KF_PROFILE}."
          exit 1
        fi
