>() {});
+
+ DevfileBindings.onComponentIntegrityValidatorBinder(
+ binder(),
+ binder -> {
+ binder.addBinding(KUBERNETES_COMPONENT_TYPE).to(KubernetesComponentValidator.class);
+ binder.addBinding(DOCKERIMAGE_COMPONENT_TYPE).to(NoopComponentIntegrityValidator.class);
+ });
+
+ DevfileBindings.onWorkspaceApplierBinder(
+ binder(),
+ binder -> {
+ binder
+ .addBinding(KUBERNETES_COMPONENT_TYPE)
+ .to(KubernetesComponentToWorkspaceApplier.class);
+ binder
+ .addBinding(DOCKERIMAGE_COMPONENT_TYPE)
+ .to(DockerimageComponentToWorkspaceApplier.class);
+ });
+
+ DevfileBindings.addComponentProvisioners(
+ binder(), KubernetesComponentProvisioner.class, DockerimageComponentProvisioner.class);
+
+ KubernetesDevfileBindings.addKubernetesBasedEnvironmentTypeBindings(
+ binder(), KubernetesEnvironment.TYPE);
+ KubernetesDevfileBindings.addKubernetesBasedComponentTypeBindings(
+ binder(), KUBERNETES_COMPONENT_TYPE);
}
}
diff --git a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/ContainerSearch.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/ContainerSearch.java
similarity index 98%
rename from wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/ContainerSearch.java
rename to infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/ContainerSearch.java
index 06f19489da..d532992036 100644
--- a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/ContainerSearch.java
+++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/ContainerSearch.java
@@ -9,7 +9,7 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.kubernetes;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static java.util.stream.Collectors.toList;
diff --git a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentProvisioner.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentProvisioner.java
similarity index 93%
rename from wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentProvisioner.java
rename to infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentProvisioner.java
index 17273bf7c5..bec7a32930 100644
--- a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentProvisioner.java
+++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentProvisioner.java
@@ -9,12 +9,12 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.dockerimage;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static com.google.common.base.Preconditions.checkArgument;
import static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;
-import static org.eclipse.che.api.devfile.server.Constants.DOCKERIMAGE_COMPONENT_TYPE;
-import static org.eclipse.che.api.devfile.server.Constants.PUBLIC_ENDPOINT_ATTRIBUTE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.PUBLIC_ENDPOINT_ATTRIBUTE;
import static org.eclipse.che.api.workspace.shared.Constants.PROJECTS_VOLUME_NAME;
import java.util.HashMap;
@@ -25,8 +25,8 @@ import java.util.stream.Collectors;
import javax.inject.Inject;
import org.eclipse.che.api.core.model.workspace.config.MachineConfig;
import org.eclipse.che.api.core.model.workspace.config.ServerConfig;
-import org.eclipse.che.api.devfile.server.convert.component.ComponentProvisioner;
-import org.eclipse.che.api.devfile.server.exception.WorkspaceExportException;
+import org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentProvisioner;
+import org.eclipse.che.api.workspace.server.devfile.exception.WorkspaceExportException;
import org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;
import org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.RecipeImpl;
@@ -46,6 +46,8 @@ import org.eclipse.che.workspace.infrastructure.kubernetes.environment.util.Entr
* Provision dockerimage component in {@link DevfileImpl} according to the value of environment with
* dockerimage recipe if the specified {@link WorkspaceConfigImpl} has such.
*
+ * The {@code dockerimage} devfile components are handled as Kubernetes deployments internally.
+ *
* @author Sergii Leshchenko
*/
public class DockerimageComponentProvisioner implements ComponentProvisioner {
diff --git a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentToWorkspaceApplier.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentToWorkspaceApplier.java
similarity index 92%
rename from wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentToWorkspaceApplier.java
rename to infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentToWorkspaceApplier.java
index 7880e93aef..efb4e5d07b 100644
--- a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentToWorkspaceApplier.java
+++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentToWorkspaceApplier.java
@@ -9,16 +9,16 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.dockerimage;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Strings.isNullOrEmpty;
import static java.lang.String.format;
import static java.util.Collections.singletonList;
import static org.eclipse.che.api.core.model.workspace.config.Command.MACHINE_NAME_ATTRIBUTE;
-import static org.eclipse.che.api.devfile.server.Constants.DISCOVERABLE_ENDPOINT_ATTRIBUTE;
-import static org.eclipse.che.api.devfile.server.Constants.DOCKERIMAGE_COMPONENT_TYPE;
-import static org.eclipse.che.api.devfile.server.Constants.PUBLIC_ENDPOINT_ATTRIBUTE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.DISCOVERABLE_ENDPOINT_ATTRIBUTE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.PUBLIC_ENDPOINT_ATTRIBUTE;
import static org.eclipse.che.api.workspace.shared.Constants.PROJECTS_VOLUME_NAME;
import static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.MACHINE_NAME_ANNOTATION_FMT;
@@ -43,11 +43,10 @@ import javax.inject.Named;
import org.eclipse.che.api.core.model.workspace.config.ServerConfig;
import org.eclipse.che.api.core.model.workspace.devfile.Component;
import org.eclipse.che.api.core.model.workspace.devfile.Endpoint;
-import org.eclipse.che.api.devfile.server.Constants;
-import org.eclipse.che.api.devfile.server.FileContentProvider;
-import org.eclipse.che.api.devfile.server.convert.component.ComponentToWorkspaceApplier;
-import org.eclipse.che.api.devfile.server.convert.component.kubernetes.KubernetesEnvironmentProvisioner;
-import org.eclipse.che.api.devfile.server.exception.DevfileException;
+import org.eclipse.che.api.workspace.server.devfile.Constants;
+import org.eclipse.che.api.workspace.server.devfile.FileContentProvider;
+import org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;
import org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.VolumeImpl;
@@ -58,6 +57,8 @@ import org.eclipse.che.workspace.infrastructure.kubernetes.util.Containers;
/**
* Applies changes on workspace config according to the specified dockerimage component.
*
+ *
The {@code dockerimage} devfile components are handled as Kubernetes deployments internally.
+ *
* @author Sergii Leshchenko
*/
public class DockerimageComponentToWorkspaceApplier implements ComponentToWorkspaceApplier {
@@ -201,7 +202,7 @@ public class DockerimageComponentToWorkspaceApplier implements ComponentToWorksp
.withNewMetadata()
.withName(name)
.addToLabels(CHE_COMPONENT_NAME_LABEL, name)
- .addToAnnotations(String.format(MACHINE_NAME_ANNOTATION_FMT, name), name)
+ .addToAnnotations(format(MACHINE_NAME_ANNOTATION_FMT, name), name)
.endMetadata()
.withNewSpec()
.withContainers(container)
diff --git a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentProvisioner.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentProvisioner.java
similarity index 73%
rename from wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentProvisioner.java
rename to infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentProvisioner.java
index e92a32f162..226e5c9106 100644
--- a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentProvisioner.java
+++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentProvisioner.java
@@ -9,20 +9,22 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.kubernetes;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static com.google.common.base.Preconditions.checkArgument;
+import static java.lang.String.format;
+import com.google.inject.name.Named;
import java.util.List;
import java.util.Map.Entry;
+import java.util.Set;
import java.util.stream.Collectors;
-import org.eclipse.che.api.devfile.server.convert.component.ComponentProvisioner;
-import org.eclipse.che.api.devfile.server.exception.WorkspaceExportException;
+import javax.inject.Inject;
+import org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentProvisioner;
+import org.eclipse.che.api.workspace.server.devfile.exception.WorkspaceExportException;
import org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;
import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;
-import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;
-import org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;
/**
* Provision kubernetes/openshift component in {@link DevfileImpl} according to the value of
@@ -33,6 +35,15 @@ import org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftE
*/
public class KubernetesComponentProvisioner implements ComponentProvisioner {
+ private final Set handledEnvironmentTypes;
+
+ @Inject
+ public KubernetesComponentProvisioner(
+ @Named(KubernetesDevfileBindings.KUBERNETES_BASED_ENVIRONMENTS_KEY_NAME)
+ Set handledEnvironmentTypes) {
+ this.handledEnvironmentTypes = handledEnvironmentTypes;
+ }
+
/**
* Provision kubernetes/openshift component in {@link DevfileImpl} according to the value of
* environment with kubernetes/openshift recipe if the specified {@link WorkspaceConfigImpl} has
@@ -58,10 +69,7 @@ public class KubernetesComponentProvisioner implements ComponentProvisioner {
.getEnvironments()
.entrySet()
.stream()
- .filter(
- e ->
- KubernetesEnvironment.TYPE.equals(e.getValue().getRecipe().getType())
- || OpenShiftEnvironment.TYPE.equals(e.getValue().getRecipe().getType()))
+ .filter(e -> handledEnvironmentTypes.contains(e.getValue().getRecipe().getType()))
.collect(Collectors.toList());
if (k8sEnvironments.isEmpty()) {
@@ -69,13 +77,16 @@ public class KubernetesComponentProvisioner implements ComponentProvisioner {
}
if (k8sEnvironments.size() > 1) {
+ String allEnvs = String.join("/", handledEnvironmentTypes);
+
throw new WorkspaceExportException(
- "Workspace with multiple `kubernetes`/`openshift` environments can not be converted to devfile");
+ format(
+ "Workspace with multiple %s environments can not be converted to devfile", allEnvs));
}
EnvironmentImpl env = k8sEnvironments.get(0).getValue();
throw new WorkspaceExportException(
- String.format(
+ format(
"Exporting of workspace with `%s` is not supported yet.", env.getRecipe().getType()));
}
}
diff --git a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentToWorkspaceApplier.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentToWorkspaceApplier.java
similarity index 82%
rename from wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentToWorkspaceApplier.java
rename to infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentToWorkspaceApplier.java
index 3ae594abca..b404cf8002 100644
--- a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentToWorkspaceApplier.java
+++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentToWorkspaceApplier.java
@@ -9,7 +9,7 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.kubernetes;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Strings.isNullOrEmpty;
@@ -17,9 +17,8 @@ import static java.lang.String.format;
import static java.util.Collections.emptyMap;
import static java.util.stream.Collectors.toList;
import static org.eclipse.che.api.core.model.workspace.config.Command.MACHINE_NAME_ATTRIBUTE;
-import static org.eclipse.che.api.devfile.server.Components.getIdentifiableComponentName;
-import static org.eclipse.che.api.devfile.server.Constants.KUBERNETES_COMPONENT_TYPE;
-import static org.eclipse.che.api.devfile.server.Constants.OPENSHIFT_COMPONENT_TYPE;
+import static org.eclipse.che.api.workspace.server.devfile.Components.getIdentifiableComponentName;
+import static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings.KUBERNETES_BASED_COMPONENTS_KEY_NAME;
import io.fabric8.kubernetes.api.model.Container;
import io.fabric8.kubernetes.api.model.HasMetadata;
@@ -28,19 +27,22 @@ import io.fabric8.kubernetes.api.model.apps.Deployment;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import javax.inject.Inject;
+import javax.inject.Named;
import org.eclipse.che.api.core.model.workspace.WorkspaceConfig;
import org.eclipse.che.api.core.model.workspace.config.Command;
import org.eclipse.che.api.core.model.workspace.devfile.Component;
import org.eclipse.che.api.core.model.workspace.devfile.Entrypoint;
-import org.eclipse.che.api.devfile.server.Constants;
-import org.eclipse.che.api.devfile.server.DevfileRecipeFormatException;
-import org.eclipse.che.api.devfile.server.FileContentProvider;
-import org.eclipse.che.api.devfile.server.convert.component.ComponentToWorkspaceApplier;
-import org.eclipse.che.api.devfile.server.exception.DevfileException;
+import org.eclipse.che.api.workspace.server.devfile.Constants;
+import org.eclipse.che.api.workspace.server.devfile.DevfileRecipeFormatException;
+import org.eclipse.che.api.workspace.server.devfile.FileContentProvider;
+import org.eclipse.che.api.workspace.server.devfile.convert.component.ComponentToWorkspaceApplier;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;
import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.workspace.infrastructure.kubernetes.Names;
+import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment.PodData;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;
@@ -53,12 +55,30 @@ public class KubernetesComponentToWorkspaceApplier implements ComponentToWorkspa
private final KubernetesRecipeParser objectsParser;
private final KubernetesEnvironmentProvisioner k8sEnvProvisioner;
+ private final String environmentType;
+ private final Set kubernetesBasedComponentTypes;
@Inject
public KubernetesComponentToWorkspaceApplier(
- KubernetesRecipeParser objectsParser, KubernetesEnvironmentProvisioner k8sEnvProvisioner) {
+ KubernetesRecipeParser objectsParser,
+ KubernetesEnvironmentProvisioner k8sEnvProvisioner,
+ @Named(KUBERNETES_BASED_COMPONENTS_KEY_NAME) Set kubernetesBasedComponentTypes) {
+ this(
+ objectsParser,
+ k8sEnvProvisioner,
+ KubernetesEnvironment.TYPE,
+ kubernetesBasedComponentTypes);
+ }
+
+ protected KubernetesComponentToWorkspaceApplier(
+ KubernetesRecipeParser objectsParser,
+ KubernetesEnvironmentProvisioner k8sEnvProvisioner,
+ String environmentType,
+ Set kubernetesBasedComponentTypes) {
this.objectsParser = objectsParser;
this.k8sEnvProvisioner = k8sEnvProvisioner;
+ this.environmentType = environmentType;
+ this.kubernetesBasedComponentTypes = kubernetesBasedComponentTypes;
}
/**
@@ -84,11 +104,8 @@ public class KubernetesComponentToWorkspaceApplier implements ComponentToWorkspa
checkArgument(workspaceConfig != null, "Workspace config must not be null");
checkArgument(k8sComponent != null, "Component must not be null");
checkArgument(
- KUBERNETES_COMPONENT_TYPE.equals(k8sComponent.getType())
- || OPENSHIFT_COMPONENT_TYPE.equals(k8sComponent.getType()),
- format(
- "Plugin must have `%s` or `%s` type",
- KUBERNETES_COMPONENT_TYPE, OPENSHIFT_COMPONENT_TYPE));
+ kubernetesBasedComponentTypes.contains(k8sComponent.getType()),
+ format("Plugin must have %s type", String.join(" or ", kubernetesBasedComponentTypes)));
String componentContent = retrieveContent(k8sComponent, contentProvider);
@@ -103,8 +120,7 @@ public class KubernetesComponentToWorkspaceApplier implements ComponentToWorkspa
applyEntrypoints(k8sComponent.getEntrypoints(), componentObjects);
- k8sEnvProvisioner.provision(
- workspaceConfig, k8sComponent.getType(), componentObjects, emptyMap());
+ k8sEnvProvisioner.provision(workspaceConfig, environmentType, componentObjects, emptyMap());
}
private String retrieveContent(
diff --git a/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentValidator.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentValidator.java
new file mode 100644
index 0000000000..685501c47f
--- /dev/null
+++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentValidator.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
+
+import static java.lang.String.format;
+import static org.eclipse.che.api.workspace.server.devfile.Components.getIdentifiableComponentName;
+
+import io.fabric8.kubernetes.api.model.Container;
+import io.fabric8.kubernetes.api.model.HasMetadata;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.inject.Inject;
+import javax.inject.Named;
+import org.eclipse.che.api.core.ValidationException;
+import org.eclipse.che.api.core.model.workspace.devfile.Component;
+import org.eclipse.che.api.core.model.workspace.devfile.Entrypoint;
+import org.eclipse.che.api.workspace.server.devfile.FileContentProvider;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;
+import org.eclipse.che.api.workspace.server.devfile.validator.ComponentIntegrityValidator;
+import org.eclipse.che.api.workspace.server.spi.InfrastructureException;
+import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;
+
+public class KubernetesComponentValidator implements ComponentIntegrityValidator {
+ private final KubernetesRecipeParser kubernetesRecipeParser;
+ private final Set k8sBasedComponentTypes;
+
+ @Inject
+ public KubernetesComponentValidator(
+ KubernetesRecipeParser kubernetesRecipeParser,
+ @Named(KubernetesDevfileBindings.KUBERNETES_BASED_COMPONENTS_KEY_NAME)
+ Set k8sBasedComponentTypes) {
+ this.kubernetesRecipeParser = kubernetesRecipeParser;
+ this.k8sBasedComponentTypes = k8sBasedComponentTypes;
+ }
+
+ @Override
+ public void validateComponent(Component component, FileContentProvider contentProvider)
+ throws DevfileFormatException {
+ try {
+ List selectedObjects = validateSelector(component, contentProvider);
+ validateEntrypointSelector(component, selectedObjects);
+ } catch (Exception e) {
+ throw new DevfileFormatException(
+ format(
+ "Failed to validate content reference of component '%s' of type '%s': %s",
+ getIdentifiableComponentName(component), component.getType(), e.getMessage()),
+ e);
+ }
+ }
+
+ /**
+ * Validates that the selector, if any, selects some objects from the component's referenced
+ * content. Only does anything for kubernetes and openshift components.
+ *
+ * @param component the component to check
+ * @param contentProvider the content provider to use when fetching content
+ * @return the list of referenced objects matching the selector or empty list
+ * @throws ValidationException on failure to validate the referenced content
+ * @throws InfrastructureException on failure to parse the referenced content
+ * @throws IOException on failure to retrieve the referenced content
+ * @throws DevfileException if the selector filters out all referenced objects
+ */
+ private List validateSelector(
+ Component component, FileContentProvider contentProvider)
+ throws ValidationException, InfrastructureException, IOException, DevfileException {
+
+ if (!k8sBasedComponentTypes.contains(component.getType())) {
+ return Collections.emptyList();
+ }
+
+ List content = getReferencedKubernetesList(component, contentProvider);
+
+ Map selector = component.getSelector();
+ if (selector == null || selector.isEmpty()) {
+ return content;
+ }
+
+ content = SelectorFilter.filter(content, selector);
+
+ if (content.isEmpty()) {
+ throw new DevfileException(
+ format(
+ "The selector of the component '%s' of type '%s' filters out all objects from"
+ + " the list.",
+ getIdentifiableComponentName(component), component.getType()));
+ }
+
+ return content;
+ }
+
+ private void validateEntrypointSelector(Component component, List filteredObjects)
+ throws DevfileException {
+
+ if (component.getEntrypoints() == null || component.getEntrypoints().isEmpty()) {
+ return;
+ }
+
+ for (Entrypoint ep : component.getEntrypoints()) {
+ ContainerSearch search =
+ new ContainerSearch(ep.getParentName(), ep.getParentSelector(), ep.getContainerName());
+
+ List cs = search.search(filteredObjects);
+
+ if (cs.isEmpty()) {
+ throw new DevfileFormatException(
+ format(
+ "Component '%s' of type '%s' contains an entry point that doesn't match any"
+ + " container.",
+ getIdentifiableComponentName(component), component.getType()));
+ }
+ }
+ }
+
+ private List getReferencedKubernetesList(
+ Component component, FileContentProvider contentProvider)
+ throws ValidationException, InfrastructureException, IOException, DevfileException {
+ List content;
+ if (component.getReferenceContent() != null) {
+ content = kubernetesRecipeParser.parse(component.getReferenceContent());
+ } else if (component.getReference() != null) {
+ String data = contentProvider.fetchContent(component.getReference());
+ content = kubernetesRecipeParser.parse(data);
+ } else {
+ content = Collections.emptyList();
+ }
+
+ return content;
+ }
+}
diff --git a/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesDevfileBindings.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesDevfileBindings.java
new file mode 100644
index 0000000000..64b2a66c15
--- /dev/null
+++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesDevfileBindings.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
+
+import com.google.inject.Binder;
+import com.google.inject.multibindings.MapBinder;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
+
+/**
+ * A utility class to ease the binding of Kubernetes-related devfile bindings in a Guice module.
+ *
+ * Consult the individual methods to see if you need to use them.
+ */
+public class KubernetesDevfileBindings {
+
+ public static final String ALLOWED_ENVIRONMENT_TYPE_UPGRADES_KEY_NAME =
+ "allowedEnvironmentTypeUpgrades";
+ public static final String KUBERNETES_BASED_ENVIRONMENTS_KEY_NAME = "kubernetesBasedEnvironments";
+ public static final String KUBERNETES_BASED_COMPONENTS_KEY_NAME = "kubernetesBasedComponents";
+
+ /**
+ * Any workspace environments based on Kubernetes recipes need to register the binding using this
+ * method so that the {@link KubernetesComponentProvisioner} and {@link
+ * KubernetesEnvironmentProvisioner} can work properly with these environments.
+ *
+ * @param baseBinder the binder available in the Guice module calling this method.
+ * @param environmentTypes the environment types to be registered as handled by Kubernetes recipes
+ */
+ public static void addKubernetesBasedEnvironmentTypeBindings(
+ Binder baseBinder, String... environmentTypes) {
+ Multibinder binder =
+ Multibinder.newSetBinder(
+ baseBinder, String.class, Names.named(KUBERNETES_BASED_ENVIRONMENTS_KEY_NAME));
+ for (String envType : environmentTypes) {
+ binder.addBinding().toInstance(envType);
+ }
+ }
+
+ /**
+ * Any devfile components based on Kubernetes recipes need to register the binding using this
+ * method so that the {@link KubernetesComponentProvisioner} and {@link
+ * KubernetesComponentToWorkspaceApplier} can work properly with these components.
+ *
+ * @param baseBinder the binder available in the Guice module calling this method.
+ * @param componentTypes the component types to be registered as handled by Kubernetes recipes
+ */
+ public static void addKubernetesBasedComponentTypeBindings(
+ Binder baseBinder, String... componentTypes) {
+ Multibinder binder =
+ Multibinder.newSetBinder(
+ baseBinder, String.class, Names.named(KUBERNETES_BASED_COMPONENTS_KEY_NAME));
+ for (String envType : componentTypes) {
+ binder.addBinding().toInstance(envType);
+ }
+ }
+
+ /**
+ * It is possible "upgrade" a kubernetes-based environment to a more specific type (e.g. a
+ * Kubernetes can be upgraded to Openshift environment, because Openshift is compatible with
+ * Kubernetes, but an Openshift environment cannot be "upgraded" Kubernetes environment, because
+ * Kubernetes is not itself compatible with Openshift).
+ *
+ * @param baseBinder the binder available in the Guice module calling this method
+ * @param targetEnvironmentType the environment type to upgrade to, if possible
+ * @param baseEnvironmentTypes the environments from which it is possible to upgrade to the target
+ * environment type.
+ */
+ public static void addAllowedEnvironmentTypeUpgradeBindings(
+ Binder baseBinder, String targetEnvironmentType, String... baseEnvironmentTypes) {
+ MapBinder binder =
+ MapBinder.newMapBinder(
+ baseBinder,
+ String.class,
+ String.class,
+ Names.named(ALLOWED_ENVIRONMENT_TYPE_UPGRADES_KEY_NAME))
+ .permitDuplicates();
+
+ for (String baseType : baseEnvironmentTypes) {
+ binder.addBinding(targetEnvironmentType).toInstance(baseType);
+ }
+ }
+
+ private KubernetesDevfileBindings() {}
+}
diff --git a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesEnvironmentProvisioner.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesEnvironmentProvisioner.java
similarity index 78%
rename from wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesEnvironmentProvisioner.java
rename to infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesEnvironmentProvisioner.java
index 302fafde36..19e2084fcb 100644
--- a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesEnvironmentProvisioner.java
+++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesEnvironmentProvisioner.java
@@ -9,11 +9,12 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.kubernetes;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static java.lang.String.format;
import static java.util.Collections.emptyMap;
-import static org.eclipse.che.api.devfile.server.Constants.OPENSHIFT_COMPONENT_TYPE;
+import static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings.ALLOWED_ENVIRONMENT_TYPE_UPGRADES_KEY_NAME;
+import static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings.KUBERNETES_BASED_ENVIRONMENTS_KEY_NAME;
import com.google.common.annotations.VisibleForTesting;
import io.fabric8.kubernetes.api.model.HasMetadata;
@@ -26,17 +27,16 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.inject.Inject;
-import org.eclipse.che.api.devfile.server.DevfileRecipeFormatException;
-import org.eclipse.che.api.devfile.server.exception.DevfileException;
-import org.eclipse.che.api.devfile.server.exception.DevfileFormatException;
+import javax.inject.Named;
+import org.eclipse.che.api.workspace.server.devfile.DevfileRecipeFormatException;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;
import org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;
import org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.RecipeImpl;
import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;
import org.eclipse.che.commons.lang.Pair;
-import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;
-import org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;
/**
* Provisions default K8s/OS environment with specified objects (K8s/OS objects, machines) into
@@ -48,10 +48,18 @@ public class KubernetesEnvironmentProvisioner {
@VisibleForTesting static final String YAML_CONTENT_TYPE = "application/x-yaml";
private final KubernetesRecipeParser objectsParser;
+ private final Map> allowedEnvironmentTypeUpgrades;
+ private final Set k8sBasedEnvTypes;
@Inject
- public KubernetesEnvironmentProvisioner(KubernetesRecipeParser objectsParser) {
+ public KubernetesEnvironmentProvisioner(
+ KubernetesRecipeParser objectsParser,
+ @Named(ALLOWED_ENVIRONMENT_TYPE_UPGRADES_KEY_NAME)
+ Map> allowedEnvironmentTypeUpgrades,
+ @Named(KUBERNETES_BASED_ENVIRONMENTS_KEY_NAME) Set k8sBasedEnvTypes) {
this.objectsParser = objectsParser;
+ this.allowedEnvironmentTypeUpgrades = allowedEnvironmentTypeUpgrades;
+ this.k8sBasedEnvTypes = k8sBasedEnvTypes;
}
/**
@@ -62,8 +70,8 @@ public class KubernetesEnvironmentProvisioner {
* be updated with result or merging existing objects and specified ones.
*
* @param workspaceConfig workspace where recipe should be provisioned
- * @param environmentType type of environment that should be provisioned. Should be {@link
- * KubernetesEnvironment#TYPE} or {@link OpenShiftEnvironment#TYPE}
+ * @param environmentType type of environment that should be provisioned. Should be one of the
+ * Kubernetes-based environments.
* @param componentObjects objects that should be provisioned into the workspace config
* @param machines machines that should be provisioned into the workspace config
* @throws DevfileRecipeFormatException if exception occurred during existing environment parsing
@@ -102,9 +110,10 @@ public class KubernetesEnvironmentProvisioner {
// check if it is needed to update recipe type since
// kubernetes component is compatible with openshift but not vice versa
- if (OPENSHIFT_COMPONENT_TYPE.equals(environmentType)
- && KubernetesEnvironment.TYPE.equals(envRecipe.getType())) {
- envRecipe.setType(OpenShiftEnvironment.TYPE);
+
+ Set allowedEnvTypeBases = allowedEnvironmentTypeUpgrades.get(environmentType);
+ if (allowedEnvTypeBases != null) {
+ envRecipe.setType(environmentType);
}
// workspace already has k8s/OS recipe
@@ -117,13 +126,13 @@ public class KubernetesEnvironmentProvisioner {
}
private List unmarshalObjects(RecipeImpl k8sRecipe) throws DevfileException {
- if (!OpenShiftEnvironment.TYPE.equals(k8sRecipe.getType())
- && !KubernetesEnvironment.TYPE.equals(k8sRecipe.getType())) {
+ if (!k8sBasedEnvTypes.contains(k8sRecipe.getType())) {
+ String allowedEnvTypes = String.join(" or ", k8sBasedEnvTypes);
throw new DevfileException(
format(
- "Kubernetes component can only be applied to a workspace with either kubernetes or "
- + "openshift recipe type but workspace has a recipe of type '%s'",
- k8sRecipe.getType()));
+ "Kubernetes component can only be applied to a workspace with any of %s recipe type"
+ + " but workspace has a recipe of type '%s'",
+ allowedEnvTypes, k8sRecipe.getType()));
}
return unmarshal(k8sRecipe.getContent());
diff --git a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/SelectorFilter.java b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/SelectorFilter.java
similarity index 80%
rename from wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/SelectorFilter.java
rename to infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/SelectorFilter.java
index 370b3de229..f3c16499ec 100644
--- a/wsmaster/che-core-api-devfile/src/main/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/SelectorFilter.java
+++ b/infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/SelectorFilter.java
@@ -9,7 +9,7 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.kubernetes;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static java.util.stream.Collectors.toCollection;
@@ -18,6 +18,7 @@ import io.fabric8.kubernetes.api.model.ObjectMeta;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import org.eclipse.che.commons.annotation.Nullable;
/** Helper class to filter Kubernetes objects by a selector. */
public class SelectorFilter {
@@ -36,12 +37,19 @@ public class SelectorFilter {
}
/**
- * Returns true is specified object is matched by specified selector, false otherwise
+ * Returns true is specified object is matched by specified selector, false otherwise.
+ *
+ * An empty selector is considered to match anything.
*
* @param metadata object metadata to check matching
* @param selector the selector to match the metadata with
*/
- public static boolean test(ObjectMeta metadata, Map selector) {
+ public static boolean test(@Nullable ObjectMeta metadata, Map selector) {
+ if (selector.isEmpty()) {
+ // anything matches if we have nothing to select with
+ return true;
+ }
+
if (metadata == null) {
return false;
}
diff --git a/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/InconsistentRuntimesDetectorTest.java b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/InconsistentRuntimesDetectorTest.java
index 550b15f784..1773a1cc81 100644
--- a/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/InconsistentRuntimesDetectorTest.java
+++ b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/InconsistentRuntimesDetectorTest.java
@@ -34,7 +34,6 @@ import org.eclipse.che.api.workspace.server.model.impl.RuntimeIdentityImpl;
import org.eclipse.che.api.workspace.server.spi.InfrastructureException;
import org.eclipse.che.api.workspace.server.spi.InternalRuntime;
import org.eclipse.che.workspace.infrastructure.kubernetes.util.RuntimeEventsPublisher;
-import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.testng.MockitoTestNGListener;
import org.testng.annotations.BeforeMethod;
@@ -57,7 +56,7 @@ public class InconsistentRuntimesDetectorTest {
@Mock private KubernetesInternalRuntime k8sRuntime;
@Mock private KubernetesRuntimeContext k8sContext;
- @InjectMocks private InconsistentRuntimesDetector inconsistentRuntimesDetector;
+ private InconsistentRuntimesDetector inconsistentRuntimesDetector;
@BeforeMethod
public void setUp() throws Exception {
diff --git a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/ContainerSearchTest.java b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/ContainerSearchTest.java
similarity index 91%
rename from wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/ContainerSearchTest.java
rename to infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/ContainerSearchTest.java
index e0cfc292fb..c5bfebc90b 100644
--- a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/ContainerSearchTest.java
+++ b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/ContainerSearchTest.java
@@ -9,7 +9,7 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.kubernetes;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static java.lang.String.format;
import static java.util.Arrays.asList;
@@ -41,6 +41,7 @@ import io.fabric8.openshift.api.model.DeploymentConfigBuilder;
import io.fabric8.openshift.api.model.Template;
import io.fabric8.openshift.api.model.TemplateBuilder;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.testng.Assert;
@@ -317,7 +318,7 @@ public class ContainerSearchTest {
}
@Test
- public void shouldRestrictByLabels() {
+ public void shouldRestrictByParentSelector() {
Map selector = ImmutableMap.of("app", "che");
ContainerSearch search = new ContainerSearch(null, selector, null);
@@ -332,6 +333,27 @@ public class ContainerSearchTest {
assertContainsContainer(results, "container11");
}
+ @Test
+ public void shouldConsiderEmptySelectorAsNotPresent() {
+ ContainerSearch search = new ContainerSearch(null, Collections.emptyMap(), null);
+
+ List results = search.search(testList);
+
+ Assert.assertEquals(results.size(), 12);
+ assertContainsContainer(results, "container1");
+ assertContainsContainer(results, "container2");
+ assertContainsContainer(results, "container3");
+ assertContainsContainer(results, "container4");
+ assertContainsContainer(results, "container5");
+ assertContainsContainer(results, "container6");
+ assertContainsContainer(results, "container7");
+ assertContainsContainer(results, "container8");
+ assertContainsContainer(results, "container9");
+ assertContainsContainer(results, "container10");
+ assertContainsContainer(results, "container11");
+ assertContainsContainer(results, "container12");
+ }
+
private static void assertContainsContainer(Collection containers, String name) {
containers
.stream()
diff --git a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentProvisionerTest.java b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentProvisionerTest.java
similarity index 98%
rename from wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentProvisionerTest.java
rename to infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentProvisionerTest.java
index 367f86a5b9..b082a66a45 100644
--- a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentProvisionerTest.java
+++ b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentProvisionerTest.java
@@ -9,13 +9,13 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.dockerimage;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static java.util.Collections.emptyMap;
import static org.eclipse.che.api.core.model.workspace.config.MachineConfig.MEMORY_LIMIT_ATTRIBUTE;
-import static org.eclipse.che.api.devfile.server.Constants.PUBLIC_ENDPOINT_ATTRIBUTE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.PUBLIC_ENDPOINT_ATTRIBUTE;
import static org.eclipse.che.api.workspace.shared.Constants.PROJECTS_VOLUME_NAME;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@@ -27,7 +27,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
-import org.eclipse.che.api.devfile.server.exception.WorkspaceExportException;
+import org.eclipse.che.api.workspace.server.devfile.exception.WorkspaceExportException;
import org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;
import org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.RecipeImpl;
diff --git a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentToWorkspaceApplierTest.java b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentToWorkspaceApplierTest.java
similarity index 96%
rename from wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentToWorkspaceApplierTest.java
rename to infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentToWorkspaceApplierTest.java
index 210443f4f1..fb84629599 100644
--- a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/dockerimage/DockerimageComponentToWorkspaceApplierTest.java
+++ b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/DockerimageComponentToWorkspaceApplierTest.java
@@ -9,16 +9,16 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.dockerimage;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonList;
-import static org.eclipse.che.api.devfile.server.Constants.DISCOVERABLE_ENDPOINT_ATTRIBUTE;
-import static org.eclipse.che.api.devfile.server.Constants.DOCKERIMAGE_COMPONENT_TYPE;
-import static org.eclipse.che.api.devfile.server.Constants.PUBLIC_ENDPOINT_ATTRIBUTE;
-import static org.eclipse.che.api.devfile.server.convert.component.dockerimage.DockerimageComponentToWorkspaceApplier.CHE_COMPONENT_NAME_LABEL;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.DISCOVERABLE_ENDPOINT_ATTRIBUTE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.PUBLIC_ENDPOINT_ATTRIBUTE;
import static org.eclipse.che.api.workspace.shared.Constants.PROJECTS_VOLUME_NAME;
import static org.eclipse.che.workspace.infrastructure.kubernetes.Constants.MACHINE_NAME_ANNOTATION_FMT;
+import static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.DockerimageComponentToWorkspaceApplier.CHE_COMPONENT_NAME_LABEL;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
@@ -44,8 +44,7 @@ import java.util.List;
import java.util.Map;
import org.eclipse.che.api.core.ValidationException;
import org.eclipse.che.api.core.model.workspace.config.ServerConfig;
-import org.eclipse.che.api.devfile.server.convert.component.kubernetes.KubernetesEnvironmentProvisioner;
-import org.eclipse.che.api.devfile.server.exception.DevfileException;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;
import org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.ServerConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;
diff --git a/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentIntegrityValidatorTest.java b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentIntegrityValidatorTest.java
new file mode 100644
index 0000000000..ed40ea2329
--- /dev/null
+++ b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentIntegrityValidatorTest.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
+
+import static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import io.fabric8.kubernetes.api.model.PodBuilder;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;
+import org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;
+import org.eclipse.che.api.workspace.server.model.impl.devfile.EntrypointImpl;
+import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;
+import org.mockito.Mock;
+import org.mockito.testng.MockitoTestNGListener;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Listeners;
+import org.testng.annotations.Test;
+
+@Listeners(MockitoTestNGListener.class)
+public class KubernetesComponentIntegrityValidatorTest {
+
+ @Mock private KubernetesRecipeParser kubernetesRecipeParser;
+
+ private KubernetesComponentValidator validator;
+
+ @BeforeMethod
+ public void setup() {
+ Set k8sComponentTypes = new HashSet<>();
+ k8sComponentTypes.add(KUBERNETES_COMPONENT_TYPE);
+ validator = new KubernetesComponentValidator(kubernetesRecipeParser, k8sComponentTypes);
+ }
+
+ @Test
+ public void shouldApplySelector() throws Exception {
+ // given
+ when(kubernetesRecipeParser.parse(any(String.class)))
+ .thenReturn(
+ Arrays.asList(
+ new PodBuilder().withNewMetadata().addToLabels("app", "test").endMetadata().build(),
+ new PodBuilder()
+ .withNewMetadata()
+ .addToLabels("app", "other")
+ .endMetadata()
+ .build()));
+
+ Map selector = new HashMap<>();
+ selector.put("app", "test");
+
+ ComponentImpl component = new ComponentImpl();
+ component.setType(KUBERNETES_COMPONENT_TYPE);
+ component.setReference("ref");
+ component.setSelector(selector);
+ component.setReferenceContent("content");
+
+ // when
+ validator.validateComponent(component, __ -> "");
+
+ // then no exception is thrown
+ }
+
+ @Test
+ public void shouldApplyEntrypoint() throws Exception {
+ // given
+ when(kubernetesRecipeParser.parse(any(String.class)))
+ .thenReturn(
+ Arrays.asList(
+ new PodBuilder()
+ .withNewSpec()
+ .addNewContainer()
+ .withName("container_a")
+ .endContainer()
+ .endSpec()
+ .build(),
+ new PodBuilder()
+ .withNewSpec()
+ .addNewContainer()
+ .withName("container_b")
+ .endContainer()
+ .endSpec()
+ .build()));
+
+ ComponentImpl component = new ComponentImpl();
+ component.setType(KUBERNETES_COMPONENT_TYPE);
+ component.setReferenceContent("content");
+ component.setReference("ref");
+
+ EntrypointImpl entrypoint = new EntrypointImpl();
+ entrypoint.setContainerName("container_a");
+ component.setEntrypoints(Collections.singletonList(entrypoint));
+
+ // when
+ validator.validateComponent(component, __ -> "");
+
+ // then no exception is thrown
+ }
+
+ @Test
+ public void shouldValidateContainerMatchingEntrypointInPodMatchingSelector() throws Exception {
+ // given
+ when(kubernetesRecipeParser.parse(any(String.class)))
+ .thenReturn(
+ Arrays.asList(
+ new PodBuilder()
+ .withNewMetadata()
+ .addToLabels("app", "test")
+ .endMetadata()
+ .withNewSpec()
+ .addNewContainer()
+ .withName("container_a")
+ .endContainer()
+ .endSpec()
+ .build(),
+ new PodBuilder()
+ .withNewMetadata()
+ .addToLabels("app", "other")
+ .endMetadata()
+ .withNewSpec()
+ .addNewContainer()
+ .withName("container_a")
+ .endContainer()
+ .endSpec()
+ .build()));
+
+ Map selector = new HashMap<>();
+ selector.put("app", "test");
+
+ ComponentImpl component = new ComponentImpl();
+ component.setType(KUBERNETES_COMPONENT_TYPE);
+ component.setReference("ref");
+ component.setSelector(selector);
+ component.setReferenceContent("content");
+
+ EntrypointImpl entrypoint = new EntrypointImpl();
+ entrypoint.setContainerName("container_a");
+ component.setEntrypoints(Collections.singletonList(entrypoint));
+
+ // when
+ validator.validateComponent(component, __ -> "");
+
+ // then no exception is thrown
+ }
+
+ @Test(
+ expectedExceptions = DevfileFormatException.class,
+ expectedExceptionsMessageRegExp =
+ "Failed to validate content reference of component 'ref' of type 'kubernetes': The selector of the component 'ref' of type 'kubernetes' filters out all objects from the list.")
+ public void shouldThrowExceptionOnSelectorFilteringOutEverything() throws Exception {
+ // given
+ when(kubernetesRecipeParser.parse(any(String.class)))
+ .thenReturn(
+ Collections.singletonList(
+ new PodBuilder()
+ .withNewMetadata()
+ .addToLabels("app", "test")
+ .endMetadata()
+ .build()));
+
+ Map selector = new HashMap<>();
+ selector.put("app", "a different value");
+
+ ComponentImpl component = new ComponentImpl();
+ component.setType(KUBERNETES_COMPONENT_TYPE);
+ component.setReference("ref");
+ component.setSelector(selector);
+ component.setReferenceContent("content");
+
+ // when
+ validator.validateComponent(component, __ -> "");
+
+ // then exception is thrown
+ }
+
+ @Test(
+ expectedExceptions = DevfileFormatException.class,
+ expectedExceptionsMessageRegExp =
+ "Failed to validate content reference of component 'ref' of type 'kubernetes': Component 'ref' of type 'kubernetes' contains an entry point that doesn't match any container.")
+ public void shouldThrowExceptionOnEntrypointNotMatchingAnyContainer() throws Exception {
+ // given
+ when(kubernetesRecipeParser.parse(any(String.class)))
+ .thenReturn(
+ Collections.singletonList(
+ new PodBuilder()
+ .withNewSpec()
+ .addNewContainer()
+ .withName("container")
+ .endContainer()
+ .endSpec()
+ .build()));
+
+ ComponentImpl component = new ComponentImpl();
+ component.setType(KUBERNETES_COMPONENT_TYPE);
+ component.setReferenceContent("content");
+ component.setReference("ref");
+
+ EntrypointImpl entrypoint = new EntrypointImpl();
+ entrypoint.setContainerName("not that container");
+ component.setEntrypoints(Collections.singletonList(entrypoint));
+
+ // when
+ validator.validateComponent(component, __ -> "");
+
+ // then exception is thrown
+ }
+
+ @Test(
+ expectedExceptions = DevfileFormatException.class,
+ expectedExceptionsMessageRegExp =
+ "Failed to validate content reference of component 'ref' of type 'kubernetes': Component 'ref' of type 'kubernetes' contains an entry point that doesn't match any container.")
+ public void shouldThrowExceptionOnEntrypointNotMatchingAnyContainerOfPodsMatchingSelector()
+ throws Exception {
+ // given
+ when(kubernetesRecipeParser.parse(any(String.class)))
+ .thenReturn(
+ Arrays.asList(
+ new PodBuilder()
+ .withNewMetadata()
+ .addToLabels("app", "test")
+ .endMetadata()
+ .withNewSpec()
+ .addNewContainer()
+ .withName("container_a")
+ .endContainer()
+ .endSpec()
+ .build(),
+ new PodBuilder()
+ .withNewMetadata()
+ .addToLabels("app", "other")
+ .endMetadata()
+ .withNewSpec()
+ .addNewContainer()
+ .withName("container_b")
+ .endContainer()
+ .endSpec()
+ .build()));
+
+ Map selector = new HashMap<>();
+ selector.put("app", "test");
+
+ ComponentImpl component = new ComponentImpl();
+ component.setType(KUBERNETES_COMPONENT_TYPE);
+ component.setReferenceContent("content");
+ component.setReference("ref");
+ component.setSelector(selector);
+
+ EntrypointImpl entrypoint = new EntrypointImpl();
+ entrypoint.setContainerName("container_b");
+ component.setEntrypoints(Collections.singletonList(entrypoint));
+
+ // when
+ validator.validateComponent(component, __ -> "");
+
+ // then exception is thrown
+ }
+}
diff --git a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentProvisionerTest.java b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentProvisionerTest.java
similarity index 55%
rename from wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentProvisionerTest.java
rename to infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentProvisionerTest.java
index 3ef3055613..b18d8c6cb4 100644
--- a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentProvisionerTest.java
+++ b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentProvisionerTest.java
@@ -9,33 +9,42 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.kubernetes;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
-import org.eclipse.che.api.devfile.server.exception.WorkspaceExportException;
+import static java.lang.String.format;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import org.eclipse.che.api.workspace.server.devfile.exception.WorkspaceExportException;
import org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;
import org.eclipse.che.api.workspace.server.model.impl.RecipeImpl;
import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.devfile.DevfileImpl;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;
-import org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;
+import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/** @author Sergii Leshchenko */
public class KubernetesComponentProvisionerTest {
private KubernetesComponentProvisioner kubernetesComponentProvisioner;
+ private static final List HANDLED_TYPES =
+ Arrays.asList(KubernetesEnvironment.TYPE, "funky");
@BeforeMethod
public void setUp() {
- kubernetesComponentProvisioner = new KubernetesComponentProvisioner();
+ kubernetesComponentProvisioner =
+ new KubernetesComponentProvisioner(new HashSet<>(HANDLED_TYPES));
}
@Test(
expectedExceptions = WorkspaceExportException.class,
expectedExceptionsMessageRegExp =
- "Workspace with multiple `kubernetes`/`openshift` environments can not be converted to devfile")
- public void shouldThrowExceptionIfWorkspaceHasMultipleEnvironmentsWithKubernetesOpenShiftRecipes()
+ "Workspace with multiple kubernetes/funky environments can not be converted to devfile")
+ public void shouldThrowExceptionIfWorkspaceHasMultipleEnvironmentsWithHandledRecipes()
throws Exception {
// given
WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();
@@ -44,15 +53,15 @@ public class KubernetesComponentProvisionerTest {
workspaceConfig.getEnvironments().put("k8sEnv", k8sEnv);
EnvironmentImpl osEnv = new EnvironmentImpl();
- osEnv.setRecipe(new RecipeImpl(OpenShiftEnvironment.TYPE, null, null, null));
- workspaceConfig.getEnvironments().put("osEnv", osEnv);
+ osEnv.setRecipe(new RecipeImpl("funky", null, null, null));
+ workspaceConfig.getEnvironments().put("funkyEnv", osEnv);
// when
kubernetesComponentProvisioner.provision(new DevfileImpl(), workspaceConfig);
}
@Test
- public void shouldNoNothingIfWorkspaceDoesNotHaveEnvironmentsWithKubernetesOpenShiftRecipes()
+ public void shouldNoNothingIfWorkspaceDoesNotHaveEnvironmentsWithHandledRecipes()
throws Exception {
// given
WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();
@@ -64,34 +73,29 @@ public class KubernetesComponentProvisionerTest {
kubernetesComponentProvisioner.provision(new DevfileImpl(), workspaceConfig);
}
- @Test(
- expectedExceptions = WorkspaceExportException.class,
- expectedExceptionsMessageRegExp =
- "Exporting of workspace with `kubernetes` is not supported yet.")
- public void shouldThrowExceptionIfWorkspaceHasEnvironmentWithKubernetesRecipe() throws Exception {
+ @Test(dataProvider = "handledTypes")
+ public void shouldThrowExceptionIfWorkspaceHasEnvironmentWithExactlyOneHandledType(
+ String handledType) {
// given
WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();
EnvironmentImpl k8sEnv = new EnvironmentImpl();
- k8sEnv.setRecipe(new RecipeImpl(KubernetesEnvironment.TYPE, null, null, null));
- workspaceConfig.getEnvironments().put("k8sEnv", k8sEnv);
+ k8sEnv.setRecipe(new RecipeImpl(handledType, null, null, null));
+ workspaceConfig.getEnvironments().put("Env", k8sEnv);
- // when
- kubernetesComponentProvisioner.provision(new DevfileImpl(), workspaceConfig);
+ try {
+ // when
+ kubernetesComponentProvisioner.provision(new DevfileImpl(), workspaceConfig);
+ } catch (WorkspaceExportException e) {
+ // then
+ String expectedMessage =
+ format("Exporting of workspace with `%s` is not supported yet.", handledType);
+
+ Assert.assertEquals(e.getMessage(), expectedMessage);
+ }
}
- @Test(
- expectedExceptions = WorkspaceExportException.class,
- expectedExceptionsMessageRegExp =
- "Exporting of workspace with `openshift` is not supported yet.")
- public void shouldThrowExceptionIfWorkspaceHasEnvironmentWithOpenShiftRecipe() throws Exception {
- // given
- WorkspaceConfigImpl workspaceConfig = new WorkspaceConfigImpl();
-
- EnvironmentImpl osEnv = new EnvironmentImpl();
- osEnv.setRecipe(new RecipeImpl(OpenShiftEnvironment.TYPE, null, null, null));
- workspaceConfig.getEnvironments().put("osEnv", osEnv);
-
- // when
- kubernetesComponentProvisioner.provision(new DevfileImpl(), workspaceConfig);
+ @DataProvider
+ public static Object[][] handledTypes() {
+ return HANDLED_TYPES.stream().map(t -> new Object[] {t}).toArray(Object[][]::new);
}
}
diff --git a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentToWorkspaceApplierTest.java b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentToWorkspaceApplierTest.java
similarity index 85%
rename from wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentToWorkspaceApplierTest.java
rename to infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentToWorkspaceApplierTest.java
index 2a8afc52b0..ff644a46a3 100644
--- a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesComponentToWorkspaceApplierTest.java
+++ b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesComponentToWorkspaceApplierTest.java
@@ -9,7 +9,7 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.kubernetes;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static io.fabric8.kubernetes.client.utils.Serialization.unmarshal;
import static java.util.Arrays.asList;
@@ -17,9 +17,9 @@ import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonList;
import static java.util.Collections.singletonMap;
import static org.eclipse.che.api.core.model.workspace.config.Command.MACHINE_NAME_ATTRIBUTE;
-import static org.eclipse.che.api.devfile.server.Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE;
-import static org.eclipse.che.api.devfile.server.Constants.KUBERNETES_COMPONENT_TYPE;
-import static org.eclipse.che.api.devfile.server.Constants.OPENSHIFT_COMPONENT_TYPE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.OPENSHIFT_COMPONENT_TYPE;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
@@ -35,18 +35,19 @@ import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.api.model.KubernetesList;
import io.fabric8.kubernetes.api.model.Pod;
import java.io.IOException;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.eclipse.che.api.core.ValidationException;
-import org.eclipse.che.api.devfile.server.URLFileContentProvider;
-import org.eclipse.che.api.devfile.server.exception.DevfileException;
+import org.eclipse.che.api.workspace.server.devfile.URLFileContentProvider;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;
import org.eclipse.che.api.workspace.server.model.impl.CommandImpl;
import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;
import org.eclipse.che.api.workspace.server.model.impl.devfile.EntrypointImpl;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;
-import org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
@@ -73,7 +74,12 @@ public class KubernetesComponentToWorkspaceApplierTest {
@BeforeMethod
public void setUp() {
- applier = new KubernetesComponentToWorkspaceApplier(k8sRecipeParser, k8sEnvProvisioner);
+ Set k8sBasedComponents = new HashSet<>();
+ k8sBasedComponents.add(KUBERNETES_COMPONENT_TYPE);
+ k8sBasedComponents.add("openshift"); // so that we can work with the petclinic.yaml
+ applier =
+ new KubernetesComponentToWorkspaceApplier(
+ k8sRecipeParser, k8sEnvProvisioner, k8sBasedComponents);
workspaceConfig = new WorkspaceConfigImpl();
}
@@ -145,7 +151,7 @@ public class KubernetesComponentToWorkspaceApplierTest {
public void shouldProvisionEnvironmentWithCorrectRecipeTypeAndContentFromK8SList()
throws Exception {
// given
- String yamlRecipeContent = getResource("petclinic.yaml");
+ String yamlRecipeContent = getResource("devfile/petclinic.yaml");
doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());
ComponentImpl component = new ComponentImpl();
component.setType(KUBERNETES_COMPONENT_TYPE);
@@ -166,7 +172,7 @@ public class KubernetesComponentToWorkspaceApplierTest {
@Test
public void shouldUseReferenceContentAsRecipeIfPresent() throws Exception {
- String yamlRecipeContent = getResource("petclinic.yaml");
+ String yamlRecipeContent = getResource("devfile/petclinic.yaml");
doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());
ComponentImpl component = new ComponentImpl();
component.setType(KUBERNETES_COMPONENT_TYPE);
@@ -184,37 +190,14 @@ public class KubernetesComponentToWorkspaceApplierTest {
emptyMap());
}
- @Test
- public void shouldProvisionEnvironmentWithCorrectRecipeTypeAndContentFromOSList()
- throws Exception {
- // given
- String yamlRecipeContent = getResource("petclinic.yaml");
- doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());
- ComponentImpl component = new ComponentImpl();
- component.setType(OPENSHIFT_COMPONENT_TYPE);
- component.setReference(REFERENCE_FILENAME);
- component.setAlias(COMPONENT_NAME);
-
- // when
- applier.apply(workspaceConfig, component, s -> yamlRecipeContent);
-
- // then
- verify(k8sEnvProvisioner)
- .provision(
- workspaceConfig,
- OpenShiftEnvironment.TYPE,
- toK8SList(yamlRecipeContent).getItems(),
- emptyMap());
- }
-
@Test
public void shouldFilterRecipeWithGivenSelectors() throws Exception {
// given
- String yamlRecipeContent = getResource("petclinic.yaml");
+ String yamlRecipeContent = getResource("devfile/petclinic.yaml");
final Map selector = singletonMap("app.kubernetes.io/component", "webapp");
ComponentImpl component = new ComponentImpl();
- component.setType(OPENSHIFT_COMPONENT_TYPE);
+ component.setType(KUBERNETES_COMPONENT_TYPE);
component.setReference(REFERENCE_FILENAME);
component.setAlias(COMPONENT_NAME);
component.setSelector(selector);
@@ -227,7 +210,7 @@ public class KubernetesComponentToWorkspaceApplierTest {
verify(k8sEnvProvisioner)
.provision(
eq(workspaceConfig),
- eq(OpenShiftEnvironment.TYPE),
+ eq(KubernetesEnvironment.TYPE),
objectsCaptor.capture(),
eq(emptyMap()));
List resultItemsList = objectsCaptor.getValue();
@@ -241,7 +224,7 @@ public class KubernetesComponentToWorkspaceApplierTest {
public void shouldSetMachineNameAttributeToCommandConfiguredInOpenShiftComponentWithOneContainer()
throws Exception {
// given
- String yamlRecipeContent = getResource("petclinic.yaml");
+ String yamlRecipeContent = getResource("devfile/petclinic.yaml");
doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());
final Map selector = singletonMap("app.kubernetes.io/component", "webapp");
@@ -267,7 +250,7 @@ public class KubernetesComponentToWorkspaceApplierTest {
shouldNotSetMachineNameAttributeToCommandConfiguredInOpenShiftComponentWithMultipleContainers()
throws Exception {
// given
- String yamlRecipeContent = getResource("petclinic.yaml");
+ String yamlRecipeContent = getResource("devfile/petclinic.yaml");
doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());
ComponentImpl component = new ComponentImpl();
@@ -290,7 +273,7 @@ public class KubernetesComponentToWorkspaceApplierTest {
@Test
public void shouldChangeEntrypointsOnMatchingContainers() throws Exception {
// given
- String yamlRecipeContent = getResource("petclinic.yaml");
+ String yamlRecipeContent = getResource("devfile/petclinic.yaml");
doReturn(toK8SList(yamlRecipeContent).getItems()).when(k8sRecipeParser).parse(anyString());
List command = asList("teh", "command");
diff --git a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesEnvironmentProvisionerTest.java b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesEnvironmentProvisionerTest.java
similarity index 87%
rename from wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesEnvironmentProvisionerTest.java
rename to infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesEnvironmentProvisionerTest.java
index 5cb1124baa..a4d144bceb 100644
--- a/wsmaster/che-core-api-devfile/src/test/java/org/eclipse/che/api/devfile/server/convert/component/kubernetes/KubernetesEnvironmentProvisionerTest.java
+++ b/infrastructures/kubernetes/src/test/java/org/eclipse/che/workspace/infrastructure/kubernetes/devfile/KubernetesEnvironmentProvisionerTest.java
@@ -9,13 +9,13 @@
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
-package org.eclipse.che.api.devfile.server.convert.component.kubernetes;
+package org.eclipse.che.workspace.infrastructure.kubernetes.devfile;
import static io.fabric8.kubernetes.client.utils.Serialization.unmarshal;
import static java.util.Collections.emptyList;
import static java.util.Collections.emptyMap;
-import static org.eclipse.che.api.devfile.server.Constants.KUBERNETES_COMPONENT_TYPE;
-import static org.eclipse.che.api.devfile.server.convert.component.kubernetes.KubernetesEnvironmentProvisioner.YAML_CONTENT_TYPE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;
+import static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesEnvironmentProvisioner.YAML_CONTENT_TYPE;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.testng.Assert.assertEquals;
@@ -32,17 +32,19 @@ import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
-import org.eclipse.che.api.devfile.server.exception.DevfileException;
-import org.eclipse.che.api.devfile.server.exception.DevfileFormatException;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileException;
+import org.eclipse.che.api.workspace.server.devfile.exception.DevfileFormatException;
import org.eclipse.che.api.workspace.server.model.impl.EnvironmentImpl;
import org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.RecipeImpl;
import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;
-import org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;
-import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.testng.MockitoTestNGListener;
import org.testng.annotations.BeforeMethod;
@@ -61,18 +63,31 @@ public class KubernetesEnvironmentProvisionerTest {
private WorkspaceConfigImpl workspaceConfig;
@Mock private KubernetesRecipeParser k8sRecipeParser;
- @InjectMocks private KubernetesEnvironmentProvisioner k8sEnvProvisioner;
+ private KubernetesEnvironmentProvisioner k8sEnvProvisioner;
@BeforeMethod
public void setUp() {
workspaceConfig = new WorkspaceConfigImpl();
+
+ // "openshift" is what we use in the test devfile files and what we need to test the upgrade
+ // and multiple k8s-based types
+ Map> allowedUpgrades = new HashMap<>();
+ allowedUpgrades
+ .compute("openshift", (__, ___) -> new HashSet<>())
+ .add(KubernetesEnvironment.TYPE);
+ Set k8sEnvTypes = new HashSet<>();
+ k8sEnvTypes.add(KubernetesEnvironment.TYPE);
+ k8sEnvTypes.add("openshift");
+
+ k8sEnvProvisioner =
+ new KubernetesEnvironmentProvisioner(k8sRecipeParser, allowedUpgrades, k8sEnvTypes);
}
@Test
public void shouldProvisionEnvironmentWithCorrectRecipeTypeAndContentFromK8SList()
throws Exception {
// given
- String yamlRecipeContent = getResource("petclinic.yaml");
+ String yamlRecipeContent = getResource("devfile/petclinic.yaml");
List componentsObjects = toK8SList(yamlRecipeContent).getItems();
// when
@@ -138,14 +153,13 @@ public class KubernetesEnvironmentProvisionerTest {
doReturn(new ArrayList<>()).when(k8sRecipeParser).parse(anyString());
// when
- k8sEnvProvisioner.provision(
- workspaceConfig, OpenShiftEnvironment.TYPE, componentsObject, emptyMap());
+ k8sEnvProvisioner.provision(workspaceConfig, "openshift", componentsObject, emptyMap());
// then
EnvironmentImpl resultEnv =
workspaceConfig.getEnvironments().get(workspaceConfig.getDefaultEnv());
RecipeImpl resultRecipe = resultEnv.getRecipe();
- assertEquals(resultRecipe.getType(), OpenShiftEnvironment.TYPE);
+ assertEquals(resultRecipe.getType(), "openshift");
}
@Test
@@ -201,7 +215,7 @@ public class KubernetesEnvironmentProvisionerTest {
@Test(
expectedExceptions = DevfileException.class,
expectedExceptionsMessageRegExp =
- "Kubernetes component can only be applied to a workspace with either kubernetes or openshift "
+ "Kubernetes component can only be applied to a workspace with any of kubernetes or openshift "
+ "recipe type but workspace has a recipe of type 'any'")
public void shouldThrowAnExceptionIfWorkspaceAlreadyContainNonK8sNorOSRecipe() throws Exception {
// given
diff --git a/wsmaster/che-core-api-devfile/src/test/resources/petclinic.yaml b/infrastructures/kubernetes/src/test/resources/devfile/petclinic.yaml
similarity index 100%
rename from wsmaster/che-core-api-devfile/src/test/resources/petclinic.yaml
rename to infrastructures/kubernetes/src/test/resources/devfile/petclinic.yaml
diff --git a/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/OpenShiftInfraModule.java b/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/OpenShiftInfraModule.java
index 5d543f14e5..111ea8a661 100644
--- a/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/OpenShiftInfraModule.java
+++ b/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/OpenShiftInfraModule.java
@@ -11,6 +11,9 @@
*/
package org.eclipse.che.workspace.infrastructure.openshift;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.DOCKERIMAGE_COMPONENT_TYPE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.OPENSHIFT_COMPONENT_TYPE;
import static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.pvc.CommonPVCStrategy.COMMON_STRATEGY;
import static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.pvc.PerWorkspacePVCStrategy.PER_WORKSPACE_STRATEGY;
import static org.eclipse.che.workspace.infrastructure.kubernetes.namespace.pvc.UniqueWorkspacePVCStrategy.UNIQUE_STRATEGY;
@@ -22,6 +25,8 @@ import com.google.inject.multibindings.MapBinder;
import com.google.inject.multibindings.Multibinder;
import org.eclipse.che.api.system.server.ServiceTermination;
import org.eclipse.che.api.workspace.server.NoEnvironmentFactory;
+import org.eclipse.che.api.workspace.server.devfile.DevfileBindings;
+import org.eclipse.che.api.workspace.server.devfile.validator.ComponentIntegrityValidator.NoopComponentIntegrityValidator;
import org.eclipse.che.api.workspace.server.spi.RuntimeInfrastructure;
import org.eclipse.che.api.workspace.server.spi.environment.InternalEnvironmentFactory;
import org.eclipse.che.api.workspace.server.spi.provision.env.CheApiExternalEnvVarProvider;
@@ -37,6 +42,12 @@ import org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesEnvironment
import org.eclipse.che.workspace.infrastructure.kubernetes.StartSynchronizerFactory;
import org.eclipse.che.workspace.infrastructure.kubernetes.bootstrapper.KubernetesBootstrapperFactory;
import org.eclipse.che.workspace.infrastructure.kubernetes.cache.jpa.JpaKubernetesRuntimeCacheModule;
+import org.eclipse.che.workspace.infrastructure.kubernetes.devfile.DockerimageComponentProvisioner;
+import org.eclipse.che.workspace.infrastructure.kubernetes.devfile.DockerimageComponentToWorkspaceApplier;
+import org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentProvisioner;
+import org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentToWorkspaceApplier;
+import org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentValidator;
+import org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment;
import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironmentFactory;
import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory;
@@ -59,6 +70,7 @@ import org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.PluginBroke
import org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.SidecarToolingProvisioner;
import org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.brokerphases.BrokerEnvironmentFactory;
import org.eclipse.che.workspace.infrastructure.kubernetes.wsplugins.events.BrokerService;
+import org.eclipse.che.workspace.infrastructure.openshift.devfile.OpenshiftComponentToWorkspaceApplier;
import org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;
import org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironmentFactory;
import org.eclipse.che.workspace.infrastructure.openshift.project.OpenShiftProjectFactory;
@@ -146,5 +158,39 @@ public class OpenShiftInfraModule extends AbstractModule {
bind(new TypeLiteral>() {})
.to(OpenShiftEnvironmentProvisioner.class);
+
+ DevfileBindings.onComponentIntegrityValidatorBinder(
+ binder(),
+ binder -> {
+ binder.addBinding(KUBERNETES_COMPONENT_TYPE).to(KubernetesComponentValidator.class);
+ binder.addBinding(OPENSHIFT_COMPONENT_TYPE).to(KubernetesComponentValidator.class);
+ binder.addBinding(DOCKERIMAGE_COMPONENT_TYPE).to(NoopComponentIntegrityValidator.class);
+ });
+
+ DevfileBindings.onWorkspaceApplierBinder(
+ binder(),
+ binder -> {
+ binder
+ .addBinding(KUBERNETES_COMPONENT_TYPE)
+ .to(KubernetesComponentToWorkspaceApplier.class);
+ binder
+ .addBinding(DOCKERIMAGE_COMPONENT_TYPE)
+ .to(DockerimageComponentToWorkspaceApplier.class);
+ binder
+ .addBinding(OPENSHIFT_COMPONENT_TYPE)
+ .to(OpenshiftComponentToWorkspaceApplier.class);
+ });
+
+ DevfileBindings.addComponentProvisioners(
+ binder(), KubernetesComponentProvisioner.class, DockerimageComponentProvisioner.class);
+
+ KubernetesDevfileBindings.addKubernetesBasedEnvironmentTypeBindings(
+ binder(), KubernetesEnvironment.TYPE, OpenShiftEnvironment.TYPE);
+
+ KubernetesDevfileBindings.addKubernetesBasedComponentTypeBindings(
+ binder(), KUBERNETES_COMPONENT_TYPE, OPENSHIFT_COMPONENT_TYPE);
+
+ KubernetesDevfileBindings.addAllowedEnvironmentTypeUpgradeBindings(
+ binder(), OpenShiftEnvironment.TYPE, KubernetesEnvironment.TYPE);
}
}
diff --git a/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/devfile/OpenshiftComponentToWorkspaceApplier.java b/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/devfile/OpenshiftComponentToWorkspaceApplier.java
new file mode 100644
index 0000000000..ca02c9eefe
--- /dev/null
+++ b/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/devfile/OpenshiftComponentToWorkspaceApplier.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.workspace.infrastructure.openshift.devfile;
+
+import static org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesDevfileBindings.KUBERNETES_BASED_COMPONENTS_KEY_NAME;
+
+import java.util.Set;
+import javax.inject.Inject;
+import javax.inject.Named;
+import org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentToWorkspaceApplier;
+import org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesEnvironmentProvisioner;
+import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;
+import org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;
+
+public class OpenshiftComponentToWorkspaceApplier extends KubernetesComponentToWorkspaceApplier {
+ @Inject
+ public OpenshiftComponentToWorkspaceApplier(
+ KubernetesRecipeParser objectsParser,
+ KubernetesEnvironmentProvisioner k8sEnvProvisioner,
+ @Named(KUBERNETES_BASED_COMPONENTS_KEY_NAME) Set kubernetesBasedComponentTypes) {
+ super(
+ objectsParser, k8sEnvProvisioner, OpenShiftEnvironment.TYPE, kubernetesBasedComponentTypes);
+ }
+}
diff --git a/infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/devfile/OpenshiftComponentToWorkspaceApplierTest.java b/infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/devfile/OpenshiftComponentToWorkspaceApplierTest.java
new file mode 100644
index 0000000000..aebefb8ade
--- /dev/null
+++ b/infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/devfile/OpenshiftComponentToWorkspaceApplierTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2012-2018 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.che.workspace.infrastructure.openshift.devfile;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptyMap;
+import static org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;
+import org.eclipse.che.api.workspace.server.model.impl.devfile.ComponentImpl;
+import org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesComponentToWorkspaceApplier;
+import org.eclipse.che.workspace.infrastructure.kubernetes.devfile.KubernetesEnvironmentProvisioner;
+import org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesRecipeParser;
+import org.eclipse.che.workspace.infrastructure.openshift.environment.OpenShiftEnvironment;
+import org.mockito.Mock;
+import org.mockito.testng.MockitoTestNGListener;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Listeners;
+import org.testng.annotations.Test;
+
+@Listeners(MockitoTestNGListener.class)
+public class OpenshiftComponentToWorkspaceApplierTest {
+ public static final String REFERENCE_FILENAME = "reference.yaml";
+ public static final String COMPONENT_NAME = "foo";
+
+ private WorkspaceConfigImpl workspaceConfig;
+
+ private KubernetesComponentToWorkspaceApplier applier;
+ @Mock private KubernetesEnvironmentProvisioner k8sEnvProvisioner;
+ @Mock private KubernetesRecipeParser k8sRecipeParser;
+
+ @BeforeMethod
+ public void setUp() {
+ Set k8sBasedComponents = new HashSet<>();
+ k8sBasedComponents.add(KUBERNETES_COMPONENT_TYPE);
+ applier =
+ new OpenshiftComponentToWorkspaceApplier(
+ k8sRecipeParser, k8sEnvProvisioner, k8sBasedComponents);
+
+ workspaceConfig = new WorkspaceConfigImpl();
+ }
+
+ @Test
+ public void shouldProvisionEnvironmentWithCorrectRecipeTypeAndContentFromOSList()
+ throws Exception {
+ // given
+ doReturn(emptyList()).when(k8sRecipeParser).parse(anyString());
+ ComponentImpl component = new ComponentImpl();
+ component.setType(KUBERNETES_COMPONENT_TYPE);
+ component.setReference(REFERENCE_FILENAME);
+ component.setAlias(COMPONENT_NAME);
+
+ // when
+ applier.apply(workspaceConfig, component, s -> "content");
+
+ // then
+ verify(k8sEnvProvisioner)
+ .provision(workspaceConfig, OpenShiftEnvironment.TYPE, emptyList(), emptyMap());
+ }
+}
diff --git a/multiuser/api/che-multiuser-api-resource/src/main/java/org/eclipse/che/multiuser/resource/api/workspace/LimitsCheckingWorkspaceManager.java b/multiuser/api/che-multiuser-api-resource/src/main/java/org/eclipse/che/multiuser/resource/api/workspace/LimitsCheckingWorkspaceManager.java
index 49a25e3d4a..06d9a1e7d9 100644
--- a/multiuser/api/che-multiuser-api-resource/src/main/java/org/eclipse/che/multiuser/resource/api/workspace/LimitsCheckingWorkspaceManager.java
+++ b/multiuser/api/che-multiuser-api-resource/src/main/java/org/eclipse/che/multiuser/resource/api/workspace/LimitsCheckingWorkspaceManager.java
@@ -32,10 +32,10 @@ import org.eclipse.che.api.core.model.workspace.Workspace;
import org.eclipse.che.api.core.model.workspace.WorkspaceConfig;
import org.eclipse.che.api.core.model.workspace.config.Environment;
import org.eclipse.che.api.core.notification.EventService;
-import org.eclipse.che.api.workspace.server.DevfileToWorkspaceConfigConverter;
import org.eclipse.che.api.workspace.server.WorkspaceManager;
import org.eclipse.che.api.workspace.server.WorkspaceRuntimes;
import org.eclipse.che.api.workspace.server.WorkspaceValidator;
+import org.eclipse.che.api.workspace.server.devfile.convert.DevfileConverter;
import org.eclipse.che.api.workspace.server.model.impl.WorkspaceConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;
import org.eclipse.che.api.workspace.server.spi.WorkspaceDao;
@@ -84,9 +84,8 @@ public class LimitsCheckingWorkspaceManager extends WorkspaceManager {
EnvironmentRamCalculator environmentRamCalculator,
ResourceManager resourceManager,
ResourcesLocks resourcesLocks,
- DevfileToWorkspaceConfigConverter devfileConverter) {
- super(
- workspaceDao, runtimes, eventService, accountManager, workspaceValidator, devfileConverter);
+ DevfileConverter devfileConverter) {
+ super(workspaceDao, runtimes, eventService, accountManager, workspaceValidator);
this.environmentRamCalculator = environmentRamCalculator;
this.maxRamPerEnvMB = "-1".equals(maxRamPerEnv) ? -1 : Size.parseSizeToMegabytes(maxRamPerEnv);
this.resourceManager = resourceManager;
diff --git a/multiuser/integration-tests/che-multiuser-cascade-removal/src/test/java/org/eclipse/che/multiuser/integration/jpa/cascaderemoval/JpaEntitiesCascadeRemovalTest.java b/multiuser/integration-tests/che-multiuser-cascade-removal/src/test/java/org/eclipse/che/multiuser/integration/jpa/cascaderemoval/JpaEntitiesCascadeRemovalTest.java
index 476e0acc28..33400caa60 100644
--- a/multiuser/integration-tests/che-multiuser-cascade-removal/src/test/java/org/eclipse/che/multiuser/integration/jpa/cascaderemoval/JpaEntitiesCascadeRemovalTest.java
+++ b/multiuser/integration-tests/che-multiuser-cascade-removal/src/test/java/org/eclipse/che/multiuser/integration/jpa/cascaderemoval/JpaEntitiesCascadeRemovalTest.java
@@ -75,11 +75,11 @@ import org.eclipse.che.api.user.server.spi.ProfileDao;
import org.eclipse.che.api.user.server.spi.UserDao;
import org.eclipse.che.api.workspace.server.DefaultWorkspaceLockService;
import org.eclipse.che.api.workspace.server.DefaultWorkspaceStatusCache;
-import org.eclipse.che.api.workspace.server.DevfileToWorkspaceConfigConverter;
import org.eclipse.che.api.workspace.server.WorkspaceLockService;
import org.eclipse.che.api.workspace.server.WorkspaceManager;
import org.eclipse.che.api.workspace.server.WorkspaceSharedPool;
import org.eclipse.che.api.workspace.server.WorkspaceStatusCache;
+import org.eclipse.che.api.workspace.server.devfile.DevfileModule;
import org.eclipse.che.api.workspace.server.model.impl.WorkspaceImpl;
import org.eclipse.che.api.workspace.server.model.impl.stack.StackImpl;
import org.eclipse.che.api.workspace.server.spi.RuntimeInfrastructure;
@@ -238,6 +238,7 @@ public class JpaEntitiesCascadeRemovalTest {
install(new OrganizationJpaModule());
install(new MultiuserWorkspaceJpaModule());
install(new MachineAuthModule());
+ install(new DevfileModule());
bind(FreeResourcesLimitDao.class).to(JpaFreeResourcesLimitDao.class);
bind(RemoveFreeResourcesLimitSubscriber.class).asEagerSingleton();
@@ -263,14 +264,6 @@ public class JpaEntitiesCascadeRemovalTest {
.toInstance(new String[0]);
bind(RemoveOrganizationOnLastUserRemovedEventSubscriber.class).asEagerSingleton();
- // is not used in a scope of integration tests
- // but instance is needed for setting WorkspaceManager up
- bind(DevfileToWorkspaceConfigConverter.class)
- .toInstance(
- devfile -> {
- throw new UnsupportedOperationException("Operation is not implemented");
- });
-
Multibinder.newSetBinder(binder(), ResourceLockKeyProvider.class);
Multibinder.newSetBinder(binder(), ResourceUsageTracker.class);
MapBinder.newMapBinder(binder(), String.class, AvailableResourcesProvider.class);
@@ -297,6 +290,17 @@ public class JpaEntitiesCascadeRemovalTest {
RamResourceType.ID, 1024, RamResourceType.UNIT)))));
bindConstant().annotatedWith(Names.named("che.workspace.probe_pool_size")).to(1);
+
+ // setup bindings for the devfile that would otherwise be read from the config
+ bindConstant()
+ .annotatedWith(Names.named("che.workspace.devfile.default_editor"))
+ .to("default/editor/0.0.1");
+ bindConstant()
+ .annotatedWith(Names.named("che.websocket.endpoint"))
+ .to("che.websocket.endpoint");
+ bind(String[].class)
+ .annotatedWith(Names.named("che.workspace.devfile.default_editor.plugins"))
+ .toInstance(new String[] {"default/plugin/0.0.1"});
}
});
diff --git a/multiuser/permission/che-multiuser-permission-devfile/pom.xml b/multiuser/permission/che-multiuser-permission-devfile/pom.xml
index 8f44a5fd58..1fa0d2b940 100644
--- a/multiuser/permission/che-multiuser-permission-devfile/pom.xml
+++ b/multiuser/permission/che-multiuser-permission-devfile/pom.xml
@@ -34,10 +34,6 @@
org.eclipse.che.core
che-core-api-core