diff --git a/apps/workspace-engine/pkg/jobagents/argo/argoapp_test.go b/apps/workspace-engine/pkg/jobagents/argo/argoapp_test.go index 18381c955..3d5133ca3 100644 --- a/apps/workspace-engine/pkg/jobagents/argo/argoapp_test.go +++ b/apps/workspace-engine/pkg/jobagents/argo/argoapp_test.go @@ -12,6 +12,8 @@ import ( "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "workspace-engine/pkg/oapi" ) @@ -435,6 +437,32 @@ func TestPlan_GetProposedManifestsFailure_ReturnsIncomplete(t *testing.T) { assert.NotNil(t, s.LastCheckedAt) } +func TestPlan_GetCurrentManifestsNotFound_FirstVersion(t *testing.T) { + proposed := []string{`{"kind":"Deployment","metadata":{"name":"app"},"spec":{"replicas":1}}`} + getter := &mockManifestGetter{ + fn: func(_ context.Context, _, _, appName string) ([]string, error) { + if strings.Contains(appName, "-plan-") { + return proposed, nil + } + return nil, status.Error(codes.NotFound, "application not found") + }, + } + deleter := &mockDeleter{} + p := NewArgoCDPlanner(&mockUpserter{}, deleter, getter) + + result, err := p.Plan(context.Background(), testDispatchCtx(), nil) + require.NoError(t, err) + require.NotNil(t, result.CompletedAt) + assert.True(t, result.HasChanges) + assert.Empty(t, result.Current) + assert.Contains(t, result.Proposed, "replicas: 1") + assert.NotEmpty(t, result.ContentHash) + + calls := deleter.getCalls() + require.Len(t, calls, 1) + assert.Contains(t, calls[0], "-plan-") +} + func TestPlan_GetCurrentManifestsFailure(t *testing.T) { calls := 0 getter := &mockManifestGetter{ diff --git a/apps/workspace-engine/pkg/jobagents/argo/argocd_plan.go b/apps/workspace-engine/pkg/jobagents/argo/argocd_plan.go index 6a7492142..a522d551d 100644 --- a/apps/workspace-engine/pkg/jobagents/argo/argocd_plan.go +++ b/apps/workspace-engine/pkg/jobagents/argo/argocd_plan.go @@ -12,6 +12,8 @@ import ( "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" "github.com/charmbracelet/log" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" sigsyaml "sigs.k8s.io/yaml" "workspace-engine/pkg/jobagents/types" "workspace-engine/pkg/oapi" @@ -185,7 +187,10 @@ func (p *ArgoCDPlanner) Plan( currentManifests, err := p.manifestGetter.GetManifests(ctx, serverAddr, apiKey, originalName) if err != nil { - return nil, fmt.Errorf("get current manifests: %w", err) + if status.Code(err) != codes.NotFound { + return nil, fmt.Errorf("get current manifests: %w", err) + } + currentManifests = nil } for i, m := range proposedManifests {