use of org.alien4cloud.tosca.model.definitions.ScalarPropertyValue in project alien4cloud by alien4cloud.
the class IndexedModelTest method mergeInheritableIndexMaps.
@Test
public void mergeInheritableIndexMaps() {
NodeType son = new NodeType();
son.setElementId("son");
son.setArchiveVersion("1");
PropertyDefinition propDef = new PropertyDefinition();
AttributeDefinition attrDef = new AttributeDefinition();
propDef.setType("string");
propDef.setDefault(new ScalarPropertyValue("default_parent"));
attrDef.setType("string");
parent.setProperties(MapUtil.newHashMap(new String[] { "prop1" }, new PropertyDefinition[] { propDef }));
parent.setAttributes(Maps.<String, IValue>newHashMap());
parent.getAttributes().put("attr1", attrDef);
propDef = new PropertyDefinition();
propDef.setDefault(new ScalarPropertyValue("default_parent2"));
propDef.setType("string");
attrDef = new AttributeDefinition();
attrDef.setType("version");
parent.getProperties().put("prop2", propDef);
parent.setAttributes(Maps.<String, IValue>newHashMap());
parent.getAttributes().put("attr2", attrDef);
propDef = new PropertyDefinition();
propDef.setDefault(new ScalarPropertyValue("default_son"));
propDef.setType("string");
attrDef = new AttributeDefinition();
attrDef.setType("integer");
son.setProperties(MapUtil.newHashMap(new String[] { "prop1" }, new PropertyDefinition[] { propDef }));
// son.setAttributes(MapUtil.newHashMap(new String[] { "attr1" }, new AttributeDefinition[] { attrDef }));
son.setAttributes(Maps.<String, IValue>newHashMap());
son.getAttributes().put("attr1", attrDef);
propDef = new PropertyDefinition();
propDef.setDefault(new ScalarPropertyValue("default_son2"));
propDef.setType("integer");
attrDef = new AttributeDefinition();
attrDef.setType("boolean");
son.getProperties().put("prop3", propDef);
son.getAttributes().put("attr3", attrDef);
IndexedModelUtils.mergeInheritableIndex(parent, son);
// son should have 3 : 1 from himself, 1 from his parent, and one that he overrides from the parent
assertEquals(3, son.getProperties().size());
assertEquals(3, son.getAttributes().size());
// son should'nt have parent's one when both defined the same
PropertyDefinition propDefSon = son.getProperties().get("prop1");
assertNotNull(propDefSon);
assertEquals(new ScalarPropertyValue("default_son"), propDefSon.getDefault());
AttributeDefinition attrDefSon = (AttributeDefinition) son.getAttributes().get("attr1");
assertEquals("integer", attrDefSon.getType());
// son has all parent's
for (String key : parent.getProperties().keySet()) {
assertTrue(son.getProperties().containsKey(key));
}
for (String key : parent.getAttributes().keySet()) {
assertTrue(son.getAttributes().containsKey(key));
}
}
use of org.alien4cloud.tosca.model.definitions.ScalarPropertyValue in project alien4cloud by alien4cloud.
the class TopologySubstitutionService method addAttributeFromPropertyDefinition.
private void addAttributeFromPropertyDefinition(PropertyDefinition pd, String propertyName, NodeType substituteNodeType) {
// FIXME we have an issue here : if several nodes have the same attribute name, or if an attribute and a property have the same name,
Map<String, IValue> attributes = substituteNodeType.getAttributes();
if (pd != null && !attributes.containsKey(propertyName)) {
if (ToscaTypes.isSimple(pd.getType())) {
AttributeDefinition attributeDefinition = new AttributeDefinition();
attributeDefinition.setType(pd.getType());
attributeDefinition.setDescription(pd.getDescription());
// FIXME known issue we don't support complex attributes right now.
if (pd.getDefault() != null && pd.getDefault() instanceof ScalarPropertyValue) {
attributeDefinition.setDefault(((ScalarPropertyValue) pd.getDefault()).getValue());
}
attributes.put(propertyName, attributeDefinition);
}
// FIXME else: known issue we don't support complex attributes right now.
}
}
use of org.alien4cloud.tosca.model.definitions.ScalarPropertyValue in project alien4cloud by alien4cloud.
the class ToscaTypeConverter method toPropertyValue.
@SuppressWarnings("unchecked")
public PropertyValue toPropertyValue(Object resolvedPropertyValue, PropertyDefinition propertyDefinition) {
if (resolvedPropertyValue == null) {
return null;
}
if (ToscaTypes.isSimple(propertyDefinition.getType())) {
return new ScalarPropertyValue(resolvedPropertyValue.toString());
}
switch(propertyDefinition.getType()) {
case ToscaTypes.MAP:
if (resolvedPropertyValue instanceof Map) {
Map<String, Object> map = (Map<String, Object>) resolvedPropertyValue;
Map<String, Object> resultMap = Maps.newHashMap();
map.forEach((key, value) -> resultMap.put(key, toPropertyValue(value, propertyDefinition.getEntrySchema())));
return new ComplexPropertyValue(resultMap);
} else {
throw new IllegalStateException("Property value: expected type [" + Map.class.getSimpleName() + "] but got [" + resolvedPropertyValue.getClass().getName() + "]");
}
case ToscaTypes.LIST:
if (resolvedPropertyValue instanceof Collection) {
List list = (List) resolvedPropertyValue;
List resultList = new LinkedList();
for (Object item : list) {
resultList.add(toPropertyValue(item, propertyDefinition.getEntrySchema()));
}
return new ListPropertyValue(resultList);
} else {
throw new IllegalStateException("Property value: expected type [" + Collection.class.getSimpleName() + "] but got [" + resolvedPropertyValue.getClass().getName() + "]");
}
default:
DataType dataType = findDataType(propertyDefinition.getType());
if (dataType == null) {
throw new NotFoundException("Data type [" + propertyDefinition.getType() + "] cannot be found");
}
if (dataType.isDeriveFromSimpleType()) {
return new ScalarPropertyValue(resolvedPropertyValue.toString());
} else if (resolvedPropertyValue instanceof Map) {
Map<String, Object> map = (Map<String, Object>) resolvedPropertyValue;
/*
* Map<String, Object> resultMap = Maps.newHashMap();
*
* map.forEach((key, value) -> {
* PropertyDefinition entryDefinition = dataType.getProperties().get(key);
* if(entryDefinition == null){
* throw new IllegalStateException("DataType [" + propertyDefinition.getType() + "] does not contains any definition for entry [" + key + "]");
* }
* resultMap.put(key, toPropertyValue(value, entryDefinition));
* });
* return new ComplexPropertyValue(resultMap);
*/
return new ComplexPropertyValue(map);
} else {
throw new IllegalStateException("Property value: expected type [" + propertyDefinition.getType() + "] but got [" + resolvedPropertyValue.getClass().getName() + "]");
}
}
}
use of org.alien4cloud.tosca.model.definitions.ScalarPropertyValue in project alien4cloud by alien4cloud.
the class InputsMappingFileVariableResolverTest method check_uber_input_can_be_parsed.
@Ignore("Update when ToscaTypeConverter behavior is clearly defined")
@Test
public // Bad test
void check_uber_input_can_be_parsed() throws Exception {
inputsPropertyDefinitions.put("uber_input", buildPropDef("datatype.uber"));
/*
*
* uber_input:
* simple_var:
* int_field: ${int_variable}
* float_field: ${float_variable}
* string_field: ${string_variable}
* concat_field: ${int_variable}${float_variable}
* simple_static:
* int_field: 51
* float_field: 16.64
* string_field: "leffe"
* complex:
* complex_with_list: ${complex_with_list}
* int_list:
* - ${int_variable}
* - ${int_variable}
* float_list:
* - ${float_variable}
* - ${float_variable}
* mix_list:
* - ${int_variable}
* - ${float_variable}
* - ${string_variable}
* static_mix_list:
* - "jenlain"
* - 16.64
* - "kwak"
* complex_with_var_in_leaf: ${complex_with_var_in_leaf}
*
*/
inputsMappingFileVariableResolverConfigured.customConverter(new ToscaTypeConverter((concreteType, id) -> {
DataType dataType = null;
switch(id) {
case "datatype.uber":
dataType = new DataType();
dataType.setDeriveFromSimpleType(false);
dataType.setProperties(//
ImmutableMap.of(//
"simple_var", //
buildPropDef("datatype.uber.simple_var"), //
"complex", //
buildPropDef("datatype.uber.complex"), //
"simple_static", //
buildPropDef("datatype.uber.simple_static"), //
"complex_with_var_in_leaf", //
buildPropDef("datatype.uber.complex_with_var_in_leaf")));
break;
case "datatype.uber.simple_var":
dataType = new DataType();
dataType.setDeriveFromSimpleType(false);
dataType.setProperties(//
ImmutableMap.of(//
"int_field", //
buildPropDef(ToscaTypes.INTEGER), //
"float_field", //
buildPropDef(ToscaTypes.FLOAT), //
"string_field", //
buildPropDef(ToscaTypes.STRING), //
"concat_field", //
buildPropDef(ToscaTypes.STRING)));
break;
case "datatype.uber.simple_static":
dataType = new DataType();
dataType.setDeriveFromSimpleType(false);
dataType.setProperties(//
ImmutableMap.of(//
"int_field", //
buildPropDef(ToscaTypes.INTEGER), //
"float_field", //
buildPropDef(ToscaTypes.FLOAT), //
"string_field", //
buildPropDef(ToscaTypes.STRING)));
break;
case "datatype.uber.complex":
dataType = new DataType();
dataType.setDeriveFromSimpleType(false);
dataType.setProperties(//
ImmutableMap.<String, PropertyDefinition>builder().put("complex_with_list", buildPropDef("datatype.uber.complex.complex_with_list")).put("int_list", //
buildPropDef(ToscaTypes.LIST, ToscaTypes.FLOAT)).put("float_list", //
buildPropDef(ToscaTypes.LIST, ToscaTypes.STRING)).put("mix_list", //
buildPropDef(ToscaTypes.LIST, ToscaTypes.STRING)).put("static_mix_list", buildPropDef(ToscaTypes.LIST, ToscaTypes.STRING)).build());
break;
case "datatype.uber.complex.complex_with_list":
dataType = new DataType();
dataType.setDeriveFromSimpleType(false);
dataType.setProperties(// NEED TO BE
ImmutableMap.<String, PropertyDefinition>builder().put("subfield1", buildPropDef(ToscaTypes.STRING)).put("subfield2", buildPropDef(ToscaTypes.MAP, buildPropDef(ToscaTypes.LIST, ToscaTypes.STRING))).build());
break;
case "datatype.uber.complex_with_var_in_leaf":
dataType = new DataType();
dataType.setDeriveFromSimpleType(false);
dataType.setProperties(//
ImmutableMap.of("complex", //
buildPropDef(ToscaTypes.MAP, ToscaTypes.STRING)));
break;
}
return dataType;
}));
Map<String, PropertyValue> inputsMappingFileResolved = resolve("src/test/resources/alien/variables/inputs_mapping_uber.yml");
assertThat(inputsMappingFileResolved).containsOnlyKeys("uber_input");
assertThat(inputsMappingFileResolved.get("uber_input")).isInstanceOf(ComplexPropertyValue.class);
ComplexPropertyValue uberInput = (ComplexPropertyValue) inputsMappingFileResolved.get("uber_input");
assertThat(sub(ScalarPropertyValue.class, uberInput, "simple_var", "string_field").getValue()).isEqualTo("text");
assertThat(sub(ScalarPropertyValue.class, uberInput, "simple_var", "concat_field").getValue()).isEqualTo("13.14");
assertThat(sub(ScalarPropertyValue.class, uberInput, "simple_static", "int_field").getValue()).isEqualTo("51");
assertThat(sub(ScalarPropertyValue.class, uberInput, "simple_static", "float_field").getValue()).isEqualTo("16.64");
assertThat(sub(ScalarPropertyValue.class, uberInput, "simple_static", "string_field").getValue()).isEqualTo("leffe");
assertThat(sub(ListPropertyValue.class, uberInput, "complex", "int_list").getValue()).isEqualTo(Arrays.asList(new ScalarPropertyValue("1"), new ScalarPropertyValue("1")));
assertThat(sub(ListPropertyValue.class, uberInput, "complex", "float_list").getValue()).hasSize(2);
assertThat(sub(ListPropertyValue.class, uberInput, "complex", "mix_list").getValue()).hasSize(3);
assertThat(sub(ListPropertyValue.class, uberInput, "complex", "static_mix_list").getValue()).hasSize(3);
assertThat(sub(ListPropertyValue.class, uberInput, "complex", "complex_with_list", "subfield2", "sublist").getValue()).hasSize(3);
assertThat(sub(ScalarPropertyValue.class, uberInput, "complex_with_var_in_leaf", "complex", "subfield").getValue()).isEqualTo("text");
}
use of org.alien4cloud.tosca.model.definitions.ScalarPropertyValue in project alien4cloud by alien4cloud.
the class InputsMappingFileVariableResolverTest method should_comply_with_property_definition_even_if_does_not_match_reality.
@Test
public // Good Test
void should_comply_with_property_definition_even_if_does_not_match_reality() throws Exception {
// Given: a simplified inputs definition
inputsPropertyDefinitions.put("complex_input", buildPropDef(ToscaTypes.MAP, ToscaTypes.STRING));
// When
Map<String, PropertyValue> inputsMappingFileResolved = resolve("src/test/resources/alien/variables/inputs_mapping_without_variable.yml");
// Then: match the simplified inputs definition
assertThat(inputsMappingFileResolved.get("complex_input")).isInstanceOf(ComplexPropertyValue.class);
assertThat(inputsMappingFileResolved.get("complex_input")).isEqualTo(new ComplexPropertyValue(ImmutableMap.of("sub1", new ScalarPropertyValue(ImmutableMap.of("subfield11", "11", "subfield12", "12").toString()), "sub2", new ScalarPropertyValue(ImmutableMap.of("subfield21", "21").toString()), "field01", new ScalarPropertyValue("01"))));
}
Aggregations