You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ts...@apache.org on 2022/08/22 06:18:58 UTC

[camel-k] branch main updated: chore(cli): refactor run cmd to remove nolint maintidx

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

tsato 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 d318d2b8a chore(cli): refactor run cmd to remove nolint maintidx
d318d2b8a is described below

commit d318d2b8a8736e60caae211a7581c1b18a519cba
Author: Tadayoshi Sato <sa...@gmail.com>
AuthorDate: Fri Aug 19 16:55:58 2022 +0900

    chore(cli): refactor run cmd to remove nolint maintidx
---
 .github/workflows/validate.yml |   2 +-
 pkg/cmd/run.go                 | 344 +++++++++++++++++++++++++----------------
 pkg/cmd/source/source.go       |   4 +
 3 files changed, 212 insertions(+), 138 deletions(-)

diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
index a141b2450..c474055c3 100644
--- a/.github/workflows/validate.yml
+++ b/.github/workflows/validate.yml
@@ -46,5 +46,5 @@ jobs:
         env:
           GOGC: 20
         with:
-          version: v1.47.2
+          version: v1.47.3
           args: --verbose --deadline 15m --config .golangci.yml
diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index a3282e1f7..b1e23aa6e 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -63,7 +63,7 @@ import (
 	"github.com/apache/camel-k/pkg/client"
 	"github.com/apache/camel-k/pkg/cmd/local"
 	"github.com/apache/camel-k/pkg/cmd/source"
-	platformutil "github.com/apache/camel-k/pkg/platform"
+	"github.com/apache/camel-k/pkg/platform"
 	"github.com/apache/camel-k/pkg/trait"
 	"github.com/apache/camel-k/pkg/util"
 	"github.com/apache/camel-k/pkg/util/defaults"
@@ -493,7 +493,6 @@ func (o *runCmdOptions) syncIntegration(cmd *cobra.Command, c client.Client, sou
 	return nil
 }
 
-// nolint: gocyclo,maintidx // TODO: refactor the code
 func (o *runCmdOptions) createOrUpdateIntegration(cmd *cobra.Command, c client.Client, sources []string) (*v1.Integration, error) {
 	namespace := o.Namespace
 	name := o.GetIntegrationName(sources)
@@ -502,7 +501,85 @@ func (o *runCmdOptions) createOrUpdateIntegration(cmd *cobra.Command, c client.C
 		return nil, errors.New("unable to determine integration name")
 	}
 
-	integration := &v1.Integration{
+	integration, existing, err := o.getIntegration(cmd, c, namespace, name)
+	if err != nil {
+		return nil, err
+	}
+
+	var integrationKit *corev1.ObjectReference
+	if o.IntegrationKit != "" {
+		integrationKit = &corev1.ObjectReference{
+			Namespace: namespace,
+			Name:      o.IntegrationKit,
+		}
+	}
+
+	integration.Spec = v1.IntegrationSpec{
+		Dependencies:   make([]string, 0, len(o.Dependencies)),
+		IntegrationKit: integrationKit,
+		Configuration:  make([]v1.ConfigurationSpec, 0),
+		Repositories:   o.Repositories,
+		Profile:        v1.TraitProfileByName(o.Profile),
+	}
+
+	o.applyLabels(integration)
+
+	if err := o.applyAnnotations(cmd, c, integration); err != nil {
+		return nil, err
+	}
+
+	if err := o.resolveSources(cmd, sources, integration); err != nil {
+		return nil, err
+	}
+
+	if err := resolvePodTemplate(context.Background(), cmd, o.PodTemplate, &integration.Spec); err != nil {
+		return nil, err
+	}
+
+	if err := o.convertOptionsToTraits(cmd, c, integration); err != nil {
+		return nil, err
+	}
+
+	if err := o.applyDependencies(cmd, c, integration, name); err != nil {
+		return nil, err
+	}
+
+	if len(o.Traits) > 0 {
+		catalog := trait.NewCatalog(c)
+		if err := configureTraits(o.Traits, &integration.Spec.Traits, catalog); err != nil {
+			return nil, err
+		}
+	}
+
+	if o.OutputFormat != "" {
+		return nil, showIntegrationOutput(cmd, integration, o.OutputFormat, c.GetScheme())
+	}
+
+	if existing == nil {
+		err = c.Create(o.Context, integration)
+		fmt.Fprintln(cmd.OutOrStdout(), `Integration "`+name+`" created`)
+	} else {
+		err = c.Patch(o.Context, integration, ctrl.MergeFromWithOptions(existing, ctrl.MergeFromWithOptimisticLock{}))
+		fmt.Fprintln(cmd.OutOrStdout(), `Integration "`+name+`" updated`)
+	}
+
+	if err != nil {
+		return nil, err
+	}
+
+	return integration, nil
+}
+
+func showIntegrationOutput(cmd *cobra.Command, integration *v1.Integration, outputFormat string, scheme runtime.ObjectTyper) error {
+	printer := printers.NewTypeSetter(scheme)
+	printer.Delegate = &kubernetes.CLIPrinter{
+		Format: outputFormat,
+	}
+	return printer.PrintObj(integration, cmd.OutOrStdout())
+}
+
+func (o *runCmdOptions) getIntegration(cmd *cobra.Command, c client.Client, namespace, name string) (*v1.Integration, *v1.Integration, error) {
+	it := &v1.Integration{
 		TypeMeta: metav1.TypeMeta{
 			Kind:       v1.IntegrationKind,
 			APIVersion: v1.SchemeGroupVersion.String(),
@@ -515,45 +592,35 @@ func (o *runCmdOptions) createOrUpdateIntegration(cmd *cobra.Command, c client.C
 
 	existing := &v1.Integration{}
 	if !isOfflineCommand(cmd) {
-		err := c.Get(o.Context, ctrl.ObjectKeyFromObject(integration), existing)
+		err := c.Get(o.Context, ctrl.ObjectKeyFromObject(it), existing)
 		switch {
 		case err == nil:
-			integration = existing.DeepCopy()
+			it = existing.DeepCopy()
 		case k8serrors.IsNotFound(err):
 			existing = nil
 		default:
-			return nil, err
+			return nil, nil, err
 		}
 	}
 
-	var integrationKit *corev1.ObjectReference
-	if o.IntegrationKit != "" {
-		integrationKit = &corev1.ObjectReference{
-			Namespace: namespace,
-			Name:      o.IntegrationKit,
-		}
-	}
-
-	integration.Spec = v1.IntegrationSpec{
-		Dependencies:   make([]string, 0, len(o.Dependencies)),
-		IntegrationKit: integrationKit,
-		Configuration:  make([]v1.ConfigurationSpec, 0),
-		Repositories:   o.Repositories,
-		Profile:        v1.TraitProfileByName(o.Profile),
-	}
+	return it, existing, nil
+}
 
+func (o *runCmdOptions) applyLabels(it *v1.Integration) {
 	for _, label := range o.Labels {
 		parts := strings.Split(label, "=")
 		if len(parts) == 2 {
-			if integration.Labels == nil {
-				integration.Labels = make(map[string]string)
+			if it.Labels == nil {
+				it.Labels = make(map[string]string)
 			}
-			integration.Labels[parts[0]] = parts[1]
+			it.Labels[parts[0]] = parts[1]
 		}
 	}
+}
 
-	if integration.Annotations == nil {
-		integration.Annotations = make(map[string]string)
+func (o *runCmdOptions) applyAnnotations(cmd *cobra.Command, c client.Client, it *v1.Integration) error {
+	if it.Annotations == nil {
+		it.Annotations = make(map[string]string)
 	}
 
 	if o.OperatorID != "" {
@@ -561,39 +628,43 @@ func (o *runCmdOptions) createOrUpdateIntegration(cmd *cobra.Command, c client.C
 			if o.Force {
 				o.PrintfVerboseErrf(cmd, "%s, use --force option or make sure to use a proper operator id", err.Error())
 			} else {
-				return nil, err
+				return err
 			}
 		}
 	}
 
 	// --operator-id={id} is a syntax sugar for '--annotation camel.apache.org/operator.id={id}'
-	integration.SetOperatorID(strings.TrimSpace(o.OperatorID))
+	it.SetOperatorID(strings.TrimSpace(o.OperatorID))
 
 	for _, annotation := range o.Annotations {
 		parts := strings.SplitN(annotation, "=", 2)
 		if len(parts) == 2 {
-			integration.Annotations[parts[0]] = parts[1]
+			it.Annotations[parts[0]] = parts[1]
 		}
 	}
 
+	return nil
+}
+
+func (o *runCmdOptions) resolveSources(cmd *cobra.Command, sources []string, it *v1.Integration) error {
 	srcs := make([]string, 0, len(sources)+len(o.Sources))
 	srcs = append(srcs, sources...)
 	srcs = append(srcs, o.Sources...)
 
 	resolvedSources, err := source.Resolve(context.Background(), srcs, o.Compression, cmd)
 	if err != nil {
-		return nil, err
+		return err
 	}
 
 	for _, source := range resolvedSources {
-		if o.UseFlows && !o.Compression && (strings.HasSuffix(source.Name, ".yaml") || strings.HasSuffix(source.Name, ".yml")) {
+		if o.UseFlows && !o.Compression && source.IsYaml() {
 			flows, err := dsl.FromYamlDSLString(source.Content)
 			if err != nil {
-				return nil, err
+				return err
 			}
-			integration.Spec.AddFlows(flows...)
+			it.Spec.AddFlows(flows...)
 		} else {
-			integration.Spec.AddSources(v1.SourceSpec{
+			it.Spec.AddSources(v1.SourceSpec{
 				DataSpec: v1.DataSpec{
 					Name:        source.Name,
 					Content:     source.Content,
@@ -603,83 +674,32 @@ func (o *runCmdOptions) createOrUpdateIntegration(cmd *cobra.Command, c client.C
 		}
 	}
 
-	err = resolvePodTemplate(context.Background(), cmd, o.PodTemplate, &integration.Spec)
-	if err != nil {
-		return nil, err
-	}
+	return nil
+}
 
-	err = o.parseAndConvertToTrait(cmd, c, integration, o.Resources, resource.ParseResource, func(c *resource.Config) string { return c.String() }, "mount.resources")
-	if err != nil {
-		return nil, err
-	}
-	err = o.parseAndConvertToTrait(cmd, c, integration, o.Configs, resource.ParseConfig, func(c *resource.Config) string { return c.String() }, "mount.configs")
-	if err != nil {
-		return nil, err
+func (o *runCmdOptions) convertOptionsToTraits(cmd *cobra.Command, c client.Client, it *v1.Integration) error {
+	if err := o.parseAndConvertToTrait(cmd, c, it, o.Resources, resource.ParseResource,
+		func(c *resource.Config) string { return c.String() },
+		"mount.resources"); err != nil {
+		return err
 	}
-	err = o.parseAndConvertToTrait(cmd, c, integration, o.OpenAPIs, resource.ParseConfig, func(c *resource.Config) string { return c.Name() }, "openapi.configmaps")
-	if err != nil {
-		return nil, err
+	if err := o.parseAndConvertToTrait(cmd, c, it, o.Configs, resource.ParseConfig,
+		func(c *resource.Config) string { return c.String() },
+		"mount.configs"); err != nil {
+		return err
 	}
-
-	var platform *v1.IntegrationPlatform
-	for _, item := range o.Dependencies {
-		// TODO: accept URLs
-		if strings.HasPrefix(item, "file://") {
-			if platform == nil {
-				// let's also enable the registry trait if not explicitly disabled
-				if !contains(o.Traits, "registry.enabled=false") {
-					o.Traits = append(o.Traits, "registry.enabled=true")
-				}
-				platform, err = platformutil.GetOrFindForResource(o.Context, c, integration, true)
-				if err != nil {
-					return nil, err
-				}
-				ca := platform.Status.Build.Registry.CA
-				if ca != "" {
-					o.PrintfVerboseOutf(cmd, "We've noticed the image registry is configured with a custom certificate [%s] \n", ca)
-					o.PrintVerboseOut(cmd, "Please make sure Kamel CLI is configured to use it or the operation will fail.")
-					o.PrintVerboseOut(cmd, "More information can be found here https://nodejs.org/api/cli.html#cli_node_extra_ca_certs_file")
-				}
-				secret := platform.Status.Build.Registry.Secret
-				if secret != "" {
-					o.PrintfVerboseOutf(cmd, "We've noticed the image registry is configured with a Secret [%s] \n", secret)
-					o.PrintVerboseOut(cmd, "Please configure Docker authentication correctly or the operation will fail (by default it's $HOME/.docker/config.json).")
-					o.PrintVerboseOut(cmd, "More information can be found here https://docs.docker.com/engine/reference/commandline/login/")
-				}
-			}
-			if err := o.uploadFileOrDirectory(platform, item, name, cmd, integration); err != nil {
-				return nil, errors.Wrap(err, fmt.Sprintf("Error trying to upload %s to the Image Registry.", item))
-			}
-		} else {
-			integration.Spec.AddDependency(item)
-		}
+	if err := o.parseAndConvertToTrait(cmd, c, it, o.OpenAPIs, resource.ParseConfig,
+		func(c *resource.Config) string { return c.Name() },
+		"openapi.configmaps"); err != nil {
+		return err
 	}
 
-	props, err := mergePropertiesWithPrecedence(o.Properties)
-	if err != nil {
-		return nil, err
-	}
-	for _, key := range props.Keys() {
-		kv := fmt.Sprintf("%s=%s", key, props.GetString(key, ""))
-		propsTraits, err := convertToTraitParameter(kv, "camel.properties")
-		if err != nil {
-			return nil, err
-		}
-		o.Traits = append(o.Traits, propsTraits...)
+	if err := o.applyProperties(); err != nil {
+		return err
 	}
 
-	// convert each build configuration to a builder trait property
-	buildProps, err := mergePropertiesWithPrecedence(o.BuildProperties)
-	if err != nil {
-		return nil, err
-	}
-	for _, key := range buildProps.Keys() {
-		kv := fmt.Sprintf("%s=%s", key, buildProps.GetString(key, ""))
-		buildPropsTraits, err := convertToTraitParameter(kv, "builder.properties")
-		if err != nil {
-			return nil, err
-		}
-		o.Traits = append(o.Traits, buildPropsTraits...)
+	if err := o.applyBuildProperties(); err != nil {
+		return err
 	}
 
 	for _, item := range o.Volumes {
@@ -691,38 +711,8 @@ func (o *runCmdOptions) createOrUpdateIntegration(cmd *cobra.Command, c client.C
 	for _, item := range o.Connects {
 		o.Traits = append(o.Traits, fmt.Sprintf("service-binding.services=%s", item))
 	}
-	if len(o.Traits) > 0 {
-		catalog := trait.NewCatalog(c)
-		if err := configureTraits(o.Traits, &integration.Spec.Traits, catalog); err != nil {
-			return nil, err
-		}
-	}
-
-	if o.OutputFormat != "" {
-		return nil, showIntegrationOutput(cmd, integration, o.OutputFormat, c.GetScheme())
-	}
-
-	if existing == nil {
-		err = c.Create(o.Context, integration)
-		fmt.Fprintln(cmd.OutOrStdout(), `Integration "`+name+`" created`)
-	} else {
-		err = c.Patch(o.Context, integration, ctrl.MergeFromWithOptions(existing, ctrl.MergeFromWithOptimisticLock{}))
-		fmt.Fprintln(cmd.OutOrStdout(), `Integration "`+name+`" updated`)
-	}
-
-	if err != nil {
-		return nil, err
-	}
 
-	return integration, nil
-}
-
-func showIntegrationOutput(cmd *cobra.Command, integration *v1.Integration, outputFormat string, scheme runtime.ObjectTyper) error {
-	printer := printers.NewTypeSetter(scheme)
-	printer.Delegate = &kubernetes.CLIPrinter{
-		Format: outputFormat,
-	}
-	return printer.PrintObj(integration, cmd.OutOrStdout())
+	return nil
 }
 
 func (o *runCmdOptions) parseAndConvertToTrait(cmd *cobra.Command,
@@ -736,8 +726,7 @@ func (o *runCmdOptions) parseAndConvertToTrait(cmd *cobra.Command,
 			return err
 		}
 		// We try to autogenerate a configmap
-		_, err = parseConfigAndGenCm(o.Context, cmd, c, config, integration, o.Compression)
-		if err != nil {
+		if _, err := parseConfigAndGenCm(o.Context, cmd, c, config, integration, o.Compression); err != nil {
 			return err
 		}
 		o.Traits = append(o.Traits, convertToTrait(convert(config), traitParam))
@@ -749,6 +738,41 @@ func convertToTrait(value, traitParameter string) string {
 	return fmt.Sprintf("%s=%s", traitParameter, value)
 }
 
+func (o *runCmdOptions) applyProperties() error {
+	props, err := mergePropertiesWithPrecedence(o.Properties)
+	if err != nil {
+		return err
+	}
+	for _, key := range props.Keys() {
+		kv := fmt.Sprintf("%s=%s", key, props.GetString(key, ""))
+		propsTraits, err := convertToTraitParameter(kv, "camel.properties")
+		if err != nil {
+			return err
+		}
+		o.Traits = append(o.Traits, propsTraits...)
+	}
+
+	return nil
+}
+
+func (o *runCmdOptions) applyBuildProperties() error {
+	// convert each build configuration to a builder trait property
+	buildProps, err := mergePropertiesWithPrecedence(o.BuildProperties)
+	if err != nil {
+		return err
+	}
+	for _, key := range buildProps.Keys() {
+		kv := fmt.Sprintf("%s=%s", key, buildProps.GetString(key, ""))
+		buildPropsTraits, err := convertToTraitParameter(kv, "builder.properties")
+		if err != nil {
+			return err
+		}
+		o.Traits = append(o.Traits, buildPropsTraits...)
+	}
+
+	return nil
+}
+
 func convertToTraitParameter(value, traitParameter string) ([]string, error) {
 	traits := make([]string, 0)
 	props, err := extractProperties(value)
@@ -771,6 +795,52 @@ func convertToTraitParameter(value, traitParameter string) ([]string, error) {
 	return traits, nil
 }
 
+func (o *runCmdOptions) applyDependencies(cmd *cobra.Command, c client.Client, it *v1.Integration, name string) error {
+	var platform *v1.IntegrationPlatform
+	for _, item := range o.Dependencies {
+		// TODO: accept URLs
+		if strings.HasPrefix(item, "file://") {
+			if platform == nil {
+				var err error
+				platform, err = o.getPlatform(cmd, c, it)
+				if err != nil {
+					return err
+				}
+			}
+			if err := o.uploadFileOrDirectory(platform, item, name, cmd, it); err != nil {
+				return errors.Wrap(err, fmt.Sprintf("Error trying to upload %s to the Image Registry.", item))
+			}
+		} else {
+			it.Spec.AddDependency(item)
+		}
+	}
+
+	return nil
+}
+
+func (o *runCmdOptions) getPlatform(cmd *cobra.Command, c client.Client, it *v1.Integration) (*v1.IntegrationPlatform, error) {
+	// let's also enable the registry trait if not explicitly disabled
+	if !contains(o.Traits, "registry.enabled=false") {
+		o.Traits = append(o.Traits, "registry.enabled=true")
+	}
+	pl, err := platform.GetOrFindForResource(o.Context, c, it, true)
+	if err != nil {
+		return nil, err
+	}
+	if ca := pl.Status.Build.Registry.CA; ca != "" {
+		o.PrintfVerboseOutf(cmd, "We've noticed the image registry is configured with a custom certificate [%s] \n", ca)
+		o.PrintVerboseOut(cmd, "Please make sure Kamel CLI is configured to use it or the operation will fail.")
+		o.PrintVerboseOut(cmd, "More information can be found here https://nodejs.org/api/cli.html#cli_node_extra_ca_certs_file")
+	}
+	if secret := pl.Status.Build.Registry.Secret; secret != "" {
+		o.PrintfVerboseOutf(cmd, "We've noticed the image registry is configured with a Secret [%s] \n", secret)
+		o.PrintVerboseOut(cmd, "Please configure Docker authentication correctly or the operation will fail (by default it's $HOME/.docker/config.json).")
+		o.PrintVerboseOut(cmd, "More information can be found here https://docs.docker.com/engine/reference/commandline/login/")
+	}
+
+	return pl, nil
+}
+
 func (o *runCmdOptions) GetIntegrationName(sources []string) string {
 	name := ""
 	if o.IntegrationName != "" {
diff --git a/pkg/cmd/source/source.go b/pkg/cmd/source/source.go
index 7af7f3600..4daeb89c2 100644
--- a/pkg/cmd/source/source.go
+++ b/pkg/cmd/source/source.go
@@ -85,6 +85,10 @@ func (s *Source) setContent(content []byte) error {
 	return nil
 }
 
+func (s Source) IsYaml() bool {
+	return strings.HasSuffix(s.Name, ".yaml") || strings.HasSuffix(s.Name, ".yml")
+}
+
 // Resolve resolves sources from a variety of locations including local and remote.
 func Resolve(ctx context.Context, locations []string, compress bool, cmd *cobra.Command) ([]Source, error) {
 	sources := make([]Source, 0, len(locations))