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 2021/03/25 07:15:40 UTC

[camel-k] branch 1415 created (now f1492be)

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

acosentino pushed a change to branch 1415
in repository https://gitbox.apache.org/repos/asf/camel-k.git.


      at f1492be  Adding a dump command

This branch includes the following new commits:

     new f1492be  Adding a dump command

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[camel-k] 01/01: Adding a dump command

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f1492be6b957de4a50ca573d539c9b77ff4179bb
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Mar 25 08:12:06 2021 +0100

    Adding a dump command
---
 pkg/cmd/dump.go            | 200 +++++++++++++++++++++++++++++++++++++++++++++
 pkg/cmd/root.go            |   1 +
 pkg/resources/resources.go |   4 +-
 3 files changed, 203 insertions(+), 2 deletions(-)

diff --git a/pkg/cmd/dump.go b/pkg/cmd/dump.go
new file mode 100644
index 0000000..70bcd51
--- /dev/null
+++ b/pkg/cmd/dump.go
@@ -0,0 +1,200 @@
+/*
+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 cmd
+
+import (
+	"bufio"
+	"context"
+	"fmt"
+	"os"
+
+	"github.com/spf13/cobra"
+	v1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	"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"
+)
+
+func newCmdDump(rootCmdOptions *RootCmdOptions) (*cobra.Command, *dumpCmdOptions) {
+	options := dumpCmdOptions{
+		RootCmdOptions: rootCmdOptions,
+	}
+	cmd := cobra.Command{
+		Use:     "dump [filename]",
+		Short:   "Dump the state of namespace",
+		Long:    `Dump the state of currently used namespace. If no filename will be specified, the output will be on stdout`,
+		PreRunE: decode(&options),
+		RunE:    options.dump,
+	}
+
+	return &cmd, &options
+}
+
+type dumpCmdOptions struct {
+	*RootCmdOptions
+}
+
+func (o *dumpCmdOptions) dump(_ *cobra.Command, args []string) error {
+	c, err := o.GetCmdClient()
+	if err != nil {
+		return err
+	}
+	if len(args) == 1 {
+		fileName := args[0]
+		writer, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, 0777)
+		if err != nil {
+			return err
+		}
+		Dump(o.Context, c, o.Namespace, writer)
+		defer writer.Close()
+	} else {
+		Dump(o.Context, c, o.Namespace, os.Stdout)
+	}
+	return nil
+}
+
+func Dump(ctx context.Context, c client.Client, ns string, out *os.File) error {
+
+	camelClient, err := versioned.NewForConfig(c.GetConfig())
+	if err != nil {
+		return err
+	}
+	pls, err := camelClient.CamelV1().IntegrationPlatforms(ns).List(ctx, metav1.ListOptions{})
+	if err != nil {
+		return err
+	}
+	fmt.Fprintf(out, "Found %d platforms:\n", len(pls.Items))
+	for _, p := range pls.Items {
+		ref := p
+		pdata, err := kubernetes.ToYAML(&ref)
+		if err != nil {
+			return err
+		}
+		fmt.Fprintf(out, "---\n%s\n---\n", string(pdata))
+	}
+
+	its, err := camelClient.CamelV1().Integrations(ns).List(ctx, metav1.ListOptions{})
+	if err != nil {
+		return err
+	}
+	fmt.Fprintf(out, "Found %d integrations:\n", len(its.Items))
+	for _, integration := range its.Items {
+		ref := integration
+		pdata, err := kubernetes.ToYAML(&ref)
+		if err != nil {
+			return err
+		}
+		fmt.Fprintf(out, "---\n%s\n---\n", string(pdata))
+	}
+
+	iks, err := camelClient.CamelV1().IntegrationKits(ns).List(ctx, metav1.ListOptions{})
+	if err != nil {
+		return err
+	}
+	fmt.Fprintf(out, "Found %d integration kits:\n", len(iks.Items))
+	for _, ik := range iks.Items {
+		ref := ik
+		pdata, err := kubernetes.ToYAML(&ref)
+		if err != nil {
+			return err
+		}
+		fmt.Fprintf(out, "---\n%s\n---\n", string(pdata))
+	}
+
+	cms, err := c.CoreV1().ConfigMaps(ns).List(ctx, metav1.ListOptions{})
+	if err != nil {
+		return err
+	}
+	fmt.Fprintf(out, "Found %d ConfigMaps:\n", len(cms.Items))
+	for _, cm := range cms.Items {
+		ref := cm
+		pdata, err := kubernetes.ToYAML(&ref)
+		if err != nil {
+			return err
+		}
+		fmt.Fprintf(out, "---\n%s\n---\n", string(pdata))
+	}
+
+	deployments, err := c.AppsV1().Deployments(ns).List(ctx, metav1.ListOptions{})
+	if err != nil {
+		return err
+	}
+	fmt.Fprintf(out, "Found %d deployments:\n", len(iks.Items))
+	for _, deployment := range deployments.Items {
+		ref := deployment
+		data, err := kubernetes.ToYAML(&ref)
+		if err != nil {
+			return err
+		}
+		fmt.Fprintf(out, "---\n%s\n---\n", string(data))
+	}
+
+	lst, err := c.CoreV1().Pods(ns).List(ctx, metav1.ListOptions{})
+	if err != nil {
+		return err
+	}
+
+	fmt.Fprintf(out, "\nFound %d pods:\n", len(lst.Items))
+	for _, pod := range lst.Items {
+		fmt.Fprintf(out, "name=%s\n", pod.Name)
+		dumpConditions("  ", pod.Status.Conditions, out)
+		fmt.Fprintf(out, "  logs:\n")
+		var allContainers []v1.Container
+		allContainers = append(allContainers, pod.Spec.InitContainers...)
+		allContainers = append(allContainers, pod.Spec.Containers...)
+		for _, container := range allContainers {
+			pad := "    "
+			fmt.Fprintf(out, "%s%s\n", pad, container.Name)
+			err := dumpLogs(ctx, c, fmt.Sprintf("%s> ", pad), ns, pod.Name, container.Name, out)
+			if err != nil {
+				fmt.Fprintf(out, "%sERROR while reading the logs: %v\n", pad, err)
+			}
+		}
+	}
+	return nil
+}
+
+func dumpConditions(prefix string, conditions []v1.PodCondition, out *os.File) {
+	for _, cond := range conditions {
+		fmt.Fprintf(out, "%scondition type=%s, status=%s, reason=%s, message=%q\n", prefix, cond.Type, cond.Status, cond.Reason, cond.Message)
+	}
+}
+
+func dumpLogs(ctx context.Context, c client.Client, prefix string, ns string, name string, container string, out *os.File) error {
+	lines := int64(50)
+	stream, err := c.CoreV1().Pods(ns).GetLogs(name, &v1.PodLogOptions{
+		Container: container,
+		TailLines: &lines,
+	}).Stream(ctx)
+	if err != nil {
+		return err
+	}
+	defer stream.Close()
+	scanner := bufio.NewScanner(stream)
+	printed := false
+	for scanner.Scan() {
+		printed = true
+		fmt.Fprintf(out, "%s%s\n", prefix, scanner.Text())
+	}
+	if !printed {
+		fmt.Fprintf(out, "%s[no logs available]\n", prefix)
+	}
+	return nil
+}
diff --git a/pkg/cmd/root.go b/pkg/cmd/root.go
index b08f580..c61a2fa 100644
--- a/pkg/cmd/root.go
+++ b/pkg/cmd/root.go
@@ -145,6 +145,7 @@ func addKamelSubcommands(cmd *cobra.Command, options *RootCmdOptions) {
 	cmd.AddCommand(cmdOnly(newCmdBuilder(options)))
 	cmd.AddCommand(cmdOnly(newCmdInit(options)))
 	cmd.AddCommand(cmdOnly(newCmdDebug(options)))
+	cmd.AddCommand(cmdOnly(newCmdDump(options)))
 	cmd.AddCommand(newCmdLocal(options))
 }
 
diff --git a/pkg/resources/resources.go b/pkg/resources/resources.go
index 2a21a12..26f7a55 100644
--- a/pkg/resources/resources.go
+++ b/pkg/resources/resources.go
@@ -474,9 +474,9 @@ var assets = func() http.FileSystem {
 		"/traits.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "traits.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 35740,
+			uncompressedSize: 37013,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xff\x6f\x1b\x37\xf6\xe0\xef\xfd\x2b\x08\xef\x01\xb6\x0c\x69\xec\x74\xd1\x6d\x57\x77\xb9\x85\x37\xc9\x76\xdd\x34\x8e\x2f\x4e\xbb\x38\xf4\x8a\x8a\x9a\x79\x92\x18\x73\xc8\x59\x92\x23\x47\x3d\xdc\xff\x7e\xe0\xe3\xd7\x19\x8d\xed\x71\x12\x17\x5e\xe0\x83\xfc\x10\x4b\x1a\x3e\x3e\x3e\x3e\xbe\xef\x8f\x63\x14\x65\x46\xcf\xbf\x9a\x11\x41\x6b\x98\x13\xba\x5a\x31\xc1\xcc\xee\x2b\x42\x1a\x4e\xcd\x4a\xaa\x7a\x4e\x56\x94\x6b\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xed\x72\x1c\xb7\x11\xe0\x7f\x3d\x05\x8a\xb9\x2a\x7e\xd4\xee\x90\x72\xca\xb1\xc3\x3b\x5d\x8a\x96\x94\x84\xb6\x25\xf1\x44\xd9\xa9\x2b\x9f\x2b\x8b\x9d\xe9\xdd\x85\x88\x01\x26\x00\x66\xa9\xf5\xd5\xbd\xfb\x15\xba\x01\x0c\x66\x76\xb8\x5c\xca\xa6\xcb\xbc\xba\xe4\x87\x45\x72\xa6\xd1\x68\x34\xfa\xbb\x7b\x9c\xe1\xc2\xd9\xf3\x67\x53\xa6\x78\x0d\xe7\x8c\x2f\x16\x42\x09\xb7\x79\xc6\x58\x23\xb9\x5b\x68\x53\x9f\xb3\x05\x97\x [...]
 		},
 	}
 	fs["/"].(*vfsgen۰DirInfo).entries = []os.FileInfo{