webhook config
diff --git a/test/control-plane/cp.yaml b/test/control-plane/cp.yaml
new file mode 100644
index 0000000..f8f113c
--- /dev/null
+++ b/test/control-plane/cp.yaml
@@ -0,0 +1,182 @@
+# 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.
+
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: dubbo-system
+  labels:
+    dubbo.io/system-namespace: "true"
+
+---
+apiVersion: v1
+kind: Secret
+type: kubernetes.io/tls
+metadata:
+  name: dubbo-tls-cert
+  namespace: dubbo-system
+  labels:
+    app: dubbo-control-plane
+    app.kubernetes.io/name: dubbo
+    app.kubernetes.io/instance: dubbo
+data:
+  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURhakNDQWxLZ0F3SUJBZ0lRYkRDREFhT29MVzlna0hvR2Nhb3VZVEFOQmdrcWhraUc5dzBCQVFzRkFEQVMKTVJBd0RnWURWUVFERXdkcmRXMWhMV05oTUI0WERUSTBNRE15TkRBM01qa3hNbG9YRFRNME1ETXlNakEzTWpreApNbG93SFRFYk1Ca0dBMVVFQXhNU2EzVnRZUzFqYjI1MGNtOXNMWEJzWVc1bE1JSUJJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTVCM0dzNjNSTEIrdnMycUlEM2N0N0t1dHZJYk5wWG5TOFhCVGhub1MKVkdoZlpiY0IzeXhGb0F2T1VqbHVSVkxyb3NiOGlDY1pmWGQ0eXFtRlVMNEFiZ1hHenUvRFMzcHdJZnZYTm50QwpaaFNWMDB3WTJvTWRMVXBHdERJOXRPVG1SQ3hqdlhnUWRHT0k1WHpiNi9JaStReDNjd0FxRDhNYnBZZUUzOVQ2CnQwZTJiWFRIUUE3SHdOQjNBV3dvMm1WQndZam9OY29YN1djUFdFeFM5TVM1cmxKOUo0elQwNURKVlZHdk5CcGkKb1ZoMExyWHVnanZnQjNZNDBxVUJ3aHpqS1VvVGhzeElMYVM2bFh5Q3p0TEJlZEx5dDJiU05kMnNETk02RWFnUgp4VkFPSDFuR25ZbjRSZVpuM0dvdmFyRlVaSjVrSVFBb2JXeUlqSm5Kc1F2bzlRSURBUUFCbzRHd01JR3RNQTRHCkExVWREd0VCL3dRRUF3SUZvREFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQVFZSUt3WUJCUVVIQXdJd0RBWUQKVlIwVEFRSC9CQUl3QURBZkJnTlZIU01FR0RBV2dCUU1Vdk9TaWZkY0M3VUo5VXJoYWg4MU5NM24rREJOQmdOVgpIUkVFUmpCRWdoNXJkVzFoTFdOdmJuUnliMnd0Y0d4aGJtVXVhM1Z0WVMxemVYTjBaVzJDSW10MWJXRXRZMjl1CmRISnZiQzF3YkdGdVpTNXJkVzFoTFhONWMzUmxiUzV6ZG1Nd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFMYnQKYXVaaUN1bExvWWpsOUt4NjhoQjc5K0JJS0I4NktjYTVBODJ2NThyTjA4UERvdnRnSmNYSTk4SVV6VzdPNEtCQwppUjNiaEFLaWNqVjVuNnlsaFY4U3pBQTBoZkhkcXNXY3NoaWJNT2dlaUtTMnU1RUZBWDBncjQ0cVpPQ3p4WTlVCnZVRHdZeCtHamNobkhoSzhRUUlhdmFoRVFQYXJ1d2ZTYzJyNlNBTTBJN3VSbTNEWVlWcXpMeTVzcmVHWkZrbGUKRW1qM3IrcGd0eEhCbTVKdCtGb0xCK3QzajZRMmVETkhrWGpKUU1YWnNrZGs5OWxHSzdIS1JaWkoxTFYyRTJKRwo0MHZuRVQyWSszQXdldXhvMGY1WjRnSGVXUm95WFBpUEdrWWNwRTEyaGZZT2dKV3d1bHo1UUR5c2lYd0RQV3lTCll0cEVFSTVqTmR2SUxpQmZkRDg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
+  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBNUIzR3M2M1JMQit2czJxSUQzY3Q3S3V0dkliTnBYblM4WEJUaG5vU1ZHaGZaYmNCCjN5eEZvQXZPVWpsdVJWTHJvc2I4aUNjWmZYZDR5cW1GVUw0QWJnWEd6dS9EUzNwd0lmdlhObnRDWmhTVjAwd1kKMm9NZExVcEd0REk5dE9UbVJDeGp2WGdRZEdPSTVYemI2L0lpK1F4M2N3QXFEOE1icFllRTM5VDZ0MGUyYlhUSApRQTdId05CM0FXd28ybVZCd1lqb05jb1g3V2NQV0V4UzlNUzVybEo5SjR6VDA1REpWVkd2TkJwaW9WaDBMclh1CmdqdmdCM1k0MHFVQndoempLVW9UaHN4SUxhUzZsWHlDenRMQmVkTHl0MmJTTmQyc0ROTTZFYWdSeFZBT0gxbkcKblluNFJlWm4zR292YXJGVVpKNWtJUUFvYld5SWpKbkpzUXZvOVFJREFRQUJBb0lCQVFETytsVjRZcFlRT3cvbwo4eGhSTUFuelhESmZoTkRDL0M1eDgwRldHeHpXaVgxRmhTK2xsejMxWWNEcXlrRkxsVmxJY05SaGxWaURod3VLCmx4WG5sUDQrMWU3MWhJYm16VWxCRElqUlhqVjQrZVNYdTh3eE9CWVpLZlBOUEdqUTRZQXRDem5VaUVRbDFzbzMKcjNxOE13K1llYjlJRVRZWTV5Y0dvbGZsNEJFOGlaWmlTZGVMOHQ1NUEvVEszNTBwMWJoQzk4SzgyNTdqdkpFYgprK2ZYRFhWME9UdFRNdGVacU8yUjhmem1mQTdwWHJzSzhVc3JBR2VXVEVlbU5BOExTQ0pQU0RNR0hLU2FPUDFDCkp6SkMyL0QxeXBFbVdZQ3hPMitYTlh3Y1o5eUhpOVBCR2dRbUh0R3M1U280ZHBUWHltREM1N2dBRk9FSVQ4ZGoKd1NCTDBpRUJBb0dCQVBUdUVFS3ZCYkdHZXRQKzhZK2hGMm0rOEJUSUZuMkRqWSt0Z1k2dUlpQkZNejlXVHBLWApEK0YvNW9vQU9wNloyR1ZBOW1ENkdiRlVoR1VRUkQzMVJ4RkEzU3hZa2luR3BEWDFOUWNQMmhUbCtnbTM4ZmxQCnFpQzh2L3pBT2ZXblpseThUcWhXZ0k4ZWxqbk81WElIOWVFZUplN2Z2elN6ek4rblpvMHJQcnA1QW9HQkFPNXQKTENGSVdzVTlodTVuOVNPMGMrUmZHdjBEYkhkanhlcFVrSXZ6djAyOGl6ZEo5NEErZHVMM0ViM1BCdFZDeUltaQpncXRXMVVPMnJwdHdBM25icnM4RWN4ZXVSN1lWM28rOHJJT29sNnY4RFBSL1NqOXo2SWN6OHc2dFJHWFN1Z01wCnZrSCtBbEVaQm5JTXNFQVlweW1EcTQ1VUxONCsrY3NMcXlSKytNTmRBb0dBR0ErQzNXb2dIdzVjNXBKMjNHc3cKeDV5UUxScHl5eVd2TkZ3UkRCa2pGUlIzTWxPaUtGaGFvUVpWZVYwSVpTZ3J6OWFQM1hyMEp5MXNUQmxLK3VNcgpkaEJ2S2JvUnNiVG4wTDBqMW12Q09xZFU1cnVCTThLVnJkMmM1cEZqb0RRdnBCQ0RrWm5keXpGd0JJSEVuRzBYCnhHT1h5bDJFaFFMY3IyUGNlU1cwWmRFQ2dZQkQwQ2xORGhkRElrek9ZaU1IRkx3aHFDczA2MVJlWUxKYUE5TlkKK3VyZVlWSDNWOEpkWjJiSkJ4eTByNzF4eXB6ZkNLbkJzZURXY1k4WUJyUDJaTlZEYkRDUCs3SEp5RTZVODBUZAo3WVcyRk9wYVlCbnVFam1BdXZYV3B0RmRaS0lqWkN3SStRWVBxdDU2Y2NGdmVaT1I2ekZRT2dESTlZQjJqOHNOCmhrK2F3UUtCZ0JvRzE1d2JUcFE1SDI3aTVIb2xNcVRXRmVOcmJDVWVRaHFrUnZvR1M2cFBrZTgwNUpYZ3lKU3cKNDFic2ZsV3JaYk5Bd0FPMFd1ZlhUc1RnVDBZRDgzRHA5SEp0WmRIZWEyS0FoMFVxTXlUeEF4T3BrMU1CbHhSaQpSbnlKbC9kZGU2c2RBU1R4cFcrK3lpbEpTWEtHS1hHMUVDRWxLc3BvVnY3Q2hBaGRzU3lXCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
+  ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFRENDQWZpZ0F3SUJBZ0lSQUtFUngwdFRpUTlkK1Z1SXZDQkZJc1V3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQXhNSGEzVnRZUzFqWVRBZUZ3MHlOREF6TWpRd056STVNVEphRncwek5EQXpNakl3TnpJNQpNVEphTUJJeEVEQU9CZ05WQkFNVEIydDFiV0V0WTJFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFDMy96cnFjdUdMbmQ3c3EwcThNNEVSS2N6Nm1PWWpZZ3hLYUpNWXNGZ2dPS2tMLytGSXMydG0KVVcxa2tad3hkN1JRbWp6TFBqN0lGbDJVR3d6alBXM3M4L29mUE1CdUFabWVmZSttSkpYYTJvTGJ5MHhoVmRiQQpWM2JMczBiUEhWMlJXSk9aTmlxUk5LSXZQVDh6NWc3UGttOEJGanM4eVhlZ0pPT1hUUUtyeHZoWjFjVWxXTlBQCkFZbnhZbkozVjNOakdCbjlaUjhuZGZ0SnRjNkR4MU5aNlA2Sk01bEl1WlJGazM2WU1Eb0FOV3RPb1gzWXVERSsKMUpsaUFVTDRxWUZnQjYyMFBsNlNudmlOYnNPekVsTHhyOW5tbENhTjRkVS9IMkt4d2NXVjRXbUtqeDNMQUpXSgpJNExRL1RJUi8rVm8zMVk2TWZaT3lMR2VpNHdtOVpxVkFnTUJBQUdqWVRCZk1BNEdBMVVkRHdFQi93UUVBd0lDCnBEQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd0l3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVURGTHprb24zWEF1MUNmVks0V29mTlRUTjUvZ3dEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0VCQUJITVZvUFpQcVNJMkZzY01BUDh6MmkzVEg2MTE4bjVaMlc2b0pzUEVPR2tTQlRZc0lTcXVpNHp4NUxyCkFFK1R2TkM4YzdYQVI0Zk4wUmpEdmhDU1hudXlUVmZETHQ2UGEybkEzdE94aWtlbDJHNDYyMlkzaldoMCt5d1UKcit3UkwveXFxWnRjUUFCYnp5eTF2bXFpQWRvOTByVDVkYTRwVmJkSW9CNlp2VnlHRjFCcTRPc1poWllobkhUTQpuUG9RZW9aY0xYdlM5Z0lFb0lGaENkZzNhaDhNc2MwUEw5bDlzMHY5a293T1dYT2xrUno1SkJ5SG1VeXdRaEtrCkdlMVFJR1NIcFZ3OHV1UVZUMXJFbU9HRnVFVU1HeDZNRFJHSkwwUkxTMytMYTk2Y0w2WjQrejFkcVNCSlJVdUQKM0k4S29yTklkUTg1OHVGNHJjTndaOXllaUM4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
+
+---
+---
+apiVersion: admissionregistration.k8s.io/v1
+kind: MutatingWebhookConfiguration
+metadata:
+  name: dubbo-admission-mutating-webhook-configuration
+  namespace: dubbo-system
+  labels:
+    app: dubbo-control-plane
+    app.kubernetes.io/name: dubbo
+    app.kubernetes.io/instance: dubbo
+webhooks:
+  - name: mesh.defaulter.dubbo-admission.dubbo.io
+    admissionReviewVersions: ["v1"]
+    failurePolicy: Fail
+    namespaceSelector:
+      matchExpressions:
+        - key: kubernetes.io/metadata.name
+          operator: NotIn
+          values: ["kube-system"]
+    clientConfig:
+      caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFRENDQWZpZ0F3SUJBZ0lSQUtFUngwdFRpUTlkK1Z1SXZDQkZJc1V3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQXhNSGEzVnRZUzFqWVRBZUZ3MHlOREF6TWpRd056STVNVEphRncwek5EQXpNakl3TnpJNQpNVEphTUJJeEVEQU9CZ05WQkFNVEIydDFiV0V0WTJFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFDMy96cnFjdUdMbmQ3c3EwcThNNEVSS2N6Nm1PWWpZZ3hLYUpNWXNGZ2dPS2tMLytGSXMydG0KVVcxa2tad3hkN1JRbWp6TFBqN0lGbDJVR3d6alBXM3M4L29mUE1CdUFabWVmZSttSkpYYTJvTGJ5MHhoVmRiQQpWM2JMczBiUEhWMlJXSk9aTmlxUk5LSXZQVDh6NWc3UGttOEJGanM4eVhlZ0pPT1hUUUtyeHZoWjFjVWxXTlBQCkFZbnhZbkozVjNOakdCbjlaUjhuZGZ0SnRjNkR4MU5aNlA2Sk01bEl1WlJGazM2WU1Eb0FOV3RPb1gzWXVERSsKMUpsaUFVTDRxWUZnQjYyMFBsNlNudmlOYnNPekVsTHhyOW5tbENhTjRkVS9IMkt4d2NXVjRXbUtqeDNMQUpXSgpJNExRL1RJUi8rVm8zMVk2TWZaT3lMR2VpNHdtOVpxVkFnTUJBQUdqWVRCZk1BNEdBMVVkRHdFQi93UUVBd0lDCnBEQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd0l3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVURGTHprb24zWEF1MUNmVks0V29mTlRUTjUvZ3dEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0VCQUJITVZvUFpQcVNJMkZzY01BUDh6MmkzVEg2MTE4bjVaMlc2b0pzUEVPR2tTQlRZc0lTcXVpNHp4NUxyCkFFK1R2TkM4YzdYQVI0Zk4wUmpEdmhDU1hudXlUVmZETHQ2UGEybkEzdE94aWtlbDJHNDYyMlkzaldoMCt5d1UKcit3UkwveXFxWnRjUUFCYnp5eTF2bXFpQWRvOTByVDVkYTRwVmJkSW9CNlp2VnlHRjFCcTRPc1poWllobkhUTQpuUG9RZW9aY0xYdlM5Z0lFb0lGaENkZzNhaDhNc2MwUEw5bDlzMHY5a293T1dYT2xrUno1SkJ5SG1VeXdRaEtrCkdlMVFJR1NIcFZ3OHV1UVZUMXJFbU9HRnVFVU1HeDZNRFJHSkwwUkxTMytMYTk2Y0w2WjQrejFkcVNCSlJVdUQKM0k4S29yTklkUTg1OHVGNHJjTndaOXllaUM4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
+      service:
+        namespace: dubbo-system
+        name: dubbo-control-plane
+        path: /default-dubbo-io-v1alpha1-mesh
+    rules:
+      - apiGroups:
+          - dubbo.io
+        apiVersions:
+          - v1alpha1
+        operations:
+          - CREATE
+          - UPDATE
+        resources:
+          - meshes
+    sideEffects: None
+  - name: owner-reference.dubbo-admission.dubbo.io
+    admissionReviewVersions: ["v1"]
+    failurePolicy: Fail
+    namespaceSelector:
+      matchExpressions:
+        - key: kubernetes.io/metadata.name
+          operator: NotIn
+          values: ["dubbo-system"]
+    clientConfig:
+      caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFRENDQWZpZ0F3SUJBZ0lSQUtFUngwdFRpUTlkK1Z1SXZDQkZJc1V3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQXhNSGEzVnRZUzFqWVRBZUZ3MHlOREF6TWpRd056STVNVEphRncwek5EQXpNakl3TnpJNQpNVEphTUJJeEVEQU9CZ05WQkFNVEIydDFiV0V0WTJFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFDMy96cnFjdUdMbmQ3c3EwcThNNEVSS2N6Nm1PWWpZZ3hLYUpNWXNGZ2dPS2tMLytGSXMydG0KVVcxa2tad3hkN1JRbWp6TFBqN0lGbDJVR3d6alBXM3M4L29mUE1CdUFabWVmZSttSkpYYTJvTGJ5MHhoVmRiQQpWM2JMczBiUEhWMlJXSk9aTmlxUk5LSXZQVDh6NWc3UGttOEJGanM4eVhlZ0pPT1hUUUtyeHZoWjFjVWxXTlBQCkFZbnhZbkozVjNOakdCbjlaUjhuZGZ0SnRjNkR4MU5aNlA2Sk01bEl1WlJGazM2WU1Eb0FOV3RPb1gzWXVERSsKMUpsaUFVTDRxWUZnQjYyMFBsNlNudmlOYnNPekVsTHhyOW5tbENhTjRkVS9IMkt4d2NXVjRXbUtqeDNMQUpXSgpJNExRL1RJUi8rVm8zMVk2TWZaT3lMR2VpNHdtOVpxVkFnTUJBQUdqWVRCZk1BNEdBMVVkRHdFQi93UUVBd0lDCnBEQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd0l3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVURGTHprb24zWEF1MUNmVks0V29mTlRUTjUvZ3dEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0VCQUJITVZvUFpQcVNJMkZzY01BUDh6MmkzVEg2MTE4bjVaMlc2b0pzUEVPR2tTQlRZc0lTcXVpNHp4NUxyCkFFK1R2TkM4YzdYQVI0Zk4wUmpEdmhDU1hudXlUVmZETHQ2UGEybkEzdE94aWtlbDJHNDYyMlkzaldoMCt5d1UKcit3UkwveXFxWnRjUUFCYnp5eTF2bXFpQWRvOTByVDVkYTRwVmJkSW9CNlp2VnlHRjFCcTRPc1poWllobkhUTQpuUG9RZW9aY0xYdlM5Z0lFb0lGaENkZzNhaDhNc2MwUEw5bDlzMHY5a293T1dYT2xrUno1SkJ5SG1VeXdRaEtrCkdlMVFJR1NIcFZ3OHV1UVZUMXJFbU9HRnVFVU1HeDZNRFJHSkwwUkxTMytMYTk2Y0w2WjQrejFkcVNCSlJVdUQKM0k4S29yTklkUTg1OHVGNHJjTndaOXllaUM4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
+      service:
+        namespace: dubbo-system
+        name: dubbo-control-plane
+        path: /owner-reference-dubbo-io-v1alpha1
+    rules:
+      - apiGroups:
+          - dubbo.io
+        apiVersions:
+          - v1alpha1
+        operations:
+          - CREATE
+        resources:
+          - conditionroutes
+          - dynamicconfigs
+          - tagroutes
+    sideEffects: None
+
+---
+apiVersion: admissionregistration.k8s.io/v1
+kind: ValidatingWebhookConfiguration
+metadata:
+  name: dubbo-validating-webhook-configuration
+  namespace: dubbo-system
+  labels:
+    app: dubbo-control-plane
+    app.kubernetes.io/name: dubbo
+    app.kubernetes.io/instance: dubbo
+webhooks:
+  - name: validator.dubbo-admission.dubbo.io
+    admissionReviewVersions: ["v1"]
+    failurePolicy: Fail
+    namespaceSelector:
+      matchExpressions:
+        - key: kubernetes.io/metadata.name
+          operator: NotIn
+          values: ["kube-system"]
+    clientConfig:
+      caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFRENDQWZpZ0F3SUJBZ0lSQUtFUngwdFRpUTlkK1Z1SXZDQkZJc1V3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQXhNSGEzVnRZUzFqWVRBZUZ3MHlOREF6TWpRd056STVNVEphRncwek5EQXpNakl3TnpJNQpNVEphTUJJeEVEQU9CZ05WQkFNVEIydDFiV0V0WTJFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFDMy96cnFjdUdMbmQ3c3EwcThNNEVSS2N6Nm1PWWpZZ3hLYUpNWXNGZ2dPS2tMLytGSXMydG0KVVcxa2tad3hkN1JRbWp6TFBqN0lGbDJVR3d6alBXM3M4L29mUE1CdUFabWVmZSttSkpYYTJvTGJ5MHhoVmRiQQpWM2JMczBiUEhWMlJXSk9aTmlxUk5LSXZQVDh6NWc3UGttOEJGanM4eVhlZ0pPT1hUUUtyeHZoWjFjVWxXTlBQCkFZbnhZbkozVjNOakdCbjlaUjhuZGZ0SnRjNkR4MU5aNlA2Sk01bEl1WlJGazM2WU1Eb0FOV3RPb1gzWXVERSsKMUpsaUFVTDRxWUZnQjYyMFBsNlNudmlOYnNPekVsTHhyOW5tbENhTjRkVS9IMkt4d2NXVjRXbUtqeDNMQUpXSgpJNExRL1RJUi8rVm8zMVk2TWZaT3lMR2VpNHdtOVpxVkFnTUJBQUdqWVRCZk1BNEdBMVVkRHdFQi93UUVBd0lDCnBEQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd0l3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVURGTHprb24zWEF1MUNmVks0V29mTlRUTjUvZ3dEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0VCQUJITVZvUFpQcVNJMkZzY01BUDh6MmkzVEg2MTE4bjVaMlc2b0pzUEVPR2tTQlRZc0lTcXVpNHp4NUxyCkFFK1R2TkM4YzdYQVI0Zk4wUmpEdmhDU1hudXlUVmZETHQ2UGEybkEzdE94aWtlbDJHNDYyMlkzaldoMCt5d1UKcit3UkwveXFxWnRjUUFCYnp5eTF2bXFpQWRvOTByVDVkYTRwVmJkSW9CNlp2VnlHRjFCcTRPc1poWllobkhUTQpuUG9RZW9aY0xYdlM5Z0lFb0lGaENkZzNhaDhNc2MwUEw5bDlzMHY5a293T1dYT2xrUno1SkJ5SG1VeXdRaEtrCkdlMVFJR1NIcFZ3OHV1UVZUMXJFbU9HRnVFVU1HeDZNRFJHSkwwUkxTMytMYTk2Y0w2WjQrejFkcVNCSlJVdUQKM0k4S29yTklkUTg1OHVGNHJjTndaOXllaUM4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
+      service:
+        namespace: dubbo-system
+        name: dubbo-control-plane
+        path: /validate-dubbo-io-v1alpha1
+    rules:
+      - apiGroups:
+          - dubbo.io
+        apiVersions:
+          - v1alpha1
+        operations:
+          - CREATE
+          - UPDATE
+          - DELETE
+        resources:
+          - conditionroutes
+          - dataplanes
+          - dataplaneinsights
+          - datasources
+          - dynamicconfigs
+          - mappings
+          - meshes
+          - meshinsights
+          - metadata
+          - secrets
+          - servicenamemappings
+          - tagroutes
+          - zoneegresses
+          - zoneingresses
+          - zoneingressinsights
+          - zoneinsights
+          - zones
+
+    sideEffects: None
+  - name: service.validator.dubbo-admission.dubbo.io
+    admissionReviewVersions: ["v1"]
+    failurePolicy: Ignore
+    namespaceSelector:
+      matchExpressions:
+        - key: kubernetes.io/metadata.name
+          operator: NotIn
+          values: ["kube-system"]
+    clientConfig:
+      caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFRENDQWZpZ0F3SUJBZ0lSQUtFUngwdFRpUTlkK1Z1SXZDQkZJc1V3RFFZSktvWklodmNOQVFFTEJRQXcKRWpFUU1BNEdBMVVFQXhNSGEzVnRZUzFqWVRBZUZ3MHlOREF6TWpRd056STVNVEphRncwek5EQXpNakl3TnpJNQpNVEphTUJJeEVEQU9CZ05WQkFNVEIydDFiV0V0WTJFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CmdnRUtBb0lCQVFDMy96cnFjdUdMbmQ3c3EwcThNNEVSS2N6Nm1PWWpZZ3hLYUpNWXNGZ2dPS2tMLytGSXMydG0KVVcxa2tad3hkN1JRbWp6TFBqN0lGbDJVR3d6alBXM3M4L29mUE1CdUFabWVmZSttSkpYYTJvTGJ5MHhoVmRiQQpWM2JMczBiUEhWMlJXSk9aTmlxUk5LSXZQVDh6NWc3UGttOEJGanM4eVhlZ0pPT1hUUUtyeHZoWjFjVWxXTlBQCkFZbnhZbkozVjNOakdCbjlaUjhuZGZ0SnRjNkR4MU5aNlA2Sk01bEl1WlJGazM2WU1Eb0FOV3RPb1gzWXVERSsKMUpsaUFVTDRxWUZnQjYyMFBsNlNudmlOYnNPekVsTHhyOW5tbENhTjRkVS9IMkt4d2NXVjRXbUtqeDNMQUpXSgpJNExRL1RJUi8rVm8zMVk2TWZaT3lMR2VpNHdtOVpxVkFnTUJBQUdqWVRCZk1BNEdBMVVkRHdFQi93UUVBd0lDCnBEQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd0l3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVURGTHprb24zWEF1MUNmVks0V29mTlRUTjUvZ3dEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0VCQUJITVZvUFpQcVNJMkZzY01BUDh6MmkzVEg2MTE4bjVaMlc2b0pzUEVPR2tTQlRZc0lTcXVpNHp4NUxyCkFFK1R2TkM4YzdYQVI0Zk4wUmpEdmhDU1hudXlUVmZETHQ2UGEybkEzdE94aWtlbDJHNDYyMlkzaldoMCt5d1UKcit3UkwveXFxWnRjUUFCYnp5eTF2bXFpQWRvOTByVDVkYTRwVmJkSW9CNlp2VnlHRjFCcTRPc1poWllobkhUTQpuUG9RZW9aY0xYdlM5Z0lFb0lGaENkZzNhaDhNc2MwUEw5bDlzMHY5a293T1dYT2xrUno1SkJ5SG1VeXdRaEtrCkdlMVFJR1NIcFZ3OHV1UVZUMXJFbU9HRnVFVU1HeDZNRFJHSkwwUkxTMytMYTk2Y0w2WjQrejFkcVNCSlJVdUQKM0k4S29yTklkUTg1OHVGNHJjTndaOXllaUM4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
+      service:
+        namespace: dubbo-system
+        name: dubbo-control-plane
+        path: /validate-v1-service
+    rules:
+      - apiGroups:
+          - ""
+        apiVersions:
+          - v1
+        operations:
+          - CREATE
+          - UPDATE
+        resources:
+          - services
+    sideEffects: None
diff --git a/test/control-plane/dubbo.io_conditionroutes.yaml b/test/control-plane/dubbo.io_conditionroutes.yaml
new file mode 100644
index 0000000..053bce0
--- /dev/null
+++ b/test/control-plane/dubbo.io_conditionroutes.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: conditionroutes.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: ConditionRoute
+    listKind: ConditionRouteList
+    plural: conditionroutes
+    singular: conditionroute
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo ConditionRoute resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_dataplaneinsights.yaml b/test/control-plane/dubbo.io_dataplaneinsights.yaml
new file mode 100644
index 0000000..9bca9f4
--- /dev/null
+++ b/test/control-plane/dubbo.io_dataplaneinsights.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: dataplaneinsights.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: DataplaneInsight
+    listKind: DataplaneInsightList
+    plural: dataplaneinsights
+    singular: dataplaneinsight
+  scope: Namespaced
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          status:
+            description: Status is the status the dubbo resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_dataplanes.yaml b/test/control-plane/dubbo.io_dataplanes.yaml
new file mode 100644
index 0000000..17c4922
--- /dev/null
+++ b/test/control-plane/dubbo.io_dataplanes.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: dataplanes.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: Dataplane
+    listKind: DataplaneList
+    plural: dataplanes
+    singular: dataplane
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo Dataplane resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_datasources.yaml b/test/control-plane/dubbo.io_datasources.yaml
new file mode 100644
index 0000000..8d71a7d
--- /dev/null
+++ b/test/control-plane/dubbo.io_datasources.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: datasources.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: DataSource
+    listKind: DataSourceList
+    plural: datasources
+    singular: datasource
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo DataSource resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_dynamicconfigs.yaml b/test/control-plane/dubbo.io_dynamicconfigs.yaml
new file mode 100644
index 0000000..1b0847b
--- /dev/null
+++ b/test/control-plane/dubbo.io_dynamicconfigs.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: dynamicconfigs.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: DynamicConfig
+    listKind: DynamicConfigList
+    plural: dynamicconfigs
+    singular: dynamicconfig
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo DynamicConfig resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_mappings.yaml b/test/control-plane/dubbo.io_mappings.yaml
new file mode 100644
index 0000000..b2dcd43
--- /dev/null
+++ b/test/control-plane/dubbo.io_mappings.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: mappings.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: Mapping
+    listKind: MappingList
+    plural: mappings
+    singular: mapping
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo Mapping resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_meshes.yaml b/test/control-plane/dubbo.io_meshes.yaml
new file mode 100644
index 0000000..58f1aed
--- /dev/null
+++ b/test/control-plane/dubbo.io_meshes.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: meshes.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: Mesh
+    listKind: MeshList
+    plural: meshes
+    singular: mesh
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo Mesh resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_meshinsights.yaml b/test/control-plane/dubbo.io_meshinsights.yaml
new file mode 100644
index 0000000..6f7d40a
--- /dev/null
+++ b/test/control-plane/dubbo.io_meshinsights.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: meshinsights.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: MeshInsight
+    listKind: MeshInsightList
+    plural: meshinsights
+    singular: meshinsight
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo MeshInsight resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_metadata.yaml b/test/control-plane/dubbo.io_metadata.yaml
new file mode 100644
index 0000000..8ed6f08
--- /dev/null
+++ b/test/control-plane/dubbo.io_metadata.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: metadata.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: MetaData
+    listKind: MetaDataList
+    plural: metadata
+    singular: metadata
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo MetaData resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_secrets.yaml b/test/control-plane/dubbo.io_secrets.yaml
new file mode 100644
index 0000000..18e47cd
--- /dev/null
+++ b/test/control-plane/dubbo.io_secrets.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: secrets.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: Secret
+    listKind: SecretList
+    plural: secrets
+    singular: secret
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo Secret resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_servicenamemappings.yaml b/test/control-plane/dubbo.io_servicenamemappings.yaml
new file mode 100644
index 0000000..bac2250
--- /dev/null
+++ b/test/control-plane/dubbo.io_servicenamemappings.yaml
@@ -0,0 +1,59 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: servicenamemappings.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: ServiceNameMapping
+    listKind: ServiceNameMappingList
+    plural: servicenamemappings
+    singular: servicenamemapping
+  scope: Namespaced
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo ServiceNameMapping
+              resource.
+            properties:
+              applicationNames:
+                items:
+                  type: string
+                type: array
+              interfaceName:
+                type: string
+              namespace:
+                type: string
+            required:
+            - applicationNames
+            - interfaceName
+            - namespace
+            type: object
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_tagroutes.yaml b/test/control-plane/dubbo.io_tagroutes.yaml
new file mode 100644
index 0000000..20d0984
--- /dev/null
+++ b/test/control-plane/dubbo.io_tagroutes.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: tagroutes.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: TagRoute
+    listKind: TagRouteList
+    plural: tagroutes
+    singular: tagroute
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo TagRoute resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_zoneegresses.yaml b/test/control-plane/dubbo.io_zoneegresses.yaml
new file mode 100644
index 0000000..a8a62d9
--- /dev/null
+++ b/test/control-plane/dubbo.io_zoneegresses.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: zoneegresses.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: ZoneEgress
+    listKind: ZoneEgressList
+    plural: zoneegresses
+    singular: zoneegress
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo ZoneEgress resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_zoneingresses.yaml b/test/control-plane/dubbo.io_zoneingresses.yaml
new file mode 100644
index 0000000..ddadb94
--- /dev/null
+++ b/test/control-plane/dubbo.io_zoneingresses.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: zoneingresses.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: ZoneIngress
+    listKind: ZoneIngressList
+    plural: zoneingresses
+    singular: zoneingress
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo ZoneIngress resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_zoneingressinsights.yaml b/test/control-plane/dubbo.io_zoneingressinsights.yaml
new file mode 100644
index 0000000..40a1d86
--- /dev/null
+++ b/test/control-plane/dubbo.io_zoneingressinsights.yaml
@@ -0,0 +1,51 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: zoneingressinsights.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: ZoneIngressInsight
+    listKind: ZoneIngressInsightList
+    plural: zoneingressinsights
+    singular: zoneingressinsight
+  scope: Namespaced
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo ZoneIngressInsight
+              resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_zoneinsights.yaml b/test/control-plane/dubbo.io_zoneinsights.yaml
new file mode 100644
index 0000000..cbfb604
--- /dev/null
+++ b/test/control-plane/dubbo.io_zoneinsights.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: zoneinsights.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: ZoneInsight
+    listKind: ZoneInsightList
+    plural: zoneinsights
+    singular: zoneinsight
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo ZoneInsight resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/control-plane/dubbo.io_zones.yaml b/test/control-plane/dubbo.io_zones.yaml
new file mode 100644
index 0000000..23d55bb
--- /dev/null
+++ b/test/control-plane/dubbo.io_zones.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.14.0
+  name: zones.dubbo.io
+spec:
+  group: dubbo.io
+  names:
+    categories:
+    - dubbo
+    kind: Zone
+    listKind: ZoneList
+    plural: zones
+    singular: zone
+  scope: Cluster
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        properties:
+          apiVersion:
+            description: |-
+              APIVersion defines the versioned schema of this representation of an object.
+              Servers should convert recognized schemas to the latest internal value, and
+              may reject unrecognized values.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+            type: string
+          kind:
+            description: |-
+              Kind is a string value representing the REST resource this object represents.
+              Servers may infer this from the endpoint the client submits requests to.
+              Cannot be updated.
+              In CamelCase.
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+            type: string
+          mesh:
+            description: |-
+              Mesh is the name of the dubbo mesh this resource belongs to.
+              It may be omitted for cluster-scoped resources.
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: Spec is the specification of the Dubbo Zone resource.
+            x-kubernetes-preserve-unknown-fields: true
+        type: object
+    served: true
+    storage: true
diff --git a/test/manager/condition_route.go b/test/manager/condition_route.go
deleted file mode 100644
index fda8cbb..0000000
--- a/test/manager/condition_route.go
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * 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.
- */
-
-package manager
diff --git a/test/manager/dataplane.go b/test/manager/dataplane.go
deleted file mode 100644
index fda8cbb..0000000
--- a/test/manager/dataplane.go
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * 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.
- */
-
-package manager
diff --git a/test/manager/dynamic_config.go b/test/manager/dynamic_config.go
deleted file mode 100644
index fda8cbb..0000000
--- a/test/manager/dynamic_config.go
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * 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.
- */
-
-package manager
diff --git a/test/manager/mapping.go b/test/manager/mapping.go
deleted file mode 100644
index fda8cbb..0000000
--- a/test/manager/mapping.go
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * 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.
- */
-
-package manager
diff --git a/test/manager/metadata.go b/test/manager/metadata.go
deleted file mode 100644
index fda8cbb..0000000
--- a/test/manager/metadata.go
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * 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.
- */
-
-package manager
diff --git a/test/manager/tag_route.go b/test/manager/tag_route.go
deleted file mode 100644
index fda8cbb..0000000
--- a/test/manager/tag_route.go
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * 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.
- */
-
-package manager