From 6c013a58340310d8b8d63e7467ded2ef40ffd042 Mon Sep 17 00:00:00 2001
From: Bob Callaway <bobcallaway@users.noreply.github.com>
Date: Thu, 1 Jul 2021 13:04:43 -0400
Subject: [PATCH] Move GetRekorClient into util directory (#349)

* Move GetRekorClient into util directory

Since other sigstore projects are using GetRekorClient, this moves it
into the pkg/util directory so that the number of dependencies this
brings with it can be minimized.

Signed-off-by: Bob Callaway <bob.callaway@gmail.com>

* move to pkg/client

Signed-off-by: Bob Callaway <bob.callaway@gmail.com>
---
 cmd/rekor-cli/app/get.go                      |  3 +-
 cmd/rekor-cli/app/log_info.go                 |  3 +-
 cmd/rekor-cli/app/log_proof.go                |  3 +-
 cmd/rekor-cli/app/root.go                     | 29 -----------
 cmd/rekor-cli/app/search.go                   |  3 +-
 cmd/rekor-cli/app/timestamp.go                |  3 +-
 cmd/rekor-cli/app/upload.go                   |  7 +--
 cmd/rekor-cli/app/verify.go                   |  3 +-
 cmd/rekor-server/app/watch.go                 |  8 +--
 pkg/client/rekor_client.go                    | 49 +++++++++++++++++++
 .../client/rekor_client_test.go               |  2 +-
 pkg/{util => client}/yaml.go                  |  2 +-
 .../restapi/configure_rekor_server.go         |  5 +-
 tests/e2e_test.go                             | 10 ++--
 14 files changed, 79 insertions(+), 51 deletions(-)
 create mode 100644 pkg/client/rekor_client.go
 rename cmd/rekor-cli/app/root_test.go => pkg/client/rekor_client_test.go (99%)
 rename pkg/{util => client}/yaml.go (98%)

diff --git a/cmd/rekor-cli/app/get.go b/cmd/rekor-cli/app/get.go
index 6a20d4c..eaeee99 100644
--- a/cmd/rekor-cli/app/get.go
+++ b/cmd/rekor-cli/app/get.go
@@ -30,6 +30,7 @@ import (
 	"github.com/spf13/viper"
 
 	"github.com/sigstore/rekor/cmd/rekor-cli/app/format"
+	"github.com/sigstore/rekor/pkg/client"
 	"github.com/sigstore/rekor/pkg/generated/client/entries"
 	"github.com/sigstore/rekor/pkg/generated/models"
 	"github.com/sigstore/rekor/pkg/log"
@@ -70,7 +71,7 @@ var getCmd = &cobra.Command{
 		}
 	},
 	Run: format.WrapCmd(func(args []string) (interface{}, error) {
-		rekorClient, err := GetRekorClient(viper.GetString("rekor_server"))
+		rekorClient, err := client.GetRekorClient(viper.GetString("rekor_server"))
 		if err != nil {
 			return nil, err
 		}
diff --git a/cmd/rekor-cli/app/log_info.go b/cmd/rekor-cli/app/log_info.go
index e52f509..3f57b3b 100644
--- a/cmd/rekor-cli/app/log_info.go
+++ b/cmd/rekor-cli/app/log_info.go
@@ -31,6 +31,7 @@ import (
 
 	"github.com/sigstore/rekor/cmd/rekor-cli/app/format"
 	"github.com/sigstore/rekor/cmd/rekor-cli/app/state"
+	"github.com/sigstore/rekor/pkg/client"
 	"github.com/sigstore/rekor/pkg/generated/client/tlog"
 	"github.com/sigstore/rekor/pkg/log"
 	"github.com/sigstore/rekor/pkg/util"
@@ -59,7 +60,7 @@ var logInfoCmd = &cobra.Command{
 	Long:  `Prints info about the transparency log`,
 	Run: format.WrapCmd(func(args []string) (interface{}, error) {
 		serverURL := viper.GetString("rekor_server")
-		rekorClient, err := GetRekorClient(serverURL)
+		rekorClient, err := client.GetRekorClient(serverURL)
 		if err != nil {
 			return nil, err
 		}
diff --git a/cmd/rekor-cli/app/log_proof.go b/cmd/rekor-cli/app/log_proof.go
index 55813cc..70b753b 100644
--- a/cmd/rekor-cli/app/log_proof.go
+++ b/cmd/rekor-cli/app/log_proof.go
@@ -24,6 +24,7 @@ import (
 	"github.com/spf13/viper"
 
 	"github.com/sigstore/rekor/cmd/rekor-cli/app/format"
+	"github.com/sigstore/rekor/pkg/client"
 	"github.com/sigstore/rekor/pkg/generated/client/tlog"
 )
 
@@ -71,7 +72,7 @@ var logProofCmd = &cobra.Command{
 		return nil
 	},
 	Run: format.WrapCmd(func(args []string) (interface{}, error) {
-		rekorClient, err := GetRekorClient(viper.GetString("rekor_server"))
+		rekorClient, err := client.GetRekorClient(viper.GetString("rekor_server"))
 		if err != nil {
 			return nil, err
 		}
diff --git a/cmd/rekor-cli/app/root.go b/cmd/rekor-cli/app/root.go
index 16b349b..4466edf 100644
--- a/cmd/rekor-cli/app/root.go
+++ b/cmd/rekor-cli/app/root.go
@@ -22,16 +22,10 @@ import (
 	"os"
 	"strings"
 
-	"github.com/go-openapi/runtime"
-	httptransport "github.com/go-openapi/runtime/client"
-	"github.com/go-openapi/strfmt"
 	homedir "github.com/mitchellh/go-homedir"
 	"github.com/spf13/cobra"
 	"github.com/spf13/pflag"
 	"github.com/spf13/viper"
-
-	"github.com/sigstore/rekor/pkg/generated/client"
-	"github.com/sigstore/rekor/pkg/util"
 )
 
 var rootCmd = &cobra.Command{
@@ -114,29 +108,6 @@ func initConfig(cmd *cobra.Command) error {
 	return nil
 }
 
-func GetRekorClient(rekorServerURL string) (*client.Rekor, error) {
-	url, err := url.Parse(rekorServerURL)
-	if err != nil {
-		return nil, err
-	}
-
-	rt := httptransport.New(url.Host, client.DefaultBasePath, []string{url.Scheme})
-	rt.Consumers["application/yaml"] = util.YamlConsumer()
-	rt.Consumers["application/x-pem-file"] = runtime.TextConsumer()
-	rt.Consumers["application/pem-certificate-chain"] = runtime.TextConsumer()
-	rt.Producers["application/yaml"] = util.YamlProducer()
-	rt.Producers["application/timestamp-query"] = runtime.ByteStreamProducer()
-	rt.Consumers["application/timestamp-reply"] = runtime.ByteStreamConsumer()
-
-	if viper.GetString("api-key") != "" {
-		rt.DefaultAuthentication = httptransport.APIKeyAuth("apiKey", "query", viper.GetString("api-key"))
-	}
-
-	registry := strfmt.Default
-	registry.Add("signedCheckpoint", &util.SignedCheckpoint{}, util.SignedCheckpointValidator)
-	return client.New(rt, registry), nil
-}
-
 type urlFlag struct {
 	url string
 }
diff --git a/cmd/rekor-cli/app/search.go b/cmd/rekor-cli/app/search.go
index d96d454..d39792b 100644
--- a/cmd/rekor-cli/app/search.go
+++ b/cmd/rekor-cli/app/search.go
@@ -32,6 +32,7 @@ import (
 	"github.com/spf13/viper"
 
 	"github.com/sigstore/rekor/cmd/rekor-cli/app/format"
+	"github.com/sigstore/rekor/pkg/client"
 	"github.com/sigstore/rekor/pkg/generated/client/index"
 	"github.com/sigstore/rekor/pkg/generated/models"
 	"github.com/sigstore/rekor/pkg/log"
@@ -70,7 +71,7 @@ var searchCmd = &cobra.Command{
 	},
 	Run: format.WrapCmd(func(args []string) (interface{}, error) {
 		log := log.Logger
-		rekorClient, err := GetRekorClient(viper.GetString("rekor_server"))
+		rekorClient, err := client.GetRekorClient(viper.GetString("rekor_server"))
 		if err != nil {
 			return nil, err
 		}
diff --git a/cmd/rekor-cli/app/timestamp.go b/cmd/rekor-cli/app/timestamp.go
index d6fda08..c3a3f53 100644
--- a/cmd/rekor-cli/app/timestamp.go
+++ b/cmd/rekor-cli/app/timestamp.go
@@ -32,6 +32,7 @@ import (
 	"github.com/sassoftware/relic/lib/pkcs9"
 	"github.com/sassoftware/relic/lib/x509tools"
 	"github.com/sigstore/rekor/cmd/rekor-cli/app/format"
+	"github.com/sigstore/rekor/pkg/client"
 	"github.com/sigstore/rekor/pkg/generated/client/timestamp"
 	"github.com/sigstore/rekor/pkg/log"
 	"github.com/sigstore/rekor/pkg/util"
@@ -202,7 +203,7 @@ var timestampCmd = &cobra.Command{
 		return nil
 	},
 	Run: format.WrapCmd(func(args []string) (interface{}, error) {
-		rekorClient, err := GetRekorClient(viper.GetString("rekor_server"))
+		rekorClient, err := client.GetRekorClient(viper.GetString("rekor_server"))
 		if err != nil {
 			return nil, err
 		}
diff --git a/cmd/rekor-cli/app/upload.go b/cmd/rekor-cli/app/upload.go
index 4a1bc94..682fd04 100644
--- a/cmd/rekor-cli/app/upload.go
+++ b/cmd/rekor-cli/app/upload.go
@@ -29,7 +29,8 @@ import (
 
 	"github.com/pkg/errors"
 	"github.com/sigstore/rekor/cmd/rekor-cli/app/format"
-	"github.com/sigstore/rekor/pkg/generated/client"
+	"github.com/sigstore/rekor/pkg/client"
+	genclient "github.com/sigstore/rekor/pkg/generated/client"
 	"github.com/sigstore/rekor/pkg/generated/client/entries"
 	"github.com/sigstore/rekor/pkg/generated/models"
 	"github.com/sigstore/rekor/pkg/log"
@@ -67,7 +68,7 @@ var uploadCmd = &cobra.Command{
 	Long: `This command takes the public key, signature and URL of the release artifact and uploads it to the rekor server.`,
 	Run: format.WrapCmd(func(args []string) (interface{}, error) {
 		ctx := context.Background()
-		rekorClient, err := GetRekorClient(viper.GetString("rekor_server"))
+		rekorClient, err := client.GetRekorClient(viper.GetString("rekor_server"))
 		if err != nil {
 			return nil, err
 		}
@@ -143,7 +144,7 @@ var uploadCmd = &cobra.Command{
 	}),
 }
 
-func verifyLogEntry(ctx context.Context, rekorClient *client.Rekor, logEntry models.LogEntryAnon) (bool, error) {
+func verifyLogEntry(ctx context.Context, rekorClient *genclient.Rekor, logEntry models.LogEntryAnon) (bool, error) {
 	if logEntry.Verification == nil {
 		return false, nil
 	}
diff --git a/cmd/rekor-cli/app/verify.go b/cmd/rekor-cli/app/verify.go
index 1c7728c..e661ae5 100644
--- a/cmd/rekor-cli/app/verify.go
+++ b/cmd/rekor-cli/app/verify.go
@@ -28,6 +28,7 @@ import (
 	"github.com/spf13/viper"
 
 	"github.com/sigstore/rekor/cmd/rekor-cli/app/format"
+	"github.com/sigstore/rekor/pkg/client"
 	"github.com/sigstore/rekor/pkg/generated/client/entries"
 	"github.com/sigstore/rekor/pkg/generated/models"
 	"github.com/sigstore/rekor/pkg/log"
@@ -84,7 +85,7 @@ var verifyCmd = &cobra.Command{
 		return nil
 	},
 	Run: format.WrapCmd(func(args []string) (interface{}, error) {
-		rekorClient, err := GetRekorClient(viper.GetString("rekor_server"))
+		rekorClient, err := client.GetRekorClient(viper.GetString("rekor_server"))
 		if err != nil {
 			return nil, err
 		}
diff --git a/cmd/rekor-server/app/watch.go b/cmd/rekor-server/app/watch.go
index 1278cbd..f8e0fb1 100644
--- a/cmd/rekor-server/app/watch.go
+++ b/cmd/rekor-server/app/watch.go
@@ -34,8 +34,8 @@ import (
 	"github.com/spf13/viper"
 	"gocloud.dev/blob"
 
-	"github.com/sigstore/rekor/cmd/rekor-cli/app"
-	"github.com/sigstore/rekor/pkg/generated/client"
+	"github.com/sigstore/rekor/pkg/client"
+	genclient "github.com/sigstore/rekor/pkg/generated/client"
 	"github.com/sigstore/rekor/pkg/log"
 	"github.com/sigstore/rekor/pkg/util"
 )
@@ -66,7 +66,7 @@ var watchCmd = &cobra.Command{
 		port := viper.GetUint("rekor_server.port")
 		interval := viper.GetDuration("interval")
 		url := fmt.Sprintf("http://%s:%d", host, port)
-		c, err := app.GetRekorClient(url)
+		c, err := client.GetRekorClient(url)
 		if err != nil {
 			return err
 		}
@@ -129,7 +129,7 @@ func init() {
 	rootCmd.AddCommand(watchCmd)
 }
 
-func doCheck(c *client.Rekor, pub crypto.PublicKey) (*SignedAndUnsignedLogRoot, error) {
+func doCheck(c *genclient.Rekor, pub crypto.PublicKey) (*SignedAndUnsignedLogRoot, error) {
 	li, err := c.Tlog.GetLogInfo(nil)
 	if err != nil {
 		return nil, errors.Wrap(err, "getting log info")
diff --git a/pkg/client/rekor_client.go b/pkg/client/rekor_client.go
new file mode 100644
index 0000000..07653d4
--- /dev/null
+++ b/pkg/client/rekor_client.go
@@ -0,0 +1,49 @@
+// Copyright 2021 The Sigstore Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package client
+
+import (
+	"net/url"
+
+	"github.com/go-openapi/runtime"
+	httptransport "github.com/go-openapi/runtime/client"
+	"github.com/go-openapi/strfmt"
+	"github.com/sigstore/rekor/pkg/generated/client"
+	"github.com/sigstore/rekor/pkg/util"
+	"github.com/spf13/viper"
+)
+
+func GetRekorClient(rekorServerURL string) (*client.Rekor, error) {
+	url, err := url.Parse(rekorServerURL)
+	if err != nil {
+		return nil, err
+	}
+
+	rt := httptransport.New(url.Host, client.DefaultBasePath, []string{url.Scheme})
+	rt.Consumers["application/yaml"] = YamlConsumer()
+	rt.Consumers["application/x-pem-file"] = runtime.TextConsumer()
+	rt.Consumers["application/pem-certificate-chain"] = runtime.TextConsumer()
+	rt.Producers["application/yaml"] = YamlProducer()
+	rt.Producers["application/timestamp-query"] = runtime.ByteStreamProducer()
+	rt.Consumers["application/timestamp-reply"] = runtime.ByteStreamConsumer()
+
+	if viper.GetString("api-key") != "" {
+		rt.DefaultAuthentication = httptransport.APIKeyAuth("apiKey", "query", viper.GetString("api-key"))
+	}
+
+	registry := strfmt.Default
+	registry.Add("signedCheckpoint", &util.SignedCheckpoint{}, util.SignedCheckpointValidator)
+	return client.New(rt, registry), nil
+}
diff --git a/cmd/rekor-cli/app/root_test.go b/pkg/client/rekor_client_test.go
similarity index 99%
rename from cmd/rekor-cli/app/root_test.go
rename to pkg/client/rekor_client_test.go
index 78941c0..3fcfb28 100644
--- a/cmd/rekor-cli/app/root_test.go
+++ b/pkg/client/rekor_client_test.go
@@ -13,7 +13,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package app
+package client
 
 import (
 	"net/http"
diff --git a/pkg/util/yaml.go b/pkg/client/yaml.go
similarity index 98%
rename from pkg/util/yaml.go
rename to pkg/client/yaml.go
index c3df27a..e738cf9 100644
--- a/pkg/util/yaml.go
+++ b/pkg/client/yaml.go
@@ -13,7 +13,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package util
+package client
 
 import (
 	"bytes"
diff --git a/pkg/generated/restapi/configure_rekor_server.go b/pkg/generated/restapi/configure_rekor_server.go
index 262d71e..c97ef62 100644
--- a/pkg/generated/restapi/configure_rekor_server.go
+++ b/pkg/generated/restapi/configure_rekor_server.go
@@ -31,6 +31,7 @@ import (
 	"github.com/spf13/viper"
 
 	pkgapi "github.com/sigstore/rekor/pkg/api"
+	"github.com/sigstore/rekor/pkg/client"
 	"github.com/sigstore/rekor/pkg/generated/restapi/operations"
 	"github.com/sigstore/rekor/pkg/generated/restapi/operations/entries"
 	"github.com/sigstore/rekor/pkg/generated/restapi/operations/index"
@@ -67,8 +68,8 @@ func configureAPI(api *operations.RekorServerAPI) http.Handler {
 	api.JSONConsumer = runtime.JSONConsumer()
 	api.JSONProducer = runtime.JSONProducer()
 
-	api.YamlConsumer = util.YamlConsumer()
-	api.YamlProducer = util.YamlProducer()
+	api.YamlConsumer = client.YamlConsumer()
+	api.YamlProducer = client.YamlProducer()
 
 	api.ApplicationXPemFileProducer = runtime.TextProducer()
 	api.ApplicationPemCertificateChainProducer = runtime.TextProducer()
diff --git a/tests/e2e_test.go b/tests/e2e_test.go
index 1126929..7d09c8b 100644
--- a/tests/e2e_test.go
+++ b/tests/e2e_test.go
@@ -43,8 +43,8 @@ import (
 	"github.com/google/go-cmp/cmp"
 	"github.com/in-toto/in-toto-golang/in_toto"
 	"github.com/in-toto/in-toto-golang/pkg/ssl"
-	"github.com/sigstore/rekor/cmd/rekor-cli/app"
-	"github.com/sigstore/rekor/pkg/generated/client"
+	"github.com/sigstore/rekor/pkg/client"
+	genclient "github.com/sigstore/rekor/pkg/generated/client"
 	"github.com/sigstore/rekor/pkg/generated/client/entries"
 	"github.com/sigstore/rekor/pkg/generated/client/timestamp"
 	"github.com/sigstore/rekor/pkg/generated/models"
@@ -568,7 +568,7 @@ func TestSignedEntryTimestamp(t *testing.T) {
 	})
 
 	// submit our newly signed payload to rekor
-	rekorClient, err := app.GetRekorClient("http://localhost:3000")
+	rekorClient, err := client.GetRekorClient("http://localhost:3000")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -639,7 +639,7 @@ func TestTimestampResponseCLI(t *testing.T) {
 	out := runCli(t, "timestamp", "--artifact", filePath, "--out", responsePath)
 	outputContains(t, out, "Wrote timestamp response to")
 
-	rekorClient, err := app.GetRekorClient("http://localhost:3000")
+	rekorClient, err := client.GetRekorClient("http://localhost:3000")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -696,7 +696,7 @@ func TestGetNonExistantUUID(t *testing.T) {
 	outputContains(t, out, "404")
 }
 
-func rekorTimestampCertChain(t *testing.T, ctx context.Context, c *client.Rekor) []*x509.Certificate {
+func rekorTimestampCertChain(t *testing.T, ctx context.Context, c *genclient.Rekor) []*x509.Certificate {
 	resp, err := c.Timestamp.GetTimestampCertChain(&timestamp.GetTimestampCertChainParams{Context: ctx})
 	if err != nil {
 		t.Fatal(err)
-- 
GitLab