Skip to content

Commit 9790c66

Browse files
general fixes
1 parent bbd3785 commit 9790c66

8 files changed

Lines changed: 38 additions & 41 deletions

File tree

engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade42100to42200.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ protected void populateNimbleIacResourceTypes(Connection conn) {
151151
}
152152

153153
private void insertIacResourceType(Connection conn, String fileName, String resourceName, String resourceCategory) {
154-
String insertResourceTypeQuery = "INSERT INTO iac_resource_types (uuid, name, category, element_content) VALUES (UUID(), ?, ?, ?)";
154+
String insertResourceTypeQuery = "INSERT INTO iac_resource_types (uuid, name, category, content) VALUES (UUID(), ?, ?, ?)";
155155
String filePath = NIMBLE_RESOURCE_TYPES_DIRECTORY.resolve(fileName).toString();
156156
logger.debug("Inserting resource type [name: {}] in the database.", filePath);
157157
try (InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);

plugins/iac/nimble/src/main/java/org/apache/cloudstack/api/command/DeployIacTemplateCmd.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,18 @@
1616
// under the License.
1717
package org.apache.cloudstack.api.command;
1818

19+
import org.apache.cloudstack.api.APICommand;
1920
import org.apache.cloudstack.api.ApiConstants;
2021
import org.apache.cloudstack.api.BaseAsyncCmd;
2122
import org.apache.cloudstack.api.Parameter;
23+
import org.apache.cloudstack.api.response.SuccessResponse;
24+
import org.apache.cloudstack.persistence.iactemplatesprofile.IacResourceType;
2225
import org.apache.cloudstack.service.NimbleService;
2326

2427
import javax.inject.Inject;
2528

29+
@APICommand(name = "deployIacTemplate", description = "", responseObject = SuccessResponse.class, entityType = {IacResourceType.class},
30+
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
2631
public class DeployIacTemplateCmd extends BaseAsyncCmd {
2732
@Inject
2833
private NimbleService nimbleService;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.cloud.utils.Pair;
2020
import com.cloud.utils.component.ManagerBase;
21+
import org.apache.cloudstack.api.command.DeployIacTemplateCmd;
2122
import org.apache.cloudstack.api.command.ListIacResourceTypesCmd;
2223
import org.apache.cloudstack.api.response.IacResourceTypeResponse;
2324
import org.apache.cloudstack.api.response.ListResponse;
@@ -85,7 +86,7 @@ public List<Class<?>> getCommands() {
8586
if (!NimbleServiceEnabled.value()) {
8687
return commands;
8788
}
88-
return List.of(ListIacResourceTypesCmd.class);
89+
return List.of(ListIacResourceTypesCmd.class, DeployIacTemplateCmd.class);
8990
}
9091

9192
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public interface NimbleService extends PluggableService, Configurable {
3232
"Number of threads in the global pool used to execute NIMBLE node template provisioning tasks. " +
3333
"This pool is initialized during NIMBLE startup using the configured value. Administrators should " +
3434
"tune this setting based on service utilization to optimize provisioning performance.",
35-
true, NimbleServiceEnabled.key());
35+
false, NimbleServiceEnabled.key());
3636

3737
ListResponse<IacResourceTypeResponse> listIacResourceTypes(ListIacResourceTypesCmd cmd);
3838
void deployIacTemplate(String iacTemplateContent);

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

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626
import org.apache.logging.log4j.Logger;
2727

2828
import javax.inject.Inject;
29-
import java.util.ArrayList;
3029
import java.util.Collections;
3130
import java.util.HashMap;
3231
import java.util.HashSet;
32+
import java.util.LinkedHashMap;
3333
import java.util.List;
3434
import java.util.Map;
3535
import java.util.Set;
@@ -52,53 +52,41 @@ public class ToscaOrchestrator {
5252
public void deployIacTemplate(String iacTemplateContent) {
5353
logger.debug("Parsing service template");
5454
ToscaServiceTemplate serviceTemplate = toscaParser.parseServiceTemplate(iacTemplateContent, toscaProfile, null);
55-
Map<ToscaNodeTemplate, CompletableFuture<String>> provisioningTasksFutures = createProvisioningTasksFutures(serviceTemplate);
55+
Map<String, CompletableFuture<String>> provisioningTasksFutures = createProvisioningTasksFutures(serviceTemplate);
5656
CompletableFuture<Void> serviceTemplateFeature = CompletableFuture.allOf(provisioningTasksFutures.values().toArray(new CompletableFuture[0]));
5757
serviceTemplateFeature.join();
5858
}
5959

60-
private Map<ToscaNodeTemplate, CompletableFuture<String>> createProvisioningTasksFutures(ToscaServiceTemplate serviceTemplate) {
60+
private Map<String, CompletableFuture<String>> createProvisioningTasksFutures(ToscaServiceTemplate serviceTemplate) {
6161
logger.debug("Creating provisioning tasks futures");
62-
Map<ToscaNodeTemplate, CompletableFuture<String>> futures = new HashMap<>();
63-
Map<String, Set<ToscaNodeTemplate>> dependencyGraph = serviceTemplate.getDependencyGraph();
64-
65-
List<String> nodesWithoutDependencies = dependencyGraph.keySet().stream().filter(node -> dependencyGraph.get(node).isEmpty()).collect(Collectors.toList());
66-
logger.debug("Nodes without dependencies: " + nodesWithoutDependencies);
67-
nodesWithoutDependencies.forEach(node -> {
62+
Map<String, CompletableFuture<String>> futures = new HashMap<>();
63+
getServiceTemplateTopologicalSort(serviceTemplate).forEach((node, dependencies) -> {
6864
ToscaNodeTemplate nodeTemplate = serviceTemplate.getNodeTemplates().get(node);
69-
CompletableFuture<String> taskFuture = buildNodeProvisioningTask(nodeTemplate);
70-
futures.put(nodeTemplate, taskFuture);
71-
});
72-
logger.debug("Built all the features for the nodes without dependencies.");
73-
74-
logger.debug("Service template size: " + serviceTemplate.getNodeTemplates().size());
75-
while (futures.size() < serviceTemplate.getNodeTemplates().size()) {
76-
logger.debug("Futures size: " + futures.size());
77-
List<ToscaNodeTemplate> nodesWhoseDependenciesAlreadyHaveFutures = dependencyGraph.keySet().stream()
78-
.filter(node -> !dependencyGraph.get(node).isEmpty() && dependencyGraph.get(node).stream().allMatch(futures::containsKey))
79-
.map(node -> serviceTemplate.getNodeTemplates().get(node))
80-
.collect(Collectors.toList());
81-
82-
for (ToscaNodeTemplate node : nodesWhoseDependenciesAlreadyHaveFutures) {
83-
CompletableFuture<?>[] dependencies = dependencyGraph.get(node.getName()).stream().map(futures::get).toArray(CompletableFuture[]::new);
84-
CompletableFuture<String> taskFuture = CompletableFuture.allOf(dependencies).thenCompose(v -> {
85-
logger.debug("All dependencies of the node [" + node.getName() + "] are ready.");
65+
CompletableFuture<String> taskFuture;
66+
if (dependencies.isEmpty()) {
67+
logger.debug("Node [{}] has no dependencies. Building its provisioning task.", node);
68+
taskFuture = buildNodeProvisioningTask(nodeTemplate);
69+
} else {
70+
CompletableFuture<?>[] dependenciesFutures = dependencies.stream()
71+
.map((dep) -> futures.get(dep.getName())).toArray(CompletableFuture[]::new);
72+
taskFuture = CompletableFuture.allOf(dependenciesFutures).thenCompose(v -> {
73+
logger.debug("All dependencies of the node [{}] are ready.", node);
8674
logger.debug("Here you'll be able to resolve the unresolved properties by get property and get attribute");
87-
return buildNodeProvisioningTask(node);
75+
return buildNodeProvisioningTask(nodeTemplate);
8876
});
89-
90-
futures.put(node, taskFuture);
9177
}
92-
}
78+
79+
futures.put(node, taskFuture);
80+
});
9381

9482
return futures;
9583
}
9684

9785
// O(|V|+|E|)
98-
private List<String> getServiceTemplateTopologicalSort(ToscaServiceTemplate serviceTemplate) {
86+
private LinkedHashMap<String, Set<ToscaNodeTemplate>> getServiceTemplateTopologicalSort(ToscaServiceTemplate serviceTemplate) {
87+
LinkedHashMap<String, Set<ToscaNodeTemplate>> topologicalSort = new LinkedHashMap<>();
9988
Set<String> visitedNodes = new HashSet<>();
10089
Set<String> branchAncestors = new HashSet<>();
101-
List<String> topologicalSort = new ArrayList<>();
10290
for (ToscaNodeTemplate node : serviceTemplate.getNodeTemplates().values()) {
10391
if (!visitedNodes.contains(node.getName())) {
10492
depthFirstSearch(topologicalSort, node.getName(), serviceTemplate.getDependencyGraph(), branchAncestors, visitedNodes);
@@ -107,7 +95,7 @@ private List<String> getServiceTemplateTopologicalSort(ToscaServiceTemplate serv
10795
return topologicalSort;
10896
}
10997

110-
private void depthFirstSearch(List<String> topologicalSort, String node, Map<String, Set<ToscaNodeTemplate>> graph, Set<String> branchAncestors, Set<String> visitedNodes) {
98+
private void depthFirstSearch(LinkedHashMap<String, Set<ToscaNodeTemplate>> topologicalSort, String node, Map<String, Set<ToscaNodeTemplate>> graph, Set<String> branchAncestors, Set<String> visitedNodes) {
11199
visitedNodes.add(node);
112100
branchAncestors.add(node);
113101
for (ToscaNodeTemplate dependency : graph.getOrDefault(node, Collections.emptySet())) {
@@ -121,7 +109,7 @@ private void depthFirstSearch(List<String> topologicalSort, String node, Map<Str
121109
}
122110

123111
branchAncestors.remove(node);
124-
topologicalSort.add(node);
112+
topologicalSort.put(node, graph.getOrDefault(node, Collections.emptySet()));
125113
}
126114

127115
private CompletableFuture<String> buildNodeProvisioningTask(ToscaNodeTemplate nodeTemplate) {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
public class ToscaProperty {
2020
private final ToscaPropertyDefinition definition;
2121
private final Object rawValue;
22-
private final Object evaluatedValue;
22+
private volatile Object evaluatedValue;
2323

2424
public ToscaProperty(ToscaPropertyDefinition definition, Object rawValue, Object evaluatedValue) {
2525
this.definition = definition;
@@ -35,6 +35,10 @@ public Object getEvaluatedValue() {
3535
return evaluatedValue;
3636
}
3737

38+
public void setEvaluatedValue(Object evaluatedValue) {
39+
this.evaluatedValue = evaluatedValue;
40+
}
41+
3842
public ToscaPropertyDefinition getDefinition() {
3943
return definition;
4044
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.apache.cloudstack.tosca.model;
1818

1919
import java.util.Collections;
20-
import java.util.HashMap;
2120
import java.util.Map;
2221
import java.util.Set;
2322

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public ToscaServiceTemplate parseServiceTemplate(String content, Map<String, Tos
6767
throw new InvalidParameterValueException(context.buildErrorMessages());
6868
}
6969

70-
logger.info("The TOSCA service template has been successfully parsed and validated..");
70+
logger.info("The TOSCA service template has been successfully parsed and validated.");
7171
return new ToscaServiceTemplate(nodeTemplates, dependencyGraph, inputs, context.getUnresolvedByGetInput());
7272
}
7373

@@ -441,7 +441,7 @@ private Map<String, Set<ToscaNodeTemplate>> buildDependencyGraph(Map<String, Tos
441441
});
442442
}
443443

444-
logger.info("Dependency graph of the TOSCA service template has been successfully built with [{}] nodes and [{}] arcs/dependencies.", graph.keySet(), graph.values().stream().mapToLong(Set::size).sum());
444+
logger.info("Dependency graph of the TOSCA service template has been successfully built with [{}] arcs/dependencies.", graph.values().stream().mapToLong(Set::size).sum());
445445
return graph;
446446
}
447447

0 commit comments

Comments
 (0)