Repository: spidernet-io/spiderpool
Pull request #3358 (2024-04-15 08:43:22)

coordinator: ensure hijickRoute's gw is from hostIPRouteForPod
## Thanks for contributing!

<!--Before submitting a pull request, make sure you read about our Contribution notice here: <https://spidernet-io.github.io/spiderpool/latest/develop/contributing/>-->

#### What type of PR is this?

<!--
Add one of the following kinds:

Required labels:

- release/none 
- release/bug 
- release/feature

Optional labels:

- kind/bug
- kind/feature
- kind/ci-bug
- kind/doc
-->

- release/bug 

**What this PR does / why we need it**:

Avoiding the GW properly comes from the nodelocaldns's IP when coordinator creates the hijack routes in the pod. 

![企业微信截图_17131629598028](https://github.com/spidernet-io/spiderpool/assets/59680092/aa78a107-ff04-41ba-81c7-21f0b61e9d91)

There are some os where `ip r get` may return src as the address of the node's nodelocaldns, which should be avoided.

**Which issue(s) this PR fixes**:
<!--
*Automatically closes linked issue when PR is merged.
Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
-->
Fixes https://github.com/spidernet-io/spiderpool/issues/3359

**Special notes for your reviewer**:


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/spidernet-io/spiderpool/pull/3358?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=spidernet-io) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 81.60%. Comparing base [(`3ae7bf0`)](https://app.codecov.io/gh/spidernet-io/spiderpool/commit/3ae7bf0ba20cad611db4e43cfc00ff9f2c7d18b4?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=spidernet-io) to head [(`28583ba`)](https://app.codecov.io/gh/spidernet-io/spiderpool/pull/3358?dropdown=coverage&src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=spidernet-io).
> Report is 20 commits behind head on main.

<details><summary>Additional details and impacted files</summary>


[![Impacted file tree graph](https://app.codecov.io/gh/spidernet-io/spiderpool/pull/3358/graphs/tree.svg?width=650&height=150&src=pr&token=YKXY2E4Q8G&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=spidernet-io)](https://app.codecov.io/gh/spidernet-io/spiderpool/pull/3358?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=spidernet-io)

```diff
@@            Coverage Diff             @@
##             main    #3358      +/-   ##
==========================================
+ Coverage   81.18%   81.60%   +0.42%     
==========================================
  Files          50       50              
  Lines        5372     4299    -1073     
==========================================
- Hits         4361     3508     -853     
+ Misses        854      633     -221     
- Partials      157      158       +1     
```

| [Flag](https://app.codecov.io/gh/spidernet-io/spiderpool/pull/3358/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=spidernet-io) | Coverage Δ | |
|---|---|---|
| [unittests](https://app.codecov.io/gh/spidernet-io/spiderpool/pull/3358/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=spidernet-io) | `81.60% <ø> (+0.42%)` | :arrow_up: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=spidernet-io#carryforward-flags-in-the-pull-request-comment) to find out more.

[see 48 files with indirect coverage changes](https://app.codecov.io/gh/spidernet-io/spiderpool/pull/3358/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=spidernet-io)

</details>
weizhoublue: please attach an issue link for this
cyclinder: > please attach an issue link for this

updated.

Patch:
diff --git a/.github/.spelling b/.github/.spelling
index 77832cf33..b5ead0c58 100644
--- a/.github/.spelling
+++ b/.github/.spelling
@@ -157,6 +157,7 @@ ovs
 kube-ovn
 subent
 roadmap
+Icarus9913
 iiiceoo
 excludeIPs
 replicaset
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml
index 6fbe35cc1..91c059116 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yaml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yaml
@@ -1,7 +1,7 @@
 name: Bug Report
 description: Report a bug that you encountered
 labels: ["kind/bug"]
-assignees: ["cyclinder"]
+assignees: ["Icarus9913", "cyclinder"]
 body:
   - type: markdown
     attributes:
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml
index 4ec6a5e73..d2d72f7fb 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yaml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yaml
@@ -1,7 +1,7 @@
 name: Feature Request
 description: Provide supporting details for a feature in development Spiderpool
 labels: ["kind/feature"]
-assignees: ["cyclinder"]
+assignees: ["Icarus9913", "cyclinder"]
 body:
   - type: markdown
     attributes:
diff --git a/.github/workflows/auto-diff-k8s-ci.yaml b/.github/workflows/auto-diff-k8s-ci.yaml
index c9b7b0636..a90c2f47f 100644
--- a/.github/workflows/auto-diff-k8s-ci.yaml
+++ b/.github/workflows/auto-diff-k8s-ci.yaml
@@ -145,7 +145,7 @@ jobs:
           body: |
             action url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
           labels: "kind/ci-bug"
-          assignees: "ty-dc"
+          assignees: "Icarus9913,ty-dc"
 
   call_inputs_k8s:
     # workflow_dispatch event flow triggered by running the input k8s version
diff --git a/.github/workflows/auto-nightly-ci.yaml b/.github/workflows/auto-nightly-ci.yaml
index 7abe356ce..68d35d9f2 100644
--- a/.github/workflows/auto-nightly-ci.yaml
+++ b/.github/workflows/auto-nightly-ci.yaml
@@ -206,4 +206,4 @@ jobs:
           body: |
             action url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
           labels: "kind/ci-bug"
-          assignees: "ty-dc"
+          assignees: "Icarus9913,ty-dc"
diff --git a/.github/workflows/lint-golang.yaml b/.github/workflows/lint-golang.yaml
index 4565ebe48..df47a3b3b 100644
--- a/.github/workflows/lint-golang.yaml
+++ b/.github/workflows/lint-golang.yaml
@@ -231,7 +231,7 @@ jobs:
       # ============= upload coverage report
       - name: Upload to Codecov
         if: ${{ steps.unittest.outcome != 'failure' }}
-        uses: codecov/codecov-action@v4
+        uses: codecov/codecov-action@v3.1.4
         with:
           directory: './'
           files: 'coverage.out'
diff --git a/CODEOWNERS b/CODEOWNERS
index 82bc2ae1b..c4b25e157 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -1,12 +1,12 @@
 *  @weizhoublue
 /.github/ @weizhoublue
-/api/ @weizhoublue
+/api/ @weizhoublue @Icarus9913
 /charts/ @weizhoublue
-/cmd/ @weizhoublue
+/cmd/ @weizhoublue @Icarus9913
 /contrib/ @weizhoublue
 /docs/ @weizhoublue @windsonsea @Michelle951 @Jeanine-tw
 /images/ @weizhoublue
-/pkg/ @weizhoublue
+/pkg/ @weizhoublue @Icarus9913
 /test/ @weizhoublue
 /test/e2e/ @weizhoublue @ty-dc @bzsuni
 /test/doc/ @weizhoublue @ty-dc @bzsuni
diff --git a/MAINTAINERS.md b/MAINTAINERS.md
index c2b0d1ee3..171d54d0e 100644
--- a/MAINTAINERS.md
+++ b/MAINTAINERS.md
@@ -11,7 +11,6 @@ Please see the [AUTHORS](./AUTHORS) file for the full list of contributors to th
 | [Weizhou Lan](https://github.com/weizhoublue)     | Daocloud  |
 | [Cyclinder](https://github.com/cyclinder )        | Daocloud  |
 | [Michael](https://github.com/windsonsea)          | Daocloud  |
+| [Lcarus](https://github.com/Icarus9913)           | Daocloud  |
 | [Tao Yang](https://github.com/ty-dc)              | Daocloud  |
 | [Kai Yan](https://github.com/yankay)              | Daocloud  |
-| [Peter Pan](https://github.com/panpan0000)        | Daocloud  |
-
diff --git a/charts/spiderpool/README.md b/charts/spiderpool/README.md
index 018839a33..0d18b25f4 100644
--- a/charts/spiderpool/README.md
+++ b/charts/spiderpool/README.md
@@ -127,20 +127,19 @@ helm install spiderpool spiderpool/spiderpool --wait --namespace kube-system \
 
 ### ipam parameters
 
-| Name                                                  | Description                                                                                      | Value  |
-| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------ |
-| `ipam.enableIPv4`                                     | enable ipv4                                                                                      | `true` |
-| `ipam.enableIPv6`                                     | enable ipv6                                                                                      | `true` |
-| `ipam.enableStatefulSet`                              | the network mode                                                                                 | `true` |
-| `ipam.enableKubevirtStaticIP`                         | the feature to keep kubevirt vm pod static IP                                                    | `true` |
-| `ipam.spidersubnet.enable`                            | SpiderSubnet feature.                                                                            | `true` |
-| `ipam.spidersubnet.autoPool.enable`                   | SpiderSubnet Auto IPPool feature.                                                                | `true` |
-| `ipam.spidersubnet.autoPool.defaultRedundantIPNumber` | the default redundant IP number of SpiderSubnet feature auto-created IPPools                     | `1`    |
-| `ipam.gc.enabled`                                     | enable retrieve IP in spiderippool CR                                                            | `true` |
-| `ipam.gc.gcAll.intervalInSecond`                      | the gc all interval duration                                                                     | `600`  |
-| `ipam.gc.statelessPod.zombieOnReadyNode`              | enable reclaim IP for the stateless pod who is over deleting graceful period on a ready node     | `true` |
-| `ipam.gc.statelessPod.zombieOnNotReadyNode`           | enable reclaim IP for the stateless pod who is over deleting graceful period on a not-ready node | `true` |
-| `ipam.gc.gcDeletingTimeOutPodDelay`                   | the gc delay seconds after the pod times out of deleting graceful period                         | `0`    |
+| Name                                        | Description                                                                                      | Value  |
+| ------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------ |
+| `ipam.enableIPv4`                           | enable ipv4                                                                                      | `true` |
+| `ipam.enableIPv6`                           | enable ipv6                                                                                      | `true` |
+| `ipam.enableStatefulSet`                    | the network mode                                                                                 | `true` |
+| `ipam.enableKubevirtStaticIP`               | the feature to keep kubevirt vm pod static IP                                                    | `true` |
+| `ipam.enableSpiderSubnet`                   | SpiderSubnet feature gate.                                                                       | `true` |
+| `ipam.subnetDefaultFlexibleIPNumber`        | the default flexible IP number of SpiderSubnet feature auto-created IPPools                      | `1`    |
+| `ipam.gc.enabled`                           | enable retrieve IP in spiderippool CR                                                            | `true` |
+| `ipam.gc.gcAll.intervalInSecond`            | the gc all interval duration                                                                     | `600`  |
+| `ipam.gc.statelessPod.zombieOnReadyNode`    | enable reclaim IP for the stateless pod who is over deleting graceful period on a ready node     | `true` |
+| `ipam.gc.statelessPod.zombieOnNotReadyNode` | enable reclaim IP for the stateless pod who is over deleting graceful period on a not-ready node | `true` |
+| `ipam.gc.gcDeletingTimeOutPodDelay`         | the gc delay seconds after the pod times out of deleting graceful period                         | `0`    |
 
 ### grafanaDashboard parameters
 
@@ -188,7 +187,6 @@ helm install spiderpool spiderpool/spiderpool --wait --namespace kube-system \
 | `rdma.rdmaSharedDevicePlugin.deviceConfig.rdmaHcaMax`             | rdma Hca Max                                            | `500`                                  |
 | `rdma.rdmaSharedDevicePlugin.deviceConfig.vendors`                | rdma device vendors, default to mellanox device         | `15b3`                                 |
 | `rdma.rdmaSharedDevicePlugin.deviceConfig.deviceIDs`              | rdma device IDs, default to mellanox device             | `1017`                                 |
-| `rdma.rdmaSharedDevicePlugin.deviceConfig.ifNames`                | rdma target device name, default to empty list.         | `[]`                                   |
 
 ### multus parameters
 
diff --git a/charts/spiderpool/templates/configmap.yaml b/charts/spiderpool/templates/configmap.yaml
index a183bbc31..1b77a6c09 100644
--- a/charts/spiderpool/templates/configmap.yaml
+++ b/charts/spiderpool/templates/configmap.yaml
@@ -19,10 +19,9 @@ data:
     enableIPv6: {{ .Values.ipam.enableIPv6 }}
     enableStatefulSet: {{ .Values.ipam.enableStatefulSet }}
     enableKubevirtStaticIP: {{ .Values.ipam.enableKubevirtStaticIP }}
-    enableSpiderSubnet: {{ .Values.ipam.spidersubnet.enable }}
-    enableAutoPoolForApplication: {{ .Values.ipam.spidersubnet.autoPool.enable }}
-    {{- if and .Values.ipam.spidersubnet.enable .Values.ipam.spidersubnet.autoPool.enable }}
-    clusterSubnetDefaultFlexibleIPNumber: {{ .Values.ipam.spidersubnet.autoPool.defaultRedundantIPNumber }}
+    enableSpiderSubnet: {{ .Values.ipam.enableSpiderSubnet }}
+    {{- if .Values.ipam.enableSpiderSubnet }}
+    clusterSubnetDefaultFlexibleIPNumber: {{ .Values.ipam.subnetDefaultFlexibleIPNumber }}
     {{- else}}
     clusterSubnetDefaultFlexibleIPNumber: 0
     {{- end }}
diff --git a/charts/spiderpool/templates/pod.yaml b/charts/spiderpool/templates/pod.yaml
index 0191dcf7a..01aced2ba 100644
--- a/charts/spiderpool/templates/pod.yaml
+++ b/charts/spiderpool/templates/pod.yaml
@@ -112,7 +112,7 @@ spec:
       value: {{ toJson .Values.clusterDefaultPool.ipv4IPRanges | quote }}
     - name: SPIDERPOOL_INIT_DEFAULT_IPV4_IPPOOL_GATEWAY
       value: {{ .Values.clusterDefaultPool.ipv4Gateway | quote }}
-    {{- if .Values.ipam.spidersubnet.enable }}
+    {{- if .Values.ipam.enableSpiderSubnet }}
     - name: SPIDERPOOL_INIT_DEFAULT_IPV4_SUBNET_NAME
       value: {{ .Values.clusterDefaultPool.ipv4SubnetName | quote }}
     {{- end }}
@@ -126,7 +126,7 @@ spec:
       value: {{ toJson .Values.clusterDefaultPool.ipv6IPRanges | quote }}
     - name: SPIDERPOOL_INIT_DEFAULT_IPV6_IPPOOL_GATEWAY
       value: {{ .Values.clusterDefaultPool.ipv6Gateway | quote }}
-    {{- if .Values.ipam.spidersubnet.enable }}
+    {{- if .Values.ipam.enableSpiderSubnet }}
     - name: SPIDERPOOL_INIT_DEFAULT_IPV6_SUBNET_NAME
       value: {{ .Values.clusterDefaultPool.ipv6SubnetName | quote }}
     {{- end }}
diff --git a/charts/spiderpool/templates/rdma-shared-dp/rdma-shared-dp.yaml b/charts/spiderpool/templates/rdma-shared-dp/rdma-shared-dp.yaml
index c28c2de3f..52958e7df 100644
--- a/charts/spiderpool/templates/rdma-shared-dp/rdma-shared-dp.yaml
+++ b/charts/spiderpool/templates/rdma-shared-dp/rdma-shared-dp.yaml
@@ -22,8 +22,7 @@ data:
              "rdmaHcaMax": {{ .Values.rdma.rdmaSharedDevicePlugin.deviceConfig.rdmaHcaMax }},
              "selectors": {
                "vendors": [{{ .Values.rdma.rdmaSharedDevicePlugin.deviceConfig.vendors | quote }}],
-               "deviceIDs": [{{ .Values.rdma.rdmaSharedDevicePlugin.deviceConfig.deviceIDs | quote }}],
-               "ifNames": {{ toJson .Values.rdma.rdmaSharedDevicePlugin.deviceConfig.ifNames }}
+               "deviceIDs": [{{ .Values.rdma.rdmaSharedDevicePlugin.deviceConfig.deviceIDs | quote }}]
               }
         }]
     }
diff --git a/charts/spiderpool/values.yaml b/charts/spiderpool/values.yaml
index 5304026d5..4ba75a49e 100644
--- a/charts/spiderpool/values.yaml
+++ b/charts/spiderpool/values.yaml
@@ -53,16 +53,11 @@ ipam:
   ## @param ipam.enableKubevirtStaticIP the feature to keep kubevirt vm pod static IP
   enableKubevirtStaticIP: true
 
-  spidersubnet:
-    ## @param ipam.spidersubnet.enable SpiderSubnet feature.
-    enable: true
+  ## @param ipam.enableSpiderSubnet SpiderSubnet feature gate.
+  enableSpiderSubnet: true
 
-    autoPool:
-      ## @param ipam.spidersubnet.autoPool.enable SpiderSubnet Auto IPPool feature.
-      enable: true
-
-      ## @param ipam.spidersubnet.autoPool.defaultRedundantIPNumber the default redundant IP number of SpiderSubnet feature auto-created IPPools
-      defaultRedundantIPNumber: 1
+  ## @param ipam.subnetDefaultFlexibleIPNumber the default flexible IP number of SpiderSubnet feature auto-created IPPools
+  subnetDefaultFlexibleIPNumber: 1
 
   gc:
     ## @param ipam.gc.enabled enable retrieve IP in spiderippool CR
@@ -202,9 +197,6 @@ rdma:
       ## @param rdma.rdmaSharedDevicePlugin.deviceConfig.deviceIDs rdma device IDs, default to mellanox device
       deviceIDs: "1017"
 
-      ## @param rdma.rdmaSharedDevicePlugin.deviceConfig.ifNames rdma target device name, default to empty list.
-      ifNames: []
-
 ## @section multus parameters
 ##
 multus:
diff --git a/cmd/coordinator/cmd/command_add.go b/cmd/coordinator/cmd/command_add.go
index 5e9d7307a..020a66715 100644
--- a/cmd/coordinator/cmd/command_add.go
+++ b/cmd/coordinator/cmd/command_add.go
@@ -126,6 +126,30 @@ func CmdAdd(args *skel.CmdArgs) (err error) {
 		return err
 	}
 
+	// get all ip of pod
+	var allPodIp []netlink.Addr
+	err = c.netns.Do(func(netNS ns.NetNS) error {
+		allPodIp, err = networking.GetAllIPAddress(ipFamily, []string{`^lo$`})
+		if err != nil {
+			logger.Error("failed to GetAllIPAddress in pod", zap.Error(err))
+			return fmt.Errorf("failed to GetAllIPAddress in pod: %v", err)
+		}
+		return nil
+	})
+	if err != nil {
+		logger.Error("failed to all ip of pod", zap.Error(err))
+		return err
+	}
+	logger.Debug(fmt.Sprintf("all pod ip: %+v", allPodIp))
+
+	// get ip addresses of the node
+	c.hostIPRouteForPod, err = GetAllHostIPRouteForPod(c, ipFamily, allPodIp)
+	if err != nil {
+		logger.Error("failed to get IPAddressOnNode", zap.Error(err))
+		return fmt.Errorf("failed to get IPAddressOnNode: %v", err)
+	}
+	logger.Debug(fmt.Sprintf("host IP for route to Pod: %+v", c.hostIPRouteForPod))
+
 	// get basic info
 	switch c.tuneMode {
 	case ModeUnderlay:
@@ -238,32 +262,6 @@ func CmdAdd(args *skel.CmdArgs) (err error) {
 
 	// =================================
 
-	// get all ip of pod
-	var allPodIp []netlink.Addr
-	err = c.netns.Do(func(netNS ns.NetNS) error {
-		allPodIp, err = networking.GetAllIPAddress(ipFamily, []string{`^lo$`})
-		if err != nil {
-			logger.Error("failed to GetAllIPAddress in pod", zap.Error(err))
-			return fmt.Errorf("failed to GetAllIPAddress in pod: %v", err)
-		}
-		return nil
-	})
-	if err != nil {
-		logger.Error("failed to all ip of pod", zap.Error(err))
-		return err
-	}
-	logger.Debug(fmt.Sprintf("all pod ip: %+v", allPodIp))
-
-	// get ip addresses of the node
-	c.hostIPRouteForPod, err = GetAllHostIPRouteForPod(c, ipFamily, allPodIp)
-	if err != nil {
-		logger.Error("failed to get IPAddressOnNode", zap.Error(err))
-		return fmt.Errorf("failed to get IPAddressOnNode: %v", err)
-	}
-	logger.Debug(fmt.Sprintf("host IP for route to Pod: %+v", c.hostIPRouteForPod))
-
-	// =================================
-
 	// get ips of this interface(preInterfaceName) from, including ipv4 and ipv6
 	c.currentAddress, err = networking.IPAddressByName(c.netns, args.IfName, ipFamily)
 	if err != nil {
@@ -328,6 +326,22 @@ func CmdAdd(args *skel.CmdArgs) (err error) {
 		return err
 	}
 
+	// get v4 and v6 gw for hijick route'gw
+	for _, gw := range c.hostIPRouteForPod {
+		copy := gw
+		if copy.To4() != nil {
+			if c.v4HijackRouteGw == nil && c.ipFamily != netlink.FAMILY_V6 {
+				c.v4HijackRouteGw = copy
+				logger.Debug("Get v4HijackRouteGw", zap.String("v4HijackRouteGw", c.v4HijackRouteGw.String()))
+			}
+		} else {
+			if c.v6HijackRouteGw == nil && c.ipFamily != netlink.FAMILY_V4 {
+				c.v6HijackRouteGw = copy
+				logger.Debug("Get v6HijackRouteGw", zap.String("v6HijackRouteGw", c.v6HijackRouteGw.String()))
+			}
+		}
+	}
+
 	if err = c.setupHijackRoutes(logger, c.currentRuleTable); err != nil {
 		logger.Error("failed to setupHijackRoutes", zap.Error(err))
 		return err
diff --git a/cmd/coordinator/cmd/utils.go b/cmd/coordinator/cmd/utils.go
index ccd5dcec0..2e98c3499 100644
--- a/cmd/coordinator/cmd/utils.go
+++ b/cmd/coordinator/cmd/utils.go
@@ -25,6 +25,7 @@ type coordinator struct {
 	ipFamily, currentRuleTable, hostRuleTable   int
 	tuneMode                                    Mode
 	hostVethName, podVethName, currentInterface string
+	v4HijackRouteGw, v6HijackRouteGw            net.IP
 	HijackCIDR, podNics                         []string
 	netns, hostNs                               ns.NetNS
 	hostVethHwAddress, podVethHwAddress         net.HardwareAddr
@@ -263,15 +264,7 @@ func (c *coordinator) setupNeighborhood(logger *zap.Logger) error {
 // setupRoutes setup hijack subnet routes for pod and host
 // equivalent to: `ip route add $route table $ruleTable`
 func (c *coordinator) setupHijackRoutes(logger *zap.Logger, ruleTable int) error {
-	v4Gw, v6Gw, err := networking.GetGatewayIP(c.currentAddress)
-	if err != nil {
-		logger.Error("failed to GetGatewayIP", zap.Error(err))
-		return err
-	}
-
-	logger.Debug("Debug setupHijackRoutes", zap.String("v4Gw", v4Gw.String()), zap.String("v6Gw", v6Gw.String()))
-
-	err = c.netns.Do(func(_ ns.NetNS) error {
+	err := c.netns.Do(func(_ ns.NetNS) error {
 		// make sure that veth0/eth0 forwards traffic within the cluster
 		// eq: ip route add <cluster/service cidr> dev veth0/eth0
 		for _, hijack := range c.HijackCIDR {
@@ -283,7 +276,7 @@ func (c *coordinator) setupHijackRoutes(logger *zap.Logger, ruleTable int) error
 
 			var src *net.IPNet
 			if nip.To4() != nil {
-				if v4Gw == nil {
+				if c.v4HijackRouteGw == nil {
 					logger.Warn("ignore adding hijack routing table(ipv4), due to ipv4 gateway is nil", zap.String("IPv4 Hijack cidr", hijack))
 					continue
 				}
@@ -291,20 +284,20 @@ func (c *coordinator) setupHijackRoutes(logger *zap.Logger, ruleTable int) error
 			}
 
 			if nip.To4() == nil {
-				if v6Gw == nil {
+				if c.v6HijackRouteGw == nil {
 					logger.Warn("ignore adding hijack routing table(ipv6), due to ipv6 gateway is nil", zap.String("IPv6 Hijack cidr", hijack))
 					continue
 				}
 				src = c.v6PodOverlayNicAddr
 			}
 
-			if err := networking.AddRoute(logger, ruleTable, c.ipFamily, netlink.SCOPE_UNIVERSE, c.podVethName, src, ipNet, v4Gw, v6Gw); err != nil {
+			if err := networking.AddRoute(logger, ruleTable, c.ipFamily, netlink.SCOPE_UNIVERSE, c.podVethName, src, ipNet, c.v4HijackRouteGw, c.v6HijackRouteGw); err != nil {
 				logger.Error("failed to AddRoute for hijackCIDR", zap.String("Dst", ipNet.String()), zap.Error(err))
 				return fmt.Errorf("failed to AddRoute for hijackCIDR: %v", err)
 			}
 
 			if c.tuneMode == ModeOverlay && c.firstInvoke {
-				if err := networking.AddRoute(logger, unix.RT_TABLE_MAIN, c.ipFamily, netlink.SCOPE_UNIVERSE, c.podVethName, src, ipNet, v4Gw, v6Gw); err != nil {
+				if err := networking.AddRoute(logger, unix.RT_TABLE_MAIN, c.ipFamily, netlink.SCOPE_UNIVERSE, c.podVethName, src, ipNet, c.v4HijackRouteGw, c.v6HijackRouteGw); err != nil {
 					logger.Error("failed to AddRoute for hijackCIDR", zap.String("Dst", ipNet.String()), zap.Error(err))
 					return fmt.Errorf("failed to AddRoute for hijackCIDR: %v", err)
 				}
@@ -499,11 +492,6 @@ func (c *coordinator) tunePodRoutes(logger *zap.Logger, configDefaultRouteNIC st
 // makeReplyPacketViaVeth make sure that tcp replay packet is forward by veth0
 // NOTE: underlay mode only.
 func (c *coordinator) makeReplyPacketViaVeth(logger *zap.Logger) error {
-	v4Gw, v6Gw, err := networking.GetGatewayIP(c.currentAddress)
-	if err != nil {
-		return fmt.Errorf("failed to get gateway ips: %v", err)
-	}
-
 	var iptablesInterface []utiliptables.Interface
 	var ipFamily []int
 	execer := exec.New()
@@ -539,7 +527,7 @@ func (c *coordinator) makeReplyPacketViaVeth(logger *zap.Logger) error {
 				src = c.v6PodOverlayNicAddr
 			}
 
-			if err = networking.AddRoute(logger, c.hostRuleTable, family, netlink.SCOPE_UNIVERSE, c.podVethName, src, nil, v4Gw, v6Gw); err != nil {
+			if err := networking.AddRoute(logger, c.hostRuleTable, family, netlink.SCOPE_UNIVERSE, c.podVethName, src, nil, c.v4HijackRouteGw, c.v6HijackRouteGw); err != nil {
 				return err
 			}
 		}
@@ -631,10 +619,10 @@ OUTER1:
 	}
 
 	var DefaultNodeInterfacesToExclude = []string{
-		"docker.*", "cbr.*", "dummy.*",
-		"virbr.*", "lxcbr.*", "veth.*", `^lo$`,
-		`^cali.*`, "flannel.*", "kube-ipvs.*",
-		"cni.*", "vx-submariner", "cilium*",
+		"^docker.*", "^cbr.*", "^dummy.*",
+		"^virbr.*", "^lxcbr.*", "^veth.*", `^lo$`,
+		`^cali.*`, "^flannel.*", "^kube-ipvs.*",
+		"^cni.*", "^vx-submariner", "^cilium*",
 	}
 
 	// get additional host ip
diff --git a/cmd/spiderpool-agent/cmd/config.go b/cmd/spiderpool-agent/cmd/config.go
index 6270875a2..90d71c470 100644
--- a/cmd/spiderpool-agent/cmd/config.go
+++ b/cmd/spiderpool-agent/cmd/config.go
@@ -29,7 +29,6 @@ import (
 	"github.com/spidernet-io/spiderpool/pkg/reservedipmanager"
 	"github.com/spidernet-io/spiderpool/pkg/statefulsetmanager"
 	"github.com/spidernet-io/spiderpool/pkg/subnetmanager"
-	spiderpooltypes "github.com/spidernet-io/spiderpool/pkg/types"
 	"github.com/spidernet-io/spiderpool/pkg/workloadendpointmanager"
 )
 
@@ -98,7 +97,13 @@ type Config struct {
 	MultusClusterNetwork string
 
 	// configmap
-	spiderpooltypes.SpiderpoolConfigmapConfig
+	IpamUnixSocketPath                string `yaml:"ipamUnixSocketPath"`
+	EnableIPv4                        bool   `yaml:"enableIPv4"`
+	EnableIPv6                        bool   `yaml:"enableIPv6"`
+	EnableStatefulSet                 bool   `yaml:"enableStatefulSet"`
+	EnableKubevirtStaticIP            bool   `yaml:"enableKubevirtStaticIP"`
+	EnableSpiderSubnet                bool   `yaml:"enableSpiderSubnet"`
+	ClusterSubnetDefaultFlexibleIPNum int    `yaml:"clusterSubnetDefaultFlexibleIPNumber"`
 }
 
 type AgentContext struct {
@@ -189,7 +194,7 @@ func (ac *AgentContext) LoadConfigmap() error {
 		return fmt.Errorf("failed to read configmap file, error: %v", err)
 	}
 
-	err = yaml.Unmarshal(configmapBytes, &ac.Cfg.SpiderpoolConfigmapConfig)
+	err = yaml.Unmarshal(configmapBytes, &ac.Cfg)
 	if nil != err {
 		return fmt.Errorf("failed to parse configmap, error: %v", err)
 	}
diff --git a/cmd/spiderpool-agent/cmd/crd_manager.go b/cmd/spiderpool-agent/cmd/crd_manager.go
index 8a37619aa..2e713ba54 100644
--- a/cmd/spiderpool-agent/cmd/crd_manager.go
+++ b/cmd/spiderpool-agent/cmd/crd_manager.go
@@ -16,7 +16,6 @@ import (
 	controllerruntimelog "sigs.k8s.io/controller-runtime/pkg/log"
 	metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
 
-	"github.com/spidernet-io/spiderpool/pkg/constant"
 	spiderpoolv2beta1 "github.com/spidernet-io/spiderpool/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1"
 )
 
@@ -47,21 +46,14 @@ func newCRDManager() (ctrl.Manager, error) {
 		return nil, err
 	}
 
-	if err := mgr.GetFieldIndexer().IndexField(agentContext.InnerCtx, &spiderpoolv2beta1.SpiderIPPool{}, constant.SpecDefaultField, func(raw client.Object) []string {
+	if err := mgr.GetFieldIndexer().IndexField(agentContext.InnerCtx, &spiderpoolv2beta1.SpiderIPPool{}, "spec.default", func(raw client.Object) []string {
 		ipPool := raw.(*spiderpoolv2beta1.SpiderIPPool)
 		return []string{strconv.FormatBool(*ipPool.Spec.Default)}
 	}); err != nil {
 		return nil, err
 	}
 
-	if err := mgr.GetFieldIndexer().IndexField(agentContext.InnerCtx, &spiderpoolv2beta1.SpiderIPPool{}, constant.SpecIPVersionField, func(raw client.Object) []string {
-		ipPool := raw.(*spiderpoolv2beta1.SpiderIPPool)
-		return []string{strconv.FormatInt(*ipPool.Spec.IPVersion, 10)}
-	}); err != nil {
-		return nil, err
-	}
-
-	if err := mgr.GetFieldIndexer().IndexField(agentContext.InnerCtx, &spiderpoolv2beta1.SpiderReservedIP{}, constant.SpecIPVersionField, func(raw client.Object) []string {
+	if err := mgr.GetFieldIndexer().IndexField(agentContext.InnerCtx, &spiderpoolv2beta1.SpiderReservedIP{}, "spec.ipVersion", func(raw client.Object) []string {
 		reservedIP := raw.(*spiderpoolv2beta1.SpiderReservedIP)
 		return []string{strconv.FormatInt(*reservedIP.Spec.IPVersion, 10)}
 	}); err != nil {
diff --git a/cmd/spiderpool-agent/cmd/daemon.go b/cmd/spiderpool-agent/cmd/daemon.go
index f1c7aa98b..c61c8a469 100644
--- a/cmd/spiderpool-agent/cmd/daemon.go
+++ b/cmd/spiderpool-agent/cmd/daemon.go
@@ -145,7 +145,6 @@ func DaemonMain() {
 		EnableIPv4:                           agentContext.Cfg.EnableIPv4,
 		EnableIPv6:                           agentContext.Cfg.EnableIPv6,
 		EnableSpiderSubnet:                   agentContext.Cfg.EnableSpiderSubnet,
-		EnableAutoPoolForApplication:         agentContext.Cfg.EnableAutoPoolForApplication,
 		EnableStatefulSet:                    agentContext.Cfg.EnableStatefulSet,
 		EnableKubevirtStaticIP:               agentContext.Cfg.EnableKubevirtStaticIP,
 		EnableReleaseConflictIPsForStateless: agentContext.Cfg.EnableReleaseConflictIPsForStateless,
diff --git a/cmd/spiderpool-controller/cmd/config.go b/cmd/spiderpool-controller/cmd/config.go
index 99bf9e0ee..491110cae 100644
--- a/cmd/spiderpool-controller/cmd/config.go
+++ b/cmd/spiderpool-controller/cmd/config.go
@@ -31,7 +31,6 @@ import (
 	"github.com/spidernet-io/spiderpool/pkg/reservedipmanager"
 	"github.com/spidernet-io/spiderpool/pkg/statefulsetmanager"
 	"github.com/spidernet-io/spiderpool/pkg/subnetmanager"
-	spiderpooltypes "github.com/spidernet-io/spiderpool/pkg/types"
 	"github.com/spidernet-io/spiderpool/pkg/workloadendpointmanager"
 )
 
@@ -154,14 +153,20 @@ type Config struct {
 	WorkQueueMaxRetries              int
 	WorkQueueRequeueDelayDuration    int
 
-	EnableCoordinator               bool
 	CoordinatorInformerResyncPeriod int
 
 	EnableMultusConfig               bool
 	MultusConfigInformerResyncPeriod int
 
+	EnableCoordinator bool
+
 	// configmap
-	spiderpooltypes.SpiderpoolConfigmapConfig
+	EnableIPv4                        bool `yaml:"enableIPv4"`
+	EnableIPv6                        bool `yaml:"enableIPv6"`
+	EnableStatefulSet                 bool `yaml:"enableStatefulSet"`
+	EnableKubevirtStaticIP            bool `yaml:"enableKubevirtStaticIP"`
+	EnableSpiderSubnet                bool `yaml:"enableSpiderSubnet"`
+	ClusterSubnetDefaultFlexibleIPNum int  `yaml:"clusterSubnetDefaultFlexibleIPNumber"`
 }
 
 type ControllerContext struct {
@@ -281,7 +286,7 @@ func (cc *ControllerContext) LoadConfigmap() error {
 		return fmt.Errorf("failed to read configmap file, error: %v", err)
 	}
 
-	err = yaml.Unmarshal(configmapBytes, &cc.Cfg.SpiderpoolConfigmapConfig)
+	err = yaml.Unmarshal(configmapBytes, &cc.Cfg)
 	if nil != err {
 		return fmt.Errorf("failed to parse configmap, error: %v", err)
 	}
diff --git a/cmd/spiderpool-controller/cmd/crd_manager.go b/cmd/spiderpool-controller/cmd/crd_manager.go
index c998ca4e7..95c62e4af 100644
--- a/cmd/spiderpool-controller/cmd/crd_manager.go
+++ b/cmd/spiderpool-controller/cmd/crd_manager.go
@@ -65,14 +65,14 @@ func newCRDManager() (ctrl.Manager, error) {
 		return nil, err
 	}
 
-	if err := mgr.GetFieldIndexer().IndexField(controllerContext.InnerCtx, &spiderpoolv2beta1.SpiderIPPool{}, constant.SpecDefaultField, func(raw client.Object) []string {
+	if err := mgr.GetFieldIndexer().IndexField(controllerContext.InnerCtx, &spiderpoolv2beta1.SpiderIPPool{}, "spec.default", func(raw client.Object) []string {
 		ipPool := raw.(*spiderpoolv2beta1.SpiderIPPool)
 		return []string{strconv.FormatBool(*ipPool.Spec.Default)}
 	}); err != nil {
 		return nil, err
 	}
 
-	if err := mgr.GetFieldIndexer().IndexField(controllerContext.InnerCtx, &spiderpoolv2beta1.SpiderReservedIP{}, constant.SpecIPVersionField, func(raw client.Object) []string {
+	if err := mgr.GetFieldIndexer().IndexField(controllerContext.InnerCtx, &spiderpoolv2beta1.SpiderReservedIP{}, "spec.ipVersion", func(raw client.Object) []string {
 		reservedIP := raw.(*spiderpoolv2beta1.SpiderReservedIP)
 		return []string{strconv.FormatInt(*reservedIP.Spec.IPVersion, 10)}
 	}); err != nil {
diff --git a/cmd/spiderpool-controller/cmd/daemon.go b/cmd/spiderpool-controller/cmd/daemon.go
index 305edc041..25c16bdd9 100644
--- a/cmd/spiderpool-controller/cmd/daemon.go
+++ b/cmd/spiderpool-controller/cmd/daemon.go
@@ -365,8 +365,8 @@ func initControllerServiceManagers(ctx context.Context) {
 			logger.Fatal(err.Error())
 		}
 
-		logger.Sugar().Debugf("Begin to initialize cluster Subnet AutoPool default redimdamt IP number to %d", controllerContext.Cfg.ClusterSubnetAutoPoolDefaultRedundantIPNumber)
-		*applicationinformers.ClusterSubnetAutoPoolDefaultRedundantIPNumber = controllerContext.Cfg.ClusterSubnetAutoPoolDefaultRedundantIPNumber
+		logger.Sugar().Debugf("Begin to initialize cluster Subnet default flexible IP number to %d", controllerContext.Cfg.ClusterSubnetDefaultFlexibleIPNum)
+		*applicationinformers.ClusterSubnetDefaultFlexibleIPNumber = controllerContext.Cfg.ClusterSubnetDefaultFlexibleIPNum
 	} else {
 		logger.Info("Feature SpiderSubnet is disabled")
 	}
@@ -489,7 +489,6 @@ func setupInformers(k8sClient *kubernetes.Clientset) {
 		ippoolmanager.IPPoolControllerConfig{
 			IPPoolControllerWorkers:       controllerContext.Cfg.IPPoolInformerWorkers,
 			EnableSpiderSubnet:            controllerContext.Cfg.EnableSpiderSubnet,
-			EnableAutoPoolForApplication:  controllerContext.Cfg.EnableAutoPoolForApplication,
 			LeaderRetryElectGap:           time.Duration(controllerContext.Cfg.LeaseRetryGap) * time.Second,
 			MaxWorkqueueLength:            controllerContext.Cfg.IPPoolInformerMaxWorkQueueLength,
 			WorkQueueRequeueDelayDuration: time.Duration(controllerContext.Cfg.WorkQueueRequeueDelayDuration) * time.Second,
@@ -518,31 +517,27 @@ func setupInformers(k8sClient *kubernetes.Clientset) {
 			logger.Fatal(err.Error())
 		}
 
-		if controllerContext.Cfg.EnableAutoPoolForApplication {
-			logger.Info("Begin to set up auto-created IPPool controller")
-			subnetAppController, err := applicationcontroller.NewSubnetAppController(
-				controllerContext.CRDManager.GetClient(),
-				controllerContext.CRDManager.GetAPIReader(),
-				controllerContext.SubnetManager,
-				applicationcontroller.SubnetAppControllerConfig{
-					EnableIPv4:                    controllerContext.Cfg.EnableIPv4,
-					EnableIPv6:                    controllerContext.Cfg.EnableIPv6,
-					AppControllerWorkers:          controllerContext.Cfg.SubnetAppControllerWorkers,
-					MaxWorkqueueLength:            controllerContext.Cfg.SubnetInformerMaxWorkqueueLength,
-					WorkQueueMaxRetries:           controllerContext.Cfg.WorkQueueMaxRetries,
-					WorkQueueRequeueDelayDuration: time.Duration(controllerContext.Cfg.WorkQueueRequeueDelayDuration) * time.Second,
-					LeaderRetryElectGap:           time.Duration(controllerContext.Cfg.LeaseRetryGap) * time.Second,
-				})
-			if nil != err {
-				logger.Fatal(err.Error())
-			}
+		logger.Info("Begin to set up auto-created IPPool controller")
+		subnetAppController, err := applicationcontroller.NewSubnetAppController(
+			controllerContext.CRDManager.GetClient(),
+			controllerContext.CRDManager.GetAPIReader(),
+			controllerContext.SubnetManager,
+			applicationcontroller.SubnetAppControllerConfig{
+				EnableIPv4:                    controllerContext.Cfg.EnableIPv4,
+				EnableIPv6:                    controllerContext.Cfg.EnableIPv6,
+				AppControllerWorkers:          controllerContext.Cfg.SubnetAppControllerWorkers,
+				MaxWorkqueueLength:            controllerContext.Cfg.SubnetInformerMaxWorkqueueLength,
+				WorkQueueMaxRetries:           controllerContext.Cfg.WorkQueueMaxRetries,
+				WorkQueueRequeueDelayDuration: time.Duration(controllerContext.Cfg.WorkQueueRequeueDelayDuration) * time.Second,
+				LeaderRetryElectGap:           time.Duration(controllerContext.Cfg.LeaseRetryGap) * time.Second,
+			})
+		if nil != err {
+			logger.Fatal(err.Error())
+		}
 
-			err = subnetAppController.SetupInformer(controllerContext.InnerCtx, controllerContext.ClientSet, controllerContext.Leader)
-			if nil != err {
-				logger.Fatal(err.Error())
-			}
-		} else {
-			logger.Sugar().Info("SpiderSubnet AutoPool feature is off")
+		err = subnetAppController.SetupInformer(controllerContext.InnerCtx, controllerContext.ClientSet, controllerContext.Leader)
+		if nil != err {
+			logger.Fatal(err.Error())
 		}
 	}
 
diff --git a/docs/concepts/coordinator.md b/docs/concepts/coordinator.md
index 3b63c48e9..fc6a251c6 100644
--- a/docs/concepts/coordinator.md
+++ b/docs/concepts/coordinator.md
@@ -155,7 +155,7 @@ spec:
 
 ## Automatically get the CIDR of a clustered Service
 
-Kubernetes 1.29 starts to support configuring the CIDR of a clustered Service as a ServiceCIDR resource, for more information refer to [KEP 1880](https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/1880-multiple-service-cidrs/README.md). If your cluster supports ServiceCIDR, the Spiderpool-controller component automatically listens for changes to the ServiceCIDR resource and automatically updates the Service subnet information it reads into the Status of the Spidercoordinator.
+Kubernetes 1.29 starts to support configuring the CIDR of a clustered Service as a ServiceCIDR resource, for more information refer to [KEP 1880](https://github.com/kubernetes/enhancements/blob/master/keps/ sig-network/1880-multiple-service-cidrs/README.md). If your cluster supports ServiceCIDR, the Spiderpool-controller component automatically listens for changes to the ServiceCIDR resource and automatically updates the Service subnet information it reads into the Status of the Spidercoordinator.
 
 ```shell
 ~# kubectl get servicecidr kubernetes -o yaml
diff --git a/docs/usage/install/upgrade-zh_CN.md b/docs/usage/install/upgrade-zh_CN.md
index 06c7a69c0..a5bb6e529 100644
--- a/docs/usage/install/upgrade-zh_CN.md
+++ b/docs/usage/install/upgrade-zh_CN.md
@@ -51,13 +51,13 @@
 您可以通过 `--set` 在升级时去更新 Spiderpool 配置，可用的 values 参数，请查看 [values](https://github.com/spidernet-io/spiderpool/tree/main/charts/spiderpool/README.md) 说明文档。 以下示例展示了如何开启 Spiderpool 的 [SpiderSubnet 功能](../spider-subnet-zh_CN.md)
 
 ```bash
-helm upgrade spiderpool spiderpool/spiderpool -n kube-system --version [upgraded-version] --set ipam.spidersubnet.enable=true
+helm upgrade spiderpool spiderpool/spiderpool -n kube-system --version [upgraded-version] --set ipam.enableSpiderSubnet=true
 ```
 
 同时您也可以使用 `--reuse-values` 重用上一个 release 的值并合并来自命令行的任何覆盖。但仅当 Spiderpool chart 版本保持不变时，才可以安全地使用 `--reuse-values` 标志，例如，当使用 helm upgrade 来更改 Spiderpool 配置而不升级 Spiderpool 组件。 `--reuse-values` 使用，参考如下示例：
 
 ```bash
-helm upgrade spiderpool spiderpool/spiderpool -n kube-system --version [upgraded-version] --set ipam.spidersubnet.enable=true --reuse-values
+helm upgrade spiderpool spiderpool/spiderpool -n kube-system --version [upgraded-version] --set ipam.enableSpiderSubnet=true --reuse-values
 ```
 
 相反，如果 Spiderpool chart 版本发生了变化，您想重用现有安装中的值，请将旧值保存在值文件中，检查该文件中是否有任何重命名或弃用的值，然后将其传递给 helm upgrade 命令，您可以使用以下命令检索并保存现有安装中的值：
diff --git a/docs/usage/install/upgrade.md b/docs/usage/install/upgrade.md
index c22f7f17d..1d492a377 100644
--- a/docs/usage/install/upgrade.md
+++ b/docs/usage/install/upgrade.md
@@ -51,13 +51,13 @@ It is recommended to always upgrade to the latest and maintained patch version o
 You can use `--set` to update the Spiderpool configuration when upgrading. For available values parameters, please see the [values](https://github.com/spidernet-io/spiderpool/tree/main/charts/spiderpool/README.md) documentation. The following example shows how to enable Spiderpool's [SpiderSubnet function](../spider-subnet.md)
 
 ```bash
-helm upgrade spiderpool spiderpool/spiderpool -n kube-system --version [upgraded-version] --set ipam.spidersubnet.enable=true
+helm upgrade spiderpool spiderpool/spiderpool -n kube-system --version [upgraded-version] --set ipam.enableSpiderSubnet=true
 ```
 
 You can also use `--reuse-values` to reuse the values from the previous release and merge any overrides from the command line. However, it is only safe to use the `--reuse-values` flag if the Spiderpool chart version remains unchanged, e.g. when using helm upgrade to change the Spiderpool configuration without upgrading the Spiderpool components. For `--reuse-values` usage, see the following example:
 
 ```bash
-helm upgrade spiderpool spiderpool/spiderpool -n kube-system --version [upgraded-version] --set ipam.spidersubnet.enable=true --reuse-values
+helm upgrade spiderpool spiderpool/spiderpool -n kube-system --version [upgraded-version] --set ipam.enableSpiderSubnet=true --reuse-values
 ```
 
 Conversely, if the Spiderpool chart version has changed and you want to reuse the values from the existing installation, save the old values in a values file, check that file for any renamed or deprecated values, and pass it to helm upgrade command, you can retrieve and save values from existing installations using.
diff --git a/docs/usage/spider-ippool-zh_CN.md b/docs/usage/spider-ippool-zh_CN.md
index b6bac07a3..2399419ac 100644
--- a/docs/usage/spider-ippool-zh_CN.md
+++ b/docs/usage/spider-ippool-zh_CN.md
@@ -55,24 +55,17 @@ spec:
 
 ### 指定 IPPool 为应用分配 IP 地址
 
-该功能有： `使用 Pod Annotation 指定使用 IP 池`、`使用 Namespace 注解指定池`、`使用 CNI 配置文件指定池` 和 `为 SpiderIPPool 设置集群默认级别`一共4种使用方案。
-
-> 对于这4种指定使用 SpiderIPPool 规则的优先级，请参考 [IP 候选池规则](./../concepts/ipam-des-zh_CN.md#获取候选池)
-> 额外，指定 IP 池的方式(Pod Annotation, Namespace 注解, CNI 配置文件)，还可使用通配符 `*`, `?` 和 `[]` 来匹配期望的 IP 池。如: ipam.spidernet.io/ippool: '{"ipv4": ["demo-v4-ippool1", "backup-ipv4*"]}'。
->
->   1. '*': 匹配零个或多个字符。例如，"ab" 可以匹配 "ab"、"abc"、"abcd"等等。
->   2. '?': 匹配一个单独的字符。例如，"a?c" 可以匹配 "abc"、"adc"、"axc"等等。
->   3. '[]': 匹配指定范围内的一个字符。您可以在方括号内指定字符的选择，或者使用连字符指定字符范围。例如，"[abc]" 可以匹配 "a"、"b"、"c"中的任意一个字符。
+> 对于以下指定使用 SpiderIPPool 规则的优先级，请参考 [IP 候选池规则](./../concepts/ipam-des-zh_CN.md#获取候选池)
 
 #### 使用 Pod Annotation 指定使用 IP 池
 
-可借助注解 `ipam.spidernet.io/ippool` 或 `ipam.spidernet.io/ippools` 标记在 Pod 的 Annotation上来指定 Pod 使用哪些 IP 池, 注解 `ipam.spidernet.io/ippools` 多用于多网卡指定。此外还可以指定多个 IP 池以供备选，当某个池的 IP 被用完后，可继续从你指定的其他池中分配地址。
+我们可借助注解 `ipam.spidernet.io/ippool` 或 `ipam.spidernet.io/ippools` 标记在 Pod 的 Annotation上来指定 Pod 使用哪些 IP 池, 注解 `ipam.spidernet.io/ippools` 多用于多网卡指定。此外我们可以指定多个 IP 池以供备选，当某个池的 IP 被用完后，可继续从你指定的其他池中分配地址。
 
 ```yaml
 ipam.spidernet.io/ippool: |-
   {
-    "ipv4": ["demo-v4-ippool1", "backup-ipv4-ippool", "wildcard-v4?"],
-    "ipv6": ["demo-v6-ippool1", "backup-ipv6-ippool", "wildcard-v6*"]
+    "ipv4": ["demo-v4-ippool1", "backup-ipv4-ippool"],
+    "ipv6": ["demo-v6-ippool1", "backup-ipv6-ippool"]
   }
 ```
 
@@ -83,11 +76,11 @@ ipam.spidernet.io/ippool: |-
 ```yaml
 ipam.spidernet.io/ippools: |-
   [{
-      "ipv4": ["demo-v4-ippool1", "wildcard-v4-ippool[123]"],
-      "ipv6": ["demo-v6-ippool1", "wildcard-v6-ippool[123]"]
+      "ipv4": ["demo-v4-ippool1"],
+      "ipv6": ["demo-v6-ippool1"],
    },{
-      "ipv4": ["demo-v4-ippool2", "wildcard-v4-ippool[456]"],
-      "ipv6": ["demo-v6-ippool2", "wildcard-v6-ippool[456]"],
+      "ipv4": ["demo-v4-ippool2"],
+      "ipv6": ["demo-v6-ippool2"],
       "cleangateway": true
   }]
 ```
@@ -96,13 +89,13 @@ ipam.spidernet.io/ippools: |-
 ipam.spidernet.io/ippools: |-
   [{
       "interface": "eth0",
-      "ipv4": ["demo-v4-ippool1", "wildcard-v4-ippool[123]"],
-      "ipv6": ["demo-v6-ippool1", "wildcard-v6-ippool[123]"],
+      "ipv4": ["demo-v4-ippool1"],
+      "ipv6": ["demo-v6-ippool1"],
       "cleangateway": true
    },{
       "interface": "net1",
-      "ipv4": ["demo-v4-ippool2", "wildcard-v4-ippool[456]"],
-      "ipv6": ["demo-v6-ippool2", "wildcard-v6-ippool[456]"],
+      "ipv4": ["demo-v4-ippool2"],
+      "ipv6": ["demo-v6-ippool2"],
       "cleangateway": false
   }]
 ```
@@ -119,8 +112,8 @@ apiVersion: v1
 kind: Namespace
 metadata:
   annotations:
-    ipam.spidernet.io/default-ipv4-ippool: '["ns-v4-ippool1", "ns-v4-ippool2", "wildcard-v4*"]'
-    ipam.spidernet.io/default-ipv6-ippool: '["ns-v6-ippool1", "ns-v6-ippool2", "wildcard-v6?"]'
+    ipam.spidernet.io/default-ipv4-ippool: '["ns-v4-ippool1","ns-v4-ippool2"]'
+    ipam.spidernet.io/default-ipv6-ippool: '["ns-v6-ippool1","ns-v6-ippool2"]'
   name: kube-system
 ...
 ```
@@ -138,8 +131,8 @@ metadata:
   "master": "eth0",
   "ipam": {
     "type": "spiderpool",
-    "default_ipv4_ippool":["default-v4-ippool", "backup-ipv4-ippool", "wildcard-v4-ippool[123]"],
-    "default_ipv6_ippool":["default-v6-ippool", "backup-ipv6-ippool", "wildcard-v6-ippool[456]"]
+    "default_ipv4_ippool":["default-v4-ippool","backup-ipv4-ippool"],
+    "default_ipv6_ippool":["default-v6-ippool","backup-ipv6-ippool"]
     }
 }
 ```
diff --git a/docs/usage/spider-ippool.md b/docs/usage/spider-ippool.md
index 4bd5c64ae..881144b89 100644
--- a/docs/usage/spider-ippool.md
+++ b/docs/usage/spider-ippool.md
@@ -55,14 +55,7 @@ spec:
 
 ### Specify IPPool to Allocate IP Addresses to Applications
 
-This feature owns 4 usage options including: `Use Pod Annotation to Specify IP Pool`, `Use Namespace Annotation to Specify IP Pool`, `Use CNI Configuration File to Specify IP Pool` and `Set Cluster Default Level for SpiderIPPool`.
-
-> For the priority rules when specifying the SpiderIPPool, refer to the [Candidate Pool Acquisition](../concepts/ipam-des.md#candidate-pool-acquisition).  
-> Additionally, with the following ways of specifying IPPools(Pod Annotation, Namespace Annotation, CNI configuration file) you can also use wildcards '*', '?' and '[]' to match the desired IPPools. For example: ipam.spidernet.io/ippool: '{"ipv4": ["demo-v4-ippool1", "backup-ipv4*"]}'
->
->   1. '*': Matches zero or more characters. For example, "ab" can match "ab", "abc", "abcd", and so on.
->   2. '?': Matches a single character. For example, "a?c" can match "abc", "adc", "axc", and so on.
->   3. '[]': Matches a specified range of characters. You can specify the choices of characters inside the brackets, or use a hyphen to specify a character range. For example, "[abc]" can match any one of the characters "a", "b", or "c".
+> For the priority rules when specifying the SpiderIPPool, refer to the [Candidate Pool Acquisition](../concepts/ipam-des.md#candidate-pool-acquisition).
 
 #### Use Pod Annotation to Specify IP Pool
 
@@ -71,8 +64,8 @@ You can use annotations like `ipam.spidernet.io/ippool` or `ipam.spidernet.io/ip
 ```yaml
 ipam.spidernet.io/ippool: |-
   {
-    "ipv4": ["demo-v4-ippool1", "backup-ipv4-ippool", "wildcard-v4?"],
-    "ipv6": ["demo-v6-ippool1", "backup-ipv6-ippool", "wildcard-v6*"]
+    "ipv4": ["demo-v4-ippool1", "backup-ipv4-ippool"],
+    "ipv6": ["demo-v6-ippool1", "backup-ipv6-ippool"]
   }
 ```
 
@@ -83,11 +76,11 @@ When using the annotation `ipam.spidernet.io/ippools` for specifying multiple ne
 ```yaml
 ipam.spidernet.io/ippools: |-
   [{
-      "ipv4": ["demo-v4-ippool1", "wildcard-v4-ippool[123]"],
-      "ipv6": ["demo-v6-ippool1", "wildcard-v6-ippool[123]"]
+      "ipv4": ["demo-v4-ippool1"],
+      "ipv6": ["demo-v6-ippool1"],
    },{
-      "ipv4": ["demo-v4-ippool2", "wildcard-v4-ippool[456]"],
-      "ipv6": ["demo-v6-ippool2", "wildcard-v6-ippool[456]"],
+      "ipv4": ["demo-v4-ippool2"],
+      "ipv6": ["demo-v6-ippool2"],
       "cleangateway": true
   }]
 ```
@@ -96,13 +89,13 @@ ipam.spidernet.io/ippools: |-
 ipam.spidernet.io/ippools: |-
   [{
       "interface": "eth0",
-      "ipv4": ["demo-v4-ippool1", "wildcard-v4-ippool[123]"],
-      "ipv6": ["demo-v6-ippool1", "wildcard-v6-ippool[123]"],
+      "ipv4": ["demo-v4-ippool1"],
+      "ipv6": ["demo-v6-ippool1"],
       "cleangateway": true
    },{
       "interface": "net1",
-      "ipv4": ["demo-v4-ippool2", "wildcard-v4-ippool[456]"],
-      "ipv6": ["demo-v6-ippool2", "wildcard-v6-ippool[456]"],
+      "ipv4": ["demo-v4-ippool2"],
+      "ipv6": ["demo-v6-ippool2"],
       "cleangateway": false
   }]
 ```
@@ -119,8 +112,8 @@ apiVersion: v1
 kind: Namespace
 metadata:
   annotations:
-    ipam.spidernet.io/default-ipv4-ippool: '["ns-v4-ippool1", "ns-v4-ippool2", "wildcard-v4*"]'
-    ipam.spidernet.io/default-ipv6-ippool: '["ns-v6-ippool1", "ns-v6-ippool2", "wildcard-v6?"]'
+    ipam.spidernet.io/default-ipv4-ippool: '["ns-v4-ippool1","ns-v4-ippool2"]'
+    ipam.spidernet.io/default-ipv6-ippool: '["ns-v6-ippool1","ns-v6-ippool2"]'
   name: kube-system
 ...
 ```
@@ -138,8 +131,8 @@ You can specify the default IPv4 and IPv6 pools for an application in the CNI co
   "master": "eth0",
   "ipam": {
     "type": "spiderpool",
-    "default_ipv4_ippool":["default-v4-ippool", "backup-ipv4-ippool", "wildcard-v4-ippool[123]"],
-    "default_ipv6_ippool":["default-v6-ippool", "backup-ipv6-ippool", "wildcard-v6-ippool[456]"]
+    "default_ipv4_ippool":["default-v4-ippool","backup-ipv4-ippool"],
+    "default_ipv6_ippool":["default-v6-ippool","backup-ipv6-ippool"]
     }
 }
 ```
diff --git a/docs/usage/spider-subnet-zh_CN.md b/docs/usage/spider-subnet-zh_CN.md
index 403f191f8..35e4d00dc 100644
--- a/docs/usage/spider-subnet-zh_CN.md
+++ b/docs/usage/spider-subnet-zh_CN.md
@@ -32,7 +32,7 @@ SpiderSubnet 功能还支持众多的控制器，如：ReplicaSet、Deployment
 
 ### 安装 Spiderpool
 
-可参考 [安装教程](./readme-zh_CN.md) 来安装 Spiderpool. 请务必确保 helm 安装选项 `--ipam.spidersubnet.enable=true --ipam.spidersubnet.autoPool.enable=true`. 其中，`ipam.spidersubnet.autoPool.enable` 提供 `自动创建 IPPool` 的能力。
+可参考 [安装](./readme-zh_CN.md) 安装 Spiderpool. 其中，务必确保 helm 安装选项 `ipam.enableSpiderSubnet=true`
 
 ### 安装 CNI 配置
 
@@ -166,7 +166,7 @@ subnet-7   4         10.7.0.0/16   0                    10
 
 以下的示例 Yaml 中， 会创建 2 个副本的 Deployment 应用 ，其中：
 
-- `ipam.spidernet.io/subnet`：用于指定 Spiderpool 的子网，Spiderpool 会自动在该子网中随机选择一些 IP 来创建固定 IP 池，与本应用绑定，实现 IP 固定的效果。在本示例中该注解会为 Pod 创建 1 个对应子网的固定 IP 池。(注意：不支持通配符的形式。)
+- `ipam.spidernet.io/subnet`：用于指定 Spiderpool 的子网，Spiderpool 会自动在该子网中随机选择一些 IP 来创建固定 IP 池，与本应用绑定，实现 IP 固定的效果。在本示例中该注解会为 Pod 创建 1 个对应子网的固定 IP 池。
 
 - `ipam.spidernet.io/ippool-ip-number`：用于指定创建 IP 池 中 的 IP 数量。该 annotation 的写法支持两种方式：一种是数字的方式指定 IP 池的固定数量，例如 `ipam.spidernet.io/ippool-ip-number：1`；另一种方式是使用加号和数字指定 IP 池的相对数量，例如`ipam.spidernet.io/ippool-ip-number：+1`，即表示 IP 池中的数量会自动实时保持在应用的副本数的基础上多 1 个 IP，以解决应用在弹性扩缩容的时有临时的 IP 可用。
 
diff --git a/docs/usage/spider-subnet.md b/docs/usage/spider-subnet.md
index e5d247366..c44b8207e 100644
--- a/docs/usage/spider-subnet.md
+++ b/docs/usage/spider-subnet.md
@@ -33,7 +33,7 @@ This feature does not support the bare Pod.
 
 ### Install Spiderpool
 
-Refer to [Installation](./readme.md) to install Spiderpool. And make sure that the helm installs the option `--ipam.spidersubnet.enable=true --ipam.spidersubnet.autoPool.enable=true`. The `ipam.spidersubnet.autoPool.enable` provide the `Automatically create IPPool` ability.
+Refer to [Installation](./readme.md) to install Spiderpool. And make sure that the helm installs the option `ipam.enableSpiderSubnet=true`.
 
 ### Install CNI
 
@@ -167,7 +167,7 @@ subnet-7   4         10.7.0.0/16   0                    10
 
 The following YAML example creates two replicas of a Deployment application:
 
-- `ipam.spidernet.io/subnet`: specifies the Spiderpool subnet. Spiderpool automatically selects IP addresses from this subnet to create a fixed IP pool associated with the application, ensuring fixed IP assignment. (Notice: this feature don't support wildcard.)
+- `ipam.spidernet.io/subnet`: specifies the Spiderpool subnet. Spiderpool automatically selects IP addresses from this subnet to create a fixed IP pool associated with the application, ensuring fixed IP assignment.
 
 - `ipam.spidernet.io/ippool-ip-number`: specifies the number of IP addresses in the IP pool. This annotation can be written in two ways: specifying a fixed quantity using a numeric value, such as `ipam.spidernet.io/ippool-ip-number：1`, or specifying a relative quantity using a plus and a number, such as `ipam.spidernet.io/ippool-ip-number：+1`. The latter means that the IP pool will dynamically maintain an additional IP address based on the number of replicas, ensuring temporary IPs are available during elastic scaling.
 
diff --git a/pkg/applicationcontroller/applicationinformers/utils.go b/pkg/applicationcontroller/applicationinformers/utils.go
index 3337cb4c4..4e2c798a0 100644
--- a/pkg/applicationcontroller/applicationinformers/utils.go
+++ b/pkg/applicationcontroller/applicationinformers/utils.go
@@ -34,8 +34,8 @@ import (
 	"github.com/spidernet-io/spiderpool/pkg/types"
 )
 
-// ClusterSubnetAutoPoolDefaultRedundantIPNumber is a singleton recording cluster subnet AutoPool default redundant IP number.
-var ClusterSubnetAutoPoolDefaultRedundantIPNumber = new(int)
+// ClusterSubnetDefaultFlexibleIPNumber is a singleton recording cluster default Subnet flexible IP number.
+var ClusterSubnetDefaultFlexibleIPNumber = new(int)
 
 var errInvalidInput = func(str string) error {
 	return fmt.Errorf("invalid input '%s'", str)
@@ -229,8 +229,8 @@ func GetSubnetAnnoConfig(podAnnotations map[string]string, log *zap.Logger) (*ty
 			subnetAnnoConfig.AssignIPNum = ipNum
 		}
 	} else {
-		log.Sugar().Debugf("no specified IPPool IP number, default to use cluster subnet AutoPool default redundant IP number: %d", *ClusterSubnetAutoPoolDefaultRedundantIPNumber)
-		subnetAnnoConfig.FlexibleIPNum = ptr.To(*ClusterSubnetAutoPoolDefaultRedundantIPNumber)
+		log.Sugar().Debugf("no specified IPPool IP number, default to use cluster default subnet flexible IP number: %d", *ClusterSubnetDefaultFlexibleIPNumber)
+		subnetAnnoConfig.FlexibleIPNum = ptr.To(*ClusterSubnetDefaultFlexibleIPNumber)
 	}
 
 	// annotation: "ipam.spidernet.io/reclaim-ippool", reclaim IPPool or not (default true)
@@ -519,14 +519,3 @@ func AutoPoolIPVersionLabelValue(ipVersion types.IPVersion) string {
 
 	return constant.LabelValueIPVersionV6
 }
-
-// HasSubnetsAnnotation checks the given annotation whether contains 'ipam.spidernet.io/subnets' or 'ipam.spidernet.io/subnet' key-value pair
-func HasSubnetsAnnotation(anno map[string]string) bool {
-	_, ok := anno[constant.AnnoSpiderSubnets]
-	if ok {
-		return true
-	}
-
-	_, ok = anno[constant.AnnoSpiderSubnet]
-	return ok
-}
diff --git a/pkg/constant/k8s.go b/pkg/constant/k8s.go
index 116e3a6f9..d9c605123 100644
--- a/pkg/constant/k8s.go
+++ b/pkg/constant/k8s.go
@@ -160,14 +160,3 @@ const (
 )
 
 const WebhookMutateRoute = "/webhook-health-check"
-
-// CRD field
-const (
-	SpecIPVersionField = "spec.ipVersion"
-	SpecDefaultField   = "spec.default"
-)
-
-const (
-	Str4 = "4"
-	Str6 = "6"
-)
diff --git a/pkg/gcmanager/pod_cache.go b/pkg/gcmanager/pod_cache.go
index e83ef62d0..923e653a3 100644
--- a/pkg/gcmanager/pod_cache.go
+++ b/pkg/gcmanager/pod_cache.go
@@ -97,6 +97,7 @@ func (p *PodDatabase) ApplyPodEntry(podEntry *PodEntry) error {
 	podCache, ok := p.pods[ktypes.NamespacedName{Namespace: podEntry.Namespace, Name: podEntry.PodName}]
 	if !ok {
 		if len(p.pods) == p.maxCap {
+			// TODO (Icarus9913): add otel metric
 			p.Unlock()
 			return fmt.Errorf("podEntry database is out of capacity, discard podEntry '%+v'", *podEntry)
 		}
diff --git a/pkg/ipam/config.go b/pkg/ipam/config.go
index 5bd07ca6d..02d950589 100644
--- a/pkg/ipam/config.go
+++ b/pkg/ipam/config.go
@@ -19,8 +19,6 @@ type IPAMConfig struct {
 	EnableIPv6 bool
 
 	EnableSpiderSubnet                   bool
-	EnableAutoPoolForApplication         bool
-	EnableSpiderSubnetAutoPool           bool
 	EnableStatefulSet                    bool
 	EnableKubevirtStaticIP               bool
 	EnableReleaseConflictIPsForStateless bool
diff --git a/pkg/ipam/pool_selections.go b/pkg/ipam/pool_selections.go
index 1aa285432..741b611df 100644
--- a/pkg/ipam/pool_selections.go
+++ b/pkg/ipam/pool_selections.go
@@ -30,30 +30,23 @@ func (i *ipam) getPoolCandidates(ctx context.Context, addArgs *models.IpamAddArg
 	// If feature SpiderSubnet is enabled, select IPPool candidates through the
 	// Pod annotations "ipam.spidernet.io/subnet" or "ipam.spidernet.io/subnets". (expect orphan Pod controller)
 	if i.config.EnableSpiderSubnet {
-		if i.config.EnableAutoPoolForApplication {
-			fromSubnet, err := i.getPoolFromSubnetAnno(ctx, pod, *addArgs.IfName, addArgs.CleanGateway, podController)
-			if nil != err {
-				return nil, fmt.Errorf("failed to get IPPool candidates from Subnet: %v", err)
-			}
-			if fromSubnet != nil {
-				return ToBeAllocateds{fromSubnet}, nil
-			}
-		} else {
-			hasSubnetsAnnotation := applicationinformers.HasSubnetsAnnotation(pod.Annotations)
-			if hasSubnetsAnnotation {
-				return nil, fmt.Errorf("it's invalid to use '%s' or '%s' annotation when Auto-Pool feature is disabled", constant.AnnoSpiderSubnets, constant.AnnoSpiderSubnet)
-			}
+		fromSubnet, err := i.getPoolFromSubnetAnno(ctx, pod, *addArgs.IfName, addArgs.CleanGateway, podController)
+		if nil != err {
+			return nil, fmt.Errorf("failed to get IPPool candidates from Subnet: %v", err)
+		}
+		if fromSubnet != nil {
+			return ToBeAllocateds{fromSubnet}, nil
 		}
 	}
 
 	// Select IPPool candidates through the Pod annotation "ipam.spidernet.io/ippools".
 	if anno, ok := pod.Annotations[constant.AnnoPodIPPools]; ok {
-		return i.getPoolFromPodAnnoPools(ctx, anno, *addArgs.IfName)
+		return getPoolFromPodAnnoPools(ctx, anno, *addArgs.IfName)
 	}
 
 	// Select IPPool candidates through the Pod annotation "ipam.spidernet.io/ippool".
 	if anno, ok := pod.Annotations[constant.AnnoPodIPPool]; ok {
-		t, err := i.getPoolFromPodAnnoPool(ctx, anno, *addArgs.IfName, addArgs.CleanGateway)
+		t, err := getPoolFromPodAnnoPool(ctx, anno, *addArgs.IfName, addArgs.CleanGateway)
 		if err != nil {
 			return nil, err
 		}
@@ -71,11 +64,7 @@ func (i *ipam) getPoolCandidates(ctx context.Context, addArgs *models.IpamAddArg
 	}
 
 	// Select IPPool candidates through CNI network configuration.
-	t, err = i.getPoolFromNetConf(ctx, *addArgs.IfName, addArgs.DefaultIPV4IPPool, addArgs.DefaultIPV6IPPool, addArgs.CleanGateway)
-	if nil != err {
-		return nil, err
-	}
-	if t != nil {
+	if t := getPoolFromNetConf(ctx, *addArgs.IfName, addArgs.DefaultIPV4IPPool, addArgs.DefaultIPV6IPPool, addArgs.CleanGateway); t != nil {
 		return ToBeAllocateds{t}, nil
 	}
 
@@ -84,6 +73,7 @@ func (i *ipam) getPoolCandidates(ctx context.Context, addArgs *models.IpamAddArg
 	if err != nil {
 		return nil, err
 	}
+
 	return ToBeAllocateds{t}, nil
 }
 
@@ -311,7 +301,7 @@ func (i *ipam) applyThirdControllerAutoPool(ctx context.Context, subnetName stri
 	return pool, nil
 }
 
-func (i *ipam) getPoolFromPodAnnoPools(ctx context.Context, anno, currentNIC string) (ToBeAllocateds, error) {
+func getPoolFromPodAnnoPools(ctx context.Context, anno, currentNIC string) (ToBeAllocateds, error) {
 	logger := logutils.FromContext(ctx)
 	logger.Sugar().Infof("Use IPPools from Pod annotation '%s'", constant.AnnoPodIPPools)
 
@@ -322,27 +312,6 @@ func (i *ipam) getPoolFromPodAnnoPools(ctx context.Context, anno, currentNIC str
 		return nil, fmt.Errorf("%w: %v", errPrefix, err)
 	}
 
-	for index := range annoPodIPPools {
-		if len(annoPodIPPools[index].IPv4Pools) != 0 {
-			newPoolNames, hasWildcard, err := i.ipPoolManager.ParseWildcardPoolNameList(ctx, annoPodIPPools[index].IPv4Pools, constant.IPv4)
-			if nil != err {
-				return nil, err
-			}
-			if hasWildcard {
-				annoPodIPPools[index].IPv4Pools = newPoolNames
-			}
-		}
-		if len(annoPodIPPools[index].IPv6Pools) != 0 {
-			newPoolNames, hasWildcard, err := i.ipPoolManager.ParseWildcardPoolNameList(ctx, annoPodIPPools[index].IPv6Pools, constant.IPv6)
-			if nil != err {
-				return nil, err
-			}
-			if hasWildcard {
-				annoPodIPPools[index].IPv6Pools = newPoolNames
-			}
-		}
-	}
-
 	// validate and mutate the IPPools annotation value
 	err = validateAndMutateMultipleNICAnnotations(annoPodIPPools, currentNIC)
 	if nil != err {
@@ -373,7 +342,7 @@ func (i *ipam) getPoolFromPodAnnoPools(ctx context.Context, anno, currentNIC str
 	return tt, nil
 }
 
-func (i *ipam) getPoolFromPodAnnoPool(ctx context.Context, anno, nic string, cleanGateway bool) (*ToBeAllocated, error) {
+func getPoolFromPodAnnoPool(ctx context.Context, anno, nic string, cleanGateway bool) (*ToBeAllocated, error) {
 	logger := logutils.FromContext(ctx)
 	logger.Sugar().Infof("Use IPPools from Pod annotation '%s'", constant.AnnoPodIPPool)
 
@@ -383,29 +352,6 @@ func (i *ipam) getPoolFromPodAnnoPool(ctx context.Context, anno, nic string, cle
 		return nil, fmt.Errorf("%w: %v", errPrefix, err)
 	}
 
-	// check IPv4 PoolName wildcard
-	if len(annoPodIPPool.IPv4Pools) != 0 {
-		newPoolNames, hasWildcard, err := i.ipPoolManager.ParseWildcardPoolNameList(ctx, annoPodIPPool.IPv4Pools, constant.IPv4)
-		if nil != err {
-			return nil, err
-		}
-		// overwrite the annoPodIPPool
-		if hasWildcard {
-			annoPodIPPool.IPv4Pools = newPoolNames
-		}
-	}
-	// check IPv6 PoolName wildcard
-	if len(annoPodIPPool.IPv6Pools) != 0 {
-		newPoolNames, hasWildcard, err := i.ipPoolManager.ParseWildcardPoolNameList(ctx, annoPodIPPool.IPv6Pools, constant.IPv6)
-		if nil != err {
-			return nil, err
-		}
-		// overwrite the annoPodIPPool
-		if hasWildcard {
-			annoPodIPPool.IPv6Pools = newPoolNames
-		}
-	}
-
 	t := &ToBeAllocated{
 		NIC:          nic,
 		CleanGateway: cleanGateway,
@@ -440,25 +386,6 @@ func (i *ipam) getPoolFromNS(ctx context.Context, namespace, nic string, cleanGa
 		return nil, nil
 	}
 
-	if len(nsDefaultV4Pools) != 0 {
-		newPoolNames, hasWildcard, err := i.ipPoolManager.ParseWildcardPoolNameList(ctx, nsDefaultV4Pools, constant.IPv4)
-		if nil != err {
-			return nil, err
-		}
-		if hasWildcard {
-			nsDefaultV4Pools = newPoolNames
-		}
-	}
-	if len(nsDefaultV6Pools) != 0 {
-		newPoolNames, hasWildcard, err := i.ipPoolManager.ParseWildcardPoolNameList(ctx, nsDefaultV6Pools, constant.IPv6)
-		if nil != err {
-			return nil, err
-		}
-		if hasWildcard {
-			nsDefaultV6Pools = newPoolNames
-		}
-	}
-
 	logger := logutils.FromContext(ctx)
 	logger.Sugar().Infof("Use IPPools from Namespace annotation '%s'", constant.AnnotationPre+"/default-ipv(4/6)-ippool")
 
@@ -482,27 +409,9 @@ func (i *ipam) getPoolFromNS(ctx context.Context, namespace, nic string, cleanGa
 	return t, nil
 }
 
-func (i *ipam) getPoolFromNetConf(ctx context.Context, nic string, netConfV4Pool, netConfV6Pool []string, cleanGateway bool) (*ToBeAllocated, error) {
+func getPoolFromNetConf(ctx context.Context, nic string, netConfV4Pool, netConfV6Pool []string, cleanGateway bool) *ToBeAllocated {
 	if len(netConfV4Pool) == 0 && len(netConfV6Pool) == 0 {
-		return nil, nil
-	}
-	if len(netConfV4Pool) != 0 {
-		newPoolNames, hasWildcard, err := i.ipPoolManager.ParseWildcardPoolNameList(ctx, netConfV4Pool, constant.IPv4)
-		if nil != err {
-			return nil, err
-		}
-		if hasWildcard {
-			netConfV4Pool = newPoolNames
-		}
-	}
-	if len(netConfV6Pool) != 0 {
-		newPoolNames, hasWildcard, err := i.ipPoolManager.ParseWildcardPoolNameList(ctx, netConfV6Pool, constant.IPv6)
-		if nil != err {
-			return nil, err
-		}
-		if hasWildcard {
-			netConfV6Pool = newPoolNames
-		}
+		return nil
 	}
 
 	logger := logutils.FromContext(ctx)
@@ -525,14 +434,14 @@ func (i *ipam) getPoolFromNetConf(ctx context.Context, nic string, netConfV4Pool
 		})
 	}
 
-	return t, nil
+	return t
 }
 
 func (i *ipam) getClusterDefaultPools(ctx context.Context, nic string, cleanGateway bool) (*ToBeAllocated, error) {
 	ipPoolList, err := i.ipPoolManager.ListIPPools(
 		ctx,
 		constant.UseCache,
-		client.MatchingFields{constant.SpecDefaultField: strconv.FormatBool(true)},
+		client.MatchingFields{"spec.default": strconv.FormatBool(true)},
 	)
 	if err != nil {
 		return nil, err
diff --git a/pkg/ipam/utils.go b/pkg/ipam/utils.go
index c6f6b7b93..1049d632b 100644
--- a/pkg/ipam/utils.go
+++ b/pkg/ipam/utils.go
@@ -7,12 +7,13 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
+	"net"
+	"strconv"
+
 	appsv1 "k8s.io/api/apps/v1"
 	batchv1 "k8s.io/api/batch/v1"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/utils/strings/slices"
-	"net"
-	"strconv"
 
 	"github.com/spidernet-io/spiderpool/api/v1/agent/models"
 	subnetmanagercontrollers "github.com/spidernet-io/spiderpool/pkg/applicationcontroller/applicationinformers"
diff --git a/pkg/ippoolmanager/ippool_informer.go b/pkg/ippoolmanager/ippool_informer.go
index 09ec4ad5f..61b7a2201 100644
--- a/pkg/ippoolmanager/ippool_informer.go
+++ b/pkg/ippoolmanager/ippool_informer.go
@@ -50,7 +50,6 @@ type IPPoolController struct {
 type IPPoolControllerConfig struct {
 	IPPoolControllerWorkers       int
 	EnableSpiderSubnet            bool
-	EnableAutoPoolForApplication  bool
 	MaxWorkqueueLength            int
 	WorkQueueMaxRetries           int
 	LeaderRetryElectGap           time.Duration
@@ -268,7 +267,7 @@ func (ic *IPPoolController) processNextWorkItem() bool {
 
 func (ic *IPPoolController) handleIPPool(ctx context.Context, pool *spiderpoolv2beta1.SpiderIPPool) (err error) {
 	// checkout the Auto-created IPPools whether need to scale or clean up legacies
-	if ic.EnableSpiderSubnet && ic.EnableAutoPoolForApplication && IsAutoCreatedIPPool(pool) {
+	if ic.EnableSpiderSubnet && IsAutoCreatedIPPool(pool) {
 		err := ic.cleanAutoIPPoolLegacy(ctx, pool)
 		if nil != err {
 			return err
diff --git a/pkg/ippoolmanager/ippool_manager.go b/pkg/ippoolmanager/ippool_manager.go
index 53ebb2a04..4aa7609bb 100644
--- a/pkg/ippoolmanager/ippool_manager.go
+++ b/pkg/ippoolmanager/ippool_manager.go
@@ -7,7 +7,6 @@ import (
 	"context"
 	"fmt"
 	"net"
-	"path/filepath"
 
 	"go.uber.org/zap"
 	corev1 "k8s.io/api/core/v1"
@@ -36,7 +35,6 @@ type IPPoolManager interface {
 	AllocateIP(ctx context.Context, poolName, nic string, pod *corev1.Pod, podController types.PodTopController) (*models.IPConfig, error)
 	ReleaseIP(ctx context.Context, poolName string, ipAndUIDs []types.IPAndUID) error
 	UpdateAllocatedIPs(ctx context.Context, poolName, namespacedName string, ipAndCIDs []types.IPAndUID) error
-	ParseWildcardPoolNameList(ctx context.Context, PoolNames []string, ipVersion types.IPVersion) (newPoolNames []string, hasWildcard bool, err error)
 }
 
 type ipPoolManager struct {
@@ -358,42 +356,3 @@ func (im *ipPoolManager) UpdateAllocatedIPs(ctx context.Context, poolName, names
 
 	return nil
 }
-
-func (im *ipPoolManager) ParseWildcardPoolNameList(ctx context.Context, poolNamesArr []string, ipVersion types.IPVersion) (newPoolNames []string, hasWildcard bool, err error) {
-	if HasWildcardInSlice(poolNamesArr) {
-		var ipVersionStr string
-		if ipVersion == constant.IPv4 {
-			ipVersionStr = constant.Str4
-		} else {
-			ipVersionStr = constant.Str6
-		}
-
-		poolList, err := im.ListIPPools(ctx, constant.UseCache, client.MatchingFields{constant.SpecIPVersionField: ipVersionStr})
-		if nil != err {
-			return nil, false, err
-		}
-
-		newPoolNamesArr := []string{}
-		for _, tmpStr := range poolNamesArr {
-			if HasWildcardInStr(tmpStr) {
-				for _, tmpPool := range poolList.Items {
-					isMatch, err := filepath.Match(tmpStr, tmpPool.Name)
-					if nil != err {
-						return nil, false, fmt.Errorf("failed to match wildcard: IPv%d PoolName pattern '%s', character '%s', error: %v", ipVersion, tmpStr, tmpPool.Name, err)
-					}
-					// wildcard matches
-					if isMatch {
-						newPoolNamesArr = append(newPoolNamesArr, tmpPool.Name)
-					}
-				}
-			} else {
-				// original IPPool name
-				newPoolNamesArr = append(newPoolNamesArr, tmpStr)
-			}
-		}
-
-		return newPoolNamesArr, true, nil
-	}
-
-	return poolNamesArr, false, nil
-}
diff --git a/pkg/ippoolmanager/ippool_validate.go b/pkg/ippoolmanager/ippool_validate.go
index b8288e6dc..5d281f797 100644
--- a/pkg/ippoolmanager/ippool_validate.go
+++ b/pkg/ippoolmanager/ippool_validate.go
@@ -8,7 +8,6 @@ import (
 	"fmt"
 	"strconv"
 
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/validation"
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"k8s.io/utils/strings/slices"
@@ -200,10 +199,8 @@ func (iw *IPPoolWebhook) validateIPPoolCIDR(ctx context.Context, ipPool *spiderp
 
 	for _, pool := range ipPoolList.Items {
 		if *pool.Spec.IPVersion == *ipPool.Spec.IPVersion {
-			// since we met already exist IPPool resource, we just return the error to avoid the following taxing operations.
-			// the user can also use k8s 'errors.IsAlreadyExists' to get the right error type assertion.
 			if pool.Name == ipPool.Name {
-				return field.InternalError(subnetField, fmt.Errorf("IPPool %s %s", ipPool.Name, metav1.StatusReasonAlreadyExists))
+				return field.InternalError(subnetField, fmt.Errorf("IPPool %s already exists", ipPool.Name))
 			}
 
 			if pool.Spec.Subnet == ipPool.Spec.Subnet {
diff --git a/pkg/ippoolmanager/ippool_webhook.go b/pkg/ippoolmanager/ippool_webhook.go
index 28ea7a2f7..ef962b06f 100644
--- a/pkg/ippoolmanager/ippool_webhook.go
+++ b/pkg/ippoolmanager/ippool_webhook.go
@@ -6,11 +6,9 @@ package ippoolmanager
 import (
 	"context"
 	"errors"
-	"strings"
 
 	"go.uber.org/zap"
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	ctrl "sigs.k8s.io/controller-runtime"
@@ -79,20 +77,12 @@ func (iw *IPPoolWebhook) ValidateCreate(ctx context.Context, obj runtime.Object)
 	logger.Sugar().Debugf("Request IPPool: %+v", *ipPool)
 
 	if errs := iw.validateCreateIPPoolWhileEnableSpiderSubnet(logutils.IntoContext(ctx, logger), ipPool); len(errs) != 0 {
-		aggregatedErr := errs.ToAggregate()
-		logger.Sugar().Errorf("Failed to create IPPool: %s", aggregatedErr)
-		// the user will receive the following errors rather than K8S API server specific typed errors.
-		// Refer to https://github.com/spidernet-io/spiderpool/issues/3321
-		switch {
-		case strings.Contains(aggregatedErr.Error(), string(metav1.StatusReasonAlreadyExists)):
-			return nil, apierrors.NewAlreadyExists(spiderpoolv2beta1.Resource(constant.KindSpiderIPPool), ipPool.Name)
-		default:
-			return nil, apierrors.NewInvalid(
-				schema.GroupKind{Group: constant.SpiderpoolAPIGroup, Kind: constant.KindSpiderIPPool},
-				ipPool.Name,
-				errs,
-			)
-		}
+		logger.Sugar().Errorf("Failed to create IPPool: %v", errs.ToAggregate().Error())
+		return nil, apierrors.NewInvalid(
+			schema.GroupKind{Group: constant.SpiderpoolAPIGroup, Kind: constant.KindSpiderIPPool},
+			ipPool.Name,
+			errs,
+		)
 	}
 
 	return nil, nil
diff --git a/pkg/ippoolmanager/utils.go b/pkg/ippoolmanager/utils.go
index 28e118673..f0fbf1127 100644
--- a/pkg/ippoolmanager/utils.go
+++ b/pkg/ippoolmanager/utils.go
@@ -136,26 +136,3 @@ func findAllocatedIPFromRecords(allocatedRecords spiderpoolv2beta1.PoolIPAllocat
 
 	return "", false
 }
-
-// HasWildcardInStr checks whether the wildcard '*', '?', '[]' exists in the given string variable
-func HasWildcardInStr(str string) bool {
-	switch {
-	case strings.Contains(str, "?"):
-		return true
-	case strings.Contains(str, "*"):
-		return true
-	case strings.Contains(str, "[") && strings.Contains(str, "]"):
-		return true
-	}
-
-	return false
-}
-
-func HasWildcardInSlice(arr []string) bool {
-	for _, str := range arr {
-		if HasWildcardInStr(str) {
-			return true
-		}
-	}
-	return false
-}
diff --git a/pkg/multuscniconfig/multusconfig_informer.go b/pkg/multuscniconfig/multusconfig_informer.go
index 569adf2a8..00d0e44f7 100644
--- a/pkg/multuscniconfig/multusconfig_informer.go
+++ b/pkg/multuscniconfig/multusconfig_informer.go
@@ -505,6 +505,7 @@ func generateMacvlanCNIConf(disableIPAM bool, multusConfSpec spiderpoolv2beta1.M
 		}
 	}
 
+	// TODO(Icarus9913): customize the macvlan mode
 	netConf := MacvlanNetConf{
 		Type:   constant.MacvlanCNI,
 		Master: masterName,
diff --git a/pkg/reservedipmanager/reservedip_manager.go b/pkg/reservedipmanager/reservedip_manager.go
index 54c57251f..34caafd42 100644
--- a/pkg/reservedipmanager/reservedip_manager.go
+++ b/pkg/reservedipmanager/reservedip_manager.go
@@ -76,7 +76,7 @@ func (rm *reservedIPManager) AssembleReservedIPs(ctx context.Context, version ty
 		return nil, err
 	}
 
-	rIPList, err := rm.ListReservedIPs(ctx, constant.UseCache, client.MatchingFields{constant.SpecIPVersionField: strconv.FormatInt(version, 10)})
+	rIPList, err := rm.ListReservedIPs(ctx, constant.UseCache, client.MatchingFields{"spec.ipVersion": strconv.FormatInt(version, 10)})
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/subnetmanager/subnet_validate.go b/pkg/subnetmanager/subnet_validate.go
index 70ca92f38..f4dbf8e19 100644
--- a/pkg/subnetmanager/subnet_validate.go
+++ b/pkg/subnetmanager/subnet_validate.go
@@ -8,7 +8,6 @@ import (
 	"fmt"
 	"strconv"
 
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/validation/field"
 
 	"github.com/spidernet-io/spiderpool/pkg/constant"
@@ -196,10 +195,8 @@ func (sw *SubnetWebhook) validateSubnetCIDR(ctx context.Context, subnet *spiderp
 
 	for _, s := range subnetList.Items {
 		if *s.Spec.IPVersion == *subnet.Spec.IPVersion {
-			// since we met already exist Subnet resource, we just return the error to avoid the following taxing operations.
-			// the user can also use k8s 'errors.IsAlreadyExists' to get the right error type assertion.
 			if s.Name == subnet.Name {
-				return field.InternalError(subnetField, fmt.Errorf("subnet %s %s", subnet.Name, metav1.StatusReasonAlreadyExists))
+				return field.InternalError(subnetField, fmt.Errorf("subnet %s already exists", subnet.Name))
 			}
 
 			overlap, err := spiderpoolip.IsCIDROverlap(*subnet.Spec.IPVersion, subnet.Spec.Subnet, s.Spec.Subnet)
diff --git a/pkg/subnetmanager/subnet_webhook.go b/pkg/subnetmanager/subnet_webhook.go
index b7dafcb42..6870e6d39 100644
--- a/pkg/subnetmanager/subnet_webhook.go
+++ b/pkg/subnetmanager/subnet_webhook.go
@@ -6,11 +6,9 @@ package subnetmanager
 import (
 	"context"
 	"errors"
-	"strings"
 
 	"go.uber.org/zap"
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	ctrl "sigs.k8s.io/controller-runtime"
@@ -78,20 +76,12 @@ func (sw *SubnetWebhook) ValidateCreate(ctx context.Context, obj runtime.Object)
 	logger.Sugar().Debugf("Request Subnet: %+v", *subnet)
 
 	if errs := sw.validateCreateSubnet(logutils.IntoContext(ctx, logger), subnet); len(errs) != 0 {
-		aggregatedErr := errs.ToAggregate()
-		logger.Sugar().Errorf("Failed to create Subnet: %s", aggregatedErr)
-		// the user will receive the following errors rather than K8S API server specific typed errors.
-		// Refer to https://github.com/spidernet-io/spiderpool/issues/3321
-		switch {
-		case strings.Contains(aggregatedErr.Error(), string(metav1.StatusReasonAlreadyExists)):
-			return nil, apierrors.NewAlreadyExists(spiderpoolv2beta1.Resource(constant.KindSpiderSubnet), subnet.Name)
-		default:
-			return nil, apierrors.NewInvalid(
-				schema.GroupKind{Group: constant.SpiderpoolAPIGroup, Kind: constant.KindSpiderSubnet},
-				subnet.Name,
-				errs,
-			)
-		}
+		logger.Sugar().Errorf("Failed to create Subnet: %v", errs.ToAggregate().Error())
+		return nil, apierrors.NewInvalid(
+			schema.GroupKind{Group: constant.SpiderpoolAPIGroup, Kind: constant.KindSpiderSubnet},
+			subnet.Name,
+			errs,
+		)
 	}
 
 	return nil, nil
diff --git a/pkg/types/k8s.go b/pkg/types/k8s.go
index 2caa44659..1c9804611 100644
--- a/pkg/types/k8s.go
+++ b/pkg/types/k8s.go
@@ -107,14 +107,3 @@ type AutoPoolProperty struct {
 	// AnnoPoolIPNumberVal serves for AutoPool annotation to explain whether it is IP number flexible or fixed.
 	AnnoPoolIPNumberVal string
 }
-
-type SpiderpoolConfigmapConfig struct {
-	IpamUnixSocketPath                            string `yaml:"ipamUnixSocketPath"`
-	EnableIPv4                                    bool   `yaml:"enableIPv4"`
-	EnableIPv6                                    bool   `yaml:"enableIPv6"`
-	EnableStatefulSet                             bool   `yaml:"enableStatefulSet"`
-	EnableKubevirtStaticIP                        bool   `yaml:"enableKubevirtStaticIP"`
-	EnableSpiderSubnet                            bool   `yaml:"enableSpiderSubnet"`
-	EnableAutoPoolForApplication                  bool   `yaml:"enableAutoPoolForApplication"`
-	ClusterSubnetAutoPoolDefaultRedundantIPNumber int    `yaml:"clusterSubnetAutoPoolDefaultRedundantIPNumber"`
-}


Test patch:
diff --git a/.github/workflows/e2e-init.yaml b/.github/workflows/e2e-init.yaml
index fecc4d030..888e1953d 100644
--- a/.github/workflows/e2e-init.yaml
+++ b/.github/workflows/e2e-init.yaml
@@ -134,16 +134,10 @@ jobs:
       # test against commit version
       # https://github.com/kubernetes-sigs/kind/issues/2863
       - name: Setup Kind Cluster
-        uses: nick-invision/retry@v3
+        uses: nick-invision/retry@v2
         with:
           timeout_minutes: 20
           max_attempts: 3
-          on_retry_command: |
-            echo "debug"
-            systemctl status docker
-            journalctl -xeu docker
-            echo "restart docker before trying again"
-            systemctl restart docker
           command: |
             INSTALL_OVS_VALUE=true
             MINIMAL_VERSION=1.24.3
diff --git a/pkg/applicationcontroller/applicationinformers/utils_test.go b/pkg/applicationcontroller/applicationinformers/utils_test.go
index e62544b73..0ef533f35 100644
--- a/pkg/applicationcontroller/applicationinformers/utils_test.go
+++ b/pkg/applicationcontroller/applicationinformers/utils_test.go
@@ -631,28 +631,4 @@ var _ = Describe("Utils", func() {
 			Expect(labelValue).To(Equal(constant.LabelValueIPVersionV6))
 		})
 	})
-
-	Context("HasSubnetsAnnotation", func() {
-		var anno map[string]string
-		BeforeEach(func() {
-			anno = make(map[string]string)
-		})
-
-		It("has 'ipam.spidernet.io/subnets' annotation", func() {
-			anno[constant.AnnoSpiderSubnets] = "subnet-demo1"
-			hasSubnetsAnnotation := HasSubnetsAnnotation(anno)
-			Expect(hasSubnetsAnnotation).To(BeTrue())
-		})
-
-		It("has 'ipam.spidernet.io/subnet' annotation", func() {
-			anno[constant.AnnoSpiderSubnet] = "subnet-demo2"
-			hasSubnetsAnnotation := HasSubnetsAnnotation(anno)
-			Expect(hasSubnetsAnnotation).To(BeTrue())
-		})
-
-		It("no subnets/subnet annotation", func() {
-			hasSubnetsAnnotation := HasSubnetsAnnotation(anno)
-			Expect(hasSubnetsAnnotation).To(BeFalse())
-		})
-	})
 })
diff --git a/pkg/ippoolmanager/ippool_manager_suite_test.go b/pkg/ippoolmanager/ippool_manager_suite_test.go
index 655286f51..aa4b96b8e 100644
--- a/pkg/ippoolmanager/ippool_manager_suite_test.go
+++ b/pkg/ippoolmanager/ippool_manager_suite_test.go
@@ -61,17 +61,10 @@ var _ = BeforeSuite(func() {
 			ipPool := raw.(*spiderpoolv2beta1.SpiderIPPool)
 			return []string{ipPool.GetObjectMeta().GetName()}
 		}).
-		WithIndex(&spiderpoolv2beta1.SpiderIPPool{}, constant.SpecDefaultField, func(raw client.Object) []string {
+		WithIndex(&spiderpoolv2beta1.SpiderIPPool{}, "spec.default", func(raw client.Object) []string {
 			ipPool := raw.(*spiderpoolv2beta1.SpiderIPPool)
 			return []string{strconv.FormatBool(*ipPool.Spec.Default)}
 		}).
-		WithIndex(&spiderpoolv2beta1.SpiderIPPool{}, constant.SpecIPVersionField, func(raw client.Object) []string {
-			ipPool := raw.(*spiderpoolv2beta1.SpiderIPPool)
-			if ipPool.Spec.IPVersion != nil {
-				return []string{strconv.FormatInt(*ipPool.Spec.IPVersion, 10)}
-			}
-			return []string{}
-		}).
 		WithStatusSubresource(&spiderpoolv2beta1.SpiderIPPool{}).
 		Build()
 
@@ -83,7 +76,7 @@ var _ = BeforeSuite(func() {
 			ipPool := raw.(*spiderpoolv2beta1.SpiderIPPool)
 			return []string{ipPool.GetObjectMeta().GetName()}
 		}).
-		WithIndex(&spiderpoolv2beta1.SpiderIPPool{}, constant.SpecDefaultField, func(raw client.Object) []string {
+		WithIndex(&spiderpoolv2beta1.SpiderIPPool{}, "spec.default", func(raw client.Object) []string {
 			ipPool := raw.(*spiderpoolv2beta1.SpiderIPPool)
 			return []string{strconv.FormatBool(*ipPool.Spec.Default)}
 		}).
diff --git a/pkg/ippoolmanager/ippool_manager_test.go b/pkg/ippoolmanager/ippool_manager_test.go
index f1fa2ca71..f80b31b88 100644
--- a/pkg/ippoolmanager/ippool_manager_test.go
+++ b/pkg/ippoolmanager/ippool_manager_test.go
@@ -659,61 +659,5 @@ var _ = Describe("IPPoolManager", Label("ippool_manager_test"), func() {
 				Expect(newRecords[ip].PodUID).To(Equal(newUID))
 			})
 		})
-
-		Describe("ParseWildcardPoolNameList", func() {
-			It("standard IPPool names", func() {
-				poolNamesArr := []string{"pool1", "pool2"}
-				newPoolNames, hasWildcard, err := ipPoolManager.ParseWildcardPoolNameList(ctx, poolNamesArr, constant.IPv4)
-				Expect(err).NotTo(HaveOccurred())
-				Expect(hasWildcard).To(BeFalse())
-				Expect(newPoolNames).To(Equal(poolNamesArr))
-			})
-
-			It("wildcard IPPool name", func() {
-				ipPoolT.Spec.IPVersion = ptr.To(constant.IPv4)
-				err := fakeClient.Create(ctx, ipPoolT)
-				Expect(err).NotTo(HaveOccurred())
-
-				poolNamesArr := []string{"ippool*", "pp1"}
-				newPoolNames, hasWildcard, err := ipPoolManager.ParseWildcardPoolNameList(ctx, poolNamesArr, constant.IPv4)
-				Expect(err).NotTo(HaveOccurred())
-				Expect(hasWildcard).To(BeTrue())
-				Expect(newPoolNames).To(HaveLen(2))
-				Expect(newPoolNames[0]).To(Equal(ipPoolName))
-			})
-
-			It("wildcard IPPool name with no matched", func() {
-				ipPoolT.Spec.IPVersion = ptr.To(constant.IPv4)
-				err := fakeClient.Create(ctx, ipPoolT)
-				Expect(err).NotTo(HaveOccurred())
-
-				// this wildcard would not match any IPPools' name
-				poolNamesArr := []string{"aaa*"}
-				newPoolNames, hasWildcard, err := ipPoolManager.ParseWildcardPoolNameList(ctx, poolNamesArr, constant.IPv4)
-				Expect(err).NotTo(HaveOccurred())
-				Expect(hasWildcard).To(BeTrue())
-				Expect(newPoolNames).To(HaveLen(0))
-			})
-
-			It("invalid wildcard", func() {
-				ipPoolT.Spec.IPVersion = ptr.To(constant.IPv6)
-				err := fakeClient.Create(ctx, ipPoolT)
-				Expect(err).NotTo(HaveOccurred())
-
-				poolNamesArr := []string{"p1", "pool*", "[ippool]["}
-				_, _, err = ipPoolManager.ParseWildcardPoolNameList(ctx, poolNamesArr, constant.IPv6)
-				Expect(err).To(HaveOccurred())
-			})
-
-			It("failed to call ListIPPools with wildcard usage", func() {
-				patches := gomonkey.ApplyMethodReturn(fakeClient, "List", constant.ErrUnknown)
-				defer patches.Reset()
-
-				poolNamesArr := []string{"ippool*", "pp1"}
-				_, _, err := ipPoolManager.ParseWildcardPoolNameList(ctx, poolNamesArr, constant.IPv4)
-				Expect(err).To(HaveOccurred())
-				Expect(err).To(MatchError(constant.ErrUnknown))
-			})
-		})
 	})
 })
diff --git a/pkg/ippoolmanager/ippool_webhook_test.go b/pkg/ippoolmanager/ippool_webhook_test.go
index 07766f5ed..e356e43ce 100644
--- a/pkg/ippoolmanager/ippool_webhook_test.go
+++ b/pkg/ippoolmanager/ippool_webhook_test.go
@@ -680,7 +680,7 @@ var _ = Describe("IPPoolWebhook", Label("ippool_webhook_test"), func() {
 					Expect(err).NotTo(HaveOccurred())
 
 					warns, err := ipPoolWebhook.ValidateCreate(ctx, ipPoolT)
-					Expect(apierrors.IsAlreadyExists(err)).To(BeTrue())
+					Expect(apierrors.IsInvalid(err)).To(BeTrue())
 					Expect(warns).To(BeNil())
 				})
 
diff --git a/pkg/ippoolmanager/utils_test.go b/pkg/ippoolmanager/utils_test.go
index b5e374d46..909049de0 100644
--- a/pkg/ippoolmanager/utils_test.go
+++ b/pkg/ippoolmanager/utils_test.go
@@ -328,28 +328,4 @@ var _ = Describe("IPPoolManager-utils", Label("ippool_manager_utils"), func() {
 			Expect(hasFound).To(BeFalse())
 		})
 	})
-
-	Context("Test Wildcard", func() {
-		It("For single string variable", func() {
-			hasWildcardInStr := HasWildcardInStr("pool")
-			Expect(hasWildcardInStr).To(BeFalse())
-
-			hasWildcardInStr = HasWildcardInStr("pool?")
-			Expect(hasWildcardInStr).To(BeTrue())
-
-			hasWildcardInStr = HasWildcardInStr("pool*")
-			Expect(hasWildcardInStr).To(BeTrue())
-
-			hasWildcardInStr = HasWildcardInStr("pool[abc]")
-			Expect(hasWildcardInStr).To(BeTrue())
-		})
-
-		It("For string slice", func() {
-			hasWildcardInSlice := HasWildcardInSlice([]string{"pool1", "pool2", "pool3"})
-			Expect(hasWildcardInSlice).To(BeFalse())
-
-			hasWildcardInSlice = HasWildcardInSlice([]string{"pool1", "v4pool*", "pool2"})
-			Expect(hasWildcardInSlice).To(BeTrue())
-		})
-	})
 })
diff --git a/pkg/reservedipmanager/reservedip_manager_suite_test.go b/pkg/reservedipmanager/reservedip_manager_suite_test.go
index 743a2333a..82c174edc 100644
--- a/pkg/reservedipmanager/reservedip_manager_suite_test.go
+++ b/pkg/reservedipmanager/reservedip_manager_suite_test.go
@@ -11,12 +11,12 @@ import (
 	. "github.com/onsi/gomega"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
+
 	k8sscheme "k8s.io/client-go/kubernetes/scheme"
 	k8stesting "k8s.io/client-go/testing"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	"github.com/spidernet-io/spiderpool/pkg/constant"
 	spiderpoolv2beta1 "github.com/spidernet-io/spiderpool/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1"
 	"github.com/spidernet-io/spiderpool/pkg/reservedipmanager"
 )
@@ -44,7 +44,7 @@ var _ = BeforeSuite(func() {
 			rIP := raw.(*spiderpoolv2beta1.SpiderReservedIP)
 			return []string{rIP.GetObjectMeta().GetName()}
 		}).
-		WithIndex(&spiderpoolv2beta1.SpiderReservedIP{}, constant.SpecIPVersionField, func(raw client.Object) []string {
+		WithIndex(&spiderpoolv2beta1.SpiderReservedIP{}, "spec.ipVersion", func(raw client.Object) []string {
 			rIP := raw.(*spiderpoolv2beta1.SpiderReservedIP)
 			return []string{strconv.FormatInt(*rIP.Spec.IPVersion, 10)}
 		}).
@@ -58,7 +58,7 @@ var _ = BeforeSuite(func() {
 			rIP := raw.(*spiderpoolv2beta1.SpiderReservedIP)
 			return []string{rIP.GetObjectMeta().GetName()}
 		}).
-		WithIndex(&spiderpoolv2beta1.SpiderReservedIP{}, constant.SpecIPVersionField, func(raw client.Object) []string {
+		WithIndex(&spiderpoolv2beta1.SpiderReservedIP{}, "spec.ipVersion", func(raw client.Object) []string {
 			rIP := raw.(*spiderpoolv2beta1.SpiderReservedIP)
 			return []string{strconv.FormatInt(*rIP.Spec.IPVersion, 10)}
 		}).
diff --git a/pkg/subnetmanager/subnet_webhook_test.go b/pkg/subnetmanager/subnet_webhook_test.go
index 772d0553f..5a9da1517 100644
--- a/pkg/subnetmanager/subnet_webhook_test.go
+++ b/pkg/subnetmanager/subnet_webhook_test.go
@@ -478,7 +478,7 @@ var _ = Describe("SubnetWebhook", Label("subnet_webhook_test"), func() {
 					Expect(err).NotTo(HaveOccurred())
 
 					warns, err := subnetWebhook.ValidateCreate(ctx, subnetT)
-					Expect(apierrors.IsAlreadyExists(err)).To(BeTrue())
+					Expect(apierrors.IsInvalid(err)).To(BeTrue())
 					Expect(warns).To(BeNil())
 				})
 
diff --git a/test/Makefile b/test/Makefile
index 1910e4eae..68c9e45df 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -239,9 +239,9 @@ setup_spiderpool:
 			HELM_OPTION+=" --set multus.enableMultusConfig=false " ; \
 		fi ; \
 		if [ "$(E2E_SPIDERPOOL_ENABLE_SUBNET)" == "true" ] ; then \
-		    HELM_OPTION+=" --set ipam.spidersubnet.enable=true " ; \
+		    HELM_OPTION+=" --set ipam.enableSpiderSubnet=true " ; \
 		else \
-		    HELM_OPTION+=" --set ipam.spidersubnet.enable=false " ; \
+		    HELM_OPTION+=" --set ipam.enableSpiderSubnet=false " ; \
 		fi ; \
 		if [ "$(INSTALL_SRIOV)" == "true" ] ; then \
 			HELM_OPTION+=" --set sriov.install=true " ; \
diff --git a/test/doc/annotation.md b/test/doc/annotation.md
index 184411e52..3992cd3c5 100644
--- a/test/doc/annotation.md
+++ b/test/doc/annotation.md
@@ -8,7 +8,6 @@
 | A00004  | Take a test with the Priority: pod annotation > namespace annotation > specified in a CNI profile                           | p1       |       | done   |       |
 | A00005  | The "IPPools" annotation has the higher Priority over the "IPPool" annotation                                               | p1       |       | done   |       |
 | A00006  | The namespace annotation has precedence over global default IPPool                                                          | p1       | true  | done   |       |
-| A00007  | Use wildcard for namespace annotation to specify IPPools                                                                    | p1       | true  | done   |       |
 | A00008  | Successfully run an annotated multi-container pod                                                                           | p2       |       | done   |       |
 | A00009  | Modify the annotated IPPool for a specified Deployment pod<br />Modify the annotated IPPool for a specified StatefulSet pod | p2       |       | done   |       |
 | A00010  | Modify the annotated IPPool for a pod running on multiple NICs                                                              | p3       |       | done   |       |
@@ -16,4 +15,3 @@
 | A00012  | Specify the default route NIC through Pod annotation: `ipam.spidernet.io/default-route-nic`                                 | p2       |       | done   |       |
 | A00013  | It's invalid to specify one NIC corresponding IPPool in IPPools annotation with multiple NICs                               | p2       |       | done   |       |
 | A00014  | It's invalid to specify same NIC name for IPPools annotation with multiple NICs                                             | p2       |       | done   |       |
-| A00015  | Use wildcard for 'ipam.spidernet.io/ippools' annotation to specify IPPools                                                  | p2       |       | done   |       |
diff --git a/test/doc/subnet.md b/test/doc/subnet.md
index 97df0c1bb..5d55dde90 100644
--- a/test/doc/subnet.md
+++ b/test/doc/subnet.md
@@ -25,4 +25,3 @@
 | I00021  | Pod works correctly when multiple NICs are specified by annotations for applications of the same name                               | p3       |       | done    |       |
 | I00022  | Dirty data in the subnet should be recycled.                                                                                        | p3       |       | done    |       |
 | I00023  | SpiderSubnet feature doesn't support orphan pod                                                                                     | p2       |       | done    |       |
-| I00024  | The Pod would not be setup and no auto Pools created when the SpiderSubnet AutoPool feature is disabled                             | p2       |       | done    |       |
diff --git a/test/e2e/annotation/annotation_test.go b/test/e2e/annotation/annotation_test.go
index 523f01db5..a850c9236 100644
--- a/test/e2e/annotation/annotation_test.go
+++ b/test/e2e/annotation/annotation_test.go
@@ -346,19 +346,11 @@ var _ = Describe("test annotation", Label("annotation"), func() {
 			})
 		})
 
-		It(`the "ippools" annotation has the higher priority over the "ippool" annotation, and we'll use wildcard to specify the annotation`, Label("A00005", "A00015"), func() {
+		It(`the "ippools" annotation has the higher priority over the "ippool" annotation`, Label("A00005"), func() {
 			// Generate IPPool annotation string
 			podIppoolAnnoStr = common.GeneratePodIPPoolAnnotations(frame, common.NIC1, globalDefaultV4IpoolList, globalDefaultV6IpoolList)
-			var tmpV4PoolNameList, tmpV6PoolNameList []string
-			if frame.Info.IpV4Enabled {
-				tmpV4PoolNameList = []string{fmt.Sprintf("%s*", v4PoolNameList[0])}
-			}
-			if frame.Info.IpV6Enabled {
-				tmpV6PoolNameList = []string{fmt.Sprintf("%s*", v6PoolNameList[0])}
-			}
-			podIppoolsAnnoStr = common.GeneratePodIPPoolsAnnotations(frame, common.NIC1, cleanGateway, tmpV4PoolNameList, tmpV6PoolNameList)
-			GinkgoWriter.Printf("Annotation '%s' value is '%s'\n", pkgconstant.AnnoPodIPPools, podIppoolsAnnoStr)
-			GinkgoWriter.Printf("Annotation '%s' value is '%s'\n", pkgconstant.AnnoPodIPPool, podIppoolAnnoStr)
+			// Generate IPPools annotation string
+			podIppoolsAnnoStr = common.GeneratePodIPPoolsAnnotations(frame, common.NIC1, cleanGateway, v4PoolNameList, v6PoolNameList)
 
 			// Generate Pod Yaml with IPPool annotations and IPPools annotations
 			podYaml := common.GenerateExamplePodYaml(podName, nsName)
@@ -367,7 +359,7 @@ var _ = Describe("test annotation", Label("annotation"), func() {
 				pkgconstant.AnnoPodIPPools: podIppoolsAnnoStr,
 			}
 			Expect(podYaml).NotTo(BeNil())
-			GinkgoWriter.Println("Successful to generate Pod Yaml with IPPool annotations and IPPools annotations")
+			GinkgoWriter.Printf("Successful to generate Pod Yaml with IPPool annotations and IPPools annotations")
 
 			// The "ippools" annotation has a higher priority than the "ippool" annotation.
 			checkAnnotationPriority(podYaml, podName, nsName, v4PoolNameList, v6PoolNameList)
@@ -424,11 +416,11 @@ var _ = Describe("test annotation", Label("annotation"), func() {
 				namespaceObject.Annotations = make(map[string]string)
 				if frame.Info.IpV4Enabled {
 					v4IppoolAnnoValue := types.AnnoNSDefautlV4PoolValue{}
-					common.SetNamespaceIppoolAnnotation(v4IppoolAnnoValue, namespaceObject, []string{fmt.Sprintf("%s*", v4PoolName)}, pkgconstant.AnnoNSDefautlV4Pool)
+					common.SetNamespaceIppoolAnnotation(v4IppoolAnnoValue, namespaceObject, v4PoolNameList, pkgconstant.AnnoNSDefautlV4Pool)
 				}
 				if frame.Info.IpV6Enabled {
 					v6IppoolAnnoValue := types.AnnoNSDefautlV6PoolValue{}
-					common.SetNamespaceIppoolAnnotation(v6IppoolAnnoValue, namespaceObject, []string{fmt.Sprintf("%s*", v6PoolName)}, pkgconstant.AnnoNSDefautlV6Pool)
+					common.SetNamespaceIppoolAnnotation(v6IppoolAnnoValue, namespaceObject, v6PoolNameList, pkgconstant.AnnoNSDefautlV6Pool)
 				}
 				GinkgoWriter.Printf("Generate namespace objects: %v with namespace annotations \n", namespaceObject)
 
@@ -489,7 +481,7 @@ var _ = Describe("test annotation", Label("annotation"), func() {
 				checkAnnotationPriority(podYaml, podName, nsName, newV4PoolNameList, newV6PoolNameList)
 			})
 
-			It(`the namespace annotation has precedence over global default ippool, and use wildcard for namespace annotation to specify IPPools`, Label("A00006", "A00007", "smoke"), func() {
+			It(`the namespace annotation has precedence over global default ippool`, Label("A00006", "smoke"), func() {
 				// Generate a pod yaml with namespace annotations
 				podYaml := common.GenerateExamplePodYaml(podName, nsName)
 				Expect(podYaml).NotTo(BeNil())
diff --git a/test/e2e/coordinator/macvlan-overlay-one/macvlan_overlay_one_test.go b/test/e2e/coordinator/macvlan-overlay-one/macvlan_overlay_one_test.go
index c99c5c084..edfbf099d 100644
--- a/test/e2e/coordinator/macvlan-overlay-one/macvlan_overlay_one_test.go
+++ b/test/e2e/coordinator/macvlan-overlay-one/macvlan_overlay_one_test.go
@@ -1490,7 +1490,6 @@ var _ = Describe("MacvlanOverlayOne", Label("overlay", "one-nic", "coordinator")
 			if frame.Info.IpV4Enabled {
 				v4PoolName, v4PoolObj = common.GenerateExampleIpv4poolObject(1)
 				err = common.CreateIppool(frame, v4PoolObj)
-				Expect(err).NotTo(HaveOccurred())
 
 				Eventually(func() error {
 					v4PoolObj, err = common.GetIppoolByName(frame, v4PoolName)
@@ -1507,7 +1506,6 @@ var _ = Describe("MacvlanOverlayOne", Label("overlay", "one-nic", "coordinator")
 			if frame.Info.IpV6Enabled {
 				v6PoolName, v6PoolObj = common.GenerateExampleIpv6poolObject(1)
 				err = common.CreateIppool(frame, v6PoolObj)
-				Expect(err).NotTo(HaveOccurred())
 
 				Eventually(func() error {
 					v6PoolObj, err = common.GetIppoolByName(frame, v6PoolName)
diff --git a/test/e2e/kubevirt/kubevirt_test.go b/test/e2e/kubevirt/kubevirt_test.go
index 974dfee4d..fadc893ce 100644
--- a/test/e2e/kubevirt/kubevirt_test.go
+++ b/test/e2e/kubevirt/kubevirt_test.go
@@ -116,7 +116,7 @@ var _ = Describe("test kubevirt", Label("kubevirt"), func() {
 		Expect(vmInterfaces).Should(Equal(tmpVMInterfaces))
 	})
 
-	// TODO (ty-dc): after migration, the new vm pod try to pull a different tag image which may cause image pull failed.
+	// TODO (Icarus9913): after migration, the new vm pod try to pull a different tag image which may cause image pull failed.
 	PIt("Succeed to keep static IP for the kubevirt VM live migration", Label("F00002"), func() {
 		// 1. create a kubevirt vm with masquerade mode (At present, it seems like the live migration only supports masquerade mode)
 		virtualMachine.Spec.Template.Spec.Networks = []kubevirtv1.Network{
diff --git a/test/e2e/subnet/subnet_test.go b/test/e2e/subnet/subnet_test.go
index a99356ff9..a1fa85ba6 100644
--- a/test/e2e/subnet/subnet_test.go
+++ b/test/e2e/subnet/subnet_test.go
@@ -15,7 +15,6 @@ import (
 	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 	"github.com/spidernet-io/e2eframework/tools"
-	"gopkg.in/yaml.v2"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	api_errors "k8s.io/apimachinery/pkg/api/errors"
@@ -23,7 +22,6 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	"github.com/spidernet-io/spiderpool/pkg/applicationcontroller/applicationinformers"
 	"github.com/spidernet-io/spiderpool/pkg/constant"
 	"github.com/spidernet-io/spiderpool/pkg/ip"
 	spiderpool "github.com/spidernet-io/spiderpool/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1"
@@ -1996,93 +1994,4 @@ var _ = Describe("test subnet", Label("subnet"), func() {
 		_, err = frame.WaitPodStarted(podName, namespace, ctx)
 		Expect(err).To(HaveOccurred())
 	})
-
-	Context("The Pod would not be setup and no auto Pools created when the SpiderSubnet AutoPool feature is disabled", Label("I00024"), Serial, func() {
-		const configYamlStr = "conf.yml"
-		BeforeEach(func() {
-			// make sure configmap 'enableAutoPoolForApplication' is 'false'
-			configmap, err := frame.GetConfigmap(common.SpiderPoolConfigmapName, common.SpiderPoolConfigmapNameSpace)
-			Expect(err).NotTo(HaveOccurred())
-			var cmConfig types.SpiderpoolConfigmapConfig
-			configStr, ok := configmap.Data[configYamlStr]
-			Expect(ok).To(BeTrue())
-			err = yaml.Unmarshal([]byte(configStr), &cmConfig)
-			Expect(err).NotTo(HaveOccurred())
-
-			if cmConfig.EnableAutoPoolForApplication == true {
-				GinkgoWriter.Printf("try to update ConfigMap spiderpool-conf EnableAutoPoolForApplication to be false")
-				cmConfig.EnableAutoPoolForApplication = false
-				marshal, err := yaml.Marshal(cmConfig)
-				Expect(err).NotTo(HaveOccurred())
-
-				configmap.Data[configYamlStr] = string(marshal)
-				err = frame.KClient.Update(context.TODO(), configmap)
-				Expect(err).NotTo(HaveOccurred())
-			}
-
-			DeferCleanup(func() {
-				// change the configmap 'enableAutoPoolForApplication' back to be 'true'
-				configmap, err := frame.GetConfigmap(common.SpiderPoolConfigmapName, common.SpiderPoolConfigmapNameSpace)
-				Expect(err).NotTo(HaveOccurred())
-				var cmConfig types.SpiderpoolConfigmapConfig
-				configStr, ok := configmap.Data[configYamlStr]
-				Expect(ok).To(BeTrue())
-				err = yaml.Unmarshal([]byte(configStr), &cmConfig)
-				Expect(err).NotTo(HaveOccurred())
-
-				if cmConfig.EnableAutoPoolForApplication == false {
-					GinkgoWriter.Printf("try to update ConfigMap spiderpool-conf EnableAutoPoolForApplication to be true in the end")
-					cmConfig.EnableAutoPoolForApplication = true
-					marshal, err := yaml.Marshal(cmConfig)
-					Expect(err).NotTo(HaveOccurred())
-
-					configmap.Data[configYamlStr] = string(marshal)
-					err = frame.KClient.Update(context.TODO(), configmap)
-					Expect(err).NotTo(HaveOccurred())
-				}
-			})
-		})
-
-		It("The Pod would not start up", func() {
-			depName := "dep-" + tools.RandomName()
-			GinkgoWriter.Printf("Generate a new deploy object %v/%v. \n", namespace, depName)
-			subnetAnno := types.AnnoSubnetItem{}
-			if frame.Info.IpV4Enabled {
-				subnetAnno.IPv4 = []string{v4SubnetName}
-			}
-			if frame.Info.IpV6Enabled {
-				subnetAnno.IPv6 = []string{v6SubnetName}
-			}
-			subnetAnnoMarshal, err := json.Marshal(subnetAnno)
-			Expect(err).NotTo(HaveOccurred())
-
-			GinkgoWriter.Println("Using the annotation 'ipam.spidernet.io/subnet' to specify auto pool for application")
-			newDeployObject := common.GenerateExampleDeploymentYaml(depName, namespace, 1)
-			newDeployObject.Spec.Template.Annotations = map[string]string{
-				constant.AnnoSpiderSubnet: string(subnetAnnoMarshal),
-			}
-
-			ctx, cancel := context.WithTimeout(context.Background(), common.PodStartTimeout)
-			defer cancel()
-			podList, err := common.CreateDeployUntilExpectedReplicas(frame, newDeployObject, ctx)
-			Expect(err).NotTo(HaveOccurred())
-
-			// Get the Pod creation failure Event
-			GinkgoWriter.Println("The Pod would not start up due to AutoPool for application feature is disabled")
-			for _, pod := range podList.Items {
-				Expect(frame.WaitExceptEventOccurred(ctx, common.OwnerPod, pod.Name, pod.Namespace, common.CNIFailedToSetUpNetwork)).To(Succeed())
-			}
-
-			// make sure no auto ippools created
-			autoPoolMatchLabels := client.MatchingLabels{
-				constant.LabelIPPoolOwnerApplicationGV:        applicationinformers.ApplicationLabelGV(appsv1.SchemeGroupVersion.String()),
-				constant.LabelIPPoolOwnerApplicationKind:      constant.KindDeployment,
-				constant.LabelIPPoolOwnerApplicationNamespace: namespace,
-				constant.LabelIPPoolOwnerApplicationName:      newDeployObject.Name,
-			}
-			poolList, err := common.GetAllIppool(frame, autoPoolMatchLabels)
-			Expect(err).NotTo(HaveOccurred())
-			Expect(poolList.Items).To(HaveLen(0))
-		})
-	})
 })