This is an automated email from the ASF dual-hosted git repository.

wu-sheng pushed a commit to branch migrate-to-horizon-ui
in repository https://gitbox.apache.org/repos/asf/skywalking-helm.git

commit 99bb067765731e1e45b446d298d965fb675318b1
Author: Wu Sheng <[email protected]>
AuthorDate: Mon May 18 16:51:02 2026 +0800

    Replace booster-ui with Horizon UI
    
    skywalking-booster-ui is deprecated; this migrates the chart to ship
    Apache SkyWalking Horizon UI (apache/skywalking-horizon-ui). Horizon
    bundles a BFF in front of the SPA, listens on port 8081, requires a
    horizon.yaml config file, talks to OAP on two ports (query 12800 +
    admin 17128), and authenticates users — none of which booster-ui did.
    
    Chart:
    - New ui-configmap.yaml renders horizon.yaml (deep-merged from
      ui.config over chart defaults that wire queryUrl/adminUrl to the
      in-cluster OAP service)
    - New ui-pvc.yaml for the BFF's /data state directory
    - ui-deployment.yaml: port 8081, ConfigMap mount, /data volume,
      HTTP readiness probe on /api/oap/info, Recreate strategy, fsGroup
    - Add oap.ports.admin: 17128 so the OAP service exposes the admin
      REST surface the BFF needs (OAP 10.5+)
    - ui.enabled flag gates all UI resources, for deployments that point
      an external UI at OAP directly
    - Ship default users admin/admin and skywalking/skywalking (real
      argon2id hashes) so the chart boots out of the box; NOTES.txt and
      README warn to rotate before production
    
    E2E:
    - Horizon does not pass-through /graphql, so swctl queries are
      redirected from the UI service to OAP's 12800 directly
    - Kind expose-ports switched from service/skywalking-ui to
      service/skywalking-oap
    - skywalking-ui added to the wait block as a BFF smoke check
    - env: UI_REPO=ghcr.io/apache/skywalking-horizon-ui, UI_TAG=main
      (release images land at apache/skywalking-ui:horizon-x.y.z on
      Docker Hub)
    
    Docs:
    - New chart/skywalking/values-horizon-ui.yaml self-contained example
      mirroring the upstream horizon.example.yaml shape
    - README sections explain credential rotation, ConfigMap+Secret
      pattern, and the bigger booster→horizon behavioral diff
---
 README.md                                     |  82 +++++++++++++++--
 chart/skywalking/README.md                    |  24 +++--
 chart/skywalking/templates/NOTES.txt          |  33 +++++++
 chart/skywalking/templates/ui-configmap.yaml  |  46 ++++++++++
 chart/skywalking/templates/ui-deployment.yaml |  61 ++++++++++---
 chart/skywalking/templates/ui-ingress.yaml    |   2 +-
 chart/skywalking/templates/ui-pvc.yaml        |  44 ++++++++++
 chart/skywalking/templates/ui-svc.yaml        |   2 +
 chart/skywalking/values-horizon-ui.yaml       |  76 ++++++++++++++++
 chart/skywalking/values-my-es.yaml            |  17 +++-
 chart/skywalking/values.yaml                  | 122 ++++++++++++++++++++++++--
 test/e2e/e2e-banyandb-cluster.yaml            | 115 ++++++++++++------------
 test/e2e/e2e-banyandb-standalone.yaml         | 115 ++++++++++++------------
 test/e2e/e2e-elasticsearch.yaml               | 115 ++++++++++++------------
 test/e2e/env                                  |   7 +-
 test/e2e/values.yaml                          |  18 ++++
 16 files changed, 677 insertions(+), 202 deletions(-)

diff --git a/README.md b/README.md
index ea4e4f3..4648d33 100644
--- a/README.md
+++ b/README.md
@@ -19,12 +19,84 @@ There are required values that you must set explicitly when 
deploying SkyWalking
 | ---- | ----------- | ------- |
 | `oap.image.tag` | the OAP docker image tag | `10.4.0` |
 | `oap.storageType` | the storage type of the OAP | `elasticsearch`, 
`postgresql`, `banyandb`, etc. |
-| `ui.image.tag` | the UI docker image tag | `10.4.0` |
+| `ui.image.tag` | the Horizon UI docker image tag | `horizon-1.0.0` |
 
 You can set these required values via command line (e.g. `--set 
oap.image.tag=10.4.0 --set oap.storageType=elasticsearch`),
 or edit them in a separate file(e.g. 
[`values.yaml`](chart/skywalking/values.yaml), 
[`values-my-es.yaml`](chart/skywalking/values-my-es.yaml))
 and use `-f <filename>` or `--values=<filename>` to set them.
 
+## Web UI (Horizon UI)
+
+The web UI shipped by this chart is [Apache SkyWalking Horizon 
UI](https://github.com/apache/skywalking-horizon-ui),
+which replaces the legacy `skywalking-booster-ui`. Compared to booster-ui:
+
+- The container bundles a Node-based BFF in front of the SPA. It connects to 
OAP on **two** ports: the GraphQL query port (`12800`, `oap.ports.rest`) and 
the admin REST port (`17128`, `oap.ports.admin`, available on OAP 10.5+).
+- The container exposes **port 8081** (was 8080) and **does not pass-through 
`/graphql`** to OAP. Callers that previously talked to the UI's GraphQL 
endpoint (e.g. `swctl --base-url=http://<ui>/graphql`) must now talk to the OAP 
service directly (`http://<oap>:12800/graphql`).
+- The BFF requires **authentication**. The chart ships two default users so it 
boots out of the box:
+
+  | Username | Password | Roles | What they can do |
+  | --- | --- | --- | --- |
+  | `admin` | `admin` | `admin` | everything |
+  | `skywalking` | `skywalking` | `viewer`, `maintainer` | read all 
observability data, plus OAP cluster + module health |
+
+  ⚠ **These defaults are publicly known. Rotate them before exposing the UI 
beyond a trusted network.** Generate a replacement `argon2id` hash with `pnpm 
--filter bff cli:hash` in a checkout of 
[skywalking-horizon-ui](https://github.com/apache/skywalking-horizon-ui), then 
override `ui.config.auth.local.users` in your own values file (or wire the hash 
through a Kubernetes Secret as shown below).
+- Release images are published to Docker Hub as 
`apache/skywalking-ui:horizon-x.y.z`. Pre-release / dev images live at 
`ghcr.io/apache/skywalking-horizon-ui` (tags: SHA, `vX.Y.Z`, `main`).
+
+### Out-of-the-box install
+
+```shell
+helm install "${SKYWALKING_RELEASE_NAME}" \
+  oci://registry-1.docker.io/apache/skywalking-helm \
+  --version "${SKYWALKING_RELEASE_VERSION}" \
+  -n "${SKYWALKING_RELEASE_NAMESPACE}" \
+  -f chart/skywalking/values-horizon-ui.yaml
+```
+
+Then port-forward and log in as `admin/admin`:
+
+```shell
+kubectl port-forward -n "${SKYWALKING_RELEASE_NAMESPACE}" \
+  svc/${SKYWALKING_RELEASE_NAME}-skywalking-helm-ui 8080:80
+open http://127.0.0.1:8080
+```
+
+[`chart/skywalking/values-horizon-ui.yaml`](chart/skywalking/values-horizon-ui.yaml)
 is a self-contained example that mirrors the public 
[`horizon.example.yaml`](https://github.com/apache/skywalking-horizon-ui/blob/main/horizon.example.yaml)
 shipped at `/app/horizon.example.yaml` inside the image.
+
+### Production: hash via Kubernetes Secret
+
+For anything beyond a demo, swap the publicly-known hash for one you generated 
yourself and feed it through a Secret + `${VAR}` interpolation:
+
+```shell
+HASH=$(cd skywalking-horizon-ui && pnpm --filter bff cli:hash 
'your-strong-password' | tail -1)
+
+kubectl create secret generic horizon-admin \
+  -n "${SKYWALKING_RELEASE_NAMESPACE}" \
+  --from-literal=HORIZON_ADMIN_HASH="$HASH"
+
+cat > my-values.yaml <<'EOF'
+ui:
+  envFromSecret: horizon-admin
+  config:
+    auth:
+      local:
+        users:
+          - username: admin
+            passwordHash: "${HORIZON_ADMIN_HASH}"
+            roles: [admin]
+EOF
+
+helm install "${SKYWALKING_RELEASE_NAME}" \
+  oci://registry-1.docker.io/apache/skywalking-helm \
+  --version "${SKYWALKING_RELEASE_VERSION}" \
+  -n "${SKYWALKING_RELEASE_NAMESPACE}" \
+  --set oap.image.tag=10.4.0 \
+  --set oap.storageType=elasticsearch \
+  --set ui.image.tag=horizon-1.0.0 \
+  -f my-values.yaml
+```
+
+Full `horizon.yaml` reference: 
https://github.com/apache/skywalking-horizon-ui/blob/main/docs/setup/horizon-yaml.md
+
 # Install
 
 Let's set some variables for convenient use later.
@@ -44,7 +116,7 @@ helm install "${SKYWALKING_RELEASE_NAME}" \
   -n "${SKYWALKING_RELEASE_NAMESPACE}" \
   --set oap.image.tag=10.4.0 \
   --set oap.storageType=elasticsearch \
-  --set ui.image.tag=10.4.0
+  --set ui.image.tag=horizon-1.0.0
 ```
 
 To use BanyanDB as storage solution, you can try
@@ -56,7 +128,7 @@ helm install "${SKYWALKING_RELEASE_NAME}" \
   -n "${SKYWALKING_RELEASE_NAMESPACE}" \
   --set oap.image.tag=10.4.0 \
   --set oap.storageType=banyandb \
-  --set ui.image.tag=10.4.0 \
+  --set ui.image.tag=horizon-1.0.0 \
   --set elasticsearch.enabled=false \
   --set banyandb.enabled=true \
   --set banyandb.image.tag=0.10.1
@@ -135,7 +207,7 @@ here are some examples.
 helm install "${SKYWALKING_RELEASE_NAME}" ${REPO}/skywalking -n 
"${SKYWALKING_RELEASE_NAMESPACE}" \
   --set oap.image.tag=10.4.0 \
   --set oap.storageType=elasticsearch \
-  --set ui.image.tag=10.4.0 \
+  --set ui.image.tag=horizon-1.0.0 \
   --set eck-operator.installCRDs=false
 ```
 
@@ -179,7 +251,7 @@ helm -n istio-system install skywalking \
   -n "${SKYWALKING_RELEASE_NAMESPACE}" \
   --set oap.image.tag=10.4.0 \
   --set oap.storageType=elasticsearch \
-  --set ui.image.tag=10.4.0
+  --set ui.image.tag=horizon-1.0.0
 ```
 
 ## Install development version using source codes
diff --git a/chart/skywalking/README.md b/chart/skywalking/README.md
index 418b05c..8ab8a1f 100644
--- a/chart/skywalking/README.md
+++ b/chart/skywalking/README.md
@@ -55,7 +55,8 @@ The following table lists the configurable parameters of the 
Skywalking chart an
 | `oap.image.tag`                        | OAP container image tag             
                                                                                
                                                                                
                                                                                
                                       | `6.1.0`                                
                                                                                
  |
 | `oap.image.pullPolicy`                 | OAP container image pull policy     
                                                                                
                                                                                
                                                                                
                                       | `IfNotPresent`                         
                                                                                
  |
 | `oap.ports.grpc`                       | OAP grpc port for tracing or metric 
                                                                                
                                                                                
                                                                                
                                       | `11800`                                
                                                                                
  |
-| `oap.ports.rest`                       | OAP http port for Web UI            
                                                                                
                                                                                
                                                                                
                                       | `12800`                                
                                                                                
  |
+| `oap.ports.rest`                       | OAP http port for the GraphQL query 
protocol (used by the UI and by `swctl`)                                        
                                                                                
                                                                                
                                       | `12800`                                
                                                                                
  |
+| `oap.ports.admin`                      | OAP admin REST port (runtime-rule, 
DSL debugging, inspect, status). Required by Horizon UI's admin features; 
available on OAP 10.5+                                                          
                                                                                
                                              | `17128`                         
                                                                                
         |
 | `oap.ports.zipkinreceiver`             | OAP http port for Zipkin 
receiver(not exposed by default)                                                
                                                                                
                                                                                
                                                  | `9411`                      
                                                                                
             |
 | `oap.ports.zipkinquery`                | OAP http port for querying Zipkin 
traces and UI(not exposed by default)                                           
                                                                                
                                                                                
                                         | `9412`                               
                                                                                
    |
 | `oap.replicas`                         | OAP k8s deployment replicas         
                                                                                
                                                                                
                                                                                
                                       | `2`                                    
                                                                                
  |
@@ -72,10 +73,11 @@ The following table lists the configurable parameters of 
the Skywalking chart an
 | `oap.readinessProbe`                   | Configuration fields for the 
[readinessProbe](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)
                                                                                
                                                                                
       | `tcpSocket.port: 12800` <br> `initialDelaySeconds: 5` <br> 
`periodSeconds: 10`                                           
 | `oap.env`                              | OAP environment variables           
                                                                                
                                                                                
                                                                                
                                       | `[]`                                   
                                                                                
  |
 | `oap.securityContext`                  | Allows you to set the 
[securityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod)
 for the pod                                                                    
                                                                                
     | `fsGroup: 1000`<br>`runAsUser: 1000`                                     
                                                |
+| `ui.enabled`                           | Deploy the Horizon UI. Set `false` 
to skip the UI Deployment, Service, Ingress, ConfigMap, and PVC entirely 
(useful when an external UI talks to OAP directly)                              
                                                                                
                                               | `true`                         
                                                                                
          |
 | `ui.name`                              | Web UI deployment name              
                                                                                
                                                                                
                                                                                
                                       | `ui`                                   
                                                                                
  |
-| `ui.replicas`                          | Web UI k8s deployment replicas      
                                                                                
                                                                                
                                                                                
                                       | `1`                                    
                                                                                
  |
-| `ui.image.repository`                  | Web UI container image name         
                                                                                
                                                                                
                                                                                
                                       | 
`skywalking.docker.scarf.sh/apache/skywalking-ui`                               
                                         |
-| `ui.image.tag`                         | Web UI container image tag          
                                                                                
                                                                                
                                                                                
                                       | `6.1.0`                                
                                                                                
  |
+| `ui.replicas`                          | Web UI k8s deployment replicas. 
Keep at `1` unless your ingress provides sticky sessions — the Horizon BFF 
holds the session table in memory                                               
                                                                                
                                                | `1`                           
                                                                                
           |
+| `ui.image.repository`                  | Horizon UI container image. Release 
images: Docker Hub `apache/skywalking-ui` tagged `horizon-x.y.z`. Dev images: 
`ghcr.io/apache/skywalking-horizon-ui`                                          
                                                                                
                                         | 
`skywalking.docker.scarf.sh/apache/skywalking-ui`                               
                                         |
+| `ui.image.tag`                         | Horizon UI image tag (required), 
e.g. `horizon-1.0.0`                                                            
                                                                                
                                                                                
                                          | `null`                              
                                                                                
     |
 | `ui.image.pullPolicy`                  | Web UI container image pull policy  
                                                                                
                                                                                
                                                                                
                                       | `IfNotPresent`                         
                                                                                
  |
 | `ui.nodeAffinity`                      | Web UI node affinity policy         
                                                                                
                                                                                
                                                                                
                                       | `{}`                                   
                                                                                
  |
 | `ui.nodeSelector`                      | Web UI labels for pod assignment    
                                                                                
                                                                                
                                                                                
                                       | `{}`                                   
                                                                                
  |
@@ -87,12 +89,22 @@ The following table lists the configurable parameters of 
the Skywalking chart an
 | `ui.ingress.tls`                       | Associate TLS with the Ingress      
                                                                                
                                                                                
                                                                                
                                       | `[]`                                   
                                                                                
  |
 | `ui.service.type`                      | Web UI svc type                     
                                                                                
                                                                                
                                                                                
                                       | `ClusterIP`                            
                                                                                
  |
 | `ui.service.externalPort`              | external port for the service       
                                                                                
                                                                                
                                                                                
                                       | `80`                                   
                                                                                
  |
-| `ui.service.internalPort`              | internal port for the service       
                                                                                
                                                                                
                                                                                
                                       | `8080`                                 
                                                                                
  |
+| `ui.service.internalPort`              | internal port for the service 
(Horizon BFF binds 8081)                                                        
                                                                                
                                                                                
                                             | `8081`                           
                                                                                
        |
 | `ui.service.externalIPs`               | external IP addresses               
                                                                                
                                                                                
                                                                                
                                       | `nil`                                  
                                                                                
  |
 | `ui.service.loadBalancerIP`            | Load Balancer IP address            
                                                                                
                                                                                
                                                                                
                                       | `nil`                                  
                                                                                
  |
 | `ui.service.annotations`               | Kubernetes service annotations      
                                                                                
                                                                                
                                                                                
                                       | `{}`                                   
                                                                                
  |
 | `ui.service.loadBalancerSourceRanges`  | Limit load balancer source IPs to 
list of CIDRs (where available))                                                
                                                                                
                                                                                
                                         | `[]`                                 
                                                                                
    |
-| `ui.securityContext`                   | Allows you to set the 
[securityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod)
 for the pod                                                                    
                                                                                
     | `fsGroup: 1000`<br>`runAsUser: 1000`                                     
                                                |
+| `ui.securityContext`                   | Pod 
[securityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod).
 The image runs as the non-root `horizon` user; `fsGroup` makes mounted PVCs 
group-writable for that user                                                    
                         | `fsGroup: 101`                                       
                                                                    |
+| `ui.livenessProbe`                     | TCP liveness probe                  
                                                                                
                                                                                
                                                                                
                                       | `tcpSocket.port: 8081`                 
                                                                                
  |
+| `ui.readinessProbe`                    | HTTP readiness probe; verifies the 
BFF is up and OAP query port is reachable                                       
                                                                                
                                                                                
                                        | `httpGet.path: /api/oap/info, port: 
8081`                                                                           
     |
+| `ui.persistence.enabled`               | Mount a PVC at `/data` for audit 
log / setup / alarm state / wire debug log. When `false`, state lands in the 
container's writable layer and is lost on pod restart                           
                                                                                
                                             | `false`                          
                                                                                
        |
+| `ui.persistence.existingClaim`         | Use a pre-created PVC; if empty, 
the chart creates one                                                           
                                                                                
                                                                                
                                          | `""`                                
                                                                                
     |
+| `ui.persistence.storageClass`          | Storage class for the chart-managed 
PVC                                                                             
                                                                                
                                                                                
                                       | `""`                                   
                                                                                
  |
+| `ui.persistence.accessModes`           | PVC access modes                    
                                                                                
                                                                                
                                                                                
                                       | `[ReadWriteOnce]`                      
                                                                                
  |
+| `ui.persistence.size`                  | PVC size                            
                                                                                
                                                                                
                                                                                
                                       | `1Gi`                                  
                                                                                
  |
+| `ui.config`                            | `horizon.yaml` content (deep-merged 
onto chart defaults that point `oap.queryUrl`/`adminUrl` at the in-cluster 
OAP). See the [horizon.yaml 
reference](https://github.com/apache/skywalking-horizon-ui/blob/main/docs/setup/horizon-yaml.md).
 The chart ships **public-known default users** (`admin`/`admin`, 
`skywalking`/`skywalking`) so the UI boots out of the box — **rotate before 
production** | see `values.yaml`                                        [...]
+| `ui.envFromSecret`                     | Reference a Secret whose keys are 
exposed as env vars in the BFF container, for use with `${VAR}` interpolation 
in `ui.config` (e.g. admin password hash)                                       
                                                                                
                                           | `""`                               
                                                                                
      |
+| `ui.extraEnv`                          | Extra env vars passed to the BFF 
container                                                                       
                                                                                
                                                                                
                                          | `[]`                                
                                                                                
     |
 | `oapInit.nodeAffinity`                 | OAP init job node affinity policy   
                                                                                
                                                                                
                                                                                
                                       | `{}`                                   
                                                                                
  |
 | `oapInit.nodeSelector`                 | OAP init job labels for master pod 
assignment                                                                      
                                                                                
                                                                                
                                        | `{}`                                  
                                                                                
   |
 | `oapInit.tolerations`                  | OAP init job tolerations            
                                                                                
                                                                                
                                                                                
                                       | `[]`                                   
                                                                                
  |
diff --git a/chart/skywalking/templates/NOTES.txt 
b/chart/skywalking/templates/NOTES.txt
index 1da5c4d..32d3c88 100644
--- a/chart/skywalking/templates/NOTES.txt
+++ b/chart/skywalking/templates/NOTES.txt
@@ -27,6 +27,11 @@ Your release is named {{ .Release.Name }}.
 
 Learn more, please visit https://skywalking.apache.org/
 
+{{- if not .Values.ui.enabled }}
+The web UI is disabled in this release (ui.enabled=false). No UI Deployment,
+Service, ConfigMap, Ingress, or PVC was created. OAP is still reachable on
+its GraphQL port (default 12800) for any external UI you point at it.
+{{- else }}
 Get the UI URL by running these commands:
 {{- if .Values.ui.ingress.enabled }}
 {{- range .Values.ui.ingress.hosts }}
@@ -46,3 +51,31 @@ Get the UI URL by running these commands:
   kubectl port-forward svc/{{ include "skywalking.ui.fullname" . }} 8080:{{ 
.Values.ui.service.externalPort }} --namespace {{ .Release.Namespace }}
 {{- end }}
 
+NOTE on Horizon UI auth:
+
+The web UI is Apache SkyWalking Horizon UI. It ships with two default users
+so the chart boots out of the box:
+
+  admin       / admin        — full admin
+  skywalking  / skywalking   — viewer + maintainer (read data + platform 
health)
+
+⚠ These passwords are PUBLICLY KNOWN. Rotate them before exposing the UI
+beyond a trusted network. Generate a replacement argon2id hash by checking
+out apache/skywalking-horizon-ui and running `pnpm --filter bff cli:hash`,
+then override `ui.config.auth.local.users`. For production, store the hash
+in a Kubernetes Secret and reference it via ${VAR} interpolation:
+
+  ui:
+    envFromSecret: horizon-admin-secret   # Secret contains HORIZON_ADMIN_HASH
+    config:
+      auth:
+        local:
+          users:
+            - username: admin
+              passwordHash: "${HORIZON_ADMIN_HASH}"
+              roles: [admin]
+
+Full config reference:
+  
https://github.com/apache/skywalking-horizon-ui/blob/main/docs/setup/horizon-yaml.md
+{{- end }}
+
diff --git a/chart/skywalking/templates/ui-configmap.yaml 
b/chart/skywalking/templates/ui-configmap.yaml
new file mode 100644
index 0000000..81b22f7
--- /dev/null
+++ b/chart/skywalking/templates/ui-configmap.yaml
@@ -0,0 +1,46 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{- if .Values.ui.enabled }}
+{{- /*
+horizon.yaml is built by deep-merging:
+  1. chart-managed defaults that point at the in-cluster OAP service
+  2. whatever the operator put in `ui.config`
+The merge order means user values win on every field except oap.queryUrl /
+oap.adminUrl, where we always default to the in-cluster service if the
+operator left them unset.
+*/ -}}
+{{- $defaults := dict
+  "oap" (dict
+    "queryUrl" (printf "http://%s:%v"; (include "skywalking.oap.fullname" .) 
.Values.oap.ports.rest)
+    "adminUrl" (printf "http://%s:%v"; (include "skywalking.oap.fullname" .) 
(default 17128 .Values.oap.ports.admin))
+  )
+}}
+{{- $userConfig := default (dict) .Values.ui.config }}
+{{- $merged := mergeOverwrite (deepCopy $defaults) (deepCopy $userConfig) }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ template "skywalking.ui.fullname" . }}
+  labels:
+    app: {{ template "skywalking.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version }}
+    component: "{{ .Values.ui.name }}"
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+data:
+  horizon.yaml: |
+{{ toYaml $merged | indent 4 }}
+{{- end }}
diff --git a/chart/skywalking/templates/ui-deployment.yaml 
b/chart/skywalking/templates/ui-deployment.yaml
index 4945f3c..eb4c6c7 100644
--- a/chart/skywalking/templates/ui-deployment.yaml
+++ b/chart/skywalking/templates/ui-deployment.yaml
@@ -13,6 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+{{- if .Values.ui.enabled }}
 apiVersion: apps/v1
 kind: Deployment
 metadata:
@@ -25,6 +26,11 @@ metadata:
     release: {{ .Release.Name }}
 spec:
   replicas: {{ .Values.ui.replicas }}
+  # Horizon UI's BFF holds the session table in memory. Recreate (not
+  # RollingUpdate) avoids the brief window of two pods serving traffic with
+  # disjoint session state.
+  strategy:
+    type: Recreate
   selector:
     matchLabels:
       app: {{ template "skywalking.name" . }}
@@ -36,9 +42,12 @@ spec:
         app: {{ template "skywalking.name" . }}
         component: "{{ .Values.ui.name }}"
         release: {{ .Release.Name }}
-        {{- if .Values.ui.podAnnotations }}
       annotations:
-{{ toYaml .Values.ui.podAnnotations | indent 8 }}
+        # Roll the pod when horizon.yaml changes — ConfigMap subPath mounts
+        # don't auto-update at runtime.
+        checksum/config: {{ include (print $.Template.BasePath 
"/ui-configmap.yaml") . | sha256sum }}
+        {{- with .Values.ui.podAnnotations }}
+{{ toYaml . | indent 8 }}
         {{- end }}
     spec:
       {{- with .Values.ui.securityContext }}
@@ -74,14 +83,44 @@ spec:
         resources:
 {{ toYaml .Values.ui.resources | indent 10 }}
 {{- end }}
+{{- if .Values.ui.livenessProbe }}
+        livenessProbe:
+{{ toYaml .Values.ui.livenessProbe | indent 10 }}
+{{- end }}
+{{- if .Values.ui.readinessProbe }}
+        readinessProbe:
+{{ toYaml .Values.ui.readinessProbe | indent 10 }}
+{{- end }}
+{{- if or .Values.ui.envFromSecret .Values.ui.extraEnv }}
         env:
-        - name: SW_OAP_ADDRESS
-          value: "http://{{ template "skywalking.oap.fullname" . }}:{{ 
.Values.oap.ports.rest }}"
-{{- if .Values.oap.ports.zipkinquery }}
-        - name: SW_ZIPKIN_ADDRESS
-          value: "http://{{ template "skywalking.oap.fullname" . }}:{{ 
.Values.oap.ports.zipkinquery }}"
+{{- range .Values.ui.extraEnv }}
+        - {{ toYaml . | nindent 10 | trim }}
+{{- end }}
+{{- end }}
+{{- if .Values.ui.envFromSecret }}
+        envFrom:
+        - secretRef:
+            name: {{ .Values.ui.envFromSecret }}
+{{- end }}
+        volumeMounts:
+        - name: horizon-config
+          mountPath: /app/horizon.yaml
+          subPath: horizon.yaml
+          readOnly: true
+        - name: horizon-data
+          mountPath: /data
+      volumes:
+      - name: horizon-config
+        configMap:
+          name: {{ template "skywalking.ui.fullname" . }}
+          items:
+          - key: horizon.yaml
+            path: horizon.yaml
+      - name: horizon-data
+{{- if .Values.ui.persistence.enabled }}
+        persistentVolumeClaim:
+          claimName: {{ default (printf "%s-data" (include 
"skywalking.ui.fullname" .)) .Values.ui.persistence.existingClaim }}
+{{- else }}
+        emptyDir: {}
+{{- end }}
 {{- end }}
-        {{- range $key, $value :=  .Values.ui.env }}
-        - name: {{ $key }}
-          value: {{ $value | quote }}
-        {{- end }}
diff --git a/chart/skywalking/templates/ui-ingress.yaml 
b/chart/skywalking/templates/ui-ingress.yaml
index 4d3cb57..94c146b 100644
--- a/chart/skywalking/templates/ui-ingress.yaml
+++ b/chart/skywalking/templates/ui-ingress.yaml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- if .Values.ui.ingress.enabled }}
+{{- if and .Values.ui.enabled .Values.ui.ingress.enabled }}
 {{- $serviceName := include "skywalking.ui.fullname" . }}
 {{- $servicePort := .Values.ui.service.externalPort }}
 {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1/Ingress" }}
diff --git a/chart/skywalking/templates/ui-pvc.yaml 
b/chart/skywalking/templates/ui-pvc.yaml
new file mode 100644
index 0000000..3f331a9
--- /dev/null
+++ b/chart/skywalking/templates/ui-pvc.yaml
@@ -0,0 +1,44 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+{{- if and .Values.ui.enabled .Values.ui.persistence.enabled (not 
.Values.ui.persistence.existingClaim) }}
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: {{ template "skywalking.ui.fullname" . }}-data
+  labels:
+    app: {{ template "skywalking.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version }}
+    component: "{{ .Values.ui.name }}"
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+  {{- with .Values.ui.persistence.annotations }}
+  annotations:
+{{ toYaml . | indent 4 }}
+  {{- end }}
+spec:
+  accessModes:
+{{ toYaml .Values.ui.persistence.accessModes | indent 4 }}
+  resources:
+    requests:
+      storage: {{ .Values.ui.persistence.size | quote }}
+  {{- if .Values.ui.persistence.storageClass }}
+  {{- if (eq "-" .Values.ui.persistence.storageClass) }}
+  storageClassName: ""
+  {{- else }}
+  storageClassName: {{ .Values.ui.persistence.storageClass | quote }}
+  {{- end }}
+  {{- end }}
+{{- end }}
diff --git a/chart/skywalking/templates/ui-svc.yaml 
b/chart/skywalking/templates/ui-svc.yaml
index 6250c83..46b2528 100644
--- a/chart/skywalking/templates/ui-svc.yaml
+++ b/chart/skywalking/templates/ui-svc.yaml
@@ -13,6 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+{{- if .Values.ui.enabled }}
 apiVersion: v1
 kind: Service
 metadata:
@@ -61,3 +62,4 @@ spec:
 {{- if .Values.ui.service.loadBalancerIP }}
   loadBalancerIP: {{ .Values.ui.service.loadBalancerIP }}
 {{- end }}
+{{- end }}
diff --git a/chart/skywalking/values-horizon-ui.yaml 
b/chart/skywalking/values-horizon-ui.yaml
new file mode 100644
index 0000000..e9c0312
--- /dev/null
+++ b/chart/skywalking/values-horizon-ui.yaml
@@ -0,0 +1,76 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Minimal `helm install -f values-horizon-ui.yaml` example that boots the
+# chart with Horizon UI using its default users — admin/admin and
+# skywalking/skywalking. These match what the chart already ships in
+# `values.yaml`; this file exists so an operator can `helm install -f` a
+# single, self-contained example without learning every required value
+# first.
+#
+# The Horizon `config` block mirrors the public horizon.example.yaml that
+# ships at /app/horizon.example.yaml inside the image — same shape, same
+# field names. See:
+#   
https://github.com/apache/skywalking-horizon-ui/blob/main/horizon.example.yaml
+#   
https://github.com/apache/skywalking-horizon-ui/blob/main/docs/setup/horizon-yaml.md
+#
+# ⚠ ROTATE THE DEFAULT PASSWORDS BEFORE EXPOSING THE UI BEYOND A TRUSTED
+# NETWORK. The hashes below are public; anyone can log in as admin/admin.
+# Generate replacements by checking out apache/skywalking-horizon-ui and
+# running `pnpm --filter bff cli:hash`, or wire production secrets through
+# a Kubernetes Secret + `ui.envFromSecret` + `${VAR}` interpolation.
+
+oap:
+  image:
+    tag: 10.4.0
+  storageType: elasticsearch
+
+ui:
+  image:
+    tag: horizon-1.0.0
+  config:
+    server:
+      host: 0.0.0.0
+      port: 8081
+    oap:
+      # queryUrl / adminUrl default to the in-cluster OAP service; the chart
+      # fills them in. Set them explicitly only when pointing at an external
+      # OAP cluster.
+      timeoutMs: 15000
+      # Optional basic-auth — uncomment when the OAP cluster requires it.
+      # auth:
+      #   username: skywalking
+      #   password: "${HORIZON_OAP_PW}"
+    auth:
+      backend: local
+      local:
+        users:
+          - username: admin            # password: admin
+            passwordHash: 
"$argon2id$v=19$m=65536,t=3,p=4$eemqy1r72oSXR58y8VpRqw$Bn/dULrmJTHEi3263KfgWDEwQmUsqNLi3xwyv/DekHM"
+            roles: [admin]
+          - username: skywalking       # password: skywalking
+            passwordHash: 
"$argon2id$v=19$m=65536,t=3,p=4$Zqj8HhQDqm8d5c2MipHYZw$BsaCnu4bdd4uadIldx3wwYLsdo47Thxb7Lv1MXpWG2Q"
+            roles: [viewer, maintainer]
+    rbac:
+      enabled: true
+    session:
+      ttlMinutes: 60
+      cookieName: horizon_sid
+      cookieSecure: false   # flip to true when serving over HTTPS
+
+# Reach the UI from your laptop:
+#   kubectl port-forward svc/<release>-skywalking-helm-ui 8080:80
+# then open http://127.0.0.1:8080 and log in as admin/admin (or
+# skywalking/skywalking).
diff --git a/chart/skywalking/values-my-es.yaml 
b/chart/skywalking/values-my-es.yaml
index aea448c..c568f29 100644
--- a/chart/skywalking/values-my-es.yaml
+++ b/chart/skywalking/values-my-es.yaml
@@ -19,12 +19,25 @@
 
 oap:
   image:
-    tag: 10.0.0
+    tag: 10.4.0
   storageType: elasticsearch
 
 ui:
   image:
-    tag: 10.0.0
+    tag: horizon-1.0.0
+  # Horizon UI's BFF refuses to start with no users. Replace the
+  # passwordHash with an argon2id hash generated by
+  # `pnpm --filter bff cli:hash` in apache/skywalking-horizon-ui — or
+  # reference a Kubernetes Secret via `ui.envFromSecret` + `${VAR}`
+  # interpolation as shown in the README.
+  config:
+    auth:
+      backend: local
+      local:
+        users:
+          - username: admin
+            passwordHash: "REPLACE_WITH_ARGON2ID_HASH"
+            roles: [admin]
 
 elasticsearch:
   enabled: false
diff --git a/chart/skywalking/values.yaml b/chart/skywalking/values.yaml
index f633102..a10eae9 100644
--- a/chart/skywalking/values.yaml
+++ b/chart/skywalking/values.yaml
@@ -41,6 +41,11 @@ oap:
     # zabbix: 10051
     grpc: 11800
     rest: 12800
+    # admin REST exposed by OAP 10.5+. Horizon UI's BFF talks to this for
+    # runtime-rule, DSL debugging, inspect, status, and config dump. Set to
+    # null (or remove) if the deployed OAP version predates 10.5 — Horizon
+    # admin features will be unavailable in that case.
+    admin: 17128
     # zipkinreceiver: 9411
     # zipkinquery: 9412
   replicas: 2
@@ -133,11 +138,22 @@ oap:
 #      path: /usr/share/elasticsearch/config/certs
 
 ui:
+  # Set to false to skip the UI deployment entirely — no Deployment, Service,
+  # Ingress, ConfigMap, or PVC will be created. Useful when an external UI
+  # talks to OAP directly, or when only the OAP backend is wanted.
+  enabled: true
   name: ui
+  # Horizon UI's BFF holds the active session table in memory; a multi-replica
+  # deployment without sticky routing breaks logins on every other request.
+  # Keep replicas: 1 unless your ingress provides sticky sessions.
   replicas: 1
   image:
+    # Horizon UI release images ship to Docker Hub `apache/skywalking-ui`
+    # tagged `horizon-<x.y.z>` (e.g. `horizon-1.0.0`). Dev / pre-release
+    # images live at `ghcr.io/apache/skywalking-horizon-ui` and are tagged
+    # by SHA / `vX.Y.Z` / `main`.
     repository: skywalking.docker.scarf.sh/apache/skywalking-ui
-    tag: null # Must be set explicitly
+    tag: null # Must be set explicitly, e.g. horizon-1.0.0
     pullPolicy: IfNotPresent
   # podAnnotations:
   #   example: oap-foo
@@ -160,7 +176,8 @@ ui:
     type: ClusterIP
     # clusterIP: None
     externalPort: 80
-    internalPort: 8080
+    # Horizon UI's BFF binds 8081 by default.
+    internalPort: 8081
     ## nodePort is the port on each node on which this service is exposed when 
type=NodePort
     ## Default: auto-allocated port if not specified. 30080 is just an example
     ##
@@ -180,11 +197,102 @@ ui:
     annotations: {}
     ## Limit load balancer source ips to list of CIDRs (where available)
     # loadBalancerSourceRanges: []
-  securityContext: {}
-  # runAsUser: 1000
-  # runAsGroup: 1000
-  # fsGroup: 1000
-  env:
+  # The image runs as a non-root alpine system user `horizon`. PVCs mounted
+  # at /data and (optionally) /app/bundled_templates must be group-writable
+  # by that user; fsGroup defaults to 101 (alpine's typical `nobody` GID).
+  securityContext:
+    fsGroup: 101
+  # Persistent state directory used by the BFF for audit log, setup state,
+  # alarm state, and wire debug log. Without persistence these files land in
+  # the container's writable layer and are lost on pod restart.
+  persistence:
+    enabled: false
+    # existingClaim: ""
+    # storageClass: ""
+    accessModes:
+      - ReadWriteOnce
+    size: 1Gi
+    annotations: {}
+  resources: {}
+  livenessProbe:
+    tcpSocket:
+      port: 8081
+    initialDelaySeconds: 30
+    periodSeconds: 20
+  readinessProbe:
+    httpGet:
+      path: /api/oap/info
+      port: 8081
+    initialDelaySeconds: 10
+    periodSeconds: 10
+    failureThreshold: 6
+  # `config` is rendered verbatim into the `horizon.yaml` ConfigMap mounted
+  # at /app/horizon.yaml. Schema and field reference:
+  # 
https://github.com/apache/skywalking-horizon-ui/blob/main/docs/setup/horizon-yaml.md
+  # See also /app/horizon.example.yaml inside the image for the upstream
+  # commented example.
+  #
+  # Chart-managed defaults wire `oap.queryUrl` / `oap.adminUrl` to the
+  # in-cluster OAP service. Anything you set here merges over the defaults
+  # via Helm's mergeOverwrite semantics.
+  #
+  # ⚠ Default credentials below — admin/admin and skywalking/skywalking —
+  # make first-run / demo deployments work out of the box, but they are
+  # publicly known. ROTATE THEM BEFORE EXPOSING THE UI BEYOND A TRUSTED
+  # NETWORK. Generate a replacement hash by checking out
+  # apache/skywalking-horizon-ui and running `pnpm --filter bff cli:hash`,
+  # or wire production credentials through a Secret via
+  # `ui.envFromSecret` + `${VAR}` interpolation (see values-my-es.yaml).
+  config:
+    server:
+      host: 0.0.0.0
+      port: 8081
+    oap:
+      # queryUrl / adminUrl default to the in-cluster OAP service when unset.
+      # Override here if you point the UI at an external OAP cluster.
+      # queryUrl: http://skywalking-oap:12800
+      # adminUrl: http://skywalking-oap:17128
+      timeoutMs: 15000
+      # auth:
+      #   username: skywalking
+      #   password: "${HORIZON_OAP_PW}"
+    auth:
+      backend: local
+      local:
+        # Default users — change before production. The argon2id hashes
+        # below decode to the indicated plaintext password.
+        users:
+          - username: admin            # password: admin → full admin
+            passwordHash: 
"$argon2id$v=19$m=65536,t=3,p=4$eemqy1r72oSXR58y8VpRqw$Bn/dULrmJTHEi3263KfgWDEwQmUsqNLi3xwyv/DekHM"
+            roles: [admin]
+          - username: skywalking       # password: skywalking → read data + 
platform health
+            passwordHash: 
"$argon2id$v=19$m=65536,t=3,p=4$Zqj8HhQDqm8d5c2MipHYZw$BsaCnu4bdd4uadIldx3wwYLsdo47Thxb7Lv1MXpWG2Q"
+            roles: [viewer, maintainer]
+    rbac:
+      enabled: true
+    session:
+      ttlMinutes: 60
+      cookieName: horizon_sid
+      # Flip to true when serving over HTTPS (browser refuses Secure
+      # cookies over plain HTTP).
+      cookieSecure: false
+  # Optional: pass extra env vars into the BFF container. Use this to
+  # provide values referenced by `${VAR}` interpolation in `config`
+  # (e.g. admin password hash, OAP basic-auth password) without baking
+  # them into the ConfigMap.
+  # extraEnv:
+  #   - name: HORIZON_ADMIN_HASH
+  #     valueFrom:
+  #       secretKeyRef:
+  #         name: horizon-admin
+  #         key: passwordHash
+  extraEnv: []
+  # Optional: reference a pre-created Secret whose keys are exposed as env
+  # vars in the BFF container (shortcut for the common ConfigMap+Secret
+  # pattern). The Secret must define keys referenced in `config` via
+  # ${VAR} interpolation.
+  # envFromSecret: horizon-secrets
+  envFromSecret: ""
 
 
 oapInit:
diff --git a/test/e2e/e2e-banyandb-cluster.yaml 
b/test/e2e/e2e-banyandb-cluster.yaml
index df21347..d21c050 100644
--- a/test/e2e/e2e-banyandb-cluster.yaml
+++ b/test/e2e/e2e-banyandb-cluster.yaml
@@ -22,8 +22,8 @@ setup:
   kind:
     expose-ports:
       - namespace: istio-system
-        resource: service/skywalking-ui
-        port: 80
+        resource: service/skywalking-oap
+        port: 12800
   steps:
     - name: install yq
       command: bash test/e2e/setup-e2e-shell/install.sh yq
@@ -75,6 +75,9 @@ setup:
         - namespace: istio-system
           resource: deployments/skywalking-satellite
           for: condition=available
+        - namespace: istio-system
+          resource: deployments/skywalking-ui
+          for: condition=available
     - name: Deploy demo services
       command: |
         kubectl apply -f 
https://raw.githubusercontent.com/istio/istio/$ISTIO_VERSION/samples/bookinfo/platform/kube/bookinfo.yaml
@@ -102,138 +105,138 @@ verify:
     interval: 10s
   cases:
     # service list
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 service ls
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 service ls
       expected: expected/service.yml
     # service instance list
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage
       expected: expected/service-instance.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews
       expected: expected/service-instance.yml
     # service endpoint
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 endpoint list --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 endpoint list --service-name=e2e::productpage
       expected: expected/service-endpoint-productpage.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 endpoint list --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 endpoint list --service-name=e2e::reviews
       expected: expected/service-endpoint-reviews.yml
 
     # service metrics: e2e::productpage
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sla --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sla --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
     # service metrics: e2e::reviews
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sla --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sla --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
     # service instance metrics: e2e::productpage
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::productpage --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::productpage --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::productpage 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::productpage 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::productpage 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::productpage 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     # service instance metrics: e2e::reviews
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::reviews --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::reviews --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::reviews 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::reviews 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::reviews 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::reviews 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
 
     # service endpoint metrics: e2e::productpage GET:/productpage
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
     # service endpoint metrics: e2e::reviews GET:/reviews/0
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sidecar_internal_req_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sidecar_internal_req_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sidecar_internal_resp_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sidecar_internal_resp_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
 
     # dependency service
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 dependency service --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 dependency service --service-name=e2e::productpage
       expected: expected/dependency-services-productpage.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 dependency service --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 dependency service --service-name=e2e::reviews
       expected: expected/dependency-services-reviews.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 dependency instance --service-name=e2e::productpage 
--dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 dependency instance --service-name=e2e::productpage 
--dest-service-name=e2e::reviews
       expected: expected/dependency-services-instance-productpage.yml
 
     # service relation metrics
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_relation_client_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_relation_client_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_relation_server_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_relation_server_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_client_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_client_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_server_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_server_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_client_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_client_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_server_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_server_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
     # service instance relation metrics, e2e::productpage -> e2e::reviews
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_relation_client_cpm \
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_relation_client_cpm \
           --service-name=e2e::productpage --instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
           --dest-service-name=e2e::reviews --dest-instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
 
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_relation_server_cpm \
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_relation_server_cpm \
           --service-name=e2e::productpage --instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
           --dest-service-name=e2e::reviews --dest-instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
 
       expected: expected/metrics-has-value.yml 
diff --git a/test/e2e/e2e-banyandb-standalone.yaml 
b/test/e2e/e2e-banyandb-standalone.yaml
index 244cb66..adf2e03 100644
--- a/test/e2e/e2e-banyandb-standalone.yaml
+++ b/test/e2e/e2e-banyandb-standalone.yaml
@@ -22,8 +22,8 @@ setup:
   kind:
     expose-ports:
       - namespace: istio-system
-        resource: service/skywalking-ui
-        port: 80
+        resource: service/skywalking-oap
+        port: 12800
   steps:
     - name: install yq
       command: bash test/e2e/setup-e2e-shell/install.sh yq
@@ -72,6 +72,9 @@ setup:
         - namespace: istio-system
           resource: deployments/skywalking-satellite
           for: condition=available
+        - namespace: istio-system
+          resource: deployments/skywalking-ui
+          for: condition=available
     - name: Deploy demo services
       command: |
         kubectl apply -f 
https://raw.githubusercontent.com/istio/istio/$ISTIO_VERSION/samples/bookinfo/platform/kube/bookinfo.yaml
@@ -99,138 +102,138 @@ verify:
     interval: 10s
   cases:
     # service list
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 service ls
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 service ls
       expected: expected/service.yml
     # service instance list
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage
       expected: expected/service-instance.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews
       expected: expected/service-instance.yml
     # service endpoint
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 endpoint list --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 endpoint list --service-name=e2e::productpage
       expected: expected/service-endpoint-productpage.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 endpoint list --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 endpoint list --service-name=e2e::reviews
       expected: expected/service-endpoint-reviews.yml
 
     # service metrics: e2e::productpage
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sla --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sla --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
     # service metrics: e2e::reviews
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sla --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sla --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
     # service instance metrics: e2e::productpage
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::productpage --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::productpage --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::productpage 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::productpage 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::productpage 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::productpage 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     # service instance metrics: e2e::reviews
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::reviews --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::reviews --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::reviews 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::reviews 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::reviews 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::reviews 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
 
     # service endpoint metrics: e2e::productpage GET:/productpage
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
     # service endpoint metrics: e2e::reviews GET:/reviews/0
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sidecar_internal_req_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sidecar_internal_req_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sidecar_internal_resp_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sidecar_internal_resp_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
 
     # dependency service
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 dependency service --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 dependency service --service-name=e2e::productpage
       expected: expected/dependency-services-productpage.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 dependency service --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 dependency service --service-name=e2e::reviews
       expected: expected/dependency-services-reviews.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 dependency instance --service-name=e2e::productpage 
--dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 dependency instance --service-name=e2e::productpage 
--dest-service-name=e2e::reviews
       expected: expected/dependency-services-instance-productpage.yml
 
     # service relation metrics
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_relation_client_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_relation_client_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_relation_server_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_relation_server_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_client_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_client_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_server_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_server_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_client_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_client_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_server_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_server_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
     # service instance relation metrics, e2e::productpage -> e2e::reviews
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_relation_client_cpm \
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_relation_client_cpm \
           --service-name=e2e::productpage --instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
           --dest-service-name=e2e::reviews --dest-instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
 
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_relation_server_cpm \
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_relation_server_cpm \
           --service-name=e2e::productpage --instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
           --dest-service-name=e2e::reviews --dest-instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
 
       expected: expected/metrics-has-value.yml 
diff --git a/test/e2e/e2e-elasticsearch.yaml b/test/e2e/e2e-elasticsearch.yaml
index 4afe7e7..54133e7 100644
--- a/test/e2e/e2e-elasticsearch.yaml
+++ b/test/e2e/e2e-elasticsearch.yaml
@@ -22,8 +22,8 @@ setup:
   kind:
     expose-ports:
       - namespace: istio-system
-        resource: service/skywalking-ui
-        port: 80
+        resource: service/skywalking-oap
+        port: 12800
   steps:
     - name: install yq
       command: bash test/e2e/setup-e2e-shell/install.sh yq
@@ -71,6 +71,9 @@ setup:
         - namespace: istio-system
           resource: deployments/skywalking-satellite
           for: condition=available
+        - namespace: istio-system
+          resource: deployments/skywalking-ui
+          for: condition=available
     - name: Deploy demo services
       command: |
         kubectl apply -f 
https://raw.githubusercontent.com/istio/istio/$ISTIO_VERSION/samples/bookinfo/platform/kube/bookinfo.yaml
@@ -98,138 +101,138 @@ verify:
     interval: 10s
   cases:
     # service list
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 service ls
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 service ls
       expected: expected/service.yml
     # service instance list
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage
       expected: expected/service-instance.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews
       expected: expected/service-instance.yml
     # service endpoint
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 endpoint list --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 endpoint list --service-name=e2e::productpage
       expected: expected/service-endpoint-productpage.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 endpoint list --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 endpoint list --service-name=e2e::reviews
       expected: expected/service-endpoint-reviews.yml
 
     # service metrics: e2e::productpage
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sla --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sla --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
     # service metrics: e2e::reviews
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sla --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sla --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_cpm --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_resp_time --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_apdex --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
     # service instance metrics: e2e::productpage
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::productpage --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::productpage --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::productpage 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::productpage 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::productpage 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::productpage 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     # service instance metrics: e2e::reviews
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::reviews --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_resp_time 
--service-name=e2e::reviews --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::reviews 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_cpm --service-name=e2e::reviews 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::reviews 
--instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sla --service-name=e2e::reviews 
--instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sidecar_internal_req_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
-          swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_sidecar_internal_resp_latency_nanos 
--service-name=e2e::reviews --instance-name=$( \
+          swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' -
         )
       expected: expected/metrics-has-value.yml
 
     # service endpoint metrics: e2e::productpage GET:/productpage
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/productpage 
--service-name=e2e::productpage
       expected: expected/metrics-has-value.yml
     # service endpoint metrics: e2e::reviews GET:/reviews/0
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_cpm --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_resp_time --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sla --endpoint-name=GET:/reviews/0 
--service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sidecar_internal_req_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sidecar_internal_req_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=endpoint_sidecar_internal_resp_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=endpoint_sidecar_internal_resp_latency_nanos 
--endpoint-name=GET:/reviews/0 --service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
 
     # dependency service
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 dependency service --service-name=e2e::productpage
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 dependency service --service-name=e2e::productpage
       expected: expected/dependency-services-productpage.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 dependency service --service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 dependency service --service-name=e2e::reviews
       expected: expected/dependency-services-reviews.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 dependency instance --service-name=e2e::productpage 
--dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 dependency instance --service-name=e2e::productpage 
--dest-service-name=e2e::reviews
       expected: expected/dependency-services-instance-productpage.yml
 
     # service relation metrics
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_relation_client_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_relation_client_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_relation_server_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_relation_server_cpm  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_client_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_client_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_server_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_server_sidecar_internal_req_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_client_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_client_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
-    - query: swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_server_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
+    - query: swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_server_sidecar_internal_resp_latency_nanos  
--service-name=e2e::productpage --dest-service-name=e2e::reviews
       expected: expected/metrics-has-value.yml
     # service instance relation metrics, e2e::productpage -> e2e::reviews
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_relation_client_cpm \
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_relation_client_cpm \
           --service-name=e2e::productpage --instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
           --dest-service-name=e2e::reviews --dest-instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
 
       expected: expected/metrics-has-value.yml
     - query: |
-        swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 metrics exec --expression=service_instance_relation_server_cpm \
+        swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 metrics exec --expression=service_instance_relation_server_cpm \
           --service-name=e2e::productpage --instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::productpage | yq e '.[0].name' - ) \
           --dest-service-name=e2e::reviews --dest-instance-name=$( \
-            swctl --display yaml 
--base-url=http://${service_skywalking_ui_host}:${service_skywalking_ui_80}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
+            swctl --display yaml 
--base-url=http://${service_skywalking_oap_host}:${service_skywalking_oap_12800}/graphql
 instance list --service-name=e2e::reviews | yq e '.[0].name' - ) \
 
       expected: expected/metrics-has-value.yml 
diff --git a/test/e2e/env b/test/e2e/env
index fc6284d..1b0f788 100644
--- a/test/e2e/env
+++ b/test/e2e/env
@@ -15,8 +15,11 @@
 
 OAP_TAG=a0cec0ca237792497d2da0b65757d11f58c3f342
 OAP_REPO=ghcr.io/apache/skywalking/oap
-UI_TAG=a0cec0ca237792497d2da0b65757d11f58c3f342
-UI_REPO=ghcr.io/apache/skywalking/ui
+# Horizon UI dev images are published to GHCR by the 
apache/skywalking-horizon-ui
+# repo (tags: full commit SHA, vX.Y.Z, main). Release images live on Docker Hub
+# at apache/skywalking-ui:horizon-x.y.z. For CI we pull from GHCR by SHA / 
main.
+UI_TAG=main
+UI_REPO=ghcr.io/apache/skywalking-horizon-ui
 SATELLITE_TAG=v35bfaff6352b4dc351a706772796a1f79b651c14
 SATELLITE_REPO=ghcr.io/apache/skywalking-satellite/skywalking-satellite
 BANYANDB_TAG=5dedaa1aa5106dd87ad9d6c5f08c63deefee5579
diff --git a/test/e2e/values.yaml b/test/e2e/values.yaml
index ebbd206..9b3a9b4 100644
--- a/test/e2e/values.yaml
+++ b/test/e2e/values.yaml
@@ -18,6 +18,24 @@ oap:
     metadata-service-mapping.yaml: |
       serviceName: e2e::${LABELS."service.istio.io/canonical-name"}
       serviceInstanceName: ${NAME}
+
+# E2E runs with the chart's shipped defaults — admin/admin and
+# skywalking/skywalking — so a developer port-forwarding into a kind cluster
+# can log in interactively while reproducing a CI failure. These are the
+# same hashes that ship in chart/skywalking/values.yaml; we re-state them
+# here so the test overlay is explicit about what the credentials are.
+ui:
+  config:
+    auth:
+      backend: local
+      local:
+        users:
+          - username: admin            # password: admin
+            passwordHash: 
"$argon2id$v=19$m=65536,t=3,p=4$eemqy1r72oSXR58y8VpRqw$Bn/dULrmJTHEi3263KfgWDEwQmUsqNLi3xwyv/DekHM"
+            roles: [admin]
+          - username: skywalking       # password: skywalking
+            passwordHash: 
"$argon2id$v=19$m=65536,t=3,p=4$Zqj8HhQDqm8d5c2MipHYZw$BsaCnu4bdd4uadIldx3wwYLsdo47Thxb7Lv1MXpWG2Q"
+            roles: [viewer, maintainer]
 elasticsearch:
   nodeSets:
   - name: default

Reply via email to