mirror of https://github.com/fluxcd/cli-utils.git
96 lines
2.7 KiB
Go
96 lines
2.7 KiB
Go
// Copyright 2020 The Kubernetes Authors.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package object
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
"k8s.io/cli-runtime/pkg/resource"
|
|
"sigs.k8s.io/kustomize/kyaml/kio/kioutil"
|
|
)
|
|
|
|
// InfosToObjMetas returns object metadata (ObjMetadata) for the
|
|
// passed objects (infos); returns an error if one occurs.
|
|
func InfosToObjMetas(infos []*resource.Info) ([]ObjMetadata, error) {
|
|
objMetas := make([]ObjMetadata, 0, len(infos))
|
|
for _, info := range infos {
|
|
objMeta, err := InfoToObjMeta(info)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
objMetas = append(objMetas, objMeta)
|
|
}
|
|
return objMetas, nil
|
|
}
|
|
|
|
// InfoToObjMeta takes information from the provided info and
|
|
// returns an ObjMetadata that identifies the resource.
|
|
func InfoToObjMeta(info *resource.Info) (ObjMetadata, error) {
|
|
if info == nil || info.Object == nil {
|
|
return ObjMetadata{}, fmt.Errorf("attempting to transform info, but it is empty")
|
|
}
|
|
id := ObjMetadata{
|
|
Namespace: info.Namespace,
|
|
Name: info.Name,
|
|
GroupKind: info.Object.GetObjectKind().GroupVersionKind().GroupKind(),
|
|
}
|
|
return id, nil
|
|
}
|
|
|
|
// InfoToUnstructured transforms the passed info object into unstructured format.
|
|
func InfoToUnstructured(info *resource.Info) *unstructured.Unstructured {
|
|
return info.Object.(*unstructured.Unstructured)
|
|
}
|
|
|
|
// UnstructuredToInfo transforms the passed Unstructured object into Info format,
|
|
// or an error if one occurs.
|
|
func UnstructuredToInfo(obj *unstructured.Unstructured) (*resource.Info, error) {
|
|
// make a copy of the input object to avoid modifying the input
|
|
obj = obj.DeepCopy()
|
|
|
|
annos := obj.GetAnnotations()
|
|
|
|
source := "unstructured"
|
|
path, ok := annos[kioutil.PathAnnotation]
|
|
if ok {
|
|
source = path
|
|
// kyaml adds both annotations for the time being, so we need to remove them both
|
|
// before apply.
|
|
delete(annos, kioutil.PathAnnotation)
|
|
delete(annos, kioutil.LegacyPathAnnotation)
|
|
obj.SetAnnotations(annos)
|
|
}
|
|
|
|
return &resource.Info{
|
|
Name: obj.GetName(),
|
|
Namespace: obj.GetNamespace(),
|
|
Source: source,
|
|
Object: obj,
|
|
}, nil
|
|
}
|
|
|
|
// InfosToUnstructureds transforms the passed objects in Info format to Unstructured.
|
|
func InfosToUnstructureds(infos []*resource.Info) []*unstructured.Unstructured {
|
|
var objs []*unstructured.Unstructured
|
|
for _, info := range infos {
|
|
objs = append(objs, InfoToUnstructured(info))
|
|
}
|
|
return objs
|
|
}
|
|
|
|
// UnstructuredsToInfos transforms the passed Unstructured objects into Info format
|
|
// or an error if one occurs.
|
|
func UnstructuredsToInfos(objs []*unstructured.Unstructured) ([]*resource.Info, error) {
|
|
var infos []*resource.Info
|
|
for _, obj := range objs {
|
|
inf, err := UnstructuredToInfo(obj)
|
|
if err != nil {
|
|
return infos, err
|
|
}
|
|
infos = append(infos, inf)
|
|
}
|
|
return infos, nil
|
|
}
|