Skip to content

Commit cd8e173

Browse files
start thinking about functions
1 parent f2c08ed commit cd8e173

10 files changed

Lines changed: 78 additions & 137 deletions

File tree

plugins/iac/nimble/src/main/java/org/apache/cloudstack/service/NimbleManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ protected Map<String, ToscaNodeType> loadToscaProfile() {
8080
List<IacResourceTypeVO> profileResourceTypes = iacResourceTypeDao.listAll();
8181

8282
return profileResourceTypes.stream()
83-
.map(resourceType -> toscaParser.parseNodeType(resourceType.getName(), resourceType.getContent()))
83+
.map(resourceType -> toscaParser.parseNodeTypeDefinitionFile(resourceType.getName(), resourceType.getContent()))
8484
.collect(Collectors.toMap(ToscaNodeType::getName, nodeType -> nodeType));
8585
}
8686

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.apache.cloudstack.tosca.functions;
2+
3+
import java.util.List;
4+
5+
public class ToscaBooleanFunctions {
6+
public static class ValidValues implements ToscaFunction.ToscaBooleanFunction {
7+
private final List<Object> validValues;
8+
9+
public ValidValues(List<Object> validValues) {
10+
this.validValues = validValues;
11+
}
12+
13+
@Override
14+
public boolean evaluate(Object value) {
15+
return validValues.contains(value);
16+
}
17+
}
18+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.apache.cloudstack.tosca.functions;
2+
3+
public interface ToscaFunction {
4+
interface ToscaBooleanFunction extends ToscaFunction {
5+
boolean evaluate(Object arg);
6+
}
7+
8+
interface ToscaValueProducerFunction extends ToscaFunction {
9+
Object produce(Object... args);
10+
}
11+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.apache.cloudstack.tosca.functions;
2+
3+
public class ToscaValueProducerFunctions {
4+
public static class GetInput implements ToscaFunction.ToscaValueProducerFunction {
5+
private final String inputName;
6+
7+
public GetInput(String inputName) {
8+
this.inputName = inputName;
9+
}
10+
11+
@Override
12+
public Object produce(Object... args) {
13+
return null;
14+
}
15+
}
16+
}

plugins/iac/nimble/src/main/java/org/apache/cloudstack/tosca/model/ToscaDataTypeDefinition.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package org.apache.cloudstack.tosca.model;
22

3-
import java.util.List;
3+
import java.util.Map;
44

55
public class ToscaDataTypeDefinition {
66
private final String name;
7-
private final List<ToscaPropertyDefinition> properties;
7+
private final Map<String, ToscaPropertyDefinition> properties;
88

9-
public ToscaDataTypeDefinition(String name, List<ToscaPropertyDefinition> properties) {
9+
public ToscaDataTypeDefinition(String name, Map<String, ToscaPropertyDefinition> properties) {
1010
this.name = name;
1111
this.properties = properties;
1212
}

plugins/iac/nimble/src/main/java/org/apache/cloudstack/tosca/parser/ToscaParser.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@
1717
package org.apache.cloudstack.tosca.parser;
1818

1919
import org.apache.cloudstack.tosca.model.ToscaAttributeDefinition;
20+
import org.apache.cloudstack.tosca.model.ToscaDataTypeDefinition;
2021
import org.apache.cloudstack.tosca.model.ToscaFieldDefinition;
2122
import org.apache.cloudstack.tosca.model.ToscaNodeType;
2223
import org.apache.cloudstack.tosca.model.ToscaPrimitiveType;
2324
import org.apache.cloudstack.tosca.model.ToscaPropertyDefinition;
24-
import org.apache.commons.lang3.BooleanUtils;
2525
import org.apache.commons.lang3.EnumUtils;
2626
import org.apache.logging.log4j.LogManager;
2727
import org.apache.logging.log4j.Logger;
2828

29+
import java.util.List;
2930
import java.util.Map;
30-
import java.util.Optional;
3131
import java.util.stream.Collectors;
3232

3333
public class ToscaParser {
@@ -38,27 +38,37 @@ enum FieldDefinitionType {
3838
}
3939

4040
private static final String NODE_TYPES_KEY = "node_types";
41+
private static final String DATA_TYPES_KEY = "data_types";
4142
private static final String NODE_TYPES_PROPERTIES_KEY = "properties";
4243
private static final String NODE_TYPES_ATTRIBUTES_KEY = "attributes";
4344

4445
@SuppressWarnings("unchecked")
45-
public ToscaNodeType parseNodeType(String nodeTypeName, String nodeTypeContent) {
46+
public ToscaNodeType parseNodeTypeDefinitionFile(String nodeTypeName, String nodeTypeContent) {
4647
Object rawYaml = ToscaYamlHelper.loadYaml(nodeTypeContent);
4748
Map<String, Object> yamlRoot = ToscaYamlHelper.asMap(rawYaml);
4849
logger.debug("Trying to extract only one node type from the [{}] YAML definition file, since it is expected for each node type to be declared separately.", nodeTypeName);
49-
Optional<Map.Entry<String, Object>> nodeTypeRaw = ToscaYamlHelper.asMap(yamlRoot.get(NODE_TYPES_KEY)).entrySet().stream().findFirst();
50-
if (nodeTypeRaw.isEmpty()) {
51-
logger.error("No node types are declared in the [{}] YAML definition file.", nodeTypeName);
52-
return null;
53-
}
54-
Map<String, Object> nodeTypeBody = ToscaYamlHelper.asMap(nodeTypeRaw.get().getValue());
50+
Object dataTypes = parseDataTypes(yamlRoot);
51+
Map.Entry<String, Object> nodeTypeRaw = ToscaYamlHelper.asMap(yamlRoot.get(NODE_TYPES_KEY)).entrySet().iterator().next();
52+
Map<String, Object> nodeTypeBody = ToscaYamlHelper.asMap(nodeTypeRaw.getValue());
5553
Map<String, ToscaPropertyDefinition> propertyDefinitions = (Map<String, ToscaPropertyDefinition>) parseFieldDefinition(nodeTypeBody.get(NODE_TYPES_PROPERTIES_KEY), FieldDefinitionType.PROPERTY);
5654
Map<String, ToscaAttributeDefinition> attributeDefinitions = (Map<String, ToscaAttributeDefinition>) parseFieldDefinition(nodeTypeBody.get(NODE_TYPES_ATTRIBUTES_KEY), FieldDefinitionType.ATTRIBUTE);
5755
ToscaNodeType nodeType = new ToscaNodeType(nodeTypeName, propertyDefinitions, attributeDefinitions);
5856
logger.info("Successfully parsed the following node type: [{}].", nodeType::toString);
5957
return nodeType;
6058
}
6159

60+
private List<ToscaDataTypeDefinition> parseDataTypes(Map<String, Object> yamlRoot) {
61+
Map<String, Object> dataTypesRaw = ToscaYamlHelper.asMap(yamlRoot.get(DATA_TYPES_KEY));
62+
dataTypesRaw.entrySet().stream().map(dataTypeEntry -> {
63+
String dataTypeName = dataTypeEntry.getKey();
64+
Map<String, Object> dataTypeBody = ToscaYamlHelper.asMap(dataTypeEntry.getValue());
65+
Map<String, ToscaPropertyDefinition> propertyDefinitions = (Map<String, ToscaPropertyDefinition>) parseFieldDefinition(dataTypeBody.get(NODE_TYPES_PROPERTIES_KEY), FieldDefinitionType.PROPERTY);
66+
return new ToscaDataTypeDefinition(dataTypeName, propertyDefinitions);
67+
});
68+
69+
return null;
70+
}
71+
6272
private Map<String, ? extends ToscaFieldDefinition> parseFieldDefinition(Object rawFields, FieldDefinitionType fieldDefinitionType) {
6373
Map<String, Object> fields = ToscaYamlHelper.asMap(rawFields);
6474
logger.debug("Parsing the following {}: {}.",
@@ -83,4 +93,9 @@ public ToscaNodeType parseNodeType(String nodeTypeName, String nodeTypeContent)
8393
return propertyDefinition;
8494
}).collect(Collectors.toMap(ToscaFieldDefinition::getName, (field) -> field));
8595
}
96+
97+
private void parseFieldType(Map<String, Object> fieldBody) {
98+
Object rawType = fieldBody.get("type");
99+
100+
}
86101
}

plugins/iac/nimble/src/main/resources/tosca/profile/compute/kubernetes-cluster.yaml

Lines changed: 0 additions & 86 deletions
This file was deleted.

plugins/iac/nimble/src/main/resources/tosca/profile/storage/volume.yaml

Lines changed: 0 additions & 33 deletions
This file was deleted.

plugins/iac/nimble/src/test/java/org/apache/cloudstack/service/NimbleManagerImplTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ public void loadToscaProfileTestEachIacResourceTypeShouldBeParsed() {
9696
Mockito.when(toscaNodeTypesMock.get(0).getName()).thenReturn("First TOSCA node type");
9797
Mockito.when(toscaNodeTypesMock.get(1).getName()).thenReturn("Second TOSCA node type");
9898

99-
Mockito.when(toscaParserMock.parseNodeType(Mockito.eq(firstIacResourceTypeName), Mockito.any())).thenReturn(toscaNodeTypesMock.get(0));
100-
Mockito.when(toscaParserMock.parseNodeType(Mockito.eq(secondIacResourceTypeName), Mockito.any())).thenReturn(toscaNodeTypesMock.get(1));
99+
Mockito.when(toscaParserMock.parseNodeTypeDefinitionFile(Mockito.eq(firstIacResourceTypeName), Mockito.any())).thenReturn(toscaNodeTypesMock.get(0));
100+
Mockito.when(toscaParserMock.parseNodeTypeDefinitionFile(Mockito.eq(secondIacResourceTypeName), Mockito.any())).thenReturn(toscaNodeTypesMock.get(1));
101101

102102
Map<String, ToscaNodeType> profile = nimbleServiceSpy.loadToscaProfile();
103103
Assert.assertEquals(iacResourceTypesMock.size(), profile.size());

plugins/iac/nimble/src/test/java/org/apache/cloudstack/tosca/parser/ToscaParserTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ private List<ToscaAttributeDefinition> getExpectedToscaAttributeDefinitionsForTe
5050
}
5151

5252
@Test
53-
public void parseNodeTypeTestEnsureToscaNodeTypeIsSuccessfullyParsedAlongWithItsPropertiesAndAttributes() {
53+
public void parseNodeTypeTestEnsureToscaNodeTypeDefinitionFileIsSuccessfullyParsedAlongWithItsPropertiesAndAttributes() {
5454
String nodeTypeName = "toscaNodeType";
5555
String nodeTypeContentWithMinifiedYaml = "{tosca_definitions_version: tosca_2_0, description: \"Mock node type definition.\\n\", node_types: {MockType: {description: \"Apache CloudStack MockType node type.\\n\", derived_from: Root, attributes: {id: {type: string, description: ID.}, name: {type: string, description: Name.}}, properties: {zone-id: {type: string, description: Zone ID., required: true}, amount: {type: integer, description: Amount.}, disk-offering-id: {type: string, description: Disk offering ID., required: false, validation: {$valid_values: [$value, [1, 2]]}}}}}}\n";
5656

57-
ToscaNodeType nodeType = toscaParserSpy.parseNodeType(nodeTypeName, nodeTypeContentWithMinifiedYaml);
57+
ToscaNodeType nodeType = toscaParserSpy.parseNodeTypeDefinitionFile(nodeTypeName, nodeTypeContentWithMinifiedYaml);
5858
Map<String, ToscaPropertyDefinition> properties = nodeType.getProperties();
5959
Map<String, ToscaAttributeDefinition> attributes = nodeType.getAttributes();
6060
Assert.assertEquals(nodeTypeName, nodeType.getName());
@@ -83,6 +83,6 @@ public void parseNodeTypeTestEnsureToscaNodeTypeIsSuccessfullyParsedAlongWithIts
8383
@Test
8484
public void parseNodeTypTestReturnNullWhenThereAreNoNodeTypesDeclaredInTheYamlContent() {
8585
String nodeTypeContentWithMinifiedYaml = "{tosca_definitions_version: tosca_2_0, description: \"Apache CloudStack TOSCA profile Volume node type definition.\\n\"}\n";
86-
Assert.assertNull(toscaParserSpy.parseNodeType("toscaNodeType", nodeTypeContentWithMinifiedYaml));
86+
Assert.assertNull(toscaParserSpy.parseNodeTypeDefinitionFile("toscaNodeType", nodeTypeContentWithMinifiedYaml));
8787
}
8888
}

0 commit comments

Comments
 (0)