You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2022/01/27 12:56:27 UTC
[camel-k] branch main updated: Kamel dump: make the command smarter
This is an automated email from the ASF dual-hosted git repository.
acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git
The following commit(s) were added to refs/heads/main by this push:
new 76f8797 Kamel dump: make the command smarter
76f8797 is described below
commit 76f87978d1563bbdb77c49da26e199703bd2838d
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Mon Jan 24 18:41:55 2022 +0100
Kamel dump: make the command smarter
---
pkg/cmd/dump.go | 21 ++++++++---
pkg/util/tar/util_compress.go | 82 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 98 insertions(+), 5 deletions(-)
diff --git a/pkg/cmd/dump.go b/pkg/cmd/dump.go
index 902a167..a92f7f4 100644
--- a/pkg/cmd/dump.go
+++ b/pkg/cmd/dump.go
@@ -23,6 +23,7 @@ import (
"fmt"
"io"
"os"
+ "time"
"github.com/apache/camel-k/pkg/util"
@@ -33,6 +34,7 @@ import (
"github.com/apache/camel-k/pkg/client"
"github.com/apache/camel-k/pkg/client/camel/clientset/versioned"
"github.com/apache/camel-k/pkg/util/kubernetes"
+ "github.com/apache/camel-k/pkg/util/tar"
)
func newCmdDump(rootCmdOptions *RootCmdOptions) (*cobra.Command, *dumpCmdOptions) {
@@ -48,12 +50,14 @@ func newCmdDump(rootCmdOptions *RootCmdOptions) (*cobra.Command, *dumpCmdOptions
}
cmd.Flags().Int("logLines", 100, "Number of log lines to dump")
+ cmd.Flags().Bool("compressed", false, "If the log file must be compressed in a tar.")
return &cmd, &options
}
type dumpCmdOptions struct {
*RootCmdOptions
- LogLines int `mapstructure:"logLines"`
+ LogLines int `mapstructure:"logLines"`
+ Compressed bool `mapstructure:"compressed" yaml:",omitempty"`
}
func (o *dumpCmdOptions) dump(cmd *cobra.Command, args []string) (err error) {
@@ -64,13 +68,20 @@ func (o *dumpCmdOptions) dump(cmd *cobra.Command, args []string) (err error) {
if len(args) == 1 {
err = util.WithFile(args[0], os.O_RDWR|os.O_CREATE, 0o644, func(file *os.File) error {
- return dumpNamespace(o.Context, c, o.Namespace, file, o.LogLines)
+ if !o.Compressed {
+ return dumpNamespace(o.Context, c, o.Namespace, file, o.LogLines)
+ }
+ err = dumpNamespace(o.Context, c, o.Namespace, file, o.LogLines)
+ if err != nil {
+ return err
+ }
+ tar.CreateTarFile([]string{file.Name()}, "dump."+file.Name()+"."+time.Now().Format(time.RFC3339)+".tar.gz")
+ return nil
})
} else {
- err = dumpNamespace(o.Context, c, o.Namespace, cmd.OutOrStdout(), o.LogLines)
+ return dumpNamespace(o.Context, c, o.Namespace, cmd.OutOrStdout(), o.LogLines)
}
-
- return
+ return nil
}
func dumpNamespace(ctx context.Context, c client.Client, ns string, out io.Writer, logLines int) error {
diff --git a/pkg/util/tar/util_compress.go b/pkg/util/tar/util_compress.go
new file mode 100644
index 0000000..c3bcbc0
--- /dev/null
+++ b/pkg/util/tar/util_compress.go
@@ -0,0 +1,82 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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 tar
+
+import (
+ "archive/tar"
+ "compress/gzip"
+ "fmt"
+ "io"
+ "os"
+)
+
+func CreateTarFile(fileNames []string, archiveName string) {
+ out, err := os.Create(archiveName)
+ if err != nil {
+ fmt.Printf("Error writing archive: %v", err)
+ }
+ defer out.Close()
+
+ err = createArchiveFile(fileNames, out)
+ if err != nil {
+ fmt.Printf("Error writing archive: %v", err)
+ }
+}
+
+func createArchiveFile(files []string, buf io.Writer) error {
+ gw := gzip.NewWriter(buf)
+ defer gw.Close()
+ tw := tar.NewWriter(gw)
+ defer tw.Close()
+
+ // Iterate over files and add them to the tar archive
+ for _, file := range files {
+ err := addEntryToArchive(tw, file)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func addEntryToArchive(tw *tar.Writer, filename string) error {
+ file, err := os.Open(filename)
+ if err != nil {
+ return err
+ }
+ defer file.Close()
+ info, err := file.Stat()
+ if err != nil {
+ return err
+ }
+ header, err := tar.FileInfoHeader(info, info.Name())
+ if err != nil {
+ return err
+ }
+ header.Name = filename
+ err = tw.WriteHeader(header)
+ if err != nil {
+ return err
+ }
+ _, err = io.Copy(tw, file)
+ if err != nil {
+ return err
+ }
+ defer os.Remove(filename)
+ return nil
+}