use of org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace in project che-server by eclipse-che.
the class PVCSubPathHelper method execute.
private void execute(RuntimeIdentity identity, String workspaceId, String namespace, String pvcName, String[] commandBase, Map<String, String> startOptions, boolean watchFailureEvents, String... arguments) {
final String jobName = commandBase[0];
final String podName = jobName + '-' + workspaceId;
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 {
KubernetesNamespace ns = factory.access(workspaceId, namespace);
if (!checkPVCExistsAndNotTerminating(ns, pvcName)) {
return;
}
deployments = ns.deployments();
deployments.create(pod);
watchLogsIfDebugEnabled(deployments, pod, identity, startOptions);
PodStatus finishedStatus = waitPodStatus(podName, deployments, watchFailureEvents);
if (POD_PHASE_FAILED.equals(finishedStatus.getPhase())) {
String logs = deployments.getPodLogs(podName);
LOG.error("Job command '{}' execution is failed. Logs: {}", Arrays.toString(command), // Force logs onto one line
Strings.nullToEmpty(logs).replace("\n", " \\n"));
}
} catch (InfrastructureException ex) {
LOG.error("Unable to perform '{}' command for the workspace '{}' cause: '{}'", Arrays.toString(command), workspaceId, ex.getMessage());
deployments.stopWatch(true);
} finally {
if (deployments != null) {
deployments.stopWatch();
try {
deployments.delete(podName);
} catch (InfrastructureException ignored) {
}
}
}
}
use of org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace in project che-server by eclipse-che.
the class PluginBrokerManager method getTooling.
/**
* Deploys Che plugin brokers in a workspace, receives result of theirs execution and returns
* resolved workspace tooling or error of plugins brokering execution.
*
* <p>This API is in <b>Beta</b> and is subject to changes or removal.
*/
@Beta
@Traced
public List<ChePlugin> getTooling(RuntimeIdentity identity, StartSynchronizer startSynchronizer, Collection<PluginFQN> pluginFQNs, boolean isEphemeral, boolean mergePlugins, Map<String, String> startOptions) throws InfrastructureException {
String workspaceId = identity.getWorkspaceId();
KubernetesNamespace kubernetesNamespace = factory.getOrCreate(identity);
BrokersResult brokersResult = new BrokersResult();
E brokerEnvironment = brokerEnvironmentFactory.createForMetadataBroker(pluginFQNs, identity, mergePlugins);
if (isEphemeral) {
EphemeralWorkspaceUtility.makeEphemeral(brokerEnvironment.getAttributes());
}
environmentProvisioner.provision(brokerEnvironment, identity);
ListenBrokerEvents listenBrokerEvents = getListenEventPhase(workspaceId, brokersResult);
PrepareStorage prepareStorage = getPrepareStoragePhase(identity, startSynchronizer, brokerEnvironment, startOptions);
WaitBrokerResult waitBrokerResult = getWaitBrokerPhase(workspaceId, brokersResult);
DeployBroker deployBroker = getDeployBrokerPhase(identity, kubernetesNamespace, brokerEnvironment, brokersResult, startOptions);
LOG.debug("Entering plugin brokers deployment chain workspace '{}'", workspaceId);
listenBrokerEvents.then(prepareStorage).then(deployBroker).then(waitBrokerResult);
return listenBrokerEvents.execute();
}
use of org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace in project che-server by eclipse-che.
the class KubernetesPersonalAccessTokenManagerTest method testGetTokenFromNamespaceWithTrailingSlashMismatch.
@Test
public void testGetTokenFromNamespaceWithTrailingSlashMismatch() throws Exception {
KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl("test");
when(namespaceFactory.list()).thenReturn(Collections.singletonList(meta));
KubernetesNamespace kubernetesnamespace = Mockito.mock(KubernetesNamespace.class);
KubernetesSecrets secrets = Mockito.mock(KubernetesSecrets.class);
when(namespaceFactory.access(eq(null), eq(meta.getName()))).thenReturn(kubernetesnamespace);
when(kubernetesnamespace.secrets()).thenReturn(secrets);
when(scmPersonalAccessTokenFetcher.isValid(any(PersonalAccessToken.class))).thenReturn(true);
Map<String, String> data1 = Map.of("token", Base64.getEncoder().encodeToString("token1".getBytes(UTF_8)));
Map<String, String> data2 = Map.of("token", Base64.getEncoder().encodeToString("token2".getBytes(UTF_8)));
ObjectMeta meta1 = new ObjectMetaBuilder().withAnnotations(Map.of(ANNOTATION_CHE_USERID, "user1", ANNOTATION_SCM_URL, "http://host1.com/")).build();
ObjectMeta meta2 = new ObjectMetaBuilder().withAnnotations(Map.of(ANNOTATION_CHE_USERID, "user1", ANNOTATION_SCM_URL, "http://host2.com")).build();
Secret secret1 = new SecretBuilder().withMetadata(meta1).withData(data1).build();
Secret secret2 = new SecretBuilder().withMetadata(meta2).withData(data2).build();
when(secrets.get(any(LabelSelector.class))).thenReturn(Arrays.asList(secret1, secret2));
// when
PersonalAccessToken token1 = personalAccessTokenManager.get(new SubjectImpl("user", "user1", "t1", false), "http://host1.com").get();
PersonalAccessToken token2 = personalAccessTokenManager.get(new SubjectImpl("user", "user1", "t1", false), "http://host2.com/").get();
// then
assertNotNull(token1);
assertNotNull(token2);
}
use of org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace in project che-server by eclipse-che.
the class CommonPVCStrategyTest method shouldDeletePVCsIfPersistAttributeIsSetToTrueInWorkspaceConfigWhenCleanupCalled.
@Test
public void shouldDeletePVCsIfPersistAttributeIsSetToTrueInWorkspaceConfigWhenCleanupCalled() throws Exception {
// given
WorkspaceImpl workspace = mock(WorkspaceImpl.class);
Page workspaces = mock(Page.class);
when(workspaceManager.getWorkspaces(anyString(), eq(false), anyInt(), anyLong())).thenReturn((workspaces));
when(workspaces.isEmpty()).thenReturn(false);
when(workspace.getId()).thenReturn(WORKSPACE_ID);
WorkspaceConfigImpl workspaceConfig = mock(WorkspaceConfigImpl.class);
when(workspace.getConfig()).thenReturn(workspaceConfig);
AccountImpl account = mock(AccountImpl.class);
when(account.getType()).thenReturn(PERSONAL_ACCOUNT);
when(account.getId()).thenReturn("id123");
when(workspace.getAccount()).thenReturn(account);
Map<String, String> workspaceConfigAttributes = new HashMap<>();
when(workspaceConfig.getAttributes()).thenReturn(workspaceConfigAttributes);
workspaceConfigAttributes.put(PERSIST_VOLUMES_ATTRIBUTE, "true");
KubernetesNamespace ns = mock(KubernetesNamespace.class);
when(factory.get(eq(workspace))).thenReturn(ns);
when(ns.getName()).thenReturn("ns");
// when
commonPVCStrategy.cleanup(workspace);
// then
verify(pvcSubPathHelper).removeDirsAsync(WORKSPACE_ID, "ns", PVC_NAME, WORKSPACE_ID);
}
use of org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace in project che-server by eclipse-che.
the class CommonPVCStrategyTest method shouldDeletePVCsIfThereIsNoPersistAttributeInWorkspaceConfigWhenCleanupCalled.
@Test
public void shouldDeletePVCsIfThereIsNoPersistAttributeInWorkspaceConfigWhenCleanupCalled() throws Exception {
// given
WorkspaceImpl workspace = mock(WorkspaceImpl.class);
Page workspaces = mock(Page.class);
when(workspace.getId()).thenReturn(WORKSPACE_ID);
when(workspaceManager.getWorkspaces(anyString(), eq(false), anyInt(), anyLong())).thenReturn((workspaces));
when(workspaces.isEmpty()).thenReturn(false);
WorkspaceConfigImpl workspaceConfig = mock(WorkspaceConfigImpl.class);
when(workspace.getConfig()).thenReturn(workspaceConfig);
AccountImpl account = mock(AccountImpl.class);
when(account.getType()).thenReturn(PERSONAL_ACCOUNT);
when(account.getId()).thenReturn("id123");
when(workspace.getAccount()).thenReturn(account);
Map<String, String> workspaceConfigAttributes = new HashMap<>();
when(workspaceConfig.getAttributes()).thenReturn(workspaceConfigAttributes);
KubernetesNamespace ns = mock(KubernetesNamespace.class);
when(factory.get(eq(workspace))).thenReturn(ns);
when(ns.getName()).thenReturn("ns");
// when
commonPVCStrategy.cleanup(workspace);
// then
verify(pvcSubPathHelper).removeDirsAsync(WORKSPACE_ID, "ns", PVC_NAME, WORKSPACE_ID);
}
Aggregations