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

setup:
  env: kind
  file: ../kind.yaml
  steps:
    - name: prepare e2e.yaml
      command: bash hack/prepare-e2e.sh
    - name: install cert-manager
      command: |
        # kind k8s cluster is in $TMPDIR
        export KUBECONFIG=$TMPDIR/e2e-k8s.config
        kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml
      wait:
        - namespace: cert-manager
          resource: pod
          for: condition=Ready
    - name: install operator
      command: |
        export OPERATOR_IMG=controller
        make -C operator docker-build   
        kind load docker-image controller
        make -C operator install
        make -C operator deploy
      wait:
        - namespace: skywalking-swck-system
          resource: pod
          for: condition=Ready
    - name: setup oapserver and ui
      command: | 
        kubectl create namespace skywalking-system
        kubectl apply -f test/e2e/skywalking-components.yaml
      wait:
        - namespace: skywalking-system
          resource: OAPServer/skywalking-system
          for: condition=Available
        - namespace: skywalking-system
          resource: UI/skywalking-system
          for: condition=Available
    - name: setup java agent demo(test for dynamic configuration)
      command: |
        kubectl label namespace skywalking-system swck-injection=enabled
        sed 's/oap-service/skywalking-system-oap.skywalking-system/' test/e2e/demo.yaml | kubectl create -f -
      wait:
        - namespace: skywalking-system
          resource: deployment/demo
          for: condition=Available
    - name: setup oapserverconfig(static configuration)
      command: |
        export oap_podname=$(kubectl get pod -lapp=oap -n skywalking-system -o jsonpath='{.items[*].metadata.name}')
        kubectl apply -f test/e2e/oapserverconfig-demo.yaml
    - name: wait the old pod teminated
      command: |
        while kubectl get pod $oap_podname -n skywalking-system > /dev/null; \
        do \
          sleep 0.1; \
        done
    - name: setup java agent demo(test for static configuration)
      command: |
        sed 's/oap-service/skywalking-system-oap.skywalking-system/' test/e2e/resource.yaml | kubectl create -f -
      wait:
        - namespace: skywalking-system
          resource: deployment/songs-deployment
          for: condition=Available 
    - name: setup oapserverdynamicconfig(dynamic configuration)
      command: |
        sed 's/default: 0.1/default: 500/' test/e2e/oapserverdynamicconfig-demo.yaml | kubectl apply -f -
        kubectl get po -A
  kind:
    expose-ports:
      - namespace: skywalking-system
        resource: service/demo 
        port: 8085
      - namespace: skywalking-system
        resource: service/songs 
        port: 80
      - namespace: skywalking-system
        resource: service/skywalking-system-oap
        port: 12800
      - namespace: skywalking-system
        resource: service/skywalking-system-ui
        port: 80
  timeout: 20m

cleanup:
  # always never success failure
  on: always

trigger:
  action: http
  interval: 5s
  times: 5
  url: http://${service_demo_host}:${service_demo_8085}/hello
  method: GET

verify:
  # verify with retry strategy
  retry:
    # max retry count
    count: 20
    # the interval between two attempts, e.g. 10s, 1m.
    interval: 10s
  cases:
    # test oapserver
    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql service ls
      expected: ../verify/service.yaml
    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql metrics linear --name service_cpm --service-name Your_ApplicationName | yq e 'to_entries' -
      expected: ../verify/metrics.yaml
    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql endpoint list --keyword=hello --service-name Your_ApplicationName
      expected: ../verify/endpoint.yaml
    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name GET:/hello --service-name Your_ApplicationName | yq e 'to_entries' -
      expected: ../verify/metrics.yaml
    - includes:
        - ../ui-cases.yaml
    # test oapsever's static configuration
    - query: |
        swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql logs list --service-name=agent::songs --tags level=INFO --trace-id=$( \
            swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql trace ls \
              | yq e '.traces | select(.[].endpointnames[0]=="HikariCP/Connection/getConnection") | .[0].traceids[0]' -
        ) | yq e '.logs' -
      expected: ../verify/logs.yaml
    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql metrics linear --name=log_count_info --instance-name=songs --service-name=agent::songs | yq e 'to_entries' -
      expected: ../verify/metrics.yaml
    # test oapsever's dynamic configuration
    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql metrics linear --name=service_apdex --service-name=Your_ApplicationName | yq e 'to_entries' -
      expected: ../verify/service-apdex.yaml