Specify resources limits (#612)

* Specify resource limits

Signed-off-by: Anatolii Bazko <abazko@redhat.com>
pull/603/head
Anatolii Bazko 2021-01-25 13:48:06 +02:00 committed by GitHub
parent 9df341414a
commit d5ea65afdd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 1306 additions and 118 deletions

6
.vscode/tasks.json vendored
View File

@ -74,7 +74,7 @@
"group": "build"
},
{
"label": "Update cr/crd files",
"label": "Update crd files",
"command": "./olm/update-crd-files.sh",
"type": "shell",
"args": [],
@ -87,8 +87,8 @@
"group": "build"
},
{
"label": "Update OLM bundle files",
"command": "./olm/update-crd-files.sh && ./olm/update-nightly-bundle.sh",
"label": "Update nightly OLM bundle",
"command": "./olm/update-nightly-bundle.sh",
"type": "shell",
"args": [],
"problemMatcher": [

View File

@ -306,7 +306,7 @@ New golang dependencies in the vendor folder should be committed and included in
### Updating Custom Resource Definition file
Che cluster custom resource definition (CRD) defines Eclipse CheCluster custom resource object. It contains information about object structure, field types, field descriptions.
CRD file is a YAML definition located in the `deploy/crds/org_v1_che_crd.yaml`. The file is auto-generated, so do not edit it directly to update it. If you want to add new fields or fix descriptions in the CRD, make your changes in the file `pkg/apis/org/v1/che_types.go` and run VSCode task `Update cr/crd files` or use the terminal
CRD file is a YAML definition located in the `deploy/crds/org_v1_che_crd.yaml`. The file is auto-generated, so do not edit it directly to update it. If you want to add new fields or fix descriptions in the CRD, make your changes in the file `pkg/apis/org/v1/che_types.go` and run VSCode task `Update crd files` or use the terminal
```bash
$ olm/update-crd-files.sh
@ -328,7 +328,7 @@ Sometimes, during development, you need to modify some YAML definitions in the `
- Che cluster custom resource definition `pkg/apis/org/v1/che_types.go`. For example you want to fix some properties description or apply new Che type properties with default values. These changes affect CRD `deploy/crds/org_v1_che_crd.yaml`.
- add Openshift ui annotations for Che types properties (`pkg/apis/org/v1/che_types.go`) to display information or interactive elements on the Openshift user interface.
For all these cases it's a necessary to generate a new OLM bundle to make these changes working with OLM. Run the VSCode tasks `Update OLM bundle files` or use the terminal:
For all these cases it's a necessary to generate a new OLM bundle to make these changes working with OLM. Run the VSCode tasks `Update nightly OLM bundle` or use the terminal:
```bash
$ olm/update-nightly-bundle.sh

View File

@ -71,6 +71,34 @@ spec:
field). If omitted or left blank, it will be set to the value
of the `flavour` field suffixed with `-public`.
type: string
identityProviderContainerResources:
description: Identity provider container custom settings
properties:
limits:
description: Limits describes the maximum amount of compute
resources allowed.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
request:
description: Requests describes the minimum amount of compute
resources required.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
type: object
identityProviderImage:
description: Overrides the container image used in the Identity
Provider (Keycloak / RH SSO) deployment. This includes the image
@ -178,6 +206,34 @@ spec:
description: Configuration settings related to the database used by
the Che installation.
properties:
chePostgresContainerResources:
description: Postgres container custom settings
properties:
limits:
description: Limits describes the maximum amount of compute
resources allowed.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
request:
description: Requests describes the minimum amount of compute
resources required.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
type: object
chePostgresDb:
description: Postgres database name that the Che server uses to
connect to the DB. Defaults to `dbche`.
@ -431,6 +487,14 @@ spec:
config map from other CR fields, then the value defined in the
`customCheProperties` will be used instead.
type: object
devfileRegistryCpuLimit:
description: Overrides the cpu limit used in the Devfile registry
deployment. In cores. (500m = .5 cores). Default to 500m.
type: string
devfileRegistryCpuRequest:
description: Overrides the cpu request used in the Devfile registry
deployment. In cores. (500m = .5 cores). Default to 100m.
type: string
devfileRegistryImage:
description: Overrides the container image used in the Devfile registry
deployment. This includes the image tag. Omit it or leave it empty
@ -446,11 +510,13 @@ spec:
type: object
devfileRegistryMemoryLimit:
description: Overrides the memory limit used in the Devfile registry
deployment. Defaults to 256Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 256Mi.
type: string
devfileRegistryMemoryRequest:
description: Overrides the memory request used in the Devfile registry
deployment. Defaults to 16Mi.
deployment In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 32Mi.
type: string
devfileRegistryPullPolicy:
description: Overrides the image pull policy used in the Devfile
@ -502,6 +568,14 @@ spec:
doc https://docs.openshift.com/container-platform/4.4/networking/enable-cluster-wide-proxy.html)
(see also the `proxyURL` fields).'
type: string
pluginRegistryCpuLimit:
description: Overrides the cpu limit used in the Plugin registry
deployment. In cores. (500m = .5 cores). Default to 500m.
type: string
pluginRegistryCpuRequest:
description: Overrides the cpu request used in the Plugin registry
deployment. In cores. (500m = .5 cores). Default to 100m.
type: string
pluginRegistryImage:
description: Overrides the container image used in the Plugin registry
deployment. This includes the image tag. Omit it or leave it empty
@ -517,11 +591,13 @@ spec:
type: object
pluginRegistryMemoryLimit:
description: Overrides the memory limit used in the Plugin registry
deployment. Defaults to 256Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 256Mi.
type: string
pluginRegistryMemoryRequest:
description: Overrides the memory request used in the Plugin registry
deployment. Defaults to 16Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 32Mi.
type: string
pluginRegistryPullPolicy:
description: Overrides the image pull policy used in the Plugin
@ -579,6 +655,14 @@ spec:
operator will automatically detect if router certificate is self-signed.
If so it will be propagated to Che server and some other components.
type: boolean
serverCpuLimit:
description: Overrides the cpu limit used in the Che server deployment
In cores. (500m = .5 cores). Default to 1.
type: string
serverCpuRequest:
description: Overrides the cpu request used in the Che server deployment
In cores. (500m = .5 cores). Default to 100m.
type: string
serverExposureStrategy:
description: Sets the server and workspaces exposure type. Possible
values are "multi-host", "single-host", "default-host". Defaults
@ -594,11 +678,13 @@ spec:
type: string
serverMemoryLimit:
description: Overrides the memory limit used in the Che server deployment.
Defaults to 1Gi.
In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024). Defaults
to 1Gi.
type: string
serverMemoryRequest:
description: Overrides the memory request used in the Che server
deployment. Defaults to 512Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 512Mi.
type: string
serverTrustStoreConfigMapName:
description: Name of the config-map with public certificates to

View File

@ -84,13 +84,13 @@ metadata:
categories: Developer Tools
certified: "false"
containerImage: quay.io/eclipse/che-operator:nightly
createdAt: "2021-01-15T13:55:16Z"
createdAt: "2021-01-25T10:14:35Z"
description: A Kube-native development solution that delivers portable and collaborative
developer workspaces.
operatorframework.io/suggested-namespace: eclipse-che
repository: https://github.com/eclipse/che-operator
support: Eclipse Foundation
name: eclipse-che-preview-kubernetes.v7.25.0-70.nightly
name: eclipse-che-preview-kubernetes.v7.25.0-82.nightly
namespace: placeholder
spec:
apiservicedefinitions: {}
@ -381,7 +381,13 @@ spec:
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
resources: {}
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 100m
memory: 64Mi
securityContext:
capabilities:
drop:
@ -518,4 +524,4 @@ spec:
maturity: stable
provider:
name: Eclipse Foundation
version: 7.25.0-70.nightly
version: 7.25.0-82.nightly

View File

@ -71,6 +71,34 @@ spec:
field). If omitted or left blank, it will be set to the value
of the `flavour` field suffixed with `-public`.
type: string
identityProviderContainerResources:
description: Identity provider container custom settings
properties:
limits:
description: Limits describes the maximum amount of compute
resources allowed.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
request:
description: Requests describes the minimum amount of compute
resources required.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
type: object
identityProviderImage:
description: Overrides the container image used in the Identity
Provider (Keycloak / RH SSO) deployment. This includes the image
@ -178,6 +206,34 @@ spec:
description: Configuration settings related to the database used by
the Che installation.
properties:
chePostgresContainerResources:
description: Postgres container custom settings
properties:
limits:
description: Limits describes the maximum amount of compute
resources allowed.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
request:
description: Requests describes the minimum amount of compute
resources required.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
type: object
chePostgresDb:
description: Postgres database name that the Che server uses to
connect to the DB. Defaults to `dbche`.
@ -431,6 +487,14 @@ spec:
config map from other CR fields, then the value defined in the
`customCheProperties` will be used instead.
type: object
devfileRegistryCpuLimit:
description: Overrides the cpu limit used in the Devfile registry
deployment. In cores. (500m = .5 cores). Default to 500m.
type: string
devfileRegistryCpuRequest:
description: Overrides the cpu request used in the Devfile registry
deployment. In cores. (500m = .5 cores). Default to 100m.
type: string
devfileRegistryImage:
description: Overrides the container image used in the Devfile registry
deployment. This includes the image tag. Omit it or leave it empty
@ -446,11 +510,13 @@ spec:
type: object
devfileRegistryMemoryLimit:
description: Overrides the memory limit used in the Devfile registry
deployment. Defaults to 256Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 256Mi.
type: string
devfileRegistryMemoryRequest:
description: Overrides the memory request used in the Devfile registry
deployment. Defaults to 16Mi.
deployment In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 32Mi.
type: string
devfileRegistryPullPolicy:
description: Overrides the image pull policy used in the Devfile
@ -502,6 +568,14 @@ spec:
doc https://docs.openshift.com/container-platform/4.4/networking/enable-cluster-wide-proxy.html)
(see also the `proxyURL` fields).'
type: string
pluginRegistryCpuLimit:
description: Overrides the cpu limit used in the Plugin registry
deployment. In cores. (500m = .5 cores). Default to 500m.
type: string
pluginRegistryCpuRequest:
description: Overrides the cpu request used in the Plugin registry
deployment. In cores. (500m = .5 cores). Default to 100m.
type: string
pluginRegistryImage:
description: Overrides the container image used in the Plugin registry
deployment. This includes the image tag. Omit it or leave it empty
@ -517,11 +591,13 @@ spec:
type: object
pluginRegistryMemoryLimit:
description: Overrides the memory limit used in the Plugin registry
deployment. Defaults to 256Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 256Mi.
type: string
pluginRegistryMemoryRequest:
description: Overrides the memory request used in the Plugin registry
deployment. Defaults to 16Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 32Mi.
type: string
pluginRegistryPullPolicy:
description: Overrides the image pull policy used in the Plugin
@ -579,6 +655,14 @@ spec:
operator will automatically detect if router certificate is self-signed.
If so it will be propagated to Che server and some other components.
type: boolean
serverCpuLimit:
description: Overrides the cpu limit used in the Che server deployment
In cores. (500m = .5 cores). Default to 1.
type: string
serverCpuRequest:
description: Overrides the cpu request used in the Che server deployment
In cores. (500m = .5 cores). Default to 100m.
type: string
serverExposureStrategy:
description: Sets the server and workspaces exposure type. Possible
values are "multi-host", "single-host", "default-host". Defaults
@ -594,11 +678,13 @@ spec:
type: string
serverMemoryLimit:
description: Overrides the memory limit used in the Che server deployment.
Defaults to 1Gi.
In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024). Defaults
to 1Gi.
type: string
serverMemoryRequest:
description: Overrides the memory request used in the Che server
deployment. Defaults to 512Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 512Mi.
type: string
serverTrustStoreConfigMapName:
description: Name of the config-map with public certificates to

View File

@ -75,13 +75,13 @@ metadata:
categories: Developer Tools, OpenShift Optional
certified: "false"
containerImage: quay.io/eclipse/che-operator:nightly
createdAt: "2021-01-15T13:55:25Z"
createdAt: "2021-01-25T10:14:44Z"
description: A Kube-native development solution that delivers portable and collaborative
developer workspaces in OpenShift.
operatorframework.io/suggested-namespace: eclipse-che
repository: https://github.com/eclipse/che-operator
support: Eclipse Foundation
name: eclipse-che-preview-openshift.v7.25.0-70.nightly
name: eclipse-che-preview-openshift.v7.25.0-82.nightly
namespace: placeholder
spec:
apiservicedefinitions: {}
@ -394,7 +394,13 @@ spec:
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
resources: {}
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 100m
memory: 64Mi
securityContext:
capabilities:
drop:
@ -537,4 +543,4 @@ spec:
maturity: stable
provider:
name: Eclipse Foundation
version: 7.25.0-70.nightly
version: 7.25.0-82.nightly

View File

@ -72,6 +72,34 @@ spec:
field). If omitted or left blank, it will be set to the value
of the `flavour` field suffixed with `-public`.
type: string
identityProviderContainerResources:
description: Identity provider container custom settings
properties:
limits:
description: Limits describes the maximum amount of compute
resources allowed.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
request:
description: Requests describes the minimum amount of compute
resources required.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
type: object
identityProviderImage:
description: Overrides the container image used in the Identity
Provider (Keycloak / RH SSO) deployment. This includes the image
@ -179,6 +207,34 @@ spec:
description: Configuration settings related to the database used by
the Che installation.
properties:
chePostgresContainerResources:
description: Postgres container custom settings
properties:
limits:
description: Limits describes the maximum amount of compute
resources allowed.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
request:
description: Requests describes the minimum amount of compute
resources required.
properties:
cpu:
description: CPU, in cores. (500m = .5 cores)
type: string
memory:
description: Memory, in bytes. (500Gi = 500GiB = 500 * 1024
* 1024 * 1024)
type: string
type: object
type: object
chePostgresDb:
description: Postgres database name that the Che server uses to
connect to the DB. Defaults to `dbche`.
@ -432,6 +488,14 @@ spec:
config map from other CR fields, then the value defined in the
`customCheProperties` will be used instead.
type: object
devfileRegistryCpuLimit:
description: Overrides the cpu limit used in the Devfile registry
deployment. In cores. (500m = .5 cores). Default to 500m.
type: string
devfileRegistryCpuRequest:
description: Overrides the cpu request used in the Devfile registry
deployment. In cores. (500m = .5 cores). Default to 100m.
type: string
devfileRegistryImage:
description: Overrides the container image used in the Devfile registry
deployment. This includes the image tag. Omit it or leave it empty
@ -447,11 +511,13 @@ spec:
type: object
devfileRegistryMemoryLimit:
description: Overrides the memory limit used in the Devfile registry
deployment. Defaults to 256Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 256Mi.
type: string
devfileRegistryMemoryRequest:
description: Overrides the memory request used in the Devfile registry
deployment. Defaults to 16Mi.
deployment In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 32Mi.
type: string
devfileRegistryPullPolicy:
description: Overrides the image pull policy used in the Devfile
@ -503,6 +569,14 @@ spec:
doc https://docs.openshift.com/container-platform/4.4/networking/enable-cluster-wide-proxy.html)
(see also the `proxyURL` fields).'
type: string
pluginRegistryCpuLimit:
description: Overrides the cpu limit used in the Plugin registry
deployment. In cores. (500m = .5 cores). Default to 500m.
type: string
pluginRegistryCpuRequest:
description: Overrides the cpu request used in the Plugin registry
deployment. In cores. (500m = .5 cores). Default to 100m.
type: string
pluginRegistryImage:
description: Overrides the container image used in the Plugin registry
deployment. This includes the image tag. Omit it or leave it empty
@ -518,11 +592,13 @@ spec:
type: object
pluginRegistryMemoryLimit:
description: Overrides the memory limit used in the Plugin registry
deployment. Defaults to 256Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 256Mi.
type: string
pluginRegistryMemoryRequest:
description: Overrides the memory request used in the Plugin registry
deployment. Defaults to 16Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 32Mi.
type: string
pluginRegistryPullPolicy:
description: Overrides the image pull policy used in the Plugin
@ -580,6 +656,14 @@ spec:
operator will automatically detect if router certificate is self-signed.
If so it will be propagated to Che server and some other components.
type: boolean
serverCpuLimit:
description: Overrides the cpu limit used in the Che server deployment
In cores. (500m = .5 cores). Default to 1.
type: string
serverCpuRequest:
description: Overrides the cpu request used in the Che server deployment
In cores. (500m = .5 cores). Default to 100m.
type: string
serverExposureStrategy:
description: Sets the server and workspaces exposure type. Possible
values are "multi-host", "single-host", "default-host". Defaults
@ -595,11 +679,13 @@ spec:
type: string
serverMemoryLimit:
description: Overrides the memory limit used in the Che server deployment.
Defaults to 1Gi.
In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024). Defaults
to 1Gi.
type: string
serverMemoryRequest:
description: Overrides the memory request used in the Che server
deployment. Defaults to 512Mi.
deployment. In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024).
Defaults to 512Mi.
type: string
serverTrustStoreConfigMapName:
description: Name of the config-map with public certificates to

View File

@ -111,6 +111,13 @@ spec:
capabilities:
drop:
- ALL
resources:
requests:
memory: 64Mi
cpu: 100m
limits:
memory: 256Mi
cpu: 500m
restartPolicy: Always
serviceAccountName: che-operator
terminationGracePeriodSeconds: 5

3
go.mod
View File

@ -12,11 +12,11 @@ require (
github.com/prometheus/common v0.7.0
github.com/sirupsen/logrus v1.4.2
golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914
gopkg.in/yaml.v2 v2.2.8
k8s.io/api v0.18.2
k8s.io/apimachinery v0.18.2
k8s.io/client-go v12.0.0+incompatible
sigs.k8s.io/controller-runtime v0.6.0
sigs.k8s.io/yaml v1.2.0
)
// Pinned to kubernetes-1.16.2
@ -43,6 +43,7 @@ replace (
k8s.io/metrics => k8s.io/metrics v0.0.0-20191016113814-3b1a734dba6e
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9
sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.4.0
sigs.k8s.io/yaml => sigs.k8s.io/yaml v1.1.0
)
replace github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm

4
go.sum
View File

@ -1069,8 +1069,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
@ -1159,6 +1157,4 @@ sigs.k8s.io/testing_frameworks v0.1.2 h1:vK0+tvjF0BZ/RYFeZ1E6BYBwHJJXhjuZ3TdsEKH
sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w=
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI=

View File

@ -168,12 +168,22 @@ type CheClusterSpecServer struct {
// Default value is `Always` for `nightly` or `latest` images, and `IfNotPresent` in other cases.
// +optional
DevfileRegistryPullPolicy corev1.PullPolicy `json:"devfileRegistryPullPolicy,omitempty"`
// Overrides the memory limit used in the Devfile registry deployment. Defaults to 256Mi.
// Overrides the memory limit used in the Devfile registry deployment.
// In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024). Defaults to 256Mi.
// +optional
DevfileRegistryMemoryLimit string `json:"devfileRegistryMemoryLimit,omitempty"`
// Overrides the memory request used in the Devfile registry deployment. Defaults to 16Mi.
// Overrides the memory request used in the Devfile registry deployment
// In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024). Defaults to 32Mi.
// +optional
DevfileRegistryMemoryRequest string `json:"devfileRegistryMemoryRequest,omitempty"`
// Overrides the cpu limit used in the Devfile registry deployment.
// In cores. (500m = .5 cores). Default to 500m.
// +optional
DevfileRegistryCpuLimit string `json:"devfileRegistryCpuLimit,omitempty"`
// Overrides the cpu request used in the Devfile registry deployment.
// In cores. (500m = .5 cores). Default to 100m.
// +optional
DevfileRegistryCpuRequest string `json:"devfileRegistryCpuRequest,omitempty"`
// Devfile registry ingress custom settings
// +optional
DevfileRegistryIngress IngressCustomSettings `json:"devfileRegistryIngress,omitempty"`
@ -199,12 +209,22 @@ type CheClusterSpecServer struct {
// Default value is `Always` for `nightly` or `latest` images, and `IfNotPresent` in other cases.
// +optional
PluginRegistryPullPolicy corev1.PullPolicy `json:"pluginRegistryPullPolicy,omitempty"`
// Overrides the memory limit used in the Plugin registry deployment. Defaults to 256Mi.
// Overrides the memory limit used in the Plugin registry deployment.
// In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024). Defaults to 256Mi.
// +optional
PluginRegistryMemoryLimit string `json:"pluginRegistryMemoryLimit,omitempty"`
// Overrides the memory request used in the Plugin registry deployment. Defaults to 16Mi.
// Overrides the memory request used in the Plugin registry deployment.
// In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024). Defaults to 32Mi.
// +optional
PluginRegistryMemoryRequest string `json:"pluginRegistryMemoryRequest,omitempty"`
// Overrides the cpu limit used in the Plugin registry deployment.
// In cores. (500m = .5 cores). Default to 500m.
// +optional
PluginRegistryCpuLimit string `json:"pluginRegistryCpuLimit,omitempty"`
// Overrides the cpu request used in the Plugin registry deployment.
// In cores. (500m = .5 cores). Default to 100m.
// +optional
PluginRegistryCpuRequest string `json:"pluginRegistryCpuRequest,omitempty"`
// Plugin registry ingress custom settings
// +optional
PluginRegistryIngress IngressCustomSettings `json:"pluginRegistryIngress,omitempty"`
@ -260,13 +280,22 @@ type CheClusterSpecServer struct {
// If the secret is defined then `proxyUser` and `proxyPassword` are ignored
// +optional
ProxySecret string `json:"proxySecret,omitempty"`
// Overrides the memory request used in the Che server deployment. Defaults to 512Mi.
// Overrides the memory request used in the Che server deployment.
// In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024). Defaults to 512Mi.
// +optional
ServerMemoryRequest string `json:"serverMemoryRequest,omitempty"`
// Overrides the memory limit used in the Che server deployment. Defaults to 1Gi.
// Overrides the memory limit used in the Che server deployment.
// In bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024). Defaults to 1Gi.
// +optional
ServerMemoryLimit string `json:"serverMemoryLimit,omitempty"`
// Overrides the cpu limit used in the Che server deployment
// In cores. (500m = .5 cores). Default to 1.
// +optional
ServerCpuLimit string `json:"serverCpuLimit,omitempty"`
// Overrides the cpu request used in the Che server deployment
// In cores. (500m = .5 cores). Default to 100m.
// +optional
ServerCpuRequest string `json:"serverCpuRequest,omitempty"`
// Sets the server and workspaces exposure type. Possible values are "multi-host", "single-host", "default-host".
// Defaults to "multi-host" which creates a separate ingress (or route on OpenShift) for every required
// endpoint.
@ -345,6 +374,9 @@ type CheClusterSpecDB struct {
// Default value is `Always` for `nightly` or `latest` images, and `IfNotPresent` in other cases.
// +optional
PostgresImagePullPolicy corev1.PullPolicy `json:"postgresImagePullPolicy,omitempty"`
// Postgres container custom settings
// +optional
ChePostgresContainerResources ResourcesCustomSettings `json:"chePostgresContainerResources,omitempty"`
}
// +k8s:openapi-gen=true
@ -437,6 +469,9 @@ type CheClusterSpecAuth struct {
// Route custom settings
// +optional
IdentityProviderRoute RouteCustomSettings `json:"identityProviderRoute,omitempty"`
// Identity provider container custom settings
// +optional
IdentityProviderContainerResources ResourcesCustomSettings `json:"identityProviderContainerResources,omitempty"`
}
// Ingress custom settings, can be extended in the future
@ -453,6 +488,26 @@ type RouteCustomSettings struct {
Labels string `json:"labels,omitempty"`
}
// ResourceRequirements describes the compute resource requirements.
type ResourcesCustomSettings struct {
// Requests describes the minimum amount of compute resources required.
// +optional
Requests Resources `json:"request,omitempty"`
// Limits describes the maximum amount of compute resources allowed.
// +optional
Limits Resources `json:"limits,omitempty"`
}
// List of resources
type Resources struct {
// Memory, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024)
// +optional
Memory string `json:"memory,omitempty"`
// CPU, in cores. (500m = .5 cores)
// +optional
Cpu string `json:"cpu,omitempty"`
}
// +k8s:openapi-gen=true
// Configuration settings related to the persistent storage used by the Che installation.
type CheClusterSpecStorage struct {

View File

@ -103,6 +103,7 @@ func (in *CheClusterSpecAuth) DeepCopyInto(out *CheClusterSpecAuth) {
}
out.IdentityProviderIngress = in.IdentityProviderIngress
out.IdentityProviderRoute = in.IdentityProviderRoute
out.IdentityProviderContainerResources = in.IdentityProviderContainerResources
return
}
@ -119,6 +120,7 @@ func (in *CheClusterSpecAuth) DeepCopy() *CheClusterSpecAuth {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CheClusterSpecDB) DeepCopyInto(out *CheClusterSpecDB) {
*out = *in
out.ChePostgresContainerResources = in.ChePostgresContainerResources
return
}
@ -265,6 +267,40 @@ func (in *IngressCustomSettings) DeepCopy() *IngressCustomSettings {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Resources) DeepCopyInto(out *Resources) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Resources.
func (in *Resources) DeepCopy() *Resources {
if in == nil {
return nil
}
out := new(Resources)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ResourcesCustomSettings) DeepCopyInto(out *ResourcesCustomSettings) {
*out = *in
out.Requests = in.Requests
out.Limits = in.Limits
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourcesCustomSettings.
func (in *ResourcesCustomSettings) DeepCopy() *ResourcesCustomSettings {
if in == nil {
return nil
}
out := new(ResourcesCustomSettings)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RouteCustomSettings) DeepCopyInto(out *RouteCustomSettings) {
*out = *in

View File

@ -37,7 +37,6 @@ import (
operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
packagesv1 "github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1"
"github.com/sirupsen/logrus"
"gopkg.in/yaml.v2"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
rbacapi "k8s.io/api/rbac/v1"
@ -54,6 +53,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/log/zap"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
"sigs.k8s.io/yaml"
"testing"
)

View File

@ -18,7 +18,7 @@ import (
"os"
"strings"
"gopkg.in/yaml.v2"
"sigs.k8s.io/yaml"
"github.com/eclipse/che-operator/pkg/util"
"github.com/sirupsen/logrus"
@ -59,29 +59,21 @@ const (
DefaultPvcClaimSize = "1Gi"
DefaultIngressClass = "nginx"
DefaultPluginRegistryMemoryLimit = "256Mi"
DefaultPluginRegistryMemoryRequest = "16Mi"
// DefaultKube
DefaultDevfileRegistryMemoryLimit = "256Mi"
DefaultDevfileRegistryMemoryRequest = "16Mi"
DefaultKeycloakAdminUserName = "admin"
DefaultCheLogLevel = "INFO"
DefaultCheDebug = "false"
DefaultCheMultiUser = "true"
DefaultCheMetricsPort = int32(8087)
DefaultCheDebugPort = int32(8000)
DefaultCheVolumeMountPath = "/data"
DefaultCheVolumeClaimName = "che-data-volume"
DefaultPostgresVolumeClaimName = "postgres-data"
DefaultKeycloakAdminUserName = "admin"
DefaultCheLogLevel = "INFO"
DefaultCheDebug = "false"
DefaultCheMultiUser = "true"
DefaultCheMetricsPort = int32(8087)
DefaultCheDebugPort = int32(8000)
DefaultCheVolumeMountPath = "/data"
DefaultCheVolumeClaimName = "che-data-volume"
DefaultPostgresVolumeClaimName = "postgres-data"
DefaultJavaOpts = "-XX:MaxRAMPercentage=85.0"
DefaultWorkspaceJavaOpts = "-XX:MaxRAM=150m -XX:MaxRAMFraction=2 -XX:+UseParallelGC " +
"-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"
@ -113,6 +105,32 @@ const (
CheEclipseOrgMountAs = "che.eclipse.org/mount-as"
CheEclipseOrgEnvName = "che.eclipse.org/env-name"
CheEclipseOrgGithubOAuthCredentials = "che.eclipse.org/github-oauth-credentials"
// limits
DefaultPluginRegistryMemoryLimit = "256Mi"
DefaultPluginRegistryMemoryRequest = "32Mi"
DefaultPluginRegistryCpuLimit = "500m"
DefaultPluginRegistryCpuRequest = "100m"
DefaultDevfileRegistryMemoryLimit = "256Mi"
DefaultDevfileRegistryMemoryRequest = "32Mi"
DefaultDevfileRegistryCpuLimit = "500m"
DefaultDevfileRegistryCpuRequest = "100m"
DefaultServerMemoryLimit = "1024Mi"
DefaultServerMemoryRequest = "512Mi"
DefaultServerCpuLimit = "1"
DefaultServerCpuRequest = "100m"
DefaultIdentityProviderMemoryLimit = "1536Mi"
DefaultIdentityProviderMemoryRequest = "1024Mi"
DefaultIdentityProviderCpuLimit = "2"
DefaultIdentityProviderCpuRequest = "100m"
DefaultPostgresMemoryLimit = "1024Mi"
DefaultPostgresMemoryRequest = "512Mi"
DefaultPostgresCpuLimit = "500m"
DefaultPostgresCpuRequest = "100m"
)
func InitDefaults(defaultsPath string) {
@ -406,6 +424,8 @@ func InitTestDefaultsFromDeployment(deploymentFile string) error {
}
}
os.Setenv("MOCK_API", "true")
InitDefaultsFromEnv()
return nil
}

View File

@ -15,36 +15,61 @@ import (
"github.com/eclipse/che-operator/pkg/deploy"
"github.com/eclipse/che-operator/pkg/deploy/registry"
"github.com/eclipse/che-operator/pkg/util"
appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1"
)
func SyncDevfileRegistryDeploymentToCluster(deployContext *deploy.DeployContext) (bool, error) {
registryType := "devfile"
registryImage := util.GetValue(deployContext.CheCluster.Spec.Server.DevfileRegistryImage, deploy.DefaultDevfileRegistryImage(deployContext.CheCluster))
registryImagePullPolicy := v1.PullPolicy(util.GetValue(string(deployContext.CheCluster.Spec.Server.PluginRegistryPullPolicy), deploy.DefaultPullPolicyFromDockerImage(registryImage)))
registryMemoryLimit := util.GetValue(string(deployContext.CheCluster.Spec.Server.DevfileRegistryMemoryLimit), deploy.DefaultDevfileRegistryMemoryLimit)
registryMemoryRequest := util.GetValue(string(deployContext.CheCluster.Spec.Server.DevfileRegistryMemoryRequest), deploy.DefaultDevfileRegistryMemoryRequest)
probePath := "/devfiles/"
devfileImagesEnv := util.GetEnvByRegExp("^.*devfile_registry_image.*$")
clusterDeployment, err := deploy.GetClusterDeployment(deploy.DevfileRegistry, deployContext.CheCluster.Namespace, deployContext.ClusterAPI.Client)
if err != nil {
return false, err
}
specDeployment, err := GetDevfileRegistrySpecDeployment(deployContext)
if err != nil {
return false, err
}
return deploy.SyncDeploymentToCluster(deployContext, specDeployment, clusterDeployment, nil, nil)
}
func GetDevfileRegistrySpecDeployment(deployContext *deploy.DeployContext) (*appsv1.Deployment, error) {
registryType := "devfile"
registryImage := util.GetValue(deployContext.CheCluster.Spec.Server.DevfileRegistryImage, deploy.DefaultDevfileRegistryImage(deployContext.CheCluster))
registryImagePullPolicy := v1.PullPolicy(util.GetValue(string(deployContext.CheCluster.Spec.Server.DevfileRegistryPullPolicy), deploy.DefaultPullPolicyFromDockerImage(registryImage)))
probePath := "/devfiles/"
devfileImagesEnv := util.GetEnvByRegExp("^.*devfile_registry_image.*$")
resources := v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceMemory: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.DevfileRegistryMemoryRequest,
deploy.DefaultDevfileRegistryMemoryRequest),
v1.ResourceCPU: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.DevfileRegistryCpuRequest,
deploy.DefaultDevfileRegistryCpuRequest),
},
Limits: v1.ResourceList{
v1.ResourceMemory: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.DevfileRegistryMemoryLimit,
deploy.DefaultDevfileRegistryMemoryLimit),
v1.ResourceCPU: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.DevfileRegistryCpuLimit,
deploy.DefaultDevfileRegistryCpuLimit),
},
}
specDeployment, err := registry.GetSpecRegistryDeployment(
deployContext,
registryType,
registryImage,
devfileImagesEnv,
registryImagePullPolicy,
registryMemoryLimit,
registryMemoryRequest,
resources,
probePath)
if err != nil {
return false, err
return nil, err
}
return deploy.SyncDeploymentToCluster(deployContext, specDeployment, clusterDeployment, nil, nil)
return specDeployment, nil
}

View File

@ -0,0 +1,113 @@
//
// 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 devfile_registry
import (
"os"
"github.com/eclipse/che-operator/pkg/util"
"github.com/eclipse/che-operator/pkg/deploy"
orgv1 "github.com/eclipse/che-operator/pkg/apis/org/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes/scheme"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
"testing"
)
func TestDeployment(t *testing.T) {
type testCase struct {
name string
initObjects []runtime.Object
memoryLimit string
memoryRequest string
cpuRequest string
cpuLimit string
cheCluster *orgv1.CheCluster
}
testCases := []testCase{
{
name: "Test default limits",
initObjects: []runtime.Object{},
memoryLimit: deploy.DefaultDevfileRegistryMemoryLimit,
memoryRequest: deploy.DefaultDevfileRegistryMemoryRequest,
cpuLimit: deploy.DefaultDevfileRegistryCpuLimit,
cpuRequest: deploy.DefaultDevfileRegistryCpuRequest,
cheCluster: &orgv1.CheCluster{
ObjectMeta: metav1.ObjectMeta{
Namespace: "eclipse-che",
},
},
},
{
name: "Test custom limits",
initObjects: []runtime.Object{},
cpuLimit: "250m",
cpuRequest: "150m",
memoryLimit: "250Mi",
memoryRequest: "150Mi",
cheCluster: &orgv1.CheCluster{
ObjectMeta: metav1.ObjectMeta{
Namespace: "eclipse-che",
},
Spec: orgv1.CheClusterSpec{
Server: orgv1.CheClusterSpecServer{
DevfileRegistryCpuLimit: "250m",
DevfileRegistryCpuRequest: "150m",
DevfileRegistryMemoryLimit: "250Mi",
DevfileRegistryMemoryRequest: "150Mi",
},
},
},
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
logf.SetLogger(zap.LoggerTo(os.Stdout, true))
orgv1.SchemeBuilder.AddToScheme(scheme.Scheme)
testCase.initObjects = append(testCase.initObjects)
cli := fake.NewFakeClientWithScheme(scheme.Scheme, testCase.initObjects...)
deployContext := &deploy.DeployContext{
ClusterAPI: deploy.ClusterAPI{
Client: cli,
Scheme: scheme.Scheme,
},
Proxy: &deploy.Proxy{},
CheCluster: testCase.cheCluster,
}
deployment, err := GetDevfileRegistrySpecDeployment(deployContext)
if err != nil {
t.Fatalf("Error creating deployment: %v", err)
}
util.CompareResources(deployment,
util.TestExpectedResources{
MemoryLimit: testCase.memoryLimit,
MemoryRequest: testCase.memoryRequest,
CpuRequest: testCase.cpuRequest,
CpuLimit: testCase.cpuLimit,
},
t)
util.ValidateSecurityContext(deployment, t)
})
}
}

View File

@ -0,0 +1,21 @@
//
// Copyright (c) 2020-2020 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 devfile_registry
import "github.com/eclipse/che-operator/pkg/deploy"
func init() {
err := deploy.InitTestDefaultsFromDeployment("../../../deploy/operator.yaml")
if err != nil {
panic(err)
}
}

View File

@ -27,7 +27,6 @@ import (
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/intstr"
@ -64,7 +63,7 @@ func SyncKeycloakDeploymentToCluster(deployContext *deploy.DeployContext) (bool,
return false, err
}
specDeployment, err := getSpecKeycloakDeployment(deployContext, clusterDeployment)
specDeployment, err := GetSpecKeycloakDeployment(deployContext, clusterDeployment)
if err != nil {
return false, err
}
@ -72,7 +71,7 @@ func SyncKeycloakDeploymentToCluster(deployContext *deploy.DeployContext) (bool,
return deploy.SyncDeploymentToCluster(deployContext, specDeployment, clusterDeployment, keycloakCustomDiffOpts, keycloakAdditionalDeploymentMerge)
}
func getSpecKeycloakDeployment(
func GetSpecKeycloakDeployment(
deployContext *deploy.DeployContext,
clusterDeployment *appsv1.Deployment) (*appsv1.Deployment, error) {
optionalEnv := true
@ -588,10 +587,20 @@ func getSpecKeycloakDeployment(
},
Resources: corev1.ResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceMemory: resource.MustParse("512Mi"),
corev1.ResourceMemory: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Auth.IdentityProviderContainerResources.Requests.Memory,
deploy.DefaultIdentityProviderMemoryRequest),
corev1.ResourceCPU: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Auth.IdentityProviderContainerResources.Requests.Cpu,
deploy.DefaultIdentityProviderCpuRequest),
},
Limits: corev1.ResourceList{
corev1.ResourceMemory: resource.MustParse("2Gi"),
corev1.ResourceMemory: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Auth.IdentityProviderContainerResources.Limits.Memory,
deploy.DefaultIdentityProviderMemoryLimit),
corev1.ResourceCPU: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Auth.IdentityProviderContainerResources.Limits.Cpu,
deploy.DefaultIdentityProviderCpuLimit),
},
},
ReadinessProbe: &corev1.Probe{
@ -605,7 +614,7 @@ func getSpecKeycloakDeployment(
Scheme: corev1.URISchemeHTTP,
},
},
InitialDelaySeconds: 25,
InitialDelaySeconds: 30,
FailureThreshold: 10,
TimeoutSeconds: 5,
PeriodSeconds: 10,
@ -617,7 +626,7 @@ func getSpecKeycloakDeployment(
Port: intstr.FromInt(8080),
},
},
InitialDelaySeconds: 30,
InitialDelaySeconds: 90,
FailureThreshold: 10,
TimeoutSeconds: 5,
PeriodSeconds: 10,

View File

@ -0,0 +1,119 @@
//
// 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 identity_provider
import (
"os"
"github.com/eclipse/che-operator/pkg/util"
"github.com/eclipse/che-operator/pkg/deploy"
orgv1 "github.com/eclipse/che-operator/pkg/apis/org/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes/scheme"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
"testing"
)
func TestDeployment(t *testing.T) {
type testCase struct {
name string
initObjects []runtime.Object
memoryLimit string
memoryRequest string
cpuLimit string
cpuRequest string
cheCluster *orgv1.CheCluster
}
testCases := []testCase{
{
name: "Test default limits",
initObjects: []runtime.Object{},
memoryLimit: deploy.DefaultIdentityProviderMemoryLimit,
memoryRequest: deploy.DefaultIdentityProviderMemoryRequest,
cpuLimit: deploy.DefaultIdentityProviderCpuLimit,
cpuRequest: deploy.DefaultIdentityProviderCpuRequest,
cheCluster: &orgv1.CheCluster{
ObjectMeta: metav1.ObjectMeta{
Namespace: "eclipse-che",
},
},
},
{
name: "Test custom limits",
initObjects: []runtime.Object{},
cpuLimit: "250m",
cpuRequest: "150m",
memoryLimit: "250Mi",
memoryRequest: "150Mi",
cheCluster: &orgv1.CheCluster{
ObjectMeta: metav1.ObjectMeta{
Namespace: "eclipse-che",
},
Spec: orgv1.CheClusterSpec{
Auth: orgv1.CheClusterSpecAuth{
IdentityProviderContainerResources: orgv1.ResourcesCustomSettings{
Limits: orgv1.Resources{
Cpu: "250m",
Memory: "250Mi",
},
Requests: orgv1.Resources{
Cpu: "150m",
Memory: "150Mi",
},
},
},
},
},
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
logf.SetLogger(zap.LoggerTo(os.Stdout, true))
orgv1.SchemeBuilder.AddToScheme(scheme.Scheme)
testCase.initObjects = append(testCase.initObjects)
cli := fake.NewFakeClientWithScheme(scheme.Scheme, testCase.initObjects...)
deployContext := &deploy.DeployContext{
CheCluster: testCase.cheCluster,
ClusterAPI: deploy.ClusterAPI{
Client: cli,
Scheme: scheme.Scheme,
},
Proxy: &deploy.Proxy{},
}
deployment, err := GetSpecKeycloakDeployment(deployContext, nil)
if err != nil {
t.Fatalf("Error creating deployment: %v", err)
}
util.CompareResources(deployment,
util.TestExpectedResources{
MemoryLimit: testCase.memoryLimit,
MemoryRequest: testCase.memoryRequest,
CpuRequest: testCase.cpuRequest,
CpuLimit: testCase.cpuLimit,
},
t)
util.ValidateSecurityContext(deployment, t)
})
}
}

View File

@ -0,0 +1,21 @@
//
// Copyright (c) 2020-2020 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 identity_provider
import "github.com/eclipse/che-operator/pkg/deploy"
func init() {
err := deploy.InitTestDefaultsFromDeployment("../../../deploy/operator.yaml")
if err != nil {
panic(err)
}
}

View File

@ -15,36 +15,61 @@ import (
"github.com/eclipse/che-operator/pkg/deploy"
"github.com/eclipse/che-operator/pkg/deploy/registry"
"github.com/eclipse/che-operator/pkg/util"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
)
func SyncPluginRegistryDeploymentToCluster(deployContext *deploy.DeployContext) (bool, error) {
registryType := "plugin"
registryImage := util.GetValue(deployContext.CheCluster.Spec.Server.PluginRegistryImage, deploy.DefaultPluginRegistryImage(deployContext.CheCluster))
registryImagePullPolicy := corev1.PullPolicy(util.GetValue(string(deployContext.CheCluster.Spec.Server.PluginRegistryPullPolicy), deploy.DefaultPullPolicyFromDockerImage(registryImage)))
registryMemoryLimit := util.GetValue(string(deployContext.CheCluster.Spec.Server.PluginRegistryMemoryLimit), deploy.DefaultPluginRegistryMemoryLimit)
registryMemoryRequest := util.GetValue(string(deployContext.CheCluster.Spec.Server.PluginRegistryMemoryRequest), deploy.DefaultPluginRegistryMemoryRequest)
probePath := "/v3/plugins/"
pluginImagesEnv := util.GetEnvByRegExp("^.*plugin_registry_image.*$")
clusterDeployment, err := deploy.GetClusterDeployment(deploy.PluginRegistry, deployContext.CheCluster.Namespace, deployContext.ClusterAPI.Client)
if err != nil {
return false, err
}
specDeployment, err := GetPluginRegistrySpecDeployment(deployContext)
if err != nil {
return false, err
}
return deploy.SyncDeploymentToCluster(deployContext, specDeployment, clusterDeployment, nil, nil)
}
func GetPluginRegistrySpecDeployment(deployContext *deploy.DeployContext) (*appsv1.Deployment, error) {
registryType := "plugin"
registryImage := util.GetValue(deployContext.CheCluster.Spec.Server.PluginRegistryImage, deploy.DefaultPluginRegistryImage(deployContext.CheCluster))
registryImagePullPolicy := corev1.PullPolicy(util.GetValue(string(deployContext.CheCluster.Spec.Server.PluginRegistryPullPolicy), deploy.DefaultPullPolicyFromDockerImage(registryImage)))
probePath := "/v3/plugins/"
pluginImagesEnv := util.GetEnvByRegExp("^.*plugin_registry_image.*$")
resources := corev1.ResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceMemory: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.PluginRegistryMemoryRequest,
deploy.DefaultPluginRegistryMemoryRequest),
corev1.ResourceCPU: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.PluginRegistryCpuRequest,
deploy.DefaultPluginRegistryCpuRequest),
},
Limits: corev1.ResourceList{
corev1.ResourceMemory: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.PluginRegistryMemoryLimit,
deploy.DefaultPluginRegistryMemoryLimit),
corev1.ResourceCPU: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.PluginRegistryCpuLimit,
deploy.DefaultPluginRegistryCpuLimit),
},
}
specDeployment, err := registry.GetSpecRegistryDeployment(
deployContext,
registryType,
registryImage,
pluginImagesEnv,
registryImagePullPolicy,
registryMemoryLimit,
registryMemoryRequest,
resources,
probePath)
if err != nil {
return false, err
return nil, err
}
return deploy.SyncDeploymentToCluster(deployContext, specDeployment, clusterDeployment, nil, nil)
return specDeployment, nil
}

View File

@ -0,0 +1,113 @@
//
// 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 plugin_registry
import (
"os"
"github.com/eclipse/che-operator/pkg/util"
"github.com/eclipse/che-operator/pkg/deploy"
orgv1 "github.com/eclipse/che-operator/pkg/apis/org/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes/scheme"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
"testing"
)
func TestDeployment(t *testing.T) {
type testCase struct {
name string
initObjects []runtime.Object
memoryLimit string
memoryRequest string
cpuRequest string
cpuLimit string
cheCluster *orgv1.CheCluster
}
testCases := []testCase{
{
name: "Test default limits",
initObjects: []runtime.Object{},
memoryLimit: deploy.DefaultPluginRegistryMemoryLimit,
memoryRequest: deploy.DefaultPluginRegistryMemoryRequest,
cpuLimit: deploy.DefaultPluginRegistryCpuLimit,
cpuRequest: deploy.DefaultPluginRegistryCpuRequest,
cheCluster: &orgv1.CheCluster{
ObjectMeta: metav1.ObjectMeta{
Namespace: "eclipse-che",
},
},
},
{
name: "Test custom limits",
initObjects: []runtime.Object{},
cpuLimit: "250m",
cpuRequest: "150m",
memoryLimit: "250Mi",
memoryRequest: "150Mi",
cheCluster: &orgv1.CheCluster{
ObjectMeta: metav1.ObjectMeta{
Namespace: "eclipse-che",
},
Spec: orgv1.CheClusterSpec{
Server: orgv1.CheClusterSpecServer{
PluginRegistryCpuLimit: "250m",
PluginRegistryCpuRequest: "150m",
PluginRegistryMemoryLimit: "250Mi",
PluginRegistryMemoryRequest: "150Mi",
},
},
},
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
logf.SetLogger(zap.LoggerTo(os.Stdout, true))
orgv1.SchemeBuilder.AddToScheme(scheme.Scheme)
testCase.initObjects = append(testCase.initObjects)
cli := fake.NewFakeClientWithScheme(scheme.Scheme, testCase.initObjects...)
deployContext := &deploy.DeployContext{
CheCluster: testCase.cheCluster,
ClusterAPI: deploy.ClusterAPI{
Client: cli,
Scheme: scheme.Scheme,
},
Proxy: &deploy.Proxy{},
}
deployment, err := GetPluginRegistrySpecDeployment(deployContext)
if err != nil {
t.Fatalf("Error creating deployment: %v", err)
}
util.CompareResources(deployment,
util.TestExpectedResources{
MemoryLimit: testCase.memoryLimit,
MemoryRequest: testCase.memoryRequest,
CpuRequest: testCase.cpuRequest,
CpuLimit: testCase.cpuLimit,
},
t)
util.ValidateSecurityContext(deployment, t)
})
}
}

View File

@ -0,0 +1,21 @@
//
// Copyright (c) 2020-2020 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 plugin_registry
import "github.com/eclipse/che-operator/pkg/deploy"
func init() {
err := deploy.InitTestDefaultsFromDeployment("../../../deploy/operator.yaml")
if err != nil {
panic(err)
}
}

View File

@ -0,0 +1,119 @@
//
// 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 postgres
import (
"os"
"github.com/eclipse/che-operator/pkg/util"
"github.com/eclipse/che-operator/pkg/deploy"
orgv1 "github.com/eclipse/che-operator/pkg/apis/org/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes/scheme"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
"testing"
)
func TestDeployment(t *testing.T) {
type testCase struct {
name string
initObjects []runtime.Object
memoryLimit string
memoryRequest string
cpuLimit string
cpuRequest string
cheCluster *orgv1.CheCluster
}
testCases := []testCase{
{
name: "Test default limits",
initObjects: []runtime.Object{},
memoryLimit: deploy.DefaultPostgresMemoryLimit,
memoryRequest: deploy.DefaultPostgresMemoryRequest,
cpuLimit: deploy.DefaultPostgresCpuLimit,
cpuRequest: deploy.DefaultPostgresCpuRequest,
cheCluster: &orgv1.CheCluster{
ObjectMeta: metav1.ObjectMeta{
Namespace: "eclipse-che",
},
},
},
{
name: "Test custom limits",
initObjects: []runtime.Object{},
cpuLimit: "250m",
cpuRequest: "150m",
memoryLimit: "250Mi",
memoryRequest: "150Mi",
cheCluster: &orgv1.CheCluster{
ObjectMeta: metav1.ObjectMeta{
Namespace: "eclipse-che",
},
Spec: orgv1.CheClusterSpec{
Database: orgv1.CheClusterSpecDB{
ChePostgresContainerResources: orgv1.ResourcesCustomSettings{
Limits: orgv1.Resources{
Cpu: "250m",
Memory: "250Mi",
},
Requests: orgv1.Resources{
Memory: "150Mi",
Cpu: "150m",
},
},
},
},
},
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
logf.SetLogger(zap.LoggerTo(os.Stdout, true))
orgv1.SchemeBuilder.AddToScheme(scheme.Scheme)
testCase.initObjects = append(testCase.initObjects)
cli := fake.NewFakeClientWithScheme(scheme.Scheme, testCase.initObjects...)
deployContext := &deploy.DeployContext{
CheCluster: testCase.cheCluster,
ClusterAPI: deploy.ClusterAPI{
Client: cli,
Scheme: scheme.Scheme,
},
Proxy: &deploy.Proxy{},
}
deployment, err := GetSpecPostgresDeployment(deployContext, nil)
if err != nil {
t.Fatalf("Error creating deployment: %v", err)
}
util.CompareResources(deployment,
util.TestExpectedResources{
MemoryLimit: testCase.memoryLimit,
MemoryRequest: testCase.memoryRequest,
CpuRequest: testCase.cpuRequest,
CpuLimit: testCase.cpuLimit,
},
t)
util.ValidateSecurityContext(deployment, t)
})
}
}

View File

@ -16,7 +16,6 @@ import (
"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"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
@ -36,7 +35,7 @@ func SyncPostgresDeploymentToCluster(deployContext *deploy.DeployContext) (bool,
return false, err
}
specDeployment, err := getSpecPostgresDeployment(deployContext, clusterDeployment)
specDeployment, err := GetSpecPostgresDeployment(deployContext, clusterDeployment)
if err != nil {
return false, err
}
@ -44,7 +43,7 @@ func SyncPostgresDeploymentToCluster(deployContext *deploy.DeployContext) (bool,
return deploy.SyncDeploymentToCluster(deployContext, specDeployment, clusterDeployment, nil, nil)
}
func getSpecPostgresDeployment(deployContext *deploy.DeployContext, clusterDeployment *appsv1.Deployment) (*appsv1.Deployment, error) {
func GetSpecPostgresDeployment(deployContext *deploy.DeployContext, clusterDeployment *appsv1.Deployment) (*appsv1.Deployment, error) {
isOpenShift, _, err := util.DetectOpenShift()
if err != nil {
return nil, err
@ -110,10 +109,20 @@ func getSpecPostgresDeployment(deployContext *deploy.DeployContext, clusterDeplo
},
Resources: corev1.ResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceMemory: resource.MustParse("512Mi"),
corev1.ResourceMemory: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Database.ChePostgresContainerResources.Requests.Memory,
deploy.DefaultPostgresMemoryRequest),
corev1.ResourceCPU: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Database.ChePostgresContainerResources.Requests.Cpu,
deploy.DefaultPostgresCpuRequest),
},
Limits: corev1.ResourceList{
corev1.ResourceMemory: resource.MustParse("1Gi"),
corev1.ResourceMemory: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Database.ChePostgresContainerResources.Limits.Memory,
deploy.DefaultPostgresMemoryLimit),
corev1.ResourceCPU: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Database.ChePostgresContainerResources.Limits.Cpu,
deploy.DefaultPostgresCpuLimit),
},
},
VolumeMounts: []corev1.VolumeMount{

View File

@ -0,0 +1,21 @@
//
// Copyright (c) 2020-2020 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 postgres
import "github.com/eclipse/che-operator/pkg/deploy"
func init() {
err := deploy.InitTestDefaultsFromDeployment("../../../deploy/operator.yaml")
if err != nil {
panic(err)
}
}

View File

@ -5,7 +5,6 @@ import (
"github.com/eclipse/che-operator/pkg/util"
v12 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
v13 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
@ -17,8 +16,7 @@ func GetSpecRegistryDeployment(
registryImage string,
env []v1.EnvVar,
registryImagePullPolicy v1.PullPolicy,
registryMemoryLimit string,
registryMemoryRequest string,
resources v1.ResourceRequirements,
probePath string) (*v12.Deployment, error) {
terminationGracePeriodSeconds := int64(30)
@ -77,14 +75,7 @@ func GetSpecRegistryDeployment(
},
},
},
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceMemory: resource.MustParse(registryMemoryRequest),
},
Limits: v1.ResourceList{
v1.ResourceMemory: resource.MustParse(registryMemoryLimit),
},
},
Resources: resources,
ReadinessProbe: &v1.Probe{
Handler: v1.Handler{
HTTPGet: &v1.HTTPGetAction{

View File

@ -21,7 +21,6 @@ import (
"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"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
@ -33,7 +32,7 @@ func SyncCheDeploymentToCluster(deployContext *deploy.DeployContext) (bool, erro
return false, err
}
specDeployment, err := getSpecCheDeployment(deployContext)
specDeployment, err := GetSpecCheDeployment(deployContext)
if err != nil {
return false, err
}
@ -41,7 +40,7 @@ func SyncCheDeploymentToCluster(deployContext *deploy.DeployContext) (bool, erro
return deploy.SyncDeploymentToCluster(deployContext, specDeployment, clusterDeployment, nil, nil)
}
func getSpecCheDeployment(deployContext *deploy.DeployContext) (*appsv1.Deployment, error) {
func GetSpecCheDeployment(deployContext *deploy.DeployContext) (*appsv1.Deployment, error) {
isOpenShift, _, err := util.DetectOpenShift()
if err != nil {
return nil, err
@ -59,7 +58,6 @@ func getSpecCheDeployment(deployContext *deploy.DeployContext) (*appsv1.Deployme
cheFlavor := deploy.DefaultCheFlavor(deployContext.CheCluster)
labels := deploy.GetLabels(deployContext.CheCluster, cheFlavor)
optionalEnv := true
memRequest := util.GetValue(deployContext.CheCluster.Spec.Server.ServerMemoryRequest, deploy.DefaultServerMemoryRequest)
selfSignedCertEnv := corev1.EnvVar{
Name: "CHE_SELF__SIGNED__CERT",
Value: "",
@ -182,7 +180,6 @@ func getSpecCheDeployment(deployContext *deploy.DeployContext) (*appsv1.Deployme
FieldPath: "metadata.namespace"}},
})
memLimit := util.GetValue(deployContext.CheCluster.Spec.Server.ServerMemoryLimit, deploy.DefaultServerMemoryLimit)
cheImageAndTag := GetFullCheServerImageLink(deployContext.CheCluster)
pullPolicy := corev1.PullPolicy(util.GetValue(string(deployContext.CheCluster.Spec.Server.CheImagePullPolicy), deploy.DefaultPullPolicyFromDockerImage(cheImageAndTag)))
@ -235,10 +232,20 @@ func getSpecCheDeployment(deployContext *deploy.DeployContext) (*appsv1.Deployme
},
Resources: corev1.ResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceMemory: resource.MustParse(memRequest),
corev1.ResourceMemory: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.ServerMemoryRequest,
deploy.DefaultServerMemoryRequest),
corev1.ResourceCPU: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.ServerCpuRequest,
deploy.DefaultServerCpuRequest),
},
Limits: corev1.ResourceList{
corev1.ResourceMemory: resource.MustParse(memLimit),
corev1.ResourceMemory: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.ServerMemoryLimit,
deploy.DefaultServerMemoryLimit),
corev1.ResourceCPU: util.GetResourceQuantity(
deployContext.CheCluster.Spec.Server.ServerCpuLimit,
deploy.DefaultServerCpuLimit),
},
},
SecurityContext: &corev1.SecurityContext{

View File

@ -0,0 +1,112 @@
//
// 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 server
import (
"os"
"github.com/eclipse/che-operator/pkg/util"
"github.com/eclipse/che-operator/pkg/deploy"
orgv1 "github.com/eclipse/che-operator/pkg/apis/org/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes/scheme"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
"testing"
)
func TestDeployment(t *testing.T) {
type testCase struct {
name string
initObjects []runtime.Object
memoryLimit string
memoryRequest string
cpuLimit string
cpuRequest string
cheCluster *orgv1.CheCluster
}
testCases := []testCase{
{
name: "Test default limits",
initObjects: []runtime.Object{},
memoryLimit: deploy.DefaultServerMemoryLimit,
memoryRequest: deploy.DefaultServerMemoryRequest,
cpuLimit: deploy.DefaultServerCpuLimit,
cpuRequest: deploy.DefaultServerCpuRequest,
cheCluster: &orgv1.CheCluster{
ObjectMeta: metav1.ObjectMeta{
Namespace: "eclipse-che",
},
},
},
{
name: "Test custom limits",
initObjects: []runtime.Object{},
cpuLimit: "250m",
cpuRequest: "150m",
memoryLimit: "250Mi",
memoryRequest: "150Mi",
cheCluster: &orgv1.CheCluster{
ObjectMeta: metav1.ObjectMeta{
Namespace: "eclipse-che",
},
Spec: orgv1.CheClusterSpec{
Server: orgv1.CheClusterSpecServer{
ServerCpuLimit: "250m",
ServerCpuRequest: "150m",
ServerMemoryLimit: "250Mi",
ServerMemoryRequest: "150Mi",
},
},
},
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
logf.SetLogger(zap.LoggerTo(os.Stdout, true))
orgv1.SchemeBuilder.AddToScheme(scheme.Scheme)
testCase.initObjects = append(testCase.initObjects)
cli := fake.NewFakeClientWithScheme(scheme.Scheme, testCase.initObjects...)
deployContext := &deploy.DeployContext{
CheCluster: testCase.cheCluster,
ClusterAPI: deploy.ClusterAPI{
Client: cli,
Scheme: scheme.Scheme,
},
}
deployment, err := GetSpecCheDeployment(deployContext)
if err != nil {
t.Fatalf("Error creating deployment: %v", err)
}
util.CompareResources(deployment,
util.TestExpectedResources{
MemoryLimit: testCase.memoryLimit,
MemoryRequest: testCase.memoryRequest,
CpuRequest: testCase.cpuRequest,
CpuLimit: testCase.cpuLimit,
},
t)
util.ValidateSecurityContext(deployment, t)
})
}
}

69
pkg/util/test_util.go Normal file
View File

@ -0,0 +1,69 @@
//
// 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 util
import (
"testing"
appsv1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/api/resource"
)
type TestExpectedResources struct {
MemoryLimit string
MemoryRequest string
CpuRequest string
CpuLimit string
}
func CompareResources(actualDeployment *appsv1.Deployment, expected TestExpectedResources, t *testing.T) {
compareQuantity(
"Memory limits",
actualDeployment.Spec.Template.Spec.Containers[0].Resources.Limits.Memory(),
expected.MemoryLimit,
t,
)
compareQuantity(
"Memory requests",
actualDeployment.Spec.Template.Spec.Containers[0].Resources.Requests.Memory(),
expected.MemoryRequest,
t,
)
compareQuantity(
"CPU limits",
actualDeployment.Spec.Template.Spec.Containers[0].Resources.Limits.Cpu(),
expected.CpuLimit,
t,
)
compareQuantity(
"CPU requests",
actualDeployment.Spec.Template.Spec.Containers[0].Resources.Requests.Cpu(),
expected.CpuRequest,
t,
)
}
func ValidateSecurityContext(actualDeployment *appsv1.Deployment, t *testing.T) {
if actualDeployment.Spec.Template.Spec.Containers[0].SecurityContext.Capabilities.Drop[0] != "ALL" {
t.Error("Deployment doesn't contain 'Capabilities Drop ALL' in a SecurityContext")
}
}
func compareQuantity(resource string, actualQuantity *resource.Quantity, expected string, t *testing.T) {
expectedQuantity := GetResourceQuantity(expected, expected)
if !actualQuantity.Equal(expectedQuantity) {
t.Errorf("%s: expected %s, actual %s", resource, expectedQuantity.String(), actualQuantity.String())
}
}

View File

@ -32,6 +32,7 @@ import (
"github.com/sirupsen/logrus"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/discovery"
"sigs.k8s.io/controller-runtime/pkg/client/config"
@ -353,3 +354,10 @@ func IsOAuthEnabled(c *orgv1.CheCluster) bool {
}
return false
}
func GetResourceQuantity(value string, defaultValue string) resource.Quantity {
if value != "" {
return resource.MustParse(value)
}
return resource.MustParse(defaultValue)
}