use of org.eclipse.che.api.workspace.server.model.impl.RecipeImpl in project che-server by eclipse-che.
the class KubernetesEnvironmentProvisioner method provision.
/**
* Provisions default K8s/OS environment with specified objects (K8s/OS objects, machines) into
* {@link WorkspaceConfigImpl}.
*
* <p>If there is already a default environment with kubernetes/openshift recipe then content will
* 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 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
* @throws DevfileRecipeFormatException if exception occurred during kubernetes object
* serialization
* @throws DevfileException if any other exception occurred
*/
public void provision(WorkspaceConfigImpl workspaceConfig, String environmentType, List<HasMetadata> componentObjects, Map<String, MachineConfigImpl> machines) throws DevfileException, DevfileRecipeFormatException {
String defaultEnv = workspaceConfig.getDefaultEnv();
EnvironmentImpl environment = workspaceConfig.getEnvironments().get(defaultEnv);
if (environment == null) {
checkItemsHasUniqueKindToName(componentObjects);
RecipeImpl recipe = new RecipeImpl(environmentType, YAML_CONTENT_TYPE, asYaml(componentObjects), null);
String envName = "default";
EnvironmentImpl env = new EnvironmentImpl(recipe, emptyMap());
env.getMachines().putAll(machines);
workspaceConfig.getEnvironments().put(envName, env);
workspaceConfig.setDefaultEnv(envName);
} else {
RecipeImpl envRecipe = environment.getRecipe();
for (Entry<String, MachineConfigImpl> machineEntry : machines.entrySet()) {
if (environment.getMachines().put(machineEntry.getKey(), machineEntry.getValue()) != null) {
throw new DevfileException(format("Environment already contains machine '%s'", machineEntry.getKey()));
}
}
environment.getMachines().putAll(machines);
// check if it is needed to update recipe type since
// kubernetes component is compatible with openshift but not vice versa
Set<String> allowedEnvTypeBases = allowedEnvironmentTypeUpgrades.get(environmentType);
if (allowedEnvTypeBases != null) {
envRecipe.setType(environmentType);
}
// workspace already has k8s/OS recipe
// it is needed to merge existing recipe objects with component's ones
List<HasMetadata> envObjects = unmarshalObjects(envRecipe);
mergeProjectsPVC(envObjects, componentObjects);
envObjects.addAll(componentObjects);
checkItemsHasUniqueKindToName(envObjects);
envRecipe.setContent(asYaml(envObjects));
}
}
use of org.eclipse.che.api.workspace.server.model.impl.RecipeImpl in project che-server by eclipse-che.
the class TestObjects method createEnvironment.
public static EnvironmentImpl createEnvironment(String... machineRams) throws Exception {
final Map<String, MachineConfig> machines = new HashMap<>();
for (String machineRam : machineRams) {
final MachineConfigImpl machineConfig = new MachineConfigImpl();
machineConfig.setAttributes(ImmutableMap.of(MachineConfig.MEMORY_LIMIT_ATTRIBUTE, machineRam));
machines.put("dev-machine", machineConfig);
}
final RecipeImpl recipe = new RecipeImpl("compose", "application/x-yaml", "", null);
return new EnvironmentImpl(recipe, machines);
}
use of org.eclipse.che.api.workspace.server.model.impl.RecipeImpl in project devspaces-images by redhat-developer.
the class KubernetesEnvironmentProvisionerTest method shouldUpgradeKubernetesEnvironmentToOpenShiftTypeOnOpenShiftComponentProvisioning.
@Test
public void shouldUpgradeKubernetesEnvironmentToOpenShiftTypeOnOpenShiftComponentProvisioning() throws Exception {
// given
workspaceConfig.setDefaultEnv("default");
RecipeImpl existingRecipe = new RecipeImpl(KubernetesEnvironment.TYPE, "yaml", "existing-content", null);
workspaceConfig.getEnvironments().put("default", new EnvironmentImpl(existingRecipe, emptyMap()));
List<HasMetadata> componentsObject = new ArrayList<>();
Deployment componentDeployment = new DeploymentBuilder().withNewMetadata().withName("web-app").endMetadata().withNewSpec().endSpec().build();
componentsObject.add(new DeploymentBuilder(componentDeployment).build());
doReturn(new ArrayList<>()).when(k8sRecipeParser).parse(anyString());
// when
k8sEnvProvisioner.provision(workspaceConfig, "openshift", componentsObject, emptyMap());
// then
EnvironmentImpl resultEnv = workspaceConfig.getEnvironments().get(workspaceConfig.getDefaultEnv());
RecipeImpl resultRecipe = resultEnv.getRecipe();
assertEquals(resultRecipe.getType(), "openshift");
}
use of org.eclipse.che.api.workspace.server.model.impl.RecipeImpl in project devspaces-images by redhat-developer.
the class KubernetesEnvironmentProvisionerTest method shouldMergeProjectPVCIntoOne.
@Test
public void shouldMergeProjectPVCIntoOne() throws Exception {
// given
PersistentVolumeClaim volumeClaim = newPVC(PROJECTS_VOLUME_NAME, "ReadWriteMany", "1Gb");
workspaceConfig.setDefaultEnv("default");
RecipeImpl existingRecipe = new RecipeImpl("kubernetes", YAML_CONTENT_TYPE, Serialization.asYaml(volumeClaim), null);
doReturn(singletonList(volumeClaim)).when(k8sRecipeParser).parse(anyString());
workspaceConfig.getEnvironments().put("default", new EnvironmentImpl(existingRecipe, emptyMap()));
// try add same claim one more time (like another component adds it)
List<HasMetadata> componentsObject = new ArrayList<>();
componentsObject.add(volumeClaim);
// when
k8sEnvProvisioner.provision(workspaceConfig, KubernetesEnvironment.TYPE, componentsObject, emptyMap());
// we still have only one PVC
EnvironmentImpl resultEnv = workspaceConfig.getEnvironments().get(workspaceConfig.getDefaultEnv());
assertEquals(toK8SList(resultEnv.getRecipe().getContent()).getItems().size(), 1);
}
use of org.eclipse.che.api.workspace.server.model.impl.RecipeImpl in project devspaces-images by redhat-developer.
the class KubernetesEnvironmentProvisionerTest method shouldThrowAnExceptionIfWorkspaceAlreadyContainNonK8sNorOSRecipe.
@Test(expectedExceptions = DevfileException.class, expectedExceptionsMessageRegExp = "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
workspaceConfig.setDefaultEnv("default");
RecipeImpl existingRecipe = new RecipeImpl("any", "yaml", "existing-content", null);
workspaceConfig.getEnvironments().put("default", new EnvironmentImpl(existingRecipe, emptyMap()));
List<HasMetadata> componentsObject = new ArrayList<>();
Deployment componentDeployment = new DeploymentBuilder().withNewMetadata().withName("db").endMetadata().withNewSpec().endSpec().build();
componentsObject.add(new DeploymentBuilder(componentDeployment).build());
// when
k8sEnvProvisioner.provision(workspaceConfig, KubernetesEnvironment.TYPE, componentsObject, emptyMap());
}
Aggregations