X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Fnbi%2Fapis%2Fservicecatalog%2FToscaInfosProcessor.java;h=2046ecfb54b006736392a2d545d5293c83061803;hb=6a0991f60e8d1962e70c7c18c985b6c652564311;hp=d71595ff50802c6854382e236a0a2b441835b838;hpb=49954e7bd4cef8743611b15f0bc2cc769e8e7c49;p=externalapi%2Fnbi.git diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java b/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java index d71595f..2046ecf 100644 --- a/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java +++ b/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java @@ -11,27 +11,44 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ + package org.onap.nbi.apis.servicecatalog; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.sql.Timestamp; +import java.nio.file.Path; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.io.FileUtils; -import org.onap.nbi.exceptions.TechnicalException; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.onap.nbi.apis.serviceorder.model.consumer.VFModelInfo; +import org.onap.sdc.tosca.parser.api.IEntityDetails; +import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.tosca.parser.elements.queries.EntityQuery; +import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery; +import org.onap.sdc.tosca.parser.enums.SdcTypes; +import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; +import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; +import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.elements.Metadata; +import org.onap.sdc.toscaparser.api.functions.GetInput; +import org.onap.sdc.toscaparser.api.parameters.Input; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import io.swagger.models.Model; +import io.swagger.models.ModelImpl; +import io.swagger.models.properties.Property; +import io.swagger.models.properties.PropertyBuilder; +import io.swagger.util.Json; @Service public class ToscaInfosProcessor { @@ -39,230 +56,262 @@ public class ToscaInfosProcessor { @Autowired SdcClient sdcClient; + @Autowired + private ServiceSpecificationDBManager serviceSpecificationDBManager; + + private Set vnfInstanceParams = new HashSet(Arrays.asList("onap_private_net_id", + "onap_private_subnet_id", "pub_key", "sec_group", "install_script_version", "demo_artifacts_version", + "cloud_env", "public_net_id", "aic-cloud-region", "image_name", "flavor_name", "skip_post_instantiation_configuration")); + final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind private static final Logger LOGGER = LoggerFactory.getLogger(ToscaInfosProcessor.class); - public void buildResponseWithToscaInfos(LinkedHashMap toscaInfosTopologyTemplate, - LinkedHashMap serviceCatalogResponse) { - if (toscaInfosTopologyTemplate.get("inputs") != null) { + public void buildResponseWithSdcToscaParser(Path path, Map serviceCatalogResponse) throws SdcToscaParserException { + + SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); + ISdcCsarHelper sdcCsarHelper = factory.getSdcCsarHelper(path.toFile().getAbsolutePath(), false); + List inputs = sdcCsarHelper.getServiceInputs(); + if (inputs != null && inputs.size() > 0) { ArrayList serviceSpecCharacteristic = new ArrayList(); - LinkedHashMap toscaInfos = (LinkedHashMap) toscaInfosTopologyTemplate.get("inputs"); - for (Object key : toscaInfos.keySet()) { - String keyString = (String) key; - LinkedHashMap inputParameter = (LinkedHashMap) toscaInfos.get(key); + for (Input input : inputs) { LinkedHashMap mapParameter = new LinkedHashMap(); - String parameterType = (String) inputParameter.get("type"); - mapParameter.put("name", keyString); - mapParameter.put("description", inputParameter.get("description")); - mapParameter.put("valueType", parameterType); + mapParameter.put("name", input.getName()); + mapParameter.put("description", input.getDescription()); + mapParameter.put("valueType", input.getType()); mapParameter.put("@type", "ONAPserviceCharacteristic"); - mapParameter.put("required", inputParameter.get("required")); - mapParameter.put("status", inputParameter.get("status")); - List serviceSpecCharacteristicValues = - buildServiceSpecCharacteristicsValues(inputParameter, parameterType); - mapParameter.put("serviceSpecCharacteristicValue", serviceSpecCharacteristicValues); + mapParameter.put("required", input.isRequired()); + mapParameter.put("status", null); + mapParameter.put("serviceSpecCharacteristicValue", null); + // If this Input has a default value, then put it in serviceSpecCharacteristicValue + if (input.getDefault() != null) { + List serviceSpecCharacteristicValues = + buildServiceSpecCharacteristicsValuesFromSdc(input); + mapParameter.put("serviceSpecCharacteristicValue", serviceSpecCharacteristicValues); + } serviceSpecCharacteristic.add(mapParameter); } - serviceCatalogResponse.put("serviceSpecCharacteristic", serviceSpecCharacteristic); } - LinkedHashMap nodeTemplate = (LinkedHashMap) toscaInfosTopologyTemplate.get("node_templates"); + List nodeTemplates = sdcCsarHelper.getServiceNodeTemplates(); List resourceSpecifications = (List) serviceCatalogResponse.get("resourceSpecification"); for (LinkedHashMap resourceSpecification : resourceSpecifications) { - String id = (String) resourceSpecification.get("id"); - LOGGER.debug("get tosca infos for service id: " + id); - LinkedHashMap toscaInfosFromResourceId = getToscaInfosFromResourceUUID(nodeTemplate, id); - if (toscaInfosFromResourceId != null) { - resourceSpecification.put("modelCustomizationId", toscaInfosFromResourceId.get("customizationUUID")); - resourceSpecification.put("modelCustomizationName", toscaInfosFromResourceId.get("name")); - } - - } - } - - private List buildServiceSpecCharacteristicsValues(LinkedHashMap parameter, String parameterType) { - List serviceSpecCharacteristicValues = new ArrayList<>(); - if (!"map".equalsIgnoreCase(parameterType) && !"list".equalsIgnoreCase(parameterType)) { - LOGGER.debug("get tosca infos for serviceSpecCharacteristicValues of type map or string : " + parameter); - Object aDefault = parameter.get("default"); - if (parameter.get("entry_schema") != null) { - ArrayList entrySchema = (ArrayList) parameter.get("entry_schema"); - if (CollectionUtils.isNotEmpty(entrySchema)) { - buildCharacteristicValuesFormShema(parameterType, serviceSpecCharacteristicValues, aDefault, - entrySchema); - } - } - } - return serviceSpecCharacteristicValues; - } - - private void buildCharacteristicValuesFormShema(String parameterType, - List serviceSpecCharacteristicValues, Object aDefault, ArrayList entry_schema) { - LinkedHashMap constraints = (LinkedHashMap) entry_schema.get(0); - if (constraints != null) { - ArrayList constraintsList = (ArrayList) constraints.get("constraints"); - if (CollectionUtils.isNotEmpty(constraintsList)) { - LinkedHashMap valuesMap = (LinkedHashMap) constraintsList.get(0); - if (valuesMap != null) { - List values = (List) valuesMap.get("valid_values"); - for (Object value : values) { - String stringValue = value.toString(); - LinkedHashMap serviceSpecCharacteristicValue = new LinkedHashMap(); - serviceSpecCharacteristicValue.put("isDefault", - aDefault != null && aDefault.toString().equals(stringValue)); - serviceSpecCharacteristicValue.put("value", stringValue); - serviceSpecCharacteristicValue.put("valueType", parameterType); - serviceSpecCharacteristicValues.add(serviceSpecCharacteristicValue); + if (resourceSpecification.get("id") != null) { + String id = (String) resourceSpecification.get("id"); + LOGGER.debug("get tosca infos for service id: {}", id); + NodeTemplate nodeTemplate = null; + for (NodeTemplate node : nodeTemplates) { + if (node.getMetaData().getValue("UUID").equals(id)) { + nodeTemplate = node; + break; } } + if (nodeTemplate == null) + continue; + resourceSpecification.put("modelCustomizationId", + sdcCsarHelper.getNodeTemplateCustomizationUuid(nodeTemplate)); } } } + private List buildServiceSpecCharacteristicsValuesFromSdc(Input input) { - private LinkedHashMap getToscaInfosFromResourceUUID(LinkedHashMap node_templates, String name) { - for (Object nodeTemplateObject : node_templates.values()) { - LinkedHashMap nodeTemplate = (LinkedHashMap) nodeTemplateObject; - LinkedHashMap metadata = (LinkedHashMap) nodeTemplate.get("metadata"); - String metadataUUID = (String) metadata.get("UUID"); - String metadataType = (String) metadata.get("type"); - if ("VF".equalsIgnoreCase(metadataType) && name.equalsIgnoreCase(metadataUUID)) { - return metadata; - } - } - return null; - } - - - public LinkedHashMap getToscaInfos(LinkedHashMap sdcResponse) { - - LinkedHashMap topologyTemplate = null; - - String toscaModelUrl = (String) sdcResponse.get("toscaModelURL"); - String serviceId = (String) sdcResponse.get("uuid"); - File toscaFile = sdcClient.callGetWithAttachment(toscaModelUrl); - Timestamp timestamp = new Timestamp(System.currentTimeMillis()); - String tempFolderName = serviceId + timestamp; - File folderTemp = null; - - try { - unZipArchive(toscaFile.getName(), tempFolderName); - folderTemp = new File(tempFolderName); - LOGGER.debug("temp folder for tosca files : " + folderTemp.getName()); - - LinkedHashMap toscaMetaFileHashMap = parseToscaFile(tempFolderName + "/TOSCA-Metadata/TOSCA.meta"); - if (toscaMetaFileHashMap.get("Entry-Definitions") == null) { - throw new NullPointerException("no Entry-Definitions node in TOSCA.meta"); - } - String toscaFilePath = (String) toscaMetaFileHashMap.get("Entry-Definitions"); - LinkedHashMap toscaFileHashMap = parseToscaFile(tempFolderName + "/" + toscaFilePath); - - if (toscaFileHashMap.get("topology_template") == null) { - throw new NullPointerException("no topology_template node in tosca file"); - } - topologyTemplate = (LinkedHashMap) toscaFileHashMap.get("topology_template"); - - } catch (NullPointerException e) { - LOGGER.warn("unable to parse tosca file for id : " + serviceId, e); - return null; - - } finally { - - try { - LOGGER.debug("deleting temp folder for tosca files : " + folderTemp.getName()); - FileUtils.deleteDirectory(folderTemp); - LOGGER.debug("deleting tosca archive : " + toscaFile.getName()); - FileUtils.forceDelete(toscaFile); - return topologyTemplate; - - } catch (IOException e) { - LOGGER.error("unable to delete temp directory tosca file for id : " + serviceId, e); - return null; - } - } - - } - + List serviceSpecCharacteristicValues = new ArrayList<>(); + LinkedHashMap serviceSpecCharacteristicValue = new LinkedHashMap(); - private LinkedHashMap parseToscaFile(String fileName) { + serviceSpecCharacteristicValue.put("isDefault", true); + serviceSpecCharacteristicValue.put("value", input.getDefault()); + serviceSpecCharacteristicValue.put("valueType", input.getType()); + serviceSpecCharacteristicValues.add(serviceSpecCharacteristicValue); - File toscaFile = new File(fileName); - if (!toscaFile.exists()) { - throw new TechnicalException("unable to find file : " + fileName); - } - try { - return (LinkedHashMap) mapper.readValue(toscaFile, Object.class); - } catch (IOException e) { - LOGGER.warn("unable to parse tosca file : " + fileName, e); - throw new TechnicalException("Unable to parse tosca file : " + fileName); - - } catch (NullPointerException e) { - LOGGER.warn("unable to find tosca file : " + fileName, e); - throw new TechnicalException("unable to find tosca file : " + fileName); - } + return serviceSpecCharacteristicValues; } - - /** - * Unzip it - * - * @param zipFile input zip file - * @param outputFolder zip file output folder - */ - private void unZipArchive(String zipFile, String outputFolder) { - - byte[] buffer = new byte[1024]; - - try { - - // create output directory is not exists - File folder = new File(outputFolder); - if (!folder.exists()) { - folder.mkdir(); - } - - // get the zip file content - try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) { - // get the zipped file list entry - ZipEntry ze = zis.getNextEntry(); - - while (ze != null) { - - String fileName = ze.getName(); - File newFile = new File(outputFolder + File.separator + fileName); - - LOGGER.debug("File to unzip : " + newFile.getAbsoluteFile()); - - // create all non exists folders - // else you will hit FileNotFoundException for compressed folder - new File(newFile.getParent()).mkdirs(); - - try (FileOutputStream fos = new FileOutputStream(newFile)) { - - int len; - while ((len = zis.read(buffer)) > 0) { - fos.write(buffer, 0, len); - } - - fos.close(); - } - ze = zis.getNextEntry(); - } - - zis.closeEntry(); - zis.close(); - } - - LOGGER.debug("Done"); - - } catch (IOException ex) { - LOGGER.error("Error while unzipping ToscaModel archive from ONAP", ex); - throw new TechnicalException("Error while unzipping ToscaModel archive from ONAP"); + public void buildAndSaveResponseWithSdcToscaParser(Path path, Map serviceCatalogResponse) + throws SdcToscaParserException { + + SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); + ISdcCsarHelper sdcCsarHelper = factory.getSdcCsarHelper(path.toFile().getAbsolutePath(), false); + List inputs = sdcCsarHelper.getServiceInputs(); + + List vfEntityList = sdcCsarHelper.getEntity(EntityQuery.newBuilder(SdcTypes.VF).build(), + TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE).build(), false); + + Map groupProperties = null; + Map listOfInstanceParameters = new HashMap<>(); + if (!vfEntityList.isEmpty()) { + + IEntityDetails iEntityDetails = vfEntityList.get(0); + groupProperties = iEntityDetails.getProperties(); + + for (String key : groupProperties.keySet()) { + org.onap.sdc.toscaparser.api.Property property = groupProperties.get(key); + String paramName = property.getName(); + if (paramName != null) { + if (vnfInstanceParams.stream() + .filter(vnfInstanceParam -> vnfInstanceParam.equalsIgnoreCase(paramName)).findFirst() + .isPresent()) { + listOfInstanceParameters.put(paramName, property.getValue().toString()); + } + } + } + + } + + // it will build Entity as VfModules + List vfModuleEntityList = sdcCsarHelper.getEntity( + EntityQuery.newBuilder("org.openecomp.groups.VfModule").build(), + TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .customizationUUID(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID).build(), + false); + List listOfVfModelInfo = new ArrayList<>(); + + if (!vfModuleEntityList.isEmpty()) { + // Fetching vfModule metadata in a loop + for (IEntityDetails vfModuleEntity : vfModuleEntityList) { + VFModelInfo vfModel = new VFModelInfo(); + Metadata vfMetadata = vfModuleEntity.getMetadata(); + // Preparing VFModel + vfModel.setModelInvariantUuid( + testNull(vfMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID))); + vfModel.setModelName(testNull(vfMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELNAME))); + vfModel.setModelUuid(testNull(vfMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELUUID))); + vfModel.setModelVersion( + testNull(vfMetadata.getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELVERSION))); + vfModel.setModelCustomizationUuid(testNull(vfMetadata.getValue("vfModuleModelCustomizationUUID"))); + + // Adding it to the list + listOfVfModelInfo.add(vfModel); + } + } + + Map definitions = new HashMap(); + Model model = new ModelImpl(); + + if (!inputs.isEmpty() && inputs.size() > 0) { + for (Input input : inputs) { + Property property = null; + if (input.getType().equals("list") || input.getType().equals("map")) + property = PropertyBuilder.build("array", null, null); + else + property = PropertyBuilder.build(input.getType(), null, null); + + property.setDescription(input.getDescription()); + property.setRequired(input.isRequired()); + + if (input.getDefault() != null) { + property.setDefault(input.getDefault().toString()); + } + ((ModelImpl) model).addProperty(input.getName(), property); + } + definitions.put("ServiceCharacteristics", model); + + } + + String svcCharacteristicsJson = Json.pretty(definitions); + serviceSpecificationDBManager.saveSpecificationInputSchema(svcCharacteristicsJson, serviceCatalogResponse); + + Metadata serviceMetadata = sdcCsarHelper.getServiceMetadata(); + String instantationType = serviceMetadata.getValue("instantiationType"); + serviceCatalogResponse.put("instantiationType", instantationType); + + LinkedHashMap inputSchemaRef = new LinkedHashMap(); + // use object to match examples in Specifications + inputSchemaRef.put("valueType", "object"); + inputSchemaRef.put("@schemaLocation", + "/serviceSpecification/" + serviceCatalogResponse.get("id") + "/specificationInputSchema"); + inputSchemaRef.put("@type", serviceCatalogResponse.get("name") + "_ServiceCharacteristic"); + + LinkedHashMap serviceSpecCharacteristic = new LinkedHashMap(); + serviceSpecCharacteristic.put("name", serviceCatalogResponse.get("name") + "_ServiceCharacteristics"); + serviceSpecCharacteristic.put("description", + "This object describes all the inputs needed from the client to interact with the " + + serviceCatalogResponse.get("name") + " Service Topology"); + serviceSpecCharacteristic.put("valueType", "object"); + serviceSpecCharacteristic.put("@type", "ONAPServiceCharacteristic"); + serviceSpecCharacteristic.put("@schemaLocation", "null"); + serviceSpecCharacteristic.put("serviceSpecCharacteristicValue", inputSchemaRef); + + serviceCatalogResponse.put("serviceSpecCharacteristic", serviceSpecCharacteristic); + + List nodeTemplates = sdcCsarHelper.getServiceNodeTemplates(); + List resourceSpecifications = (List) serviceCatalogResponse + .get("resourceSpecification"); + for (LinkedHashMap resourceSpecification : resourceSpecifications) { + if (resourceSpecification.get("id") != null) { + String id = (String) resourceSpecification.get("id"); + LOGGER.debug("get tosca infos for service id: {}", id); + NodeTemplate nodeTemplate = null; + for (NodeTemplate node : nodeTemplates) { + if (node.getMetaData().getValue("UUID").equals(id)) { + nodeTemplate = node; + break; + } + } + if (nodeTemplate == null) + continue; + resourceSpecification.put("modelCustomizationId", + sdcCsarHelper.getNodeTemplateCustomizationUuid(nodeTemplate)); + if (!vfModuleEntityList.isEmpty()) { + resourceSpecification.put("childResourceSpecification", listOfVfModelInfo); + } + HashMap serviceInstanceParams = getServiceLevelInstanceParams(inputs); + resourceSpecification.put("serviceInstanceParams", serviceInstanceParams); + HashMap vnfInstanceParams = getUserDefinedVFLevelInstanceParams(groupProperties, listOfInstanceParameters); + resourceSpecification.put("InstanceSpecification", vnfInstanceParams); + } + } + } + + // Get List of Service Level InputParams as Key Value + private HashMap getServiceLevelInstanceParams(List listOfServiceLevelInputs) { + + HashMap serviceLevelInstanceParams = new HashMap<>(); + + for (Input input : listOfServiceLevelInputs) { + serviceLevelInstanceParams.put(input.getName(), input.getDefault()); + } + + return serviceLevelInstanceParams; + } + + private HashMap getUserDefinedVFLevelInstanceParams( + Map groupProperties, Map listOfVFLevelInputs) { + + if(groupProperties != null && !groupProperties.isEmpty()) { + + for (Entry entry : groupProperties.entrySet()) { + + org.onap.sdc.toscaparser.api.Property property = entry.getValue(); + + if ((property.getValue().getClass() == GetInput.class)) { + GetInput getInput = (GetInput) property.getValue(); + listOfVFLevelInputs.put(getInput.getInputName(), getInput.result()); + listOfVFLevelInputs.remove(property.getName()); + } else if(property.getName().equals("skip_post_instantiation_configuration")) { + //Add skip_post_instantiation_configuration as vf Level Inputs + listOfVFLevelInputs.put(property.getName(), property.getValue()); + } + } + + } + + return (HashMap) listOfVFLevelInputs; + } + + + private static String testNull(Object object) { + if (object == null) { + return "NULL"; + } else if (object instanceof Integer) { + return object.toString(); + } else if (object instanceof String) { + return (String) object; + } else { + return "Type not recognized"; } } - -} +} \ No newline at end of file