Repository: fluid-cloudnative/fluid
Pull request #3908 (2024-04-21 06:42:20)

modify the license info in pkg/ddc/alluxio/backup_data.go
### Ⅰ. Describe what this PR does
modify the license info in pkg/ddc/alluxio/backup_data.go

fluid-e2e-bot[bot]: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
**Once this PR has been reviewed and has the lgtm label**, please assign zwwhdls for approval by writing `/assign @zwwhdls` in a comment. For more information see:[The Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=fluid-cloudnative%2Ffluid).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/fluid-cloudnative/fluid/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["zwwhdls"]} -->
fluid-e2e-bot[bot]: Hi @auroraberry. Thanks for your PR.

I'm waiting for a [fluid-cloudnative](https://github.com/orgs/fluid-cloudnative/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://github.com/orgs/fluid-cloudnative/people) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=fluid-cloudnative%2Ffluid).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>

sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3908) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3908&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3908&metric=new_accepted_issues&view=list)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3908&resolved=false&inNewCodePeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data-16px.png '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3908&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3908)



Patch:
diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml
index 6a19611d..23b0741d 100644
--- a/.github/workflows/go.yml
+++ b/.github/workflows/go.yml
@@ -39,7 +39,7 @@ jobs:
           path: ${{ env.GOPATH }}/src/github.com/fluid-cloudnative/fluid
 
       - name: Lint golang code
-        uses: golangci/golangci-lint-action@v4
+        uses: golangci/golangci-lint-action@v5
         with:
           version: latest
           args: --timeout 10m --verbose
diff --git a/api/v1alpha1/common.go b/api/v1alpha1/common.go
index be6c1790..900d8a95 100644
--- a/api/v1alpha1/common.go
+++ b/api/v1alpha1/common.go
@@ -1,4 +1,5 @@
 /*
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/api/v1alpha1/constant.go b/api/v1alpha1/constant.go
index 22b4673b..7cd5c64d 100644
--- a/api/v1alpha1/constant.go
+++ b/api/v1alpha1/constant.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Author.
+Copyright 2020 The Fluid Author.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/api/v1alpha1/databackup_types.go b/api/v1alpha1/databackup_types.go
index 94722d09..e182e55e 100644
--- a/api/v1alpha1/databackup_types.go
+++ b/api/v1alpha1/databackup_types.go
@@ -1,4 +1,5 @@
 /*
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/api/v1alpha1/dataload_types.go b/api/v1alpha1/dataload_types.go
index 98997cc3..afae1cc5 100644
--- a/api/v1alpha1/dataload_types.go
+++ b/api/v1alpha1/dataload_types.go
@@ -1,4 +1,5 @@
 /*
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/api/v1alpha1/dataprocess_types.go b/api/v1alpha1/dataprocess_types.go
index 5f4b44f7..b0a2f128 100644
--- a/api/v1alpha1/dataprocess_types.go
+++ b/api/v1alpha1/dataprocess_types.go
@@ -1,4 +1,5 @@
 /*
+Copyright 2023 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/api/v1alpha1/dataset_types.go b/api/v1alpha1/dataset_types.go
index b49f38f5..fcb73279 100644
--- a/api/v1alpha1/dataset_types.go
+++ b/api/v1alpha1/dataset_types.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/api/v1alpha1/doc.go b/api/v1alpha1/doc.go
index 20badd4a..4aecbbb6 100644
--- a/api/v1alpha1/doc.go
+++ b/api/v1alpha1/doc.go
@@ -1,15 +1,17 @@
-// Copyright 2018 PingCAP, Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// See the License for the specific language governing permissions and
-// limitations under the License.
+/*
+Copyright 2020 The Fluid Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
 
 // Package v1alpha1 is the v1alpha1 version of the API.
 // +groupName=data.fluid.io
diff --git a/api/v1alpha1/goosefsruntime_types.go b/api/v1alpha1/goosefsruntime_types.go
index 959aa436..8af2ffaf 100644
--- a/api/v1alpha1/goosefsruntime_types.go
+++ b/api/v1alpha1/goosefsruntime_types.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Author.
+Copyright 2021 The Fluid Author.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/api/v1alpha1/groupversion_info.go b/api/v1alpha1/groupversion_info.go
index 8574ac35..60603468 100644
--- a/api/v1alpha1/groupversion_info.go
+++ b/api/v1alpha1/groupversion_info.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/api/v1alpha1/openapi_generated.go b/api/v1alpha1/openapi_generated.go
index 4e3d0c43..0917d91f 100644
--- a/api/v1alpha1/openapi_generated.go
+++ b/api/v1alpha1/openapi_generated.go
@@ -4598,6 +4598,20 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_MasterSpec(ref common.Reference
 							},
 						},
 					},
+					"podMetadata": {
+						SchemaProps: spec.SchemaProps{
+							Description: "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods including Master and Worker. Default is not set.",
+							Default:     map[string]interface{}{},
+							Ref:         ref("github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata"),
+						},
+					},
+					"networkMode": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Whether to use hostnetwork or not Default is HostNetwork",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
 					"endpoint": {
 						SchemaProps: spec.SchemaProps{
 							Description: "ExternalEndpoint defines the configurations for external etcd cluster Default is not set If set, the Vineyard Master component will not be deployed, which means the Vineyard Worker component will use an external Etcd cluster. E,g.\n  endpoint:\n    uri: \"etcd-svc.etcd-namespace.svc.cluster.local:2379\"\n    encryptOptions:\n      - name: access-key\n\t\t   valueFrom:\n          secretKeyRef:\n            name: etcd-secret\n\t\t\t   key: accesskey",
@@ -4609,7 +4623,7 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_MasterSpec(ref common.Reference
 			},
 		},
 		Dependencies: []string{
-			"github.com/fluid-cloudnative/fluid/api/v1alpha1.ExternalEndpointSpec", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.VolumeMount"},
+			"github.com/fluid-cloudnative/fluid/api/v1alpha1.ExternalEndpointSpec", "github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.VolumeMount"},
 	}
 }
 
@@ -6510,11 +6524,25 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardCompTemplateSpec(ref co
 							},
 						},
 					},
+					"podMetadata": {
+						SchemaProps: spec.SchemaProps{
+							Description: "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods including Master and Worker. Default is not set.",
+							Default:     map[string]interface{}{},
+							Ref:         ref("github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata"),
+						},
+					},
+					"networkMode": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Whether to use hostnetwork or not Default is HostNetwork",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
 				},
 			},
 		},
 		Dependencies: []string{
-			"k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.VolumeMount"},
+			"github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata", "k8s.io/api/core/v1.ResourceRequirements", "k8s.io/api/core/v1.VolumeMount"},
 	}
 }
 
@@ -6663,6 +6691,13 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardRuntimeSpec(ref common.
 							Format:      "",
 						},
 					},
+					"podMetadata": {
+						SchemaProps: spec.SchemaProps{
+							Description: "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.",
+							Default:     map[string]interface{}{},
+							Ref:         ref("github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata"),
+						},
+					},
 					"volumes": {
 						SchemaProps: spec.SchemaProps{
 							Description: "Volumes is the list of Kubernetes volumes that can be mounted by the vineyard components (Master and Worker). Default is null.",
@@ -6681,7 +6716,7 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardRuntimeSpec(ref common.
 			},
 		},
 		Dependencies: []string{
-			"github.com/fluid-cloudnative/fluid/api/v1alpha1.MasterSpec", "github.com/fluid-cloudnative/fluid/api/v1alpha1.TieredStore", "github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardCompTemplateSpec", "github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardSockSpec", "k8s.io/api/core/v1.Volume"},
+			"github.com/fluid-cloudnative/fluid/api/v1alpha1.MasterSpec", "github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata", "github.com/fluid-cloudnative/fluid/api/v1alpha1.TieredStore", "github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardCompTemplateSpec", "github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardSockSpec", "k8s.io/api/core/v1.Volume"},
 	}
 }
 
@@ -6743,11 +6778,25 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardSockSpec(ref common.Ref
 							Ref:         ref("k8s.io/api/core/v1.ResourceRequirements"),
 						},
 					},
+					"networkMode": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Whether to use hostnetwork or not Default is HostNetwork",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"podMetadata": {
+						SchemaProps: spec.SchemaProps{
+							Description: "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.",
+							Default:     map[string]interface{}{},
+							Ref:         ref("github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata"),
+						},
+					},
 				},
 			},
 		},
 		Dependencies: []string{
-			"k8s.io/api/core/v1.ResourceRequirements"},
+			"github.com/fluid-cloudnative/fluid/api/v1alpha1.PodMetadata", "k8s.io/api/core/v1.ResourceRequirements"},
 	}
 }
 
diff --git a/api/v1alpha1/status.go b/api/v1alpha1/status.go
index f24428a8..3839d2e7 100644
--- a/api/v1alpha1/status.go
+++ b/api/v1alpha1/status.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/api/v1alpha1/swagger.json b/api/v1alpha1/swagger.json
index 92dcbb4d..e159aa0d 100644
--- a/api/v1alpha1/swagger.json
+++ b/api/v1alpha1/swagger.json
@@ -2499,7 +2499,11 @@
           "type": "string"
         },
         "imageTag": {
-          "description": "The image tag of Vineyard component. For Master, the default image tag is `3.5.10`. For Worker, the default image tag is `latest`.",
+          "description": "The image tag of Vineyard component. For Master, the default image tag is `3.5.10`. For Worker, the default image tag is `v0.21.5`.",
+          "type": "string"
+        },
+        "networkMode": {
+          "description": "Whether to use hostnetwork or not Default is HostNetwork",
           "type": "string"
         },
         "nodeSelector": {
@@ -2518,6 +2522,11 @@
             "default": ""
           }
         },
+        "podMetadata": {
+          "description": "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods including Master and Worker. Default is not set.",
+          "default": {},
+          "$ref": "#/definitions/.PodMetadata"
+        },
         "ports": {
           "description": "Ports used by Vineyard component. For Master, the default client port is 2379 and peer port is 2380. For Worker, the default rpc port is 9600 and the default exporter port is 9144.",
           "type": "object",
@@ -3616,7 +3625,11 @@
           "type": "string"
         },
         "imageTag": {
-          "description": "The image tag of Vineyard component. For Master, the default image tag is `3.5.10`. For Worker, the default image tag is `latest`.",
+          "description": "The image tag of Vineyard component. For Master, the default image tag is `3.5.10`. For Worker, the default image tag is `v0.21.5`.",
+          "type": "string"
+        },
+        "networkMode": {
+          "description": "Whether to use hostnetwork or not Default is HostNetwork",
           "type": "string"
         },
         "nodeSelector": {
@@ -3635,6 +3648,11 @@
             "default": ""
           }
         },
+        "podMetadata": {
+          "description": "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods including Master and Worker. Default is not set.",
+          "default": {},
+          "$ref": "#/definitions/.PodMetadata"
+        },
         "ports": {
           "description": "Ports used by Vineyard component. For Master, the default client port is 2379 and peer port is 2380. For Worker, the default rpc port is 9600 and the default exporter port is 9144.",
           "type": "object",
@@ -3736,6 +3754,11 @@
           "default": {},
           "$ref": "#/definitions/.MasterSpec"
         },
+        "podMetadata": {
+          "description": "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.",
+          "default": {},
+          "$ref": "#/definitions/.PodMetadata"
+        },
         "replicas": {
           "description": "The replicas of the worker, need to be specified If worker.replicas and the field are both specified, the field will be respected",
           "type": "integer",
@@ -3786,9 +3809,18 @@
           "type": "string"
         },
         "imageTag": {
-          "description": "Image Tag for Vineyard Fuse Default is `latest`",
+          "description": "Image Tag for Vineyard Fuse Default is `v0.21.5`",
+          "type": "string"
+        },
+        "networkMode": {
+          "description": "Whether to use hostnetwork or not Default is HostNetwork",
           "type": "string"
         },
+        "podMetadata": {
+          "description": "PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.",
+          "default": {},
+          "$ref": "#/definitions/.PodMetadata"
+        },
         "resources": {
           "description": "Resources contains the resource requirements and limits for the Vineyard Fuse. Default is not set.",
           "default": {},
diff --git a/api/v1alpha1/vineyardruntime_types.go b/api/v1alpha1/vineyardruntime_types.go
index 659fbb81..2c9b30f8 100644
--- a/api/v1alpha1/vineyardruntime_types.go
+++ b/api/v1alpha1/vineyardruntime_types.go
@@ -95,6 +95,17 @@ type VineyardCompTemplateSpec struct {
 	// Default is not set.
 	// +optional
 	VolumeMounts []corev1.VolumeMount `json:"volumeMounts,omitempty"`
+
+	// PodMetadata defines labels and annotations that will be propagated to Vineyard's pods including Master and Worker.
+	// Default is not set.
+	// +optional
+	PodMetadata PodMetadata `json:"podMetadata,omitempty"`
+
+	// Whether to use hostnetwork or not
+	// Default is HostNetwork
+	// +kubebuilder:validation:Enum=HostNetwork;"";ContainerNetwork
+	// +optional
+	NetworkMode NetworkMode `json:"networkMode,omitempty"`
 }
 
 // ExternalEndpointSpec defines the configurations for external etcd cluster
@@ -174,6 +185,16 @@ type VineyardSockSpec struct {
 	// Default is not set.
 	// +optional
 	Resources corev1.ResourceRequirements `json:"resources,omitempty"`
+
+	// Whether to use hostnetwork or not
+	// Default is HostNetwork
+	// +kubebuilder:validation:Enum=HostNetwork;"";ContainerNetwork
+	// +optional
+	NetworkMode NetworkMode `json:"networkMode,omitempty"`
+
+	// PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.
+	// +optional
+	PodMetadata PodMetadata `json:"podMetadata,omitempty"`
 }
 
 // VineyardRuntimeSpec defines the desired state of VineyardRuntime
@@ -232,6 +253,10 @@ type VineyardRuntimeSpec struct {
 	// +optional
 	DisablePrometheus bool `json:"disablePrometheus,omitempty"`
 
+	// PodMetadata defines labels and annotations that will be propagated to Vineyard's pods.
+	// +optional
+	PodMetadata PodMetadata `json:"podMetadata,omitempty"`
+
 	// Volumes is the list of Kubernetes volumes that can be mounted by the vineyard components (Master and Worker).
 	// Default is null.
 	// +optional
diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go
index fccd1842..68e7c471 100644
--- a/api/v1alpha1/zz_generated.deepcopy.go
+++ b/api/v1alpha1/zz_generated.deepcopy.go
@@ -3,6 +3,8 @@
 
 /*
 
+Copyright 2020 The Fluid Authors.
+
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
@@ -2808,6 +2810,7 @@ func (in *VineyardCompTemplateSpec) DeepCopyInto(out *VineyardCompTemplateSpec)
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
 	}
+	in.PodMetadata.DeepCopyInto(&out.PodMetadata)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VineyardCompTemplateSpec.
@@ -2886,6 +2889,7 @@ func (in *VineyardRuntimeSpec) DeepCopyInto(out *VineyardRuntimeSpec) {
 	in.Worker.DeepCopyInto(&out.Worker)
 	in.Fuse.DeepCopyInto(&out.Fuse)
 	in.TieredStore.DeepCopyInto(&out.TieredStore)
+	in.PodMetadata.DeepCopyInto(&out.PodMetadata)
 	if in.Volumes != nil {
 		in, out := &in.Volumes, &out.Volumes
 		*out = make([]v1.Volume, len(*in))
@@ -2916,6 +2920,7 @@ func (in *VineyardSockSpec) DeepCopyInto(out *VineyardSockSpec) {
 		}
 	}
 	in.Resources.DeepCopyInto(&out.Resources)
+	in.PodMetadata.DeepCopyInto(&out.PodMetadata)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VineyardSockSpec.
diff --git a/charts/fluid-datamigrate/juicefs/templates/cronjob.yaml b/charts/fluid-datamigrate/juicefs/templates/cronjob.yaml
index 3cf9a85e..a9673452 100644
--- a/charts/fluid-datamigrate/juicefs/templates/cronjob.yaml
+++ b/charts/fluid-datamigrate/juicefs/templates/cronjob.yaml
@@ -27,6 +27,10 @@ spec:
       backoffLimit: {{ .Values.datamigrate.backoffLimit | default "3" }}
       completions: 1
       parallelism: 1
+      {{- if gt (.Values.datamigrate.parallelism | int) 1 }}
+      # when using parallel tasks, default suspend is true, the reconciler will set it to false after scale the workers statefulset.
+      suspend: true
+      {{- end }}
       template:
         metadata:
           name: {{ printf "%s-migrate" .Release.Name }}
@@ -80,6 +84,20 @@ spec:
               {{- toYaml .Values.datamigrate.resources | nindent 16}}
               {{- end }}
               env:
+                - name: PARALLELISM
+                  value: {{ .Values.datamigrate.parallelism | quote }}
+                {{- if gt (.Values.datamigrate.parallelism | int) 1 }}
+                - name: POD_IP
+                  valueFrom:
+                    fieldRef:
+                      fieldPath: status.podIP
+                - name: SSH_READY_TIMEOUT
+                  value: {{ .Values.datamigrate.parallelOptions.sshReadyTimeoutSeconds | quote }}
+                - name: TARGET_SSH_PORT
+                  value: "{{ .Values.datamigrate.parallelOptions.sshPort }}"
+                - name: WORKER_NAME_FORMAT
+                  value: {{ printf "%s-workers-{}.%s-workers" .Release.Name .Release.Name }}
+                {{- end }}
                 {{- range $key, $val := .Values.datamigrate.options }}
                 {{- if eq $key "timeout" }}
                 - name: TIMEOUT
@@ -107,7 +125,27 @@ spec:
                 {{- with .Values.datamigrate.nativeVolumeMounts }}
                 {{ toYaml . | nindent 16 }}
                 {{- end }}
+                {{- if gt (.Values.datamigrate.parallelism | int) 1 }}
+                - mountPath: /root/.ssh
+                  name: data-migrate-ssh
+                  # use subpath to avoid permissions check problem because the launcher will ssh to itself.
+                  # Or user can set 'StrictModes no' in /etc/ssh/sshd_config file to avoid permission check when build the image in dockerfile.
+                  subPath: .ssh
+                 {{- end }}
           volumes:
+            {{- if gt (.Values.datamigrate.parallelism | int) 1 }}
+            - name: data-migrate-ssh
+              secret:
+                secretName: {{.Values.datamigrate.parallelOptions.sshSecretName }}
+                defaultMode: 0600
+                items:
+                  - key: ssh-privatekey
+                    path: .ssh/id_rsa
+                  - key: ssh-publickey
+                    path: .ssh/id_rsa.pub
+                  - key: ssh-publickey
+                    path: .ssh/authorized_keys
+            {{- end }}
             - name: data-migrate-script
               configMap:
                 name: {{ printf "%s-script" .Release.Name }}
@@ -115,6 +153,9 @@ spec:
                   - key: datamigrate.sh
                     path: juicefs_datamigrate.sh
                     mode: 365
+                  - key: check_ssh.sh
+                    path: check_ssh.sh
+                    mode: 365
           {{- with .Values.datamigrate.nativeVolumes }}
             {{ toYaml . | nindent 12 }}
           {{- end }}
diff --git a/charts/fluid-datamigrate/juicefs/templates/statefulset.yaml b/charts/fluid-datamigrate/juicefs/templates/statefulset.yaml
index 96be0b9c..3a28ff77 100644
--- a/charts/fluid-datamigrate/juicefs/templates/statefulset.yaml
+++ b/charts/fluid-datamigrate/juicefs/templates/statefulset.yaml
@@ -22,8 +22,13 @@ spec:
       app: {{ printf "%s-workers" .Release.Name }}
   # match the service name
   serviceName: {{ printf "%s-workers" .Release.Name }}
+  {{- if eq (lower .Values.datamigrate.policy) "cron" }}
+  # cron job, the replica is 0, the reconciler will scale it.
+  replicas: 0
+  {{- else }}
   # the job acts as a worker, so minus 1 here.
   replicas: {{ sub .Values.datamigrate.parallelism  1 }}
+  {{- end }}
   podManagementPolicy: Parallel
   template:
     metadata:
diff --git a/charts/fluid/fluid/Chart.yaml b/charts/fluid/fluid/Chart.yaml
index ea09cc0b..5c260464 100644
--- a/charts/fluid/fluid/Chart.yaml
+++ b/charts/fluid/fluid/Chart.yaml
@@ -18,7 +18,7 @@ version: 1.0.1
 
 # This is the version number of the application being deployed. This version number should be
 # incremented each time you make changes to the application.
-appVersion: 1.0.0-31f5433
+appVersion: 1.0.1-3f4dbe8
 home: https://github.com/fluid-cloudnative/fluid
 keywords:
   - category:data
diff --git a/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml b/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
index 1ecd7d60..b745e0aa 100644
--- a/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
+++ b/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
@@ -116,6 +116,28 @@ spec:
                   imageTag:
                     description: Image Tag for Vineyard Fuse Default is `v0.21.5`
                     type: string
+                  networkMode:
+                    description: Whether to use hostnetwork or not Default is HostNetwork
+                    enum:
+                    - HostNetwork
+                    - ""
+                    - ContainerNetwork
+                    type: string
+                  podMetadata:
+                    description: PodMetadata defines labels and annotations that will
+                      be propagated to Vineyard's pods.
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        description: Annotations are annotations of pod specification
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        description: Labels are labels of pod specification
+                        type: object
+                    type: object
                   resources:
                     description: Resources contains the resource requirements and
                       limits for the Vineyard Fuse. Default is not set.
@@ -219,6 +241,13 @@ spec:
                       the default image tag is `3.5.10`. For Worker, the default image
                       tag is `v0.21.5`.
                     type: string
+                  networkMode:
+                    description: Whether to use hostnetwork or not Default is HostNetwork
+                    enum:
+                    - HostNetwork
+                    - ""
+                    - ContainerNetwork
+                    type: string
                   nodeSelector:
                     additionalProperties:
                       type: string
@@ -239,6 +268,22 @@ spec:
                       \n vineyardd.reserve.memory: \"true\" etcd.prefix: \"/vineyard\"
                       wait.etcd.timeout: \"120\""
                     type: object
+                  podMetadata:
+                    description: PodMetadata defines labels and annotations that will
+                      be propagated to Vineyard's pods including Master and Worker.
+                      Default is not set.
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        description: Annotations are annotations of pod specification
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        description: Labels are labels of pod specification
+                        type: object
+                    type: object
                   ports:
                     additionalProperties:
                       type: integer
@@ -328,6 +373,21 @@ spec:
                       type: object
                     type: array
                 type: object
+              podMetadata:
+                description: PodMetadata defines labels and annotations that will
+                  be propagated to Vineyard's pods.
+                properties:
+                  annotations:
+                    additionalProperties:
+                      type: string
+                    description: Annotations are annotations of pod specification
+                    type: object
+                  labels:
+                    additionalProperties:
+                      type: string
+                    description: Labels are labels of pod specification
+                    type: object
+                type: object
               replicas:
                 description: The replicas of the worker, need to be specified If worker.replicas
                   and the field are both specified, the field will be respected
@@ -3507,6 +3567,13 @@ spec:
                       the default image tag is `3.5.10`. For Worker, the default image
                       tag is `v0.21.5`.
                     type: string
+                  networkMode:
+                    description: Whether to use hostnetwork or not Default is HostNetwork
+                    enum:
+                    - HostNetwork
+                    - ""
+                    - ContainerNetwork
+                    type: string
                   nodeSelector:
                     additionalProperties:
                       type: string
@@ -3527,6 +3594,22 @@ spec:
                       \n vineyardd.reserve.memory: \"true\" etcd.prefix: \"/vineyard\"
                       wait.etcd.timeout: \"120\""
                     type: object
+                  podMetadata:
+                    description: PodMetadata defines labels and annotations that will
+                      be propagated to Vineyard's pods including Master and Worker.
+                      Default is not set.
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        description: Annotations are annotations of pod specification
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        description: Labels are labels of pod specification
+                        type: object
+                    type: object
                   ports:
                     additionalProperties:
                       type: integer
diff --git a/charts/fluid/fluid/templates/controller/vineyardruntime_controller.yaml b/charts/fluid/fluid/templates/controller/vineyardruntime_controller.yaml
index 55b26d52..a815f7da 100644
--- a/charts/fluid/fluid/templates/controller/vineyardruntime_controller.yaml
+++ b/charts/fluid/fluid/templates/controller/vineyardruntime_controller.yaml
@@ -48,6 +48,7 @@ spec:
         command: ["vineyardruntime-controller", "start"]
         args:
           - --development=false
+          - --runtime-node-port-range={{ .Values.runtime.vineyard.portRange }}
           - --pprof-addr=:6060
           - --enable-leader-election
           - --leader-election-namespace={{ include "fluid.namespace" . }}
diff --git a/charts/fluid/fluid/templates/role/jindo/rbac.yaml b/charts/fluid/fluid/templates/role/jindo/rbac.yaml
index e29aa4eb..943f1e92 100644
--- a/charts/fluid/fluid/templates/role/jindo/rbac.yaml
+++ b/charts/fluid/fluid/templates/role/jindo/rbac.yaml
@@ -74,12 +74,6 @@ rules:
     verbs:
     - create
     - patch
-  - apiGroups:
-    - ""
-    resources:
-    - secrets
-    verbs:
-    - get
 {{- template "fluid.helmDriver.rbacs" . }}
   - apiGroups:
     - ""
diff --git a/charts/fluid/fluid/values.yaml b/charts/fluid/fluid/values.yaml
index 5e9830b4..a6f47f88 100644
--- a/charts/fluid/fluid/values.yaml
+++ b/charts/fluid/fluid/values.yaml
@@ -12,7 +12,7 @@ crdUpgrade:
   enabled: true
   # This sets the time-to-live (TTL) for crd-upgrade jobs. Default is 259200 seconds (3 days).
   ttlSecondsAfterFinished: 259200 
-  image: fluidcloudnative/fluid-crd-upgrader:v1.0.0-31f5433
+  image: fluidcloudnative/fluid-crd-upgrader:v1.0.1-3f4dbe8
 
 ##  if unspecified, will use built-in variable `.Release.Namespace`.
 namespace: fluid-system
@@ -25,7 +25,7 @@ dataset:
   tolerations:
     - operator: Exists
   controller:
-    image: fluidcloudnative/dataset-controller:v1.0.0-31f5433
+    image: fluidcloudnative/dataset-controller:v1.0.1-3f4dbe8
 
 csi:
   tolerations:
@@ -36,7 +36,7 @@ csi:
   registrar:
     image: fluidcloudnative/csi-node-driver-registrar:v2.3.0
   plugins:
-    image: fluidcloudnative/fluid-csi:v1.0.0-31f5433
+    image: fluidcloudnative/fluid-csi:v1.0.1-3f4dbe8
   kubelet:
     kubeConfigFile: /etc/kubernetes/kubelet.conf
     certDir: /var/lib/kubelet/pki
@@ -63,7 +63,7 @@ runtime:
     init:
       image: fluidcloudnative/init-users:v0.9.0
     controller:
-      image: fluidcloudnative/alluxioruntime-controller:v1.0.0-31f5433
+      image: fluidcloudnative/alluxioruntime-controller:v1.0.1-3f4dbe8
     runtime:
       image: alluxio/alluxio-dev:2.9.0
     fuse:
@@ -84,7 +84,7 @@ runtime:
     fuse:
       image: registry.cn-shanghai.aliyuncs.com/jindofs/jindo-fuse:6.2.0
     controller:
-      image: fluidcloudnative/jindoruntime-controller:v1.0.0-31f5433
+      image: fluidcloudnative/jindoruntime-controller:v1.0.1-3f4dbe8
     init:
       portCheck:
         enabled: false
@@ -100,7 +100,7 @@ runtime:
     init:
       image: fluidcloudnative/init-users:v0.9.0
     controller:
-      image: fluidcloudnative/goosefsruntime-controller:v1.0.0-31f5433
+      image: fluidcloudnative/goosefsruntime-controller:v1.0.1-3f4dbe8
     runtime:
       image: ccr.ccs.tencentyun.com/qcloud/goosefs:v1.2.0
     fuse:
@@ -112,7 +112,7 @@ runtime:
     enabled: false
     runtimeWorkers: 3
     controller:
-      image: fluidcloudnative/juicefsruntime-controller:v1.0.0-31f5433
+      image: fluidcloudnative/juicefsruntime-controller:v1.0.1-3f4dbe8
     fuse:
       ceimage: juicedata/juicefs-fuse:ce-v1.1.0-rc1
       eeimage: juicedata/juicefs-fuse:ee-4.9.16
@@ -122,7 +122,7 @@ runtime:
       - operator: Exists
     enabled: false
     controller:
-      image: fluidcloudnative/thinruntime-controller:v1.0.0-31f5433
+      image: fluidcloudnative/thinruntime-controller:v1.0.1-3f4dbe8
     fuse:
       configStorage: configmap
   efc:
@@ -131,7 +131,7 @@ runtime:
       - operator: Exists
     enabled: false
     controller:
-      image: fluidcloudnative/efcruntime-controller:v1.0.0-31f5433
+      image: fluidcloudnative/efcruntime-controller:v1.0.1-3f4dbe8
       imagePullPolicy: Always
     init:
       image: registry.cn-zhangjiakou.aliyuncs.com/nascache/init-alifuse:v1.2.2-19dcee9
@@ -143,11 +143,12 @@ runtime:
       image: registry.cn-zhangjiakou.aliyuncs.com/nascache/efc-fuse:v1.2.2-19dcee9
   vineyard:
     replicas: 1
+    portRange: 32000-34000
     tolerations:
       - operator: Exists
     enabled: false
     controller:
-      image: fluidcloudnative/vineyardruntime-controller:v1.0.0-31f5433
+      image: fluidcloudnative/vineyardruntime-controller:v1.0.1-3f4dbe8
       imagePullPolicy: Always
     master:
       image: bitnami/etcd:3.5.10
@@ -158,7 +159,7 @@ runtime:
 
 webhook:
   enabled: true
-  image: fluidcloudnative/fluid-webhook:v1.0.0-31f5433
+  image: fluidcloudnative/fluid-webhook:v1.0.1-3f4dbe8
   replicas: 1
   timeoutSeconds: 15
   reinvocationPolicy: IfNeeded
@@ -208,4 +209,4 @@ fluidapp:
   tolerations:
     - operator: Exists
   controller:
-    image: fluidcloudnative/application-controller:v1.0.0-31f5433
+    image: fluidcloudnative/application-controller:v1.0.1-3f4dbe8
diff --git a/charts/vineyard/templates/fuse/daemonset.yaml b/charts/vineyard/templates/fuse/daemonset.yaml
index 3e99bda1..e6c9b5a0 100644
--- a/charts/vineyard/templates/fuse/daemonset.yaml
+++ b/charts/vineyard/templates/fuse/daemonset.yaml
@@ -47,11 +47,21 @@ spec:
     metadata:
       annotations:
         sidecar.istio.io/inject: "false"
+      {{- if .Values.fuse.annotations }}
+      {{- range $key, $val := .Values.fuse.annotations }}
+        {{ $key | quote }}: {{ $val | quote }}
+      {{- end }}
+      {{- end }}
       labels:
         app: {{ $name }}
         chart: {{ $chart }}
         release: {{ .Release.Name }}
         role: vineyard-fuse
+        {{- if .Values.fuse.labels }}
+        {{- range $key, $val := .Values.fuse.labels }}
+        {{ $key | quote }}: {{ $val | quote }}
+        {{- end }}
+        {{- end }}
     spec:
       tolerations:
       - operator: Exists
@@ -60,6 +70,10 @@ spec:
 {{ toYaml .Values.fuse.nodeSelector | trim | indent 8  }}
       {{- end }}
       enableServiceLinks: false
+      {{- if .Values.fuse.hostNetwork }}
+      hostNetwork: {{ .Values.fuse.hostNetwork }}
+      dnsPolicy: ClusterFirstWithHostNet
+      {{- end }}
       terminationGracePeriodSeconds: 60
       containers:
         - name: vineyard-fuse
diff --git a/charts/vineyard/templates/master/statefulset.yaml b/charts/vineyard/templates/master/statefulset.yaml
index 6115d591..9e24bf99 100644
--- a/charts/vineyard/templates/master/statefulset.yaml
+++ b/charts/vineyard/templates/master/statefulset.yaml
@@ -55,18 +55,32 @@ spec:
     metadata:
       annotations:
         sidecar.istio.io/inject: "false"
+      {{- if .Values.master.annotations }}
+      {{- range $key, $val := .Values.master.annotations }}
+        {{ $key | quote }}: {{ $val | quote }}
+      {{- end }}
+      {{- end }}
       labels:
         app: {{ $name }}
         chart: {{ $chart }}
         release: {{ .Release.Name }}
         heritage: {{ .Release.Service }}
         role: vineyard-master
+        {{- if .Values.master.labels }}
+        {{- range $key, $val := .Values.master.labels }}
+        {{ $key | quote }}: {{ $val | quote }}
+        {{- end }}
+        {{- end }}
     spec:
       {{- if .Values.master.nodeSelector }}
       nodeSelector:
 {{ toYaml .Values.master.nodeSelector | trim | indent 8  }}
       {{- end }}
       enableServiceLinks: false
+      {{- if .Values.master.hostNetwork }}
+      hostNetwork: {{ .Values.master.hostNetwork }}
+      dnsPolicy: ClusterFirstWithHostNet
+      {{- end }}
       containers:
         - name: vineyard-master
           image: {{ .Values.master.image }}:{{ .Values.master.imageTag }}
diff --git a/charts/vineyard/templates/worker/statefulset.yaml b/charts/vineyard/templates/worker/statefulset.yaml
index 94bf3a3a..ff85855d 100644
--- a/charts/vineyard/templates/worker/statefulset.yaml
+++ b/charts/vineyard/templates/worker/statefulset.yaml
@@ -51,6 +51,11 @@ spec:
     metadata:
       annotations:
         sidecar.istio.io/inject: "false"
+      {{- if .Values.worker.annotations }}
+      {{- range $key, $val := .Values.worker.annotations }}
+        {{ $key | quote }}: {{ $val | quote }}
+      {{- end }}
+      {{- end }}
       labels:
         app: {{ $name }}
         chart: {{ $chart }}
@@ -59,12 +64,21 @@ spec:
         role: vineyard-worker
         fluid.io/dataset: {{ .Release.Namespace }}-{{ .Release.Name }}
         app.kubernetes.io/instance: {{ .Release.Namespace }}-{{ $fullName }}-worker
+        {{- if .Values.worker.labels }}
+        {{- range $key, $val := .Values.worker.labels }}
+        {{ $key | quote }}: {{ $val | quote }}
+        {{- end }}
+        {{- end }}
     spec:
       {{- if .Values.worker.nodeSelector }}
       nodeSelector:
 {{ toYaml .Values.worker.nodeSelector | trim | indent 8  }}
       {{- end }}
       enableServiceLinks: false
+      {{- if .Values.worker.hostNetwork }}
+      hostNetwork: {{ .Values.worker.hostNetwork }}
+      dnsPolicy: ClusterFirstWithHostNet
+      {{- end }}
       containers:
         - name: vineyard-worker
           image: {{ .Values.worker.image }}:{{ .Values.worker.imageTag }}
diff --git a/charts/vineyard/values.yaml b/charts/vineyard/values.yaml
index 36dac388..4ff5a773 100644
--- a/charts/vineyard/values.yaml
+++ b/charts/vineyard/values.yaml
@@ -3,6 +3,15 @@
 fullnameOverride: vineyard
 
 master:
+  # Metadata for Vineyard Master
+  labels:
+  # label1: value1
+  # label2: value2
+
+  annotations:
+  # annotation1: value1
+  # annotation2: value2
+
   # the external endpoint of master
   # if set, the Vineyard Master component will not be deployed, which means the Vineyard Worker component will use an external Etcd cluster.
   externalEndpoint:
@@ -19,6 +28,7 @@ master:
   imageTag: 3.5.10
   imagePullPolicy: IfNotPresent
   nodeSelector: {}
+  hostNetwork: false
   # Exmaple:
   #   "disktype": "ssd"
   ports:
@@ -44,11 +54,21 @@ master:
   #   mountPath: /data/configmap/myConfigMapVolume/
 
 worker:
+  # Metadata for Vineyard Workers
+  labels:
+  # label1: value1
+  # label2: value2
+
+  annotations:
+  # annotation1: value1
+  # annotation2: value2
+
   replicas: 1
   image: vineyardcloudnative/vineyardd
   imageTag: v0.21.5
   imagePullPolicy: IfNotPresent
   nodeSelector: {}
+  hostNetwork: false
   # Exmaple:
   #   "disktype": "ssd"
   ports:
@@ -96,6 +116,16 @@ volumes: []
 disablePrometheus: true
 
 fuse:
+  # Metadata for Vineyard Fuse
+  labels:
+  # label1: value1
+  # label2: value2
+
+  annotations:
+  # annotation1: value1
+  # annotation2: value2
+
+  hostNetwork: false
   image: vineyardcloudnative/vineyard-fluid-fuse
   imageTag: v0.21.5
   imagePullPolicy: IfNotPresent
diff --git a/cmd/alluxio/app/alluxio.go b/cmd/alluxio/app/alluxio.go
index 3487344b..e8dfa63c 100644
--- a/cmd/alluxio/app/alluxio.go
+++ b/cmd/alluxio/app/alluxio.go
@@ -90,8 +90,8 @@ func init() {
 	alluxioCmd.Flags().StringVar(&portAllocatePolicy, "port-allocate-policy", "random", "Set port allocating policy, available choice is bitmap or random(default random).")
 	alluxioCmd.Flags().Float32VarP(&kubeClientQPS, "kube-api-qps", "", 20, "QPS to use while talking with kubernetes apiserver.")   // 20 is the default qps in controller-runtime
 	alluxioCmd.Flags().IntVarP(&kubeClientBurst, "kube-api-burst", "", 30, "Burst to use while talking with kubernetes apiserver.") // 30 is the default burst in controller-runtime
-	alluxioCmd.Flags().StringVar(&controllerWorkqueueDefaultSyncBackoffStr, "workqueue-default-sync-backoff", "5ms", "base backoff period for failed reconcilation in controller's workqueue")
-	alluxioCmd.Flags().StringVar(&controllerWorkqueueMaxSyncBackoffStr, "workqueue-max-sync-backoff", "1000s", "max backoff period for failed reconcilation in controller's workqueue")
+	alluxioCmd.Flags().StringVar(&controllerWorkqueueDefaultSyncBackoffStr, "workqueue-default-sync-backoff", "5ms", "base backoff period for failed reconciliation in controller's workqueue")
+	alluxioCmd.Flags().StringVar(&controllerWorkqueueMaxSyncBackoffStr, "workqueue-max-sync-backoff", "1000s", "max backoff period for failed reconciliation in controller's workqueue")
 	alluxioCmd.Flags().IntVar(&controllerWorkqueueQPS, "workqueue-qps", 10, "qps limit value for controller's workqueue")
 	alluxioCmd.Flags().IntVar(&controllerWorkqueueBurst, "workqueue-burst", 100, "burst limit value for controller's workqueue")
 }
diff --git a/cmd/csi/app/csi.go b/cmd/csi/app/csi.go
index 861fdc04..86ff8aff 100644
--- a/cmd/csi/app/csi.go
+++ b/cmd/csi/app/csi.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2021 The Fluid Authors.
+Copyright 2022 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/cmd/efc/app/efc.go b/cmd/efc/app/efc.go
index ef4cee72..bb880b46 100644
--- a/cmd/efc/app/efc.go
+++ b/cmd/efc/app/efc.go
@@ -1,5 +1,5 @@
 /*
-  Copyright 2022 The Fluid Authors.
+  Copyright 2023 The Fluid Authors.
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -89,8 +89,8 @@ func init() {
 	startCmd.Flags().StringVar(&portRange, "runtime-node-port-range", "16000-17999", "Set available port range for EFC")
 	startCmd.Flags().Float32VarP(&kubeClientQPS, "kube-api-qps", "", 20, "QPS to use while talking with kubernetes apiserver.")   // 20 is the default qps in controller-runtime
 	startCmd.Flags().IntVarP(&kubeClientBurst, "kube-api-burst", "", 30, "Burst to use while talking with kubernetes apiserver.") // 30 is the default burst in controller-runtime
-	startCmd.Flags().StringVar(&controllerWorkqueueDefaultSyncBackoffStr, "workqueue-default-sync-backoff", "5ms", "base backoff period for failed reconcilation in controller's workqueue")
-	startCmd.Flags().StringVar(&controllerWorkqueueMaxSyncBackoffStr, "workqueue-max-sync-backoff", "1000s", "max backoff period for failed reconcilation in controller's workqueue")
+	startCmd.Flags().StringVar(&controllerWorkqueueDefaultSyncBackoffStr, "workqueue-default-sync-backoff", "5ms", "base backoff period for failed reconciliation in controller's workqueue")
+	startCmd.Flags().StringVar(&controllerWorkqueueMaxSyncBackoffStr, "workqueue-max-sync-backoff", "1000s", "max backoff period for failed reconciliation in controller's workqueue")
 	startCmd.Flags().IntVar(&controllerWorkqueueQPS, "workqueue-qps", 10, "qps limit value for controller's workqueue")
 	startCmd.Flags().IntVar(&controllerWorkqueueBurst, "workqueue-burst", 100, "burst limit value for controller's workqueue")
 }
diff --git a/cmd/efc/app/version.go b/cmd/efc/app/version.go
index cefea8e8..e8d5c0c5 100644
--- a/cmd/efc/app/version.go
+++ b/cmd/efc/app/version.go
@@ -1,5 +1,5 @@
 /*
-  Copyright 2022 The Fluid Authors.
+  Copyright 2023 The Fluid Authors.
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
diff --git a/cmd/efc/main.go b/cmd/efc/main.go
index 0fd26441..e8f0ec8e 100644
--- a/cmd/efc/main.go
+++ b/cmd/efc/main.go
@@ -1,5 +1,5 @@
 /*
-  Copyright 2022 The Fluid Authors.
+  Copyright 2023 The Fluid Authors.
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
diff --git a/cmd/goosefs/app/init.go b/cmd/goosefs/app/init.go
index 745e9167..18dda732 100644
--- a/cmd/goosefs/app/init.go
+++ b/cmd/goosefs/app/init.go
@@ -1,4 +1,5 @@
 /*
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/cmd/jindo/app/jindo.go b/cmd/jindo/app/jindo.go
index 80998c5e..2dea91e9 100644
--- a/cmd/jindo/app/jindo.go
+++ b/cmd/jindo/app/jindo.go
@@ -97,8 +97,8 @@ func init() {
 	jindoCmd.Flags().StringVarP(&pprofAddr, "pprof-addr", "", "", "The address for pprof to use while exporting profiling results")
 	jindoCmd.Flags().Float32VarP(&kubeClientQPS, "kube-api-qps", "", 20, "QPS to use while talking with kubernetes apiserver.")   // 20 is the default qps in controller-runtime
 	jindoCmd.Flags().IntVarP(&kubeClientBurst, "kube-api-burst", "", 30, "Burst to use while talking with kubernetes apiserver.") // 30 is the default burst in controller-runtime
-	jindoCmd.Flags().StringVar(&controllerWorkqueueDefaultSyncBackoffStr, "workqueue-default-sync-backoff", "5ms", "base backoff period for failed reconcilation in controller's workqueue")
-	jindoCmd.Flags().StringVar(&controllerWorkqueueMaxSyncBackoffStr, "workqueue-max-sync-backoff", "1000s", "max backoff period for failed reconcilation in controller's workqueue")
+	jindoCmd.Flags().StringVar(&controllerWorkqueueDefaultSyncBackoffStr, "workqueue-default-sync-backoff", "5ms", "base backoff period for failed reconciliation in controller's workqueue")
+	jindoCmd.Flags().StringVar(&controllerWorkqueueMaxSyncBackoffStr, "workqueue-max-sync-backoff", "1000s", "max backoff period for failed reconciliation in controller's workqueue")
 	jindoCmd.Flags().IntVar(&controllerWorkqueueQPS, "workqueue-qps", 10, "qps limit value for controller's workqueue")
 	jindoCmd.Flags().IntVar(&controllerWorkqueueBurst, "workqueue-burst", 100, "burst limit value for controller's workqueue")
 }
diff --git a/cmd/vineyard/app/vineyard.go b/cmd/vineyard/app/vineyard.go
index 1350a056..3ce05122 100644
--- a/cmd/vineyard/app/vineyard.go
+++ b/cmd/vineyard/app/vineyard.go
@@ -23,6 +23,7 @@ import (
 	zapOpt "go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
 	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/util/net"
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/controller"
@@ -32,6 +33,7 @@ import (
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
 	vineyardctl "github.com/fluid-cloudnative/fluid/pkg/controllers/v1alpha1/vineyard"
 	"github.com/fluid-cloudnative/fluid/pkg/ddc/base"
+	"github.com/fluid-cloudnative/fluid/pkg/ddc/base/portallocator"
 	"github.com/fluid-cloudnative/fluid/pkg/ddc/vineyard"
 )
 
@@ -48,6 +50,8 @@ var (
 	development             bool
 	maxConcurrentReconciles int
 	pprofAddr               string
+	portRange               string
+	portAllocatePolicy      string
 
 	kubeClientQPS   float32
 	kubeClientBurst int
@@ -78,6 +82,8 @@ func init() {
 	startCmd.Flags().StringVarP(&leaderElectionNamespace, "leader-election-namespace", "", "fluid-system", "The namespace in which the leader election resource will be created.")
 	startCmd.Flags().StringVarP(&pprofAddr, "pprof-addr", "", "", "The address for pprof to use while exporting profiling results")
 	startCmd.Flags().BoolVarP(&development, "development", "", true, "Enable development mode for fluid controller.")
+	startCmd.Flags().StringVar(&portRange, "runtime-node-port-range", "32000-34000", "Set available port range for Vineyard")
+	startCmd.Flags().StringVar(&portAllocatePolicy, "port-allocate-policy", "random", "Set port allocating policy, available choice is bitmap or random(default random).")
 	startCmd.Flags().BoolVar(&eventDriven, "event-driven", true, "The reconciler's loop strategy. if it's false, it indicates period driven.")
 	startCmd.Flags().Float32VarP(&kubeClientQPS, "kube-api-qps", "", 20, "QPS to use while talking with kubernetes apiserver.")   // 20 is the default qps in controller-runtime
 	startCmd.Flags().IntVarP(&kubeClientBurst, "kube-api-burst", "", 30, "Burst to use while talking with kubernetes apiserver.") // 30 is the default burst in controller-runtime
@@ -143,6 +149,19 @@ func handle() {
 		setupLog.Error(err, "unable to create controller", "controller", "VineyardRuntime")
 		os.Exit(1)
 	}
+	pr, err := net.ParsePortRange(portRange)
+	if err != nil {
+		setupLog.Error(err, "can't parse port range. Port range must be like <min>-<max>")
+		os.Exit(1)
+	}
+	setupLog.Info("port range parsed", "port range", pr.String())
+
+	err = portallocator.SetupRuntimePortAllocator(mgr.GetClient(), pr, portAllocatePolicy, vineyard.GetReservedPorts)
+	if err != nil {
+		setupLog.Error(err, "failed to setup runtime port allocator")
+		os.Exit(1)
+	}
+	setupLog.Info("Set up runtime port allocator", "policy", portAllocatePolicy)
 
 	setupLog.Info("starting vineyardruntime-controller")
 	if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
diff --git a/config/crd/bases/data.fluid.io_vineyardruntimes.yaml b/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
index 1ecd7d60..b745e0aa 100644
--- a/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
+++ b/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
@@ -116,6 +116,28 @@ spec:
                   imageTag:
                     description: Image Tag for Vineyard Fuse Default is `v0.21.5`
                     type: string
+                  networkMode:
+                    description: Whether to use hostnetwork or not Default is HostNetwork
+                    enum:
+                    - HostNetwork
+                    - ""
+                    - ContainerNetwork
+                    type: string
+                  podMetadata:
+                    description: PodMetadata defines labels and annotations that will
+                      be propagated to Vineyard's pods.
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        description: Annotations are annotations of pod specification
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        description: Labels are labels of pod specification
+                        type: object
+                    type: object
                   resources:
                     description: Resources contains the resource requirements and
                       limits for the Vineyard Fuse. Default is not set.
@@ -219,6 +241,13 @@ spec:
                       the default image tag is `3.5.10`. For Worker, the default image
                       tag is `v0.21.5`.
                     type: string
+                  networkMode:
+                    description: Whether to use hostnetwork or not Default is HostNetwork
+                    enum:
+                    - HostNetwork
+                    - ""
+                    - ContainerNetwork
+                    type: string
                   nodeSelector:
                     additionalProperties:
                       type: string
@@ -239,6 +268,22 @@ spec:
                       \n vineyardd.reserve.memory: \"true\" etcd.prefix: \"/vineyard\"
                       wait.etcd.timeout: \"120\""
                     type: object
+                  podMetadata:
+                    description: PodMetadata defines labels and annotations that will
+                      be propagated to Vineyard's pods including Master and Worker.
+                      Default is not set.
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        description: Annotations are annotations of pod specification
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        description: Labels are labels of pod specification
+                        type: object
+                    type: object
                   ports:
                     additionalProperties:
                       type: integer
@@ -328,6 +373,21 @@ spec:
                       type: object
                     type: array
                 type: object
+              podMetadata:
+                description: PodMetadata defines labels and annotations that will
+                  be propagated to Vineyard's pods.
+                properties:
+                  annotations:
+                    additionalProperties:
+                      type: string
+                    description: Annotations are annotations of pod specification
+                    type: object
+                  labels:
+                    additionalProperties:
+                      type: string
+                    description: Labels are labels of pod specification
+                    type: object
+                type: object
               replicas:
                 description: The replicas of the worker, need to be specified If worker.replicas
                   and the field are both specified, the field will be respected
@@ -3507,6 +3567,13 @@ spec:
                       the default image tag is `3.5.10`. For Worker, the default image
                       tag is `v0.21.5`.
                     type: string
+                  networkMode:
+                    description: Whether to use hostnetwork or not Default is HostNetwork
+                    enum:
+                    - HostNetwork
+                    - ""
+                    - ContainerNetwork
+                    type: string
                   nodeSelector:
                     additionalProperties:
                       type: string
@@ -3527,6 +3594,22 @@ spec:
                       \n vineyardd.reserve.memory: \"true\" etcd.prefix: \"/vineyard\"
                       wait.etcd.timeout: \"120\""
                     type: object
+                  podMetadata:
+                    description: PodMetadata defines labels and annotations that will
+                      be propagated to Vineyard's pods including Master and Worker.
+                      Default is not set.
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        description: Annotations are annotations of pod specification
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        description: Labels are labels of pod specification
+                        type: object
+                    type: object
                   ports:
                     additionalProperties:
                       type: integer
diff --git a/docs/en/dev/api_doc.md b/docs/en/dev/api_doc.md
index 0a0e5578..be533910 100644
--- a/docs/en/dev/api_doc.md
+++ b/docs/en/dev/api_doc.md
@@ -2457,6 +2457,20 @@ Default is false</p>
 </tr>
 <tr>
 <td>
+<code>podMetadata</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.PodMetadata">
+PodMetadata
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods.</p>
+</td>
+</tr>
+<tr>
+<td>
 <code>volumes</code></br>
 <em>
 <a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#volume-v1-core">
@@ -7488,7 +7502,9 @@ bool
 <a href="#data.fluid.io/v1alpha1.JuiceFSCompTemplateSpec">JuiceFSCompTemplateSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.JuiceFSFuseSpec">JuiceFSFuseSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.ThinCompTemplateSpec">ThinCompTemplateSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.ThinFuseSpec">ThinFuseSpec</a>)
+<a href="#data.fluid.io/v1alpha1.ThinFuseSpec">ThinFuseSpec</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec</a>)
 </p>
 <p>
 </p>
@@ -7749,7 +7765,10 @@ WaitingStatus
 <a href="#data.fluid.io/v1alpha1.JuiceFSFuseSpec">JuiceFSFuseSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.JuiceFSRuntimeSpec">JuiceFSRuntimeSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.Metadata">Metadata</a>, 
-<a href="#data.fluid.io/v1alpha1.Processor">Processor</a>)
+<a href="#data.fluid.io/v1alpha1.Processor">Processor</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec</a>)
 </p>
 <p>
 <p>PodMetadata defines subgroup properties of metav1.ObjectMeta</p>
@@ -9992,6 +10011,36 @@ It is useful for specifying a persistent storage.
 Default is not set.</p>
 </td>
 </tr>
+<tr>
+<td>
+<code>podMetadata</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.PodMetadata">
+PodMetadata
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods including Master and Worker.
+Default is not set.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networkMode</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.NetworkMode">
+NetworkMode
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Whether to use hostnetwork or not
+Default is HostNetwork</p>
+</td>
+</tr>
 </tbody>
 </table>
 <h3 id="data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec
@@ -10122,6 +10171,20 @@ Default is false</p>
 </tr>
 <tr>
 <td>
+<code>podMetadata</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.PodMetadata">
+PodMetadata
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods.</p>
+</td>
+</tr>
+<tr>
+<td>
 <code>volumes</code></br>
 <em>
 <a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#volume-v1-core">
@@ -10240,6 +10303,35 @@ Kubernetes core/v1.ResourceRequirements
 Default is not set.</p>
 </td>
 </tr>
+<tr>
+<td>
+<code>networkMode</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.NetworkMode">
+NetworkMode
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Whether to use hostnetwork or not
+Default is HostNetwork</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>podMetadata</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.PodMetadata">
+PodMetadata
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods.</p>
+</td>
+</tr>
 </tbody>
 </table>
 <h3 id="data.fluid.io/v1alpha1.VolumeSource">VolumeSource
@@ -10308,5 +10400,5 @@ bool
 <hr/>
 <p><em>
 Generated with <code>gen-crd-api-reference-docs</code>
-on git commit <code>4ca57673e</code>.
+on git commit <code>acb0aec73</code>.
 </em></p>
diff --git a/docs/en/samples/data_warmup.md b/docs/en/samples/data_warmup.md
index dabaf3da..18d22a9e 100644
--- a/docs/en/samples/data_warmup.md
+++ b/docs/en/samples/data_warmup.md
@@ -5,7 +5,7 @@ the data in the remote storage system can be pulled to the distributed cache eng
 that is close to the computing node through **data preloading** beofre the application starts. 
 Then the application that consumes the data can enjoy the acceleration effect brought by distributed cache even at the first time.
 
-For the great benefit mentioned above, we provide **DataLoad CRD**. This is a CRD which offers you a clear and easy way to controll data preloading behaviors.
+For the great benefit mentioned above, we provide **DataLoad CRD**. This is a CRD which offers you a clear and easy way to control data preloading behaviors.
 
 This document will introduce you two different ways about how to use DataLoad CRD:
 - [DataLoad Quick Usage](#dataload-quick-usage)
@@ -101,7 +101,7 @@ EOF
 `spec.dataset` specifies the target dataset that needs to be preloaded. In this example, our target is the Dataset named `spark` under the `default` namespace. 
 Feel free to change the configuration above if it doesn't match your actual environment. ** note ** The namespace of your DataLoad must be consistent with the namespace of your dataset.
 
-**By default, it'll preload all the data in the target dataset**. If you'd like to controll the data preloading behaviors in a more find-grained way(e.g. preload data under some specified path only),
+**By default, it'll preload all the data in the target dataset**. If you'd like to control the data preloading behaviors in a more find-grained way(e.g. preload data under some specified path only),
 please refer to [DataLoad Advanced Configurations](#dataload-advanced-configurations)
 
 **Create the DataLoad object**
diff --git a/docs/en/samples/dataset_sharedOptions.md b/docs/en/samples/dataset_sharedOptions.md
index 70739cf8..d10a41e0 100644
--- a/docs/en/samples/dataset_sharedOptions.md
+++ b/docs/en/samples/dataset_sharedOptions.md
@@ -110,5 +110,5 @@ stringData:
 EOF
 ```
 
-As you can see, the specific contents of `fs.oss.accessKeySecret` and `fs.oss.accessKeyId` are written in Secret, and Dataset reads the corresponding value by looking for the Secret and key accroding to its configuration, instead of reading them in its configuration directly. So the security of some data is guaranteed.
+As you can see, the specific contents of `fs.oss.accessKeySecret` and `fs.oss.accessKeyId` are written in Secret, and Dataset reads the corresponding value by looking for the Secret and key according to its configuration, instead of reading them in its configuration directly. So the security of some data is guaranteed.
 
diff --git a/docs/en/samples/use_encryptoptions.md b/docs/en/samples/use_encryptoptions.md
index 7d76c9ef..327d087b 100644
--- a/docs/en/samples/use_encryptoptions.md
+++ b/docs/en/samples/use_encryptoptions.md
@@ -66,5 +66,5 @@ stringData:
 EOF
 ```
 
-As you can see, the specific contents of `fs.oss.accessKeySecret` and `fs.oss.accessKeyId` are written in Secret, and Dataset reads the corresponding value by looking for the Secret and key accroding to its configuration, instead of reading them in its configuration directly. So the security of some data is guaranteed.
+As you can see, the specific contents of `fs.oss.accessKeySecret` and `fs.oss.accessKeyId` are written in Secret, and Dataset reads the corresponding value by looking for the Secret and key according to its configuration, instead of reading them in its configuration directly. So the security of some data is guaranteed.
 
diff --git a/docs/zh/dev/api_doc.md b/docs/zh/dev/api_doc.md
index 0a0e5578..be533910 100644
--- a/docs/zh/dev/api_doc.md
+++ b/docs/zh/dev/api_doc.md
@@ -2457,6 +2457,20 @@ Default is false</p>
 </tr>
 <tr>
 <td>
+<code>podMetadata</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.PodMetadata">
+PodMetadata
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods.</p>
+</td>
+</tr>
+<tr>
+<td>
 <code>volumes</code></br>
 <em>
 <a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#volume-v1-core">
@@ -7488,7 +7502,9 @@ bool
 <a href="#data.fluid.io/v1alpha1.JuiceFSCompTemplateSpec">JuiceFSCompTemplateSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.JuiceFSFuseSpec">JuiceFSFuseSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.ThinCompTemplateSpec">ThinCompTemplateSpec</a>, 
-<a href="#data.fluid.io/v1alpha1.ThinFuseSpec">ThinFuseSpec</a>)
+<a href="#data.fluid.io/v1alpha1.ThinFuseSpec">ThinFuseSpec</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec</a>)
 </p>
 <p>
 </p>
@@ -7749,7 +7765,10 @@ WaitingStatus
 <a href="#data.fluid.io/v1alpha1.JuiceFSFuseSpec">JuiceFSFuseSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.JuiceFSRuntimeSpec">JuiceFSRuntimeSpec</a>, 
 <a href="#data.fluid.io/v1alpha1.Metadata">Metadata</a>, 
-<a href="#data.fluid.io/v1alpha1.Processor">Processor</a>)
+<a href="#data.fluid.io/v1alpha1.Processor">Processor</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">VineyardCompTemplateSpec</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec</a>, 
+<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">VineyardSockSpec</a>)
 </p>
 <p>
 <p>PodMetadata defines subgroup properties of metav1.ObjectMeta</p>
@@ -9992,6 +10011,36 @@ It is useful for specifying a persistent storage.
 Default is not set.</p>
 </td>
 </tr>
+<tr>
+<td>
+<code>podMetadata</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.PodMetadata">
+PodMetadata
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods including Master and Worker.
+Default is not set.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networkMode</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.NetworkMode">
+NetworkMode
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Whether to use hostnetwork or not
+Default is HostNetwork</p>
+</td>
+</tr>
 </tbody>
 </table>
 <h3 id="data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec
@@ -10122,6 +10171,20 @@ Default is false</p>
 </tr>
 <tr>
 <td>
+<code>podMetadata</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.PodMetadata">
+PodMetadata
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods.</p>
+</td>
+</tr>
+<tr>
+<td>
 <code>volumes</code></br>
 <em>
 <a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#volume-v1-core">
@@ -10240,6 +10303,35 @@ Kubernetes core/v1.ResourceRequirements
 Default is not set.</p>
 </td>
 </tr>
+<tr>
+<td>
+<code>networkMode</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.NetworkMode">
+NetworkMode
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Whether to use hostnetwork or not
+Default is HostNetwork</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>podMetadata</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.PodMetadata">
+PodMetadata
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>PodMetadata defines labels and annotations that will be propagated to Vineyard&rsquo;s pods.</p>
+</td>
+</tr>
 </tbody>
 </table>
 <h3 id="data.fluid.io/v1alpha1.VolumeSource">VolumeSource
@@ -10308,5 +10400,5 @@ bool
 <hr/>
 <p><em>
 Generated with <code>gen-crd-api-reference-docs</code>
-on git commit <code>4ca57673e</code>.
+on git commit <code>acb0aec73</code>.
 </em></p>
diff --git a/docs/zh/operation/dataset_auto_scaling.md b/docs/zh/operation/dataset_auto_scaling.md
index 1d6fb6b4..ea8e143e 100644
--- a/docs/zh/operation/dataset_auto_scaling.md
+++ b/docs/zh/operation/dataset_auto_scaling.md
@@ -136,7 +136,7 @@ data:
 $ kubectl create -f integration/custom-metrics-api
 ```
 
-> 注意：因为 custom-metrics-api 对接集群中的 Prometheous 的访问地址，请替换 Prometheous url 为你真正使用的 Prometheous 地址。
+> 注意：因为 custom-metrics-api 对接集群中的 Prometheus 的访问地址，请替换 Prometheus url 为你真正使用的 Prometheus 地址。
 
 
 检查自定义指标
@@ -420,4 +420,4 @@ $ kubectl delete dataset spark
 
 ## 总结
 
-Fluid提供了结合 Prometheous，Kubernetes HPA 和 Custom Metrics 能力，根据占用缓存空间的比例触发自动弹性伸缩的能力，实现缓存能力的按需使用。这样能够帮助用户更加灵活的使用通过分布式缓存提升数据访问加速能力，后续我们会提供定时扩缩的能力，为扩缩容提供更强的确定性。
\ No newline at end of file
+Fluid提供了结合 Prometheus，Kubernetes HPA 和 Custom Metrics 能力，根据占用缓存空间的比例触发自动弹性伸缩的能力，实现缓存能力的按需使用。这样能够帮助用户更加灵活的使用通过分布式缓存提升数据访问加速能力，后续我们会提供定时扩缩的能力，为扩缩容提供更强的确定性。
\ No newline at end of file
diff --git a/docs/zh/samples/juicefs/juicefs_data_migrate.md b/docs/zh/samples/juicefs/juicefs_data_migrate.md
index f267b99b..3b0ed7e5 100644
--- a/docs/zh/samples/juicefs/juicefs_data_migrate.md
+++ b/docs/zh/samples/juicefs/juicefs_data_migrate.md
@@ -88,6 +88,38 @@ spec:
 
 只需要在 uri 中声明 PVC 的名称即可，格式为 `pvc://<pvc-name>/<subpath>`。
 
+### 定时迁移
+
+DataMigrate 可以通过 Cron 表达式支持定时迁移的策略，下面是个参考的示例配置：
+```yaml
+apiVersion: data.fluid.io/v1alpha1
+kind: DataMigrate
+metadata:
+  name: jfs-cron-migrate
+spec:
+  image: registry.cn-hangzhou.aliyuncs.com/juicefs/juicefs-fuse
+  imageTag: nightly
+  policy: Cron
+  # 每10分钟执行一次数据迁移任务
+  schedule: "*/10 * * * *"
+  from:
+    externalStorage:
+      uri: minio://minio.default.svc.cluster.local:9000/test/
+  to:
+    dataset:
+      name: jfsdemo
+      namespace: default
+      path: /dir1
+```
+- `spec.policy`: 配置成 `Cron` 时，表明为定时任务；
+- `spec.schedule`: Cron 表达式，当 `spec.policy` 为 `Cron` 时必须配置该字段；
+
+分布式定时迁移：定时迁移也可以跟分布式迁移结合使用，其原理是通过`SuspendJob`特性实现，因此对K8s版本有要求；
+- k8s 版本小于 1.21，不支持分布式定时迁移；
+- k8s 版本等于 1.21，`SuspendJob` 处于 alpha 阶段，K8s需要显示配置启用`SuspendJob`特性开关才可以使用分布式定时迁移；
+- k8s 版本大于 1.21，`SuspendJob` 特性开关默认启用，支持分布式定时迁移；
+ 
+
 ## DataMigrate 生命周期
 
 DataMigrate 的生命周期如下图所示：
@@ -105,3 +137,4 @@ DataMigrate 的生命周期如下图所示：
 
 1. DataMigrate 执行时，DataSet 状态为 Migrating，表示此时正在迁移数据，不可进行数据更新，否则会有数据不一致的风险。
 2. DataMigrate 执行完，DataSet 状态恢复为 Bound。
+
diff --git a/hack/sdk/main.go b/hack/sdk/main.go
index 761d8a0d..6f70b0f9 100644
--- a/hack/sdk/main.go
+++ b/hack/sdk/main.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/common/label.go b/pkg/common/label.go
index f5888218..eb27f989 100644
--- a/pkg/common/label.go
+++ b/pkg/common/label.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/common/types.go b/pkg/common/types.go
index 6a58bd76..c2693905 100644
--- a/pkg/common/types.go
+++ b/pkg/common/types.go
@@ -1,4 +1,5 @@
 /*
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/manager.go b/pkg/controllers/manager.go
index 2ddc3e52..11c678bb 100644
--- a/pkg/controllers/manager.go
+++ b/pkg/controllers/manager.go
@@ -1,3 +1,19 @@
+/*
+Copyright 2021 The Fluid Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
 package controllers
 
 import (
diff --git a/pkg/controllers/v1alpha1/alluxio/alluxio_runtime_controller.go b/pkg/controllers/v1alpha1/alluxio/alluxio_runtime_controller.go
index 0180ae3c..10bfc85a 100644
--- a/pkg/controllers/v1alpha1/alluxio/alluxio_runtime_controller.go
+++ b/pkg/controllers/v1alpha1/alluxio/alluxio_runtime_controller.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/alluxio/implement.go b/pkg/controllers/v1alpha1/alluxio/implement.go
index 73ae4f50..ce631e89 100644
--- a/pkg/controllers/v1alpha1/alluxio/implement.go
+++ b/pkg/controllers/v1alpha1/alluxio/implement.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/databackup/databackup_controller.go b/pkg/controllers/v1alpha1/databackup/databackup_controller.go
index b479f029..00ea9cd3 100644
--- a/pkg/controllers/v1alpha1/databackup/databackup_controller.go
+++ b/pkg/controllers/v1alpha1/databackup/databackup_controller.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/dataflow/operations.go b/pkg/controllers/v1alpha1/dataflow/operations.go
index a6ebcaf9..068c4be1 100644
--- a/pkg/controllers/v1alpha1/dataflow/operations.go
+++ b/pkg/controllers/v1alpha1/dataflow/operations.go
@@ -1,3 +1,19 @@
+/*
+Copyright 2023 The Fluid Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
 package dataflow
 
 import (
diff --git a/pkg/controllers/v1alpha1/dataload/dataload_controller.go b/pkg/controllers/v1alpha1/dataload/dataload_controller.go
index f121900e..c4522a02 100644
--- a/pkg/controllers/v1alpha1/dataload/dataload_controller.go
+++ b/pkg/controllers/v1alpha1/dataload/dataload_controller.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/dataload/implement.go b/pkg/controllers/v1alpha1/dataload/implement.go
index 8daf6d83..ea43c8f3 100644
--- a/pkg/controllers/v1alpha1/dataload/implement.go
+++ b/pkg/controllers/v1alpha1/dataload/implement.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/datamigrate/datamigrate_controller.go b/pkg/controllers/v1alpha1/datamigrate/datamigrate_controller.go
index 5220fb25..6f7cb83a 100644
--- a/pkg/controllers/v1alpha1/datamigrate/datamigrate_controller.go
+++ b/pkg/controllers/v1alpha1/datamigrate/datamigrate_controller.go
@@ -118,7 +118,7 @@ func (r *DataMigrateReconciler) SetupWithManager(mgr ctrl.Manager, options contr
 			Owns(&batchv1.CronJob{}).
 			Complete(r)
 	} else {
-		ctrl.Log.Info("batch/v1 cronjobs cannnot be found in cluster, fallback to watch batch/v1beta1 cronjobs for compatibility")
+		ctrl.Log.Info("batch/v1 cronjobs cannot be found in cluster, fallback to watch batch/v1beta1 cronjobs for compatibility")
 		return ctrl.NewControllerManagedBy(mgr).
 			WithOptions(options).
 			For(&datav1alpha1.DataMigrate{}).
diff --git a/pkg/controllers/v1alpha1/datamigrate/status_handler.go b/pkg/controllers/v1alpha1/datamigrate/status_handler.go
index 0f3db3c4..082e1a8c 100644
--- a/pkg/controllers/v1alpha1/datamigrate/status_handler.go
+++ b/pkg/controllers/v1alpha1/datamigrate/status_handler.go
@@ -153,10 +153,36 @@ func (c *CronStatusHandler) GetOperationStatus(ctx cruntime.ReconcileRequestCont
 		return
 	}
 
+	// only parallel tasks will set the field Suspend to true, no need to check the parallel task number > 1.
+	if currentJob.Spec.Suspend != nil && *currentJob.Spec.Suspend {
+		ctx.Log.Info("scale the migrate workers statefulset", "name", utils.GetParallelOperationWorkersName(releaseName))
+		// scale the stateful set, the job acts as a worker.
+		err = kubeclient.ScaleStatefulSet(c.Client, utils.GetParallelOperationWorkersName(releaseName), c.dataMigrate.Namespace, c.dataMigrate.Spec.Parallelism-1)
+		if err != nil {
+			return
+		}
+		// set the job suspend field to false
+		jobToUpdate := currentJob.DeepCopy()
+		flag := false
+		jobToUpdate.Spec.Suspend = &flag
+		err = kubeclient.UpdateJob(c.Client, jobToUpdate)
+		if err != nil {
+			return
+		}
+	}
+
 	if len(currentJob.Status.Conditions) != 0 {
-		if currentJob.Status.Conditions[0].Type == batchv1.JobFailed ||
-			currentJob.Status.Conditions[0].Type == batchv1.JobComplete {
-			jobCondition := currentJob.Status.Conditions[0]
+		// find the job final status condition. if job is resumed, the first condition type is 'Suspended'
+		var jobCondition *batchv1.JobCondition
+		for _, condition := range currentJob.Status.Conditions {
+			// job is finished.
+			if condition.Type == batchv1.JobFailed || condition.Type == batchv1.JobComplete {
+				jobCondition = &condition
+				break
+			}
+		}
+
+		if jobCondition != nil {
 			// job either failed or complete, update DataMigrate's phase status
 			result.Conditions = []datav1alpha1.Condition{
 				{
@@ -174,6 +200,8 @@ func (c *CronStatusHandler) GetOperationStatus(ctx cruntime.ReconcileRequestCont
 				result.Phase = common.PhaseComplete
 			}
 			result.Duration = utils.CalculateDuration(currentJob.CreationTimestamp.Time, jobCondition.LastTransitionTime.Time)
+			// the return statement makes the below code executed in the reconcileCompleted/reconcileFailed.
+			// the status for cron data migrate is the correct status Complete/Failed not Pending/Executing before next job is not started.
 			return
 		}
 	}
diff --git a/pkg/controllers/v1alpha1/goosefs/goosefs_runtime_controller.go b/pkg/controllers/v1alpha1/goosefs/goosefs_runtime_controller.go
index 2a1d9e6e..3adab2de 100644
--- a/pkg/controllers/v1alpha1/goosefs/goosefs_runtime_controller.go
+++ b/pkg/controllers/v1alpha1/goosefs/goosefs_runtime_controller.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/goosefs/implement.go b/pkg/controllers/v1alpha1/goosefs/implement.go
index 6b6bbba2..903d8d50 100644
--- a/pkg/controllers/v1alpha1/goosefs/implement.go
+++ b/pkg/controllers/v1alpha1/goosefs/implement.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/jindo/implement.go b/pkg/controllers/v1alpha1/jindo/implement.go
index 1fa5d40e..436f7c7f 100644
--- a/pkg/controllers/v1alpha1/jindo/implement.go
+++ b/pkg/controllers/v1alpha1/jindo/implement.go
@@ -1,4 +1,5 @@
 /*
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/juicefs/juicefsruntime_controller.go b/pkg/controllers/v1alpha1/juicefs/juicefsruntime_controller.go
index 486c2c7f..1bec1c34 100644
--- a/pkg/controllers/v1alpha1/juicefs/juicefsruntime_controller.go
+++ b/pkg/controllers/v1alpha1/juicefs/juicefsruntime_controller.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ctrl/watch/fake_runtime_reconciler.go b/pkg/ctrl/watch/fake_runtime_reconciler.go
index e3e3b93a..b32fac65 100644
--- a/pkg/ctrl/watch/fake_runtime_reconciler.go
+++ b/pkg/ctrl/watch/fake_runtime_reconciler.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/dataoperation/interface.go b/pkg/dataoperation/interface.go
index 9b2e78b7..0b9a9778 100644
--- a/pkg/dataoperation/interface.go
+++ b/pkg/dataoperation/interface.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2023 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/dataoperation/mock.go b/pkg/dataoperation/mock.go
index 716f812a..a5d98b2d 100644
--- a/pkg/dataoperation/mock.go
+++ b/pkg/dataoperation/mock.go
@@ -1,3 +1,19 @@
+/*
+Copyright 2023 The Fluid Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
 package dataoperation
 
 import (
diff --git a/pkg/ddc/alluxio/backup_data.go b/pkg/ddc/alluxio/backup_data.go
index 9ebebd28..5cbdfb63 100644
--- a/pkg/ddc/alluxio/backup_data.go
+++ b/pkg/ddc/alluxio/backup_data.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2023 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/alluxio/delete_volume.go b/pkg/ddc/alluxio/delete_volume.go
index 09e0d642..ccd316ac 100644
--- a/pkg/ddc/alluxio/delete_volume.go
+++ b/pkg/ddc/alluxio/delete_volume.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Author.
+Copyright 2020 The Fluid Author.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/alluxio/types_selector.go b/pkg/ddc/alluxio/types_selector.go
index 32c0baf7..e1712b57 100644
--- a/pkg/ddc/alluxio/types_selector.go
+++ b/pkg/ddc/alluxio/types_selector.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/alluxio/worker.go b/pkg/ddc/alluxio/worker.go
index 16b72b04..cbf809b3 100644
--- a/pkg/ddc/alluxio/worker.go
+++ b/pkg/ddc/alluxio/worker.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/base/operation.go b/pkg/ddc/base/operation.go
index 206c59f5..81317f8e 100644
--- a/pkg/ddc/base/operation.go
+++ b/pkg/ddc/base/operation.go
@@ -118,7 +118,7 @@ func (t *TemplateEngine) reconcilePending(ctx cruntime.ReconcileRequestContext,
 
 	// 1. check preceding operation status
 	if opStatus.WaitingFor.OperationComplete != nil && *opStatus.WaitingFor.OperationComplete {
-		// when operationComplete set back to false, a new reconcilation loop will be triggered, so no requeue here.
+		// when operationComplete set back to false, a new reconciliation loop will be triggered, so no requeue here.
 		return utils.NoRequeue()
 	}
 
@@ -253,14 +253,15 @@ func (t *TemplateEngine) reconcileComplete(ctx cruntime.ReconcileRequestContext,
 		object := operation.GetOperationObject()
 		ctx.Recorder.Eventf(object, v1.EventTypeNormal, common.DataOperationSucceed,
 			"%s %s succeeded", operation.GetOperationType(), object.GetName())
-	}
 
-	// scale the statefulset replicas to 0 for parallel data operation
-	if operation.GetParallelTaskNumber() > 1 {
-		releaseNameSpacedName := operation.GetReleaseNameSpacedName()
-		err = kubeclient.ScaleStatefulSet(t.Client, utils.GetParallelOperationWorkersName(releaseNameSpacedName.Name), releaseNameSpacedName.Namespace, 0)
-		if err != nil {
-			return utils.RequeueIfError(err)
+		// scale the statefulset replicas to 0 for parallel data operation
+		// if the status not Complete, there is a new starting job, not scale the statefulset to zero.
+		if operation.GetParallelTaskNumber() > 1 {
+			releaseNameSpacedName := operation.GetReleaseNameSpacedName()
+			err = kubeclient.ScaleStatefulSet(t.Client, utils.GetParallelOperationWorkersName(releaseNameSpacedName.Name), releaseNameSpacedName.Namespace, 0)
+			if err != nil {
+				return utils.RequeueIfError(err)
+			}
 		}
 	}
 
@@ -304,7 +305,6 @@ func (t *TemplateEngine) reconcileFailed(ctx cruntime.ReconcileRequestContext, o
 		if err != nil {
 			log.Error(err, fmt.Sprintf(cleanupErrorMsg, operation.GetOperationType()))
 			return utils.RequeueIfError(err)
-			//
 		} else if ttl != nil && *ttl <= 0 {
 			return utils.NoRequeue()
 		}
@@ -341,14 +341,15 @@ func (t *TemplateEngine) reconcileFailed(ctx cruntime.ReconcileRequestContext, o
 	if opStatusToUpdate.Phase == common.PhaseFailed {
 		object := operation.GetOperationObject()
 		ctx.Recorder.Eventf(object, v1.EventTypeWarning, common.DataOperationFailed, "%s %s failed", operation.GetOperationType(), object.GetName())
-	}
 
-	// scale the statefulset replicas to 0 for parallel data operation
-	if operation.GetParallelTaskNumber() > 1 {
-		releaseNameSpacedName := operation.GetReleaseNameSpacedName()
-		err = kubeclient.ScaleStatefulSet(t.Client, utils.GetParallelOperationWorkersName(releaseNameSpacedName.Name), releaseNameSpacedName.Namespace, 0)
-		if err != nil {
-			return utils.RequeueIfError(err)
+		// scale the statefulset replicas to 0 for parallel data operation
+		// if the status not PhaseFailed, there is a new starting job, not scale the statefulset to zero.
+		if operation.GetParallelTaskNumber() > 1 {
+			releaseNameSpacedName := operation.GetReleaseNameSpacedName()
+			err = kubeclient.ScaleStatefulSet(t.Client, utils.GetParallelOperationWorkersName(releaseNameSpacedName.Name), releaseNameSpacedName.Namespace, 0)
+			if err != nil {
+				return utils.RequeueIfError(err)
+			}
 		}
 	}
 
diff --git a/pkg/ddc/vineyard/master_internal.go b/pkg/ddc/vineyard/master_internal.go
index 06f508d0..e96cc2b9 100644
--- a/pkg/ddc/vineyard/master_internal.go
+++ b/pkg/ddc/vineyard/master_internal.go
@@ -102,6 +102,10 @@ func (e *VineyardEngine) generateVineyardValueFile(runtime *datav1alpha1.Vineyar
 	return valueFileName, err
 }
 
+func (e *VineyardEngine) getHelmValuesConfigMapName() string {
+	return e.name + "-" + e.engineImpl + "-values"
+}
+
 func (e *VineyardEngine) getConfigmapName() string {
 	return e.name + "-" + e.engineImpl + "-values"
 }
diff --git a/pkg/ddc/vineyard/port_parser.go b/pkg/ddc/vineyard/port_parser.go
new file mode 100644
index 00000000..95d9ee4f
--- /dev/null
+++ b/pkg/ddc/vineyard/port_parser.go
@@ -0,0 +1,99 @@
+/*
+  Copyright 2023 The Fluid Authors.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+*/
+
+package vineyard
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/fluid-cloudnative/fluid/api/v1alpha1"
+	"github.com/fluid-cloudnative/fluid/pkg/common"
+	"github.com/fluid-cloudnative/fluid/pkg/utils/kubeclient"
+	"github.com/pkg/errors"
+	corev1 "k8s.io/api/core/v1"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/yaml"
+)
+
+// GetReservedPorts defines restoration logic for VineyardRuntime
+func GetReservedPorts(client client.Client) (ports []int, err error) {
+	var datasets v1alpha1.DatasetList
+	err = client.List(context.TODO(), &datasets)
+	if err != nil {
+		return nil, errors.Wrap(err, "can't list datasets when GetReservedPorts")
+	}
+
+	for _, dataset := range datasets.Items {
+		if len(dataset.Status.Runtimes) != 0 {
+			// Assume there is only one runtime with category "Accelerate"
+			accelerateRuntime := dataset.Status.Runtimes[0]
+			if accelerateRuntime.Type != common.VineyardRuntime {
+				continue
+			}
+			configMapName := fmt.Sprintf("%s-%s-values", accelerateRuntime.Name, accelerateRuntime.Type)
+			configMap, err := kubeclient.GetConfigmapByName(client, configMapName, accelerateRuntime.Namespace)
+			if err != nil {
+				return nil, errors.Wrap(err, "GetConfigMapByName when GetReservedPorts")
+			}
+
+			if configMap == nil {
+				continue
+			}
+
+			reservedPorts, err := parsePortsFromConfigMap(configMap)
+			if err != nil {
+				return nil, errors.Wrap(err, "parsePortsFromConfigMap when GetReservedPorts")
+			}
+			ports = append(ports, reservedPorts...)
+		}
+	}
+	return ports, nil
+}
+
+// parsePortsFromConfigMap extracts port usage information given a configMap
+func parsePortsFromConfigMap(configMap *corev1.ConfigMap) (ports []int, err error) {
+	var value Vineyard
+	if v, ok := configMap.Data["data"]; ok {
+		if err := yaml.Unmarshal([]byte(v), &value); err != nil {
+			return nil, err
+		}
+
+		if value.Master.HostNetwork && value.Master.Ports != nil {
+			clientPort, ok := value.Master.Ports[MasterClientName]
+			if ok {
+				fmt.Println("clientPort:", clientPort)
+				ports = append(ports, clientPort)
+			}
+			peerPort, ok := value.Master.Ports[MasterPeerName]
+			if ok {
+				fmt.Println("peerPort:", peerPort)
+				ports = append(ports, peerPort)
+			}
+		}
+		if value.Worker.HostNetwork && value.Worker.Ports != nil {
+			rpcPort, ok := value.Worker.Ports[WorkerRPCName]
+			if ok {
+				ports = append(ports, rpcPort)
+			}
+			exporterPort, ok := value.Worker.Ports[WorkerExporterName]
+			if ok {
+				ports = append(ports, exporterPort)
+			}
+		}
+	}
+	return ports, nil
+}
diff --git a/pkg/ddc/vineyard/shut_down.go b/pkg/ddc/vineyard/shut_down.go
index 9fd82162..a484e7c0 100644
--- a/pkg/ddc/vineyard/shut_down.go
+++ b/pkg/ddc/vineyard/shut_down.go
@@ -17,12 +17,15 @@ import (
 	"context"
 	"fmt"
 
+	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
 	"github.com/fluid-cloudnative/fluid/pkg/common"
 	"github.com/fluid-cloudnative/fluid/pkg/ddc/base"
+	"github.com/fluid-cloudnative/fluid/pkg/ddc/base/portallocator"
 	"github.com/fluid-cloudnative/fluid/pkg/utils"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/dataset/lifecycle"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/helm"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/kubeclient"
+	"github.com/pkg/errors"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/labels"
 	"k8s.io/client-go/util/retry"
@@ -56,6 +59,21 @@ func (e *VineyardEngine) Shutdown() (err error) {
 		return
 	}
 
+	runtime, err := e.getRuntime()
+	if err != nil {
+		return err
+	}
+	if datav1alpha1.IsHostNetwork(runtime.Spec.Master.NetworkMode) ||
+		datav1alpha1.IsHostNetwork(runtime.Spec.Worker.NetworkMode) {
+		e.Log.Info("releasePorts for hostnetwork mode")
+		err = e.releasePorts()
+		if err != nil {
+			return
+		}
+	} else {
+		e.Log.Info("skip releasePorts for container network mode")
+	}
+
 	return e.cleanAll()
 }
 
@@ -201,6 +219,34 @@ func (e *VineyardEngine) cleanupCache() (err error) {
 	//return fmt.Errorf("to make sure if the remaining cache is cleaned up, check again")
 }
 
+func (e *VineyardEngine) releasePorts() (err error) {
+	var valueConfigMapName = e.getHelmValuesConfigMapName()
+
+	allocator, err := portallocator.GetRuntimePortAllocator()
+	if err != nil {
+		return errors.Wrap(err, "GetRuntimePortAllocator when releasePorts")
+	}
+
+	cm, err := kubeclient.GetConfigmapByName(e.Client, valueConfigMapName, e.namespace)
+	if err != nil {
+		return errors.Wrap(err, "GetConfigmapByName when releasePorts")
+	}
+
+	// The value configMap is not found
+	if cm == nil {
+		e.Log.Info("value configMap not found, there might be some unreleased ports", "valueConfigMapName", valueConfigMapName)
+		return nil
+	}
+
+	portsToRelease, err := parsePortsFromConfigMap(cm)
+	if err != nil {
+		return errors.Wrap(err, "parsePortsFromConfigMap when releasePorts")
+	}
+
+	allocator.ReleaseReservedPorts(portsToRelease)
+	return nil
+}
+
 // cleanAll cleans up the all
 func (e *VineyardEngine) cleanAll() (err error) {
 	count, err := e.Helper.CleanUpFuse()
diff --git a/pkg/ddc/vineyard/transform.go b/pkg/ddc/vineyard/transform.go
index d6a777cb..8c715873 100644
--- a/pkg/ddc/vineyard/transform.go
+++ b/pkg/ddc/vineyard/transform.go
@@ -18,6 +18,7 @@ import (
 	"time"
 
 	"github.com/fluid-cloudnative/fluid/pkg/common"
+	"github.com/fluid-cloudnative/fluid/pkg/ddc/base/portallocator"
 
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
 	"github.com/fluid-cloudnative/fluid/pkg/utils"
@@ -58,6 +59,18 @@ func (e *VineyardEngine) transform(runtime *datav1alpha1.VineyardRuntime) (value
 
 	e.transformFuse(runtime, value)
 
+	e.transformPodMetadata(runtime, value)
+
+	// allocate ports for hostnetwork mode
+	if datav1alpha1.IsHostNetwork(runtime.Spec.Master.NetworkMode) ||
+		datav1alpha1.IsHostNetwork(runtime.Spec.Worker.NetworkMode) {
+		e.Log.Info("allocatePorts for hostnetwork mode")
+		err = e.allocatePorts(value, runtime)
+		if err != nil {
+			return
+		}
+	}
+
 	// TODO:(caoye) implement the metrics exporter
 	value.DisablePrometheus = true
 	return value, nil
@@ -97,6 +110,9 @@ func (e *VineyardEngine) transformMasters(runtime *datav1alpha1.VineyardRuntime,
 
 	e.transformResourcesForMaster(runtime, value)
 
+	// parse master pod network mode
+	value.Master.HostNetwork = datav1alpha1.IsHostNetwork(runtime.Spec.Worker.NetworkMode)
+
 	ports := e.transformMasterPorts(runtime)
 	if len(ports) != 0 {
 		value.Master.Ports = ports
@@ -137,6 +153,9 @@ func (e *VineyardEngine) transformWorkers(runtime *datav1alpha1.VineyardRuntime,
 		return err
 	}
 
+	// parse worker pod network mode
+	value.Worker.HostNetwork = datav1alpha1.IsHostNetwork(runtime.Spec.Worker.NetworkMode)
+
 	ports := e.transformWorkerPorts(runtime)
 	if len(ports) != 0 {
 		value.Worker.Ports = ports
@@ -168,6 +187,10 @@ func (e *VineyardEngine) transformFuse(runtime *datav1alpha1.VineyardRuntime, va
 	value.Fuse.HostPID = common.HostPIDEnabled(runtime.Annotations)
 
 	value.Fuse.TargetPath = e.getMountPoint()
+
+	// parse fuse pod network mode
+	value.Fuse.HostNetwork = datav1alpha1.IsHostNetwork(runtime.Spec.Fuse.NetworkMode)
+
 	e.transformResourcesForFuse(runtime, value)
 }
 
@@ -262,3 +285,54 @@ func (e *VineyardEngine) transformTieredStore(runtime *datav1alpha1.VineyardRunt
 
 	return tieredStore, nil
 }
+
+func (e *VineyardEngine) allocatePorts(value *Vineyard, runtime *datav1alpha1.VineyardRuntime) error {
+	expectedMasterPortNum, expectedWorkerPortNum := 0, 0
+	if datav1alpha1.IsHostNetwork(runtime.Spec.Master.NetworkMode) {
+		expectedMasterPortNum = 2
+	}
+	if datav1alpha1.IsHostNetwork(runtime.Spec.Worker.NetworkMode) {
+		expectedWorkerPortNum = 2
+	}
+	expectedPortNum := expectedMasterPortNum + expectedWorkerPortNum
+
+	allocator, err := portallocator.GetRuntimePortAllocator()
+	if err != nil {
+		e.Log.Error(err, "can't get runtime port allocator")
+		return err
+	}
+
+	allocatedPorts, err := allocator.GetAvailablePorts(expectedPortNum)
+	if err != nil {
+		e.Log.Error(err, "can't get available ports", "expected port num", expectedPortNum)
+		return err
+	}
+
+	index := 0
+	if expectedMasterPortNum > 0 {
+		value.Master.Ports[MasterClientName] = allocatedPorts[index]
+		value.Master.Ports[MasterPeerName] = allocatedPorts[index+1]
+		index += 2
+	}
+
+	if expectedWorkerPortNum > 0 {
+		value.Worker.Ports[WorkerRPCName] = allocatedPorts[index]
+		value.Worker.Ports[WorkerExporterName] = allocatedPorts[index+1]
+	}
+
+	return nil
+}
+
+func (e *VineyardEngine) transformPodMetadata(runtime *datav1alpha1.VineyardRuntime, value *Vineyard) {
+	// transform labels
+	commonLabels := utils.UnionMapsWithOverride(map[string]string{}, runtime.Spec.PodMetadata.Labels)
+	value.Master.Labels = utils.UnionMapsWithOverride(commonLabels, runtime.Spec.Master.PodMetadata.Labels)
+	value.Worker.Labels = utils.UnionMapsWithOverride(commonLabels, runtime.Spec.Worker.PodMetadata.Labels)
+	value.Fuse.Labels = utils.UnionMapsWithOverride(commonLabels, runtime.Spec.Fuse.PodMetadata.Labels)
+
+	// transform annotations
+	commonAnnotations := utils.UnionMapsWithOverride(map[string]string{}, runtime.Spec.PodMetadata.Annotations)
+	value.Master.Annotations = utils.UnionMapsWithOverride(commonAnnotations, runtime.Spec.Master.PodMetadata.Annotations)
+	value.Worker.Annotations = utils.UnionMapsWithOverride(commonAnnotations, runtime.Spec.Worker.PodMetadata.Annotations)
+	value.Fuse.Annotations = utils.UnionMapsWithOverride(commonAnnotations, runtime.Spec.Fuse.PodMetadata.Annotations)
+}
diff --git a/pkg/ddc/vineyard/type.go b/pkg/ddc/vineyard/type.go
index c8b274ee..2f422862 100644
--- a/pkg/ddc/vineyard/type.go
+++ b/pkg/ddc/vineyard/type.go
@@ -49,9 +49,12 @@ type Endpoint struct {
 
 type Master struct {
 	Replicas         int32                `json:"replicas,omitempty"`
+	Labels           map[string]string    `json:"labels,omitempty"`
+	Annotations      map[string]string    `json:"annotations,omitempty"`
 	Image            string               `json:"image,omitempty"`
 	ImageTag         string               `json:"imageTag,omitempty"`
 	ImagePullPolicy  string               `json:"imagePullPolicy,omitempty"`
+	HostNetwork      bool                 `json:"hostNetwork,omitempty"`
 	NodeSelector     map[string]string    `json:"nodeSelector,omitempty"`
 	Ports            map[string]int       `json:"ports,omitempty"`
 	Env              map[string]string    `json:"env,omitempty"`
@@ -63,9 +66,12 @@ type Master struct {
 
 type Worker struct {
 	Replicas        int32                `json:"replicas,omitempty"`
+	Labels          map[string]string    `json:"labels,omitempty"`
+	Annotations     map[string]string    `json:"annotations,omitempty"`
 	Image           string               `json:"image,omitempty"`
 	ImageTag        string               `json:"imageTag,omitempty"`
 	ImagePullPolicy string               `json:"imagePullPolicy,omitempty"`
+	HostNetwork     bool                 `json:"hostNetwork,omitempty"`
 	NodeSelector    map[string]string    `json:"nodeSelector,omitempty"`
 	Ports           map[string]int       `json:"ports,omitempty"`
 	Env             map[string]string    `json:"env,omitempty"`
@@ -75,9 +81,12 @@ type Worker struct {
 }
 
 type Fuse struct {
+	Labels          map[string]string            `json:"labels,omitempty"`
+	Annotations     map[string]string            `json:"annotations,omitempty"`
 	Image           string                       `json:"image,omitempty"`
 	ImageTag        string                       `json:"imageTag,omitempty"`
 	ImagePullPolicy string                       `json:"imagePullPolicy,omitempty"`
+	HostNetwork     bool                         `json:"hostNetwork,omitempty"`
 	Env             map[string]string            `json:"env,omitempty"`
 	CleanPolicy     datav1alpha1.FuseCleanPolicy `json:"cleanPolicy,omitempty"`
 	TargetPath      string                       `json:"targetPath,omitempty"`
diff --git a/pkg/utils/kubeclient/job.go b/pkg/utils/kubeclient/job.go
index 6784dedd..96657c0c 100644
--- a/pkg/utils/kubeclient/job.go
+++ b/pkg/utils/kubeclient/job.go
@@ -35,3 +35,7 @@ func GetJob(client client.Client, name, namespace string) (*v1.Job, error) {
 	}
 	return &job, nil
 }
+
+func UpdateJob(client client.Client, job *v1.Job) error {
+	return client.Update(context.TODO(), job)
+}


Test patch:
diff --git a/pkg/controllers/namespace_test.go b/pkg/controllers/namespace_test.go
index fef6a86c..87f33cad 100644
--- a/pkg/controllers/namespace_test.go
+++ b/pkg/controllers/namespace_test.go
@@ -1,4 +1,5 @@
 /*
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/alluxio/suite_test.go b/pkg/controllers/v1alpha1/alluxio/suite_test.go
index b08a6a72..bf51bd8c 100644
--- a/pkg/controllers/v1alpha1/alluxio/suite_test.go
+++ b/pkg/controllers/v1alpha1/alluxio/suite_test.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2022 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/databackup/databackup_controller_test.go b/pkg/controllers/v1alpha1/databackup/databackup_controller_test.go
index 1baeb1e6..148d6e15 100644
--- a/pkg/controllers/v1alpha1/databackup/databackup_controller_test.go
+++ b/pkg/controllers/v1alpha1/databackup/databackup_controller_test.go
@@ -1,3 +1,20 @@
+/*
+Copyright 2023 The Fluid Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+*/
+
 package databackup
 
 import (
diff --git a/pkg/controllers/v1alpha1/datamigrate/status_handler_test.go b/pkg/controllers/v1alpha1/datamigrate/status_handler_test.go
index 42241afc..90fbf728 100644
--- a/pkg/controllers/v1alpha1/datamigrate/status_handler_test.go
+++ b/pkg/controllers/v1alpha1/datamigrate/status_handler_test.go
@@ -17,6 +17,9 @@
 package datamigrate
 
 import (
+	"github.com/fluid-cloudnative/fluid/pkg/utils"
+	"github.com/fluid-cloudnative/fluid/pkg/utils/kubeclient"
+	appsv1 "k8s.io/api/apps/v1"
 	"reflect"
 	"testing"
 	"time"
@@ -214,3 +217,149 @@ func TestCronGetOperationStatus(t *testing.T) {
 		}
 	}
 }
+
+func TestCronGetOperationStatusWithParallelTasks(t1 *testing.T) {
+	testScheme := runtime.NewScheme()
+	_ = v1alpha1.AddToScheme(testScheme)
+	_ = batchv1.AddToScheme(testScheme)
+	_ = appsv1.AddToScheme(testScheme)
+
+	startTime := time.Date(2023, 8, 1, 12, 0, 0, 0, time.Local)
+	lastScheduleTime := v1.NewTime(startTime)
+	lastSuccessfulTime := v1.NewTime(startTime.Add(time.Second * 10))
+
+	mockCronDataMigrate := v1alpha1.DataMigrate{
+		ObjectMeta: v1.ObjectMeta{
+			Name:      "test",
+			Namespace: "default",
+		},
+		Spec: v1alpha1.DataMigrateSpec{
+			Policy:      "Cron",
+			Schedule:    "* * * * *",
+			Parallelism: 3,
+		},
+		Status: v1alpha1.OperationStatus{
+			Phase: common.PhaseComplete,
+		},
+	}
+
+	mockCronJob := batchv1.CronJob{
+		ObjectMeta: v1.ObjectMeta{
+			Name:      "test-migrate-migrate",
+			Namespace: "default",
+		},
+		Spec: batchv1.CronJobSpec{
+			Schedule: "* * * * *",
+		},
+		Status: batchv1.CronJobStatus{
+			LastScheduleTime:   &lastScheduleTime,
+			LastSuccessfulTime: &lastSuccessfulTime,
+		},
+	}
+
+	defaultStsReplicas := mockCronDataMigrate.Spec.Parallelism - 1
+	sts := appsv1.StatefulSet{
+		ObjectMeta: v1.ObjectMeta{
+			Name:      utils.GetParallelOperationWorkersName(utils.GetDataMigrateReleaseName(mockCronDataMigrate.Name)),
+			Namespace: mockCronDataMigrate.Namespace,
+		},
+		Spec: appsv1.StatefulSetSpec{
+			Replicas: &defaultStsReplicas,
+		},
+		Status: appsv1.StatefulSetStatus{},
+	}
+
+	trueFlag := true
+
+	testcases := []struct {
+		name          string
+		job           batchv1.Job
+		expectedPhase common.Phase
+		stsReplicas   int32
+	}{
+		{
+			name: "job complete, suspend is false",
+			job: batchv1.Job{
+				ObjectMeta: v1.ObjectMeta{
+					Name:      "test-migrate-migrate-1",
+					Namespace: "default",
+					Labels: map[string]string{
+						"cronjob": "test-migrate-migrate",
+					},
+					CreationTimestamp: lastScheduleTime,
+				},
+				Spec: batchv1.JobSpec{},
+				Status: batchv1.JobStatus{
+					Conditions: []batchv1.JobCondition{
+						{
+							Type:               batchv1.JobSuspended,
+							LastProbeTime:      lastSuccessfulTime,
+							LastTransitionTime: lastSuccessfulTime,
+						},
+						{
+							Type:               batchv1.JobComplete,
+							LastProbeTime:      lastSuccessfulTime,
+							LastTransitionTime: lastSuccessfulTime,
+						},
+					},
+				},
+			},
+			expectedPhase: common.PhaseComplete,
+			stsReplicas:   *sts.Spec.Replicas,
+		},
+		{
+			name: "job start, suspend is true",
+			job: batchv1.Job{
+				ObjectMeta: v1.ObjectMeta{
+					Name:      "test-migrate-migrate-1",
+					Namespace: "default",
+					Labels: map[string]string{
+						"cronjob": "test-migrate-migrate",
+					},
+					CreationTimestamp: lastScheduleTime,
+				},
+				Spec: batchv1.JobSpec{
+					Suspend: &trueFlag,
+				},
+				Status: batchv1.JobStatus{
+					Conditions: []batchv1.JobCondition{
+						{
+							Type:               batchv1.JobSuspended,
+							LastProbeTime:      lastSuccessfulTime,
+							LastTransitionTime: lastSuccessfulTime,
+						},
+					},
+				},
+			},
+			expectedPhase: common.PhasePending,
+			stsReplicas:   *sts.Spec.Replicas,
+		},
+	}
+
+	for _, testcase := range testcases {
+		t1.Run(testcase.name, func(t *testing.T) {
+			client := fake.NewFakeClientWithScheme(testScheme, &mockCronDataMigrate, &mockCronJob, &testcase.job, &sts)
+			cronStatusHandler := &CronStatusHandler{Client: client, dataMigrate: &mockCronDataMigrate}
+			ctx := cruntime.ReconcileRequestContext{Log: fake.NullLogger()}
+			opStatus, err := cronStatusHandler.GetOperationStatus(ctx, &mockCronDataMigrate.Status)
+			if err != nil {
+				t.Errorf("fail to GetOperationStatus with error %v", err)
+			}
+			if !reflect.DeepEqual(opStatus.LastScheduleTime, &lastScheduleTime) || !reflect.DeepEqual(opStatus.LastSuccessfulTime, &lastSuccessfulTime) {
+				t.Error("fail to get correct Operation Status", "expected LastScheduleTime", lastScheduleTime, "expected LastSuccessfulTime", lastSuccessfulTime, "get", opStatus)
+			}
+			if opStatus.Phase != testcase.expectedPhase {
+				t.Error("Failed to GetOperationStatus", "expected phase", testcase.expectedPhase, "get", opStatus.Phase)
+			}
+
+			updatedSts, err := kubeclient.GetStatefulSet(client, sts.Name, sts.Namespace)
+			if err != nil {
+				t.Error("Failed to GetStatefulSet", err)
+			}
+
+			if *updatedSts.Spec.Replicas != testcase.stsReplicas {
+				t.Error("Failed to GetOperationStatus", "expected replicas", testcase.stsReplicas, "get", *sts.Spec.Replicas)
+			}
+		})
+	}
+}
diff --git a/pkg/controllers/v1alpha1/dataprocess/suite_test.go b/pkg/controllers/v1alpha1/dataprocess/suite_test.go
index 9a854b91..58baca45 100644
--- a/pkg/controllers/v1alpha1/dataprocess/suite_test.go
+++ b/pkg/controllers/v1alpha1/dataprocess/suite_test.go
@@ -1,4 +1,5 @@
 /*
+Copyright 2023 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/dataset/suite_test.go b/pkg/controllers/v1alpha1/dataset/suite_test.go
index 3b748d71..02a7307e 100644
--- a/pkg/controllers/v1alpha1/dataset/suite_test.go
+++ b/pkg/controllers/v1alpha1/dataset/suite_test.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/goosefs/suite_test.go b/pkg/controllers/v1alpha1/goosefs/suite_test.go
index 9a29863a..02c120c1 100644
--- a/pkg/controllers/v1alpha1/goosefs/suite_test.go
+++ b/pkg/controllers/v1alpha1/goosefs/suite_test.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/controllers/v1alpha1/jindo/suite_test.go b/pkg/controllers/v1alpha1/jindo/suite_test.go
index 221e50d7..4f81c992 100644
--- a/pkg/controllers/v1alpha1/jindo/suite_test.go
+++ b/pkg/controllers/v1alpha1/jindo/suite_test.go
@@ -1,4 +1,5 @@
 /*
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/csi/updatedbconf/updatedbconf_test.go b/pkg/csi/updatedbconf/updatedbconf_test.go
index 6d489b35..b193ddb3 100644
--- a/pkg/csi/updatedbconf/updatedbconf_test.go
+++ b/pkg/csi/updatedbconf/updatedbconf_test.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Author.
+Copyright 2024 The Fluid Author.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/alluxio/runtime_info_test.go b/pkg/ddc/alluxio/runtime_info_test.go
index d71a55ce..0dfdaeb6 100644
--- a/pkg/ddc/alluxio/runtime_info_test.go
+++ b/pkg/ddc/alluxio/runtime_info_test.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/alluxio/transform_api_gateway_test.go b/pkg/ddc/alluxio/transform_api_gateway_test.go
index ce81938c..75120701 100644
--- a/pkg/ddc/alluxio/transform_api_gateway_test.go
+++ b/pkg/ddc/alluxio/transform_api_gateway_test.go
@@ -82,7 +82,7 @@ func TestTransformAPIGateway(t *testing.T) {
 				t.Errorf("should return err if it's possible to lead to nil pointer")
 			}
 		} else if test.runtime.Spec.APIGateway.Enabled != test.value.APIGateway.Enabled {
-			t.Errorf("testcase cannot paas beacuse of wrong result,%t != %t",
+			t.Errorf("testcase cannot paas because of wrong result,%t != %t",
 				test.runtime.Spec.APIGateway.Enabled,
 				test.value.APIGateway.Enabled)
 		}
diff --git a/pkg/ddc/alluxio/transform_test.go b/pkg/ddc/alluxio/transform_test.go
index 35eb9025..7d1cb188 100755
--- a/pkg/ddc/alluxio/transform_test.go
+++ b/pkg/ddc/alluxio/transform_test.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/alluxio/transform_ufs_test.go b/pkg/ddc/alluxio/transform_ufs_test.go
index e98f619f..6e213feb 100644
--- a/pkg/ddc/alluxio/transform_ufs_test.go
+++ b/pkg/ddc/alluxio/transform_ufs_test.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/alluxio/transform_volumes_test.go b/pkg/ddc/alluxio/transform_volumes_test.go
index 0d1788d5..cc79bad2 100644
--- a/pkg/ddc/alluxio/transform_volumes_test.go
+++ b/pkg/ddc/alluxio/transform_volumes_test.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2022 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/alluxio/utils_test.go b/pkg/ddc/alluxio/utils_test.go
index 9ff4748a..f68ab46a 100644
--- a/pkg/ddc/alluxio/utils_test.go
+++ b/pkg/ddc/alluxio/utils_test.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2023 The Fluid Authors.
+Copyright 2021 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/base/base_suite_test.go b/pkg/ddc/base/base_suite_test.go
index 46f5d174..29529312 100644
--- a/pkg/ddc/base/base_suite_test.go
+++ b/pkg/ddc/base/base_suite_test.go
@@ -1,5 +1,5 @@
 /*
-Copyright 2021 The Fluid Authors.
+Copyright 2020 The Fluid Authors.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/pkg/ddc/vineyard/master_internal_test.go b/pkg/ddc/vineyard/master_internal_test.go
index 3de1d060..4b4b7b1d 100644
--- a/pkg/ddc/vineyard/master_internal_test.go
+++ b/pkg/ddc/vineyard/master_internal_test.go
@@ -21,13 +21,24 @@ import (
 	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/util/net"
+	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
+	"github.com/fluid-cloudnative/fluid/pkg/ddc/base/portallocator"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/fake"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/helm"
 )
 
 func TestSetupMasterInternal(t *testing.T) {
+	pr := net.ParsePortRangeOrDie("14000-15999")
+	dummyPorts := func(client client.Client) (ports []int, err error) {
+		return []int{14000, 14001, 14002, 14003}, nil
+	}
+	err := portallocator.SetupRuntimePortAllocator(nil, pr, "bitmap", dummyPorts)
+	if err != nil {
+		t.Fatal(err.Error())
+	}
 	mockExecCheckReleaseCommonFound := func(name string, namespace string) (exist bool, err error) {
 		return true, nil
 	}
@@ -105,7 +116,7 @@ func TestSetupMasterInternal(t *testing.T) {
 			},
 		},
 	}
-	err := engine.setupMasterInternal()
+	err = engine.setupMasterInternal()
 	if err == nil {
 		t.Errorf("fail to catch the error")
 	}
diff --git a/pkg/ddc/vineyard/port_parser_test.go b/pkg/ddc/vineyard/port_parser_test.go
new file mode 100644
index 00000000..6a5d6d38
--- /dev/null
+++ b/pkg/ddc/vineyard/port_parser_test.go
@@ -0,0 +1,116 @@
+/*
+  Copyright 2023 The Fluid Authors.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+*/
+
+package vineyard
+
+import (
+	"reflect"
+	"testing"
+
+	"github.com/fluid-cloudnative/fluid/api/v1alpha1"
+	"github.com/fluid-cloudnative/fluid/pkg/utils/fake"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+var (
+	dummyConfigMapData = `master:
+  hostNetwork: true
+  ports:
+    client: 14001
+    peer: 14002
+worker:
+  hostNetwork: true
+  ports:
+    rpc: 14003
+    exporter: 14004
+`
+)
+
+func TestGetReservedPorts(t *testing.T) {
+	configMap := &corev1.ConfigMap{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      "test-vineyard-values",
+			Namespace: "fluid",
+		},
+		Data: map[string]string{
+			"data": mockConfigMapData,
+		},
+	}
+	dataSets := []*v1alpha1.Dataset{
+		{
+			ObjectMeta: metav1.ObjectMeta{Name: "test", Namespace: "fluid"},
+			Status: v1alpha1.DatasetStatus{
+				Runtimes: []v1alpha1.Runtime{{
+					Name:      "test",
+					Namespace: "fluid",
+					Type:      "vineyard",
+				}},
+			},
+		},
+	}
+	runtimeObjs := []runtime.Object{}
+	runtimeObjs = append(runtimeObjs, configMap)
+	for _, dataSet := range dataSets {
+		runtimeObjs = append(runtimeObjs, dataSet.DeepCopy())
+	}
+	fakeClient := fake.NewFakeClientWithScheme(testScheme, runtimeObjs...)
+	wantPorts := []int{14001, 14002, 14003, 14004}
+	ports, err := GetReservedPorts(fakeClient)
+	if err != nil {
+		t.Errorf("GetReservedPorts failed.")
+	}
+	if !reflect.DeepEqual(ports, wantPorts) {
+		t.Errorf("gotPorts = %v, want %v", ports, wantPorts)
+	}
+
+}
+
+func Test_parsePortsFromConfigMap(t *testing.T) {
+	type args struct {
+		configMap *corev1.ConfigMap
+	}
+	tests := []struct {
+		name      string
+		args      args
+		wantPorts []int
+		wantErr   bool
+	}{
+		{
+			name: "parsePortsFromConfigMap",
+			args: args{configMap: &corev1.ConfigMap{
+				Data: map[string]string{
+					"data": dummyConfigMapData,
+				},
+			}},
+			wantPorts: []int{14001, 14002, 14003, 14004},
+			wantErr:   false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			gotPorts, err := parsePortsFromConfigMap(tt.args.configMap)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("parsePortsFromConfigMap() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(gotPorts, tt.wantPorts) {
+				t.Errorf("parsePortsFromConfigMap() gotPorts = %v, want %v", gotPorts, tt.wantPorts)
+			}
+		})
+	}
+}
diff --git a/pkg/ddc/vineyard/shut_down_test.go b/pkg/ddc/vineyard/shut_down_test.go
index d7697dba..f93cc2a0 100644
--- a/pkg/ddc/vineyard/shut_down_test.go
+++ b/pkg/ddc/vineyard/shut_down_test.go
@@ -18,11 +18,13 @@ import (
 	"testing"
 
 	appsv1 "k8s.io/api/apps/v1"
+	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	. "github.com/agiledragon/gomonkey/v2"
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
 	"github.com/fluid-cloudnative/fluid/pkg/ctrl"
 	"github.com/fluid-cloudnative/fluid/pkg/ddc/base"
+	"github.com/fluid-cloudnative/fluid/pkg/ddc/base/portallocator"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/fake"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/helm"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/kubeclient"
@@ -30,27 +32,22 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/util/net"
 )
 
 var (
 	testScheme        *runtime.Scheme
-	mockConfigMapData = `master:
-	ports:
-	  rpc: 30399
-	  web: 31203
-  jobMaster:
-	ports:
-	  rpc: 28362
-	  web: 31380
-  worker:
-	ports:
-	  rpc: 31285
-	  web: 31674
-  jobWorker:
-	ports:
-	  rpc: 29476
-	  web: 27403
-	  data: 30918`
+	mockConfigMapData = `
+master:
+  hostNetwork: true
+  ports:
+    client: 14001
+    peer: 14002
+worker:
+  hostNetwork: true
+  ports:
+    rpc: 14003
+    exporter: 14004`
 )
 
 func init() {
@@ -369,3 +366,69 @@ func TestVineyardEngineDestroyMaster(t *testing.T) {
 		})
 	}
 }
+
+func TestVineyardEngineReleasePorts(t *testing.T) {
+	dummyPorts := func(client client.Client) (ports []int, err error) {
+		return []int{14000, 14001, 14002, 14003}, nil
+	}
+	type fields struct {
+		runtime     *datav1alpha1.VineyardRuntime
+		name        string
+		namespace   string
+		runtimeType string
+		cm          *corev1.ConfigMap
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		wantErr bool
+	}{
+		{
+			name: "vineyard",
+			fields: fields{
+				name:        "vineyard",
+				namespace:   "fluid",
+				runtimeType: "vineyard",
+				cm: &corev1.ConfigMap{
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      "vineyard-values",
+						Namespace: "fluid",
+					},
+					Data: map[string]string{"data": mockConfigMapData},
+				},
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			portRange := "14000-16000"
+			pr, _ := net.ParsePortRange(portRange)
+			testObjs := []runtime.Object{}
+			testObjs = append(testObjs, tt.fields.cm.DeepCopy())
+			client := fake.NewFakeClientWithScheme(testScheme, testObjs...)
+
+			e := &VineyardEngine{
+				runtime:   tt.fields.runtime,
+				name:      tt.fields.name,
+				namespace: tt.fields.namespace,
+				Client:    client,
+				Log:       fake.NullLogger(),
+			}
+
+			err := portallocator.SetupRuntimePortAllocator(client, pr, "bitmap", dummyPorts)
+			if err != nil {
+				t.Fatal(err.Error())
+			}
+			allocator, _ := portallocator.GetRuntimePortAllocator()
+			patch1 := ApplyMethod(reflect.TypeOf(allocator), "ReleaseReservedPorts",
+				func(_ *portallocator.RuntimePortAllocator, ports []int) {
+				})
+			defer patch1.Reset()
+
+			if err := e.releasePorts(); (err != nil) != tt.wantErr {
+				t.Errorf("VineyardEngine.releasePorts() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
diff --git a/pkg/ddc/vineyard/transform_test.go b/pkg/ddc/vineyard/transform_test.go
index a6c15e6e..f29adfe7 100755
--- a/pkg/ddc/vineyard/transform_test.go
+++ b/pkg/ddc/vineyard/transform_test.go
@@ -21,9 +21,12 @@ import (
 
 	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
 	"github.com/fluid-cloudnative/fluid/pkg/ddc/base"
+	"github.com/fluid-cloudnative/fluid/pkg/ddc/base/portallocator"
 	"github.com/fluid-cloudnative/fluid/pkg/utils/fake"
 	"k8s.io/apimachinery/pkg/api/resource"
+	"k8s.io/apimachinery/pkg/util/net"
 	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 )
 
@@ -622,3 +625,230 @@ func TestTransformTieredStore(t *testing.T) {
 		})
 	}
 }
+
+func TestVineyardEngineAllocatePorts(t *testing.T) {
+	pr := net.ParsePortRangeOrDie("14000-16000")
+	dummyPorts := func(client client.Client) (ports []int, err error) {
+		return []int{14000, 14001, 14002, 14003}, nil
+	}
+	err := portallocator.SetupRuntimePortAllocator(nil, pr, "bitmap", dummyPorts)
+	if err != nil {
+		t.Fatal(err.Error())
+	}
+	type args struct {
+		runtime *datav1alpha1.VineyardRuntime
+		value   *Vineyard
+	}
+	tests := []struct {
+		name            string
+		args            args
+		wantErr         bool
+		wantMasterPorts map[string]int
+		wantWorkerPorts map[string]int
+	}{
+		{
+			name: "Expect not to allocate ports",
+			args: args{
+				runtime: &datav1alpha1.VineyardRuntime{
+					Spec: datav1alpha1.VineyardRuntimeSpec{
+						Master: datav1alpha1.MasterSpec{
+							VineyardCompTemplateSpec: datav1alpha1.VineyardCompTemplateSpec{
+								NetworkMode: "ContainerNetwork",
+							},
+						},
+						Worker: datav1alpha1.VineyardCompTemplateSpec{
+							NetworkMode: "ContainerNetwork",
+						},
+					},
+				},
+				value: &Vineyard{
+					Master: Master{
+						Ports: map[string]int{
+							MasterClientName: MasterClientPort,
+							MasterPeerName:   MasterPeerPort,
+						},
+					},
+					Worker: Worker{
+						Ports: map[string]int{
+							WorkerRPCName:      WorkerRPCPort,
+							WorkerExporterName: WorkerExporterPort,
+						},
+					},
+				},
+			},
+			wantErr: false,
+			wantMasterPorts: map[string]int{
+				MasterClientName: MasterClientPort,
+				MasterPeerName:   MasterPeerPort,
+			},
+			wantWorkerPorts: map[string]int{
+				WorkerRPCName:      WorkerRPCPort,
+				WorkerExporterName: WorkerExporterPort,
+			},
+		},
+		{
+			name: "Expect to allocate ports",
+			args: args{
+				runtime: &datav1alpha1.VineyardRuntime{
+					Spec: datav1alpha1.VineyardRuntimeSpec{
+						Master: datav1alpha1.MasterSpec{
+							VineyardCompTemplateSpec: datav1alpha1.VineyardCompTemplateSpec{
+								NetworkMode: "HostNetwork",
+							},
+						},
+						Worker: datav1alpha1.VineyardCompTemplateSpec{
+							NetworkMode: "HostNetwork",
+						},
+					},
+				},
+				value: &Vineyard{
+					Master: Master{
+						Ports: map[string]int{
+							MasterClientName: MasterClientPort,
+							MasterPeerName:   MasterPeerPort,
+						},
+					},
+					Worker: Worker{
+						Ports: map[string]int{
+							WorkerRPCName:      WorkerRPCPort,
+							WorkerExporterName: WorkerExporterPort,
+						},
+					},
+				},
+			},
+			wantErr: false,
+			wantMasterPorts: map[string]int{
+				MasterClientName: MasterClientPort,
+				MasterPeerName:   MasterPeerPort,
+			},
+			wantWorkerPorts: map[string]int{
+				WorkerRPCName:      WorkerRPCPort,
+				WorkerExporterName: WorkerExporterPort,
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			v := &VineyardEngine{}
+			if err := v.allocatePorts(tt.args.value, tt.args.runtime); (err != nil) != tt.wantErr {
+				t.Errorf("allocatePorts() error = %v, wantErr %v", err, tt.wantErr)
+			}
+			if strings.Contains(tt.name, "Expect not to allocate ports") {
+				if !reflect.DeepEqual(tt.wantMasterPorts, tt.args.value.Master.Ports) {
+					t.Errorf("allocatePorts() got master ports = %v, want %v", tt.args.value.Master.Ports, tt.wantMasterPorts)
+				}
+				if !reflect.DeepEqual(tt.wantWorkerPorts, tt.args.value.Worker.Ports) {
+					t.Errorf("allocatePorts() got worker ports = %v, want %v", tt.args.value.Worker.Ports, tt.wantWorkerPorts)
+				}
+			} else {
+				if len(tt.args.value.Master.Ports) != 2 {
+					t.Errorf("allocatePorts() got master ports = %v, want 2", len(tt.args.value.Master.Ports))
+				}
+				if len(tt.args.value.Worker.Ports) != 2 {
+					t.Errorf("allocatePorts() got worker ports = %v, want 2", len(tt.args.value.Worker.Ports))
+				}
+				if tt.args.value.Master.Ports[MasterClientName] < 14000 || tt.args.value.Master.Ports[MasterClientName] > 16000 {
+					t.Errorf("allocatePorts() got master client port = %v, want between 14000 and 16000", tt.args.value.Master.Ports[MasterClientName])
+				}
+				if tt.args.value.Master.Ports[MasterPeerName] < 14000 || tt.args.value.Master.Ports[MasterPeerName] > 16000 {
+					t.Errorf("allocatePorts() got master peer port = %v, want between 14000 and 16000", tt.args.value.Master.Ports[MasterPeerName])
+				}
+				if tt.args.value.Worker.Ports[WorkerRPCName] < 14000 || tt.args.value.Worker.Ports[WorkerRPCName] > 16000 {
+					t.Errorf("allocatePorts() got worker rpc port = %v, want between 14000 and 16000", tt.args.value.Worker.Ports[WorkerRPCName])
+				}
+				if tt.args.value.Worker.Ports[WorkerExporterName] < 14000 || tt.args.value.Worker.Ports[WorkerExporterName] > 16000 {
+					t.Errorf("allocatePorts() got worker exporter port = %v, want between 14000 and 16000", tt.args.value.Worker.Ports[WorkerExporterName])
+				}
+			}
+		})
+	}
+}
+
+func TestVineyardEngineTransformPodMetadata(t *testing.T) {
+	engine := &VineyardEngine{Log: fake.NullLogger()}
+
+	type testCase struct {
+		Name    string
+		Runtime *datav1alpha1.VineyardRuntime
+		Value   *Vineyard
+
+		wantValue *Vineyard
+	}
+
+	testCases := []testCase{
+		{
+			Name: "set_common_labels_and_annotations",
+			Runtime: &datav1alpha1.VineyardRuntime{
+				Spec: datav1alpha1.VineyardRuntimeSpec{
+					PodMetadata: datav1alpha1.PodMetadata{
+						Labels:      map[string]string{"common-key": "common-value"},
+						Annotations: map[string]string{"common-annotation": "val"},
+					},
+				},
+			},
+			Value: &Vineyard{},
+			wantValue: &Vineyard{
+				Master: Master{
+					Labels:      map[string]string{"common-key": "common-value"},
+					Annotations: map[string]string{"common-annotation": "val"},
+				},
+				Worker: Worker{
+					Labels:      map[string]string{"common-key": "common-value"},
+					Annotations: map[string]string{"common-annotation": "val"},
+				},
+				Fuse: Fuse{
+					Labels:      map[string]string{"common-key": "common-value"},
+					Annotations: map[string]string{"common-annotation": "val"},
+				},
+			},
+		},
+		{
+			Name: "set_master_and_workers_labels_and_annotations",
+			Runtime: &datav1alpha1.VineyardRuntime{
+				Spec: datav1alpha1.VineyardRuntimeSpec{
+					PodMetadata: datav1alpha1.PodMetadata{
+						Labels:      map[string]string{"common-key": "common-value"},
+						Annotations: map[string]string{"common-annotation": "val"},
+					},
+					Master: datav1alpha1.MasterSpec{
+						VineyardCompTemplateSpec: datav1alpha1.VineyardCompTemplateSpec{
+							PodMetadata: datav1alpha1.PodMetadata{
+								Labels:      map[string]string{"common-key": "master-value"},
+								Annotations: map[string]string{"common-annotation": "master-val"},
+							},
+						},
+					},
+					Worker: datav1alpha1.VineyardCompTemplateSpec{
+						PodMetadata: datav1alpha1.PodMetadata{
+							Labels:      map[string]string{"common-key": "worker-value"},
+							Annotations: map[string]string{"common-annotation": "worker-val"},
+						},
+					},
+				},
+			},
+			Value: &Vineyard{},
+			wantValue: &Vineyard{
+				Master: Master{
+					Labels:      map[string]string{"common-key": "master-value"},
+					Annotations: map[string]string{"common-annotation": "master-val"},
+				},
+				Worker: Worker{
+					Labels:      map[string]string{"common-key": "worker-value"},
+					Annotations: map[string]string{"common-annotation": "worker-val"},
+				},
+				Fuse: Fuse{
+					Labels:      map[string]string{"common-key": "common-value"},
+					Annotations: map[string]string{"common-annotation": "val"},
+				},
+			},
+		},
+	}
+
+	for _, tt := range testCases {
+		engine.transformPodMetadata(tt.Runtime, tt.Value)
+
+		if !reflect.DeepEqual(tt.Value, tt.wantValue) {
+			t.Fatalf("test name: %s. Expect value %v, but got %v", tt.Name, tt.wantValue, tt.Value)
+		}
+	}
+}