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
commit 76dec79d1f457d029b6259ae084b4ada0c8c023b Author: Tadayoshi Sato <sato.tadayo...@gmail.com> AuthorDate: Wed Dec 14 18:11:20 2022 +0900 fix(install): refactor install cmd support funcs to remove another maintidx lint --- pkg/install/cluster.go | 246 +++++++++++++++++++++++++++---------------------- 1 file changed, 136 insertions(+), 110 deletions(-) diff --git a/pkg/install/cluster.go b/pkg/install/cluster.go index fd704759a..0af2e0e30 100644 --- a/pkg/install/cluster.go +++ b/pkg/install/cluster.go @@ -39,7 +39,6 @@ import ( "github.com/apache/camel-k/pkg/util/kubernetes" ) -// nolint: maintidx // TODO: refactor the code func SetupClusterWideResourcesOrCollect( ctx context.Context, clientProvider client.Provider, collection *kubernetes.Collection, clusterType string, force bool, @@ -50,110 +49,8 @@ func SetupClusterWideResourcesOrCollect( return err } - isAPIExtensionsV1 := true - if _, err := c.Discovery().ServerResourcesForGroupVersion("apiextensions.k8s.io/v1"); err != nil { - if k8serrors.IsNotFound(err) { - isAPIExtensionsV1 = false - } else { - return err - } - } - - // Convert the CRD to apiextensions.k8s.io/v1beta1 in case v1 is not available. - // This is mainly required to support OpenShift 3, and older versions of Kubernetes. - // It can be removed as soon as these versions are not supported anymore. - if err := apiextensionsv1.AddToScheme(c.GetScheme()); err != nil { - return err - } - if !isAPIExtensionsV1 { - if err := apiextensionsv1beta1.AddToScheme(c.GetScheme()); err != nil { - return err - } - } - downgradeToCRDv1beta1 := func(object ctrl.Object) ctrl.Object { - // Remove default values in v1beta1 Integration and KameletBinding CRDs, - removeDefaultFromCrd := func(crd *apiextensionsv1beta1.CustomResourceDefinition, property string) { - defaultValue := apiextensionsv1beta1.JSONSchemaProps{ - Default: nil, - } - if crd.Name == "integrations.camel.apache.org" { - crd.Spec.Validation.OpenAPIV3Schema. - 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. - Properties["protocol"] = defaultValue - } - } - - if !isAPIExtensionsV1 { - v1Crd, ok := object.(*apiextensionsv1.CustomResourceDefinition) - if !ok { - return nil - } - v1beta1Crd := &apiextensionsv1beta1.CustomResourceDefinition{} - crd := &apiextensions.CustomResourceDefinition{} - - err := apiextensionsv1.Convert_v1_CustomResourceDefinition_To_apiextensions_CustomResourceDefinition(v1Crd, crd, nil) - if err != nil { - return nil - } - - err = apiextensionsv1beta1.Convert_apiextensions_CustomResourceDefinition_To_v1beta1_CustomResourceDefinition(crd, v1beta1Crd, nil) - if err != nil { - return nil - } - - removeDefaultFromCrd(v1beta1Crd, "ephemeralContainers") - removeDefaultFromCrd(v1beta1Crd, "containers") - removeDefaultFromCrd(v1beta1Crd, "initContainers") - - return v1beta1Crd - } - return object - } - - // Install CRD for Integration Platform (if needed) - 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, 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, 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, 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, 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, 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, force); err != nil { + // Install CRDs + if err := installCRDs(ctx, c, collection, force); err != nil { return err } @@ -165,7 +62,14 @@ func SetupClusterWideResourcesOrCollect( } } - // Installing ClusterRoles + // Install ClusterRoles + return installClusterRoles(ctx, c, collection, clusterType) +} + +func installClusterRoles( + ctx context.Context, c client.Client, collection *kubernetes.Collection, clusterType string, +) error { + // ClusterRole: camel-k-edit ok, err := isClusterRoleInstalled(ctx, c, "camel-k-edit") if err != nil { return err @@ -177,6 +81,7 @@ func SetupClusterWideResourcesOrCollect( } } + // ClusterRole: camel-k-operator-custom-resource-definitions ok, err = isClusterRoleInstalled(ctx, c, "camel-k-operator-custom-resource-definitions") if err != nil { return err @@ -188,12 +93,15 @@ func SetupClusterWideResourcesOrCollect( } } + // ClusterRole: camel-k-operator-local-registry ok, err = isClusterRoleInstalled(ctx, c, "camel-k-operator-local-registry") if err == nil && !ok { - // nolint: errcheck - installResource(ctx, c, collection, "/rbac/operator-cluster-role-local-registry.yaml") + // ignore errors + _ = installResource(ctx, c, collection, "/rbac/operator-cluster-role-local-registry.yaml") } + // === For OpenShift === + // ClusterRole: camel-k-operator-console-openshift isOpenShift, err := isOpenShift(c, clusterType) if err != nil { return err @@ -211,6 +119,8 @@ func SetupClusterWideResourcesOrCollect( } } + // === For Knative === + // ClusterRole: camel-k-operator-bind-addressable-resolver isKnative, err := knative.IsInstalled(c) if err != nil { return err @@ -231,6 +141,122 @@ func SetupClusterWideResourcesOrCollect( return nil } +func installCRDs(ctx context.Context, c client.Client, collection *kubernetes.Collection, force bool) error { + isAPIExtensionsV1 := true + if _, err := c.Discovery().ServerResourcesForGroupVersion("apiextensions.k8s.io/v1"); err != nil { + if k8serrors.IsNotFound(err) { + isAPIExtensionsV1 = false + } else { + return err + } + } + + // Convert the CRD to apiextensions.k8s.io/v1beta1 in case v1 is not available. + // This is mainly required to support OpenShift 3, and older versions of Kubernetes. + // It can be removed as soon as these versions are not supported anymore. + if err := apiextensionsv1.AddToScheme(c.GetScheme()); err != nil { + return err + } + if !isAPIExtensionsV1 { + if err := apiextensionsv1beta1.AddToScheme(c.GetScheme()); err != nil { + return err + } + } + v1beta1Customizer := downgradeToCRDv1beta1(isAPIExtensionsV1) + + // Install CRD for Integration Platform (if needed) + if err := installCRD(ctx, c, "IntegrationPlatform", "v1", "camel.apache.org_integrationplatforms.yaml", + v1beta1Customizer, 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", + v1beta1Customizer, collection, force); err != nil { + return err + } + + // Install CRD for Integration (if needed) + if err := installCRD(ctx, c, "Integration", "v1", "camel.apache.org_integrations.yaml", + v1beta1Customizer, 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", + v1beta1Customizer, collection, force); err != nil { + return err + } + + // Install CRD for Build (if needed) + if err := installCRD(ctx, c, "Build", "v1", "camel.apache.org_builds.yaml", + v1beta1Customizer, collection, force); err != nil { + return err + } + + // Install CRD for Kamelet (if needed) + if err := installCRD(ctx, c, "Kamelet", "v1alpha1", "camel.apache.org_kamelets.yaml", + v1beta1Customizer, collection, force); err != nil { + return err + } + + // Install CRD for KameletBinding (if needed) + if err := installCRD(ctx, c, "KameletBinding", "v1alpha1", "camel.apache.org_kameletbindings.yaml", + v1beta1Customizer, collection, force); err != nil { + return err + } + + return nil +} + +func downgradeToCRDv1beta1(isAPIExtensionsV1 bool) ResourceCustomizer { + return func(object ctrl.Object) ctrl.Object { + // Remove default values in v1beta1 Integration and KameletBinding CRDs, + removeDefaultFromCrd := func(crd *apiextensionsv1beta1.CustomResourceDefinition, property string) { + defaultValue := apiextensionsv1beta1.JSONSchemaProps{ + Default: nil, + } + if crd.Name == "integrations.camel.apache.org" { + crd.Spec.Validation.OpenAPIV3Schema. + 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. + Properties["protocol"] = defaultValue + } + } + + if !isAPIExtensionsV1 { + v1Crd, ok := object.(*apiextensionsv1.CustomResourceDefinition) + if !ok { + return nil + } + v1beta1Crd := &apiextensionsv1beta1.CustomResourceDefinition{} + crd := &apiextensions.CustomResourceDefinition{} + + err := apiextensionsv1.Convert_v1_CustomResourceDefinition_To_apiextensions_CustomResourceDefinition(v1Crd, crd, nil) + if err != nil { + return nil + } + + err = apiextensionsv1beta1.Convert_apiextensions_CustomResourceDefinition_To_v1beta1_CustomResourceDefinition(crd, v1beta1Crd, nil) + if err != nil { + return nil + } + + removeDefaultFromCrd(v1beta1Crd, "ephemeralContainers") + removeDefaultFromCrd(v1beta1Crd, "containers") + removeDefaultFromCrd(v1beta1Crd, "initContainers") + + return v1beta1Crd + } + + return object + } +} + func WaitForAllCrdInstallation(ctx context.Context, clientProvider client.Provider, timeout time.Duration) error { deadline := time.Now().Add(timeout) for { @@ -306,7 +332,7 @@ func isCrdInstalled(c client.Client, kind string, version string) (bool, error) func installCRD( ctx context.Context, c client.Client, kind string, version string, resourceName string, - converter ResourceCustomizer, collection *kubernetes.Collection, force bool, + customizer ResourceCustomizer, collection *kubernetes.Collection, force bool, ) error { content, err := resources.ResourceAsString("/crd/bases/" + resourceName) if err != nil { @@ -318,7 +344,7 @@ func installCRD( return err } - crd = converter(crd) + crd = customizer(crd) if crd == nil { // The conversion has failed return errors.New("cannot convert " + resourceName + " CRD to apiextensions.k8s.io/v1beta1")