Skip to content

Commit

Permalink
Move things around
Browse files Browse the repository at this point in the history
  • Loading branch information
mproffitt committed Oct 30, 2023
1 parent aea68fc commit 1838dba
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 102 deletions.
1 change: 0 additions & 1 deletion package.go

This file was deleted.

101 changes: 1 addition & 100 deletions pkg/composite/composition.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
package composite

import (
"encoding/json"
"fmt"

"github.com/crossplane/crossplane-runtime/pkg/errors"
fnv1beta1 "github.com/crossplane/function-sdk-go/proto/v1beta1"
"github.com/crossplane/function-sdk-go/request"
"github.com/crossplane/function-sdk-go/resource"
"github.com/crossplane/function-sdk-go/resource/composed"
"github.com/crossplane/function-sdk-go/response"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
)
Expand Down Expand Up @@ -83,7 +79,7 @@ func New(req *fnv1beta1.RunFunctionRequest, input InputProvider) (c *Composition
return
}

if err = c.To(oxr.Resource.Object, &c.ObservedComposite); err != nil {
if err = To(oxr.Resource.Object, &c.ObservedComposite); err != nil {
err = errors.Wrapf(err, "Failed to convert XR object to struct %T", c.ObservedComposite)
return
}
Expand Down Expand Up @@ -134,98 +130,3 @@ func (c *Composition) AddDesired(name string, object *unstructured.Unstructured)
}
return
}

// ToUnstructured is a helper function that creates an unstructured object from any object
// that contains metadata, spec and optionally status.
func (c *Composition) ToUnstructured(apiVersion, kind, object any) (objectSpec *unstructured.Unstructured, err error) {
objectSpec = &unstructured.Unstructured{}
type objS struct {
Metadata map[string]interface{}
Spec map[string]interface{}
Status map[string]interface{}
}
var o objS
if err = c.To(object, &o); err != nil {
return
}

if len(o.Metadata) == 0 {
err = &InvalidMetadata{}
return
}

if len(o.Spec) == 0 {
err = &InvalidSpec{}
return
}

objectSpec.Object = map[string]interface{}{
"apiVersion": apiVersion,
"kind": kind,
"metadata": o.Metadata,
"spec": o.Spec,
}
if len(o.Status) > 0 {
objectSpec.Object["status"] = o.Status
}
return
}

// ToUnstructuredKubernetesObject is a helper function that wraps a given CR resource in
// a `crossplane-contrib/provider-kubernetes.Object` structure and returns this as an unstructured.Unstructured object
func (c *Composition) ToUnstructuredKubernetesObject(mp any, kpcr string) (objectSpec *unstructured.Unstructured, err error) {
objectSpec = &unstructured.Unstructured{}
var unstructuredData map[string]interface{}
if err = c.To(mp, &unstructuredData); err != nil {
return
}

if _, ok := unstructuredData["metadata"]; !ok {
err = errors.Wrap(&MissingMetadata{}, "unable to create kubernetes object. object missing metadata")
return
}

var meta metav1.ObjectMeta
if err = c.To(unstructuredData["metadata"], &meta); err != nil {
err = errors.Wrap(err, fmt.Sprintf("unable to create kubernetes object : %+v", unstructuredData["metadata"]))
return
}

var labels map[string]interface{} = make(map[string]interface{})
for k, v := range meta.Labels {
labels[k] = v
}

objectSpec.Object = map[string]interface{}{
"apiVersion": "kubernetes.crossplane.io/v1alpha1",
"kind": "Object",
"metadata": map[string]interface{}{
"name": meta.Name,
"labels": labels,
},
"spec": map[string]interface{}{
"forProvider": map[string]interface{}{
"manifest": unstructuredData,
},
"writeConnectionSecretToRef": map[string]interface{}{
"name": meta.Name,
"namespace": meta.Namespace,
},
"providerConfigRef": map[string]interface{}{
"name": kpcr, //c.ObservedComposite.Spec.KubernetesProviderConfigRef,
},
},
}
return
}

// To is a helper function that converts any object to any object by sending it round-robin through `json.Marshal`
func (c *Composition) To(resource any, jsonObject any) (err error) {
var b []byte
if b, err = json.Marshal(resource); err != nil {
return
}

err = json.Unmarshal(b, jsonObject)
return
}
105 changes: 105 additions & 0 deletions pkg/composite/functions.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package composite

import (
"encoding/json"
"fmt"

"github.com/crossplane/crossplane-runtime/pkg/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)

// ToUnstructured is a helper function that creates an unstructured object from any object
// that contains metadata, spec and optionally status.
func ToUnstructured(apiVersion, kind, object any) (objectSpec *unstructured.Unstructured, err error) {
objectSpec = &unstructured.Unstructured{}
type objS struct {
Metadata map[string]interface{}
Spec map[string]interface{}
Status map[string]interface{}
}
var o objS
if err = To(object, &o); err != nil {
return
}

if len(o.Metadata) == 0 {
err = &InvalidMetadata{}
return
}

if len(o.Spec) == 0 {
err = &InvalidSpec{}
return
}

objectSpec.Object = map[string]interface{}{
"apiVersion": apiVersion,
"kind": kind,
"metadata": o.Metadata,
"spec": o.Spec,
}
if len(o.Status) > 0 {
objectSpec.Object["status"] = o.Status
}
return
}

// ToUnstructuredKubernetesObject is a helper function that wraps a given CR resource in
// a `crossplane-contrib/provider-kubernetes.Object` structure and returns this as an unstructured.Unstructured object
func ToUnstructuredKubernetesObject(mp any, providerConfigRef string) (objectSpec *unstructured.Unstructured, err error) {
objectSpec = &unstructured.Unstructured{}
var unstructuredData map[string]interface{}
if err = To(mp, &unstructuredData); err != nil {
return
}

if _, ok := unstructuredData["metadata"]; !ok {
err = errors.Wrap(&MissingMetadata{}, "unable to create kubernetes object. object missing metadata")
return
}

var meta metav1.ObjectMeta
if err = To(unstructuredData["metadata"], &meta); err != nil {
err = errors.Wrap(err, fmt.Sprintf("unable to create kubernetes object : %+v", unstructuredData["metadata"]))
return
}

var labels map[string]interface{} = make(map[string]interface{})
for k, v := range meta.Labels {
labels[k] = v
}

objectSpec.Object = map[string]interface{}{
"apiVersion": "kubernetes.crossplane.io/v1alpha1",
"kind": "Object",
"metadata": map[string]interface{}{
"name": meta.Name,
"labels": labels,
},
"spec": map[string]interface{}{
"forProvider": map[string]interface{}{
"manifest": unstructuredData,
},
"writeConnectionSecretToRef": map[string]interface{}{
"name": meta.Name,
"namespace": meta.Namespace,
},
"providerConfigRef": map[string]interface{}{
"name": providerConfigRef,
},
},
}
return
}

// To is a helper function that converts any object to any object by sending it round-robin through `json.Marshal`
func To(resource any, jsonObject any) (err error) {
var b []byte
if b, err = json.Marshal(resource); err != nil {
return
}

err = json.Unmarshal(b, jsonObject)
return
}
1 change: 0 additions & 1 deletion pkg/doc.go

This file was deleted.

0 comments on commit 1838dba

Please sign in to comment.