mirror of
https://github.com/argoproj/argo-cd
synced 2026-04-21 17:07:16 +00:00
141 lines
4.3 KiB
Go
141 lines
4.3 KiB
Go
package controller
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/ghodss/yaml"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/client-go/kubernetes/fake"
|
|
|
|
argoappv1 "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1"
|
|
appclientset "github.com/argoproj/argo-cd/pkg/client/clientset/versioned/fake"
|
|
reposerver "github.com/argoproj/argo-cd/reposerver/mocks"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func newFakeController(apps ...runtime.Object) *ApplicationController {
|
|
kubeClientset := fake.NewSimpleClientset()
|
|
appClientset := appclientset.NewSimpleClientset(apps...)
|
|
repoClientset := reposerver.Clientset{}
|
|
return NewApplicationController(
|
|
"argocd",
|
|
kubeClientset,
|
|
appClientset,
|
|
&repoClientset,
|
|
time.Minute,
|
|
)
|
|
}
|
|
|
|
var fakeApp = `
|
|
apiVersion: argoproj.io/v1alpha1
|
|
kind: Application
|
|
metadata:
|
|
name: my-app
|
|
namespace: argocd
|
|
spec:
|
|
destination:
|
|
namespace: dummy-namespace
|
|
server: https://localhost:6443
|
|
project: default
|
|
source:
|
|
path: some/path
|
|
repoURL: https://github.com/argoproj/argocd-example-apps.git
|
|
syncPolicy:
|
|
automated: {}
|
|
status:
|
|
history:
|
|
- deployedAt: 2018-09-08T09:16:50Z
|
|
id: 0
|
|
params: []
|
|
revision: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
|
`
|
|
|
|
func newFakeApp() *argoappv1.Application {
|
|
var app argoappv1.Application
|
|
err := yaml.Unmarshal([]byte(fakeApp), &app)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return &app
|
|
}
|
|
|
|
func TestAutoSync(t *testing.T) {
|
|
app := newFakeApp()
|
|
ctrl := newFakeController(app)
|
|
compRes := argoappv1.ComparisonResult{
|
|
Status: argoappv1.ComparisonStatusOutOfSync,
|
|
Revision: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
}
|
|
cond := ctrl.autoSync(app, &compRes)
|
|
assert.Nil(t, cond)
|
|
app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications("argocd").Get("my-app", metav1.GetOptions{})
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, app.Operation)
|
|
assert.NotNil(t, app.Operation.Sync)
|
|
assert.False(t, app.Operation.Sync.Prune)
|
|
}
|
|
|
|
func TestSkipAutoSync(t *testing.T) {
|
|
// Verify we skip when we previously synced to it in our most recent history
|
|
// Set current to 'aaaaa', desired to 'aaaa' and mark system OutOfSync
|
|
app := newFakeApp()
|
|
ctrl := newFakeController(app)
|
|
compRes := argoappv1.ComparisonResult{
|
|
Status: argoappv1.ComparisonStatusOutOfSync,
|
|
Revision: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
}
|
|
cond := ctrl.autoSync(app, &compRes)
|
|
assert.Nil(t, cond)
|
|
app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications("argocd").Get("my-app", metav1.GetOptions{})
|
|
assert.NoError(t, err)
|
|
assert.Nil(t, app.Operation)
|
|
|
|
// Verify we skip when we are already Synced (even if revision is different)
|
|
app = newFakeApp()
|
|
ctrl = newFakeController(app)
|
|
compRes = argoappv1.ComparisonResult{
|
|
Status: argoappv1.ComparisonStatusSynced,
|
|
Revision: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
}
|
|
cond = ctrl.autoSync(app, &compRes)
|
|
assert.Nil(t, cond)
|
|
app, err = ctrl.applicationClientset.ArgoprojV1alpha1().Applications("argocd").Get("my-app", metav1.GetOptions{})
|
|
assert.NoError(t, err)
|
|
assert.Nil(t, app.Operation)
|
|
|
|
// Verify we skip when auto-sync is disabled
|
|
app = newFakeApp()
|
|
app.Spec.SyncPolicy = nil
|
|
ctrl = newFakeController(app)
|
|
compRes = argoappv1.ComparisonResult{
|
|
Status: argoappv1.ComparisonStatusOutOfSync,
|
|
Revision: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
}
|
|
cond = ctrl.autoSync(app, &compRes)
|
|
assert.Nil(t, cond)
|
|
app, err = ctrl.applicationClientset.ArgoprojV1alpha1().Applications("argocd").Get("my-app", metav1.GetOptions{})
|
|
assert.NoError(t, err)
|
|
assert.Nil(t, app.Operation)
|
|
|
|
// Verify we skip when previous sync attempt failed and return error condition
|
|
// Set current to 'aaaaa', desired to 'bbbbb' and add 'bbbbb' to failure history
|
|
app = newFakeApp()
|
|
app.Status.OperationState = &argoappv1.OperationState{
|
|
Phase: argoappv1.OperationFailed,
|
|
SyncResult: &argoappv1.SyncOperationResult{
|
|
Revision: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
},
|
|
}
|
|
ctrl = newFakeController(app)
|
|
compRes = argoappv1.ComparisonResult{
|
|
Status: argoappv1.ComparisonStatusOutOfSync,
|
|
Revision: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
}
|
|
cond = ctrl.autoSync(app, &compRes)
|
|
assert.NotNil(t, cond)
|
|
app, err = ctrl.applicationClientset.ArgoprojV1alpha1().Applications("argocd").Get("my-app", metav1.GetOptions{})
|
|
assert.NoError(t, err)
|
|
assert.Nil(t, app.Operation)
|
|
}
|