This is an automated email from the ASF dual-hosted git repository.
astefanutti 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 7c28b9a chore(cli): Update CRDs when force installing cluster
resources
7c28b9a is described below
commit 7c28b9a0f54a2c093ba1e56c13fef150ef664942
Author: Antonin Stefanutti <[email protected]>
AuthorDate: Mon May 17 13:45:49 2021 +0200
chore(cli): Update CRDs when force installing cluster resources
---
pkg/cmd/install.go | 4 +--
pkg/install/cluster.go | 69 +++++++++++++++++++++-----------------------------
2 files changed, 31 insertions(+), 42 deletions(-)
diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go
index 73c501b..9ae96d4 100644
--- a/pkg/cmd/install.go
+++ b/pkg/cmd/install.go
@@ -233,14 +233,14 @@ func (o *installCmdOptions) install(cobraCmd
*cobra.Command, _ []string) error {
fmt.Fprintln(cobraCmd.OutOrStdout(), "OLM
resources are already available: skipping installation")
}
- if err = install.WaitForAllCRDInstallation(o.Context,
clientProvider, 90*time.Second); err != nil {
+ if err = install.WaitForAllCrdInstallation(o.Context,
clientProvider, 90*time.Second); err != nil {
return err
}
}
}
if !o.SkipClusterSetup && !installViaOLM {
- err := install.SetupClusterWideResourcesOrCollect(o.Context,
clientProvider, collection, o.ClusterType)
+ err := install.SetupClusterWideResourcesOrCollect(o.Context,
clientProvider, collection, o.ClusterType, o.Force)
if err != nil && k8serrors.IsForbidden(err) {
fmt.Fprintln(cobraCmd.OutOrStdout(), "Current user is
not authorized to create cluster-wide objects like custom resource definitions
or cluster roles: ", err)
diff --git a/pkg/install/cluster.go b/pkg/install/cluster.go
index 8ef60b8..30b26a7 100644
--- a/pkg/install/cluster.go
+++ b/pkg/install/cluster.go
@@ -38,8 +38,7 @@ import (
"github.com/apache/camel-k/pkg/util/kubernetes"
)
-// SetupClusterWideResourcesOrCollect --
-func SetupClusterWideResourcesOrCollect(ctx context.Context, clientProvider
client.Provider, collection *kubernetes.Collection, clusterType string) error {
+func SetupClusterWideResourcesOrCollect(ctx context.Context, clientProvider
client.Provider, collection *kubernetes.Collection, clusterType string, force
bool) error {
// Get a client to install the CRD
c, err := clientProvider.Get()
if err != nil {
@@ -68,8 +67,8 @@ func SetupClusterWideResourcesOrCollect(ctx context.Context,
clientProvider clie
}
}
downgradeToCRDv1beta1 := func(object ctrl.Object) ctrl.Object {
- //Deletes not allowed default values in v1beta1 integrations
and kameletbidnings crd,
- removeDefaultProtocolFromCRD := func(crd
*apiextensionsv1beta1.CustomResourceDefinition, property string) {
+ // Remove default values in v1beta1 Integration and
KameletBinding CRDs,
+ removeDefaultFromCrd := func(crd
*apiextensionsv1beta1.CustomResourceDefinition, property string) {
defaultValue := apiextensionsv1beta1.JSONSchemaProps{
Default: nil,
}
@@ -78,7 +77,6 @@ func SetupClusterWideResourcesOrCollect(ctx context.Context,
clientProvider clie
Properties["spec"].Properties["template"].Properties["spec"].Properties[property].Items.Schema.
Properties["ports"].Items.Schema.Properties["protocol"] = defaultValue
}
-
if crd.Name == "kameletbindings.camel.apache.org" {
crd.Spec.Validation.OpenAPIV3Schema.Properties["spec"].Properties["integration"].Properties["template"].
Properties["spec"].Properties[property].Items.Schema.Properties["ports"].Items.Schema.
@@ -101,9 +99,9 @@ func SetupClusterWideResourcesOrCollect(ctx context.Context,
clientProvider clie
return nil
}
- removeDefaultProtocolFromCRD(v1beta1Crd,
"ephemeralContainers")
- removeDefaultProtocolFromCRD(v1beta1Crd, "containers")
- removeDefaultProtocolFromCRD(v1beta1Crd,
"initContainers")
+ removeDefaultFromCrd(v1beta1Crd, "ephemeralContainers")
+ removeDefaultFromCrd(v1beta1Crd, "containers")
+ removeDefaultFromCrd(v1beta1Crd, "initContainers")
return v1beta1Crd
}
@@ -111,44 +109,44 @@ func SetupClusterWideResourcesOrCollect(ctx
context.Context, clientProvider clie
}
// Install CRD for Integration Platform (if needed)
- if err := installCRD(ctx, c, "IntegrationPlatform", "v1",
"camel.apache.org_integrationplatforms.yaml", downgradeToCRDv1beta1,
collection); err != nil {
+ if err := installCRD(ctx, c, "IntegrationPlatform", "v1",
"camel.apache.org_integrationplatforms.yaml", downgradeToCRDv1beta1,
collection, force); err != nil {
return err
}
// Install CRD for Integration Kit (if needed)
- if err := installCRD(ctx, c, "IntegrationKit", "v1",
"camel.apache.org_integrationkits.yaml", downgradeToCRDv1beta1, collection);
err != nil {
+ if err := installCRD(ctx, c, "IntegrationKit", "v1",
"camel.apache.org_integrationkits.yaml", downgradeToCRDv1beta1, collection,
force); err != nil {
return err
}
// Install CRD for Integration (if needed)
- if err := installCRD(ctx, c, "Integration", "v1",
"camel.apache.org_integrations.yaml", downgradeToCRDv1beta1, collection); err
!= nil {
+ if err := installCRD(ctx, c, "Integration", "v1",
"camel.apache.org_integrations.yaml", downgradeToCRDv1beta1, collection,
force); err != nil {
return err
}
// Install CRD for Camel Catalog (if needed)
- if err := installCRD(ctx, c, "CamelCatalog", "v1",
"camel.apache.org_camelcatalogs.yaml", downgradeToCRDv1beta1, collection); err
!= nil {
+ if err := installCRD(ctx, c, "CamelCatalog", "v1",
"camel.apache.org_camelcatalogs.yaml", downgradeToCRDv1beta1, collection,
force); err != nil {
return err
}
// Install CRD for Build (if needed)
- if err := installCRD(ctx, c, "Build", "v1",
"camel.apache.org_builds.yaml", downgradeToCRDv1beta1, collection); err != nil {
+ if err := installCRD(ctx, c, "Build", "v1",
"camel.apache.org_builds.yaml", downgradeToCRDv1beta1, collection, force); err
!= nil {
return err
}
// Install CRD for Kamelet (if needed)
- if err := installCRD(ctx, c, "Kamelet", "v1alpha1",
"camel.apache.org_kamelets.yaml", downgradeToCRDv1beta1, collection); err !=
nil {
+ if err := installCRD(ctx, c, "Kamelet", "v1alpha1",
"camel.apache.org_kamelets.yaml", downgradeToCRDv1beta1, collection, force);
err != nil {
return err
}
// Install CRD for KameletBinding (if needed)
- if err := installCRD(ctx, c, "KameletBinding", "v1alpha1",
"camel.apache.org_kameletbindings.yaml", downgradeToCRDv1beta1, collection);
err != nil {
+ if err := installCRD(ctx, c, "KameletBinding", "v1alpha1",
"camel.apache.org_kameletbindings.yaml", downgradeToCRDv1beta1, collection,
force); err != nil {
return err
}
// Don't wait if we're just collecting resources
if collection == nil {
// Wait for all CRDs to be installed before proceeding
- if err := WaitForAllCRDInstallation(ctx, clientProvider,
25*time.Second); err != nil {
+ if err := WaitForAllCrdInstallation(ctx, clientProvider,
25*time.Second); err != nil {
return err
}
}
@@ -185,8 +183,7 @@ func SetupClusterWideResourcesOrCollect(ctx
context.Context, clientProvider clie
return nil
}
-// WaitForAllCRDInstallation waits until all CRDs are installed
-func WaitForAllCRDInstallation(ctx context.Context, clientProvider
client.Provider, timeout time.Duration) error {
+func WaitForAllCrdInstallation(ctx context.Context, clientProvider
client.Provider, timeout time.Duration) error {
deadline := time.Now().Add(timeout)
for {
var c client.Client
@@ -195,7 +192,7 @@ func WaitForAllCRDInstallation(ctx context.Context,
clientProvider client.Provid
return err
}
var inst bool
- if inst, err = AreAllCRDInstalled(ctx, c); err != nil {
+ if inst, err = areAllCrdInstalled(ctx, c); err != nil {
return err
} else if inst {
return nil
@@ -208,43 +205,41 @@ func WaitForAllCRDInstallation(ctx context.Context,
clientProvider client.Provid
}
}
-// AreAllCRDInstalled check if all the required CRDs are installed
-func AreAllCRDInstalled(ctx context.Context, c client.Client) (bool, error) {
- if ok, err := IsCRDInstalled(ctx, c, "IntegrationPlatform", "v1"); err
!= nil {
+func areAllCrdInstalled(ctx context.Context, c client.Client) (bool, error) {
+ if ok, err := isCrdInstalled(ctx, c, "IntegrationPlatform", "v1"); err
!= nil {
return ok, err
} else if !ok {
return false, nil
}
- if ok, err := IsCRDInstalled(ctx, c, "IntegrationKit", "v1"); err !=
nil {
+ if ok, err := isCrdInstalled(ctx, c, "IntegrationKit", "v1"); err !=
nil {
return ok, err
} else if !ok {
return false, nil
}
- if ok, err := IsCRDInstalled(ctx, c, "Integration", "v1"); err != nil {
+ if ok, err := isCrdInstalled(ctx, c, "Integration", "v1"); err != nil {
return ok, err
} else if !ok {
return false, nil
}
- if ok, err := IsCRDInstalled(ctx, c, "CamelCatalog", "v1"); err != nil {
+ if ok, err := isCrdInstalled(ctx, c, "CamelCatalog", "v1"); err != nil {
return ok, err
} else if !ok {
return false, nil
}
- if ok, err := IsCRDInstalled(ctx, c, "Build", "v1"); err != nil {
+ if ok, err := isCrdInstalled(ctx, c, "Build", "v1"); err != nil {
return ok, err
} else if !ok {
return false, nil
}
- if ok, err := IsCRDInstalled(ctx, c, "Kamelet", "v1alpha1"); err != nil
{
+ if ok, err := isCrdInstalled(ctx, c, "Kamelet", "v1alpha1"); err != nil
{
return ok, err
} else if !ok {
return false, nil
}
- return IsCRDInstalled(ctx, c, "KameletBinding", "v1alpha1")
+ return isCrdInstalled(ctx, c, "KameletBinding", "v1alpha1")
}
-// IsCRDInstalled check if the given CRD kind is installed
-func IsCRDInstalled(ctx context.Context, c client.Client, kind string, version
string) (bool, error) {
+func isCrdInstalled(ctx context.Context, c client.Client, kind string, version
string) (bool, error) {
lst, err :=
c.Discovery().ServerResourcesForGroupVersion(fmt.Sprintf("camel.apache.org/%s",
version))
if err != nil && k8serrors.IsNotFound(err) {
return false, nil
@@ -259,7 +254,7 @@ func IsCRDInstalled(ctx context.Context, c client.Client,
kind string, version s
return false, nil
}
-func installCRD(ctx context.Context, c client.Client, kind string, version
string, resourceName string, converter ResourceCustomizer, collection
*kubernetes.Collection) error {
+func installCRD(ctx context.Context, c client.Client, kind string, version
string, resourceName string, converter ResourceCustomizer, collection
*kubernetes.Collection, force bool) error {
crd, err := kubernetes.LoadResourceFromYaml(c.GetScheme(),
resources.ResourceAsString("/crd/bases/"+resourceName))
if err != nil {
return err
@@ -276,20 +271,15 @@ func installCRD(ctx context.Context, c client.Client,
kind string, version strin
return nil
}
- installed, err := IsCRDInstalled(ctx, c, kind, version)
+ installed, err := isCrdInstalled(ctx, c, kind, version)
if err != nil {
return err
}
- if installed {
+ if installed && !force {
return nil
}
- err = c.Create(ctx, crd)
- if err != nil && !k8serrors.IsAlreadyExists(err) {
- return err
- }
-
- return nil
+ return kubernetes.ReplaceResource(ctx, c, crd)
}
func isClusterRoleInstalled(ctx context.Context, c client.Client, name string)
(bool, error) {
@@ -320,7 +310,6 @@ func installResource(ctx context.Context, c client.Client,
collection *kubernete
if err != nil {
return err
}
-
if collection != nil {
collection.Add(obj)
return nil