Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 24 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,51 +15,55 @@ $ go get github.com/snyk/code-client-go

Use the HTTP client to make HTTP requests with configured retriable codes and authorisation headers for Snyk Rest APIs.

Implement the `github.com/snyk/code-client-go/http.Config` interface to configure the Snyk Code API client from applications.
You can either configure the client using the functional options pattern provided or by implementing the interfaces.

Provide a net/http.Client factory to customize the underlying HTTP protocol behavior (timeouts, etc).
Provide a `net/http.Client` factory to customize the underlying HTTP protocol behavior (timeouts, etc).

```go
import (
"net/http"

"github.com/rs/zerolog"
codehttp "github.com/snyk/code-client-go/http"
codeClientHTTP "github.com/snyk/code-client-go/http"
codeClientObservability "github.com/snyk/code-client-go/observability"
)

logger := zerlog.NewLogger(...)
config := newConfigForMyApp()
httpClient := codehttp.NewHTTPClient(logger, config, func() *http.Client { return http.DefaultClient }, codeInstrumentor, codeErrorReporter)
instrumentor := codeClientObservability.NewInstrumentor()
errorReporter := codeClientObservability.NewErrorReporter()
httpClient := codeClientHTTP.NewHTTPClient(
func() *http.Client {
return &http.Client{
Timeout: time.Duration(1) * time.Second,
}
},
codeClientHTTP.WithRetryCount(1),
codeClientHTTP.WithLogger(logger),
codeClientHTTP.WithInstrumentor(instrumentor),
codeClientHTTP.WithErrorReporter(errorReporter),
)
```

The HTTP client exposes a `DoCall` function.
The HTTP client exposes a `Do` function.

### Configuration

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

### Code Scanner

Use the Code Scanner to trigger a scan for a Snyk Code workspace using the Bundle Manager created above.

The Code Scanner exposes a `UploadAndAnalyze` function, which can be used like this:

```go
import (
"net/http"

"github.com/rs/zerolog"
code "github.com/snyk/code-client-go"
)

logger := zerlog.NewLogger(...)
config := newConfigForMyApp()

codeScanner := code.NewCodeScanner(
httpClient,
config,
codeInstrumentor,
codeErrorReporter,
logger,
config,
codeClientHTTP.WithLogger(logger),
codeClientHTTP.WithInstrumentor(instrumentor),
codeClientHTTP.WithErrorReporter(errorReporter),
)
code.UploadAndAnalyze(context.Background(), requestId, "path/to/workspace", channelForWalkingFiles, changedFiles)
```
Expand Down
26 changes: 14 additions & 12 deletions http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,14 @@ type HTTPClient interface {
Do(req *http.Request) (*http.Response, error)
}

type HTTPClientFactory func() *http.Client

type httpClient struct {
retryCount int
clientFactory func() *http.Client
instrumentor observability.Instrumentor
errorReporter observability.ErrorReporter
logger *zerolog.Logger
retryCount int
httpClientFactory HTTPClientFactory
instrumentor observability.Instrumentor
errorReporter observability.ErrorReporter
logger *zerolog.Logger
}

type OptionFunc func(*httpClient)
Expand Down Expand Up @@ -68,18 +70,18 @@ func WithLogger(logger *zerolog.Logger) OptionFunc {
}

func NewHTTPClient(
clientFactory func() *http.Client,
httpClientFactory HTTPClientFactory,
options ...OptionFunc,
) HTTPClient {
nopLogger := zerolog.Nop()
instrumentor := observability.NewInstrumentor()
errorReporter := observability.NewErrorReporter(&nopLogger)
client := &httpClient{
retryCount: 3,
clientFactory: clientFactory,
instrumentor: instrumentor,
errorReporter: errorReporter,
logger: &nopLogger,
retryCount: 3,
httpClientFactory: httpClientFactory,
instrumentor: instrumentor,
errorReporter: errorReporter,
logger: &nopLogger,
}

for _, option := range options {
Expand Down Expand Up @@ -143,7 +145,7 @@ func (s *httpClient) httpCall(req *http.Request) (*http.Response, error) {
copyReqBody = io.NopCloser(bytes.NewBuffer(buf))
req.Body = reqBody
}
response, err := s.clientFactory().Do(req)
response, err := s.httpClientFactory().Do(req)
req.Body = copyReqBody

if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion internal/analysis/analysis.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ type AnalysisOrchestrator interface {
}

func NewAnalysisOrchestrator(
config config.Config,
logger *zerolog.Logger,
httpClient codeClientHTTP.HTTPClient,
instrumentor observability.Instrumentor,
errorReporter observability.ErrorReporter,
config config.Config,
) *analysisOrchestrator {
return &analysisOrchestrator{
httpClient,
Expand Down
8 changes: 4 additions & 4 deletions internal/analysis/analysis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func TestAnalysis_CreateWorkspace(t *testing.T) {

logger := zerolog.Nop()

analysisOrchestrator := analysis.NewAnalysisOrchestrator(&logger, mockHTTPClient, mockInstrumentor, mockErrorReporter, mockConfig)
analysisOrchestrator := analysis.NewAnalysisOrchestrator(mockConfig, &logger, mockHTTPClient, mockInstrumentor, mockErrorReporter)
_, err := analysisOrchestrator.CreateWorkspace(
context.Background(),
"4a72d1db-b465-4764-99e1-ecedad03b06a",
Expand Down Expand Up @@ -98,7 +98,7 @@ func TestAnalysis_CreateWorkspace_NotARepository(t *testing.T) {
logger := zerolog.Nop()

repoDir := t.TempDir()
analysisOrchestrator := analysis.NewAnalysisOrchestrator(&logger, mockHTTPClient, mockInstrumentor, mockErrorReporter, mockConfig)
analysisOrchestrator := analysis.NewAnalysisOrchestrator(mockConfig, &logger, mockHTTPClient, mockInstrumentor, mockErrorReporter)
_, err := analysisOrchestrator.CreateWorkspace(
context.Background(),
"4a72d1db-b465-4764-99e1-ecedad03b06a",
Expand Down Expand Up @@ -141,7 +141,7 @@ func TestAnalysis_CreateWorkspace_Failure(t *testing.T) {

logger := zerolog.Nop()

analysisOrchestrator := analysis.NewAnalysisOrchestrator(&logger, mockHTTPClient, mockInstrumentor, mockErrorReporter, mockConfig)
analysisOrchestrator := analysis.NewAnalysisOrchestrator(mockConfig, &logger, mockHTTPClient, mockInstrumentor, mockErrorReporter)
_, err := analysisOrchestrator.CreateWorkspace(
context.Background(),
"4a72d1db-b465-4764-99e1-ecedad03b06a",
Expand Down Expand Up @@ -169,7 +169,7 @@ func TestAnalysis_RunAnalysis(t *testing.T) {

logger := zerolog.Nop()

analysisOrchestrator := analysis.NewAnalysisOrchestrator(&logger, mockHTTPClient, mockInstrumentor, mockErrorReporter, mockConfig)
analysisOrchestrator := analysis.NewAnalysisOrchestrator(mockConfig, &logger, mockHTTPClient, mockInstrumentor, mockErrorReporter)
actual, err := analysisOrchestrator.RunAnalysis()
require.NoError(t, err)
assert.Equal(t, "COMPLETE", actual.Status)
Expand Down
4 changes: 2 additions & 2 deletions internal/bundle/bundle.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ type Bundle interface {
}

type deepCodeBundle struct {
SnykCode deepcode.SnykCodeClient
SnykCode deepcode.DeepcodeClient
instrumentor observability.Instrumentor
errorReporter observability.ErrorReporter
logger *zerolog.Logger
Expand All @@ -46,7 +46,7 @@ type deepCodeBundle struct {
}

func NewBundle(
snykCode deepcode.SnykCodeClient,
snykCode deepcode.DeepcodeClient,
instrumentor observability.Instrumentor,
errorReporter observability.ErrorReporter,
logger *zerolog.Logger,
Expand Down
12 changes: 6 additions & 6 deletions internal/bundle/bundle_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import (

// TODO: add progress tracker for percentage progress
type bundleManager struct {
SnykCode deepcode.SnykCodeClient
deepcodeClient deepcode.DeepcodeClient
instrumentor observability.Instrumentor
errorReporter observability.ErrorReporter
logger *zerolog.Logger
Expand All @@ -57,13 +57,13 @@ type BundleManager interface {
}

func NewBundleManager(
deepcodeClient deepcode.DeepcodeClient,
logger *zerolog.Logger,
SnykCode deepcode.SnykCodeClient,
instrumentor observability.Instrumentor,
errorReporter observability.ErrorReporter,
) *bundleManager {
return &bundleManager{
SnykCode: SnykCode,
deepcodeClient: deepcodeClient,
instrumentor: instrumentor,
errorReporter: errorReporter,
logger: logger,
Expand Down Expand Up @@ -133,10 +133,10 @@ func (b *bundleManager) Create(ctx context.Context,
var bundleHash string
var missingFiles []string
if len(fileHashes) > 0 {
bundleHash, missingFiles, err = b.SnykCode.CreateBundle(span.Context(), fileHashes)
bundleHash, missingFiles, err = b.deepcodeClient.CreateBundle(span.Context(), fileHashes)
}
bundle = NewBundle(
b.SnykCode,
b.deepcodeClient,
b.instrumentor,
b.errorReporter,
b.logger,
Expand Down Expand Up @@ -213,7 +213,7 @@ func (b *bundleManager) groupInBatches(

func (b *bundleManager) IsSupported(ctx context.Context, file string) (bool, error) {
if b.supportedExtensions.Size() == 0 && b.supportedConfigFiles.Size() == 0 {
filters, err := b.SnykCode.GetFilters(ctx)
filters, err := b.deepcodeClient.GetFilters(ctx)
if err != nil {
b.logger.Error().Err(err).Msg("could not get filters")
return false, err
Expand Down
Loading