From 138c13ace046b5c97e104ff6708062399848f5f9 Mon Sep 17 00:00:00 2001 From: OrangeBao Date: Tue, 23 Apr 2024 10:13:22 +0800 Subject: [PATCH] feat: add timestamp for virtualcluster Signed-off-by: OrangeBao --- deploy/crds/kosmos.io_virtualclusters.yaml | 12 ++++++++- .../kosmos/v1alpha1/virtualcluster_types.go | 3 +++ .../kosmos/v1alpha1/zz_generated.deepcopy.go | 6 ++++- pkg/generated/openapi/zz_generated.openapi.go | 13 ++++++++++ .../join-worker.go | 2 +- .../node_controller.go | 15 ++++++++--- .../virtualcluster.node.controller/share.go | 6 ++--- .../nodepool.go | 26 +++++++++---------- 8 files changed, 61 insertions(+), 22 deletions(-) diff --git a/deploy/crds/kosmos.io_virtualclusters.yaml b/deploy/crds/kosmos.io_virtualclusters.yaml index 1599e3e75..cc51c66d2 100644 --- a/deploy/crds/kosmos.io_virtualclusters.yaml +++ b/deploy/crds/kosmos.io_virtualclusters.yaml @@ -15,7 +15,11 @@ spec: singular: virtualcluster scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - jsonPath: .status.phase + name: STATUS + type: string + name: v1alpha1 schema: openAPIV3Schema: properties: @@ -133,9 +137,15 @@ spec: phase: description: Phase is the phase of kosmos-operator handling the VirtualCluster type: string + reason: + type: string + timeStamp: + format: date-time + type: string type: object required: - spec type: object served: true storage: true + subresources: {} diff --git a/pkg/apis/kosmos/v1alpha1/virtualcluster_types.go b/pkg/apis/kosmos/v1alpha1/virtualcluster_types.go index 2719cf0b4..eb72e161b 100644 --- a/pkg/apis/kosmos/v1alpha1/virtualcluster_types.go +++ b/pkg/apis/kosmos/v1alpha1/virtualcluster_types.go @@ -24,6 +24,7 @@ const ( // +genclient // +kubebuilder:resource:scope=Namespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +kubebuilder:printcolumn:name="STATUS",type=string,JSONPath=`.status.phase` type VirtualCluster struct { metav1.TypeMeta `json:",inline"` @@ -89,6 +90,8 @@ type VirtualClusterStatus struct { Phase Phase `json:"phase,omitempty"` // +optional Reason string `json:"reason,omitempty" protobuf:"bytes,4,opt,name=reason"` + // +optional + TimeStamp *metav1.Time `json:"timeStamp,omitempty" protobuf:"bytes,7,opt,name=timeStamp"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/pkg/apis/kosmos/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/kosmos/v1alpha1/zz_generated.deepcopy.go index 9a1ec2e21..f42e7868a 100644 --- a/pkg/apis/kosmos/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/kosmos/v1alpha1/zz_generated.deepcopy.go @@ -1564,7 +1564,7 @@ func (in *VirtualCluster) DeepCopyInto(out *VirtualCluster) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) return } @@ -1646,6 +1646,10 @@ func (in *VirtualClusterSpec) DeepCopy() *VirtualClusterSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *VirtualClusterStatus) DeepCopyInto(out *VirtualClusterStatus) { *out = *in + if in.TimeStamp != nil { + in, out := &in.TimeStamp, &out.TimeStamp + *out = (*in).DeepCopy() + } return } diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index d4e53b771..532530eae 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -2866,9 +2866,22 @@ func schema_pkg_apis_kosmos_v1alpha1_VirtualClusterStatus(ref common.ReferenceCa Format: "", }, }, + "reason": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "timeStamp": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, }, }, }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, } } diff --git a/pkg/kubenest/controller/virtualcluster.node.controller/join-worker.go b/pkg/kubenest/controller/virtualcluster.node.controller/join-worker.go index 18d6705dd..01baeb130 100644 --- a/pkg/kubenest/controller/virtualcluster.node.controller/join-worker.go +++ b/pkg/kubenest/controller/virtualcluster.node.controller/join-worker.go @@ -96,7 +96,7 @@ func (r *NodeController) joinNode(ctx context.Context, nodeInfos []vcrnodepoolco // step(2/5) scp ca of virtualcluster nn := types.NamespacedName{ Namespace: virtualCluster.Namespace, - Name: fmt.Sprintf("%s-cert", virtualCluster.Namespace), + Name: fmt.Sprintf("%s-cert", virtualCluster.Name), } targetCert := &v1.Secret{} if err := r.Get(ctx, nn, targetCert); err != nil { diff --git a/pkg/kubenest/controller/virtualcluster.node.controller/node_controller.go b/pkg/kubenest/controller/virtualcluster.node.controller/node_controller.go index 713cea397..5044610c4 100644 --- a/pkg/kubenest/controller/virtualcluster.node.controller/node_controller.go +++ b/pkg/kubenest/controller/virtualcluster.node.controller/node_controller.go @@ -127,6 +127,7 @@ func compareAndTranformNodes(targetNodes []v1alpha1.NodeInfo, actualNodes []v1.N if !ok { return nil, nil, fmt.Errorf("node %s not found in node pool", actualNode.Name) } + unjoinNodes = append(unjoinNodes, nodePool) } } @@ -140,7 +141,7 @@ func (r *NodeController) GetNodePool(ctx context.Context) (map[string]vcrnodepoo return nil, fmt.Errorf("get node-pool failed: %v", err) } - nodePools, err := vcrnodepoolcontroller.ConvertJsonToNodeItem(nodePool.Data[NodePoolCMKeyName]) + nodePools, err := vcrnodepoolcontroller.ConvertYamlToNodeItem(nodePool.Data[NodePoolCMKeyName]) if err != nil { return nil, fmt.Errorf("convert node-pool failed: %v", err) } @@ -152,6 +153,8 @@ func (r *NodeController) UpdateVirtualClusterStatus(ctx context.Context, virtual updateVirtualCluster := virtualCluster.DeepCopy() updateVirtualCluster.Status.Phase = status updateVirtualCluster.Status.Reason = reason + timestamp := metav1.Now() + updateVirtualCluster.Status.TimeStamp = ×tamp if err := r.Update(ctx, updateVirtualCluster); err != nil { return fmt.Errorf("update virtualcluster %s status failed: %s", virtualCluster.Name, err) @@ -182,8 +185,14 @@ func (r *NodeController) DoNodeTask(ctx context.Context, virtualCluster v1alpha1 } if len(unjoinNodes) > 0 || len(joinNodes) > 0 { - if err := r.UpdateVirtualClusterStatus(ctx, virtualCluster, v1alpha1.Updating, "node task"); err != nil { - return err + if virtualCluster.Status.Phase == v1alpha1.Initialized { + if err := r.UpdateVirtualClusterStatus(ctx, virtualCluster, v1alpha1.Initialized, "node init"); err != nil { + return err + } + } else { + if err := r.UpdateVirtualClusterStatus(ctx, virtualCluster, v1alpha1.Updating, "node task"); err != nil { + return err + } } } if len(unjoinNodes) > 0 { diff --git a/pkg/kubenest/controller/virtualcluster.node.controller/share.go b/pkg/kubenest/controller/virtualcluster.node.controller/share.go index 3da99e014..542d9e53d 100644 --- a/pkg/kubenest/controller/virtualcluster.node.controller/share.go +++ b/pkg/kubenest/controller/virtualcluster.node.controller/share.go @@ -21,8 +21,8 @@ func (r *NodeController) UpdateNodePoolState(ctx context.Context, nodeName strin updateNodePool := nodePool.DeepCopy() - jsonStr := updateNodePool.Data[NodePoolCMKeyName] - nodePoolItem, err := vcrnodepoolcontroller.ConvertJsonToNodePoolItem(jsonStr) + yamlStr := updateNodePool.Data[NodePoolCMKeyName] + nodePoolItem, err := vcrnodepoolcontroller.ConvertYamlToNodePoolItem(yamlStr) if err != nil { return err } @@ -32,7 +32,7 @@ func (r *NodeController) UpdateNodePoolState(ctx context.Context, nodeName strin nodePoolItem[nodeName] = targetNodePoolItem - nodePoolBytes, err := vcrnodepoolcontroller.ConvertNodePoolItemToJson(nodePoolItem) + nodePoolBytes, err := vcrnodepoolcontroller.ConvertNodePoolItemToYaml(nodePoolItem) if err != nil { return err } diff --git a/pkg/kubenest/controller/virtualcluster.nodepool.controller/nodepool.go b/pkg/kubenest/controller/virtualcluster.nodepool.controller/nodepool.go index f874adb80..132c6fddf 100644 --- a/pkg/kubenest/controller/virtualcluster.nodepool.controller/nodepool.go +++ b/pkg/kubenest/controller/virtualcluster.nodepool.controller/nodepool.go @@ -1,25 +1,25 @@ package vcrnodepoolcontroller import ( - "encoding/json" + "gopkg.in/yaml.v3" ) type NodePoolMapItem struct { - Address string `json:"address"` - Labels map[string]string `json:"labels"` - Cluster string `json:"cluster"` - State string `json:"state"` + Address string `yaml:"address"` + Labels map[string]string `yaml:"labels"` + Cluster string `yaml:"cluster"` + State string `yaml:"state"` } type NodeItem struct { NodePoolMapItem - Name string `json:"-"` + Name string `yaml:"-"` } -func ConvertJsonToNodeItem(jsonStr string) (map[string]NodeItem, error) { +func ConvertYamlToNodeItem(yamlStr string) (map[string]NodeItem, error) { nodepoolMap := map[string]NodeItem{} - nodepoolItem, err := ConvertJsonToNodePoolItem(jsonStr) + nodepoolItem, err := ConvertYamlToNodePoolItem(yamlStr) if err != nil { return nil, err } @@ -34,21 +34,21 @@ func ConvertJsonToNodeItem(jsonStr string) (map[string]NodeItem, error) { return nodepoolMap, nil } -func ConvertJsonToNodePoolItem(jsonStr string) (map[string]NodePoolMapItem, error) { +func ConvertYamlToNodePoolItem(yamlStr string) (map[string]NodePoolMapItem, error) { nodepoolItem := map[string]NodePoolMapItem{} - err := json.Unmarshal([]byte(jsonStr), &nodepoolItem) + err := yaml.Unmarshal([]byte(yamlStr), &nodepoolItem) if err != nil { return nil, err } return nodepoolItem, nil } -func ConvertNodePoolItemToJson(nodepoolItem map[string]NodePoolMapItem) ([]byte, error) { - jsonStr, err := json.Marshal(nodepoolItem) +func ConvertNodePoolItemToYaml(nodepoolItem map[string]NodePoolMapItem) ([]byte, error) { + yamlStr, err := yaml.Marshal(nodepoolItem) if err != nil { return nil, err } - return jsonStr, nil + return yamlStr, nil } // controller task