diff --git a/jfrog/client.go b/jfrog/client.go index 8819c25..5ccb267 100644 --- a/jfrog/client.go +++ b/jfrog/client.go @@ -17,6 +17,7 @@ import ( type Client interface { ScanResults(img Image) (ScanResult, error) + ResultsURL(img Image, packageID string) string } type client struct { @@ -55,6 +56,7 @@ type securityResultsPayload struct { type ScanResult struct { Version string `json:"version"` SecurityIssues SecurityIssues `json:"sec_issues"` + PackageID string `json:"package_id"` } type SecurityIssues struct { @@ -98,6 +100,10 @@ type Image struct { Version string } +func (c *client) ResultsURL(img Image, packageID string) string { + return fmt.Sprintf("%s/ui/scans-list/packages-scans/%s/%s/scan-descendants/%s?package_id=%s&version=%s", c.baseURL, img.Repo, img.Package, img.Version, packageID, img.Version) +} + func ParseImage(image string) (Image, error) { tag, err := name.NewTag(image) if err != nil { diff --git a/jfrog/doc.go b/jfrog/doc.go index e5c802a..d4099a0 100644 --- a/jfrog/doc.go +++ b/jfrog/doc.go @@ -2,4 +2,4 @@ // artifactory instance. package jfrog -//go:generate mockgen -destination ./mock.go -package jfrog github.com/coder/xray/jfrog Client +//go:generate mockgen -destination ./mock.go -package jfrog github.com/coder/coder-xray/jfrog Client diff --git a/jfrog/mock.go b/jfrog/mock.go index c6bf6cd..5800028 100644 --- a/jfrog/mock.go +++ b/jfrog/mock.go @@ -1,9 +1,9 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/coder/xray/jfrog (interfaces: Client) +// Source: github.com/coder/coder-xray/jfrog (interfaces: Client) // // Generated by this command: // -// mockgen -destination ./mock.go -package jfrog github.com/coder/xray/jfrog Client +// mockgen -destination ./mock.go -package jfrog github.com/coder/coder-xray/jfrog Client // // Package jfrog is a generated GoMock package. @@ -38,6 +38,20 @@ func (m *MockClient) EXPECT() *MockClientMockRecorder { return m.recorder } +// ResultsURL mocks base method. +func (m *MockClient) ResultsURL(arg0 Image, arg1 string) string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ResultsURL", arg0, arg1) + ret0, _ := ret[0].(string) + return ret0 +} + +// ResultsURL indicates an expected call of ResultsURL. +func (mr *MockClientMockRecorder) ResultsURL(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResultsURL", reflect.TypeOf((*MockClient)(nil).ResultsURL), arg0, arg1) +} + // ScanResults mocks base method. func (m *MockClient) ScanResults(arg0 Image) (ScanResult, error) { m.ctrl.T.Helper() diff --git a/reporter/codermock.go b/reporter/codermock.go index c3fb3dc..8819d53 100644 --- a/reporter/codermock.go +++ b/reporter/codermock.go @@ -1,9 +1,9 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/coder/xray/reporter (interfaces: CoderClient) +// Source: github.com/coder/coder-xray/reporter (interfaces: CoderClient) // // Generated by this command: // -// mockgen -destination ./codermock.go -package reporter github.com/coder/xray/reporter CoderClient +// mockgen -destination ./codermock.go -package reporter github.com/coder/coder-xray/reporter CoderClient // // Package reporter is a generated GoMock package. diff --git a/reporter/doc.go b/reporter/doc.go index 22aa083..09cd1ee 100644 --- a/reporter/doc.go +++ b/reporter/doc.go @@ -2,4 +2,4 @@ // and uploading results to a Coder deployment. package reporter -//go:generate mockgen -destination ./codermock.go -package reporter github.com/coder/xray/reporter CoderClient +//go:generate mockgen -destination ./codermock.go -package reporter github.com/coder/coder-xray/reporter CoderClient diff --git a/reporter/reporter.go b/reporter/reporter.go index 0451a43..ece0d92 100644 --- a/reporter/reporter.go +++ b/reporter/reporter.go @@ -99,6 +99,7 @@ func (k *K8sReporter) Init(ctx context.Context) error { Critical: scan.SecurityIssues.Critical, High: scan.SecurityIssues.High, Medium: scan.SecurityIssues.Medium, + ResultsURL: k.JFrogClient.ResultsURL(image, scan.PackageID), } err = k.CoderClient.PostJFrogXrayScan(ctx, req) if err != nil { diff --git a/reporter/reporter_test.go b/reporter/reporter_test.go index cb896c9..9f707e1 100644 --- a/reporter/reporter_test.go +++ b/reporter/reporter_test.go @@ -45,11 +45,13 @@ func TestK8SReporter(t *testing.T) { resultsCh = make(chan codersdk.JFrogXrayScan) ) - jfrogClient.EXPECT().ScanResults(jfrog.Image{ + img := jfrog.Image{ Repo: "my-repo", Package: "ubuntu", Version: "22.04", - }).Return(jfrog.ScanResult{ + } + + xrayResult := jfrog.ScanResult{ Version: "22.04", SecurityIssues: jfrog.SecurityIssues{ Critical: expectedCrit, @@ -57,7 +59,12 @@ func TestK8SReporter(t *testing.T) { Medium: expectedMedium, Total: expectedCrit + expectedHigh + expectedMedium, }, - }, nil) + PackageID: "docker://my-repo/ubuntu", + } + + jfrogClient.EXPECT().ScanResults(img).Return(xrayResult, nil) + + jfrogClient.EXPECT().ResultsURL(img, xrayResult.PackageID) coderClient.EXPECT().AgentManifest(ctx, expectedAgentToken).Return(agentsdk.Manifest{ WorkspaceID: expectedWorkspaceID,