github.com/argoproj/argo-cd/v2@v2.10.5/test/e2e/selective_sync_test.go (about) 1 package e2e 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "github.com/argoproj/gitops-engine/pkg/health" 9 . "github.com/argoproj/gitops-engine/pkg/sync/common" 10 "github.com/stretchr/testify/require" 11 12 . "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" 13 "github.com/argoproj/argo-cd/v2/test/e2e/fixture" 14 . "github.com/argoproj/argo-cd/v2/test/e2e/fixture" 15 . "github.com/argoproj/argo-cd/v2/test/e2e/fixture/app" 16 . "github.com/argoproj/argo-cd/v2/util/errors" 17 "github.com/argoproj/argo-cd/v2/util/rand" 18 ) 19 20 // when you selectively sync, only selected resources should be synced, but the app will be out of sync 21 func TestSelectiveSync(t *testing.T) { 22 Given(t). 23 Path("guestbook"). 24 SelectedResource(":Service:guestbook-ui"). 25 When(). 26 CreateApp(). 27 Sync(). 28 Then(). 29 Expect(Success("")). 30 Expect(OperationPhaseIs(OperationSucceeded)). 31 Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). 32 Expect(ResourceHealthIs("Service", "guestbook-ui", health.HealthStatusHealthy)). 33 Expect(ResourceHealthIs("Deployment", "guestbook-ui", health.HealthStatusMissing)) 34 } 35 36 // when running selective sync, hooks do not run 37 // hooks don't run even if all resources are selected 38 func TestSelectiveSyncDoesNotRunHooks(t *testing.T) { 39 Given(t). 40 Path("hook"). 41 SelectedResource(":Pod:pod"). 42 When(). 43 CreateApp(). 44 Sync(). 45 Then(). 46 Expect(Success("")). 47 Expect(OperationPhaseIs(OperationSucceeded)). 48 Expect(SyncStatusIs(SyncStatusCodeSynced)). 49 Expect(HealthIs(health.HealthStatusHealthy)). 50 Expect(ResourceHealthIs("Pod", "pod", health.HealthStatusHealthy)). 51 Expect(ResourceResultNumbering(1)) 52 } 53 54 func TestSelectiveSyncWithoutNamespace(t *testing.T) { 55 selectedResourceNamespace := getNewNamespace(t) 56 defer func() { 57 if !t.Skipped() { 58 FailOnErr(Run("", "kubectl", "delete", "namespace", selectedResourceNamespace)) 59 } 60 }() 61 Given(t). 62 Prune(true). 63 Path("guestbook-with-namespace"). 64 And(func() { 65 FailOnErr(Run("", "kubectl", "create", "namespace", selectedResourceNamespace)) 66 }). 67 SelectedResource("apps:Deployment:guestbook-ui"). 68 When(). 69 PatchFile("guestbook-ui-deployment-ns.yaml", fmt.Sprintf(`[{"op": "replace", "path": "/metadata/namespace", "value": "%s"}]`, selectedResourceNamespace)). 70 PatchFile("guestbook-ui-svc-ns.yaml", fmt.Sprintf(`[{"op": "replace", "path": "/metadata/namespace", "value": "%s"}]`, selectedResourceNamespace)). 71 CreateApp(). 72 Sync(). 73 Then(). 74 Expect(Success("")). 75 Expect(OperationPhaseIs(OperationSucceeded)). 76 Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). 77 Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", selectedResourceNamespace, health.HealthStatusHealthy)). 78 Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", fixture.DeploymentNamespace(), health.HealthStatusHealthy)). 79 Expect(ResourceSyncStatusWithNamespaceIs("Deployment", "guestbook-ui", selectedResourceNamespace, SyncStatusCodeSynced)). 80 Expect(ResourceSyncStatusWithNamespaceIs("Deployment", "guestbook-ui", fixture.DeploymentNamespace(), SyncStatusCodeSynced)) 81 } 82 83 // In selectedResource to sync, namespace is provided 84 func TestSelectiveSyncWithNamespace(t *testing.T) { 85 selectedResourceNamespace := getNewNamespace(t) 86 defer func() { 87 if !t.Skipped() { 88 FailOnErr(Run("", "kubectl", "delete", "namespace", selectedResourceNamespace)) 89 } 90 }() 91 Given(t). 92 Prune(true). 93 Path("guestbook-with-namespace"). 94 And(func() { 95 FailOnErr(Run("", "kubectl", "create", "namespace", selectedResourceNamespace)) 96 }). 97 SelectedResource(fmt.Sprintf("apps:Deployment:%s/guestbook-ui", selectedResourceNamespace)). 98 When(). 99 PatchFile("guestbook-ui-deployment-ns.yaml", fmt.Sprintf(`[{"op": "replace", "path": "/metadata/namespace", "value": "%s"}]`, selectedResourceNamespace)). 100 PatchFile("guestbook-ui-svc-ns.yaml", fmt.Sprintf(`[{"op": "replace", "path": "/metadata/namespace", "value": "%s"}]`, selectedResourceNamespace)). 101 CreateApp(). 102 Sync(). 103 Then(). 104 Expect(Success("")). 105 Expect(OperationPhaseIs(OperationSucceeded)). 106 Expect(SyncStatusIs(SyncStatusCodeOutOfSync)). 107 Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", selectedResourceNamespace, health.HealthStatusHealthy)). 108 Expect(ResourceHealthWithNamespaceIs("Deployment", "guestbook-ui", fixture.DeploymentNamespace(), health.HealthStatusMissing)). 109 Expect(ResourceSyncStatusWithNamespaceIs("Deployment", "guestbook-ui", selectedResourceNamespace, SyncStatusCodeSynced)). 110 Expect(ResourceSyncStatusWithNamespaceIs("Deployment", "guestbook-ui", fixture.DeploymentNamespace(), SyncStatusCodeOutOfSync)) 111 } 112 113 func getNewNamespace(t *testing.T) string { 114 randStr, err := rand.String(5) 115 require.NoError(t, err) 116 postFix := "-" + strings.ToLower(randStr) 117 name := fixture.DnsFriendly(t.Name(), "") 118 return fixture.DnsFriendly(fmt.Sprintf("argocd-e2e-%s", name), postFix) 119 }