Repository: openshift-service-mesh/istio
Pull request #300: Modifications to Run integration Tests With Sail Operator
Author: login: ctartici
Labels: name: size/L
name: okay to merge
Created: 2025-02-24T12:05:59Z | Merged: 2025-04-08T07:24:07Z

**Please provide a description of this PR:**



**To help us figure out who should review this PR, please put an X in all the areas that this PR affects.**

- [ ] Ambient
- [ ] Configuration Infrastructure
- [ ] Docs
- [ ] Dual Stack
- [ ] Installation
- [ ] Networking
- [ ] Performance and Scalability
- [ ] Extensions and Telemetry
- [ ] Security
- [X] Test and Release
- [ ] User Experience
- [ ] Developer Infrastructure
- [ ] Upgrade
- [ ] Multi Cluster
- [ ] Virtual Machine
- [ ] Control Plane Revisions

**Please check any characteristics that apply to this pull request.**

- [ ] Does not have any [user-facing](https://github.com/istio/istio/tree/master/releasenotes#when-to-add-release-notes) changes. This may include CLI changes, API changes, behavior changes, performance improvements, etc.



Diff:
diff --git a/prow/config/sail-operator/egress-gateway-values.yaml b/prow/config/sail-operator/egress-gateway-values.yaml
new file mode 100644
index 0000000000..55f58fa26a
--- /dev/null
+++ b/prow/config/sail-operator/egress-gateway-values.yaml
@@ -0,0 +1,9 @@
+platform: openshift
+autoscaling:
+  enabled: false
+
+meshConfig:
+  accessLogFile: /dev/stdout
+
+service:
+  type: ClusterIP
diff --git a/prow/config/sail-operator/ingress-gateway-values.yaml b/prow/config/sail-operator/ingress-gateway-values.yaml
new file mode 100644
index 0000000000..b643a8ec88
--- /dev/null
+++ b/prow/config/sail-operator/ingress-gateway-values.yaml
@@ -0,0 +1,32 @@
+platform: openshift
+autoscaling:
+  enabled: false
+
+meshConfig:
+  accessLogFile: /dev/stdout
+
+service:
+  ports:
+    - port: 15021
+      targetPort: 15021
+      name: status-port
+    - port: 80
+      targetPort: 8080
+      name: http2
+    - port: 443
+      targetPort: 8443
+      name: https
+      # This is the port where sni routing happens
+    - port: 15443
+      targetPort: 15443
+      name: tls
+      ## Extra ports for testing
+    - port: 15012
+      targetPort: 15012
+      name: tls-istiod
+    - port: 15017
+      targetPort: 15017
+      name: tls-webhook
+    - port: 31400
+      targetPort: 31400
+      name: tcp
diff --git a/prow/config/sail-operator/istio-cni.yaml b/prow/config/sail-operator/istio-cni.yaml
new file mode 100644
index 0000000000..2e398111b7
--- /dev/null
+++ b/prow/config/sail-operator/istio-cni.yaml
@@ -0,0 +1,8 @@
+apiVersion: sailoperator.io/v1
+kind: IstioCNI
+metadata:
+  name: default
+spec:
+  namespace: ${ISTIOCNI_NAMESPACE}
+  version: ${ISTIO_VERSION}
+  profile: openshift
\ No newline at end of file
diff --git a/prow/config/sail-operator/validatingwebhook.yaml b/prow/config/sail-operator/validatingwebhook.yaml
new file mode 100755
index 0000000000..90ce0471ee
--- /dev/null
+++ b/prow/config/sail-operator/validatingwebhook.yaml
@@ -0,0 +1,26 @@
+apiVersion: admissionregistration.k8s.io/v1
+kind: ValidatingWebhookConfiguration
+metadata:
+  name: istiod-default-validator
+  labels:
+    app: istiod
+    release: istio
+webhooks:
+  - name: rev.validation.istio.io
+    clientConfig:
+      service:
+        name: istiod
+        namespace: istio-system
+        path: /validate
+      caBundle: <base64-encoded-CA-cert>
+    rules:
+      - apiGroups: ["security.istio.io", "networking.istio.io", "telemetry.istio.io", "extensions.istio.io"]
+        apiVersions: ["*"]
+        operations: ["CREATE", "UPDATE"]
+        resources: ["*"]
+        scope: "*"
+    failurePolicy: Fail
+    matchPolicy: Equivalent
+    admissionReviewVersions: ["v1"]
+    sideEffects: None
+    timeoutSeconds: 10
\ No newline at end of file
diff --git a/prow/integ-suite-ocp.sh b/prow/integ-suite-ocp.sh
index 1404354205..9bcb5eeebf 100755
--- a/prow/integ-suite-ocp.sh
+++ b/prow/integ-suite-ocp.sh
@@ -29,6 +29,10 @@ SKIP_TESTS="${2:-""}"
 TEST_SUITE="${1:-"pilot"}"
 SKIP_SETUP="${SKIP_SETUP:-"false"}"
 INSTALL_METALLB="${INSTALL_METALLB:-"false"}"
+OPERATOR_NAMESPACE="${OPERATOR_NAMESPACE:-"sail-operator"}"
+CONTROL_PLANE_SOURCE="${CONTROL_PLANE_SOURCE:-"istio"}"
+INSTALL_SAIL_OPERATOR="${INSTALL_SAIL_OPERATOR:-"false"}"
+
 # Important: SKIP_TEST_RUN is a workaround until downstream tests can be executed by using this script. 
 # To execute the tests in downstream, set SKIP_TEST_RUN to true
 # Jira: https://issues.redhat.com/browse/OSSM-8029
@@ -96,6 +100,11 @@ else
     echo "Skipping the setup"
 fi
 
+# Install Sail Operator
+if [ "${INSTALL_SAIL_OPERATOR}" == "true" ]; then
+    deploy_operator
+fi
+
 # Check if the test run should be skipped
 # This is a workaround until downstream tests can be executed by using this script.
 # Jira: https://issues.redhat.com/browse/OSSM-8029
@@ -135,6 +144,13 @@ base_cmd=("go" "test" "-p" "1" "-v" "-count=1" "-tags=integ" "-vet=off" "-timeou
           "--istio.test.tag=${TAG}"
           "--istio.test.openshift")
 
+# Append sail operator setup script to base command
+if [ "${CONTROL_PLANE_SOURCE}" == "sail" ]; then
+    SAIL_SETUP_SCRIPT="${WD}/setup/sail-operator-setup.sh"
+    base_cmd+=("--istio.test.kube.deploy=false")
+    base_cmd+=("--istio.test.kube.controlPlaneInstaller=${SAIL_SETUP_SCRIPT}")
+fi
+
 # Append skip tests flag if SKIP_TESTS is set
 if [ -n "${SKIP_TESTS}" ]; then
     base_cmd+=("-skip" "${SKIP_TESTS}")
@@ -152,4 +168,4 @@ else
 fi
 
 # Exit with the status of the test command
-exit $test_status
\ No newline at end of file
+exit "$test_status"
\ No newline at end of file
diff --git a/prow/setup/ocp_setup.sh b/prow/setup/ocp_setup.sh
index 5ad11a9f14..8c2e070224 100644
--- a/prow/setup/ocp_setup.sh
+++ b/prow/setup/ocp_setup.sh
@@ -31,6 +31,7 @@ WD=$(dirname "$0")
 WD=$(cd "$WD"; pwd)
 TIMEOUT=300
 export NAMESPACE="${NAMESPACE:-"istio-system"}"
+SAIL_REPO_URL="https://github.com/istio-ecosystem/sail-operator.git"
 
 function setup_internal_registry() {
   # Validate that the internal registry is running in the OCP Cluster, configure the variable to be used in the make target. 
@@ -177,4 +178,33 @@ spec:
   timeout --foreground -v -s SIGHUP -k ${TIMEOUT} ${TIMEOUT} bash -c 'until oc get IPAddressPool default -n metallb-system; do sleep 5; done && echo "The IP address pool has been created."'
 
   echo "MetalLB has been deployed and configured with the IP address pool."
+}
+
+#need to change env variables since make deploy of sail-operator uses them
+function env_save(){
+  INICIAL_NAMESPACE="$NAMESPACE"
+  INICIAL_HUB="$HUB"
+  INITIAL_TAG="$TAG"
+}
+function cleanup_sail_repo() {
+    echo "Cleaning up..."
+    cd .. 2>/dev/null || true
+    rm -rf sail-operator
+    export NAMESPACE="$INICIAL_NAMESPACE"
+    export HUB="$INICIAL_HUB"
+    export TAG="$INITIAL_TAG"
+}
+
+function deploy_operator(){
+  env_save
+  unset HUB
+  unset TAG
+  unset NAMESPACE
+  git clone --depth 1 --branch main $SAIL_REPO_URL || { echo "Failed to clone sail-operator repo"; exit 1; }
+  cd sail-operator
+  make deploy || { echo "sail-operator make deploy failed"; cleanup_sail_repo ; exit 1; }
+  oc -n sail-operator wait --for=condition=Available deployment/sail-operator --timeout=240s || { echo "Failed to start sail-operator"; exit 1; }
+  cleanup_sail_repo
+  echo "Sail operator deployed"
+
 }
\ No newline at end of file
diff --git a/prow/setup/sail-operator-setup.sh b/prow/setup/sail-operator-setup.sh
new file mode 100755
index 0000000000..d2f7218208
--- /dev/null
+++ b/prow/setup/sail-operator-setup.sh
@@ -0,0 +1,185 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+CONVERTER_BRANCH="${CONVERTER_BRANCH:-main}"
+
+# get istio version from versions.yaml
+VERSION_FILE="https://raw.githubusercontent.com/istio-ecosystem/sail-operator/$CONVERTER_BRANCH/pkg/istioversion/versions.yaml"
+if [ -z "${ISTIO_VERSION:-}" ]; then
+  ISTIO_VERSION="$(curl -s "$VERSION_FILE" | grep -E 'name: v[0-9]+\.[0-9]+' | sed -E 's/.*(v[0-9]+\.[0-9]+).*/\1/' | sort -Vr | head -n1)-latest"
+fi
+  
+NAMESPACE="${NAMESPACE:-istio-system}"
+ISTIOCNI_NAMESPACE="${ISTIOCNI_NAMESPACE:-istio-cni}"
+
+ISTIOCNI="${PROW}/config/sail-operator/istio-cni.yaml"
+INGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/ingress-gateway-values.yaml"
+EGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/egress-gateway-values.yaml"
+
+CONVERTER_ADDRESS="https://raw.githubusercontent.com/istio-ecosystem/sail-operator/$CONVERTER_BRANCH/tools/configuration-converter.sh"
+CONVERTER_SCRIPT=$(basename "$CONVERTER_ADDRESS")
+
+function download_execute_converter(){
+  cd "${PROW}"
+  curl -fsSL "$CONVERTER_ADDRESS" -o "$CONVERTER_SCRIPT" || { echo "Failed to download converter script"; exit 1; }
+  chmod +x "$CONVERTER_SCRIPT"
+  bash "$CONVERTER_SCRIPT" "$IOP_FILE" -v "$ISTIO_VERSION" -n "$NAMESPACE" || { echo "Failed to execute converter script"; exit 1; }
+  rm "$CONVERTER_SCRIPT"
+}
+
+function install_istio_cni(){
+  oc create namespace "${ISTIOCNI_NAMESPACE}" || true
+  TMP_ISTIOCNI=$WORKDIR/istio-cni.yaml
+  cp "$ISTIOCNI" "$TMP_ISTIOCNI"
+  yq -i ".spec.namespace=\"$ISTIOCNI_NAMESPACE\"" "$TMP_ISTIOCNI"
+  yq -i ".spec.version=\"$ISTIO_VERSION\"" "$TMP_ISTIOCNI"
+  oc apply -f "$TMP_ISTIOCNI"
+  echo "istioCNI created."
+}
+
+function install_istio(){
+  # overwrite sailoperator version before applying it
+  oc create namespace "${NAMESPACE}" || true
+  if [ "${SAIL_API_VERSION:-}" != "" ]; then
+    yq -i eval ".apiVersion = \"sailoperator.io/$SAIL_API_VERSION\"" "$WORKDIR/$SAIL_IOP_FILE"
+  fi
+  patch_config
+  oc apply -f "$WORKDIR/$SAIL_IOP_FILE" || { echo "Failed to install istio"; kubectl get istio default -o yaml;}
+  oc -n "$NAMESPACE" wait --for=condition=Available deployment/istiod --timeout=240s || { sleep 60; }
+  echo "istiod created."
+}
+
+SECRET_NAME="istio-ca-secret"
+WEBHOOK_FILE="$PROW/config/sail-operator/validatingwebhook.yaml"
+
+function patch_config() {
+  # adds some control plane values that are mandatory and not available in iop.yaml
+  if [[ "$WORKDIR" == *"telemetry-tracing-zipkin"* ]]; then
+  # Workaround until https://github.com/istio/istio/pull/55408 is merged
+    yq eval '
+      .spec.values.meshConfig.enableTracing = true |
+      .spec.values.pilot.traceSampling = 100.0 |
+      .spec.values.global.proxy.tracer = "zipkin"
+    ' -i "$WORKDIR/$SAIL_IOP_FILE"
+    echo "Configured tracing for Zipkin."
+  fi
+
+  # Workaround until https://github.com/istio-ecosystem/sail-operator/issues/749 is fixed
+  CA_BUNDLE=$(kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" -o yaml 2>/dev/null | grep "ca-cert" | awk '{print $2}')
+
+  # If not found, sleep for 5 seconds and retry once
+  if [ -z "$CA_BUNDLE" ]; then
+    echo "Secret not found. Sleeping for 5 seconds before retrying..."
+    sleep 5
+    
+    # Retry once
+    CA_BUNDLE=$(kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" -o yaml 2>/dev/null | grep "ca-cert" | awk '{print $2}')
+    
+    if [ -z "$CA_BUNDLE" ]; then
+      echo "Secret still not found after retry. Exiting."
+      exit 1
+    fi
+  fi  
+
+  sed -i "s|<base64-encoded-CA-cert>|$CA_BUNDLE|g" "$WEBHOOK_FILE"
+  kubectl apply -f "$WEBHOOK_FILE"
+  sed -i "s|$CA_BUNDLE|<base64-encoded-CA-cert>|g" "$WEBHOOK_FILE"
+}
+
+# Install ingress and egress gateways
+function install_gateways(){
+  helm template -n "$NAMESPACE" istio-ingressgateway "${ROOT}"/manifests/charts/gateway --values "$INGRESS_GATEWAY_VALUES" > "${WORKDIR}"/istio-ingressgateway.yaml
+  oc apply -f "${WORKDIR}"/istio-ingressgateway.yaml
+  helm template -n "$NAMESPACE" istio-egressgateway "${ROOT}"/manifests/charts/gateway --values "$EGRESS_GATEWAY_VALUES" > "${WORKDIR}"/istio-egressgateway.yaml
+  oc apply -f "${WORKDIR}"/istio-egressgateway.yaml
+  oc -n "$NAMESPACE" wait --for=condition=Available deployment/istio-ingressgateway --timeout=60s || { echo "Failed to start istio-ingressgateway"; oc get pods -n "$NAMESPACE" -o wide; oc describe pod $(oc get pods -n istio-system --no-headers | awk "$3==\"ErrImagePull\" {print $1}" | head -n 1) -n istio-system; exit 1;}
+  oc -n "$NAMESPACE" wait --for=condition=Available deployment/istio-egressgateway --timeout=60s || { echo "Failed to start istio-egressgateway";  kubectl get istios; oc get pods -n "$NAMESPACE" -o wide; exit 1;}
+  echo "Gateways created."
+}
+
+function cleanup_istio(){
+  kubectl delete all --all -n "$ISTIOCNI_NAMESPACE"
+  kubectl delete all --all -n "$NAMESPACE"
+  kubectl delete istios.sailoperator.io --all --all-namespaces --wait=true
+  kubectl get clusterrole | grep istio | awk '{print $1}' | xargs kubectl delete clusterrole
+  kubectl get clusterrolebinding | grep istio | awk '{print $1}' | xargs kubectl delete clusterrolebinding
+  echo "Cleanup completed."
+}
+
+if [ "$1" = "install" ]; then
+  download_execute_converter || { echo "Failed to execute converter"; exit 1; }
+  install_istio_cni || { echo "Failed to install Istio CNI"; exit 1; }
+  install_istio || { echo "Failed to install Istio"; exit 1; }
+  install_gateways || { echo "Failed to install gateways"; exit 1; }
+elif [ "$1" = "cleanup" ]; then
+  if [ "$SKIP_CLEANUP" = "true" ]; then
+    echo "Skipping cleanup because SKIP_CLEANUP is set to true."
+  else
+    cleanup_istio || { echo "Failed to cleanup cluster"; exit 1; }
+  fi
+fi


Reviews:
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-02-24T12:14:58Z
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-02-24T12:17:38Z
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-02-24T12:19:06Z
user: login: fjglira
body: I like this :), I leave some comments mostly for clarity. Please tell me and I can add a new job to start running test over this new way to execute the test
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-02-24T12:28:04Z
user: login: ctartici
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-02-24T13:39:34Z
user: login: ctartici
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-02-24T14:00:56Z
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-02-24T14:48:51Z
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-02-24T14:49:21Z
user: login: luksa
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T09:08:14Z
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T12:38:56Z
user: login: fjglira
body: lgtm in general I just leave some minor comments
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T13:00:18Z
user: login: ctartici
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T13:07:45Z
user: login: ctartici
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T13:09:14Z
user: login: ctartici
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T13:10:04Z
user: login: ctartici
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T13:10:10Z
user: login: ctartici
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T13:13:32Z
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T13:14:46Z
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T13:27:26Z
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T13:29:23Z
user: login: fjglira
body: Just one more comment related to the Istio resource version
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T13:29:53Z
user: login: ctartici
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T14:16:13Z
user: login: ctartici
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T14:20:16Z
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T14:40:58Z
user: login: ctartici
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T11:54:31Z
user: login: fjglira
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T15:48:50Z
user: login: fjglira
body: really change
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T15:52:44Z
user: login: fjglira
body: Let's merge this and start to make changes from there if they are needed
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T16:09:45Z

Review comments:
diff_hunk: @@ -135,6 +135,13 @@ base_cmd=("go" "test" "-p" "1" "-v" "-count=1" "-tags=integ" "-vet=off" "-timeou
           "--istio.test.tag=${TAG}"
           "--istio.test.openshift")
 
+# Append sail operator setup script to base command
+if [ "${OPERATOR_TYPE:-}" == "sail" ]; then
path: prow/integ-suite-ocp.sh
user: login: fjglira
body: You need to initialize at the beginning of the file `OPERATOR_TYPE` with some default value, but I don't like the name of the var. We are going to run the sail-operator-setup bash script to avoid doing some hacks or workaround when we want to run this integration test on OCP and against sail operator-based installed control plane, I think we can name this var something like `CONTROL_PLANE_INSTALLER` (The same as the istio flag) and the default value should be `istio`. And you can add here also some notes to explain the flags
created_at: 2025-02-24T12:14:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -135,6 +135,13 @@ base_cmd=("go" "test" "-p" "1" "-v" "-count=1" "-tags=integ" "-vet=off" "-timeou
           "--istio.test.tag=${TAG}"
           "--istio.test.openshift")
 
+# Append sail operator setup script to base command
+if [ "${OPERATOR_TYPE:-}" == "sail" ]; then
path: prow/integ-suite-ocp.sh
user: login: fjglira
body: Also, Check the script we will need later to delete `SKIP_TEST_RUN` because it is not going to be used anymore, but this can be done after the merge of the PR. 
created_at: 2025-02-24T12:17:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,8 @@
+apiVersion: sailoperator.io/v1alpha1
path: prow/config/sail-operator/istioCNI-cr.yaml
user: login: fjglira
body: Maybe rename this file to `istio-cni.yaml` only
created_at: 2025-02-24T12:19:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,122 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: Can you please reference the places where this script will be called from the istio test framework? Also, will be great to explain How setup and cleanup will be called from Istio when the test are running
created_at: 2025-02-24T12:21:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,122 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+
+exec > >(tee -a "$2"/sail-operator-setup.log) 2>&1
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: Add note to explain what is the iop file
created_at: 2025-02-24T12:22:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,122 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+
+exec > >(tee -a "$2"/sail-operator-setup.log) 2>&1
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24.1}"
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: The current Istio version is 1.24.2; is there any chance to fill this by default? I don't know if it is possible to be honest
created_at: 2025-02-24T12:23:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,122 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+
+exec > >(tee -a "$2"/sail-operator-setup.log) 2>&1
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24.1}"
+INGRESS_GATEWAY_SVC_NAMESPACE="${INGRESS_GATEWAY_SVC_NAMESPACE:-istio-system}"
+ISTIOCNI_NAMESPACE="${ISTIOCNI_NAMESPACE:-istio-cni}"
+
+ISTIOCNI="${PROW}/config/sail-operator/istioCNI-cr.yaml"
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: If you change the name of the file, this will need to change also
created_at: 2025-02-24T12:23:50Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,122 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+
+exec > >(tee -a "$2"/sail-operator-setup.log) 2>&1
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: You can add also `set -o pipefail` to catch errors in any part of a pipeline
created_at: 2025-02-24T12:27:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,122 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+
+exec > >(tee -a "$2"/sail-operator-setup.log) 2>&1
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24.1}"
path: prow/setup/sail-operator-setup.sh
user: login: ctartici
body: One option is to use "latest" as istio version, I am not sure if it works for istio-cni but works for istiod. If you think its better idea I can modify default to latest and test it

created_at: 2025-02-24T13:39:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -135,6 +135,13 @@ base_cmd=("go" "test" "-p" "1" "-v" "-count=1" "-tags=integ" "-vet=off" "-timeou
           "--istio.test.tag=${TAG}"
           "--istio.test.openshift")
 
+# Append sail operator setup script to base command
+if [ "${OPERATOR_TYPE:-}" == "sail" ]; then
path: prow/integ-suite-ocp.sh
user: login: ctartici
body: > You need to initialize at the beginning of the file `OPERATOR_TYPE` with some default value, but I don't like the name of the var. We are going to run the sail-operator-setup bash script to avoid doing some hacks or workaround when we want to run this integration test on OCP and against sail operator-based installed control plane, I think we can name this var something like `CONTROL_PLANE_INSTALLER` (The same as the istio flag) and the default value should be `istio`. And you can add here also some notes to explain the flags

CONTROL_PLANE_INSTALLER is referring to this file in istio flag. So it might be confusing to use it for something else. I can change it to CONTROL_PLANE_TYPE and default it to istio on top of the script. WDYT? 
created_at: 2025-02-24T14:00:56Z
author_association: CONTRIBUTOR
diff_hunk: @@ -135,6 +135,13 @@ base_cmd=("go" "test" "-p" "1" "-v" "-count=1" "-tags=integ" "-vet=off" "-timeou
           "--istio.test.tag=${TAG}"
           "--istio.test.openshift")
 
+# Append sail operator setup script to base command
+if [ "${OPERATOR_TYPE:-}" == "sail" ]; then
path: prow/integ-suite-ocp.sh
user: login: fjglira
body: Maybe it can be `CONTROL_PLANE_SOURCE`? And the values can be sail or istio
created_at: 2025-02-24T14:48:51Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,122 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+
+exec > >(tee -a "$2"/sail-operator-setup.log) 2>&1
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24.1}"
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: OK, try this
created_at: 2025-02-24T14:49:21Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,8 @@
+apiVersion: sailoperator.io/v1
+kind: IstioCNI
+metadata:
+  name: default
+spec:
+  namespace: ${ISTIOCNI_NAESPACE}
path: prow/config/sail-operator/istio-cni.yaml
user: login: luksa
body: Typo:
```suggestion
  namespace: ${ISTIOCNI_NAMESPACE}
```
created_at: 2025-03-03T09:07:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,8 @@
+apiVersion: sailoperator.io/v1
+kind: IstioCNI
+metadata:
+  name: default
+spec:
+  namespace: ${ISTIOCNI_NAMESPACE}
+  version: ${ISTIO_VERSION}
+  profile: openshift
path: prow/config/sail-operator/istio-cni.yaml
user: login: fjglira
body: Question: is a profile needed?
created_at: 2025-04-03T12:38:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,26 @@
+apiVersion: admissionregistration.k8s.io/v1
+kind: ValidatingWebhookConfiguration
path: prow/config/sail-operator/validatingwebhook.yaml
user: login: fjglira
body: This `ValidatingWebhookConfiguration` is not created by default when the operator is installed?
created_at: 2025-04-03T12:39:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -177,4 +178,33 @@ spec:
   timeout --foreground -v -s SIGHUP -k ${TIMEOUT} ${TIMEOUT} bash -c 'until oc get IPAddressPool default -n metallb-system; do sleep 5; done && echo "The IP address pool has been created."'
 
   echo "MetalLB has been deployed and configured with the IP address pool."
+}
+
+#need to change env variables since make deploy of sail-operator uses them
+function env_save(){
+  INICIAL_NAMESPACE="$NAMESPACE"
+  INICIAL_HUB="$HUB"
+  INITIAL_TAG="$TAG"
+}
+function cleanup_sail_repo() {
+    echo "Cleaning up..."
+    cd .. 2>/dev/null || true
+    rm -rf sail-operator
+    export NAMESPACE="$INICIAL_NAMESPACE"
+    export HUB="$INICIAL_HUB"
+    export TAG="$INITIAL_TAG"
+}
+
+function deploy_operator(){
+  env_save
+  unset HUB
+  unset TAG
+  unset NAMESPACE
+  git clone --depth 1 --branch main $SAIL_REPO_URL || { echo "Failed to clone sail-operator repo"; exit 1; }
+  cd sail-operator
+  make deploy || { echo "sail-operator make deploy failed"; cleanup_sail_repo ; exit 1; }
+  oc -n sail-operator wait --for=condition=Available deployment/sail-operator --timeout=240s || { echo "Failed to start sail-operator"; exit 1; }
+  cleanup_sail_repo
+  echo "Sail operator deployed"
path: prow/setup/ocp_setup.sh
user: login: fjglira
body: Just to refresh, we are not building the latest operator image, we are deploying the latest nightly image that by default is being set right?
created_at: 2025-04-03T12:54:25Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,164 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
+NAMESPACE="${NAMESPACE:-istio-system}"
+ISTIOCNI_NAMESPACE="${ISTIOCNI_NAMESPACE:-istio-cni}"
+
+ISTIOCNI="${PROW}/config/sail-operator/istio-cni.yaml"
+INGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/ingress-gateway-values.yaml"
+EGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/egress-gateway-values.yaml"
+
+CONVERTER_ADDRESS="https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/tools/configuration-converter.sh"
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: Maybe we can default the branch to main, but leave to the job the possibility to set a custom branch in case there are changes and we need to run from a specific branch
created_at: 2025-04-03T12:56:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,164 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
+NAMESPACE="${NAMESPACE:-istio-system}"
+ISTIOCNI_NAMESPACE="${ISTIOCNI_NAMESPACE:-istio-cni}"
+
+ISTIOCNI="${PROW}/config/sail-operator/istio-cni.yaml"
+INGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/ingress-gateway-values.yaml"
+EGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/egress-gateway-values.yaml"
+
+CONVERTER_ADDRESS="https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/tools/configuration-converter.sh"
+CONVERTER_SCRIPT=$(basename $CONVERTER_ADDRESS)
+
+function download_execute_converter(){
+  cd "${PROW}"
+  curl -fsSL "$CONVERTER_ADDRESS" -o "$CONVERTER_SCRIPT" || { echo "Failed to download converter script"; exit 1; }
+  chmod +x "$CONVERTER_SCRIPT"
+  bash "$CONVERTER_SCRIPT" "$IOP_FILE" -v "$ISTIO_VERSION" -n "$NAMESPACE" || { echo "Failed to execute converter script"; exit 1; }
+  rm "$CONVERTER_SCRIPT"
+}
+
+function install_istio_cni(){
+  oc create namespace "${ISTIOCNI_NAMESPACE}" || true
+  TMP_ISTIOCNI=$WORKDIR/istio-cni.yaml
+  cp "$ISTIOCNI" "$TMP_ISTIOCNI"
+  yq -i ".spec.namespace=\"$ISTIOCNI_NAMESPACE\"" "$TMP_ISTIOCNI"
+  yq -i ".spec.version=\"$ISTIO_VERSION\"" "$TMP_ISTIOCNI"
+  oc apply -f "$TMP_ISTIOCNI"
+  echo "istioCNI created."
+}
+
+function install_istiod(){
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: This should be `install_istio` or `istio_istio_control_plane`.
created_at: 2025-04-03T12:58:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,164 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
+NAMESPACE="${NAMESPACE:-istio-system}"
+ISTIOCNI_NAMESPACE="${ISTIOCNI_NAMESPACE:-istio-cni}"
+
+ISTIOCNI="${PROW}/config/sail-operator/istio-cni.yaml"
+INGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/ingress-gateway-values.yaml"
+EGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/egress-gateway-values.yaml"
+
+CONVERTER_ADDRESS="https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/tools/configuration-converter.sh"
+CONVERTER_SCRIPT=$(basename $CONVERTER_ADDRESS)
+
+function download_execute_converter(){
+  cd "${PROW}"
+  curl -fsSL "$CONVERTER_ADDRESS" -o "$CONVERTER_SCRIPT" || { echo "Failed to download converter script"; exit 1; }
+  chmod +x "$CONVERTER_SCRIPT"
+  bash "$CONVERTER_SCRIPT" "$IOP_FILE" -v "$ISTIO_VERSION" -n "$NAMESPACE" || { echo "Failed to execute converter script"; exit 1; }
+  rm "$CONVERTER_SCRIPT"
+}
+
+function install_istio_cni(){
+  oc create namespace "${ISTIOCNI_NAMESPACE}" || true
+  TMP_ISTIOCNI=$WORKDIR/istio-cni.yaml
+  cp "$ISTIOCNI" "$TMP_ISTIOCNI"
+  yq -i ".spec.namespace=\"$ISTIOCNI_NAMESPACE\"" "$TMP_ISTIOCNI"
+  yq -i ".spec.version=\"$ISTIO_VERSION\"" "$TMP_ISTIOCNI"
+  oc apply -f "$TMP_ISTIOCNI"
+  echo "istioCNI created."
+}
+
+function install_istiod(){
+  # overwrite sailoperator version before applying it
+  oc create namespace "${NAMESPACE}" || true
+  if [ "${SAIL_API_VERSION:-}" != "" ]; then
+    yq -i eval ".apiVersion = \"sailoperator.io/$SAIL_API_VERSION\"" "$WORKDIR/$SAIL_IOP_FILE"
+  fi
+  patch_config
+  oc apply -f "$WORKDIR/$SAIL_IOP_FILE" || { echo "Failed to install istiod"; kubectl get istio default -o yaml;}
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: Same here, if you change the func name, the message needs to change
created_at: 2025-04-03T12:58:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,26 @@
+apiVersion: admissionregistration.k8s.io/v1
+kind: ValidatingWebhookConfiguration
path: prow/config/sail-operator/validatingwebhook.yaml
user: login: fjglira
body: OK, I saw it that is because an issue that we have open
created_at: 2025-04-03T13:00:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -177,4 +178,33 @@ spec:
   timeout --foreground -v -s SIGHUP -k ${TIMEOUT} ${TIMEOUT} bash -c 'until oc get IPAddressPool default -n metallb-system; do sleep 5; done && echo "The IP address pool has been created."'
 
   echo "MetalLB has been deployed and configured with the IP address pool."
+}
+
+#need to change env variables since make deploy of sail-operator uses them
+function env_save(){
+  INICIAL_NAMESPACE="$NAMESPACE"
+  INICIAL_HUB="$HUB"
+  INITIAL_TAG="$TAG"
+}
+function cleanup_sail_repo() {
+    echo "Cleaning up..."
+    cd .. 2>/dev/null || true
+    rm -rf sail-operator
+    export NAMESPACE="$INICIAL_NAMESPACE"
+    export HUB="$INICIAL_HUB"
+    export TAG="$INITIAL_TAG"
+}
+
+function deploy_operator(){
+  env_save
+  unset HUB
+  unset TAG
+  unset NAMESPACE
+  git clone --depth 1 --branch main $SAIL_REPO_URL || { echo "Failed to clone sail-operator repo"; exit 1; }
+  cd sail-operator
+  make deploy || { echo "sail-operator make deploy failed"; cleanup_sail_repo ; exit 1; }
+  oc -n sail-operator wait --for=condition=Available deployment/sail-operator --timeout=240s || { echo "Failed to start sail-operator"; exit 1; }
+  cleanup_sail_repo
+  echo "Sail operator deployed"
path: prow/setup/ocp_setup.sh
user: login: ctartici
body: Following is the command executed by make deploy.
`/work/bin/helm template chart chart --include-crds --values chart/values.yaml --set image='quay.io/sail-dev/sail-operator:1.1-latest' --namespace sail-operator | kubectl apply --server-side=true -f -
`

created_at: 2025-04-03T13:07:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,8 @@
+apiVersion: sailoperator.io/v1
+kind: IstioCNI
+metadata:
+  name: default
+spec:
+  namespace: ${ISTIOCNI_NAMESPACE}
+  version: ${ISTIO_VERSION}
+  profile: openshift
path: prow/config/sail-operator/istio-cni.yaml
user: login: ctartici
body: I am not sure about this. Got the yaml from our jenkins config files. I can remove and test it.
created_at: 2025-04-03T13:09:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,164 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
+NAMESPACE="${NAMESPACE:-istio-system}"
+ISTIOCNI_NAMESPACE="${ISTIOCNI_NAMESPACE:-istio-cni}"
+
+ISTIOCNI="${PROW}/config/sail-operator/istio-cni.yaml"
+INGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/ingress-gateway-values.yaml"
+EGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/egress-gateway-values.yaml"
+
+CONVERTER_ADDRESS="https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/tools/configuration-converter.sh"
+CONVERTER_SCRIPT=$(basename $CONVERTER_ADDRESS)
+
+function download_execute_converter(){
+  cd "${PROW}"
+  curl -fsSL "$CONVERTER_ADDRESS" -o "$CONVERTER_SCRIPT" || { echo "Failed to download converter script"; exit 1; }
+  chmod +x "$CONVERTER_SCRIPT"
+  bash "$CONVERTER_SCRIPT" "$IOP_FILE" -v "$ISTIO_VERSION" -n "$NAMESPACE" || { echo "Failed to execute converter script"; exit 1; }
+  rm "$CONVERTER_SCRIPT"
+}
+
+function install_istio_cni(){
+  oc create namespace "${ISTIOCNI_NAMESPACE}" || true
+  TMP_ISTIOCNI=$WORKDIR/istio-cni.yaml
+  cp "$ISTIOCNI" "$TMP_ISTIOCNI"
+  yq -i ".spec.namespace=\"$ISTIOCNI_NAMESPACE\"" "$TMP_ISTIOCNI"
+  yq -i ".spec.version=\"$ISTIO_VERSION\"" "$TMP_ISTIOCNI"
+  oc apply -f "$TMP_ISTIOCNI"
+  echo "istioCNI created."
+}
+
+function install_istiod(){
+  # overwrite sailoperator version before applying it
+  oc create namespace "${NAMESPACE}" || true
+  if [ "${SAIL_API_VERSION:-}" != "" ]; then
+    yq -i eval ".apiVersion = \"sailoperator.io/$SAIL_API_VERSION\"" "$WORKDIR/$SAIL_IOP_FILE"
+  fi
+  patch_config
+  oc apply -f "$WORKDIR/$SAIL_IOP_FILE" || { echo "Failed to install istiod"; kubectl get istio default -o yaml;}
path: prow/setup/sail-operator-setup.sh
user: login: ctartici
body: Done
created_at: 2025-04-03T13:10:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,164 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
+NAMESPACE="${NAMESPACE:-istio-system}"
+ISTIOCNI_NAMESPACE="${ISTIOCNI_NAMESPACE:-istio-cni}"
+
+ISTIOCNI="${PROW}/config/sail-operator/istio-cni.yaml"
+INGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/ingress-gateway-values.yaml"
+EGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/egress-gateway-values.yaml"
+
+CONVERTER_ADDRESS="https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/tools/configuration-converter.sh"
+CONVERTER_SCRIPT=$(basename $CONVERTER_ADDRESS)
+
+function download_execute_converter(){
+  cd "${PROW}"
+  curl -fsSL "$CONVERTER_ADDRESS" -o "$CONVERTER_SCRIPT" || { echo "Failed to download converter script"; exit 1; }
+  chmod +x "$CONVERTER_SCRIPT"
+  bash "$CONVERTER_SCRIPT" "$IOP_FILE" -v "$ISTIO_VERSION" -n "$NAMESPACE" || { echo "Failed to execute converter script"; exit 1; }
+  rm "$CONVERTER_SCRIPT"
+}
+
+function install_istio_cni(){
+  oc create namespace "${ISTIOCNI_NAMESPACE}" || true
+  TMP_ISTIOCNI=$WORKDIR/istio-cni.yaml
+  cp "$ISTIOCNI" "$TMP_ISTIOCNI"
+  yq -i ".spec.namespace=\"$ISTIOCNI_NAMESPACE\"" "$TMP_ISTIOCNI"
+  yq -i ".spec.version=\"$ISTIO_VERSION\"" "$TMP_ISTIOCNI"
+  oc apply -f "$TMP_ISTIOCNI"
+  echo "istioCNI created."
+}
+
+function install_istiod(){
path: prow/setup/sail-operator-setup.sh
user: login: ctartici
body: Done
created_at: 2025-04-03T13:10:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,164 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
+NAMESPACE="${NAMESPACE:-istio-system}"
+ISTIOCNI_NAMESPACE="${ISTIOCNI_NAMESPACE:-istio-cni}"
+
+ISTIOCNI="${PROW}/config/sail-operator/istio-cni.yaml"
+INGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/ingress-gateway-values.yaml"
+EGRESS_GATEWAY_VALUES="${PROW}/config/sail-operator/egress-gateway-values.yaml"
+
+CONVERTER_ADDRESS="https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/tools/configuration-converter.sh"
path: prow/setup/sail-operator-setup.sh
user: login: ctartici
body: Done

created_at: 2025-04-03T13:13:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -177,4 +178,33 @@ spec:
   timeout --foreground -v -s SIGHUP -k ${TIMEOUT} ${TIMEOUT} bash -c 'until oc get IPAddressPool default -n metallb-system; do sleep 5; done && echo "The IP address pool has been created."'
 
   echo "MetalLB has been deployed and configured with the IP address pool."
+}
+
+#need to change env variables since make deploy of sail-operator uses them
+function env_save(){
+  INICIAL_NAMESPACE="$NAMESPACE"
+  INICIAL_HUB="$HUB"
+  INITIAL_TAG="$TAG"
+}
+function cleanup_sail_repo() {
+    echo "Cleaning up..."
+    cd .. 2>/dev/null || true
+    rm -rf sail-operator
+    export NAMESPACE="$INICIAL_NAMESPACE"
+    export HUB="$INICIAL_HUB"
+    export TAG="$INITIAL_TAG"
+}
+
+function deploy_operator(){
+  env_save
+  unset HUB
+  unset TAG
+  unset NAMESPACE
+  git clone --depth 1 --branch main $SAIL_REPO_URL || { echo "Failed to clone sail-operator repo"; exit 1; }
+  cd sail-operator
+  make deploy || { echo "sail-operator make deploy failed"; cleanup_sail_repo ; exit 1; }
+  oc -n sail-operator wait --for=condition=Available deployment/sail-operator --timeout=240s || { echo "Failed to start sail-operator"; exit 1; }
+  cleanup_sail_repo
+  echo "Sail operator deployed"
path: prow/setup/ocp_setup.sh
user: login: fjglira
body: I think later we can try to build the image from source code the image. But is not needed now, currently running from nightly builds is ok
created_at: 2025-04-03T13:14:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,165 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: the current master branch of Istio is 1.25 but we do not support it officially, in our main branch we can deploy master. Maybe worth checking if we can set an alias here to deploy by default the master alias
created_at: 2025-04-03T13:27:25Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,8 @@
+apiVersion: sailoperator.io/v1
+kind: IstioCNI
+metadata:
+  name: default
+spec:
+  namespace: ${ISTIOCNI_NAMESPACE}
+  version: ${ISTIO_VERSION}
+  profile: openshift
path: prow/config/sail-operator/istio-cni.yaml
user: login: fjglira
body: Let's test in a consecutive PR
created_at: 2025-04-03T13:29:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,165 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
path: prow/setup/sail-operator-setup.sh
user: login: ctartici
body: There is this file stating version: https://github.com/ctartici/istio_ossm/blob/master/VERSION but it has 1.26 for now. Where should I read the version?
created_at: 2025-04-03T14:16:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,165 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
path: prow/setup/sail-operator-setup.sh
user: login: ctartici
body: I can use this one I guess, WDYT? https://github.com/ctartici/sail-operator/blob/main/pkg/istioversion/versions.yaml


created_at: 2025-04-03T14:20:16Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,165 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: Yes, using the versions.yaml file will be the best I think
created_at: 2025-04-03T14:40:57Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,165 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+ISTIO_VERSION="${ISTIO_VERSION:-v1.24-latest}"
path: prow/setup/sail-operator-setup.sh
user: login: ctartici
body: Done
created_at: 2025-04-07T11:54:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,185 @@
+#!/bin/bash
+
+# Copyright 2019 Istio Authors
+#
+# Licensed 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.
+
+# The integration test runtime is calling this script two times if istio.test.kube.controlPlaneInstaller parameter set. One call is with 
+# install and another is with cleanup. On install script is used to convert istio in-cluster operator config to sail operator config and install istiod, istio-cni and gateways.
+# On cleanup  istiod, istio-cni, istio-ingressgateway and istio-engressgateway are cleaned
+# The output log of this script is printed under working directory set by: --istio.test.work_dir/sail-operator-setup.log
+# Upstream WoW to call this script is documented in here: https://github.com/openshift-service-mesh/istio/tree/master/tests/integration#running-tests-on-custom-deployment
+
+LOG_FILE="$2/sail-operator-setup.log"
+# Redirect stdout and stderr to the log file
+exec > >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' | tee -a "$LOG_FILE") 2>&1
+
+# Exit immediately for non zero status
+set -e
+# Check unset variables
+set -u
+# Print commands
+set -x
+# fail if any command in the pipeline fails
+set -o pipefail
+
+SKIP_CLEANUP="${SKIP_CLEANUP:-"false"}"
+
+
+function usage() {
+    echo "Usage: $0 <install|cleanup> <input_yaml>"
+    echo "Example: $0 install /path/to/iop.yaml"
+    exit 1
+}
+
+if [[ $# -lt 2 ]]; then
+    echo "Error: Missing required arguments."
+    usage
+fi
+
+if ! command -v yq &>/dev/null; then
+    echo "Error: 'yq' is not installed. Please install it before running the script."
+    exit 1
+fi
+
+if ! command -v helm &> /dev/null; then
+    echo "Helm is not installed. Please install Helm before proceeding."
+    exit 1
+fi
+
+WD=$(dirname "$0")
+PROW="$(dirname "$WD")"
+ROOT="$(dirname "$PROW")"
+
+WORKDIR="$2"
+# iop.yaml is the static file name for istiod config created by upstream integration test runtime
+IOP_FILE="$2"/iop.yaml
+SAIL_IOP_FILE="$(basename "${IOP_FILE%.yaml}")-sail.yaml"
+
+CONVERTER_BRANCH="${CONVERTER_BRANCH:-main}"
+
+# get istio version from versions.yaml
+VERSION_FILE="https://raw.githubusercontent.com/istio-ecosystem/sail-operator/$CONVERTER_BRANCH/pkg/istioversion/versions.yaml"
+if [ -z "${ISTIO_VERSION:-}" ]; then
+  ISTIO_VERSION="$(curl -s "$VERSION_FILE" | grep -E 'name: v[0-9]+\.[0-9]+' | sed -E 's/.*(v[0-9]+\.[0-9]+).*/\1/' | sort -Vr | head -n1)-latest"
+fi
path: prow/setup/sail-operator-setup.sh
user: login: fjglira
body: Very small change: I think it will be better to set also `branch` alternative to be able to run in the master branch against the master of the `versions.yaml` and we can set it later for another branch the same. It will be a small change
created_at: 2025-04-07T15:48:49Z
author_association: CONTRIBUTOR

PR comments:
user: login: fjglira
created_at: 2025-02-24T13:17:00Z
body: /test istio-integration-telemetry
author_association: CONTRIBUTOR
user: login: fjglira
created_at: 2025-02-25T10:10:28Z
body: /retest
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-02-25T13:05:27Z
body: /test istio-telemetry-sail-controlpane
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-02-25T13:05:31Z
body: @ctartici: The specified target(s) for `/test` were not found.
The following commands are available to trigger required jobs:
```
/test istio-integration-helm
```
```
/test istio-integration-pilot
```
```
/test istio-integration-telemetry
```

The following commands are available to trigger optional jobs:
```
/test istio-telemetry-sail-controlplane
```

Use `/test all` to run all jobs.


<details>

In response to [this](https://github.com/openshift-service-mesh/istio/pull/300#issuecomment-2681923761):

>/test istio-telemetry-sail-controlpane


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>
author_association: NONE
user: login: ctartici
created_at: 2025-02-25T13:06:51Z
body: /retest
author_association: CONTRIBUTOR
user: login: fjglira
created_at: 2025-02-25T16:14:04Z
body: **Important**: Adding do not merge label until `INSTALL_SAIL_OPERATOR` is set to false
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-02-28T14:57:00Z
body: @ctartici: The specified target(s) for `/test` were not found.
The following commands are available to trigger required jobs:
```
/test istio-integration-helm
```
```
/test istio-integration-pilot
```
```
/test istio-integration-telemetry
```

The following commands are available to trigger optional jobs:
```
/test istio-telemetry-sail-controlplane
```

Use `/test all` to run all jobs.


<details>

In response to [this](https://github.com/openshift-service-mesh/istio/pull/300#issuecomment-2690852668):

>/test ci/prow/istio-telemetry-sail-controlplane


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>
author_association: NONE
user: login: ctartici
created_at: 2025-02-28T14:57:14Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-04T10:32:22Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-04T10:37:47Z
body: /test istio-telemetry-sail-controlplane

author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-17T14:12:04Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-17T17:23:04Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-17T17:42:29Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-03-17T17:44:02Z
body: @ctartici: No presubmit jobs available for openshift-service-mesh/istio@master

<details>

In response to [this](https://github.com/openshift-service-mesh/istio/pull/300#issuecomment-2730370192):

>/test istio-pilot-sail-controlplane


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>
author_association: NONE
user: login: ctartici
created_at: 2025-03-17T18:06:18Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-03-17T18:07:48Z
body: @ctartici: No presubmit jobs available for openshift-service-mesh/istio@master

<details>

In response to [this](https://github.com/openshift-service-mesh/istio/pull/300#issuecomment-2730428148):

>/test istio-pilot-sail-controlplane


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>
author_association: NONE
user: login: openshift-ci[bot]
created_at: 2025-03-17T18:08:06Z
body: @ctartici: No presubmit jobs available for openshift-service-mesh/istio@master

<details>

In response to [this](https://github.com/openshift-service-mesh/istio/pull/300#issuecomment-2730432146):

>/test istio-telemetry-sail-controlplane


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>
author_association: NONE
user: login: ctartici
created_at: 2025-03-17T18:09:49Z
body: /retest
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-17T18:13:04Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-17T18:15:58Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-03-17T18:16:02Z
body: @ctartici: No presubmit jobs available for openshift-service-mesh/istio@master

<details>

In response to [this](https://github.com/openshift-service-mesh/istio/pull/300#issuecomment-2730450538):

>/test istio-pilot-sail-controlplane


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>
author_association: NONE
user: login: ctartici
created_at: 2025-03-18T12:05:11Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-19T11:33:39Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-19T13:06:30Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-20T08:57:52Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-21T07:10:12Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-21T07:29:24Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-25T09:58:11Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-25T11:50:55Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-26T09:22:27Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-26T14:46:52Z
body: /test istio-pilot-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-26T14:56:53Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-26T16:59:31Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-27T08:29:39Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-03-31T09:37:45Z
body: /test istio-telemetry-sail-controlplane
author_association: CONTRIBUTOR
user: login: fjglira
created_at: 2025-04-03T13:01:01Z
body: If is ready, you can set the PR to ready to review to execute the prow jobs
author_association: CONTRIBUTOR
user: login: ctartici
created_at: 2025-04-03T14:33:46Z
body: /test istio-integration-telemetry
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-04-07T13:00:17Z
body: @ctartici: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
ci/prow/istio-pilot-sail-controlplane | 0e8c6238c8c8c9bbd773d2bf0ab8f656da86946e | [link](https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift-service-mesh_istio/300/pull-ci-openshift-service-mesh-istio-master-istio-pilot-sail-controlplane/1904826279476072448) | false | `/test istio-pilot-sail-controlplane`
ci/prow/istio-telemetry-sail-controlplane | 6d2370e3d61439ea510ef9490ec35f8dedc41a97 | [link](https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift-service-mesh_istio/300/pull-ci-openshift-service-mesh-istio-master-istio-telemetry-sail-controlplane/1906642073189093376) | false | `/test istio-telemetry-sail-controlplane`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=openshift-service-mesh&repo=istio&pr=300). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:ctartici).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
author_association: NONE
user: login: ctartici
created_at: 2025-04-07T13:08:07Z
body: /test istio-integration-helm
author_association: CONTRIBUTOR