From 0f987d1bc71fef29d47f7211ba687e8edf4e18f4 Mon Sep 17 00:00:00 2001 From: Bradley Jones Date: Tue, 15 Aug 2023 12:14:23 +0100 Subject: [PATCH] feat: switch to /version endpoint for validating enterprise version Signed-off-by: Bradley Jones --- pkg/reporter/reporter.go | 36 ++++++++++++++++++++++++++--------- pkg/reporter/reporter_test.go | 28 +++++++++++++++++++-------- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/pkg/reporter/reporter.go b/pkg/reporter/reporter.go index e868e59..ffb3270 100644 --- a/pkg/reporter/reporter.go +++ b/pkg/reporter/reporter.go @@ -30,7 +30,7 @@ var enterpriseEndpoint = reportAPIPathV2 //nolint:gosec func Post(report inventory.Report, anchoreDetails config.AnchoreInfo) error { defer tracker.TrackFunctionTime(time.Now(), "Reporting results to Anchore for cluster: "+report.ClusterName+"") - log.Debug("Reporting results to Anchore") + log.Debug("Reporting results to Anchore using endpoint: ", enterpriseEndpoint) tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: anchoreDetails.HTTP.Insecure}, } @@ -82,6 +82,18 @@ func Post(report inventory.Report, anchoreDetails config.AnchoreInfo) error { return nil } +type AnchoreVersion struct { + API struct { + Version string `json:"version"` + } `json:"api"` + DB struct { + SchemaVersion string `json:"schema_version"` + } `json:"db"` + Service struct { + Version string `json:"version"` + } `json:"service"` +} + // This method retrieves the API version from Anchore // and caches the response if parsed successfully // @@ -97,12 +109,13 @@ func checkVersion(anchoreDetails config.AnchoreInfo) error { } gock.InterceptClient(client) // Required to use gock for testing custom client - resp, err := client.Get(anchoreDetails.URL) + resp, err := client.Get(anchoreDetails.URL + "/version") if err != nil { return fmt.Errorf("failed to contact Anchore API: %w", err) } defer resp.Body.Close() if resp.StatusCode != 200 { + fmt.Println("fff") return fmt.Errorf("failed to retrieve Anchore API version: %+v", resp) } body, err := io.ReadAll(resp.Body) @@ -110,16 +123,21 @@ func checkVersion(anchoreDetails config.AnchoreInfo) error { return fmt.Errorf("failed to read Anchore API version: %w", err) } - switch version := string(body); version { - case "v1": - enterpriseEndpoint = reportAPIPathV1 - case "v2": + ver := AnchoreVersion{} + err = json.Unmarshal(body, &ver) + if err != nil { + return fmt.Errorf("failed to parse API version: %w", err) + } + + log.Debug("Anchore API version: ", ver) + if ver.API.Version == "2" { enterpriseEndpoint = reportAPIPathV2 - default: - return fmt.Errorf("unexpected Anchore API version: %s", version) + } else { + // If we can't parse the version, we'll assume it's v1 as 4.X does not include the version in the API version response + enterpriseEndpoint = reportAPIPathV1 } - log.Info("Using enterprise endpoint %s", enterpriseEndpoint) + log.Info("Using enterprise endpoint ", enterpriseEndpoint) return nil } diff --git a/pkg/reporter/reporter_test.go b/pkg/reporter/reporter_test.go index 4eb5dab..72d6a8d 100644 --- a/pkg/reporter/reporter_test.go +++ b/pkg/reporter/reporter_test.go @@ -111,15 +111,19 @@ func TestPost(t *testing.T) { Post(reportAPIPathV1). Reply(200) gock.New("https://ancho.re"). - Get("/"). + Get("/version"). Reply(200). - BodyString("v1") + JSON(map[string]interface{}{ + "api": map[string]interface{}{}, + "db": map[string]interface{}{"schema_version": "400"}, + "service": map[string]interface{}{"version": "4.8.0"}, + }) case "error when v1 and v2 are not found": gock.New("https://ancho.re"). - Post(enterpriseEndpoint). + Post(reportAPIPathV2). Reply(404) gock.New("https://ancho.re"). - Get("/"). + Get("/version"). Reply(404) } @@ -163,9 +167,13 @@ func TestPostSimulateV1ToV2HandoverFromEnterprise4Xto5X(t *testing.T) { Post(reportAPIPathV2). Reply(404) gock.New("https://ancho.re"). - Get("/"). + Get("/version"). Reply(200). - BodyString("v1") + JSON(map[string]interface{}{ + "api": map[string]interface{}{}, + "db": map[string]interface{}{"schema_version": "400"}, + "service": map[string]interface{}{"version": "4.8.0"}, + }) gock.New("https://ancho.re"). Post(reportAPIPathV1). Reply(200) @@ -178,9 +186,13 @@ func TestPostSimulateV1ToV2HandoverFromEnterprise4Xto5X(t *testing.T) { Post(reportAPIPathV1). Reply(404) gock.New("https://ancho.re"). - Get("/"). + Get("/version"). Reply(200). - BodyString("v2") + JSON(map[string]interface{}{ + "api": map[string]interface{}{"version": "2"}, + "db": map[string]interface{}{"schema_version": "400"}, + "service": map[string]interface{}{"version": "4.8.0"}, + }) gock.New("https://ancho.re"). Post(reportAPIPathV2). Reply(200)