You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2020/10/07 12:11:34 UTC

[camel-k] branch master updated: Fix #1750: auto-compress/encode binary sources and resources

This is an automated email from the ASF dual-hosted git repository.

nferraro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/master by this push:
     new 82e7e03  Fix #1750: auto-compress/encode binary sources and resources
82e7e03 is described below

commit 82e7e03c39ea396055ca6c8e3db67bd32febf3b4
Author: nicolaferraro <ni...@gmail.com>
AuthorDate: Wed Oct 7 13:05:55 2020 +0200

    Fix #1750: auto-compress/encode binary sources and resources
---
 pkg/cmd/modeline.go |  2 +-
 pkg/cmd/run.go      | 48 +++++++++++++++++++++++++++++-------------------
 2 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/pkg/cmd/modeline.go b/pkg/cmd/modeline.go
index 0833511..1e1ca37 100644
--- a/pkg/cmd/modeline.go
+++ b/pkg/cmd/modeline.go
@@ -113,7 +113,7 @@ func createKamelWithModelineCommand(ctx context.Context, args []string, processe
 			continue
 		}
 		baseDir := filepath.Dir(f)
-		content, err := loadData(f, false)
+		content, _, err := loadData(f, false, false)
 		if err != nil {
 			return nil, nil, errors.Wrapf(err, "cannot read file %s", f)
 		}
diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index 744f635..db2c7c3 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -22,8 +22,8 @@ import (
 	"encoding/base64"
 	"encoding/json"
 	"fmt"
-
 	"io/ioutil"
+	"net/http"
 	"net/url"
 	"os"
 	"os/signal"
@@ -91,7 +91,8 @@ func newCmdRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, *runCmdOptions)
 	cmd.Flags().StringArrayP("trait", "t", nil, "Configure a trait. E.g. \"-t service.enabled=false\"")
 	cmd.Flags().StringArray("logging-level", nil, "Configure the logging level. e.g. \"--logging-level org.apache.camel=DEBUG\"")
 	cmd.Flags().StringP("output", "o", "", "Output format. One of: json|yaml")
-	cmd.Flags().Bool("compression", false, "Enable store source as a compressed binary blob")
+	cmd.Flags().Bool("compression", false, "Enable storage of sources and resources as a compressed binary blobs")
+	cmd.Flags().Bool("compress-binary", true, "Enable compression of sources and resources having a binary content type (to encode them)")
 	cmd.Flags().StringArray("resource", nil, "Add a resource")
 	cmd.Flags().StringArray("open-api", nil, "Add an OpenAPI v2 spec")
 	cmd.Flags().StringArrayP("volume", "v", nil, "Mount a volume into the integration container. E.g \"-v pvcname:/container/path\"")
@@ -111,6 +112,7 @@ func newCmdRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, *runCmdOptions)
 type runCmdOptions struct {
 	*RootCmdOptions `json:"-"`
 	Compression     bool     `mapstructure:"compression" yaml:",omitempty"`
+	CompressBinary  bool     `mapstructure:"compress-binary" yaml:",omitempty"`
 	Wait            bool     `mapstructure:"wait" yaml:",omitempty"`
 	Logs            bool     `mapstructure:"logs" yaml:",omitempty"`
 	Sync            bool     `mapstructure:"sync" yaml:",omitempty"`
@@ -213,7 +215,7 @@ func (o *runCmdOptions) validateArgs(_ *cobra.Command, args []string) error {
 				return errors.Wrapf(err, "error while accessing file %s", source)
 			}
 		} else {
-			_, err := loadData(source, false)
+			_, _, err := loadData(source, false, false)
 			if err != nil {
 				return errors.Wrap(err, "The provided source is not reachable")
 			}
@@ -492,12 +494,12 @@ func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string,
 	srcs = append(srcs, o.Sources...)
 
 	for _, source := range srcs {
-		data, err := loadData(source, o.Compression)
+		data, compressed, err := loadData(source, o.Compression, o.CompressBinary)
 		if err != nil {
 			return nil, err
 		}
 
-		if o.UseFlows && (strings.HasSuffix(source, ".yaml") || strings.HasSuffix(source, ".yml")) {
+		if !compressed && o.UseFlows && (strings.HasSuffix(source, ".yaml") || strings.HasSuffix(source, ".yml")) {
 			flows, err := flow.FromYamlDSLString(data)
 			if err != nil {
 				return nil, err
@@ -508,14 +510,14 @@ func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string,
 				DataSpec: v1.DataSpec{
 					Name:        path.Base(source),
 					Content:     data,
-					Compression: o.Compression,
+					Compression: compressed,
 				},
 			})
 		}
 	}
 
 	for _, resource := range o.Resources {
-		data, err := loadData(resource, o.Compression)
+		data, compressed, err := loadData(resource, o.Compression, o.CompressBinary)
 		if err != nil {
 			return nil, err
 		}
@@ -524,14 +526,14 @@ func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string,
 			DataSpec: v1.DataSpec{
 				Name:        path.Base(resource),
 				Content:     data,
-				Compression: o.Compression,
+				Compression: compressed,
 			},
 			Type: v1.ResourceTypeData,
 		})
 	}
 
 	for _, resource := range o.OpenAPIs {
-		data, err := loadData(resource, o.Compression)
+		data, compressed, err := loadData(resource, o.Compression, o.CompressBinary)
 		if err != nil {
 			return nil, err
 		}
@@ -540,7 +542,7 @@ func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string,
 			DataSpec: v1.DataSpec{
 				Name:        path.Base(resource),
 				Content:     data,
-				Compression: o.Compression,
+				Compression: compressed,
 			},
 			Type: v1.ResourceTypeOpenAPI,
 		})
@@ -654,43 +656,51 @@ func (o *runCmdOptions) GetIntegrationName(sources []string) string {
 	return name
 }
 
-func loadData(source string, compress bool) (string, error) {
+func loadData(source string, compress bool, compressBinary bool) (string, bool, error) {
 	var content []byte
 	var err error
 
 	if isLocal(source) {
 		content, err = ioutil.ReadFile(source)
 		if err != nil {
-			return "", err
+			return "", false, err
 		}
 	} else {
 		u, err := url.Parse(source)
 		if err != nil {
-			return "", err
+			return "", false, err
 		}
 
 		g, ok := Getters[u.Scheme]
 		if !ok {
-			return "", fmt.Errorf("unable to find a getter for URL: %s", source)
+			return "", false, fmt.Errorf("unable to find a getter for URL: %s", source)
 		}
 
 		content, err = g.Get(u)
 		if err != nil {
-			return "", err
+			return "", false, err
+		}
+	}
+
+	doCompress := compress
+	if !doCompress && compressBinary {
+		contentType := http.DetectContentType(content)
+		if strings.HasPrefix(contentType, "application/octet-stream") {
+			doCompress = true
 		}
 	}
 
-	if compress {
+	if doCompress {
 		var b bytes.Buffer
 
 		if err := gzip.Compress(&b, content); err != nil {
-			return "", err
+			return "", false, err
 		}
 
-		return base64.StdEncoding.EncodeToString(b.Bytes()), nil
+		return base64.StdEncoding.EncodeToString(b.Bytes()), true, nil
 	}
 
-	return string(content), nil
+	return string(content), false, nil
 }
 
 func (*runCmdOptions) configureTraits(integration *v1.Integration, options []string, catalog *trait.Catalog) error {