From 3e008bb43fa49084ee77d8fe02e744fb39004c35 Mon Sep 17 00:00:00 2001 From: Casey Marshall Date: Tue, 4 Jun 2024 10:15:45 -0500 Subject: [PATCH] fix: workspace creation should tolerate missing repo url Workspace API is responsible for graceful degradation when a repo URL is not available. This should not be blocked in the client. --- internal/analysis/analysis.go | 14 ++++++-------- internal/analysis/analysis_test.go | 20 ++++++++++++++++++-- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/internal/analysis/analysis.go b/internal/analysis/analysis.go index 30da1cb..3e4fcb9 100644 --- a/internal/analysis/analysis.go +++ b/internal/analysis/analysis.go @@ -111,19 +111,17 @@ func (a *analysisOrchestrator) CreateWorkspace(ctx context.Context, orgId string return "", fmt.Errorf("target is nil") } - repositoryTarget, ok := target.(*scan.RepositoryTarget) - if !ok || repositoryTarget.GetRepositoryUrl() == "" { - err := fmt.Errorf("workspace is not a repository, cannot scan") - a.errorReporter.CaptureError(err, observability.ErrorReporterOptions{ErrorDiagnosticPath: target.GetPath()}) - return "", err + var repositoryTargetPath, repositoryTargetURL string + if repositoryTarget, ok := target.(*scan.RepositoryTarget); ok { + repositoryTargetPath, repositoryTargetURL = repositoryTarget.GetPath(), repositoryTarget.GetRepositoryUrl() } host := a.host(true) - a.logger.Info().Str("host", host).Str("path", repositoryTarget.GetPath()).Str("repositoryUri", repositoryTarget.GetRepositoryUrl()).Msg("creating workspace") + a.logger.Info().Str("host", host).Str("path", repositoryTargetPath).Str("repositoryUri", repositoryTargetURL).Msg("creating workspace") workspace, err := workspaceClient.NewClientWithResponses(host, workspaceClient.WithHTTPClient(a.httpClient)) if err != nil { - a.errorReporter.CaptureError(err, observability.ErrorReporterOptions{ErrorDiagnosticPath: repositoryTarget.GetPath()}) + a.errorReporter.CaptureError(err, observability.ErrorReporterOptions{ErrorDiagnosticPath: repositoryTargetPath}) return "", fmt.Errorf("failed to connect to the workspace API %w", err) } @@ -157,7 +155,7 @@ func (a *analysisOrchestrator) CreateWorkspace(ctx context.Context, orgId string WorkspaceType workspaces.WorkspacePostRequestDataAttributesWorkspaceType }{ BundleId: bundleHash, - RepositoryUri: repositoryTarget.GetRepositoryUrl(), + RepositoryUri: repositoryTargetURL, WorkspaceType: "file_bundle_workspace", }), Type: "workspace", diff --git a/internal/analysis/analysis_test.go b/internal/analysis/analysis_test.go index 803be7e..e29ee74 100644 --- a/internal/analysis/analysis_test.go +++ b/internal/analysis/analysis_test.go @@ -104,10 +104,26 @@ func TestAnalysis_CreateWorkspace(t *testing.T) { func TestAnalysis_CreateWorkspace_NotARepository(t *testing.T) { mockConfig, mockHTTPClient, mockInstrumentor, mockErrorReporter, mockTracker, mockTrackerFactory, logger := setup(t) - mockErrorReporter.EXPECT().CaptureError(gomock.Any(), gomock.Any()) mockTracker.EXPECT().Begin(gomock.Eq("Creating file bundle workspace"), gomock.Eq("")).Return() mockTracker.EXPECT().End(gomock.Eq("")).Return() + mockHTTPClient.EXPECT().Do( + mock.MatchedBy(func(i interface{}) bool { + req := i.(*http.Request) + return req.URL.String() == "http://localhost/hidden/orgs/4a72d1db-b465-4764-99e1-ecedad03b06a/workspaces?version=2024-03-12~experimental" && + req.Method == "POST" && + req.Header.Get("Content-Type") == "application/vnd.api+json" && + req.Header.Get("Snyk-Request-Id") == "b372d1db-b465-4764-99e1-ecedad03b06a" && + req.Header.Get("User-Agent") == "cli" + }), + ).Return(&http.Response{ + StatusCode: http.StatusCreated, + Header: http.Header{ + "Content-Type": []string{"application/vnd.api+json"}, + }, + Body: io.NopCloser(bytes.NewReader([]byte(`{"data":{"id": "c172d1db-b465-4764-99e1-ecedad03b06a"}}`))), + }, nil).Times(1) + repoDir := t.TempDir() target, err := scan.NewRepositoryTarget(repoDir) assert.ErrorContains(t, err, "open local repository") @@ -120,7 +136,7 @@ func TestAnalysis_CreateWorkspace_NotARepository(t *testing.T) { target, "testBundleHash", ) - assert.ErrorContains(t, err, "workspace is not a repository") + assert.NoError(t, err) } func TestAnalysis_CreateWorkspace_Failure(t *testing.T) {