Repository: fluid-cloudnative/fluid
Pull request #3700 (2024-01-22 05:28:28)

Add a replicas field to the vineyard Runtime and delete the svc suffix in the vineyard helm chart.

### Ⅰ. Describe what this PR does

As titled.


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 @dashanji. 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=3700) **Quality Gate passed**  
Kudos, no new issues were introduced!

[0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
[0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
No data about Coverage  
[21.2% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3700&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3700)


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3700?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative) Report
Attention: `2 lines` in your changes are missing coverage. Please review.
> Comparison is base [(`c7cfb18`)](https://app.codecov.io/gh/fluid-cloudnative/fluid/commit/c7cfb18888708c4af42fec29a9f423901b6b0ed2?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative) 64.47% compared to head [(`bd6b2d5`)](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3700?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative) 64.47%.

| [Files](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3700?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative) | Patch % | Lines |
|---|---|---|
| [pkg/ddc/vineyard/transform.go](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3700?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative#diff-cGtnL2RkYy92aW5leWFyZC90cmFuc2Zvcm0uZ28=) | 60.00% | [0 Missing and 2 partials :warning: ](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3700?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative) |

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


```diff
@@            Coverage Diff             @@
##           master    #3700      +/-   ##
==========================================
- Coverage   64.47%   64.47%   -0.01%     
==========================================
  Files         473      473              
  Lines       28260    28262       +2     
==========================================
+ Hits        18220    18221       +1     
  Misses       7878     7878              
- Partials     2162     2163       +1     
```



</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/fluid-cloudnative/fluid/pull/3700?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=fluid-cloudnative).

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=3700) **Quality Gate passed**  
Kudos, no new issues were introduced!

[0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
[0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
No data about Coverage  
[21.2% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3700&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3700)


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=3700) **Quality Gate passed**  
Kudos, no new issues were introduced!

[0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
[0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
No data about Coverage  
[21.1% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3700&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3700)


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=3700) **Quality Gate passed**  
Kudos, no new issues were introduced!

[0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
[0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
No data about Coverage  
[21.2% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3700&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3700)


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=3700) **Quality Gate passed**  
Kudos, no new issues were introduced!

[0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
[0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
No data about Coverage  
[21.2% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3700&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3700)


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=3700) **Quality Gate passed**  
Kudos, no new issues were introduced!

[0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
[0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
No data about Coverage  
[21.2% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3700&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3700)


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=3700) **Quality Gate passed**  
Kudos, no new issues were introduced!

[0 New issues](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
[0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
No data about Coverage  
[21.2% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3700&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3700)


dashanji: @cheyang Could you please take a look at this? Thanks.
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=3700) **Quality Gate passed**  
The SonarCloud Quality Gate passed, but some issues were introduced.

[1 New issue](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
[0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
No data about Coverage  
[20.9% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3700&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3700)


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=3700) **Quality Gate passed**  
The SonarCloud Quality Gate passed, but some issues were introduced.

[1 New issue](https://sonarcloud.io/project/issues?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
[0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=fluid-cloudnative_fluid&pullRequest=3700&resolved=false&inNewCodePeriod=true)  
No data about Coverage  
[20.9% Duplication on New Code](https://sonarcloud.io/component_measures?id=fluid-cloudnative_fluid&pullRequest=3700&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=fluid-cloudnative_fluid&pullRequest=3700)



Patch:
diff --git a/api/v1alpha1/openapi_generated.go b/api/v1alpha1/openapi_generated.go
index e08a488b..df37d04b 100644
--- a/api/v1alpha1/openapi_generated.go
+++ b/api/v1alpha1/openapi_generated.go
@@ -6613,6 +6613,13 @@ func schema_fluid_cloudnative_fluid_api_v1alpha1_VineyardRuntimeSpec(ref common.
 							Ref:         ref("github.com/fluid-cloudnative/fluid/api/v1alpha1.VineyardCompTemplateSpec"),
 						},
 					},
+					"replicas": {
+						SchemaProps: spec.SchemaProps{
+							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:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
 					"fuse": {
 						SchemaProps: spec.SchemaProps{
 							Description: "Fuse holds the configurations for Vineyard client socket. Note that the \"Fuse\" here is kept just for API consistency, VineyardRuntime mount a socket file instead of a FUSE filesystem to make data cache available. Applications can connect to the vineyard runtime components through IPC or RPC. IPC is the default way to connect to vineyard runtime components, which is more efficient than RPC. If the socket file is not mounted, the connection will fall back to RPC.",
diff --git a/api/v1alpha1/swagger.json b/api/v1alpha1/swagger.json
index bccd44be..c461dc53 100644
--- a/api/v1alpha1/swagger.json
+++ b/api/v1alpha1/swagger.json
@@ -1385,10 +1385,14 @@
     },
     ".EncryptOption": {
       "type": "object",
+      "required": [
+        "name"
+      ],
       "properties": {
         "name": {
           "description": "The name of encryptOption",
-          "type": "string"
+          "type": "string",
+          "default": ""
         },
         "valueFrom": {
           "description": "The valueFrom of encryptOption",
@@ -2572,6 +2576,9 @@
     ".Mount": {
       "description": "Mount describes a mounting. \u003cbr\u003e Refer to \u003ca href=\"https://docs.alluxio.io/os/user/stable/en/ufs/S3.html\"\u003eAlluxio Storage Integrations\u003c/a\u003e for more info",
       "type": "object",
+      "required": [
+        "mountPoint"
+      ],
       "properties": {
         "encryptOptions": {
           "description": "The secret information",
@@ -2583,7 +2590,8 @@
         },
         "mountPoint": {
           "description": "MountPoint is the mount point of source.",
-          "type": "string"
+          "type": "string",
+          "default": ""
         },
         "name": {
           "description": "The name of mount",
@@ -3069,6 +3077,9 @@
     },
     ".SecretKeySelector": {
       "type": "object",
+      "required": [
+        "name"
+      ],
       "properties": {
         "key": {
           "description": "The required key in the secret",
@@ -3076,7 +3087,8 @@
         },
         "name": {
           "description": "The name of required secret",
-          "type": "string"
+          "type": "string",
+          "default": ""
         }
       }
     },
@@ -3714,6 +3726,11 @@
           "default": {},
           "$ref": "#/definitions/.MasterSpec"
         },
+        "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",
+          "format": "int32"
+        },
         "tieredstore": {
           "description": "Tiered storage used by vineyardd The MediumType can only be `MEM` and `SSD` `MEM` actually represents the shared memory of vineyardd. `SSD` represents the external storage of vineyardd. Default is as follows.\n  tieredstore:\n    levels:\n    - level: 0\n      mediumtype: MEM\n      quota: 4Gi\n\nChoose hostpath as the external storage of vineyardd.\n  tieredstore:\n    levels:\n\t   - level: 0\n      mediumtype: MEM\n      quota: 4Gi\n\t\t high: \"0.8\"\n      low: \"0.3\"\n    - level: 1\n      mediumtype: SSD\n      quota: 10Gi\n      volumeType: Hostpath\n      path: /var/spill-path",
           "default": {},
diff --git a/api/v1alpha1/vineyardruntime_types.go b/api/v1alpha1/vineyardruntime_types.go
index 78d25670..b07e955b 100644
--- a/api/v1alpha1/vineyardruntime_types.go
+++ b/api/v1alpha1/vineyardruntime_types.go
@@ -183,6 +183,10 @@ type VineyardRuntimeSpec struct {
 	// +optional
 	Worker VineyardCompTemplateSpec `json:"worker,omitempty"`
 
+	// The replicas of the worker, need to be specified
+	// If worker.replicas and the field are both specified, the field will be respected
+	Replicas int32 `json:"replicas,omitempty"`
+
 	// Fuse holds the configurations for Vineyard client socket.
 	// Note that the "Fuse" here is kept just for API consistency, VineyardRuntime mount a socket file instead of a FUSE filesystem to make data cache available.
 	// Applications can connect to the vineyard runtime components through IPC or RPC.
@@ -272,7 +276,7 @@ func init() {
 
 // Replicas gets the replicas of runtime worker
 func (runtime *VineyardRuntime) Replicas() int32 {
-	return runtime.Spec.Worker.Replicas
+	return runtime.Spec.Replicas
 }
 
 func (runtime *VineyardRuntime) GetStatus() *RuntimeStatus {
diff --git a/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml b/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
index 948a2684..3e22f9f0 100644
--- a/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
+++ b/charts/fluid/fluid/crds/data.fluid.io_vineyardruntimes.yaml
@@ -322,6 +322,11 @@ spec:
                       type: object
                     type: array
                 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
+                format: int32
+                type: integer
               tieredstore:
                 description: "Tiered storage used by vineyardd The MediumType can
                   only be `MEM` and `SSD` `MEM` actually represents the shared memory
diff --git a/charts/jindocache/templates/fuse/daemonset.yaml b/charts/jindocache/templates/fuse/daemonset.yaml
index 1fcaa49d..d1c34d50 100755
--- a/charts/jindocache/templates/fuse/daemonset.yaml
+++ b/charts/jindocache/templates/fuse/daemonset.yaml
@@ -199,7 +199,7 @@ spec:
         - tbsite.net
         - aliyun.com
       dnsPolicy: None
-      enableServiceLinks: true
+      enableServiceLinks: false
       {{- end }}
       terminationGracePeriodSeconds: 60
       volumes:
diff --git a/charts/jindocache/templates/master/statefulset.yaml b/charts/jindocache/templates/master/statefulset.yaml
index f815d60b..3ce73ea3 100755
--- a/charts/jindocache/templates/master/statefulset.yaml
+++ b/charts/jindocache/templates/master/statefulset.yaml
@@ -206,7 +206,7 @@ spec:
         - tbsite.net
         - aliyun.com
       dnsPolicy: None
-      enableServiceLinks: true
+      enableServiceLinks: false
       {{- end }}
       volumes:
           {{- range $name, $mount := .Values.mounts.master }}
diff --git a/charts/jindocache/templates/worker/statefulset.yaml b/charts/jindocache/templates/worker/statefulset.yaml
index fdf3b3b6..9ef81b62 100755
--- a/charts/jindocache/templates/worker/statefulset.yaml
+++ b/charts/jindocache/templates/worker/statefulset.yaml
@@ -203,7 +203,7 @@ spec:
         - tbsite.net
         - aliyun.com
       dnsPolicy: None
-      enableServiceLinks: true
+      enableServiceLinks: false
       {{- end }}
       volumes:
           {{- range $name, $mount := .Values.mounts.workersAndClients }}
diff --git a/charts/jindofs/templates/fuse/daemonset.yaml b/charts/jindofs/templates/fuse/daemonset.yaml
index bc1685a1..83cdcc89 100755
--- a/charts/jindofs/templates/fuse/daemonset.yaml
+++ b/charts/jindofs/templates/fuse/daemonset.yaml
@@ -166,7 +166,7 @@ spec:
         - tbsite.net
         - aliyun.com
       dnsPolicy: None
-      enableServiceLinks: true
+      enableServiceLinks: false
       {{- end }}
       terminationGracePeriodSeconds: 60
       volumes:
diff --git a/charts/jindofs/templates/master/statefulset.yaml b/charts/jindofs/templates/master/statefulset.yaml
index 76ae5552..6653ee30 100755
--- a/charts/jindofs/templates/master/statefulset.yaml
+++ b/charts/jindofs/templates/master/statefulset.yaml
@@ -171,7 +171,7 @@ spec:
         - tbsite.net
         - aliyun.com
       dnsPolicy: None
-      enableServiceLinks: true
+      enableServiceLinks: false
       {{- end }}
       volumes:
         - hostPath:
diff --git a/charts/jindofs/templates/worker/statefulset.yaml b/charts/jindofs/templates/worker/statefulset.yaml
index 27f7be53..e1a22af3 100755
--- a/charts/jindofs/templates/worker/statefulset.yaml
+++ b/charts/jindofs/templates/worker/statefulset.yaml
@@ -158,7 +158,7 @@ spec:
         - tbsite.net
         - aliyun.com
       dnsPolicy: None
-      enableServiceLinks: true
+      enableServiceLinks: false
       {{- end }}
       volumes:
         - hostPath:
diff --git a/charts/jindofsx/templates/fuse/daemonset.yaml b/charts/jindofsx/templates/fuse/daemonset.yaml
index a31ceb9d..717426a9 100755
--- a/charts/jindofsx/templates/fuse/daemonset.yaml
+++ b/charts/jindofsx/templates/fuse/daemonset.yaml
@@ -199,7 +199,7 @@ spec:
         - tbsite.net
         - aliyun.com
       dnsPolicy: None
-      enableServiceLinks: true
+      enableServiceLinks: false
       {{- end }}
       terminationGracePeriodSeconds: 60
       volumes:
diff --git a/charts/jindofsx/templates/master/statefulset.yaml b/charts/jindofsx/templates/master/statefulset.yaml
index 034fdee0..759250bd 100755
--- a/charts/jindofsx/templates/master/statefulset.yaml
+++ b/charts/jindofsx/templates/master/statefulset.yaml
@@ -206,7 +206,7 @@ spec:
         - tbsite.net
         - aliyun.com
       dnsPolicy: None
-      enableServiceLinks: true
+      enableServiceLinks: false
       {{- end }}
       volumes:
           {{- range $name, $mount := .Values.mounts.master }}
diff --git a/charts/jindofsx/templates/worker/statefulset.yaml b/charts/jindofsx/templates/worker/statefulset.yaml
index 310fb1f0..37715ec9 100755
--- a/charts/jindofsx/templates/worker/statefulset.yaml
+++ b/charts/jindofsx/templates/worker/statefulset.yaml
@@ -203,7 +203,7 @@ spec:
         - tbsite.net
         - aliyun.com
       dnsPolicy: None
-      enableServiceLinks: true
+      enableServiceLinks: false
       {{- end }}
       volumes:
           {{- range $name, $mount := .Values.mounts.workersAndClients }}
diff --git a/charts/vineyard/templates/_helpers.tpl b/charts/vineyard/templates/_helpers.tpl
index f30fdb65..eb6c4be1 100755
--- a/charts/vineyard/templates/_helpers.tpl
+++ b/charts/vineyard/templates/_helpers.tpl
@@ -168,7 +168,7 @@ Generate etcd endpoints for peer or client
   {{- $fullName := include "vineyard.fullname" . }}
   {{- $etcdFullname := (printf "%s-%s" $fullName "master") }}
   {{- $releaseNamespace := .Release.Namespace }}
-  {{- $etcdServiceName := (printf "%s-%s" $fullName "master-svc") }}
+  {{- $etcdServiceName := (printf "%s-%s" $fullName "master") }}
   {{- $etcdEndpoint := list }}
   {{- $portType := .portType }}
   {{- $port := 0 }}
diff --git a/charts/vineyard/templates/config/vineyard-rpc-conf.yaml b/charts/vineyard/templates/config/vineyard-rpc-conf.yaml
index aceb5b1b..ed536827 100644
--- a/charts/vineyard/templates/config/vineyard-rpc-conf.yaml
+++ b/charts/vineyard/templates/config/vineyard-rpc-conf.yaml
@@ -40,6 +40,6 @@ metadata:
 data:
   {{- $rpcEndpoints := list }}
   {{- range $e, $i := until $replicas }}
-  {{- $rpcEndpoints = append $rpcEndpoints (printf "%s-worker-%d.%s-worker-svc.%s:%d" $fullName $i $fullName $namespace $rpcPort) }}
+  {{- $rpcEndpoints = append $rpcEndpoints (printf "%s-worker-%d.%s-worker.%s:%d" $fullName $i $fullName $namespace $rpcPort) }}
   {{- end }}
   VINEYARD_RPC_ENDPOINT: {{ join "," $rpcEndpoints }}
diff --git a/charts/vineyard/templates/master/service.yaml b/charts/vineyard/templates/master/service.yaml
index e8110a20..18173deb 100644
--- a/charts/vineyard/templates/master/service.yaml
+++ b/charts/vineyard/templates/master/service.yaml
@@ -22,13 +22,13 @@
 apiVersion: v1
 kind: Service
 metadata:
-  name: {{ $fullName }}-master-svc
+  name: {{ $fullName }}-master
   labels:
     app: {{ $name }}
     chart: {{ $chart }}
     release: {{ .Release.Name }}
     heritage: {{ .Release.Service }}
-    role: vineyard-master-svc
+    role: vineyard-master
   {{- if .Values.owner.enabled }}
   ownerReferences:
   - apiVersion: {{ .Values.owner.apiVersion }}
diff --git a/charts/vineyard/templates/master/statefulset.yaml b/charts/vineyard/templates/master/statefulset.yaml
index 2dcce391..1bfe2051 100644
--- a/charts/vineyard/templates/master/statefulset.yaml
+++ b/charts/vineyard/templates/master/statefulset.yaml
@@ -18,7 +18,7 @@
 {{- $name := include "vineyard.name" . }}
 {{- $fullName := include "vineyard.fullname" . }}
 {{- $chart := include "vineyard.chart" . }}
-{{- $etcdServiceName := (printf "%s-%s" $fullName "master-svc") }}
+{{- $etcdServiceName := (printf "%s-%s" $fullName "master") }}
 
 {{- if not .Values.master.externalEndpoint }}
 apiVersion: apps/v1
@@ -47,7 +47,7 @@ spec:
       chart: {{ $chart }}
       release: {{ .Release.Name }}
       role: vineyard-master
-  serviceName: {{ $fullName }}-master-svc
+  serviceName: {{ $fullName }}-master
   replicas: {{ $replicas }}
   podManagementPolicy: Parallel
   template:
diff --git a/charts/vineyard/templates/worker/service.yaml b/charts/vineyard/templates/worker/service.yaml
index d2116194..15671eb8 100644
--- a/charts/vineyard/templates/worker/service.yaml
+++ b/charts/vineyard/templates/worker/service.yaml
@@ -19,13 +19,13 @@
 apiVersion: v1
 kind: Service
 metadata:
-  name: {{ $fullName }}-worker-svc
+  name: {{ $fullName }}-worker
   labels:
     app: {{ $name }}
     chart: {{ $chart }}
     release: {{ .Release.Name }}
     heritage: {{ .Release.Service }}
-    role: vineyard-worker-svc
+    role: vineyard-worker
   {{- if .Values.owner.enabled }}
   ownerReferences:
   - apiVersion: {{ .Values.owner.apiVersion }}
diff --git a/charts/vineyard/templates/worker/statefulset.yaml b/charts/vineyard/templates/worker/statefulset.yaml
index cc9fa002..42d1a66d 100644
--- a/charts/vineyard/templates/worker/statefulset.yaml
+++ b/charts/vineyard/templates/worker/statefulset.yaml
@@ -38,7 +38,7 @@ metadata:
   {{- end }}
 spec:
   replicas: {{ .Values.worker.replicas }}
-  serviceName: {{ $fullName }}-worker-svc
+  serviceName: {{ $fullName }}-worker
   podManagementPolicy: Parallel
   selector:
     matchLabels:
diff --git a/config/crd/bases/data.fluid.io_vineyardruntimes.yaml b/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
index 948a2684..3e22f9f0 100644
--- a/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
+++ b/config/crd/bases/data.fluid.io_vineyardruntimes.yaml
@@ -322,6 +322,11 @@ spec:
                       type: object
                     type: array
                 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
+                format: int32
+                type: integer
               tieredstore:
                 description: "Tiered storage used by vineyardd The MediumType can
                   only be `MEM` and `SSD` `MEM` actually represents the shared memory
diff --git a/docs/en/dev/api_doc.md b/docs/en/dev/api_doc.md
index d6b58809..c9ff9eea 100644
--- a/docs/en/dev/api_doc.md
+++ b/docs/en/dev/api_doc.md
@@ -22,6 +22,8 @@ Resource Types:
 <a href="#data.fluid.io/v1alpha1.JindoRuntime">JindoRuntime</a>
 </li><li>
 <a href="#data.fluid.io/v1alpha1.JuiceFSRuntime">JuiceFSRuntime</a>
+</li><li>
+<a href="#data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime</a>
 </li></ul>
 <h3 id="data.fluid.io/v1alpha1.AlluxioRuntime">AlluxioRuntime
 </h3>
@@ -2156,7 +2158,7 @@ TieredStore
 <td>
 <code>configs</code></br>
 <em>
-[]string
+string
 </em>
 </td>
 <td>
@@ -2259,6 +2261,204 @@ RuntimeStatus
 </tr>
 </tbody>
 </table>
+<h3 id="data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime
+</h3>
+<p>
+<p>VineyardRuntime is the Schema for the VineyardRuntimes API</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code></br>
+string</td>
+<td>
+<code>
+data.fluid.io/v1alpha1
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code></br>
+string
+</td>
+<td><code>VineyardRuntime</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code></br>
+<em>
+<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#objectmeta-v1-meta">
+Kubernetes meta/v1.ObjectMeta
+</a>
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">
+VineyardRuntimeSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>master</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.MasterSpec">
+MasterSpec
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Master holds the configurations for Vineyard Master component
+Represents the Etcd component in Vineyard</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>worker</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">
+VineyardCompTemplateSpec
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Worker holds the configurations for Vineyard Worker component
+Represents the Vineyardd component in Vineyard</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>replicas</code></br>
+<em>
+int32
+</em>
+</td>
+<td>
+<p>The replicas of the worker, need to be specified
+If worker.replicas and the field are both specified, the field will be respected</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>fuse</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">
+VineyardSockSpec
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Fuse holds the configurations for Vineyard client socket.
+Note that the &ldquo;Fuse&rdquo; here is kept just for API consistency, VineyardRuntime mount a socket file instead of a FUSE filesystem to make data cache available.
+Applications can connect to the vineyard runtime components through IPC or RPC.
+IPC is the default way to connect to vineyard runtime components, which is more efficient than RPC.
+If the socket file is not mounted, the connection will fall back to RPC.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tieredstore</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.TieredStore">
+TieredStore
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Tiered storage used by vineyardd
+The MediumType can only be <code>MEM</code> and <code>SSD</code>
+<code>MEM</code> actually represents the shared memory of vineyardd.
+<code>SSD</code> represents the external storage of vineyardd.
+Default is as follows.
+tieredstore:
+levels:
+- level: 0
+mediumtype: MEM
+quota: 4Gi</p>
+<p>Choose hostpath as the external storage of vineyardd.
+tieredstore:
+levels:
+- level: 0
+mediumtype: MEM
+quota: 4Gi
+high: &ldquo;0.8&rdquo;
+low: &ldquo;0.3&rdquo;
+- level: 1
+mediumtype: SSD
+quota: 10Gi
+volumeType: Hostpath
+path: /var/spill-path</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePrometheus</code></br>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Disable monitoring metrics for Vineyard Runtime
+Default is false</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">
+[]Kubernetes core/v1.Volume
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Volumes is the list of Kubernetes volumes that can be mounted by the vineyard components (Master and Worker).
+Default is null.</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td>
+<code>status</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.RuntimeStatus">
+RuntimeStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
 <h3 id="data.fluid.io/v1alpha1.APIGatewayStatus">APIGatewayStatus
 </h3>
 <p>
@@ -4913,11 +5113,7 @@ map[string]string
 </td>
 <td>
 <em>(Optional)</em>
-<p>Configurable options for External Etcd cluster.
-Support the following options.</p>
-<p>etcd.prefix: (String) the prefix of etcd key for vineyard objects</p>
-<p>Default value is as follows.</p>
-<p>etcd.prefix: &ldquo;/vineyard&rdquo;</p>
+<p>Configurable options for External Etcd cluster.</p>
 </td>
 </tr>
 </tbody>
@@ -6763,7 +6959,7 @@ TieredStore
 <td>
 <code>configs</code></br>
 <em>
-[]string
+string
 </em>
 </td>
 <td>
@@ -6915,6 +7111,7 @@ string
 </em>
 </td>
 <td>
+<em>(Optional)</em>
 <p>File paths to be used for the tier. Multiple paths are supported.
 Multiple paths should be separated with comma. For example: &ldquo;/mnt/cache1,/mnt/cache2&rdquo;.</p>
 </td>
@@ -7838,8 +8035,8 @@ MetadataSyncPolicy
 <a href="#data.fluid.io/v1alpha1.GooseFSRuntime">GooseFSRuntime</a>, 
 <a href="#data.fluid.io/v1alpha1.JindoRuntime">JindoRuntime</a>, 
 <a href="#data.fluid.io/v1alpha1.JuiceFSRuntime">JuiceFSRuntime</a>, 
-<a href="#data.fluid.io/v1alpha1.ThinRuntime">ThinRuntime</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime</a>)
+<a href="#data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime</a>, 
+<a href="#data.fluid.io/v1alpha1.ThinRuntime">ThinRuntime</a>)
 </p>
 <p>
 <p>RuntimeStatus defines the observed state of Runtime</p>
@@ -9666,7 +9863,7 @@ map[string]int
 <em>(Optional)</em>
 <p>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.</p>
+For Worker, the default rpc port is 9600 and the default exporter port is 9144.</p>
 </td>
 </tr>
 <tr>
@@ -9697,10 +9894,12 @@ For Master, there is no configurable options.
 For Worker, support the following options.</p>
 <p>vineyardd.reserve.memory: (Bool) where to reserve memory for vineyardd
 If set to true, the memory quota will be counted to the vineyardd rather than the application.
-etcd.prefix: (String) the prefix of etcd key for vineyard objects</p>
+etcd.prefix: (String) the prefix of etcd key for vineyard objects
+wait.etcd.timeout: (String) the timeout period before waiting the etcd to be ready, in seconds</p>
 <p>Default value is as follows.</p>
 <pre><code>vineyardd.reserve.memory: &quot;true&quot;
 etcd.prefix: &quot;/vineyard&quot;
+wait.etcd.timeout: &quot;120&quot;
 </code></pre>
 </td>
 </tr>
@@ -9739,10 +9938,14 @@ Default is not set.</p>
 </tr>
 </tbody>
 </table>
-<h3 id="data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime
+<h3 id="data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec
 </h3>
 <p>
-<p>VineyardRuntime is the Schema for the vineyardruntimes API</p>
+(<em>Appears on:</em>
+<a href="#data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime</a>)
+</p>
+<p>
+<p>VineyardRuntimeSpec defines the desired state of VineyardRuntime</p>
 </p>
 <table>
 <thead>
@@ -9754,33 +9957,6 @@ Default is not set.</p>
 <tbody>
 <tr>
 <td>
-<code>metadata</code></br>
-<em>
-<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#objectmeta-v1-meta">
-Kubernetes meta/v1.ObjectMeta
-</a>
-</em>
-</td>
-<td>
-Refer to the Kubernetes API documentation for the fields of the
-<code>metadata</code> field.
-</td>
-</tr>
-<tr>
-<td>
-<code>spec</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">
-VineyardRuntimeSpec
-</a>
-</em>
-</td>
-<td>
-<br/>
-<br/>
-<table>
-<tr>
-<td>
 <code>master</code></br>
 <em>
 <a href="#data.fluid.io/v1alpha1.MasterSpec">
@@ -9811,148 +9987,14 @@ Represents the Vineyardd component in Vineyard</p>
 </tr>
 <tr>
 <td>
-<code>fuse</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">
-VineyardSockSpec
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Fuse holds the configurations for Vineyard client socket.
-Note that the &ldquo;Fuse&rdquo; here is kept just for API consistency, VineyardRuntime mount a socket file instead of a FUSE filesystem to make data cache available.
-Applications can connect to the vineyard runtime components through IPC or RPC.
-IPC is the default way to connect to vineyard runtime components, which is more efficient than RPC.
-If the socket file is not mounted, the connection will fall back to RPC.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>tieredstore</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.TieredStore">
-TieredStore
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Tiered storage used by vineyardd
-The MediumType can only be <code>MEM</code> and <code>SSD</code>
-<code>MEM</code> actually represents the shared memory of vineyardd.
-<code>SSD</code> represents the external storage of vineyardd.
-Default is as follows.
-tieredstore:
-levels:
-- level: 0
-mediumtype: MEM
-quota: 4Gi</p>
-<p>Choose hostpath as the external storage of vineyardd.
-tieredstore:
-levels:
-- level: 0
-mediumtype: MEM
-quota: 4Gi
-high: &ldquo;0.8&rdquo;
-low: &ldquo;0.3&rdquo;
-- level: 1
-mediumtype: SSD
-quota: 10Gi
-volumeType: Hostpath
-path: /var/spill-path</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>disablePrometheus</code></br>
-<em>
-bool
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Disable monitoring metrics for Vineyard Runtime
-Default is false</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">
-[]Kubernetes core/v1.Volume
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Volumes is the list of Kubernetes volumes that can be mounted by the vineyard components (Master and Worker).
-Default is null.</p>
-</td>
-</tr>
-</table>
-</td>
-</tr>
-<tr>
-<td>
-<code>status</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.RuntimeStatus">
-RuntimeStatus
-</a>
-</em>
-</td>
-<td>
-</td>
-</tr>
-</tbody>
-</table>
-<h3 id="data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec
-</h3>
-<p>
-(<em>Appears on:</em>
-<a href="#data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime</a>)
-</p>
-<p>
-<p>VineyardRuntimeSpec defines the desired state of VineyardRuntime</p>
-</p>
-<table>
-<thead>
-<tr>
-<th>Field</th>
-<th>Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>
-<code>master</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.MasterSpec">
-MasterSpec
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Master holds the configurations for Vineyard Master component
-Represents the Etcd component in Vineyard</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>worker</code></br>
+<code>replicas</code></br>
 <em>
-<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">
-VineyardCompTemplateSpec
-</a>
+int32
 </em>
 </td>
 <td>
-<em>(Optional)</em>
-<p>Worker holds the configurations for Vineyard Worker component
-Represents the Vineyardd component in Vineyard</p>
+<p>The replicas of the worker, need to be specified
+If worker.replicas and the field are both specified, the field will be respected</p>
 </td>
 </tr>
 <tr>
@@ -10197,5 +10239,5 @@ bool
 <hr/>
 <p><em>
 Generated with <code>gen-crd-api-reference-docs</code>
-on git commit <code>6aa1163</code>.
+on git commit <code>c7cfb1888</code>.
 </em></p>
diff --git a/docs/zh/dev/api_doc.md b/docs/zh/dev/api_doc.md
index d6b58809..c9ff9eea 100644
--- a/docs/zh/dev/api_doc.md
+++ b/docs/zh/dev/api_doc.md
@@ -22,6 +22,8 @@ Resource Types:
 <a href="#data.fluid.io/v1alpha1.JindoRuntime">JindoRuntime</a>
 </li><li>
 <a href="#data.fluid.io/v1alpha1.JuiceFSRuntime">JuiceFSRuntime</a>
+</li><li>
+<a href="#data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime</a>
 </li></ul>
 <h3 id="data.fluid.io/v1alpha1.AlluxioRuntime">AlluxioRuntime
 </h3>
@@ -2156,7 +2158,7 @@ TieredStore
 <td>
 <code>configs</code></br>
 <em>
-[]string
+string
 </em>
 </td>
 <td>
@@ -2259,6 +2261,204 @@ RuntimeStatus
 </tr>
 </tbody>
 </table>
+<h3 id="data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime
+</h3>
+<p>
+<p>VineyardRuntime is the Schema for the VineyardRuntimes API</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code></br>
+string</td>
+<td>
+<code>
+data.fluid.io/v1alpha1
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code></br>
+string
+</td>
+<td><code>VineyardRuntime</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code></br>
+<em>
+<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#objectmeta-v1-meta">
+Kubernetes meta/v1.ObjectMeta
+</a>
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">
+VineyardRuntimeSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>master</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.MasterSpec">
+MasterSpec
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Master holds the configurations for Vineyard Master component
+Represents the Etcd component in Vineyard</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>worker</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">
+VineyardCompTemplateSpec
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Worker holds the configurations for Vineyard Worker component
+Represents the Vineyardd component in Vineyard</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>replicas</code></br>
+<em>
+int32
+</em>
+</td>
+<td>
+<p>The replicas of the worker, need to be specified
+If worker.replicas and the field are both specified, the field will be respected</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>fuse</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">
+VineyardSockSpec
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Fuse holds the configurations for Vineyard client socket.
+Note that the &ldquo;Fuse&rdquo; here is kept just for API consistency, VineyardRuntime mount a socket file instead of a FUSE filesystem to make data cache available.
+Applications can connect to the vineyard runtime components through IPC or RPC.
+IPC is the default way to connect to vineyard runtime components, which is more efficient than RPC.
+If the socket file is not mounted, the connection will fall back to RPC.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tieredstore</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.TieredStore">
+TieredStore
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Tiered storage used by vineyardd
+The MediumType can only be <code>MEM</code> and <code>SSD</code>
+<code>MEM</code> actually represents the shared memory of vineyardd.
+<code>SSD</code> represents the external storage of vineyardd.
+Default is as follows.
+tieredstore:
+levels:
+- level: 0
+mediumtype: MEM
+quota: 4Gi</p>
+<p>Choose hostpath as the external storage of vineyardd.
+tieredstore:
+levels:
+- level: 0
+mediumtype: MEM
+quota: 4Gi
+high: &ldquo;0.8&rdquo;
+low: &ldquo;0.3&rdquo;
+- level: 1
+mediumtype: SSD
+quota: 10Gi
+volumeType: Hostpath
+path: /var/spill-path</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePrometheus</code></br>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Disable monitoring metrics for Vineyard Runtime
+Default is false</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">
+[]Kubernetes core/v1.Volume
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Volumes is the list of Kubernetes volumes that can be mounted by the vineyard components (Master and Worker).
+Default is null.</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td>
+<code>status</code></br>
+<em>
+<a href="#data.fluid.io/v1alpha1.RuntimeStatus">
+RuntimeStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
 <h3 id="data.fluid.io/v1alpha1.APIGatewayStatus">APIGatewayStatus
 </h3>
 <p>
@@ -4913,11 +5113,7 @@ map[string]string
 </td>
 <td>
 <em>(Optional)</em>
-<p>Configurable options for External Etcd cluster.
-Support the following options.</p>
-<p>etcd.prefix: (String) the prefix of etcd key for vineyard objects</p>
-<p>Default value is as follows.</p>
-<p>etcd.prefix: &ldquo;/vineyard&rdquo;</p>
+<p>Configurable options for External Etcd cluster.</p>
 </td>
 </tr>
 </tbody>
@@ -6763,7 +6959,7 @@ TieredStore
 <td>
 <code>configs</code></br>
 <em>
-[]string
+string
 </em>
 </td>
 <td>
@@ -6915,6 +7111,7 @@ string
 </em>
 </td>
 <td>
+<em>(Optional)</em>
 <p>File paths to be used for the tier. Multiple paths are supported.
 Multiple paths should be separated with comma. For example: &ldquo;/mnt/cache1,/mnt/cache2&rdquo;.</p>
 </td>
@@ -7838,8 +8035,8 @@ MetadataSyncPolicy
 <a href="#data.fluid.io/v1alpha1.GooseFSRuntime">GooseFSRuntime</a>, 
 <a href="#data.fluid.io/v1alpha1.JindoRuntime">JindoRuntime</a>, 
 <a href="#data.fluid.io/v1alpha1.JuiceFSRuntime">JuiceFSRuntime</a>, 
-<a href="#data.fluid.io/v1alpha1.ThinRuntime">ThinRuntime</a>, 
-<a href="#data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime</a>)
+<a href="#data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime</a>, 
+<a href="#data.fluid.io/v1alpha1.ThinRuntime">ThinRuntime</a>)
 </p>
 <p>
 <p>RuntimeStatus defines the observed state of Runtime</p>
@@ -9666,7 +9863,7 @@ map[string]int
 <em>(Optional)</em>
 <p>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.</p>
+For Worker, the default rpc port is 9600 and the default exporter port is 9144.</p>
 </td>
 </tr>
 <tr>
@@ -9697,10 +9894,12 @@ For Master, there is no configurable options.
 For Worker, support the following options.</p>
 <p>vineyardd.reserve.memory: (Bool) where to reserve memory for vineyardd
 If set to true, the memory quota will be counted to the vineyardd rather than the application.
-etcd.prefix: (String) the prefix of etcd key for vineyard objects</p>
+etcd.prefix: (String) the prefix of etcd key for vineyard objects
+wait.etcd.timeout: (String) the timeout period before waiting the etcd to be ready, in seconds</p>
 <p>Default value is as follows.</p>
 <pre><code>vineyardd.reserve.memory: &quot;true&quot;
 etcd.prefix: &quot;/vineyard&quot;
+wait.etcd.timeout: &quot;120&quot;
 </code></pre>
 </td>
 </tr>
@@ -9739,10 +9938,14 @@ Default is not set.</p>
 </tr>
 </tbody>
 </table>
-<h3 id="data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime
+<h3 id="data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec
 </h3>
 <p>
-<p>VineyardRuntime is the Schema for the vineyardruntimes API</p>
+(<em>Appears on:</em>
+<a href="#data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime</a>)
+</p>
+<p>
+<p>VineyardRuntimeSpec defines the desired state of VineyardRuntime</p>
 </p>
 <table>
 <thead>
@@ -9754,33 +9957,6 @@ Default is not set.</p>
 <tbody>
 <tr>
 <td>
-<code>metadata</code></br>
-<em>
-<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#objectmeta-v1-meta">
-Kubernetes meta/v1.ObjectMeta
-</a>
-</em>
-</td>
-<td>
-Refer to the Kubernetes API documentation for the fields of the
-<code>metadata</code> field.
-</td>
-</tr>
-<tr>
-<td>
-<code>spec</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.VineyardRuntimeSpec">
-VineyardRuntimeSpec
-</a>
-</em>
-</td>
-<td>
-<br/>
-<br/>
-<table>
-<tr>
-<td>
 <code>master</code></br>
 <em>
 <a href="#data.fluid.io/v1alpha1.MasterSpec">
@@ -9811,148 +9987,14 @@ Represents the Vineyardd component in Vineyard</p>
 </tr>
 <tr>
 <td>
-<code>fuse</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.VineyardSockSpec">
-VineyardSockSpec
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Fuse holds the configurations for Vineyard client socket.
-Note that the &ldquo;Fuse&rdquo; here is kept just for API consistency, VineyardRuntime mount a socket file instead of a FUSE filesystem to make data cache available.
-Applications can connect to the vineyard runtime components through IPC or RPC.
-IPC is the default way to connect to vineyard runtime components, which is more efficient than RPC.
-If the socket file is not mounted, the connection will fall back to RPC.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>tieredstore</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.TieredStore">
-TieredStore
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Tiered storage used by vineyardd
-The MediumType can only be <code>MEM</code> and <code>SSD</code>
-<code>MEM</code> actually represents the shared memory of vineyardd.
-<code>SSD</code> represents the external storage of vineyardd.
-Default is as follows.
-tieredstore:
-levels:
-- level: 0
-mediumtype: MEM
-quota: 4Gi</p>
-<p>Choose hostpath as the external storage of vineyardd.
-tieredstore:
-levels:
-- level: 0
-mediumtype: MEM
-quota: 4Gi
-high: &ldquo;0.8&rdquo;
-low: &ldquo;0.3&rdquo;
-- level: 1
-mediumtype: SSD
-quota: 10Gi
-volumeType: Hostpath
-path: /var/spill-path</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>disablePrometheus</code></br>
-<em>
-bool
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Disable monitoring metrics for Vineyard Runtime
-Default is false</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">
-[]Kubernetes core/v1.Volume
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Volumes is the list of Kubernetes volumes that can be mounted by the vineyard components (Master and Worker).
-Default is null.</p>
-</td>
-</tr>
-</table>
-</td>
-</tr>
-<tr>
-<td>
-<code>status</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.RuntimeStatus">
-RuntimeStatus
-</a>
-</em>
-</td>
-<td>
-</td>
-</tr>
-</tbody>
-</table>
-<h3 id="data.fluid.io/v1alpha1.VineyardRuntimeSpec">VineyardRuntimeSpec
-</h3>
-<p>
-(<em>Appears on:</em>
-<a href="#data.fluid.io/v1alpha1.VineyardRuntime">VineyardRuntime</a>)
-</p>
-<p>
-<p>VineyardRuntimeSpec defines the desired state of VineyardRuntime</p>
-</p>
-<table>
-<thead>
-<tr>
-<th>Field</th>
-<th>Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>
-<code>master</code></br>
-<em>
-<a href="#data.fluid.io/v1alpha1.MasterSpec">
-MasterSpec
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Master holds the configurations for Vineyard Master component
-Represents the Etcd component in Vineyard</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>worker</code></br>
+<code>replicas</code></br>
 <em>
-<a href="#data.fluid.io/v1alpha1.VineyardCompTemplateSpec">
-VineyardCompTemplateSpec
-</a>
+int32
 </em>
 </td>
 <td>
-<em>(Optional)</em>
-<p>Worker holds the configurations for Vineyard Worker component
-Represents the Vineyardd component in Vineyard</p>
+<p>The replicas of the worker, need to be specified
+If worker.replicas and the field are both specified, the field will be respected</p>
 </td>
 </tr>
 <tr>
@@ -10197,5 +10239,5 @@ bool
 <hr/>
 <p><em>
 Generated with <code>gen-crd-api-reference-docs</code>
-on git commit <code>6aa1163</code>.
+on git commit <code>c7cfb1888</code>.
 </em></p>
diff --git a/pkg/controllers/operation_controller.go b/pkg/controllers/operation_controller.go
index 0711d8d2..f34b690a 100644
--- a/pkg/controllers/operation_controller.go
+++ b/pkg/controllers/operation_controller.go
@@ -287,6 +287,8 @@ func (o *OperationReconciler) getRuntimeObjectAndEngineImpl(runtimeType, name, n
 		runtime, err = utils.GetEFCRuntime(o.Client, name, namespace)
 	case common.ThinRuntime:
 		runtime, err = utils.GetThinRuntime(o.Client, name, namespace)
+	case common.VineyardRuntime:
+		runtime, err = utils.GetVineyardRuntime(o.Client, name, namespace)
 	}
 
 	if err != nil {
@@ -311,6 +313,8 @@ func (o *OperationReconciler) getRuntimeObjectAndEngineImpl(runtimeType, name, n
 		return runtime, ddc.InferEngineImpl(*runtime.GetStatus(), common.JuiceFSEngineImpl), nil
 	case common.EFCRuntime:
 		return runtime, ddc.InferEngineImpl(*runtime.GetStatus(), common.EFCEngineImpl), nil
+	case common.VineyardRuntime:
+		return runtime, ddc.InferEngineImpl(*runtime.GetStatus(), common.VineyardEngineImpl), nil
 	}
 
 	err = fmt.Errorf("runtimeType %s is not supported", runtimeType)
diff --git a/pkg/ddc/vineyard/operations/base.go b/pkg/ddc/vineyard/operations/base.go
index cab367de..ec076dc2 100644
--- a/pkg/ddc/vineyard/operations/base.go
+++ b/pkg/ddc/vineyard/operations/base.go
@@ -67,7 +67,7 @@ func (a VineyardFileUtils) ReportSummary() (summary []string, err error) {
 	for i := int32(0); i < a.replicas; i++ {
 		u := url.URL{
 			Scheme: "http",
-			Host: net.JoinHostPort(fmt.Sprintf("%s-%d.%s-svc.%s.svc", a.podNamePrefix, i,
+			Host: net.JoinHostPort(fmt.Sprintf("%s-%d.%s.%s.svc", a.podNamePrefix, i,
 				a.podNamePrefix, a.namespace), strconv.Itoa(int(a.port))),
 			Path: "/metrics",
 		}
diff --git a/pkg/ddc/vineyard/operator.go b/pkg/ddc/vineyard/operator.go
index 1a8d8cdf..9282d029 100644
--- a/pkg/ddc/vineyard/operator.go
+++ b/pkg/ddc/vineyard/operator.go
@@ -14,11 +14,26 @@ limitations under the License.
 package vineyard
 
 import (
+	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
 	"github.com/fluid-cloudnative/fluid/pkg/dataoperation"
+	"github.com/fluid-cloudnative/fluid/pkg/errors"
 	cruntime "github.com/fluid-cloudnative/fluid/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
 )
 
 func (e *VineyardEngine) GetDataOperationValueFile(ctx cruntime.ReconcileRequestContext, operation dataoperation.OperationInterface) (valueFileName string, err error) {
-	// TODO:(caoye) implement me
-	return "", nil
+	operationType := operation.GetOperationType()
+	object := operation.GetOperationObject()
+
+	switch operationType {
+	case datav1alpha1.DataProcessType:
+		valueFileName, err = e.generateDataProcessValueFile(ctx, object)
+		return valueFileName, err
+	default:
+		return "", errors.NewNotSupported(
+			schema.GroupResource{
+				Group:    object.GetObjectKind().GroupVersionKind().Group,
+				Resource: object.GetObjectKind().GroupVersionKind().Kind,
+			}, "VineyardRuntime")
+	}
 }
diff --git a/pkg/ddc/vineyard/process_data.go b/pkg/ddc/vineyard/process_data.go
new file mode 100644
index 00000000..1820279a
--- /dev/null
+++ b/pkg/ddc/vineyard/process_data.go
@@ -0,0 +1,40 @@
+/*
+Copyright 2024 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 (
+	"fmt"
+
+	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
+	"github.com/fluid-cloudnative/fluid/pkg/dataprocess"
+	cruntime "github.com/fluid-cloudnative/fluid/pkg/runtime"
+	"github.com/fluid-cloudnative/fluid/pkg/utils"
+	"github.com/pkg/errors"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+func (e *VineyardEngine) generateDataProcessValueFile(ctx cruntime.ReconcileRequestContext, object client.Object) (valueFileName string, err error) {
+	dataProcess, ok := object.(*datav1alpha1.DataProcess)
+	if !ok {
+		err = fmt.Errorf("object %v is not of type DataProcess", object)
+		return "", err
+	}
+
+	targetDataset, err := utils.GetDataset(e.Client, dataProcess.Spec.Dataset.Name, dataProcess.Spec.Dataset.Namespace)
+	if err != nil {
+		return "", errors.Wrap(err, "failed to get dataset")
+	}
+
+	return dataprocess.GenDataProcessValueFile(targetDataset, dataProcess)
+}
diff --git a/pkg/ddc/vineyard/transform.go b/pkg/ddc/vineyard/transform.go
index 07a09aa9..06367f71 100644
--- a/pkg/ddc/vineyard/transform.go
+++ b/pkg/ddc/vineyard/transform.go
@@ -71,6 +71,7 @@ func (e *VineyardEngine) transformMasters(runtime *datav1alpha1.VineyardRuntime,
 	} else {
 		value.Master.Replicas = runtime.Spec.Master.Replicas
 	}
+
 	image := runtime.Spec.Master.Image
 	imageTag := runtime.Spec.Master.ImageTag
 	imagePullPolicy := runtime.Spec.Master.ImagePullPolicy
@@ -109,11 +110,9 @@ func (e *VineyardEngine) transformMasters(runtime *datav1alpha1.VineyardRuntime,
 
 func (e *VineyardEngine) transformWorkers(runtime *datav1alpha1.VineyardRuntime, value *Vineyard) (err error) {
 	value.Worker = Worker{}
-	if runtime.Spec.Worker.Replicas == 0 {
-		value.Worker.Replicas = 1
-	} else {
-		value.Worker.Replicas = runtime.Spec.Worker.Replicas
-	}
+	// respect the replicas of runtime if the replicas of worker and runtime are both specified
+	value.Worker.Replicas = runtime.Spec.Replicas
+
 	image := runtime.Spec.Worker.Image
 	imageTag := runtime.Spec.Worker.ImageTag
 	imagePullPolicy := runtime.Spec.Worker.ImagePullPolicy
diff --git a/pkg/ddc/vineyard/utils.go b/pkg/ddc/vineyard/utils.go
index 33ca037c..cdcf2c6b 100644
--- a/pkg/ddc/vineyard/utils.go
+++ b/pkg/ddc/vineyard/utils.go
@@ -88,10 +88,8 @@ func (e *VineyardEngine) getWorkerPodExporterPort() (port int32) {
 }
 
 func (e *VineyardEngine) getWorkerReplicas() (replicas int32) {
-	replicas = e.runtime.Spec.Worker.Replicas
-	if replicas == 0 {
-		replicas = 1
-	}
+	replicas = e.runtime.Spec.Replicas
+
 	return
 }
 


Test patch:
diff --git a/pkg/ddc/vineyard/operations/base_test.go b/pkg/ddc/vineyard/operations/base_test.go
index 274b9d05..e803d7d5 100644
--- a/pkg/ddc/vineyard/operations/base_test.go
+++ b/pkg/ddc/vineyard/operations/base_test.go
@@ -31,13 +31,13 @@ func TestVineyardFileUtils_ReportSummary(t *testing.T) {
 	}
 	patch := ApplyMethod(reflect.TypeOf(client), "Get",
 		func(_ *http.Client, url string) (resp *http.Response, err error) {
-			if url == "http://vineyard-0.vineyard-svc.default.svc:8080/metrics" {
+			if url == "http://vineyard-0.vineyard.default.svc:8080/metrics" {
 				return &http.Response{
 					StatusCode: http.StatusOK,
 					Body:       ioutil.NopCloser(bytes.NewBufferString("metric for pod 1")),
 				}, nil
 			}
-			if url == "http://vineyard-1.vineyard-svc.default.svc:8080/metrics" {
+			if url == "http://vineyard-1.vineyard.default.svc:8080/metrics" {
 				return &http.Response{
 					StatusCode: http.StatusOK,
 					Body:       ioutil.NopCloser(bytes.NewBufferString("metric for pod 2")),
diff --git a/pkg/ddc/vineyard/process_data_test.go b/pkg/ddc/vineyard/process_data_test.go
new file mode 100644
index 00000000..ebb08c0f
--- /dev/null
+++ b/pkg/ddc/vineyard/process_data_test.go
@@ -0,0 +1,120 @@
+/*
+Copyright 2024 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 (
+	"testing"
+
+	datav1alpha1 "github.com/fluid-cloudnative/fluid/api/v1alpha1"
+	cruntime "github.com/fluid-cloudnative/fluid/pkg/runtime"
+	"github.com/fluid-cloudnative/fluid/pkg/utils/fake"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+func TestVineyardEngine_generateDataProcessValueFile(t *testing.T) {
+	dataset := &datav1alpha1.Dataset{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      "demo-dataset",
+			Namespace: "default",
+		},
+	}
+
+	dataProcess := &datav1alpha1.DataProcess{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      "demo-dataprocess",
+			Namespace: "default",
+		},
+		Spec: datav1alpha1.DataProcessSpec{
+			Dataset: datav1alpha1.TargetDatasetWithMountPath{
+				TargetDataset: datav1alpha1.TargetDataset{
+					Name:      "demo-dataset",
+					Namespace: "default",
+				},
+				MountPath: "/data",
+			},
+			Processor: datav1alpha1.Processor{
+				Script: &datav1alpha1.ScriptProcessor{
+					RestartPolicy: corev1.RestartPolicyNever,
+					VersionSpec: datav1alpha1.VersionSpec{
+						Image:    "test-image",
+						ImageTag: "latest",
+					},
+				},
+			},
+		},
+	}
+
+	type args struct {
+		engine *VineyardEngine
+		ctx    cruntime.ReconcileRequestContext
+		object client.Object
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "TestNotOfTypeDataProcess",
+			args: args{
+				engine: &VineyardEngine{},
+				ctx:    cruntime.ReconcileRequestContext{},
+				object: &datav1alpha1.Dataset{}, // not of type DataProcess
+			},
+			wantErr: true,
+		},
+		{
+			name: "TestTargetDatasetNotFound",
+			args: args{
+				engine: &VineyardEngine{
+					Client: fake.NewFakeClientWithScheme(testScheme), // No dataset
+				},
+				ctx: cruntime.ReconcileRequestContext{},
+				object: &datav1alpha1.DataProcess{
+					Spec: datav1alpha1.DataProcessSpec{
+						Dataset: datav1alpha1.TargetDatasetWithMountPath{
+							TargetDataset: datav1alpha1.TargetDataset{
+								Name:      "demo-dataset-notfound",
+								Namespace: "default",
+							},
+						},
+					},
+				},
+			},
+			wantErr: true,
+		},
+		{
+			name: "TestGenerateDataProcessValueFile",
+			args: args{
+				engine: &VineyardEngine{
+					Client: fake.NewFakeClientWithScheme(testScheme, dataset),
+				},
+				ctx:    cruntime.ReconcileRequestContext{},
+				object: dataProcess,
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			_, err := tt.args.engine.generateDataProcessValueFile(tt.args.ctx, tt.args.object)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("AlluxioEngine.generateDataProcessValueFile() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+		})
+	}
+}
diff --git a/pkg/ddc/vineyard/replicas_test.go b/pkg/ddc/vineyard/replicas_test.go
index 3e0ff98a..97d05904 100644
--- a/pkg/ddc/vineyard/replicas_test.go
+++ b/pkg/ddc/vineyard/replicas_test.go
@@ -103,9 +103,7 @@ func TestSyncReplicas(t *testing.T) {
 				Namespace: "fluid",
 			},
 			Spec: datav1alpha1.VineyardRuntimeSpec{
-				Worker: datav1alpha1.VineyardCompTemplateSpec{
-					Replicas: 3, // 2
-				},
+				Replicas: 3,
 			},
 			Status: datav1alpha1.RuntimeStatus{
 				CurrentWorkerNumberScheduled: 2,
@@ -128,9 +126,7 @@ func TestSyncReplicas(t *testing.T) {
 				Namespace: "fluid",
 			},
 			Spec: datav1alpha1.VineyardRuntimeSpec{
-				Worker: datav1alpha1.VineyardCompTemplateSpec{
-					Replicas: 2,
-				},
+				Replicas: 2,
 			},
 			Status: datav1alpha1.RuntimeStatus{
 				CurrentWorkerNumberScheduled: 3,
@@ -153,9 +149,7 @@ func TestSyncReplicas(t *testing.T) {
 				Namespace: "fluid",
 			},
 			Spec: datav1alpha1.VineyardRuntimeSpec{
-				Worker: datav1alpha1.VineyardCompTemplateSpec{
-					Replicas: 2,
-				},
+				Replicas: 2,
 			},
 			Status: datav1alpha1.RuntimeStatus{
 				CurrentWorkerNumberScheduled: 2,
diff --git a/pkg/ddc/vineyard/transform_test.go b/pkg/ddc/vineyard/transform_test.go
index 2a92cffb..f7cd6078 100755
--- a/pkg/ddc/vineyard/transform_test.go
+++ b/pkg/ddc/vineyard/transform_test.go
@@ -136,10 +136,12 @@ func TestTransformWorker(t *testing.T) {
 		runtime   *datav1alpha1.VineyardRuntime
 		wantValue *Vineyard
 	}{
-		"test image, imageTag and pullPolicy": {
+		"test replicas, image, imageTag and pullPolicy": {
 			runtime: &datav1alpha1.VineyardRuntime{
 				Spec: datav1alpha1.VineyardRuntimeSpec{
+					Replicas: 3,
 					Worker: datav1alpha1.VineyardCompTemplateSpec{
+						Replicas:        2,
 						Image:           "test-image",
 						ImageTag:        "test-tag",
 						ImagePullPolicy: "IfNotPresent",
@@ -161,6 +163,13 @@ func TestTransformWorker(t *testing.T) {
 		gotValue := &Vineyard{}
 		engine.runtimeInfo, _ = base.BuildRuntimeInfo("test", "test", "vineyard", v.runtime.Spec.TieredStore)
 		if err := engine.transformWorkers(v.runtime, gotValue); err == nil {
+			if gotValue.Worker.Replicas != v.wantValue.Worker.Replicas {
+				t.Errorf("check %s failure, got:%d,want:%d",
+					k,
+					gotValue.Worker.Replicas,
+					v.wantValue.Worker.Replicas,
+				)
+			}
 			if gotValue.Worker.Image != v.wantValue.Worker.Image {
 				t.Errorf("check %s failure, got:%s,want:%s",
 					k,
diff --git a/pkg/ddc/vineyard/utils_test.go b/pkg/ddc/vineyard/utils_test.go
index 3684900e..92c40127 100644
--- a/pkg/ddc/vineyard/utils_test.go
+++ b/pkg/ddc/vineyard/utils_test.go
@@ -377,9 +377,7 @@ func TestGetWorkerReplicas(t *testing.T) {
 			engine: &VineyardEngine{
 				runtime: &datav1alpha1.VineyardRuntime{
 					Spec: datav1alpha1.VineyardRuntimeSpec{
-						Worker: datav1alpha1.VineyardCompTemplateSpec{
-							Replicas: 3,
-						},
+						Replicas: 3,
 					},
 				},
 			},
diff --git a/pkg/ddc/vineyard/worker_test.go b/pkg/ddc/vineyard/worker_test.go
index 336ce912..3c025e06 100644
--- a/pkg/ddc/vineyard/worker_test.go
+++ b/pkg/ddc/vineyard/worker_test.go
@@ -97,9 +97,7 @@ func TestSetupWorkers(t *testing.T) {
 						Namespace: "big-data",
 					},
 					Spec: datav1alpha1.VineyardRuntimeSpec{
-						Worker: datav1alpha1.VineyardCompTemplateSpec{
-							Replicas: 1,
-						},
+						Replicas: 1,
 					},
 				},
 				runtimeInfo: runtimeInfoSpark,
@@ -135,9 +133,7 @@ func TestSetupWorkers(t *testing.T) {
 						Namespace: "big-data",
 					},
 					Spec: datav1alpha1.VineyardRuntimeSpec{
-						Worker: datav1alpha1.VineyardCompTemplateSpec{
-							Replicas: 1,
-						},
+						Replicas: 1,
 					},
 				},
 				runtimeInfo: runtimeInfoHadoop,
@@ -167,9 +163,7 @@ func TestSetupWorkers(t *testing.T) {
 						Namespace: "big-data",
 					},
 					Spec: datav1alpha1.VineyardRuntimeSpec{
-						Worker: datav1alpha1.VineyardCompTemplateSpec{
-							Replicas: 1,
-						},
+						Replicas: 1,
 					},
 				},
 				runtimeInfo: runtimeInfoHadoop,
@@ -387,9 +381,7 @@ func TestCheckWorkersReady(t *testing.T) {
 						Namespace: "big-data",
 					},
 					Spec: datav1alpha1.VineyardRuntimeSpec{
-						Worker: datav1alpha1.VineyardCompTemplateSpec{
-							Replicas: 1,
-						},
+						Replicas: 1,
 					},
 				},
 				worker: &appsv1.StatefulSet{
@@ -427,9 +419,7 @@ func TestCheckWorkersReady(t *testing.T) {
 						Namespace: "big-data",
 					},
 					Spec: datav1alpha1.VineyardRuntimeSpec{
-						Worker: datav1alpha1.VineyardCompTemplateSpec{
-							Replicas: 1,
-						},
+						Replicas: 1,
 					},
 				},
 				worker: &appsv1.StatefulSet{
@@ -466,9 +456,7 @@ func TestCheckWorkersReady(t *testing.T) {
 						Namespace: "big-data",
 					},
 					Spec: datav1alpha1.VineyardRuntimeSpec{
-						Worker: datav1alpha1.VineyardCompTemplateSpec{
-							Replicas: 1,
-						},
+						Replicas: 1,
 					},
 				},
 				worker: &appsv1.StatefulSet{
diff --git a/pkg/utils/shell_pipes_test.go b/pkg/utils/shell_pipes_test.go
index 430f86c0..6a40a66c 100644
--- a/pkg/utils/shell_pipes_test.go
+++ b/pkg/utils/shell_pipes_test.go
@@ -129,4 +129,4 @@ func TestIsValidCommand(t *testing.T) {
 			}
 		})
 	}
-}
\ No newline at end of file
+}