Skip to content

Commit b22663c

Browse files
committed
Do not use --force with --dry-run
Signed-off-by: rafal-jan <[email protected]>
1 parent 9ab0b2e commit b22663c

File tree

3 files changed

+81
-66
lines changed

3 files changed

+81
-66
lines changed

pkg/sync/sync_context.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -962,7 +962,8 @@ func (sc *syncContext) applyObject(t *syncTask, dryRun, validate bool) (common.R
962962
var err error
963963
var message string
964964
shouldReplace := sc.replace || resourceutil.HasAnnotationOption(t.targetObj, common.AnnotationSyncOptions, common.SyncOptionReplace)
965-
force := sc.force || resourceutil.HasAnnotationOption(t.targetObj, common.AnnotationSyncOptions, common.SyncOptionForce)
965+
// force is not required when running dry-run in client mode
966+
shouldForce := !dryRun && (sc.force || resourceutil.HasAnnotationOption(t.targetObj, common.AnnotationSyncOptions, common.SyncOptionForce))
966967
// if it is a dry run, disable server side apply, as the goal is to validate only the
967968
// yaml correctness of the rendered manifests.
968969
// running dry-run in server mode breaks the auto create namespace feature
@@ -983,13 +984,13 @@ func (sc *syncContext) applyObject(t *syncTask, dryRun, validate bool) (common.R
983984
message = fmt.Sprintf("error when updating: %v", err.Error())
984985
}
985986
} else {
986-
message, err = sc.resourceOps.ReplaceResource(context.TODO(), t.targetObj, dryRunStrategy, force)
987+
message, err = sc.resourceOps.ReplaceResource(context.TODO(), t.targetObj, dryRunStrategy, shouldForce)
987988
}
988989
} else {
989990
message, err = sc.resourceOps.CreateResource(context.TODO(), t.targetObj, dryRunStrategy, validate)
990991
}
991992
} else {
992-
message, err = sc.resourceOps.ApplyResource(context.TODO(), t.targetObj, dryRunStrategy, force, validate, serverSideApply, sc.serverSideApplyManager, false)
993+
message, err = sc.resourceOps.ApplyResource(context.TODO(), t.targetObj, dryRunStrategy, shouldForce, validate, serverSideApply, sc.serverSideApplyManager, false)
993994
}
994995
if err != nil {
995996
return common.ResultCodeSyncFailed, err.Error()

pkg/sync/sync_context_test.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"k8s.io/client-go/rest"
2828
testcore "k8s.io/client-go/testing"
2929
"k8s.io/klog/v2/textlogger"
30+
cmdutil "k8s.io/kubectl/pkg/cmd/util"
3031

3132
"github.com/argoproj/gitops-engine/pkg/diff"
3233
"github.com/argoproj/gitops-engine/pkg/health"
@@ -102,7 +103,7 @@ func TestSyncValidate(t *testing.T) {
102103

103104
// kubectl := syncCtx.kubectl.(*kubetest.MockKubectlCmd)
104105
resourceOps, _ := syncCtx.resourceOps.(*kubetest.MockResourceOps)
105-
assert.False(t, resourceOps.GetLastValidate())
106+
assert.False(t, resourceOps.GetLastValidate(kube.GetResourceKey(pod)))
106107
}
107108

108109
func TestSyncNotPermittedNamespace(t *testing.T) {
@@ -743,7 +744,7 @@ func TestSyncOptionValidate(t *testing.T) {
743744

744745
// kubectl, _ := syncCtx.kubectl.(*kubetest.MockKubectlCmd)
745746
resourceOps, _ := syncCtx.resourceOps.(*kubetest.MockResourceOps)
746-
assert.Equal(t, tt.want, resourceOps.GetLastValidate())
747+
assert.Equal(t, tt.want, resourceOps.GetLastValidate(kube.GetResourceKey(pod)))
747748
})
748749
}
749750
}
@@ -834,8 +835,8 @@ func TestSync_ServerSideApply(t *testing.T) {
834835
// kubectl, _ := syncCtx.kubectl.(*kubetest.MockKubectlCmd)
835836
resourceOps, _ := syncCtx.resourceOps.(*kubetest.MockResourceOps)
836837
assert.Equal(t, tc.commandUsed, resourceOps.GetLastResourceCommand(kube.GetResourceKey(tc.target)))
837-
assert.Equal(t, tc.serverSideApply, resourceOps.GetLastServerSideApply())
838-
assert.Equal(t, tc.manager, resourceOps.GetLastServerSideApplyManager())
838+
assert.Equal(t, tc.serverSideApply, resourceOps.GetLastServerSideApply(kube.GetResourceKey(tc.target)))
839+
assert.Equal(t, tc.manager, resourceOps.GetLastServerSideApplyManager(kube.GetResourceKey(tc.target)))
839840
})
840841
}
841842
}
@@ -880,8 +881,17 @@ func TestSync_Force(t *testing.T) {
880881
syncCtx.Sync()
881882

882883
resourceOps, _ := syncCtx.resourceOps.(*kubetest.MockResourceOps)
884+
registeredCommands := resourceOps.RegisteredCommands(kube.GetResourceKey(tc.target))
885+
assert.Len(t, registeredCommands, 2)
886+
dryRunCommand := registeredCommands[0]
887+
command := registeredCommands[1]
883888
assert.Equal(t, tc.commandUsed, resourceOps.GetLastResourceCommand(kube.GetResourceKey(tc.target)))
884-
assert.Equal(t, tc.force, resourceOps.GetLastForce())
889+
890+
assert.Equal(t, false, dryRunCommand.Force)
891+
assert.Equal(t, cmdutil.DryRunClient, dryRunCommand.DryRunStrategy)
892+
893+
assert.Equal(t, tc.force, command.Force)
894+
assert.Equal(t, cmdutil.DryRunNone, command.DryRunStrategy)
885895
})
886896
}
887897
}

pkg/utils/kube/kubetest/mock_resource_operations.go

Lines changed: 62 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,21 @@ import (
1313
cmdutil "k8s.io/kubectl/pkg/cmd/util"
1414
)
1515

16+
type RegisteredCommand struct {
17+
Command string
18+
Validate bool
19+
ServerSideApply bool
20+
ServerSideApplyManager string
21+
Force bool
22+
DryRunStrategy cmdutil.DryRunStrategy
23+
}
24+
1625
type MockResourceOps struct {
1726
Commands map[string]KubectlOutput
1827
Events chan watch.Event
1928
DynamicClient dynamic.Interface
2029

21-
lastCommandPerResource map[kube.ResourceKey]string
22-
lastValidate bool
23-
serverSideApply bool
24-
serverSideApplyManager string
25-
lastForce bool
30+
commandsPerResource map[kube.ResourceKey][]RegisteredCommand
2631

2732
recordLock sync.RWMutex
2833

@@ -35,82 +40,59 @@ func (r *MockResourceOps) WithGetResourceFunc(getResourcefunc func(context.Conte
3540
return r
3641
}
3742

38-
func (r *MockResourceOps) SetLastValidate(validate bool) {
39-
r.recordLock.Lock()
40-
r.lastValidate = validate
41-
r.recordLock.Unlock()
42-
}
43-
44-
func (r *MockResourceOps) GetLastValidate() bool {
43+
func (r *MockResourceOps) GetLastValidate(key kube.ResourceKey) bool {
4544
r.recordLock.RLock()
46-
validate := r.lastValidate
45+
validate := r.lastCommand(key).Validate
4746
r.recordLock.RUnlock()
4847
return validate
4948
}
5049

51-
func (r *MockResourceOps) SetLastServerSideApply(serverSideApply bool) {
52-
r.recordLock.Lock()
53-
r.serverSideApply = serverSideApply
54-
r.recordLock.Unlock()
55-
}
56-
57-
func (r *MockResourceOps) GetLastServerSideApplyManager() string {
50+
func (r *MockResourceOps) GetLastServerSideApplyManager(key kube.ResourceKey) string {
5851
r.recordLock.Lock()
59-
manager := r.serverSideApplyManager
52+
manager := r.lastCommand(key).ServerSideApplyManager
6053
r.recordLock.Unlock()
6154
return manager
6255
}
6356

64-
func (r *MockResourceOps) GetLastServerSideApply() bool {
57+
func (r *MockResourceOps) GetLastServerSideApply(key kube.ResourceKey) bool {
6558
r.recordLock.RLock()
66-
serverSideApply := r.serverSideApply
59+
serverSideApply := r.lastCommand(key).ServerSideApply
6760
r.recordLock.RUnlock()
6861
return serverSideApply
6962
}
7063

71-
func (r *MockResourceOps) SetLastServerSideApplyManager(manager string) {
72-
r.recordLock.Lock()
73-
r.serverSideApplyManager = manager
74-
r.recordLock.Unlock()
75-
}
76-
77-
func (r *MockResourceOps) SetLastForce(force bool) {
78-
r.recordLock.Lock()
79-
r.lastForce = force
80-
r.recordLock.Unlock()
81-
}
82-
83-
func (r *MockResourceOps) GetLastForce() bool {
64+
func (r *MockResourceOps) GetLastForce(key kube.ResourceKey) bool {
8465
r.recordLock.RLock()
85-
force := r.lastForce
66+
force := r.lastCommand(key).Force
8667
r.recordLock.RUnlock()
8768
return force
8869
}
8970

90-
func (r *MockResourceOps) SetLastResourceCommand(key kube.ResourceKey, cmd string) {
91-
r.recordLock.Lock()
92-
if r.lastCommandPerResource == nil {
93-
r.lastCommandPerResource = map[kube.ResourceKey]string{}
94-
}
95-
r.lastCommandPerResource[key] = cmd
96-
r.recordLock.Unlock()
97-
}
98-
9971
func (r *MockResourceOps) GetLastResourceCommand(key kube.ResourceKey) string {
10072
r.recordLock.Lock()
10173
defer r.recordLock.Unlock()
102-
if r.lastCommandPerResource == nil {
74+
if r.commandsPerResource == nil {
10375
return ""
10476
}
105-
return r.lastCommandPerResource[key]
77+
return r.lastCommand(key).Command
78+
}
79+
80+
func (r *MockResourceOps) RegisteredCommands(key kube.ResourceKey) []RegisteredCommand {
81+
r.recordLock.RLock()
82+
registeredCommands := r.commandsPerResource[key]
83+
r.recordLock.RUnlock()
84+
return registeredCommands
10685
}
10786

10887
func (r *MockResourceOps) ApplyResource(ctx context.Context, obj *unstructured.Unstructured, dryRunStrategy cmdutil.DryRunStrategy, force, validate, serverSideApply bool, manager string, serverSideDiff bool) (string, error) {
109-
r.SetLastValidate(validate)
110-
r.SetLastServerSideApply(serverSideApply)
111-
r.SetLastServerSideApplyManager(manager)
112-
r.SetLastForce(force)
113-
r.SetLastResourceCommand(kube.GetResourceKey(obj), "apply")
88+
r.registerCommand(kube.GetResourceKey(obj), RegisteredCommand{
89+
Command: "apply",
90+
Validate: validate,
91+
ServerSideApply: serverSideApply,
92+
ServerSideApplyManager: manager,
93+
Force: force,
94+
DryRunStrategy: dryRunStrategy,
95+
})
11496
command, ok := r.Commands[obj.GetName()]
11597
if !ok {
11698
return "", nil
@@ -120,9 +102,12 @@ func (r *MockResourceOps) ApplyResource(ctx context.Context, obj *unstructured.U
120102
}
121103

122104
func (r *MockResourceOps) ReplaceResource(ctx context.Context, obj *unstructured.Unstructured, dryRunStrategy cmdutil.DryRunStrategy, force bool) (string, error) {
123-
r.SetLastForce(force)
105+
r.registerCommand(kube.GetResourceKey(obj), RegisteredCommand{
106+
Command: "replace",
107+
Force: force,
108+
DryRunStrategy: dryRunStrategy,
109+
})
124110
command, ok := r.Commands[obj.GetName()]
125-
r.SetLastResourceCommand(kube.GetResourceKey(obj), "replace")
126111
if !ok {
127112
return "", nil
128113
}
@@ -131,7 +116,10 @@ func (r *MockResourceOps) ReplaceResource(ctx context.Context, obj *unstructured
131116
}
132117

133118
func (r *MockResourceOps) UpdateResource(ctx context.Context, obj *unstructured.Unstructured, dryRunStrategy cmdutil.DryRunStrategy) (*unstructured.Unstructured, error) {
134-
r.SetLastResourceCommand(kube.GetResourceKey(obj), "update")
119+
r.registerCommand(kube.GetResourceKey(obj), RegisteredCommand{
120+
Command: "update",
121+
DryRunStrategy: dryRunStrategy,
122+
})
135123
command, ok := r.Commands[obj.GetName()]
136124
if !ok {
137125
return obj, nil
@@ -141,15 +129,31 @@ func (r *MockResourceOps) UpdateResource(ctx context.Context, obj *unstructured.
141129
}
142130

143131
func (r *MockResourceOps) CreateResource(ctx context.Context, obj *unstructured.Unstructured, dryRunStrategy cmdutil.DryRunStrategy, validate bool) (string, error) {
144-
145-
r.SetLastResourceCommand(kube.GetResourceKey(obj), "create")
132+
r.registerCommand(kube.GetResourceKey(obj), RegisteredCommand{
133+
Command: "create",
134+
Validate: validate,
135+
DryRunStrategy: dryRunStrategy,
136+
})
146137
command, ok := r.Commands[obj.GetName()]
147138
if !ok {
148139
return "", nil
149140
}
150141
return command.Output, command.Err
151142
}
152143

144+
func (r *MockResourceOps) registerCommand(key kube.ResourceKey, cmd RegisteredCommand) {
145+
r.recordLock.Lock()
146+
if r.commandsPerResource == nil {
147+
r.commandsPerResource = map[kube.ResourceKey][]RegisteredCommand{}
148+
}
149+
r.commandsPerResource[key] = append(r.commandsPerResource[key], cmd)
150+
r.recordLock.Unlock()
151+
}
152+
153+
func (r *MockResourceOps) lastCommand(key kube.ResourceKey) RegisteredCommand {
154+
return r.commandsPerResource[key][len(r.commandsPerResource[key])-1]
155+
}
156+
153157
/*func (r *MockResourceOps) ConvertToVersion(obj *unstructured.Unstructured, group, version string) (*unstructured.Unstructured, error) {
154158
if r.convertToVersionFunc != nil {
155159
return (*r.convertToVersionFunc)(obj, group, version)

0 commit comments

Comments
 (0)