From 1678ed0f5a3a0bde786516a9a4194ff5f91f370b Mon Sep 17 00:00:00 2001 From: David Festal Date: Wed, 17 Jul 2019 20:18:02 +0200 Subject: [PATCH 01/11] Update API Signed-off-by: David Festal --- pkg/apis/org/v1/che_types.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pkg/apis/org/v1/che_types.go b/pkg/apis/org/v1/che_types.go index 356a0fdafa..dece028475 100644 --- a/pkg/apis/org/v1/che_types.go +++ b/pkg/apis/org/v1/che_types.go @@ -13,6 +13,7 @@ package v1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" ) // EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! @@ -52,8 +53,28 @@ type CheClusterSpecServer struct { TlsSupport bool `json:"tlsSupport"` // DevfileRegistryUrl is an endpoint serving sample ready-to-use devfiles. Defaults to https://che-devfile-registry.openshift.io DevfileRegistryUrl string `json:"devfileRegistryUrl"` + // DevfileRegistryImage is image:tag used in Devfile registry deployment + DevfileRegistryImage string `json:"devfileRegistryImage"` + // DevfileRegistryImagePullPolicy is the image pull policy used in Devfile registry deployment + DevfileRegistryImagePullPolicy corev1.PullPolicy `json:"devfileRegistryPullPolicy"` + // DevfileRegistryMemoryLimit is the memory limit used in Devfile registry deployment + DevfileRegistryMemoryLimit string `json:"devfileRegistryMemoryLimit"` + // ExternalDevfileRegistry instructs operator on whether or not to deploy a dedicated Devfile registry server + // By default a dedicated devfile registry server is started. + // But if ExternalDevfileRegistry is `true`, then no such dedicated server will be started by the operator + ExternalDevfileRegistry bool `json:"externalDevfileRegistry"` // PluginRegistryUrl is an endpoint serving plugin definitions. Defaults to https://che-plugin-registry.openshift.io PluginRegistryUrl string `json:"pluginRegistryUrl"` + // PluginRegistryImage is image:tag used in Plugin registry deployment + PluginRegistryImage string `json:"pluginRegistryImage"` + // PluginRegistryImagePullPolicy is the image pull policy used in Plugin registry deployment + PluginRegistryImagePullPolicy corev1.PullPolicy `json:"pluginRegistryPullPolicy"` + // PluginRegistryMemoryLimit is the memory limit used in Plugin registry deployment + PluginRegistryMemoryLimit string `json:"pluginRegistryMemoryLimit"` + // ExternalPluginRegistry instructs operator on whether or not to deploy a dedicated Plugin registry server + // By default a dedicated plugin registry server is started. + // But if ExternalPluginRegistry is `true`, then no such dedicated server will be started by the operator + ExternalPluginRegistry bool `json:"externalPluginRegistry"` // ProxyURL is protocol+hostname of a proxy server. Automatically added as JAVA_OPTS and https(s)_proxy // to Che server and workspaces containers ProxyURL string `json:"proxyURL"` From 40326222c858b1798571f2059c4236181d6c0964 Mon Sep 17 00:00:00 2001 From: David Festal Date: Wed, 17 Jul 2019 20:20:13 +0200 Subject: [PATCH 02/11] Update defaults Signed-off-by: David Festal --- pkg/deploy/defaults.go | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/pkg/deploy/defaults.go b/pkg/deploy/defaults.go index 519d5ff63e..50830ce424 100644 --- a/pkg/deploy/defaults.go +++ b/pkg/deploy/defaults.go @@ -12,6 +12,12 @@ // REMINDER: when updating versions below, see also pkg/apis/org/v1/che_types.go and deploy/crds/org_v1_che_cr.yaml package deploy +var ( + DefaultUpstreamPluginRegistryUrl = "http://che-plugin-registry:8080/v3" + DefaultPluginRegistryUrl = "https://che-plugin-registry.openshift.io" + DefaultDevfileRegistryUrl = "http://che-devfile-registry:8080" +) + const ( DefaultCheServerImageRepo = "eclipse/che-server" DefaultCodeReadyServerImageRepo = "registry.redhat.io/codeready-workspaces/server-rhel8" @@ -26,19 +32,22 @@ const ( DefaultPvcClaimSize = "1Gi" DefaultIngressStrategy = "multi-host" DefaultIngressClass = "nginx" - DefaultPluginRegistryUrl = "https://che-plugin-registry.openshift.io" - DefaultUpstreamPluginRegistryUrl = "https://che-plugin-registry.openshift.io/v3" - DefaultDevfileRegistryUrl = "https://che-devfile-registry.openshift.io" - DefaultKeycloakAdminUserName = "admin" - DefaultCheLogLevel = "INFO" - DefaultCheDebug = "false" - DefaultPvcJobsImage = "registry.redhat.io/ubi8-minimal:8.0-127" - DefaultPvcJobsUpstreamImage = "registry.access.redhat.com/ubi8-minimal:8.0-127" - DefaultPostgresImage = "registry.redhat.io/rhscl/postgresql-96-rhel7:1-40" - DefaultPostgresUpstreamImage = "centos/postgresql-96-centos7:9.6" - DefaultKeycloakImage = "registry.redhat.io/redhat-sso-7/sso73-openshift:1.0-11" - DefaultKeycloakUpstreamImage = "eclipse/che-keycloak:7.0.0-RC-2.0" - DefaultJavaOpts = "-XX:MaxRAMFraction=2 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10 " + + DefaultPluginRegistryImage = "quay.io/eclipse/che-devfile-registry:7.0.0-RC-2.0" + DefaultPluginRegistryPullPolicy = "Always" + DefaultPluginRegistryMemoryLimit = "256Mi" + DefaultDevfileRegistryImage = "quay.io/eclipse/che-devfile-registry:7.0.0-RC-2.0" + DefaultDevfileRegistryPullPolicy = "Always" + DefaultDevfileRegistryMemoryLimit= "256Mi" + DefaultKeycloakAdminUserName = "admin" + DefaultCheLogLevel = "INFO" + DefaultCheDebug = "false" + DefaultPvcJobsImage = "registry.redhat.io/ubi8-minimal:8.0-127" + DefaultPvcJobsUpstreamImage = "registry.access.redhat.com/ubi8-minimal:8.0-127" + DefaultPostgresImage = "registry.redhat.io/rhscl/postgresql-96-rhel7:1-40" + DefaultPostgresUpstreamImage = "centos/postgresql-96-centos7:9.6" + DefaultKeycloakImage = "registry.redhat.io/redhat-sso-7/sso73-openshift:1.0-11" + DefaultKeycloakUpstreamImage = "eclipse/che-keycloak:7.0.0-RC-2.0" + DefaultJavaOpts = "-XX:MaxRAMFraction=2 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10 " + "-XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 " + "-XX:AdaptiveSizePolicyWeight=90 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap " + "-Dsun.zip.disableMemoryMapping=true -Xms20m" From ac290c86b34d61d916c778295e513eb313b84121 Mon Sep 17 00:00:00 2001 From: David Festal Date: Wed, 17 Jul 2019 20:20:48 +0200 Subject: [PATCH 03/11] update controller Signed-off-by: David Festal --- pkg/controller/che/che_controller.go | 110 +++++++++++++++++++++ pkg/controller/che/create.go | 10 -- pkg/deploy/che_configmap.go | 6 +- pkg/deploy/deployment_devfile_registry.go | 115 ++++++++++++++++++++++ pkg/deploy/deployment_plugin_registry.go | 115 ++++++++++++++++++++++ 5 files changed, 345 insertions(+), 11 deletions(-) create mode 100644 pkg/deploy/deployment_devfile_registry.go create mode 100644 pkg/deploy/deployment_plugin_registry.go diff --git a/pkg/controller/che/che_controller.go b/pkg/controller/che/che_controller.go index 12b60b2db1..42bf67d051 100644 --- a/pkg/controller/che/che_controller.go +++ b/pkg/controller/che/che_controller.go @@ -367,6 +367,37 @@ func (r *ReconcileChe) Reconcile(request reconcile.Request) (reconcile.Result, e } } } + + // Create Plugin registry resources unless an external registry is used + externalPluginRegistry := instance.Spec.Server.ExternalPluginRegistry + if !externalPluginRegistry { + // Create a new che-plugin-registry service + pluginRegistryLabels := deploy.GetLabels(instance, "che-plugin-registry") + pluginRegistryService := deploy.NewService(instance, "che-plugin-registry", []string{"http"}, []int32{8080}, pluginRegistryLabels) + if err := r.CreateService(instance,pluginRegistryService); err != nil { + return reconcile.Result{}, err + } + // Create a new plugin registry deployment + pluginRegistryDeployment := deploy.NewPluginRegistryDeployment(instance) + if err := r.CreateNewDeployment(instance, pluginRegistryDeployment); err != nil { + return reconcile.Result{}, err + } + time.Sleep(time.Duration(1) * time.Second) + pluginDeployment, err := r.GetEffectiveDeployment(instance, pluginRegistryDeployment.Name) + if err != nil { + logrus.Errorf("Failed to get %s deployment: %s", pluginRegistryDeployment.Name, err) + return reconcile.Result{}, err + } + if !tests { + if pluginDeployment.Status.AvailableReplicas != 1 { + scaled := k8sclient.GetDeploymentStatus("che-plugin-registry", instance.Namespace) + if !scaled { + return reconcile.Result{Requeue: true, RequeueAfter: time.Second * 5}, err + } + } + } + } + cheFlavor := util.GetValue(instance.Spec.Server.CheFlavor, deploy.DefaultCheFlavor) ingressStrategy := util.GetValue(instance.Spec.K8SOnly.IngressStrategy, deploy.DefaultIngressStrategy) ingressDomain := instance.Spec.K8SOnly.IngressDomain @@ -375,6 +406,85 @@ func (r *ReconcileChe) Reconcile(request reconcile.Request) (reconcile.Result, e if tlsSupport { protocol = "https" } + + // Create devfile registry resources unless an external registry is used + externalDevfileRegistry := instance.Spec.Server.ExternalDevfileRegistry + if !externalDevfileRegistry { + // Create a new che-plugin-registry service + devfileRegistryLabels := deploy.GetLabels(instance, "che-devfile-registry") + devfileRegistryService := deploy.NewService(instance, "che-devfile-registry", []string{"http"}, []int32{8080}, devfileRegistryLabels) + if err := r.CreateService(instance,devfileRegistryService); err != nil { + return reconcile.Result{}, err + } + // Create a new devfile registry deployment + devfileRegistryDeployment := deploy.NewDevfileRegistryDeployment(instance) + if err := r.CreateNewDeployment(instance, devfileRegistryDeployment); err != nil { + return reconcile.Result{}, err + } + time.Sleep(time.Duration(1) * time.Second) + devfileDeployment, err := r.GetEffectiveDeployment(instance, devfileRegistryDeployment.Name) + if err != nil { + logrus.Errorf("Failed to get %s deployment: %s", devfileRegistryDeployment.Name, err) + return reconcile.Result{}, err + } + if !tests { + if devfileDeployment.Status.AvailableReplicas != 1 { + scaled := k8sclient.GetDeploymentStatus("che-devfile-registry", instance.Namespace) + if !scaled { + return reconcile.Result{Requeue: true, RequeueAfter: time.Second * 5}, err + } + } + } + + addRegistryRoute := func (registryName string) (string, error) { + host := "" + if !isOpenShift { + ingress := deploy.NewIngress(instance, registryName, registryName, 8080) + if err := r.CreateNewIngress(instance, ingress); err != nil { + return "", err + } + host = ingressDomain + if ingressStrategy == "multi-host" { + host = registryName + "-" + instance.Namespace + "." + ingressDomain + } + } else { + route := deploy.NewRoute(instance, registryName, registryName, 8080) + if tlsSupport { + route = deploy.NewTlsRoute(instance, registryName, registryName, 8080) + } + if err := r.CreateNewRoute(instance, route); err != nil { + return "", err + } + host = route.Spec.Host + if len(host) < 1 { + cheRoute := r.GetEffectiveRoute(instance, route.Name) + host = cheRoute.Spec.Host + } + } + if instance.Spec.Server.TlsSupport { + return "https://" + host, nil + } else { + return "http://" + host, nil + } + } + + devfileRegistryURL, err := addRegistryRoute("che-devfile-registry") + if err != nil { + return reconcile.Result{}, err + } + deploy.DefaultDevfileRegistryUrl = devfileRegistryURL + + pluginRegistryURL, err := addRegistryRoute("che-plugin-registry") + if err != nil { + return reconcile.Result{}, err + } + if cheFlavor != "codeready" { + pluginRegistryURL += "/v3" + } + deploy.DefaultUpstreamPluginRegistryUrl = pluginRegistryURL + deploy.DefaultPluginRegistryUrl = pluginRegistryURL + } + // create Che service and route cheLabels := deploy.GetLabels(instance, util.GetValue(instance.Spec.Server.CheFlavor, deploy.DefaultCheFlavor)) diff --git a/pkg/controller/che/create.go b/pkg/controller/che/create.go index 6f25006b87..dcd059e1a7 100644 --- a/pkg/controller/che/create.go +++ b/pkg/controller/che/create.go @@ -470,17 +470,7 @@ func (r *ReconcileChe) GenerateAndSaveFields(instance *orgv1.CheCluster, request return err } } - pluginRegistryUrl := util.GetValue(instance.Spec.Server.PluginRegistryUrl, deploy.DefaultUpstreamPluginRegistryUrl) - if cheFlavor == "codeready" { - pluginRegistryUrl = deploy.DefaultPluginRegistryUrl - } - if len(instance.Spec.Server.PluginRegistryUrl) < 1 { - instance.Spec.Server.PluginRegistryUrl = pluginRegistryUrl - if err := r.UpdateCheCRSpec(instance, "plugin registry URL", pluginRegistryUrl); err != nil { - return err - } - } cheLogLevel := util.GetValue(instance.Spec.Server.CheLogLevel, deploy.DefaultCheLogLevel) if len(instance.Spec.Server.CheLogLevel) < 1 { instance.Spec.Server.CheLogLevel = cheLogLevel diff --git a/pkg/deploy/che_configmap.go b/pkg/deploy/che_configmap.go index a09cee0b32..8b5145b2ae 100644 --- a/pkg/deploy/che_configmap.go +++ b/pkg/deploy/che_configmap.go @@ -157,7 +157,11 @@ func GetConfigMapData(cr *orgv1.CheCluster) (cheEnv map[string]string) { ingressStrategy := util.GetValue(cr.Spec.K8SOnly.IngressStrategy, DefaultIngressStrategy) ingressClass := util.GetValue(cr.Spec.K8SOnly.IngressClass, DefaultIngressClass) devfileRegistryUrl := util.GetValue(cr.Spec.Server.DevfileRegistryUrl, DefaultDevfileRegistryUrl) - pluginRegistryUrl := util.GetValue(cr.Spec.Server.PluginRegistryUrl, DefaultPluginRegistryUrl) + defaultPluginRegistryUrl := DefaultUpstreamPluginRegistryUrl + if cheFlavor == "codeready" { + defaultPluginRegistryUrl = DefaultPluginRegistryUrl + } + pluginRegistryUrl := util.GetValue(cr.Spec.Server.PluginRegistryUrl, defaultPluginRegistryUrl) cheLogLevel := util.GetValue(cr.Spec.Server.CheLogLevel, DefaultCheLogLevel) cheDebug := util.GetValue(cr.Spec.Server.CheDebug, DefaultCheDebug) diff --git a/pkg/deploy/deployment_devfile_registry.go b/pkg/deploy/deployment_devfile_registry.go new file mode 100644 index 0000000000..e3912c258e --- /dev/null +++ b/pkg/deploy/deployment_devfile_registry.go @@ -0,0 +1,115 @@ +// +// Copyright (c) 2012-2019 Red Hat, Inc. +// This program and the accompanying materials are made +// available under the terms of the Eclipse Public License 2.0 +// which is available at https://www.eclipse.org/legal/epl-2.0/ +// +// SPDX-License-Identifier: EPL-2.0 +// +// Contributors: +// Red Hat, Inc. - initial API and implementation +// +package deploy + +import ( + orgv1 "github.com/eclipse/che-operator/pkg/apis/org/v1" + "github.com/eclipse/che-operator/pkg/util" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func NewDevfileRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { + name := "che-devfile-registry" + labels := GetLabels(cr, name) + devfileRegistryImage := util.GetValue(cr.Spec.Server.DevfileRegistryImage, DefaultDevfileRegistryImage) + devfileRegistryImagePullPolicy := corev1.PullPolicy(util.GetValue(string(cr.Spec.Server.DevfileRegistryImagePullPolicy), DefaultDevfileRegistryPullPolicy)) + devfileRegistryMemoryLimit := util.GetValue(string(cr.Spec.Server.DevfileRegistryMemoryLimit), DefaultDevfileRegistryMemoryLimit) + _25Percent := intstr.FromString("25%") + _1 := int32(1) + _2 := int32(2) + return &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{ + Kind: "Deployment", + APIVersion: "apps/v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: cr.Namespace, + Labels: labels, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: &_1, + RevisionHistoryLimit: &_2, + Selector: &metav1.LabelSelector{MatchLabels: labels}, + Strategy: appsv1.DeploymentStrategy{ + Type: appsv1.RollingUpdateDeploymentStrategyType, + RollingUpdate: &appsv1.RollingUpdateDeployment { + MaxSurge: &_25Percent, + MaxUnavailable: &_25Percent, + }, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: labels, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: name, + Image: devfileRegistryImage, + ImagePullPolicy: devfileRegistryImagePullPolicy, + Ports: []corev1.ContainerPort{ + { + Name: "http", + ContainerPort: 8080, + Protocol: "TCP", + }, + }, + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceMemory: resource.MustParse(devfileRegistryMemoryLimit), + }, + Limits: corev1.ResourceList{ + corev1.ResourceMemory: resource.MustParse(devfileRegistryMemoryLimit), + }, + }, + ReadinessProbe: &corev1.Probe{ + Handler: corev1.Handler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/devfiles/", + Port: intstr.IntOrString{ + Type: intstr.Int, + IntVal: int32(8080), + }, + Scheme: corev1.URISchemeHTTP, + }, + }, + InitialDelaySeconds: 3, + FailureThreshold: 10, + TimeoutSeconds: 3, + }, + LivenessProbe: &corev1.Probe{ + Handler: corev1.Handler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/devfiles/", + Port: intstr.IntOrString{ + Type: intstr.Int, + IntVal: int32(8080), + }, + Scheme: corev1.URISchemeHTTP, + }, + }, + InitialDelaySeconds: 30, + FailureThreshold: 10, + TimeoutSeconds: 3, + }, + }, + }, + }, + }, + }, + } +} diff --git a/pkg/deploy/deployment_plugin_registry.go b/pkg/deploy/deployment_plugin_registry.go new file mode 100644 index 0000000000..8a53a722a2 --- /dev/null +++ b/pkg/deploy/deployment_plugin_registry.go @@ -0,0 +1,115 @@ +// +// Copyright (c) 2012-2019 Red Hat, Inc. +// This program and the accompanying materials are made +// available under the terms of the Eclipse Public License 2.0 +// which is available at https://www.eclipse.org/legal/epl-2.0/ +// +// SPDX-License-Identifier: EPL-2.0 +// +// Contributors: +// Red Hat, Inc. - initial API and implementation +// +package deploy + +import ( + orgv1 "github.com/eclipse/che-operator/pkg/apis/org/v1" + "github.com/eclipse/che-operator/pkg/util" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func NewPluginRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { + name := "che-plugin-registry" + labels := GetLabels(cr, name) + pluginRegistryImage := util.GetValue(cr.Spec.Server.PluginRegistryImage, DefaultPluginRegistryImage) + pluginRegistryImagePullPolicy := corev1.PullPolicy(util.GetValue(string(cr.Spec.Server.PluginRegistryImagePullPolicy), DefaultPluginRegistryPullPolicy)) + pluginRegistryMemoryLimit := util.GetValue(string(cr.Spec.Server.PluginRegistryMemoryLimit), DefaultPluginRegistryMemoryLimit) + _25Percent := intstr.FromString("25%") + _1 := int32(1) + _2 := int32(2) + return &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{ + Kind: "Deployment", + APIVersion: "apps/v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: cr.Namespace, + Labels: labels, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: &_1, + RevisionHistoryLimit: &_2, + Selector: &metav1.LabelSelector{MatchLabels: labels}, + Strategy: appsv1.DeploymentStrategy{ + Type: appsv1.RollingUpdateDeploymentStrategyType, + RollingUpdate: &appsv1.RollingUpdateDeployment { + MaxSurge: &_25Percent, + MaxUnavailable: &_25Percent, + }, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: labels, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: name, + Image: pluginRegistryImage, + ImagePullPolicy: pluginRegistryImagePullPolicy, + Ports: []corev1.ContainerPort{ + { + Name: "http", + ContainerPort: 8080, + Protocol: "TCP", + }, + }, + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceMemory: resource.MustParse(pluginRegistryMemoryLimit), + }, + Limits: corev1.ResourceList{ + corev1.ResourceMemory: resource.MustParse(pluginRegistryMemoryLimit), + }, + }, + ReadinessProbe: &corev1.Probe{ + Handler: corev1.Handler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/plugins/", + Port: intstr.IntOrString{ + Type: intstr.Int, + IntVal: int32(8080), + }, + Scheme: corev1.URISchemeHTTP, + }, + }, + InitialDelaySeconds: 3, + FailureThreshold: 10, + TimeoutSeconds: 3, + }, + LivenessProbe: &corev1.Probe{ + Handler: corev1.Handler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/plugins/", + Port: intstr.IntOrString{ + Type: intstr.Int, + IntVal: int32(8080), + }, + Scheme: corev1.URISchemeHTTP, + }, + }, + InitialDelaySeconds: 30, + FailureThreshold: 10, + TimeoutSeconds: 3, + }, + }, + }, + }, + }, + }, + } +} From 98fb94a3b794b6f4dae1be8c8fa720701605ab2a Mon Sep 17 00:00:00 2001 From: David Festal Date: Thu, 18 Jul 2019 14:58:22 +0200 Subject: [PATCH 04/11] Separate memory limits and requests... ... as in PR https://github.com/eclipse/che/pull/13890/files#diff-a488b4bdede7547798a17f6830874b05R59 Signed-off-by: David Festal --- pkg/apis/org/v1/che_types.go | 4 ++ pkg/deploy/defaults.go | 68 ++++++++++++----------- pkg/deploy/deployment_devfile_registry.go | 3 +- pkg/deploy/deployment_plugin_registry.go | 3 +- 4 files changed, 43 insertions(+), 35 deletions(-) diff --git a/pkg/apis/org/v1/che_types.go b/pkg/apis/org/v1/che_types.go index dece028475..2ac21be437 100644 --- a/pkg/apis/org/v1/che_types.go +++ b/pkg/apis/org/v1/che_types.go @@ -59,6 +59,8 @@ type CheClusterSpecServer struct { DevfileRegistryImagePullPolicy corev1.PullPolicy `json:"devfileRegistryPullPolicy"` // DevfileRegistryMemoryLimit is the memory limit used in Devfile registry deployment DevfileRegistryMemoryLimit string `json:"devfileRegistryMemoryLimit"` + // DevfileRegistryMemoryRequest is the memory request used in Devfile registry deployment + DevfileRegistryMemoryRequest string `json:"devfileRegistryMemoryRequest"` // ExternalDevfileRegistry instructs operator on whether or not to deploy a dedicated Devfile registry server // By default a dedicated devfile registry server is started. // But if ExternalDevfileRegistry is `true`, then no such dedicated server will be started by the operator @@ -71,6 +73,8 @@ type CheClusterSpecServer struct { PluginRegistryImagePullPolicy corev1.PullPolicy `json:"pluginRegistryPullPolicy"` // PluginRegistryMemoryLimit is the memory limit used in Plugin registry deployment PluginRegistryMemoryLimit string `json:"pluginRegistryMemoryLimit"` + // PluginRegistryMemoryRequest is the memory request used in Plugin registry deployment + PluginRegistryMemoryRequest string `json:"pluginRegistryMemoryRequest"` // ExternalPluginRegistry instructs operator on whether or not to deploy a dedicated Plugin registry server // By default a dedicated plugin registry server is started. // But if ExternalPluginRegistry is `true`, then no such dedicated server will be started by the operator diff --git a/pkg/deploy/defaults.go b/pkg/deploy/defaults.go index 50830ce424..acadda399c 100644 --- a/pkg/deploy/defaults.go +++ b/pkg/deploy/defaults.go @@ -19,35 +19,37 @@ var ( ) const ( - DefaultCheServerImageRepo = "eclipse/che-server" - DefaultCodeReadyServerImageRepo = "registry.redhat.io/codeready-workspaces/server-rhel8" - DefaultCheServerImageTag = "7.0.0-RC-2.0" - DefaultCodeReadyServerImageTag = "1.2" - DefaultCheFlavor = "che" - DefaultChePostgresUser = "pgche" - DefaultChePostgresHostName = "postgres" - DefaultChePostgresPort = "5432" - DefaultChePostgresDb = "dbche" - DefaultPvcStrategy = "common" - DefaultPvcClaimSize = "1Gi" - DefaultIngressStrategy = "multi-host" - DefaultIngressClass = "nginx" - DefaultPluginRegistryImage = "quay.io/eclipse/che-devfile-registry:7.0.0-RC-2.0" - DefaultPluginRegistryPullPolicy = "Always" - DefaultPluginRegistryMemoryLimit = "256Mi" - DefaultDevfileRegistryImage = "quay.io/eclipse/che-devfile-registry:7.0.0-RC-2.0" - DefaultDevfileRegistryPullPolicy = "Always" - DefaultDevfileRegistryMemoryLimit= "256Mi" - DefaultKeycloakAdminUserName = "admin" - DefaultCheLogLevel = "INFO" - DefaultCheDebug = "false" - DefaultPvcJobsImage = "registry.redhat.io/ubi8-minimal:8.0-127" - DefaultPvcJobsUpstreamImage = "registry.access.redhat.com/ubi8-minimal:8.0-127" - DefaultPostgresImage = "registry.redhat.io/rhscl/postgresql-96-rhel7:1-40" - DefaultPostgresUpstreamImage = "centos/postgresql-96-centos7:9.6" - DefaultKeycloakImage = "registry.redhat.io/redhat-sso-7/sso73-openshift:1.0-11" - DefaultKeycloakUpstreamImage = "eclipse/che-keycloak:7.0.0-RC-2.0" - DefaultJavaOpts = "-XX:MaxRAMFraction=2 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10 " + + DefaultCheServerImageRepo = "eclipse/che-server" + DefaultCodeReadyServerImageRepo = "registry.redhat.io/codeready-workspaces/server-rhel8" + DefaultCheServerImageTag = "7.0.0-RC-2.0" + DefaultCodeReadyServerImageTag = "1.2" + DefaultCheFlavor = "che" + DefaultChePostgresUser = "pgche" + DefaultChePostgresHostName = "postgres" + DefaultChePostgresPort = "5432" + DefaultChePostgresDb = "dbche" + DefaultPvcStrategy = "common" + DefaultPvcClaimSize = "1Gi" + DefaultIngressStrategy = "multi-host" + DefaultIngressClass = "nginx" + DefaultPluginRegistryImage = "quay.io/eclipse/che-devfile-registry:7.0.0-RC-2.0" + DefaultPluginRegistryPullPolicy = "Always" + DefaultPluginRegistryMemoryLimit = "32Mi" + DefaultPluginRegistryMemoryRequest = "16Mi" + DefaultDevfileRegistryImage = "quay.io/eclipse/che-devfile-registry:7.0.0-RC-2.0" + DefaultDevfileRegistryPullPolicy = "Always" + DefaultDevfileRegistryMemoryLimit = "32Mi" + DefaultDevfileRegistryMemoryRequest = "16Mi" + DefaultKeycloakAdminUserName = "admin" + DefaultCheLogLevel = "INFO" + DefaultCheDebug = "false" + DefaultPvcJobsImage = "registry.redhat.io/ubi8-minimal:8.0-127" + DefaultPvcJobsUpstreamImage = "registry.access.redhat.com/ubi8-minimal:8.0-127" + DefaultPostgresImage = "registry.redhat.io/rhscl/postgresql-96-rhel7:1-40" + DefaultPostgresUpstreamImage = "centos/postgresql-96-centos7:9.6" + DefaultKeycloakImage = "registry.redhat.io/redhat-sso-7/sso73-openshift:1.0-11" + DefaultKeycloakUpstreamImage = "eclipse/che-keycloak:7.0.0-RC-2.0" + DefaultJavaOpts = "-XX:MaxRAMFraction=2 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10 " + "-XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 " + "-XX:AdaptiveSizePolicyWeight=90 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap " + "-Dsun.zip.disableMemoryMapping=true -Xms20m" @@ -55,8 +57,8 @@ const ( "-XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 " + "-Dsun.zip.disableMemoryMapping=true " + "-Xms20m -Djava.security.egd=file:/dev/./urandom" - DefaultServerMemoryRequest = "512Mi" - DefaultServerMemoryLimit = "1Gi" - DefaultSecurityContextFsGroup = "1724" - DefaultSecurityContextRunAsUser = "1724" + DefaultServerMemoryRequest = "512Mi" + DefaultServerMemoryLimit = "1Gi" + DefaultSecurityContextFsGroup = "1724" + DefaultSecurityContextRunAsUser = "1724" ) diff --git a/pkg/deploy/deployment_devfile_registry.go b/pkg/deploy/deployment_devfile_registry.go index e3912c258e..24ac338fda 100644 --- a/pkg/deploy/deployment_devfile_registry.go +++ b/pkg/deploy/deployment_devfile_registry.go @@ -27,6 +27,7 @@ func NewDevfileRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { devfileRegistryImage := util.GetValue(cr.Spec.Server.DevfileRegistryImage, DefaultDevfileRegistryImage) devfileRegistryImagePullPolicy := corev1.PullPolicy(util.GetValue(string(cr.Spec.Server.DevfileRegistryImagePullPolicy), DefaultDevfileRegistryPullPolicy)) devfileRegistryMemoryLimit := util.GetValue(string(cr.Spec.Server.DevfileRegistryMemoryLimit), DefaultDevfileRegistryMemoryLimit) + devfileRegistryMemoryRequest := util.GetValue(string(cr.Spec.Server.DevfileRegistryMemoryRequest), DefaultDevfileRegistryMemoryRequest) _25Percent := intstr.FromString("25%") _1 := int32(1) _2 := int32(2) @@ -70,7 +71,7 @@ func NewDevfileRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { }, Resources: corev1.ResourceRequirements{ Requests: corev1.ResourceList{ - corev1.ResourceMemory: resource.MustParse(devfileRegistryMemoryLimit), + corev1.ResourceMemory: resource.MustParse(devfileRegistryMemoryRequest), }, Limits: corev1.ResourceList{ corev1.ResourceMemory: resource.MustParse(devfileRegistryMemoryLimit), diff --git a/pkg/deploy/deployment_plugin_registry.go b/pkg/deploy/deployment_plugin_registry.go index 8a53a722a2..231ff727d8 100644 --- a/pkg/deploy/deployment_plugin_registry.go +++ b/pkg/deploy/deployment_plugin_registry.go @@ -27,6 +27,7 @@ func NewPluginRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { pluginRegistryImage := util.GetValue(cr.Spec.Server.PluginRegistryImage, DefaultPluginRegistryImage) pluginRegistryImagePullPolicy := corev1.PullPolicy(util.GetValue(string(cr.Spec.Server.PluginRegistryImagePullPolicy), DefaultPluginRegistryPullPolicy)) pluginRegistryMemoryLimit := util.GetValue(string(cr.Spec.Server.PluginRegistryMemoryLimit), DefaultPluginRegistryMemoryLimit) + pluginRegistryMemoryRequest := util.GetValue(string(cr.Spec.Server.PluginRegistryMemoryRequest), DefaultPluginRegistryMemoryRequest) _25Percent := intstr.FromString("25%") _1 := int32(1) _2 := int32(2) @@ -70,7 +71,7 @@ func NewPluginRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { }, Resources: corev1.ResourceRequirements{ Requests: corev1.ResourceList{ - corev1.ResourceMemory: resource.MustParse(pluginRegistryMemoryLimit), + corev1.ResourceMemory: resource.MustParse(pluginRegistryMemoryRequest), }, Limits: corev1.ResourceList{ corev1.ResourceMemory: resource.MustParse(pluginRegistryMemoryLimit), From c9591366cf9598d7c6774286388249d2eca09491 Mon Sep 17 00:00:00 2001 From: David Festal Date: Thu, 18 Jul 2019 14:59:32 +0200 Subject: [PATCH 05/11] Remove unnecessary and erro-prone code since, in the Che case, `cheFlavor` is always passed as the `name` parameter. Signed-off-by: David Festal --- pkg/deploy/ingress.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pkg/deploy/ingress.go b/pkg/deploy/ingress.go index d25fc93f3b..390ffcdce6 100644 --- a/pkg/deploy/ingress.go +++ b/pkg/deploy/ingress.go @@ -27,11 +27,8 @@ func NewIngress(cr *orgv1.CheCluster, name string, serviceName string, port int) } ingressDomain := cr.Spec.K8SOnly.IngressDomain ingressClass := util.GetValue(cr.Spec.K8SOnly.IngressClass, DefaultIngressClass) - labels := GetLabels(cr, util.GetValue(cr.Spec.Server.CheFlavor, DefaultCheFlavor)) + labels := GetLabels(cr, name) tlsSecretName := cr.Spec.K8SOnly.TlsSecretName - if name == "keycloak" { - labels = GetLabels(cr, name) - } tls := "false" if tlsSupport { tls = "true" From a5c4e9cdb0f9ceccba39c02e288ebae4bfd4dd0a Mon Sep 17 00:00:00 2001 From: David Festal Date: Thu, 18 Jul 2019 19:04:59 +0200 Subject: [PATCH 06/11] Clean and refactor registry management based on additional status fields Signed-off-by: David Festal --- pkg/apis/org/v1/che_types.go | 4 + pkg/controller/che/che_controller.go | 207 +++++++++++++--------- pkg/deploy/che_configmap.go | 13 +- pkg/deploy/defaults.go | 7 +- pkg/deploy/deployment_devfile_registry.go | 28 +-- pkg/deploy/deployment_plugin_registry.go | 116 ------------ 6 files changed, 147 insertions(+), 228 deletions(-) delete mode 100644 pkg/deploy/deployment_plugin_registry.go diff --git a/pkg/apis/org/v1/che_types.go b/pkg/apis/org/v1/che_types.go index 2ac21be437..f4fb0d5b62 100644 --- a/pkg/apis/org/v1/che_types.go +++ b/pkg/apis/org/v1/che_types.go @@ -195,6 +195,10 @@ type CheClusterStatus struct { CheURL string `json:"cheURL"` // KeycloakURL is Keycloak protocol+route/ingress KeycloakURL string `json:"keycloakURL"` + // DevfileRegistryURL is the Devfile registry protocol+route/ingress + DevfileRegistryURL string `json:"devfileRegistryURL"` + // PluginRegistryURL is the Plugin registry protocol+route/ingress + PluginRegistryURL string `json:"pluginRegistryURL"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/pkg/controller/che/che_controller.go b/pkg/controller/che/che_controller.go index 42bf67d051..e1de098f01 100644 --- a/pkg/controller/che/che_controller.go +++ b/pkg/controller/che/che_controller.go @@ -368,36 +368,6 @@ func (r *ReconcileChe) Reconcile(request reconcile.Request) (reconcile.Result, e } } - // Create Plugin registry resources unless an external registry is used - externalPluginRegistry := instance.Spec.Server.ExternalPluginRegistry - if !externalPluginRegistry { - // Create a new che-plugin-registry service - pluginRegistryLabels := deploy.GetLabels(instance, "che-plugin-registry") - pluginRegistryService := deploy.NewService(instance, "che-plugin-registry", []string{"http"}, []int32{8080}, pluginRegistryLabels) - if err := r.CreateService(instance,pluginRegistryService); err != nil { - return reconcile.Result{}, err - } - // Create a new plugin registry deployment - pluginRegistryDeployment := deploy.NewPluginRegistryDeployment(instance) - if err := r.CreateNewDeployment(instance, pluginRegistryDeployment); err != nil { - return reconcile.Result{}, err - } - time.Sleep(time.Duration(1) * time.Second) - pluginDeployment, err := r.GetEffectiveDeployment(instance, pluginRegistryDeployment.Name) - if err != nil { - logrus.Errorf("Failed to get %s deployment: %s", pluginRegistryDeployment.Name, err) - return reconcile.Result{}, err - } - if !tests { - if pluginDeployment.Status.AvailableReplicas != 1 { - scaled := k8sclient.GetDeploymentStatus("che-plugin-registry", instance.Namespace) - if !scaled { - return reconcile.Result{Requeue: true, RequeueAfter: time.Second * 5}, err - } - } - } - } - cheFlavor := util.GetValue(instance.Spec.Server.CheFlavor, deploy.DefaultCheFlavor) ingressStrategy := util.GetValue(instance.Spec.K8SOnly.IngressStrategy, deploy.DefaultIngressStrategy) ingressDomain := instance.Spec.K8SOnly.IngressDomain @@ -407,82 +377,147 @@ func (r *ReconcileChe) Reconcile(request reconcile.Request) (reconcile.Result, e protocol = "https" } - // Create devfile registry resources unless an external registry is used - externalDevfileRegistry := instance.Spec.Server.ExternalDevfileRegistry - if !externalDevfileRegistry { - // Create a new che-plugin-registry service - devfileRegistryLabels := deploy.GetLabels(instance, "che-devfile-registry") - devfileRegistryService := deploy.NewService(instance, "che-devfile-registry", []string{"http"}, []int32{8080}, devfileRegistryLabels) - if err := r.CreateService(instance,devfileRegistryService); err != nil { - return reconcile.Result{}, err + addRegistryRoute := func (registryType string) (string, error) { + registryName := "che-" + registryType + "-registry" + host := "" + if !isOpenShift { + ingress := deploy.NewIngress(instance, registryName, registryName, 8080) + if err := r.CreateNewIngress(instance, ingress); err != nil { + return "", err + } + host = ingressDomain + if ingressStrategy == "multi-host" { + host = registryName + "-" + instance.Namespace + "." + ingressDomain + } + } else { + route := deploy.NewRoute(instance, registryName, registryName, 8080) + if tlsSupport { + route = deploy.NewTlsRoute(instance, registryName, registryName, 8080) + } + if err := r.CreateNewRoute(instance, route); err != nil { + return "", err + } + host = route.Spec.Host + if len(host) < 1 { + cheRoute := r.GetEffectiveRoute(instance, route.Name) + host = cheRoute.Spec.Host + } } - // Create a new devfile registry deployment - devfileRegistryDeployment := deploy.NewDevfileRegistryDeployment(instance) - if err := r.CreateNewDeployment(instance, devfileRegistryDeployment); err != nil { - return reconcile.Result{}, err + return protocol + "://" + host, nil + } + + addRegistryDeployment := func ( + registryType string, + registryImage string, + registryImagePullPolicy corev1.PullPolicy, + registryMemoryLimit string, + registryMemoryRequest string, + ) (*reconcile.Result, error) { + registryName := "che-" + registryType + "-registry" + + // Create a new registry service + registryLabels := deploy.GetLabels(instance, registryName) + registryService := deploy.NewService(instance, registryName, []string{"http"}, []int32{8080}, registryLabels) + if err := r.CreateService(instance,registryService); err != nil { + return &reconcile.Result{}, err + } + // Create a new registry deployment + registryDeployment := deploy.NewRegistryDeployment( + instance, + registryType, + registryImage, + registryImagePullPolicy, + registryMemoryLimit, + registryMemoryRequest, + ) + if err := r.CreateNewDeployment(instance, registryDeployment); err != nil { + return &reconcile.Result{}, err } time.Sleep(time.Duration(1) * time.Second) - devfileDeployment, err := r.GetEffectiveDeployment(instance, devfileRegistryDeployment.Name) + effectiveDeployment, err := r.GetEffectiveDeployment(instance, registryDeployment.Name) if err != nil { - logrus.Errorf("Failed to get %s deployment: %s", devfileRegistryDeployment.Name, err) - return reconcile.Result{}, err + logrus.Errorf("Failed to get %s deployment: %s", registryDeployment.Name, err) + return &reconcile.Result{}, err } if !tests { - if devfileDeployment.Status.AvailableReplicas != 1 { - scaled := k8sclient.GetDeploymentStatus("che-devfile-registry", instance.Namespace) + if effectiveDeployment.Status.AvailableReplicas != 1 { + scaled := k8sclient.GetDeploymentStatus(registryName, instance.Namespace) if !scaled { - return reconcile.Result{Requeue: true, RequeueAfter: time.Second * 5}, err + return &reconcile.Result{Requeue: true, RequeueAfter: time.Second * 5}, err } } - } - - addRegistryRoute := func (registryName string) (string, error) { - host := "" - if !isOpenShift { - ingress := deploy.NewIngress(instance, registryName, registryName, 8080) - if err := r.CreateNewIngress(instance, ingress); err != nil { - return "", err - } - host = ingressDomain - if ingressStrategy == "multi-host" { - host = registryName + "-" + instance.Namespace + "." + ingressDomain - } - } else { - route := deploy.NewRoute(instance, registryName, registryName, 8080) - if tlsSupport { - route = deploy.NewTlsRoute(instance, registryName, registryName, 8080) - } - if err := r.CreateNewRoute(instance, route); err != nil { - return "", err + if effectiveDeployment.Spec.Template.Spec.Containers[0].Image != registryImage { + newDeployment := deploy.NewRegistryDeployment( + instance, + registryType, + registryImage, + registryImagePullPolicy, + registryMemoryLimit, + registryMemoryRequest, + ) + logrus.Infof("Updating %s registry deployment with an image %s", registryType, registryImage) + if err := controllerutil.SetControllerReference(instance, newDeployment, r.scheme); err != nil { + logrus.Errorf("An error occurred: %s", err) } - host = route.Spec.Host - if len(host) < 1 { - cheRoute := r.GetEffectiveRoute(instance, route.Name) - host = cheRoute.Spec.Host + if err := r.client.Update(context.TODO(), newDeployment); err != nil { + logrus.Errorf("Failed to update %s registry deployment: %s", registryType, err) } } - if instance.Spec.Server.TlsSupport { - return "https://" + host, nil - } else { - return "http://" + host, nil - } } - - devfileRegistryURL, err := addRegistryRoute("che-devfile-registry") + return nil, nil + } + + // Create Plugin registry resources unless an external registry is used + externalPluginRegistry := instance.Spec.Server.ExternalPluginRegistry + if !externalPluginRegistry { + pluginRegistryURL, err := addRegistryRoute("plugin") if err != nil { return reconcile.Result{}, err } - deploy.DefaultDevfileRegistryUrl = devfileRegistryURL - - pluginRegistryURL, err := addRegistryRoute("che-plugin-registry") + if cheFlavor != "codeready" { + pluginRegistryURL += "/v3" + } + instance.Status.PluginRegistryURL = pluginRegistryURL + if err := r.UpdateCheCRStatus(instance, "status: Plugin Registry URL", pluginRegistryURL); err != nil { + instance, _ = r.GetCR(request) + return reconcile.Result{Requeue: true, RequeueAfter: time.Second * 1}, err + } + + result, err := addRegistryDeployment( + "plugin", + util.GetValue(instance.Spec.Server.PluginRegistryImage, deploy.DefaultPluginRegistryImage), + corev1.PullPolicy(util.GetValue(string(instance.Spec.Server.PluginRegistryImagePullPolicy), deploy.DefaultPluginRegistryPullPolicy)), + util.GetValue(string(instance.Spec.Server.PluginRegistryMemoryLimit), deploy.DefaultPluginRegistryMemoryLimit), + util.GetValue(string(instance.Spec.Server.PluginRegistryMemoryRequest), deploy.DefaultPluginRegistryMemoryRequest), + ) + if err != nil || result != nil { + return *result, err + } + } + + // Create devfile registry resources unless an external registry is used + externalDevfileRegistry := instance.Spec.Server.ExternalDevfileRegistry + if !externalDevfileRegistry { + devfileRegistryURL, err := addRegistryRoute("devfile") if err != nil { return reconcile.Result{}, err } - if cheFlavor != "codeready" { - pluginRegistryURL += "/v3" + instance.Status.DevfileRegistryURL = devfileRegistryURL + if err := r.UpdateCheCRStatus(instance, "status: Devfile Registry URL", devfileRegistryURL); err != nil { + instance, _ = r.GetCR(request) + return reconcile.Result{Requeue: true, RequeueAfter: time.Second * 1}, err + } + + result, err := addRegistryDeployment( + "devfile", + util.GetValue(instance.Spec.Server.DevfileRegistryImage, deploy.DefaultDevfileRegistryImage), + corev1.PullPolicy(util.GetValue(string(instance.Spec.Server.DevfileRegistryImagePullPolicy), deploy.DefaultDevfileRegistryPullPolicy)), + util.GetValue(string(instance.Spec.Server.DevfileRegistryMemoryLimit), deploy.DefaultDevfileRegistryMemoryLimit), + util.GetValue(string(instance.Spec.Server.DevfileRegistryMemoryRequest), deploy.DefaultDevfileRegistryMemoryRequest), + ) + if err != nil || result != nil { + return *result, err } - deploy.DefaultUpstreamPluginRegistryUrl = pluginRegistryURL - deploy.DefaultPluginRegistryUrl = pluginRegistryURL } // create Che service and route diff --git a/pkg/deploy/che_configmap.go b/pkg/deploy/che_configmap.go index 8b5145b2ae..8e94bcecc2 100644 --- a/pkg/deploy/che_configmap.go +++ b/pkg/deploy/che_configmap.go @@ -61,8 +61,8 @@ type CheConfigMap struct { WorkspaceHttpProxy string `json:"CHE_WORKSPACE_HTTP__PROXY"` WorkspaceHttpsProxy string `json:"CHE_WORKSPACE_HTTPS__PROXY"` WorkspaceNoProxy string `json:"CHE_WORKSPACE_NO__PROXY"` - PluginRegistryUrl string `json:"CHE_WORKSPACE_PLUGIN__REGISTRY__URL"` - DevfileRegistryUrl string `json:"CHE_WORKSPACE_DEVFILE__REGISTRY__URL"` + PluginRegistryUrl string `json:"CHE_WORKSPACE_PLUGIN__REGISTRY__URL",omitempty` + DevfileRegistryUrl string `json:"CHE_WORKSPACE_DEVFILE__REGISTRY__URL,omitempty"` WebSocketEndpointMinor string `json:"CHE_WEBSOCKET_ENDPOINT__MINOR"` } @@ -156,12 +156,11 @@ func GetConfigMapData(cr *orgv1.CheCluster) (cheEnv map[string]string) { keycloakClientId := util.GetValue(cr.Spec.Auth.KeycloakClientId, cheFlavor+"-public") ingressStrategy := util.GetValue(cr.Spec.K8SOnly.IngressStrategy, DefaultIngressStrategy) ingressClass := util.GetValue(cr.Spec.K8SOnly.IngressClass, DefaultIngressClass) - devfileRegistryUrl := util.GetValue(cr.Spec.Server.DevfileRegistryUrl, DefaultDevfileRegistryUrl) - defaultPluginRegistryUrl := DefaultUpstreamPluginRegistryUrl - if cheFlavor == "codeready" { - defaultPluginRegistryUrl = DefaultPluginRegistryUrl + devfileRegistryUrl := cr.Status.DevfileRegistryURL + pluginRegistryUrl := cr.Status.PluginRegistryURL + if pluginRegistryUrl == "" && cheFlavor == "codeready" { + pluginRegistryUrl = DefaultCodereadyPluginRegistryUrl } - pluginRegistryUrl := util.GetValue(cr.Spec.Server.PluginRegistryUrl, defaultPluginRegistryUrl) cheLogLevel := util.GetValue(cr.Spec.Server.CheLogLevel, DefaultCheLogLevel) cheDebug := util.GetValue(cr.Spec.Server.CheDebug, DefaultCheDebug) diff --git a/pkg/deploy/defaults.go b/pkg/deploy/defaults.go index acadda399c..c3b5f6ca2c 100644 --- a/pkg/deploy/defaults.go +++ b/pkg/deploy/defaults.go @@ -12,12 +12,6 @@ // REMINDER: when updating versions below, see also pkg/apis/org/v1/che_types.go and deploy/crds/org_v1_che_cr.yaml package deploy -var ( - DefaultUpstreamPluginRegistryUrl = "http://che-plugin-registry:8080/v3" - DefaultPluginRegistryUrl = "https://che-plugin-registry.openshift.io" - DefaultDevfileRegistryUrl = "http://che-devfile-registry:8080" -) - const ( DefaultCheServerImageRepo = "eclipse/che-server" DefaultCodeReadyServerImageRepo = "registry.redhat.io/codeready-workspaces/server-rhel8" @@ -36,6 +30,7 @@ const ( DefaultPluginRegistryPullPolicy = "Always" DefaultPluginRegistryMemoryLimit = "32Mi" DefaultPluginRegistryMemoryRequest = "16Mi" + DefaultCodereadyPluginRegistryUrl = "https://che-plugin-registry.openshift.io" DefaultDevfileRegistryImage = "quay.io/eclipse/che-devfile-registry:7.0.0-RC-2.0" DefaultDevfileRegistryPullPolicy = "Always" DefaultDevfileRegistryMemoryLimit = "32Mi" diff --git a/pkg/deploy/deployment_devfile_registry.go b/pkg/deploy/deployment_devfile_registry.go index 24ac338fda..8d4007a9fa 100644 --- a/pkg/deploy/deployment_devfile_registry.go +++ b/pkg/deploy/deployment_devfile_registry.go @@ -13,7 +13,6 @@ package deploy import ( orgv1 "github.com/eclipse/che-operator/pkg/apis/org/v1" - "github.com/eclipse/che-operator/pkg/util" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" @@ -21,13 +20,16 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" ) -func NewDevfileRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { - name := "che-devfile-registry" +func NewRegistryDeployment( + cr *orgv1.CheCluster, + registryType string, + registryImage string, + registryImagePullPolicy corev1.PullPolicy, + registryMemoryLimit string, + registryMemoryRequest string, + ) *appsv1.Deployment { + name := "che-" + registryType + "-registry" labels := GetLabels(cr, name) - devfileRegistryImage := util.GetValue(cr.Spec.Server.DevfileRegistryImage, DefaultDevfileRegistryImage) - devfileRegistryImagePullPolicy := corev1.PullPolicy(util.GetValue(string(cr.Spec.Server.DevfileRegistryImagePullPolicy), DefaultDevfileRegistryPullPolicy)) - devfileRegistryMemoryLimit := util.GetValue(string(cr.Spec.Server.DevfileRegistryMemoryLimit), DefaultDevfileRegistryMemoryLimit) - devfileRegistryMemoryRequest := util.GetValue(string(cr.Spec.Server.DevfileRegistryMemoryRequest), DefaultDevfileRegistryMemoryRequest) _25Percent := intstr.FromString("25%") _1 := int32(1) _2 := int32(2) @@ -60,8 +62,8 @@ func NewDevfileRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { Containers: []corev1.Container{ { Name: name, - Image: devfileRegistryImage, - ImagePullPolicy: devfileRegistryImagePullPolicy, + Image: registryImage, + ImagePullPolicy: registryImagePullPolicy, Ports: []corev1.ContainerPort{ { Name: "http", @@ -71,16 +73,16 @@ func NewDevfileRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { }, Resources: corev1.ResourceRequirements{ Requests: corev1.ResourceList{ - corev1.ResourceMemory: resource.MustParse(devfileRegistryMemoryRequest), + corev1.ResourceMemory: resource.MustParse(registryMemoryRequest), }, Limits: corev1.ResourceList{ - corev1.ResourceMemory: resource.MustParse(devfileRegistryMemoryLimit), + corev1.ResourceMemory: resource.MustParse(registryMemoryLimit), }, }, ReadinessProbe: &corev1.Probe{ Handler: corev1.Handler{ HTTPGet: &corev1.HTTPGetAction{ - Path: "/devfiles/", + Path: "/" + registryType + "s/", Port: intstr.IntOrString{ Type: intstr.Int, IntVal: int32(8080), @@ -95,7 +97,7 @@ func NewDevfileRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { LivenessProbe: &corev1.Probe{ Handler: corev1.Handler{ HTTPGet: &corev1.HTTPGetAction{ - Path: "/devfiles/", + Path: "/" + registryType + "s/", Port: intstr.IntOrString{ Type: intstr.Int, IntVal: int32(8080), diff --git a/pkg/deploy/deployment_plugin_registry.go b/pkg/deploy/deployment_plugin_registry.go deleted file mode 100644 index 231ff727d8..0000000000 --- a/pkg/deploy/deployment_plugin_registry.go +++ /dev/null @@ -1,116 +0,0 @@ -// -// Copyright (c) 2012-2019 Red Hat, Inc. -// This program and the accompanying materials are made -// available under the terms of the Eclipse Public License 2.0 -// which is available at https://www.eclipse.org/legal/epl-2.0/ -// -// SPDX-License-Identifier: EPL-2.0 -// -// Contributors: -// Red Hat, Inc. - initial API and implementation -// -package deploy - -import ( - orgv1 "github.com/eclipse/che-operator/pkg/apis/org/v1" - "github.com/eclipse/che-operator/pkg/util" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" -) - -func NewPluginRegistryDeployment(cr *orgv1.CheCluster) *appsv1.Deployment { - name := "che-plugin-registry" - labels := GetLabels(cr, name) - pluginRegistryImage := util.GetValue(cr.Spec.Server.PluginRegistryImage, DefaultPluginRegistryImage) - pluginRegistryImagePullPolicy := corev1.PullPolicy(util.GetValue(string(cr.Spec.Server.PluginRegistryImagePullPolicy), DefaultPluginRegistryPullPolicy)) - pluginRegistryMemoryLimit := util.GetValue(string(cr.Spec.Server.PluginRegistryMemoryLimit), DefaultPluginRegistryMemoryLimit) - pluginRegistryMemoryRequest := util.GetValue(string(cr.Spec.Server.PluginRegistryMemoryRequest), DefaultPluginRegistryMemoryRequest) - _25Percent := intstr.FromString("25%") - _1 := int32(1) - _2 := int32(2) - return &appsv1.Deployment{ - TypeMeta: metav1.TypeMeta{ - Kind: "Deployment", - APIVersion: "apps/v1", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: cr.Namespace, - Labels: labels, - }, - Spec: appsv1.DeploymentSpec{ - Replicas: &_1, - RevisionHistoryLimit: &_2, - Selector: &metav1.LabelSelector{MatchLabels: labels}, - Strategy: appsv1.DeploymentStrategy{ - Type: appsv1.RollingUpdateDeploymentStrategyType, - RollingUpdate: &appsv1.RollingUpdateDeployment { - MaxSurge: &_25Percent, - MaxUnavailable: &_25Percent, - }, - }, - Template: corev1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: labels, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Name: name, - Image: pluginRegistryImage, - ImagePullPolicy: pluginRegistryImagePullPolicy, - Ports: []corev1.ContainerPort{ - { - Name: "http", - ContainerPort: 8080, - Protocol: "TCP", - }, - }, - Resources: corev1.ResourceRequirements{ - Requests: corev1.ResourceList{ - corev1.ResourceMemory: resource.MustParse(pluginRegistryMemoryRequest), - }, - Limits: corev1.ResourceList{ - corev1.ResourceMemory: resource.MustParse(pluginRegistryMemoryLimit), - }, - }, - ReadinessProbe: &corev1.Probe{ - Handler: corev1.Handler{ - HTTPGet: &corev1.HTTPGetAction{ - Path: "/plugins/", - Port: intstr.IntOrString{ - Type: intstr.Int, - IntVal: int32(8080), - }, - Scheme: corev1.URISchemeHTTP, - }, - }, - InitialDelaySeconds: 3, - FailureThreshold: 10, - TimeoutSeconds: 3, - }, - LivenessProbe: &corev1.Probe{ - Handler: corev1.Handler{ - HTTPGet: &corev1.HTTPGetAction{ - Path: "/plugins/", - Port: intstr.IntOrString{ - Type: intstr.Int, - IntVal: int32(8080), - }, - Scheme: corev1.URISchemeHTTP, - }, - }, - InitialDelaySeconds: 30, - FailureThreshold: 10, - TimeoutSeconds: 3, - }, - }, - }, - }, - }, - }, - } -} From fcf8eff4322485261a1e00496e47e00d4a4d1ff6 Mon Sep 17 00:00:00 2001 From: David Festal Date: Thu, 18 Jul 2019 19:05:39 +0200 Subject: [PATCH 07/11] update release script to also change default image tag of registry containers Signed-off-by: David Festal --- release-operator-code.sh | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/release-operator-code.sh b/release-operator-code.sh index af2b5d89d2..d0643257b5 100755 --- a/release-operator-code.sh +++ b/release-operator-code.sh @@ -30,21 +30,27 @@ cd "${BASE_DIR}" echo echo "## Creating release '${RELEASE}' of the Che operator docker image" +DefaultPluginRegistryImage + lastDefaultCheVersion=$(grep 'DefaultCheServerImageTag' "pkg/deploy/defaults.go" | sed -e 's/.*DefaultCheServerImageTag *= *"\([^"]*\)"/\1/') lastDefaultKeycloakVersion=$(grep 'DefaultKeycloakUpstreamImage' "pkg/deploy/defaults.go" | sed -e 's/.*DefaultKeycloakUpstreamImage *= *"[^":]*:\([^"]*\)"/\1/') +lastDefaultPluginRegistryVersion=$(grep 'DefaultPluginRegistryImage' "pkg/deploy/defaults.go" | sed -e 's/.*DefaultPluginRegistryImage *= *"[^":]*:\([^"]*\)"/\1/') +lastDefaultDevfileRegistryVersion=$(grep 'DefaultDevfileRegistryImage' "pkg/deploy/defaults.go" | sed -e 's/.*DefaultDevfileRegistryImage *= *"[^":]*:\([^"]*\)"/\1/') if [ "${lastDefaultCheVersion}" != "${lastDefaultKeycloakVersion}" ] then echo "#### ERROR ####" echo "Current default Che version: ${lastDefaultCheVersion}" echo "Current default Keycloak version: ${lastDefaultKeycloakVersion}" - echo "Current default version for Che and keycloak are not the same in file 'pkg/deploy/defaults.go'." + echo "Current default Devfile Registry version: ${lastDefaultDevfileRegistryVersion}" + echo "Current default Plugin Registry version: ${lastDefaultPluginRegistryVersion}" + echo "Current default version for various Che containers are not the same in file 'pkg/deploy/defaults.go'." echo "Please fix that manually first !" exit 1 fi lastDefaultVersion="${lastDefaultCheVersion}" -echo " - Current default Che and Keycloak version: ${lastDefaultVersion}" -echo " - New version to apply as default Che and Keycloak version: ${RELEASE}" +echo " - Current default version of Che containers: ${lastDefaultVersion}" +echo " - New version to apply as default version for Che containers: ${RELEASE}" if [ "${lastDefaultVersion}" == "${RELEASE}" ] then echo "Release ${RELEASE} already exists as the default in the Operator Go code !" @@ -56,6 +62,8 @@ echo " => will update default Eclipse Che Keycloak docker image tags from '$ sed \ -e "s/\(.*DefaultCheServerImageTag *= *\"\)[^\"]*\"/\1${RELEASE}\"/" \ -e "s/\(.*DefaultKeycloakUpstreamImage *= *\"[^\":]*:\)[^\"]*\"/\1${RELEASE}\"/" \ +-e "s/\(.*DefaultPluginRegistryImage *= *\"[^\":]*:\)[^\"]*\"/\1${RELEASE}\"/" \ +-e "s/\(.*DefaultDevfileRegistryImage *= *\"[^\":]*:\)[^\"]*\"/\1${RELEASE}\"/" \ pkg/deploy/defaults.go \ > pkg/deploy/defaults.go.new mv pkg/deploy/defaults.go.new pkg/deploy/defaults.go From 29de1a007671e5200c1631b5fda34ff6368ba640 Mon Sep 17 00:00:00 2001 From: Florent BENOIT Date: Fri, 19 Jul 2019 12:47:17 +0200 Subject: [PATCH 08/11] use correct image nae --- pkg/deploy/defaults.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/deploy/defaults.go b/pkg/deploy/defaults.go index c3b5f6ca2c..54d445b802 100644 --- a/pkg/deploy/defaults.go +++ b/pkg/deploy/defaults.go @@ -26,7 +26,7 @@ const ( DefaultPvcClaimSize = "1Gi" DefaultIngressStrategy = "multi-host" DefaultIngressClass = "nginx" - DefaultPluginRegistryImage = "quay.io/eclipse/che-devfile-registry:7.0.0-RC-2.0" + DefaultPluginRegistryImage = "quay.io/eclipse/che-plugin-registry:7.0.0-RC-2.0" DefaultPluginRegistryPullPolicy = "Always" DefaultPluginRegistryMemoryLimit = "32Mi" DefaultPluginRegistryMemoryRequest = "16Mi" From 49faec8e2c6fb9d94d26665b8e836bfc9ed7850e Mon Sep 17 00:00:00 2001 From: David Festal Date: Fri, 19 Jul 2019 14:25:44 +0200 Subject: [PATCH 09/11] Also remove overriden `nightly` registry images Signed-off-by: David Festal --- olm/release-olm-files.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/olm/release-olm-files.sh b/olm/release-olm-files.sh index c8389666db..6785825170 100755 --- a/olm/release-olm-files.sh +++ b/olm/release-olm-files.sh @@ -54,6 +54,8 @@ do -e 's/imagePullPolicy: *Always/imagePullPolicy: IfNotPresent/' \ -e 's/"cheImageTag": *"nightly"/"cheImageTag": ""/' \ -e 's|"identityProviderImage": *"eclipse/che-keycloak:nightly"|"identityProviderImage": ""|' \ + -e 's|"devfileRegistryImage": *"quay.io/eclipse/che-devfile-registry:nightly"|"devfileRegistryImage": ""|' \ + -e 's|"pluginRegistryImage": *"quay.io/eclipse/che-plugin-registry:nighlty"|"pluginRegistryImage": ""|' \ -e "/^ replaces: ${packageName}.v.*/d" \ -e "s/^ version: ${lastPackageNightlyVersion}/ version: ${RELEASE}/" \ -e "/^ version: ${RELEASE}/i\ \ replaces: ${packageName}.v${lastPackagePreReleaseVersion}" \ From c6be74d5ba37be37b152493c11cfe9812e3fa9b2 Mon Sep 17 00:00:00 2001 From: David Festal Date: Fri, 19 Jul 2019 15:23:49 +0200 Subject: [PATCH 10/11] Registry nightly images in nightly OLM packages Signed-off-by: David Festal --- .../eclipse-che-preview-kubernetes.crd.yaml | 15 + ...htly.1563539196.clusterserviceversion.yaml | 327 ++++++++++++++++ ...clipse-che-preview-kubernetes.package.yaml | 2 +- .../eclipse-che-preview-openshift.crd.yaml | 15 + ...htly.1563539196.clusterserviceversion.yaml | 365 ++++++++++++++++++ ...eclipse-che-preview-openshift.package.yaml | 2 +- 6 files changed, 724 insertions(+), 2 deletions(-) create mode 100644 olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/9.9.9-nightly.1563539196/eclipse-che-preview-kubernetes.crd.yaml create mode 100644 olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/9.9.9-nightly.1563539196/eclipse-che-preview-kubernetes.v9.9.9-nightly.1563539196.clusterserviceversion.yaml create mode 100644 olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/9.9.9-nightly.1563539196/eclipse-che-preview-openshift.crd.yaml create mode 100644 olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/9.9.9-nightly.1563539196/eclipse-che-preview-openshift.v9.9.9-nightly.1563539196.clusterserviceversion.yaml diff --git a/olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/9.9.9-nightly.1563539196/eclipse-che-preview-kubernetes.crd.yaml b/olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/9.9.9-nightly.1563539196/eclipse-che-preview-kubernetes.crd.yaml new file mode 100644 index 0000000000..ec7b9103f4 --- /dev/null +++ b/olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/9.9.9-nightly.1563539196/eclipse-che-preview-kubernetes.crd.yaml @@ -0,0 +1,15 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: checlusters.org.eclipse.che +spec: + group: org.eclipse.che + names: + kind: CheCluster + listKind: CheClusterList + plural: checlusters + singular: checluster + scope: Namespaced + version: v1 + subresources: + status: {} diff --git a/olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/9.9.9-nightly.1563539196/eclipse-che-preview-kubernetes.v9.9.9-nightly.1563539196.clusterserviceversion.yaml b/olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/9.9.9-nightly.1563539196/eclipse-che-preview-kubernetes.v9.9.9-nightly.1563539196.clusterserviceversion.yaml new file mode 100644 index 0000000000..036b66a63f --- /dev/null +++ b/olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/9.9.9-nightly.1563539196/eclipse-che-preview-kubernetes.v9.9.9-nightly.1563539196.clusterserviceversion.yaml @@ -0,0 +1,327 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "org.eclipse.che/v1", + "kind": "CheCluster", + "metadata": { + "name": "eclipse-che" + }, + "spec": { + "k8s": { + "ingressDomain": "", + "tlsSecretName": "" + }, + "server": { + "cheImageTag": "nightly", + "devfileRegistryImage": "quay.io/eclipse/che-devfile-registry:nightly", + "pluginRegistryImage": "quay.io/eclipse/che-plugin-registry:nighlty", + "tlsSupport": false, + "selfSignedCert": false + }, + "database": { + "externalDb": false, + "chePostgresHostname": "", + "chePostgresPort": "", + "chePostgresUser": "", + "chePostgresPassword": "", + "chePostgresDb": "" + }, + "auth": { + "identityProviderImage": "eclipse/che-keycloak:nightly", + "externalIdentityProvider": false, + "identityProviderURL": "", + "identityProviderRealm": "", + "identityProviderClientId": "" + }, + "storage": { + "pvcStrategy": "per-workspace", + "pvcClaimSize": "1Gi", + "preCreateSubPaths": true + } + } + } + ] + capabilities: Seamless Upgrades + categories: Developer Tools + certified: "false" + containerImage: quay.io/eclipse/che-operator:nightly + createdAt: "2019-07-19T12:26:36Z" + description: A Kube-native development solution that delivers portable and collaborative + developer workspaces. + repository: https://github.com/eclipse/che-operator + support: Eclipse Foundation + name: eclipse-che-preview-kubernetes.v9.9.9-nightly.1563539196 + namespace: placeholder +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Eclipse Che cluster with DB and Auth Server + displayName: Eclipse Che Cluster + kind: CheCluster + name: checlusters.org.eclipse.che + specDescriptors: + - description: TLS routes + displayName: TLS Mode + path: server.tlsSupport + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:booleanSwitch + statusDescriptors: + - description: Ingress to access Eclipse Che + displayName: Eclipse Che URL + path: cheURL + x-descriptors: + - urn:alm:descriptor:org.w3:link + - description: Ingress to access Keycloak Admin Console + displayName: Keycloak Admin Console URL + path: keycloakURL + x-descriptors: + - urn:alm:descriptor:org.w3:link + - description: Eclipse Che server version + displayName: Eclipse Che version + path: cheVersion + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:label + - description: The current status of the application + displayName: Status + path: cheClusterRunning + x-descriptors: + - urn:alm:descriptor:io.kubernetes.phase + version: v1 + description: | + A collaborative Kubernetes-native development solution that delivers Kubernetes workspaces and in-browser IDE for rapid cloud application development. + This operator installs PostgreSQL, Keycloak, and the Eclipse Che server, as well as configures all three services. + + ## How to Install + + When the operator is installed (ie you have created a subscription and there us operaotr deployment), create a new CR of Kind CheCluster (click the **Create New** button). + The CR spec contains all defaults (see below). + + + **Important!** Make sure you provide **ingressDomain** which is a global ingress domain of your k8s cluster, for example, mycluster.com, 172.234.433.23.nip.io. + + You can start using Eclipse Che when the CR status is set to **Available**, and you see a URL to Eclipse Che. + + ## Defaults + + By default, the operator deploys Eclipse Che with: + + * Bundled PostgreSQL and Keycloak + + * Per-Workspace PVC strategy + + * Auto-generated passwords + + * HTTP mode (non-secure ingresses) + + ## Installation Options + + Eclipse Che operator installation options include: + + * Connection to external database and Keycloak + + * Configuration of default passwords and object names + + * TLS mode + + * PVC strategy (once shared PVC for all workspaces, PVC per workspace, or PVC per volume) + + * Authentication options + + ### External Database and Keycloak + + To instruct the operator to skip deploying PostgreSQL and Keycloak and connect to an existing DB and Keycloak instead: + + * set respective fields to `true` in a custom resource spec + + * provide the operator with connection and authentication details: + + + + ``` + externalDb: true + + chePostgresHostname: 'yourPostgresHost' + + chePostgresPort: '5432' + + chePostgresUser: 'myuser' + + chePostgresPassword: 'mypass' + + chePostgresDb: 'mydb' + + externalIdentityProvider: true + + identityProviderURL: 'https://my-keycloak.com' + + identityProviderRealm: 'myrealm' + + identityProviderClientId: 'myClient' + + ``` + + + ### TLS Mode + + To activate TLS mode, set the respective field in the CR spec to `true` (in the `server` block): + + + + ``` + + tlsSupport: true + + ``` + + You will also need to provide name of tls secret that will be used for Eclipse Che and workspaces ingresses: + + + + ``` + + tlsSecretName: 'my-ingress-tls-secret' + + ``` + displayName: Eclipse Che + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: che-operator + spec: + replicas: 1 + selector: + matchLabels: + app: che-operator + strategy: {} + template: + metadata: + labels: + app: che-operator + spec: + containers: + - command: + - /usr/local/bin/che-operator + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: che-operator + image: quay.io/eclipse/che-operator:nightly + imagePullPolicy: Always + name: che-operator + ports: + - containerPort: 60000 + name: metrics + resources: {} + restartPolicy: Always + serviceAccountName: che-operator + terminationGracePeriodSeconds: 5 + permissions: + - rules: + - apiGroups: + - extensions + resources: + - ingresses + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + - rolebindings + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - clusterroles + - clusterrolebindings + verbs: + - '*' + - apiGroups: + - "" + resources: + - pods + - services + - serviceaccounts + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - pods/exec + - pods/log + verbs: + - '*' + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - apiGroups: + - apps + resources: + - deployments + verbs: + - '*' + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - org.eclipse.che + resources: + - '*' + verbs: + - '*' + serviceAccountName: che-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: true + type: MultiNamespace + - supported: false + type: AllNamespaces + keywords: + - eclipse che + - workspaces + - devtools + - developer + - ide + - java + links: + - name: Product Page + url: http://www.eclipse.org/che + - name: Documentation + url: https://www.eclipse.org/che/docs + - name: Operator GitHub Repo + url: https://github.com/eclipse/che-operator + maintainers: + - email: dfestal@redhat.com + name: David Festal + maturity: stable + provider: + name: Eclipse Foundation + replaces: eclipse-che-preview-kubernetes.v9.9.9-nightly.1563282936 + version: 9.9.9-nightly.1563539196 diff --git a/olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/eclipse-che-preview-kubernetes.package.yaml b/olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/eclipse-che-preview-kubernetes.package.yaml index cf51825b43..b840385c97 100644 --- a/olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/eclipse-che-preview-kubernetes.package.yaml +++ b/olm/eclipse-che-preview-kubernetes/deploy/olm-catalog/eclipse-che-preview-kubernetes/eclipse-che-preview-kubernetes.package.yaml @@ -3,5 +3,5 @@ channels: - name: stable currentCSV: eclipse-che-preview-kubernetes.v7.0.0-rc-2.0 - name: nightly - currentCSV: eclipse-che-preview-kubernetes.v9.9.9-nightly.1563282936 + currentCSV: eclipse-che-preview-kubernetes.v9.9.9-nightly.1563539196 defaultChannel: stable diff --git a/olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/9.9.9-nightly.1563539196/eclipse-che-preview-openshift.crd.yaml b/olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/9.9.9-nightly.1563539196/eclipse-che-preview-openshift.crd.yaml new file mode 100644 index 0000000000..ec7b9103f4 --- /dev/null +++ b/olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/9.9.9-nightly.1563539196/eclipse-che-preview-openshift.crd.yaml @@ -0,0 +1,15 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: checlusters.org.eclipse.che +spec: + group: org.eclipse.che + names: + kind: CheCluster + listKind: CheClusterList + plural: checlusters + singular: checluster + scope: Namespaced + version: v1 + subresources: + status: {} diff --git a/olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/9.9.9-nightly.1563539196/eclipse-che-preview-openshift.v9.9.9-nightly.1563539196.clusterserviceversion.yaml b/olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/9.9.9-nightly.1563539196/eclipse-che-preview-openshift.v9.9.9-nightly.1563539196.clusterserviceversion.yaml new file mode 100644 index 0000000000..e9c18df911 --- /dev/null +++ b/olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/9.9.9-nightly.1563539196/eclipse-che-preview-openshift.v9.9.9-nightly.1563539196.clusterserviceversion.yaml @@ -0,0 +1,365 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "org.eclipse.che/v1", + "kind": "CheCluster", + "metadata": { + "name": "eclipse-che" + }, + "spec": { + "server": { + "cheImageTag": "nightly", + "tlsSupport": false, + "selfSignedCert": false + }, + "database": { + "externalDb": false, + "chePostgresHostname": "", + "chePostgresPort": "", + "chePostgresUser": "", + "chePostgresPassword": "", + "chePostgresDb": "" + }, + "auth": { + "openShiftoAuth": true, + "identityProviderImage": "eclipse/che-keycloak:nightly", + "externalIdentityProvider": false, + "identityProviderURL": "", + "identityProviderRealm": "", + "identityProviderClientId": "" + }, + "storage": { + "pvcStrategy": "per-workspace", + "pvcClaimSize": "1Gi", + "preCreateSubPaths": true + } + } + } + ] + capabilities: Seamless Upgrades + categories: Developer Tools, OpenShift Optional + certified: "false" + containerImage: quay.io/eclipse/che-operator:nightly + createdAt: "2019-07-19T12:26:36Z" + description: A Kube-native development solution that delivers portable and collaborative + developer workspaces in OpenShift. + repository: https://github.com/eclipse/che-operator + support: Eclipse Foundation + name: eclipse-che-preview-openshift.v9.9.9-nightly.1563539196 + namespace: placeholder +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Eclipse Che cluster with DB and Auth Server + displayName: Eclipse Che Cluster + kind: CheCluster + name: checlusters.org.eclipse.che + specDescriptors: + - description: Log in to Eclipse Che with OpenShift credentials + displayName: OpenShift oAuth + path: auth.openShiftoAuth + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:booleanSwitch + - description: TLS routes + displayName: TLS Mode + path: server.tlsSupport + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:booleanSwitch + statusDescriptors: + - description: Route to access Eclipse Che + displayName: Eclipse Che URL + path: cheURL + x-descriptors: + - urn:alm:descriptor:org.w3:link + - description: Route to access Keycloak Admin Console + displayName: Keycloak Admin Console URL + path: keycloakURL + x-descriptors: + - urn:alm:descriptor:org.w3:link + - description: Eclipse Che server version + displayName: Eclipse Che version + path: cheVersion + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:label + - description: The current status of the application + displayName: Status + path: cheClusterRunning + x-descriptors: + - urn:alm:descriptor:io.kubernetes.phase + version: v1 + description: | + A collaborative Kubernetes-native development solution that delivers OpenShift workspaces and in-browser IDE for rapid cloud application development. + This operator installs PostgreSQL, Keycloak, and the Eclipse Che server, as well as configures all three services. + + ## How to Install + + Press the **Install** button, choose the upgrade strategy, and wait for the **Installed** Operator status. + + When the operator is installed, create a new CR of Kind CheCluster (click the **Create New** button). + The CR spec contains all defaults (see below). + + You can start using Eclipse Che when the CR status is set to **Available**, and you see a URL to Eclipse Che. + + ## Defaults + + By default, the operator deploys Eclipse Che with: + + * Bundled PostgreSQL and Keycloak + + * Per-Workspace PVC strategy + + * Auto-generated passwords + + * HTTP mode (non-secure routes) + + * Regular login extended with OpenShift OAuth authentication + + ## Installation Options + + Eclipse Che operator installation options include: + + * Connection to external database and Keycloak + + * Configuration of default passwords and object names + + * TLS mode + + * PVC strategy (once shared PVC for all workspaces, PVC per workspace, or PVC per volume) + + * Authentication options + + ### External Database and Keycloak + + To instruct the operator to skip deploying PostgreSQL and Keycloak and connect to an existing DB and Keycloak instead: + + * set respective fields to `true` in a custom resource spec + + * provide the operator with connection and authentication details: + + + + `externalDb: true` + + + `chePostgresHostname: 'yourPostgresHost'` + + + `chePostgresPort: '5432'` + + + `chePostgresUser: 'myuser'` + + + `chePostgresPassword: 'mypass'` + + + `chePostgresDb: 'mydb'` + + + `externalIdentityProvider: true` + + + `identityProviderURL: 'https://my-keycloak.com'` + + + `identityProviderRealm: 'myrealm'` + + + `identityProviderClientId: 'myClient'` + + + ### TLS Mode + + To activate TLS mode, set the respective field in the CR spec to `true` (in the `server` block): + + + ``` + tlsSupport: true + ``` + + #### Self-signed Certificates + + To use Eclipse Che with TLS enabled, but the OpenShift router does not use certificates signed by a public authority, you can use self-signed certificates, which the operator can fetch for you: + + + ``` + selfSignedCert: true + ``` + + + You can also manually create a secret: + + + + ``` + oc create secret self-signed-certificate generic --from-file=/path/to/certificate/ca.crt -n=$codeReadyNamespace + ``` + displayName: Eclipse Che + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + clusterPermissions: + - rules: + - apiGroups: + - oauth.openshift.io + resources: + - oauthclients + verbs: + - create + - get + - delete + - list + - patch + - update + - watch + - apiGroups: + - config.openshift.io + resources: + - infrastructures + verbs: + - get + serviceAccountName: che-operator + deployments: + - name: che-operator + spec: + replicas: 1 + selector: + matchLabels: + app: che-operator + strategy: {} + template: + metadata: + labels: + app: che-operator + spec: + containers: + - command: + - /usr/local/bin/che-operator + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: che-operator + image: quay.io/eclipse/che-operator:nightly + imagePullPolicy: Always + name: che-operator + ports: + - containerPort: 60000 + name: metrics + resources: {} + restartPolicy: Always + serviceAccountName: che-operator + terminationGracePeriodSeconds: 5 + permissions: + - rules: + - apiGroups: + - extensions + resources: + - ingresses + verbs: + - '*' + - apiGroups: + - route.openshift.io + resources: + - routes + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + - rolebindings + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - clusterroles + - clusterrolebindings + verbs: + - '*' + - apiGroups: + - "" + resources: + - pods + - services + - serviceaccounts + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - pods/exec + - pods/log + verbs: + - '*' + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - apiGroups: + - apps + resources: + - deployments + verbs: + - '*' + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - org.eclipse.che + resources: + - '*' + verbs: + - '*' + serviceAccountName: che-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: true + type: MultiNamespace + - supported: false + type: AllNamespaces + keywords: + - workspaces + - devtools + - developer + - ide + - java + links: + - name: Product Page + url: http://www.eclipse.org/che + - name: Documentation + url: https://www.eclipse.org/che/docs + - name: Operator GitHub Repo + url: https://github.com/eclipse/che-operator + maintainers: + - email: dfestal@redhat.com + name: David Festal + maturity: stable + provider: + name: Eclipse Foundation + replaces: eclipse-che-preview-openshift.v9.9.9-nightly.1563282936 + version: 9.9.9-nightly.1563539196 diff --git a/olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/eclipse-che-preview-openshift.package.yaml b/olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/eclipse-che-preview-openshift.package.yaml index 2f47df6365..79d55009b7 100644 --- a/olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/eclipse-che-preview-openshift.package.yaml +++ b/olm/eclipse-che-preview-openshift/deploy/olm-catalog/eclipse-che-preview-openshift/eclipse-che-preview-openshift.package.yaml @@ -3,5 +3,5 @@ channels: - name: stable currentCSV: eclipse-che-preview-openshift.v7.0.0-rc-2.0 - name: nightly - currentCSV: eclipse-che-preview-openshift.v9.9.9-nightly.1563282936 + currentCSV: eclipse-che-preview-openshift.v9.9.9-nightly.1563539196 defaultChannel: stable From 3ab0cc101bde3e2724b549290a513006a3edad1f Mon Sep 17 00:00:00 2001 From: David Festal Date: Fri, 19 Jul 2019 17:25:13 +0200 Subject: [PATCH 11/11] Very small fix after the very last tests Signed-off-by: David Festal --- pkg/deploy/che_configmap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/deploy/che_configmap.go b/pkg/deploy/che_configmap.go index 8e94bcecc2..bb1053ffa5 100644 --- a/pkg/deploy/che_configmap.go +++ b/pkg/deploy/che_configmap.go @@ -61,7 +61,7 @@ type CheConfigMap struct { WorkspaceHttpProxy string `json:"CHE_WORKSPACE_HTTP__PROXY"` WorkspaceHttpsProxy string `json:"CHE_WORKSPACE_HTTPS__PROXY"` WorkspaceNoProxy string `json:"CHE_WORKSPACE_NO__PROXY"` - PluginRegistryUrl string `json:"CHE_WORKSPACE_PLUGIN__REGISTRY__URL",omitempty` + PluginRegistryUrl string `json:"CHE_WORKSPACE_PLUGIN__REGISTRY__URL,omitempty"` DevfileRegistryUrl string `json:"CHE_WORKSPACE_DEVFILE__REGISTRY__URL,omitempty"` WebSocketEndpointMinor string `json:"CHE_WEBSOCKET_ENDPOINT__MINOR"` }