- public CsarUtils() {
- if(SDC_VERSION != null && !SDC_VERSION.isEmpty()){
- Matcher matcher = Pattern.compile("(?!\\.)(\\d+(\\.\\d+)+)(?![\\d\\.])").matcher(SDC_VERSION);
- matcher.find();
- versionFirstThreeOctates = matcher.group(0);
- } else {
- versionFirstThreeOctates = "";
- }
- }
-
- /**
- *
- * @param component
- * @param getFromCS
- * @param isInCertificationRequest
- * @return
- */
- public Either<byte[], ResponseFormat> createCsar(Component component, boolean getFromCS, boolean isInCertificationRequest) {
- return createCsar(component, getFromCS, isInCertificationRequest, false);
- }
-
- private Either<byte[], ResponseFormat> createCsar(Component component, boolean getFromCS, boolean isInCertificationRequest, boolean mockGenerator) {
- final String createdBy = component.getCreatorFullName();
-
- String fileName;
- Map<String, ArtifactDefinition> toscaArtifacts = component.getToscaArtifacts();
- ArtifactDefinition artifactDefinition = toscaArtifacts.get(ToscaExportHandler.ASSET_TOSCA_TEMPLATE);
- fileName = artifactDefinition.getArtifactName();
-
- String toscaConformanceLevel = ConfigurationManager.getConfigurationManager().getConfiguration().getToscaConformanceLevel();
- String csarBlock0 = createCsarBlock0(CSAR_META_VERSION, toscaConformanceLevel);
- byte[] csarBlock0Byte = csarBlock0.getBytes();
-
- final String toscaBlock0 = createToscaBlock0(TOSCA_META_VERSION, CSAR_VERSION, createdBy, fileName);
- byte[] toscaBlock0Byte = toscaBlock0.getBytes();
-
- Either<byte[], ResponseFormat> generateCsarZipResponse = generateCsarZip(csarBlock0Byte, toscaBlock0Byte, component, getFromCS, isInCertificationRequest, mockGenerator);
-
- if (generateCsarZipResponse.isRight()) {
- return Either.right(generateCsarZipResponse.right().value());
- }
-
- return Either.left(generateCsarZipResponse.left().value());
- }
-
- private Either<byte[], ResponseFormat> generateCsarZip(byte[] csarBlock0Byte, byte[] toscaBlock0Byte, Component component, boolean getFromCS, boolean isInCertificationRequest, boolean mockGenerator) {
- try (
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- ZipOutputStream zip = new ZipOutputStream(out);
- ){
- zip.putNextEntry(new ZipEntry(CSAR_META_PATH_FILE_NAME));
- zip.write(csarBlock0Byte);
- zip.putNextEntry(new ZipEntry(TOSCA_META_PATH_FILE_NAME));
- zip.write(toscaBlock0Byte);
- Either<ZipOutputStream, ResponseFormat> populateZip = populateZip(component, getFromCS, zip, isInCertificationRequest, mockGenerator);
- if (populateZip.isRight()) {
- log.debug("Failed to populate CSAR zip file {}", populateZip.right().value());
- return Either.right(populateZip.right().value());
- }
-
- zip.finish();
- byte[] byteArray = out.toByteArray();
-
- return Either.left(byteArray);
- } catch (IOException e) {
- log.debug("Failed with IOexception to create CSAR zip for component {}", component.getUniqueId(), e);
-
- ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
- return Either.right(responseFormat);
- }
- }
-
- private Either<ZipOutputStream, ResponseFormat> populateZip(Component component, boolean getFromCS, ZipOutputStream zip, boolean isInCertificationRequest, boolean mockGenerator) throws IOException {
-
- LifecycleStateEnum lifecycleState = component.getLifecycleState();
- String componentYaml;
- Either<ToscaRepresentation, ToscaError> exportComponent;
- byte[] mainYaml;
- // <file name, cassandraId, component>
- List<Triple<String, String, Component>> dependencies = null;
- List<ImmutablePair<Component, byte[]>> generatorInputs = new LinkedList<>();
-
- Map<String, ArtifactDefinition> toscaArtifacts = component.getToscaArtifacts();
- ArtifactDefinition artifactDefinition = toscaArtifacts.get(ToscaExportHandler.ASSET_TOSCA_TEMPLATE);
- String fileName = artifactDefinition.getArtifactName();
-
- if (getFromCS || !(lifecycleState == LifecycleStateEnum.NOT_CERTIFIED_CHECKIN || lifecycleState == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT)) {
- String cassandraId = artifactDefinition.getEsId();
- Either<byte[], ActionStatus> fromCassandra = getFromCassandra(cassandraId);
- if (fromCassandra.isRight()) {
- log.debug("ArtifactName {}, unique ID {}", artifactDefinition.getArtifactName(), artifactDefinition.getUniqueId());
- ResponseFormat responseFormat = componentsUtils.getResponseFormat(fromCassandra.right().value());
- return Either.right(responseFormat);
- }
- mainYaml = fromCassandra.left().value();
-
- } else {
- exportComponent = toscaExportUtils.exportComponent(component);
- if (exportComponent.isRight()) {
- log.debug("exportComponent failed", exportComponent.right().value());
- ActionStatus convertedFromToscaError = componentsUtils.convertFromToscaError(exportComponent.right().value());
- ResponseFormat responseFormat = componentsUtils.getResponseFormat(convertedFromToscaError);
- return Either.right(responseFormat);
- }
- ToscaRepresentation exportResult = exportComponent.left().value();
- componentYaml = exportResult.getMainYaml();
- mainYaml = componentYaml.getBytes();
- dependencies = exportResult.getDependencies();
- }
-
- zip.putNextEntry(new ZipEntry(DEFINITIONS_PATH + fileName));
- zip.write(mainYaml);
- //US798487 - Abstraction of complex types
- if (!ModelConverter.isAtomicComponent(component)){
- log.debug("Component {} is complex - generating abstract type for it..", component.getName());
- writeComponentInterface(component, zip, fileName);
- }
-
- generatorInputs.add(new ImmutablePair<Component, byte[]>(component, mainYaml));
-
- if (dependencies == null) {
- Either<ToscaTemplate, ToscaError> dependenciesRes = toscaExportUtils.getDependencies(component);
- if (dependenciesRes.isRight()) {
- log.debug("Failed to retrieve dependencies for component {}, error {}", component.getUniqueId(),
- dependenciesRes.right().value());
- ActionStatus convertFromToscaError = componentsUtils.convertFromToscaError(dependenciesRes.right().value());
- ResponseFormat responseFormat = componentsUtils.getResponseFormat(convertFromToscaError);
- return Either.right(responseFormat);
- }
- dependencies = dependenciesRes.left().value().getDependencies();
- }
-
- //UID <cassandraId,filename,component>
- Map<String, ImmutableTriple<String,String, Component>> innerComponentsCache = new HashMap<>();
-
- if (dependencies != null && !dependencies.isEmpty()) {
- for (Triple<String, String, Component> d : dependencies) {
- String cassandraId = d.getMiddle();
- Component childComponent = d.getRight();
- Either<byte[], ActionStatus> entryData = getEntryData(cassandraId, childComponent);
-
- if (entryData.isRight()) {
- ResponseFormat responseFormat = componentsUtils.getResponseFormat(entryData.right().value());
- return Either.right(responseFormat);
- }
-
- //fill innerComponentsCache
- fileName = d.getLeft();
- addComponentToCache(innerComponentsCache, cassandraId, fileName, childComponent);
- addInnerComponentsToCache(innerComponentsCache, childComponent);
-
- byte[] content = entryData.left().value();
- generatorInputs.add(new ImmutablePair<Component, byte[]>(childComponent, content));
- }
-
- //add inner components to CSAR
- for (Entry<String, ImmutableTriple<String, String, Component>> innerComponentTripleEntry : innerComponentsCache.entrySet()) {
-
- ImmutableTriple<String, String, Component> innerComponentTriple = innerComponentTripleEntry.getValue();
-
- Component innerComponent = innerComponentTriple.getRight();
- String icFileName = innerComponentTriple.getMiddle();
-
- // add component to zip
- Either<byte[], ActionStatus> entryData = getEntryData(innerComponentTriple.getLeft(), innerComponent);
- if (entryData.isRight()) {
- ResponseFormat responseFormat = componentsUtils.getResponseFormat(entryData.right().value());
- log.debug("Failed adding to zip component {}, error {}", innerComponentTriple.getLeft(),
- entryData.right().value());
- return Either.right(responseFormat);
- }
- byte[] content = entryData.left().value();
- zip.putNextEntry(new ZipEntry(DEFINITIONS_PATH + icFileName));
- zip.write(content);
-
- // add component interface to zip
- if (!ModelConverter.isAtomicComponent(innerComponent)) {
- writeComponentInterface(innerComponent, zip, icFileName);
- }
- }
- }
-
- //retrieve SDC.zip from Cassandra
- Either<byte[], ResponseFormat> latestSchemaFilesFromCassandra = getLatestSchemaFilesFromCassandra();
-
- if(latestSchemaFilesFromCassandra.isRight()){
- log.error("Error retrieving SDC Schema files from cassandra" );
- return Either.right(latestSchemaFilesFromCassandra.right().value());
- }
-
- //add files from retireved SDC.zip to Definitions folder in CSAR
- Either<ZipOutputStream, ResponseFormat> addSchemaFilesFromCassandra = addSchemaFilesFromCassandra(zip, latestSchemaFilesFromCassandra.left().value());
-
- if(addSchemaFilesFromCassandra.isRight()){
- return addSchemaFilesFromCassandra;
- }
-
- // Artifact Generation
- if (component.getComponentType() == ComponentTypeEnum.SERVICE
- && isInCertificationRequest) {
-
- List<ArtifactDefinition> aiiArtifactList;
-
- Either<List<ArtifactDefinition>, ResponseFormat> handleAAIArtifacts = handleAAIArtifacts(component, mockGenerator, generatorInputs);
-
- if (handleAAIArtifacts.isLeft()) {
- aiiArtifactList = handleAAIArtifacts.left().value();
- } else {
- log.debug("AAI Artifacts handling failed");
- return Either.right(handleAAIArtifacts.right().value());
- }
-
- if (isInCertificationRequest) {
- Either<ActionStatus, ResponseFormat> handleAllAAIArtifactsInDataModel = handleAllAAIArtifactsInDataModel(
- component, aiiArtifactList, false, true);
-
- if (handleAllAAIArtifactsInDataModel.isRight()) {
- log.debug("AAI Artifacts handling (create, update, delete) failed");
- return Either.right(handleAllAAIArtifactsInDataModel.right().value());
- }
- }
-
- }
-
- Either<CsarDefinition, ResponseFormat> collectedComponentCsarDefinition = collectComponentCsarDefinition(component);
-
- if (collectedComponentCsarDefinition.isRight()) {
- return Either.right(collectedComponentCsarDefinition.right().value());
- }
-
- return writeAllFilesToCsar(component, collectedComponentCsarDefinition.left().value(), zip, isInCertificationRequest);
- }
-
- private Either<ZipOutputStream, ResponseFormat> addSchemaFilesFromCassandra(ZipOutputStream zip, byte[] schemaFileZip){
-
- final int initSize = 2048;
-
- log.debug("Starting copy from Schema file zip to CSAR zip");
-
- try (ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(schemaFileZip));
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- BufferedOutputStream bos = new BufferedOutputStream(out, initSize);) {
-
- ZipEntry entry = null;
-
- while ((entry = zipStream.getNextEntry()) != null) {
-
- String entryName = entry.getName();
- int readSize = initSize;
- byte[] entryData = new byte[initSize];
-
- while ((readSize = zipStream.read(entryData, 0, readSize)) != -1) {
- bos.write(entryData, 0, readSize);
- }
-
- bos.flush();
- out.flush();
- zip.putNextEntry(new ZipEntry(DEFINITIONS_PATH + entryName));
- zip.write(out.toByteArray());
- zip.flush();
- out.reset();
- }
- } catch (IOException e) {
- log.error("Error while writing the SDC schema file to the CSAR {}", e);
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
- }
-
- log.debug("Finished coppy from Schema file zip to CSAR zip");
-
- return Either.left(zip);
- }
-
-
- private void addInnerComponentsToCache(Map<String, ImmutableTriple<String, String, Component>> componentCache,
- Component childComponent) {
-
- List<ComponentInstance> instances = childComponent.getComponentInstances();
-
- if(instances != null) {
- instances.forEach(ci -> {
- ImmutableTriple<String, String, Component> componentRecord = componentCache.get(ci.getComponentUid());
- if (componentRecord == null) {
- // all resource must be only once!
- Either<Resource, StorageOperationStatus> resource = toscaOperationFacade.getToscaElement(ci.getComponentUid());
- if (resource.isRight()) {
- log.debug("Failed to fetch resource with id {} for instance {}");
- }
- Component componentRI = resource.left().value();
-
- Map<String, ArtifactDefinition> childToscaArtifacts = componentRI.getToscaArtifacts();
- ArtifactDefinition childArtifactDefinition = childToscaArtifacts.get(ToscaExportHandler.ASSET_TOSCA_TEMPLATE);
- if (childArtifactDefinition != null) {
- //add to cache
- addComponentToCache(componentCache, childArtifactDefinition.getEsId(), childArtifactDefinition.getArtifactName(), componentRI);
- }
-
- //if not atomic - insert inner components as well
- if(!ModelConverter.isAtomicComponent(componentRI)) {
- addInnerComponentsToCache(componentCache, componentRI);
- }
- }
- });
- }
- }
-
- private void addComponentToCache(Map<String, ImmutableTriple<String, String, Component>> componentCache,
- String id, String fileName, Component component) {
-
- ImmutableTriple<String, String, Component> cachedComponent = componentCache.get(component.getInvariantUUID());
- if (cachedComponent == null || CommonBeUtils.compareAsdcComponentVersions(component.getVersion(), cachedComponent.getRight().getVersion())) {
- componentCache.put(component.getInvariantUUID(),
- new ImmutableTriple<String, String, Component>(id, fileName, component));
-
- if(cachedComponent != null) {
- //overwriting component with newer version
- log.warn("Overwriting component invariantID {} of version {} with a newer version {}", id, cachedComponent.getRight().getVersion(), component.getVersion());
- }
- }
- }
-
- private Either<ZipOutputStream, ResponseFormat> writeComponentInterface(Component component, ZipOutputStream zip, String fileName) {
- try {
- Either<ToscaRepresentation, ToscaError> componentInterface = toscaExportUtils.exportComponentInterface(component);
- ToscaRepresentation componentInterfaceYaml = componentInterface.left().value();
- String mainYaml = componentInterfaceYaml.getMainYaml();
- String interfaceFileName = DEFINITIONS_PATH + ToscaExportHandler.getInterfaceFilename(fileName);
-
- zip.putNextEntry(new ZipEntry(interfaceFileName));
- zip.write(mainYaml.getBytes());
-
- } catch (Exception e) {
- log.error("#writeComponentInterface - zip writing failed with error: ", e);
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
- }
-
- return Either.left(zip);
- }
-
- private Either<List<ArtifactDefinition>, ResponseFormat> handleAAIArtifacts(Component component, boolean mockGenerator, List<ImmutablePair<Component, byte[]>> generatorInputs) {
-
- ComponentTypeEnum componentType = component.getComponentType();
- List<Artifact> generatedArtifacts;
- List<ArtifactDefinition> aaiArtifacts = new LinkedList<>();
-
- if (componentType == ComponentTypeEnum.SERVICE && !generatorInputs.isEmpty()) {
- List<Artifact> convertedGeneratorInputs = convertToGeneratorArtifactsInput(generatorInputs);
-
- Either<List<Artifact>, String> generatorResponse;
-
- if (mockGenerator) {
- generatorResponse = artifactGenerator(convertedGeneratorInputs, ArtifactType.OTHER, component);
- } else {
- generatorResponse = artifactGenerator(convertedGeneratorInputs, ArtifactType.AAI, component);
- }
-
- if (generatorResponse.isRight()) {
- ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.AAI_ARTIFACT_GENERATION_FAILED, component.getComponentType().getValue(), component.getName(), generatorResponse.right().value());
- return Either.right(responseFormat);
- }
-
- generatedArtifacts = generatorResponse.left().value();
-
- aaiArtifacts = convertToArtifactDefinitionFromArtifactGeneratedData(generatedArtifacts);
-
- }
-
- return Either.left(aaiArtifacts);
- }
-
- private Either<ActionStatus, ResponseFormat> handleAllAAIArtifactsInDataModel(Component component, List<ArtifactDefinition> artifactsFromAAI, boolean shouldLock, boolean inTransaction) {
-
- Either<ActionStatus, ResponseFormat> handleAAIArtifactsResponse;
- User lastComponentUpdater;
-
- List<ArtifactDefinition> aaiArtifatcsToCreate = getAAIArtifatcsForCreate(artifactsFromAAI, component);
- List<ArtifactDefinition> aaiArtifatcsToDelete = getAAIArtifatcsForDelete(artifactsFromAAI, component);
- List<ArtifactDefinition> aaiArtifatcsToUpdate = getAAIArtifatcsForUpdate(artifactsFromAAI, component);
-
- String lastUpdaterUserId = component.getLastUpdaterUserId();
- Either<User, ResponseFormat> validateUserExists = artifactsBusinessLogic.validateUserExists(lastUpdaterUserId, "CSAR creation util", true);
-
- if (validateUserExists.isRight()) {
- ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.AAI_ARTIFACT_GENERATION_FAILED, component.getComponentType().getValue(), component.getName(), "User not found");
- return Either.right(responseFormat);
- }
-
- lastComponentUpdater = validateUserExists.left().value();
-
- handleAAIArtifactsResponse = handleAAIArtifactsInDataModelByOperationType(component, aaiArtifatcsToDelete, artifactsBusinessLogic.new ArtifactOperationInfo(false, false, ArtifactOperationEnum.DELETE), lastComponentUpdater, shouldLock,
- inTransaction);
-
- if (handleAAIArtifactsResponse.isRight()) {
- return handleAAIArtifactsResponse;
- }
-
- handleAAIArtifactsResponse = handleAAIArtifactsInDataModelByOperationType(component, aaiArtifatcsToCreate, artifactsBusinessLogic.new ArtifactOperationInfo(false, false, ArtifactOperationEnum.CREATE), lastComponentUpdater, shouldLock,
- inTransaction);
-
- if (handleAAIArtifactsResponse.isRight()) {
- return handleAAIArtifactsResponse;
- }
-
- return handleAAIArtifactsInDataModelByOperationType(component, aaiArtifatcsToUpdate, artifactsBusinessLogic.new ArtifactOperationInfo(false, false, ArtifactOperationEnum.UPDATE), lastComponentUpdater, shouldLock, inTransaction);
- }
-
- private List<ArtifactDefinition> getAAIArtifatcsForUpdate(List<ArtifactDefinition> artifactsFromAAI, Component component) {
-
- Set<String> componetDeploymentArtifactLables = component.getDeploymentArtifacts().keySet();
- Set<String> componetInformationalArtifactLables = component.getArtifacts().keySet();
-
- return artifactsFromAAI.stream()
- .filter(e -> componetDeploymentArtifactLables.contains(e.getArtifactLabel()) || componetInformationalArtifactLables.contains(e.getArtifactLabel()))
- .filter(e -> checkAaiForUpdate(component, e))
- .collect(Collectors.toList());
- }
-
- private boolean checkAaiForUpdate(Component component, ArtifactDefinition artifactDefinition) {
- ArtifactDefinition artifactDefinitionComp = component.getDeploymentArtifacts().get(artifactDefinition.getArtifactLabel());
-
- if (artifactDefinitionComp == null) {
- log.warn("Failed to get {} artifact", artifactDefinition.getArtifactLabel());
- return false;
- }
-
- // Old Artifacts before the generated flag introduction if contains "aai" ignore case prefix updated
- if (artifactDefinitionComp.getGenerated() == null) {
- if (artifactDefinitionComp.getArtifactLabel().toLowerCase().startsWith("aai")) {
- return true;
- } else {
- log.warn("The artifact {} flag is null but AAI prefix is abssent Not updated", artifactDefinition.getArtifactLabel());
- }
- } else {
- if (artifactDefinition.getGenerated()) {
- return true;
- } else {
- log.warn("Generated artifact {} was already uploaded manually", artifactDefinition.getArtifactLabel());
- }
- }
- return false;
- }
-
- private List<ArtifactDefinition> getAAIArtifatcsForDelete(List<ArtifactDefinition> artifactsFromAAI, Component component) {
-
- Set<String> aaiLabels = artifactsFromAAI.stream()
- .map(ArtifactDefinition::getArtifactLabel)
- .collect(Collectors.toSet());
-
- List<ArtifactDefinition> artifactsForDeleteDeployment = component.getDeploymentArtifacts().values().stream()
- // Filter Out Artifacts that are not contained in artifacts returned
- // from AAI API
- .filter(e -> !aaiLabels.contains(e.getArtifactLabel()))
- .collect(Collectors.toList());
-
- List<ArtifactDefinition> artifactsForDeleteInformational = component.getArtifacts().values().stream()
- // Filter Out Artifacts that are not contained in artifacts returned
- // from AAI API
- .filter(e -> !aaiLabels.contains(e.getArtifactLabel()))
- .collect(Collectors.toList());
-
- artifactsForDeleteDeployment.addAll(artifactsForDeleteInformational);
-
- return artifactsForDeleteDeployment.stream()
- .filter(e -> (e.getGenerated() != null && e.getGenerated().equals(Boolean.TRUE)) || (e.getGenerated() == null && e.getArtifactLabel().toLowerCase().startsWith("aai")))
- .collect(Collectors.toList());
- }
-
- private List<ArtifactDefinition> getAAIArtifatcsForCreate(List<ArtifactDefinition> artifactsFromAAI, Component component) {
-
- Set<String> componentDeploymentLabels = component.getDeploymentArtifacts().keySet();
- Set<String> componentInfoLabels = component.getArtifacts().keySet();
-
- // If the artifact label does not exist in the service -
- // store the artifact (generate uuid and version, "generated" flag is TRUE)
- return artifactsFromAAI.stream()
- .filter(e -> !componentDeploymentLabels.contains(e.getArtifactLabel()) && !componentInfoLabels.contains(e.getArtifactLabel()))
- .collect(Collectors.toList());
- }
-
- private Either<ActionStatus, ResponseFormat> handleAAIArtifactsInDataModelByOperationType(Component component, List<ArtifactDefinition> generatedArtifactsDefinitions, ArtifactOperationInfo operationType, User user, boolean shouldLock,
- boolean inTransaction) {
-
- String componentUniqueId = component.getUniqueId();
- ComponentTypeEnum componentType = component.getComponentType();
-
- for (ArtifactDefinition artDef : generatedArtifactsDefinitions) {
- String data = gson.toJson(artDef);
- String dataMD5 = GeneralUtility.calculateMD5Base64EncodedByString(data);
- String artifactUniqueId = null;
-
- if ((operationType.getArtifactOperationEnum() == ArtifactOperationEnum.UPDATE) || (operationType.getArtifactOperationEnum() == ArtifactOperationEnum.DELETE)) {
- String artifactLabel = artDef.getArtifactLabel();
- ArtifactDefinition artifactDefinition = component.getDeploymentArtifacts().get(artifactLabel);
- if (artifactDefinition != null) {
- artifactUniqueId = artifactDefinition.getUniqueId();
- }
- }
-
- Either<Either<ArtifactDefinition, Operation>, ResponseFormat> validateAndHandleArtifact = artifactsBusinessLogic.validateAndHandleArtifact(componentUniqueId, componentType, operationType, artifactUniqueId, artDef, dataMD5, data, null,
- null, user, component, shouldLock, inTransaction, false);
-
- if (validateAndHandleArtifact.isRight()) {
- if (ArtifactOperationEnum.isCreateOrLink(operationType.getArtifactOperationEnum()) || ArtifactOperationEnum.UPDATE == operationType.getArtifactOperationEnum()) {
- ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.AAI_ARTIFACT_GENERATION_FAILED, componentType.getValue(), component.getName(), validateAndHandleArtifact.right().value().toString());
-
- Either.right(responseFormat);
- } else {
- log.warn("Generated artifact {} could not be deleted", artDef.getArtifactLabel());
- }
- }
- }
-
- return Either.left(ActionStatus.OK);
- }
-
- private List<ArtifactDefinition> convertToArtifactDefinitionFromArtifactGeneratedData(List<Artifact> generatorOutput) {
- List<ArtifactDefinition> artifactDefList = new LinkedList<>();
-
- for (Artifact artifact : generatorOutput) {
- ArtifactDefinition newEntry = new ArtifactDefinition();
- newEntry.setArtifactName(artifact.getName());
- newEntry.setArtifactType(artifact.getType());
- newEntry.setArtifactGroupType(ArtifactGroupTypeEnum.findType(artifact.getGroupType()));
- newEntry.setDescription(artifact.getDescription());
-
- // Normalizing the artifact label to match those stored in DB
- String normalizeArtifactLabel = ValidationUtils.normalizeArtifactLabel(artifact.getLabel());
- newEntry.setArtifactLabel(normalizeArtifactLabel);
- newEntry.setPayload(Base64.decodeBase64(artifact.getPayload()));
- newEntry.setArtifactChecksum(artifact.getChecksum());
- // Flag that set to true in case that the artifact is generated by AI&I generator
- newEntry.setGenerated(Boolean.TRUE);
-
- artifactDefList.add(newEntry);
- }
-
- return artifactDefList;
- }
-
- // List<ImmutablePair<Component, byte[] artifactBytes>>
- // artifact stored by label
- private List<Artifact> convertToGeneratorArtifactsInput(List<ImmutablePair<Component, byte[]>> inputs) {
- List<Artifact> listOfArtifactsInput = new LinkedList<>();
- for (ImmutablePair<Component, byte[]> triple : inputs) {
- Component component = triple.getLeft();
-
- Map<String, ArtifactDefinition> toscaArtifacts = component.getToscaArtifacts();
- ArtifactDefinition artifactDefinition = toscaArtifacts.get(ToscaExportHandler.ASSET_TOSCA_TEMPLATE);
-
- String artifactName = artifactDefinition.getArtifactName();
- String artifactType = artifactDefinition.getArtifactType();
- String artifactGroupType = artifactDefinition.getArtifactGroupType().getType();
- String artifactDescription = artifactDefinition.getDescription();
- String artifactLabel = artifactDefinition.getArtifactLabel();
- byte[] right = triple.getRight();
- // The md5 calculated on the uncoded data
- String md5Hex = DigestUtils.md5Hex(right);
- byte[] payload = Base64.encodeBase64(right);
- String artifactVersion = artifactDefinition.getArtifactVersion();
-
- Artifact convertedArtifact = new Artifact(artifactType, artifactGroupType, md5Hex, payload);
- convertedArtifact.setName(artifactName);
- convertedArtifact.setDescription(artifactDescription);
- convertedArtifact.setLabel(artifactLabel);
- convertedArtifact.setVersion(artifactVersion);
-
- listOfArtifactsInput.add(convertedArtifact);
- }
-
- return listOfArtifactsInput;
- }
-
- private Either<byte[], ActionStatus> getEntryData(String cassandraId, Component childComponent) {
- byte[] content;
- if (cassandraId == null || cassandraId.isEmpty()) {
- Either<ToscaRepresentation, ToscaError> exportRes = toscaExportUtils.exportComponent(childComponent);
- if (exportRes.isRight()) {
- log.debug("Failed to export tosca template for child component {} error {}", childComponent.getUniqueId(), exportRes.right().value());
- return Either.right(componentsUtils.convertFromToscaError(exportRes.right().value()));
- }
- content = exportRes.left().value().getMainYaml().getBytes();
- } else {
- Either<byte[], ActionStatus> fromCassandra = getFromCassandra(cassandraId);
- if (fromCassandra.isRight()) {
- return Either.right(fromCassandra.right().value());
- } else {
- content = fromCassandra.left().value();
- }
- }
- return Either.left(content);
- }
-
- private Either<byte[], ResponseFormat> getLatestSchemaFilesFromCassandra() {
- Either<List<SdcSchemaFilesData>, CassandraOperationStatus> specificSchemaFiles = sdcSchemaFilesCassandraDao.getSpecificSchemaFiles(versionFirstThreeOctates, CONFORMANCE_LEVEL);
-
- if(specificSchemaFiles.isRight()){
- log.debug("Failed to get the schema files SDC-Version: {} Conformance-Level {}", versionFirstThreeOctates, CONFORMANCE_LEVEL);
- StorageOperationStatus storageStatus = DaoStatusConverter.convertCassandraStatusToStorageStatus(specificSchemaFiles.right().value());
- ActionStatus convertedFromStorageResponse = componentsUtils.convertFromStorageResponse(storageStatus);
- return Either.right(componentsUtils.getResponseFormat(convertedFromStorageResponse));
- }
-
- List<SdcSchemaFilesData> listOfSchemas = specificSchemaFiles.left().value();
-
- if(listOfSchemas.isEmpty()){
- log.debug("Failed to get the schema files SDC-Version: {} Conformance-Level {}", versionFirstThreeOctates, CONFORMANCE_LEVEL);
- return Either.right(componentsUtils.getResponseFormat(ActionStatus.TOSCA_SCHEMA_FILES_NOT_FOUND, versionFirstThreeOctates, CONFORMANCE_LEVEL));
- }
-
- SdcSchemaFilesData schemaFile = listOfSchemas.iterator().next();
-
- return Either.left(schemaFile.getPayloadAsArray());
- }
-
- private Either<byte[], ActionStatus> getFromCassandra(String cassandraId) {
- Either<ESArtifactData, CassandraOperationStatus> artifactResponse = artifactCassandraDao.getArtifact(cassandraId);
-
- if (artifactResponse.isRight()) {
- log.debug("Failed to fetch artifact from Cassandra by id {} error {} ", cassandraId, artifactResponse.right().value());
-
- StorageOperationStatus storageStatus = DaoStatusConverter.convertCassandraStatusToStorageStatus(artifactResponse.right().value());
- ActionStatus convertedFromStorageResponse = componentsUtils.convertFromStorageResponse(storageStatus);
- return Either.right(convertedFromStorageResponse);
- }
- ESArtifactData artifactData = artifactResponse.left().value();
- return Either.left(artifactData.getDataAsArray());
- }
-
- private String createCsarBlock0(String metaFileVersion, String toscaConformanceLevel) {
- final String BLOCK_0_TEMPLATE =
- "SDC-TOSCA-Meta-File-Version: %s\nSDC-TOSCA-Definitions-Version: %s\n";
- String readyBlock = String.format(BLOCK_0_TEMPLATE, metaFileVersion, toscaConformanceLevel);
- return readyBlock;
- }
-
- private String createToscaBlock0(String metaFileVersion, String csarVersion, String createdBy, String entryDef) {
- final String block0template = "TOSCA-Meta-File-Version: %s\nCSAR-Version: %s\nCreated-By: %s\nEntry-Definitions: Definitions/%s\n\nName: csar.meta\nContent-Type: text/plain\n";
- return String.format(block0template, metaFileVersion, csarVersion, createdBy, entryDef);
- }
-
- private Either<List<Artifact>, String> artifactGenerator(List<Artifact> artifactList, ArtifactType type, Component component) {
-
- ArtifactGenerationServiceImpl artifactGenerationServiceImpl = new ArtifactGenerationServiceImpl();
- ArtifactTypes artifactTypes = new ArtifactTypes();
- List<ArtifactType> artifactTypesList = new LinkedList<>();
- ArtifactType otherType;
-
- if (type == null) {
- otherType = ArtifactType.OTHER;
- } else {
- otherType = type;
- }
-
- artifactTypesList.add(otherType);
- artifactTypes.setArtifactTypes(artifactTypesList);
-
- String configJson = gson.toJson(artifactTypes);
- Map<String, String> additionalParams = new HashMap<>();
- String version;
-
- if (UUID_NORMATIVE_NEW_VERSION.matcher(component.getVersion()).matches() ) {
- version = component.getVersion();
- } else {
- String[] versionParts = component.getVersion().split(ToscaElementLifecycleOperation.VERSION_DELIMETER_REGEXP);
- Integer majorVersion = Integer.parseInt(versionParts[0]);
-
- version = (majorVersion + 1) + ToscaElementLifecycleOperation.VERSION_DELIMETER + "0";
- }
-
- additionalParams.put(AdditionalParams.ServiceVersion.getName(), version);
- GenerationData generatedArtifacts = artifactGenerationServiceImpl.generateArtifact(artifactList, configJson, additionalParams);
-
- Map<String, List<String>> errorData = generatedArtifacts.getErrorData();
-
- if (!errorData.isEmpty()) {
- Set<String> keySet = errorData.keySet();
- StringBuilder error = new StringBuilder();
-
- for (String key : keySet) {
- List<String> errorList = errorData.get(key);
- log.debug("The Artifact Generator Failed - {} with following: {}", key, errorList);
- error.append(key + errorList);
- }
-
- return Either.right(error.toString());
- }
-
- return Either.left(generatedArtifacts.getResultData());