diff --git a/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/pvc/PVCSubPathHelper.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/pvc/PVCSubPathHelper.java index 7bbc13bec5..0f83141641 100644 --- a/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/pvc/PVCSubPathHelper.java +++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/pvc/PVCSubPathHelper.java @@ -45,7 +45,9 @@ import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesN import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.LogWatchTimeouts; import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.LogWatcher; import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.log.PodLogToEventPublisher; +import org.eclipse.che.workspace.infrastructure.kubernetes.provision.NodeSelectorProvisioner; import org.eclipse.che.workspace.infrastructure.kubernetes.provision.SecurityContextProvisioner; +import org.eclipse.che.workspace.infrastructure.kubernetes.provision.TolerationsProvisioner; import org.eclipse.che.workspace.infrastructure.kubernetes.util.Containers; import org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher; import org.slf4j.Logger; @@ -88,6 +90,8 @@ public class PVCSubPathHelper { private final RuntimeEventsPublisher eventsPublisher; private final SecurityContextProvisioner securityContextProvisioner; + private final NodeSelectorProvisioner nodeSelectorProvisioner; + private final TolerationsProvisioner tolerationsProvisioner; @Inject PVCSubPathHelper( @@ -96,6 +100,8 @@ public class PVCSubPathHelper { @Named("che.infra.kubernetes.pvc.jobs.image.pull_policy") String imagePullPolicy, KubernetesNamespaceFactory factory, SecurityContextProvisioner securityContextProvisioner, + NodeSelectorProvisioner nodeSelectorProvisioner, + TolerationsProvisioner tolerationsProvisioner, ExecutorServiceWrapper executorServiceWrapper, RuntimeEventsPublisher eventPublisher) { this.jobMemoryLimit = jobMemoryLimit; @@ -103,6 +109,8 @@ public class PVCSubPathHelper { this.imagePullPolicy = imagePullPolicy; this.factory = factory; this.securityContextProvisioner = securityContextProvisioner; + this.nodeSelectorProvisioner = nodeSelectorProvisioner; + this.tolerationsProvisioner = tolerationsProvisioner; this.eventsPublisher = eventPublisher; this.executor = executorServiceWrapper.wrap( @@ -204,6 +212,8 @@ public class PVCSubPathHelper { final String[] command = buildCommand(commandBase, arguments); final Pod pod = newPod(podName, pvcName, command); securityContextProvisioner.provision(pod.getSpec()); + nodeSelectorProvisioner.provision(pod.getSpec()); + tolerationsProvisioner.provision(pod.getSpec()); KubernetesDeployments deployments = null; try { diff --git a/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/NodeSelectorProvisioner.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/NodeSelectorProvisioner.java index e1a42d39e4..ca0ecdf933 100644 --- a/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/NodeSelectorProvisioner.java +++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/NodeSelectorProvisioner.java @@ -14,6 +14,7 @@ package org.eclipse.che.workspace.infrastructure.kubernetes.provision; import static java.util.Collections.emptyMap; import com.google.common.base.Splitter; +import io.fabric8.kubernetes.api.model.PodSpec; import java.util.Map; import javax.inject.Inject; import javax.inject.Named; @@ -46,4 +47,10 @@ public class NodeSelectorProvisioner implements ConfigurationProvisioner { .forEach(d -> d.getSpec().setNodeSelector(nodeSelectorAttributes)); } } + + public void provision(PodSpec podSpec) { + if (!nodeSelectorAttributes.isEmpty()) { + podSpec.setNodeSelector(nodeSelectorAttributes); + } + } } diff --git a/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/TolerationsProvisioner.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/TolerationsProvisioner.java index dd615e529e..fc9b987b45 100644 --- a/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/TolerationsProvisioner.java +++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/provision/TolerationsProvisioner.java @@ -16,6 +16,7 @@ import static java.util.Collections.emptyList; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import io.fabric8.kubernetes.api.model.PodSpec; import io.fabric8.kubernetes.api.model.Toleration; import java.util.List; import javax.inject.Inject; @@ -54,4 +55,10 @@ public class TolerationsProvisioner implements ConfigurationProvisioner { k8sEnv.getPodsData().values().forEach(d -> d.getSpec().setTolerations(tolerations)); } } + + public void provision(PodSpec podSpec) { + if (!tolerations.isEmpty()) { + podSpec.setTolerations(tolerations); + } + } } diff --git a/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/pvc/PVCSubPathHelperTest.java b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/pvc/PVCSubPathHelperTest.java index 6f8b129352..baa4e88953 100644 --- a/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/pvc/PVCSubPathHelperTest.java +++ b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/pvc/PVCSubPathHelperTest.java @@ -49,7 +49,9 @@ import org.eclipse.che.commons.observability.NoopExecutorServiceWrapper; import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesDeployments; import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace; import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory; +import org.eclipse.che.workspace.infrastructure.kubernetes.provision.NodeSelectorProvisioner; import org.eclipse.che.workspace.infrastructure.kubernetes.provision.SecurityContextProvisioner; +import org.eclipse.che.workspace.infrastructure.kubernetes.provision.TolerationsProvisioner; import org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher; import org.mockito.ArgumentCaptor; import org.mockito.Captor; @@ -76,6 +78,8 @@ public class PVCSubPathHelperTest { private static final String M2_PATH = "/.m2"; @Mock private SecurityContextProvisioner securityContextProvisioner; + @Mock private NodeSelectorProvisioner nodeSelectorProvisioner; + @Mock private TolerationsProvisioner tolerationsProvisioner; @Mock private KubernetesNamespaceFactory k8sNamespaceFactory; @Mock private KubernetesNamespace k8sNamespace; @Mock private KubernetesDeployments osDeployments; @@ -97,6 +101,8 @@ public class PVCSubPathHelperTest { "IfNotPresent", k8sNamespaceFactory, securityContextProvisioner, + nodeSelectorProvisioner, + tolerationsProvisioner, new NoopExecutorServiceWrapper(), eventsPublisher); lenient().when(identity.getInfrastructureNamespace()).thenReturn(NAMESPACE); @@ -144,6 +150,8 @@ public class PVCSubPathHelperTest { verify(podStatus).getPhase(); verify(osDeployments).delete(anyString()); verify(securityContextProvisioner).provision(any()); + verify(nodeSelectorProvisioner).provision(any()); + verify(tolerationsProvisioner).provision(any()); } @Test @@ -181,6 +189,8 @@ public class PVCSubPathHelperTest { verify(podStatus).getPhase(); verify(osDeployments).delete(anyString()); verify(securityContextProvisioner).provision(any()); + verify(nodeSelectorProvisioner).provision(any()); + verify(tolerationsProvisioner).provision(any()); } @Test @@ -248,6 +258,8 @@ public class PVCSubPathHelperTest { "ToBeOrNotIfPresent", k8sNamespaceFactory, securityContextProvisioner, + nodeSelectorProvisioner, + tolerationsProvisioner, new NoopExecutorServiceWrapper(), eventsPublisher); // when