diff --git a/api/checluster_conversion_from_test.go b/api/checluster_conversion_from_test.go index 8cb9d1694..9b78646e5 100644 --- a/api/checluster_conversion_from_test.go +++ b/api/checluster_conversion_from_test.go @@ -594,3 +594,43 @@ func TestConvertFrom(t *testing.T) { assert.Equal(t, checlusterv1.Spec.GitServices.BitBucket[0].SecretName, "bitbucket-secret-name") assert.Equal(t, checlusterv1.Spec.GitServices.BitBucket[0].Endpoint, "bitbucket-endpoint") } + +func TestShouldConvertFromWhenOnlyMemoryResourceSpecified(t *testing.T) { + infrastructure.InitializeForTesting(infrastructure.OpenShiftv4) + + checlusterv2 := &chev2.CheCluster{ + ObjectMeta: metav1.ObjectMeta{ + Name: "eclipse-che", + Namespace: "eclipse-che", + }, + Spec: chev2.CheClusterSpec{ + Components: chev2.CheClusterComponents{ + CheServer: chev2.CheServer{ + Deployment: &chev2.Deployment{ + Containers: []chev2.Container{ + { + Resources: &chev2.ResourceRequirements{ + Requests: &chev2.ResourceList{ + Memory: resource.MustParse("128Mi"), + }, + Limits: &chev2.ResourceList{ + Memory: resource.MustParse("228Mi"), + }, + }, + }, + }, + }, + }, + }, + }, + } + + checlusterv1 := &chev1.CheCluster{} + err := checlusterv1.ConvertFrom(checlusterv2) + assert.Nil(t, err) + + assert.Empty(t, checlusterv1.Spec.Server.ServerCpuLimit) + assert.Empty(t, checlusterv1.Spec.Server.ServerCpuRequest) + assert.Equal(t, checlusterv1.Spec.Server.ServerMemoryLimit, "228Mi") + assert.Equal(t, checlusterv1.Spec.Server.ServerMemoryRequest, "128Mi") +} diff --git a/api/checluster_conversion_to_test.go b/api/checluster_conversion_to_test.go index b145239a3..882c92c93 100644 --- a/api/checluster_conversion_to_test.go +++ b/api/checluster_conversion_to_test.go @@ -543,3 +543,29 @@ func TestConvertTo(t *testing.T) { assert.Equal(t, checlusterv2.Spec.GitServices.BitBucket[0].SecretName, "bitbucket-secret-name") assert.Equal(t, checlusterv2.Spec.GitServices.BitBucket[0].Endpoint, "bitbucket-endpoint") } + +func TestShouldConvertToWhenOnlyMemoryResourceSpecified(t *testing.T) { + infrastructure.InitializeForTesting(infrastructure.Kubernetes) + + checlusterv1 := &chev1.CheCluster{ + ObjectMeta: metav1.ObjectMeta{ + Name: "eclipse-che", + Namespace: "eclipse-che", + }, + Spec: chev1.CheClusterSpec{ + Server: chev1.CheClusterSpecServer{ + ServerMemoryLimit: "10Gi", + ServerMemoryRequest: "5Gi", + }, + }, + } + + checlusterv2 := &chev2.CheCluster{} + err := checlusterv1.ConvertTo(checlusterv2) + assert.Nil(t, err) + + assert.True(t, checlusterv2.Spec.Components.CheServer.Deployment.Containers[0].Resources.Limits.Cpu.IsZero()) + assert.Equal(t, checlusterv2.Spec.Components.CheServer.Deployment.Containers[0].Resources.Limits.Memory, resource.MustParse("10Gi")) + assert.True(t, checlusterv2.Spec.Components.CheServer.Deployment.Containers[0].Resources.Requests.Cpu.IsZero()) + assert.Equal(t, checlusterv2.Spec.Components.CheServer.Deployment.Containers[0].Resources.Requests.Memory, resource.MustParse("5Gi")) +} diff --git a/api/v1/checluster_conversion_from.go b/api/v1/checluster_conversion_from.go index bcce87092..444bc58e1 100644 --- a/api/v1/checluster_conversion_from.go +++ b/api/v1/checluster_conversion_from.go @@ -17,6 +17,8 @@ import ( "strconv" "strings" + "k8s.io/apimachinery/pkg/api/resource" + "github.com/eclipse-che/che-operator/pkg/common/utils" "github.com/devfile/devworkspace-operator/pkg/infrastructure" @@ -153,12 +155,12 @@ func (dst *CheCluster) convertFrom_Server(src *chev2.CheCluster) error { if src.Spec.Components.CheServer.Deployment.Containers[0].Resources != nil { if src.Spec.Components.CheServer.Deployment.Containers[0].Resources.Requests != nil { - dst.Spec.Server.ServerMemoryRequest = src.Spec.Components.CheServer.Deployment.Containers[0].Resources.Requests.Memory.String() - dst.Spec.Server.ServerCpuRequest = src.Spec.Components.CheServer.Deployment.Containers[0].Resources.Requests.Cpu.String() + dst.Spec.Server.ServerMemoryRequest = resource2String(src.Spec.Components.CheServer.Deployment.Containers[0].Resources.Requests.Memory) + dst.Spec.Server.ServerCpuRequest = resource2String(src.Spec.Components.CheServer.Deployment.Containers[0].Resources.Requests.Cpu) } if src.Spec.Components.CheServer.Deployment.Containers[0].Resources.Limits != nil { - dst.Spec.Server.ServerMemoryLimit = src.Spec.Components.CheServer.Deployment.Containers[0].Resources.Limits.Memory.String() - dst.Spec.Server.ServerCpuLimit = src.Spec.Components.CheServer.Deployment.Containers[0].Resources.Limits.Cpu.String() + dst.Spec.Server.ServerMemoryLimit = resource2String(src.Spec.Components.CheServer.Deployment.Containers[0].Resources.Limits.Memory) + dst.Spec.Server.ServerCpuLimit = resource2String(src.Spec.Components.CheServer.Deployment.Containers[0].Resources.Limits.Cpu) } } } @@ -234,12 +236,12 @@ func (dst *CheCluster) convertFrom_Server_PluginRegistry(src *chev2.CheCluster) if src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources != nil { if src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources.Requests != nil { - dst.Spec.Server.PluginRegistryMemoryRequest = src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources.Requests.Memory.String() - dst.Spec.Server.PluginRegistryCpuRequest = src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources.Requests.Cpu.String() + dst.Spec.Server.PluginRegistryMemoryRequest = resource2String(src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources.Requests.Memory) + dst.Spec.Server.PluginRegistryCpuRequest = resource2String(src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources.Requests.Cpu) } if src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources.Limits != nil { - dst.Spec.Server.PluginRegistryMemoryLimit = src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources.Limits.Memory.String() - dst.Spec.Server.PluginRegistryCpuLimit = src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources.Limits.Cpu.String() + dst.Spec.Server.PluginRegistryMemoryLimit = resource2String(src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources.Limits.Memory) + dst.Spec.Server.PluginRegistryCpuLimit = resource2String(src.Spec.Components.PluginRegistry.Deployment.Containers[0].Resources.Limits.Cpu) } } } @@ -266,12 +268,12 @@ func (dst *CheCluster) convertFrom_Server_DevfileRegistry(src *chev2.CheCluster) if src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources != nil { if src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources.Requests != nil { - dst.Spec.Server.DevfileRegistryMemoryRequest = src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources.Requests.Memory.String() - dst.Spec.Server.DevfileRegistryCpuRequest = src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources.Requests.Cpu.String() + dst.Spec.Server.DevfileRegistryMemoryRequest = resource2String(src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources.Requests.Memory) + dst.Spec.Server.DevfileRegistryCpuRequest = resource2String(src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources.Requests.Cpu) } if src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources.Limits != nil { - dst.Spec.Server.DevfileRegistryMemoryLimit = src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources.Limits.Memory.String() - dst.Spec.Server.DevfileRegistryCpuLimit = src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources.Limits.Cpu.String() + dst.Spec.Server.DevfileRegistryMemoryLimit = resource2String(src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources.Limits.Memory) + dst.Spec.Server.DevfileRegistryCpuLimit = resource2String(src.Spec.Components.DevfileRegistry.Deployment.Containers[0].Resources.Limits.Cpu) } } } @@ -288,12 +290,12 @@ func (dst *CheCluster) convertFrom_Server_Dashboard(src *chev2.CheCluster) error dst.Spec.Server.DashboardImagePullPolicy = string(src.Spec.Components.Dashboard.Deployment.Containers[0].ImagePullPolicy) if src.Spec.Components.Dashboard.Deployment.Containers[0].Resources != nil { if src.Spec.Components.Dashboard.Deployment.Containers[0].Resources.Requests != nil { - dst.Spec.Server.DashboardMemoryRequest = src.Spec.Components.Dashboard.Deployment.Containers[0].Resources.Requests.Memory.String() - dst.Spec.Server.DashboardCpuRequest = src.Spec.Components.Dashboard.Deployment.Containers[0].Resources.Requests.Cpu.String() + dst.Spec.Server.DashboardMemoryRequest = resource2String(src.Spec.Components.Dashboard.Deployment.Containers[0].Resources.Requests.Memory) + dst.Spec.Server.DashboardCpuRequest = resource2String(src.Spec.Components.Dashboard.Deployment.Containers[0].Resources.Requests.Cpu) } if src.Spec.Components.Dashboard.Deployment.Containers[0].Resources.Limits != nil { - dst.Spec.Server.DashboardMemoryLimit = src.Spec.Components.Dashboard.Deployment.Containers[0].Resources.Limits.Memory.String() - dst.Spec.Server.DashboardCpuLimit = src.Spec.Components.Dashboard.Deployment.Containers[0].Resources.Limits.Cpu.String() + dst.Spec.Server.DashboardMemoryLimit = resource2String(src.Spec.Components.Dashboard.Deployment.Containers[0].Resources.Limits.Memory) + dst.Spec.Server.DashboardCpuLimit = resource2String(src.Spec.Components.Dashboard.Deployment.Containers[0].Resources.Limits.Cpu) } } } @@ -368,12 +370,12 @@ func (dst *CheCluster) convertFrom_Database(src *chev2.CheCluster) error { dst.Spec.Database.PostgresImagePullPolicy = src.Spec.Components.Database.Deployment.Containers[0].ImagePullPolicy if src.Spec.Components.Database.Deployment.Containers[0].Resources != nil { if src.Spec.Components.Database.Deployment.Containers[0].Resources.Requests != nil { - dst.Spec.Database.ChePostgresContainerResources.Requests.Memory = src.Spec.Components.Database.Deployment.Containers[0].Resources.Requests.Memory.String() - dst.Spec.Database.ChePostgresContainerResources.Requests.Cpu = src.Spec.Components.Database.Deployment.Containers[0].Resources.Requests.Cpu.String() + dst.Spec.Database.ChePostgresContainerResources.Requests.Memory = resource2String(src.Spec.Components.Database.Deployment.Containers[0].Resources.Requests.Memory) + dst.Spec.Database.ChePostgresContainerResources.Requests.Cpu = resource2String(src.Spec.Components.Database.Deployment.Containers[0].Resources.Requests.Cpu) } if src.Spec.Components.Database.Deployment.Containers[0].Resources.Limits != nil { - dst.Spec.Database.ChePostgresContainerResources.Limits.Memory = src.Spec.Components.Database.Deployment.Containers[0].Resources.Limits.Memory.String() - dst.Spec.Database.ChePostgresContainerResources.Limits.Cpu = src.Spec.Components.Database.Deployment.Containers[0].Resources.Limits.Cpu.String() + dst.Spec.Database.ChePostgresContainerResources.Limits.Memory = resource2String(src.Spec.Components.Database.Deployment.Containers[0].Resources.Limits.Memory) + dst.Spec.Database.ChePostgresContainerResources.Limits.Cpu = resource2String(src.Spec.Components.Database.Deployment.Containers[0].Resources.Limits.Cpu) } } } @@ -479,3 +481,10 @@ func findTrustStoreConfigMap(namespace string) (string, error) { return "", nil } + +func resource2String(resource resource.Quantity) string { + if resource.IsZero() { + return "" + } + return resource.String() +} diff --git a/api/v1/checluster_conversion_to.go b/api/v1/checluster_conversion_to.go index c601a2e05..f3ed73456 100644 --- a/api/v1/checluster_conversion_to.go +++ b/api/v1/checluster_conversion_to.go @@ -669,11 +669,16 @@ func toCheV2Deployment( } if memoryRequest != "" || cpuRequest != "" { - resources = &chev2.ResourceRequirements{ - Requests: &chev2.ResourceList{ - Memory: resource.MustParse(memoryRequest), - Cpu: resource.MustParse(cpuRequest), - }, + if resources == nil { + resources = &chev2.ResourceRequirements{} + } + resources.Requests = &chev2.ResourceList{} + + if memoryRequest != "" { + resources.Requests.Memory = resource.MustParse(memoryRequest) + } + if cpuRequest != "" { + resources.Requests.Cpu = resource.MustParse(cpuRequest) } } @@ -681,10 +686,13 @@ func toCheV2Deployment( if resources == nil { resources = &chev2.ResourceRequirements{} } + resources.Limits = &chev2.ResourceList{} - resources.Limits = &chev2.ResourceList{ - Memory: resource.MustParse(memoryLimit), - Cpu: resource.MustParse(cpuLimit), + if memoryLimit != "" { + resources.Limits.Memory = resource.MustParse(memoryLimit) + } + if cpuLimit != "" { + resources.Limits.Cpu = resource.MustParse(cpuLimit) } }