1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
package org.openecomp.sdc.be.components.merge.instance;
import java.util.ArrayList;
import java.util.List;
import org.openecomp.sdc.be.components.merge.input.ComponentInputsMergeBL;
import org.openecomp.sdc.be.components.merge.property.ComponentInstanceInputsMergeBL;
import org.openecomp.sdc.be.components.merge.property.ComponentInstancePropertiesMergeBL;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.impl.ComponentsUtils;
import org.openecomp.sdc.be.model.Component;
import org.openecomp.sdc.be.model.ComponentInstance;
import org.openecomp.sdc.be.model.ComponentInstanceInput;
import org.openecomp.sdc.be.model.ComponentInstanceProperty;
import org.openecomp.sdc.be.model.ComponentParametersView;
import org.openecomp.sdc.be.model.InputDefinition;
import org.openecomp.sdc.be.model.User;
import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
import org.openecomp.sdc.exception.ResponseFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import fj.data.Either;
/**
* Created by chaya on 9/20/2017.
*/
@org.springframework.stereotype.Component("ComponentInstancePropsAndInputsMerge")
public class ComponentInstancePropsAndInputsMerge implements ComponentInstanceMergeInterface {
private static Logger log = LoggerFactory.getLogger(ComponentInstancePropsAndInputsMerge.class.getName());
@Autowired
private ToscaOperationFacade toscaOperationFacade;
@Autowired
private ComponentsUtils componentsUtils;
@Autowired
private ComponentInstancePropertiesMergeBL componentInstancePropertiesMergeBL;
@Autowired
private ComponentInstanceInputsMergeBL resourceInstanceInputsMergeBL;
@Autowired
private ComponentInputsMergeBL resourceInputsMergeBL;
@Override
public void saveDataBeforeMerge(DataForMergeHolder dataHolder, Component containerComponent, ComponentInstance currentResourceInstance, Component originComponent) {
dataHolder.setOrigComponentInstanceInputs(containerComponent.safeGetComponentInstanceInputsByName(currentResourceInstance.getName()));
dataHolder.setOrigComponentInstanceProperties(containerComponent.safeGetComponentInstanceProperties(currentResourceInstance.getUniqueId()));
dataHolder.setOrigComponentInputs(containerComponent.getInputs());
}
@Override
public Either<Component, ResponseFormat> mergeDataAfterCreate(User user, DataForMergeHolder dataHolder, Component updatedContainerComponent, String newInstanceId) {
Either<List<ComponentInstanceInput>, ActionStatus> instanceInputsEither = mergeComponentInstanceInputsIntoContainer(dataHolder, updatedContainerComponent, newInstanceId);
if (instanceInputsEither.isRight()) {
ActionStatus actionStatus = instanceInputsEither.right().value();
return Either.right(componentsUtils.getResponseFormat(actionStatus));
}
Either<List<ComponentInstanceProperty>, ActionStatus> instancePropsEither = mergeComponentInstancePropsIntoContainer(dataHolder, updatedContainerComponent, newInstanceId);
if (instancePropsEither.isRight()) {
ActionStatus actionStatus = instancePropsEither.right().value();
return Either.right(componentsUtils.getResponseFormat(actionStatus));
}
Either<List<InputDefinition>, ActionStatus> inputsEither = mergeComponentInputsIntoContainer(dataHolder, updatedContainerComponent.getUniqueId(), newInstanceId);
if (inputsEither.isRight()) {
ActionStatus actionStatus = inputsEither.right().value();
return Either.right(componentsUtils.getResponseFormat(actionStatus));
}
return Either.left(updatedContainerComponent);
}
private Either<List<ComponentInstanceProperty>, ActionStatus> mergeComponentInstancePropsIntoContainer(DataForMergeHolder dataHolder, Component updatedComponent, String instanceId) {
List<ComponentInstanceProperty> originComponentInstanceProps = dataHolder.getOrigComponentInstanceProperties();
List<InputDefinition> originComponentsInputs = dataHolder.getOrigComponentInputs();
List<ComponentInstanceProperty> newComponentInstancesProps = updatedComponent.safeGetComponentInstanceProperties(instanceId);
ActionStatus actionStatus = componentInstancePropertiesMergeBL.mergeComponentInstanceProperties(originComponentInstanceProps, originComponentsInputs, updatedComponent, instanceId);
if (actionStatus != ActionStatus.OK) {
log.error("Failed to update component {} with merged instance properties", updatedComponent.getUniqueId(), newComponentInstancesProps);
return Either.right(actionStatus);
}
return Either.left(newComponentInstancesProps);
}
private Either<List<ComponentInstanceInput>, ActionStatus> mergeComponentInstanceInputsIntoContainer(DataForMergeHolder dataHolder, Component updatedComponent, String instanceId) {
List<ComponentInstanceInput> originComponentInstanceInputs = dataHolder.getOrigComponentInstanceInputs();
List<InputDefinition> originComponentsInputs = dataHolder.getOrigComponentInputs();
List<ComponentInstanceInput> newComponentInstancesInputs = updatedComponent.safeGetComponentInstanceInput(instanceId);
ActionStatus actionStatus = resourceInstanceInputsMergeBL.mergeComponentInstanceInputs(originComponentInstanceInputs, originComponentsInputs, updatedComponent, instanceId);
if (actionStatus != ActionStatus.OK) {
log.error("Failed to update component {} with merged instance properties", updatedComponent.getUniqueId(), newComponentInstancesInputs);
return Either.right(actionStatus);
}
return Either.left(newComponentInstancesInputs);
}
private Either<List<InputDefinition>, ActionStatus> mergeComponentInputsIntoContainer(DataForMergeHolder dataHolder, String newContainerComponentId, String newInstanceId) {
List<InputDefinition> origComponentInputs = dataHolder.getOrigComponentInputs();
List<InputDefinition> inputsToAddToContainer = new ArrayList<>();
if (origComponentInputs != null && !origComponentInputs.isEmpty()) {
// get instance inputs and properties after merge
Either<Component, StorageOperationStatus> componentWithInstancesInputsAndProperties = getComponentWithInstancesInputsAndProperties(newContainerComponentId);
if (componentWithInstancesInputsAndProperties.isRight()) {
log.error("Component %s was not found", newContainerComponentId);
return Either.right(componentsUtils.convertFromStorageResponse(componentWithInstancesInputsAndProperties.right().value()));
}
Component updatedContainerComponent = componentWithInstancesInputsAndProperties.left().value();
ActionStatus redeclareStatus = resourceInputsMergeBL.redeclareComponentInputsForInstance(origComponentInputs, updatedContainerComponent, newInstanceId);
if (redeclareStatus != ActionStatus.OK) {
log.error("Failed to update component {} with merged inputs {}", newContainerComponentId, inputsToAddToContainer);
Either.right(redeclareStatus);
}
}
return Either.left(inputsToAddToContainer);
}
private Either<Component, StorageOperationStatus> getComponentWithInstancesInputsAndProperties(String containerComponentId) {
ComponentParametersView filter = new ComponentParametersView(true);
filter.setIgnoreComponentInstances(false);
filter.setIgnoreComponentInstancesInputs(false);
filter.setIgnoreComponentInstancesProperties(false);
filter.setIgnoreArtifacts(false);
return toscaOperationFacade.getToscaElement(containerComponentId, filter);
}
}
|