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  }