Refactor: Move inventory helpers to internal package

Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com>
This commit is contained in:
Stefan Prodan 2022-10-11 13:27:55 +03:00
parent cfe35399e0
commit 484cbcc14c
No known key found for this signature in database
GPG Key ID: 3299AEB0E4085BAF
5 changed files with 149 additions and 21 deletions

View File

@ -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,

View File

@ -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 {

View File

@ -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
}

View File

@ -0,0 +1,12 @@
apiVersion: v1
kind: Namespace
metadata:
name: test
---
apiVersion: v1
kind: ConfigMap
metadata:
name: test1
namespace: test
data:
key: value1

View File

@ -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