Repository: kubean-io/kubean
Pull request #126 (2022-09-08 10:23:04)

Add Crd KubeanClusterConfig
Signed-off-by: hang.jiang <hang.jiang@daocloud.io>

<!--  

Thanks for sending a pull request!  Here are some tips for you:

* make sure your commit is signed off

-->

**What type of PR is this?**
<!-- 
Uncomment only one ` /kind <>` line, hit enter to put that in a new line, and remove leading whitespaces from that line:

/kind api-change
/kind bug
/kind cleanup
/kind design
/kind documentation
/kind failing-test
/kind feature
/kind flake
-->

/kind feature

**What this PR does / why we need it**:

* move KuBeanComponentsVersion and add KubeanClusterConfig 

**Which issue(s) this PR fixes**:
<!--
*Automatically closes linked issue when PR is merged.
Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
_If PR is about `failing-tests or flakes`, please post the related issues/tests in a comment and do not use `Fixes`_*
-->
Fixes #

**Special notes for your reviewer**:



kubean-pr-robot[bot]: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubean-io/kubean/pull/126#" title="Author self-approved">hangscer8</a>*

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

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

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

- ~~[OWNERS](https://github.com/kubean-io/kubean/blob/main/OWNERS)~~ [hangscer8]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->

Patch:
diff --git a/.github/workflows/auto-release-ci.yaml b/.github/workflows/auto-release-ci.yaml
index 0bcbdce70..bce0df97f 100644
--- a/.github/workflows/auto-release-ci.yaml
+++ b/.github/workflows/auto-release-ci.yaml
@@ -87,7 +87,7 @@ jobs:
 
   get-environment:
     runs-on: ubuntu-latest
-    needs: sync-charts-and-api
+    needs: charts
     outputs:
       environment_runs_on: ${{ steps.get_variables.outputs.environment_runs_on }}
       enviroment_cd: ${{ steps.get_variables.outputs.enviroment_cd }}
diff --git a/api/apis/kubeancomponentsversion/v1alpha1/doc.go b/api/apis/kubeanclusterconfig/v1alpha1/doc.go
similarity index 100%
rename from api/apis/kubeancomponentsversion/v1alpha1/doc.go
rename to api/apis/kubeanclusterconfig/v1alpha1/doc.go
diff --git a/api/apis/kubeancomponentsversion/v1alpha1/types.go b/api/apis/kubeanclusterconfig/v1alpha1/types.go
similarity index 54%
rename from api/apis/kubeancomponentsversion/v1alpha1/types.go
rename to api/apis/kubeanclusterconfig/v1alpha1/types.go
index 2a5b3c1d9..973f93063 100644
--- a/api/apis/kubeancomponentsversion/v1alpha1/types.go
+++ b/api/apis/kubeanclusterconfig/v1alpha1/types.go
@@ -12,7 +12,7 @@ import (
 // +kubebuilder:subresource:status
 // +kubebuilder:printcolumn:JSONPath=`.metadata.creationTimestamp`,name="Age",type=date
 
-type KuBeanComponentsVersion struct {
+type KubeanClusterConfig struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
@@ -24,52 +24,78 @@ type KuBeanComponentsVersion struct {
 }
 
 type Spec struct {
-	// Kubespray , the tag of kubespray
+	// +optional
+	AirGapConfig AirGapConfig `json:"airGapConfig,omitempty"`
+
+	// +required
+	KubesprayVersion string `json:"kubesprayVersion,omitempty"`
+
+	// KubeanVersion , the tag of kubean-io
 	// +required
-	Kubespray string `json:"kubespray,omitempty"`
+	KubeanVersion string `json:"kubeanVersion,omitempty"`
 
-	// Kubean , the tag of kubean-io
 	// +optional
-	Kubean string `json:"kubean,omitempty"`
+	KubesprayImage string `json:"kubesprayImage,omitempty"`
 
-	// +required
-	Items []*SoftwareInfo `json:"items,omitempty"`
+	// +optional
+	Components []*SoftwareInfo `json:"components,omitempty"`
 
 	// +optional
-	Docker []*DockerInfo `json:"docker"`
+	Docker []*DockerInfo `json:"docker,omitempty"`
+}
+
+type AirGapConfig struct {
+	// +optional
+	RegistryRepo string `json:"registryRepo,omitempty"`
+	// +optional
+	FilesRepo string `json:"filesRepo,omitempty"`
+	// +optional
+	YumRepo []string `json:"yumRepo,omitempty"`
+	// +optional
+	HostsMap []HostsMap `json:"hostsMap,omitempty"`
+}
+
+type HostsMap struct {
+	// +required
+	Domain string `json:"domain,omitempty"`
+	// +required
+	Address string `json:"address,omitempty"`
 }
 
 type Status struct {
 	// +optional
-	Offline OfflineStatus `json:"offline,omitempty"`
+	AirGapStatus AirGapStatus `json:"airGap,omitempty"`
 }
 
-type OfflineStatus struct {
+type AirGapStatus struct {
 	// +optional
-	Items []*SoftwareInfoStatus `json:"items"`
+	Components []*SoftwareInfoStatus `json:"components,omitempty"`
 
 	// +optional
-	Docker []*DockerInfoStatus `json:"docker"`
+	Docker []*DockerInfoStatus `json:"docker,omitempty"`
 }
 
 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 
-type KuBeanComponentsVersionList struct {
+type KubeanClusterConfigList struct {
 	metav1.TypeMeta `json:",inline"`
 	metav1.ListMeta `json:"metadata,omitempty"`
 
-	// Items holds a list of KuBeanClusterOps.
-	Items []KuBeanComponentsVersion `json:"items"`
+	// Items holds a list of KubeanClusterConfig.
+	Items []KubeanClusterConfig `json:"items"`
 }
 
 type SoftwareInfo struct {
-	Name           string   `json:"name"`
-	DefaultVersion string   `json:"defaultVersion,omitempty"`
-	VersionRange   []string `json:"versionRange,omitempty"`
+	Name string `json:"name"`
+	// +optional
+	DefaultVersion string `json:"defaultVersion,omitempty"`
+	// +optional
+	VersionRange []string `json:"versionRange,omitempty"`
 }
 
 type SoftwareInfoStatus struct {
-	Name         string   `json:"name"`
+	Name string `json:"name"`
+	// +optional
 	VersionRange []string `json:"versionRange,omitempty"`
 }
 
@@ -85,13 +111,16 @@ func (status *SoftwareInfoStatus) Merge(versionRange []string) bool {
 }
 
 type DockerInfo struct {
-	OS             string   `json:"os"`
-	DefaultVersion string   `json:"defaultVersion,omitempty"`
-	VersionRange   []string `json:"versionRange,omitempty"`
+	OS string `json:"os"`
+	// +optional
+	DefaultVersion string `json:"defaultVersion,omitempty"`
+	// +optional
+	VersionRange []string `json:"versionRange,omitempty"`
 }
 
 type DockerInfoStatus struct {
-	OS           string   `json:"os"`
+	OS string `json:"os"`
+	// +optional
 	VersionRange []string `json:"versionRange,omitempty"`
 }
 
@@ -106,23 +135,23 @@ func (info *DockerInfoStatus) Merge(versionRange []string) bool {
 	return updated
 }
 
-func (status *OfflineStatus) MergeSoftwareInfo(name string, versionRange []string) bool {
+func (status *AirGapStatus) MergeSoftwareInfo(name string, versionRange []string) bool {
 	var targetNameItem *SoftwareInfoStatus
-	for i := range status.Items {
-		if status.Items[i].Name == name {
-			targetNameItem = status.Items[i]
+	for i := range status.Components {
+		if status.Components[i].Name == name {
+			targetNameItem = status.Components[i]
 			break
 		}
 	}
 	if targetNameItem == nil {
 		targetNameItem = &SoftwareInfoStatus{Name: name, VersionRange: versionRange}
-		status.Items = append(status.Items, targetNameItem)
+		status.Components = append(status.Components, targetNameItem)
 		return true
 	}
 	return targetNameItem.Merge(versionRange)
 }
 
-func (status *OfflineStatus) MergeDockerInfo(osName string, versionRange []string) bool {
+func (status *AirGapStatus) MergeDockerInfo(osName string, versionRange []string) bool {
 	var targetNameDockerInfo *DockerInfoStatus
 	for i := range status.Docker {
 		if status.Docker[i].OS == osName {
diff --git a/api/apis/kubeancomponentsversion/v1alpha1/zz_generated.deepcopy.go b/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go
similarity index 72%
rename from api/apis/kubeancomponentsversion/v1alpha1/zz_generated.deepcopy.go
rename to api/apis/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go
index d11e2f73e..e78e1bde5 100644
--- a/api/apis/kubeancomponentsversion/v1alpha1/zz_generated.deepcopy.go
+++ b/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go
@@ -9,6 +9,70 @@ import (
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AirGapConfig) DeepCopyInto(out *AirGapConfig) {
+	*out = *in
+	if in.YumRepo != nil {
+		in, out := &in.YumRepo, &out.YumRepo
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.HostsMap != nil {
+		in, out := &in.HostsMap, &out.HostsMap
+		*out = make([]HostsMap, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AirGapConfig.
+func (in *AirGapConfig) DeepCopy() *AirGapConfig {
+	if in == nil {
+		return nil
+	}
+	out := new(AirGapConfig)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AirGapStatus) DeepCopyInto(out *AirGapStatus) {
+	*out = *in
+	if in.Components != nil {
+		in, out := &in.Components, &out.Components
+		*out = make([]*SoftwareInfoStatus, len(*in))
+		for i := range *in {
+			if (*in)[i] != nil {
+				in, out := &(*in)[i], &(*out)[i]
+				*out = new(SoftwareInfoStatus)
+				(*in).DeepCopyInto(*out)
+			}
+		}
+	}
+	if in.Docker != nil {
+		in, out := &in.Docker, &out.Docker
+		*out = make([]*DockerInfoStatus, len(*in))
+		for i := range *in {
+			if (*in)[i] != nil {
+				in, out := &(*in)[i], &(*out)[i]
+				*out = new(DockerInfoStatus)
+				(*in).DeepCopyInto(*out)
+			}
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AirGapStatus.
+func (in *AirGapStatus) DeepCopy() *AirGapStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(AirGapStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *DockerInfo) DeepCopyInto(out *DockerInfo) {
 	*out = *in
@@ -52,7 +116,23 @@ func (in *DockerInfoStatus) DeepCopy() *DockerInfoStatus {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *KuBeanComponentsVersion) DeepCopyInto(out *KuBeanComponentsVersion) {
+func (in *HostsMap) DeepCopyInto(out *HostsMap) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostsMap.
+func (in *HostsMap) DeepCopy() *HostsMap {
+	if in == nil {
+		return nil
+	}
+	out := new(HostsMap)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *KubeanClusterConfig) DeepCopyInto(out *KubeanClusterConfig) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
@@ -61,18 +141,18 @@ func (in *KuBeanComponentsVersion) DeepCopyInto(out *KuBeanComponentsVersion) {
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KuBeanComponentsVersion.
-func (in *KuBeanComponentsVersion) DeepCopy() *KuBeanComponentsVersion {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanClusterConfig.
+func (in *KubeanClusterConfig) DeepCopy() *KubeanClusterConfig {
 	if in == nil {
 		return nil
 	}
-	out := new(KuBeanComponentsVersion)
+	out := new(KubeanClusterConfig)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *KuBeanComponentsVersion) DeepCopyObject() runtime.Object {
+func (in *KubeanClusterConfig) DeepCopyObject() runtime.Object {
 	if c := in.DeepCopy(); c != nil {
 		return c
 	}
@@ -80,13 +160,13 @@ func (in *KuBeanComponentsVersion) DeepCopyObject() runtime.Object {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *KuBeanComponentsVersionList) DeepCopyInto(out *KuBeanComponentsVersionList) {
+func (in *KubeanClusterConfigList) DeepCopyInto(out *KubeanClusterConfigList) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ListMeta.DeepCopyInto(&out.ListMeta)
 	if in.Items != nil {
 		in, out := &in.Items, &out.Items
-		*out = make([]KuBeanComponentsVersion, len(*in))
+		*out = make([]KubeanClusterConfig, len(*in))
 		for i := range *in {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
@@ -94,62 +174,24 @@ func (in *KuBeanComponentsVersionList) DeepCopyInto(out *KuBeanComponentsVersion
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KuBeanComponentsVersionList.
-func (in *KuBeanComponentsVersionList) DeepCopy() *KuBeanComponentsVersionList {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanClusterConfigList.
+func (in *KubeanClusterConfigList) DeepCopy() *KubeanClusterConfigList {
 	if in == nil {
 		return nil
 	}
-	out := new(KuBeanComponentsVersionList)
+	out := new(KubeanClusterConfigList)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *KuBeanComponentsVersionList) DeepCopyObject() runtime.Object {
+func (in *KubeanClusterConfigList) DeepCopyObject() runtime.Object {
 	if c := in.DeepCopy(); c != nil {
 		return c
 	}
 	return nil
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *OfflineStatus) DeepCopyInto(out *OfflineStatus) {
-	*out = *in
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]*SoftwareInfoStatus, len(*in))
-		for i := range *in {
-			if (*in)[i] != nil {
-				in, out := &(*in)[i], &(*out)[i]
-				*out = new(SoftwareInfoStatus)
-				(*in).DeepCopyInto(*out)
-			}
-		}
-	}
-	if in.Docker != nil {
-		in, out := &in.Docker, &out.Docker
-		*out = make([]*DockerInfoStatus, len(*in))
-		for i := range *in {
-			if (*in)[i] != nil {
-				in, out := &(*in)[i], &(*out)[i]
-				*out = new(DockerInfoStatus)
-				(*in).DeepCopyInto(*out)
-			}
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OfflineStatus.
-func (in *OfflineStatus) DeepCopy() *OfflineStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(OfflineStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *SoftwareInfo) DeepCopyInto(out *SoftwareInfo) {
 	*out = *in
@@ -195,8 +237,9 @@ func (in *SoftwareInfoStatus) DeepCopy() *SoftwareInfoStatus {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Spec) DeepCopyInto(out *Spec) {
 	*out = *in
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
+	in.AirGapConfig.DeepCopyInto(&out.AirGapConfig)
+	if in.Components != nil {
+		in, out := &in.Components, &out.Components
 		*out = make([]*SoftwareInfo, len(*in))
 		for i := range *in {
 			if (*in)[i] != nil {
@@ -233,7 +276,7 @@ func (in *Spec) DeepCopy() *Spec {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Status) DeepCopyInto(out *Status) {
 	*out = *in
-	in.Offline.DeepCopyInto(&out.Offline)
+	in.AirGapStatus.DeepCopyInto(&out.AirGapStatus)
 	return
 }
 
diff --git a/vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/zz_generated.register.go b/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go
similarity index 96%
rename from vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/zz_generated.register.go
rename to api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go
index a04dafd7a..66be7db16 100644
--- a/vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/zz_generated.register.go
+++ b/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go
@@ -42,8 +42,8 @@ func init() {
 // Adds the list of known types to Scheme.
 func addKnownTypes(scheme *runtime.Scheme) error {
 	scheme.AddKnownTypes(SchemeGroupVersion,
-		&KuBeanComponentsVersion{},
-		&KuBeanComponentsVersionList{},
+		&KubeanClusterConfig{},
+		&KubeanClusterConfigList{},
 	)
 	// AddToGroupVersion allows the serialization of client types like ListOptions.
 	v1.AddToGroupVersion(scheme, SchemeGroupVersion)
diff --git a/api/apis/kubeanofflineversion/v1alpha1/types.go b/api/apis/kubeanofflineversion/v1alpha1/types.go
index 195df09b4..904f690c0 100644
--- a/api/apis/kubeanofflineversion/v1alpha1/types.go
+++ b/api/apis/kubeanofflineversion/v1alpha1/types.go
@@ -47,11 +47,13 @@ type KuBeanOfflineVersionList struct {
 }
 
 type SoftwareInfo struct {
-	Name         string   `json:"name"`
+	Name string `json:"name"`
+	// +optional
 	VersionRange []string `json:"versionRange,omitempty"`
 }
 
 type DockerInfo struct {
-	OS           string   `json:"os"`
+	OS string `json:"os"`
+	// +optional
 	VersionRange []string `json:"versionRange,omitempty"`
 }
diff --git a/charts/kubean/_crds/kubean.io_kubeancomponentsversions.yaml b/api/charts/_crds/kubean.io_kubeanclusterconfigs.yaml
similarity index 76%
rename from charts/kubean/_crds/kubean.io_kubeancomponentsversions.yaml
rename to api/charts/_crds/kubean.io_kubeanclusterconfigs.yaml
index 5357595b6..a2516834e 100644
--- a/charts/kubean/_crds/kubean.io_kubeancomponentsversions.yaml
+++ b/api/charts/_crds/kubean.io_kubeanclusterconfigs.yaml
@@ -6,14 +6,14 @@ metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.6.2
   creationTimestamp: null
-  name: kubeancomponentsversions.kubean.io
+  name: kubeanclusterconfigs.kubean.io
 spec:
   group: kubean.io
   names:
-    kind: KuBeanComponentsVersion
-    listKind: KuBeanComponentsVersionList
-    plural: kubeancomponentsversions
-    singular: kubeancomponentsversion
+    kind: KubeanClusterConfig
+    listKind: KubeanClusterConfigList
+    plural: kubeanclusterconfigs
+    singular: kubeanclusterconfig
   scope: Cluster
   versions:
   - additionalPrinterColumns:
@@ -38,71 +38,92 @@ spec:
             type: object
           spec:
             properties:
-              docker:
+              airGapConfig:
+                properties:
+                  filesRepo:
+                    type: string
+                  hostsMap:
+                    items:
+                      properties:
+                        address:
+                          type: string
+                        domain:
+                          type: string
+                      type: object
+                    type: array
+                  registryRepo:
+                    type: string
+                  yumRepo:
+                    items:
+                      type: string
+                    type: array
+                type: object
+              components:
                 items:
                   properties:
                     defaultVersion:
                       type: string
-                    os:
+                    name:
                       type: string
                     versionRange:
                       items:
                         type: string
                       type: array
                   required:
-                  - os
+                  - name
                   type: object
                 type: array
-              items:
+              docker:
                 items:
                   properties:
                     defaultVersion:
                       type: string
-                    name:
+                    os:
                       type: string
                     versionRange:
                       items:
                         type: string
                       type: array
                   required:
-                  - name
+                  - os
                   type: object
                 type: array
-              kubean:
-                description: Kubean , the tag of kubean-io
+              kubeanVersion:
+                description: KubeanVersion , the tag of kubean-io
+                type: string
+              kubesprayImage:
                 type: string
-              kubespray:
-                description: Kubespray , the tag of kubespray
+              kubesprayVersion:
                 type: string
             type: object
           status:
             properties:
-              offline:
+              airGap:
                 properties:
-                  docker:
+                  components:
                     items:
                       properties:
-                        os:
+                        name:
                           type: string
                         versionRange:
                           items:
                             type: string
                           type: array
                       required:
-                      - os
+                      - name
                       type: object
                     type: array
-                  items:
+                  docker:
                     items:
                       properties:
-                        name:
+                        os:
                           type: string
                         versionRange:
                           items:
                             type: string
                           type: array
                       required:
-                      - name
+                      - os
                       type: object
                     type: array
                 type: object
diff --git a/api/constants/constants.go b/api/constants/constants.go
index b024a7058..d3391db97 100644
--- a/api/constants/constants.go
+++ b/api/constants/constants.go
@@ -1,5 +1,5 @@
 package constants
 
-const ComponentsversionGlobalName = "componentsversion-global"
+const ClusterConfigGlobal = "clusterconfig-global"
 
 const KubeanClusterLabelKey = "clusterName"
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/clientset.go b/api/generated/kubeanclusterconfig/clientset/versioned/clientset.go
similarity index 96%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/clientset.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/clientset.go
index 6fb3bce48..3cd6208e4 100644
--- a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/clientset.go
+++ b/api/generated/kubeanclusterconfig/clientset/versioned/clientset.go
@@ -9,7 +9,7 @@ import (
 	discovery "k8s.io/client-go/discovery"
 	rest "k8s.io/client-go/rest"
 	flowcontrol "k8s.io/client-go/util/flowcontrol"
-	kubeanv1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
 )
 
 type Interface interface {
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/doc.go b/api/generated/kubeanclusterconfig/clientset/versioned/doc.go
similarity index 100%
rename from api/generated/kubeancomponentsversion/clientset/versioned/doc.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/doc.go
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/fake/clientset_generated.go b/api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
similarity index 85%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/fake/clientset_generated.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
index 2c60ae373..06fe2e5c4 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/fake/clientset_generated.go
+++ b/api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
@@ -8,9 +8,9 @@ import (
 	"k8s.io/client-go/discovery"
 	fakediscovery "k8s.io/client-go/discovery/fake"
 	"k8s.io/client-go/testing"
-	clientset "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
-	kubeanv1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1"
-	fakekubeanv1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake"
+	clientset "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
+	fakekubeanv1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake"
 )
 
 // NewSimpleClientset returns a clientset that will respond with the provided objects.
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/fake/doc.go b/api/generated/kubeanclusterconfig/clientset/versioned/fake/doc.go
similarity index 100%
rename from api/generated/kubeancomponentsversion/clientset/versioned/fake/doc.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/fake/doc.go
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/fake/register.go b/api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go
similarity index 94%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/fake/register.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go
index eefaaa9a3..557be1df8 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/fake/register.go
+++ b/api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go
@@ -8,7 +8,7 @@ import (
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
-	kubeanv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 )
 
 var scheme = runtime.NewScheme()
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/scheme/doc.go b/api/generated/kubeanclusterconfig/clientset/versioned/scheme/doc.go
similarity index 100%
rename from api/generated/kubeancomponentsversion/clientset/versioned/scheme/doc.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/scheme/doc.go
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme/register.go b/api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go
similarity index 94%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme/register.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go
index f62c21894..dc3db3d44 100644
--- a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme/register.go
+++ b/api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go
@@ -8,7 +8,7 @@ import (
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
-	kubeanv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 )
 
 var Scheme = runtime.NewScheme()
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/doc.go b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go
similarity index 100%
rename from api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/doc.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/doc.go b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go
similarity index 100%
rename from api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/doc.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go
new file mode 100644
index 000000000..adc14b897
--- /dev/null
+++ b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go
@@ -0,0 +1,117 @@
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	"context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+)
+
+// FakeKubeanClusterConfigs implements KubeanClusterConfigInterface
+type FakeKubeanClusterConfigs struct {
+	Fake *FakeKubeanV1alpha1
+}
+
+var kubeanclusterconfigsResource = schema.GroupVersionResource{Group: "kubean.io", Version: "v1alpha1", Resource: "kubeanclusterconfigs"}
+
+var kubeanclusterconfigsKind = schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KubeanClusterConfig"}
+
+// Get takes name of the kubeanClusterConfig, and returns the corresponding kubeanClusterConfig object, and an error if there is any.
+func (c *FakeKubeanClusterConfigs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootGetAction(kubeanclusterconfigsResource, name), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// List takes label and field selectors, and returns the list of KubeanClusterConfigs that match those selectors.
+func (c *FakeKubeanClusterConfigs) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanClusterConfigList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootListAction(kubeanclusterconfigsResource, kubeanclusterconfigsKind, opts), &v1alpha1.KubeanClusterConfigList{})
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.KubeanClusterConfigList{ListMeta: obj.(*v1alpha1.KubeanClusterConfigList).ListMeta}
+	for _, item := range obj.(*v1alpha1.KubeanClusterConfigList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested kubeanClusterConfigs.
+func (c *FakeKubeanClusterConfigs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewRootWatchAction(kubeanclusterconfigsResource, opts))
+}
+
+// Create takes the representation of a kubeanClusterConfig and creates it.  Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *FakeKubeanClusterConfigs) Create(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.CreateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootCreateAction(kubeanclusterconfigsResource, kubeanClusterConfig), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// Update takes the representation of a kubeanClusterConfig and updates it. Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *FakeKubeanClusterConfigs) Update(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateAction(kubeanclusterconfigsResource, kubeanClusterConfig), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeKubeanClusterConfigs) UpdateStatus(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (*v1alpha1.KubeanClusterConfig, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateSubresourceAction(kubeanclusterconfigsResource, "status", kubeanClusterConfig), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// Delete takes name of the kubeanClusterConfig and deletes it. Returns an error if one occurs.
+func (c *FakeKubeanClusterConfigs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewRootDeleteActionWithOptions(kubeanclusterconfigsResource, name, opts), &v1alpha1.KubeanClusterConfig{})
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeKubeanClusterConfigs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewRootDeleteCollectionAction(kubeanclusterconfigsResource, listOpts)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.KubeanClusterConfigList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched kubeanClusterConfig.
+func (c *FakeKubeanClusterConfigs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootPatchSubresourceAction(kubeanclusterconfigsResource, name, pt, data, subresources...), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion_client.go b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
similarity index 60%
rename from api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion_client.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
index 39ec0680b..f20526904 100644
--- a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion_client.go
+++ b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
@@ -5,15 +5,15 @@ package fake
 import (
 	rest "k8s.io/client-go/rest"
 	testing "k8s.io/client-go/testing"
-	v1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1"
+	v1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
 )
 
 type FakeKubeanV1alpha1 struct {
 	*testing.Fake
 }
 
-func (c *FakeKubeanV1alpha1) KuBeanComponentsVersions() v1alpha1.KuBeanComponentsVersionInterface {
-	return &FakeKuBeanComponentsVersions{c}
+func (c *FakeKubeanV1alpha1) KubeanClusterConfigs() v1alpha1.KubeanClusterConfigInterface {
+	return &FakeKubeanClusterConfigs{c}
 }
 
 // RESTClient returns a RESTClient that is used to communicate
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/generated_expansion.go b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
similarity index 56%
rename from api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/generated_expansion.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
index bdae433b2..f9e6297b1 100644
--- a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/generated_expansion.go
+++ b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
@@ -2,4 +2,4 @@
 
 package v1alpha1
 
-type KuBeanComponentsVersionExpansion interface{}
+type KubeanClusterConfigExpansion interface{}
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
new file mode 100644
index 000000000..2bd59bfac
--- /dev/null
+++ b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
@@ -0,0 +1,168 @@
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"context"
+	"time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	scheme "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme"
+)
+
+// KubeanClusterConfigsGetter has a method to return a KubeanClusterConfigInterface.
+// A group's client should implement this interface.
+type KubeanClusterConfigsGetter interface {
+	KubeanClusterConfigs() KubeanClusterConfigInterface
+}
+
+// KubeanClusterConfigInterface has methods to work with KubeanClusterConfig resources.
+type KubeanClusterConfigInterface interface {
+	Create(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.CreateOptions) (*v1alpha1.KubeanClusterConfig, error)
+	Update(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (*v1alpha1.KubeanClusterConfig, error)
+	UpdateStatus(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (*v1alpha1.KubeanClusterConfig, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.KubeanClusterConfig, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.KubeanClusterConfigList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanClusterConfig, err error)
+	KubeanClusterConfigExpansion
+}
+
+// kubeanClusterConfigs implements KubeanClusterConfigInterface
+type kubeanClusterConfigs struct {
+	client rest.Interface
+}
+
+// newKubeanClusterConfigs returns a KubeanClusterConfigs
+func newKubeanClusterConfigs(c *KubeanV1alpha1Client) *kubeanClusterConfigs {
+	return &kubeanClusterConfigs{
+		client: c.RESTClient(),
+	}
+}
+
+// Get takes name of the kubeanClusterConfig, and returns the corresponding kubeanClusterConfig object, and an error if there is any.
+func (c *kubeanClusterConfigs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Get().
+		Resource("kubeanclusterconfigs").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of KubeanClusterConfigs that match those selectors.
+func (c *kubeanClusterConfigs) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanClusterConfigList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.KubeanClusterConfigList{}
+	err = c.client.Get().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested kubeanClusterConfigs.
+func (c *kubeanClusterConfigs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch(ctx)
+}
+
+// Create takes the representation of a kubeanClusterConfig and creates it.  Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *kubeanClusterConfigs) Create(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.CreateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Post().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanClusterConfig).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Update takes the representation of a kubeanClusterConfig and updates it. Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *kubeanClusterConfigs) Update(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Put().
+		Resource("kubeanclusterconfigs").
+		Name(kubeanClusterConfig.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanClusterConfig).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *kubeanClusterConfigs) UpdateStatus(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Put().
+		Resource("kubeanclusterconfigs").
+		Name(kubeanClusterConfig.Name).
+		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanClusterConfig).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Delete takes name of the kubeanClusterConfig and deletes it. Returns an error if one occurs.
+func (c *kubeanClusterConfigs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return c.client.Delete().
+		Resource("kubeanclusterconfigs").
+		Name(name).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *kubeanClusterConfigs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	var timeout time.Duration
+	if listOpts.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&listOpts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// Patch applies the patch and returns the patched kubeanClusterConfig.
+func (c *kubeanClusterConfigs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Patch(pt).
+		Resource("kubeanclusterconfigs").
+		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(data).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion_client.go b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
similarity index 88%
rename from api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion_client.go
rename to api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
index cc4569a2b..4852f2ea6 100644
--- a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion_client.go
+++ b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
@@ -6,13 +6,13 @@ import (
 	"net/http"
 
 	rest "k8s.io/client-go/rest"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-	"kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	"kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme"
 )
 
 type KubeanV1alpha1Interface interface {
 	RESTClient() rest.Interface
-	KuBeanComponentsVersionsGetter
+	KubeanClusterConfigsGetter
 }
 
 // KubeanV1alpha1Client is used to interact with features provided by the kubean.io group.
@@ -20,8 +20,8 @@ type KubeanV1alpha1Client struct {
 	restClient rest.Interface
 }
 
-func (c *KubeanV1alpha1Client) KuBeanComponentsVersions() KuBeanComponentsVersionInterface {
-	return newKuBeanComponentsVersions(c)
+func (c *KubeanV1alpha1Client) KubeanClusterConfigs() KubeanClusterConfigInterface {
+	return newKubeanClusterConfigs(c)
 }
 
 // NewForConfig creates a new KubeanV1alpha1Client for the given config.
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/factory.go b/api/generated/kubeanclusterconfig/informers/externalversions/factory.go
similarity index 91%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/factory.go
rename to api/generated/kubeanclusterconfig/informers/externalversions/factory.go
index e9e7077ec..a6b922347 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/factory.go
+++ b/api/generated/kubeanclusterconfig/informers/externalversions/factory.go
@@ -11,9 +11,9 @@ import (
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	cache "k8s.io/client-go/tools/cache"
-	versioned "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
-	internalinterfaces "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces"
-	kubeancomponentsversion "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion"
+	versioned "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
+	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
+	kubeanclusterconfig "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig"
 )
 
 // SharedInformerOption defines the functional option type for SharedInformerFactory.
@@ -156,9 +156,9 @@ type SharedInformerFactory interface {
 	ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
 	WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
 
-	Kubean() kubeancomponentsversion.Interface
+	Kubean() kubeanclusterconfig.Interface
 }
 
-func (f *sharedInformerFactory) Kubean() kubeancomponentsversion.Interface {
-	return kubeancomponentsversion.New(f, f.namespace, f.tweakListOptions)
+func (f *sharedInformerFactory) Kubean() kubeanclusterconfig.Interface {
+	return kubeanclusterconfig.New(f, f.namespace, f.tweakListOptions)
 }
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/generic.go b/api/generated/kubeanclusterconfig/informers/externalversions/generic.go
similarity index 85%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/generic.go
rename to api/generated/kubeanclusterconfig/informers/externalversions/generic.go
index 65faf01c8..978d3d400 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/generic.go
+++ b/api/generated/kubeanclusterconfig/informers/externalversions/generic.go
@@ -7,7 +7,7 @@ import (
 
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	cache "k8s.io/client-go/tools/cache"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 )
 
 // GenericInformer is type of SharedIndexInformer which will locate and delegate to other
@@ -37,8 +37,8 @@ func (f *genericInformer) Lister() cache.GenericLister {
 func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) {
 	switch resource {
 	// Group=kubean.io, Version=v1alpha1
-	case v1alpha1.SchemeGroupVersion.WithResource("kubeancomponentsversions"):
-		return &genericInformer{resource: resource.GroupResource(), informer: f.Kubean().V1alpha1().KuBeanComponentsVersions().Informer()}, nil
+	case v1alpha1.SchemeGroupVersion.WithResource("kubeanclusterconfigs"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Kubean().V1alpha1().KubeanClusterConfigs().Informer()}, nil
 
 	}
 
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/internalinterfaces/factory_interfaces.go b/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go
similarity index 90%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/internalinterfaces/factory_interfaces.go
rename to api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go
index 738ad4f44..247fb7ef2 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/internalinterfaces/factory_interfaces.go
+++ b/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go
@@ -8,7 +8,7 @@ import (
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	cache "k8s.io/client-go/tools/cache"
-	versioned "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
+	versioned "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
 )
 
 // NewInformerFunc takes versioned.Interface and time.Duration to return a SharedIndexInformer.
diff --git a/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/interface.go b/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go
similarity index 76%
rename from api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/interface.go
rename to api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go
index 11fba68fc..71b060e93 100644
--- a/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/interface.go
+++ b/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go
@@ -1,10 +1,10 @@
 // Code generated by informer-gen. DO NOT EDIT.
 
-package kubeancomponentsversion
+package kubeanclusterconfig
 
 import (
-	internalinterfaces "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces"
-	v1alpha1 "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1"
+	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
+	v1alpha1 "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1"
 )
 
 // Interface provides access to each of this group's versions.
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/interface.go b/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go
similarity index 55%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/interface.go
rename to api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go
index b5f6cfe30..16d231895 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/interface.go
+++ b/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go
@@ -3,13 +3,13 @@
 package v1alpha1
 
 import (
-	internalinterfaces "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces"
+	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
 )
 
 // Interface provides access to all the informers in this group version.
 type Interface interface {
-	// KuBeanComponentsVersions returns a KuBeanComponentsVersionInformer.
-	KuBeanComponentsVersions() KuBeanComponentsVersionInformer
+	// KubeanClusterConfigs returns a KubeanClusterConfigInformer.
+	KubeanClusterConfigs() KubeanClusterConfigInformer
 }
 
 type version struct {
@@ -23,7 +23,7 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList
 	return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
 }
 
-// KuBeanComponentsVersions returns a KuBeanComponentsVersionInformer.
-func (v *version) KuBeanComponentsVersions() KuBeanComponentsVersionInformer {
-	return &kuBeanComponentsVersionInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
+// KubeanClusterConfigs returns a KubeanClusterConfigInformer.
+func (v *version) KubeanClusterConfigs() KubeanClusterConfigInformer {
+	return &kubeanClusterConfigInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
 }
diff --git a/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
new file mode 100644
index 000000000..fcf9d8a89
--- /dev/null
+++ b/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
@@ -0,0 +1,73 @@
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"context"
+	time "time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	watch "k8s.io/apimachinery/pkg/watch"
+	cache "k8s.io/client-go/tools/cache"
+	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	versioned "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
+	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
+	v1alpha1 "kubean.io/api/generated/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1"
+)
+
+// KubeanClusterConfigInformer provides access to a shared informer and lister for
+// KubeanClusterConfigs.
+type KubeanClusterConfigInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() v1alpha1.KubeanClusterConfigLister
+}
+
+type kubeanClusterConfigInformer struct {
+	factory          internalinterfaces.SharedInformerFactory
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+}
+
+// NewKubeanClusterConfigInformer constructs a new informer for KubeanClusterConfig type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewKubeanClusterConfigInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredKubeanClusterConfigInformer(client, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredKubeanClusterConfigInformer constructs a new informer for KubeanClusterConfig type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewFilteredKubeanClusterConfigInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
+	return cache.NewSharedIndexInformer(
+		&cache.ListWatch{
+			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.KubeanV1alpha1().KubeanClusterConfigs().List(context.TODO(), options)
+			},
+			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.KubeanV1alpha1().KubeanClusterConfigs().Watch(context.TODO(), options)
+			},
+		},
+		&kubeanclusterconfigv1alpha1.KubeanClusterConfig{},
+		resyncPeriod,
+		indexers,
+	)
+}
+
+func (f *kubeanClusterConfigInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+	return NewFilteredKubeanClusterConfigInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *kubeanClusterConfigInformer) Informer() cache.SharedIndexInformer {
+	return f.factory.InformerFor(&kubeanclusterconfigv1alpha1.KubeanClusterConfig{}, f.defaultInformer)
+}
+
+func (f *kubeanClusterConfigInformer) Lister() v1alpha1.KubeanClusterConfigLister {
+	return v1alpha1.NewKubeanClusterConfigLister(f.Informer().GetIndexer())
+}
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/clientset.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/clientset.go
similarity index 96%
rename from api/generated/kubeancomponentsversion/clientset/versioned/clientset.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/clientset.go
index 6fb3bce48..3cd6208e4 100644
--- a/api/generated/kubeancomponentsversion/clientset/versioned/clientset.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/clientset.go
@@ -9,7 +9,7 @@ import (
 	discovery "k8s.io/client-go/discovery"
 	rest "k8s.io/client-go/rest"
 	flowcontrol "k8s.io/client-go/util/flowcontrol"
-	kubeanv1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
 )
 
 type Interface interface {
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/doc.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/doc.go
similarity index 100%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/doc.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/doc.go
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/fake/clientset_generated.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
similarity index 85%
rename from api/generated/kubeancomponentsversion/clientset/versioned/fake/clientset_generated.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
index 2c60ae373..06fe2e5c4 100644
--- a/api/generated/kubeancomponentsversion/clientset/versioned/fake/clientset_generated.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
@@ -8,9 +8,9 @@ import (
 	"k8s.io/client-go/discovery"
 	fakediscovery "k8s.io/client-go/discovery/fake"
 	"k8s.io/client-go/testing"
-	clientset "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
-	kubeanv1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1"
-	fakekubeanv1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake"
+	clientset "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
+	fakekubeanv1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake"
 )
 
 // NewSimpleClientset returns a clientset that will respond with the provided objects.
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/fake/doc.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/doc.go
similarity index 100%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/fake/doc.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/doc.go
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/fake/register.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/register.go
similarity index 94%
rename from api/generated/kubeancomponentsversion/clientset/versioned/fake/register.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/register.go
index eefaaa9a3..557be1df8 100644
--- a/api/generated/kubeancomponentsversion/clientset/versioned/fake/register.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/register.go
@@ -8,7 +8,7 @@ import (
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
-	kubeanv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 )
 
 var scheme = runtime.NewScheme()
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/scheme/doc.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/scheme/doc.go
similarity index 100%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/scheme/doc.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/scheme/doc.go
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/scheme/register.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/scheme/register.go
similarity index 94%
rename from api/generated/kubeancomponentsversion/clientset/versioned/scheme/register.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/scheme/register.go
index f62c21894..dc3db3d44 100644
--- a/api/generated/kubeancomponentsversion/clientset/versioned/scheme/register.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/scheme/register.go
@@ -8,7 +8,7 @@ import (
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
-	kubeanv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 )
 
 var Scheme = runtime.NewScheme()
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/doc.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go
similarity index 100%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/doc.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/doc.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go
similarity index 100%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/doc.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go
new file mode 100644
index 000000000..adc14b897
--- /dev/null
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go
@@ -0,0 +1,117 @@
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	"context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+)
+
+// FakeKubeanClusterConfigs implements KubeanClusterConfigInterface
+type FakeKubeanClusterConfigs struct {
+	Fake *FakeKubeanV1alpha1
+}
+
+var kubeanclusterconfigsResource = schema.GroupVersionResource{Group: "kubean.io", Version: "v1alpha1", Resource: "kubeanclusterconfigs"}
+
+var kubeanclusterconfigsKind = schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KubeanClusterConfig"}
+
+// Get takes name of the kubeanClusterConfig, and returns the corresponding kubeanClusterConfig object, and an error if there is any.
+func (c *FakeKubeanClusterConfigs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootGetAction(kubeanclusterconfigsResource, name), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// List takes label and field selectors, and returns the list of KubeanClusterConfigs that match those selectors.
+func (c *FakeKubeanClusterConfigs) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanClusterConfigList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootListAction(kubeanclusterconfigsResource, kubeanclusterconfigsKind, opts), &v1alpha1.KubeanClusterConfigList{})
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.KubeanClusterConfigList{ListMeta: obj.(*v1alpha1.KubeanClusterConfigList).ListMeta}
+	for _, item := range obj.(*v1alpha1.KubeanClusterConfigList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested kubeanClusterConfigs.
+func (c *FakeKubeanClusterConfigs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewRootWatchAction(kubeanclusterconfigsResource, opts))
+}
+
+// Create takes the representation of a kubeanClusterConfig and creates it.  Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *FakeKubeanClusterConfigs) Create(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.CreateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootCreateAction(kubeanclusterconfigsResource, kubeanClusterConfig), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// Update takes the representation of a kubeanClusterConfig and updates it. Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *FakeKubeanClusterConfigs) Update(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateAction(kubeanclusterconfigsResource, kubeanClusterConfig), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeKubeanClusterConfigs) UpdateStatus(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (*v1alpha1.KubeanClusterConfig, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateSubresourceAction(kubeanclusterconfigsResource, "status", kubeanClusterConfig), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// Delete takes name of the kubeanClusterConfig and deletes it. Returns an error if one occurs.
+func (c *FakeKubeanClusterConfigs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewRootDeleteActionWithOptions(kubeanclusterconfigsResource, name, opts), &v1alpha1.KubeanClusterConfig{})
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeKubeanClusterConfigs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewRootDeleteCollectionAction(kubeanclusterconfigsResource, listOpts)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.KubeanClusterConfigList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched kubeanClusterConfig.
+func (c *FakeKubeanClusterConfigs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootPatchSubresourceAction(kubeanclusterconfigsResource, name, pt, data, subresources...), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion_client.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
similarity index 60%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion_client.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
index 39ec0680b..f20526904 100644
--- a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion_client.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
@@ -5,15 +5,15 @@ package fake
 import (
 	rest "k8s.io/client-go/rest"
 	testing "k8s.io/client-go/testing"
-	v1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1"
+	v1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
 )
 
 type FakeKubeanV1alpha1 struct {
 	*testing.Fake
 }
 
-func (c *FakeKubeanV1alpha1) KuBeanComponentsVersions() v1alpha1.KuBeanComponentsVersionInterface {
-	return &FakeKuBeanComponentsVersions{c}
+func (c *FakeKubeanV1alpha1) KubeanClusterConfigs() v1alpha1.KubeanClusterConfigInterface {
+	return &FakeKubeanClusterConfigs{c}
 }
 
 // RESTClient returns a RESTClient that is used to communicate
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/generated_expansion.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
similarity index 56%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/generated_expansion.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
index bdae433b2..f9e6297b1 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/generated_expansion.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
@@ -2,4 +2,4 @@
 
 package v1alpha1
 
-type KuBeanComponentsVersionExpansion interface{}
+type KubeanClusterConfigExpansion interface{}
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
new file mode 100644
index 000000000..2bd59bfac
--- /dev/null
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
@@ -0,0 +1,168 @@
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"context"
+	"time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	scheme "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme"
+)
+
+// KubeanClusterConfigsGetter has a method to return a KubeanClusterConfigInterface.
+// A group's client should implement this interface.
+type KubeanClusterConfigsGetter interface {
+	KubeanClusterConfigs() KubeanClusterConfigInterface
+}
+
+// KubeanClusterConfigInterface has methods to work with KubeanClusterConfig resources.
+type KubeanClusterConfigInterface interface {
+	Create(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.CreateOptions) (*v1alpha1.KubeanClusterConfig, error)
+	Update(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (*v1alpha1.KubeanClusterConfig, error)
+	UpdateStatus(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (*v1alpha1.KubeanClusterConfig, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.KubeanClusterConfig, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.KubeanClusterConfigList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanClusterConfig, err error)
+	KubeanClusterConfigExpansion
+}
+
+// kubeanClusterConfigs implements KubeanClusterConfigInterface
+type kubeanClusterConfigs struct {
+	client rest.Interface
+}
+
+// newKubeanClusterConfigs returns a KubeanClusterConfigs
+func newKubeanClusterConfigs(c *KubeanV1alpha1Client) *kubeanClusterConfigs {
+	return &kubeanClusterConfigs{
+		client: c.RESTClient(),
+	}
+}
+
+// Get takes name of the kubeanClusterConfig, and returns the corresponding kubeanClusterConfig object, and an error if there is any.
+func (c *kubeanClusterConfigs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Get().
+		Resource("kubeanclusterconfigs").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of KubeanClusterConfigs that match those selectors.
+func (c *kubeanClusterConfigs) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanClusterConfigList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.KubeanClusterConfigList{}
+	err = c.client.Get().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested kubeanClusterConfigs.
+func (c *kubeanClusterConfigs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch(ctx)
+}
+
+// Create takes the representation of a kubeanClusterConfig and creates it.  Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *kubeanClusterConfigs) Create(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.CreateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Post().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanClusterConfig).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Update takes the representation of a kubeanClusterConfig and updates it. Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *kubeanClusterConfigs) Update(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Put().
+		Resource("kubeanclusterconfigs").
+		Name(kubeanClusterConfig.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanClusterConfig).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *kubeanClusterConfigs) UpdateStatus(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Put().
+		Resource("kubeanclusterconfigs").
+		Name(kubeanClusterConfig.Name).
+		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanClusterConfig).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Delete takes name of the kubeanClusterConfig and deletes it. Returns an error if one occurs.
+func (c *kubeanClusterConfigs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return c.client.Delete().
+		Resource("kubeanclusterconfigs").
+		Name(name).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *kubeanClusterConfigs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	var timeout time.Duration
+	if listOpts.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&listOpts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// Patch applies the patch and returns the patched kubeanClusterConfig.
+func (c *kubeanClusterConfigs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Patch(pt).
+		Resource("kubeanclusterconfigs").
+		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(data).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion_client.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
similarity index 88%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion_client.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
index cc4569a2b..4852f2ea6 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion_client.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
@@ -6,13 +6,13 @@ import (
 	"net/http"
 
 	rest "k8s.io/client-go/rest"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-	"kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	"kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme"
 )
 
 type KubeanV1alpha1Interface interface {
 	RESTClient() rest.Interface
-	KuBeanComponentsVersionsGetter
+	KubeanClusterConfigsGetter
 }
 
 // KubeanV1alpha1Client is used to interact with features provided by the kubean.io group.
@@ -20,8 +20,8 @@ type KubeanV1alpha1Client struct {
 	restClient rest.Interface
 }
 
-func (c *KubeanV1alpha1Client) KuBeanComponentsVersions() KuBeanComponentsVersionInterface {
-	return newKuBeanComponentsVersions(c)
+func (c *KubeanV1alpha1Client) KubeanClusterConfigs() KubeanClusterConfigInterface {
+	return newKubeanClusterConfigs(c)
 }
 
 // NewForConfig creates a new KubeanV1alpha1Client for the given config.
diff --git a/api/generated/kubeancomponentsversion/informers/externalversions/factory.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/factory.go
similarity index 91%
rename from api/generated/kubeancomponentsversion/informers/externalversions/factory.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/factory.go
index e9e7077ec..a6b922347 100644
--- a/api/generated/kubeancomponentsversion/informers/externalversions/factory.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/factory.go
@@ -11,9 +11,9 @@ import (
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	cache "k8s.io/client-go/tools/cache"
-	versioned "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
-	internalinterfaces "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces"
-	kubeancomponentsversion "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion"
+	versioned "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
+	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
+	kubeanclusterconfig "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig"
 )
 
 // SharedInformerOption defines the functional option type for SharedInformerFactory.
@@ -156,9 +156,9 @@ type SharedInformerFactory interface {
 	ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
 	WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
 
-	Kubean() kubeancomponentsversion.Interface
+	Kubean() kubeanclusterconfig.Interface
 }
 
-func (f *sharedInformerFactory) Kubean() kubeancomponentsversion.Interface {
-	return kubeancomponentsversion.New(f, f.namespace, f.tweakListOptions)
+func (f *sharedInformerFactory) Kubean() kubeanclusterconfig.Interface {
+	return kubeanclusterconfig.New(f, f.namespace, f.tweakListOptions)
 }
diff --git a/api/generated/kubeancomponentsversion/informers/externalversions/generic.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/generic.go
similarity index 85%
rename from api/generated/kubeancomponentsversion/informers/externalversions/generic.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/generic.go
index 65faf01c8..978d3d400 100644
--- a/api/generated/kubeancomponentsversion/informers/externalversions/generic.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/generic.go
@@ -7,7 +7,7 @@ import (
 
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	cache "k8s.io/client-go/tools/cache"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 )
 
 // GenericInformer is type of SharedIndexInformer which will locate and delegate to other
@@ -37,8 +37,8 @@ func (f *genericInformer) Lister() cache.GenericLister {
 func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) {
 	switch resource {
 	// Group=kubean.io, Version=v1alpha1
-	case v1alpha1.SchemeGroupVersion.WithResource("kubeancomponentsversions"):
-		return &genericInformer{resource: resource.GroupResource(), informer: f.Kubean().V1alpha1().KuBeanComponentsVersions().Informer()}, nil
+	case v1alpha1.SchemeGroupVersion.WithResource("kubeanclusterconfigs"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Kubean().V1alpha1().KubeanClusterConfigs().Informer()}, nil
 
 	}
 
diff --git a/api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces/factory_interfaces.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go
similarity index 90%
rename from api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces/factory_interfaces.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go
index 738ad4f44..247fb7ef2 100644
--- a/api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces/factory_interfaces.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go
@@ -8,7 +8,7 @@ import (
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	cache "k8s.io/client-go/tools/cache"
-	versioned "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
+	versioned "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
 )
 
 // NewInformerFunc takes versioned.Interface and time.Duration to return a SharedIndexInformer.
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/interface.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go
similarity index 76%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/interface.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go
index 11fba68fc..71b060e93 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/interface.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go
@@ -1,10 +1,10 @@
 // Code generated by informer-gen. DO NOT EDIT.
 
-package kubeancomponentsversion
+package kubeanclusterconfig
 
 import (
-	internalinterfaces "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces"
-	v1alpha1 "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1"
+	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
+	v1alpha1 "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1"
 )
 
 // Interface provides access to each of this group's versions.
diff --git a/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/interface.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go
similarity index 55%
rename from api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/interface.go
rename to api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go
index b5f6cfe30..16d231895 100644
--- a/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/interface.go
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go
@@ -3,13 +3,13 @@
 package v1alpha1
 
 import (
-	internalinterfaces "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces"
+	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
 )
 
 // Interface provides access to all the informers in this group version.
 type Interface interface {
-	// KuBeanComponentsVersions returns a KuBeanComponentsVersionInformer.
-	KuBeanComponentsVersions() KuBeanComponentsVersionInformer
+	// KubeanClusterConfigs returns a KubeanClusterConfigInformer.
+	KubeanClusterConfigs() KubeanClusterConfigInformer
 }
 
 type version struct {
@@ -23,7 +23,7 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList
 	return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
 }
 
-// KuBeanComponentsVersions returns a KuBeanComponentsVersionInformer.
-func (v *version) KuBeanComponentsVersions() KuBeanComponentsVersionInformer {
-	return &kuBeanComponentsVersionInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
+// KubeanClusterConfigs returns a KubeanClusterConfigInformer.
+func (v *version) KubeanClusterConfigs() KubeanClusterConfigInformer {
+	return &kubeanClusterConfigInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
 }
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
new file mode 100644
index 000000000..fcf9d8a89
--- /dev/null
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
@@ -0,0 +1,73 @@
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"context"
+	time "time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	watch "k8s.io/apimachinery/pkg/watch"
+	cache "k8s.io/client-go/tools/cache"
+	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	versioned "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
+	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
+	v1alpha1 "kubean.io/api/generated/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1"
+)
+
+// KubeanClusterConfigInformer provides access to a shared informer and lister for
+// KubeanClusterConfigs.
+type KubeanClusterConfigInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() v1alpha1.KubeanClusterConfigLister
+}
+
+type kubeanClusterConfigInformer struct {
+	factory          internalinterfaces.SharedInformerFactory
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+}
+
+// NewKubeanClusterConfigInformer constructs a new informer for KubeanClusterConfig type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewKubeanClusterConfigInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredKubeanClusterConfigInformer(client, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredKubeanClusterConfigInformer constructs a new informer for KubeanClusterConfig type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewFilteredKubeanClusterConfigInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
+	return cache.NewSharedIndexInformer(
+		&cache.ListWatch{
+			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.KubeanV1alpha1().KubeanClusterConfigs().List(context.TODO(), options)
+			},
+			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.KubeanV1alpha1().KubeanClusterConfigs().Watch(context.TODO(), options)
+			},
+		},
+		&kubeanclusterconfigv1alpha1.KubeanClusterConfig{},
+		resyncPeriod,
+		indexers,
+	)
+}
+
+func (f *kubeanClusterConfigInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+	return NewFilteredKubeanClusterConfigInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *kubeanClusterConfigInformer) Informer() cache.SharedIndexInformer {
+	return f.factory.InformerFor(&kubeanclusterconfigv1alpha1.KubeanClusterConfig{}, f.defaultInformer)
+}
+
+func (f *kubeanClusterConfigInformer) Lister() v1alpha1.KubeanClusterConfigLister {
+	return v1alpha1.NewKubeanClusterConfigLister(f.Informer().GetIndexer())
+}
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/expansion_generated.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/expansion_generated.go
new file mode 100644
index 000000000..9bd849fc6
--- /dev/null
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/expansion_generated.go
@@ -0,0 +1,7 @@
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+// KubeanClusterConfigListerExpansion allows custom methods to be added to
+// KubeanClusterConfigLister.
+type KubeanClusterConfigListerExpansion interface{}
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
new file mode 100644
index 000000000..04e2af0aa
--- /dev/null
+++ b/api/generated/kubeanclusterconfig/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
@@ -0,0 +1,52 @@
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/client-go/tools/cache"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+)
+
+// KubeanClusterConfigLister helps list KubeanClusterConfigs.
+// All objects returned here must be treated as read-only.
+type KubeanClusterConfigLister interface {
+	// List lists all KubeanClusterConfigs in the indexer.
+	// Objects returned here must be treated as read-only.
+	List(selector labels.Selector) (ret []*v1alpha1.KubeanClusterConfig, err error)
+	// Get retrieves the KubeanClusterConfig from the index for a given name.
+	// Objects returned here must be treated as read-only.
+	Get(name string) (*v1alpha1.KubeanClusterConfig, error)
+	KubeanClusterConfigListerExpansion
+}
+
+// kubeanClusterConfigLister implements the KubeanClusterConfigLister interface.
+type kubeanClusterConfigLister struct {
+	indexer cache.Indexer
+}
+
+// NewKubeanClusterConfigLister returns a new KubeanClusterConfigLister.
+func NewKubeanClusterConfigLister(indexer cache.Indexer) KubeanClusterConfigLister {
+	return &kubeanClusterConfigLister{indexer: indexer}
+}
+
+// List lists all KubeanClusterConfigs in the indexer.
+func (s *kubeanClusterConfigLister) List(selector labels.Selector) (ret []*v1alpha1.KubeanClusterConfig, err error) {
+	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.KubeanClusterConfig))
+	})
+	return ret, err
+}
+
+// Get retrieves the KubeanClusterConfig from the index for a given name.
+func (s *kubeanClusterConfigLister) Get(name string) (*v1alpha1.KubeanClusterConfig, error) {
+	obj, exists, err := s.indexer.GetByKey(name)
+	if err != nil {
+		return nil, err
+	}
+	if !exists {
+		return nil, errors.NewNotFound(v1alpha1.Resource("kubeanclusterconfig"), name)
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), nil
+}
diff --git a/api/generated/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/expansion_generated.go b/api/generated/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/expansion_generated.go
new file mode 100644
index 000000000..9bd849fc6
--- /dev/null
+++ b/api/generated/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/expansion_generated.go
@@ -0,0 +1,7 @@
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+// KubeanClusterConfigListerExpansion allows custom methods to be added to
+// KubeanClusterConfigLister.
+type KubeanClusterConfigListerExpansion interface{}
diff --git a/api/generated/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
new file mode 100644
index 000000000..04e2af0aa
--- /dev/null
+++ b/api/generated/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
@@ -0,0 +1,52 @@
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/client-go/tools/cache"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+)
+
+// KubeanClusterConfigLister helps list KubeanClusterConfigs.
+// All objects returned here must be treated as read-only.
+type KubeanClusterConfigLister interface {
+	// List lists all KubeanClusterConfigs in the indexer.
+	// Objects returned here must be treated as read-only.
+	List(selector labels.Selector) (ret []*v1alpha1.KubeanClusterConfig, err error)
+	// Get retrieves the KubeanClusterConfig from the index for a given name.
+	// Objects returned here must be treated as read-only.
+	Get(name string) (*v1alpha1.KubeanClusterConfig, error)
+	KubeanClusterConfigListerExpansion
+}
+
+// kubeanClusterConfigLister implements the KubeanClusterConfigLister interface.
+type kubeanClusterConfigLister struct {
+	indexer cache.Indexer
+}
+
+// NewKubeanClusterConfigLister returns a new KubeanClusterConfigLister.
+func NewKubeanClusterConfigLister(indexer cache.Indexer) KubeanClusterConfigLister {
+	return &kubeanClusterConfigLister{indexer: indexer}
+}
+
+// List lists all KubeanClusterConfigs in the indexer.
+func (s *kubeanClusterConfigLister) List(selector labels.Selector) (ret []*v1alpha1.KubeanClusterConfig, err error) {
+	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.KubeanClusterConfig))
+	})
+	return ret, err
+}
+
+// Get retrieves the KubeanClusterConfig from the index for a given name.
+func (s *kubeanClusterConfigLister) Get(name string) (*v1alpha1.KubeanClusterConfig, error) {
+	obj, exists, err := s.indexer.GetByKey(name)
+	if err != nil {
+		return nil, err
+	}
+	if !exists {
+		return nil, errors.NewNotFound(v1alpha1.Resource("kubeanclusterconfig"), name)
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), nil
+}
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion.go b/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion.go
deleted file mode 100644
index 51490112e..000000000
--- a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Code generated by client-gen. DO NOT EDIT.
-
-package fake
-
-import (
-	"context"
-
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	labels "k8s.io/apimachinery/pkg/labels"
-	schema "k8s.io/apimachinery/pkg/runtime/schema"
-	types "k8s.io/apimachinery/pkg/types"
-	watch "k8s.io/apimachinery/pkg/watch"
-	testing "k8s.io/client-go/testing"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-)
-
-// FakeKuBeanComponentsVersions implements KuBeanComponentsVersionInterface
-type FakeKuBeanComponentsVersions struct {
-	Fake *FakeKubeanV1alpha1
-}
-
-var kubeancomponentsversionsResource = schema.GroupVersionResource{Group: "kubean.io", Version: "v1alpha1", Resource: "kubeancomponentsversions"}
-
-var kubeancomponentsversionsKind = schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KuBeanComponentsVersion"}
-
-// Get takes name of the kuBeanComponentsVersion, and returns the corresponding kuBeanComponentsVersion object, and an error if there is any.
-func (c *FakeKuBeanComponentsVersions) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootGetAction(kubeancomponentsversionsResource, name), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// List takes label and field selectors, and returns the list of KuBeanComponentsVersions that match those selectors.
-func (c *FakeKuBeanComponentsVersions) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KuBeanComponentsVersionList, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootListAction(kubeancomponentsversionsResource, kubeancomponentsversionsKind, opts), &v1alpha1.KuBeanComponentsVersionList{})
-	if obj == nil {
-		return nil, err
-	}
-
-	label, _, _ := testing.ExtractFromListOptions(opts)
-	if label == nil {
-		label = labels.Everything()
-	}
-	list := &v1alpha1.KuBeanComponentsVersionList{ListMeta: obj.(*v1alpha1.KuBeanComponentsVersionList).ListMeta}
-	for _, item := range obj.(*v1alpha1.KuBeanComponentsVersionList).Items {
-		if label.Matches(labels.Set(item.Labels)) {
-			list.Items = append(list.Items, item)
-		}
-	}
-	return list, err
-}
-
-// Watch returns a watch.Interface that watches the requested kuBeanComponentsVersions.
-func (c *FakeKuBeanComponentsVersions) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
-	return c.Fake.
-		InvokesWatch(testing.NewRootWatchAction(kubeancomponentsversionsResource, opts))
-}
-
-// Create takes the representation of a kuBeanComponentsVersion and creates it.  Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *FakeKuBeanComponentsVersions) Create(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.CreateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootCreateAction(kubeancomponentsversionsResource, kuBeanComponentsVersion), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// Update takes the representation of a kuBeanComponentsVersion and updates it. Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *FakeKuBeanComponentsVersions) Update(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootUpdateAction(kubeancomponentsversionsResource, kuBeanComponentsVersion), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// UpdateStatus was generated because the type contains a Status member.
-// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *FakeKuBeanComponentsVersions) UpdateStatus(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (*v1alpha1.KuBeanComponentsVersion, error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootUpdateSubresourceAction(kubeancomponentsversionsResource, "status", kuBeanComponentsVersion), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// Delete takes name of the kuBeanComponentsVersion and deletes it. Returns an error if one occurs.
-func (c *FakeKuBeanComponentsVersions) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
-	_, err := c.Fake.
-		Invokes(testing.NewRootDeleteActionWithOptions(kubeancomponentsversionsResource, name, opts), &v1alpha1.KuBeanComponentsVersion{})
-	return err
-}
-
-// DeleteCollection deletes a collection of objects.
-func (c *FakeKuBeanComponentsVersions) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
-	action := testing.NewRootDeleteCollectionAction(kubeancomponentsversionsResource, listOpts)
-
-	_, err := c.Fake.Invokes(action, &v1alpha1.KuBeanComponentsVersionList{})
-	return err
-}
-
-// Patch applies the patch and returns the patched kuBeanComponentsVersion.
-func (c *FakeKuBeanComponentsVersions) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootPatchSubresourceAction(kubeancomponentsversionsResource, name, pt, data, subresources...), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
diff --git a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go b/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
deleted file mode 100644
index 21807bf8e..000000000
--- a/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Code generated by client-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	"context"
-	"time"
-
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	types "k8s.io/apimachinery/pkg/types"
-	watch "k8s.io/apimachinery/pkg/watch"
-	rest "k8s.io/client-go/rest"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-	scheme "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme"
-)
-
-// KuBeanComponentsVersionsGetter has a method to return a KuBeanComponentsVersionInterface.
-// A group's client should implement this interface.
-type KuBeanComponentsVersionsGetter interface {
-	KuBeanComponentsVersions() KuBeanComponentsVersionInterface
-}
-
-// KuBeanComponentsVersionInterface has methods to work with KuBeanComponentsVersion resources.
-type KuBeanComponentsVersionInterface interface {
-	Create(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.CreateOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	Update(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	UpdateStatus(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
-	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
-	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.KuBeanComponentsVersionList, error)
-	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
-	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KuBeanComponentsVersion, err error)
-	KuBeanComponentsVersionExpansion
-}
-
-// kuBeanComponentsVersions implements KuBeanComponentsVersionInterface
-type kuBeanComponentsVersions struct {
-	client rest.Interface
-}
-
-// newKuBeanComponentsVersions returns a KuBeanComponentsVersions
-func newKuBeanComponentsVersions(c *KubeanV1alpha1Client) *kuBeanComponentsVersions {
-	return &kuBeanComponentsVersions{
-		client: c.RESTClient(),
-	}
-}
-
-// Get takes name of the kuBeanComponentsVersion, and returns the corresponding kuBeanComponentsVersion object, and an error if there is any.
-func (c *kuBeanComponentsVersions) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Get().
-		Resource("kubeancomponentsversions").
-		Name(name).
-		VersionedParams(&options, scheme.ParameterCodec).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// List takes label and field selectors, and returns the list of KuBeanComponentsVersions that match those selectors.
-func (c *kuBeanComponentsVersions) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KuBeanComponentsVersionList, err error) {
-	var timeout time.Duration
-	if opts.TimeoutSeconds != nil {
-		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
-	}
-	result = &v1alpha1.KuBeanComponentsVersionList{}
-	err = c.client.Get().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// Watch returns a watch.Interface that watches the requested kuBeanComponentsVersions.
-func (c *kuBeanComponentsVersions) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
-	var timeout time.Duration
-	if opts.TimeoutSeconds != nil {
-		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
-	}
-	opts.Watch = true
-	return c.client.Get().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Watch(ctx)
-}
-
-// Create takes the representation of a kuBeanComponentsVersion and creates it.  Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *kuBeanComponentsVersions) Create(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.CreateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Post().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(kuBeanComponentsVersion).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// Update takes the representation of a kuBeanComponentsVersion and updates it. Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *kuBeanComponentsVersions) Update(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Put().
-		Resource("kubeancomponentsversions").
-		Name(kuBeanComponentsVersion.Name).
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(kuBeanComponentsVersion).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// UpdateStatus was generated because the type contains a Status member.
-// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *kuBeanComponentsVersions) UpdateStatus(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Put().
-		Resource("kubeancomponentsversions").
-		Name(kuBeanComponentsVersion.Name).
-		SubResource("status").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(kuBeanComponentsVersion).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// Delete takes name of the kuBeanComponentsVersion and deletes it. Returns an error if one occurs.
-func (c *kuBeanComponentsVersions) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
-	return c.client.Delete().
-		Resource("kubeancomponentsversions").
-		Name(name).
-		Body(&opts).
-		Do(ctx).
-		Error()
-}
-
-// DeleteCollection deletes a collection of objects.
-func (c *kuBeanComponentsVersions) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
-	var timeout time.Duration
-	if listOpts.TimeoutSeconds != nil {
-		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
-	}
-	return c.client.Delete().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&listOpts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Body(&opts).
-		Do(ctx).
-		Error()
-}
-
-// Patch applies the patch and returns the patched kuBeanComponentsVersion.
-func (c *kuBeanComponentsVersions) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Patch(pt).
-		Resource("kubeancomponentsversions").
-		Name(name).
-		SubResource(subresources...).
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(data).
-		Do(ctx).
-		Into(result)
-	return
-}
diff --git a/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go b/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
deleted file mode 100644
index 6f2f36dba..000000000
--- a/api/generated/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Code generated by informer-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	"context"
-	time "time"
-
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	runtime "k8s.io/apimachinery/pkg/runtime"
-	watch "k8s.io/apimachinery/pkg/watch"
-	cache "k8s.io/client-go/tools/cache"
-	kubeancomponentsversionv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-	versioned "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
-	internalinterfaces "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces"
-	v1alpha1 "kubean.io/api/generated/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1"
-)
-
-// KuBeanComponentsVersionInformer provides access to a shared informer and lister for
-// KuBeanComponentsVersions.
-type KuBeanComponentsVersionInformer interface {
-	Informer() cache.SharedIndexInformer
-	Lister() v1alpha1.KuBeanComponentsVersionLister
-}
-
-type kuBeanComponentsVersionInformer struct {
-	factory          internalinterfaces.SharedInformerFactory
-	tweakListOptions internalinterfaces.TweakListOptionsFunc
-}
-
-// NewKuBeanComponentsVersionInformer constructs a new informer for KuBeanComponentsVersion type.
-// Always prefer using an informer factory to get a shared informer instead of getting an independent
-// one. This reduces memory footprint and number of connections to the server.
-func NewKuBeanComponentsVersionInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
-	return NewFilteredKuBeanComponentsVersionInformer(client, resyncPeriod, indexers, nil)
-}
-
-// NewFilteredKuBeanComponentsVersionInformer constructs a new informer for KuBeanComponentsVersion type.
-// Always prefer using an informer factory to get a shared informer instead of getting an independent
-// one. This reduces memory footprint and number of connections to the server.
-func NewFilteredKuBeanComponentsVersionInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
-	return cache.NewSharedIndexInformer(
-		&cache.ListWatch{
-			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
-				if tweakListOptions != nil {
-					tweakListOptions(&options)
-				}
-				return client.KubeanV1alpha1().KuBeanComponentsVersions().List(context.TODO(), options)
-			},
-			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
-				if tweakListOptions != nil {
-					tweakListOptions(&options)
-				}
-				return client.KubeanV1alpha1().KuBeanComponentsVersions().Watch(context.TODO(), options)
-			},
-		},
-		&kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{},
-		resyncPeriod,
-		indexers,
-	)
-}
-
-func (f *kuBeanComponentsVersionInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
-	return NewFilteredKuBeanComponentsVersionInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
-}
-
-func (f *kuBeanComponentsVersionInformer) Informer() cache.SharedIndexInformer {
-	return f.factory.InformerFor(&kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{}, f.defaultInformer)
-}
-
-func (f *kuBeanComponentsVersionInformer) Lister() v1alpha1.KuBeanComponentsVersionLister {
-	return v1alpha1.NewKuBeanComponentsVersionLister(f.Informer().GetIndexer())
-}
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion.go b/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion.go
deleted file mode 100644
index 51490112e..000000000
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Code generated by client-gen. DO NOT EDIT.
-
-package fake
-
-import (
-	"context"
-
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	labels "k8s.io/apimachinery/pkg/labels"
-	schema "k8s.io/apimachinery/pkg/runtime/schema"
-	types "k8s.io/apimachinery/pkg/types"
-	watch "k8s.io/apimachinery/pkg/watch"
-	testing "k8s.io/client-go/testing"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-)
-
-// FakeKuBeanComponentsVersions implements KuBeanComponentsVersionInterface
-type FakeKuBeanComponentsVersions struct {
-	Fake *FakeKubeanV1alpha1
-}
-
-var kubeancomponentsversionsResource = schema.GroupVersionResource{Group: "kubean.io", Version: "v1alpha1", Resource: "kubeancomponentsversions"}
-
-var kubeancomponentsversionsKind = schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KuBeanComponentsVersion"}
-
-// Get takes name of the kuBeanComponentsVersion, and returns the corresponding kuBeanComponentsVersion object, and an error if there is any.
-func (c *FakeKuBeanComponentsVersions) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootGetAction(kubeancomponentsversionsResource, name), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// List takes label and field selectors, and returns the list of KuBeanComponentsVersions that match those selectors.
-func (c *FakeKuBeanComponentsVersions) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KuBeanComponentsVersionList, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootListAction(kubeancomponentsversionsResource, kubeancomponentsversionsKind, opts), &v1alpha1.KuBeanComponentsVersionList{})
-	if obj == nil {
-		return nil, err
-	}
-
-	label, _, _ := testing.ExtractFromListOptions(opts)
-	if label == nil {
-		label = labels.Everything()
-	}
-	list := &v1alpha1.KuBeanComponentsVersionList{ListMeta: obj.(*v1alpha1.KuBeanComponentsVersionList).ListMeta}
-	for _, item := range obj.(*v1alpha1.KuBeanComponentsVersionList).Items {
-		if label.Matches(labels.Set(item.Labels)) {
-			list.Items = append(list.Items, item)
-		}
-	}
-	return list, err
-}
-
-// Watch returns a watch.Interface that watches the requested kuBeanComponentsVersions.
-func (c *FakeKuBeanComponentsVersions) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
-	return c.Fake.
-		InvokesWatch(testing.NewRootWatchAction(kubeancomponentsversionsResource, opts))
-}
-
-// Create takes the representation of a kuBeanComponentsVersion and creates it.  Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *FakeKuBeanComponentsVersions) Create(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.CreateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootCreateAction(kubeancomponentsversionsResource, kuBeanComponentsVersion), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// Update takes the representation of a kuBeanComponentsVersion and updates it. Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *FakeKuBeanComponentsVersions) Update(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootUpdateAction(kubeancomponentsversionsResource, kuBeanComponentsVersion), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// UpdateStatus was generated because the type contains a Status member.
-// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *FakeKuBeanComponentsVersions) UpdateStatus(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (*v1alpha1.KuBeanComponentsVersion, error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootUpdateSubresourceAction(kubeancomponentsversionsResource, "status", kuBeanComponentsVersion), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// Delete takes name of the kuBeanComponentsVersion and deletes it. Returns an error if one occurs.
-func (c *FakeKuBeanComponentsVersions) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
-	_, err := c.Fake.
-		Invokes(testing.NewRootDeleteActionWithOptions(kubeancomponentsversionsResource, name, opts), &v1alpha1.KuBeanComponentsVersion{})
-	return err
-}
-
-// DeleteCollection deletes a collection of objects.
-func (c *FakeKuBeanComponentsVersions) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
-	action := testing.NewRootDeleteCollectionAction(kubeancomponentsversionsResource, listOpts)
-
-	_, err := c.Fake.Invokes(action, &v1alpha1.KuBeanComponentsVersionList{})
-	return err
-}
-
-// Patch applies the patch and returns the patched kuBeanComponentsVersion.
-func (c *FakeKuBeanComponentsVersions) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootPatchSubresourceAction(kubeancomponentsversionsResource, name, pt, data, subresources...), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go b/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
deleted file mode 100644
index 21807bf8e..000000000
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Code generated by client-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	"context"
-	"time"
-
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	types "k8s.io/apimachinery/pkg/types"
-	watch "k8s.io/apimachinery/pkg/watch"
-	rest "k8s.io/client-go/rest"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-	scheme "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme"
-)
-
-// KuBeanComponentsVersionsGetter has a method to return a KuBeanComponentsVersionInterface.
-// A group's client should implement this interface.
-type KuBeanComponentsVersionsGetter interface {
-	KuBeanComponentsVersions() KuBeanComponentsVersionInterface
-}
-
-// KuBeanComponentsVersionInterface has methods to work with KuBeanComponentsVersion resources.
-type KuBeanComponentsVersionInterface interface {
-	Create(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.CreateOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	Update(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	UpdateStatus(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
-	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
-	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.KuBeanComponentsVersionList, error)
-	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
-	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KuBeanComponentsVersion, err error)
-	KuBeanComponentsVersionExpansion
-}
-
-// kuBeanComponentsVersions implements KuBeanComponentsVersionInterface
-type kuBeanComponentsVersions struct {
-	client rest.Interface
-}
-
-// newKuBeanComponentsVersions returns a KuBeanComponentsVersions
-func newKuBeanComponentsVersions(c *KubeanV1alpha1Client) *kuBeanComponentsVersions {
-	return &kuBeanComponentsVersions{
-		client: c.RESTClient(),
-	}
-}
-
-// Get takes name of the kuBeanComponentsVersion, and returns the corresponding kuBeanComponentsVersion object, and an error if there is any.
-func (c *kuBeanComponentsVersions) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Get().
-		Resource("kubeancomponentsversions").
-		Name(name).
-		VersionedParams(&options, scheme.ParameterCodec).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// List takes label and field selectors, and returns the list of KuBeanComponentsVersions that match those selectors.
-func (c *kuBeanComponentsVersions) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KuBeanComponentsVersionList, err error) {
-	var timeout time.Duration
-	if opts.TimeoutSeconds != nil {
-		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
-	}
-	result = &v1alpha1.KuBeanComponentsVersionList{}
-	err = c.client.Get().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// Watch returns a watch.Interface that watches the requested kuBeanComponentsVersions.
-func (c *kuBeanComponentsVersions) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
-	var timeout time.Duration
-	if opts.TimeoutSeconds != nil {
-		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
-	}
-	opts.Watch = true
-	return c.client.Get().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Watch(ctx)
-}
-
-// Create takes the representation of a kuBeanComponentsVersion and creates it.  Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *kuBeanComponentsVersions) Create(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.CreateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Post().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(kuBeanComponentsVersion).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// Update takes the representation of a kuBeanComponentsVersion and updates it. Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *kuBeanComponentsVersions) Update(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Put().
-		Resource("kubeancomponentsversions").
-		Name(kuBeanComponentsVersion.Name).
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(kuBeanComponentsVersion).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// UpdateStatus was generated because the type contains a Status member.
-// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *kuBeanComponentsVersions) UpdateStatus(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Put().
-		Resource("kubeancomponentsversions").
-		Name(kuBeanComponentsVersion.Name).
-		SubResource("status").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(kuBeanComponentsVersion).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// Delete takes name of the kuBeanComponentsVersion and deletes it. Returns an error if one occurs.
-func (c *kuBeanComponentsVersions) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
-	return c.client.Delete().
-		Resource("kubeancomponentsversions").
-		Name(name).
-		Body(&opts).
-		Do(ctx).
-		Error()
-}
-
-// DeleteCollection deletes a collection of objects.
-func (c *kuBeanComponentsVersions) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
-	var timeout time.Duration
-	if listOpts.TimeoutSeconds != nil {
-		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
-	}
-	return c.client.Delete().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&listOpts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Body(&opts).
-		Do(ctx).
-		Error()
-}
-
-// Patch applies the patch and returns the patched kuBeanComponentsVersion.
-func (c *kuBeanComponentsVersions) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Patch(pt).
-		Resource("kubeancomponentsversions").
-		Name(name).
-		SubResource(subresources...).
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(data).
-		Do(ctx).
-		Into(result)
-	return
-}
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go b/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
deleted file mode 100644
index 6f2f36dba..000000000
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/informers/externalversions/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Code generated by informer-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	"context"
-	time "time"
-
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	runtime "k8s.io/apimachinery/pkg/runtime"
-	watch "k8s.io/apimachinery/pkg/watch"
-	cache "k8s.io/client-go/tools/cache"
-	kubeancomponentsversionv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-	versioned "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
-	internalinterfaces "kubean.io/api/generated/kubeancomponentsversion/informers/externalversions/internalinterfaces"
-	v1alpha1 "kubean.io/api/generated/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1"
-)
-
-// KuBeanComponentsVersionInformer provides access to a shared informer and lister for
-// KuBeanComponentsVersions.
-type KuBeanComponentsVersionInformer interface {
-	Informer() cache.SharedIndexInformer
-	Lister() v1alpha1.KuBeanComponentsVersionLister
-}
-
-type kuBeanComponentsVersionInformer struct {
-	factory          internalinterfaces.SharedInformerFactory
-	tweakListOptions internalinterfaces.TweakListOptionsFunc
-}
-
-// NewKuBeanComponentsVersionInformer constructs a new informer for KuBeanComponentsVersion type.
-// Always prefer using an informer factory to get a shared informer instead of getting an independent
-// one. This reduces memory footprint and number of connections to the server.
-func NewKuBeanComponentsVersionInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
-	return NewFilteredKuBeanComponentsVersionInformer(client, resyncPeriod, indexers, nil)
-}
-
-// NewFilteredKuBeanComponentsVersionInformer constructs a new informer for KuBeanComponentsVersion type.
-// Always prefer using an informer factory to get a shared informer instead of getting an independent
-// one. This reduces memory footprint and number of connections to the server.
-func NewFilteredKuBeanComponentsVersionInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
-	return cache.NewSharedIndexInformer(
-		&cache.ListWatch{
-			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
-				if tweakListOptions != nil {
-					tweakListOptions(&options)
-				}
-				return client.KubeanV1alpha1().KuBeanComponentsVersions().List(context.TODO(), options)
-			},
-			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
-				if tweakListOptions != nil {
-					tweakListOptions(&options)
-				}
-				return client.KubeanV1alpha1().KuBeanComponentsVersions().Watch(context.TODO(), options)
-			},
-		},
-		&kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{},
-		resyncPeriod,
-		indexers,
-	)
-}
-
-func (f *kuBeanComponentsVersionInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
-	return NewFilteredKuBeanComponentsVersionInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
-}
-
-func (f *kuBeanComponentsVersionInformer) Informer() cache.SharedIndexInformer {
-	return f.factory.InformerFor(&kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{}, f.defaultInformer)
-}
-
-func (f *kuBeanComponentsVersionInformer) Lister() v1alpha1.KuBeanComponentsVersionLister {
-	return v1alpha1.NewKuBeanComponentsVersionLister(f.Informer().GetIndexer())
-}
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/expansion_generated.go b/api/generated/kubeancomponentsversion/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/expansion_generated.go
deleted file mode 100644
index 868f43779..000000000
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/expansion_generated.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Code generated by lister-gen. DO NOT EDIT.
-
-package v1alpha1
-
-// KuBeanComponentsVersionListerExpansion allows custom methods to be added to
-// KuBeanComponentsVersionLister.
-type KuBeanComponentsVersionListerExpansion interface{}
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go b/api/generated/kubeancomponentsversion/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
deleted file mode 100644
index d64b18773..000000000
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Code generated by lister-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	"k8s.io/apimachinery/pkg/api/errors"
-	"k8s.io/apimachinery/pkg/labels"
-	"k8s.io/client-go/tools/cache"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-)
-
-// KuBeanComponentsVersionLister helps list KuBeanComponentsVersions.
-// All objects returned here must be treated as read-only.
-type KuBeanComponentsVersionLister interface {
-	// List lists all KuBeanComponentsVersions in the indexer.
-	// Objects returned here must be treated as read-only.
-	List(selector labels.Selector) (ret []*v1alpha1.KuBeanComponentsVersion, err error)
-	// Get retrieves the KuBeanComponentsVersion from the index for a given name.
-	// Objects returned here must be treated as read-only.
-	Get(name string) (*v1alpha1.KuBeanComponentsVersion, error)
-	KuBeanComponentsVersionListerExpansion
-}
-
-// kuBeanComponentsVersionLister implements the KuBeanComponentsVersionLister interface.
-type kuBeanComponentsVersionLister struct {
-	indexer cache.Indexer
-}
-
-// NewKuBeanComponentsVersionLister returns a new KuBeanComponentsVersionLister.
-func NewKuBeanComponentsVersionLister(indexer cache.Indexer) KuBeanComponentsVersionLister {
-	return &kuBeanComponentsVersionLister{indexer: indexer}
-}
-
-// List lists all KuBeanComponentsVersions in the indexer.
-func (s *kuBeanComponentsVersionLister) List(selector labels.Selector) (ret []*v1alpha1.KuBeanComponentsVersion, err error) {
-	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
-		ret = append(ret, m.(*v1alpha1.KuBeanComponentsVersion))
-	})
-	return ret, err
-}
-
-// Get retrieves the KuBeanComponentsVersion from the index for a given name.
-func (s *kuBeanComponentsVersionLister) Get(name string) (*v1alpha1.KuBeanComponentsVersion, error) {
-	obj, exists, err := s.indexer.GetByKey(name)
-	if err != nil {
-		return nil, err
-	}
-	if !exists {
-		return nil, errors.NewNotFound(v1alpha1.Resource("kubeancomponentsversion"), name)
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), nil
-}
diff --git a/api/generated/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/expansion_generated.go b/api/generated/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/expansion_generated.go
deleted file mode 100644
index 868f43779..000000000
--- a/api/generated/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/expansion_generated.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Code generated by lister-gen. DO NOT EDIT.
-
-package v1alpha1
-
-// KuBeanComponentsVersionListerExpansion allows custom methods to be added to
-// KuBeanComponentsVersionLister.
-type KuBeanComponentsVersionListerExpansion interface{}
diff --git a/api/generated/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go b/api/generated/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
deleted file mode 100644
index d64b18773..000000000
--- a/api/generated/kubeancomponentsversion/listers/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Code generated by lister-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	"k8s.io/apimachinery/pkg/api/errors"
-	"k8s.io/apimachinery/pkg/labels"
-	"k8s.io/client-go/tools/cache"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-)
-
-// KuBeanComponentsVersionLister helps list KuBeanComponentsVersions.
-// All objects returned here must be treated as read-only.
-type KuBeanComponentsVersionLister interface {
-	// List lists all KuBeanComponentsVersions in the indexer.
-	// Objects returned here must be treated as read-only.
-	List(selector labels.Selector) (ret []*v1alpha1.KuBeanComponentsVersion, err error)
-	// Get retrieves the KuBeanComponentsVersion from the index for a given name.
-	// Objects returned here must be treated as read-only.
-	Get(name string) (*v1alpha1.KuBeanComponentsVersion, error)
-	KuBeanComponentsVersionListerExpansion
-}
-
-// kuBeanComponentsVersionLister implements the KuBeanComponentsVersionLister interface.
-type kuBeanComponentsVersionLister struct {
-	indexer cache.Indexer
-}
-
-// NewKuBeanComponentsVersionLister returns a new KuBeanComponentsVersionLister.
-func NewKuBeanComponentsVersionLister(indexer cache.Indexer) KuBeanComponentsVersionLister {
-	return &kuBeanComponentsVersionLister{indexer: indexer}
-}
-
-// List lists all KuBeanComponentsVersions in the indexer.
-func (s *kuBeanComponentsVersionLister) List(selector labels.Selector) (ret []*v1alpha1.KuBeanComponentsVersion, err error) {
-	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
-		ret = append(ret, m.(*v1alpha1.KuBeanComponentsVersion))
-	})
-	return ret, err
-}
-
-// Get retrieves the KuBeanComponentsVersion from the index for a given name.
-func (s *kuBeanComponentsVersionLister) Get(name string) (*v1alpha1.KuBeanComponentsVersion, error) {
-	obj, exists, err := s.indexer.GetByKey(name)
-	if err != nil {
-		return nil, err
-	}
-	if !exists {
-		return nil, errors.NewNotFound(v1alpha1.Resource("kubeancomponentsversion"), name)
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), nil
-}
diff --git a/api/hack/update-all.sh b/api/hack/update-all.sh
index 7fb7a39c1..2d15adcda 100755
--- a/api/hack/update-all.sh
+++ b/api/hack/update-all.sh
@@ -8,8 +8,8 @@ API_REPO_ROOT=$(pwd) ## /.../kubean/api
 
 bash "$API_REPO_ROOT/hack/update-codegen.sh" kubeancluster
 bash "$API_REPO_ROOT/hack/update-codegen.sh" kubeanclusterops
-bash "$API_REPO_ROOT/hack/update-codegen.sh" kubeancomponentsversion
 bash "$API_REPO_ROOT/hack/update-codegen.sh" kubeanofflineversion
+bash "$API_REPO_ROOT/hack/update-codegen.sh" kubeanclusterconfig
 bash "$API_REPO_ROOT/hack/update-crdgen.sh"
 
 go mod tidy
diff --git a/api/charts/_crds/kubean.io_kubeancomponentsversions.yaml b/charts/kubean/_crds/kubean.io_kubeanclusterconfigs.yaml
similarity index 76%
rename from api/charts/_crds/kubean.io_kubeancomponentsversions.yaml
rename to charts/kubean/_crds/kubean.io_kubeanclusterconfigs.yaml
index 5357595b6..a2516834e 100644
--- a/api/charts/_crds/kubean.io_kubeancomponentsversions.yaml
+++ b/charts/kubean/_crds/kubean.io_kubeanclusterconfigs.yaml
@@ -6,14 +6,14 @@ metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.6.2
   creationTimestamp: null
-  name: kubeancomponentsversions.kubean.io
+  name: kubeanclusterconfigs.kubean.io
 spec:
   group: kubean.io
   names:
-    kind: KuBeanComponentsVersion
-    listKind: KuBeanComponentsVersionList
-    plural: kubeancomponentsversions
-    singular: kubeancomponentsversion
+    kind: KubeanClusterConfig
+    listKind: KubeanClusterConfigList
+    plural: kubeanclusterconfigs
+    singular: kubeanclusterconfig
   scope: Cluster
   versions:
   - additionalPrinterColumns:
@@ -38,71 +38,92 @@ spec:
             type: object
           spec:
             properties:
-              docker:
+              airGapConfig:
+                properties:
+                  filesRepo:
+                    type: string
+                  hostsMap:
+                    items:
+                      properties:
+                        address:
+                          type: string
+                        domain:
+                          type: string
+                      type: object
+                    type: array
+                  registryRepo:
+                    type: string
+                  yumRepo:
+                    items:
+                      type: string
+                    type: array
+                type: object
+              components:
                 items:
                   properties:
                     defaultVersion:
                       type: string
-                    os:
+                    name:
                       type: string
                     versionRange:
                       items:
                         type: string
                       type: array
                   required:
-                  - os
+                  - name
                   type: object
                 type: array
-              items:
+              docker:
                 items:
                   properties:
                     defaultVersion:
                       type: string
-                    name:
+                    os:
                       type: string
                     versionRange:
                       items:
                         type: string
                       type: array
                   required:
-                  - name
+                  - os
                   type: object
                 type: array
-              kubean:
-                description: Kubean , the tag of kubean-io
+              kubeanVersion:
+                description: KubeanVersion , the tag of kubean-io
+                type: string
+              kubesprayImage:
                 type: string
-              kubespray:
-                description: Kubespray , the tag of kubespray
+              kubesprayVersion:
                 type: string
             type: object
           status:
             properties:
-              offline:
+              airGap:
                 properties:
-                  docker:
+                  components:
                     items:
                       properties:
-                        os:
+                        name:
                           type: string
                         versionRange:
                           items:
                             type: string
                           type: array
                       required:
-                      - os
+                      - name
                       type: object
                     type: array
-                  items:
+                  docker:
                     items:
                       properties:
-                        name:
+                        os:
                           type: string
                         versionRange:
                           items:
                             type: string
                           type: array
                       required:
-                      - name
+                      - os
                       type: object
                     type: array
                 type: object
diff --git a/cmd/kubean-operator/app/app.go b/cmd/kubean-operator/app/app.go
index 5d6282d98..d6bd77c6a 100644
--- a/cmd/kubean-operator/app/app.go
+++ b/cmd/kubean-operator/app/app.go
@@ -19,8 +19,8 @@ import (
 	"k8s.io/client-go/tools/clientcmd"
 	"k8s.io/klog/v2"
 	kubeanClusterClientSet "kubean.io/api/generated/kubeancluster/clientset/versioned"
+	kubeanclusterconfigClientSet "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
 	kubeanClusterOpsClientSet "kubean.io/api/generated/kubeanclusterops/clientset/versioned"
-	kubeancomponentsversionClientSet "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
 	kubeanofflineversionClientSet "kubean.io/api/generated/kubeanofflineversion/clientset/versioned"
 	controllerruntime "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/healthz"
@@ -114,7 +114,7 @@ func setupManager(mgr controllerruntime.Manager, opt *Options, stopChan <-chan s
 	if err != nil {
 		return err
 	}
-	componentsversionClientSet, err := kubeancomponentsversionClientSet.NewForConfig(resetConfig)
+	clusterconfigClientSet, err := kubeanclusterconfigClientSet.NewForConfig(resetConfig)
 	if err != nil {
 		return err
 	}
@@ -145,10 +145,10 @@ func setupManager(mgr controllerruntime.Manager, opt *Options, stopChan <-chan s
 	}
 
 	componentsVersionController := &offlineversion.Controller{
-		Client:                     mgr.GetClient(),
-		ClientSet:                  ClientSet,
-		ComponentsversionClientSet: componentsversionClientSet,
-		OfflineversionClientSet:    offlineversionClientSet,
+		Client:                  mgr.GetClient(),
+		ClientSet:               ClientSet,
+		ClusterConfigClientSet:  clusterconfigClientSet,
+		OfflineversionClientSet: offlineversionClientSet,
 	}
 	if err := componentsVersionController.SetupWithManager(mgr); err != nil {
 		klog.Errorf("ControllerManager OfflineVersion but %s", err)
diff --git a/pkg/controllers/offlineversion/controller.go b/pkg/controllers/offlineversion/controller.go
index d0e03c353..87178ef86 100644
--- a/pkg/controllers/offlineversion/controller.go
+++ b/pkg/controllers/offlineversion/controller.go
@@ -4,10 +4,10 @@ import (
 	"context"
 	"time"
 
-	kubeancomponentsversionv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 	kubeanofflineversionv1alpha1 "kubean.io/api/apis/kubeanofflineversion/v1alpha1"
 	"kubean.io/api/constants"
-	kubeancomponentsversionClientSet "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
+	kubeanclusterconfigClientSet "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
 	kubeanofflineversionClientSet "kubean.io/api/generated/kubeanofflineversion/clientset/versioned"
 
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -23,34 +23,34 @@ const Loop = time.Second * 20
 
 type Controller struct {
 	client.Client
-	ClientSet                  kubernetes.Interface
-	ComponentsversionClientSet kubeancomponentsversionClientSet.Interface
-	OfflineversionClientSet    kubeanofflineversionClientSet.Interface
+	ClientSet               kubernetes.Interface
+	ClusterConfigClientSet  kubeanclusterconfigClientSet.Interface
+	OfflineversionClientSet kubeanofflineversionClientSet.Interface
 }
 
 func (c *Controller) Start(ctx context.Context) error {
-	klog.Warningf("KubeanComponentsVersion Controller Start")
+	klog.Warningf("kubeanclusterconfig Controller Start")
 	<-ctx.Done()
 	return nil
 }
 
-func (c *Controller) FetchGlobalKuBeanComponentsVersion() (*kubeancomponentsversionv1alpha1.KuBeanComponentsVersion, error) {
-	componentsVersion, err := c.ComponentsversionClientSet.KubeanV1alpha1().KuBeanComponentsVersions().Get(context.Background(), constants.ComponentsversionGlobalName, metav1.GetOptions{})
+func (c *Controller) FetchGlobalkubeanclusterconfig() (*kubeanclusterconfigv1alpha1.KubeanClusterConfig, error) {
+	componentsVersion, err := c.ClusterConfigClientSet.KubeanV1alpha1().KubeanClusterConfigs().Get(context.Background(), constants.ClusterConfigGlobal, metav1.GetOptions{})
 	if err != nil {
 		return nil, err
 	}
 	return componentsVersion, nil
 }
 
-func (c *Controller) MergeOfflineVersionStatus(offlineVersion *kubeanofflineversionv1alpha1.KuBeanOfflineVersion, componentsVersion *kubeancomponentsversionv1alpha1.KuBeanComponentsVersion) (bool, *kubeancomponentsversionv1alpha1.KuBeanComponentsVersion) {
+func (c *Controller) MergeOfflineVersionStatus(offlineVersion *kubeanofflineversionv1alpha1.KuBeanOfflineVersion, componentsVersion *kubeanclusterconfigv1alpha1.KubeanClusterConfig) (bool, *kubeanclusterconfigv1alpha1.KubeanClusterConfig) {
 	updated := false
 	for _, dockerInfo := range offlineVersion.Spec.Docker {
-		if componentsVersion.Status.Offline.MergeDockerInfo(dockerInfo.OS, dockerInfo.VersionRange) {
+		if componentsVersion.Status.AirGapStatus.MergeDockerInfo(dockerInfo.OS, dockerInfo.VersionRange) {
 			updated = true
 		}
 	}
 	for _, softItem := range offlineVersion.Spec.Items {
-		if componentsVersion.Status.Offline.MergeSoftwareInfo(softItem.Name, softItem.VersionRange) {
+		if componentsVersion.Status.AirGapStatus.MergeSoftwareInfo(softItem.Name, softItem.VersionRange) {
 			updated = true
 		}
 	}
@@ -66,14 +66,14 @@ func (c *Controller) Reconcile(ctx context.Context, req controllerruntime.Reques
 		klog.Error(err)
 		return controllerruntime.Result{RequeueAfter: Loop}, nil
 	}
-	componentsVersion, err := c.FetchGlobalKuBeanComponentsVersion()
+	componentsVersion, err := c.FetchGlobalkubeanclusterconfig()
 	if err != nil {
-		klog.Errorf("Fetch %s , ignoring %s", constants.ComponentsversionGlobalName, err)
+		klog.Errorf("Fetch %s , ignoring %s", constants.ClusterConfigGlobal, err)
 		return controllerruntime.Result{RequeueAfter: Loop}, nil
 	}
 	if needUpdate, newComponentsVersion := c.MergeOfflineVersionStatus(offlineVersion, componentsVersion); needUpdate {
 		klog.Info("Update componentsVersion")
-		if _, err := c.ComponentsversionClientSet.KubeanV1alpha1().KuBeanComponentsVersions().UpdateStatus(context.Background(), newComponentsVersion, metav1.UpdateOptions{}); err != nil {
+		if _, err := c.ClusterConfigClientSet.KubeanV1alpha1().KubeanClusterConfigs().UpdateStatus(context.Background(), newComponentsVersion, metav1.UpdateOptions{}); err != nil {
 			klog.Error(err)
 		}
 	}
diff --git a/pkg/util/cluster.go b/pkg/util/cluster.go
index 1bf6eeeaa..6bd96bd20 100644
--- a/pkg/util/cluster.go
+++ b/pkg/util/cluster.go
@@ -7,8 +7,8 @@ import (
 	"strings"
 
 	kubeanclusterv1alpha1 "kubean.io/api/apis/kubeancluster/v1alpha1"
+	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 	kubeanclusteropsv1alpha1 "kubean.io/api/apis/kubeanclusterops/v1alpha1"
-	kubeancomponentsversionv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
 	kubeanofflineversionv1alpha1 "kubean.io/api/apis/kubeanofflineversion/v1alpha1"
 
 	"k8s.io/apimachinery/pkg/runtime"
@@ -24,8 +24,8 @@ func init() {
 	_ = scheme.AddToScheme(aggregatedScheme)                   // add Kubernetes schemes
 	_ = kubeanclusteropsv1alpha1.AddToScheme(aggregatedScheme) // add clusterOps schemes
 	_ = kubeanclusterv1alpha1.AddToScheme(aggregatedScheme)    // add cluster schemes
-	_ = kubeancomponentsversionv1alpha1.AddToScheme(aggregatedScheme)
 	_ = kubeanofflineversionv1alpha1.AddToScheme(aggregatedScheme)
+	_ = kubeanclusterconfigv1alpha1.AddToScheme(aggregatedScheme)
 	//_ = clusterapiv1alpha4.AddToScheme(aggregatedScheme) // add cluster-api v1alpha4 schemes
 	//_ = v1alpha2.AddToScheme(aggregatedScheme) // add clusterpedia-api v1alpha2 schemes
 }
diff --git a/vendor/kubean.io/api/LICENSE b/vendor/kubean.io/api/LICENSE
new file mode 100644
index 000000000..261eeb9e9
--- /dev/null
+++ b/vendor/kubean.io/api/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
diff --git a/vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/doc.go b/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/doc.go
similarity index 100%
rename from vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/doc.go
rename to vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/doc.go
diff --git a/vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/types.go b/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/types.go
similarity index 54%
rename from vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/types.go
rename to vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/types.go
index 2a5b3c1d9..973f93063 100644
--- a/vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/types.go
+++ b/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/types.go
@@ -12,7 +12,7 @@ import (
 // +kubebuilder:subresource:status
 // +kubebuilder:printcolumn:JSONPath=`.metadata.creationTimestamp`,name="Age",type=date
 
-type KuBeanComponentsVersion struct {
+type KubeanClusterConfig struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
@@ -24,52 +24,78 @@ type KuBeanComponentsVersion struct {
 }
 
 type Spec struct {
-	// Kubespray , the tag of kubespray
+	// +optional
+	AirGapConfig AirGapConfig `json:"airGapConfig,omitempty"`
+
+	// +required
+	KubesprayVersion string `json:"kubesprayVersion,omitempty"`
+
+	// KubeanVersion , the tag of kubean-io
 	// +required
-	Kubespray string `json:"kubespray,omitempty"`
+	KubeanVersion string `json:"kubeanVersion,omitempty"`
 
-	// Kubean , the tag of kubean-io
 	// +optional
-	Kubean string `json:"kubean,omitempty"`
+	KubesprayImage string `json:"kubesprayImage,omitempty"`
 
-	// +required
-	Items []*SoftwareInfo `json:"items,omitempty"`
+	// +optional
+	Components []*SoftwareInfo `json:"components,omitempty"`
 
 	// +optional
-	Docker []*DockerInfo `json:"docker"`
+	Docker []*DockerInfo `json:"docker,omitempty"`
+}
+
+type AirGapConfig struct {
+	// +optional
+	RegistryRepo string `json:"registryRepo,omitempty"`
+	// +optional
+	FilesRepo string `json:"filesRepo,omitempty"`
+	// +optional
+	YumRepo []string `json:"yumRepo,omitempty"`
+	// +optional
+	HostsMap []HostsMap `json:"hostsMap,omitempty"`
+}
+
+type HostsMap struct {
+	// +required
+	Domain string `json:"domain,omitempty"`
+	// +required
+	Address string `json:"address,omitempty"`
 }
 
 type Status struct {
 	// +optional
-	Offline OfflineStatus `json:"offline,omitempty"`
+	AirGapStatus AirGapStatus `json:"airGap,omitempty"`
 }
 
-type OfflineStatus struct {
+type AirGapStatus struct {
 	// +optional
-	Items []*SoftwareInfoStatus `json:"items"`
+	Components []*SoftwareInfoStatus `json:"components,omitempty"`
 
 	// +optional
-	Docker []*DockerInfoStatus `json:"docker"`
+	Docker []*DockerInfoStatus `json:"docker,omitempty"`
 }
 
 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 
-type KuBeanComponentsVersionList struct {
+type KubeanClusterConfigList struct {
 	metav1.TypeMeta `json:",inline"`
 	metav1.ListMeta `json:"metadata,omitempty"`
 
-	// Items holds a list of KuBeanClusterOps.
-	Items []KuBeanComponentsVersion `json:"items"`
+	// Items holds a list of KubeanClusterConfig.
+	Items []KubeanClusterConfig `json:"items"`
 }
 
 type SoftwareInfo struct {
-	Name           string   `json:"name"`
-	DefaultVersion string   `json:"defaultVersion,omitempty"`
-	VersionRange   []string `json:"versionRange,omitempty"`
+	Name string `json:"name"`
+	// +optional
+	DefaultVersion string `json:"defaultVersion,omitempty"`
+	// +optional
+	VersionRange []string `json:"versionRange,omitempty"`
 }
 
 type SoftwareInfoStatus struct {
-	Name         string   `json:"name"`
+	Name string `json:"name"`
+	// +optional
 	VersionRange []string `json:"versionRange,omitempty"`
 }
 
@@ -85,13 +111,16 @@ func (status *SoftwareInfoStatus) Merge(versionRange []string) bool {
 }
 
 type DockerInfo struct {
-	OS             string   `json:"os"`
-	DefaultVersion string   `json:"defaultVersion,omitempty"`
-	VersionRange   []string `json:"versionRange,omitempty"`
+	OS string `json:"os"`
+	// +optional
+	DefaultVersion string `json:"defaultVersion,omitempty"`
+	// +optional
+	VersionRange []string `json:"versionRange,omitempty"`
 }
 
 type DockerInfoStatus struct {
-	OS           string   `json:"os"`
+	OS string `json:"os"`
+	// +optional
 	VersionRange []string `json:"versionRange,omitempty"`
 }
 
@@ -106,23 +135,23 @@ func (info *DockerInfoStatus) Merge(versionRange []string) bool {
 	return updated
 }
 
-func (status *OfflineStatus) MergeSoftwareInfo(name string, versionRange []string) bool {
+func (status *AirGapStatus) MergeSoftwareInfo(name string, versionRange []string) bool {
 	var targetNameItem *SoftwareInfoStatus
-	for i := range status.Items {
-		if status.Items[i].Name == name {
-			targetNameItem = status.Items[i]
+	for i := range status.Components {
+		if status.Components[i].Name == name {
+			targetNameItem = status.Components[i]
 			break
 		}
 	}
 	if targetNameItem == nil {
 		targetNameItem = &SoftwareInfoStatus{Name: name, VersionRange: versionRange}
-		status.Items = append(status.Items, targetNameItem)
+		status.Components = append(status.Components, targetNameItem)
 		return true
 	}
 	return targetNameItem.Merge(versionRange)
 }
 
-func (status *OfflineStatus) MergeDockerInfo(osName string, versionRange []string) bool {
+func (status *AirGapStatus) MergeDockerInfo(osName string, versionRange []string) bool {
 	var targetNameDockerInfo *DockerInfoStatus
 	for i := range status.Docker {
 		if status.Docker[i].OS == osName {
diff --git a/vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/zz_generated.deepcopy.go b/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go
similarity index 72%
rename from vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/zz_generated.deepcopy.go
rename to vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go
index d11e2f73e..e78e1bde5 100644
--- a/vendor/kubean.io/api/apis/kubeancomponentsversion/v1alpha1/zz_generated.deepcopy.go
+++ b/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go
@@ -9,6 +9,70 @@ import (
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AirGapConfig) DeepCopyInto(out *AirGapConfig) {
+	*out = *in
+	if in.YumRepo != nil {
+		in, out := &in.YumRepo, &out.YumRepo
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.HostsMap != nil {
+		in, out := &in.HostsMap, &out.HostsMap
+		*out = make([]HostsMap, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AirGapConfig.
+func (in *AirGapConfig) DeepCopy() *AirGapConfig {
+	if in == nil {
+		return nil
+	}
+	out := new(AirGapConfig)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AirGapStatus) DeepCopyInto(out *AirGapStatus) {
+	*out = *in
+	if in.Components != nil {
+		in, out := &in.Components, &out.Components
+		*out = make([]*SoftwareInfoStatus, len(*in))
+		for i := range *in {
+			if (*in)[i] != nil {
+				in, out := &(*in)[i], &(*out)[i]
+				*out = new(SoftwareInfoStatus)
+				(*in).DeepCopyInto(*out)
+			}
+		}
+	}
+	if in.Docker != nil {
+		in, out := &in.Docker, &out.Docker
+		*out = make([]*DockerInfoStatus, len(*in))
+		for i := range *in {
+			if (*in)[i] != nil {
+				in, out := &(*in)[i], &(*out)[i]
+				*out = new(DockerInfoStatus)
+				(*in).DeepCopyInto(*out)
+			}
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AirGapStatus.
+func (in *AirGapStatus) DeepCopy() *AirGapStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(AirGapStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *DockerInfo) DeepCopyInto(out *DockerInfo) {
 	*out = *in
@@ -52,7 +116,23 @@ func (in *DockerInfoStatus) DeepCopy() *DockerInfoStatus {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *KuBeanComponentsVersion) DeepCopyInto(out *KuBeanComponentsVersion) {
+func (in *HostsMap) DeepCopyInto(out *HostsMap) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HostsMap.
+func (in *HostsMap) DeepCopy() *HostsMap {
+	if in == nil {
+		return nil
+	}
+	out := new(HostsMap)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *KubeanClusterConfig) DeepCopyInto(out *KubeanClusterConfig) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
@@ -61,18 +141,18 @@ func (in *KuBeanComponentsVersion) DeepCopyInto(out *KuBeanComponentsVersion) {
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KuBeanComponentsVersion.
-func (in *KuBeanComponentsVersion) DeepCopy() *KuBeanComponentsVersion {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanClusterConfig.
+func (in *KubeanClusterConfig) DeepCopy() *KubeanClusterConfig {
 	if in == nil {
 		return nil
 	}
-	out := new(KuBeanComponentsVersion)
+	out := new(KubeanClusterConfig)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *KuBeanComponentsVersion) DeepCopyObject() runtime.Object {
+func (in *KubeanClusterConfig) DeepCopyObject() runtime.Object {
 	if c := in.DeepCopy(); c != nil {
 		return c
 	}
@@ -80,13 +160,13 @@ func (in *KuBeanComponentsVersion) DeepCopyObject() runtime.Object {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *KuBeanComponentsVersionList) DeepCopyInto(out *KuBeanComponentsVersionList) {
+func (in *KubeanClusterConfigList) DeepCopyInto(out *KubeanClusterConfigList) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ListMeta.DeepCopyInto(&out.ListMeta)
 	if in.Items != nil {
 		in, out := &in.Items, &out.Items
-		*out = make([]KuBeanComponentsVersion, len(*in))
+		*out = make([]KubeanClusterConfig, len(*in))
 		for i := range *in {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
@@ -94,62 +174,24 @@ func (in *KuBeanComponentsVersionList) DeepCopyInto(out *KuBeanComponentsVersion
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KuBeanComponentsVersionList.
-func (in *KuBeanComponentsVersionList) DeepCopy() *KuBeanComponentsVersionList {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanClusterConfigList.
+func (in *KubeanClusterConfigList) DeepCopy() *KubeanClusterConfigList {
 	if in == nil {
 		return nil
 	}
-	out := new(KuBeanComponentsVersionList)
+	out := new(KubeanClusterConfigList)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *KuBeanComponentsVersionList) DeepCopyObject() runtime.Object {
+func (in *KubeanClusterConfigList) DeepCopyObject() runtime.Object {
 	if c := in.DeepCopy(); c != nil {
 		return c
 	}
 	return nil
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *OfflineStatus) DeepCopyInto(out *OfflineStatus) {
-	*out = *in
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]*SoftwareInfoStatus, len(*in))
-		for i := range *in {
-			if (*in)[i] != nil {
-				in, out := &(*in)[i], &(*out)[i]
-				*out = new(SoftwareInfoStatus)
-				(*in).DeepCopyInto(*out)
-			}
-		}
-	}
-	if in.Docker != nil {
-		in, out := &in.Docker, &out.Docker
-		*out = make([]*DockerInfoStatus, len(*in))
-		for i := range *in {
-			if (*in)[i] != nil {
-				in, out := &(*in)[i], &(*out)[i]
-				*out = new(DockerInfoStatus)
-				(*in).DeepCopyInto(*out)
-			}
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OfflineStatus.
-func (in *OfflineStatus) DeepCopy() *OfflineStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(OfflineStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *SoftwareInfo) DeepCopyInto(out *SoftwareInfo) {
 	*out = *in
@@ -195,8 +237,9 @@ func (in *SoftwareInfoStatus) DeepCopy() *SoftwareInfoStatus {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Spec) DeepCopyInto(out *Spec) {
 	*out = *in
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
+	in.AirGapConfig.DeepCopyInto(&out.AirGapConfig)
+	if in.Components != nil {
+		in, out := &in.Components, &out.Components
 		*out = make([]*SoftwareInfo, len(*in))
 		for i := range *in {
 			if (*in)[i] != nil {
@@ -233,7 +276,7 @@ func (in *Spec) DeepCopy() *Spec {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Status) DeepCopyInto(out *Status) {
 	*out = *in
-	in.Offline.DeepCopyInto(&out.Offline)
+	in.AirGapStatus.DeepCopyInto(&out.AirGapStatus)
 	return
 }
 
diff --git a/api/apis/kubeancomponentsversion/v1alpha1/zz_generated.register.go b/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go
similarity index 96%
rename from api/apis/kubeancomponentsversion/v1alpha1/zz_generated.register.go
rename to vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go
index a04dafd7a..66be7db16 100644
--- a/api/apis/kubeancomponentsversion/v1alpha1/zz_generated.register.go
+++ b/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go
@@ -42,8 +42,8 @@ func init() {
 // Adds the list of known types to Scheme.
 func addKnownTypes(scheme *runtime.Scheme) error {
 	scheme.AddKnownTypes(SchemeGroupVersion,
-		&KuBeanComponentsVersion{},
-		&KuBeanComponentsVersionList{},
+		&KubeanClusterConfig{},
+		&KubeanClusterConfigList{},
 	)
 	// AddToGroupVersion allows the serialization of client types like ListOptions.
 	v1.AddToGroupVersion(scheme, SchemeGroupVersion)
diff --git a/vendor/kubean.io/api/apis/kubeanofflineversion/v1alpha1/types.go b/vendor/kubean.io/api/apis/kubeanofflineversion/v1alpha1/types.go
index 195df09b4..904f690c0 100644
--- a/vendor/kubean.io/api/apis/kubeanofflineversion/v1alpha1/types.go
+++ b/vendor/kubean.io/api/apis/kubeanofflineversion/v1alpha1/types.go
@@ -47,11 +47,13 @@ type KuBeanOfflineVersionList struct {
 }
 
 type SoftwareInfo struct {
-	Name         string   `json:"name"`
+	Name string `json:"name"`
+	// +optional
 	VersionRange []string `json:"versionRange,omitempty"`
 }
 
 type DockerInfo struct {
-	OS           string   `json:"os"`
+	OS string `json:"os"`
+	// +optional
 	VersionRange []string `json:"versionRange,omitempty"`
 }
diff --git a/vendor/kubean.io/api/constants/constants.go b/vendor/kubean.io/api/constants/constants.go
index b024a7058..d3391db97 100644
--- a/vendor/kubean.io/api/constants/constants.go
+++ b/vendor/kubean.io/api/constants/constants.go
@@ -1,5 +1,5 @@
 package constants
 
-const ComponentsversionGlobalName = "componentsversion-global"
+const ClusterConfigGlobal = "clusterconfig-global"
 
 const KubeanClusterLabelKey = "clusterName"
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/clientset.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/clientset.go
similarity index 96%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/clientset.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/clientset.go
index 6fb3bce48..3cd6208e4 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/clientset.go
+++ b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/clientset.go
@@ -9,7 +9,7 @@ import (
 	discovery "k8s.io/client-go/discovery"
 	rest "k8s.io/client-go/rest"
 	flowcontrol "k8s.io/client-go/util/flowcontrol"
-	kubeanv1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
 )
 
 type Interface interface {
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/doc.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/doc.go
similarity index 100%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/doc.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/doc.go
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/fake/clientset_generated.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
similarity index 85%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/fake/clientset_generated.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
index 2c60ae373..06fe2e5c4 100644
--- a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/fake/clientset_generated.go
+++ b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
@@ -8,9 +8,9 @@ import (
 	"k8s.io/client-go/discovery"
 	fakediscovery "k8s.io/client-go/discovery/fake"
 	"k8s.io/client-go/testing"
-	clientset "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned"
-	kubeanv1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1"
-	fakekubeanv1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake"
+	clientset "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
+	fakekubeanv1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake"
 )
 
 // NewSimpleClientset returns a clientset that will respond with the provided objects.
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/fake/doc.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/doc.go
similarity index 100%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/fake/doc.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/doc.go
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/fake/register.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go
similarity index 94%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/fake/register.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go
index eefaaa9a3..557be1df8 100644
--- a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/fake/register.go
+++ b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go
@@ -8,7 +8,7 @@ import (
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
-	kubeanv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 )
 
 var scheme = runtime.NewScheme()
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme/doc.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme/doc.go
similarity index 100%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme/doc.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme/doc.go
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/scheme/register.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go
similarity index 94%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/scheme/register.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go
index f62c21894..dc3db3d44 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/scheme/register.go
+++ b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go
@@ -8,7 +8,7 @@ import (
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
-	kubeanv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 )
 
 var Scheme = runtime.NewScheme()
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/doc.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go
similarity index 100%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/doc.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/doc.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go
similarity index 100%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/doc.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go
new file mode 100644
index 000000000..adc14b897
--- /dev/null
+++ b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go
@@ -0,0 +1,117 @@
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	"context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+)
+
+// FakeKubeanClusterConfigs implements KubeanClusterConfigInterface
+type FakeKubeanClusterConfigs struct {
+	Fake *FakeKubeanV1alpha1
+}
+
+var kubeanclusterconfigsResource = schema.GroupVersionResource{Group: "kubean.io", Version: "v1alpha1", Resource: "kubeanclusterconfigs"}
+
+var kubeanclusterconfigsKind = schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KubeanClusterConfig"}
+
+// Get takes name of the kubeanClusterConfig, and returns the corresponding kubeanClusterConfig object, and an error if there is any.
+func (c *FakeKubeanClusterConfigs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootGetAction(kubeanclusterconfigsResource, name), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// List takes label and field selectors, and returns the list of KubeanClusterConfigs that match those selectors.
+func (c *FakeKubeanClusterConfigs) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanClusterConfigList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootListAction(kubeanclusterconfigsResource, kubeanclusterconfigsKind, opts), &v1alpha1.KubeanClusterConfigList{})
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.KubeanClusterConfigList{ListMeta: obj.(*v1alpha1.KubeanClusterConfigList).ListMeta}
+	for _, item := range obj.(*v1alpha1.KubeanClusterConfigList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested kubeanClusterConfigs.
+func (c *FakeKubeanClusterConfigs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewRootWatchAction(kubeanclusterconfigsResource, opts))
+}
+
+// Create takes the representation of a kubeanClusterConfig and creates it.  Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *FakeKubeanClusterConfigs) Create(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.CreateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootCreateAction(kubeanclusterconfigsResource, kubeanClusterConfig), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// Update takes the representation of a kubeanClusterConfig and updates it. Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *FakeKubeanClusterConfigs) Update(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateAction(kubeanclusterconfigsResource, kubeanClusterConfig), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeKubeanClusterConfigs) UpdateStatus(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (*v1alpha1.KubeanClusterConfig, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateSubresourceAction(kubeanclusterconfigsResource, "status", kubeanClusterConfig), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
+
+// Delete takes name of the kubeanClusterConfig and deletes it. Returns an error if one occurs.
+func (c *FakeKubeanClusterConfigs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewRootDeleteActionWithOptions(kubeanclusterconfigsResource, name, opts), &v1alpha1.KubeanClusterConfig{})
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeKubeanClusterConfigs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewRootDeleteCollectionAction(kubeanclusterconfigsResource, listOpts)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.KubeanClusterConfigList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched kubeanClusterConfig.
+func (c *FakeKubeanClusterConfigs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanClusterConfig, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootPatchSubresourceAction(kubeanclusterconfigsResource, name, pt, data, subresources...), &v1alpha1.KubeanClusterConfig{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanClusterConfig), err
+}
diff --git a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion_client.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
similarity index 60%
rename from api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion_client.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
index 39ec0680b..f20526904 100644
--- a/api/generated/kubeancomponentsversion/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion_client.go
+++ b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
@@ -5,15 +5,15 @@ package fake
 import (
 	rest "k8s.io/client-go/rest"
 	testing "k8s.io/client-go/testing"
-	v1alpha1 "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1"
+	v1alpha1 "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
 )
 
 type FakeKubeanV1alpha1 struct {
 	*testing.Fake
 }
 
-func (c *FakeKubeanV1alpha1) KuBeanComponentsVersions() v1alpha1.KuBeanComponentsVersionInterface {
-	return &FakeKuBeanComponentsVersions{c}
+func (c *FakeKubeanV1alpha1) KubeanClusterConfigs() v1alpha1.KubeanClusterConfigInterface {
+	return &FakeKubeanClusterConfigs{c}
 }
 
 // RESTClient returns a RESTClient that is used to communicate
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/generated_expansion.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
similarity index 56%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/generated_expansion.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
index bdae433b2..f9e6297b1 100644
--- a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/generated_expansion.go
+++ b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
@@ -2,4 +2,4 @@
 
 package v1alpha1
 
-type KuBeanComponentsVersionExpansion interface{}
+type KubeanClusterConfigExpansion interface{}
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
new file mode 100644
index 000000000..2bd59bfac
--- /dev/null
+++ b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
@@ -0,0 +1,168 @@
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"context"
+	"time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	scheme "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme"
+)
+
+// KubeanClusterConfigsGetter has a method to return a KubeanClusterConfigInterface.
+// A group's client should implement this interface.
+type KubeanClusterConfigsGetter interface {
+	KubeanClusterConfigs() KubeanClusterConfigInterface
+}
+
+// KubeanClusterConfigInterface has methods to work with KubeanClusterConfig resources.
+type KubeanClusterConfigInterface interface {
+	Create(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.CreateOptions) (*v1alpha1.KubeanClusterConfig, error)
+	Update(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (*v1alpha1.KubeanClusterConfig, error)
+	UpdateStatus(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (*v1alpha1.KubeanClusterConfig, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.KubeanClusterConfig, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.KubeanClusterConfigList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanClusterConfig, err error)
+	KubeanClusterConfigExpansion
+}
+
+// kubeanClusterConfigs implements KubeanClusterConfigInterface
+type kubeanClusterConfigs struct {
+	client rest.Interface
+}
+
+// newKubeanClusterConfigs returns a KubeanClusterConfigs
+func newKubeanClusterConfigs(c *KubeanV1alpha1Client) *kubeanClusterConfigs {
+	return &kubeanClusterConfigs{
+		client: c.RESTClient(),
+	}
+}
+
+// Get takes name of the kubeanClusterConfig, and returns the corresponding kubeanClusterConfig object, and an error if there is any.
+func (c *kubeanClusterConfigs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Get().
+		Resource("kubeanclusterconfigs").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of KubeanClusterConfigs that match those selectors.
+func (c *kubeanClusterConfigs) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanClusterConfigList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.KubeanClusterConfigList{}
+	err = c.client.Get().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested kubeanClusterConfigs.
+func (c *kubeanClusterConfigs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch(ctx)
+}
+
+// Create takes the representation of a kubeanClusterConfig and creates it.  Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *kubeanClusterConfigs) Create(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.CreateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Post().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanClusterConfig).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Update takes the representation of a kubeanClusterConfig and updates it. Returns the server's representation of the kubeanClusterConfig, and an error, if there is any.
+func (c *kubeanClusterConfigs) Update(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Put().
+		Resource("kubeanclusterconfigs").
+		Name(kubeanClusterConfig.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanClusterConfig).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *kubeanClusterConfigs) UpdateStatus(ctx context.Context, kubeanClusterConfig *v1alpha1.KubeanClusterConfig, opts v1.UpdateOptions) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Put().
+		Resource("kubeanclusterconfigs").
+		Name(kubeanClusterConfig.Name).
+		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanClusterConfig).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Delete takes name of the kubeanClusterConfig and deletes it. Returns an error if one occurs.
+func (c *kubeanClusterConfigs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return c.client.Delete().
+		Resource("kubeanclusterconfigs").
+		Name(name).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *kubeanClusterConfigs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	var timeout time.Duration
+	if listOpts.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Resource("kubeanclusterconfigs").
+		VersionedParams(&listOpts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// Patch applies the patch and returns the patched kubeanClusterConfig.
+func (c *kubeanClusterConfigs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanClusterConfig, err error) {
+	result = &v1alpha1.KubeanClusterConfig{}
+	err = c.client.Patch(pt).
+		Resource("kubeanclusterconfigs").
+		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(data).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion_client.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
similarity index 88%
rename from vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion_client.go
rename to vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
index cc4569a2b..4852f2ea6 100644
--- a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion_client.go
+++ b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
@@ -6,13 +6,13 @@ import (
 	"net/http"
 
 	rest "k8s.io/client-go/rest"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-	"kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme"
+	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	"kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme"
 )
 
 type KubeanV1alpha1Interface interface {
 	RESTClient() rest.Interface
-	KuBeanComponentsVersionsGetter
+	KubeanClusterConfigsGetter
 }
 
 // KubeanV1alpha1Client is used to interact with features provided by the kubean.io group.
@@ -20,8 +20,8 @@ type KubeanV1alpha1Client struct {
 	restClient rest.Interface
 }
 
-func (c *KubeanV1alpha1Client) KuBeanComponentsVersions() KuBeanComponentsVersionInterface {
-	return newKuBeanComponentsVersions(c)
+func (c *KubeanV1alpha1Client) KubeanClusterConfigs() KubeanClusterConfigInterface {
+	return newKubeanClusterConfigs(c)
 }
 
 // NewForConfig creates a new KubeanV1alpha1Client for the given config.
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion.go b/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion.go
deleted file mode 100644
index 51490112e..000000000
--- a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake/fake_kubeancomponentsversion.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Code generated by client-gen. DO NOT EDIT.
-
-package fake
-
-import (
-	"context"
-
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	labels "k8s.io/apimachinery/pkg/labels"
-	schema "k8s.io/apimachinery/pkg/runtime/schema"
-	types "k8s.io/apimachinery/pkg/types"
-	watch "k8s.io/apimachinery/pkg/watch"
-	testing "k8s.io/client-go/testing"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-)
-
-// FakeKuBeanComponentsVersions implements KuBeanComponentsVersionInterface
-type FakeKuBeanComponentsVersions struct {
-	Fake *FakeKubeanV1alpha1
-}
-
-var kubeancomponentsversionsResource = schema.GroupVersionResource{Group: "kubean.io", Version: "v1alpha1", Resource: "kubeancomponentsversions"}
-
-var kubeancomponentsversionsKind = schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KuBeanComponentsVersion"}
-
-// Get takes name of the kuBeanComponentsVersion, and returns the corresponding kuBeanComponentsVersion object, and an error if there is any.
-func (c *FakeKuBeanComponentsVersions) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootGetAction(kubeancomponentsversionsResource, name), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// List takes label and field selectors, and returns the list of KuBeanComponentsVersions that match those selectors.
-func (c *FakeKuBeanComponentsVersions) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KuBeanComponentsVersionList, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootListAction(kubeancomponentsversionsResource, kubeancomponentsversionsKind, opts), &v1alpha1.KuBeanComponentsVersionList{})
-	if obj == nil {
-		return nil, err
-	}
-
-	label, _, _ := testing.ExtractFromListOptions(opts)
-	if label == nil {
-		label = labels.Everything()
-	}
-	list := &v1alpha1.KuBeanComponentsVersionList{ListMeta: obj.(*v1alpha1.KuBeanComponentsVersionList).ListMeta}
-	for _, item := range obj.(*v1alpha1.KuBeanComponentsVersionList).Items {
-		if label.Matches(labels.Set(item.Labels)) {
-			list.Items = append(list.Items, item)
-		}
-	}
-	return list, err
-}
-
-// Watch returns a watch.Interface that watches the requested kuBeanComponentsVersions.
-func (c *FakeKuBeanComponentsVersions) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
-	return c.Fake.
-		InvokesWatch(testing.NewRootWatchAction(kubeancomponentsversionsResource, opts))
-}
-
-// Create takes the representation of a kuBeanComponentsVersion and creates it.  Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *FakeKuBeanComponentsVersions) Create(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.CreateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootCreateAction(kubeancomponentsversionsResource, kuBeanComponentsVersion), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// Update takes the representation of a kuBeanComponentsVersion and updates it. Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *FakeKuBeanComponentsVersions) Update(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootUpdateAction(kubeancomponentsversionsResource, kuBeanComponentsVersion), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// UpdateStatus was generated because the type contains a Status member.
-// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *FakeKuBeanComponentsVersions) UpdateStatus(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (*v1alpha1.KuBeanComponentsVersion, error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootUpdateSubresourceAction(kubeancomponentsversionsResource, "status", kuBeanComponentsVersion), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
-
-// Delete takes name of the kuBeanComponentsVersion and deletes it. Returns an error if one occurs.
-func (c *FakeKuBeanComponentsVersions) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
-	_, err := c.Fake.
-		Invokes(testing.NewRootDeleteActionWithOptions(kubeancomponentsversionsResource, name, opts), &v1alpha1.KuBeanComponentsVersion{})
-	return err
-}
-
-// DeleteCollection deletes a collection of objects.
-func (c *FakeKuBeanComponentsVersions) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
-	action := testing.NewRootDeleteCollectionAction(kubeancomponentsversionsResource, listOpts)
-
-	_, err := c.Fake.Invokes(action, &v1alpha1.KuBeanComponentsVersionList{})
-	return err
-}
-
-// Patch applies the patch and returns the patched kuBeanComponentsVersion.
-func (c *FakeKuBeanComponentsVersions) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	obj, err := c.Fake.
-		Invokes(testing.NewRootPatchSubresourceAction(kubeancomponentsversionsResource, name, pt, data, subresources...), &v1alpha1.KuBeanComponentsVersion{})
-	if obj == nil {
-		return nil, err
-	}
-	return obj.(*v1alpha1.KuBeanComponentsVersion), err
-}
diff --git a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go b/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
deleted file mode 100644
index 21807bf8e..000000000
--- a/vendor/kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/kubeancomponentsversion.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Code generated by client-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	"context"
-	"time"
-
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	types "k8s.io/apimachinery/pkg/types"
-	watch "k8s.io/apimachinery/pkg/watch"
-	rest "k8s.io/client-go/rest"
-	v1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
-	scheme "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme"
-)
-
-// KuBeanComponentsVersionsGetter has a method to return a KuBeanComponentsVersionInterface.
-// A group's client should implement this interface.
-type KuBeanComponentsVersionsGetter interface {
-	KuBeanComponentsVersions() KuBeanComponentsVersionInterface
-}
-
-// KuBeanComponentsVersionInterface has methods to work with KuBeanComponentsVersion resources.
-type KuBeanComponentsVersionInterface interface {
-	Create(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.CreateOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	Update(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	UpdateStatus(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
-	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
-	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.KuBeanComponentsVersion, error)
-	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.KuBeanComponentsVersionList, error)
-	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
-	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KuBeanComponentsVersion, err error)
-	KuBeanComponentsVersionExpansion
-}
-
-// kuBeanComponentsVersions implements KuBeanComponentsVersionInterface
-type kuBeanComponentsVersions struct {
-	client rest.Interface
-}
-
-// newKuBeanComponentsVersions returns a KuBeanComponentsVersions
-func newKuBeanComponentsVersions(c *KubeanV1alpha1Client) *kuBeanComponentsVersions {
-	return &kuBeanComponentsVersions{
-		client: c.RESTClient(),
-	}
-}
-
-// Get takes name of the kuBeanComponentsVersion, and returns the corresponding kuBeanComponentsVersion object, and an error if there is any.
-func (c *kuBeanComponentsVersions) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Get().
-		Resource("kubeancomponentsversions").
-		Name(name).
-		VersionedParams(&options, scheme.ParameterCodec).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// List takes label and field selectors, and returns the list of KuBeanComponentsVersions that match those selectors.
-func (c *kuBeanComponentsVersions) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KuBeanComponentsVersionList, err error) {
-	var timeout time.Duration
-	if opts.TimeoutSeconds != nil {
-		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
-	}
-	result = &v1alpha1.KuBeanComponentsVersionList{}
-	err = c.client.Get().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// Watch returns a watch.Interface that watches the requested kuBeanComponentsVersions.
-func (c *kuBeanComponentsVersions) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
-	var timeout time.Duration
-	if opts.TimeoutSeconds != nil {
-		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
-	}
-	opts.Watch = true
-	return c.client.Get().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Watch(ctx)
-}
-
-// Create takes the representation of a kuBeanComponentsVersion and creates it.  Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *kuBeanComponentsVersions) Create(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.CreateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Post().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(kuBeanComponentsVersion).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// Update takes the representation of a kuBeanComponentsVersion and updates it. Returns the server's representation of the kuBeanComponentsVersion, and an error, if there is any.
-func (c *kuBeanComponentsVersions) Update(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Put().
-		Resource("kubeancomponentsversions").
-		Name(kuBeanComponentsVersion.Name).
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(kuBeanComponentsVersion).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// UpdateStatus was generated because the type contains a Status member.
-// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *kuBeanComponentsVersions) UpdateStatus(ctx context.Context, kuBeanComponentsVersion *v1alpha1.KuBeanComponentsVersion, opts v1.UpdateOptions) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Put().
-		Resource("kubeancomponentsversions").
-		Name(kuBeanComponentsVersion.Name).
-		SubResource("status").
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(kuBeanComponentsVersion).
-		Do(ctx).
-		Into(result)
-	return
-}
-
-// Delete takes name of the kuBeanComponentsVersion and deletes it. Returns an error if one occurs.
-func (c *kuBeanComponentsVersions) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
-	return c.client.Delete().
-		Resource("kubeancomponentsversions").
-		Name(name).
-		Body(&opts).
-		Do(ctx).
-		Error()
-}
-
-// DeleteCollection deletes a collection of objects.
-func (c *kuBeanComponentsVersions) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
-	var timeout time.Duration
-	if listOpts.TimeoutSeconds != nil {
-		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
-	}
-	return c.client.Delete().
-		Resource("kubeancomponentsversions").
-		VersionedParams(&listOpts, scheme.ParameterCodec).
-		Timeout(timeout).
-		Body(&opts).
-		Do(ctx).
-		Error()
-}
-
-// Patch applies the patch and returns the patched kuBeanComponentsVersion.
-func (c *kuBeanComponentsVersions) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KuBeanComponentsVersion, err error) {
-	result = &v1alpha1.KuBeanComponentsVersion{}
-	err = c.client.Patch(pt).
-		Resource("kubeancomponentsversions").
-		Name(name).
-		SubResource(subresources...).
-		VersionedParams(&opts, scheme.ParameterCodec).
-		Body(data).
-		Do(ctx).
-		Into(result)
-	return
-}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 640048c3e..3ca863c15 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1000,8 +1000,8 @@ k8s.io/utils/trace
 ## explicit; go 1.17
 kubean.io/api/apis
 kubean.io/api/apis/kubeancluster/v1alpha1
+kubean.io/api/apis/kubeanclusterconfig/v1alpha1
 kubean.io/api/apis/kubeanclusterops/v1alpha1
-kubean.io/api/apis/kubeancomponentsversion/v1alpha1
 kubean.io/api/apis/kubeanofflineversion/v1alpha1
 kubean.io/api/constants
 kubean.io/api/generated/kubeancluster/clientset/versioned
@@ -1009,16 +1009,16 @@ kubean.io/api/generated/kubeancluster/clientset/versioned/fake
 kubean.io/api/generated/kubeancluster/clientset/versioned/scheme
 kubean.io/api/generated/kubeancluster/clientset/versioned/typed/kubeancluster/v1alpha1
 kubean.io/api/generated/kubeancluster/clientset/versioned/typed/kubeancluster/v1alpha1/fake
+kubean.io/api/generated/kubeanclusterconfig/clientset/versioned
+kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake
+kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme
+kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1
+kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake
 kubean.io/api/generated/kubeanclusterops/clientset/versioned
 kubean.io/api/generated/kubeanclusterops/clientset/versioned/fake
 kubean.io/api/generated/kubeanclusterops/clientset/versioned/scheme
 kubean.io/api/generated/kubeanclusterops/clientset/versioned/typed/kubeanclusterops/v1alpha1
 kubean.io/api/generated/kubeanclusterops/clientset/versioned/typed/kubeanclusterops/v1alpha1/fake
-kubean.io/api/generated/kubeancomponentsversion/clientset/versioned
-kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/fake
-kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/scheme
-kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1
-kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/typed/kubeancomponentsversion/v1alpha1/fake
 kubean.io/api/generated/kubeanofflineversion/clientset/versioned
 kubean.io/api/generated/kubeanofflineversion/clientset/versioned/fake
 kubean.io/api/generated/kubeanofflineversion/clientset/versioned/scheme


Test patch:
diff --git a/api/apis/kubeanclusterconfig/v1alpha1/types_test.go b/api/apis/kubeanclusterconfig/v1alpha1/types_test.go
new file mode 100644
index 000000000..fb5627a31
--- /dev/null
+++ b/api/apis/kubeanclusterconfig/v1alpha1/types_test.go
@@ -0,0 +1,95 @@
+package v1alpha1
+
+import (
+	"testing"
+)
+
+func TestMerge(t *testing.T) {
+	componentsVersion := &KubeanClusterConfig{}
+	tests := []struct {
+		name string
+		args func() bool
+		want bool
+	}{
+		{
+			name: "add software air-gap etcd1 item",
+			args: func() bool {
+				updated := componentsVersion.Status.AirGapStatus.MergeSoftwareInfo("etcd1", []string{"1.1", "1.2"})
+				return updated && len(componentsVersion.Status.AirGapStatus.Components) == 1
+			},
+			want: true,
+		},
+		{
+			name: "update software air-gap etcd1 item",
+			args: func() bool {
+				updated := componentsVersion.Status.AirGapStatus.MergeSoftwareInfo("etcd1", []string{"1.2", "1.3"})
+				return updated && len(componentsVersion.Status.AirGapStatus.Components) == 1 && componentsVersion.Status.AirGapStatus.Components[0].Name == "etcd1" && len(componentsVersion.Status.AirGapStatus.Components[0].VersionRange) == 3
+			},
+			want: true,
+		},
+		{
+			name: "update software air-gap etcd1 item but nothing changed",
+			args: func() bool {
+				updated := componentsVersion.Status.AirGapStatus.MergeSoftwareInfo("etcd1", []string{"1.2", "1.3"})
+				return !updated && len(componentsVersion.Status.AirGapStatus.Components) == 1 && componentsVersion.Status.AirGapStatus.Components[0].Name == "etcd1" && len(componentsVersion.Status.AirGapStatus.Components[0].VersionRange) == 3
+			},
+			want: true,
+		},
+		{
+			name: "update software air-gap etcd2 item",
+			args: func() bool {
+				updated := componentsVersion.Status.AirGapStatus.MergeSoftwareInfo("etcd2", []string{"2.1", "2.2"})
+				return updated && len(componentsVersion.Status.AirGapStatus.Components) == 2 && componentsVersion.Status.AirGapStatus.Components[1].Name == "etcd2" && len(componentsVersion.Status.AirGapStatus.Components[1].VersionRange) == 2
+			},
+			want: true,
+		},
+		{
+			name: "update software air-gap etcd2 item but nothing changed",
+			args: func() bool {
+				updated := componentsVersion.Status.AirGapStatus.MergeSoftwareInfo("etcd2", []string{"2.1", "2.2"})
+				return !updated && len(componentsVersion.Status.AirGapStatus.Components) == 2 && componentsVersion.Status.AirGapStatus.Components[1].Name == "etcd2" && len(componentsVersion.Status.AirGapStatus.Components[1].VersionRange) == 2
+			},
+			want: true,
+		},
+		{
+			name: "add docker-ce info",
+			args: func() bool {
+				updated := componentsVersion.Status.AirGapStatus.MergeDockerInfo("centos7", []string{"20.01", "20.02"})
+				return updated && len(componentsVersion.Status.AirGapStatus.Docker) == 1 && len(componentsVersion.Status.AirGapStatus.Docker[0].VersionRange) == 2
+			},
+			want: true,
+		},
+		{
+			name: "update docker-ce info",
+			args: func() bool {
+				updated := componentsVersion.Status.AirGapStatus.MergeDockerInfo("centos7", []string{"20.01", "20.02"})
+				return !updated && len(componentsVersion.Status.AirGapStatus.Docker) == 1 && len(componentsVersion.Status.AirGapStatus.Docker[0].VersionRange) == 2
+			},
+			want: true,
+		},
+		{
+			name: "update docker-ce info with zero length",
+			args: func() bool {
+				updated := componentsVersion.Status.AirGapStatus.MergeDockerInfo("centos0008", nil)
+				return updated && len(componentsVersion.Status.AirGapStatus.Docker) == 2 && len(componentsVersion.Status.AirGapStatus.Docker[1].VersionRange) == 0
+			},
+			want: true,
+		},
+		{
+			name: "update docker-ce info",
+			args: func() bool {
+				updated := componentsVersion.Status.AirGapStatus.MergeDockerInfo("centos0008", []string{"1.1", "1.2", "1.3"})
+				return updated && len(componentsVersion.Status.AirGapStatus.Docker) == 2 && len(componentsVersion.Status.AirGapStatus.Docker[1].VersionRange) == 3
+			},
+			want: true,
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			if test.args() != test.want {
+				t.Fatal()
+			}
+		})
+	}
+}
diff --git a/api/apis/kubeancomponentsversion/v1alpha1/types_test.go b/api/apis/kubeancomponentsversion/v1alpha1/types_test.go
deleted file mode 100644
index 14c06aeff..000000000
--- a/api/apis/kubeancomponentsversion/v1alpha1/types_test.go
+++ /dev/null
@@ -1,95 +0,0 @@
-package v1alpha1
-
-import (
-	"testing"
-)
-
-func TestMerge(t *testing.T) {
-	componentsVersion := &KuBeanComponentsVersion{}
-	tests := []struct {
-		name string
-		args func() bool
-		want bool
-	}{
-		{
-			name: "add software air-gap etcd1 item",
-			args: func() bool {
-				updated := componentsVersion.Status.Offline.MergeSoftwareInfo("etcd1", []string{"1.1", "1.2"})
-				return updated && len(componentsVersion.Status.Offline.Items) == 1
-			},
-			want: true,
-		},
-		{
-			name: "update software air-gap etcd1 item",
-			args: func() bool {
-				updated := componentsVersion.Status.Offline.MergeSoftwareInfo("etcd1", []string{"1.2", "1.3"})
-				return updated && len(componentsVersion.Status.Offline.Items) == 1 && componentsVersion.Status.Offline.Items[0].Name == "etcd1" && len(componentsVersion.Status.Offline.Items[0].VersionRange) == 3
-			},
-			want: true,
-		},
-		{
-			name: "update software air-gap etcd1 item but nothing changed",
-			args: func() bool {
-				updated := componentsVersion.Status.Offline.MergeSoftwareInfo("etcd1", []string{"1.2", "1.3"})
-				return !updated && len(componentsVersion.Status.Offline.Items) == 1 && componentsVersion.Status.Offline.Items[0].Name == "etcd1" && len(componentsVersion.Status.Offline.Items[0].VersionRange) == 3
-			},
-			want: true,
-		},
-		{
-			name: "update software air-gap etcd2 item",
-			args: func() bool {
-				updated := componentsVersion.Status.Offline.MergeSoftwareInfo("etcd2", []string{"2.1", "2.2"})
-				return updated && len(componentsVersion.Status.Offline.Items) == 2 && componentsVersion.Status.Offline.Items[1].Name == "etcd2" && len(componentsVersion.Status.Offline.Items[1].VersionRange) == 2
-			},
-			want: true,
-		},
-		{
-			name: "update software air-gap etcd2 item but nothing changed",
-			args: func() bool {
-				updated := componentsVersion.Status.Offline.MergeSoftwareInfo("etcd2", []string{"2.1", "2.2"})
-				return !updated && len(componentsVersion.Status.Offline.Items) == 2 && componentsVersion.Status.Offline.Items[1].Name == "etcd2" && len(componentsVersion.Status.Offline.Items[1].VersionRange) == 2
-			},
-			want: true,
-		},
-		{
-			name: "add docker-ce info",
-			args: func() bool {
-				updated := componentsVersion.Status.Offline.MergeDockerInfo("centos7", []string{"20.01", "20.02"})
-				return updated && len(componentsVersion.Status.Offline.Docker) == 1 && len(componentsVersion.Status.Offline.Docker[0].VersionRange) == 2
-			},
-			want: true,
-		},
-		{
-			name: "update docker-ce info",
-			args: func() bool {
-				updated := componentsVersion.Status.Offline.MergeDockerInfo("centos7", []string{"20.01", "20.02"})
-				return !updated && len(componentsVersion.Status.Offline.Docker) == 1 && len(componentsVersion.Status.Offline.Docker[0].VersionRange) == 2
-			},
-			want: true,
-		},
-		{
-			name: "update docker-ce info with zero length",
-			args: func() bool {
-				updated := componentsVersion.Status.Offline.MergeDockerInfo("centos0008", nil)
-				return updated && len(componentsVersion.Status.Offline.Docker) == 2 && len(componentsVersion.Status.Offline.Docker[1].VersionRange) == 0
-			},
-			want: true,
-		},
-		{
-			name: "update docker-ce info",
-			args: func() bool {
-				updated := componentsVersion.Status.Offline.MergeDockerInfo("centos0008", []string{"1.1", "1.2", "1.3"})
-				return updated && len(componentsVersion.Status.Offline.Docker) == 2 && len(componentsVersion.Status.Offline.Docker[1].VersionRange) == 3
-			},
-			want: true,
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			if test.args() != test.want {
-				t.Fatal()
-			}
-		})
-	}
-}
diff --git a/pkg/controllers/offlineversion/controller_test.go b/pkg/controllers/offlineversion/controller_test.go
index 68a6bbbe2..8f4b944b0 100644
--- a/pkg/controllers/offlineversion/controller_test.go
+++ b/pkg/controllers/offlineversion/controller_test.go
@@ -12,37 +12,37 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	kubeancomponentsversionv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 	kubeanofflineversionv1alpha1 "kubean.io/api/apis/kubeanofflineversion/v1alpha1"
 	"kubean.io/api/constants"
-	kubeancomponentsversionv1alpha1fake "kubean.io/api/generated/kubeancomponentsversion/clientset/versioned/fake"
+	kubeanclusterconfigv1alpha1fake "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake"
 	kubeanofflineversionv1alpha1fake "kubean.io/api/generated/kubeanofflineversion/clientset/versioned/fake"
 )
 
 func newFakeClient() client.Client {
 	sch := scheme.Scheme
-	if err := kubeancomponentsversionv1alpha1.AddToScheme(sch); err != nil {
+	if err := kubeanclusterconfigv1alpha1.AddToScheme(sch); err != nil {
 		panic(err)
 	}
 	if err := kubeanofflineversionv1alpha1.AddToScheme(sch); err != nil {
 		panic(err)
 	}
-	client := fake.NewClientBuilder().WithScheme(sch).WithRuntimeObjects(&kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{}).WithRuntimeObjects(&kubeanofflineversionv1alpha1.KuBeanOfflineVersion{}).Build()
+	client := fake.NewClientBuilder().WithScheme(sch).WithRuntimeObjects(&kubeanclusterconfigv1alpha1.KubeanClusterConfig{}).WithRuntimeObjects(&kubeanofflineversionv1alpha1.KuBeanOfflineVersion{}).Build()
 	return client
 }
 
 func TestMergeOfflineVersion(t *testing.T) {
 	controller := &Controller{
-		Client:                     newFakeClient(),
-		ClientSet:                  clientsetfake.NewSimpleClientset(),
-		OfflineversionClientSet:    kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
-		ComponentsversionClientSet: kubeancomponentsversionv1alpha1fake.NewSimpleClientset(),
+		Client:                  newFakeClient(),
+		ClientSet:               clientsetfake.NewSimpleClientset(),
+		OfflineversionClientSet: kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
+		ClusterConfigClientSet:  kubeanclusterconfigv1alpha1fake.NewSimpleClientset(),
 	}
 	tests := []struct {
 		name string
 		args struct {
 			OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-			ComponentsVersion kubeancomponentsversionv1alpha1.KuBeanComponentsVersion
+			ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
 		}
 		updated bool
 	}{
@@ -50,14 +50,14 @@ func TestMergeOfflineVersion(t *testing.T) {
 			name: "nothing update",
 			args: struct {
 				OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-				ComponentsVersion kubeancomponentsversionv1alpha1.KuBeanComponentsVersion
+				ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{},
 				},
-				ComponentsVersion: kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{
-					Status: kubeancomponentsversionv1alpha1.Status{
-						Offline: kubeancomponentsversionv1alpha1.OfflineStatus{},
+				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
+					Status: kubeanclusterconfigv1alpha1.Status{
+						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{},
 					},
 				},
 			},
@@ -67,7 +67,7 @@ func TestMergeOfflineVersion(t *testing.T) {
 			name: "update software info",
 			args: struct {
 				OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-				ComponentsVersion kubeancomponentsversionv1alpha1.KuBeanComponentsVersion
+				ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{
@@ -79,9 +79,9 @@ func TestMergeOfflineVersion(t *testing.T) {
 						},
 					},
 				},
-				ComponentsVersion: kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{
-					Status: kubeancomponentsversionv1alpha1.Status{
-						Offline: kubeancomponentsversionv1alpha1.OfflineStatus{},
+				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
+					Status: kubeanclusterconfigv1alpha1.Status{
+						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{},
 					},
 				},
 			},
@@ -91,7 +91,7 @@ func TestMergeOfflineVersion(t *testing.T) {
 			name: "update software info",
 			args: struct {
 				OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-				ComponentsVersion kubeancomponentsversionv1alpha1.KuBeanComponentsVersion
+				ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{
@@ -103,10 +103,10 @@ func TestMergeOfflineVersion(t *testing.T) {
 						},
 					},
 				},
-				ComponentsVersion: kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{
-					Status: kubeancomponentsversionv1alpha1.Status{
-						Offline: kubeancomponentsversionv1alpha1.OfflineStatus{
-							Items: []*kubeancomponentsversionv1alpha1.SoftwareInfoStatus{
+				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
+					Status: kubeanclusterconfigv1alpha1.Status{
+						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{
+							Components: []*kubeanclusterconfigv1alpha1.SoftwareInfoStatus{
 								{
 									Name:         "etcd-1",
 									VersionRange: []string{"1.2", "1.3"},
@@ -122,7 +122,7 @@ func TestMergeOfflineVersion(t *testing.T) {
 			name: "add software info but nothing updated",
 			args: struct {
 				OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-				ComponentsVersion kubeancomponentsversionv1alpha1.KuBeanComponentsVersion
+				ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{
@@ -134,10 +134,10 @@ func TestMergeOfflineVersion(t *testing.T) {
 						},
 					},
 				},
-				ComponentsVersion: kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{
-					Status: kubeancomponentsversionv1alpha1.Status{
-						Offline: kubeancomponentsversionv1alpha1.OfflineStatus{
-							Items: []*kubeancomponentsversionv1alpha1.SoftwareInfoStatus{
+				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
+					Status: kubeanclusterconfigv1alpha1.Status{
+						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{
+							Components: []*kubeanclusterconfigv1alpha1.SoftwareInfoStatus{
 								{
 									Name:         "etcd-1",
 									VersionRange: []string{"1.1", "1.2", "1.3"},
@@ -153,7 +153,7 @@ func TestMergeOfflineVersion(t *testing.T) {
 			name: "update docker-ce info",
 			args: struct {
 				OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-				ComponentsVersion kubeancomponentsversionv1alpha1.KuBeanComponentsVersion
+				ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{
@@ -171,16 +171,16 @@ func TestMergeOfflineVersion(t *testing.T) {
 						},
 					},
 				},
-				ComponentsVersion: kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{
-					Status: kubeancomponentsversionv1alpha1.Status{
-						Offline: kubeancomponentsversionv1alpha1.OfflineStatus{
-							Docker: []*kubeancomponentsversionv1alpha1.DockerInfoStatus{
+				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
+					Status: kubeanclusterconfigv1alpha1.Status{
+						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{
+							Docker: []*kubeanclusterconfigv1alpha1.DockerInfoStatus{
 								{
 									OS:           "redhat-8",
 									VersionRange: []string{},
 								},
 							},
-							Items: []*kubeancomponentsversionv1alpha1.SoftwareInfoStatus{
+							Components: []*kubeanclusterconfigv1alpha1.SoftwareInfoStatus{
 								{
 									Name:         "etcd-1",
 									VersionRange: []string{"1.1", "1.2"},
@@ -196,7 +196,7 @@ func TestMergeOfflineVersion(t *testing.T) {
 			name: "nothing updated",
 			args: struct {
 				OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-				ComponentsVersion kubeancomponentsversionv1alpha1.KuBeanComponentsVersion
+				ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{
@@ -214,10 +214,10 @@ func TestMergeOfflineVersion(t *testing.T) {
 						},
 					},
 				},
-				ComponentsVersion: kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{
-					Status: kubeancomponentsversionv1alpha1.Status{
-						Offline: kubeancomponentsversionv1alpha1.OfflineStatus{
-							Docker: []*kubeancomponentsversionv1alpha1.DockerInfoStatus{
+				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
+					Status: kubeanclusterconfigv1alpha1.Status{
+						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{
+							Docker: []*kubeanclusterconfigv1alpha1.DockerInfoStatus{
 								{
 									OS:           "redhat-7",
 									VersionRange: []string{"20.02", "20.01"},
@@ -227,7 +227,7 @@ func TestMergeOfflineVersion(t *testing.T) {
 									VersionRange: []string{"21.02", "21.01"},
 								},
 							},
-							Items: []*kubeancomponentsversionv1alpha1.SoftwareInfoStatus{
+							Components: []*kubeanclusterconfigv1alpha1.SoftwareInfoStatus{
 								{
 									Name:         "etcd-1",
 									VersionRange: []string{"1.2", "1.1"},
@@ -260,10 +260,10 @@ func TestReconcile(t *testing.T) {
 			name: "merge successfully",
 			args: func() bool {
 				controller := &Controller{
-					Client:                     newFakeClient(),
-					ClientSet:                  clientsetfake.NewSimpleClientset(),
-					OfflineversionClientSet:    kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
-					ComponentsversionClientSet: kubeancomponentsversionv1alpha1fake.NewSimpleClientset(),
+					Client:                  newFakeClient(),
+					ClientSet:               clientsetfake.NewSimpleClientset(),
+					OfflineversionClientSet: kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
+					ClusterConfigClientSet:  kubeanclusterconfigv1alpha1fake.NewSimpleClientset(),
 				}
 				offlineVersionData := kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					TypeMeta: metav1.TypeMeta{
@@ -283,23 +283,23 @@ func TestReconcile(t *testing.T) {
 					},
 				}
 
-				globalComponentsVersion := kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{
+				globalComponentsVersion := kubeanclusterconfigv1alpha1.KubeanClusterConfig{
 					TypeMeta: metav1.TypeMeta{
-						Kind:       "KuBeanComponentsVersion",
+						Kind:       "kubeanclusterconfig",
 						APIVersion: "kubean.io/v1alpha1",
 					},
 					ObjectMeta: metav1.ObjectMeta{
-						Name: constants.ComponentsversionGlobalName,
+						Name: constants.ClusterConfigGlobal,
 					},
 				}
 
 				controller.Create(context.Background(), &offlineVersionData)
 				controller.OfflineversionClientSet.KubeanV1alpha1().KuBeanOfflineVersions().Create(context.Background(), &offlineVersionData, metav1.CreateOptions{})
-				controller.ComponentsversionClientSet.KubeanV1alpha1().KuBeanComponentsVersions().Create(context.Background(), &globalComponentsVersion, metav1.CreateOptions{})
+				controller.ClusterConfigClientSet.KubeanV1alpha1().KubeanClusterConfigs().Create(context.Background(), &globalComponentsVersion, metav1.CreateOptions{})
 
 				result, err := controller.Reconcile(context.Background(), controllerruntime.Request{NamespacedName: types.NamespacedName{Name: offlineVersionData.Name}})
-				newGlobalComponentsVersion, _ := controller.ComponentsversionClientSet.KubeanV1alpha1().KuBeanComponentsVersions().Get(context.Background(), constants.ComponentsversionGlobalName, metav1.GetOptions{})
-				return err == nil && result.RequeueAfter == Loop && len(newGlobalComponentsVersion.Status.Offline.Docker) == 1 && len(newGlobalComponentsVersion.Status.Offline.Docker[0].VersionRange) == 2
+				newGlobalComponentsVersion, _ := controller.ClusterConfigClientSet.KubeanV1alpha1().KubeanClusterConfigs().Get(context.Background(), constants.ClusterConfigGlobal, metav1.GetOptions{})
+				return err == nil && result.RequeueAfter == Loop && len(newGlobalComponentsVersion.Status.AirGapStatus.Docker) == 1 && len(newGlobalComponentsVersion.Status.AirGapStatus.Docker[0].VersionRange) == 2
 			},
 			want: true,
 		},
@@ -307,10 +307,10 @@ func TestReconcile(t *testing.T) {
 			name: "ComponentsversionGlobal not exist",
 			args: func() bool {
 				controller := &Controller{
-					Client:                     newFakeClient(),
-					ClientSet:                  clientsetfake.NewSimpleClientset(),
-					OfflineversionClientSet:    kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
-					ComponentsversionClientSet: kubeancomponentsversionv1alpha1fake.NewSimpleClientset(),
+					Client:                  newFakeClient(),
+					ClientSet:               clientsetfake.NewSimpleClientset(),
+					OfflineversionClientSet: kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
+					ClusterConfigClientSet:  kubeanclusterconfigv1alpha1fake.NewSimpleClientset(),
 				}
 				offlineVersionData := kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					TypeMeta: metav1.TypeMeta{
@@ -342,10 +342,10 @@ func TestReconcile(t *testing.T) {
 			name: "offlineVersion not found",
 			args: func() bool {
 				controller := &Controller{
-					Client:                     newFakeClient(),
-					ClientSet:                  clientsetfake.NewSimpleClientset(),
-					OfflineversionClientSet:    kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
-					ComponentsversionClientSet: kubeancomponentsversionv1alpha1fake.NewSimpleClientset(),
+					Client:                  newFakeClient(),
+					ClientSet:               clientsetfake.NewSimpleClientset(),
+					OfflineversionClientSet: kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
+					ClusterConfigClientSet:  kubeanclusterconfigv1alpha1fake.NewSimpleClientset(),
 				}
 				result, _ := controller.Reconcile(context.Background(), controllerruntime.Request{NamespacedName: types.NamespacedName{Name: "offlineversion-1"}})
 				return result.Requeue == false && result.RequeueAfter == 0
diff --git a/pkg/util/cluster_test.go b/pkg/util/cluster_test.go
index 27d00461c..6c73fa519 100644
--- a/pkg/util/cluster_test.go
+++ b/pkg/util/cluster_test.go
@@ -6,7 +6,7 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 
-	kubeancomponentsversionv1alpha1 "kubean.io/api/apis/kubeancomponentsversion/v1alpha1"
+	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
 	kubeanofflineversionv1alpha1 "kubean.io/api/apis/kubeanofflineversion/v1alpha1"
 )
 
@@ -18,9 +18,9 @@ func TestNewSchema(t *testing.T) {
 		wantGVK schema.GroupVersionKind
 	}{
 		{
-			name:    "KuBeanComponentsVersion gvk",
-			obj:     &kubeancomponentsversionv1alpha1.KuBeanComponentsVersion{},
-			wantGVK: schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KuBeanComponentsVersion"},
+			name:    "KuBeanClusterConfig gvk",
+			obj:     &kubeanclusterconfigv1alpha1.KubeanClusterConfig{},
+			wantGVK: schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KubeanClusterConfig"},
 		},
 		{
 			name:    "KuBeanOfflineVersion gvk",