Skip to content

Commit

Permalink
che #9062: Adding property for setting pod termination grace period f…
Browse files Browse the repository at this point in the history
…or Kubernetes / OpenShift infrastructures

Signed-off-by: Ilya Buziuk <ibuziuk@redhat.com>
  • Loading branch information
ibuziuk committed Mar 16, 2018
1 parent 3c9a961 commit 2ef1ba0
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,13 @@ che.infra.kubernetes.ingress.annotations_json=NULL
che.infra.kubernetes.pod.security_context.run_as_user=NULL
che.infra.kubernetes.pod.security_context.fs_group=NULL

# Defines grace termination period for pods that will be created by Kubernetes / OpenShift infrastructures
#
# Grace termination period of Kubernetes / OpenShift pods defaults to 30 seconds, which results in
# long-running tasks for stopping a workspace. Setting grace termination period to '0' allows to terminate
# workspace pod almost instantly and significantly decrease the time required for stopping a workspace.
che.infra.kubernetes.pod.termination_grace_period_sec=0

# Number of maximum concurrent async web requests
# (http requests or ongoing web socket calls)
# supported in the underlying shared http client
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.pvc.WorkspaceVolumesStrategy;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.InstallerServersPortProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.LogsVolumeMachineProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.PodTerminationGracePeriodProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.SecurityContextProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.UniqueNamesProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.env.EnvVarsConverter;
Expand Down Expand Up @@ -46,6 +47,7 @@ public class KubernetesEnvironmentProvisioner {
private final InstallerServersPortProvisioner installerServersPortProvisioner;
private final LogsVolumeMachineProvisioner logsVolumeMachineProvisioner;
private final SecurityContextProvisioner securityContextProvisioner;
private final PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner;

@Inject
public KubernetesEnvironmentProvisioner(
Expand All @@ -58,7 +60,8 @@ public KubernetesEnvironmentProvisioner(
RamLimitProvisioner ramLimitProvisioner,
InstallerServersPortProvisioner installerServersPortProvisioner,
LogsVolumeMachineProvisioner logsVolumeMachineProvisioner,
SecurityContextProvisioner securityContextProvisioner) {
SecurityContextProvisioner securityContextProvisioner,
PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner) {
this.pvcEnabled = pvcEnabled;
this.volumesStrategy = volumesStrategy;
this.uniqueNamesProvisioner = uniqueNamesProvisioner;
Expand All @@ -69,6 +72,7 @@ public KubernetesEnvironmentProvisioner(
this.installerServersPortProvisioner = installerServersPortProvisioner;
this.logsVolumeMachineProvisioner = logsVolumeMachineProvisioner;
this.securityContextProvisioner = securityContextProvisioner;
this.podTerminationGracePeriodProvisioner = podTerminationGracePeriodProvisioner;
}

public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)
Expand All @@ -91,5 +95,8 @@ public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)
uniqueNamesProvisioner.provision(k8sEnv, identity);
ramLimitProvisioner.provision(k8sEnv, identity);
securityContextProvisioner.provision(k8sEnv, identity);

// 4 stage - set Kubernetes pod termination grace period
podTerminationGracePeriodProvisioner.provision(k8sEnv, identity);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Copyright (c) 2012-2018 Red Hat, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
package org.eclipse.che.workspace.infrastructure.kubernetes.provision;

import io.fabric8.kubernetes.api.model.Pod;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity;
import org.eclipse.che.api.workspace.server.spi.InfrastructureException;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;

public class PodTerminationGracePeriodProvisioner implements ConfigurationProvisioner {
private final long graceTerminationPeriodSec;

@Inject
public PodTerminationGracePeriodProvisioner(
@Named("che.infra.kubernetes.pod.termination_grace_period_sec")
long graceTerminationPeriodSec) {
this.graceTerminationPeriodSec = graceTerminationPeriodSec;
}

@Override
public void provision(KubernetesEnvironment k8sEnv, RuntimeIdentity identity)
throws InfrastructureException {
for (Pod pod : k8sEnv.getPods().values()) {
if (!isTerminationGracePeriodSet(pod)) {
pod.getSpec().setTerminationGracePeriodSeconds(graceTerminationPeriodSec);
}
}
}

/**
* @param pod
* @return true if 'terminationGracePeriodSeconds' have been explicitly set in Kubernetes /
* OpenShift recipe, false otherwise
*/
private boolean isTerminationGracePeriodSet(final Pod pod) {
return pod.getSpec().getTerminationGracePeriodSeconds() != null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.pvc.WorkspaceVolumesStrategy;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.InstallerServersPortProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.LogsVolumeMachineProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.PodTerminationGracePeriodProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.SecurityContextProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.UniqueNamesProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.env.EnvVarsConverter;
Expand Down Expand Up @@ -50,6 +51,7 @@ public class KubernetesEnvironmentProvisionerTest {
@Mock private RamLimitProvisioner ramLimitProvisioner;
@Mock private LogsVolumeMachineProvisioner logsVolumeMachineProvisioner;
@Mock private SecurityContextProvisioner securityContextProvisioner;
@Mock private PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner;

private KubernetesEnvironmentProvisioner osInfraProvisioner;

Expand All @@ -68,7 +70,8 @@ public void setUp() {
ramLimitProvisioner,
installerServersPortProvisioner,
logsVolumeMachineProvisioner,
securityContextProvisioner);
securityContextProvisioner,
podTerminationGracePeriodProvisioner);
provisionOrder =
inOrder(
installerServersPortProvisioner,
Expand All @@ -79,7 +82,8 @@ public void setUp() {
envVarsProvisioner,
restartPolicyRewriter,
ramLimitProvisioner,
securityContextProvisioner);
securityContextProvisioner,
podTerminationGracePeriodProvisioner);
}

@Test
Expand All @@ -97,6 +101,9 @@ public void performsOrderedProvisioning() throws Exception {
provisionOrder.verify(uniqueNamesProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));
provisionOrder.verify(ramLimitProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));
provisionOrder.verify(securityContextProvisioner).provision(eq(k8sEnv), eq(runtimeIdentity));
provisionOrder
.verify(podTerminationGracePeriodProvisioner)
.provision(eq(k8sEnv), eq(runtimeIdentity));
provisionOrder.verifyNoMoreInteractions();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.pvc.WorkspaceVolumesStrategy;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.InstallerServersPortProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.LogsVolumeMachineProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.PodTerminationGracePeriodProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.UniqueNamesProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.env.EnvVarsConverter;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.limits.ram.RamLimitProvisioner;
Expand Down Expand Up @@ -47,6 +48,7 @@ public class OpenShiftEnvironmentProvisioner {
private final RamLimitProvisioner ramLimitProvisioner;
private final InstallerServersPortProvisioner installerServersPortProvisioner;
private final LogsVolumeMachineProvisioner logsVolumeMachineProvisioner;
private final PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner;

@Inject
public OpenShiftEnvironmentProvisioner(
Expand All @@ -59,7 +61,8 @@ public OpenShiftEnvironmentProvisioner(
WorkspaceVolumesStrategy volumesStrategy,
RamLimitProvisioner ramLimitProvisioner,
InstallerServersPortProvisioner installerServersPortProvisioner,
LogsVolumeMachineProvisioner logsVolumeMachineProvisioner) {
LogsVolumeMachineProvisioner logsVolumeMachineProvisioner,
PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner) {
this.pvcEnabled = pvcEnabled;
this.volumesStrategy = volumesStrategy;
this.uniqueNamesProvisioner = uniqueNamesProvisioner;
Expand All @@ -70,6 +73,7 @@ public OpenShiftEnvironmentProvisioner(
this.ramLimitProvisioner = ramLimitProvisioner;
this.installerServersPortProvisioner = installerServersPortProvisioner;
this.logsVolumeMachineProvisioner = logsVolumeMachineProvisioner;
this.podTerminationGracePeriodProvisioner = podTerminationGracePeriodProvisioner;
}

public void provision(OpenShiftEnvironment osEnv, RuntimeIdentity identity)
Expand All @@ -92,5 +96,8 @@ public void provision(OpenShiftEnvironment osEnv, RuntimeIdentity identity)
uniqueNamesProvisioner.provision(osEnv, identity);
routeTlsProvisioner.provision(osEnv, identity);
ramLimitProvisioner.provision(osEnv, identity);

// 4 stage - set OpenShift pod termination grace period
podTerminationGracePeriodProvisioner.provision(osEnv, identity);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.pvc.WorkspaceVolumesStrategy;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.InstallerServersPortProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.LogsVolumeMachineProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.PodTerminationGracePeriodProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.env.EnvVarsConverter;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.limits.ram.RamLimitProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.provision.restartpolicy.RestartPolicyRewriter;
Expand Down Expand Up @@ -50,6 +51,7 @@ public class OpenShiftEnvironmentProvisionerTest {
@Mock private RestartPolicyRewriter restartPolicyRewriter;
@Mock private RamLimitProvisioner ramLimitProvisioner;
@Mock private LogsVolumeMachineProvisioner logsVolumeMachineProvisioner;
@Mock private PodTerminationGracePeriodProvisioner podTerminationGracePeriodProvisioner;

private OpenShiftEnvironmentProvisioner osInfraProvisioner;

Expand All @@ -68,7 +70,8 @@ public void setUp() {
volumesStrategy,
ramLimitProvisioner,
installerServersPortProvisioner,
logsVolumeMachineProvisioner);
logsVolumeMachineProvisioner,
podTerminationGracePeriodProvisioner);
provisionOrder =
inOrder(
installerServersPortProvisioner,
Expand All @@ -79,7 +82,8 @@ public void setUp() {
uniqueNamesProvisioner,
tlsRouteProvisioner,
restartPolicyRewriter,
ramLimitProvisioner);
ramLimitProvisioner,
podTerminationGracePeriodProvisioner);
}

@Test
Expand All @@ -97,6 +101,9 @@ public void performsOrderedProvisioning() throws Exception {
provisionOrder.verify(uniqueNamesProvisioner).provision(eq(osEnv), eq(runtimeIdentity));
provisionOrder.verify(tlsRouteProvisioner).provision(eq(osEnv), eq(runtimeIdentity));
provisionOrder.verify(ramLimitProvisioner).provision(eq(osEnv), eq(runtimeIdentity));
provisionOrder
.verify(podTerminationGracePeriodProvisioner)
.provision(eq(osEnv), eq(runtimeIdentity));
provisionOrder.verifyNoMoreInteractions();
}
}

0 comments on commit 2ef1ba0

Please sign in to comment.