Refactor: Move inventory helpers to internal package
Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com>
This commit is contained in:
		
							parent
							
								
									cfe35399e0
								
							
						
					
					
						commit
						484cbcc14c
					
				| 
						 | 
				
			
			@ -63,6 +63,7 @@ import (
 | 
			
		|||
	kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1beta2"
 | 
			
		||||
	"github.com/fluxcd/kustomize-controller/internal/decryptor"
 | 
			
		||||
	"github.com/fluxcd/kustomize-controller/internal/generator"
 | 
			
		||||
	"github.com/fluxcd/kustomize-controller/internal/inventory"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// +kubebuilder:rbac:groups=kustomize.toolkit.fluxcd.io,resources=kustomizations,verbs=get;list;watch;create;update;patch;delete
 | 
			
		||||
| 
						 | 
				
			
			@ -440,8 +441,8 @@ func (r *KustomizationReconciler) reconcile(
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// create an inventory of objects to be reconciled
 | 
			
		||||
	newInventory := NewInventory()
 | 
			
		||||
	err = AddObjectsToInventory(newInventory, changeSet)
 | 
			
		||||
	newInventory := inventory.New()
 | 
			
		||||
	err = inventory.AddChangeSet(newInventory, changeSet)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return kustomizev1.KustomizationNotReady(
 | 
			
		||||
			kustomization,
 | 
			
		||||
| 
						 | 
				
			
			@ -454,7 +455,7 @@ func (r *KustomizationReconciler) reconcile(
 | 
			
		|||
	// detect stale objects which are subject to garbage collection
 | 
			
		||||
	var staleObjects []*unstructured.Unstructured
 | 
			
		||||
	if oldStatus.Inventory != nil {
 | 
			
		||||
		diffObjects, err := DiffInventory(oldStatus.Inventory, newInventory)
 | 
			
		||||
		diffObjects, err := inventory.Diff(oldStatus.Inventory, newInventory)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return kustomizev1.KustomizationNotReady(
 | 
			
		||||
				kustomization,
 | 
			
		||||
| 
						 | 
				
			
			@ -467,7 +468,7 @@ func (r *KustomizationReconciler) reconcile(
 | 
			
		|||
		// TODO: remove this workaround after kustomize-controller 0.18 release
 | 
			
		||||
		// skip objects that were wrongly marked as namespaced
 | 
			
		||||
		// https://github.com/fluxcd/kustomize-controller/issues/466
 | 
			
		||||
		newObjects, _ := ListObjectsInInventory(newInventory)
 | 
			
		||||
		newObjects, _ := inventory.List(newInventory)
 | 
			
		||||
		for _, obj := range diffObjects {
 | 
			
		||||
			preserve := false
 | 
			
		||||
			if obj.GetNamespace() != "" {
 | 
			
		||||
| 
						 | 
				
			
			@ -846,7 +847,7 @@ func (r *KustomizationReconciler) checkHealth(ctx context.Context, manager *ssa.
 | 
			
		|||
	checkStart := time.Now()
 | 
			
		||||
	var err error
 | 
			
		||||
	if !kustomization.Spec.Wait {
 | 
			
		||||
		objects, err = referenceToObjMetadataSet(kustomization.Spec.HealthChecks)
 | 
			
		||||
		objects, err = inventory.ReferenceToObjMetadataSet(kustomization.Spec.HealthChecks)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -932,7 +933,7 @@ func (r *KustomizationReconciler) finalize(ctx context.Context, kustomization ku
 | 
			
		|||
		!kustomization.Spec.Suspend &&
 | 
			
		||||
		kustomization.Status.Inventory != nil &&
 | 
			
		||||
		kustomization.Status.Inventory.Entries != nil {
 | 
			
		||||
		objects, _ := ListObjectsInInventory(kustomization.Status.Inventory)
 | 
			
		||||
		objects, _ := inventory.List(kustomization.Status.Inventory)
 | 
			
		||||
 | 
			
		||||
		impersonation := runtimeClient.NewImpersonator(
 | 
			
		||||
			r.Client,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,28 +14,29 @@ See the License for the specific language governing permissions and
 | 
			
		|||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package controllers
 | 
			
		||||
package inventory
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sort"
 | 
			
		||||
 | 
			
		||||
	"github.com/fluxcd/pkg/apis/meta"
 | 
			
		||||
	"github.com/fluxcd/pkg/ssa"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
	"sigs.k8s.io/cli-utils/pkg/object"
 | 
			
		||||
 | 
			
		||||
	"github.com/fluxcd/pkg/apis/meta"
 | 
			
		||||
	"github.com/fluxcd/pkg/ssa"
 | 
			
		||||
 | 
			
		||||
	kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1beta2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func NewInventory() *kustomizev1.ResourceInventory {
 | 
			
		||||
func New() *kustomizev1.ResourceInventory {
 | 
			
		||||
	return &kustomizev1.ResourceInventory{
 | 
			
		||||
		Entries: []kustomizev1.ResourceRef{},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddObjectsToInventory extracts the metadata from the given objects and adds it to the inventory.
 | 
			
		||||
func AddObjectsToInventory(inv *kustomizev1.ResourceInventory, set *ssa.ChangeSet) error {
 | 
			
		||||
// AddChangeSet extracts the metadata from the given objects and adds it to the inventory.
 | 
			
		||||
func AddChangeSet(inv *kustomizev1.ResourceInventory, set *ssa.ChangeSet) error {
 | 
			
		||||
	if set == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -50,8 +51,8 @@ func AddObjectsToInventory(inv *kustomizev1.ResourceInventory, set *ssa.ChangeSe
 | 
			
		|||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ListObjectsInInventory returns the inventory entries as unstructured.Unstructured objects.
 | 
			
		||||
func ListObjectsInInventory(inv *kustomizev1.ResourceInventory) ([]*unstructured.Unstructured, error) {
 | 
			
		||||
// List returns the inventory entries as unstructured.Unstructured objects.
 | 
			
		||||
func List(inv *kustomizev1.ResourceInventory) ([]*unstructured.Unstructured, error) {
 | 
			
		||||
	objects := make([]*unstructured.Unstructured, 0)
 | 
			
		||||
 | 
			
		||||
	if inv.Entries == nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -79,8 +80,8 @@ func ListObjectsInInventory(inv *kustomizev1.ResourceInventory) ([]*unstructured
 | 
			
		|||
	return objects, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ListMetaInInventory returns the inventory entries as object.ObjMetadata objects.
 | 
			
		||||
func ListMetaInInventory(inv *kustomizev1.ResourceInventory) (object.ObjMetadataSet, error) {
 | 
			
		||||
// ListMetadata returns the inventory entries as object.ObjMetadata objects.
 | 
			
		||||
func ListMetadata(inv *kustomizev1.ResourceInventory) (object.ObjMetadataSet, error) {
 | 
			
		||||
	var metas []object.ObjMetadata
 | 
			
		||||
	for _, e := range inv.Entries {
 | 
			
		||||
		m, err := object.ParseObjMetadata(e.ID)
 | 
			
		||||
| 
						 | 
				
			
			@ -93,8 +94,8 @@ func ListMetaInInventory(inv *kustomizev1.ResourceInventory) (object.ObjMetadata
 | 
			
		|||
	return metas, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DiffInventory returns the slice of objects that do not exist in the target inventory.
 | 
			
		||||
func DiffInventory(inv *kustomizev1.ResourceInventory, target *kustomizev1.ResourceInventory) ([]*unstructured.Unstructured, error) {
 | 
			
		||||
// Diff returns the slice of objects that do not exist in the target inventory.
 | 
			
		||||
func Diff(inv *kustomizev1.ResourceInventory, target *kustomizev1.ResourceInventory) ([]*unstructured.Unstructured, error) {
 | 
			
		||||
	versionOf := func(i *kustomizev1.ResourceInventory, objMetadata object.ObjMetadata) string {
 | 
			
		||||
		for _, entry := range i.Entries {
 | 
			
		||||
			if entry.ID == objMetadata.String() {
 | 
			
		||||
| 
						 | 
				
			
			@ -105,12 +106,12 @@ func DiffInventory(inv *kustomizev1.ResourceInventory, target *kustomizev1.Resou
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	objects := make([]*unstructured.Unstructured, 0)
 | 
			
		||||
	aList, err := ListMetaInInventory(inv)
 | 
			
		||||
	aList, err := ListMetadata(inv)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bList, err := ListMetaInInventory(target)
 | 
			
		||||
	bList, err := ListMetadata(target)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -136,7 +137,8 @@ func DiffInventory(inv *kustomizev1.ResourceInventory, target *kustomizev1.Resou
 | 
			
		|||
	return objects, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func referenceToObjMetadataSet(cr []meta.NamespacedObjectKindReference) (object.ObjMetadataSet, error) {
 | 
			
		||||
// ReferenceToObjMetadataSet transforms a NamespacedObjectKindReference to an ObjMetadataSet.
 | 
			
		||||
func ReferenceToObjMetadataSet(cr []meta.NamespacedObjectKindReference) (object.ObjMetadataSet, error) {
 | 
			
		||||
	var objects []object.ObjMetadata
 | 
			
		||||
 | 
			
		||||
	for _, c := range cr {
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,93 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright 2022 The Flux authors
 | 
			
		||||
 | 
			
		||||
Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
you may not use this file except in compliance with the License.
 | 
			
		||||
You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package inventory
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	. "github.com/onsi/gomega"
 | 
			
		||||
	"sigs.k8s.io/cli-utils/pkg/object"
 | 
			
		||||
 | 
			
		||||
	"github.com/fluxcd/pkg/ssa"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Test_Inventory(t *testing.T) {
 | 
			
		||||
	g := NewWithT(t)
 | 
			
		||||
 | 
			
		||||
	set1, err := readManifest("testdata/inventory1.yaml")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	inv1 := New()
 | 
			
		||||
	err = AddChangeSet(inv1, set1)
 | 
			
		||||
	g.Expect(err).ToNot(HaveOccurred())
 | 
			
		||||
 | 
			
		||||
	set2, err := readManifest("testdata/inventory2.yaml")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	inv2 := New()
 | 
			
		||||
	err = AddChangeSet(inv2, set2)
 | 
			
		||||
	g.Expect(err).ToNot(HaveOccurred())
 | 
			
		||||
 | 
			
		||||
	t.Run("lists objects in inventory", func(t *testing.T) {
 | 
			
		||||
		unList, err := List(inv1)
 | 
			
		||||
		g.Expect(err).ToNot(HaveOccurred())
 | 
			
		||||
		g.Expect(len(unList)).To(BeIdenticalTo(len(inv1.Entries)))
 | 
			
		||||
 | 
			
		||||
		mList, err := ListMetadata(inv1)
 | 
			
		||||
		g.Expect(err).ToNot(HaveOccurred())
 | 
			
		||||
		g.Expect(len(mList)).To(BeIdenticalTo(len(inv1.Entries)))
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	t.Run("diff objects in inventory", func(t *testing.T) {
 | 
			
		||||
		unList, err := Diff(inv2, inv1)
 | 
			
		||||
		g.Expect(err).ToNot(HaveOccurred())
 | 
			
		||||
		g.Expect(len(unList)).To(BeIdenticalTo(1))
 | 
			
		||||
		g.Expect(unList[0].GetName()).To(BeIdenticalTo("test2"))
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func readManifest(manifest string) (*ssa.ChangeSet, error) {
 | 
			
		||||
	data, err := os.ReadFile(manifest)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	objects, err := ssa.ReadObjects(strings.NewReader(string(data)))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cs := ssa.NewChangeSet()
 | 
			
		||||
 | 
			
		||||
	for _, o := range objects {
 | 
			
		||||
		cse := ssa.ChangeSetEntry{
 | 
			
		||||
			ObjMetadata:  object.UnstructuredToObjMetadata(o),
 | 
			
		||||
			GroupVersion: o.GroupVersionKind().Version,
 | 
			
		||||
			Subject:      ssa.FmtUnstructured(o),
 | 
			
		||||
			Action:       string(ssa.CreatedAction),
 | 
			
		||||
		}
 | 
			
		||||
		cs.Add(cse)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return cs, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
apiVersion: v1
 | 
			
		||||
kind: Namespace
 | 
			
		||||
metadata:
 | 
			
		||||
  name: test
 | 
			
		||||
---
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: ConfigMap
 | 
			
		||||
metadata:
 | 
			
		||||
  name: test1
 | 
			
		||||
  namespace: test
 | 
			
		||||
data:
 | 
			
		||||
  key: value1
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
apiVersion: v1
 | 
			
		||||
kind: Namespace
 | 
			
		||||
metadata:
 | 
			
		||||
  name: test
 | 
			
		||||
---
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: ConfigMap
 | 
			
		||||
metadata:
 | 
			
		||||
  name: test1
 | 
			
		||||
  namespace: test
 | 
			
		||||
data:
 | 
			
		||||
  key: value1
 | 
			
		||||
---
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: ConfigMap
 | 
			
		||||
metadata:
 | 
			
		||||
  name: test2
 | 
			
		||||
  namespace: test
 | 
			
		||||
data:
 | 
			
		||||
  key: value2
 | 
			
		||||
		Loading…
	
		Reference in New Issue