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

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


The following commit(s) were added to refs/heads/master by this push:
     new da0e267  Replace booster-ui with Horizon UI (#187)
da0e267 is described below

commit da0e267f877b9b8e5f7728ae4ea7dc7723a2a073
Author: 吴晟 Wu Sheng <[email protected]>
AuthorDate: Tue May 19 10:51:04 2026 +0800

    Replace booster-ui with Horizon UI (#187)
---
 README.md                                       | 101 +++++++++++++++++++-
 chart/operator/templates/crds.yaml              |  35 ++++++-
 chart/skywalking/README.md                      |  24 +++--
 chart/skywalking/templates/NOTES.txt            |  22 +++++
 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.yaml                    | 118 ++++++++++++++++++++++--
 test/e2e/e2e-banyandb-cluster.yaml              | 115 ++++++++++++-----------
 test/e2e/e2e-banyandb-standalone.yaml           | 115 ++++++++++++-----------
 test/e2e/e2e-elasticsearch.yaml                 | 115 ++++++++++++-----------
 test/e2e/env                                    |  14 ++-
 test/e2e/swck/oap-agent-adapter-hpa.yaml        |   4 +-
 test/e2e/swck/oap-agent-banyandb.yaml           |   4 +-
 test/e2e/swck/oap-ui-agent-elasticsearch.yaml   |   4 +-
 test/e2e/swck/oap-ui-agent-oapserverconfig.yaml |   4 +-
 test/e2e/swck/oap-ui-agent-satellite.yaml       |   4 +-
 test/e2e/values.yaml                            |  18 ++++
 20 files changed, 644 insertions(+), 208 deletions(-)

diff --git a/README.md b/README.md
index ea4e4f3..7f051e8 100644
--- a/README.md
+++ b/README.md
@@ -19,12 +19,103 @@ 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**. There is no built-in `admin/admin` 
fallback — `ui.config.auth.local.users` ships **empty**, and the BFF refuses to 
start until you provide at least one user.
+- The full `horizon.yaml` schema (server, oap, auth, rbac, session, audit, 
debugLog) is owned upstream:
+  - Canonical commented example: 
[horizon.example.yaml](https://github.com/apache/skywalking-horizon-ui/blob/main/horizon.example.yaml)
 (also shipped inside the image at `/app/horizon.example.yaml`)
+  - Per-section reference: 
[docs/setup/horizon-yaml.md](https://github.com/apache/skywalking-horizon-ui/blob/main/docs/setup/horizon-yaml.md)
+
+  Anything you set under `ui.config:` in your Helm values is rendered verbatim 
into `horizon.yaml`, so the upstream docs apply 1:1.
+- 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`).
+
+### Quick demo install (publicly-known credentials)
+
+For a first-run / trusted-network demo, paste the snippet below into a values 
file. It seeds two users — **`admin/admin`** (admin role) and 
**`skywalking/skywalking`** (viewer + maintainer) — using `argon2id` hashes of 
those plaintext passwords.
+
+> ⚠ The hashes below are publicly known in this repo. Use only on trusted 
networks; rotate before exposing the UI externally.
+
+```yaml
+# demo-values.yaml
+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]
+```
+
+```shell
+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=<release> \
+  --set oap.storageType=elasticsearch \
+  --set ui.image.tag=horizon-<release> \
+  -f demo-values.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
+```
+
+### 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=<release> \
+  --set oap.storageType=elasticsearch \
+  --set ui.image.tag=horizon-<release> \
+  -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 +135,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 +147,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 +226,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 +270,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/operator/templates/crds.yaml 
b/chart/operator/templates/crds.yaml
index 7c613f1..8431b64 100644
--- a/chart/operator/templates/crds.yaml
+++ b/chart/operator/templates/crds.yaml
@@ -3424,7 +3424,7 @@ kind: CustomResourceDefinition
 metadata:
   annotations:
     cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ include 
"operator.fullname" . }}-serving-cert
-    controller-gen.kubebuilder.io/version: v0.14.0
+    controller-gen.kubebuilder.io/version: v0.19.0
   name: uis.operator.skywalking.apache.org
 spec:
   conversion:
@@ -3501,7 +3501,26 @@ spec:
             description: UISpec defines the desired state of UI
             properties:
               OAPServerAddress:
-                description: Backend OAP server address
+                description: |-
+                  Backend OAP server address.
+                  For kind=booster, exported as the SW_OAP_ADDRESS env var.
+                  For kind=horizon, used as oap.queryUrl in the generated 
horizon.yaml.
+                type: string
+              OAPServerAdminAddress:
+                description: |-
+                  OAPServerAdminAddress is the OAP admin host (port 17128 by 
default; runtime-rule,
+                  dsl-debug, inspect, status). Only used when kind=horizon. If 
unset, defaults to
+                  http://<name>-oap.<namespace>:17128.
+                type: string
+              OAPServerZipkinAddress:
+                description: |-
+                  OAPServerZipkinAddress is the OAP Zipkin REST host. Only 
used when kind=horizon.
+                  If unset, defaults to <OAPServerAddress>/zipkin.
+                type: string
+              config:
+                description: |-
+                  Config is a raw horizon.yaml that, when set, fully replaces 
the operator-generated
+                  config mounted into the Horizon UI container. Only used when 
kind=horizon.
                 type: string
               image:
                 description: Image is the UI Docker image to deploy.
@@ -3510,6 +3529,16 @@ spec:
                 description: Count is the number of UI pods
                 format: int32
                 type: integer
+              kind:
+                default: horizon
+                description: |-
+                  Kind selects which SkyWalking web UI to deploy.
+                  "horizon" deploys the next-generation Horizon UI (default).
+                  "booster" deploys the legacy Booster UI image.
+                enum:
+                - horizon
+                - booster
+                type: string
               service:
                 description: Service relevant settings
                 properties:
@@ -3677,4 +3706,4 @@ spec:
     storage: true
     subresources:
       status: {}
-{{- end }}
\ No newline at end of file
+{{- end }}
diff --git a/chart/skywalking/README.md b/chart/skywalking/README.md
index 418b05c..f2b8996 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 the auth backend is healthy. `/api/auth/health` is the only 
unauthenticated BFF health endpoint                                             
                                                                                
                                              | `httpGet.path: 
/api/auth/health, 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 upstream 
[`horizon.example.yaml`](https://github.com/apache/skywalking-horizon-ui/blob/main/horizon.example.yaml)
 and [horizon.yaml 
reference](https://github.com/apache/skywalking-horizon-ui/blob/main/docs/setup/horizon-yaml.md).
 `auth.local.users` defaults to empty (BFF refuses to start); see the root 
README "Web UI" sect [...]
+| `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..8d02cad 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,20 @@ 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. Its BFF refuses to start when
+no users are configured — there is no built-in "admin/admin" fallback.
+
+If your `ui.config.auth.local.users` list is empty, the UI pod will
+CrashLoopBackOff. See the README "Web UI" section for:
+
+  - a copy-pastable demo snippet (publicly-known admin/admin hash)
+  - the production Secret + ${VAR} interpolation pattern
+
+Full horizon.yaml config reference and upstream example:
+  
https://github.com/apache/skywalking-horizon-ui/blob/main/docs/setup/horizon-yaml.md
+  
https://github.com/apache/skywalking-horizon-ui/blob/main/horizon.example.yaml
+  (also shipped inside the image at /app/horizon.example.yaml)
+{{- 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.yaml b/chart/skywalking/values.yaml
index f633102..f51d059 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,98 @@ 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:
+    # /api/auth/health is the only unauthenticated BFF health endpoint —
+    # /api/oap/info is gated behind a logged-in session and returns 401
+    # to an unauthenticated kubelet probe.
+    httpGet:
+      path: /api/auth/health
+      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.
+  #
+  # `auth.local.users` is intentionally empty by default — Horizon's BFF
+  # refuses to start without it, which is the upstream's "no default
+  # admin/admin" stance. See the README "Web UI" section for two paths:
+  # a copy-pastable demo snippet (publicly-known admin/admin hash) or the
+  # production Secret + `${VAR}` interpolation pattern.
+  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:
+        users: []
+        # - username: admin
+        #   passwordHash: "${HORIZON_ADMIN_HASH}"
+        #   roles: [admin]
+    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..a9097f4 100644
--- a/test/e2e/env
+++ b/test/e2e/env
@@ -15,8 +15,18 @@
 
 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. CI pins to a SHA so re-runs are
+# reproducible — bump this when a new horizon-ui feature/fix needs CI coverage.
+UI_TAG=80565f563b6ea47c274141029d8ef6bd33b7eeac
+UI_REPO=ghcr.io/apache/skywalking-horizon-ui
+# SWCK operator dev image — published by apache/skywalking-swck's
+# publish-docker.yml on every master push. Bump SWCK_OPERATOR_TAG when
+# the SWCK PR with Horizon UI support gets merged & released; the chart's
+# own default (apache/skywalking-swck:v0.9.0) stays unchanged for users.
+SWCK_OPERATOR_REPO=ghcr.io/apache/skywalking-swck/operator
+SWCK_OPERATOR_TAG=d299bc05ee230f5f366584054db5b099ca60166f
 SATELLITE_TAG=v35bfaff6352b4dc351a706772796a1f79b651c14
 SATELLITE_REPO=ghcr.io/apache/skywalking-satellite/skywalking-satellite
 BANYANDB_TAG=5dedaa1aa5106dd87ad9d6c5f08c63deefee5579
diff --git a/test/e2e/swck/oap-agent-adapter-hpa.yaml 
b/test/e2e/swck/oap-agent-adapter-hpa.yaml
index 99c49dc..96ac3a4 100644
--- a/test/e2e/swck/oap-agent-adapter-hpa.yaml
+++ b/test/e2e/swck/oap-agent-adapter-hpa.yaml
@@ -58,7 +58,9 @@ setup:
         helm dep up chart/operator
         helm install operator chart/operator 
--namespace=skywalking-swck-system \
                        --create-namespace \
-                       --set fullnameOverride=skywalking-swck
+                       --set fullnameOverride=skywalking-swck \
+                       --set image.repository=$SWCK_OPERATOR_REPO \
+                       --set image.tag=$SWCK_OPERATOR_TAG
       wait:
         - namespace: skywalking-swck-system
           resource: deployment/skywalking-swck-operator
diff --git a/test/e2e/swck/oap-agent-banyandb.yaml 
b/test/e2e/swck/oap-agent-banyandb.yaml
index fe02c6d..364b349 100644
--- a/test/e2e/swck/oap-agent-banyandb.yaml
+++ b/test/e2e/swck/oap-agent-banyandb.yaml
@@ -46,7 +46,9 @@ setup:
         helm dep up chart/operator
         helm install operator chart/operator 
--namespace=skywalking-swck-system \
                        --create-namespace \
-                       --set fullnameOverride=skywalking-swck
+                       --set fullnameOverride=skywalking-swck \
+                       --set image.repository=$SWCK_OPERATOR_REPO \
+                       --set image.tag=$SWCK_OPERATOR_TAG
       wait:
         - namespace: skywalking-swck-system
           resource: deployment/skywalking-swck-operator
diff --git a/test/e2e/swck/oap-ui-agent-elasticsearch.yaml 
b/test/e2e/swck/oap-ui-agent-elasticsearch.yaml
index 81f4b60..994f441 100644
--- a/test/e2e/swck/oap-ui-agent-elasticsearch.yaml
+++ b/test/e2e/swck/oap-ui-agent-elasticsearch.yaml
@@ -46,7 +46,9 @@ setup:
         helm dep up chart/operator
         helm install operator chart/operator 
--namespace=skywalking-swck-system \
                        --create-namespace \
-                       --set fullnameOverride=skywalking-swck
+                       --set fullnameOverride=skywalking-swck \
+                       --set image.repository=$SWCK_OPERATOR_REPO \
+                       --set image.tag=$SWCK_OPERATOR_TAG
       wait:
         - namespace: skywalking-swck-system
           resource: deployment/skywalking-swck-operator
diff --git a/test/e2e/swck/oap-ui-agent-oapserverconfig.yaml 
b/test/e2e/swck/oap-ui-agent-oapserverconfig.yaml
index fb54bc4..46c7bc6 100644
--- a/test/e2e/swck/oap-ui-agent-oapserverconfig.yaml
+++ b/test/e2e/swck/oap-ui-agent-oapserverconfig.yaml
@@ -49,7 +49,9 @@ setup:
         helm dep up chart/operator
         helm install operator chart/operator 
--namespace=skywalking-swck-system \
                        --create-namespace \
-                       --set fullnameOverride=skywalking-swck
+                       --set fullnameOverride=skywalking-swck \
+                       --set image.repository=$SWCK_OPERATOR_REPO \
+                       --set image.tag=$SWCK_OPERATOR_TAG
       wait:
         - namespace: skywalking-swck-system
           resource: deployment/skywalking-swck-operator
diff --git a/test/e2e/swck/oap-ui-agent-satellite.yaml 
b/test/e2e/swck/oap-ui-agent-satellite.yaml
index 7653ddc..c2822cb 100644
--- a/test/e2e/swck/oap-ui-agent-satellite.yaml
+++ b/test/e2e/swck/oap-ui-agent-satellite.yaml
@@ -46,7 +46,9 @@ setup:
         helm dep up chart/operator
         helm install operator chart/operator 
--namespace=skywalking-swck-system \
                        --create-namespace \
-                       --set fullnameOverride=skywalking-swck
+                       --set fullnameOverride=skywalking-swck \
+                       --set image.repository=$SWCK_OPERATOR_REPO \
+                       --set image.tag=$SWCK_OPERATOR_TAG
       wait:
         - namespace: skywalking-swck-system
           resource: deployment/skywalking-swck-operator
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