Repository: kubean-io/kubean
Pull request #139 (2022-09-14 09:21:18)

Add infomanifest crd
<!--  

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**:

* Add InfoManifest CRD
* fix manage_version_cr.sh and template
* make controller adapted to the InfoManifest CRD

**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**:




Patch:
diff --git a/api/apis/kubeanclusterconfig/v1alpha1/doc.go b/api/apis/kubeaninfomanifest/v1alpha1/doc.go
similarity index 100%
rename from api/apis/kubeanclusterconfig/v1alpha1/doc.go
rename to api/apis/kubeaninfomanifest/v1alpha1/doc.go
diff --git a/api/apis/kubeanclusterconfig/v1alpha1/types.go b/api/apis/kubeaninfomanifest/v1alpha1/types.go
similarity index 88%
rename from api/apis/kubeanclusterconfig/v1alpha1/types.go
rename to api/apis/kubeaninfomanifest/v1alpha1/types.go
index 094394c8a..6e82e21f9 100644
--- a/api/apis/kubeanclusterconfig/v1alpha1/types.go
+++ b/api/apis/kubeaninfomanifest/v1alpha1/types.go
@@ -12,7 +12,7 @@ import (
 // +kubebuilder:subresource:status
 // +kubebuilder:printcolumn:JSONPath=`.metadata.creationTimestamp`,name="Age",type=date
 
-type KubeanClusterConfig struct {
+type KubeanInfoManifest struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
@@ -25,7 +25,7 @@ type KubeanClusterConfig struct {
 
 type Spec struct {
 	// +optional
-	AirGapConfig AirGapConfig `json:"airGapConfig,omitempty"`
+	LocalService LocalService `json:"localService,omitempty"`
 
 	// +required
 	KubesprayVersion string `json:"kubesprayVersion,omitempty"`
@@ -41,7 +41,7 @@ type Spec struct {
 	Docker []*DockerInfo `json:"docker,omitempty"`
 }
 
-type AirGapConfig struct {
+type LocalService struct {
 	// +optional
 	RegistryRepo string `json:"registryRepo,omitempty"`
 	// +optional
@@ -61,10 +61,10 @@ type HostsMap struct {
 
 type Status struct {
 	// +optional
-	AirGapStatus AirGapStatus `json:"airGap,omitempty"`
+	LocalAvailable LocalAvailable `json:"localAvailable,omitempty"`
 }
 
-type AirGapStatus struct {
+type LocalAvailable struct {
 	// +optional
 	KubesprayImage string `json:"kubesprayImage,omitempty"`
 
@@ -77,12 +77,12 @@ type AirGapStatus struct {
 
 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 
-type KubeanClusterConfigList struct {
+type KubeanInfoManifestList struct {
 	metav1.TypeMeta `json:",inline"`
 	metav1.ListMeta `json:"metadata,omitempty"`
 
 	// Items holds a list of KubeanClusterConfig.
-	Items []KubeanClusterConfig `json:"items"`
+	Items []KubeanInfoManifest `json:"items"`
 }
 
 type SoftwareInfo struct {
@@ -135,7 +135,7 @@ func (info *DockerInfoStatus) Merge(versionRange []string) bool {
 	return updated
 }
 
-func (status *AirGapStatus) MergeSoftwareInfo(name string, versionRange []string) bool {
+func (status *LocalAvailable) MergeSoftwareInfo(name string, versionRange []string) bool {
 	var targetNameItem *SoftwareInfoStatus
 	for i := range status.Components {
 		if status.Components[i].Name == name {
@@ -151,7 +151,7 @@ func (status *AirGapStatus) MergeSoftwareInfo(name string, versionRange []string
 	return targetNameItem.Merge(versionRange)
 }
 
-func (status *AirGapStatus) MergeDockerInfo(osName string, versionRange []string) bool {
+func (status *LocalAvailable) 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/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go b/api/apis/kubeaninfomanifest/v1alpha1/zz_generated.deepcopy.go
similarity index 86%
rename from api/apis/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go
rename to api/apis/kubeaninfomanifest/v1alpha1/zz_generated.deepcopy.go
index e78e1bde5..f45fd241f 100644
--- a/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go
+++ b/api/apis/kubeaninfomanifest/v1alpha1/zz_generated.deepcopy.go
@@ -9,70 +9,6 @@ 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
@@ -132,7 +68,7 @@ func (in *HostsMap) DeepCopy() *HostsMap {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *KubeanClusterConfig) DeepCopyInto(out *KubeanClusterConfig) {
+func (in *KubeanInfoManifest) DeepCopyInto(out *KubeanInfoManifest) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
@@ -141,18 +77,18 @@ func (in *KubeanClusterConfig) DeepCopyInto(out *KubeanClusterConfig) {
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanClusterConfig.
-func (in *KubeanClusterConfig) DeepCopy() *KubeanClusterConfig {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanInfoManifest.
+func (in *KubeanInfoManifest) DeepCopy() *KubeanInfoManifest {
 	if in == nil {
 		return nil
 	}
-	out := new(KubeanClusterConfig)
+	out := new(KubeanInfoManifest)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *KubeanClusterConfig) DeepCopyObject() runtime.Object {
+func (in *KubeanInfoManifest) DeepCopyObject() runtime.Object {
 	if c := in.DeepCopy(); c != nil {
 		return c
 	}
@@ -160,13 +96,13 @@ func (in *KubeanClusterConfig) DeepCopyObject() runtime.Object {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *KubeanClusterConfigList) DeepCopyInto(out *KubeanClusterConfigList) {
+func (in *KubeanInfoManifestList) DeepCopyInto(out *KubeanInfoManifestList) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ListMeta.DeepCopyInto(&out.ListMeta)
 	if in.Items != nil {
 		in, out := &in.Items, &out.Items
-		*out = make([]KubeanClusterConfig, len(*in))
+		*out = make([]KubeanInfoManifest, len(*in))
 		for i := range *in {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
@@ -174,24 +110,88 @@ func (in *KubeanClusterConfigList) DeepCopyInto(out *KubeanClusterConfigList) {
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanClusterConfigList.
-func (in *KubeanClusterConfigList) DeepCopy() *KubeanClusterConfigList {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanInfoManifestList.
+func (in *KubeanInfoManifestList) DeepCopy() *KubeanInfoManifestList {
 	if in == nil {
 		return nil
 	}
-	out := new(KubeanClusterConfigList)
+	out := new(KubeanInfoManifestList)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *KubeanClusterConfigList) DeepCopyObject() runtime.Object {
+func (in *KubeanInfoManifestList) 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 *LocalAvailable) DeepCopyInto(out *LocalAvailable) {
+	*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 LocalAvailable.
+func (in *LocalAvailable) DeepCopy() *LocalAvailable {
+	if in == nil {
+		return nil
+	}
+	out := new(LocalAvailable)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LocalService) DeepCopyInto(out *LocalService) {
+	*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 LocalService.
+func (in *LocalService) DeepCopy() *LocalService {
+	if in == nil {
+		return nil
+	}
+	out := new(LocalService)
+	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
@@ -237,7 +237,7 @@ 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
-	in.AirGapConfig.DeepCopyInto(&out.AirGapConfig)
+	in.LocalService.DeepCopyInto(&out.LocalService)
 	if in.Components != nil {
 		in, out := &in.Components, &out.Components
 		*out = make([]*SoftwareInfo, len(*in))
@@ -276,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.AirGapStatus.DeepCopyInto(&out.AirGapStatus)
+	in.LocalAvailable.DeepCopyInto(&out.LocalAvailable)
 	return
 }
 
diff --git a/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go b/api/apis/kubeaninfomanifest/v1alpha1/zz_generated.register.go
similarity index 96%
rename from vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go
rename to api/apis/kubeaninfomanifest/v1alpha1/zz_generated.register.go
index 66be7db16..fc4f7fefc 100644
--- a/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go
+++ b/api/apis/kubeaninfomanifest/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,
-		&KubeanClusterConfig{},
-		&KubeanClusterConfigList{},
+		&KubeanInfoManifest{},
+		&KubeanInfoManifestList{},
 	)
 	// AddToGroupVersion allows the serialization of client types like ListOptions.
 	v1.AddToGroupVersion(scheme, SchemeGroupVersion)
diff --git a/charts/kubean/_crds/kubean.io_kubeanclusterconfigs.yaml b/api/charts/_crds/kubean.io_kubeaninfomanifests.yaml
similarity index 94%
rename from charts/kubean/_crds/kubean.io_kubeanclusterconfigs.yaml
rename to api/charts/_crds/kubean.io_kubeaninfomanifests.yaml
index 535ba0e09..0e50fc4e0 100644
--- a/charts/kubean/_crds/kubean.io_kubeanclusterconfigs.yaml
+++ b/api/charts/_crds/kubean.io_kubeaninfomanifests.yaml
@@ -6,14 +6,14 @@ metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.6.2
   creationTimestamp: null
-  name: kubeanclusterconfigs.kubean.io
+  name: kubeaninfomanifests.kubean.io
 spec:
   group: kubean.io
   names:
-    kind: KubeanClusterConfig
-    listKind: KubeanClusterConfigList
-    plural: kubeanclusterconfigs
-    singular: kubeanclusterconfig
+    kind: KubeanInfoManifest
+    listKind: KubeanInfoManifestList
+    plural: kubeaninfomanifests
+    singular: kubeaninfomanifest
   scope: Cluster
   versions:
   - additionalPrinterColumns:
@@ -38,26 +38,6 @@ spec:
             type: object
           spec:
             properties:
-              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:
@@ -93,10 +73,30 @@ spec:
                 type: string
               kubesprayVersion:
                 type: string
+              localService:
+                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
             type: object
           status:
             properties:
-              airGap:
+              localAvailable:
                 properties:
                   components:
                     items:
diff --git a/api/constants/constants.go b/api/constants/constants.go
index d3391db97..1d2749e7d 100644
--- a/api/constants/constants.go
+++ b/api/constants/constants.go
@@ -1,5 +1,5 @@
 package constants
 
-const ClusterConfigGlobal = "clusterconfig-global"
+const InfoManifestGlobal = "infomanifest-global"
 
 const KubeanClusterLabelKey = "clusterName"
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
deleted file mode 100644
index adc14b897..000000000
--- a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.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/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/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
deleted file mode 100644
index 2bd59bfac..000000000
--- a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.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/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/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
deleted file mode 100644
index fcf9d8a89..000000000
--- a/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.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"
-	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/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.go
deleted file mode 100644
index adc14b897..000000000
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.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/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/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
deleted file mode 100644
index 2bd59bfac..000000000
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.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/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/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
deleted file mode 100644
index fcf9d8a89..000000000
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.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"
-	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
deleted file mode 100644
index 9bd849fc6..000000000
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/expansion_generated.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// 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
deleted file mode 100644
index 04e2af0aa..000000000
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.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/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
deleted file mode 100644
index 9bd849fc6..000000000
--- a/api/generated/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/expansion_generated.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// 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
deleted file mode 100644
index 04e2af0aa..000000000
--- a/api/generated/kubeanclusterconfig/listers/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.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/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/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/clientset.go b/api/generated/kubeaninfomanifest/clientset/versioned/clientset.go
similarity index 96%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/clientset.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/clientset.go
index 3cd6208e4..210971521 100644
--- a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/clientset.go
+++ b/api/generated/kubeaninfomanifest/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/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1"
 )
 
 type Interface interface {
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/doc.go b/api/generated/kubeaninfomanifest/clientset/versioned/doc.go
similarity index 100%
rename from api/generated/kubeanclusterconfig/clientset/versioned/doc.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/doc.go
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go b/api/generated/kubeaninfomanifest/clientset/versioned/fake/clientset_generated.go
similarity index 86%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/fake/clientset_generated.go
index 06fe2e5c4..7ab366712 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
+++ b/api/generated/kubeaninfomanifest/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/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"
+	clientset "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1"
+	fakekubeanv1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake"
 )
 
 // NewSimpleClientset returns a clientset that will respond with the provided objects.
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/fake/doc.go b/api/generated/kubeaninfomanifest/clientset/versioned/fake/doc.go
similarity index 100%
rename from api/generated/kubeanclusterconfig/clientset/versioned/fake/doc.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/fake/doc.go
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/register.go b/api/generated/kubeaninfomanifest/clientset/versioned/fake/register.go
similarity index 94%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/register.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/fake/register.go
index 557be1df8..e91827611 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/register.go
+++ b/api/generated/kubeaninfomanifest/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/kubeanclusterconfig/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
 )
 
 var scheme = runtime.NewScheme()
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/scheme/doc.go b/api/generated/kubeaninfomanifest/clientset/versioned/scheme/doc.go
similarity index 100%
rename from api/generated/kubeanclusterconfig/clientset/versioned/scheme/doc.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/scheme/doc.go
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go b/api/generated/kubeaninfomanifest/clientset/versioned/scheme/register.go
similarity index 95%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/scheme/register.go
index dc3db3d44..7aafdceda 100644
--- a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go
+++ b/api/generated/kubeaninfomanifest/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/kubeanclusterconfig/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
 )
 
 var Scheme = runtime.NewScheme()
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/doc.go
similarity index 100%
rename from api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/doc.go
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/doc.go
similarity index 100%
rename from api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/doc.go
diff --git a/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest.go b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest.go
new file mode 100644
index 000000000..aa40bed90
--- /dev/null
+++ b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest.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/kubeaninfomanifest/v1alpha1"
+)
+
+// FakeKubeanInfoManifests implements KubeanInfoManifestInterface
+type FakeKubeanInfoManifests struct {
+	Fake *FakeKubeanV1alpha1
+}
+
+var kubeaninfomanifestsResource = schema.GroupVersionResource{Group: "kubean.io", Version: "v1alpha1", Resource: "kubeaninfomanifests"}
+
+var kubeaninfomanifestsKind = schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KubeanInfoManifest"}
+
+// Get takes name of the kubeanInfoManifest, and returns the corresponding kubeanInfoManifest object, and an error if there is any.
+func (c *FakeKubeanInfoManifests) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootGetAction(kubeaninfomanifestsResource, name), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
+
+// List takes label and field selectors, and returns the list of KubeanInfoManifests that match those selectors.
+func (c *FakeKubeanInfoManifests) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanInfoManifestList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootListAction(kubeaninfomanifestsResource, kubeaninfomanifestsKind, opts), &v1alpha1.KubeanInfoManifestList{})
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.KubeanInfoManifestList{ListMeta: obj.(*v1alpha1.KubeanInfoManifestList).ListMeta}
+	for _, item := range obj.(*v1alpha1.KubeanInfoManifestList).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 kubeanInfoManifests.
+func (c *FakeKubeanInfoManifests) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewRootWatchAction(kubeaninfomanifestsResource, opts))
+}
+
+// Create takes the representation of a kubeanInfoManifest and creates it.  Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *FakeKubeanInfoManifests) Create(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.CreateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootCreateAction(kubeaninfomanifestsResource, kubeanInfoManifest), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
+
+// Update takes the representation of a kubeanInfoManifest and updates it. Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *FakeKubeanInfoManifests) Update(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateAction(kubeaninfomanifestsResource, kubeanInfoManifest), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), 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 *FakeKubeanInfoManifests) UpdateStatus(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (*v1alpha1.KubeanInfoManifest, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateSubresourceAction(kubeaninfomanifestsResource, "status", kubeanInfoManifest), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
+
+// Delete takes name of the kubeanInfoManifest and deletes it. Returns an error if one occurs.
+func (c *FakeKubeanInfoManifests) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewRootDeleteActionWithOptions(kubeaninfomanifestsResource, name, opts), &v1alpha1.KubeanInfoManifest{})
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeKubeanInfoManifests) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewRootDeleteCollectionAction(kubeaninfomanifestsResource, listOpts)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.KubeanInfoManifestList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched kubeanInfoManifest.
+func (c *FakeKubeanInfoManifests) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootPatchSubresourceAction(kubeaninfomanifestsResource, name, pt, data, subresources...), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest_client.go
similarity index 62%
rename from api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest_client.go
index f20526904..13d796cee 100644
--- a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
+++ b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest_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/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
+	v1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1"
 )
 
 type FakeKubeanV1alpha1 struct {
 	*testing.Fake
 }
 
-func (c *FakeKubeanV1alpha1) KubeanClusterConfigs() v1alpha1.KubeanClusterConfigInterface {
-	return &FakeKubeanClusterConfigs{c}
+func (c *FakeKubeanV1alpha1) KubeanInfoManifests() v1alpha1.KubeanInfoManifestInterface {
+	return &FakeKubeanInfoManifests{c}
 }
 
 // RESTClient returns a RESTClient that is used to communicate
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/generated_expansion.go
similarity index 58%
rename from api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/generated_expansion.go
index f9e6297b1..13c9ccce4 100644
--- a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
+++ b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/generated_expansion.go
@@ -2,4 +2,4 @@
 
 package v1alpha1
 
-type KubeanClusterConfigExpansion interface{}
+type KubeanInfoManifestExpansion interface{}
diff --git a/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go
new file mode 100644
index 000000000..f9401b93a
--- /dev/null
+++ b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.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/kubeaninfomanifest/v1alpha1"
+	scheme "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme"
+)
+
+// KubeanInfoManifestsGetter has a method to return a KubeanInfoManifestInterface.
+// A group's client should implement this interface.
+type KubeanInfoManifestsGetter interface {
+	KubeanInfoManifests() KubeanInfoManifestInterface
+}
+
+// KubeanInfoManifestInterface has methods to work with KubeanInfoManifest resources.
+type KubeanInfoManifestInterface interface {
+	Create(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.CreateOptions) (*v1alpha1.KubeanInfoManifest, error)
+	Update(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (*v1alpha1.KubeanInfoManifest, error)
+	UpdateStatus(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (*v1alpha1.KubeanInfoManifest, 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.KubeanInfoManifest, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.KubeanInfoManifestList, 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.KubeanInfoManifest, err error)
+	KubeanInfoManifestExpansion
+}
+
+// kubeanInfoManifests implements KubeanInfoManifestInterface
+type kubeanInfoManifests struct {
+	client rest.Interface
+}
+
+// newKubeanInfoManifests returns a KubeanInfoManifests
+func newKubeanInfoManifests(c *KubeanV1alpha1Client) *kubeanInfoManifests {
+	return &kubeanInfoManifests{
+		client: c.RESTClient(),
+	}
+}
+
+// Get takes name of the kubeanInfoManifest, and returns the corresponding kubeanInfoManifest object, and an error if there is any.
+func (c *kubeanInfoManifests) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Get().
+		Resource("kubeaninfomanifests").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of KubeanInfoManifests that match those selectors.
+func (c *kubeanInfoManifests) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanInfoManifestList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.KubeanInfoManifestList{}
+	err = c.client.Get().
+		Resource("kubeaninfomanifests").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested kubeanInfoManifests.
+func (c *kubeanInfoManifests) 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("kubeaninfomanifests").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch(ctx)
+}
+
+// Create takes the representation of a kubeanInfoManifest and creates it.  Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *kubeanInfoManifests) Create(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.CreateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Post().
+		Resource("kubeaninfomanifests").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanInfoManifest).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Update takes the representation of a kubeanInfoManifest and updates it. Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *kubeanInfoManifests) Update(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Put().
+		Resource("kubeaninfomanifests").
+		Name(kubeanInfoManifest.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanInfoManifest).
+		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 *kubeanInfoManifests) UpdateStatus(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Put().
+		Resource("kubeaninfomanifests").
+		Name(kubeanInfoManifest.Name).
+		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanInfoManifest).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Delete takes name of the kubeanInfoManifest and deletes it. Returns an error if one occurs.
+func (c *kubeanInfoManifests) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return c.client.Delete().
+		Resource("kubeaninfomanifests").
+		Name(name).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *kubeanInfoManifests) 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("kubeaninfomanifests").
+		VersionedParams(&listOpts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// Patch applies the patch and returns the patched kubeanInfoManifest.
+func (c *kubeanInfoManifests) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Patch(pt).
+		Resource("kubeaninfomanifests").
+		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(data).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest_client.go
similarity index 89%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
rename to api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest_client.go
index 4852f2ea6..a3a63e9a2 100644
--- a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
+++ b/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest_client.go
@@ -6,13 +6,13 @@ import (
 	"net/http"
 
 	rest "k8s.io/client-go/rest"
-	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
-	"kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme"
+	v1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
+	"kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme"
 )
 
 type KubeanV1alpha1Interface interface {
 	RESTClient() rest.Interface
-	KubeanClusterConfigsGetter
+	KubeanInfoManifestsGetter
 }
 
 // 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) KubeanClusterConfigs() KubeanClusterConfigInterface {
-	return newKubeanClusterConfigs(c)
+func (c *KubeanV1alpha1Client) KubeanInfoManifests() KubeanInfoManifestInterface {
+	return newKubeanInfoManifests(c)
 }
 
 // NewForConfig creates a new KubeanV1alpha1Client for the given config.
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/factory.go b/api/generated/kubeaninfomanifest/informers/externalversions/factory.go
similarity index 91%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/factory.go
rename to api/generated/kubeaninfomanifest/informers/externalversions/factory.go
index a6b922347..4061ceec8 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/factory.go
+++ b/api/generated/kubeaninfomanifest/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/kubeanclusterconfig/clientset/versioned"
-	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
-	kubeanclusterconfig "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig"
+	versioned "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned"
+	internalinterfaces "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/internalinterfaces"
+	kubeaninfomanifest "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest"
 )
 
 // 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() kubeanclusterconfig.Interface
+	Kubean() kubeaninfomanifest.Interface
 }
 
-func (f *sharedInformerFactory) Kubean() kubeanclusterconfig.Interface {
-	return kubeanclusterconfig.New(f, f.namespace, f.tweakListOptions)
+func (f *sharedInformerFactory) Kubean() kubeaninfomanifest.Interface {
+	return kubeaninfomanifest.New(f, f.namespace, f.tweakListOptions)
 }
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/generic.go b/api/generated/kubeaninfomanifest/informers/externalversions/generic.go
similarity index 86%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/generic.go
rename to api/generated/kubeaninfomanifest/informers/externalversions/generic.go
index 978d3d400..3daf060d6 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/generic.go
+++ b/api/generated/kubeaninfomanifest/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/kubeanclusterconfig/v1alpha1"
+	v1alpha1 "kubean.io/api/apis/kubeaninfomanifest/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("kubeanclusterconfigs"):
-		return &genericInformer{resource: resource.GroupResource(), informer: f.Kubean().V1alpha1().KubeanClusterConfigs().Informer()}, nil
+	case v1alpha1.SchemeGroupVersion.WithResource("kubeaninfomanifests"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Kubean().V1alpha1().KubeanInfoManifests().Informer()}, nil
 
 	}
 
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go b/api/generated/kubeaninfomanifest/informers/externalversions/internalinterfaces/factory_interfaces.go
similarity index 91%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go
rename to api/generated/kubeaninfomanifest/informers/externalversions/internalinterfaces/factory_interfaces.go
index 247fb7ef2..f6ce49cec 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go
+++ b/api/generated/kubeaninfomanifest/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/kubeanclusterconfig/clientset/versioned"
+	versioned "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned"
 )
 
 // NewInformerFunc takes versioned.Interface and time.Duration to return a SharedIndexInformer.
diff --git a/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go b/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/interface.go
similarity index 77%
rename from api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go
rename to api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/interface.go
index 71b060e93..88bd36033 100644
--- a/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go
+++ b/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/interface.go
@@ -1,10 +1,10 @@
 // Code generated by informer-gen. DO NOT EDIT.
 
-package kubeanclusterconfig
+package kubeaninfomanifest
 
 import (
-	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
-	v1alpha1 "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1"
+	internalinterfaces "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/internalinterfaces"
+	v1alpha1 "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1"
 )
 
 // Interface provides access to each of this group's versions.
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go b/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/interface.go
similarity index 57%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go
rename to api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/interface.go
index 16d231895..734e8fa24 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go
+++ b/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/interface.go
@@ -3,13 +3,13 @@
 package v1alpha1
 
 import (
-	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
+	internalinterfaces "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/internalinterfaces"
 )
 
 // Interface provides access to all the informers in this group version.
 type Interface interface {
-	// KubeanClusterConfigs returns a KubeanClusterConfigInformer.
-	KubeanClusterConfigs() KubeanClusterConfigInformer
+	// KubeanInfoManifests returns a KubeanInfoManifestInformer.
+	KubeanInfoManifests() KubeanInfoManifestInformer
 }
 
 type version struct {
@@ -23,7 +23,7 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList
 	return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
 }
 
-// KubeanClusterConfigs returns a KubeanClusterConfigInformer.
-func (v *version) KubeanClusterConfigs() KubeanClusterConfigInformer {
-	return &kubeanClusterConfigInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
+// KubeanInfoManifests returns a KubeanInfoManifestInformer.
+func (v *version) KubeanInfoManifests() KubeanInfoManifestInformer {
+	return &kubeanInfoManifestInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
 }
diff --git a/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go b/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go
new file mode 100644
index 000000000..70c53ae53
--- /dev/null
+++ b/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.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"
+	kubeaninfomanifestv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
+	versioned "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned"
+	internalinterfaces "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/internalinterfaces"
+	v1alpha1 "kubean.io/api/generated/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1"
+)
+
+// KubeanInfoManifestInformer provides access to a shared informer and lister for
+// KubeanInfoManifests.
+type KubeanInfoManifestInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() v1alpha1.KubeanInfoManifestLister
+}
+
+type kubeanInfoManifestInformer struct {
+	factory          internalinterfaces.SharedInformerFactory
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+}
+
+// NewKubeanInfoManifestInformer constructs a new informer for KubeanInfoManifest 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 NewKubeanInfoManifestInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredKubeanInfoManifestInformer(client, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredKubeanInfoManifestInformer constructs a new informer for KubeanInfoManifest 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 NewFilteredKubeanInfoManifestInformer(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().KubeanInfoManifests().List(context.TODO(), options)
+			},
+			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.KubeanV1alpha1().KubeanInfoManifests().Watch(context.TODO(), options)
+			},
+		},
+		&kubeaninfomanifestv1alpha1.KubeanInfoManifest{},
+		resyncPeriod,
+		indexers,
+	)
+}
+
+func (f *kubeanInfoManifestInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+	return NewFilteredKubeanInfoManifestInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *kubeanInfoManifestInformer) Informer() cache.SharedIndexInformer {
+	return f.factory.InformerFor(&kubeaninfomanifestv1alpha1.KubeanInfoManifest{}, f.defaultInformer)
+}
+
+func (f *kubeanInfoManifestInformer) Lister() v1alpha1.KubeanInfoManifestLister {
+	return v1alpha1.NewKubeanInfoManifestLister(f.Informer().GetIndexer())
+}
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/clientset.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/clientset.go
similarity index 96%
rename from api/generated/kubeanclusterconfig/clientset/versioned/clientset.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/clientset.go
index 3cd6208e4..210971521 100644
--- a/api/generated/kubeanclusterconfig/clientset/versioned/clientset.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/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/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1"
 )
 
 type Interface interface {
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/doc.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/doc.go
similarity index 100%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/doc.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/doc.go
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/fake/clientset_generated.go
similarity index 86%
rename from api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/fake/clientset_generated.go
index 06fe2e5c4..7ab366712 100644
--- a/api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/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/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"
+	clientset "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1"
+	fakekubeanv1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake"
 )
 
 // NewSimpleClientset returns a clientset that will respond with the provided objects.
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/doc.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/fake/doc.go
similarity index 100%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/fake/doc.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/fake/doc.go
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/fake/register.go
similarity index 94%
rename from api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/fake/register.go
index 557be1df8..e91827611 100644
--- a/api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/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/kubeanclusterconfig/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
 )
 
 var scheme = runtime.NewScheme()
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/scheme/doc.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/scheme/doc.go
similarity index 100%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/scheme/doc.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/scheme/doc.go
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/scheme/register.go
similarity index 95%
rename from api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/scheme/register.go
index dc3db3d44..7aafdceda 100644
--- a/api/generated/kubeanclusterconfig/clientset/versioned/scheme/register.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/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/kubeanclusterconfig/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
 )
 
 var Scheme = runtime.NewScheme()
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/doc.go
similarity index 100%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/doc.go
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/doc.go
similarity index 100%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/doc.go
diff --git a/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest.go
new file mode 100644
index 000000000..aa40bed90
--- /dev/null
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest.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/kubeaninfomanifest/v1alpha1"
+)
+
+// FakeKubeanInfoManifests implements KubeanInfoManifestInterface
+type FakeKubeanInfoManifests struct {
+	Fake *FakeKubeanV1alpha1
+}
+
+var kubeaninfomanifestsResource = schema.GroupVersionResource{Group: "kubean.io", Version: "v1alpha1", Resource: "kubeaninfomanifests"}
+
+var kubeaninfomanifestsKind = schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KubeanInfoManifest"}
+
+// Get takes name of the kubeanInfoManifest, and returns the corresponding kubeanInfoManifest object, and an error if there is any.
+func (c *FakeKubeanInfoManifests) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootGetAction(kubeaninfomanifestsResource, name), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
+
+// List takes label and field selectors, and returns the list of KubeanInfoManifests that match those selectors.
+func (c *FakeKubeanInfoManifests) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanInfoManifestList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootListAction(kubeaninfomanifestsResource, kubeaninfomanifestsKind, opts), &v1alpha1.KubeanInfoManifestList{})
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.KubeanInfoManifestList{ListMeta: obj.(*v1alpha1.KubeanInfoManifestList).ListMeta}
+	for _, item := range obj.(*v1alpha1.KubeanInfoManifestList).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 kubeanInfoManifests.
+func (c *FakeKubeanInfoManifests) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewRootWatchAction(kubeaninfomanifestsResource, opts))
+}
+
+// Create takes the representation of a kubeanInfoManifest and creates it.  Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *FakeKubeanInfoManifests) Create(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.CreateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootCreateAction(kubeaninfomanifestsResource, kubeanInfoManifest), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
+
+// Update takes the representation of a kubeanInfoManifest and updates it. Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *FakeKubeanInfoManifests) Update(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateAction(kubeaninfomanifestsResource, kubeanInfoManifest), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), 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 *FakeKubeanInfoManifests) UpdateStatus(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (*v1alpha1.KubeanInfoManifest, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateSubresourceAction(kubeaninfomanifestsResource, "status", kubeanInfoManifest), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
+
+// Delete takes name of the kubeanInfoManifest and deletes it. Returns an error if one occurs.
+func (c *FakeKubeanInfoManifests) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewRootDeleteActionWithOptions(kubeaninfomanifestsResource, name, opts), &v1alpha1.KubeanInfoManifest{})
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeKubeanInfoManifests) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewRootDeleteCollectionAction(kubeaninfomanifestsResource, listOpts)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.KubeanInfoManifestList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched kubeanInfoManifest.
+func (c *FakeKubeanInfoManifests) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootPatchSubresourceAction(kubeaninfomanifestsResource, name, pt, data, subresources...), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest_client.go
similarity index 62%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest_client.go
index f20526904..13d796cee 100644
--- a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest_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/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
+	v1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1"
 )
 
 type FakeKubeanV1alpha1 struct {
 	*testing.Fake
 }
 
-func (c *FakeKubeanV1alpha1) KubeanClusterConfigs() v1alpha1.KubeanClusterConfigInterface {
-	return &FakeKubeanClusterConfigs{c}
+func (c *FakeKubeanV1alpha1) KubeanInfoManifests() v1alpha1.KubeanInfoManifestInterface {
+	return &FakeKubeanInfoManifests{c}
 }
 
 // RESTClient returns a RESTClient that is used to communicate
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/generated_expansion.go
similarity index 58%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/generated_expansion.go
index f9e6297b1..13c9ccce4 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/generated_expansion.go
@@ -2,4 +2,4 @@
 
 package v1alpha1
 
-type KubeanClusterConfigExpansion interface{}
+type KubeanInfoManifestExpansion interface{}
diff --git a/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go
new file mode 100644
index 000000000..f9401b93a
--- /dev/null
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.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/kubeaninfomanifest/v1alpha1"
+	scheme "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme"
+)
+
+// KubeanInfoManifestsGetter has a method to return a KubeanInfoManifestInterface.
+// A group's client should implement this interface.
+type KubeanInfoManifestsGetter interface {
+	KubeanInfoManifests() KubeanInfoManifestInterface
+}
+
+// KubeanInfoManifestInterface has methods to work with KubeanInfoManifest resources.
+type KubeanInfoManifestInterface interface {
+	Create(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.CreateOptions) (*v1alpha1.KubeanInfoManifest, error)
+	Update(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (*v1alpha1.KubeanInfoManifest, error)
+	UpdateStatus(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (*v1alpha1.KubeanInfoManifest, 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.KubeanInfoManifest, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.KubeanInfoManifestList, 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.KubeanInfoManifest, err error)
+	KubeanInfoManifestExpansion
+}
+
+// kubeanInfoManifests implements KubeanInfoManifestInterface
+type kubeanInfoManifests struct {
+	client rest.Interface
+}
+
+// newKubeanInfoManifests returns a KubeanInfoManifests
+func newKubeanInfoManifests(c *KubeanV1alpha1Client) *kubeanInfoManifests {
+	return &kubeanInfoManifests{
+		client: c.RESTClient(),
+	}
+}
+
+// Get takes name of the kubeanInfoManifest, and returns the corresponding kubeanInfoManifest object, and an error if there is any.
+func (c *kubeanInfoManifests) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Get().
+		Resource("kubeaninfomanifests").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of KubeanInfoManifests that match those selectors.
+func (c *kubeanInfoManifests) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanInfoManifestList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.KubeanInfoManifestList{}
+	err = c.client.Get().
+		Resource("kubeaninfomanifests").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested kubeanInfoManifests.
+func (c *kubeanInfoManifests) 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("kubeaninfomanifests").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch(ctx)
+}
+
+// Create takes the representation of a kubeanInfoManifest and creates it.  Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *kubeanInfoManifests) Create(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.CreateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Post().
+		Resource("kubeaninfomanifests").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanInfoManifest).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Update takes the representation of a kubeanInfoManifest and updates it. Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *kubeanInfoManifests) Update(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Put().
+		Resource("kubeaninfomanifests").
+		Name(kubeanInfoManifest.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanInfoManifest).
+		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 *kubeanInfoManifests) UpdateStatus(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Put().
+		Resource("kubeaninfomanifests").
+		Name(kubeanInfoManifest.Name).
+		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanInfoManifest).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Delete takes name of the kubeanInfoManifest and deletes it. Returns an error if one occurs.
+func (c *kubeanInfoManifests) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return c.client.Delete().
+		Resource("kubeaninfomanifests").
+		Name(name).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *kubeanInfoManifests) 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("kubeaninfomanifests").
+		VersionedParams(&listOpts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// Patch applies the patch and returns the patched kubeanInfoManifest.
+func (c *kubeanInfoManifests) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Patch(pt).
+		Resource("kubeaninfomanifests").
+		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(data).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest_client.go
similarity index 89%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest_client.go
index 4852f2ea6..a3a63e9a2 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest_client.go
@@ -6,13 +6,13 @@ import (
 	"net/http"
 
 	rest "k8s.io/client-go/rest"
-	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
-	"kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme"
+	v1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
+	"kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme"
 )
 
 type KubeanV1alpha1Interface interface {
 	RESTClient() rest.Interface
-	KubeanClusterConfigsGetter
+	KubeanInfoManifestsGetter
 }
 
 // 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) KubeanClusterConfigs() KubeanClusterConfigInterface {
-	return newKubeanClusterConfigs(c)
+func (c *KubeanV1alpha1Client) KubeanInfoManifests() KubeanInfoManifestInterface {
+	return newKubeanInfoManifests(c)
 }
 
 // NewForConfig creates a new KubeanV1alpha1Client for the given config.
diff --git a/api/generated/kubeanclusterconfig/informers/externalversions/factory.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/factory.go
similarity index 91%
rename from api/generated/kubeanclusterconfig/informers/externalversions/factory.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/factory.go
index a6b922347..4061ceec8 100644
--- a/api/generated/kubeanclusterconfig/informers/externalversions/factory.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/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/kubeanclusterconfig/clientset/versioned"
-	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
-	kubeanclusterconfig "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig"
+	versioned "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned"
+	internalinterfaces "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/internalinterfaces"
+	kubeaninfomanifest "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest"
 )
 
 // 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() kubeanclusterconfig.Interface
+	Kubean() kubeaninfomanifest.Interface
 }
 
-func (f *sharedInformerFactory) Kubean() kubeanclusterconfig.Interface {
-	return kubeanclusterconfig.New(f, f.namespace, f.tweakListOptions)
+func (f *sharedInformerFactory) Kubean() kubeaninfomanifest.Interface {
+	return kubeaninfomanifest.New(f, f.namespace, f.tweakListOptions)
 }
diff --git a/api/generated/kubeanclusterconfig/informers/externalversions/generic.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/generic.go
similarity index 86%
rename from api/generated/kubeanclusterconfig/informers/externalversions/generic.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/generic.go
index 978d3d400..3daf060d6 100644
--- a/api/generated/kubeanclusterconfig/informers/externalversions/generic.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/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/kubeanclusterconfig/v1alpha1"
+	v1alpha1 "kubean.io/api/apis/kubeaninfomanifest/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("kubeanclusterconfigs"):
-		return &genericInformer{resource: resource.GroupResource(), informer: f.Kubean().V1alpha1().KubeanClusterConfigs().Informer()}, nil
+	case v1alpha1.SchemeGroupVersion.WithResource("kubeaninfomanifests"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Kubean().V1alpha1().KubeanInfoManifests().Informer()}, nil
 
 	}
 
diff --git a/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/internalinterfaces/factory_interfaces.go
similarity index 91%
rename from api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/internalinterfaces/factory_interfaces.go
index 247fb7ef2..f6ce49cec 100644
--- a/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces/factory_interfaces.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/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/kubeanclusterconfig/clientset/versioned"
+	versioned "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned"
 )
 
 // NewInformerFunc takes versioned.Interface and time.Duration to return a SharedIndexInformer.
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/interface.go
similarity index 77%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/interface.go
index 71b060e93..88bd36033 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/interface.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/interface.go
@@ -1,10 +1,10 @@
 // Code generated by informer-gen. DO NOT EDIT.
 
-package kubeanclusterconfig
+package kubeaninfomanifest
 
 import (
-	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
-	v1alpha1 "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1"
+	internalinterfaces "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/internalinterfaces"
+	v1alpha1 "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1"
 )
 
 // Interface provides access to each of this group's versions.
diff --git a/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/interface.go
similarity index 57%
rename from api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go
rename to api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/interface.go
index 16d231895..734e8fa24 100644
--- a/api/generated/kubeanclusterconfig/informers/externalversions/kubeanclusterconfig/v1alpha1/interface.go
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/interface.go
@@ -3,13 +3,13 @@
 package v1alpha1
 
 import (
-	internalinterfaces "kubean.io/api/generated/kubeanclusterconfig/informers/externalversions/internalinterfaces"
+	internalinterfaces "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/internalinterfaces"
 )
 
 // Interface provides access to all the informers in this group version.
 type Interface interface {
-	// KubeanClusterConfigs returns a KubeanClusterConfigInformer.
-	KubeanClusterConfigs() KubeanClusterConfigInformer
+	// KubeanInfoManifests returns a KubeanInfoManifestInformer.
+	KubeanInfoManifests() KubeanInfoManifestInformer
 }
 
 type version struct {
@@ -23,7 +23,7 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList
 	return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
 }
 
-// KubeanClusterConfigs returns a KubeanClusterConfigInformer.
-func (v *version) KubeanClusterConfigs() KubeanClusterConfigInformer {
-	return &kubeanClusterConfigInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
+// KubeanInfoManifests returns a KubeanInfoManifestInformer.
+func (v *version) KubeanInfoManifests() KubeanInfoManifestInformer {
+	return &kubeanInfoManifestInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
 }
diff --git a/api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go
new file mode 100644
index 000000000..70c53ae53
--- /dev/null
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/informers/externalversions/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.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"
+	kubeaninfomanifestv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
+	versioned "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned"
+	internalinterfaces "kubean.io/api/generated/kubeaninfomanifest/informers/externalversions/internalinterfaces"
+	v1alpha1 "kubean.io/api/generated/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1"
+)
+
+// KubeanInfoManifestInformer provides access to a shared informer and lister for
+// KubeanInfoManifests.
+type KubeanInfoManifestInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() v1alpha1.KubeanInfoManifestLister
+}
+
+type kubeanInfoManifestInformer struct {
+	factory          internalinterfaces.SharedInformerFactory
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+}
+
+// NewKubeanInfoManifestInformer constructs a new informer for KubeanInfoManifest 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 NewKubeanInfoManifestInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredKubeanInfoManifestInformer(client, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredKubeanInfoManifestInformer constructs a new informer for KubeanInfoManifest 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 NewFilteredKubeanInfoManifestInformer(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().KubeanInfoManifests().List(context.TODO(), options)
+			},
+			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.KubeanV1alpha1().KubeanInfoManifests().Watch(context.TODO(), options)
+			},
+		},
+		&kubeaninfomanifestv1alpha1.KubeanInfoManifest{},
+		resyncPeriod,
+		indexers,
+	)
+}
+
+func (f *kubeanInfoManifestInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+	return NewFilteredKubeanInfoManifestInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *kubeanInfoManifestInformer) Informer() cache.SharedIndexInformer {
+	return f.factory.InformerFor(&kubeaninfomanifestv1alpha1.KubeanInfoManifest{}, f.defaultInformer)
+}
+
+func (f *kubeanInfoManifestInformer) Lister() v1alpha1.KubeanInfoManifestLister {
+	return v1alpha1.NewKubeanInfoManifestLister(f.Informer().GetIndexer())
+}
diff --git a/api/generated/kubeaninfomanifest/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/expansion_generated.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/expansion_generated.go
new file mode 100644
index 000000000..7259362ce
--- /dev/null
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/expansion_generated.go
@@ -0,0 +1,7 @@
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+// KubeanInfoManifestListerExpansion allows custom methods to be added to
+// KubeanInfoManifestLister.
+type KubeanInfoManifestListerExpansion interface{}
diff --git a/api/generated/kubeaninfomanifest/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go b/api/generated/kubeaninfomanifest/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go
new file mode 100644
index 000000000..8cf72cf49
--- /dev/null
+++ b/api/generated/kubeaninfomanifest/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.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/kubeaninfomanifest/v1alpha1"
+)
+
+// KubeanInfoManifestLister helps list KubeanInfoManifests.
+// All objects returned here must be treated as read-only.
+type KubeanInfoManifestLister interface {
+	// List lists all KubeanInfoManifests in the indexer.
+	// Objects returned here must be treated as read-only.
+	List(selector labels.Selector) (ret []*v1alpha1.KubeanInfoManifest, err error)
+	// Get retrieves the KubeanInfoManifest from the index for a given name.
+	// Objects returned here must be treated as read-only.
+	Get(name string) (*v1alpha1.KubeanInfoManifest, error)
+	KubeanInfoManifestListerExpansion
+}
+
+// kubeanInfoManifestLister implements the KubeanInfoManifestLister interface.
+type kubeanInfoManifestLister struct {
+	indexer cache.Indexer
+}
+
+// NewKubeanInfoManifestLister returns a new KubeanInfoManifestLister.
+func NewKubeanInfoManifestLister(indexer cache.Indexer) KubeanInfoManifestLister {
+	return &kubeanInfoManifestLister{indexer: indexer}
+}
+
+// List lists all KubeanInfoManifests in the indexer.
+func (s *kubeanInfoManifestLister) List(selector labels.Selector) (ret []*v1alpha1.KubeanInfoManifest, err error) {
+	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.KubeanInfoManifest))
+	})
+	return ret, err
+}
+
+// Get retrieves the KubeanInfoManifest from the index for a given name.
+func (s *kubeanInfoManifestLister) Get(name string) (*v1alpha1.KubeanInfoManifest, error) {
+	obj, exists, err := s.indexer.GetByKey(name)
+	if err != nil {
+		return nil, err
+	}
+	if !exists {
+		return nil, errors.NewNotFound(v1alpha1.Resource("kubeaninfomanifest"), name)
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), nil
+}
diff --git a/api/generated/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/expansion_generated.go b/api/generated/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/expansion_generated.go
new file mode 100644
index 000000000..7259362ce
--- /dev/null
+++ b/api/generated/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/expansion_generated.go
@@ -0,0 +1,7 @@
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1alpha1
+
+// KubeanInfoManifestListerExpansion allows custom methods to be added to
+// KubeanInfoManifestLister.
+type KubeanInfoManifestListerExpansion interface{}
diff --git a/api/generated/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go b/api/generated/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go
new file mode 100644
index 000000000..8cf72cf49
--- /dev/null
+++ b/api/generated/kubeaninfomanifest/listers/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.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/kubeaninfomanifest/v1alpha1"
+)
+
+// KubeanInfoManifestLister helps list KubeanInfoManifests.
+// All objects returned here must be treated as read-only.
+type KubeanInfoManifestLister interface {
+	// List lists all KubeanInfoManifests in the indexer.
+	// Objects returned here must be treated as read-only.
+	List(selector labels.Selector) (ret []*v1alpha1.KubeanInfoManifest, err error)
+	// Get retrieves the KubeanInfoManifest from the index for a given name.
+	// Objects returned here must be treated as read-only.
+	Get(name string) (*v1alpha1.KubeanInfoManifest, error)
+	KubeanInfoManifestListerExpansion
+}
+
+// kubeanInfoManifestLister implements the KubeanInfoManifestLister interface.
+type kubeanInfoManifestLister struct {
+	indexer cache.Indexer
+}
+
+// NewKubeanInfoManifestLister returns a new KubeanInfoManifestLister.
+func NewKubeanInfoManifestLister(indexer cache.Indexer) KubeanInfoManifestLister {
+	return &kubeanInfoManifestLister{indexer: indexer}
+}
+
+// List lists all KubeanInfoManifests in the indexer.
+func (s *kubeanInfoManifestLister) List(selector labels.Selector) (ret []*v1alpha1.KubeanInfoManifest, err error) {
+	err = cache.ListAll(s.indexer, selector, func(m interface{}) {
+		ret = append(ret, m.(*v1alpha1.KubeanInfoManifest))
+	})
+	return ret, err
+}
+
+// Get retrieves the KubeanInfoManifest from the index for a given name.
+func (s *kubeanInfoManifestLister) Get(name string) (*v1alpha1.KubeanInfoManifest, error) {
+	obj, exists, err := s.indexer.GetByKey(name)
+	if err != nil {
+		return nil, err
+	}
+	if !exists {
+		return nil, errors.NewNotFound(v1alpha1.Resource("kubeaninfomanifest"), name)
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), nil
+}
diff --git a/api/hack/update-all.sh b/api/hack/update-all.sh
index 2d15adcda..a0b4bb086 100755
--- a/api/hack/update-all.sh
+++ b/api/hack/update-all.sh
@@ -9,7 +9,7 @@ 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" kubeanofflineversion
-bash "$API_REPO_ROOT/hack/update-codegen.sh" kubeanclusterconfig
+bash "$API_REPO_ROOT/hack/update-codegen.sh" kubeaninfomanifest
 bash "$API_REPO_ROOT/hack/update-crdgen.sh"
 
 go mod tidy
diff --git a/artifacts/manage_version_cr.sh b/artifacts/manage_version_cr.sh
index 9a6c381ec..f79a50f04 100755
--- a/artifacts/manage_version_cr.sh
+++ b/artifacts/manage_version_cr.sh
@@ -79,7 +79,7 @@ function update_offline_version_cr() {
 function update_docker_offline_version() {
   os=$1
   version_range=$2
-  OS=$os yq -i ".spec.docker |= map(select(.os == strenv(OS)).versionRange |= ${version_range})" \
+  OS=$os yq -i ".spec.docker |= map(select(.os == strenv(OS)).versionRange |= ${version_range} | ..style=\"double\" )" \
     $KUBEAN_OFFLINE_VERSION_CR
 }
 
@@ -118,7 +118,7 @@ function update_info_manifest_cr() {
   fi
 
   yq -i ".spec.components[$index].defaultVersion=\"${default_version_val}\"" $KUBEAN_INFO_MANIFEST_CR
-  yq -i ".spec.components[$index].versionRange |=  ${version_range}" $KUBEAN_INFO_MANIFEST_CR ## update string array
+  yq -i ".spec.components[$index].versionRange |=  ${version_range} | ..style=\"double\" " $KUBEAN_INFO_MANIFEST_CR ## update string array
 }
 
 function update_docker_component_version() {
@@ -134,8 +134,8 @@ function update_docker_component_version() {
 }
 
 function update_info_manifest_cr_name() {
-  kubean_version=${KUBEAN_TAG//./_}
-  yq -i ".metadata.name=\"kubeaninfomanifest_${kubean_version}\"" $KUBEAN_INFO_MANIFEST_CR
+  kubean_version=${KUBEAN_TAG//./-}
+  yq -i ".metadata.name=\"kubeaninfomanifest-${kubean_version}\"" $KUBEAN_INFO_MANIFEST_CR
 }
 
 function create_info_manifest_cr() {
diff --git a/artifacts/template/kubeaninfomanifest.template.yml b/artifacts/template/kubeaninfomanifest.template.yml
index 348f886b8..0f709b9ae 100644
--- a/artifacts/template/kubeaninfomanifest.template.yml
+++ b/artifacts/template/kubeaninfomanifest.template.yml
@@ -1,7 +1,7 @@
 apiVersion: kubean.io/v1alpha1
 kind: KubeanInfoManifest
 metadata:
-  name: kubeaninfomanifest-global
+  name: KubeanInfoManifestNAME
   annotations:
     "helm.sh/hook": "post-install"
 spec:
@@ -37,4 +37,4 @@ spec:
       defaultVersion: ""
       versionRange: [ ]
 status:
-  airGap:
+
diff --git a/api/charts/_crds/kubean.io_kubeanclusterconfigs.yaml b/charts/kubean/_crds/kubean.io_kubeaninfomanifests.yaml
similarity index 94%
rename from api/charts/_crds/kubean.io_kubeanclusterconfigs.yaml
rename to charts/kubean/_crds/kubean.io_kubeaninfomanifests.yaml
index 535ba0e09..0e50fc4e0 100644
--- a/api/charts/_crds/kubean.io_kubeanclusterconfigs.yaml
+++ b/charts/kubean/_crds/kubean.io_kubeaninfomanifests.yaml
@@ -6,14 +6,14 @@ metadata:
   annotations:
     controller-gen.kubebuilder.io/version: v0.6.2
   creationTimestamp: null
-  name: kubeanclusterconfigs.kubean.io
+  name: kubeaninfomanifests.kubean.io
 spec:
   group: kubean.io
   names:
-    kind: KubeanClusterConfig
-    listKind: KubeanClusterConfigList
-    plural: kubeanclusterconfigs
-    singular: kubeanclusterconfig
+    kind: KubeanInfoManifest
+    listKind: KubeanInfoManifestList
+    plural: kubeaninfomanifests
+    singular: kubeaninfomanifest
   scope: Cluster
   versions:
   - additionalPrinterColumns:
@@ -38,26 +38,6 @@ spec:
             type: object
           spec:
             properties:
-              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:
@@ -93,10 +73,30 @@ spec:
                 type: string
               kubesprayVersion:
                 type: string
+              localService:
+                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
             type: object
           status:
             properties:
-              airGap:
+              localAvailable:
                 properties:
                   components:
                     items:
diff --git a/cmd/kubean-operator/app/app.go b/cmd/kubean-operator/app/app.go
index e2e3bcc2f..998b7b181 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"
+	kubeaninfomanifestClientSet "kubean.io/api/generated/kubeaninfomanifest/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
 	}
-	clusterconfigClientSet, err := kubeanclusterconfigClientSet.NewForConfig(resetConfig)
+	clusterconfigClientSet, err := kubeaninfomanifestClientSet.NewForConfig(resetConfig)
 	if err != nil {
 		return err
 	}
diff --git a/pkg/controllers/clusterconfig/controller.go b/pkg/controllers/infomanifest/controller.go
similarity index 71%
rename from pkg/controllers/clusterconfig/controller.go
rename to pkg/controllers/infomanifest/controller.go
index 4e6e0d2f1..bb022e852 100644
--- a/pkg/controllers/clusterconfig/controller.go
+++ b/pkg/controllers/infomanifest/controller.go
@@ -1,10 +1,10 @@
-package clusterconfig
+package infomanifest
 
 import (
 	"context"
 	"time"
 
-	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	kubeaninfomanifestv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
 	"kubean.io/api/constants"
 
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -29,16 +29,16 @@ func (c *Controller) Start(ctx context.Context) error {
 }
 
 func (c *Controller) Reconcile(ctx context.Context, req controllerruntime.Request) (controllerruntime.Result, error) {
-	globalClusterConfig := &kubeanclusterconfigv1alpha1.KubeanClusterConfig{}
-	if err := c.Client.Get(context.Background(), req.NamespacedName, globalClusterConfig); err != nil {
+	infoManifest := &kubeaninfomanifestv1alpha1.KubeanInfoManifest{}
+	if err := c.Client.Get(context.Background(), req.NamespacedName, infoManifest); err != nil {
 		if apierrors.IsNotFound(err) {
 			return controllerruntime.Result{Requeue: false}, nil
 		}
 		klog.Error(err)
 		return controllerruntime.Result{RequeueAfter: Loop}, nil
 	}
-	if globalClusterConfig.Name != constants.ClusterConfigGlobal {
-		klog.Errorf("KubeanClusterConfig % is not global", globalClusterConfig.Name)
+	if infoManifest.Name != constants.InfoManifestGlobal {
+		klog.Errorf("KubeanClusterConfig % is not global", infoManifest.Name)
 		return controllerruntime.Result{Requeue: false}, nil
 	}
 	// todo process globalClusterConfig
@@ -47,7 +47,7 @@ func (c *Controller) Reconcile(ctx context.Context, req controllerruntime.Reques
 
 func (c *Controller) SetupWithManager(mgr controllerruntime.Manager) error {
 	return utilerrors.NewAggregate([]error{
-		controllerruntime.NewControllerManagedBy(mgr).For(&kubeanclusterconfigv1alpha1.KubeanClusterConfig{}).Complete(c),
+		controllerruntime.NewControllerManagedBy(mgr).For(&kubeaninfomanifestv1alpha1.KubeanInfoManifest{}).Complete(c),
 		mgr.Add(c),
 	})
 }
diff --git a/pkg/controllers/offlineversion/controller.go b/pkg/controllers/offlineversion/controller.go
index f2a24c3bb..031670b99 100644
--- a/pkg/controllers/offlineversion/controller.go
+++ b/pkg/controllers/offlineversion/controller.go
@@ -4,10 +4,10 @@ import (
 	"context"
 	"time"
 
-	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	kubeaninfomanifestv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
 	kubeanofflineversionv1alpha1 "kubean.io/api/apis/kubeanofflineversion/v1alpha1"
 	"kubean.io/api/constants"
-	kubeanclusterconfigClientSet "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned"
+	kubeaninfomanifestClientSet "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned"
 	kubeanofflineversionClientSet "kubean.io/api/generated/kubeanofflineversion/clientset/versioned"
 
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -24,7 +24,7 @@ const Loop = time.Second * 20
 type Controller struct {
 	client.Client
 	ClientSet               kubernetes.Interface
-	ClusterConfigClientSet  kubeanclusterconfigClientSet.Interface
+	ClusterConfigClientSet  kubeaninfomanifestClientSet.Interface
 	OfflineversionClientSet kubeanofflineversionClientSet.Interface
 }
 
@@ -34,23 +34,23 @@ func (c *Controller) Start(ctx context.Context) error {
 	return nil
 }
 
-func (c *Controller) FetchGlobalKubeanClusterConfig() (*kubeanclusterconfigv1alpha1.KubeanClusterConfig, error) {
-	componentsVersion, err := c.ClusterConfigClientSet.KubeanV1alpha1().KubeanClusterConfigs().Get(context.Background(), constants.ClusterConfigGlobal, metav1.GetOptions{})
+func (c *Controller) FetchGlobalKubeanClusterConfig() (*kubeaninfomanifestv1alpha1.KubeanInfoManifest, error) {
+	componentsVersion, err := c.ClusterConfigClientSet.KubeanV1alpha1().KubeanInfoManifests().Get(context.Background(), constants.InfoManifestGlobal, metav1.GetOptions{})
 	if err != nil {
 		return nil, err
 	}
 	return componentsVersion, nil
 }
 
-func (c *Controller) MergeOfflineVersionStatus(offlineVersion *kubeanofflineversionv1alpha1.KuBeanOfflineVersion, clusterConfig *kubeanclusterconfigv1alpha1.KubeanClusterConfig) (bool, *kubeanclusterconfigv1alpha1.KubeanClusterConfig) {
+func (c *Controller) MergeOfflineVersionStatus(offlineVersion *kubeanofflineversionv1alpha1.KuBeanOfflineVersion, clusterConfig *kubeaninfomanifestv1alpha1.KubeanInfoManifest) (bool, *kubeaninfomanifestv1alpha1.KubeanInfoManifest) {
 	updated := false
 	for _, dockerInfo := range offlineVersion.Spec.Docker {
-		if clusterConfig.Status.AirGapStatus.MergeDockerInfo(dockerInfo.OS, dockerInfo.VersionRange) {
+		if clusterConfig.Status.LocalAvailable.MergeDockerInfo(dockerInfo.OS, dockerInfo.VersionRange) {
 			updated = true
 		}
 	}
 	for _, softItem := range offlineVersion.Spec.Items {
-		if clusterConfig.Status.AirGapStatus.MergeSoftwareInfo(softItem.Name, softItem.VersionRange) {
+		if clusterConfig.Status.LocalAvailable.MergeSoftwareInfo(softItem.Name, softItem.VersionRange) {
 			updated = true
 		}
 	}
@@ -68,12 +68,12 @@ func (c *Controller) Reconcile(ctx context.Context, req controllerruntime.Reques
 	}
 	globalClusterConfig, err := c.FetchGlobalKubeanClusterConfig()
 	if err != nil {
-		klog.Errorf("Fetch %s , ignoring %s", constants.ClusterConfigGlobal, err)
+		klog.Errorf("Fetch %s , ignoring %s", constants.InfoManifestGlobal, err)
 		return controllerruntime.Result{RequeueAfter: Loop}, nil
 	}
 	if needUpdate, newGlobalClusterConfig := c.MergeOfflineVersionStatus(offlineVersion, globalClusterConfig); needUpdate {
 		klog.Info("Update componentsVersion")
-		if _, err := c.ClusterConfigClientSet.KubeanV1alpha1().KubeanClusterConfigs().UpdateStatus(context.Background(), newGlobalClusterConfig, metav1.UpdateOptions{}); err != nil {
+		if _, err := c.ClusterConfigClientSet.KubeanV1alpha1().KubeanInfoManifests().UpdateStatus(context.Background(), newGlobalClusterConfig, metav1.UpdateOptions{}); err != nil {
 			klog.Error(err)
 		}
 	}
diff --git a/pkg/util/cluster.go b/pkg/util/cluster.go
index 6bd96bd20..4f5c1f8c4 100644
--- a/pkg/util/cluster.go
+++ b/pkg/util/cluster.go
@@ -7,7 +7,8 @@ import (
 	"strings"
 
 	kubeanclusterv1alpha1 "kubean.io/api/apis/kubeancluster/v1alpha1"
-	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	kubeaninfomanifestv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
+
 	kubeanclusteropsv1alpha1 "kubean.io/api/apis/kubeanclusterops/v1alpha1"
 	kubeanofflineversionv1alpha1 "kubean.io/api/apis/kubeanofflineversion/v1alpha1"
 
@@ -25,9 +26,7 @@ func init() {
 	_ = kubeanclusteropsv1alpha1.AddToScheme(aggregatedScheme) // add clusterOps schemes
 	_ = kubeanclusterv1alpha1.AddToScheme(aggregatedScheme)    // add cluster schemes
 	_ = kubeanofflineversionv1alpha1.AddToScheme(aggregatedScheme)
-	_ = kubeanclusterconfigv1alpha1.AddToScheme(aggregatedScheme)
-	//_ = clusterapiv1alpha4.AddToScheme(aggregatedScheme) // add cluster-api v1alpha4 schemes
-	//_ = v1alpha2.AddToScheme(aggregatedScheme) // add clusterpedia-api v1alpha2 schemes
+	_ = kubeaninfomanifestv1alpha1.AddToScheme(aggregatedScheme)
 }
 
 // NewSchema returns a singleton schema set which aggregated Kubernetes's schemes and extended schemes.
diff --git a/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/doc.go b/vendor/kubean.io/api/apis/kubeaninfomanifest/v1alpha1/doc.go
similarity index 100%
rename from vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/doc.go
rename to vendor/kubean.io/api/apis/kubeaninfomanifest/v1alpha1/doc.go
diff --git a/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/types.go b/vendor/kubean.io/api/apis/kubeaninfomanifest/v1alpha1/types.go
similarity index 88%
rename from vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/types.go
rename to vendor/kubean.io/api/apis/kubeaninfomanifest/v1alpha1/types.go
index 094394c8a..6e82e21f9 100644
--- a/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/types.go
+++ b/vendor/kubean.io/api/apis/kubeaninfomanifest/v1alpha1/types.go
@@ -12,7 +12,7 @@ import (
 // +kubebuilder:subresource:status
 // +kubebuilder:printcolumn:JSONPath=`.metadata.creationTimestamp`,name="Age",type=date
 
-type KubeanClusterConfig struct {
+type KubeanInfoManifest struct {
 	metav1.TypeMeta   `json:",inline"`
 	metav1.ObjectMeta `json:"metadata,omitempty"`
 
@@ -25,7 +25,7 @@ type KubeanClusterConfig struct {
 
 type Spec struct {
 	// +optional
-	AirGapConfig AirGapConfig `json:"airGapConfig,omitempty"`
+	LocalService LocalService `json:"localService,omitempty"`
 
 	// +required
 	KubesprayVersion string `json:"kubesprayVersion,omitempty"`
@@ -41,7 +41,7 @@ type Spec struct {
 	Docker []*DockerInfo `json:"docker,omitempty"`
 }
 
-type AirGapConfig struct {
+type LocalService struct {
 	// +optional
 	RegistryRepo string `json:"registryRepo,omitempty"`
 	// +optional
@@ -61,10 +61,10 @@ type HostsMap struct {
 
 type Status struct {
 	// +optional
-	AirGapStatus AirGapStatus `json:"airGap,omitempty"`
+	LocalAvailable LocalAvailable `json:"localAvailable,omitempty"`
 }
 
-type AirGapStatus struct {
+type LocalAvailable struct {
 	// +optional
 	KubesprayImage string `json:"kubesprayImage,omitempty"`
 
@@ -77,12 +77,12 @@ type AirGapStatus struct {
 
 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 
-type KubeanClusterConfigList struct {
+type KubeanInfoManifestList struct {
 	metav1.TypeMeta `json:",inline"`
 	metav1.ListMeta `json:"metadata,omitempty"`
 
 	// Items holds a list of KubeanClusterConfig.
-	Items []KubeanClusterConfig `json:"items"`
+	Items []KubeanInfoManifest `json:"items"`
 }
 
 type SoftwareInfo struct {
@@ -135,7 +135,7 @@ func (info *DockerInfoStatus) Merge(versionRange []string) bool {
 	return updated
 }
 
-func (status *AirGapStatus) MergeSoftwareInfo(name string, versionRange []string) bool {
+func (status *LocalAvailable) MergeSoftwareInfo(name string, versionRange []string) bool {
 	var targetNameItem *SoftwareInfoStatus
 	for i := range status.Components {
 		if status.Components[i].Name == name {
@@ -151,7 +151,7 @@ func (status *AirGapStatus) MergeSoftwareInfo(name string, versionRange []string
 	return targetNameItem.Merge(versionRange)
 }
 
-func (status *AirGapStatus) MergeDockerInfo(osName string, versionRange []string) bool {
+func (status *LocalAvailable) 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/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go b/vendor/kubean.io/api/apis/kubeaninfomanifest/v1alpha1/zz_generated.deepcopy.go
similarity index 86%
rename from vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go
rename to vendor/kubean.io/api/apis/kubeaninfomanifest/v1alpha1/zz_generated.deepcopy.go
index e78e1bde5..f45fd241f 100644
--- a/vendor/kubean.io/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.deepcopy.go
+++ b/vendor/kubean.io/api/apis/kubeaninfomanifest/v1alpha1/zz_generated.deepcopy.go
@@ -9,70 +9,6 @@ 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
@@ -132,7 +68,7 @@ func (in *HostsMap) DeepCopy() *HostsMap {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *KubeanClusterConfig) DeepCopyInto(out *KubeanClusterConfig) {
+func (in *KubeanInfoManifest) DeepCopyInto(out *KubeanInfoManifest) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
@@ -141,18 +77,18 @@ func (in *KubeanClusterConfig) DeepCopyInto(out *KubeanClusterConfig) {
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanClusterConfig.
-func (in *KubeanClusterConfig) DeepCopy() *KubeanClusterConfig {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanInfoManifest.
+func (in *KubeanInfoManifest) DeepCopy() *KubeanInfoManifest {
 	if in == nil {
 		return nil
 	}
-	out := new(KubeanClusterConfig)
+	out := new(KubeanInfoManifest)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *KubeanClusterConfig) DeepCopyObject() runtime.Object {
+func (in *KubeanInfoManifest) DeepCopyObject() runtime.Object {
 	if c := in.DeepCopy(); c != nil {
 		return c
 	}
@@ -160,13 +96,13 @@ func (in *KubeanClusterConfig) DeepCopyObject() runtime.Object {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *KubeanClusterConfigList) DeepCopyInto(out *KubeanClusterConfigList) {
+func (in *KubeanInfoManifestList) DeepCopyInto(out *KubeanInfoManifestList) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ListMeta.DeepCopyInto(&out.ListMeta)
 	if in.Items != nil {
 		in, out := &in.Items, &out.Items
-		*out = make([]KubeanClusterConfig, len(*in))
+		*out = make([]KubeanInfoManifest, len(*in))
 		for i := range *in {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
@@ -174,24 +110,88 @@ func (in *KubeanClusterConfigList) DeepCopyInto(out *KubeanClusterConfigList) {
 	return
 }
 
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanClusterConfigList.
-func (in *KubeanClusterConfigList) DeepCopy() *KubeanClusterConfigList {
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeanInfoManifestList.
+func (in *KubeanInfoManifestList) DeepCopy() *KubeanInfoManifestList {
 	if in == nil {
 		return nil
 	}
-	out := new(KubeanClusterConfigList)
+	out := new(KubeanInfoManifestList)
 	in.DeepCopyInto(out)
 	return out
 }
 
 // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *KubeanClusterConfigList) DeepCopyObject() runtime.Object {
+func (in *KubeanInfoManifestList) 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 *LocalAvailable) DeepCopyInto(out *LocalAvailable) {
+	*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 LocalAvailable.
+func (in *LocalAvailable) DeepCopy() *LocalAvailable {
+	if in == nil {
+		return nil
+	}
+	out := new(LocalAvailable)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LocalService) DeepCopyInto(out *LocalService) {
+	*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 LocalService.
+func (in *LocalService) DeepCopy() *LocalService {
+	if in == nil {
+		return nil
+	}
+	out := new(LocalService)
+	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
@@ -237,7 +237,7 @@ 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
-	in.AirGapConfig.DeepCopyInto(&out.AirGapConfig)
+	in.LocalService.DeepCopyInto(&out.LocalService)
 	if in.Components != nil {
 		in, out := &in.Components, &out.Components
 		*out = make([]*SoftwareInfo, len(*in))
@@ -276,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.AirGapStatus.DeepCopyInto(&out.AirGapStatus)
+	in.LocalAvailable.DeepCopyInto(&out.LocalAvailable)
 	return
 }
 
diff --git a/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go b/vendor/kubean.io/api/apis/kubeaninfomanifest/v1alpha1/zz_generated.register.go
similarity index 96%
rename from api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go
rename to vendor/kubean.io/api/apis/kubeaninfomanifest/v1alpha1/zz_generated.register.go
index 66be7db16..fc4f7fefc 100644
--- a/api/apis/kubeanclusterconfig/v1alpha1/zz_generated.register.go
+++ b/vendor/kubean.io/api/apis/kubeaninfomanifest/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,
-		&KubeanClusterConfig{},
-		&KubeanClusterConfigList{},
+		&KubeanInfoManifest{},
+		&KubeanInfoManifestList{},
 	)
 	// AddToGroupVersion allows the serialization of client types like ListOptions.
 	v1.AddToGroupVersion(scheme, SchemeGroupVersion)
diff --git a/vendor/kubean.io/api/constants/constants.go b/vendor/kubean.io/api/constants/constants.go
index d3391db97..1d2749e7d 100644
--- a/vendor/kubean.io/api/constants/constants.go
+++ b/vendor/kubean.io/api/constants/constants.go
@@ -1,5 +1,5 @@
 package constants
 
-const ClusterConfigGlobal = "clusterconfig-global"
+const InfoManifestGlobal = "infomanifest-global"
 
 const KubeanClusterLabelKey = "clusterName"
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
deleted file mode 100644
index adc14b897..000000000
--- a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig.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/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/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go b/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.go
deleted file mode 100644
index 2bd59bfac..000000000
--- a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig.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/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/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/clientset.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/clientset.go
similarity index 96%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/clientset.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/clientset.go
index 3cd6208e4..210971521 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/clientset.go
+++ b/vendor/kubean.io/api/generated/kubeaninfomanifest/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/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1"
 )
 
 type Interface interface {
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/doc.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/doc.go
similarity index 100%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/doc.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/doc.go
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/fake/clientset_generated.go
similarity index 86%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/fake/clientset_generated.go
index 06fe2e5c4..7ab366712 100644
--- a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/clientset_generated.go
+++ b/vendor/kubean.io/api/generated/kubeaninfomanifest/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/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"
+	clientset "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned"
+	kubeanv1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1"
+	fakekubeanv1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake"
 )
 
 // NewSimpleClientset returns a clientset that will respond with the provided objects.
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/doc.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/fake/doc.go
similarity index 100%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/doc.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/fake/doc.go
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/fake/register.go
similarity index 94%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/fake/register.go
index 557be1df8..e91827611 100644
--- a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake/register.go
+++ b/vendor/kubean.io/api/generated/kubeaninfomanifest/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/kubeanclusterconfig/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
 )
 
 var scheme = runtime.NewScheme()
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme/doc.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme/doc.go
similarity index 100%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme/doc.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme/doc.go
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/scheme/register.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme/register.go
similarity index 95%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/scheme/register.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme/register.go
index dc3db3d44..7aafdceda 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/scheme/register.go
+++ b/vendor/kubean.io/api/generated/kubeaninfomanifest/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/kubeanclusterconfig/v1alpha1"
+	kubeanv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
 )
 
 var Scheme = runtime.NewScheme()
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/doc.go
similarity index 100%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/doc.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/doc.go
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/doc.go
similarity index 100%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/doc.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/doc.go
diff --git a/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest.go
new file mode 100644
index 000000000..aa40bed90
--- /dev/null
+++ b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest.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/kubeaninfomanifest/v1alpha1"
+)
+
+// FakeKubeanInfoManifests implements KubeanInfoManifestInterface
+type FakeKubeanInfoManifests struct {
+	Fake *FakeKubeanV1alpha1
+}
+
+var kubeaninfomanifestsResource = schema.GroupVersionResource{Group: "kubean.io", Version: "v1alpha1", Resource: "kubeaninfomanifests"}
+
+var kubeaninfomanifestsKind = schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KubeanInfoManifest"}
+
+// Get takes name of the kubeanInfoManifest, and returns the corresponding kubeanInfoManifest object, and an error if there is any.
+func (c *FakeKubeanInfoManifests) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootGetAction(kubeaninfomanifestsResource, name), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
+
+// List takes label and field selectors, and returns the list of KubeanInfoManifests that match those selectors.
+func (c *FakeKubeanInfoManifests) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanInfoManifestList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootListAction(kubeaninfomanifestsResource, kubeaninfomanifestsKind, opts), &v1alpha1.KubeanInfoManifestList{})
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.KubeanInfoManifestList{ListMeta: obj.(*v1alpha1.KubeanInfoManifestList).ListMeta}
+	for _, item := range obj.(*v1alpha1.KubeanInfoManifestList).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 kubeanInfoManifests.
+func (c *FakeKubeanInfoManifests) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewRootWatchAction(kubeaninfomanifestsResource, opts))
+}
+
+// Create takes the representation of a kubeanInfoManifest and creates it.  Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *FakeKubeanInfoManifests) Create(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.CreateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootCreateAction(kubeaninfomanifestsResource, kubeanInfoManifest), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
+
+// Update takes the representation of a kubeanInfoManifest and updates it. Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *FakeKubeanInfoManifests) Update(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateAction(kubeaninfomanifestsResource, kubeanInfoManifest), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), 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 *FakeKubeanInfoManifests) UpdateStatus(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (*v1alpha1.KubeanInfoManifest, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateSubresourceAction(kubeaninfomanifestsResource, "status", kubeanInfoManifest), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
+
+// Delete takes name of the kubeanInfoManifest and deletes it. Returns an error if one occurs.
+func (c *FakeKubeanInfoManifests) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewRootDeleteActionWithOptions(kubeaninfomanifestsResource, name, opts), &v1alpha1.KubeanInfoManifest{})
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeKubeanInfoManifests) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewRootDeleteCollectionAction(kubeaninfomanifestsResource, listOpts)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.KubeanInfoManifestList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched kubeanInfoManifest.
+func (c *FakeKubeanInfoManifests) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanInfoManifest, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootPatchSubresourceAction(kubeaninfomanifestsResource, name, pt, data, subresources...), &v1alpha1.KubeanInfoManifest{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.KubeanInfoManifest), err
+}
diff --git a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest_client.go
similarity index 62%
rename from api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest_client.go
index f20526904..13d796cee 100644
--- a/api/generated/kubeanclusterconfig/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/fake/fake_kubeanclusterconfig_client.go
+++ b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/fake/fake_kubeaninfomanifest_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/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1"
+	v1alpha1 "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1"
 )
 
 type FakeKubeanV1alpha1 struct {
 	*testing.Fake
 }
 
-func (c *FakeKubeanV1alpha1) KubeanClusterConfigs() v1alpha1.KubeanClusterConfigInterface {
-	return &FakeKubeanClusterConfigs{c}
+func (c *FakeKubeanV1alpha1) KubeanInfoManifests() v1alpha1.KubeanInfoManifestInterface {
+	return &FakeKubeanInfoManifests{c}
 }
 
 // RESTClient returns a RESTClient that is used to communicate
diff --git a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/generated_expansion.go
similarity index 58%
rename from vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/generated_expansion.go
index f9e6297b1..13c9ccce4 100644
--- a/vendor/kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/generated_expansion.go
+++ b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/generated_expansion.go
@@ -2,4 +2,4 @@
 
 package v1alpha1
 
-type KubeanClusterConfigExpansion interface{}
+type KubeanInfoManifestExpansion interface{}
diff --git a/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.go
new file mode 100644
index 000000000..f9401b93a
--- /dev/null
+++ b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest.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/kubeaninfomanifest/v1alpha1"
+	scheme "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme"
+)
+
+// KubeanInfoManifestsGetter has a method to return a KubeanInfoManifestInterface.
+// A group's client should implement this interface.
+type KubeanInfoManifestsGetter interface {
+	KubeanInfoManifests() KubeanInfoManifestInterface
+}
+
+// KubeanInfoManifestInterface has methods to work with KubeanInfoManifest resources.
+type KubeanInfoManifestInterface interface {
+	Create(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.CreateOptions) (*v1alpha1.KubeanInfoManifest, error)
+	Update(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (*v1alpha1.KubeanInfoManifest, error)
+	UpdateStatus(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (*v1alpha1.KubeanInfoManifest, 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.KubeanInfoManifest, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.KubeanInfoManifestList, 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.KubeanInfoManifest, err error)
+	KubeanInfoManifestExpansion
+}
+
+// kubeanInfoManifests implements KubeanInfoManifestInterface
+type kubeanInfoManifests struct {
+	client rest.Interface
+}
+
+// newKubeanInfoManifests returns a KubeanInfoManifests
+func newKubeanInfoManifests(c *KubeanV1alpha1Client) *kubeanInfoManifests {
+	return &kubeanInfoManifests{
+		client: c.RESTClient(),
+	}
+}
+
+// Get takes name of the kubeanInfoManifest, and returns the corresponding kubeanInfoManifest object, and an error if there is any.
+func (c *kubeanInfoManifests) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Get().
+		Resource("kubeaninfomanifests").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of KubeanInfoManifests that match those selectors.
+func (c *kubeanInfoManifests) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.KubeanInfoManifestList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.KubeanInfoManifestList{}
+	err = c.client.Get().
+		Resource("kubeaninfomanifests").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested kubeanInfoManifests.
+func (c *kubeanInfoManifests) 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("kubeaninfomanifests").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch(ctx)
+}
+
+// Create takes the representation of a kubeanInfoManifest and creates it.  Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *kubeanInfoManifests) Create(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.CreateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Post().
+		Resource("kubeaninfomanifests").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanInfoManifest).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Update takes the representation of a kubeanInfoManifest and updates it. Returns the server's representation of the kubeanInfoManifest, and an error, if there is any.
+func (c *kubeanInfoManifests) Update(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Put().
+		Resource("kubeaninfomanifests").
+		Name(kubeanInfoManifest.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanInfoManifest).
+		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 *kubeanInfoManifests) UpdateStatus(ctx context.Context, kubeanInfoManifest *v1alpha1.KubeanInfoManifest, opts v1.UpdateOptions) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Put().
+		Resource("kubeaninfomanifests").
+		Name(kubeanInfoManifest.Name).
+		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(kubeanInfoManifest).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Delete takes name of the kubeanInfoManifest and deletes it. Returns an error if one occurs.
+func (c *kubeanInfoManifests) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return c.client.Delete().
+		Resource("kubeaninfomanifests").
+		Name(name).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *kubeanInfoManifests) 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("kubeaninfomanifests").
+		VersionedParams(&listOpts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// Patch applies the patch and returns the patched kubeanInfoManifest.
+func (c *kubeanInfoManifests) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.KubeanInfoManifest, err error) {
+	result = &v1alpha1.KubeanInfoManifest{}
+	err = c.client.Patch(pt).
+		Resource("kubeaninfomanifests").
+		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(data).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest_client.go
similarity index 89%
rename from api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
rename to vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest_client.go
index 4852f2ea6..a3a63e9a2 100644
--- a/api/generated/kubeanclusterconfig/clientset/versioned/typed/kubeanclusterconfig/v1alpha1/kubeanclusterconfig_client.go
+++ b/vendor/kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1/kubeaninfomanifest_client.go
@@ -6,13 +6,13 @@ import (
 	"net/http"
 
 	rest "k8s.io/client-go/rest"
-	v1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
-	"kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/scheme"
+	v1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
+	"kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme"
 )
 
 type KubeanV1alpha1Interface interface {
 	RESTClient() rest.Interface
-	KubeanClusterConfigsGetter
+	KubeanInfoManifestsGetter
 }
 
 // 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) KubeanClusterConfigs() KubeanClusterConfigInterface {
-	return newKubeanClusterConfigs(c)
+func (c *KubeanV1alpha1Client) KubeanInfoManifests() KubeanInfoManifestInterface {
+	return newKubeanInfoManifests(c)
 }
 
 // NewForConfig creates a new KubeanV1alpha1Client for the given config.
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 3ca863c15..4ab286192 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/kubeaninfomanifest/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/kubeaninfomanifest/clientset/versioned
+kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/fake
+kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/scheme
+kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/v1alpha1
+kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/typed/kubeaninfomanifest/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
deleted file mode 100644
index fb5627a31..000000000
--- a/api/apis/kubeanclusterconfig/v1alpha1/types_test.go
+++ /dev/null
@@ -1,95 +0,0 @@
-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/kubeaninfomanifest/v1alpha1/types_test.go b/api/apis/kubeaninfomanifest/v1alpha1/types_test.go
new file mode 100644
index 000000000..f800a1647
--- /dev/null
+++ b/api/apis/kubeaninfomanifest/v1alpha1/types_test.go
@@ -0,0 +1,95 @@
+package v1alpha1
+
+import (
+	"testing"
+)
+
+func TestMerge(t *testing.T) {
+	componentsVersion := &KubeanInfoManifest{}
+	tests := []struct {
+		name string
+		args func() bool
+		want bool
+	}{
+		{
+			name: "add software air-gap etcd1 item",
+			args: func() bool {
+				updated := componentsVersion.Status.LocalAvailable.MergeSoftwareInfo("etcd1", []string{"1.1", "1.2"})
+				return updated && len(componentsVersion.Status.LocalAvailable.Components) == 1
+			},
+			want: true,
+		},
+		{
+			name: "update software air-gap etcd1 item",
+			args: func() bool {
+				updated := componentsVersion.Status.LocalAvailable.MergeSoftwareInfo("etcd1", []string{"1.2", "1.3"})
+				return updated && len(componentsVersion.Status.LocalAvailable.Components) == 1 && componentsVersion.Status.LocalAvailable.Components[0].Name == "etcd1" && len(componentsVersion.Status.LocalAvailable.Components[0].VersionRange) == 3
+			},
+			want: true,
+		},
+		{
+			name: "update software air-gap etcd1 item but nothing changed",
+			args: func() bool {
+				updated := componentsVersion.Status.LocalAvailable.MergeSoftwareInfo("etcd1", []string{"1.2", "1.3"})
+				return !updated && len(componentsVersion.Status.LocalAvailable.Components) == 1 && componentsVersion.Status.LocalAvailable.Components[0].Name == "etcd1" && len(componentsVersion.Status.LocalAvailable.Components[0].VersionRange) == 3
+			},
+			want: true,
+		},
+		{
+			name: "update software air-gap etcd2 item",
+			args: func() bool {
+				updated := componentsVersion.Status.LocalAvailable.MergeSoftwareInfo("etcd2", []string{"2.1", "2.2"})
+				return updated && len(componentsVersion.Status.LocalAvailable.Components) == 2 && componentsVersion.Status.LocalAvailable.Components[1].Name == "etcd2" && len(componentsVersion.Status.LocalAvailable.Components[1].VersionRange) == 2
+			},
+			want: true,
+		},
+		{
+			name: "update software air-gap etcd2 item but nothing changed",
+			args: func() bool {
+				updated := componentsVersion.Status.LocalAvailable.MergeSoftwareInfo("etcd2", []string{"2.1", "2.2"})
+				return !updated && len(componentsVersion.Status.LocalAvailable.Components) == 2 && componentsVersion.Status.LocalAvailable.Components[1].Name == "etcd2" && len(componentsVersion.Status.LocalAvailable.Components[1].VersionRange) == 2
+			},
+			want: true,
+		},
+		{
+			name: "add docker-ce info",
+			args: func() bool {
+				updated := componentsVersion.Status.LocalAvailable.MergeDockerInfo("centos7", []string{"20.01", "20.02"})
+				return updated && len(componentsVersion.Status.LocalAvailable.Docker) == 1 && len(componentsVersion.Status.LocalAvailable.Docker[0].VersionRange) == 2
+			},
+			want: true,
+		},
+		{
+			name: "update docker-ce info",
+			args: func() bool {
+				updated := componentsVersion.Status.LocalAvailable.MergeDockerInfo("centos7", []string{"20.01", "20.02"})
+				return !updated && len(componentsVersion.Status.LocalAvailable.Docker) == 1 && len(componentsVersion.Status.LocalAvailable.Docker[0].VersionRange) == 2
+			},
+			want: true,
+		},
+		{
+			name: "update docker-ce info with zero length",
+			args: func() bool {
+				updated := componentsVersion.Status.LocalAvailable.MergeDockerInfo("centos0008", nil)
+				return updated && len(componentsVersion.Status.LocalAvailable.Docker) == 2 && len(componentsVersion.Status.LocalAvailable.Docker[1].VersionRange) == 0
+			},
+			want: true,
+		},
+		{
+			name: "update docker-ce info",
+			args: func() bool {
+				updated := componentsVersion.Status.LocalAvailable.MergeDockerInfo("centos0008", []string{"1.1", "1.2", "1.3"})
+				return updated && len(componentsVersion.Status.LocalAvailable.Docker) == 2 && len(componentsVersion.Status.LocalAvailable.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 8f4b944b0..0f37f463a 100644
--- a/pkg/controllers/offlineversion/controller_test.go
+++ b/pkg/controllers/offlineversion/controller_test.go
@@ -12,22 +12,22 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	kubeaninfomanifestv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
 	kubeanofflineversionv1alpha1 "kubean.io/api/apis/kubeanofflineversion/v1alpha1"
 	"kubean.io/api/constants"
-	kubeanclusterconfigv1alpha1fake "kubean.io/api/generated/kubeanclusterconfig/clientset/versioned/fake"
+	kubeaninfomanifestv1alpha1fake "kubean.io/api/generated/kubeaninfomanifest/clientset/versioned/fake"
 	kubeanofflineversionv1alpha1fake "kubean.io/api/generated/kubeanofflineversion/clientset/versioned/fake"
 )
 
 func newFakeClient() client.Client {
 	sch := scheme.Scheme
-	if err := kubeanclusterconfigv1alpha1.AddToScheme(sch); err != nil {
+	if err := kubeaninfomanifestv1alpha1.AddToScheme(sch); err != nil {
 		panic(err)
 	}
 	if err := kubeanofflineversionv1alpha1.AddToScheme(sch); err != nil {
 		panic(err)
 	}
-	client := fake.NewClientBuilder().WithScheme(sch).WithRuntimeObjects(&kubeanclusterconfigv1alpha1.KubeanClusterConfig{}).WithRuntimeObjects(&kubeanofflineversionv1alpha1.KuBeanOfflineVersion{}).Build()
+	client := fake.NewClientBuilder().WithScheme(sch).WithRuntimeObjects(&kubeaninfomanifestv1alpha1.KubeanInfoManifest{}).WithRuntimeObjects(&kubeanofflineversionv1alpha1.KuBeanOfflineVersion{}).Build()
 	return client
 }
 
@@ -36,13 +36,13 @@ func TestMergeOfflineVersion(t *testing.T) {
 		Client:                  newFakeClient(),
 		ClientSet:               clientsetfake.NewSimpleClientset(),
 		OfflineversionClientSet: kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
-		ClusterConfigClientSet:  kubeanclusterconfigv1alpha1fake.NewSimpleClientset(),
+		ClusterConfigClientSet:  kubeaninfomanifestv1alpha1fake.NewSimpleClientset(),
 	}
 	tests := []struct {
 		name string
 		args struct {
 			OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-			ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
+			ComponentsVersion kubeaninfomanifestv1alpha1.KubeanInfoManifest
 		}
 		updated bool
 	}{
@@ -50,14 +50,14 @@ func TestMergeOfflineVersion(t *testing.T) {
 			name: "nothing update",
 			args: struct {
 				OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-				ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
+				ComponentsVersion kubeaninfomanifestv1alpha1.KubeanInfoManifest
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{},
 				},
-				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
-					Status: kubeanclusterconfigv1alpha1.Status{
-						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{},
+				ComponentsVersion: kubeaninfomanifestv1alpha1.KubeanInfoManifest{
+					Status: kubeaninfomanifestv1alpha1.Status{
+						LocalAvailable: kubeaninfomanifestv1alpha1.LocalAvailable{},
 					},
 				},
 			},
@@ -67,7 +67,7 @@ func TestMergeOfflineVersion(t *testing.T) {
 			name: "update software info",
 			args: struct {
 				OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-				ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
+				ComponentsVersion kubeaninfomanifestv1alpha1.KubeanInfoManifest
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{
@@ -79,9 +79,9 @@ func TestMergeOfflineVersion(t *testing.T) {
 						},
 					},
 				},
-				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
-					Status: kubeanclusterconfigv1alpha1.Status{
-						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{},
+				ComponentsVersion: kubeaninfomanifestv1alpha1.KubeanInfoManifest{
+					Status: kubeaninfomanifestv1alpha1.Status{
+						LocalAvailable: kubeaninfomanifestv1alpha1.LocalAvailable{},
 					},
 				},
 			},
@@ -91,7 +91,7 @@ func TestMergeOfflineVersion(t *testing.T) {
 			name: "update software info",
 			args: struct {
 				OfflineVersion    kubeanofflineversionv1alpha1.KuBeanOfflineVersion
-				ComponentsVersion kubeanclusterconfigv1alpha1.KubeanClusterConfig
+				ComponentsVersion kubeaninfomanifestv1alpha1.KubeanInfoManifest
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{
@@ -103,10 +103,10 @@ func TestMergeOfflineVersion(t *testing.T) {
 						},
 					},
 				},
-				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
-					Status: kubeanclusterconfigv1alpha1.Status{
-						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{
-							Components: []*kubeanclusterconfigv1alpha1.SoftwareInfoStatus{
+				ComponentsVersion: kubeaninfomanifestv1alpha1.KubeanInfoManifest{
+					Status: kubeaninfomanifestv1alpha1.Status{
+						LocalAvailable: kubeaninfomanifestv1alpha1.LocalAvailable{
+							Components: []*kubeaninfomanifestv1alpha1.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 kubeanclusterconfigv1alpha1.KubeanClusterConfig
+				ComponentsVersion kubeaninfomanifestv1alpha1.KubeanInfoManifest
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{
@@ -134,10 +134,10 @@ func TestMergeOfflineVersion(t *testing.T) {
 						},
 					},
 				},
-				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
-					Status: kubeanclusterconfigv1alpha1.Status{
-						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{
-							Components: []*kubeanclusterconfigv1alpha1.SoftwareInfoStatus{
+				ComponentsVersion: kubeaninfomanifestv1alpha1.KubeanInfoManifest{
+					Status: kubeaninfomanifestv1alpha1.Status{
+						LocalAvailable: kubeaninfomanifestv1alpha1.LocalAvailable{
+							Components: []*kubeaninfomanifestv1alpha1.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 kubeanclusterconfigv1alpha1.KubeanClusterConfig
+				ComponentsVersion kubeaninfomanifestv1alpha1.KubeanInfoManifest
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{
@@ -171,16 +171,16 @@ func TestMergeOfflineVersion(t *testing.T) {
 						},
 					},
 				},
-				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
-					Status: kubeanclusterconfigv1alpha1.Status{
-						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{
-							Docker: []*kubeanclusterconfigv1alpha1.DockerInfoStatus{
+				ComponentsVersion: kubeaninfomanifestv1alpha1.KubeanInfoManifest{
+					Status: kubeaninfomanifestv1alpha1.Status{
+						LocalAvailable: kubeaninfomanifestv1alpha1.LocalAvailable{
+							Docker: []*kubeaninfomanifestv1alpha1.DockerInfoStatus{
 								{
 									OS:           "redhat-8",
 									VersionRange: []string{},
 								},
 							},
-							Components: []*kubeanclusterconfigv1alpha1.SoftwareInfoStatus{
+							Components: []*kubeaninfomanifestv1alpha1.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 kubeanclusterconfigv1alpha1.KubeanClusterConfig
+				ComponentsVersion kubeaninfomanifestv1alpha1.KubeanInfoManifest
 			}{
 				OfflineVersion: kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					Spec: kubeanofflineversionv1alpha1.Spec{
@@ -214,10 +214,10 @@ func TestMergeOfflineVersion(t *testing.T) {
 						},
 					},
 				},
-				ComponentsVersion: kubeanclusterconfigv1alpha1.KubeanClusterConfig{
-					Status: kubeanclusterconfigv1alpha1.Status{
-						AirGapStatus: kubeanclusterconfigv1alpha1.AirGapStatus{
-							Docker: []*kubeanclusterconfigv1alpha1.DockerInfoStatus{
+				ComponentsVersion: kubeaninfomanifestv1alpha1.KubeanInfoManifest{
+					Status: kubeaninfomanifestv1alpha1.Status{
+						LocalAvailable: kubeaninfomanifestv1alpha1.LocalAvailable{
+							Docker: []*kubeaninfomanifestv1alpha1.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"},
 								},
 							},
-							Components: []*kubeanclusterconfigv1alpha1.SoftwareInfoStatus{
+							Components: []*kubeaninfomanifestv1alpha1.SoftwareInfoStatus{
 								{
 									Name:         "etcd-1",
 									VersionRange: []string{"1.2", "1.1"},
@@ -263,7 +263,7 @@ func TestReconcile(t *testing.T) {
 					Client:                  newFakeClient(),
 					ClientSet:               clientsetfake.NewSimpleClientset(),
 					OfflineversionClientSet: kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
-					ClusterConfigClientSet:  kubeanclusterconfigv1alpha1fake.NewSimpleClientset(),
+					ClusterConfigClientSet:  kubeaninfomanifestv1alpha1fake.NewSimpleClientset(),
 				}
 				offlineVersionData := kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					TypeMeta: metav1.TypeMeta{
@@ -283,23 +283,23 @@ func TestReconcile(t *testing.T) {
 					},
 				}
 
-				globalComponentsVersion := kubeanclusterconfigv1alpha1.KubeanClusterConfig{
+				globalComponentsVersion := kubeaninfomanifestv1alpha1.KubeanInfoManifest{
 					TypeMeta: metav1.TypeMeta{
 						Kind:       "kubeanclusterconfig",
 						APIVersion: "kubean.io/v1alpha1",
 					},
 					ObjectMeta: metav1.ObjectMeta{
-						Name: constants.ClusterConfigGlobal,
+						Name: constants.InfoManifestGlobal,
 					},
 				}
 
 				controller.Create(context.Background(), &offlineVersionData)
 				controller.OfflineversionClientSet.KubeanV1alpha1().KuBeanOfflineVersions().Create(context.Background(), &offlineVersionData, metav1.CreateOptions{})
-				controller.ClusterConfigClientSet.KubeanV1alpha1().KubeanClusterConfigs().Create(context.Background(), &globalComponentsVersion, metav1.CreateOptions{})
+				controller.ClusterConfigClientSet.KubeanV1alpha1().KubeanInfoManifests().Create(context.Background(), &globalComponentsVersion, metav1.CreateOptions{})
 
 				result, err := controller.Reconcile(context.Background(), controllerruntime.Request{NamespacedName: types.NamespacedName{Name: offlineVersionData.Name}})
-				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
+				newGlobalComponentsVersion, _ := controller.ClusterConfigClientSet.KubeanV1alpha1().KubeanInfoManifests().Get(context.Background(), constants.InfoManifestGlobal, metav1.GetOptions{})
+				return err == nil && result.RequeueAfter == Loop && len(newGlobalComponentsVersion.Status.LocalAvailable.Docker) == 1 && len(newGlobalComponentsVersion.Status.LocalAvailable.Docker[0].VersionRange) == 2
 			},
 			want: true,
 		},
@@ -310,7 +310,7 @@ func TestReconcile(t *testing.T) {
 					Client:                  newFakeClient(),
 					ClientSet:               clientsetfake.NewSimpleClientset(),
 					OfflineversionClientSet: kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
-					ClusterConfigClientSet:  kubeanclusterconfigv1alpha1fake.NewSimpleClientset(),
+					ClusterConfigClientSet:  kubeaninfomanifestv1alpha1fake.NewSimpleClientset(),
 				}
 				offlineVersionData := kubeanofflineversionv1alpha1.KuBeanOfflineVersion{
 					TypeMeta: metav1.TypeMeta{
@@ -345,7 +345,7 @@ func TestReconcile(t *testing.T) {
 					Client:                  newFakeClient(),
 					ClientSet:               clientsetfake.NewSimpleClientset(),
 					OfflineversionClientSet: kubeanofflineversionv1alpha1fake.NewSimpleClientset(),
-					ClusterConfigClientSet:  kubeanclusterconfigv1alpha1fake.NewSimpleClientset(),
+					ClusterConfigClientSet:  kubeaninfomanifestv1alpha1fake.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 6c73fa519..007381518 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"
 
-	kubeanclusterconfigv1alpha1 "kubean.io/api/apis/kubeanclusterconfig/v1alpha1"
+	kubeaninfomanifestv1alpha1 "kubean.io/api/apis/kubeaninfomanifest/v1alpha1"
 	kubeanofflineversionv1alpha1 "kubean.io/api/apis/kubeanofflineversion/v1alpha1"
 )
 
@@ -18,9 +18,9 @@ func TestNewSchema(t *testing.T) {
 		wantGVK schema.GroupVersionKind
 	}{
 		{
-			name:    "KuBeanClusterConfig gvk",
-			obj:     &kubeanclusterconfigv1alpha1.KubeanClusterConfig{},
-			wantGVK: schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KubeanClusterConfig"},
+			name:    "KuBeanInfoManifest gvk",
+			obj:     &kubeaninfomanifestv1alpha1.KubeanInfoManifest{},
+			wantGVK: schema.GroupVersionKind{Group: "kubean.io", Version: "v1alpha1", Kind: "KubeanInfoManifest"},
 		},
 		{
 			name:    "KuBeanOfflineVersion gvk",