* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.openecomp.sdc.be.components.impl;
import fj.data.Either;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import org.apache.commons.collections.MapUtils;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.jetbrains.annotations.NotNull;
import org.openecomp.sdc.be.components.attribute.AttributeDeclarationOrchestrator;
import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
import org.openecomp.sdc.be.model.ComponentInstanceOutput;
import org.openecomp.sdc.be.model.ComponentParametersView;
import org.openecomp.sdc.be.model.OutputDefinition;
+import org.openecomp.sdc.be.model.PropertyDefinition;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
import org.openecomp.sdc.be.model.operations.api.IElementOperation;
private static final String GOING_TO_EXECUTE_ROLLBACK_ON_CREATE_OUTPUTS = "Going to execute rollback on create outputs.";
private static final String GOING_TO_EXECUTE_COMMIT_ON_CREATE_OUTPUTS = "Going to execute commit on create outputs.";
private static final LoggerSupportability loggerSupportability = LoggerSupportability.getLogger(OutputsBusinessLogic.class);
- private static final String FAILED_TO_FOUND_COMPONENT_INSTANCE_OUTPUTS_COMPONENT_INSTANCE_ID = "Failed to found component instance outputs componentInstanceId: {}";
+ private static final String FAILED_TO_FOUND_COMPONENT_INSTANCE_OUTPUTS_COMPONENT_INSTANCE_ID =
+ "Failed to found component instance outputs componentInstanceId: {}";
private static final String FAILED_TO_FOUND_COMPONENT_INSTANCE_OUTPUTS_ERROR = "Failed to found component instance outputs {}, error: {}";
private final AttributeDeclarationOrchestrator attributeDeclarationOrchestrator;
try {
validateUserExists(userId);
component = getAndValidateComponentForCreate(userId, componentId, componentType, shouldLockComp);
- result = attributeDeclarationOrchestrator.declareAttributesToOutputs(component, componentInstOutputsMapUi).left()
- .bind(outputsToCreate -> prepareOutputsForCreation(userId, componentId, outputsToCreate)).right()
- .map(componentsUtils::getResponseFormat);
+ ImmutablePair<StorageOperationStatus, String> status = validateOutputName(component, componentInstOutputsMapUi);
+ if (status.getLeft() != StorageOperationStatus.OK) {
+ throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.OUTPUT_NAME_ALREADY_EXIST, status.getRight()));
+ }
+ result = attributeDeclarationOrchestrator.declareAttributesToOutputs(component, componentInstOutputsMapUi)
+ .left().bind(outputsToCreate -> prepareOutputsForCreation(userId, componentId, outputsToCreate))
+ .right().map(componentsUtils::getResponseFormat);
return result;
} catch (final ByResponseFormatComponentException e) {
log.error("#createMultipleOutputs: Exception thrown: ", e);
}
}
+ private ImmutablePair<StorageOperationStatus, String> validateOutputName(final Component component,
+ final ComponentInstOutputsMap componentInstOutputsMapUi) {
+ final Map<String, List<ComponentInstanceAttribOutput>> outputDeclaredProperties = new HashMap<>();
+ if (MapUtils.isNotEmpty(componentInstOutputsMapUi.getComponentInstanceOutputsMap())) {
+ outputDeclaredProperties.putAll(componentInstOutputsMapUi.getComponentInstanceOutputsMap());
+ } else if (MapUtils.isNotEmpty(componentInstOutputsMapUi.getComponentInstanceAttributes())) {
+ outputDeclaredProperties.putAll(componentInstOutputsMapUi.getComponentInstanceAttributes());
+ }
+ if (MapUtils.isNotEmpty(outputDeclaredProperties) && CollectionUtils.isNotEmpty(component.getOutputs())) {
+ for (final List<ComponentInstanceAttribOutput> componentInstancePropOutputs : outputDeclaredProperties.values()) {
+ for (final ComponentInstanceAttribOutput componentInstancePropOutput : componentInstancePropOutputs) {
+ final Optional<OutputDefinition> outputDefinition = component.getOutputs().stream()
+ .filter(output -> output.getName().equals(componentInstancePropOutput.getOutputName())
+ || output.getName().equals(componentInstancePropOutput.getName())).findAny();
+ if (outputDefinition.isPresent()) {
+ return new ImmutablePair<>(StorageOperationStatus.INVALID_VALUE, outputDefinition.get().getName());
+ }
+ }
+ }
+ }
+ return new ImmutablePair<>(StorageOperationStatus.OK, StringUtils.EMPTY);
+ }
+
private Component getAndValidateComponentForCreate(final String userId, final String componentId,
final ComponentTypeEnum componentType,
final boolean shouldLockComp) {
componentParametersView.setIgnoreComponentInstances(false);
componentParametersView.setIgnoreComponentInstancesOutputs(false);
componentParametersView.setIgnoreComponentInstancesAttributes(false);
+ componentParametersView.setIgnoreComponentInstancesProperties(false);
componentParametersView.setIgnoreUsers(false);
return componentParametersView;
}
final var optionalComponentInstance = component.getComponentInstanceByName(getAttribute.get(0));
if (optionalComponentInstance.isPresent()) {
final var createdOutputs
- = createOutputs(component.getUniqueId(), userId, getAttribute.get(1), optionalComponentInstance.get());
+ = createOutputs(component.getUniqueId(), userId, getAttribute.get(1), optionalComponentInstance.get(),outputDefinitionValue.getName());
if (createdOutputs.isRight()) {
return Either.right((createdOutputs.right().value()));
}
private Either<List<OutputDefinition>, ResponseFormat> createOutputs(final String componentUniqueId, final String userId,
final String attributeName,
- final ComponentInstance componentInstance) {
+ final ComponentInstance componentInstance,
+ final String outputName) {
// From Instance
- final List<OutputDefinition> result = new ArrayList<>();
final var componentInstanceAttributes = componentInstance.getAttributes();
if (CollectionUtils.isNotEmpty(componentInstanceAttributes)) {
final var componentInstanceAttributeOptional = componentInstanceAttributes.stream()
if (componentInstanceAttributeOptional.isPresent()) {
final var componentInstOutputsMap = new ComponentInstOutputsMap();
componentInstOutputsMap.setComponentInstanceAttributes(Collections.singletonMap(componentInstance.getUniqueId(),
- Collections.singletonList(new ComponentInstanceAttribOutput(componentInstanceAttributeOptional.get()))));
- final var createdOutputs = createMultipleOutputs(userId, componentUniqueId, ComponentTypeEnum.SERVICE,
+ Collections.singletonList(new ComponentInstanceAttribOutput(componentInstanceAttributeOptional.get(),outputName))));
+ return createMultipleOutputs(userId, componentUniqueId, ComponentTypeEnum.SERVICE,
componentInstOutputsMap, true, false);
- if (createdOutputs.isRight()) {
- return Either.right((createdOutputs.right().value()));
- }
- result.addAll(createdOutputs.left().value());
}
}
- return Either.left(result);
+ final List<PropertyDefinition> componentInstanceProperties = componentInstance.getProperties();
+ if (CollectionUtils.isNotEmpty(componentInstanceProperties)) {
+ final Optional<PropertyDefinition> componentInstancePropertyOptional = componentInstanceProperties.stream()
+ .filter(prop -> prop.getName().equals(attributeName)).findFirst();
+ if (componentInstancePropertyOptional.isPresent()) {
+ PropertyDefinition propertyDefinition = componentInstancePropertyOptional.get();
+ final ComponentInstOutputsMap componentInstOutputsMap = new ComponentInstOutputsMap();
+ ComponentInstanceAttribOutput attribute = getComponentInstanceAttribOutput(propertyDefinition);
+ componentInstOutputsMap.setComponentInstanceAttributes(Collections.singletonMap(componentInstance.getUniqueId(),
+ Collections.singletonList(new ComponentInstanceAttribOutput(attribute,outputName))));
+ return createMultipleOutputs(userId, componentUniqueId, ComponentTypeEnum.SERVICE, componentInstOutputsMap, true, false);
+ }
+ }
+ return Either.left(new ArrayList<>());
+ }
+
+ @NotNull
+ private ComponentInstanceAttribOutput getComponentInstanceAttribOutput(PropertyDefinition propertyDefinition) {
+ ComponentInstanceAttribOutput attribute = new ComponentInstanceAttribOutput();
+ attribute.setParentUniqueId(propertyDefinition.getParentUniqueId());
+ attribute.setName(propertyDefinition.getName());
+ attribute.setOwnerId(propertyDefinition.getOwnerId());
+ attribute.setType(propertyDefinition.getType());
+ attribute.setSchema(propertyDefinition.getSchema());
+ attribute.setUniqueId(propertyDefinition.getUniqueId());
+ return attribute;
}
}