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/11/02 08:56:40 UTC

[camel-k] branch master updated: #1283: Enhance the `kamel log` command to show more detail prior to install

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 b2562d3  #1283: Enhance the `kamel log` command to show more detail prior to install
b2562d3 is described below

commit b2562d3cc64e93ba303f7cd1f3f95e34980696e8
Author: phantomjinx <p....@phantomjinx.co.uk>
AuthorDate: Tue Oct 27 17:47:25 2020 +0000

    #1283: Enhance the `kamel log` command to show more detail prior to install
    
    * Sets up a polling prior to the complete install of an integration
     * First report whether it finds the integration
     * Assume it finds an integration then determine its status
     * If it gets to Building Kit (which can take a while) then find the
       associated IntegrationKit and report its status
     * Finally return to the scraping of the log once the integration is up
       and running
---
 pkg/cmd/log.go | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 119 insertions(+), 6 deletions(-)

diff --git a/pkg/cmd/log.go b/pkg/cmd/log.go
index f92ed98..dc2f854 100644
--- a/pkg/cmd/log.go
+++ b/pkg/cmd/log.go
@@ -19,11 +19,15 @@ package cmd
 
 import (
 	"errors"
+	"fmt"
+	"time"
 
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
 	k8slog "github.com/apache/camel-k/pkg/util/kubernetes/log"
 	"github.com/spf13/cobra"
+	k8errors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/wait"
 	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
@@ -65,6 +69,9 @@ func (o *logCmdOptions) run(cmd *cobra.Command, args []string) error {
 	if err != nil {
 		return err
 	}
+
+	integrationId := args[0]
+
 	integration := v1.Integration{
 		TypeMeta: metav1.TypeMeta{
 			Kind:       v1.IntegrationKind,
@@ -72,18 +79,124 @@ func (o *logCmdOptions) run(cmd *cobra.Command, args []string) error {
 		},
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: o.Namespace,
-			Name:      args[0],
+			Name:      integrationId,
 		},
 	}
 	key := k8sclient.ObjectKey{
 		Namespace: o.Namespace,
-		Name:      args[0],
+		Name:      integrationId,
 	}
 
-	if err := c.Get(o.Context, key, &integration); err != nil {
-		return err
-	}
-	if err := k8slog.Print(o.Context, c, &integration, cmd.OutOrStdout()); err != nil {
+	var pollTimeout = 600 * time.Second // 10 minutes should be adequate for a timeout
+	var pollInterval = 2 * time.Second
+	var currLogMsg = ""
+	var newLogMsg = ""
+
+	err = wait.PollImmediate(pollInterval, pollTimeout, func() (done bool, err error) {
+
+		//
+		// Reduce repetition of messages by tracking the last message
+		// and checking if its different from the new message
+		//
+		if newLogMsg != currLogMsg {
+			fmt.Println(newLogMsg)
+			currLogMsg = newLogMsg
+		}
+
+		//
+		// Try and find the integration
+		//
+		err = c.Get(o.Context, key, &integration)
+		if err != nil && !k8errors.IsNotFound(err) {
+			// different error so return
+			return false, err
+		}
+
+		if k8errors.IsNotFound(err) {
+			//
+			// Don't have an integration yet so log and wait
+			//
+			newLogMsg = fmt.Sprintf("Integration '%s' not yet available. Will keep checking ...", integrationId)
+			return false, nil
+		}
+
+		//
+		// Found the integration so check its status using its phase
+		//
+		phase := integration.Status.Phase
+		switch phase {
+		case "Running":
+			//
+			// Found the running integration so step over to scraping its pod log
+			//
+			fmt.Printf("Integration '%s' is now running. Showing log ...\n", integrationId)
+			if err := k8slog.Print(o.Context, c, &integration, cmd.OutOrStdout()); err != nil {
+				return false, err
+			} else {
+				return true, nil
+			}
+			break
+		case "Building Kit":
+			//
+			// This phase can take a while so check progress using
+			// the associated Integration Kit's progress
+			//
+			newLogMsg = fmt.Sprintf("The building kit for integration '%s' is being initialised. This may take some time ...", integrationId)
+			if integration.Status.Kit == "" {
+				//
+				// Not created yet so wait quietly
+				//
+				return false, nil
+			}
+
+			integrationKit := v1.IntegrationKit{
+				TypeMeta: metav1.TypeMeta{
+					Kind:       v1.IntegrationKitKind,
+					APIVersion: v1.SchemeGroupVersion.String(),
+				},
+				ObjectMeta: metav1.ObjectMeta{
+					Namespace: o.Namespace,
+					Name:      integration.Status.Kit,
+				},
+			}
+			ikKey := k8sclient.ObjectKey{
+				Namespace: o.Namespace,
+				Name:      integration.Status.Kit,
+			}
+
+			//
+			// Query for the integration kit
+			//
+			if err := c.Get(o.Context, ikKey, &integrationKit); err != nil {
+				if !k8errors.IsNotFound(err) {
+					//
+					// Not created yet so wait quietly
+					//
+					return false, nil
+				} else {
+					//
+					// Integration kit query made an error
+					//
+					return false, err
+				}
+			}
+
+			//
+			// Found the building kit so output its phase
+			//
+			newLogMsg = fmt.Sprintf("The building kit for integration '%s' is at: %s", integrationId, integrationKit.Status.Phase)
+			break
+		default:
+			//
+			// Integration is still building, deploying or even in error
+			//
+			newLogMsg = fmt.Sprintf("Integration '%s' is at: %s ...", integrationId, phase)
+		}
+
+		return false, nil
+	})
+
+	if err != nil {
 		return err
 	}