Skip to content

Commit 03b545d

Browse files
authored
Merge pull request #10 from weaveworks/fix-empty-inventory
Fix bug when no resources are generated.
2 parents 5e9ad1e + 67b2b67 commit 03b545d

File tree

5 files changed

+73
-4
lines changed

5 files changed

+73
-4
lines changed

api/v1alpha1/conditions.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,14 @@ func SetGitOpsSetReadiness(set *GitOpsSet, status metav1.ConditionStatus, reason
2828
apimeta.SetStatusCondition(&set.Status.Conditions, newCondition)
2929
}
3030

31+
// SetReadyWithInventory updates the GitOpsSet to reflect the new readiness and
32+
// store the current inventory.
3133
func SetReadyWithInventory(set *GitOpsSet, inventory *ResourceInventory, reason, message string) {
3234
set.Status.Inventory = inventory
35+
36+
if len(inventory.Entries) == 0 {
37+
set.Status.Inventory = nil
38+
}
39+
3340
SetGitOpsSetReadiness(set, metav1.ConditionTrue, reason, message)
3441
}

api/v1alpha1/inventory.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package v1alpha1
33
// ResourceInventory contains a list of Kubernetes resource object references that have been applied by a Kustomization.
44
type ResourceInventory struct {
55
// Entries of Kubernetes resource object references.
6-
Entries []ResourceRef `json:"entries"`
6+
Entries []ResourceRef `json:"entries,omitempty"`
77
}
88

99
// ResourceRef contains the information necessary to locate a resource within a cluster.

config/crd/bases/templates.weave.works_gitopssets.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,6 @@ spec:
196196
- v
197197
type: object
198198
type: array
199-
required:
200-
- entries
201199
type: object
202200
observedGeneration:
203201
description: ObservedGeneration is the last observed generation of

controllers/gitopsset_controller.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,9 @@ type GitOpsSetReconciler struct {
5656
//
5757
// For more details, check Reconcile and its Result here:
5858
// - https://pkg.go.dev/sigs.k8s.io/[email protected]/pkg/reconcile
59-
func (r *GitOpsSetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
59+
func (r *GitOpsSetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, retErr error) {
6060
logger := log.FromContext(ctx)
61+
6162
var gitOpsSet templatesv1.GitOpsSet
6263
if err := r.Client.Get(ctx, req.NamespacedName, &gitOpsSet); err != nil {
6364
return ctrl.Result{}, client.IgnoreNotFound(err)
@@ -82,8 +83,10 @@ func (r *GitOpsSetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
8283
if inventory != nil {
8384
templatesv1.SetReadyWithInventory(&gitOpsSet, inventory, templatesv1.ReconciliationSucceededReason,
8485
fmt.Sprintf("%d resources created", len(inventory.Entries)))
86+
8587
if err := r.patchStatus(ctx, req, gitOpsSet.Status); err != nil {
8688
logger.Error(err, "failed to reconcile")
89+
return ctrl.Result{}, fmt.Errorf("failed to update status and inventory: %w", err)
8790
}
8891
}
8992

controllers/gitopsset_controller_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,56 @@ func TestReconciliation(t *testing.T) {
267267
t.Fatalf("failed to update Kustomization:\n%s", diff)
268268
}
269269
})
270+
271+
t.Run("reconciling with no generated resources", func(t *testing.T) {
272+
ctx := context.TODO()
273+
devKS := makeTestKustomization(nsn("default", "engineering-dev-demo"), func(k *kustomizev1.Kustomization) {
274+
k.ObjectMeta.Annotations = map[string]string{
275+
"testing": "existingResource",
276+
}
277+
})
278+
test.AssertNoError(t, k8sClient.Create(ctx, test.ToUnstructured(t, devKS)))
279+
defer deleteAllKustomizations(t, k8sClient)
280+
281+
gs := makeTestGitOpsSet(t, func(gs *templatesv1.GitOpsSet) {
282+
// No templates to generate resources from
283+
gs.Spec.Templates = []templatesv1.GitOpsSetTemplate{}
284+
gs.Spec.Generators = []templatesv1.GitOpsSetGenerator{
285+
{
286+
List: &templatesv1.ListGenerator{
287+
Elements: []apiextensionsv1.JSON{
288+
{Raw: []byte(`{"cluster": "engineering-dev"}`)},
289+
},
290+
},
291+
},
292+
}
293+
})
294+
test.AssertNoError(t, k8sClient.Create(ctx, gs))
295+
defer cleanupResource(t, k8sClient, gs)
296+
297+
ref, err := resourceRefFromObject(devKS)
298+
test.AssertNoError(t, err)
299+
300+
gs.Status.Inventory = &templatesv1.ResourceInventory{
301+
Entries: []templatesv1.ResourceRef{ref},
302+
}
303+
if err := k8sClient.Status().Update(ctx, gs); err != nil {
304+
t.Fatal(err)
305+
}
306+
307+
_, err = reconciler.Reconcile(ctx, ctrl.Request{NamespacedName: client.ObjectKeyFromObject(gs)})
308+
if err != nil {
309+
t.Fatal(err)
310+
}
311+
312+
updated := &templatesv1.GitOpsSet{}
313+
if err := k8sClient.Get(ctx, client.ObjectKeyFromObject(gs), updated); err != nil {
314+
t.Fatal(err)
315+
}
316+
317+
assertInventoryHasNoItems(t, updated)
318+
})
319+
270320
}
271321

272322
func deleteAllKustomizations(t *testing.T, cl client.Client) {
@@ -344,6 +394,17 @@ func assertInventoryHasItems(t *testing.T, gs *templatesv1.GitOpsSet, objs ...ru
344394
}
345395
}
346396

397+
func assertInventoryHasNoItems(t *testing.T, gs *templatesv1.GitOpsSet) {
398+
t.Helper()
399+
if gs.Status.Inventory == nil {
400+
return
401+
}
402+
403+
if l := len(gs.Status.Inventory.Entries); l != 0 {
404+
t.Errorf("expected inventory to have 0 items, got %v", l)
405+
}
406+
}
407+
347408
func cleanupResource(t *testing.T, cl client.Client, obj client.Object) {
348409
if err := cl.Delete(context.TODO(), obj); err != nil {
349410
t.Fatal(err)

0 commit comments

Comments
 (0)