Skip to content

Commit 29d39b9

Browse files
authored
chore: refactor uploader interface (#41)
Signed-off-by: Miguel Martinez Trivino <[email protected]>
1 parent 9e757d2 commit 29d39b9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+589
-461
lines changed

app/cli/cmd/artifact.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"context"
2020

2121
pb "github.com/chainloop-dev/chainloop/app/controlplane/api/controlplane/v1"
22+
"github.com/chainloop-dev/chainloop/internal/grpcconn"
2223
"github.com/spf13/cobra"
2324
"github.com/spf13/viper"
2425
"google.golang.org/grpc"
@@ -44,5 +45,9 @@ func wrappedArtifactConn(cpConn *grpc.ClientConn, role pb.CASCredentialsServiceG
4445
return nil, err
4546
}
4647

47-
return newGRPCConnection(viper.GetString(confOptions.CASAPI.viperKey), resp.Result.Token, flagInsecure, logger)
48+
if flagInsecure {
49+
logger.Warn().Msg("API contacted in insecure mode")
50+
}
51+
52+
return grpcconn.New(viper.GetString(confOptions.CASAPI.viperKey), resp.Result.Token, flagInsecure)
4853
}

app/cli/cmd/artifact_download.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func newArtifactDownloadCmd() *cobra.Command {
3333
var err error
3434

3535
// Retrieve temporary credentials for uploading
36-
artifactCASConn, err = wrappedArtifactConn(actionOpts.CPConnecction,
36+
artifactCASConn, err = wrappedArtifactConn(actionOpts.CPConnection,
3737
pb.CASCredentialsServiceGetRequest_ROLE_DOWNLOADER)
3838
if err != nil {
3939
return err

app/cli/cmd/artifact_upload.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func newArtifactUploadCmd() *cobra.Command {
3333
var err error
3434

3535
// Retrieve temporary credentials for uploading
36-
artifactCASConn, err = wrappedArtifactConn(actionOpts.CPConnecction, pb.CASCredentialsServiceGetRequest_ROLE_UPLOADER)
36+
artifactCASConn, err = wrappedArtifactConn(actionOpts.CPConnection, pb.CASCredentialsServiceGetRequest_ROLE_UPLOADER)
3737
if err != nil {
3838
return err
3939
}

app/cli/cmd/attestation_add.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525

2626
"github.com/chainloop-dev/chainloop/app/cli/internal/action"
2727
pb "github.com/chainloop-dev/chainloop/app/controlplane/api/controlplane/v1"
28+
"github.com/chainloop-dev/chainloop/internal/grpcconn"
2829
)
2930

3031
func newAttestationAddCmd() *cobra.Command {
@@ -42,13 +43,13 @@ func newAttestationAddCmd() *cobra.Command {
4243

4344
// Retrieve temporary credentials for uploading
4445
// TODO: only do it for artifact uploads
45-
client := pb.NewAttestationServiceClient(actionOpts.CPConnecction)
46+
client := pb.NewAttestationServiceClient(actionOpts.CPConnection)
4647
resp, err := client.GetUploadCreds(context.Background(), &pb.AttestationServiceGetUploadCredsRequest{})
4748
if err != nil {
4849
return newGracefulError(err)
4950
}
5051

51-
artifactCASConn, err = newGRPCConnection(viper.GetString(confOptions.CASAPI.viperKey), resp.Result.Token, flagInsecure, logger)
52+
artifactCASConn, err = grpcconn.New(viper.GetString(confOptions.CASAPI.viperKey), resp.Result.Token, flagInsecure)
5253
if err != nil {
5354
return newGracefulError(err)
5455
}

app/cli/cmd/auth_login.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ func openbrowser(url string) error {
180180

181181
// Retrieve loginURL from the control plane
182182
func retrieveLoginURL() (string, error) {
183-
client := pb.NewStatusServiceClient(actionOpts.CPConnecction)
183+
client := pb.NewStatusServiceClient(actionOpts.CPConnection)
184184
resp, err := client.Infoz(context.Background(), &pb.InfozRequest{})
185185
if err != nil {
186186
return "", err

app/cli/cmd/root.go

Lines changed: 8 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,18 @@
1616
package cmd
1717

1818
import (
19-
"crypto/x509"
2019
"errors"
2120
"fmt"
2221
"os"
2322
"path/filepath"
2423

2524
"github.com/adrg/xdg"
2625
"github.com/chainloop-dev/chainloop/app/cli/internal/action"
27-
"github.com/chainloop-dev/chainloop/app/cli/internal/bearertoken"
28-
grpc_retry "github.com/grpc-ecosystem/go-grpc-middleware/retry"
26+
"github.com/chainloop-dev/chainloop/internal/grpcconn"
2927
"github.com/rs/zerolog"
3028
"github.com/spf13/cobra"
3129
"github.com/spf13/viper"
3230
"google.golang.org/grpc"
33-
"google.golang.org/grpc/credentials"
34-
grpc_insecure "google.golang.org/grpc/credentials/insecure"
3531
)
3632

3733
var (
@@ -75,7 +71,11 @@ func NewRootCmd(l zerolog.Logger) *cobra.Command {
7571
}
7672
}
7773

78-
conn, err := newGRPCConnection(viper.GetString(confOptions.controlplaneAPI.viperKey), storedToken, flagInsecure, logger)
74+
if flagInsecure {
75+
logger.Warn().Msg("API contacted in insecure mode")
76+
}
77+
78+
conn, err := grpcconn.New(viper.GetString(confOptions.controlplaneAPI.viperKey), storedToken, flagInsecure)
7979
if err != nil {
8080
return err
8181
}
@@ -85,7 +85,7 @@ func NewRootCmd(l zerolog.Logger) *cobra.Command {
8585
return nil
8686
},
8787
PersistentPostRunE: func(cmd *cobra.Command, args []string) error {
88-
return cleanup(logger, actionOpts.CPConnecction)
88+
return cleanup(logger, actionOpts.CPConnection)
8989
},
9090
}
9191

@@ -163,42 +163,8 @@ func initConfigFile() {
163163
cobra.CheckErr(viper.ReadInConfig())
164164
}
165165

166-
func newGRPCConnection(uri, authToken string, insecure bool, logger zerolog.Logger) (*grpc.ClientConn, error) {
167-
var opts []grpc.DialOption
168-
if authToken != "" {
169-
grpcCreds := bearertoken.NewTokenAuth(authToken, flagInsecure)
170-
171-
opts = []grpc.DialOption{
172-
grpc.WithPerRPCCredentials(grpcCreds),
173-
// Retry using default configuration
174-
grpc.WithUnaryInterceptor(grpc_retry.UnaryClientInterceptor()),
175-
}
176-
}
177-
178-
var tlsDialOption grpc.DialOption
179-
if insecure {
180-
logger.Warn().Msg("API contacted in insecure mode")
181-
tlsDialOption = grpc.WithTransportCredentials(grpc_insecure.NewCredentials())
182-
} else {
183-
certsPool, err := x509.SystemCertPool()
184-
if err != nil {
185-
return nil, err
186-
}
187-
tlsDialOption = grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(certsPool, ""))
188-
}
189-
190-
opts = append(opts, tlsDialOption)
191-
192-
conn, err := grpc.Dial(uri, opts...)
193-
if err != nil {
194-
return nil, err
195-
}
196-
197-
return conn, nil
198-
}
199-
200166
func newActionOpts(logger zerolog.Logger, conn *grpc.ClientConn) *action.ActionsOpts {
201-
return &action.ActionsOpts{CPConnecction: conn, Logger: logger}
167+
return &action.ActionsOpts{CPConnection: conn, Logger: logger}
202168
}
203169

204170
func cleanup(logger zerolog.Logger, conn *grpc.ClientConn) error {

app/cli/internal/action/action.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ import (
2323
)
2424

2525
type ActionsOpts struct {
26-
CPConnecction *grpc.ClientConn
27-
Logger zerolog.Logger
26+
CPConnection *grpc.ClientConn
27+
Logger zerolog.Logger
2828
}
2929

3030
func toTimePtr(t time.Time) *time.Time {

app/cli/internal/action/artifact_download.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func (a *ArtifactDownload) Run(downloadPath, digest string) error {
5252
return fmt.Errorf("invalid digest: %w", err)
5353
}
5454

55-
client := casclient.NewDownloader(a.artifactsCASConn)
55+
client := casclient.New(a.artifactsCASConn)
5656
ctx := context.Background()
5757
info, err := client.Describe(ctx, h.Hex)
5858
if err != nil {
@@ -81,10 +81,10 @@ func (a *ArtifactDownload) Run(downloadPath, digest string) error {
8181
a.Logger.Info().Str("name", info.Filename).Str("to", downloadPath).Msg("downloading file")
8282

8383
// render progress bar
84-
go renderOperationStatus(ctx, client.ProgressStatus, a.Logger)
84+
go renderOperationStatus(ctx, client.ProgressStatus, a.Logger, info.Size)
8585
defer close(client.ProgressStatus)
8686

87-
err = client.Download(ctx, w, h.Hex, info.Size)
87+
err = client.Download(ctx, w, h.Hex)
8888
if err != nil {
8989
a.Logger.Debug().Err(err).Msg("problem downloading file")
9090
return errors.New("problem downloading file")
@@ -103,7 +103,7 @@ func (a *ArtifactDownload) Run(downloadPath, digest string) error {
103103
return nil
104104
}
105105

106-
func renderOperationStatus(ctx context.Context, progressChan casclient.ProgressStatusChan, output io.Writer) {
106+
func renderOperationStatus(ctx context.Context, progressChan casclient.ProgressStatusChan, output io.Writer, totalSize int64) {
107107
pw := progress.NewWriter()
108108
pw.Style().Visibility.ETA = true
109109
pw.Style().Visibility.Speed = true
@@ -127,8 +127,7 @@ func renderOperationStatus(ctx context.Context, progressChan casclient.ProgressS
127127
// Hack: Add 1 to the total to make sure the tracker is not marked as done before the upload is finished
128128
// this way the current value will never reach the total
129129
// but instead the tracker will be marked as done by the defer statement
130-
total := status.TotalSizeBytes + 1
131-
tracker = &progress.Tracker{Total: total, Units: progress.UnitsBytes}
130+
tracker = &progress.Tracker{Total: totalSize + 1, Units: progress.UnitsBytes}
132131
defer tracker.MarkAsDone()
133132
pw.AppendTracker(tracker)
134133
}

app/cli/internal/action/artifact_upload.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ package action
1717

1818
import (
1919
"context"
20+
"fmt"
21+
"os"
2022
"time"
2123

2224
"github.com/chainloop-dev/chainloop/internal/casclient"
@@ -43,9 +45,22 @@ func NewArtifactUpload(opts *ArtifactUploadOpts) *ArtifactUpload {
4345
}
4446

4547
func (a *ArtifactUpload) Run(filePath string) (*CASArtifact, error) {
46-
client := casclient.NewUploader(a.artifactsCASConn, casclient.WithLogger(a.Logger))
48+
client := casclient.New(a.artifactsCASConn, casclient.WithLogger(a.Logger))
49+
50+
// open file and calculate size
51+
f, err := os.Open(filePath)
52+
if err != nil {
53+
return nil, fmt.Errorf("can't open file to upload: %w", err)
54+
}
55+
defer f.Close()
56+
57+
info, err := f.Stat()
58+
if err != nil {
59+
return nil, fmt.Errorf("retrieving file information: %w", err)
60+
}
61+
4762
// render progress bar
48-
go renderOperationStatus(context.Background(), client.ProgressStatus, a.Logger)
63+
go renderOperationStatus(context.Background(), client.ProgressStatus, a.Logger, info.Size())
4964
defer close(client.ProgressStatus)
5065

5166
res, err := client.Upload(context.Background(), filePath)

app/cli/internal/action/attestation_add.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func NewAttestationAdd(cfg *AttestationAddOpts) *AttestationAdd {
3939
ActionsOpts: cfg.ActionsOpts,
4040
c: crafter.NewCrafter(
4141
crafter.WithLogger(&cfg.Logger),
42-
crafter.WithUploader(casclient.NewUploader(cfg.ArtifactsCASConn, casclient.WithLogger(cfg.Logger))),
42+
crafter.WithUploader(casclient.New(cfg.ArtifactsCASConn, casclient.WithLogger(cfg.Logger))),
4343
),
4444
artifactsCASConn: cfg.ArtifactsCASConn,
4545
}

0 commit comments

Comments
 (0)