mirror of
https://github.com/open-cluster-management-io/ocm.git
synced 2026-02-14 10:00:11 +00:00
72 lines
2.3 KiB
Go
72 lines
2.3 KiB
Go
package cluster
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
clusterv1 "open-cluster-management.io/api/cluster/v1"
|
|
|
|
cloudevents "github.com/cloudevents/sdk-go/v2"
|
|
|
|
"open-cluster-management.io/sdk-go/pkg/cloudevents/clients/utils"
|
|
"open-cluster-management.io/sdk-go/pkg/cloudevents/generic/types"
|
|
genericutils "open-cluster-management.io/sdk-go/pkg/cloudevents/generic/utils"
|
|
)
|
|
|
|
var ManagedClusterEventDataType = types.CloudEventsDataType{
|
|
Group: clusterv1.GroupVersion.Group,
|
|
Version: clusterv1.GroupVersion.Version,
|
|
Resource: "managedclusters",
|
|
}
|
|
|
|
// ManagedClusterCodec is a codec to encode/decode a ManagedCluster/cloudevent for an agent.
|
|
type ManagedClusterCodec struct{}
|
|
|
|
func NewManagedClusterCodec() *ManagedClusterCodec {
|
|
return &ManagedClusterCodec{}
|
|
}
|
|
|
|
// EventDataType always returns the event data type `cluster.open-cluster-management.io.v1.managedclusters`.
|
|
func (c *ManagedClusterCodec) EventDataType() types.CloudEventsDataType {
|
|
return ManagedClusterEventDataType
|
|
}
|
|
|
|
// Encode the ManagedCluster to a cloudevent
|
|
func (c *ManagedClusterCodec) Encode(source string, eventType types.CloudEventsType, cluster *clusterv1.ManagedCluster) (*cloudevents.Event, error) {
|
|
if eventType.CloudEventsDataType != ManagedClusterEventDataType {
|
|
return nil, fmt.Errorf("unsupported cloudevents data type %s", eventType.CloudEventsDataType)
|
|
}
|
|
|
|
evt := types.NewEventBuilder(source, eventType).
|
|
WithResourceID(string(cluster.UID)).
|
|
WithClusterName(cluster.Name).
|
|
NewEvent()
|
|
|
|
genericutils.SetResourceVersion(eventType, &evt, cluster)
|
|
|
|
if !cluster.DeletionTimestamp.IsZero() {
|
|
evt.SetExtension(types.ExtensionDeletionTimestamp, cluster.DeletionTimestamp.Time)
|
|
return &evt, nil
|
|
}
|
|
|
|
newCluster := cluster.DeepCopy()
|
|
newCluster.TypeMeta = metav1.TypeMeta{
|
|
APIVersion: clusterv1.GroupVersion.String(),
|
|
Kind: "ManagedCluster",
|
|
}
|
|
|
|
if err := evt.SetData(cloudevents.ApplicationJSON, newCluster); err != nil {
|
|
return nil, fmt.Errorf("failed to encode managedcluster to a cloudevent: %v", err)
|
|
}
|
|
|
|
return &evt, nil
|
|
}
|
|
|
|
// Decode a cloudevent to a ManagedCluster
|
|
func (c *ManagedClusterCodec) Decode(evt *cloudevents.Event) (*clusterv1.ManagedCluster, error) {
|
|
return utils.DecodeWithDeletionHandling(evt, func() *clusterv1.ManagedCluster {
|
|
return &clusterv1.ManagedCluster{}
|
|
})
|
|
}
|