aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandre.schmid <andre.schmid@est.tech>2020-10-14 20:56:11 +0100
committerS�bastien Determe <sebastien.determe@intl.att.com>2020-12-07 14:51:59 +0000
commit95ad93091d5fa6e377e76f312d495151bddc9da8 (patch)
tree9923a98bd90b99cb960cf1f7ead2a57402aca1a8
parenta9467feb90c33ad5b6b2ed80581c4adf75114046 (diff)
Support interface input during import VFC
Change-Id: I097ce258a7dadbedf1aff6ce53dd1286da074552 Issue-ID: SDC-3372 Signed-off-by: andre.schmid <andre.schmid@est.tech>
-rw-r--r--catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml12
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java51
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InterfaceDefinitionHandler.java255
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java194
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverter.java85
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaInterfaceDefinition.java27
-rw-r--r--catalog-be/src/main/resources/config/error-configuration.yaml12
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java64
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ImportUtilsTest.java8
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/InterfaceDefinitionHandlerTest.java174
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverterTest.java (renamed from catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsConverterTest.java)240
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/tosca/model/ToscaInterfaceDefinitionTest.java72
-rw-r--r--catalog-be/src/test/resources/config/catalog-be/error-configuration.yaml12
-rw-r--r--catalog-be/src/test/resources/interfaceDefinition/interfaceDefinition-legacy.yaml24
-rw-r--r--catalog-be/src/test/resources/interfaceDefinition/interfaceDefinition-tosca1.3.yaml25
-rw-r--r--catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java2
-rw-r--r--catalog-model/src/main/java/org/openecomp/sdc/be/model/InterfaceDefinition.java26
-rw-r--r--catalog-model/src/test/java/org/openecomp/sdc/be/model/InterfaceDefinitionTest.java71
-rw-r--r--common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InputDataDefinition.java30
-rw-r--r--common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinition.java26
-rw-r--r--common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/JsonPresentationFields.java1
-rw-r--r--common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java3
-rw-r--r--common-be/src/test/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinitionTest.java18
23 files changed, 917 insertions, 515 deletions
diff --git a/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml b/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml
index d2a79909d6..4aa93cb268 100644
--- a/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml
+++ b/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml
@@ -2060,6 +2060,18 @@ errors:
message: "Error: Failed to delete interface operation.",
messageId: "SVC4702"
}
+ #SVC4732
+ INTERFACE_UNKNOWN: {
+ code: 400,
+ message: "Error: The interface '%1' does not exists in the database.",
+ messageId: "SVC4732"
+ }
+ #SVC4733
+ INTERFACE_OPERATION_NOT_DEFINED: {
+ code: 400,
+ message: "Error: The operation '%1' does not exists in the interface '%2'.",
+ messageId: "SVC4733"
+ }
#-----------SVC4692---------------------------
RESOURCE_LIFECYCLE_STATE_NOT_VALID: {
code: 400,
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java
index 4127faa820..614b261b4a 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ImportUtils.java
@@ -47,6 +47,7 @@ import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentEx
import org.openecomp.sdc.be.config.BeEcompErrorManager;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.datatypes.elements.Annotation;
+import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
@@ -348,24 +349,24 @@ public final class ImportUtils {
}
}
- private static List<PropertyConstraint> getPropertyConstraints(Map<String, Object> propertyValue,
- String propertyType) {
- List<Object> propertyFieldConstraints = findCurrentLevelConstraintsElement(propertyValue);
- if (CollectionUtils.isNotEmpty(propertyFieldConstraints)) {
- List<PropertyConstraint> constraintList = new ArrayList<>();
- Type constraintType = new TypeToken<PropertyConstraint>() {
- }.getType();
- Gson gson = new GsonBuilder().registerTypeAdapter(constraintType, new PropertyConstraintDeserialiser())
- .create();
+ private static List<PropertyConstraint> getPropertyConstraints(final Map<String, Object> propertyValue,
+ final String propertyType) {
+ final List<Object> propertyFieldConstraints = findCurrentLevelConstraintsElement(propertyValue);
+ if (CollectionUtils.isEmpty(propertyFieldConstraints)) {
+ return Collections.emptyList();
+ }
+ final List<PropertyConstraint> constraintList = new ArrayList<>();
+ final Type constraintType = new TypeToken<PropertyConstraint>() {
+ }.getType();
+ final Gson gson = new GsonBuilder().registerTypeAdapter(constraintType, new PropertyConstraintDeserialiser())
+ .create();
- for (Object constraintJson : propertyFieldConstraints) {
- PropertyConstraint propertyConstraint = validateAndGetPropertyConstraint(propertyType, constraintType,
- gson, constraintJson);
- constraintList.add(propertyConstraint);
- }
- return constraintList;
+ for (final Object constraintJson : propertyFieldConstraints) {
+ final PropertyConstraint propertyConstraint = validateAndGetPropertyConstraint(propertyType, constraintType,
+ gson, constraintJson);
+ constraintList.add(propertyConstraint);
}
- return null;
+ return constraintList;
}
private static List<Object> findCurrentLevelConstraintsElement(Map<String, Object> toscaJson) {
@@ -485,10 +486,13 @@ public final class ImportUtils {
return result;
}
- public static InputDefinition createModuleInput(Map<String, Object> inputValue,
- AnnotationTypeOperations annotationTypeOperations) {
+ public static InputDefinition createModuleInput(final Map<String, Object> inputValue,
+ final AnnotationTypeOperations annotationTypeOperations) {
+ return parseAnnotationsAndAddItToInput(createModuleInput(inputValue), inputValue, annotationTypeOperations);
+ }
- InputDefinition inputDef = new InputDefinition();
+ public static InputDefinition createModuleInput(final Map<String, Object> inputValue) {
+ final InputDefinition inputDef = new InputDefinition();
setField(inputValue, TypeUtils.ToscaTagNamesEnum.TYPE, inputDef::setType);
setFieldBoolean(inputValue, ToscaTagNamesEnum.REQUIRED, req -> inputDef.setRequired(Boolean.parseBoolean(req)));
setField(inputValue, TypeUtils.ToscaTagNamesEnum.DESCRIPTION, inputDef::setDescription);
@@ -504,9 +508,7 @@ public final class ImportUtils {
setScheme(inputValue, inputDef);
setPropertyConstraints(inputValue, inputDef);
-
- return parseAnnotationsAndAddItToInput(inputDef, inputValue, annotationTypeOperations);
-
+ return inputDef;
}
public static InputDefinition parseAnnotationsAndAddItToInput(InputDefinition inputDef,
@@ -608,6 +610,11 @@ public final class ImportUtils {
}
+ public static Either<Map<String, InputDefinition>, ResultStatusEnum> getInputs(final Map<String, Object> toscaJson) {
+ return getElements(toscaJson, TypeUtils.ToscaTagNamesEnum.INPUTS, ImportUtils::createInputs,
+ ImportUtils::createModuleInput);
+ }
+
public static <T> Either<Map<String, T>, ResultStatusEnum> getElements(Map<String, Object> toscaJson,
TypeUtils.ToscaTagNamesEnum elementTagName,
Function<String, T> elementGenByName,
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InterfaceDefinitionHandler.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InterfaceDefinitionHandler.java
new file mode 100644
index 0000000000..aeb4376c15
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InterfaceDefinitionHandler.java
@@ -0,0 +1,255 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+import static org.openecomp.sdc.be.components.impl.ImportUtils.Constants.QUOTE;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.DEFAULT;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.DESCRIPTION;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.IMPLEMENTATION;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.INPUTS;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.NOTIFICATIONS;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.OPERATIONS;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.REQUIRED;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.STATUS;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.TYPE;
+
+import fj.data.Either;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import org.apache.commons.collections.MapUtils;
+import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum;
+import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.InputDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
+import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.InterfaceDefinition;
+import org.openecomp.sdc.be.tosca.utils.OperationArtifactUtil;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * Handles interface definition TOSCA conversions
+ */
+@Component("interfaceDefinitionHandler")
+public class InterfaceDefinitionHandler {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(InterfaceDefinitionHandler.class);
+
+ private final InterfaceOperationBusinessLogic interfaceOperationBusinessLogic;
+
+ public InterfaceDefinitionHandler(final InterfaceOperationBusinessLogic interfaceOperationBusinessLogic) {
+ this.interfaceOperationBusinessLogic = interfaceOperationBusinessLogic;
+ }
+
+ /**
+ * Creates an interface definition based on a TOSCA map representing an interface definition.
+ *
+ * @param interfaceDefinitionToscaMap the TOSCA interface definition structure
+ * @return an interface definition representation
+ */
+ public InterfaceDefinition create(final Map<String, Object> interfaceDefinitionToscaMap) {
+
+ final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
+
+ if (interfaceDefinitionToscaMap.containsKey(TYPE.getElementName())) {
+ final Object typeObj = interfaceDefinitionToscaMap.get(TYPE.getElementName());
+ if (!(typeObj instanceof String)) {
+ throw new ByActionStatusComponentException(ActionStatus.INVALID_YAML);
+ }
+ final String type = (String) typeObj;
+ interfaceDefinition.setType(type);
+ interfaceDefinition.setUniqueId(type.toLowerCase());
+ }
+
+ final Map<String, InputDefinition> inputDefinitionMap = handleInputs(interfaceDefinitionToscaMap);
+ if (!inputDefinitionMap.isEmpty()) {
+ final Map<String, InputDataDefinition> collect = inputDefinitionMap.entrySet().stream().
+ collect(Collectors.toMap(Entry::getKey, value -> new InputDataDefinition(value.getValue())));
+ interfaceDefinition.setInputs(collect);
+ }
+ final Map<String, OperationDataDefinition> operationMap;
+ if (interfaceDefinitionToscaMap.containsKey(OPERATIONS.getElementName()) || interfaceDefinitionToscaMap
+ .containsKey(NOTIFICATIONS.getElementName())) {
+ operationMap = handleOperations(interfaceDefinitionToscaMap);
+ //TODO handle notifications
+ } else {
+ operationMap = handleLegacyOperations(interfaceDefinitionToscaMap);
+ }
+ if (!operationMap.isEmpty()) {
+ validateOperations(interfaceDefinition.getType(), operationMap);
+ interfaceDefinition.setOperations(operationMap);
+ }
+
+ return interfaceDefinition;
+ }
+
+ private void validateOperations(final String interfaceType,
+ final Map<String, OperationDataDefinition> operationMap) {
+ if (MapUtils.isEmpty(operationMap)) {
+ return;
+ }
+ Either<Map<String, InterfaceDefinition>, ResponseFormat> interfaceDefinitionMapEither =
+ interfaceOperationBusinessLogic.getAllInterfaceLifecycleTypes();
+ if (interfaceDefinitionMapEither.isRight() || MapUtils.isEmpty(interfaceDefinitionMapEither.left().value())) {
+ throw new ByActionStatusComponentException(ActionStatus.INTERFACE_UNKNOWN, interfaceType);
+ }
+
+ final Map<String, InterfaceDefinition> interfaceDefinitionMap = interfaceDefinitionMapEither.left().value();
+ final Optional<InterfaceDefinition> interfaceDefinitionOptional = interfaceDefinitionMap.entrySet().stream()
+ .filter(interfaceDefinitionEntry -> interfaceDefinitionEntry.getKey().equalsIgnoreCase(interfaceType))
+ .map(Entry::getValue).findFirst();
+ if (interfaceDefinitionOptional.isEmpty()) {
+ throw new ByActionStatusComponentException(ActionStatus.INTERFACE_UNKNOWN, interfaceType);
+ }
+ final InterfaceDefinition interfaceDefinition = interfaceDefinitionOptional.get();
+ operationMap.keySet().forEach(operation1 -> {
+ if (!interfaceDefinition.hasOperation(operation1)) {
+ throw new ByActionStatusComponentException(ActionStatus.INTERFACE_OPERATION_NOT_DEFINED,
+ operation1, interfaceType);
+ }
+ });
+ }
+
+ private Map<String, OperationDataDefinition> handleOperations(
+ final Map<String, Object> interfaceDefinitionToscaMap) {
+ if (!interfaceDefinitionToscaMap.containsKey(OPERATIONS.getElementName())) {
+ return Collections.emptyMap();
+ }
+ final Map<String, Object> operationMap =
+ (Map<String, Object>) interfaceDefinitionToscaMap.get(OPERATIONS.getElementName());
+ return operationMap.entrySet().stream()
+ .map(interfaceEntry -> createOperation(interfaceEntry.getKey(),
+ (Map<String, Object>) interfaceEntry.getValue()))
+ .collect(
+ Collectors.toMap(OperationDataDefinition::getName, operationDataDefinition -> operationDataDefinition));
+ }
+
+ private Map<String, OperationDataDefinition> handleLegacyOperations(
+ final Map<String, Object> interfaceDefinitionToscaMap) {
+ final List<String> notALegacyOperationEntry = Arrays
+ .asList(OPERATIONS.getElementName(),
+ TYPE.getElementName(),
+ INPUTS.getElementName(),
+ NOTIFICATIONS.getElementName());
+ return interfaceDefinitionToscaMap.entrySet().stream()
+ .filter(interfaceEntry -> !notALegacyOperationEntry.contains(interfaceEntry.getKey()))
+ .map(interfaceEntry -> createOperation(interfaceEntry.getKey(),
+ (Map<String, Object>) interfaceEntry.getValue()))
+ .collect(
+ Collectors.toMap(OperationDataDefinition::getName, operationDataDefinition -> operationDataDefinition));
+ }
+
+
+ private OperationDataDefinition createOperation(final String operationName,
+ final Map<String, Object> operationDefinitionMap) {
+ final OperationDataDefinition operation = new OperationDataDefinition();
+ operation.setName(operationName);
+
+ handleOperationImplementation(operationDefinitionMap).ifPresent(operation::setImplementation);
+ if (operationDefinitionMap.containsKey(INPUTS.getElementName())) {
+ final Map<String, Object> interfaceInputs =
+ (Map<String, Object>) operationDefinitionMap.get(INPUTS.getElementName());
+ operation.setInputs(handleInterfaceOperationInputs(interfaceInputs));
+ }
+
+ return operation;
+ }
+
+ private ListDataDefinition<OperationInputDefinition> handleInterfaceOperationInputs(
+ final Map<String, Object> interfaceInputs) {
+ final ListDataDefinition<OperationInputDefinition> inputs = new ListDataDefinition<>();
+ for (final Entry<String, Object> interfaceInput : interfaceInputs.entrySet()) {
+ final OperationInputDefinition operationInput = new OperationInputDefinition();
+ operationInput.setName(interfaceInput.getKey());
+ if (interfaceInput.getValue() instanceof Map) {
+ final LinkedHashMap<String, Object> inputPropertyValue =
+ (LinkedHashMap<String, Object>) interfaceInput.getValue();
+ LOGGER.info("createModuleInterface: i interfaceInput.getKey() {}, {} , {} ",
+ interfaceInput.getKey(), inputPropertyValue.keySet(), inputPropertyValue.values());
+ if (inputPropertyValue.get(TYPE.getElementName()) != null) {
+ operationInput.setType(inputPropertyValue.get(TYPE.getElementName()).toString());
+ }
+ if (inputPropertyValue.get(DESCRIPTION.getElementName()) != null) {
+ operationInput.setDescription(inputPropertyValue.get(DESCRIPTION.getElementName()).toString());
+ }
+ if (inputPropertyValue.get(REQUIRED.getElementName()) != null) {
+ operationInput.setRequired(
+ Boolean.getBoolean(inputPropertyValue.get(REQUIRED.getElementName()).toString()));
+ }
+ if (inputPropertyValue.get(DEFAULT.getElementName()) != null) {
+ operationInput.setToscaDefaultValue(inputPropertyValue.get(DEFAULT.getElementName()).toString());
+ }
+ if (inputPropertyValue.get(STATUS.getElementName()) != null) {
+ operationInput.setStatus(inputPropertyValue.get(STATUS.getElementName()).toString());
+ }
+
+ } else if (interfaceInput.getValue() instanceof String) {
+ final String value = (String) interfaceInput.getValue();
+ operationInput.setDefaultValue(value);
+ operationInput.setToscaDefaultValue(value);
+ operationInput.setValue(value);
+ }
+ inputs.add(operationInput);
+ }
+ return inputs;
+ }
+
+ private Optional<ArtifactDataDefinition> handleOperationImplementation(
+ final Map<String, Object> operationDefinitionMap) {
+ if (!operationDefinitionMap.containsKey(IMPLEMENTATION.getElementName())) {
+ return Optional.empty();
+ }
+ final ArtifactDataDefinition artifactDataDefinition = new ArtifactDataDefinition();
+ final String artifactName = (String) operationDefinitionMap.get(IMPLEMENTATION.getElementName());
+ if (OperationArtifactUtil.artifactNameIsALiteralValue(artifactName)) {
+ artifactDataDefinition.setArtifactName(artifactName);
+ } else {
+ artifactDataDefinition.setArtifactName(QUOTE + artifactName + QUOTE);
+ }
+ return Optional.of(artifactDataDefinition);
+ }
+
+ private Map<String, InputDefinition> handleInputs(final Map<String, Object> interfaceDefinitionToscaMap) {
+ if (!interfaceDefinitionToscaMap.containsKey(INPUTS.getElementName())) {
+ return Collections.emptyMap();
+ }
+
+ final Either<Map<String, InputDefinition>, ResultStatusEnum> inputMapEither =
+ ImportUtils.getInputs(interfaceDefinitionToscaMap);
+ if (inputMapEither.isRight()) {
+ return Collections.emptyMap();
+ }
+
+ return inputMapEither.left().value();
+ }
+
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java
index 7ff916df32..b96e4e58e2 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java
@@ -22,7 +22,6 @@
package org.openecomp.sdc.be.components.impl;
-import static org.openecomp.sdc.be.components.impl.ImportUtils.Constants.QUOTE;
import static org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaElementOperation.createDataType;
import static org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaElementOperation.createDataTypeDefinitionWithName;
import static org.openecomp.sdc.be.utils.TypeUtils.setField;
@@ -34,7 +33,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -62,11 +60,7 @@ import org.openecomp.sdc.be.config.BeEcompErrorManager;
import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
-import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
@@ -94,7 +88,6 @@ import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
import org.openecomp.sdc.be.resources.data.auditing.model.CommonAuditData;
import org.openecomp.sdc.be.resources.data.auditing.model.ResourceCommonInfo;
import org.openecomp.sdc.be.resources.data.auditing.model.ResourceVersionInfo;
-import org.openecomp.sdc.be.tosca.utils.OperationArtifactUtil;
import org.openecomp.sdc.be.utils.TypeUtils;
import org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum;
import org.openecomp.sdc.common.log.wrappers.Logger;
@@ -112,13 +105,7 @@ public class ResourceImportManager {
private static final Logger log = Logger.getLogger(ResourceImportManager.class);
static final Pattern PROPERTY_NAME_PATTERN_IGNORE_LENGTH = Pattern.compile("[\\w\\-\\_\\d\\:]+");
- private static final String IMPLEMENTATION = "implementation";
- private static final String INPUTS = "inputs";
- private static final String TYPE = "type";
- private static final String DESCRIPTION = "description";
- private static final String REQUIRED = "required";
- private static final String DEFAULT = "default";
- private static final String STATUS = "status";
+ private final InterfaceDefinitionHandler interfaceDefinitionHandler;
private ServletContext servletContext;
@@ -134,7 +121,6 @@ public class ResourceImportManager {
@Autowired
private ServiceBusinessLogic serviceBusinessLogic;
- private InterfaceOperationBusinessLogic interfaceOperationBusinessLogic;
private IGraphLockOperation graphLockOperation;
private ToscaOperationFacade toscaOperationFacade;
@@ -145,9 +131,11 @@ public class ResourceImportManager {
private ResponseFormatManager responseFormatManager;
@Autowired
- public ResourceImportManager(ComponentsUtils componentsUtils, CapabilityTypeOperation capabilityTypeOperation) {
+ public ResourceImportManager(ComponentsUtils componentsUtils, CapabilityTypeOperation capabilityTypeOperation,
+ final InterfaceDefinitionHandler interfaceDefinitionHandler) {
this.componentsUtils = componentsUtils;
this.capabilityTypeOperation = capabilityTypeOperation;
+ this.interfaceDefinitionHandler = interfaceDefinitionHandler;
}
@Autowired
@@ -380,11 +368,9 @@ public class ResourceImportManager {
if (toscaInterfaces.isLeft()) {
Map<String, Object> jsonInterfaces = toscaInterfaces.left().value();
Map<String, InterfaceDefinition> moduleInterfaces = new HashMap<>();
- Iterator<Entry<String, Object>> interfacesNameValue = jsonInterfaces.entrySet().iterator();
- while (interfacesNameValue.hasNext()) {
- Entry<String, Object> interfaceNameValue = interfacesNameValue.next();
- Either<InterfaceDefinition, ResultStatusEnum> eitherInterface = createModuleInterface(interfaceNameValue
- .getValue(), resource);
+ for (final Entry<String, Object> interfaceNameValue : jsonInterfaces.entrySet()) {
+ final Either<InterfaceDefinition, ResultStatusEnum> eitherInterface =
+ createModuleInterface(interfaceNameValue.getValue());
if (eitherInterface.isRight()) {
log.info("error when creating interface:{}, for resource:{}", interfaceNameValue.getKey(),
resource.getName());
@@ -393,165 +379,32 @@ public class ResourceImportManager {
}
}
- if (moduleInterfaces.size() > 0) {
+ if (!moduleInterfaces.isEmpty()) {
resource.setInterfaces(moduleInterfaces);
}
}
}
- private Either<InterfaceDefinition, ResultStatusEnum> createModuleInterface(Object interfaceJson,
- Resource resource) {
- final InterfaceDefinition interf = new InterfaceDefinition();
- Either<InterfaceDefinition, ResultStatusEnum> result = Either.left(interf);
-
+ private Either<InterfaceDefinition, ResultStatusEnum> createModuleInterface(final Object interfaceJson) {
try {
if (interfaceJson instanceof String) {
- final String requirementJsonString = (String) interfaceJson;
- interf.setType(requirementJsonString);
- } else if (interfaceJson instanceof Map && ResourceTypeEnum.VFC.equals(resource.getResourceType())) {
- final Map<String, Object> requirementJsonMap = (Map<String, Object>) interfaceJson;
- final Map<String, OperationDataDefinition> operations = new HashMap<>();
-
- for (final Entry<String, Object> entry : requirementJsonMap.entrySet()) {
- if (entryIsInterfaceType(entry)) {
- final String type = (String) requirementJsonMap
- .get(TypeUtils.ToscaTagNamesEnum.TYPE.getElementName());
- interf.setType(type);
- interf.setUniqueId(type.toLowerCase());
- } else if (entryContainsImplementationForAKnownOperation(entry, interf.getType())) {
-
- final OperationDataDefinition operation = new OperationDataDefinition();
- operation.setName(entry.getKey());
-
- final Map<?, ?> entryValue = (Map<?, ?>) entry.getValue();
- if (entryValue.containsKey(IMPLEMENTATION)) {
- operation.setImplementation(handleOperationImplementation(entry));
- }
- if (entryValue.containsKey(INPUTS)) {
- final Map<String, Object> interfaceInputs = (Map<String, Object>) entryValue
- .get(ToscaTagNamesEnum.INPUTS.getElementName());
- operation.setInputs(handleInterfaceInput(interfaceInputs));
- }
- operations.put(entry.getKey(), operation);
- }
- }
- if (!operations.isEmpty()) {
- interf.setOperations(operations);
- }
- } else {
- result = Either.right(ResultStatusEnum.GENERAL_ERROR);
- }
-
- } catch (Exception e) {
- BeEcompErrorManager.getInstance().logBeSystemError("Import Resource- create interface");
- log.debug("error when creating interface, message:{}", e.getMessage(), e);
- result = Either.right(ResultStatusEnum.GENERAL_ERROR);
- }
-
- return result;
- }
-
- private ArtifactDataDefinition handleOperationImplementation(final Entry<String, Object> entry) {
- final ArtifactDataDefinition implementation = new ArtifactDataDefinition();
- final String artifactName = ((Map<String, String>) entry.getValue()).get(IMPLEMENTATION);
- if (OperationArtifactUtil.artifactNameIsALiteralValue(artifactName)) {
- implementation.setArtifactName(artifactName);
- } else {
- implementation.setArtifactName(QUOTE + artifactName + QUOTE);
- }
- return implementation;
- }
-
- private ListDataDefinition<OperationInputDefinition> handleInterfaceInput(
- final Map<String, Object> interfaceInputs) {
- final ListDataDefinition<OperationInputDefinition> inputs = new ListDataDefinition<>();
- for (final Entry<String, Object> interfaceInput : interfaceInputs.entrySet()) {
- final OperationInputDefinition operationInput = new OperationInputDefinition();
- operationInput.setName(interfaceInput.getKey());
- if (interfaceInput.getValue() instanceof Map) {
- final LinkedHashMap<String, Object> inputPropertyValue =
- (LinkedHashMap<String, Object>) interfaceInput.getValue();
- log.info("createModuleInterface: i interfaceInput.getKey() {}, {} , {} ",
- interfaceInput.getKey(), inputPropertyValue.keySet(),
- inputPropertyValue.values());
- if (inputPropertyValue.get(TYPE) != null) {
- operationInput.setType(inputPropertyValue.get(TYPE).toString());
- }
- if (inputPropertyValue.get(DESCRIPTION) != null) {
- operationInput.setDescription(inputPropertyValue.get(DESCRIPTION).toString());
- }
- if (inputPropertyValue.get(REQUIRED) != null) {
- operationInput.setRequired(
- Boolean.getBoolean(inputPropertyValue.get(REQUIRED).toString()));
- }
- if (inputPropertyValue.get(DEFAULT) != null) {
- operationInput.setToscaDefaultValue(inputPropertyValue.get(DEFAULT).toString());
- }
- if (inputPropertyValue.get(STATUS) != null) {
- operationInput.setStatus(inputPropertyValue.get(STATUS).toString());
- }
-
- } else if (interfaceInput.getValue() instanceof String) {
- final String value = (String) interfaceInput.getValue();
- operationInput.setDefaultValue(value);
- operationInput.setToscaDefaultValue(value);
- operationInput.setValue(value);
+ final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
+ interfaceDefinition.setType((String) interfaceJson);
+ return Either.left(interfaceDefinition);
}
- inputs.getListToscaDataDefinition().add(operationInput);
- inputs.add(operationInput);
- }
- return inputs;
- }
- private boolean entryIsInterfaceType(final Entry<String, Object> entry) {
- if(entry.getKey().equals(TypeUtils.ToscaTagNamesEnum.TYPE.getElementName())) {
- if (entry.getValue() instanceof String) {
- return true;
+ if (interfaceJson instanceof Map) {
+ final Map<String, Object> interfaceJsonMap = (Map<String, Object>) interfaceJson;
+ final InterfaceDefinition interfaceDefinition = interfaceDefinitionHandler.create(interfaceJsonMap);
+ return Either.left(interfaceDefinition);
}
- throw new ByActionStatusComponentException(ActionStatus.INVALID_YAML);
- }
- return false;
- }
-
- private boolean entryContainsImplementationForAKnownOperation(final Entry<String, Object> entry,
- final String interfaceType) {
- if (entry.getValue() instanceof Map && ((Map<?, ?>)entry.getValue()).containsKey(IMPLEMENTATION)) {
- if (isAKnownOperation(interfaceType, entry.getKey())){
- return true;
- }
- throw new ByActionStatusComponentException(ActionStatus.INTERFACE_OPERATION_NOT_FOUND);
- }
- return false;
- }
-
- private boolean isAKnownOperation(String interfaceType, String operation) {
- Either<Map<String, InterfaceDefinition>, ResponseFormat> interfaceLifecycleTypes = interfaceOperationBusinessLogic
- .getAllInterfaceLifecycleTypes();
- if (interfaceLifecycleTypes.isRight() || interfaceLifecycleTypes.left().value() == null) {
- return false;
- }
- for (Entry<String, InterfaceDefinition> interfaceLifecycleType : interfaceLifecycleTypes.left().value()
- .entrySet()) {
- if (interfaceTypeAndOperationMatches(interfaceLifecycleType, interfaceType, operation)) {
- return true;
- }
- }
- return false;
- }
-
- private boolean interfaceTypeAndOperationMatches(Entry<String, InterfaceDefinition> interfaceLifecycleType,
- String interfaceType, String operation) {
- if (interfaceLifecycleType.getKey().equalsIgnoreCase(interfaceType)
- && interfaceLifecycleType.getValue().getOperations() != null) {
- for (String interfaceLifecycleTypeOperation : interfaceLifecycleType.getValue().getOperations().keySet()) {
- if (interfaceLifecycleTypeOperation != null && interfaceLifecycleTypeOperation
- .equalsIgnoreCase(operation)) {
- return true;
- }
- }
+ return Either.right(ResultStatusEnum.GENERAL_ERROR);
+ } catch (final Exception e) {
+ BeEcompErrorManager.getInstance().logBeSystemError("Import Resource- create interface");
+ log.debug("error when creating interface, message:{}", e.getMessage(), e);
+ return Either.right(ResultStatusEnum.GENERAL_ERROR);
}
- return false;
}
private void setRequirements(Map<String, Object> toscaJson, Resource resource,
@@ -1165,11 +1018,6 @@ public class ResourceImportManager {
this.resourceBusinessLogic = resourceBusinessLogic;
}
- @Autowired
- public void setInterfaceOperationBusinessLogic(InterfaceOperationBusinessLogic interfaceOperationBusinessLogic) {
- this.interfaceOperationBusinessLogic = interfaceOperationBusinessLogic;
- }
-
public IGraphLockOperation getGraphLockOperation() {
return graphLockOperation;
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverter.java
index 9e9d834691..1f1dcfed8c 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverter.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverter.java
@@ -16,10 +16,21 @@
package org.openecomp.sdc.be.tosca;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.DEFAULT;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.INPUTS;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.OPERATIONS;
+
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
import org.apache.commons.collections.MapUtils;
+import org.openecomp.sdc.be.datatypes.elements.InputDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
import org.openecomp.sdc.be.model.Component;
@@ -27,30 +38,27 @@ import org.openecomp.sdc.be.model.ComponentInstance;
import org.openecomp.sdc.be.model.DataTypeDefinition;
import org.openecomp.sdc.be.model.InterfaceDefinition;
import org.openecomp.sdc.be.model.Product;
-import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
+import org.openecomp.sdc.be.model.PropertyDefinition;
+import org.openecomp.sdc.be.tosca.PropertyConvertor.PropertyType;
+import org.openecomp.sdc.be.tosca.model.ToscaInput;
import org.openecomp.sdc.be.tosca.model.ToscaInterfaceDefinition;
import org.openecomp.sdc.be.tosca.model.ToscaInterfaceNodeType;
import org.openecomp.sdc.be.tosca.model.ToscaLifecycleOperationDefinition;
import org.openecomp.sdc.be.tosca.model.ToscaNodeType;
import org.openecomp.sdc.be.tosca.model.ToscaProperty;
import org.openecomp.sdc.be.tosca.utils.OperationArtifactUtil;
+import org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum;
+import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
@Service
public class InterfacesOperationsConverter {
private static final String DERIVED_FROM_STANDARD_INTERFACE = "tosca.interfaces.node.lifecycle.Standard";
private static final String DERIVED_FROM_BASE_DEFAULT = "org.openecomp.interfaces.node.lifecycle.";
- private static final String OPERATIONS_KEY = "operations";
- private static final String DEFAULT = "default";
private static final String DEFAULT_HAS_UNDERSCORE = "_default";
private static final String DOT = ".";
private static final String DEFAULTP = "defaultp";
@@ -58,10 +66,10 @@ public class InterfacesOperationsConverter {
public static final String SELF = "SELF";
private static final String LOCAL_INTERFACE_TYPE = "Local";
- private PropertyConvertor propertyConvertor;
+ private final PropertyConvertor propertyConvertor;
@Autowired
- public InterfacesOperationsConverter(PropertyConvertor propertyConvertor) {
+ public InterfacesOperationsConverter(final PropertyConvertor propertyConvertor) {
this.propertyConvertor = propertyConvertor;
}
@@ -96,7 +104,7 @@ public class InterfacesOperationsConverter {
}
toscaInterfaceType.setOperations(toscaOperations);
Map<String, Object> interfacesAsMap = getObjectAsMap(toscaInterfaceType);
- Map<String, Object> operationsMap = (Map<String, Object>) interfacesAsMap.remove(OPERATIONS_KEY);
+ Map<String, Object> operationsMap = (Map<String, Object>) interfacesAsMap.remove(OPERATIONS.getElementName());
interfacesAsMap.putAll(operationsMap);
toscaInterfaceTypes.put(getInterfaceType(component, LOCAL_INTERFACE_TYPE), interfacesAsMap);
@@ -134,12 +142,12 @@ public class InterfacesOperationsConverter {
return getInterfacesMap(component, null, component.getInterfaces(), dataTypes, isAssociatedComponent, false);
}
- public Map<String, Object> getInterfacesMap(Component component,
- ComponentInstance componentInstance,
- Map<String, InterfaceDefinition> interfaces,
- Map<String, DataTypeDefinition> dataTypes,
- boolean isAssociatedComponent,
- boolean isServiceProxyInterface) {
+ public Map<String, Object> getInterfacesMap(final Component component,
+ final ComponentInstance componentInstance,
+ final Map<String, InterfaceDefinition> interfaces,
+ final Map<String, DataTypeDefinition> dataTypes,
+ final boolean isAssociatedComponent,
+ final boolean isServiceProxyInterface) {
if(MapUtils.isEmpty(interfaces)) {
return null;
}
@@ -155,7 +163,7 @@ public class InterfacesOperationsConverter {
}
toscaInterfaceDefinition.setType(interfaceType);
final Map<String, OperationDataDefinition> operations = interfaceDefinition.getOperations();
- Map<String, Object> toscaOperations = new HashMap<>();
+ Map<String, Object> toscaOperationMap = new HashMap<>();
String operationArtifactPath;
for (Map.Entry<String, OperationDataDefinition> operationEntry : operations.entrySet()) {
@@ -169,12 +177,20 @@ public class InterfacesOperationsConverter {
toscaOperation.setDescription(operationEntry.getValue().getDescription());
fillToscaOperationInputs(operationEntry.getValue(), dataTypes, toscaOperation, isServiceProxyInterface);
- toscaOperations.put(operationEntry.getValue().getName(), toscaOperation);
+ toscaOperationMap.put(operationEntry.getValue().getName(), toscaOperation);
+ }
+ toscaInterfaceDefinition.setOperations(toscaOperationMap);
+
+ final Map<String, Object> interfaceInputMap = createInterfaceInputMap(interfaceDefinition, dataTypes);
+ if (!interfaceInputMap.isEmpty()) {
+ toscaInterfaceDefinition.setInputs(interfaceInputMap);
}
- toscaInterfaceDefinition.setOperations(toscaOperations);
Map<String, Object> interfaceDefAsMap = getObjectAsMap(toscaInterfaceDefinition);
- Map<String, Object> operationsMap = (Map<String, Object>) interfaceDefAsMap.remove(OPERATIONS_KEY);
+ if (interfaceDefAsMap.containsKey(INPUTS.getElementName())) {
+ handleDefaults((Map<String, Object>) interfaceDefAsMap.get(INPUTS.getElementName()));
+ }
+ Map<String, Object> operationsMap = (Map<String, Object>) interfaceDefAsMap.remove(OPERATIONS.getElementName());
if (isServiceProxyInterface) {
//Remove input type and copy default value directly into the proxy node template from the node type
handleServiceProxyOperationInputValue(operationsMap, interfaceType);
@@ -188,6 +204,22 @@ public class InterfacesOperationsConverter {
return toscaInterfaceDefinitions;
}
+ private Map<String, Object> createInterfaceInputMap(final InterfaceDefinition interfaceDefinition,
+ final Map<String, DataTypeDefinition> allDataTypeMap) {
+ final Map<String, InputDataDefinition> inputMap = interfaceDefinition.getInputs();
+ if (MapUtils.isEmpty(inputMap)) {
+ return Collections.emptyMap();
+ }
+ final Map<String, Object> toscaInterfaceInputMap = new HashMap<>();
+ for (final Entry<String, InputDataDefinition> inputEntry : inputMap.entrySet()) {
+ final InputDataDefinition inputDataDefinition = inputEntry.getValue();
+ final ToscaProperty toscaProperty = propertyConvertor
+ .convertProperty(allDataTypeMap, new PropertyDefinition(inputDataDefinition), PropertyType.INPUT);
+ toscaInterfaceInputMap.put(inputEntry.getKey(), new ToscaInput(toscaProperty));
+ }
+ return toscaInterfaceInputMap;
+ }
+
private static void handleServiceProxyOperationInputValue(Map<String, Object> operationsMap, String parentKey) {
for (Map.Entry<String, Object> operationEntry : operationsMap.entrySet()) {
final Object value = operationEntry.getValue();
@@ -223,7 +255,7 @@ public class InterfacesOperationsConverter {
* ToscaExportHandler so, any string Map key named "defaultp" will have its named changed to "default"
* @param operationsMap the map to update
*/
- private static void handleDefaults(Map<String, Object> operationsMap) {
+ private void handleDefaults(Map<String, Object> operationsMap) {
for (Map.Entry<String, Object> operationEntry : operationsMap.entrySet()) {
final Object value = operationEntry.getValue();
if (value instanceof Map) {
@@ -232,7 +264,7 @@ public class InterfacesOperationsConverter {
final String key = operationEntry.getKey();
if (key.equals(DEFAULTP)) {
Object removed = operationsMap.remove(key);
- operationsMap.put(DEFAULT, removed);
+ operationsMap.put(ToscaTagNamesEnum.DEFAULT.getElementName(), removed);
}
}
}
@@ -314,10 +346,9 @@ public class InterfacesOperationsConverter {
Map<String, Object> objectAsMap =
obj instanceof Map ? (Map<String, Object>) obj : objectMapper.convertValue(obj, Map.class);
- if (objectAsMap.containsKey(DEFAULT)) {
- Object defaultValue = objectAsMap.get(DEFAULT);
- objectAsMap.remove(DEFAULT);
- objectAsMap.put(DEFAULT_HAS_UNDERSCORE, defaultValue);
+ final String defaultEntry = DEFAULT.getElementName();
+ if (objectAsMap.containsKey(defaultEntry)) {
+ objectAsMap.put(DEFAULT_HAS_UNDERSCORE, objectAsMap.remove(defaultEntry));
}
return objectAsMap;
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaInterfaceDefinition.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaInterfaceDefinition.java
index 1d444e697a..2f4a3d8ac1 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaInterfaceDefinition.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaInterfaceDefinition.java
@@ -16,35 +16,20 @@
package org.openecomp.sdc.be.tosca.model;
import java.util.Map;
+import lombok.Getter;
+import lombok.Setter;
/**
* @author KATYR
* @since March 26, 2018
*/
-
+@Setter
+@Getter
public class ToscaInterfaceDefinition {
private String type;
- private Map<String, Object> operations; // ToscaLifecycleOperationDefinition <-> Object
-
- public String getType() {
- return type;
- }
-
- public void setType(String type) {
- this.type = type;
- }
-
- public Map<String, Object> getOperations() {
- return operations;
- }
-
-// public void setOperations(Map<String, Object> operations) {
-// this.operations = operations;
-// }
+ private Map<String, Object> operations;
+ private Map<String, Object> inputs;
- public void setOperations(Map<String,Object> toscaOperations) {
- this.operations = toscaOperations;
- }
}
diff --git a/catalog-be/src/main/resources/config/error-configuration.yaml b/catalog-be/src/main/resources/config/error-configuration.yaml
index 14b4ece4b0..96bfa245e3 100644
--- a/catalog-be/src/main/resources/config/error-configuration.yaml
+++ b/catalog-be/src/main/resources/config/error-configuration.yaml
@@ -2060,6 +2060,18 @@ errors:
message: "Error: Failed to delete interface operation.",
messageId: "SVC4702"
}
+ #SVC4732
+ INTERFACE_UNKNOWN: {
+ code: 400,
+ message: "Error: The interface '%1' does not exists in the database.",
+ messageId: "SVC4732"
+ }
+ #SVC4733
+ INTERFACE_OPERATION_NOT_DEFINED: {
+ code: 400,
+ message: "Error: The operation '%1' does not exists in the interface '%2'.",
+ messageId: "SVC4733"
+ }
#-----------SVC4692---------------------------
RESOURCE_LIFECYCLE_STATE_NOT_VALID: {
code: 400,
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java
index b497253118..336b8ec940 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java
@@ -22,7 +22,20 @@
package org.openecomp.sdc.be.components;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.when;
+
import fj.data.Either;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -32,6 +45,7 @@ import org.mockito.stubbing.Answer;
import org.openecomp.sdc.be.auditing.impl.AuditingManager;
import org.openecomp.sdc.be.components.impl.ImportUtils;
import org.openecomp.sdc.be.components.impl.ImportUtilsTest;
+import org.openecomp.sdc.be.components.impl.InterfaceDefinitionHandler;
import org.openecomp.sdc.be.components.impl.InterfaceOperationBusinessLogic;
import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic;
import org.openecomp.sdc.be.components.impl.ResourceImportManager;
@@ -63,27 +77,15 @@ import org.openecomp.sdc.common.impl.FSConfigurationSource;
import org.openecomp.sdc.exception.PolicyException;
import org.openecomp.sdc.exception.ResponseFormat;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.when;
-
public class ResourceImportManagerTest {
- private static ConfigurationManager configurationManager;
static ResourceImportManager importManager;
static AuditingManager auditingManager = Mockito.mock(AuditingManager.class);
static ResponseFormatManager responseFormatManager = Mockito.mock(ResponseFormatManager.class);
static ResourceBusinessLogic resourceBusinessLogic = Mockito.mock(ResourceBusinessLogic.class);
static InterfaceOperationBusinessLogic interfaceOperationBusinessLogic = Mockito.mock(InterfaceOperationBusinessLogic.class);
+ static InterfaceDefinitionHandler interfaceDefinitionHandler =
+ new InterfaceDefinitionHandler(interfaceOperationBusinessLogic);
static UserBusinessLogic userAdmin = Mockito.mock(UserBusinessLogic.class);
static ToscaOperationFacade toscaOperationFacade = Mockito.mock(ToscaOperationFacade.class);
@@ -93,17 +95,16 @@ public class ResourceImportManagerTest {
@BeforeClass
public static void beforeClass() {
- importManager = new ResourceImportManager(componentsUtils, capabilityTypeOperation);
+ importManager = new ResourceImportManager(componentsUtils, capabilityTypeOperation, interfaceDefinitionHandler);
importManager.setAuditingManager(auditingManager);
when(toscaOperationFacade.getLatestByToscaResourceName(Mockito.anyString())).thenReturn(Either.left(null));
importManager.setResponseFormatManager(responseFormatManager);
importManager.setResourceBusinessLogic(resourceBusinessLogic);
- importManager.setInterfaceOperationBusinessLogic(interfaceOperationBusinessLogic);
importManager.setToscaOperationFacade(toscaOperationFacade);
String appConfigDir = "src/test/resources/config/catalog-be";
ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
- configurationManager = new ConfigurationManager(configurationSource);
+ final ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
Configuration configuration = new Configuration();
configuration.setJanusGraphInMemoryGraph(true);
@@ -223,8 +224,9 @@ public class ResourceImportManagerTest {
interfaceTypes.put("tosca.interfaces.node.lifecycle.standard", interfaceDefinition);
when(interfaceOperationBusinessLogic.getAllInterfaceLifecycleTypes()).thenReturn(Either.left(interfaceTypes));
- ImmutablePair<Resource, ActionStatus> createResource = importManager.importNormativeResource(jsonContent, resourceMD, user, true, true);
- testSetInterfaceImplementation(createResource.left);
+ final ImmutablePair<Resource, ActionStatus> createResource = importManager
+ .importNormativeResource(jsonContent, resourceMD, user, true, true);
+ assertSetInterfaceImplementation(createResource.left);
}
@Test
@@ -342,12 +344,12 @@ public class ResourceImportManagerTest {
assertTrue(properties.containsKey("volume_id"));
propertyDefinition = properties.get("volume_id");
assertEquals("string", propertyDefinition.getType());
- assertTrue(!propertyDefinition.isRequired());
+ assertFalse(propertyDefinition.isRequired());
assertTrue(properties.containsKey("snapshot_id"));
propertyDefinition = properties.get("snapshot_id");
assertEquals("string", propertyDefinition.getType());
- assertTrue(!propertyDefinition.isRequired());
+ assertFalse(propertyDefinition.isRequired());
}
@@ -398,20 +400,19 @@ public class ResourceImportManagerTest {
}
- private void testSetInterfaceImplementation(Resource resource) {
- Map<String, InterfaceDefinition> interfaces = resource.getInterfaces();
+ private void assertSetInterfaceImplementation(final Resource resource) {
+ final Map<String, InterfaceDefinition> interfaces = resource.getInterfaces();
assertEquals(1, interfaces.size());
assertTrue(interfaces.containsKey("Standard"));
-
- InterfaceDefinition interfaceDefinition = interfaces.get("Standard");
+
+ final InterfaceDefinition interfaceDefinition = interfaces.get("Standard");
assertEquals("tosca.interfaces.node.lifecycle.Standard", interfaceDefinition.getType());
assertEquals("tosca.interfaces.node.lifecycle.standard", interfaceDefinition.getUniqueId());
- Map<String, OperationDataDefinition> operations = interfaceDefinition.getOperations();
+ final Map<String, OperationDataDefinition> operations = interfaceDefinition.getOperations();
assertEquals(1, operations.size());
- OperationDataDefinition operation = operations.get("configure");
+ final OperationDataDefinition operation = operations.get("configure");
assertEquals("'camunda/vnfConfigure'", operation.getImplementation().getArtifactName());
-
}
private void testSetDerivedFrom(Resource resource) {
@@ -421,19 +422,12 @@ public class ResourceImportManagerTest {
}
private void testSetMetaDataFromJson(Resource resource, UploadResourceInfo resourceMD) {
-
- // assertTrue( resource.getCategory().equals(resourceMD.getCategory())
- // );
assertEquals(resource.getDescription(), resourceMD.getDescription());
assertEquals(resource.getIcon(), resourceMD.getResourceIconPath());
assertEquals(resource.getName(), resourceMD.getName());
assertEquals(resource.getResourceVendorModelNumber(), resourceMD.getResourceVendorModelNumber());
assertEquals(resource.getContactId(), resourceMD.getContactId());
assertEquals(resource.getCreatorUserId(), resourceMD.getContactId());
-
- // assertTrue( resource.isAbstract() ==
- // Constants.ABSTRACT_CATEGORY.equals(resourceMD.getCategory()));
-
assertEquals(resourceMD.getTags().size(), resource.getTags().size());
for (String tag : resource.getTags()) {
assertTrue(resourceMD.getTags().contains(tag));
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ImportUtilsTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ImportUtilsTest.java
index 87875d8f20..9cd095b5b5 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ImportUtilsTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ImportUtilsTest.java
@@ -324,7 +324,7 @@ public class ImportUtilsTest {
PropertyDefinition property = properties.get("service_type");
assertTrue(property.getConstraints()!= null && property.getConstraints().size() == 1);
assertTrue(property.getConstraints().get(0) instanceof ValidValuesConstraint);
- assertTrue(((ValidValuesConstraint) property.getConstraints().get(0)).getValidValues() != null);
+ assertNotNull(((ValidValuesConstraint) property.getConstraints().get(0)).getValidValues());
List<String> validValues = ((ValidValuesConstraint) property.getConstraints().get(0)).getValidValues();
assertTrue(validValues.containsAll(Lists.newArrayList("firewall", "analyzer", "source-nat", "loadbalancer")));
@@ -334,7 +334,7 @@ public class ImportUtilsTest {
PropertyDefinition innerProperty = new PropertyDefinition(property.getSchema().getProperty());
List<PropertyConstraint> innerConstraints = innerProperty.getConstraints();
assertTrue(innerConstraints.get(0) instanceof ValidValuesConstraint);
- assertTrue(((ValidValuesConstraint) innerConstraints.get(0)).getValidValues() != null);
+ assertNotNull(((ValidValuesConstraint) innerConstraints.get(0)).getValidValues());
validValues = ((ValidValuesConstraint) innerConstraints.get(0)).getValidValues();
assertTrue(validValues.containsAll(Lists.newArrayList("management", "left", "right", "other")));
}
@@ -352,6 +352,10 @@ public class ImportUtilsTest {
Map<String, Map<String, Object>> expectedProperties = getElements(toscaJson, TypeUtils.ToscaTagNamesEnum.INPUTS);
compareProperties(expectedProperties, actualInputs.left().value());
+ actualInputs = ImportUtils.getInputs(toscaJson);
+ assertTrue(actualInputs.isLeft());
+ expectedProperties = getElements(toscaJson, TypeUtils.ToscaTagNamesEnum.INPUTS);
+ compareProperties(expectedProperties, actualInputs.left().value());
}
private void compareAttributes(Map<String, Map<String, Object>> expected, Map<String, AttributeDataDefinition> actual) {
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/InterfaceDefinitionHandlerTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/InterfaceDefinitionHandlerTest.java
new file mode 100644
index 0000000000..f819eceb43
--- /dev/null
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/InterfaceDefinitionHandlerTest.java
@@ -0,0 +1,174 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.aMapWithSize;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.hasItems;
+import static org.hamcrest.Matchers.hasSize;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.Mockito.when;
+
+import fj.data.Either;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import org.apache.commons.collections.MapUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.InputDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
+import org.openecomp.sdc.be.model.InterfaceDefinition;
+import org.yaml.snakeyaml.Yaml;
+
+@ExtendWith(MockitoExtension.class)
+class InterfaceDefinitionHandlerTest {
+
+ @Mock
+ private InterfaceOperationBusinessLogic interfaceOperationBusinessLogic;
+ private InterfaceDefinitionHandler interfaceDefinitionHandler;
+ private InterfaceDefinition interfaceLifecyleStandard;
+ private static final Path TEST_RESOURCE_PATH = Paths.get("src/test/resources/interfaceDefinition");
+ private static final String CREATE_OPERATION = "create";
+ private static final String DELETE_OPERATION = "delete";
+ private static final String START_OPERATION = "start";
+ private static final String STOP_OPERATION = "stop";
+ private static final String INTERFACE_TYPE = "tosca.interfaces.node.lifecycle.Standard";
+
+ @BeforeEach
+ void setUp() {
+ interfaceDefinitionHandler = new InterfaceDefinitionHandler(interfaceOperationBusinessLogic);
+ mockAllInterfacesLifecycle();
+ }
+
+ private void mockAllInterfacesLifecycle() {
+ final Map<String, InterfaceDefinition> interfaceTypes = new HashMap<>();
+ interfaceLifecyleStandard = new InterfaceDefinition();
+ interfaceLifecyleStandard.setType(INTERFACE_TYPE);
+ final Map<String, OperationDataDefinition> operations = new HashMap<>();
+ operations.put(CREATE_OPERATION, new OperationDataDefinition());
+ operations.put(START_OPERATION, new OperationDataDefinition());
+ operations.put(STOP_OPERATION, new OperationDataDefinition());
+ operations.put(DELETE_OPERATION, new OperationDataDefinition());
+ interfaceLifecyleStandard.setOperations(operations);
+ interfaceTypes.put(INTERFACE_TYPE, interfaceLifecyleStandard);
+ when(interfaceOperationBusinessLogic.getAllInterfaceLifecycleTypes()).thenReturn(Either.left(interfaceTypes));
+ }
+
+ @Test
+ void testCreateWithLegacyOperationDeclarationSuccess() throws FileNotFoundException {
+ final Map<String, Object> load = loadYaml(Paths.get("interfaceDefinition-legacy.yaml"));
+ final InterfaceDefinition actualInterfaceDefinition = interfaceDefinitionHandler.create(load);
+ assertInterfaceDefinition(actualInterfaceDefinition);
+ }
+
+ @Test
+ void testCreateWithOperationSuccess() throws FileNotFoundException {
+ final Map<String, Object> load = loadYaml(Paths.get("interfaceDefinition-tosca1.3.yaml"));
+ final InterfaceDefinition actualInterfaceDefinition = interfaceDefinitionHandler.create(load);
+ assertInterfaceDefinition(actualInterfaceDefinition);
+ }
+
+ private void assertInterfaceDefinition(final InterfaceDefinition actualInterfaceDefinition) {
+ interfaceLifecyleStandard.getOperations().keySet().forEach(operation ->
+ assertTrue(actualInterfaceDefinition.hasOperation(operation)));
+ assertThat("Interface type should be as expected", actualInterfaceDefinition.getType(),
+ equalTo(actualInterfaceDefinition.getType()));
+ assertThat("Interface should contain 2 inputs", actualInterfaceDefinition.getInputs(), aMapWithSize(2));
+ assertThat("Interface inputs should be as expected", actualInterfaceDefinition.getInputs().keySet(),
+ containsInAnyOrder("stringInput", "actionInput"));
+
+ final InputDataDefinition stringInput = actualInterfaceDefinition.getInputs().get("stringInput");
+ assertInput("string", "stringInput description", true, "defaultValue", "aStatus", stringInput);
+ final InputDataDefinition actionInput = actualInterfaceDefinition.getInputs().get("actionInput");
+ assertInput("org.openecomp.resource.datatypes.Action", null, false, null, null, actionInput);
+
+ final OperationDataDefinition createOperation = actualInterfaceDefinition.getOperations().get(CREATE_OPERATION);
+ assertOperation("'camunda/serviceSelect'", createOperation);
+
+ final OperationDataDefinition deleteOperation = actualInterfaceDefinition.getOperations().get(DELETE_OPERATION);
+ assertOperation("'camunda/serviceDeselect'", deleteOperation);
+
+ final Map<String, String> expectedInputMap = new HashMap<>();
+ expectedInputMap.put("action", "org.openecomp.resource.datatypes.Action");
+ final OperationDataDefinition startOperation = actualInterfaceDefinition.getOperations().get(START_OPERATION);
+ assertOperation("'camunda/executeAction'", expectedInputMap, startOperation);
+ final OperationDataDefinition stopOperation = actualInterfaceDefinition.getOperations().get(STOP_OPERATION);
+ assertOperation("'camunda/executeAction'", expectedInputMap, stopOperation);
+ }
+
+ private void assertOperation(final String implementation, final OperationDataDefinition actualOperation) {
+ assertOperation(implementation, Collections.emptyMap(), actualOperation);
+ }
+
+ private void assertOperation(final String implementation, final Map<String, String> inputNameTypeMap,
+ final OperationDataDefinition actualOperation) {
+ final ArtifactDataDefinition artifactDefinition = actualOperation.getImplementation();
+ assertThat("Implementation should be as expected", artifactDefinition.getArtifactName(), equalTo(implementation));
+ final ListDataDefinition<OperationInputDefinition> inputListDataDef = actualOperation.getInputs();
+ if (inputListDataDef == null) {
+ if (MapUtils.isNotEmpty(inputNameTypeMap)) {
+ final String expectedInputNames = String.join(",", inputNameTypeMap.keySet());
+ fail(String.format("No inputs were found, but some inputs are expected: %s", expectedInputNames));
+ }
+ return;
+ }
+
+ final String msgFormat = "Operation should have %s";
+ final List<OperationInputDefinition> inputList = inputListDataDef.getListToscaDataDefinition();
+ assertThat(String.format(msgFormat, "the expected quantity of inputs"), inputList, hasSize(inputNameTypeMap.size()));
+
+ final List<String> inputNames = inputList.stream()
+ .map(OperationInputDefinition::getName).collect(Collectors.toList());
+
+ assertThat(String.format(msgFormat, "the expected inputs"), inputNames,
+ hasItems(inputNameTypeMap.keySet().toArray(new String[0])));
+ }
+
+ private void assertInput(final String type, final String description, final Boolean required,
+ final String defaultValue, final String status, final InputDataDefinition actualInput) {
+ assertThat("Input type should be as expected", type, equalTo(actualInput.getType()));
+ assertThat("Input description should be as expected", description, equalTo(actualInput.getDescription()));
+ assertThat("Input required should be as expected", required, equalTo(required != null && required));
+ assertThat("Input default should be as expected", defaultValue, equalTo(actualInput.getDefaultValue()));
+ assertThat("Input status should be as expected", status, equalTo(actualInput.getStatus()));
+ }
+
+ private Map<String, Object> loadYaml(final Path filePathFromResource) throws FileNotFoundException {
+ final Path filePath = Paths.get(TEST_RESOURCE_PATH.toString(), filePathFromResource.toString());
+ final FileInputStream fileInputStream = new FileInputStream(filePath.toString());
+ return (Map<String, Object>) new Yaml().load(fileInputStream);
+ }
+} \ No newline at end of file
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsConverterTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverterTest.java
index 93a45ad20f..0281317b89 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsConverterTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverterTest.java
@@ -1,24 +1,42 @@
/*
- * Copyright © 2016-2018 European Support Limited
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
*/
-package org.openecomp.sdc.be.tosca.utils;
-
-import static org.mockito.Mockito.mock;
+package org.openecomp.sdc.be.tosca;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
import static org.openecomp.sdc.be.tosca.InterfacesOperationsConverter.SELF;
import static org.openecomp.sdc.be.tosca.InterfacesOperationsConverter.addInterfaceTypeElement;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.DEFAULT;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.DESCRIPTION;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.INPUTS;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.INTERFACES;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.NODE_TYPES;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.REQUIRED;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.TYPE;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -28,23 +46,23 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Objects;
import java.util.function.Function;
+import java.util.stream.Collectors;
import org.apache.commons.collections4.MapUtils;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.onap.sdc.tosca.services.YamlUtil;
import org.openecomp.sdc.be.DummyConfigurationManager;
-import org.openecomp.sdc.be.config.Configuration;
import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.InputDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
import org.openecomp.sdc.be.datatypes.elements.OperationOutputDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
import org.openecomp.sdc.be.model.Component;
import org.openecomp.sdc.be.model.DataTypeDefinition;
import org.openecomp.sdc.be.model.InputDefinition;
@@ -52,44 +70,40 @@ import org.openecomp.sdc.be.model.InterfaceDefinition;
import org.openecomp.sdc.be.model.Resource;
import org.openecomp.sdc.be.model.Service;
import org.openecomp.sdc.be.model.ServiceMetadataDefinition;
-import org.openecomp.sdc.be.tosca.InterfacesOperationsConverter;
-import org.openecomp.sdc.be.tosca.PropertyConvertor;
-import org.openecomp.sdc.be.tosca.ToscaExportHandler;
-import org.openecomp.sdc.be.tosca.ToscaRepresentation;
import org.openecomp.sdc.be.tosca.model.ToscaNodeType;
import org.openecomp.sdc.be.tosca.model.ToscaTemplate;
import org.openecomp.sdc.common.util.YamlToObjectConverter;
import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
+import org.yaml.snakeyaml.Yaml;
-@RunWith(MockitoJUnitRunner.class)
-public class InterfacesOperationsConverterTest {
+class InterfacesOperationsConverterTest {
private static final String MAPPED_PROPERTY_NAME = "mapped_property";
private static final String INPUT_NAME_PREFIX = "input_";
private static final String OUTPUT_NAME_PREFIX = "output_";
private static final String NODE_TYPE_NAME = "test";
- private String[] inputTypes = {"string", "integer", "float", "boolean"};
+ private final String[] inputTypes = {"string", "integer", "float", "boolean"};
private static ObjectMapper mapper;
- private Configuration.EnvironmentContext environmentContext = mock(Configuration.EnvironmentContext.class);
- DummyConfigurationManager dummyConfigurationManager = new DummyConfigurationManager();
private static final Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
private InterfacesOperationsConverter interfacesOperationsConverter;
- @BeforeClass
+ @BeforeAll
public static void setUp() {
+ //initialize the static configuration manager
+ new DummyConfigurationManager();
mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
- @Before
+ @BeforeEach
public void setUpBeforeTest() {
interfacesOperationsConverter =
new InterfacesOperationsConverter(new PropertyConvertor());
}
@Test
- public void addInterfaceTypeElementToResource() {
+ void addInterfaceTypeElementToResource() {
Component component = new Resource();
component.setNormalizedName("normalizedComponentName");
component.setComponentMetadataDefinition(new ServiceMetadataDefinition());
@@ -110,14 +124,14 @@ public class InterfacesOperationsConverterTest {
template.setInterface_types(interfaceTypeElement);
final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
- Assert.assertTrue(all(
+ assertTrue(all(
containsAll("NodeTypeName"),
containsNone("operations")
).apply(new String(toscaRepresentation.getMainYaml())));
}
@Test
- public void addInterfaceTypeElementToService() {
+ void addInterfaceTypeElementToService() {
Component component = new Service();
component.setNormalizedName("normalizedServiceComponentName");
component.setComponentMetadataDefinition(new ServiceMetadataDefinition());
@@ -138,14 +152,14 @@ public class InterfacesOperationsConverterTest {
template.setInterface_types(interfaceTypeElement);
final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
- Assert.assertTrue(all(
+ assertTrue(all(
containsAll("NodeTypeName"),
containsNone("operations")
).apply(new String(toscaRepresentation.getMainYaml())));
}
@Test
- public void addInterfaceDefinitionElementToResource() {
+ void addInterfaceDefinitionElementToResource() {
Component component = new Resource();
component.setNormalizedName("normalizedComponentName");
InterfaceDefinition addedInterface = new InterfaceDefinition();
@@ -167,7 +181,7 @@ public class InterfacesOperationsConverterTest {
final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
String mainYaml = new String(toscaRepresentation.getMainYaml());
- Assert.assertTrue(all(
+ assertTrue(all(
containsAll("resourceName:", "inputs:", "has description", MAPPED_PROPERTY_NAME, "com.some.resource.or.other.resourceName"),
containsNone("operations", "defaultp")
).apply(mainYaml));
@@ -176,7 +190,7 @@ public class InterfacesOperationsConverterTest {
}
@Test
- public void addInterfaceDefinitionElementToService() {
+ void addInterfaceDefinitionElementToService() {
Component component = new Service();
component.setNormalizedName("normalizedServiceComponentName");
InterfaceDefinition addedInterface = new InterfaceDefinition();
@@ -196,7 +210,7 @@ public class InterfacesOperationsConverterTest {
template.setNode_types(nodeTypes);
final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
String mainYaml = new String(toscaRepresentation.getMainYaml());
- Assert.assertTrue(all(
+ assertTrue(all(
containsAll("serviceName", "inputs:", "has description", MAPPED_PROPERTY_NAME, "com.some.service.or.other.serviceName"),
containsNone("operations", "defaultp")
).apply(mainYaml));
@@ -205,7 +219,7 @@ public class InterfacesOperationsConverterTest {
@Test
- public void testGetInterfaceAsMapServiceProxy() {
+ void testGetInterfaceAsMapServiceProxy() {
Component component = new Resource();
component.setNormalizedName("normalizedComponentName");
InterfaceDefinition addedInterface = new InterfaceDefinition();
@@ -227,7 +241,7 @@ public class InterfacesOperationsConverterTest {
final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
String mainYaml = new String(toscaRepresentation.getMainYaml());
- Assert.assertTrue(all(
+ assertTrue(all(
containsAll("resourceName:", "inputs:", "has description", MAPPED_PROPERTY_NAME, "com.some.resource.or.other.resourceName"),
containsNone("operations", "defaultp")
).apply(mainYaml));
@@ -235,7 +249,7 @@ public class InterfacesOperationsConverterTest {
}
@Test
- public void addInterfaceDefinitionElement_noInputs() {
+ void addInterfaceDefinitionElement_noInputs() {
Component component = new Resource();
component.setNormalizedName("normalizedComponentName");
InterfaceDefinition addedInterface = new InterfaceDefinition();
@@ -255,14 +269,14 @@ public class InterfacesOperationsConverterTest {
template.setNode_types(nodeTypes);
final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
- Assert.assertTrue(all(
+ assertTrue(all(
containsAll("resourceNameNoInputs", "has description", "com.some.resource.or.other.resourceName"),
containsNone("operations", INPUT_NAME_PREFIX, "defaultp")
).apply(new String(toscaRepresentation.getMainYaml())));
}
@Test
- public void addInterfaceDefinitionElementInputMappedToOtherOperationOutput() {
+ void addInterfaceDefinitionElementInputMappedToOtherOperationOutput() {
String addedInterfaceType = "com.some.resource.or.other.resourceNameInputMappedToOutput";
Component component = new Resource();
component.setNormalizedName("normalizedComponentName");
@@ -289,7 +303,7 @@ public class InterfacesOperationsConverterTest {
template.setNode_types(nodeTypes);
final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
String mainYaml = new String(toscaRepresentation.getMainYaml());
- Assert.assertTrue(all(
+ assertTrue(all(
containsAll("resourceNameInputMappedToOutput:", "inputs:"),
containsNone("operations")
).apply(mainYaml));
@@ -297,7 +311,7 @@ public class InterfacesOperationsConverterTest {
}
@Test
- public void addInterfaceDefinitionElementInputMappedToOtherOperationOutputFromOtherInterface() {
+ void addInterfaceDefinitionElementInputMappedToOtherOperationOutputFromOtherInterface() {
String addedInterfaceType = "com.some.resource.or.other.resourceNameInputMappedToOutput";
Component component = new Resource();
component.setNormalizedName("normalizedComponentName");
@@ -339,13 +353,83 @@ public class InterfacesOperationsConverterTest {
final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
String mainYaml = new String(toscaRepresentation.getMainYaml());
- Assert.assertTrue(all(
+ assertTrue(all(
containsAll("resourceNameInputMappedToOutput:", "inputs:"),
containsNone("operations")
).apply(mainYaml));
validateOperationInputs(mainYaml, 2, "name_for_op_1");
}
+ @Test
+ void interfaceWithInputsToscaExportTest() {
+ final Component component = new Service();
+ final InterfaceDefinition aInterfaceWithInput = new InterfaceDefinition();
+ final String interfaceName = "myInterfaceName";
+ final String interfaceType = "my.type." + interfaceName;
+ aInterfaceWithInput.setType(interfaceType);
+ final String input1Name = "input1";
+ final InputDataDefinition input1 = createInput("string", "input1 description", false, "input1 value");
+ final String input2Name = "input2";
+ final InputDataDefinition input2 = createInput("string", "input2 description", true, "input2 value");
+ final Map<String, InputDataDefinition> inputMap = new HashMap<>();
+ inputMap.put(input1Name, input1);
+ inputMap.put(input2Name, input2);
+ aInterfaceWithInput.setInputs(inputMap);
+ component.setInterfaces(new HashMap<>());
+ component.getInterfaces().put(interfaceName, aInterfaceWithInput);
+ final ToscaNodeType nodeType = new ToscaNodeType();
+ interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, dataTypes, false);
+ final ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null,
+ interfacesOperationsConverter);
+ final ToscaTemplate template = new ToscaTemplate("testService");
+ final Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
+ nodeTypes.put(NODE_TYPE_NAME, nodeType);
+ template.setNode_types(nodeTypes);
+ final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
+ final String toscaTemplateYaml = new String(toscaRepresentation.getMainYaml());
+ assertThat(toscaTemplateYaml, allOf(containsString(INPUTS.getElementName() + ":"), containsString(input1Name), containsString(interfaceName)));
+ validateInterfaceInputs(toscaTemplateYaml, interfaceName, inputMap);
+ }
+
+ private void validateInterfaceInputs(final String yaml, final String interfaceName, final Map<String, InputDataDefinition> expectedInputMap) {
+ String fixedMainYaml = yaml;
+ final String nullString = "null";
+ if (fixedMainYaml.startsWith(nullString)) {
+ fixedMainYaml = yaml.substring(nullString.length());
+ }
+ if (fixedMainYaml.endsWith(nullString)) {
+ fixedMainYaml = fixedMainYaml.substring(0, fixedMainYaml.length() - nullString.length());
+ }
+ final Map<String, Object> yamlMap = (Map<String, Object>) new Yaml().load(fixedMainYaml);
+ final Map<String, Object> nodeTypesMap = (Map<String, Object>) yamlMap.get(NODE_TYPES.getElementName());
+ final Map<String, Object> node = (Map<String, Object>) nodeTypesMap.get(NODE_TYPE_NAME);
+ final Map<String, Object> interfacesMap = (Map<String, Object>) node.get(INTERFACES.getElementName());
+ final Map<String, Object> interface1 = (Map<String, Object>) interfacesMap.get(interfaceName);
+ final Map<String, Object> actualInputsMap = (Map<String, Object>) interface1.get(INPUTS.getElementName());
+ assertThat(actualInputsMap.keySet(), containsInAnyOrder(expectedInputMap.keySet().toArray()));
+ expectedInputMap.forEach((inputName, inputDataDefinition) -> {
+ final Map<String, Object> actualInput = (Map<String, Object>) actualInputsMap.get(inputName);
+ compareInputYaml(inputName, actualInput, inputDataDefinition);
+ });
+ }
+
+ private void compareInputYaml(final String inputName, final Map<String, Object> actualInput,
+ final InputDataDefinition expectedInput) {
+ final String msgFormat = "%s should be equal in input %s";
+ String field = TYPE.getElementName();
+ assertThat(String.format(msgFormat, field, inputName),
+ actualInput.get(field), equalTo(expectedInput.getType()));
+ field = DESCRIPTION.getElementName();
+ assertThat(String.format(msgFormat, field, inputName),
+ actualInput.get(field), equalTo(expectedInput.getDescription()));
+ field = REQUIRED.getElementName();
+ assertThat(String.format(msgFormat, field, inputName),
+ actualInput.get(field), equalTo(expectedInput.getRequired()));
+ field = DEFAULT.getElementName();
+ assertThat(String.format(msgFormat, field, inputName),
+ actualInput.get(field), equalTo(expectedInput.getDefaultValue()));
+ }
+
@FunctionalInterface
interface MainYamlAssertion extends Function<String, Boolean> {}
@@ -383,6 +467,24 @@ public class InterfacesOperationsConverterTest {
}
}
+ private InputDataDefinition createInput(final String type, final String description, final Boolean isRequired,
+ final String defaultValue) {
+ final PropertyDataDefinition propertyDataDefinition = new PropertyDataDefinition();
+ if (type != null) {
+ propertyDataDefinition.setType(type);
+ }
+ if (description != null) {
+ propertyDataDefinition.setDescription(description);
+ }
+ if (defaultValue != null) {
+ propertyDataDefinition.setDefaultValue(defaultValue);
+ }
+ if (isRequired != null) {
+ propertyDataDefinition.setRequired(isRequired);
+ }
+ return new InputDataDefinition(propertyDataDefinition);
+ }
+
private ListDataDefinition<OperationInputDefinition> createInputs(Component component, int numOfInputs) {
ListDataDefinition<OperationInputDefinition> operationInputDefinitionList = new ListDataDefinition<>();
for (int i = 0; i < numOfInputs; i++) {
@@ -458,7 +560,11 @@ public class InterfacesOperationsConverterTest {
Map<String, Object> interfaces = toscaNodeType.getInterfaces();
for (Map.Entry<String, Object> interfaceEntry : interfaces.entrySet()) {
Map<String, Object> interfaceDefinition = mapper.convertValue(interfaceEntry.getValue(), Map.class);
- for (Map.Entry<String, Object> operationEntry : interfaceDefinition.entrySet()) {
+ final Map<String, Object> operationsMap = interfaceDefinition.entrySet().stream()
+ .filter(entry -> !INPUTS.getElementName().equals(entry.getKey()) &&
+ !TYPE.getElementName().equals(entry.getKey()))
+ .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
+ for (Map.Entry<String, Object> operationEntry : operationsMap.entrySet()) {
Object operationVal = operationEntry.getValue();
if (operationVal instanceof Map) {
//Since the inputs are mapped to output operations from only first interface so using that name
@@ -475,9 +581,9 @@ public class InterfacesOperationsConverterTest {
for (Map.Entry<String, Object> inputEntry : inputs.entrySet()) {
String[] inputNameSplit = inputEntry.getKey().split("_");
Map<String, Object> inputValueObject = (Map<String, Object>) inputEntry.getValue();
- Assert.assertEquals(inputNameSplit[1], inputValueObject.get("type"));
+ assertEquals(inputNameSplit[1], inputValueObject.get("type"));
Boolean expectedIsRequired = Integer.parseInt(inputNameSplit[2]) % 2 == 0;
- Assert.assertEquals(expectedIsRequired, inputValueObject.get("required"));
+ assertEquals(expectedIsRequired, inputValueObject.get("required"));
validateOperationInputDefinitionDefaultValue(interfaceType, operationName, inputNameSplit[1],
Integer.parseInt(inputNameSplit[2]), inputValueObject);
}
@@ -491,19 +597,19 @@ public class InterfacesOperationsConverterTest {
if(mappedInputValue.containsKey(ToscaFunctions.GET_PROPERTY.getFunctionName())) {
String mappedPropertyValue = MAPPED_PROPERTY_NAME + index;
List<String> mappedPropertyDefaultValue = (List<String>) mappedInputValue.get(ToscaFunctions.GET_PROPERTY.getFunctionName());
- Assert.assertEquals(2, mappedPropertyDefaultValue.size());
- Assert.assertTrue(mappedPropertyDefaultValue.contains(SELF));
- Assert.assertTrue(mappedPropertyDefaultValue.contains(mappedPropertyValue));
+ assertEquals(2, mappedPropertyDefaultValue.size());
+ assertTrue(mappedPropertyDefaultValue.contains(SELF));
+ assertTrue(mappedPropertyDefaultValue.contains(mappedPropertyValue));
} else if(mappedInputValue.containsKey(ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName())) {
List<String> mappedPropertyDefaultValue = (List<String>) mappedInputValue.get(ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName());
- Assert.assertEquals(4, mappedPropertyDefaultValue.size());
+ assertEquals(4, mappedPropertyDefaultValue.size());
String mappedPropertyValue = OUTPUT_NAME_PREFIX + inputType + "_" + index;
- Assert.assertTrue(mappedPropertyDefaultValue.contains(SELF));
- Assert.assertTrue(mappedPropertyDefaultValue.contains(interfaceType));
- Assert.assertTrue(mappedPropertyDefaultValue.contains(operationName));
- Assert.assertTrue(mappedPropertyDefaultValue.contains(mappedPropertyValue));
+ assertTrue(mappedPropertyDefaultValue.contains(SELF));
+ assertTrue(mappedPropertyDefaultValue.contains(interfaceType));
+ assertTrue(mappedPropertyDefaultValue.contains(operationName));
+ assertTrue(mappedPropertyDefaultValue.contains(mappedPropertyValue));
} else {
- Assert.fail("Invalid Tosca function in default value. Allowed values: "+ ToscaFunctions.GET_PROPERTY.getFunctionName() +
+ fail("Invalid Tosca function in default value. Allowed values: "+ ToscaFunctions.GET_PROPERTY.getFunctionName() +
"/"+ ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName());
}
}
@@ -522,9 +628,9 @@ public class InterfacesOperationsConverterTest {
Map<String, Object> operationInputs = (Map<String, Object>) operation.get("inputs");
for (Object inputValue : operationInputs.values()) {
Map<String, Object> inputValueAsMap = (Map<String, Object>) inputValue;
- Assert.assertFalse(inputValueAsMap.keySet().contains("type"));
- Assert.assertFalse(inputValueAsMap.keySet().contains("required"));
- Assert.assertFalse(inputValueAsMap.keySet().contains("default"));
+ assertFalse(inputValueAsMap.keySet().contains("type"));
+ assertFalse(inputValueAsMap.keySet().contains("required"));
+ assertFalse(inputValueAsMap.keySet().contains("default"));
}
}
}
@@ -532,7 +638,7 @@ public class InterfacesOperationsConverterTest {
}
@Test
- public void testAddInterfaceTypeElementGetCorrectLocalInterfaceName() {
+ void testAddInterfaceTypeElementGetCorrectLocalInterfaceName() {
Service service = new Service();
service.setComponentMetadataDefinition(new ServiceMetadataDefinition());
service.getComponentMetadataDefinition().getMetadataDataDefinition().setName("LocalInterface");
@@ -542,12 +648,12 @@ public class InterfacesOperationsConverterTest {
Map<String, Object> resultMap = InterfacesOperationsConverter.addInterfaceTypeElement(service,
Collections.singletonList("org.openecomp.interfaces.node.lifecycle.Standard"));
- Assert.assertTrue(MapUtils.isNotEmpty(resultMap)
+ assertTrue(MapUtils.isNotEmpty(resultMap)
&& resultMap.containsKey("org.openecomp.interfaces.node.lifecycle.LocalInterface"));
}
@Test
- public void testAddInterfaceTypeElementNoTypeChangeIfNotLocal() {
+ void testAddInterfaceTypeElementNoTypeChangeIfNotLocal() {
Service service = new Service();
service.setComponentMetadataDefinition(new ServiceMetadataDefinition());
service.getComponentMetadataDefinition().getMetadataDataDefinition().setName("LocalInterface");
@@ -557,7 +663,7 @@ public class InterfacesOperationsConverterTest {
Map<String, Object> resultMap = interfacesOperationsConverter.getInterfacesMap(service, null,
service.getInterfaces(), null, false, false);
- Assert.assertTrue(MapUtils.isNotEmpty(resultMap)
+ assertTrue(MapUtils.isNotEmpty(resultMap)
&& resultMap.containsKey("NotLocal"));
}
}
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/model/ToscaInterfaceDefinitionTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/model/ToscaInterfaceDefinitionTest.java
deleted file mode 100644
index b922d0d60d..0000000000
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/model/ToscaInterfaceDefinitionTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * SDC
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.sdc.be.tosca.model;
-
-import org.junit.Test;
-
-import java.util.Map;
-
-public class ToscaInterfaceDefinitionTest {
-
- private ToscaInterfaceDefinition createTestSubject() {
- return new ToscaInterfaceDefinition();
- }
-
- @Test
- public void testGetType() throws Exception {
- ToscaInterfaceDefinition testSubject;
- String result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.getType();
- }
-
- @Test
- public void testSetType() throws Exception {
- ToscaInterfaceDefinition testSubject;
- String type = "";
-
- // default test
- testSubject = createTestSubject();
- testSubject.setType(type);
- }
-
- @Test
- public void testGetOperations() throws Exception {
- ToscaInterfaceDefinition testSubject;
- Map<String, Object> result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.getOperations();
- }
-
- @Test
- public void testSetOperations() throws Exception {
- ToscaInterfaceDefinition testSubject;
- Map<String, Object> toscaOperations = null;
-
- // default test
- testSubject = createTestSubject();
- testSubject.setOperations(toscaOperations);
- }
-}
diff --git a/catalog-be/src/test/resources/config/catalog-be/error-configuration.yaml b/catalog-be/src/test/resources/config/catalog-be/error-configuration.yaml
index a28f31b1b0..50906d2624 100644
--- a/catalog-be/src/test/resources/config/catalog-be/error-configuration.yaml
+++ b/catalog-be/src/test/resources/config/catalog-be/error-configuration.yaml
@@ -2038,6 +2038,18 @@ errors:
message: "Error: Failed to delete interface operation.",
messageId: "SVC4702"
}
+ #SVC4732
+ INTERFACE_UNKNOWN: {
+ code: 400,
+ message: "Error: The interface '%1' does not exists in the database.",
+ messageId: "SVC4732"
+ }
+ #SVC4733
+ INTERFACE_OPERATION_NOT_DEFINED: {
+ code: 400,
+ message: "Error: The operation '%1' does not exists in the interface '%2'.",
+ messageId: "SVC4733"
+ }
#-----------SVC4692---------------------------
RESOURCE_LIFECYCLE_STATE_NOT_VALID: {
code: 400,
diff --git a/catalog-be/src/test/resources/interfaceDefinition/interfaceDefinition-legacy.yaml b/catalog-be/src/test/resources/interfaceDefinition/interfaceDefinition-legacy.yaml
new file mode 100644
index 0000000000..d12664be9d
--- /dev/null
+++ b/catalog-be/src/test/resources/interfaceDefinition/interfaceDefinition-legacy.yaml
@@ -0,0 +1,24 @@
+inputs:
+ stringInput:
+ type: string
+ description: stringInput description
+ required: true
+ default: defaultValue
+ status: aStatus
+ actionInput:
+ type: org.openecomp.resource.datatypes.Action
+type: tosca.interfaces.node.lifecycle.Standard
+create:
+ implementation: "camunda/serviceSelect"
+start:
+ implementation: "camunda/executeAction"
+ inputs:
+ action:
+ type: org.openecomp.resource.datatypes.Action
+stop:
+ implementation: "camunda/executeAction"
+ inputs:
+ action:
+ type: org.openecomp.resource.datatypes.Action
+delete:
+ implementation: "camunda/serviceDeselect" \ No newline at end of file
diff --git a/catalog-be/src/test/resources/interfaceDefinition/interfaceDefinition-tosca1.3.yaml b/catalog-be/src/test/resources/interfaceDefinition/interfaceDefinition-tosca1.3.yaml
new file mode 100644
index 0000000000..13dfb9a1fb
--- /dev/null
+++ b/catalog-be/src/test/resources/interfaceDefinition/interfaceDefinition-tosca1.3.yaml
@@ -0,0 +1,25 @@
+inputs:
+ stringInput:
+ type: string
+ description: stringInput description
+ required: true
+ default: defaultValue
+ status: aStatus
+ actionInput:
+ type: org.openecomp.resource.datatypes.Action
+type: tosca.interfaces.node.lifecycle.Standard
+operations:
+ create:
+ implementation: "camunda/serviceSelect"
+ start:
+ implementation: "camunda/executeAction"
+ inputs:
+ action:
+ type: org.openecomp.resource.datatypes.Action
+ stop:
+ implementation: "camunda/executeAction"
+ inputs:
+ action:
+ type: org.openecomp.resource.datatypes.Action
+ delete:
+ implementation: "camunda/serviceDeselect" \ No newline at end of file
diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
index 78d6c63e4c..09a941347c 100644
--- a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
+++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
@@ -125,6 +125,7 @@ public enum ActionStatus {
//Interface
INTERFACE_NOT_FOUND_IN_COMPONENT,
+ INTERFACE_UNKNOWN,
//InterfaceOperation
INTERFACE_OPERATION_NOT_FOUND, INTERFACE_OPERATION_NAME_ALREADY_IN_USE, INTERFACE_OPERATION_NAME_MANDATORY,
@@ -134,6 +135,7 @@ public enum ActionStatus {
INTERFACE_OPERATION_INPUT_NAME_MANDATORY, INTERFACE_OPERATION_OUTPUT_NAME_MANDATORY,
INTERFACE_OPERATION_INPUT_PROPERTY_NOT_FOUND_IN_COMPONENT, INTERFACE_OPERATION_INVALID_FOR_LOCAL_TYPE,
INTERFACE_OPERATION_INVALID_FOR_GLOBAL_TYPE,
+ INTERFACE_OPERATION_NOT_DEFINED,
PROPERTY_USED_BY_OPERATION, DECLARED_INPUT_USED_BY_OPERATION,
INVALID_CONSUMPTION_TYPE,
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/InterfaceDefinition.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/InterfaceDefinition.java
index e3b5d08bc1..204d484937 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/InterfaceDefinition.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/InterfaceDefinition.java
@@ -21,13 +21,12 @@
package org.openecomp.sdc.be.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
+import java.util.Map;
+import java.util.stream.Collectors;
import org.apache.commons.collections.MapUtils;
import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
-import java.util.Map;
-import java.util.stream.Collectors;
-
/**
* Definition of the operations that can be performed on (instances of) a Node
* Type.
@@ -36,8 +35,6 @@ import java.util.stream.Collectors;
*/
public class InterfaceDefinition extends InterfaceDataDefinition implements IOperationParameter {
- private boolean definition;
-
public InterfaceDefinition() {
super();
}
@@ -56,10 +53,6 @@ public class InterfaceDefinition extends InterfaceDataDefinition implements IOpe
return false;
}
- public void setDefinition(boolean definition) {
- this.definition = definition;
- }
-
@JsonIgnore
public Map<String, Operation> getOperationsMap() {
return getOperations().entrySet()
@@ -79,9 +72,18 @@ public class InterfaceDefinition extends InterfaceDataDefinition implements IOpe
setOperations(convertedOperation);
}
- @Override
- public String toString() {
- return "InterfaceDefinition [definition=" + definition + "]";
+ /**
+ * Checks if the interface has the given operation
+ * @param operation the operation to check
+ * @return {@code true} if the operation exists, {@code false} otherwise
+ */
+ public boolean hasOperation(final String operation) {
+ final Map<String, OperationDataDefinition> operationMap = getOperations();
+ if (MapUtils.isEmpty(operationMap)) {
+ return false;
+ }
+ return operationMap.keySet().stream()
+ .anyMatch(operation1 -> operation1.equalsIgnoreCase(operation));
}
}
diff --git a/catalog-model/src/test/java/org/openecomp/sdc/be/model/InterfaceDefinitionTest.java b/catalog-model/src/test/java/org/openecomp/sdc/be/model/InterfaceDefinitionTest.java
index 992ae9bae8..43761b3369 100644
--- a/catalog-model/src/test/java/org/openecomp/sdc/be/model/InterfaceDefinitionTest.java
+++ b/catalog-model/src/test/java/org/openecomp/sdc/be/model/InterfaceDefinitionTest.java
@@ -20,64 +20,53 @@
package org.openecomp.sdc.be.model;
-import org.junit.Test;
-import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
+import org.junit.jupiter.api.Test;
+import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
-public class InterfaceDefinitionTest {
-
- private InterfaceDefinition createTestSubject() {
- return new InterfaceDefinition();
- }
+class InterfaceDefinitionTest {
@Test
- public void testCtor() throws Exception {
+ void testCtor() throws Exception {
new InterfaceDefinition(new InterfaceDataDefinition());
new InterfaceDefinition("mock", "mock", new HashMap<>());
}
@Test
- public void testIsDefinition() throws Exception {
- InterfaceDefinition testSubject;
- boolean result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.isDefinition();
+ void testIsDefinition() {
+ final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
+ assertFalse(interfaceDefinition.isDefinition());
}
@Test
- public void testSetDefinition() throws Exception {
- InterfaceDefinition testSubject;
- boolean definition = false;
-
- // default test
- testSubject = createTestSubject();
- testSubject.setDefinition(definition);
+ void testGetOperationsMap() {
+ final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
+ assertNotNull(interfaceDefinition.getOperationsMap());
+ assertTrue(interfaceDefinition.getOperationsMap().isEmpty());
}
@Test
- public void testGetOperationsMap() throws Exception {
- InterfaceDefinition testSubject;
- Map<String, Operation> result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.getOperationsMap();
- }
-
-
-
- @Test
- public void testToString() throws Exception {
- InterfaceDefinition testSubject;
- String result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.toString();
+ void testHasOperation() {
+ final InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
+ final Map<String, Operation> operationMap = new HashMap<>();
+ final Set<String> operationSet = new HashSet<>();
+ operationSet.add("operation1");
+ operationSet.add("operation2");
+ operationSet.add("operation3");
+ operationSet.forEach(operation -> operationMap.put(operation, new Operation()));
+ interfaceDefinition.setOperationsMap(operationMap);
+
+ operationSet.forEach(operation -> assertThat(String.format("Should contain operation: %s", operation),
+ interfaceDefinition.hasOperation(operation), is(true)));
}
}
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InputDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InputDataDefinition.java
index 422b7eac6c..ef2932a50b 100644
--- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InputDataDefinition.java
+++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InputDataDefinition.java
@@ -24,10 +24,6 @@ import java.util.Map;
public class InputDataDefinition extends PropertyDataDefinition {
- private String label;
- private Boolean hidden;
- private Boolean immutable;
-
InputDataDefinition() {
super();
}
@@ -43,31 +39,7 @@ public class InputDataDefinition extends PropertyDataDefinition {
this.setImmutable(p.isImmutable());
}
- InputDataDefinition(PropertyDataDefinition p) {
+ public InputDataDefinition(PropertyDataDefinition p) {
super(p);
}
-
- public Boolean isHidden() {
- return hidden;
- }
-
- public void setHidden(Boolean hidden) {
- this.hidden = hidden;
- }
-
- public Boolean isImmutable() {
- return immutable;
- }
-
- public void setImmutable(Boolean immutable) {
- this.immutable = immutable;
- }
-
- public String getLabel() {
- return label;
- }
-
- public void setLabel(String label) {
- this.label = label;
- }
}
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinition.java
index a264d4618f..760802ec39 100644
--- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinition.java
+++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinition.java
@@ -36,7 +36,6 @@ public class InterfaceDataDefinition extends ToscaDataDefinition implements Seri
this();
setType(type);
setDescription(description);
-
}
@JsonCreator
@@ -45,12 +44,13 @@ public class InterfaceDataDefinition extends ToscaDataDefinition implements Seri
setOperations(new HashMap<>());
}
- public InterfaceDataDefinition(InterfaceDataDefinition p) {
- setUniqueId(p.getUniqueId());
- setType(p.getType());
- setDescription(p.getDescription());
- setToscaResourceName(p.getToscaResourceName());
- setOperations(p.getOperations());
+ public InterfaceDataDefinition(final InterfaceDataDefinition interfaceDataDefinition) {
+ setUniqueId(interfaceDataDefinition.getUniqueId());
+ setType(interfaceDataDefinition.getType());
+ setDescription(interfaceDataDefinition.getDescription());
+ setToscaResourceName(interfaceDataDefinition.getToscaResourceName());
+ setOperations(interfaceDataDefinition.getOperations());
+ setInputs(interfaceDataDefinition.getInputs());
}
public String getUniqueId() {
@@ -61,10 +61,6 @@ public class InterfaceDataDefinition extends ToscaDataDefinition implements Seri
setToscaPresentationValue(JsonPresentationFields.UNIQUE_ID, uniqueId);
}
- public String getType() {
- return (String) getToscaPresentationValue(JsonPresentationFields.TYPE);
- }
-
public void setType(String type) {
setToscaPresentationValue(JsonPresentationFields.TYPE, type);
}
@@ -120,4 +116,12 @@ public class InterfaceDataDefinition extends ToscaDataDefinition implements Seri
public void setLastUpdateDate(Long lastUpdateDate) {
setToscaPresentationValue(JsonPresentationFields.LAST_UPDATE_DATE, lastUpdateDate);
}
+
+ public Map<String, InputDataDefinition> getInputs() {
+ return (Map<String, InputDataDefinition>) getToscaPresentationValue(JsonPresentationFields.INTERFACE_INPUT);
+ }
+
+ public void setInputs(final Map<String, InputDataDefinition> inputs) {
+ setToscaPresentationValue(JsonPresentationFields.INTERFACE_INPUT, inputs);
+ }
}
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/JsonPresentationFields.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/JsonPresentationFields.java
index 76697a7223..436f958893 100644
--- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/JsonPresentationFields.java
+++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/JsonPresentationFields.java
@@ -249,6 +249,7 @@ public enum JsonPresentationFields {
//Interface
INTERFACES("interfaces", null),
+ INTERFACE_INPUT("input", null),
OPERATIONS("operations", null),
OPERATION_IMPLEMENTATION("implementation", null),
OPERATION_INPUTS("inputs", null),
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java b/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java
index a1b14b70ca..ee8c7db4f2 100644
--- a/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java
+++ b/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java
@@ -48,6 +48,7 @@ public class TypeUtils {
PROPERTIES("properties"), TYPE("type"), STATUS("status"),
ENTRY_SCHEMA("entry_schema"), REQUIRED("required"), DESCRIPTION("description"),
DEFAULT_VALUE("default"), VALUE("value"), CONSTRAINTS("constraints"),
+ DEFAULT("default"),
// Group Types
MEMBERS("members"), METADATA("metadata"),
// Policy Types
@@ -71,6 +72,8 @@ public class TypeUtils {
GET_INPUT("get_input"),
// Definitions
DATA_TYPES("data_types"), NODE_TYPES("node_types"), IMPORTS("imports"),
+ //Operations
+ IMPLEMENTATION("implementation"),
DERIVED_FROM_NAME("derivedFromName");
diff --git a/common-be/src/test/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinitionTest.java b/common-be/src/test/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinitionTest.java
index 1393a095b5..1c0d84df2a 100644
--- a/common-be/src/test/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinitionTest.java
+++ b/common-be/src/test/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinitionTest.java
@@ -20,12 +20,14 @@
package org.openecomp.sdc.be.datatypes.elements;
-import org.junit.Test;
-
+import java.util.HashMap;
import java.util.Map;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
-public class InterfaceDataDefinitionTest {
+class InterfaceDataDefinitionTest {
private InterfaceDataDefinition createTestSubject() {
return new InterfaceDataDefinition();
@@ -174,4 +176,14 @@ public class InterfaceDataDefinitionTest {
testSubject = createTestSubject();
testSubject.setOperations(operations);
}
+
+ @Test
+ void testInputs() {
+ final InterfaceDataDefinition interfaceDataDefinition = new InterfaceDataDefinition();
+ final HashMap<String, InputDataDefinition> anInputMap = new HashMap<>();
+ anInputMap.put("anyEntry", new InputDataDefinition());
+ interfaceDataDefinition.setInputs(anInputMap);
+ Assertions.assertEquals(interfaceDataDefinition.getInputs(),
+ interfaceDataDefinition.getToscaPresentationValue(JsonPresentationFields.INTERFACE_INPUT));
+ }
}