Repository: kubevela/kubevela

Issue:
Terraform Controller do not handle error Configuration properly
**Describe the bug**
<!--
A clear and concise description of what the bug is.
-->

While creating a terraform configuration which is not valid (for example, no instance available), the Configuration will always show **ProvisioningAndChecking** status. If deleting it, the terraform controller cannot handle it properly. It will be blocked and the Configuration will always hang in the cluster, which is not a desired GC logic.

**To Reproduce**
<!--
Steps to reproduce the behavior:
1. The YAML files of Component/Trait I used.
2. The YAML file of Application I applied.
3. Other operations I have done.
4. See error
-->

Create a terraform configuration with invalid CPU/Mem/Zone. Then try to delete it.

**Expected behavior**
<!--
A clear and concise description of what you expected to happen.
-->

After some time the configuration is deleted.

**Screenshots**
<!--
If applicable, add screenshots to help explain your problem.
-->

**KubeVela Version**

1.1.7
<!--
Describe your KubeVela controller or CLI version information.
-->

**Cluster information**
<!--
Describe your kubernetes cluster information.
- Kubernetes Version [e.g. 1.16.9]
-->
ACK 1.20
**Additional context**
<!--
Add any other context about the problem here.
-->


Discussion:
@zzxwill: It's by design. For your scenario, the simplest way is to update the Application manifest (or the Configuration manifest). If delete is allowed during the provisioning process, external cloud resources might be orphaned.

But you are right, for some cases of `ProvisioningAndChecking`, we should allow deletion. 
- HCL is not valid
- no quota and no resource is deleted
- dependent Provider (credentials of a cloud provider) is not available

I am trying, but there are no simple solutions. Terraform Cloud and Enterprise have the concept of `state` and `stage` https://www.terraform.io/docs/cloud/run/states.html. And there are pretty useful APIs, while Terraform Controller, which is based on Terraform, doesn't have any. 

I have to analyze Terraform log myself and be cautious to group the errors. Don't orphan any cloud resources, is the bottom line.

I'll try. Thanks for reporting this issue:)@briankane: This issue has been inactive for over 2 years and is scheduled for closure as part of our backlog maintenance.

  **If this issue is still relevant:**
  - Please comment below to keep it open
  - Provide updated context if the original description is outdated

  **Timeline:** If there's no activity by **Friday, October 24th**, this issue will be automatically closed.

  **Note:** Issues can always be reopened if they become relevant again. We encourage the community to reopen and reprioritize any incorrectly 
  closed issues.@briankane: This issue has been closed following the stale issue notice. 

If this issue is still relevant and should remain open, please:
1. Reopen the issue
2. Remove the 'stale' label
3. Provide an update on the current status or importance

Thank you for your understanding and contribution to KubeVela!

Solution patch:
diff --git a/docs/apidoc/swagger.json b/docs/apidoc/swagger.json
index 9f4aa399..cc9f77b1 100644
--- a/docs/apidoc/swagger.json
+++ b/docs/apidoc/swagger.json
@@ -15,7 +15,300 @@
   "version": "v1beta1"
  },
  "paths": {
-  "/api/v1/applications": {
+  "/api/v1/addon_registries": {
+   "get": {
+    "consumes": [
+     "application/xml",
+     "application/json"
+    ],
+    "produces": [
+     "application/json",
+     "application/xml"
+    ],
+    "tags": [
+     "addon_registry"
+    ],
+    "summary": "list all addon registry",
+    "operationId": "listAddonRegistry",
+    "responses": {
+     "200": {
+      "schema": {
+       "$ref": "#/definitions/v1.ListAddonRegistryResponse"
+      }
+     },
+     "400": {
+      "schema": {
+       "$ref": "#/definitions/bcode.Bcode"
+      }
+     }
+    }
+   },
+   "post": {
+    "consumes": [
+     "application/xml",
+     "application/json"
+    ],
+    "produces": [
+     "application/json",
+     "application/xml"
+    ],
+    "tags": [
+     "addon_registry"
+    ],
+    "summary": "create an addon registry",
+    "operationId": "createAddonRegistry",
+    "parameters": [
+     {
+      "name": "body",
+      "in": "body",
+      "required": true,
+      "schema": {
+       "$ref": "#/definitions/v1.CreateAddonRegistryRequest"
+      }
+     }
+    ],
+    "responses": {
+     "200": {
+      "schema": {
+       "$ref": "#/definitions/v1.AddonRegistryMeta"
+      }
+     },
+     "400": {
+      "schema": {
+       "$ref": "#/definitions/bcode.Bcode"
+      }
+     }
+    }
+   }
+  },
+  "/api/v1/addon_registries/{name}": {
+   "delete": {
+    "consumes": [
+     "application/xml",
+     "application/json"
+    ],
+    "produces": [
+     "application/json",
+     "application/xml"
+    ],
+    "tags": [
+     "addon_registry"
+    ],
+    "summary": "delete an addon registry",
+    "operationId": "deleteAddonRegistry",
+    "parameters": [
+     {
+      "type": "string",
+      "description": "identifier of the addon registry",
+      "name": "name",
+      "in": "path",
+      "required": true
+     }
+    ],
+    "responses": {
+     "200": {
+      "schema": {
+       "$ref": "#/definitions/v1.AddonRegistryMeta"
+      }
+     },
+     "400": {
+      "schema": {
+       "$ref": "#/definitions/bcode.Bcode"
+      }
+     }
+    }
+   }
+  },
+  "/api/v1/addons": {
+   "get": {
+    "consumes": [
+     "application/xml",
+     "application/json"
+    ],
+    "produces": [
+     "application/json",
+     "application/xml"
+    ],
+    "tags": [
+     "addon"
+    ],
+    "summary": "list all addons",
+    "operationId": "listAddons",
+    "parameters": [
+     {
+      "type": "string",
+      "description": "Fuzzy search based on name and description.",
+      "name": "query",
+      "in": "query"
+     }
+    ],
+    "responses": {
+     "200": {
+      "schema": {
+       "$ref": "#/definitions/v1.ListAddonResponse"
+      }
+     },
+     "400": {
+      "schema": {
+       "$ref": "#/definitions/bcode.Bcode"
+      }
+     }
+    }
+   }
+  },
+  "/api/v1/addons/{name}": {
+   "get": {
+    "consumes": [
+     "application/xml",
+     "application/json"
+    ],
+    "produces": [
+     "application/json",
+     "application/xml"
+    ],
+    "tags": [
+     "addon"
+    ],
+    "summary": "show details of an addon",
+    "operationId": "detailAddon",
+    "parameters": [
+     {
+      "type": "string",
+      "description": "addon name to query detail",
+      "name": "name",
+      "in": "path",
+      "required": true
+     }
+    ],
+    "responses": {
+     "200": {
+      "schema": {
+       "$ref": "#/definitions/v1.DetailAddonResponse"
+      }
+     },
+     "400": {
+      "schema": {
+       "$ref": "#/definitions/bcode.Bcode"
+      }
+     }
+    }
+   }
+  },
+  "/api/v1/addons/{name}/disable": {
+   "post": {
+    "consumes": [
+     "application/xml",
+     "application/json"
+    ],
+    "produces": [
+     "application/json",
+     "application/xml"
+    ],
+    "tags": [
+     "addon"
+    ],
+    "summary": "disable an addon",
+    "operationId": "disableAddon",
+    "parameters": [
+     {
+      "type": "string",
+      "description": "addon name to enable",
+      "name": "name",
+      "in": "path",
+      "required": true
+     }
+    ],
+    "responses": {
+     "200": {
+      "schema": {
+       "$ref": "#/definitions/v1.AddonStatusResponse"
+      }
+     },
+     "400": {
+      "schema": {
+       "$ref": "#/definitions/bcode.Bcode"
+      }
+     }
+    }
+   }
+  },
+  "/api/v1/addons/{name}/enable": {
+   "post": {
+    "consumes": [
+     "application/xml",
+     "application/json"
+    ],
+    "produces": [
+     "application/json",
+     "application/xml"
+    ],
+    "tags": [
+     "addon"
+    ],
+    "summary": "enable an addon",
+    "operationId": "enableAddon",
+    "parameters": [
+     {
+      "type": "string",
+      "description": "addon name to enable",
+      "name": "name",
+      "in": "path",
+      "required": true
+     }
+    ],
+    "responses": {
+     "200": {
+      "schema": {
+       "$ref": "#/definitions/v1.AddonStatusResponse"
+      }
+     },
+     "400": {
+      "schema": {
+       "$ref": "#/definitions/bcode.Bcode"
+      }
+     }
+    }
+   }
+  },
+  "/api/v1/addons/{name}/status": {
+   "get": {
+    "consumes": [
+     "application/xml",
+     "application/json"
+    ],
+    "produces": [
+     "application/json",
+     "application/xml"
+    ],
+    "tags": [
+     "addon"
+    ],
+    "summary": "show status of an addon",
+    "operationId": "statusAddon",
+    "parameters": [
+     {
+      "type": "string",
+      "description": "addon name to query status",
+      "name": "name",
+      "in": "path",
+      "required": true
+     }
+    ],
+    "responses": {
+     "200": {
+      "schema": {
+       "$ref": "#/definitions/v1.AddonStatusResponse"
+      }
+     },
+     "400": {
+      "schema": {
+       "$ref": "#/definitions/bcode.Bcode"
+      }
+     }
+    }
+   }
+  },
+  "/api/v1/applicationplans": {
    "get": {
     "consumes": [
      "application/xml",
@@ -53,7 +346,7 @@
     "responses": {
      "200": {
       "schema": {
-       "$ref": "#/definitions/v1.ListApplicationResponse"
+       "$ref": "#/definitions/v1.ListApplicationPlanResponse"
       }
      },
      "400": {
@@ -83,14 +376,14 @@
       "in": "body",
       "required": true,
       "schema": {
-       "$ref": "#/definitions/v1.CreateApplicationRequest"
+       "$ref": "#/definitions/v1.CreateApplicationPlanRequest"
       }
      }
     ],
     "responses": {
      "200": {
       "schema": {
-       "$ref": "#/definitions/v1.ApplicationBase"
+       "$ref": "#/definitions/v1.ApplicationPlanBase"
       }
      },
      "400": {
@@ -101,7 +394,7 @@
     }
    }
   },
-  "/api/v1/applications/{name}": {
+  "/api/v1/applicationplans/{name}": {
    "get": {
     "consumes": [
      "application/xml",
@@ -128,7 +421,7 @@
     "responses": {
      "200": {
       "schema": {
-       "$ref": "#/definitions/v1.DetailApplicationResponse"
+       "$ref": "#/definitions/v1.DetailApplicationPlanResponse"
       }
      },
      "400": {
@@ -175,7 +468,7 @@
     }
    }
   },
-  "/api/v1/applications/{name}/components": {
+  "/api/v1/applicationplans/{name}/componentplans": {
    "get": {
     "consumes": [
      "application/xml",
@@ -188,7 +481,7 @@
     "tags": [
      "application"
     ],
-    "summary": "gets the component topology of the application",
+    "summary": "gets the componentplan topology of the application",
     "operationId": "listApplicationComponents",
     "parameters": [
      {
@@ -200,16 +493,15 @@
      },
      {
       "type": "string",
-      "description": "list components that deployed in define cluster",
-      "name": "cluster",
-      "in": "path",
-      "required": true
+      "description": "list components that deployed in define env",
+      "name": "envName",
+      "in": "query"
      }
     ],
     "responses": {
      "200": {
       "schema": {
-       "$ref": "#/definitions/v1.ComponentListResponse"
+       "$ref": "#/definitions/v1.ComponentPlanListResponse"
       }
      },
      "400": {
@@ -231,7 +523,7 @@
     "tags": [
      "application"
     ],
-    "summary": "create component for application",
+    "summary": "create component plan for application plan",
     "operationId": "createComponent",
     "parameters": [
      {
@@ -246,14 +538,14 @@
       "in": "body",
       "required": true,
       "schema": {
-       "$ref": "#/definitions/v1.CreateComponentRequest"
+       "$ref": "#/definitions/v1.CreateComponentPlanRequest"
       }
      }
     ],
     "responses": {
      "200": {
       "schema": {
-       "$ref": "#/definitions/v1.ComponentBase"
+       "$ref": "#/definitions/v1.ComponentPlanBase"
       }
      },
      "400": {
@@ -264,7 +556,7 @@
     }
    }
   },
-  "/api/v1/applications/{name}/components/{componentName}": {
+  "/api/v1/applicationplans/{name}/componentplans/{componentName}": {
    "get": {
     "consumes": [
      "application/xml",
@@ -277,7 +569,7 @@
     "tags": [
      "application"
     ],
-    "summary": "detail component for application",
+    "summary": "detail component plan for application plan",
     "operationId": "detailComponent",
     "parameters": [
      {
@@ -291,7 +583,7 @@
     "responses": {
      "200": {
       "schema": {
-       "$ref": "#/definitions/v1.DetailComponentResponse"
+       "$ref": "#/definitions/v1.DetailComponentPlanResponse"
       }
      },
      "400": {
@@ -302,7 +594,7 @@
     }
    }
   },
-  "/api/v1/applications/{name}/deploy": {
+  "/api/v1/applicationplans/{name}/deploy": {
    "post": {
     "consumes": [
      "application/xml",
@@ -340,7 +632,7 @@
     }
    }
   },
-  "/api/v1/applications/{name}/policies": {
+  "/api/v1/applicationplans/{name}/policies": {
    "get": {
     "consumes": [
      "application/xml",
@@ -422,7 +714,7 @@
     }
    }
   },
-  "/api/v1/applications/{name}/policies/{policyName}": {
+  "/api/v1/applicationplans/{name}/policies/{policyName}": {
    "get": {
     "consumes": [
      "application/xml",
@@ -561,7 +853,7 @@
     }
    }
   },
-  "/api/v1/applications/{name}/template": {
+  "/api/v1/applicationplans/{name}/template": {
    "post": {
     "consumes": [
      "application/xml",
@@ -715,6 +1007,13 @@
     "summary": "list cloud clusters",
     "operationId": "listCloudClusters",
     "parameters": [
+     {
+      "type": "string",
+      "description": "identifier of the cloud provider",
+      "name": "provider",
+      "in": "path",
+      "required": true
+     },
      {
       "type": "int",
       "default": 0,
@@ -768,6 +1067,13 @@
     "summary": "create cluster from cloud cluster",
     "operationId": "connectCloudCluster",
     "parameters": [
+     {
+      "type": "string",
+      "description": "identifier of the cloud provider",
+      "name": "provider",
+      "in": "path",
+      "required": true
+     },
      {
       "name": "body",
       "in": "body",
@@ -828,7 +1134,7 @@
      }
     }
    },
-   "post": {
+   "put": {
     "consumes": [
      "application/xml",
      "application/json"
@@ -1015,7 +1321,44 @@
     }
    }
   },
-  "/api/v1/workflows": {
+  "/api/v1/query": {
+   "get": {
+    "consumes": [
+     "application/xml",
+     "application/json"
+    ],
+    "produces": [
+     "application/json",
+     "application/xml"
+    ],
+    "tags": [
+     "velaQL"
+    ],
+    "summary": "use velaQL to query resource status",
+    "operationId": "queryView",
+    "parameters": [
+     {
+      "type": "string",
+      "description": "velaql query statement",
+      "name": "velaql",
+      "in": "query"
+     }
+    ],
+    "responses": {
+     "200": {
+      "schema": {
+       "$ref": "#/definitions/v1.VelaQLViewResponse"
+      }
+     },
+     "400": {
+      "schema": {
+       "$ref": "#/definitions/bcode.Bcode"
+      }
+     }
+    }
+   }
+  },
+  "/api/v1/workflowplans": {
    "get": {
     "consumes": [
      "application/xml",
@@ -1076,7 +1419,7 @@
       "in": "body",
       "required": true,
       "schema": {
-       "$ref": "#/definitions/v1.CreateWorkflowRequest"
+       "$ref": "#/definitions/v1.CreateWorkflowPlanRequest"
       }
      }
     ],
@@ -1099,7 +1442,7 @@
     }
    }
   },
-  "/api/v1/workflows/{name}": {
+  "/api/v1/workflowplans/{name}": {
    "get": {
     "consumes": [
      "application/xml",
@@ -1162,7 +1505,7 @@
       "in": "body",
       "required": true,
       "schema": {
-       "$ref": "#/definitions/v1.UpdateWorkflowRequest"
+       "$ref": "#/definitions/v1.UpdateWorkflowPlanRequest"
       }
      }
     ],
@@ -1214,7 +1557,7 @@
     }
    }
   },
-  "/api/v1/workflows/{name}/records": {
+  "/api/v1/workflowplans/{name}/records": {
    "get": {
     "consumes": [
      "application/xml",
@@ -1228,7 +1571,7 @@
      "cluster"
     ],
     "summary": "query application workflow execution record",
-    "operationId": "noop",
+    "operationId": "listWorkflowRecords",
     "parameters": [
      {
       "type": "string",
@@ -1241,217 +1584,31 @@
       "type": "integer",
       "description": "Query the page number.",
       "name": "page",
-      "in": "path",
-      "required": true
-     },
-     {
-      "type": "integer",
-      "description": "Query the page size number.",
-      "name": "pageSize",
-      "in": "path",
-      "required": true
-     }
-    ],
-    "responses": {
-     "200": {
-      "description": "OK",
-      "schema": {
-       "$ref": "#/definitions/map[string]string"
-      }
-     },
-     "500": {
-      "description": "Bummer, something went wrong"
-     }
-    }
-   }
-  },
-  "/v1/addons": {
-   "get": {
-    "consumes": [
-     "application/xml",
-     "application/json"
-    ],
-    "produces": [
-     "application/json",
-     "application/xml"
-    ],
-    "tags": [
-     "addon"
-    ],
-    "summary": "list all addons",
-    "operationId": "noop",
-    "parameters": [
-     {
-      "type": "string",
-      "description": "Cluster-based search",
-      "name": "cluster",
-      "in": "query"
-     }
-    ],
-    "responses": {
-     "200": {
-      "description": "OK",
-      "schema": {
-       "$ref": "#/definitions/map[string]string"
-      }
-     },
-     "500": {
-      "description": "Bummer, something went wrong"
-     }
-    }
-   },
-   "post": {
-    "consumes": [
-     "application/xml",
-     "application/json"
-    ],
-    "produces": [
-     "application/json",
-     "application/xml"
-    ],
-    "tags": [
-     "addon"
-    ],
-    "summary": "create an addon",
-    "operationId": "noop",
-    "parameters": [
-     {
-      "name": "body",
-      "in": "body",
-      "required": true,
-      "schema": {
-       "$ref": "#/definitions/v1.CreateAddonRequest"
-      }
-     }
-    ],
-    "responses": {
-     "200": {
-      "description": "OK"
-     }
-    }
-   }
-  },
-  "/v1/addons/{name}": {
-   "get": {
-    "consumes": [
-     "application/xml",
-     "application/json"
-    ],
-    "produces": [
-     "application/json",
-     "application/xml"
-    ],
-    "tags": [
-     "addon"
-    ],
-    "summary": "show details of an addon",
-    "operationId": "noop",
-    "parameters": [
-     {
-      "type": "string",
-      "description": "identifier of the addon",
-      "name": "name",
-      "in": "path",
-      "required": true
-     }
-    ],
-    "responses": {
-     "200": {
-      "description": "OK"
-     }
-    }
-   },
-   "delete": {
-    "consumes": [
-     "application/xml",
-     "application/json"
-    ],
-    "produces": [
-     "application/json",
-     "application/xml"
-    ],
-    "tags": [
-     "addon"
-    ],
-    "summary": "delete an addon",
-    "operationId": "noop",
-    "parameters": [
-     {
-      "type": "string",
-      "description": "identifier of the addon",
-      "name": "name",
-      "in": "path",
-      "required": true
-     }
-    ],
-    "responses": {
-     "200": {
-      "description": "OK"
-     }
-    }
-   }
-  },
-  "/v1/addons/{name}/disable": {
-   "post": {
-    "consumes": [
-     "application/xml",
-     "application/json"
-    ],
-    "produces": [
-     "application/json",
-     "application/xml"
-    ],
-    "tags": [
-     "addon"
-    ],
-    "summary": "disable an addon on a cluster",
-    "operationId": "noop",
-    "parameters": [
-     {
-      "type": "string",
-      "description": "cluster name",
-      "name": "cluster",
-      "in": "query"
-     }
-    ],
-    "responses": {
-     "200": {
-      "description": "OK"
-     }
-    }
-   }
-  },
-  "/v1/addons/{name}/enable": {
-   "post": {
-    "consumes": [
-     "application/xml",
-     "application/json"
-    ],
-    "produces": [
-     "application/json",
-     "application/xml"
-    ],
-    "tags": [
-     "addon"
-    ],
-    "summary": "enable an addon on a cluster",
-    "operationId": "noop",
-    "parameters": [
+      "in": "path",
+      "required": true
+     },
      {
-      "type": "string",
-      "description": "cluster name",
-      "name": "cluster",
-      "in": "query"
+      "type": "integer",
+      "description": "Query the page size number.",
+      "name": "pageSize",
+      "in": "path",
+      "required": true
      }
     ],
     "responses": {
      "200": {
-      "description": "OK"
+      "description": "OK",
+      "schema": {
+       "$ref": "#/definitions/map[string]string"
+      }
+     },
+     "500": {
+      "description": "Bummer, something went wrong"
      }
     }
    }
   },
-  "/v1/addons/{name}/status": {
+  "/api/v1/workflowplans/{name}/records/{record}": {
    "get": {
     "consumes": [
      "application/xml",
@@ -1462,22 +1619,35 @@
      "application/xml"
     ],
     "tags": [
-     "addon"
+     "cluster"
     ],
-    "summary": "show status of an addon",
-    "operationId": "noop",
+    "summary": "query application workflow execution record detail",
+    "operationId": "detailWorkflowRecord",
     "parameters": [
      {
       "type": "string",
-      "description": "identifier of the addon",
+      "description": "identifier of the workflow",
       "name": "name",
       "in": "path",
       "required": true
+     },
+     {
+      "type": "string",
+      "description": "identifier of the workflow record",
+      "name": "record",
+      "in": "path",
+      "required": true
      }
     ],
     "responses": {
      "200": {
-      "description": "OK"
+      "description": "OK",
+      "schema": {
+       "$ref": "#/definitions/map[string]string"
+      }
+     },
+     "500": {
+      "description": "Bummer, something went wrong"
      }
     }
    }
@@ -1619,6 +1789,7 @@
   },
   "cloudprovider.CloudCluster": {
    "required": [
+    "provider",
     "id",
     "name",
     "type",
@@ -1647,6 +1818,9 @@
     "name": {
      "type": "string"
     },
+    "provider": {
+     "type": "string"
+    },
     "status": {
      "type": "string"
     },
@@ -1661,10 +1835,10 @@
   "common.AppRolloutStatus": {
    "required": [
     "batchRollingState",
-    "currentBatch",
     "upgradedReplicas",
-    "upgradedReadyReplicas",
     "rollingState",
+    "currentBatch",
+    "upgradedReadyReplicas",
     "lastTargetAppRevision"
    ],
    "properties": {
@@ -2129,16 +2303,20 @@
     "type": "string"
    }
   },
-  "model.ApplicationComponent": {
+  "model.ApplicationComponentPlan": {
    "required": [
     "createTime",
     "updateTime",
     "appPrimaryKey",
     "creator",
     "name",
+    "alias",
     "type"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "appPrimaryKey": {
      "type": "string"
     },
@@ -2197,7 +2375,7 @@
     "traits": {
      "type": "array",
      "items": {
-      "$ref": "#/definitions/model.ApplicationTrait"
+      "$ref": "#/definitions/model.ApplicationTraitPlan"
      }
     },
     "type": {
@@ -2209,7 +2387,7 @@
     }
    }
   },
-  "model.ApplicationTrait": {
+  "model.ApplicationTraitPlan": {
    "required": [
     "type"
    ],
@@ -2222,6 +2400,86 @@
     }
    }
   },
+  "model.Cluster": {
+   "required": [
+    "createTime",
+    "updateTime",
+    "name",
+    "alias",
+    "description",
+    "icon",
+    "labels",
+    "status",
+    "reason",
+    "provider",
+    "apiServerURL",
+    "dashboardURL",
+    "kubeConfig",
+    "kubeConfigSecret"
+   ],
+   "properties": {
+    "alias": {
+     "type": "string"
+    },
+    "apiServerURL": {
+     "type": "string"
+    },
+    "createTime": {
+     "type": "string",
+     "format": "date-time"
+    },
+    "dashboardURL": {
+     "type": "string"
+    },
+    "description": {
+     "type": "string"
+    },
+    "icon": {
+     "type": "string"
+    },
+    "kubeConfig": {
+     "type": "string"
+    },
+    "kubeConfigSecret": {
+     "type": "string"
+    },
+    "labels": {
+     "type": "object",
+     "additionalProperties": {
+      "type": "string"
+     }
+    },
+    "name": {
+     "type": "string"
+    },
+    "provider": {
+     "$ref": "#/definitions/model.ProviderInfo"
+    },
+    "reason": {
+     "type": "string"
+    },
+    "status": {
+     "type": "string"
+    },
+    "updateTime": {
+     "type": "string",
+     "format": "date-time"
+    }
+   }
+  },
+  "model.GitAddonSource": {
+   "properties": {
+    "path": {
+     "type": "string"
+    },
+    "token": {
+     "type": "string"
+    },
+    "url": {
+     "type": "string"
+    }
+   }
+  },
   "model.JSONStruct": {
    "type": "object"
   },
@@ -2243,6 +2501,7 @@
   },
   "model.ProviderInfo": {
    "required": [
+    "provider",
     "name",
     "id",
     "zone",
@@ -2261,6 +2520,9 @@
     "name": {
      "type": "string"
     },
+    "provider": {
+     "type": "string"
+    },
     "zone": {
      "type": "string"
     }
@@ -2322,8 +2584,7 @@
     "version",
     "description",
     "icon",
-    "tags",
-    "phase"
+    "tags"
    ],
    "properties": {
     "description": {
@@ -2335,9 +2596,6 @@
     "name": {
      "type": "string"
     },
-    "phase": {
-     "type": "string"
-    },
     "tags": {
      "type": "array",
      "items": {
@@ -2349,68 +2607,29 @@
     }
    }
   },
-  "v1.AddonStatusResponse": {
+  "v1.AddonRegistryMeta": {
    "required": [
-    "phase"
+    "name"
    ],
    "properties": {
-    "phase": {
+    "git": {
+     "$ref": "#/definitions/model.GitAddonSource"
+    },
+    "name": {
      "type": "string"
     }
    }
   },
-  "v1.ApplicationBase": {
+  "v1.AddonStatusResponse": {
    "required": [
-    "name",
-    "namespace",
-    "description",
-    "createTime",
-    "updateTime",
-    "icon",
-    "status",
-    "gatewayRule"
+    "phase"
    ],
    "properties": {
-    "createTime": {
-     "type": "string",
-     "format": "date-time"
-    },
-    "description": {
-     "type": "string"
-    },
-    "envBind": {
-     "type": "array",
-     "items": {
-      "$ref": "#/definitions/v1.EnvBind"
-     }
-    },
-    "gatewayRule": {
-     "type": "array",
-     "items": {
-      "$ref": "#/definitions/v1.GatewayRule"
-     }
-    },
-    "icon": {
-     "type": "string"
-    },
-    "labels": {
-     "type": "object",
-     "additionalProperties": {
-      "type": "string"
-     }
+    "enabling_progress": {
+     "$ref": "#/definitions/v1.EnablingProgress"
     },
-    "name": {
-     "type": "string"
-    },
-    "namespace": {
-     "type": "string"
-    },
-    "status": {
+    "phase": {
      "type": "string"
-    },
-    "updateTime": {
-     "type": "string",
-     "format": "date-time"
     }
    }
   },
@@ -2466,6 +2685,65 @@
     }
    }
   },
+  "v1.ApplicationPlanBase": {
+   "required": [
+    "name",
+    "alias",
+    "namespace",
+    "description",
+    "createTime",
+    "updateTime",
+    "icon",
+    "status",
+    "gatewayRule"
+   ],
+   "properties": {
+    "alias": {
+     "type": "string"
+    },
+    "createTime": {
+     "type": "string",
+     "format": "date-time"
+    },
+    "description": {
+     "type": "string"
+    },
+    "envBind": {
+     "type": "array",
+     "items": {
+      "$ref": "#/definitions/v1.EnvBind"
+     }
+    },
+    "gatewayRule": {
+     "type": "array",
+     "items": {
+      "$ref": "#/definitions/v1.GatewayRule"
+     }
+    },
+    "icon": {
+     "type": "string"
+    },
+    "labels": {
+     "type": "object",
+     "additionalProperties": {
+      "type": "string"
+     }
+    },
+    "name": {
+     "type": "string"
+    },
+    "namespace": {
+     "type": "string"
+    },
+    "status": {
+     "type": "string"
+    },
+    "updateTime": {
+     "type": "string",
+     "format": "date-time"
+    }
+   }
+  },
   "v1.ApplicationRequest": {
    "required": [
     "components"
@@ -2578,6 +2856,7 @@
   "v1.ClusterBase": {
    "required": [
     "name",
+    "alias",
     "description",
     "icon",
     "labels",
@@ -2588,6 +2867,9 @@
     "reason"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "apiServerURL": {
      "type": "string"
     },
@@ -2688,14 +2970,33 @@
     "name": {
      "type": "string"
     },
-    "namespace": {
+    "namespace": {
+     "type": "string"
+    }
+   }
+  },
+  "v1.ComponentDefinitionBase": {
+   "required": [
+    "name",
+    "description",
+    "icon"
+   ],
+   "properties": {
+    "description": {
+     "type": "string"
+    },
+    "icon": {
+     "type": "string"
+    },
+    "name": {
      "type": "string"
     }
    }
   },
-  "v1.ComponentBase": {
+  "v1.ComponentPlanBase": {
    "required": [
     "name",
+    "alias",
     "description",
     "componentType",
     "envNames",
@@ -2705,6 +3006,9 @@
     "updateTime"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "componentType": {
      "type": "string"
     },
@@ -2751,33 +3055,15 @@
     }
    }
   },
-  "v1.ComponentDefinitionBase": {
-   "required": [
-    "name",
-    "description",
-    "icon"
-   ],
-   "properties": {
-    "description": {
-     "type": "string"
-    },
-    "icon": {
-     "type": "string"
-    },
-    "name": {
-     "type": "string"
-    }
-   }
-  },
-  "v1.ComponentListResponse": {
+  "v1.ComponentPlanListResponse": {
    "required": [
-    "components"
+    "componentplans"
    ],
    "properties": {
-    "components": {
+    "componentplans": {
      "type": "array",
      "items": {
-      "$ref": "#/definitions/v1.ComponentBase"
+      "$ref": "#/definitions/v1.ComponentPlanBase"
      }
     }
    }
@@ -2788,6 +3074,7 @@
     "accessKeySecret",
     "clusterID",
     "name",
+    "alias",
     "icon"
    ],
    "properties": {
@@ -2797,6 +3084,9 @@
     "accessKeySecret": {
      "type": "string"
     },
+    "alias": {
+     "type": "string"
+    },
     "clusterID": {
      "type": "string"
     },
@@ -2817,51 +3107,31 @@
     }
    }
   },
-  "v1.CreateAddonRequest": {
+  "v1.CreateAddonRegistryRequest": {
    "required": [
-    "name",
-    "version",
-    "icon",
-    "tags"
+    "name"
    ],
    "properties": {
-    "deploy_data": {
-     "type": "string"
-    },
-    "deploy_url": {
-     "type": "string"
-    },
-    "description": {
-     "type": "string"
-    },
-    "detail": {
-     "type": "string"
-    },
-    "icon": {
-     "type": "string"
+    "git": {
+     "$ref": "#/definitions/model.GitAddonSource"
     },
     "name": {
      "type": "string"
-    },
-    "tags": {
-     "type": "array",
-     "items": {
-      "type": "string"
-     }
-    },
-    "version": {
-     "type": "string"
     }
    }
   },
-  "v1.CreateApplicationRequest": {
+  "v1.CreateApplicationPlanRequest": {
    "required": [
     "name",
+    "alias",
     "namespace",
     "description",
     "icon"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "deploy": {
      "type": "boolean"
     },
@@ -2915,9 +3185,13 @@
   "v1.CreateClusterRequest": {
    "required": [
     "name",
+    "alias",
     "icon"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "dashboardURL": {
      "type": "string"
     },
@@ -2944,15 +3218,19 @@
     }
    }
   },
-  "v1.CreateComponentRequest": {
+  "v1.CreateComponentPlanRequest": {
    "required": [
     "name",
+    "alias",
     "description",
     "icon",
     "componentType",
     "dependsOn"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "componentType": {
      "type": "string"
     },
@@ -3024,15 +3302,19 @@
     }
    }
   },
-  "v1.CreateWorkflowRequest": {
+  "v1.CreateWorkflowPlanRequest": {
    "required": [
     "appName",
     "name",
+    "alias",
     "description",
     "enable",
     "default"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "appName": {
      "type": "string"
     },
@@ -3058,20 +3340,16 @@
   },
   "v1.DetailAddonResponse": {
    "required": [
+    "version",
     "description",
     "icon",
     "tags",
-    "phase",
-    "name",
-    "version"
+    "name"
    ],
    "properties": {
     "deploy_data": {
      "type": "string"
     },
-    "deploy_url": {
-     "type": "string"
-    },
     "description": {
      "type": "string"
     },
@@ -3084,9 +3362,6 @@
     "name": {
      "type": "string"
     },
-    "phase": {
-     "type": "string"
-    },
     "tags": {
      "type": "array",
      "items": {
@@ -3098,22 +3373,26 @@
     }
    }
   },
-  "v1.DetailApplicationResponse": {
+  "v1.DetailApplicationPlanResponse": {
    "required": [
-    "description",
-    "createTime",
+    "icon",
     "status",
     "gatewayRule",
-    "name",
     "namespace",
+    "description",
+    "createTime",
     "updateTime",
-    "icon",
+    "name",
+    "alias",
     "policies",
     "status",
     "resourceInfo",
     "workflowStatus"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "createTime": {
      "type": "string",
      "format": "date-time"
@@ -3174,21 +3453,33 @@
   },
   "v1.DetailClusterResponse": {
    "required": [
-    "status",
-    "icon",
+    "createTime",
     "description",
-    "labels",
-    "providerInfo",
-    "apiServerURL",
-    "dashboardURL",
+    "status",
     "reason",
+    "kubeConfig",
+    "kubeConfigSecret",
     "name",
+    "alias",
+    "provider",
+    "labels",
+    "dashboardURL",
+    "updateTime",
+    "icon",
+    "apiServerURL",
     "resourceInfo"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "apiServerURL": {
      "type": "string"
     },
+    "createTime": {
+     "type": "string",
+     "format": "date-time"
+    },
     "dashboardURL": {
      "type": "string"
     },
@@ -3198,6 +3489,12 @@
     "icon": {
      "type": "string"
     },
+    "kubeConfig": {
+     "type": "string"
+    },
+    "kubeConfigSecret": {
+     "type": "string"
+    },
     "labels": {
      "type": "object",
      "additionalProperties": {
@@ -3207,26 +3504,28 @@
     "name": {
      "type": "string"
     },
-    "providerInfo": {
+    "provider": {
      "$ref": "#/definitions/model.ProviderInfo"
     },
     "reason": {
      "type": "string"
     },
-    "remoteManageURL": {
-     "type": "string"
-    },
     "resourceInfo": {
      "$ref": "#/definitions/v1.ClusterResourceInfo"
     },
     "status": {
      "type": "string"
+    },
+    "updateTime": {
+     "type": "string",
+     "format": "date-time"
     }
    }
   },
-  "v1.DetailComponentResponse": {
+  "v1.DetailComponentPlanResponse": {
    "required": [
     "appPrimaryKey",
+    "alias",
     "type",
     "updateTime",
     "creator",
@@ -3234,6 +3533,9 @@
     "createTime"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "appPrimaryKey": {
      "type": "string"
     },
@@ -3292,7 +3594,7 @@
     "traits": {
      "type": "array",
      "items": {
-      "$ref": "#/definitions/model.ApplicationTrait"
+      "$ref": "#/definitions/model.ApplicationTraitPlan"
      }
     },
     "type": {
@@ -3306,13 +3608,13 @@
   },
   "v1.DetailPolicyResponse": {
    "required": [
+    "description",
     "creator",
     "properties",
     "createTime",
     "updateTime",
     "name",
-    "type",
-    "description"
+    "type"
    ],
    "properties": {
     "createTime": {
@@ -3340,17 +3642,21 @@
     }
    }
   },
-  "v1.DetailWorkflowResponse": {
+  "v1.DetailWorkflowPlanResponse": {
    "required": [
+    "description",
+    "enable",
     "default",
     "createTime",
     "updateTime",
     "name",
-    "description",
-    "enable",
+    "alias",
     "workflowRecord"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "createTime": {
      "type": "string",
      "format": "date-time"
@@ -3382,7 +3688,72 @@
     }
    }
   },
+  "v1.DetailWorkflowRecordResponse": {
+   "required": [
+    "name",
+    "namespace",
+    "suspend",
+    "terminated",
+    "deployTime",
+    "deployUser",
+    "commit",
+    "sourceType"
+   ],
+   "properties": {
+    "commit": {
+     "type": "string"
+    },
+    "deployTime": {
+     "type": "string",
+     "format": "date-time"
+    },
+    "deployUser": {
+     "type": "string"
+    },
+    "name": {
+     "type": "string"
+    },
+    "namespace": {
+     "type": "string"
+    },
+    "sourceType": {
+     "type": "string"
+    },
+    "startTime": {
+     "type": "string",
+     "format": "date-time"
+    },
+    "steps": {
+     "type": "array",
+     "items": {
+      "$ref": "#/definitions/common.WorkflowStepStatus"
+     }
+    },
+    "suspend": {
+     "type": "boolean"
+    },
+    "terminated": {
+     "type": "boolean"
+    }
+   }
+  },
   "v1.EmptyResponse": {},
+  "v1.EnablingProgress": {
+   "required": [
+    "enabled_components",
+    "total_components"
+   ],
+   "properties": {
+    "enabled_components": {
+     "type": "integer",
+     "format": "int32"
+    },
+    "total_components": {
+     "type": "integer",
+     "format": "int32"
+    }
+   }
+  },
   "v1.EnvBind": {
    "required": [
     "name",
@@ -3427,6 +3798,19 @@
     }
    }
   },
+  "v1.ListAddonRegistryResponse": {
+   "required": [
+    "registrys"
+   ],
+   "properties": {
+    "registrys": {
+     "type": "array",
+     "items": {
+      "$ref": "#/definitions/v1.AddonRegistryMeta"
+     }
+    }
+   }
+  },
   "v1.ListAddonResponse": {
    "required": [
     "addons"
@@ -3440,28 +3824,28 @@
     }
    }
   },
-  "v1.ListApplicationPolicy": {
+  "v1.ListApplicationPlanResponse": {
    "required": [
-    "policies"
+    "applicationplans"
    ],
    "properties": {
-    "policies": {
+    "applicationplans": {
      "type": "array",
      "items": {
-      "$ref": "#/definitions/v1.PolicyBase"
+      "$ref": "#/definitions/v1.ApplicationPlanBase"
      }
     }
    }
   },
-  "v1.ListApplicationResponse": {
+  "v1.ListApplicationPolicy": {
    "required": [
-    "applications"
+    "policies"
    ],
    "properties": {
-    "applications": {
+    "policies": {
      "type": "array",
      "items": {
-      "$ref": "#/definitions/v1.ApplicationBase"
+      "$ref": "#/definitions/v1.PolicyBase"
      }
     }
    }
@@ -3536,6 +3920,19 @@
     }
    }
   },
+  "v1.ListWorkflowPlanResponse": {
+   "required": [
+    "workflowplans"
+   ],
+   "properties": {
+    "workflowplans": {
+     "type": "array",
+     "items": {
+      "$ref": "#/definitions/v1.WorkflowPlanBase"
+     }
+    }
+   }
+  },
   "v1.ListWorkflowRecordsResponse": {
    "required": [
     "records",
@@ -3710,13 +4107,17 @@
     }
    }
   },
-  "v1.UpdateWorkflowRequest": {
+  "v1.UpdateWorkflowPlanRequest": {
    "required": [
+    "alias",
     "description",
     "enable",
     "default"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "default": {
      "type": "boolean"
     },
@@ -3734,9 +4135,13 @@
     }
    }
   },
-  "v1.WorkflowBase": {
+  "v1.VelaQLViewResponse": {
+   "type": "object"
+  },
+  "v1.WorkflowPlanBase": {
    "required": [
     "name",
+    "alias",
     "description",
     "enable",
     "default",
@@ -3744,6 +4149,9 @@
     "updateTime"
    ],
    "properties": {
+    "alias": {
+     "type": "string"
+    },
     "createTime": {
      "type": "string",
      "format": "date-time"
@@ -3766,7 +4174,38 @@
     }
    }
   },
-  "v1.WorkflowRecord": {},
+  "v1.WorkflowRecord": {
+   "required": [
+    "name",
+    "namespace",
+    "suspend",
+    "terminated"
+   ],
+   "properties": {
+    "name": {
+     "type": "string"
+    },
+    "namespace": {
+     "type": "string"
+    },
+    "startTime": {
+     "type": "string",
+     "format": "date-time"
+    },
+    "steps": {
+     "type": "array",
+     "items": {
+      "$ref": "#/definitions/common.WorkflowStepStatus"
+     }
+    },
+    "suspend": {
+     "type": "boolean"
+    },
+    "terminated": {
+     "type": "boolean"
+    }
+   }
+  },
   "v1.WorkflowStep": {
    "required": [
     "name",
diff --git a/go.mod b/go.mod
index 2c5bf982..c765a3a3 100644
--- a/go.mod
+++ b/go.mod
@@ -7,10 +7,10 @@ require (
 	github.com/AlecAivazis/survey/v2 v2.1.1
 	github.com/Masterminds/sprig v2.22.0+incompatible
 	github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8
+	github.com/agiledragon/gomonkey/v2 v2.3.0
 	github.com/alibabacloud-go/cs-20151215/v2 v2.4.5
 	github.com/alibabacloud-go/darabonba-openapi v0.1.4
 	github.com/alibabacloud-go/tea v1.1.15
-	github.com/agiledragon/gomonkey/v2 v2.3.0
 	github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b
 	github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869
 	github.com/briandowns/spinner v1.11.1
diff --git a/pkg/apiserver/model/addon.go b/pkg/apiserver/model/addon.go
index fffd52e3..0088a858 100644
--- a/pkg/apiserver/model/addon.go
+++ b/pkg/apiserver/model/addon.go
@@ -26,7 +26,7 @@ type AddonRegistry struct {
 
 // GitAddonSource defines the information about the Git as addon source
 type GitAddonSource struct {
-	URL   string `json:"url,omitempty"`
+	URL   string `json:"url,omitempty" validate:"required"`
 	Path  string `json:"path,omitempty"`
 	Token string `json:"token,omitempty"`
 }
diff --git a/pkg/apiserver/model/application.go b/pkg/apiserver/model/application.go
index 9a3f1be8..5095f1cc 100644
--- a/pkg/apiserver/model/application.go
+++ b/pkg/apiserver/model/application.go
@@ -23,11 +23,11 @@ import (
 )
 
 func init() {
-	RegistModel(&ApplicationComponent{}, &ApplicationPolicy{}, &Application{}, &DeployEvent{})
+	RegistModel(&ApplicationComponentPlan{}, &ApplicationPolicyPlan{}, &ApplicationPlan{}, &DeployEvent{})
 }
 
-// Application database model
-type Application struct {
+// ApplicationPlan application delivery plan model
+type ApplicationPlan struct {
 	Model
 	Name        string            `json:"name"`
 	Alias       string            `json:"alias"`
@@ -39,17 +39,17 @@ type Application struct {
 }
 
 // TableName return custom table name
-func (a *Application) TableName() string {
+func (a *ApplicationPlan) TableName() string {
 	return tableNamePrefix + "application"
 }
 
 // PrimaryKey return custom primary key
-func (a *Application) PrimaryKey() string {
+func (a *ApplicationPlan) PrimaryKey() string {
 	return a.Name
 }
 
 // Index return custom index
-func (a *Application) Index() map[string]string {
+func (a *ApplicationPlan) Index() map[string]string {
 	index := make(map[string]string)
 	if a.Name != "" {
 		index["name"] = a.Name
@@ -74,8 +74,8 @@ type ClusterSelector struct {
 	Namespace string `json:"namespace,omitempty"`
 }
 
-// ApplicationComponent component database model
-type ApplicationComponent struct {
+// ApplicationComponentPlan component database model
+type ApplicationComponentPlan struct {
 	Model
 	AppPrimaryKey string            `json:"appPrimaryKey"`
 	Description   string            `json:"description,omitempty"`
@@ -93,24 +93,24 @@ type ApplicationComponent struct {
 	Inputs           common.StepInputs  `json:"inputs,omitempty"`
 	Outputs          common.StepOutputs `json:"outputs,omitempty"`
 	// Traits define the trait of one component, the type must be array to keep the order.
-	Traits []ApplicationTrait `json:"traits,omitempty"`
-	// scopes in ApplicationComponent defines the component-level scopes
+	Traits []ApplicationTraitPlan `json:"traits,omitempty"`
+	// scopes in ApplicationComponentPlan defines the component-level scopes
 	// the format is <scope-type:scope-instance-name> pairs, the key represents type of `ScopeDefinition` while the value represent the name of scope instance.
 	Scopes map[string]string `json:"scopes,omitempty"`
 }
 
 // TableName return custom table name
-func (a *ApplicationComponent) TableName() string {
+func (a *ApplicationComponentPlan) TableName() string {
 	return tableNamePrefix + "application_component"
 }
 
 // PrimaryKey return custom primary key
-func (a *ApplicationComponent) PrimaryKey() string {
+func (a *ApplicationComponentPlan) PrimaryKey() string {
 	return fmt.Sprintf("%s-%s", a.AppPrimaryKey, a.Name)
 }
 
 // Index return custom index
-func (a *ApplicationComponent) Index() map[string]string {
+func (a *ApplicationComponentPlan) Index() map[string]string {
 	index := make(map[string]string)
 	if a.Name != "" {
 		index["name"] = a.Name
@@ -124,8 +124,8 @@ func (a *ApplicationComponent) Index() map[string]string {
 	return index
 }
 
-// ApplicationPolicy app policy
-type ApplicationPolicy struct {
+// ApplicationPolicyPlan app policy
+type ApplicationPolicyPlan struct {
 	Model
 	AppPrimaryKey string      `json:"appPrimaryKey"`
 	Name          string      `json:"name"`
@@ -136,17 +136,17 @@ type ApplicationPolicy struct {
 }
 
 // TableName return custom table name
-func (a *ApplicationPolicy) TableName() string {
+func (a *ApplicationPolicyPlan) TableName() string {
 	return tableNamePrefix + "application_policy"
 }
 
 // PrimaryKey return custom primary key
-func (a *ApplicationPolicy) PrimaryKey() string {
+func (a *ApplicationPolicyPlan) PrimaryKey() string {
 	return fmt.Sprintf("%s-%s", a.AppPrimaryKey, a.Name)
 }
 
 // Index return custom index
-func (a *ApplicationPolicy) Index() map[string]string {
+func (a *ApplicationPolicyPlan) Index() map[string]string {
 	index := make(map[string]string)
 	if a.Name != "" {
 		index["name"] = a.Name
@@ -160,8 +160,8 @@ func (a *ApplicationPolicy) Index() map[string]string {
 	return index
 }
 
-// ApplicationTrait application trait
-type ApplicationTrait struct {
+// ApplicationTraitPlan application trait
+type ApplicationTraitPlan struct {
 	Type       string      `json:"type"`
 	Properties *JSONStruct `json:"properties,omitempty"`
 }
diff --git a/pkg/apiserver/model/workflow.go b/pkg/apiserver/model/workflow.go
index c0395f54..261f7607 100644
--- a/pkg/apiserver/model/workflow.go
+++ b/pkg/apiserver/model/workflow.go
@@ -24,12 +24,12 @@ import (
 )
 
 func init() {
-	RegistModel(&Workflow{})
+	RegistModel(&WorkflowPlan{})
 	RegistModel(&WorkflowRecord{})
 }
 
-// Workflow application delivery plan database model
-type Workflow struct {
+// WorkflowPlan application delivery plan database model
+type WorkflowPlan struct {
 	Model
 	Name        string `json:"name"`
 	Alias       string `json:"alias"`
@@ -55,17 +55,17 @@ type WorkflowStep struct {
 }
 
 // TableName return custom table name
-func (w *Workflow) TableName() string {
+func (w *WorkflowPlan) TableName() string {
 	return tableNamePrefix + "workflow"
 }
 
 // PrimaryKey return custom primary key
-func (w *Workflow) PrimaryKey() string {
+func (w *WorkflowPlan) PrimaryKey() string {
 	return w.Name
 }
 
 // Index return custom primary key
-func (w *Workflow) Index() map[string]string {
+func (w *WorkflowPlan) Index() map[string]string {
 	index := make(map[string]string)
 	if w.Name != "" {
 		index["name"] = w.Name
diff --git a/pkg/apiserver/rest/apis/v1/types.go b/pkg/apiserver/rest/apis/v1/types.go
index 9f6b0c05..035315d8 100644
--- a/pkg/apiserver/rest/apis/v1/types.go
+++ b/pkg/apiserver/rest/apis/v1/types.go
@@ -51,7 +51,7 @@ type EmptyResponse struct{}
 // CreateAddonRegistryRequest defines the format for addon registry create request
 type CreateAddonRegistryRequest struct {
 	Name string                `json:"name" validate:"checkname"`
-	Git  *model.GitAddonSource `json:"git,omitempty"`
+	Git  *model.GitAddonSource `json:"git,omitempty" validate:"required"`
 }
 
 // AddonRegistryMeta defines the format for a single addon registry
@@ -139,6 +139,17 @@ type ConnectCloudClusterRequest struct {
 	Labels          map[string]string `json:"labels,omitempty"`
 }
 
+// CreateCloudClusterRequest request parameters to create a cloud cluster (buy one)
+type CreateCloudClusterRequest struct {
+	AccessKeyID       string `json:"accessKeyID"`
+	AccessKeySecret   string `json:"accessKeySecret"`
+	Name              string `json:"name" validate:"checkname"`
+	Zone              string `json:"zone"`
+	WorkerNumber      int    `json:"workerNumber"`
+	CPUCoresPerWorker int64  `json:"cpuCoresPerWorker"`
+	MemoryPerWorker   int64  `json:"memoryPerWorker"`
+}
+
 // ClusterResourceInfo resource info of cluster
 type ClusterResourceInfo struct {
 	WorkerNumber     int      `json:"workerNumber"`
@@ -171,6 +182,17 @@ type ListCloudClusterResponse struct {
 	Total    int                          `json:"total"`
 }
 
+// CreateCloudClusterResponse return values for cloud cluster create request
+type CreateCloudClusterResponse struct {
+	ClusterID string `json:"clusterID"`
+	Status    string `json:"status"`
+}
+
+// ListCloudClusterCreationResponse return the cluster names of creation process of cloud clusters
+type ListCloudClusterCreationResponse struct {
+	Creations []string `json:"creations"`
+}
+
 // ClusterBase cluster base model
 type ClusterBase struct {
 	Name        string            `json:"name"`
@@ -187,16 +209,16 @@ type ClusterBase struct {
 	Reason string `json:"reason"`
 }
 
-// ListApplicatioOptions list application query options
-type ListApplicatioOptions struct {
+// ListApplicatioPlanOptions list application plan query options
+type ListApplicatioPlanOptions struct {
 	Namespace string `json:"namespace"`
 	Cluster   string `json:"cluster"`
 	Query     string `json:"query"`
 }
 
-// ListApplicationResponse list applications by query params
-type ListApplicationResponse struct {
-	Applications []*ApplicationBase `json:"applications"`
+// ListApplicationPlanResponse list applications by query params
+type ListApplicationPlanResponse struct {
+	ApplicationPlans []*ApplicationPlanBase `json:"applicationplans"`
 }
 
 // EnvBindList env bind list
@@ -212,8 +234,8 @@ func (e EnvBindList) ContainCluster(name string) bool {
 	return false
 }
 
-// ApplicationBase application base model
-type ApplicationBase struct {
+// ApplicationPlanBase application base model
+type ApplicationPlanBase struct {
 	Name            string            `json:"name"`
 	Alias           string            `json:"alias"`
 	Namespace       string            `json:"namespace"`
@@ -246,8 +268,8 @@ type GatewayRule struct {
 	ComponentPort int32    `json:"componentPort"`
 }
 
-// CreateApplicationRequest create application request body
-type CreateApplicationRequest struct {
+// CreateApplicationPlanRequest create application plan request body
+type CreateApplicationPlanRequest struct {
 	Name        string            `json:"name" validate:"checkname"`
 	Alias       string            `json:"alias" validate:"checkalias"`
 	Namespace   string            `json:"namespace" validate:"checkname"`
@@ -274,9 +296,9 @@ type ClusterSelector struct {
 	Namespace string `json:"namespace,omitempty"`
 }
 
-// DetailApplicationResponse application detail
-type DetailApplicationResponse struct {
-	ApplicationBase
+// DetailApplicationPlanResponse application plan detail
+type DetailApplicationPlanResponse struct {
+	ApplicationPlanBase
 	Policies       []string                `json:"policies"`
 	Status         string                  `json:"status"`
 	ResourceInfo   ApplicationResourceInfo `json:"resourceInfo"`
@@ -296,8 +318,8 @@ type ApplicationResourceInfo struct {
 	// Others, such as: Memory、CPU、GPU、Storage
 }
 
-// ComponentBase component base model
-type ComponentBase struct {
+// ComponentPlanBase component plan base model
+type ComponentPlanBase struct {
 	Name          string            `json:"name"`
 	Alias         string            `json:"alias"`
 	Description   string            `json:"description"`
@@ -312,13 +334,13 @@ type ComponentBase struct {
 	UpdateTime    time.Time         `json:"updateTime"`
 }
 
-// ComponentListResponse list component
-type ComponentListResponse struct {
-	Components []*ComponentBase `json:"components"`
+// ComponentPlanListResponse list component plan
+type ComponentPlanListResponse struct {
+	ComponentPlans []*ComponentPlanBase `json:"componentplans"`
 }
 
-// CreateComponentRequest create component request model
-type CreateComponentRequest struct {
+// CreateComponentPlanRequest create component plan request model
+type CreateComponentPlanRequest struct {
 	Name          string            `json:"name" validate:"checkname"`
 	Alias         string            `json:"alias" validate:"checkalias"`
 	Description   string            `json:"description"`
@@ -330,9 +352,9 @@ type CreateComponentRequest struct {
 	DependsOn     []string          `json:"dependsOn"`
 }
 
-// DetailComponentResponse detail component model
-type DetailComponentResponse struct {
-	model.ApplicationComponent
+// DetailComponentPlanResponse detail component plan model
+type DetailComponentPlanResponse struct {
+	model.ApplicationComponentPlan
 	//TODO: Status
 }
 
@@ -384,13 +406,31 @@ type NamespaceDetailResponse struct {
 	NamespaceBase
 }
 
-// ListComponentDefinitionResponse list component dedinition response model
-type ListComponentDefinitionResponse struct {
-	ComponentDefinitions []*ComponentDefinitionBase `json:"componentDefinitions"`
+// ListDefinitionResponse list definition response model
+type ListDefinitionResponse struct {
+	Definitions []*DefinitionBase `json:"definitions"`
+}
+
+// DetailDefinitionResponse get definition detail
+type DetailDefinitionResponse struct {
+	Schema *DefinitionSchema `json:"schema"`
+}
+
+type DefinitionSchema struct {
+	Properties map[string]DefinitionProperties `json:"properties"`
+	Required   []string                        `json:"required"`
+	Type       string                          `json:"type"`
+}
+
+type DefinitionProperties struct {
+	Default     string `json:"default"`
+	Description string `json:"description"`
+	Title       string `json:"title"`
+	Type        string `json:"type"`
 }
 
-// ComponentDefinitionBase component definition base model
-type ComponentDefinitionBase struct {
+// DefinitionBase is the definition base model
+type DefinitionBase struct {
 	Name        string `json:"name"`
 	Description string `json:"description"`
 	Icon        string `json:"icon"`
@@ -452,8 +492,8 @@ type PolicyDefinition struct {
 	Parameters  []types.Parameter `json:"parameters"`
 }
 
-// CreateWorkflowRequest create workflow request
-type CreateWorkflowRequest struct {
+// CreateWorkflowPlanRequest create workflow plan request
+type CreateWorkflowPlanRequest struct {
 	AppName     string         `json:"appName" validate:"checkname"`
 	Name        string         `json:"name"  validate:"checkname"`
 	Alias       string         `json:"alias"  validate:"checkalias"`
@@ -463,8 +503,8 @@ type CreateWorkflowRequest struct {
 	Default     bool           `json:"default"`
 }
 
-// UpdateWorkflowRequest update or create application workflow
-type UpdateWorkflowRequest struct {
+// UpdateWorkflowPlanRequest update or create application workflow
+type UpdateWorkflowPlanRequest struct {
 	Alias       string         `json:"alias"  validate:"checkalias"`
 	Description string         `json:"description"`
 	Steps       []WorkflowStep `json:"steps,omitempty"`
@@ -483,20 +523,20 @@ type WorkflowStep struct {
 	Outputs    common.StepOutputs `json:"outputs,omitempty"`
 }
 
-// DetailWorkflowResponse detail workflow response
-type DetailWorkflowResponse struct {
-	WorkflowBase
+// DetailWorkflowPlanResponse detail workflow response
+type DetailWorkflowPlanResponse struct {
+	WorkflowPlanBase
 	Steps      []WorkflowStep  `json:"steps,omitempty"`
 	LastRecord *WorkflowRecord `json:"workflowRecord"`
 }
 
-// ListWorkflowResponse list application workflows
-type ListWorkflowResponse struct {
-	Workflows []*WorkflowBase `json:"workflows"`
+// ListWorkflowPlanResponse list application workflows
+type ListWorkflowPlanResponse struct {
+	WorkflowPlans []*WorkflowPlanBase `json:"workflowplans"`
 }
 
-// WorkflowBase workflow base model
-type WorkflowBase struct {
+// WorkflowPlanBase workflow base model
+type WorkflowPlanBase struct {
 	Name        string    `json:"name"`
 	Alias       string    `json:"alias"`
 	Description string    `json:"description"`
diff --git a/pkg/apiserver/rest/usecase/addon.go b/pkg/apiserver/rest/usecase/addon.go
index 44cb83f1..0a1c3af8 100644
--- a/pkg/apiserver/rest/usecase/addon.go
+++ b/pkg/apiserver/rest/usecase/addon.go
@@ -5,7 +5,6 @@ import (
 	"context"
 	"errors"
 	"fmt"
-	"net/http"
 	"net/url"
 	"path"
 	"sort"
@@ -47,6 +46,7 @@ const (
 type AddonUsecase interface {
 	GetAddonRegistryModel(ctx context.Context, name string) (*model.AddonRegistry, error)
 	CreateAddonRegistry(ctx context.Context, req apis.CreateAddonRegistryRequest) (*apis.AddonRegistryMeta, error)
+	DeleteAddonRegistry(ctx context.Context, name string) error
 	ListAddonRegistries(ctx context.Context) ([]*apis.AddonRegistryMeta, error)
 	ListAddons(ctx context.Context, detailed bool, query string) ([]*apis.DetailAddonResponse, error)
 	StatusAddon(name string) (*apis.AddonStatusResponse, error)
@@ -158,6 +158,10 @@ func (u *addonUsecaseImpl) ListAddons(ctx context.Context, detailed bool, query
 	return addons, nil
 }
 
+func (u *addonUsecaseImpl) DeleteAddonRegistry(ctx context.Context, name string) error {
+	return u.ds.Delete(ctx, &model.AddonRegistry{Name: name})
+}
+
 func (u *addonUsecaseImpl) CreateAddonRegistry(ctx context.Context, req apis.CreateAddonRegistryRequest) (*apis.AddonRegistryMeta, error) {
 	r := addonRegistryModelFromCreateAddonRegistryRequest(req)
 
@@ -312,13 +316,11 @@ func hasAddon(addons []*apis.DetailAddonResponse, name string) bool {
 func getAddonsFromGit(baseURL, dir, token string, detailed bool) ([]*apis.DetailAddonResponse, error) {
 	addons := []*apis.DetailAddonResponse{}
 	dec := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme)
-	var tc *http.Client
+	var ts oauth2.TokenSource
 	if token != "" {
-		ts := oauth2.StaticTokenSource(
-			&oauth2.Token{AccessToken: token},
-		)
-		tc = oauth2.NewClient(context.Background(), ts)
+		ts = oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
 	}
+	tc := oauth2.NewClient(context.Background(), ts)
 	tc.Timeout = time.Second * 10
 	clt := github.NewClient(tc)
 	// TODO add error handling
diff --git a/pkg/apiserver/rest/usecase/application.go b/pkg/apiserver/rest/usecase/application.go
index c39fbe8d..64a6f4b3 100644
--- a/pkg/apiserver/rest/usecase/application.go
+++ b/pkg/apiserver/rest/usecase/application.go
@@ -53,22 +53,22 @@ const (
 
 // ApplicationUsecase application usecase
 type ApplicationUsecase interface {
-	ListApplications(ctx context.Context, listOptions apisv1.ListApplicatioOptions) ([]*apisv1.ApplicationBase, error)
-	GetApplication(ctx context.Context, appName string) (*model.Application, error)
-	DetailApplication(ctx context.Context, app *model.Application) (*apisv1.DetailApplicationResponse, error)
-	PublishApplicationTemplate(ctx context.Context, app *model.Application) (*apisv1.ApplicationTemplateBase, error)
-	CreateApplication(context.Context, apisv1.CreateApplicationRequest) (*apisv1.ApplicationBase, error)
-	DeleteApplication(ctx context.Context, app *model.Application) error
-	Deploy(ctx context.Context, app *model.Application, req apisv1.ApplicationDeployRequest) (*apisv1.ApplicationDeployResponse, error)
-	ListComponents(ctx context.Context, app *model.Application) ([]*apisv1.ComponentBase, error)
-	AddComponent(ctx context.Context, app *model.Application, com apisv1.CreateComponentRequest) (*apisv1.ComponentBase, error)
-	DetailComponent(ctx context.Context, app *model.Application, componentName string) (*apisv1.DetailComponentResponse, error)
-	DeleteComponent(ctx context.Context, app *model.Application, componentName string) error
-	ListPolicies(ctx context.Context, app *model.Application) ([]*apisv1.PolicyBase, error)
-	AddPolicy(ctx context.Context, app *model.Application, policy apisv1.CreatePolicyRequest) (*apisv1.PolicyBase, error)
-	DetailPolicy(ctx context.Context, app *model.Application, policyName string) (*apisv1.DetailPolicyResponse, error)
-	DeletePolicy(ctx context.Context, app *model.Application, policyName string) error
-	UpdatePolicy(ctx context.Context, app *model.Application, policyName string, policy apisv1.UpdatePolicyRequest) (*apisv1.DetailPolicyResponse, error)
+	ListApplications(ctx context.Context, listOptions apisv1.ListApplicatioPlanOptions) ([]*apisv1.ApplicationPlanBase, error)
+	GetApplication(ctx context.Context, appName string) (*model.ApplicationPlan, error)
+	DetailApplication(ctx context.Context, app *model.ApplicationPlan) (*apisv1.DetailApplicationPlanResponse, error)
+	PublishApplicationTemplate(ctx context.Context, app *model.ApplicationPlan) (*apisv1.ApplicationTemplateBase, error)
+	CreateApplication(context.Context, apisv1.CreateApplicationPlanRequest) (*apisv1.ApplicationPlanBase, error)
+	DeleteApplication(ctx context.Context, app *model.ApplicationPlan) error
+	Deploy(ctx context.Context, app *model.ApplicationPlan, req apisv1.ApplicationDeployRequest) (*apisv1.ApplicationDeployResponse, error)
+	ListComponents(ctx context.Context, app *model.ApplicationPlan) ([]*apisv1.ComponentPlanBase, error)
+	AddComponent(ctx context.Context, app *model.ApplicationPlan, com apisv1.CreateComponentPlanRequest) (*apisv1.ComponentPlanBase, error)
+	DetailComponent(ctx context.Context, app *model.ApplicationPlan, componentName string) (*apisv1.DetailComponentPlanResponse, error)
+	DeleteComponent(ctx context.Context, app *model.ApplicationPlan, componentName string) error
+	ListPolicies(ctx context.Context, app *model.ApplicationPlan) ([]*apisv1.PolicyBase, error)
+	AddPolicy(ctx context.Context, app *model.ApplicationPlan, policy apisv1.CreatePolicyRequest) (*apisv1.PolicyBase, error)
+	DetailPolicy(ctx context.Context, app *model.ApplicationPlan, policyName string) (*apisv1.DetailPolicyResponse, error)
+	DeletePolicy(ctx context.Context, app *model.ApplicationPlan, policyName string) error
+	UpdatePolicy(ctx context.Context, app *model.ApplicationPlan, policyName string, policy apisv1.UpdatePolicyRequest) (*apisv1.DetailPolicyResponse, error)
 }
 
 type applicationUsecaseImpl struct {
@@ -93,8 +93,8 @@ func NewApplicationUsecase(ds datastore.DataStore, workflowUsecase WorkflowUseca
 }
 
 // ListApplications list applications
-func (c *applicationUsecaseImpl) ListApplications(ctx context.Context, listOptions apisv1.ListApplicatioOptions) ([]*apisv1.ApplicationBase, error) {
-	var app = model.Application{}
+func (c *applicationUsecaseImpl) ListApplications(ctx context.Context, listOptions apisv1.ListApplicatioPlanOptions) ([]*apisv1.ApplicationPlanBase, error) {
+	var app = model.ApplicationPlan{}
 	if listOptions.Namespace != "" {
 		app.Namespace = listOptions.Namespace
 	}
@@ -102,9 +102,9 @@ func (c *applicationUsecaseImpl) ListApplications(ctx context.Context, listOptio
 	if err != nil {
 		return nil, err
 	}
-	var list []*apisv1.ApplicationBase
+	var list []*apisv1.ApplicationPlanBase
 	for _, entity := range entitys {
-		appBase := c.converAppModelToBase(ctx, entity.(*model.Application))
+		appBase := c.converAppModelToBase(ctx, entity.(*model.ApplicationPlan))
 		if listOptions.Query != "" &&
 			!(strings.Contains(appBase.Alias, listOptions.Query) ||
 				strings.Contains(appBase.Name, listOptions.Query) ||
@@ -120,8 +120,8 @@ func (c *applicationUsecaseImpl) ListApplications(ctx context.Context, listOptio
 }
 
 // GetApplication get application model
-func (c *applicationUsecaseImpl) GetApplication(ctx context.Context, appName string) (*model.Application, error) {
-	var app = model.Application{
+func (c *applicationUsecaseImpl) GetApplication(ctx context.Context, appName string) (*model.ApplicationPlan, error) {
+	var app = model.ApplicationPlan{
 		Name: appName,
 	}
 	if err := c.ds.Get(ctx, &app); err != nil {
@@ -131,7 +131,7 @@ func (c *applicationUsecaseImpl) GetApplication(ctx context.Context, appName str
 }
 
 // DetailApplication detail application info
-func (c *applicationUsecaseImpl) DetailApplication(ctx context.Context, app *model.Application) (*apisv1.DetailApplicationResponse, error) {
+func (c *applicationUsecaseImpl) DetailApplication(ctx context.Context, app *model.ApplicationPlan) (*apisv1.DetailApplicationPlanResponse, error) {
 	base := c.converAppModelToBase(ctx, app)
 	policys, err := c.queryApplicationPolicys(ctx, app)
 	if err != nil {
@@ -145,9 +145,9 @@ func (c *applicationUsecaseImpl) DetailApplication(ctx context.Context, app *mod
 	for _, p := range policys {
 		policyNames = append(policyNames, p.Name)
 	}
-	var detail = &apisv1.DetailApplicationResponse{
-		ApplicationBase: *base,
-		Policies:        policyNames,
+	var detail = &apisv1.DetailApplicationPlanResponse{
+		ApplicationPlanBase: *base,
+		Policies:            policyNames,
 		ResourceInfo: apisv1.ApplicationResourceInfo{
 			ComponentNum: len(components),
 		},
@@ -157,14 +157,14 @@ func (c *applicationUsecaseImpl) DetailApplication(ctx context.Context, app *mod
 }
 
 // PublishApplicationTemplate publish app template
-func (c *applicationUsecaseImpl) PublishApplicationTemplate(ctx context.Context, app *model.Application) (*apisv1.ApplicationTemplateBase, error) {
+func (c *applicationUsecaseImpl) PublishApplicationTemplate(ctx context.Context, app *model.ApplicationPlan) (*apisv1.ApplicationTemplateBase, error) {
 	//TODO:
 	return nil, nil
 }
 
 // CreateApplication create application
-func (c *applicationUsecaseImpl) CreateApplication(ctx context.Context, req apisv1.CreateApplicationRequest) (*apisv1.ApplicationBase, error) {
-	application := model.Application{
+func (c *applicationUsecaseImpl) CreateApplication(ctx context.Context, req apisv1.CreateApplicationPlanRequest) (*apisv1.ApplicationPlanBase, error) {
+	application := model.ApplicationPlan{
 		Name:        req.Name,
 		Alias:       req.Alias,
 		Description: req.Description,
@@ -222,7 +222,7 @@ func (c *applicationUsecaseImpl) CreateApplication(ctx context.Context, req apis
 					Outputs:    step.Outputs,
 				})
 			}
-			_, err := c.workflowUsecase.CreateWorkflow(ctx, &application, apisv1.CreateWorkflowRequest{
+			_, err := c.workflowUsecase.CreateWorkflow(ctx, &application, apisv1.CreateWorkflowPlanRequest{
 				AppName:     application.PrimaryKey(),
 				Name:        application.Name,
 				Description: "Created automatically.",
@@ -240,7 +240,7 @@ func (c *applicationUsecaseImpl) CreateApplication(ctx context.Context, req apis
 
 	// build-in create env binding policy
 	if len(req.EnvBind) > 0 {
-		policy := model.ApplicationPolicy{
+		policy := model.ApplicationPolicyPlan{
 			AppPrimaryKey: application.PrimaryKey(),
 			Name:          "env-binds",
 			Description:   "build-in create",
@@ -297,18 +297,18 @@ func (c *applicationUsecaseImpl) CreateApplication(ctx context.Context, req apis
 	return base, nil
 }
 
-func (c *applicationUsecaseImpl) saveApplicationComponent(ctx context.Context, app *model.Application, components []common.ApplicationComponent) error {
+func (c *applicationUsecaseImpl) saveApplicationComponent(ctx context.Context, app *model.ApplicationPlan, components []common.ApplicationComponent) error {
 	var componentModels []datastore.Entity
 	for _, component := range components {
 		// TODO: Check whether the component type is supported.
-		var traits []model.ApplicationTrait
+		var traits []model.ApplicationTraitPlan
 		for _, trait := range component.Traits {
 			properties, err := model.NewJSONStruct(trait.Properties)
 			if err != nil {
 				log.Logger.Errorf("parse trait properties failire %w", err)
 				return bcode.ErrInvalidProperties
 			}
-			traits = append(traits, model.ApplicationTrait{
+			traits = append(traits, model.ApplicationTraitPlan{
 				Type:       trait.Type,
 				Properties: properties,
 			})
@@ -318,7 +318,7 @@ func (c *applicationUsecaseImpl) saveApplicationComponent(ctx context.Context, a
 			log.Logger.Errorf("parse component properties failire %w", err)
 			return bcode.ErrInvalidProperties
 		}
-		componentModel := model.ApplicationComponent{
+		componentModel := model.ApplicationComponentPlan{
 			AppPrimaryKey:    app.PrimaryKey(),
 			Name:             component.Name,
 			Type:             component.Type,
@@ -336,18 +336,18 @@ func (c *applicationUsecaseImpl) saveApplicationComponent(ctx context.Context, a
 	return c.ds.BatchAdd(ctx, componentModels)
 }
 
-func (c *applicationUsecaseImpl) ListComponents(ctx context.Context, app *model.Application) ([]*apisv1.ComponentBase, error) {
-	var component = model.ApplicationComponent{
+func (c *applicationUsecaseImpl) ListComponents(ctx context.Context, app *model.ApplicationPlan) ([]*apisv1.ComponentPlanBase, error) {
+	var component = model.ApplicationComponentPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 	}
 	components, err := c.ds.List(ctx, &component, &datastore.ListOptions{})
 	if err != nil {
 		return nil, err
 	}
-	var list []*apisv1.ComponentBase
+	var list []*apisv1.ComponentPlanBase
 	for _, component := range components {
 		log.Logger.Infof("component name %s", component.PrimaryKey())
-		pm := component.(*model.ApplicationComponent)
+		pm := component.(*model.ApplicationComponentPlan)
 		list = append(list, c.converComponentModelToBase(pm))
 	}
 	return list, nil
@@ -355,8 +355,8 @@ func (c *applicationUsecaseImpl) ListComponents(ctx context.Context, app *model.
 
 // DetailComponent detail app component
 // TODO: Add status data about the component.
-func (c *applicationUsecaseImpl) DetailComponent(ctx context.Context, app *model.Application, policyName string) (*apisv1.DetailComponentResponse, error) {
-	var component = model.ApplicationComponent{
+func (c *applicationUsecaseImpl) DetailComponent(ctx context.Context, app *model.ApplicationPlan, policyName string) (*apisv1.DetailComponentPlanResponse, error) {
+	var component = model.ApplicationComponentPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 		Name:          policyName,
 	}
@@ -364,13 +364,13 @@ func (c *applicationUsecaseImpl) DetailComponent(ctx context.Context, app *model
 	if err != nil {
 		return nil, err
 	}
-	return &apisv1.DetailComponentResponse{
-		ApplicationComponent: component,
+	return &apisv1.DetailComponentPlanResponse{
+		ApplicationComponentPlan: component,
 	}, nil
 }
 
-func (c *applicationUsecaseImpl) converComponentModelToBase(m *model.ApplicationComponent) *apisv1.ComponentBase {
-	return &apisv1.ComponentBase{
+func (c *applicationUsecaseImpl) converComponentModelToBase(m *model.ApplicationComponentPlan) *apisv1.ComponentPlanBase {
+	return &apisv1.ComponentPlanBase{
 		Name:          m.Name,
 		Alias:         m.Alias,
 		Description:   m.Description,
@@ -385,7 +385,7 @@ func (c *applicationUsecaseImpl) converComponentModelToBase(m *model.Application
 }
 
 // ListPolicies list application policies
-func (c *applicationUsecaseImpl) ListPolicies(ctx context.Context, app *model.Application) ([]*apisv1.PolicyBase, error) {
+func (c *applicationUsecaseImpl) ListPolicies(ctx context.Context, app *model.ApplicationPlan) ([]*apisv1.PolicyBase, error) {
 	policies, err := c.queryApplicationPolicys(ctx, app)
 	if err != nil {
 		return nil, err
@@ -397,7 +397,7 @@ func (c *applicationUsecaseImpl) ListPolicies(ctx context.Context, app *model.Ap
 	return list, nil
 }
 
-func (c *applicationUsecaseImpl) converPolicyModelToBase(policy *model.ApplicationPolicy) *apisv1.PolicyBase {
+func (c *applicationUsecaseImpl) converPolicyModelToBase(policy *model.ApplicationPolicyPlan) *apisv1.PolicyBase {
 	pb := &apisv1.PolicyBase{
 		Name:        policy.Name,
 		Type:        policy.Type,
@@ -410,7 +410,7 @@ func (c *applicationUsecaseImpl) converPolicyModelToBase(policy *model.Applicati
 	return pb
 }
 
-func (c *applicationUsecaseImpl) saveApplicationPolicy(ctx context.Context, app *model.Application, policys []v1beta1.AppPolicy) error {
+func (c *applicationUsecaseImpl) saveApplicationPolicy(ctx context.Context, app *model.ApplicationPlan, policys []v1beta1.AppPolicy) error {
 	var policyModels []datastore.Entity
 	for _, policy := range policys {
 		properties, err := model.NewJSONStruct(policy.Properties)
@@ -418,7 +418,7 @@ func (c *applicationUsecaseImpl) saveApplicationPolicy(ctx context.Context, app
 			log.Logger.Errorf("parse trait properties failire %w", err)
 			return bcode.ErrInvalidProperties
 		}
-		policyModels = append(policyModels, &model.ApplicationPolicy{
+		policyModels = append(policyModels, &model.ApplicationPolicyPlan{
 			AppPrimaryKey: app.PrimaryKey(),
 			Name:          policy.Name,
 			Type:          policy.Type,
@@ -428,8 +428,8 @@ func (c *applicationUsecaseImpl) saveApplicationPolicy(ctx context.Context, app
 	return c.ds.BatchAdd(ctx, policyModels)
 }
 
-func (c *applicationUsecaseImpl) queryApplicationPolicys(ctx context.Context, app *model.Application) (list []*model.ApplicationPolicy, err error) {
-	var policy = model.ApplicationPolicy{
+func (c *applicationUsecaseImpl) queryApplicationPolicys(ctx context.Context, app *model.ApplicationPlan) (list []*model.ApplicationPolicyPlan, err error) {
+	var policy = model.ApplicationPolicyPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 	}
 	policys, err := c.ds.List(ctx, &policy, &datastore.ListOptions{})
@@ -437,7 +437,7 @@ func (c *applicationUsecaseImpl) queryApplicationPolicys(ctx context.Context, ap
 		return nil, err
 	}
 	for _, policy := range policys {
-		pm := policy.(*model.ApplicationPolicy)
+		pm := policy.(*model.ApplicationPolicyPlan)
 		list = append(list, pm)
 	}
 	return
@@ -445,8 +445,8 @@ func (c *applicationUsecaseImpl) queryApplicationPolicys(ctx context.Context, ap
 
 // DetailPolicy detail app policy
 // TODO: Add status data about the policy.
-func (c *applicationUsecaseImpl) DetailPolicy(ctx context.Context, app *model.Application, policyName string) (*apisv1.DetailPolicyResponse, error) {
-	var policy = model.ApplicationPolicy{
+func (c *applicationUsecaseImpl) DetailPolicy(ctx context.Context, app *model.ApplicationPlan, policyName string) (*apisv1.DetailPolicyResponse, error) {
+	var policy = model.ApplicationPolicyPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 		Name:          policyName,
 	}
@@ -462,7 +462,7 @@ func (c *applicationUsecaseImpl) DetailPolicy(ctx context.Context, app *model.Ap
 // Deploy deploy app to cluster
 // means to render oam application config and apply to cluster.
 // An event record is generated for each deploy.
-func (c *applicationUsecaseImpl) Deploy(ctx context.Context, app *model.Application, req apisv1.ApplicationDeployRequest) (*apisv1.ApplicationDeployResponse, error) {
+func (c *applicationUsecaseImpl) Deploy(ctx context.Context, app *model.ApplicationPlan, req apisv1.ApplicationDeployRequest) (*apisv1.ApplicationDeployResponse, error) {
 	// step1: Render oam application
 	version := utils.GenerateVersion("")
 	oamApp, err := c.renderOAMApplication(ctx, app, req.WorkflowName, version)
@@ -536,7 +536,7 @@ func (c *applicationUsecaseImpl) Deploy(ctx context.Context, app *model.Applicat
 	}, nil
 }
 
-func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMoel *model.Application, reqWorkflowName, version string) (*v1beta1.Application, error) {
+func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMoel *model.ApplicationPlan, reqWorkflowName, version string) (*v1beta1.Application, error) {
 	var app = &v1beta1.Application{
 		TypeMeta: metav1.TypeMeta{
 			Kind:       "Application",
@@ -551,7 +551,7 @@ func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMo
 			},
 		},
 	}
-	var component = model.ApplicationComponent{
+	var component = model.ApplicationComponentPlan{
 		AppPrimaryKey: appMoel.PrimaryKey(),
 	}
 	components, err := c.ds.List(ctx, &component, &datastore.ListOptions{})
@@ -562,7 +562,7 @@ func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMo
 		return nil, bcode.ErrNoComponent
 	}
 
-	var policy = model.ApplicationPolicy{
+	var policy = model.ApplicationPolicyPlan{
 		AppPrimaryKey: appMoel.PrimaryKey(),
 	}
 	policies, err := c.ds.List(ctx, &policy, &datastore.ListOptions{})
@@ -571,7 +571,7 @@ func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMo
 	}
 
 	for _, entity := range components {
-		component := entity.(*model.ApplicationComponent)
+		component := entity.(*model.ApplicationComponentPlan)
 		var traits []common.ApplicationTrait
 		for _, trait := range component.Traits {
 			aTrait := common.ApplicationTrait{
@@ -595,7 +595,7 @@ func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMo
 	}
 
 	for _, entity := range policies {
-		policy := entity.(*model.ApplicationPolicy)
+		policy := entity.(*model.ApplicationPolicyPlan)
 		apolicy := v1beta1.AppPolicy{
 			Name: policy.Name,
 			Type: policy.Type,
@@ -608,7 +608,7 @@ func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMo
 
 	// Priority 1 uses the requested workflow as release plan.
 	// Priority 2 uses the default workflow as release plan.
-	var workflow *model.Workflow
+	var workflow *model.WorkflowPlan
 	if reqWorkflowName != "" {
 		workflow, err = c.workflowUsecase.GetWorkflow(ctx, reqWorkflowName)
 		if err != nil {
@@ -642,8 +642,8 @@ func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMo
 	return app, nil
 }
 
-func (c *applicationUsecaseImpl) converAppModelToBase(ctx context.Context, app *model.Application) *apisv1.ApplicationBase {
-	appBeas := &apisv1.ApplicationBase{
+func (c *applicationUsecaseImpl) converAppModelToBase(ctx context.Context, app *model.ApplicationPlan) *apisv1.ApplicationPlanBase {
+	appBeas := &apisv1.ApplicationPlanBase{
 		Name:        app.Name,
 		Alias:       app.Alias,
 		Namespace:   app.Namespace,
@@ -653,7 +653,7 @@ func (c *applicationUsecaseImpl) converAppModelToBase(ctx context.Context, app *
 		Icon:        app.Icon,
 		Labels:      app.Labels,
 	}
-	var policy = model.ApplicationPolicy{
+	var policy = model.ApplicationPolicyPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 		Type:          string(EnvBindPolicy),
 	}
@@ -662,7 +662,7 @@ func (c *applicationUsecaseImpl) converAppModelToBase(ctx context.Context, app *
 		log.Logger.Errorf("query application env binding policy failure %s", err.Error())
 	}
 	for _, policyEntity := range policys {
-		policy := policyEntity.(*model.ApplicationPolicy)
+		policy := policyEntity.(*model.ApplicationPolicyPlan)
 		if policy.Properties != nil {
 			var envBindingSpec v1alpha1.EnvBindingSpec
 			if err := json.Unmarshal([]byte(policy.Properties.JSON()), &envBindingSpec); err != nil {
@@ -691,7 +691,7 @@ func (c *applicationUsecaseImpl) converAppModelToBase(ctx context.Context, app *
 }
 
 // DeleteApplication delete application
-func (c *applicationUsecaseImpl) DeleteApplication(ctx context.Context, app *model.Application) error {
+func (c *applicationUsecaseImpl) DeleteApplication(ctx context.Context, app *model.ApplicationPlan) error {
 	// TODO: check app can be deleted
 
 	// query all components to deleted
@@ -710,14 +710,14 @@ func (c *applicationUsecaseImpl) DeleteApplication(ctx context.Context, app *mod
 	}
 
 	for _, component := range components {
-		err := c.ds.Delete(ctx, &model.ApplicationComponent{AppPrimaryKey: app.PrimaryKey(), Name: component.Name})
+		err := c.ds.Delete(ctx, &model.ApplicationComponentPlan{AppPrimaryKey: app.PrimaryKey(), Name: component.Name})
 		if err != nil && !errors.Is(err, datastore.ErrRecordNotExist) {
 			log.Logger.Errorf("delete component %s in app %s failure %s", component.Name, app.Name, err.Error())
 		}
 	}
 
 	for _, policy := range policies {
-		err := c.ds.Delete(ctx, &model.ApplicationPolicy{AppPrimaryKey: app.PrimaryKey(), Name: policy.Name})
+		err := c.ds.Delete(ctx, &model.ApplicationPolicyPlan{AppPrimaryKey: app.PrimaryKey(), Name: policy.Name})
 		if err != nil && errors.Is(err, datastore.ErrRecordNotExist) {
 			log.Logger.Errorf("delete policy %s in app %s failure %s", policy.Name, app.Name, err.Error())
 		}
@@ -726,8 +726,8 @@ func (c *applicationUsecaseImpl) DeleteApplication(ctx context.Context, app *mod
 	return c.ds.Delete(ctx, app)
 }
 
-func (c *applicationUsecaseImpl) AddComponent(ctx context.Context, app *model.Application, com apisv1.CreateComponentRequest) (*apisv1.ComponentBase, error) {
-	componentModel := model.ApplicationComponent{
+func (c *applicationUsecaseImpl) AddComponent(ctx context.Context, app *model.ApplicationPlan, com apisv1.CreateComponentPlanRequest) (*apisv1.ComponentPlanBase, error) {
+	componentModel := model.ApplicationComponentPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 		Description:   com.Description,
 		Labels:        com.Labels,
@@ -751,7 +751,7 @@ func (c *applicationUsecaseImpl) AddComponent(ctx context.Context, app *model.Ap
 		log.Logger.Warnf("add component for app %s failure %s", app.PrimaryKey(), err.Error())
 		return nil, err
 	}
-	return &apisv1.ComponentBase{
+	return &apisv1.ComponentPlanBase{
 		Name:          componentModel.Name,
 		Description:   componentModel.Description,
 		Labels:        componentModel.Labels,
@@ -764,8 +764,8 @@ func (c *applicationUsecaseImpl) AddComponent(ctx context.Context, app *model.Ap
 	}, nil
 }
 
-func (c *applicationUsecaseImpl) DeleteComponent(ctx context.Context, app *model.Application, componentName string) error {
-	var component = model.ApplicationComponent{
+func (c *applicationUsecaseImpl) DeleteComponent(ctx context.Context, app *model.ApplicationPlan, componentName string) error {
+	var component = model.ApplicationComponentPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 		Name:          componentName,
 	}
@@ -779,8 +779,8 @@ func (c *applicationUsecaseImpl) DeleteComponent(ctx context.Context, app *model
 	return nil
 }
 
-func (c *applicationUsecaseImpl) AddPolicy(ctx context.Context, app *model.Application, createpolicy apisv1.CreatePolicyRequest) (*apisv1.PolicyBase, error) {
-	policyModel := model.ApplicationPolicy{
+func (c *applicationUsecaseImpl) AddPolicy(ctx context.Context, app *model.ApplicationPlan, createpolicy apisv1.CreatePolicyRequest) (*apisv1.PolicyBase, error) {
+	policyModel := model.ApplicationPolicyPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 		Description:   createpolicy.Description,
 		// TODO: Get user information from ctx and assign a value.
@@ -811,8 +811,8 @@ func (c *applicationUsecaseImpl) AddPolicy(ctx context.Context, app *model.Appli
 	}, nil
 }
 
-func (c *applicationUsecaseImpl) DeletePolicy(ctx context.Context, app *model.Application, policyName string) error {
-	var policy = model.ApplicationPolicy{
+func (c *applicationUsecaseImpl) DeletePolicy(ctx context.Context, app *model.ApplicationPlan, policyName string) error {
+	var policy = model.ApplicationPolicyPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 		Name:          policyName,
 	}
@@ -826,8 +826,8 @@ func (c *applicationUsecaseImpl) DeletePolicy(ctx context.Context, app *model.Ap
 	return nil
 }
 
-func (c *applicationUsecaseImpl) UpdatePolicy(ctx context.Context, app *model.Application, policyName string, policyUpdate apisv1.UpdatePolicyRequest) (*apisv1.DetailPolicyResponse, error) {
-	var policy = model.ApplicationPolicy{
+func (c *applicationUsecaseImpl) UpdatePolicy(ctx context.Context, app *model.ApplicationPlan, policyName string, policyUpdate apisv1.UpdatePolicyRequest) (*apisv1.DetailPolicyResponse, error) {
+	var policy = model.ApplicationPolicyPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 		Name:          policyName,
 	}
diff --git a/pkg/apiserver/rest/usecase/cluster.go b/pkg/apiserver/rest/usecase/cluster.go
index 88439e7c..44021a87 100644
--- a/pkg/apiserver/rest/usecase/cluster.go
+++ b/pkg/apiserver/rest/usecase/cluster.go
@@ -21,10 +21,15 @@ import (
 	"fmt"
 	"io/ioutil"
 	"os"
+	"strings"
 	"time"
 
+	"github.com/oam-dev/terraform-controller/api/types"
+	"github.com/oam-dev/terraform-controller/api/v1beta1"
 	"github.com/pkg/errors"
+	kerrors "k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/api/resource"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	"github.com/oam-dev/kubevela/pkg/apiserver/clients"
@@ -37,6 +42,7 @@ import (
 	"github.com/oam-dev/kubevela/pkg/cloudprovider"
 	"github.com/oam-dev/kubevela/pkg/multicluster"
 	"github.com/oam-dev/kubevela/pkg/utils"
+	"github.com/oam-dev/kubevela/pkg/utils/util"
 )
 
 // ClusterUsecase cluster manage
@@ -49,6 +55,10 @@ type ClusterUsecase interface {
 
 	ListCloudClusters(context.Context, string, apis.AccessKeyRequest, int, int) (*apis.ListCloudClusterResponse, error)
 	ConnectCloudCluster(context.Context, string, apis.ConnectCloudClusterRequest) (*apis.ClusterBase, error)
+	CreateCloudCluster(context.Context, string, apis.CreateCloudClusterRequest) (*apis.CreateCloudClusterResponse, error)
+	GetCloudClusterCreationStatus(context.Context, string, string) (*apis.CreateCloudClusterResponse, error)
+	ListCloudClusterCreation(context.Context, string) (*apis.ListCloudClusterCreationResponse, error)
+	DeleteCloudClusterCreation(context.Context, string, string) (*apis.CreateCloudClusterResponse, error)
 }
 
 type clusterUsecaseImpl struct {
@@ -395,7 +405,7 @@ func (c *clusterUsecaseImpl) getClusterResourceInfoFromK8s(ctx context.Context,
 }
 
 func (c *clusterUsecaseImpl) ListCloudClusters(ctx context.Context, provider string, req apis.AccessKeyRequest, pageNumber int, pageSize int) (*apis.ListCloudClusterResponse, error) {
-	p, err := cloudprovider.GetClusterProvider(provider, req.AccessKeyID, req.AccessKeySecret)
+	p, err := cloudprovider.GetClusterProvider(provider, req.AccessKeyID, req.AccessKeySecret, c.k8sClient)
 	if err != nil {
 		log.Logger.Errorf("failed to get cluster provider: %s", err.Error())
 		return nil, bcode.ErrInvalidCloudClusterProvider
@@ -419,7 +429,7 @@ func (c *clusterUsecaseImpl) ListCloudClusters(ctx context.Context, provider str
 }
 
 func (c *clusterUsecaseImpl) ConnectCloudCluster(ctx context.Context, provider string, req apis.ConnectCloudClusterRequest) (*apis.ClusterBase, error) {
-	p, err := cloudprovider.GetClusterProvider(provider, req.AccessKeyID, req.AccessKeySecret)
+	p, err := cloudprovider.GetClusterProvider(provider, req.AccessKeyID, req.AccessKeySecret, c.k8sClient)
 	if err != nil {
 		log.Logger.Errorf("failed to get cluster provider: %s", err.Error())
 		return nil, bcode.ErrInvalidCloudClusterProvider
@@ -448,6 +458,91 @@ func (c *clusterUsecaseImpl) ConnectCloudCluster(ctx context.Context, provider s
 	return c.createKubeCluster(ctx, createReq, cluster)
 }
 
+func (c *clusterUsecaseImpl) CreateCloudCluster(ctx context.Context, provider string, req apis.CreateCloudClusterRequest) (*apis.CreateCloudClusterResponse, error) {
+	p, err := cloudprovider.GetClusterProvider(provider, req.AccessKeyID, req.AccessKeySecret, c.k8sClient)
+	if err != nil {
+		log.Logger.Errorf("failed to get cluster provider: %s", err.Error())
+		return nil, bcode.ErrInvalidCloudClusterProvider
+	}
+	_, err = p.CreateCloudCluster(ctx, req.Name, req.Zone, req.WorkerNumber, req.CPUCoresPerWorker, req.MemoryPerWorker)
+	if err != nil {
+		if kerrors.IsAlreadyExists(err) {
+			return nil, bcode.ErrCloudClusterAlreadyExists
+		}
+		log.Logger.Errorf("failed to bootstrap terraform configuration: %s", err.Error())
+		return nil, bcode.ErrBootstrapTerraformConfiguration
+	}
+	return c.GetCloudClusterCreationStatus(ctx, provider, req.Name)
+}
+
+func (c *clusterUsecaseImpl) getCloudClusterCreationStatus(ctx context.Context, provider string, cloudClusterName string) (*apis.CreateCloudClusterResponse, *v1beta1.Configuration, error) {
+	terraformConfigurationName := cloudprovider.GetCloudClusterFullName(provider, cloudClusterName)
+	cfg := &v1beta1.Configuration{
+		ObjectMeta: v1.ObjectMeta{
+			Name:      terraformConfigurationName,
+			Namespace: util.GetRuntimeNamespace(),
+		},
+	}
+	if err := c.k8sClient.Get(ctx, client.ObjectKeyFromObject(cfg), cfg); err != nil {
+		if kerrors.IsNotFound(err) {
+			return nil, nil, bcode.ErrTerraformConfigurationNotFound
+		}
+		return nil, nil, err
+	}
+	status := string(cfg.Status.Apply.State)
+	if status == "" {
+		status = "Initializing"
+	}
+	if cfg.DeletionTimestamp != nil {
+		status = "Deleting"
+	}
+	if status == string(types.Available) {
+		cid, ok := cfg.Status.Apply.Outputs["CLUSTER_ID"]
+		if !ok {
+			return nil, nil, bcode.ErrClusterIDNotFoundInTerraformConfiguration
+		}
+		return &apis.CreateCloudClusterResponse{
+			Status:    status,
+			ClusterID: cid.Value,
+		}, cfg, nil
+	}
+	return &apis.CreateCloudClusterResponse{Status: status}, cfg, nil
+}
+
+func (c *clusterUsecaseImpl) GetCloudClusterCreationStatus(ctx context.Context, provider string, cloudClusterName string) (*apis.CreateCloudClusterResponse, error) {
+	resp, _, err := c.getCloudClusterCreationStatus(ctx, provider, cloudClusterName)
+	return resp, err
+}
+
+func (c *clusterUsecaseImpl) ListCloudClusterCreation(ctx context.Context, provider string) (*apis.ListCloudClusterCreationResponse, error) {
+	cfgs := v1beta1.ConfigurationList{}
+	if err := c.k8sClient.List(ctx, &cfgs, client.HasLabels{cloudprovider.CloudClusterCreatorLabelKey}, client.InNamespace(util.GetRuntimeNamespace())); err != nil {
+		return nil, err
+	}
+	var creations []string
+	for _, cfg := range cfgs.Items {
+		prefix := "cloud-cluster-" + provider + "-"
+		if strings.HasPrefix(cfg.Name, prefix) {
+			creations = append(creations, strings.TrimPrefix(cfg.Name, prefix))
+		}
+	}
+	return &apis.ListCloudClusterCreationResponse{Creations: creations}, nil
+}
+
+func (c *clusterUsecaseImpl) DeleteCloudClusterCreation(ctx context.Context, provider string, cloudClusterName string) (*apis.CreateCloudClusterResponse, error) {
+	resp, cfg, err := c.getCloudClusterCreationStatus(ctx, provider, cloudClusterName)
+	if err != nil {
+		return resp, err
+	}
+	if err = c.k8sClient.Delete(ctx, cfg); err != nil {
+		if kerrors.IsNotFound(err) {
+			return resp, nil
+		}
+		return nil, err
+	}
+	return resp, err
+}
+
 func newClusterBaseFromCluster(cluster *model.Cluster) *apis.ClusterBase {
 	return &apis.ClusterBase{
 		Name:        cluster.Name,
diff --git a/pkg/apiserver/rest/usecase/definition.go b/pkg/apiserver/rest/usecase/definition.go
index 770d4b07..f24076b0 100644
--- a/pkg/apiserver/rest/usecase/definition.go
+++ b/pkg/apiserver/rest/usecase/definition.go
@@ -18,11 +18,15 @@ package usecase
 
 import (
 	"context"
+	"encoding/json"
+	"fmt"
 	"time"
 
+	v1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+	k8stypes "k8s.io/apimachinery/pkg/types"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
 	"github.com/oam-dev/kubevela/apis/types"
 	"github.com/oam-dev/kubevela/pkg/apiserver/clients"
 	"github.com/oam-dev/kubevela/pkg/apiserver/log"
@@ -32,8 +36,10 @@ import (
 
 // DefinitionUsecase definition usecase, Implement the management of ComponentDefinition、TraitDefinition and WorkflowStepDefinition.
 type DefinitionUsecase interface {
-	// ListComponentDefinitions list component definition base info
-	ListComponentDefinitions(ctx context.Context, envName string) ([]*apisv1.ComponentDefinitionBase, error)
+	// ListDefinitions list definition base info
+	ListDefinitions(ctx context.Context, envName, defType string) ([]*apisv1.DefinitionBase, error)
+	// DetailDefinition get definition detail
+	DetailDefinition(ctx context.Context, name, defType string) (*apisv1.DetailDefinitionResponse, error)
 }
 
 type definitionUsecaseImpl struct {
@@ -41,6 +47,13 @@ type definitionUsecaseImpl struct {
 	caches     map[string]*utils.MemoryCache
 }
 
+const (
+	definitionAPIVersion       = "core.oam.dev/v1beta1"
+	kindComponentDefinition    = "ComponentDefinition"
+	kindTraitDefinition        = "TraitDefinition"
+	kindWorkflowStepDefinition = "WorkflowStepDefinition"
+)
+
 // NewDefinitionUsecase new definition usecase
 func NewDefinitionUsecase() DefinitionUsecase {
 	kubecli, err := clients.GetKubeClient()
@@ -50,23 +63,68 @@ func NewDefinitionUsecase() DefinitionUsecase {
 	return &definitionUsecaseImpl{kubeClient: kubecli, caches: make(map[string]*utils.MemoryCache)}
 }
 
-func (d *definitionUsecaseImpl) ListComponentDefinitions(ctx context.Context, envName string) ([]*apisv1.ComponentDefinitionBase, error) {
-	// check cache
-	if mc := d.caches["componentDefinitions"]; mc != nil && !mc.IsExpired() {
-		return mc.GetData().([]*apisv1.ComponentDefinitionBase), nil
+func (d *definitionUsecaseImpl) ListDefinitions(ctx context.Context, envName, defType string) ([]*apisv1.DefinitionBase, error) {
+	defs := &unstructured.UnstructuredList{}
+	switch defType {
+	case "component":
+		defs.SetAPIVersion(definitionAPIVersion)
+		defs.SetKind(kindComponentDefinition)
+		return d.listDefinitions(ctx, defs, kindComponentDefinition)
+
+	case "trait":
+		defs.SetAPIVersion(definitionAPIVersion)
+		defs.SetKind(kindTraitDefinition)
+		return d.listDefinitions(ctx, defs, kindTraitDefinition)
+
+	case "workflowstep":
+		defs.SetAPIVersion(definitionAPIVersion)
+		defs.SetKind(kindWorkflowStepDefinition)
+		return d.listDefinitions(ctx, defs, kindWorkflowStepDefinition)
+
+	default:
+		return nil, fmt.Errorf("invalid definition type")
+	}
+}
+
+func (d *definitionUsecaseImpl) listDefinitions(ctx context.Context, list *unstructured.UnstructuredList, cache string) ([]*apisv1.DefinitionBase, error) {
+	if mc := d.caches[cache]; mc != nil && !mc.IsExpired() {
+		return mc.GetData().([]*apisv1.DefinitionBase), nil
 	}
-	var componentDefinitions v1beta1.ComponentDefinitionList
-	if err := d.kubeClient.List(ctx, &componentDefinitions, &client.ListOptions{}); err != nil {
+	if err := d.kubeClient.List(ctx, list, &client.ListOptions{
+		Namespace: types.DefaultKubeVelaNS,
+	}); err != nil {
 		return nil, err
 	}
-	var cdb []*apisv1.ComponentDefinitionBase
-	for _, cd := range componentDefinitions.Items {
-		cdb = append(cdb, &apisv1.ComponentDefinitionBase{
-			Name:        cd.Name,
-			Description: cd.Annotations[types.AnnDescription],
+	var defs []*apisv1.DefinitionBase
+	for _, def := range list.Items {
+		defs = append(defs, &apisv1.DefinitionBase{
+			Name:        def.GetName(),
+			Description: def.GetAnnotations()[types.AnnDescription],
 		})
 	}
-	// set cache
-	d.caches["componentDefinitions"] = utils.NewMemoryCache(cdb, time.Minute*3)
-	return cdb, nil
+	d.caches[cache] = utils.NewMemoryCache(defs, time.Minute*3)
+	return defs, nil
+}
+
+// DetailDefinition get definition detail
+func (d *definitionUsecaseImpl) DetailDefinition(ctx context.Context, name, defType string) (*apisv1.DetailDefinitionResponse, error) {
+	var cm v1.ConfigMap
+	if err := d.kubeClient.Get(ctx, k8stypes.NamespacedName{
+		Namespace: types.DefaultKubeVelaNS,
+		Name:      fmt.Sprintf("%s-schema-%s", defType, name),
+	}, &cm); err != nil {
+		return nil, err
+	}
+
+	data, ok := cm.Data["openapi-v3-json-schema"]
+	if !ok {
+		return nil, fmt.Errorf("failed to get definition schema")
+	}
+	schema := &apisv1.DefinitionSchema{}
+	if err := json.Unmarshal([]byte(data), schema); err != nil {
+		return nil, err
+	}
+	return &apisv1.DetailDefinitionResponse{
+		Schema: schema,
+	}, nil
 }
diff --git a/pkg/apiserver/rest/usecase/workflow.go b/pkg/apiserver/rest/usecase/workflow.go
index 7df6b40f..9a228bac 100644
--- a/pkg/apiserver/rest/usecase/workflow.go
+++ b/pkg/apiserver/rest/usecase/workflow.go
@@ -35,13 +35,13 @@ import (
 
 // WorkflowUsecase workflow manage api
 type WorkflowUsecase interface {
-	ListApplicationWorkflow(ctx context.Context, app *model.Application, enable *bool) ([]*apisv1.WorkflowBase, error)
-	GetWorkflow(ctx context.Context, workflowName string) (*model.Workflow, error)
-	DetailWorkflow(ctx context.Context, workflow *model.Workflow) (*apisv1.DetailWorkflowResponse, error)
-	GetApplicationDefaultWorkflow(ctx context.Context, app *model.Application) (*model.Workflow, error)
+	ListApplicationWorkflow(ctx context.Context, app *model.ApplicationPlan, enable *bool) ([]*apisv1.WorkflowPlanBase, error)
+	GetWorkflow(ctx context.Context, workflowName string) (*model.WorkflowPlan, error)
+	DetailWorkflow(ctx context.Context, workflow *model.WorkflowPlan) (*apisv1.DetailWorkflowPlanResponse, error)
+	GetApplicationDefaultWorkflow(ctx context.Context, app *model.ApplicationPlan) (*model.WorkflowPlan, error)
 	DeleteWorkflow(ctx context.Context, workflowName string) error
-	CreateWorkflow(ctx context.Context, app *model.Application, req apisv1.CreateWorkflowRequest) (*apisv1.DetailWorkflowResponse, error)
-	UpdateWorkflow(ctx context.Context, workflow *model.Workflow, req apisv1.UpdateWorkflowRequest) (*apisv1.DetailWorkflowResponse, error)
+	CreateWorkflow(ctx context.Context, app *model.ApplicationPlan, req apisv1.CreateWorkflowPlanRequest) (*apisv1.DetailWorkflowPlanResponse, error)
+	UpdateWorkflow(ctx context.Context, workflow *model.WorkflowPlan, req apisv1.UpdateWorkflowPlanRequest) (*apisv1.DetailWorkflowPlanResponse, error)
 	ListWorkflowRecords(ctx context.Context, workflowName string, page, pageSize int) (*apisv1.ListWorkflowRecordsResponse, error)
 	DetailWorkflowRecord(ctx context.Context, workflowName, recordName string) (*apisv1.DetailWorkflowRecordResponse, error)
 }
@@ -57,7 +57,7 @@ type workflowUsecaseImpl struct {
 
 // DeleteWorkflow delete application workflow
 func (w *workflowUsecaseImpl) DeleteWorkflow(ctx context.Context, workflowName string) error {
-	var workflow = &model.Workflow{
+	var workflow = &model.WorkflowPlan{
 		Name: workflowName,
 	}
 	if err := w.ds.Delete(ctx, workflow); err != nil {
@@ -69,7 +69,7 @@ func (w *workflowUsecaseImpl) DeleteWorkflow(ctx context.Context, workflowName s
 	return nil
 }
 
-func (w *workflowUsecaseImpl) CreateWorkflow(ctx context.Context, app *model.Application, req apisv1.CreateWorkflowRequest) (*apisv1.DetailWorkflowResponse, error) {
+func (w *workflowUsecaseImpl) CreateWorkflow(ctx context.Context, app *model.ApplicationPlan, req apisv1.CreateWorkflowPlanRequest) (*apisv1.DetailWorkflowPlanResponse, error) {
 	var steps []model.WorkflowStep
 	for _, step := range req.Steps {
 		properties, err := model.NewJSONStructByString(step.Properties)
@@ -86,7 +86,7 @@ func (w *workflowUsecaseImpl) CreateWorkflow(ctx context.Context, app *model.App
 		})
 	}
 	// It is allowed to set multiple workflows as default, and only one takes effect.
-	var workflow = model.Workflow{
+	var workflow = model.WorkflowPlan{
 		Steps:         steps,
 		Name:          req.Name,
 		Enable:        req.Enable,
@@ -100,7 +100,7 @@ func (w *workflowUsecaseImpl) CreateWorkflow(ctx context.Context, app *model.App
 	return w.DetailWorkflow(ctx, &workflow)
 }
 
-func (w *workflowUsecaseImpl) UpdateWorkflow(ctx context.Context, workflow *model.Workflow, req apisv1.UpdateWorkflowRequest) (*apisv1.DetailWorkflowResponse, error) {
+func (w *workflowUsecaseImpl) UpdateWorkflow(ctx context.Context, workflow *model.WorkflowPlan, req apisv1.UpdateWorkflowPlanRequest) (*apisv1.DetailWorkflowPlanResponse, error) {
 	var steps []model.WorkflowStep
 	for _, step := range req.Steps {
 		properties, err := model.NewJSONStructByString(step.Properties)
@@ -128,7 +128,7 @@ func (w *workflowUsecaseImpl) UpdateWorkflow(ctx context.Context, workflow *mode
 }
 
 // DetailWorkflow detail workflow
-func (w *workflowUsecaseImpl) DetailWorkflow(ctx context.Context, workflow *model.Workflow) (*apisv1.DetailWorkflowResponse, error) {
+func (w *workflowUsecaseImpl) DetailWorkflow(ctx context.Context, workflow *model.WorkflowPlan) (*apisv1.DetailWorkflowPlanResponse, error) {
 	var steps []apisv1.WorkflowStep
 	for _, step := range workflow.Steps {
 		apiStep := apisv1.WorkflowStep{
@@ -143,8 +143,8 @@ func (w *workflowUsecaseImpl) DetailWorkflow(ctx context.Context, workflow *mode
 		}
 		steps = append(steps, apiStep)
 	}
-	return &apisv1.DetailWorkflowResponse{
-		WorkflowBase: apisv1.WorkflowBase{
+	return &apisv1.DetailWorkflowPlanResponse{
+		WorkflowPlanBase: apisv1.WorkflowPlanBase{
 			Name:        workflow.Name,
 			Description: workflow.Description,
 			Enable:      workflow.Enable,
@@ -157,8 +157,8 @@ func (w *workflowUsecaseImpl) DetailWorkflow(ctx context.Context, workflow *mode
 }
 
 // GetWorkflow get workflow model
-func (w *workflowUsecaseImpl) GetWorkflow(ctx context.Context, workflowName string) (*model.Workflow, error) {
-	var workflow = model.Workflow{
+func (w *workflowUsecaseImpl) GetWorkflow(ctx context.Context, workflowName string) (*model.WorkflowPlan, error) {
+	var workflow = model.WorkflowPlan{
 		Name: workflowName,
 	}
 	if err := w.ds.Get(ctx, &workflow); err != nil {
@@ -168,8 +168,8 @@ func (w *workflowUsecaseImpl) GetWorkflow(ctx context.Context, workflowName stri
 }
 
 // ListApplicationWorkflow list application workflows
-func (w *workflowUsecaseImpl) ListApplicationWorkflow(ctx context.Context, app *model.Application, enable *bool) ([]*apisv1.WorkflowBase, error) {
-	var workflow = model.Workflow{
+func (w *workflowUsecaseImpl) ListApplicationWorkflow(ctx context.Context, app *model.ApplicationPlan, enable *bool) ([]*apisv1.WorkflowPlanBase, error) {
+	var workflow = model.WorkflowPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 	}
 	if enable != nil {
@@ -179,10 +179,10 @@ func (w *workflowUsecaseImpl) ListApplicationWorkflow(ctx context.Context, app *
 	if err != nil {
 		return nil, err
 	}
-	var list []*apisv1.WorkflowBase
+	var list []*apisv1.WorkflowPlanBase
 	for _, workflow := range workflows {
-		wm := workflow.(*model.Workflow)
-		list = append(list, &apisv1.WorkflowBase{
+		wm := workflow.(*model.WorkflowPlan)
+		list = append(list, &apisv1.WorkflowPlanBase{
 			Name:        wm.Name,
 			Description: wm.Description,
 			Enable:      wm.Enable,
@@ -195,8 +195,8 @@ func (w *workflowUsecaseImpl) ListApplicationWorkflow(ctx context.Context, app *
 }
 
 // GetApplicationDefaultWorkflow get application default workflow
-func (w *workflowUsecaseImpl) GetApplicationDefaultWorkflow(ctx context.Context, app *model.Application) (*model.Workflow, error) {
-	var workflow = model.Workflow{
+func (w *workflowUsecaseImpl) GetApplicationDefaultWorkflow(ctx context.Context, app *model.ApplicationPlan) (*model.WorkflowPlan, error) {
+	var workflow = model.WorkflowPlan{
 		AppPrimaryKey: app.PrimaryKey(),
 		Default:       true,
 	}
@@ -205,7 +205,7 @@ func (w *workflowUsecaseImpl) GetApplicationDefaultWorkflow(ctx context.Context,
 		return nil, err
 	}
 	if len(workflows) > 0 {
-		return workflows[0].(*model.Workflow), nil
+		return workflows[0].(*model.WorkflowPlan), nil
 	}
 	return nil, bcode.ErrWorkflowNoDefault
 }
diff --git a/pkg/apiserver/rest/utils/bcode/cluster.go b/pkg/apiserver/rest/utils/bcode/cluster.go
index 0b1a8647..5b7478cb 100644
--- a/pkg/apiserver/rest/utils/bcode/cluster.go
+++ b/pkg/apiserver/rest/utils/bcode/cluster.go
@@ -43,5 +43,17 @@ var ErrLocalClusterReserved = NewBcode(400, 40007, "local cluster is reserved")
 // ErrLocalClusterImmutable local cluster kubeConfig is immutable
 var ErrLocalClusterImmutable = NewBcode(400, 40008, "local cluster is immutable")
 
+// ErrCloudClusterAlreadyExists cloud cluster already exists
+var ErrCloudClusterAlreadyExists = NewBcode(400, 40009, "cloud cluster already exists")
+
+// ErrTerraformConfigurationNotFound cannot find terraform configuration
+var ErrTerraformConfigurationNotFound = NewBcode(404, 40010, "cannot find terraform configuration")
+
+// ErrClusterIDNotFoundInTerraformConfiguration cannot find cluster_id in terraform configuration
+var ErrClusterIDNotFoundInTerraformConfiguration = NewBcode(500, 40011, "cannot find cluster_id in terraform configuration")
+
+// ErrBootstrapTerraformConfiguration failed to bootstrap terraform configuration
+var ErrBootstrapTerraformConfiguration = NewBcode(500, 40012, "failed to bootstrap terraform configuration")
+
 // ErrInvalidAccessKeyOrSecretKey access key or secret key is invalid
 var ErrInvalidAccessKeyOrSecretKey = NewBcode(400, 40013, "access key or secret key is invalid")
diff --git a/pkg/apiserver/rest/webservice/addon_registry.go b/pkg/apiserver/rest/webservice/addon_registry.go
index d6d0eab3..209110f1 100644
--- a/pkg/apiserver/rest/webservice/addon_registry.go
+++ b/pkg/apiserver/rest/webservice/addon_registry.go
@@ -108,6 +108,11 @@ func (s *addonRegistryWebService) deleteAddonRegistry(req *restful.Request, res
 		bcode.ReturnError(req, res, err)
 		return
 	}
+	err = s.addonUsecase.DeleteAddonRegistry(req.Request.Context(), r.Name)
+	if err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
 
 	if err := res.WriteEntity(*utils.ConvertAddonRegistryModel2AddonRegistryMeta(r)); err != nil {
 		bcode.ReturnError(req, res, err)
diff --git a/pkg/apiserver/rest/webservice/application.go b/pkg/apiserver/rest/webservice/application.go
index 77d06273..b23f15da 100644
--- a/pkg/apiserver/rest/webservice/application.go
+++ b/pkg/apiserver/rest/webservice/application.go
@@ -42,7 +42,7 @@ func NewApplicationWebService(applicationUsecase usecase.ApplicationUsecase) Web
 
 func (c *applicationWebService) GetWebService() *restful.WebService {
 	ws := new(restful.WebService)
-	ws.Path(versionPrefix+"/applications").
+	ws.Path(versionPrefix+"/applicationplans").
 		Consumes(restful.MIME_XML, restful.MIME_JSON).
 		Produces(restful.MIME_JSON, restful.MIME_XML).
 		Doc("api for application manage")
@@ -55,17 +55,17 @@ func (c *applicationWebService) GetWebService() *restful.WebService {
 		Param(ws.QueryParameter("query", "Fuzzy search based on name or description").DataType("string")).
 		Param(ws.QueryParameter("namespace", "Namespace-based search").DataType("string")).
 		Param(ws.QueryParameter("cluster", "Cluster-based search").DataType("string")).
-		Returns(200, "", apis.ListApplicationResponse{}).
+		Returns(200, "", apis.ListApplicationPlanResponse{}).
 		Returns(400, "", bcode.Bcode{}).
-		Writes(apis.ListApplicationResponse{}))
+		Writes(apis.ListApplicationPlanResponse{}))
 
 	ws.Route(ws.POST("/").To(c.createApplication).
 		Doc("create one application").
 		Metadata(restfulspec.KeyOpenAPITags, tags).
-		Reads(apis.CreateApplicationRequest{}).
-		Returns(200, "", apis.ApplicationBase{}).
+		Reads(apis.CreateApplicationPlanRequest{}).
+		Returns(200, "", apis.ApplicationPlanBase{}).
 		Returns(400, "", bcode.Bcode{}).
-		Writes(apis.ApplicationBase{}))
+		Writes(apis.ApplicationPlanBase{}))
 
 	ws.Route(ws.DELETE("/{name}").To(c.deleteApplication).
 		Doc("delete one application").
@@ -81,9 +81,9 @@ func (c *applicationWebService) GetWebService() *restful.WebService {
 		Metadata(restfulspec.KeyOpenAPITags, tags).
 		Filter(c.appCheckFilter).
 		Param(ws.PathParameter("name", "identifier of the application").DataType("string")).
-		Returns(200, "", apis.DetailApplicationResponse{}).
+		Returns(200, "", apis.DetailApplicationPlanResponse{}).
 		Returns(400, "", bcode.Bcode{}).
-		Writes(apis.DetailApplicationResponse{}))
+		Writes(apis.DetailApplicationPlanResponse{}))
 
 	ws.Route(ws.POST("/{name}/template").To(c.publishApplicationTemplate).
 		Doc("create one application template").
@@ -104,34 +104,34 @@ func (c *applicationWebService) GetWebService() *restful.WebService {
 		Returns(400, "", bcode.Bcode{}).
 		Writes(apis.ApplicationDeployResponse{}))
 
-	ws.Route(ws.GET("/{name}/components").To(c.listApplicationComponents).
-		Doc("gets the component topology of the application").
+	ws.Route(ws.GET("/{name}/componentplans").To(c.listApplicationComponents).
+		Doc("gets the componentplan topology of the application").
 		Filter(c.appCheckFilter).
 		Param(ws.PathParameter("name", "identifier of the application").DataType("string")).
-		Param(ws.PathParameter("cluster", "list components that deployed in define cluster").DataType("string")).
+		Param(ws.QueryParameter("envName", "list components that deployed in define env").DataType("string")).
 		Metadata(restfulspec.KeyOpenAPITags, tags).
-		Returns(200, "", apis.ComponentListResponse{}).
+		Returns(200, "", apis.ComponentPlanListResponse{}).
 		Returns(400, "", bcode.Bcode{}).
-		Writes(apis.ComponentListResponse{}))
+		Writes(apis.ComponentPlanListResponse{}))
 
-	ws.Route(ws.POST("/{name}/components").To(c.createComponent).
-		Doc("create component for application").
+	ws.Route(ws.POST("/{name}/componentplans").To(c.createComponent).
+		Doc("create component plan for application plan").
 		Filter(c.appCheckFilter).
 		Param(ws.PathParameter("name", "identifier of the application").DataType("string")).
 		Metadata(restfulspec.KeyOpenAPITags, tags).
-		Reads(apis.CreateComponentRequest{}).
-		Returns(200, "", apis.ComponentBase{}).
+		Reads(apis.CreateComponentPlanRequest{}).
+		Returns(200, "", apis.ComponentPlanBase{}).
 		Returns(400, "", bcode.Bcode{}).
-		Writes(apis.ComponentBase{}))
+		Writes(apis.ComponentPlanBase{}))
 
-	ws.Route(ws.GET("/{name}/components/{componentName}").To(c.detailComponent).
-		Doc("detail component for application").
+	ws.Route(ws.GET("/{name}/componentplans/{componentName}").To(c.detailComponent).
+		Doc("detail component plan for application plan").
 		Filter(c.appCheckFilter).
 		Param(ws.PathParameter("name", "identifier of the application").DataType("string")).
 		Metadata(restfulspec.KeyOpenAPITags, tags).
-		Returns(200, "", apis.DetailComponentResponse{}).
+		Returns(200, "", apis.DetailComponentPlanResponse{}).
 		Returns(400, "", bcode.Bcode{}).
-		Writes(apis.DetailComponentResponse{}))
+		Writes(apis.DetailComponentPlanResponse{}))
 
 	ws.Route(ws.GET("/{name}/policies").To(c.listApplicationPolicies).
 		Doc("list policy for application").
@@ -197,7 +197,7 @@ func (c *applicationWebService) appCheckFilter(req *restful.Request, res *restfu
 
 func (c *applicationWebService) createApplication(req *restful.Request, res *restful.Response) {
 	// Verify the validity of parameters
-	var createReq apis.CreateApplicationRequest
+	var createReq apis.CreateApplicationPlanRequest
 	if err := req.ReadEntity(&createReq); err != nil {
 		bcode.ReturnError(req, res, err)
 		return
@@ -222,7 +222,7 @@ func (c *applicationWebService) createApplication(req *restful.Request, res *res
 }
 
 func (c *applicationWebService) listApplications(req *restful.Request, res *restful.Response) {
-	apps, err := c.applicationUsecase.ListApplications(req.Request.Context(), apis.ListApplicatioOptions{
+	apps, err := c.applicationUsecase.ListApplications(req.Request.Context(), apis.ListApplicatioPlanOptions{
 		Namespace: req.QueryParameter("namespace"),
 		Cluster:   req.QueryParameter("cluster"),
 		Query:     req.QueryParameter("query"),
@@ -231,14 +231,14 @@ func (c *applicationWebService) listApplications(req *restful.Request, res *rest
 		bcode.ReturnError(req, res, err)
 		return
 	}
-	if err := res.WriteEntity(apis.ListApplicationResponse{Applications: apps}); err != nil {
+	if err := res.WriteEntity(apis.ListApplicationPlanResponse{ApplicationPlans: apps}); err != nil {
 		bcode.ReturnError(req, res, err)
 		return
 	}
 }
 
 func (c *applicationWebService) detailApplication(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	detail, err := c.applicationUsecase.DetailApplication(req.Request.Context(), app)
 	if err != nil {
 		bcode.ReturnError(req, res, err)
@@ -251,7 +251,7 @@ func (c *applicationWebService) detailApplication(req *restful.Request, res *res
 }
 
 func (c *applicationWebService) publishApplicationTemplate(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	base, err := c.applicationUsecase.PublishApplicationTemplate(req.Request.Context(), app)
 	if err != nil {
 		bcode.ReturnError(req, res, err)
@@ -265,7 +265,7 @@ func (c *applicationWebService) publishApplicationTemplate(req *restful.Request,
 
 // deployApplication TODO: return event model
 func (c *applicationWebService) deployApplication(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	// Verify the validity of parameters
 	var createReq apis.ApplicationDeployRequest
 	if err := req.ReadEntity(&createReq); err != nil {
@@ -288,7 +288,7 @@ func (c *applicationWebService) deployApplication(req *restful.Request, res *res
 }
 
 func (c *applicationWebService) deleteApplication(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	err := c.applicationUsecase.DeleteApplication(req.Request.Context(), app)
 	if err != nil {
 		bcode.ReturnError(req, res, err)
@@ -301,22 +301,22 @@ func (c *applicationWebService) deleteApplication(req *restful.Request, res *res
 }
 
 func (c *applicationWebService) listApplicationComponents(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	components, err := c.applicationUsecase.ListComponents(req.Request.Context(), app)
 	if err != nil {
 		bcode.ReturnError(req, res, err)
 		return
 	}
-	if err := res.WriteEntity(apis.ComponentListResponse{Components: components}); err != nil {
+	if err := res.WriteEntity(apis.ComponentPlanListResponse{ComponentPlans: components}); err != nil {
 		bcode.ReturnError(req, res, err)
 		return
 	}
 }
 
 func (c *applicationWebService) createComponent(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	// Verify the validity of parameters
-	var createReq apis.CreateComponentRequest
+	var createReq apis.CreateComponentPlanRequest
 	if err := req.ReadEntity(&createReq); err != nil {
 		bcode.ReturnError(req, res, err)
 		return
@@ -337,7 +337,7 @@ func (c *applicationWebService) createComponent(req *restful.Request, res *restf
 }
 
 func (c *applicationWebService) detailComponent(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	detail, err := c.applicationUsecase.DetailComponent(req.Request.Context(), app, req.PathParameter("componentName"))
 	if err != nil {
 		bcode.ReturnError(req, res, err)
@@ -350,7 +350,7 @@ func (c *applicationWebService) detailComponent(req *restful.Request, res *restf
 }
 
 func (c *applicationWebService) createApplicationPolicy(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	// Verify the validity of parameters
 	var createReq apis.CreatePolicyRequest
 	if err := req.ReadEntity(&createReq); err != nil {
@@ -373,7 +373,7 @@ func (c *applicationWebService) createApplicationPolicy(req *restful.Request, re
 }
 
 func (c *applicationWebService) listApplicationPolicies(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	policies, err := c.applicationUsecase.ListPolicies(req.Request.Context(), app)
 	if err != nil {
 		bcode.ReturnError(req, res, err)
@@ -386,7 +386,7 @@ func (c *applicationWebService) listApplicationPolicies(req *restful.Request, re
 }
 
 func (c *applicationWebService) detailApplicationPolicy(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	detail, err := c.applicationUsecase.DetailPolicy(req.Request.Context(), app, req.PathParameter("policyName"))
 	if err != nil {
 		bcode.ReturnError(req, res, err)
@@ -399,7 +399,7 @@ func (c *applicationWebService) detailApplicationPolicy(req *restful.Request, re
 }
 
 func (c *applicationWebService) deleteApplicationPolicy(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	err := c.applicationUsecase.DeletePolicy(req.Request.Context(), app, req.PathParameter("policyName"))
 	if err != nil {
 		bcode.ReturnError(req, res, err)
@@ -412,7 +412,7 @@ func (c *applicationWebService) deleteApplicationPolicy(req *restful.Request, re
 }
 
 func (c *applicationWebService) updateApplicationPolicy(req *restful.Request, res *restful.Response) {
-	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.Application)
+	app := req.Request.Context().Value(&apis.CtxKeyApplication).(*model.ApplicationPlan)
 	// Verify the validity of parameters
 	var updateReq apis.UpdatePolicyRequest
 	if err := req.ReadEntity(&updateReq); err != nil {
diff --git a/pkg/apiserver/rest/webservice/cluster.go b/pkg/apiserver/rest/webservice/cluster.go
index fbb1045d..b3f2e264 100644
--- a/pkg/apiserver/rest/webservice/cluster.go
+++ b/pkg/apiserver/rest/webservice/cluster.go
@@ -109,6 +109,41 @@ func (c *ClusterWebService) GetWebService() *restful.WebService {
 		Returns(400, "", bcode.Bcode{}).
 		Writes(apis.ClusterBase{}))
 
+	ws.Route(ws.POST("/cloud-clusters/{provider}/create").To(c.createCloudCluster).
+		Doc("create cloud cluster").
+		Metadata(restfulspec.KeyOpenAPITags, tags).
+		Param(ws.PathParameter("provider", "identifier of the cloud provider").DataType("string")).
+		Reads(&apis.CreateCloudClusterRequest{}).
+		Returns(200, "", apis.CreateCloudClusterResponse{}).
+		Returns(400, "", bcode.Bcode{}).
+		Writes(apis.CreateCloudClusterResponse{}))
+
+	ws.Route(ws.GET("/cloud-clusters/{provider}/creation/{cloudClusterName}").To(c.getCloudClusterCreationStatus).
+		Doc("check cloud cluster create status").
+		Metadata(restfulspec.KeyOpenAPITags, tags).
+		Param(ws.PathParameter("provider", "identifier of the cloud provider").DataType("string")).
+		Param(ws.PathParameter("cloudClusterName", "identifier for cloud cluster which is creating").DataType("string")).
+		Returns(200, "", apis.CreateCloudClusterResponse{}).
+		Returns(400, "", bcode.Bcode{}).
+		Writes(apis.CreateCloudClusterResponse{}))
+
+	ws.Route(ws.GET("/cloud-clusters/{provider}/creation").To(c.listCloudClusterCreation).
+		Doc("list cloud cluster creation").
+		Metadata(restfulspec.KeyOpenAPITags, tags).
+		Param(ws.PathParameter("provider", "identifier of the cloud provider").DataType("string")).
+		Returns(200, "", apis.ListCloudClusterCreationResponse{}).
+		Returns(400, "", bcode.Bcode{}).
+		Writes(apis.ListCloudClusterCreationResponse{}))
+
+	ws.Route(ws.DELETE("/cloud-clusters/{provider}/creation/{cloudClusterName}").To(c.deleteCloudClusterCreation).
+		Doc("delete cloud cluster creation").
+		Metadata(restfulspec.KeyOpenAPITags, tags).
+		Param(ws.PathParameter("provider", "identifier of the cloud provider").DataType("string")).
+		Param(ws.PathParameter("cloudClusterName", "identifier for cloud cluster which is creating").DataType("string")).
+		Returns(200, "", apis.CreateCloudClusterResponse{}).
+		Returns(400, "", bcode.Bcode{}).
+		Writes(apis.CreateCloudClusterResponse{}))
+
 	return ws
 }
 
@@ -280,3 +315,84 @@ func (c *ClusterWebService) connectCloudCluster(req *restful.Request, res *restf
 		return
 	}
 }
+
+func (c *ClusterWebService) createCloudCluster(req *restful.Request, res *restful.Response) {
+	provider := req.PathParameter("provider")
+
+	// Verify the validity of parameters
+	var createReq apis.CreateCloudClusterRequest
+	if err := req.ReadEntity(&createReq); err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+	if err := validate.Struct(&createReq); err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+
+	// Call the usecase layer code
+	resp, err := c.clusterUsecase.CreateCloudCluster(req.Request.Context(), provider, createReq)
+	if err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+
+	// Write back response data
+	if err := res.WriteEntity(resp); err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+}
+
+func (c *ClusterWebService) getCloudClusterCreationStatus(req *restful.Request, res *restful.Response) {
+	provider := req.PathParameter("provider")
+	cloudClusterName := req.PathParameter("cloudClusterName")
+
+	// Call the usecase layer code
+	resp, err := c.clusterUsecase.GetCloudClusterCreationStatus(req.Request.Context(), provider, cloudClusterName)
+	if err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+
+	// Write back response data
+	if err := res.WriteEntity(resp); err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+}
+
+func (c *ClusterWebService) listCloudClusterCreation(req *restful.Request, res *restful.Response) {
+	provider := req.PathParameter("provider")
+
+	// Call the usecase layer code
+	resp, err := c.clusterUsecase.ListCloudClusterCreation(req.Request.Context(), provider)
+	if err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+
+	// Write back response data
+	if err := res.WriteEntity(resp); err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+}
+
+func (c *ClusterWebService) deleteCloudClusterCreation(req *restful.Request, res *restful.Response) {
+	provider := req.PathParameter("provider")
+	cloudClusterName := req.PathParameter("cloudClusterName")
+
+	// Call the usecase layer code
+	resp, err := c.clusterUsecase.DeleteCloudClusterCreation(req.Request.Context(), provider, cloudClusterName)
+	if err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+
+	// Write back response data
+	if err := res.WriteEntity(resp); err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+}
diff --git a/pkg/apiserver/rest/webservice/component_definition.go b/pkg/apiserver/rest/webservice/component_definition.go
deleted file mode 100644
index b5d99d35..00000000
--- a/pkg/apiserver/rest/webservice/component_definition.go
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-Copyright 2021 The KubeVela 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 webservice
-
-import (
-	restfulspec "github.com/emicklei/go-restful-openapi/v2"
-	restful "github.com/emicklei/go-restful/v3"
-
-	apis "github.com/oam-dev/kubevela/pkg/apiserver/rest/apis/v1"
-	"github.com/oam-dev/kubevela/pkg/apiserver/rest/usecase"
-	"github.com/oam-dev/kubevela/pkg/apiserver/rest/utils/bcode"
-)
-
-type componentDefinitionWebservice struct {
-	definitionUsecase usecase.DefinitionUsecase
-}
-
-func (c *componentDefinitionWebservice) GetWebService() *restful.WebService {
-	ws := new(restful.WebService)
-	ws.Path(versionPrefix+"/componentdefinitions").
-		Consumes(restful.MIME_XML, restful.MIME_JSON).
-		Produces(restful.MIME_JSON, restful.MIME_XML).
-		Doc("api for componentdefinition manage")
-
-	tags := []string{"componentdefinition"}
-
-	ws.Route(ws.GET("/").To(c.listComponentDefinition).
-		Doc("list all componentdefinition").
-		Metadata(restfulspec.KeyOpenAPITags, tags).
-		Param(ws.QueryParameter("envName", "if specified, query the componentdefinition supported by the env.").DataType("string")).
-		Returns(200, "", apis.ListComponentDefinitionResponse{}).
-		Writes(apis.ListComponentDefinitionResponse{}))
-	return ws
-}
-
-// NewComponentDefinitionWebservice new componentdefinition webservice
-func NewComponentDefinitionWebservice(du usecase.DefinitionUsecase) WebService {
-	return &componentDefinitionWebservice{
-		definitionUsecase: du,
-	}
-}
-
-func (c *componentDefinitionWebservice) listComponentDefinition(req *restful.Request, res *restful.Response) {
-	componentDefinitions, err := c.definitionUsecase.ListComponentDefinitions(req.Request.Context(), req.QueryParameter("envName"))
-	if err != nil {
-		bcode.ReturnError(req, res, err)
-		return
-	}
-	if err := res.WriteEntity(apis.ListComponentDefinitionResponse{ComponentDefinitions: componentDefinitions}); err != nil {
-		bcode.ReturnError(req, res, err)
-		return
-	}
-}
diff --git a/pkg/apiserver/rest/webservice/definition.go b/pkg/apiserver/rest/webservice/definition.go
new file mode 100644
index 00000000..8eee097f
--- /dev/null
+++ b/pkg/apiserver/rest/webservice/definition.go
@@ -0,0 +1,88 @@
+/*
+Copyright 2021 The KubeVela 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 webservice
+
+import (
+	restfulspec "github.com/emicklei/go-restful-openapi/v2"
+	restful "github.com/emicklei/go-restful/v3"
+
+	apis "github.com/oam-dev/kubevela/pkg/apiserver/rest/apis/v1"
+	"github.com/oam-dev/kubevela/pkg/apiserver/rest/usecase"
+	"github.com/oam-dev/kubevela/pkg/apiserver/rest/utils/bcode"
+)
+
+type definitionWebservice struct {
+	definitionUsecase usecase.DefinitionUsecase
+}
+
+func (d *definitionWebservice) GetWebService() *restful.WebService {
+	ws := new(restful.WebService)
+	ws.Path(versionPrefix+"/definitions").
+		Consumes(restful.MIME_XML, restful.MIME_JSON).
+		Produces(restful.MIME_JSON, restful.MIME_XML).
+		Doc("api for definition manage")
+
+	tags := []string{"definition"}
+
+	ws.Route(ws.GET("/").To(d.listDefinitions).
+		Doc("list all definitions").
+		Metadata(restfulspec.KeyOpenAPITags, tags).
+		Param(ws.QueryParameter("type", "query the definition type").DataType("string")).
+		Param(ws.QueryParameter("envName", "if specified, query the definition supported by the env.").DataType("string")).
+		Returns(200, "", apis.ListDefinitionResponse{}).
+		Writes(apis.ListDefinitionResponse{}).Do(returns200, returns500))
+
+	ws.Route(ws.GET("/{name}").To(d.detailDefinition).
+		Doc("detail definition").
+		Param(ws.PathParameter("name", "identifier of the definition").DataType("string")).
+		Param(ws.QueryParameter("type", "query the definition type").DataType("string")).
+		Metadata(restfulspec.KeyOpenAPITags, tags).
+		Returns(200, "create success", apis.DetailDefinitionResponse{}).
+		Writes(apis.DetailDefinitionResponse{}).Do(returns200, returns500))
+	return ws
+}
+
+// NewDefinitionWebservice new definition webservice
+func NewDefinitionWebservice(du usecase.DefinitionUsecase) WebService {
+	return &definitionWebservice{
+		definitionUsecase: du,
+	}
+}
+
+func (d *definitionWebservice) listDefinitions(req *restful.Request, res *restful.Response) {
+	definitions, err := d.definitionUsecase.ListDefinitions(req.Request.Context(), req.QueryParameter("envName"), req.QueryParameter("type"))
+	if err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+	if err := res.WriteEntity(apis.ListDefinitionResponse{Definitions: definitions}); err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+}
+
+func (d *definitionWebservice) detailDefinition(req *restful.Request, res *restful.Response) {
+	definition, err := d.definitionUsecase.DetailDefinition(req.Request.Context(), req.PathParameter("name"), req.QueryParameter("type"))
+	if err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+	if err := res.WriteEntity(definition); err != nil {
+		bcode.ReturnError(req, res, err)
+		return
+	}
+}
diff --git a/pkg/apiserver/rest/webservice/webservice.go b/pkg/apiserver/rest/webservice/webservice.go
index 3effd3ea..6915f595 100644
--- a/pkg/apiserver/rest/webservice/webservice.go
+++ b/pkg/apiserver/rest/webservice/webservice.go
@@ -70,7 +70,7 @@ func Init(ctx context.Context, ds datastore.DataStore) {
 	RegistWebService(NewClusterWebService(clusterUsecase))
 	RegistWebService(NewApplicationWebService(applicationUsecase))
 	RegistWebService(NewNamespaceWebService(namespaceUsecase))
-	RegistWebService(NewComponentDefinitionWebservice(definitionUsecase))
+	RegistWebService(NewDefinitionWebservice(definitionUsecase))
 	RegistWebService(NewAddonWebService(addonUsecase))
 	RegistWebService(NewAddonRegistryWebService(addonUsecase))
 	RegistWebService(NewOAMApplication(oamApplicationUsecase))
diff --git a/pkg/apiserver/rest/webservice/workflow.go b/pkg/apiserver/rest/webservice/workflow.go
index 1f9e4718..30bcedd2 100644
--- a/pkg/apiserver/rest/webservice/workflow.go
+++ b/pkg/apiserver/rest/webservice/workflow.go
@@ -46,7 +46,7 @@ type workflowWebService struct {
 
 func (w *workflowWebService) GetWebService() *restful.WebService {
 	ws := new(restful.WebService)
-	ws.Path(versionPrefix+"/workflows").
+	ws.Path(versionPrefix+"/workflowplans").
 		Consumes(restful.MIME_XML, restful.MIME_JSON).
 		Produces(restful.MIME_JSON, restful.MIME_XML).
 		Doc("api for cluster manage")
@@ -58,31 +58,31 @@ func (w *workflowWebService) GetWebService() *restful.WebService {
 		Param(ws.QueryParameter("appName", "identifier of the application.").DataType("string")).
 		Param(ws.QueryParameter("enable", "query based on enable status").DataType("boolean")).
 		Metadata(restfulspec.KeyOpenAPITags, tags).
-		Writes(apis.ListWorkflowResponse{}).Do(returns200, returns500))
+		Writes(apis.ListWorkflowPlanResponse{}).Do(returns200, returns500))
 
 	ws.Route(ws.POST("/").To(w.createApplicationWorkflow).
 		Doc("create application workflow").
 		Metadata(restfulspec.KeyOpenAPITags, tags).
-		Reads(apis.CreateWorkflowRequest{}).
-		Returns(200, "create success", apis.DetailWorkflowResponse{}).
+		Reads(apis.CreateWorkflowPlanRequest{}).
+		Returns(200, "create success", apis.DetailWorkflowPlanResponse{}).
 		Returns(400, "create failure", bcode.Bcode{}).
-		Writes(apis.DetailWorkflowResponse{}).Do(returns200, returns500))
+		Writes(apis.DetailWorkflowPlanResponse{}).Do(returns200, returns500))
 
 	ws.Route(ws.GET("/{name}").To(w.detailWorkflow).
 		Doc("detail application workflow").
 		Param(ws.PathParameter("name", "identifier of the workflow.").DataType("string")).
 		Metadata(restfulspec.KeyOpenAPITags, tags).
 		Filter(w.workflowCheckFilter).
-		Returns(200, "create success", apis.DetailWorkflowResponse{}).
-		Writes(apis.DetailWorkflowResponse{}).Do(returns200, returns500))
+		Returns(200, "create success", apis.DetailWorkflowPlanResponse{}).
+		Writes(apis.DetailWorkflowPlanResponse{}).Do(returns200, returns500))
 
 	ws.Route(ws.PUT("/{name}").To(w.updateWorkflow).
 		Doc("update application workflow config").
 		Metadata(restfulspec.KeyOpenAPITags, tags).
 		Filter(w.workflowCheckFilter).
 		Param(ws.PathParameter("name", "identifier of the workflow").DataType("string")).
-		Reads(apis.UpdateWorkflowRequest{}).
-		Writes(apis.DetailWorkflowResponse{}).Do(returns200, returns500))
+		Reads(apis.UpdateWorkflowPlanRequest{}).
+		Writes(apis.DetailWorkflowPlanResponse{}).Do(returns200, returns500))
 
 	ws.Route(ws.DELETE("/{name}").To(w.deleteWorkflow).
 		Doc("deletet workflow").
@@ -140,7 +140,7 @@ func (w *workflowWebService) listApplicationWorkflows(req *restful.Request, res
 		bcode.ReturnError(req, res, err)
 		return
 	}
-	if err := res.WriteEntity(apis.ListWorkflowResponse{Workflows: workflows}); err != nil {
+	if err := res.WriteEntity(apis.ListWorkflowPlanResponse{WorkflowPlans: workflows}); err != nil {
 		bcode.ReturnError(req, res, err)
 		return
 	}
@@ -148,7 +148,7 @@ func (w *workflowWebService) listApplicationWorkflows(req *restful.Request, res
 
 func (w *workflowWebService) createApplicationWorkflow(req *restful.Request, res *restful.Response) {
 	// Verify the validity of parameters
-	var createReq apis.CreateWorkflowRequest
+	var createReq apis.CreateWorkflowPlanRequest
 	if err := req.ReadEntity(&createReq); err != nil {
 		bcode.ReturnError(req, res, err)
 		return
@@ -178,7 +178,7 @@ func (w *workflowWebService) createApplicationWorkflow(req *restful.Request, res
 }
 
 func (w *workflowWebService) detailWorkflow(req *restful.Request, res *restful.Response) {
-	workflow := req.Request.Context().Value(&apis.CtxKeyWorkflow).(*model.Workflow)
+	workflow := req.Request.Context().Value(&apis.CtxKeyWorkflow).(*model.WorkflowPlan)
 	detail, err := w.workflowUsecase.DetailWorkflow(req.Request.Context(), workflow)
 	if err != nil {
 		bcode.ReturnError(req, res, err)
@@ -191,9 +191,9 @@ func (w *workflowWebService) detailWorkflow(req *restful.Request, res *restful.R
 }
 
 func (w *workflowWebService) updateWorkflow(req *restful.Request, res *restful.Response) {
-	workflow := req.Request.Context().Value(&apis.CtxKeyWorkflow).(*model.Workflow)
+	workflow := req.Request.Context().Value(&apis.CtxKeyWorkflow).(*model.WorkflowPlan)
 	// Verify the validity of parameters
-	var updateReq apis.UpdateWorkflowRequest
+	var updateReq apis.UpdateWorkflowPlanRequest
 	if err := req.ReadEntity(&updateReq); err != nil {
 		bcode.ReturnError(req, res, err)
 		return
diff --git a/pkg/cloudprovider/aliyun.go b/pkg/cloudprovider/aliyun.go
index 94370035..0f379fdc 100644
--- a/pkg/cloudprovider/aliyun.go
+++ b/pkg/cloudprovider/aliyun.go
@@ -17,14 +17,23 @@ limitations under the License.
 package cloudprovider
 
 import (
+	"context"
 	"encoding/json"
 	"strings"
 
 	cs20151215 "github.com/alibabacloud-go/cs-20151215/v2/client"
 	openapi "github.com/alibabacloud-go/darabonba-openapi/client"
 	"github.com/alibabacloud-go/tea/tea"
+	types "github.com/oam-dev/terraform-controller/api/types/crossplane-runtime"
+	v1beta12 "github.com/oam-dev/terraform-controller/api/v1beta1"
+	"github.com/pkg/errors"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/klog/v2"
 	"k8s.io/utils/pointer"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	"github.com/oam-dev/kubevela/pkg/utils/util"
 )
 
 const (
@@ -34,10 +43,13 @@ const (
 // AliyunCloudProvider describes the cloud provider in aliyun
 type AliyunCloudProvider struct {
 	*cs20151215.Client
+	k8sClient       client.Client
+	accessKeyID     string
+	accessKeySecret string
 }
 
 // NewAliyunCloudProvider create aliyun cloud provider
-func NewAliyunCloudProvider(accessKeyID string, accessKeySecret string) (*AliyunCloudProvider, error) {
+func NewAliyunCloudProvider(accessKeyID string, accessKeySecret string, k8sClient client.Client) (*AliyunCloudProvider, error) {
 	config := &openapi.Config{
 		AccessKeyId:     pointer.String(accessKeyID),
 		AccessKeySecret: pointer.String(accessKeySecret),
@@ -47,7 +59,7 @@ func NewAliyunCloudProvider(accessKeyID string, accessKeySecret string) (*Aliyun
 	if err != nil {
 		return nil, err
 	}
-	return &AliyunCloudProvider{Client: c}, nil
+	return &AliyunCloudProvider{Client: c, k8sClient: k8sClient, accessKeyID: accessKeyID, accessKeySecret: accessKeySecret}, nil
 }
 
 // IsInvalidKey check if error is InvalidAccessKey or InvalidSecretKey
@@ -133,3 +145,61 @@ func (provider *AliyunCloudProvider) GetClusterInfo(clusterID string) (*CloudClu
 		DashBoardURL: url.DashboardEndpoint,
 	}, nil
 }
+
+// CreateCloudCluster create cloud cluster
+func (provider *AliyunCloudProvider) CreateCloudCluster(ctx context.Context, clusterName string, zone string, worker int, cpu int64, mem int64) (string, error) {
+	name := GetCloudClusterFullName(ProviderAliyun, clusterName)
+	ns := util.GetRuntimeNamespace()
+	terraformProviderName, err := bootstrapTerraformProvider(ctx, provider.k8sClient, ns, ProviderAliyun, "alibaba", provider.accessKeyID, provider.accessKeySecret, "cn-hongkong")
+	if err != nil {
+		return "", errors.Wrapf(err, "failed to bootstrap terraform provider")
+	}
+	properties := map[string]interface{}{
+		"k8s_name_prefix": clusterName,
+	}
+	if zone != "" {
+		properties["zone_id"] = zone
+	}
+	if cpu != 0 {
+		properties["cpu_core_count"] = cpu
+	}
+	if mem != 0 {
+		properties["memory_size"] = mem
+	}
+	if worker != 0 {
+		properties["k8s_worker_number"] = worker
+	}
+	bs, err := json.Marshal(properties)
+	if err != nil {
+		return name, errors.Wrapf(err, "failed to marshal cloud cluster app properties")
+	}
+
+	cfg := v1beta12.Configuration{
+		ObjectMeta: v1.ObjectMeta{
+			Name:      name,
+			Namespace: ns,
+			Labels: map[string]string{
+				CloudClusterCreatorLabelKey: ProviderAliyun,
+			},
+		},
+		Spec: v1beta12.ConfigurationSpec{
+			Path:     "alibaba/cs/dedicated-kubernetes",
+			Remote:   "https://github.com/kubevela-contrib/terraform-modules.git",
+			Variable: &runtime.RawExtension{Raw: bs},
+			ProviderReference: &types.Reference{
+				Name:      terraformProviderName,
+				Namespace: ns,
+			},
+			WriteConnectionSecretToReference: &types.SecretReference{
+				Name:      name,
+				Namespace: ns,
+			},
+		},
+	}
+
+	if err = provider.k8sClient.Create(ctx, &cfg); err != nil {
+		return name, errors.Wrapf(err, "failed to create cloud cluster terraform configuration")
+	}
+
+	return name, nil
+}
diff --git a/pkg/cloudprovider/cluster.go b/pkg/cloudprovider/cluster.go
index a1887339..eb032455 100644
--- a/pkg/cloudprovider/cluster.go
+++ b/pkg/cloudprovider/cluster.go
@@ -17,7 +17,15 @@ limitations under the License.
 package cloudprovider
 
 import (
+	"context"
+
 	"github.com/pkg/errors"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+const (
+	// CloudClusterCreatorLabelKey labels the creator of cloud cluster
+	CloudClusterCreatorLabelKey = "api.core.oam.dev/cloud-cluster-creator"
 )
 
 // CloudClusterProvider abstracts the cloud provider to provide cluster access
@@ -26,13 +34,14 @@ type CloudClusterProvider interface {
 	ListCloudClusters(pageNumber int, pageSize int) ([]*CloudCluster, int, error)
 	GetClusterKubeConfig(clusterID string) (string, error)
 	GetClusterInfo(clusterID string) (*CloudCluster, error)
+	CreateCloudCluster(ctx context.Context, clusterName string, zone string, worker int, cpu int64, mem int64) (string, error)
 }
 
 // GetClusterProvider creates interface for getting cloud cluster provider
-func GetClusterProvider(provider string, accessKeyID string, accessKeySecret string) (CloudClusterProvider, error) {
+func GetClusterProvider(provider string, accessKeyID string, accessKeySecret string, k8sClient client.Client) (CloudClusterProvider, error) {
 	switch provider {
 	case ProviderAliyun:
-		return NewAliyunCloudProvider(accessKeyID, accessKeySecret)
+		return NewAliyunCloudProvider(accessKeyID, accessKeySecret, k8sClient)
 	default:
 		return nil, errors.Errorf("cluster provider %s is not implemented", provider)
 	}
diff --git a/pkg/cloudprovider/terraform.go b/pkg/cloudprovider/terraform.go
new file mode 100644
index 00000000..36b7e10d
--- /dev/null
+++ b/pkg/cloudprovider/terraform.go
@@ -0,0 +1,94 @@
+/*
+Copyright 2021 The KubeVela 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 cloudprovider
+
+import (
+	"context"
+	"crypto/sha256"
+	"fmt"
+	"strings"
+
+	types "github.com/oam-dev/terraform-controller/api/types/crossplane-runtime"
+	v1beta12 "github.com/oam-dev/terraform-controller/api/v1beta1"
+	"github.com/pkg/errors"
+	v12 "k8s.io/api/core/v1"
+	kerrors "k8s.io/apimachinery/pkg/api/errors"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+func computeProviderHashKey(provider string, accessKeyID string, accessKeySecret string) string {
+	return fmt.Sprintf("%x", sha256.Sum256([]byte(strings.Join([]string{provider, accessKeyID, accessKeySecret}, "::"))))[:8] // #nosec
+}
+
+// GetCloudClusterFullName construct the full name of cloud cluster which will be used as the name of terraform configuration
+func GetCloudClusterFullName(provider string, clusterName string) string {
+	return fmt.Sprintf("cloud-cluster-%s-%s", provider, clusterName)
+}
+
+func bootstrapTerraformProvider(ctx context.Context, k8sClient client.Client, ns string, provider string, tfProvider string, accessKeyID string, accessKeySecret string, region string) (string, error) {
+	hashKey := computeProviderHashKey(provider, accessKeyID, accessKeySecret)
+	secretName := fmt.Sprintf("tf-provider-cred-%s-%s", provider, hashKey)
+	terraformProviderName := fmt.Sprintf("tf-provider-%s-%s", provider, hashKey)
+	secret := v12.Secret{
+		ObjectMeta: v1.ObjectMeta{
+			Name:      secretName,
+			Namespace: ns,
+		},
+		StringData: map[string]string{"credentials": fmt.Sprintf("accessKeyID: %s\naccessKeySecret: %s\nsecurityToken:\n", accessKeyID, accessKeySecret)},
+		Type:       v12.SecretTypeOpaque,
+	}
+	var err error
+	if err = k8sClient.Get(ctx, client.ObjectKeyFromObject(&secret), &v12.Secret{}); err != nil {
+		if kerrors.IsNotFound(err) {
+			err = k8sClient.Create(ctx, &secret)
+		}
+		if err != nil {
+			return "", errors.Wrapf(err, "failed to upsert terraform provider secret")
+		}
+	}
+
+	terraformProvider := v1beta12.Provider{
+		ObjectMeta: v1.ObjectMeta{
+			Name:      terraformProviderName,
+			Namespace: ns,
+		},
+		Spec: v1beta12.ProviderSpec{
+			Credentials: v1beta12.ProviderCredentials{
+				SecretRef: &types.SecretKeySelector{
+					Key: "credentials",
+					SecretReference: types.SecretReference{
+						Name:      secretName,
+						Namespace: ns,
+					},
+				},
+				Source: types.CredentialsSourceSecret,
+			},
+			Provider: tfProvider,
+			Region:   region,
+		},
+	}
+	if err = k8sClient.Get(ctx, client.ObjectKeyFromObject(&terraformProvider), &v1beta12.Provider{}); err != nil {
+		if kerrors.IsNotFound(err) {
+			err = k8sClient.Create(ctx, &terraformProvider)
+		}
+		if err != nil {
+			return "", errors.Wrapf(err, "failed to upsert terraform provider")
+		}
+	}
+	return terraformProviderName, nil
+}
diff --git a/pkg/utils/util/k8s.go b/pkg/utils/util/k8s.go
new file mode 100644
index 00000000..a8d1765b
--- /dev/null
+++ b/pkg/utils/util/k8s.go
@@ -0,0 +1,32 @@
+/*
+Copyright 2021 The KubeVela 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 util
+
+import (
+	"io/ioutil"
+
+	"github.com/oam-dev/kubevela/apis/types"
+)
+
+// GetRuntimeNamespace get namespace of the current running pod, fall back to default vela system
+func GetRuntimeNamespace() string {
+	ns, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
+	if err != nil {
+		return types.DefaultKubeVelaNS
+	}
+	return string(ns)
+}



Test patch:
diff --git a/pkg/apiserver/datastore/datastore_test.go b/pkg/apiserver/datastore/datastore_test.go
index 26feeff7..c6fd219c 100644
--- a/pkg/apiserver/datastore/datastore_test.go
+++ b/pkg/apiserver/datastore/datastore_test.go
@@ -30,7 +30,7 @@ import (
 var _ = Describe("Test new entity function", func() {
 
 	It("Test new application entity", func() {
-		var app model.Application
+		var app model.ApplicationPlan
 		new, err := NewEntity(&app)
 		Expect(err).To(BeNil())
 		json.Unmarshal([]byte(`{"name":"demo"}`), new)
@@ -40,7 +40,7 @@ var _ = Describe("Test new entity function", func() {
 	})
 
 	It("Test new multiple application entity", func() {
-		var app model.Application
+		var app model.ApplicationPlan
 		var list []Entity
 		var n = 3
 		for n > 0 {
diff --git a/pkg/apiserver/datastore/kubeapi/kubeapi_test.go b/pkg/apiserver/datastore/kubeapi/kubeapi_test.go
index bdb52f62..b5d8c0e6 100644
--- a/pkg/apiserver/datastore/kubeapi/kubeapi_test.go
+++ b/pkg/apiserver/datastore/kubeapi/kubeapi_test.go
@@ -88,22 +88,22 @@ var _ = Describe("Test kubeapi datastore driver", func() {
 	Expect(kubeStore).ToNot(BeNil())
 
 	It("Test add funtion", func() {
-		err := kubeStore.Add(context.TODO(), &model.Application{Name: "kubevela-app", Description: "default"})
+		err := kubeStore.Add(context.TODO(), &model.ApplicationPlan{Name: "kubevela-app", Description: "default"})
 		Expect(err).ToNot(HaveOccurred())
 	})
 
 	It("Test batch add funtion", func() {
 		var datas = []datastore.Entity{
-			&model.Application{Name: "kubevela-app-2", Description: "this is demo 2"},
-			&model.Application{Namespace: "test-namespace", Name: "kubevela-app-3", Description: "this is demo 3"},
-			&model.Application{Namespace: "test-namespace2", Name: "kubevela-app-4", Description: "this is demo 4"},
+			&model.ApplicationPlan{Name: "kubevela-app-2", Description: "this is demo 2"},
+			&model.ApplicationPlan{Namespace: "test-namespace", Name: "kubevela-app-3", Description: "this is demo 3"},
+			&model.ApplicationPlan{Namespace: "test-namespace2", Name: "kubevela-app-4", Description: "this is demo 4"},
 		}
 		err := kubeStore.BatchAdd(context.TODO(), datas)
 		Expect(err).ToNot(HaveOccurred())
 
 		var datas2 = []datastore.Entity{
-			&model.Application{Namespace: "test-namespace", Name: "can-delete", Description: "this is demo can-delete"},
-			&model.Application{Name: "kubevela-app-2", Description: "this is demo 2"},
+			&model.ApplicationPlan{Namespace: "test-namespace", Name: "can-delete", Description: "this is demo can-delete"},
+			&model.ApplicationPlan{Name: "kubevela-app-2", Description: "this is demo 2"},
 		}
 		err = kubeStore.BatchAdd(context.TODO(), datas2)
 		equal := cmp.Diff(strings.Contains(err.Error(), "save components occur error"), true)
@@ -111,7 +111,7 @@ var _ = Describe("Test kubeapi datastore driver", func() {
 	})
 
 	It("Test get funtion", func() {
-		app := &model.Application{Name: "kubevela-app"}
+		app := &model.ApplicationPlan{Name: "kubevela-app"}
 		err := kubeStore.Get(context.TODO(), app)
 		Expect(err).Should(BeNil())
 		diff := cmp.Diff(app.Description, "default")
@@ -119,11 +119,11 @@ var _ = Describe("Test kubeapi datastore driver", func() {
 	})
 
 	It("Test put funtion", func() {
-		err := kubeStore.Put(context.TODO(), &model.Application{Name: "kubevela-app", Description: "this is demo"})
+		err := kubeStore.Put(context.TODO(), &model.ApplicationPlan{Name: "kubevela-app", Description: "this is demo"})
 		Expect(err).ToNot(HaveOccurred())
 	})
 	It("Test index", func() {
-		var app = model.Application{
+		var app = model.ApplicationPlan{
 			Namespace: "test",
 		}
 		selector, err := labels.Parse(fmt.Sprintf("table=%s", app.TableName()))
@@ -137,7 +137,7 @@ var _ = Describe("Test kubeapi datastore driver", func() {
 		Expect(cmp.Diff(selector.String(), "namespace=test,table=vela_application")).Should(BeEmpty())
 	})
 	It("Test list function", func() {
-		var app model.Application
+		var app model.ApplicationPlan
 		list, err := kubeStore.List(context.TODO(), &app, &datastore.ListOptions{Page: -1})
 		Expect(err).ShouldNot(HaveOccurred())
 		diff := cmp.Diff(len(list), 4)
@@ -166,7 +166,7 @@ var _ = Describe("Test kubeapi datastore driver", func() {
 	})
 
 	It("Test count function", func() {
-		var app model.Application
+		var app model.ApplicationPlan
 		count, err := kubeStore.Count(context.TODO(), &app)
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(count).Should(Equal(int64(4)))
@@ -178,7 +178,7 @@ var _ = Describe("Test kubeapi datastore driver", func() {
 	})
 
 	It("Test isExist function", func() {
-		var app model.Application
+		var app model.ApplicationPlan
 		app.Name = "kubevela-app-3"
 		exist, err := kubeStore.IsExist(context.TODO(), &app)
 		Expect(err).ShouldNot(HaveOccurred())
@@ -193,7 +193,7 @@ var _ = Describe("Test kubeapi datastore driver", func() {
 	})
 
 	It("Test delete funtion", func() {
-		var app model.Application
+		var app model.ApplicationPlan
 		app.Name = "kubevela-app"
 		err := kubeStore.Delete(context.TODO(), &app)
 		Expect(err).ShouldNot(HaveOccurred())
diff --git a/pkg/apiserver/datastore/mongodb/mongodb_test.go b/pkg/apiserver/datastore/mongodb/mongodb_test.go
index 3e947d02..ac5f884f 100644
--- a/pkg/apiserver/datastore/mongodb/mongodb_test.go
+++ b/pkg/apiserver/datastore/mongodb/mongodb_test.go
@@ -56,22 +56,22 @@ var _ = BeforeSuite(func(done Done) {
 var _ = Describe("Test mongodb datastore driver", func() {
 
 	It("Test add funtion", func() {
-		err := mongodbDriver.Add(context.TODO(), &model.Application{Name: "kubevela-app", Description: "default"})
+		err := mongodbDriver.Add(context.TODO(), &model.ApplicationPlan{Name: "kubevela-app", Description: "default"})
 		Expect(err).ToNot(HaveOccurred())
 	})
 
 	It("Test batch add funtion", func() {
 		var datas = []datastore.Entity{
-			&model.Application{Name: "kubevela-app-2", Description: "this is demo 2"},
-			&model.Application{Namespace: "test-namespace", Name: "kubevela-app-3", Description: "this is demo 3"},
-			&model.Application{Namespace: "test-namespace2", Name: "kubevela-app-4", Description: "this is demo 4"},
+			&model.ApplicationPlan{Name: "kubevela-app-2", Description: "this is demo 2"},
+			&model.ApplicationPlan{Namespace: "test-namespace", Name: "kubevela-app-3", Description: "this is demo 3"},
+			&model.ApplicationPlan{Namespace: "test-namespace2", Name: "kubevela-app-4", Description: "this is demo 4"},
 		}
 		err := mongodbDriver.BatchAdd(context.TODO(), datas)
 		Expect(err).ToNot(HaveOccurred())
 
 		var datas2 = []datastore.Entity{
-			&model.Application{Namespace: "test-namespace", Name: "can-delete", Description: "this is demo can-delete"},
-			&model.Application{Name: "kubevela-app-2", Description: "this is demo 2"},
+			&model.ApplicationPlan{Namespace: "test-namespace", Name: "can-delete", Description: "this is demo can-delete"},
+			&model.ApplicationPlan{Name: "kubevela-app-2", Description: "this is demo 2"},
 		}
 		err = mongodbDriver.BatchAdd(context.TODO(), datas2)
 		equal := cmp.Diff(strings.Contains(err.Error(), "save components occur error"), true)
@@ -79,7 +79,7 @@ var _ = Describe("Test mongodb datastore driver", func() {
 	})
 
 	It("Test get funtion", func() {
-		app := &model.Application{Name: "kubevela-app"}
+		app := &model.ApplicationPlan{Name: "kubevela-app"}
 		err := mongodbDriver.Get(context.TODO(), app)
 		Expect(err).Should(BeNil())
 		diff := cmp.Diff(app.Description, "default")
@@ -87,11 +87,11 @@ var _ = Describe("Test mongodb datastore driver", func() {
 	})
 
 	It("Test put funtion", func() {
-		err := mongodbDriver.Put(context.TODO(), &model.Application{Name: "kubevela-app", Description: "this is demo"})
+		err := mongodbDriver.Put(context.TODO(), &model.ApplicationPlan{Name: "kubevela-app", Description: "this is demo"})
 		Expect(err).ToNot(HaveOccurred())
 	})
 	It("Test list funtion", func() {
-		var app model.Application
+		var app model.ApplicationPlan
 		list, err := mongodbDriver.List(context.TODO(), &app, &datastore.ListOptions{Page: -1})
 		Expect(err).ShouldNot(HaveOccurred())
 		diff := cmp.Diff(len(list), 4)
@@ -120,7 +120,7 @@ var _ = Describe("Test mongodb datastore driver", func() {
 	})
 
 	It("Test count function", func() {
-		var app model.Application
+		var app model.ApplicationPlan
 		count, err := mongodbDriver.Count(context.TODO(), &app)
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(count).Should(Equal(int64(4)))
@@ -132,7 +132,7 @@ var _ = Describe("Test mongodb datastore driver", func() {
 	})
 
 	It("Test isExist funtion", func() {
-		var app model.Application
+		var app model.ApplicationPlan
 		app.Name = "kubevela-app-3"
 		exist, err := mongodbDriver.IsExist(context.TODO(), &app)
 		Expect(err).ShouldNot(HaveOccurred())
@@ -147,7 +147,7 @@ var _ = Describe("Test mongodb datastore driver", func() {
 	})
 
 	It("Test delete funtion", func() {
-		var app model.Application
+		var app model.ApplicationPlan
 		app.Name = "kubevela-app"
 		err := mongodbDriver.Delete(context.TODO(), &app)
 		Expect(err).ShouldNot(HaveOccurred())
diff --git a/pkg/apiserver/rest/usecase/application_test.go b/pkg/apiserver/rest/usecase/application_test.go
index b1e20e96..3270aec1 100644
--- a/pkg/apiserver/rest/usecase/application_test.go
+++ b/pkg/apiserver/rest/usecase/application_test.go
@@ -50,7 +50,7 @@ var _ = Describe("Test application usecase function", func() {
 	})
 	It("Test CreateApplication function", func() {
 		By("test sample create")
-		req := v1.CreateApplicationRequest{
+		req := v1.CreateApplicationPlanRequest{
 			Name:        "test-app",
 			Namespace:   "test-app-namespace",
 			Description: "this is a test app",
@@ -66,7 +66,7 @@ var _ = Describe("Test application usecase function", func() {
 		By("test with oam yaml config create")
 		bs, err := ioutil.ReadFile("./testdata/example-app.yaml")
 		Expect(err).Should(Succeed())
-		req = v1.CreateApplicationRequest{
+		req = v1.CreateApplicationPlanRequest{
 			Name:        "test-app-sadasd",
 			Namespace:   "test-app-namespace",
 			Description: "this is a test app",
@@ -78,7 +78,7 @@ var _ = Describe("Test application usecase function", func() {
 		Expect(err).Should(BeNil())
 		Expect(cmp.Diff(base.Description, req.Description)).Should(BeEmpty())
 
-		req = v1.CreateApplicationRequest{
+		req = v1.CreateApplicationPlanRequest{
 			Name:        "test-app-sadasd2",
 			Namespace:   "test-app-namespace",
 			Description: "this is a test app",
@@ -93,7 +93,7 @@ var _ = Describe("Test application usecase function", func() {
 
 		bs, err = ioutil.ReadFile("./testdata/example-app-error.yaml")
 		Expect(err).Should(Succeed())
-		req = v1.CreateApplicationRequest{
+		req = v1.CreateApplicationPlanRequest{
 			Name:        "test-app-sadasd3",
 			Namespace:   "test-app-namespace",
 			Description: "this is a test app",
@@ -106,7 +106,7 @@ var _ = Describe("Test application usecase function", func() {
 		Expect(equal).Should(BeTrue())
 
 		By("Test create app with env binding")
-		req = v1.CreateApplicationRequest{
+		req = v1.CreateApplicationPlanRequest{
 			Name:        "test-app-sadasd4",
 			Namespace:   "test-app-namespace",
 			Description: "this is a test app",
@@ -140,7 +140,7 @@ var _ = Describe("Test application usecase function", func() {
 	})
 
 	It("Test ListApplications function", func() {
-		apps, err := appUsecase.ListApplications(context.TODO(), v1.ListApplicatioOptions{})
+		apps, err := appUsecase.ListApplications(context.TODO(), v1.ListApplicatioPlanOptions{})
 		Expect(err).Should(BeNil())
 		Expect(cmp.Diff(len(apps), 3)).Should(BeEmpty())
 	})
@@ -217,7 +217,7 @@ var _ = Describe("Test application usecase function", func() {
 		appModel, err := appUsecase.GetApplication(context.TODO(), "test-app-sadasd")
 		Expect(err).Should(BeNil())
 		Expect(cmp.Diff(appModel.Namespace, "test-app-namespace")).Should(BeEmpty())
-		base, err := appUsecase.AddComponent(context.TODO(), appModel, v1.CreateComponentRequest{
+		base, err := appUsecase.AddComponent(context.TODO(), appModel, v1.CreateComponentPlanRequest{
 			Name:          "test2",
 			Description:   "this is a test2 component",
 			Labels:        map[string]string{},
diff --git a/pkg/apiserver/rest/usecase/definition_test.go b/pkg/apiserver/rest/usecase/definition_test.go
index f74c0c8e..37756fe9 100644
--- a/pkg/apiserver/rest/usecase/definition_test.go
+++ b/pkg/apiserver/rest/usecase/definition_test.go
@@ -23,31 +23,105 @@ import (
 	"github.com/google/go-cmp/cmp"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/yaml"
 
 	"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
+	v1 "github.com/oam-dev/kubevela/pkg/apiserver/rest/apis/v1"
 	"github.com/oam-dev/kubevela/pkg/apiserver/rest/utils"
+	"github.com/oam-dev/kubevela/pkg/oam/util"
 )
 
 var _ = Describe("Test namespace usecase functions", func() {
 	var (
 		definitionUsecase *definitionUsecaseImpl
 	)
+
 	BeforeEach(func() {
 		definitionUsecase = &definitionUsecaseImpl{kubeClient: k8sClient, caches: make(map[string]*utils.MemoryCache)}
+		err := k8sClient.Create(context.Background(), &corev1.Namespace{
+			ObjectMeta: metav1.ObjectMeta{
+				Name: "vela-system",
+			},
+		})
+		Expect(err).Should(SatisfyAny(BeNil(), &util.AlreadyExistMatcher{}))
 	})
-	It("Test ListComponentDefinitions function", func() {
-		bs, err := ioutil.ReadFile("./testdata/webserver-cd.yaml")
+	It("Test ListDefinitions function", func() {
+		By("List component definitions")
+		webserver, err := ioutil.ReadFile("./testdata/webserver-cd.yaml")
 		Expect(err).Should(Succeed())
-		var test v1beta1.ComponentDefinition
-		err = yaml.Unmarshal(bs, &test)
+		var cd v1beta1.ComponentDefinition
+		err = yaml.Unmarshal(webserver, &cd)
 		Expect(err).Should(Succeed())
-		err = k8sClient.Create(context.Background(), &test)
+		err = k8sClient.Create(context.Background(), &cd)
 		Expect(err).Should(Succeed())
-		components, err := definitionUsecase.ListComponentDefinitions(context.TODO(), "")
+		components, err := definitionUsecase.ListDefinitions(context.TODO(), "", "component")
 		Expect(err).Should(BeNil())
 		Expect(cmp.Diff(len(components), 1)).Should(BeEmpty())
 		Expect(cmp.Diff(components[0].Name, "webservice-test")).Should(BeEmpty())
 		Expect(components[0].Description).ShouldNot(BeEmpty())
+
+		By("List trait definitions")
+		myingress, err := ioutil.ReadFile("./testdata/myingress-td.yaml")
+		Expect(err).Should(Succeed())
+		var td v1beta1.TraitDefinition
+		err = yaml.Unmarshal(myingress, &td)
+		Expect(err).Should(Succeed())
+		err = k8sClient.Create(context.Background(), &td)
+		Expect(err).Should(Succeed())
+		traits, err := definitionUsecase.ListDefinitions(context.TODO(), "", "trait")
+		Expect(err).Should(BeNil())
+		Expect(cmp.Diff(len(traits), 1)).Should(BeEmpty())
+		Expect(cmp.Diff(traits[0].Name, "myingress")).Should(BeEmpty())
+		Expect(traits[0].Description).ShouldNot(BeEmpty())
+
+		By("List workflow step definitions")
+		step, err := ioutil.ReadFile("./testdata/applyapplication-sd.yaml")
+		Expect(err).Should(Succeed())
+		var sd v1beta1.WorkflowStepDefinition
+		err = yaml.Unmarshal(step, &sd)
+		Expect(err).Should(Succeed())
+		err = k8sClient.Create(context.Background(), &sd)
+		Expect(err).Should(Succeed())
+		wfstep, err := definitionUsecase.ListDefinitions(context.TODO(), "", "workflowstep")
+		Expect(err).Should(BeNil())
+		Expect(cmp.Diff(len(wfstep), 1)).Should(BeEmpty())
+		Expect(cmp.Diff(wfstep[0].Name, "apply-application")).Should(BeEmpty())
+		Expect(wfstep[0].Description).ShouldNot(BeEmpty())
+	})
+
+	It("Test DetailDefinition function", func() {
+		cm := &corev1.ConfigMap{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      "workflowstep-schema-apply-object",
+				Namespace: "vela-system",
+			},
+			Data: map[string]string{
+				"openapi-v3-json-schema": `{"properties":{"cluster":{"default":"","description":"Specify the cluster of the object","title":"cluster","type":"string"},"value":{"description":"Specify the value of the object","title":"value","type":"object"}},"required":["value","cluster"],"type":"object"}`,
+			},
+		}
+		err := k8sClient.Create(context.Background(), cm)
+		Expect(err).Should(Succeed())
+		schema, err := definitionUsecase.DetailDefinition(context.TODO(), "apply-object", "workflowstep")
+		Expect(err).Should(BeNil())
+		Expect(schema.Schema).Should(Equal(&v1.DefinitionSchema{
+			Properties: map[string]v1.DefinitionProperties{
+				"value": {
+					Default:     "",
+					Description: "Specify the value of the object",
+					Title:       "value",
+					Type:        "object",
+				},
+				"cluster": {
+					Default:     "",
+					Description: "Specify the cluster of the object",
+					Title:       "cluster",
+					Type:        "string",
+				},
+			},
+			Required: []string{"value", "cluster"},
+			Type:     "object",
+		}))
 	})
 })
diff --git a/pkg/apiserver/rest/usecase/testdata/applyapplication-sd.yaml b/pkg/apiserver/rest/usecase/testdata/applyapplication-sd.yaml
new file mode 100644
index 00000000..a7af4555
--- /dev/null
+++ b/pkg/apiserver/rest/usecase/testdata/applyapplication-sd.yaml
@@ -0,0 +1,20 @@
+# Code generated by KubeVela templates. DO NOT EDIT. Please edit the original cue file.
+# Definition source cue file: vela-templates/definitions/internal/apply-application.cue
+apiVersion: core.oam.dev/v1beta1
+kind: WorkflowStepDefinition
+metadata:
+  annotations:
+    definition.oam.dev/description: Apply application for your workflow steps
+  name: apply-application
+  namespace: vela-system
+spec:
+  schematic:
+    cue:
+      template: |
+        import (
+        	"vela/op"
+        )
+
+        // apply application
+        output: op.#ApplyApplication & {}
+
diff --git a/pkg/apiserver/rest/usecase/testdata/myingress-td.yaml b/pkg/apiserver/rest/usecase/testdata/myingress-td.yaml
new file mode 100644
index 00000000..9345a04a
--- /dev/null
+++ b/pkg/apiserver/rest/usecase/testdata/myingress-td.yaml
@@ -0,0 +1,65 @@
+apiVersion: core.oam.dev/v1beta1
+kind: TraitDefinition
+metadata:
+  annotations:
+    definition.oam.dev/description: Enable public web traffic for the component.
+  name: myingress
+  namespace: vela-system
+spec:
+  appliesToWorkloads:
+    - "*"
+  podDisruptive: false
+  schematic:
+    cue:
+      template: |
+        import (
+        	kubev1 "kube/v1"
+        	network "kube/networking.k8s.io/v1beta1"
+        )
+
+        parameter: {
+        	domain: string
+        	http: [string]: int
+        }
+
+        outputs: {
+        service: kubev1.#Service
+        ingress: network.#Ingress
+        }
+
+        // trait template can have multiple outputs in one trait
+        outputs: service: {
+        	metadata:
+        		name: context.name
+        	spec: {
+        		selector:
+        			"app.oam.dev/component": context.name
+        		ports: [
+        			for k, v in parameter.http {
+        				port:       v
+        				targetPort: v
+        			},
+        		]
+        	}
+        }
+
+        outputs: ingress: {
+        	metadata:
+        		name: context.name
+        	spec: {
+        		rules: [{
+        			host: parameter.domain
+        			http: {
+        				paths: [
+        					for k, v in parameter.http {
+        						path: k
+        						backend: {
+        							serviceName: context.name
+        							servicePort: v
+        						}
+        					},
+        				]
+        			}
+        		}]
+        	}
+        }
diff --git a/pkg/apiserver/rest/usecase/testdata/webserver-cd.yaml b/pkg/apiserver/rest/usecase/testdata/webserver-cd.yaml
index a1b7970a..b407974a 100644
--- a/pkg/apiserver/rest/usecase/testdata/webserver-cd.yaml
+++ b/pkg/apiserver/rest/usecase/testdata/webserver-cd.yaml
@@ -6,7 +6,7 @@ metadata:
   annotations:
     definition.oam.dev/description: Describes long-running, scalable, containerized services that have a stable network endpoint to receive external network traffic from customers.
   name: webservice-test
-  namespace: default
+  namespace: vela-system
 spec:
   schematic:
     cue:
diff --git a/pkg/apiserver/rest/usecase/workflow_test.go b/pkg/apiserver/rest/usecase/workflow_test.go
index 37c36a49..9477d2f7 100644
--- a/pkg/apiserver/rest/usecase/workflow_test.go
+++ b/pkg/apiserver/rest/usecase/workflow_test.go
@@ -40,22 +40,22 @@ var _ = Describe("Test workflow usecase functions", func() {
 		workflowUsecase = &workflowUsecaseImpl{ds: ds}
 	})
 	It("Test CreateWorkflow function", func() {
-		req := apisv1.CreateWorkflowRequest{
+		req := apisv1.CreateWorkflowPlanRequest{
 			Name:        "test-workflow-1",
 			Description: "this is a workflow",
 		}
-		base, err := workflowUsecase.CreateWorkflow(context.TODO(), &model.Application{
+		base, err := workflowUsecase.CreateWorkflow(context.TODO(), &model.ApplicationPlan{
 			Name: "test-app",
 		}, req)
 		Expect(err).Should(BeNil())
 		Expect(cmp.Diff(base.Name, req.Name)).Should(BeEmpty())
 
-		req = apisv1.CreateWorkflowRequest{
+		req = apisv1.CreateWorkflowPlanRequest{
 			Name:        "test-workflow-2",
 			Description: "this is test workflow",
 			Default:     true,
 		}
-		base, err = workflowUsecase.CreateWorkflow(context.TODO(), &model.Application{
+		base, err = workflowUsecase.CreateWorkflow(context.TODO(), &model.ApplicationPlan{
 			Name: "test-app",
 		}, req)
 		Expect(err).Should(BeNil())
@@ -63,7 +63,7 @@ var _ = Describe("Test workflow usecase functions", func() {
 	})
 
 	It("Test GetApplicationDefaultWorkflow function", func() {
-		workflow, err := workflowUsecase.GetApplicationDefaultWorkflow(context.TODO(), &model.Application{
+		workflow, err := workflowUsecase.GetApplicationDefaultWorkflow(context.TODO(), &model.ApplicationPlan{
 			Name: "test-app",
 		})
 		Expect(err).Should(BeNil())
diff --git a/pkg/apiserver/rest/webservice/validate_test.go b/pkg/apiserver/rest/webservice/validate_test.go
index 7b71fab5..1113e6b5 100644
--- a/pkg/apiserver/rest/webservice/validate_test.go
+++ b/pkg/apiserver/rest/webservice/validate_test.go
@@ -27,26 +27,26 @@ import (
 var _ = Describe("Test validate function", func() {
 	It("Test check name validate ", func() {
 		Expect(cmp.Diff(nameRegexp.MatchString("///Asd asda "), false)).Should(BeEmpty())
-		var app0 = apisv1.CreateApplicationRequest{
+		var app0 = apisv1.CreateApplicationPlanRequest{
 			Name:      "a",
 			Namespace: "namespace",
 		}
 		err := validate.Struct(&app0)
 		Expect(err).ShouldNot(BeNil())
-		var app1 = apisv1.CreateApplicationRequest{
+		var app1 = apisv1.CreateApplicationPlanRequest{
 			Name:      "Asdasd",
 			Namespace: "namespace",
 		}
 		err = validate.Struct(&app1)
 		Expect(err).ShouldNot(BeNil())
-		var app2 = apisv1.CreateApplicationRequest{
+		var app2 = apisv1.CreateApplicationPlanRequest{
 			Name:      "asdasd asdasd ++",
 			Namespace: "namespace",
 		}
 		err = validate.Struct(&app2)
 		Expect(err).ShouldNot(BeNil())
 
-		var app3 = apisv1.CreateApplicationRequest{
+		var app3 = apisv1.CreateApplicationPlanRequest{
 			Name:      "asdasd",
 			Namespace: "namespace",
 		}
diff --git a/test/e2e-apiserver-test/application_test.go b/test/e2e-apiserver-test/application_test.go
index ab335074..5bf6b078 100644
--- a/test/e2e-apiserver-test/application_test.go
+++ b/test/e2e-apiserver-test/application_test.go
@@ -36,7 +36,7 @@ import (
 var _ = Describe("Test application rest api", func() {
 	It("Test create app", func() {
 		defer GinkgoRecover()
-		var req = apisv1.CreateApplicationRequest{
+		var req = apisv1.CreateApplicationPlanRequest{
 			Name:        "test-app-sadasd",
 			Namespace:   "test-app-namespace",
 			Description: "this is a test app",
@@ -48,13 +48,13 @@ var _ = Describe("Test application rest api", func() {
 		}
 		bodyByte, err := json.Marshal(req)
 		Expect(err).ShouldNot(HaveOccurred())
-		res, err := http.Post("http://127.0.0.1:8000/api/v1/applications", "application/json", bytes.NewBuffer(bodyByte))
+		res, err := http.Post("http://127.0.0.1:8000/api/v1/applicationplans", "application/json", bytes.NewBuffer(bodyByte))
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
 		Expect(res.Body).ShouldNot(BeNil())
 		defer res.Body.Close()
-		var appBase apisv1.ApplicationBase
+		var appBase apisv1.ApplicationPlanBase
 		err = json.NewDecoder(res.Body).Decode(&appBase)
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(cmp.Diff(appBase.Name, req.Name)).Should(BeEmpty())
@@ -66,7 +66,7 @@ var _ = Describe("Test application rest api", func() {
 
 	It("Test delete app", func() {
 		defer GinkgoRecover()
-		req, err := http.NewRequest(http.MethodDelete, "http://127.0.0.1:8000/api/v1/applications/test-app-sadasd", nil)
+		req, err := http.NewRequest(http.MethodDelete, "http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd", nil)
 		Expect(err).ShouldNot(HaveOccurred())
 		res, err := http.DefaultClient.Do(req)
 		Expect(err).ShouldNot(HaveOccurred())
@@ -78,7 +78,7 @@ var _ = Describe("Test application rest api", func() {
 		defer GinkgoRecover()
 		bs, err := ioutil.ReadFile("./testdata/example-app.yaml")
 		Expect(err).Should(Succeed())
-		var req = apisv1.CreateApplicationRequest{
+		var req = apisv1.CreateApplicationPlanRequest{
 			Name:        "test-app-sadasd",
 			Namespace:   "test-app-namespace",
 			Description: "this is a test app",
@@ -88,13 +88,13 @@ var _ = Describe("Test application rest api", func() {
 		}
 		bodyByte, err := json.Marshal(req)
 		Expect(err).ShouldNot(HaveOccurred())
-		res, err := http.Post("http://127.0.0.1:8000/api/v1/applications", "application/json", bytes.NewBuffer(bodyByte))
+		res, err := http.Post("http://127.0.0.1:8000/api/v1/applicationplans", "application/json", bytes.NewBuffer(bodyByte))
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
 		Expect(res.Body).ShouldNot(BeNil())
 		defer res.Body.Close()
-		var appBase apisv1.ApplicationBase
+		var appBase apisv1.ApplicationPlanBase
 		err = json.NewDecoder(res.Body).Decode(&appBase)
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(cmp.Diff(appBase.Name, req.Name)).Should(BeEmpty())
@@ -105,21 +105,21 @@ var _ = Describe("Test application rest api", func() {
 
 	It("Test list components", func() {
 		defer GinkgoRecover()
-		res, err := http.Get("http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/components")
+		res, err := http.Get("http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/componentplans")
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
 		Expect(res.Body).ShouldNot(BeNil())
 		defer res.Body.Close()
-		var components apisv1.ComponentListResponse
+		var components apisv1.ComponentPlanListResponse
 		err = json.NewDecoder(res.Body).Decode(&components)
 		Expect(err).ShouldNot(HaveOccurred())
-		Expect(cmp.Diff(len(components.Components), 2)).Should(BeEmpty())
+		Expect(cmp.Diff(len(components.ComponentPlans), 2)).Should(BeEmpty())
 	})
 
 	It("Test list policies", func() {
 		defer GinkgoRecover()
-		res, err := http.Get("http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/policies")
+		res, err := http.Get("http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/policies")
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
@@ -133,7 +133,7 @@ var _ = Describe("Test application rest api", func() {
 
 	It("Test get workflow", func() {
 		// defer GinkgoRecover()
-		// res, err := http.Get("http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/policies")
+		// res, err := http.Get("http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/policies")
 		// Expect(err).ShouldNot(HaveOccurred())
 		// Expect(res).ShouldNot(BeNil())
 		// Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
@@ -147,13 +147,13 @@ var _ = Describe("Test application rest api", func() {
 
 	It("Test detail application", func() {
 		defer GinkgoRecover()
-		res, err := http.Get("http://127.0.0.1:8000/api/v1/applications/test-app-sadasd")
+		res, err := http.Get("http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd")
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
 		Expect(res.Body).ShouldNot(BeNil())
 		defer res.Body.Close()
-		var detail apisv1.DetailApplicationResponse
+		var detail apisv1.DetailApplicationPlanResponse
 		err = json.NewDecoder(res.Body).Decode(&detail)
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(cmp.Diff(len(detail.Policies), 1)).Should(BeEmpty())
@@ -168,7 +168,7 @@ var _ = Describe("Test application rest api", func() {
 		}
 		bodyByte, err := json.Marshal(req)
 		Expect(err).ShouldNot(HaveOccurred())
-		res, err := http.Post("http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/deploy", "application/json", bytes.NewBuffer(bodyByte))
+		res, err := http.Post("http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/deploy", "application/json", bytes.NewBuffer(bodyByte))
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
@@ -188,7 +188,7 @@ var _ = Describe("Test application rest api", func() {
 
 	It("Test create component", func() {
 		defer GinkgoRecover()
-		var req = apisv1.CreateComponentRequest{
+		var req = apisv1.CreateComponentPlanRequest{
 			Name:          "test2",
 			Description:   "this is a test2 component",
 			Labels:        map[string]string{},
@@ -198,13 +198,13 @@ var _ = Describe("Test application rest api", func() {
 		}
 		bodyByte, err := json.Marshal(req)
 		Expect(err).ShouldNot(HaveOccurred())
-		res, err := http.Post("http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/components", "application/json", bytes.NewBuffer(bodyByte))
+		res, err := http.Post("http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/componentplans", "application/json", bytes.NewBuffer(bodyByte))
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
 		Expect(res.Body).ShouldNot(BeNil())
 		defer res.Body.Close()
-		var response apisv1.ComponentBase
+		var response apisv1.ComponentPlanBase
 		err = json.NewDecoder(res.Body).Decode(&response)
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(cmp.Diff(response.ComponentType, "worker")).Should(BeEmpty())
@@ -212,13 +212,13 @@ var _ = Describe("Test application rest api", func() {
 
 	It("Test detail component", func() {
 		defer GinkgoRecover()
-		res, err := http.Get("http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/components/test2")
+		res, err := http.Get("http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/componentplans/test2")
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
 		Expect(res.Body).ShouldNot(BeNil())
 		defer res.Body.Close()
-		var response apisv1.DetailComponentResponse
+		var response apisv1.DetailComponentPlanResponse
 		err = json.NewDecoder(res.Body).Decode(&response)
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(cmp.Diff(len(response.DependsOn), 1)).Should(BeEmpty())
@@ -233,7 +233,7 @@ var _ = Describe("Test application rest api", func() {
 		}
 		bodyByte, err := json.Marshal(req)
 		Expect(err).ShouldNot(HaveOccurred())
-		res, err := http.Post("http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/policies", "application/json", bytes.NewBuffer(bodyByte))
+		res, err := http.Post("http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/policies", "application/json", bytes.NewBuffer(bodyByte))
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 400)).Should(BeEmpty())
@@ -245,7 +245,7 @@ var _ = Describe("Test application rest api", func() {
 		}
 		bodyByte2, err := json.Marshal(req2)
 		Expect(err).ShouldNot(HaveOccurred())
-		res, err = http.Post("http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/policies", "application/json", bytes.NewBuffer(bodyByte2))
+		res, err = http.Post("http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/policies", "application/json", bytes.NewBuffer(bodyByte2))
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
@@ -260,7 +260,7 @@ var _ = Describe("Test application rest api", func() {
 
 	It("Test detail application policy", func() {
 		defer GinkgoRecover()
-		res, err := http.Get("http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/policies/test2")
+		res, err := http.Get("http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/policies/test2")
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
@@ -280,7 +280,7 @@ var _ = Describe("Test application rest api", func() {
 		}
 		bodyByte2, err := json.Marshal(req2)
 		Expect(err).ShouldNot(HaveOccurred())
-		req, err := http.NewRequest(http.MethodPut, "http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/policies/test2", bytes.NewBuffer(bodyByte2))
+		req, err := http.NewRequest(http.MethodPut, "http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/policies/test2", bytes.NewBuffer(bodyByte2))
 		Expect(err).ShouldNot(HaveOccurred())
 		req.Header.Set("Content-Type", "application/json")
 		res, err := http.DefaultClient.Do(req)
@@ -298,7 +298,7 @@ var _ = Describe("Test application rest api", func() {
 
 	It("Test delete application policy", func() {
 		defer GinkgoRecover()
-		req, err := http.NewRequest(http.MethodDelete, "http://127.0.0.1:8000/api/v1/applications/test-app-sadasd/policies/test2", nil)
+		req, err := http.NewRequest(http.MethodDelete, "http://127.0.0.1:8000/api/v1/applicationplans/test-app-sadasd/policies/test2", nil)
 		Expect(err).ShouldNot(HaveOccurred())
 		res, err := http.DefaultClient.Do(req)
 		Expect(err).ShouldNot(HaveOccurred())
diff --git a/test/e2e-apiserver-test/definition_test.go b/test/e2e-apiserver-test/definition_test.go
index 31e03526..c0abf49f 100644
--- a/test/e2e-apiserver-test/definition_test.go
+++ b/test/e2e-apiserver-test/definition_test.go
@@ -29,16 +29,17 @@ import (
 
 var _ = Describe("Test definitions rest api", func() {
 
-	It("Test list component definitions", func() {
+	It("Test list definitions", func() {
 		defer GinkgoRecover()
-		res, err := http.Get("http://127.0.0.1:8000/api/v1/componentdefinitions")
+		res, err := http.Get("http://127.0.0.1:8000/api/v1/definitions?type=component")
 		Expect(err).ShouldNot(HaveOccurred())
 		Expect(res).ShouldNot(BeNil())
 		Expect(cmp.Diff(res.StatusCode, 200)).Should(BeEmpty())
 		Expect(res.Body).ShouldNot(BeNil())
 		defer res.Body.Close()
-		var componentdefinitions apisv1.ListComponentDefinitionResponse
-		err = json.NewDecoder(res.Body).Decode(&componentdefinitions)
+		var definitions apisv1.ListDefinitionResponse
+		err = json.NewDecoder(res.Body).Decode(&definitions)
 		Expect(err).ShouldNot(HaveOccurred())
 	})
+
 })