Skip to content

Commit a95f3bf

Browse files
committed
chore: add helper functions for CLI applications
add some helpers to use in Talos and omni and make minor improvements to the diff and wait logic. Signed-off-by: Orzelius <33936483+Orzelius@users.noreply.github.com>
1 parent f2c063b commit a95f3bf

File tree

6 files changed

+88
-8
lines changed

6 files changed

+88
-8
lines changed

internal/integration/server_side_apply_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,9 @@ func TestServerSideApply(t *testing.T) {
259259
// check that the manager.Wait call blocks for at least 25 secunds
260260
start := time.Now()
261261

262+
err = manager.Wait(t.Context(), object.ObjMetadataSet{object.UnstructuredToObjMetadata(deploy)}, fluxssa.WaitOptions{FailFast: true, Timeout: 2 * time.Second, Interval: 1 * time.Second})
263+
require.ErrorContains(t, err, "timeout waiting for")
264+
262265
err = manager.Wait(t.Context(), object.ObjMetadataSet{object.UnstructuredToObjMetadata(deploy)}, fluxssa.WaitOptions{FailFast: true, Timeout: 1 * time.Minute, Interval: 1 * time.Second})
263266
require.NoError(t, err)
264267

kubernetes/ssa/cli/cli.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// This Source Code Form is subject to the terms of the Mozilla Public
2+
// License, v. 2.0. If a copy of the MPL was not distributed with this
3+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4+
5+
// Package cli provides helper functions for CLI applications using the SSA manager.
6+
package cli
7+
8+
import (
9+
"context"
10+
11+
"github.com/fluxcd/cli-utils/pkg/object"
12+
13+
"github.com/siderolabs/go-kubernetes/kubernetes/ssa"
14+
)
15+
16+
// LogApplyResults logs the results of an SSA apply operation.
17+
func LogApplyResults(ctx context.Context, changes []ssa.Change, manager *ssa.Manager, logFunc func(line string, args ...any)) {
18+
for _, change := range changes {
19+
switch change.Action {
20+
case ssa.CreatedAction, ssa.ConfiguredAction, ssa.DeletedAction:
21+
logFunc(" < %s %s", change.Action, change.Subject)
22+
logFunc("%s", change.Diff)
23+
case ssa.SkippedAction, ssa.UnchangedAction:
24+
logFunc(" > skipped %s: no changes", change.Subject)
25+
default:
26+
logFunc(" > processing manifest %s: unknown action %q", change.Subject, change.Action)
27+
}
28+
}
29+
}
30+
31+
// Wait waits for the given set of changes to be fully reconciled.
32+
func Wait(ctx context.Context, changes []ssa.Change, logFunc func(line string, args ...any), manager *ssa.Manager, waitOps ssa.WaitOptions) error {
33+
waitObjects := make(map[object.ObjMetadata]struct{}, len(changes))
34+
35+
for _, change := range changes {
36+
switch change.Action {
37+
case ssa.CreatedAction, ssa.ConfiguredAction:
38+
waitObjects[change.ObjMetadata] = struct{}{}
39+
}
40+
}
41+
42+
logFunc("waiting for kubernetes objects to be fully reconciled")
43+
44+
err := manager.Wait(ctx,
45+
object.ObjMetadataSetFromMap(waitObjects),
46+
waitOps,
47+
)
48+
if err != nil {
49+
return err
50+
}
51+
52+
logFunc("done")
53+
54+
return nil
55+
}

kubernetes/ssa/diff.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,12 @@ func (m *Manager) diff(
169169
if err != nil {
170170
return nil, "", err
171171
}
172+
173+
// inventory conflict check: only relevant for modified objects
174+
err = checkInventoryPolicy(invID, inClusterObj, invPolicy)
175+
if err != nil {
176+
return nil, "", invPolicyFailureErr(inputObj, err)
177+
}
172178
}
173179

174180
// should never happen, but just in case
@@ -179,14 +185,6 @@ func (m *Manager) diff(
179185
}
180186
}
181187

182-
// inventory conflict check: only relevant for modified objects
183-
if changeSet.Action == ssa.ConfiguredAction {
184-
err = checkInventoryPolicy(invID, inClusterObj, invPolicy)
185-
if err != nil {
186-
return nil, "", invPolicyFailureErr(inputObj, err)
187-
}
188-
}
189-
190188
return changeSet, diff, nil
191189
}
192190

kubernetes/ssa/inventory_policy.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,18 @@ const (
6464
InventoryPolicyAdoptAll InventoryPolicy = "AdoptAll"
6565
)
6666

67+
func ParseInventoryPolicy(policy string) (InventoryPolicy, error) {
68+
p := InventoryPolicy(policy)
69+
70+
switch p {
71+
case InventoryPolicyMustMatch, InventoryPolicyAdoptIfNoInventory, InventoryPolicyAdoptAll:
72+
return p, nil
73+
}
74+
75+
return "", fmt.Errorf("invalid inventory policy %q: must be one of %s, %s, or %s",
76+
policy, InventoryPolicyMustMatch, InventoryPolicyAdoptIfNoInventory, InventoryPolicyAdoptAll)
77+
}
78+
6779
type annotated interface {
6880
GetAnnotations() map[string]string
6981
}

kubernetes/ssa/object/object.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package object
77

88
import (
99
fluxobj "github.com/fluxcd/cli-utils/pkg/object"
10+
"k8s.io/apimachinery/pkg/runtime"
1011
)
1112

1213
// ObjMetadata is a single object metadata.
@@ -22,3 +23,9 @@ type UnstructuredSet = fluxobj.UnstructuredSet
2223
func ParseObjMetadata(s string) (ObjMetadata, error) {
2324
return fluxobj.ParseObjMetadata(s)
2425
}
26+
27+
// RuntimeToObjMeta extracts the object metadata information from a
28+
// runtime.Object and returns it as ObjMetadata.
29+
func RuntimeToObjMeta(obj runtime.Object) (ObjMetadata, error) {
30+
return fluxobj.RuntimeToObjMeta(obj)
31+
}

kubernetes/ssa/wait.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,10 @@ type WaitOptions = ssa.WaitOptions
1616

1717
// Wait checks if the given set of objects has been fully reconciled.
1818
func (m *Manager) Wait(ctx context.Context, set object.ObjMetadataSet, opts WaitOptions) error {
19+
// remove once https://github.com/fluxcd/pkg/pull/1133 is released
20+
if len(set) == 0 {
21+
return nil
22+
}
23+
1924
return m.resourceManager.WaitForSetWithContext(ctx, set, opts)
2025
}

0 commit comments

Comments
 (0)