use of org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE in project che-server by eclipse-che.
the class KubernetesComponentToWorkspaceApplierTest method shouldProvisionProjectVolumesIfSpecifiedIntoK8SList.
@Test
public void shouldProvisionProjectVolumesIfSpecifiedIntoK8SList() throws Exception {
// given
String yamlRecipeContent = getResource("devfile/petclinic.yaml");
List<HasMetadata> k8sList = toK8SList(yamlRecipeContent).getItems();
doReturn(k8sList).when(k8sRecipeParser).parse(anyString());
ComponentImpl component = new ComponentImpl();
component.setType(KUBERNETES_COMPONENT_TYPE);
component.setReference(REFERENCE_FILENAME);
component.setAlias(COMPONENT_NAME);
component.setMountSources(true);
// when
applier.apply(workspaceConfig, component, s -> yamlRecipeContent);
// then
verify(k8sEnvProvisioner).provision(any(), any(), objectsCaptor.capture(), any());
List<HasMetadata> list = objectsCaptor.getValue();
// Make sure PVC is created
assertTrue(list.stream().filter(hasMeta -> hasMeta instanceof PersistentVolumeClaim).map(o -> (PersistentVolumeClaim) o).anyMatch(claim -> claim.getMetadata().getName().equals(PROJECTS_VOLUME_NAME)));
for (HasMetadata o : list) {
if (o instanceof Pod) {
Pod p = (Pod) o;
// ignore pods that don't have containers
if (p.getSpec() == null) {
continue;
}
// Make sure volume is created
assertTrue(p.getSpec().getVolumes().stream().anyMatch(v -> v.getName().equals(PROJECTS_VOLUME_NAME) && v.getPersistentVolumeClaim().getClaimName().equals(PROJECTS_VOLUME_NAME)));
for (Container c : p.getSpec().getContainers()) {
assertEquals(c.getImagePullPolicy(), "Always");
assertTrue(c.getVolumeMounts().stream().anyMatch(vm -> vm.getName().equals(PROJECTS_VOLUME_NAME) && vm.getMountPath().equals(PROJECT_MOUNT_PATH)));
}
}
}
}
use of org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE in project che-server by eclipse-che.
the class DevfileIntegrityValidator method validateComponents.
private Set<String> validateComponents(Devfile devfile) throws DevfileFormatException {
Set<String> definedAliases = new HashSet<>();
Component editorComponent = null;
Map<String, Set<String>> idsPerComponentType = new HashMap<>();
for (Component component : devfile.getComponents()) {
if (component.getAlias() != null && !definedAliases.add(component.getAlias())) {
throw new DevfileFormatException(format("Duplicate component alias found:'%s'", component.getAlias()));
}
Optional<Map.Entry<String, Long>> duplicatedEndpoint = component.getEndpoints().stream().map(Endpoint::getName).collect(Collectors.groupingBy(Function.identity(), Collectors.counting())).entrySet().stream().filter(e -> e.getValue() > 1L).findFirst();
if (duplicatedEndpoint.isPresent()) {
throw new DevfileFormatException(format("Duplicated endpoint name '%s' found in '%s' component", duplicatedEndpoint.get().getKey(), getIdentifiableComponentName(component)));
}
Set<String> tempSet = new HashSet<>();
for (Env env : component.getEnv()) {
if (!tempSet.add(env.getName())) {
throw new DevfileFormatException(format("Duplicate environment variable '%s' found in component '%s'", env.getName(), getIdentifiableComponentName(component)));
}
}
if (!idsPerComponentType.computeIfAbsent(component.getType(), __ -> new HashSet<>()).add(getIdentifiableComponentName(component))) {
throw new DevfileFormatException(format("There are multiple components '%s' of type '%s' that cannot be uniquely" + " identified. Please add aliases that would distinguish the components.", getIdentifiableComponentName(component), component.getType()));
}
if (component.getAutomountWorkspaceSecrets() != null && component.getAlias() == null) {
throw new DevfileFormatException(format("The 'automountWorkspaceSecrets' property cannot be used in component which doesn't have alias. " + "Please add alias to component '%s' that would allow to distinguish its containers.", getIdentifiableComponentName(component)));
}
switch(component.getType()) {
case EDITOR_COMPONENT_TYPE:
if (editorComponent != null) {
throw new DevfileFormatException(format("Multiple editor components found: '%s', '%s'", getIdentifiableComponentName(editorComponent), getIdentifiableComponentName(component)));
}
editorComponent = component;
break;
case PLUGIN_COMPONENT_TYPE:
case KUBERNETES_COMPONENT_TYPE:
case OPENSHIFT_COMPONENT_TYPE:
case DOCKERIMAGE_COMPONENT_TYPE:
// do nothing
break;
default:
throw new DevfileFormatException(format("One of the components has unsupported component type: '%s'", component.getType()));
}
}
return definedAliases;
}
use of org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE in project devspaces-images by redhat-developer.
the class KubernetesComponentToWorkspaceApplierTest method shouldProvisionDevfileVolumesIfSpecifiedIntoMachineConfig.
@Test
public void shouldProvisionDevfileVolumesIfSpecifiedIntoMachineConfig() throws Exception {
// given
String yamlRecipeContent = getResource("devfile/petclinic.yaml");
List<HasMetadata> k8sList = toK8SList(yamlRecipeContent).getItems();
doReturn(k8sList).when(k8sRecipeParser).parse(anyString());
ComponentImpl component = new ComponentImpl();
component.setType(KUBERNETES_COMPONENT_TYPE);
component.setReference(REFERENCE_FILENAME);
component.setAlias(COMPONENT_NAME);
component.setVolumes(asList(new VolumeImpl("foo", "/foo1"), new VolumeImpl("bar", "/bar1")));
ArgumentCaptor<Map<String, MachineConfigImpl>> mapCaptor = ArgumentCaptor.forClass(Map.class);
// when
applier.apply(workspaceConfig, component, s -> yamlRecipeContent);
// then
verify(k8sEnvProvisioner).provision(any(), any(), any(), mapCaptor.capture());
Map<String, MachineConfigImpl> configMaps = mapCaptor.getValue();
for (MachineConfig config : configMaps.values()) {
assertEquals(config.getVolumes().size(), 2);
assertTrue(config.getVolumes().entrySet().stream().anyMatch(entry -> entry.getKey().equals("foo") && entry.getValue().getPath().equals("/foo1")));
assertTrue(config.getVolumes().entrySet().stream().anyMatch(entry -> entry.getKey().equals("bar") && entry.getValue().getPath().equals("/bar1")));
}
}
use of org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE in project devspaces-images by redhat-developer.
the class KubernetesComponentToWorkspaceApplierTest method shouldProvisionProjectVolumesIfSpecifiedIntoK8SList.
@Test
public void shouldProvisionProjectVolumesIfSpecifiedIntoK8SList() throws Exception {
// given
String yamlRecipeContent = getResource("devfile/petclinic.yaml");
List<HasMetadata> k8sList = toK8SList(yamlRecipeContent).getItems();
doReturn(k8sList).when(k8sRecipeParser).parse(anyString());
ComponentImpl component = new ComponentImpl();
component.setType(KUBERNETES_COMPONENT_TYPE);
component.setReference(REFERENCE_FILENAME);
component.setAlias(COMPONENT_NAME);
component.setMountSources(true);
// when
applier.apply(workspaceConfig, component, s -> yamlRecipeContent);
// then
verify(k8sEnvProvisioner).provision(any(), any(), objectsCaptor.capture(), any());
List<HasMetadata> list = objectsCaptor.getValue();
// Make sure PVC is created
assertTrue(list.stream().filter(hasMeta -> hasMeta instanceof PersistentVolumeClaim).map(o -> (PersistentVolumeClaim) o).anyMatch(claim -> claim.getMetadata().getName().equals(PROJECTS_VOLUME_NAME)));
for (HasMetadata o : list) {
if (o instanceof Pod) {
Pod p = (Pod) o;
// ignore pods that don't have containers
if (p.getSpec() == null) {
continue;
}
// Make sure volume is created
assertTrue(p.getSpec().getVolumes().stream().anyMatch(v -> v.getName().equals(PROJECTS_VOLUME_NAME) && v.getPersistentVolumeClaim().getClaimName().equals(PROJECTS_VOLUME_NAME)));
for (Container c : p.getSpec().getContainers()) {
assertEquals(c.getImagePullPolicy(), "Always");
assertTrue(c.getVolumeMounts().stream().anyMatch(vm -> vm.getName().equals(PROJECTS_VOLUME_NAME) && vm.getMountPath().equals(PROJECT_MOUNT_PATH)));
}
}
}
}
use of org.eclipse.che.api.workspace.server.devfile.Constants.KUBERNETES_COMPONENT_TYPE in project che-server by eclipse-che.
the class URLFactoryBuilderTest method checkWithCustomDevfileAndRecipe.
@Test
public void checkWithCustomDevfileAndRecipe() throws Exception {
DevfileImpl devfile = new DevfileImpl();
WorkspaceConfigImpl workspaceConfigImpl = new WorkspaceConfigImpl();
String myLocation = "http://foo-location/";
RecipeImpl expectedRecipe = new RecipeImpl(KUBERNETES_COMPONENT_TYPE, "application/x-yaml", "content", "");
EnvironmentImpl expectedEnv = new EnvironmentImpl(expectedRecipe, emptyMap());
workspaceConfigImpl.setEnvironments(singletonMap("name", expectedEnv));
workspaceConfigImpl.setDefaultEnv("name");
when(devfileParser.parseYamlRaw(anyString())).thenReturn(new ObjectNode(JsonNodeFactory.instance));
when(devfileParser.parseJsonNode(any(JsonNode.class), anyMap())).thenReturn(devfile);
when(devfileVersionDetector.devfileMajorVersion(any(JsonNode.class))).thenReturn(1);
FactoryMetaDto factory = urlFactoryBuilder.createFactoryFromDevfile(new DefaultFactoryUrl().withDevfileFileLocation(myLocation), s -> myLocation + ".list", emptyMap()).get();
assertNotNull(factory);
assertNull(factory.getSource());
assertTrue(factory instanceof FactoryDto);
}
Aggregations