use of org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl in project che-server by eclipse-che.
the class InternalEnvironmentFactoryTest method testApplyContainerSourceAttributeToTheMachineSpecifiedInEnv.
@Test
public void testApplyContainerSourceAttributeToTheMachineSpecifiedInEnv() throws Exception {
// given
final Environment sourceEnv = mock(Environment.class);
MachineConfigImpl machineConfig = mock(MachineConfigImpl.class);
final Map<String, MachineConfigImpl> machineConfigMap = ImmutableMap.of("envMachine", machineConfig);
doReturn(machineConfigMap).when(sourceEnv).getMachines();
when(environmentFactory.doCreate(any(), any(), any())).thenAnswer(invocation -> {
Map<String, InternalMachineConfig> envMachines = invocation.getArgument(1);
final InternalEnvironment internalEnv = mock(InternalEnvironment.class);
when(internalEnv.getMachines()).thenReturn(envMachines);
return internalEnv;
});
// when
InternalEnvironment resultEnv = environmentFactory.create(sourceEnv);
// then
assertEquals(resultEnv.getMachines().get("envMachine").getAttributes().get(CONTAINER_SOURCE_ATTRIBUTE), RECIPE_CONTAINER_SOURCE);
}
use of org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl in project che-server by eclipse-che.
the class DockerimageComponentToWorkspaceApplier method apply.
/**
* Applies changes on workspace config according to the specified dockerimage component.
*
* <p>Dockerimage component is provisioned as Deployment in Kubernetes recipe.<br>
* Generated deployment contains container with environment variables, memory limit, docker image,
* arguments and commands specified in component.<br>
* Also, environment is provisioned with machine config with volumes and servers specified, then
* Kubernetes infra will created needed PVC, Services, Ingresses, Routes according to specified
* configuration.
*
* @param workspaceConfig workspace config on which changes should be applied
* @param dockerimageComponent dockerimage component that should be applied
* @param contentProvider optional content provider that may be used for external component
* resource fetching
* @throws DevfileException if specified workspace config already has default environment where
* dockerimage component should be stored
* @throws IllegalArgumentException if specified workspace config or plugin component is null
* @throws IllegalArgumentException if specified component has type different from dockerimage
*/
@Override
public void apply(WorkspaceConfigImpl workspaceConfig, ComponentImpl dockerimageComponent, FileContentProvider contentProvider) throws DevfileException {
checkArgument(workspaceConfig != null, "Workspace config must not be null");
checkArgument(dockerimageComponent != null, "Component must not be null");
checkArgument(DOCKERIMAGE_COMPONENT_TYPE.equals(dockerimageComponent.getType()), format("Plugin must have `%s` type", DOCKERIMAGE_COMPONENT_TYPE));
String componentAlias = dockerimageComponent.getAlias();
String machineName = componentAlias == null ? toMachineName(dockerimageComponent.getImage()) : componentAlias;
MachineConfigImpl machineConfig = createMachineConfig(dockerimageComponent, componentAlias);
List<HasMetadata> componentObjects = createComponentObjects(dockerimageComponent, machineName);
k8sEnvProvisioner.provision(workspaceConfig, KubernetesEnvironment.TYPE, componentObjects, ImmutableMap.of(machineName, machineConfig));
workspaceConfig.getCommands().stream().filter(c -> componentAlias != null && componentAlias.equals(c.getAttributes().get(Constants.COMPONENT_ALIAS_COMMAND_ATTRIBUTE))).forEach(c -> c.getAttributes().put(MACHINE_NAME_ATTRIBUTE, machineName));
}
use of org.eclipse.che.api.workspace.server.model.impl.MachineConfigImpl 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.MachineConfigImpl 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.MachineConfigImpl in project devspaces-images by redhat-developer.
the class RamResourceUsageTrackerTest method createWorkspace.
/**
* Creates users workspace object based on the status and machines RAM.
*/
private static WorkspaceImpl createWorkspace(WorkspaceStatus status, Integer... machineRams) {
final Map<String, MachineImpl> machines = new HashMap<>(machineRams.length - 1);
final Map<String, MachineConfigImpl> machineConfigs = new HashMap<>(machineRams.length - 1);
byte i = 1;
for (Integer machineRam : machineRams) {
final String machineName = "machine_" + i++;
machines.put(machineName, createMachine(machineRam));
machineConfigs.put(machineName, createMachineConfig(machineRam));
}
return WorkspaceImpl.builder().setConfig(WorkspaceConfigImpl.builder().setEnvironments(ImmutableBiMap.of(ACTIVE_ENV_NAME, new EnvironmentImpl(null, machineConfigs))).build()).setRuntime(new RuntimeImpl(ACTIVE_ENV_NAME, machines, null)).setStatus(status).build();
}
Aggregations