Search in sources :

Example 1 with KubernetesNamespace

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) {
            }
        }
    }
}
Also used : PodStatus(io.fabric8.kubernetes.api.model.PodStatus) Pod(io.fabric8.kubernetes.api.model.Pod) KubernetesDeployments(org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesDeployments) InfrastructureException(org.eclipse.che.api.workspace.server.spi.InfrastructureException) KubernetesNamespace(org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace)

Example 2 with KubernetesNamespace

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();
}
Also used : ListenBrokerEvents(org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.ListenBrokerEvents) WaitBrokerResult(org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.WaitBrokerResult) DeployBroker(org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.DeployBroker) PrepareStorage(org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.PrepareStorage) KubernetesNamespace(org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace) Traced(org.eclipse.che.commons.annotation.Traced) Beta(com.google.common.annotations.Beta)

Example 3 with KubernetesNamespace

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);
}
Also used : KubernetesNamespaceMetaImpl(org.eclipse.che.workspace.infrastructure.kubernetes.api.server.impls.KubernetesNamespaceMetaImpl) ObjectMeta(io.fabric8.kubernetes.api.model.ObjectMeta) LabelSelector(io.fabric8.kubernetes.api.model.LabelSelector) ObjectMetaBuilder(io.fabric8.kubernetes.api.model.ObjectMetaBuilder) Secret(io.fabric8.kubernetes.api.model.Secret) SecretBuilder(io.fabric8.kubernetes.api.model.SecretBuilder) KubernetesSecrets(org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesSecrets) PersonalAccessToken(org.eclipse.che.api.factory.server.scm.PersonalAccessToken) KubernetesNamespaceMeta(org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta) SubjectImpl(org.eclipse.che.commons.subject.SubjectImpl) KubernetesNamespace(org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace) Test(org.testng.annotations.Test)

Example 4 with KubernetesNamespace

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);
}
Also used : WorkspaceImpl(org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl) HashMap(java.util.HashMap) AccountImpl(org.eclipse.che.account.spi.AccountImpl) Page(org.eclipse.che.api.core.Page) WorkspaceConfigImpl(org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) KubernetesNamespace(org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace) Test(org.testng.annotations.Test)

Example 5 with KubernetesNamespace

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);
}
Also used : WorkspaceImpl(org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl) HashMap(java.util.HashMap) AccountImpl(org.eclipse.che.account.spi.AccountImpl) Page(org.eclipse.che.api.core.Page) WorkspaceConfigImpl(org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) KubernetesNamespace(org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace) Test(org.testng.annotations.Test)

Aggregations

KubernetesNamespace (org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespace)26 Test (org.testng.annotations.Test)18 AccountImpl (org.eclipse.che.account.spi.AccountImpl)10 Page (org.eclipse.che.api.core.Page)10 WorkspaceImpl (org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl)10 LabelSelector (io.fabric8.kubernetes.api.model.LabelSelector)8 ObjectMeta (io.fabric8.kubernetes.api.model.ObjectMeta)8 ObjectMetaBuilder (io.fabric8.kubernetes.api.model.ObjectMetaBuilder)8 Secret (io.fabric8.kubernetes.api.model.Secret)8 SecretBuilder (io.fabric8.kubernetes.api.model.SecretBuilder)8 PersonalAccessToken (org.eclipse.che.api.factory.server.scm.PersonalAccessToken)8 SubjectImpl (org.eclipse.che.commons.subject.SubjectImpl)8 KubernetesNamespaceMetaImpl (org.eclipse.che.workspace.infrastructure.kubernetes.api.server.impls.KubernetesNamespaceMetaImpl)8 KubernetesNamespaceMeta (org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta)8 KubernetesSecrets (org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesSecrets)8 HashMap (java.util.HashMap)6 WorkspaceConfigImpl (org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl)6 InfrastructureException (org.eclipse.che.api.workspace.server.spi.InfrastructureException)6 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)6 KubernetesPersistentVolumeClaims (org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesPersistentVolumeClaims)5