You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pc...@apache.org on 2023/04/03 07:19:44 UTC
[camel-k] branch main updated: fix(cmd): rebuild KameletBindings
This is an automated email from the ASF dual-hosted git repository.
pcongiusti 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 c427f8d11 fix(cmd): rebuild KameletBindings
c427f8d11 is described below
commit c427f8d11efbabb4121e0efa8d097d5921b6a078
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Fri Mar 31 14:32:23 2023 +0200
fix(cmd): rebuild KameletBindings
Closes #4208
---
pkg/cmd/rebuild.go | 92 +++++++++++++++++++++++++++++++++++++++++++++++--
pkg/cmd/rebuild_test.go | 82 ++++++++++++++++++++++++++++++++++++-------
2 files changed, 160 insertions(+), 14 deletions(-)
diff --git a/pkg/cmd/rebuild.go b/pkg/cmd/rebuild.go
index 35f59677c..9cd7983b4 100644
--- a/pkg/cmd/rebuild.go
+++ b/pkg/cmd/rebuild.go
@@ -22,11 +22,15 @@ import (
"github.com/pkg/errors"
"github.com/spf13/cobra"
+ "k8s.io/apimachinery/pkg/labels"
+ "k8s.io/apimachinery/pkg/selection"
k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+ "github.com/apache/camel-k/v2/pkg/apis/camel/v1alpha1"
"github.com/apache/camel-k/v2/pkg/client"
+ "github.com/apache/camel-k/v2/pkg/util/kubernetes"
)
func newCmdRebuild(rootCmdOptions *RootCmdOptions) (*cobra.Command, *rebuildCmdOptions) {
@@ -68,11 +72,80 @@ func (o *rebuildCmdOptions) validate(args []string) error {
}
func (o *rebuildCmdOptions) run(cmd *cobra.Command, args []string) error {
+ errKlbs := o.rebuildKameletBindingType(cmd, args)
+ errIts := o.rebuildIntegrationType(cmd, args)
+
+ if errIts != nil && errKlbs != nil {
+ return errors.Wrap(errIts, errKlbs.Error())
+ }
+
+ return nil
+}
+
+func (o *rebuildCmdOptions) rebuildKameletBindingType(cmd *cobra.Command, args []string) error {
c, err := o.GetCmdClient()
if err != nil {
return err
}
+ var kameletBindings []v1alpha1.KameletBinding
+ if o.RebuildAll {
+ if kameletBindings, err = o.listAllKameletBindings(c); err != nil {
+ return err
+ }
+ } else if len(args) > 0 {
+ if kameletBindings, err = o.getKameletBindings(c, args); err != nil {
+ return err
+ }
+ }
+
+ if err = o.rebuildKameletBindings(c, kameletBindings); err != nil {
+ return err
+ }
+
+ fmt.Fprintln(cmd.OutOrStdout(), len(kameletBindings), "kamelet bindings have been rebuilt")
+ return nil
+}
+
+func (o *rebuildCmdOptions) listAllKameletBindings(c client.Client) ([]v1alpha1.KameletBinding, error) {
+ list := v1alpha1.NewKameletBindingList()
+ if err := c.List(o.Context, &list, k8sclient.InNamespace(o.Namespace)); err != nil {
+ return nil, errors.Wrap(err, fmt.Sprintf("could not retrieve kamelet bindings from namespace %s", o.Namespace))
+ }
+ return list.Items, nil
+}
+func (o *rebuildCmdOptions) getKameletBindings(c client.Client, names []string) ([]v1alpha1.KameletBinding, error) {
+ klbs := make([]v1alpha1.KameletBinding, 0, len(names))
+ for _, n := range names {
+ klb := v1alpha1.NewKameletBinding(o.Namespace, n)
+ key := k8sclient.ObjectKey{
+ Name: n,
+ Namespace: o.Namespace,
+ }
+ if err := c.Get(o.Context, key, &klb); err != nil {
+ return nil, errors.Wrap(err, fmt.Sprintf("could not find kamelet binding %s in namespace %s", klb.Name, o.Namespace))
+ }
+ klbs = append(klbs, klb)
+ }
+ return klbs, nil
+}
+
+func (o *rebuildCmdOptions) rebuildKameletBindings(c k8sclient.StatusClient, kameletbindings []v1alpha1.KameletBinding) error {
+ for _, i := range kameletbindings {
+ klb := i
+ klb.Status = v1alpha1.KameletBindingStatus{}
+ if err := c.Status().Update(o.Context, &klb); err != nil {
+ return errors.Wrap(err, fmt.Sprintf("could not rebuild kamelet binding %s in namespace %s", klb.Name, o.Namespace))
+ }
+ }
+ return nil
+}
+
+func (o *rebuildCmdOptions) rebuildIntegrationType(cmd *cobra.Command, args []string) error {
+ c, err := o.GetCmdClient()
+ if err != nil {
+ return err
+ }
var integrations []v1.Integration
if o.RebuildAll {
if integrations, err = o.listAllIntegrations(c); err != nil {
@@ -94,7 +167,19 @@ func (o *rebuildCmdOptions) run(cmd *cobra.Command, args []string) error {
func (o *rebuildCmdOptions) listAllIntegrations(c client.Client) ([]v1.Integration, error) {
list := v1.NewIntegrationList()
- if err := c.List(o.Context, &list, k8sclient.InNamespace(o.Namespace)); err != nil {
+ // Integrations controlled by KameletBindings are not included
+ excludeItsFromKlbs, err := labels.NewRequirement(kubernetes.CamelCreatorLabelKind, selection.NotEquals, []string{
+ "KameletBinding",
+ })
+ if err != nil {
+ return list.Items, err
+ }
+ if err := c.List(o.Context, &list,
+ k8sclient.InNamespace(o.Namespace),
+ k8sclient.MatchingLabelsSelector{
+ Selector: labels.NewSelector().Add(*excludeItsFromKlbs),
+ },
+ ); err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("could not retrieve integrations from namespace %s", o.Namespace))
}
return list.Items, nil
@@ -111,7 +196,10 @@ func (o *rebuildCmdOptions) getIntegrations(c client.Client, names []string) ([]
if err := c.Get(o.Context, key, &it); err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("could not find integration %s in namespace %s", it.Name, o.Namespace))
}
- ints = append(ints, it)
+ // Integrations controlled by KameletBindings are not included
+ if it.Labels[kubernetes.CamelCreatorLabelKind] != "KameletBinding" {
+ ints = append(ints, it)
+ }
}
return ints, nil
}
diff --git a/pkg/cmd/rebuild_test.go b/pkg/cmd/rebuild_test.go
index 021c1cf6b..936a5d2ad 100644
--- a/pkg/cmd/rebuild_test.go
+++ b/pkg/cmd/rebuild_test.go
@@ -20,18 +20,22 @@ package cmd
import (
"testing"
+ "github.com/apache/camel-k/v2/pkg/util/kubernetes"
"github.com/apache/camel-k/v2/pkg/util/test"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
+ "k8s.io/apimachinery/pkg/runtime"
)
const cmdRebuild = "rebuild"
// nolint: unparam
-func initializeRebuildCmdOptions(t *testing.T) (*rebuildCmdOptions, *cobra.Command, RootCmdOptions) {
+func initializeRebuildOptions(t *testing.T, initObjs ...runtime.Object) (*rebuildCmdOptions, *cobra.Command, RootCmdOptions) {
t.Helper()
-
- options, rootCmd := kamelTestPreAddCommandInit()
+ fakeClient, err := test.NewFakeClient(initObjs...)
+ assert.Nil(t, err)
+ options, rootCmd := kamelTestPreAddCommandInitWithClient(fakeClient)
+ options.Namespace = "default"
rebuildCmdOptions := addTestRebuildCmd(*options, rootCmd)
kamelTestPostAddCommandInit(t, rootCmd)
@@ -39,28 +43,82 @@ func initializeRebuildCmdOptions(t *testing.T) (*rebuildCmdOptions, *cobra.Comma
}
func addTestRebuildCmd(options RootCmdOptions, rootCmd *cobra.Command) *rebuildCmdOptions {
- // add a testing version of rebuild Command
rebuildCmd, rebuildOptions := newCmdRebuild(&options)
- rebuildCmd.RunE = func(c *cobra.Command, args []string) error {
- return nil
- }
- rebuildCmd.PostRunE = func(c *cobra.Command, args []string) error {
- return nil
- }
rebuildCmd.Args = test.ArbitraryArgs
rootCmd.AddCommand(rebuildCmd)
return rebuildOptions
}
func TestRebuildNonExistingFlag(t *testing.T) {
- _, rootCmd, _ := initializeRebuildCmdOptions(t)
+ _, rootCmd, _ := initializeRebuildOptions(t)
_, err := test.ExecuteCommand(rootCmd, cmdRebuild, "--nonExistingFlag")
assert.NotNil(t, err)
}
func TestRebuildAllFlag(t *testing.T) {
- rebuildCmdOptions, rootCmd, _ := initializeRebuildCmdOptions(t)
+ rebuildCmdOptions, rootCmd, _ := initializeRebuildOptions(t)
_, err := test.ExecuteCommand(rootCmd, cmdRebuild, "--all")
assert.Nil(t, err)
assert.Equal(t, true, rebuildCmdOptions.RebuildAll)
}
+
+func TestRebuildAllKameletBindingsAndIntegrations(t *testing.T) {
+ defaultIntegration := nominalIntegration("my-it-test")
+ defaultKB := nominalKameletBinding("my-kb-test")
+ itGeneratedByKlb := nominalIntegration("my-kb-test")
+ itGeneratedByKlb.Labels = map[string]string{
+ kubernetes.CamelCreatorLabelKind: "KameletBinding",
+ }
+
+ _, rebuildCmd, _ := initializeRebuildOptions(t, &defaultIntegration, &defaultKB, &itGeneratedByKlb)
+ output, err := test.ExecuteCommand(rebuildCmd, cmdRebuild, "--all")
+ assert.Nil(t, err)
+ assert.Contains(t, output, "1 kamelet bindings have been rebuilt")
+ assert.Contains(t, output, "1 integrations have been rebuilt")
+}
+
+func TestRebuildNone(t *testing.T) {
+ defaultIntegration := nominalIntegration("my-it-test")
+ defaultKB := nominalKameletBinding("my-kb-test")
+ itGeneratedByKlb := nominalIntegration("my-kb-test")
+ itGeneratedByKlb.Labels = map[string]string{
+ kubernetes.CamelCreatorLabelKind: "KameletBinding",
+ }
+
+ _, rebuildCmd, _ := initializeRebuildOptions(t, &defaultIntegration, &defaultKB, &itGeneratedByKlb)
+ output, err := test.ExecuteCommand(rebuildCmd, cmdRebuild, "my-missing")
+ assert.NotNil(t, err)
+ assert.NotContains(t, output, "have been rebuilt")
+ assert.Contains(t, output, "could not find kamelet binding my-missing in namespace default")
+ assert.Contains(t, output, "could not find integration my-missing in namespace default")
+}
+
+func TestRebuildKameletBindingOnly(t *testing.T) {
+ defaultIntegration := nominalIntegration("my-it-test")
+ defaultKB := nominalKameletBinding("my-kb-test")
+ itGeneratedByKlb := nominalIntegration("my-kb-test")
+ itGeneratedByKlb.Labels = map[string]string{
+ kubernetes.CamelCreatorLabelKind: "KameletBinding",
+ }
+
+ _, rebuildCmd, _ := initializeRebuildOptions(t, &defaultIntegration, &defaultKB, &itGeneratedByKlb)
+ output, err := test.ExecuteCommand(rebuildCmd, cmdRebuild, "my-kb-test")
+ assert.Nil(t, err)
+ assert.Contains(t, output, "1 kamelet bindings have been rebuilt")
+ assert.NotContains(t, output, "1 integrations have been rebuilt")
+}
+
+func TestRebuildIntegrationOnly(t *testing.T) {
+ defaultIntegration := nominalIntegration("my-it-test")
+ defaultKB := nominalKameletBinding("my-kb-test")
+ itGeneratedByKlb := nominalIntegration("my-kb-test")
+ itGeneratedByKlb.Labels = map[string]string{
+ kubernetes.CamelCreatorLabelKind: "KameletBinding",
+ }
+
+ _, rebuildCmd, _ := initializeRebuildOptions(t, &defaultIntegration, &defaultKB, &itGeneratedByKlb)
+ output, err := test.ExecuteCommand(rebuildCmd, cmdRebuild, "my-it-test")
+ assert.Nil(t, err)
+ assert.NotContains(t, output, "1 kamelet bindings have been rebuilt")
+ assert.Contains(t, output, "1 integrations have been rebuilt")
+}