Skip to content

Commit bcf0295

Browse files
committed
feat: use workspace client
1 parent b20292c commit bcf0295

File tree

5 files changed

+102
-33
lines changed

5 files changed

+102
-33
lines changed

README.md

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -38,44 +38,31 @@ The HTTP client exposes a `DoCall` function.
3838

3939
Implement the `http.Config` interface to configure the Snyk Code API client from applications.
4040

41-
### Snyk Code Client
42-
43-
Use the Snyk Code Client to make calls to the DeepCode API using the `httpClient` HTTP client created above.
44-
45-
```go
46-
snykCode := deepcode.NewSnykCodeClient(logger, httpClient, testutil.NewTestInstrumentor())
47-
```
48-
49-
The Snyk Code Client exposes the following functions:
50-
- `GetFilters`
51-
- `CreateBundle`
52-
- `ExtendBundle`
53-
54-
### Bundle Manager
55-
56-
Use the Bundle Manager to create bundles using the `snykCode` Snyk Code Client created above and then to extend it by uploading more files to it.
57-
58-
```go
59-
bundleManager := bundle.NewBundleManager(logger, snykCode, testutil.NewTestInstrumentor(), testutil.NewTestCodeInstrumentor())
60-
```
61-
62-
The Bundle Manager exposes the following functions:
63-
- `Create`
64-
- `Upload`
65-
6641
### Code Scanner
6742

6843
Use the Code Scanner to trigger a scan for a Snyk Code workspace using the Bundle Manager created above.
6944
The Code Scanner exposes a `UploadAndAnalyze` function, which can be used like this:
7045

7146
```go
72-
codeScanner := codeclient.NewCodeScanner(
47+
import (
48+
"net/http"
49+
50+
"github.com/rs/zerolog"
51+
code "github.com/snyk/code-client-go"
52+
)
53+
54+
logger := zerlog.NewLogger(...)
55+
config := newConfigForMyApp()
56+
57+
codeScanner := code.NewCodeScanner(
58+
httpClient,
59+
config,
7360
bundleManager,
74-
testutil.NewTestInstrumentor(),
75-
testutil.NewTestErrorReporter(),
61+
codeInstrumentor,
62+
codeErrorReporter,
7663
logger,
7764
)
78-
codeScanner.UploadAndAnalyze(context.Background(), "path/to/workspace", channelForWalkingFiles, changedFiles)
65+
code.UploadAndAnalyze(context.Background(), "orgId", "requestId", "path/to/workspace", channelForWalkingFiles, changedFiles)
7966
```
8067

8168

config/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,7 @@ type Config interface {
1616
// SnykCodeApi returns the Snyk Code API URL configured to run against, which could be
1717
// the one used by the Local Code Engine.
1818
SnykCodeApi() string
19+
20+
// SnykApi returns the Snyk REST API URL configured to run against,
21+
SnykApi() string
1922
}

config/mocks/config.go

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scan.go

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ package codeclient
1919

2020
import (
2121
"context"
22+
"fmt"
2223

24+
"github.com/google/uuid"
2325
"github.com/pkg/errors"
2426
"github.com/rs/zerolog"
2527
"github.com/rs/zerolog/log"
@@ -29,19 +31,24 @@ import (
2931
"github.com/snyk/code-client-go/internal/analysis"
3032
"github.com/snyk/code-client-go/internal/bundle"
3133
"github.com/snyk/code-client-go/internal/deepcode"
34+
"github.com/snyk/code-client-go/internal/util"
35+
workspaceClient "github.com/snyk/code-client-go/internal/workspace/2024-03-12"
36+
externalRef3 "github.com/snyk/code-client-go/internal/workspace/2024-03-12/workspaces"
3237
"github.com/snyk/code-client-go/observability"
3338
"github.com/snyk/code-client-go/sarif"
3439
)
3540

3641
type codeScanner struct {
3742
bundleManager bundle.BundleManager
43+
workspace *workspaceClient.ClientWithResponses
3844
errorReporter observability.ErrorReporter
3945
logger *zerolog.Logger
4046
}
4147

4248
type CodeScanner interface {
4349
UploadAndAnalyze(
4450
ctx context.Context,
51+
orgId string,
4552
requestId string,
4653
path string,
4754
files <-chan string,
@@ -56,14 +63,19 @@ func NewCodeScanner(
5663
instrumentor observability.Instrumentor,
5764
errorReporter observability.ErrorReporter,
5865
logger *zerolog.Logger,
59-
) *codeScanner {
66+
) (*codeScanner, error) {
6067
snykCode := deepcode.NewSnykCodeClient(logger, httpClient, instrumentor, errorReporter, config)
6168
bundleManager := bundle.NewBundleManager(logger, snykCode, instrumentor, errorReporter)
69+
workspace, err := workspaceClient.NewClientWithResponses(config.SnykApi(), workspaceClient.WithHTTPClient(httpClient))
70+
if err != nil {
71+
return nil, err
72+
}
6273
return &codeScanner{
6374
bundleManager: bundleManager,
75+
workspace: workspace,
6476
errorReporter: errorReporter,
6577
logger: logger,
66-
}
78+
}, nil
6779
}
6880

6981
// WithBundleManager creates a new Code Scanner from the current one and replaces the bundle manager.
@@ -79,6 +91,7 @@ func (c *codeScanner) WithBundleManager(bundleManager bundle.BundleManager) *cod
7991
// UploadAndAnalyze returns a fake SARIF response for testing. Use target-service to run analysis on.
8092
func (c *codeScanner) UploadAndAnalyze(
8193
ctx context.Context,
94+
orgId string,
8295
requestId string,
8396
path string,
8497
files <-chan string,
@@ -128,6 +141,56 @@ func (c *codeScanner) UploadAndAnalyze(
128141
return nil, bundleHash, nil
129142
}
130143

144+
orgUUID := uuid.MustParse(orgId)
145+
repositoryUri, err := util.GetRepositoryUrl(path)
146+
if err != nil {
147+
if ctx.Err() != nil { // Only handle errors that are not intentional cancellations
148+
msg := "error retrieving Git info..."
149+
c.errorReporter.CaptureError(errors.Wrap(err, msg), observability.ErrorReporterOptions{ErrorDiagnosticPath: path})
150+
return nil, bundleHash, err
151+
} else {
152+
log.Info().Msg("Canceling Code scan - Code scanner received cancellation signal")
153+
return nil, bundleHash, nil
154+
}
155+
}
156+
157+
workspaceResponse, err := c.workspace.CreateWorkspaceWithApplicationVndAPIPlusJSONBodyWithResponse(ctx, orgUUID, &workspaceClient.CreateWorkspaceParams{
158+
Version: "2024-03-12~experimental",
159+
SnykRequestId: uuid.MustParse(requestId),
160+
}, workspaceClient.CreateWorkspaceApplicationVndAPIPlusJSONRequestBody{
161+
Data: struct {
162+
Attributes struct {
163+
BundleId string `json:"bundle_id"`
164+
RepositoryUri string `json:"repository_uri"`
165+
WorkspaceType externalRef3.WorkspacePostRequestDataAttributesWorkspaceType `json:"workspace_type"`
166+
} `json:"attributes"`
167+
Type externalRef3.WorkspacePostRequestDataType `json:"type"`
168+
}(struct {
169+
Attributes struct {
170+
BundleId string `json:"bundle_id"`
171+
RepositoryUri string `json:"repository_uri"`
172+
WorkspaceType externalRef3.WorkspacePostRequestDataAttributesWorkspaceType `json:"workspace_type"`
173+
}
174+
Type externalRef3.WorkspacePostRequestDataType
175+
}{Attributes: struct {
176+
BundleId string `json:"bundle_id"`
177+
RepositoryUri string `json:"repository_uri"`
178+
WorkspaceType externalRef3.WorkspacePostRequestDataAttributesWorkspaceType `json:"workspace_type"`
179+
}(struct {
180+
BundleId string
181+
RepositoryUri string
182+
WorkspaceType externalRef3.WorkspacePostRequestDataAttributesWorkspaceType
183+
}{
184+
BundleId: b.GetBundleHash(),
185+
RepositoryUri: repositoryUri,
186+
WorkspaceType: "workspaceUri",
187+
}),
188+
Type: "workspace",
189+
}),
190+
})
191+
192+
fmt.Println(workspaceResponse.ApplicationvndApiJSON201.Data.Id)
193+
131194
response, err := analysis.RunAnalysis()
132195
if ctx.Err() != nil {
133196
c.logger.Info().Msg("Canceling Code scan - Code scanner received cancellation signal")

scan_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ func Test_UploadAndAnalyze(t *testing.T) {
6767
mockBundleManager.EXPECT().Create(gomock.Any(), "testRequestId", baseDir, gomock.Any(), map[string]bool{}).Return(mockBundle, nil)
6868
mockBundleManager.EXPECT().Upload(gomock.Any(), "testRequestId", mockBundle, files).Return(mockBundle, nil)
6969

70-
codeScanner := codeclient.NewCodeScanner(mockHTTPClient, mockConfig, mockInstrumentor, mockErrorReporter, &logger)
70+
codeScanner, err := codeclient.NewCodeScanner(mockHTTPClient, mockConfig, mockInstrumentor, mockErrorReporter, &logger)
71+
require.NoError(t, err)
7172

7273
response, bundleHash, err := codeScanner.WithBundleManager(mockBundleManager).UploadAndAnalyze(context.Background(), "testRequestId", baseDir, docs, map[string]bool{})
7374
require.NoError(t, err)
@@ -83,7 +84,8 @@ func Test_UploadAndAnalyze(t *testing.T) {
8384
mockBundleManager.EXPECT().Create(gomock.Any(), "testRequestId", baseDir, gomock.Any(), map[string]bool{}).Return(mockBundle, nil)
8485
mockBundleManager.EXPECT().Upload(gomock.Any(), "testRequestId", mockBundle, files).Return(mockBundle, nil)
8586

86-
codeScanner := codeclient.NewCodeScanner(mockHTTPClient, mockConfig, mockInstrumentor, mockErrorReporter, &logger)
87+
codeScanner, err := codeclient.NewCodeScanner(mockHTTPClient, mockConfig, mockInstrumentor, mockErrorReporter, &logger)
88+
require.NoError(t, err)
8789

8890
response, bundleHash, err := codeScanner.WithBundleManager(mockBundleManager).UploadAndAnalyze(context.Background(), "testRequestId", baseDir, docs, map[string]bool{})
8991
require.NoError(t, err)

0 commit comments

Comments
 (0)