Skip to content

Instantly share code, notes, and snippets.

@erdii
Created August 31, 2023 09:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save erdii/f8484d60955dd436b47620ec2fbcae58 to your computer and use it in GitHub Desktop.
Save erdii/f8484d60955dd436b47620ec2fbcae58 to your computer and use it in GitHub Desktop.
package dev
import (
"context"
"fmt"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
)
type ClusterLoadObjectWithStatusFromClientObject struct {
client.Object
}
func (l ClusterLoadObjectWithStatusFromClientObject) Init(
ctx context.Context, cluster *Cluster) error {
obj, err := l.toUnstructured(cluster.Scheme)
if err != nil {
return err
}
// store wanted status because the create call will override it otherwise
status := obj.Object["status"]
if err := cluster.CreateAndWaitForReadiness(ctx, l.Object); err != nil {
return fmt.Errorf("creating object: %w", err)
}
// restore and update status
obj.Object["status"] = status
return cluster.CtrlClient.Status().Update(ctx, l.Object)
}
func (l ClusterLoadObjectWithStatusFromClientObject) toUnstructured(
scheme *runtime.Scheme) (*unstructured.Unstructured, error) {
gvks, _, err := scheme.ObjectKinds(l.Object)
if err != nil {
return nil, fmt.Errorf("looking up obj gvk: %w", err)
}
if len(gvks) != 1 {
return nil, fmt.Errorf("looking up obj gvk: multiple gvks found")
}
unstructuredObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(l.Object)
if err != nil {
return nil, fmt.Errorf("converting obj to unstructured: %w", err)
}
uns := &unstructured.Unstructured{
Object: unstructuredObj,
}
uns.SetGroupVersionKind(gvks[0])
return uns, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment