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))