summaryrefslogtreecommitdiffstats
path: root/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogic.java
diff options
context:
space:
mode:
Diffstat (limited to 'dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogic.java')
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogic.java248
1 files changed, 81 insertions, 167 deletions
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogic.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogic.java
index ff596b5..d970778 100644
--- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogic.java
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogic.java
@@ -1,205 +1,119 @@
package org.onap.sdc.dcae.composition.impl;
-import org.json.JSONArray;
-import org.json.JSONException;
import org.onap.sdc.common.onaplog.Enums.LogLevel;
import org.onap.sdc.common.onaplog.OnapLoggerError;
import org.onap.sdc.dcae.catalog.Catalog;
-import org.onap.sdc.dcae.catalog.engine.*;
+import org.onap.sdc.dcae.catalog.commons.Future;
+import org.onap.sdc.dcae.catalog.engine.CatalogController;
+import org.onap.sdc.dcae.catalog.engine.CatalogResponse;
+import org.onap.sdc.dcae.catalog.engine.ElementRequest;
+import org.onap.sdc.dcae.composition.restmodels.canvas.DcaeComponentCatalog;
+import org.onap.sdc.dcae.composition.restmodels.sdc.Artifact;
+import org.onap.sdc.dcae.composition.restmodels.sdc.Resource;
+import org.onap.sdc.dcae.composition.restmodels.sdc.ResourceDetailed;
+import org.onap.sdc.dcae.composition.util.DcaeBeConstants;
+import org.onap.sdc.dcae.enums.AssetType;
+import org.onap.sdc.dcae.errormng.ActionStatus;
+import org.onap.sdc.dcae.errormng.ErrConfMgr;
+import org.onap.sdc.dcae.utils.SdcRestClientUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.async.DeferredResult;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
@Component
-public class CompositionCatalogBusinessLogic {
+public class CompositionCatalogBusinessLogic extends BaseBusinessLogic {
@Autowired
private CatalogController catalogController;
protected OnapLoggerError errLogger = OnapLoggerError.getInstance();
- public DeferredResult<CatalogResponse> getItems(ItemsRequest theRequest) {
-
- final ItemsRequest request = (theRequest == null) ? ItemsRequest.EMPTY_REQUEST : theRequest;
-
- Catalog catalog = catalogController.getCatalog(request.getCatalog());
- DeferredResult<CatalogResponse> result = new DeferredResult<>(request.getTimeout());
+ public ResponseEntity getModelById(String requestId, String theItemId) {
- catalog.rootsByLabel(request.getStartingLabel()).setHandler(catalogController.new CatalogHandler<Catalog.Folders>(request, result) {
- public CatalogResponse handleData(Catalog.Folders theFolders) {
- JSONArray ja = new JSONArray();
- if (theFolders != null) {
- for (Catalog.Folder folder : theFolders) {
- ja.put(catalogController.patchData(catalog, folder.data()));
- }
- }
- CatalogResponse response = new CatalogResponse(this.request);
- try {
- response.data().put("elements", ja);
- } catch (JSONException e) {
- errLogger.log(LogLevel.ERROR, this.getClass().getName(), "JSONException putting json elements to response {}", e);
- }
- return response;
+ try {
+ ResourceDetailed resourceDetailed = fetchAndExtractTemplateAndSchema(theItemId, requestId);
+ Future<Catalog.Template> modelFuture = catalogController.getCatalog().template(resourceDetailed).withInputs().withOutputs().withNodes().withNodeProperties().withNodePropertiesAssignments().withNodeRequirements().withNodeCapabilities().withNodeCapabilityProperties()
+ .withNodeCapabilityPropertyAssignments().withPolicies().withPolicyProperties().withPolicyPropertiesAssignments().execute();
+ if(modelFuture.succeeded()) {
+ CatalogResponse response = new CatalogResponse(ElementRequest.EMPTY_REQUEST);
+ response.data().put("model", modelFuture.result().data());
+ return ResponseEntity.ok().body(response);
}
- });
- return result;
- }
+ return ErrConfMgr.INSTANCE.buildErrorResponse(ActionStatus.GENERAL_ERROR, modelFuture.cause().getMessage());
- public DeferredResult<CatalogResponse> getItemById(ItemsRequest theRequest, String theItemId) {
-
- final ItemsRequest request = (theRequest == null) ? ItemsRequest.EMPTY_REQUEST : theRequest;
-
- Catalog catalog = catalogController.getCatalog(request.getCatalog());
- DeferredResult<CatalogResponse> result = new DeferredResult<>(request.getTimeout());
-
- catalog.folder(theItemId).withParts().withPartAnnotations().withItems().withItemAnnotations().withItemModels().execute().setHandler(new FolderHandler(catalog, request, result));
- return result;
+ } catch (Exception e) {
+ errLogger.log(LogLevel.ERROR, this.getClass().getName(), "Error fetching catalog model with id {}. Message: {}", theItemId, e);
+ return ErrConfMgr.INSTANCE.handleException(e, ErrConfMgr.ApiType.GET_MODEL, theItemId);
+ }
}
- public DeferredResult getModelById(ElementRequest theRequest, String theItemId) {
- final ElementRequest request = (theRequest == null) ? ElementRequest.EMPTY_REQUEST : theRequest;
-
- Catalog catalog = catalogController.getCatalog(request.getCatalog());
- DeferredResult<CatalogResponse> result = new DeferredResult<>(request.getTimeout());
-// try {
- catalog.item(theItemId).withModels().execute().setHandler(new ItemHandler(catalog, request, result));
-// } catch (IllegalArgumentException e) {
-// errLogger.log(LogLevel.ERROR, this.getClass().getName(), "Error fetching catalog model with id {}. Message: {}", theItemId, e);
-// result.setErrorResult(new CatalogError(request, "Catalog API failed", e));
-// }
- return result;
- }
+ public ResponseEntity getTypeInfo(String theItemId, String theTypeName) {
- public DeferredResult<CatalogResponse> getTypeInfo(ElementRequest theRequest, String theItemId, String theTypeName) {
- final ElementRequest request = (theRequest == null) ? ElementRequest.EMPTY_REQUEST : theRequest;
-
- Catalog catalog = catalogController.getCatalog(request.getCatalog());
- DeferredResult<CatalogResponse> result = new DeferredResult<>(request.getTimeout());
-
- catalog.type(theItemId, theTypeName).withHierarchy().withCapabilities().withRequirements().execute().setHandler(catalogController.new CatalogHandler<Catalog.Type>(request, result) {
- public CatalogResponse handleData(Catalog.Type theType) {
- CatalogResponse response = new CatalogResponse(this.request);
- if (theType != null) {
- try {
- response.data().put("type", catalogController.patchData(catalog, theType.data()));
- } catch (JSONException e) {
- errLogger.log(LogLevel.ERROR, this.getClass().getName(), "Exception processing catalog {}", e);
- }
- }
- return response;
+ try {
+ Future<Catalog.Type> theTypeInfoFuture = catalogController.getCatalog().type(theItemId, theTypeName).withHierarchy().withCapabilities().withRequirements().execute();
+ if(theTypeInfoFuture.succeeded()) {
+ CatalogResponse response = new CatalogResponse(ElementRequest.EMPTY_REQUEST);
+ response.data().put("type", theTypeInfoFuture.result().data());
+ return ResponseEntity.ok().body(response);
}
- });
- return result;
- }
-
- /// Nested Catalog Data Handlers ///
-
- private class FolderHandler extends CatalogController.CatalogHandler<Catalog.Folder> {
-
- private Catalog catalog;
+ return ErrConfMgr.INSTANCE.buildErrorResponse(ActionStatus.GENERAL_ERROR, theTypeInfoFuture.cause().getMessage());
- private FolderHandler(Catalog catalog, ItemsRequest request, DeferredResult result) {
- catalogController.super(request, result);
- this.catalog = catalog;
- }
-
- private void patchCatalogData(Catalog.Elements folders, Catalog catalog) {
- if (folders != null) {
- folders.forEach(folder -> {
- catalogController.patchData(catalog, ((Catalog.Element) folder).data());
- // lots of ephemere proxies created here ..
- Catalog.Elements annotations = ((Catalog.Element) folder).elements("annotations", Catalog.Annotations.class);
- if (annotations != null) {
- annotations.forEach(a -> catalogController.patchData(catalog, ((Catalog.Annotation) a).data()));
- }
- });
- }
- }
-
- public CatalogResponse handleData(Catalog.Folder theFolder) {
- CatalogResponse response = new CatalogResponse(this.request);
- if (theFolder == null) {
- return response;
- }
- try {
- Catalog.Elements folders = theFolder.elements("parts", Catalog.Folders.class);
- patchCatalogData(folders, catalog);
- Catalog.Elements items = theFolder.elements("items", Catalog.Items.class);
- patchCatalogData(items, catalog);
- } catch (Exception x) {
- errLogger.log(LogLevel.ERROR, this.getClass().getName(), "Exception processing catalog {}", x);
- return new CatalogError(this.request, "", x);
- }
- try {
- response.data().put("element", theFolder.data());
- } catch (JSONException e) {
- errLogger.log(LogLevel.ERROR, this.getClass().getName(), "JSONException putting element to response {}", e);
- }
- return response;
+ } catch (Exception e) {
+ errLogger.log(LogLevel.ERROR, this.getClass().getName(), "Exception processing catalog {}", e);
+ return ErrConfMgr.INSTANCE.handleException(e, ErrConfMgr.ApiType.GET_MODEL, theItemId);
}
}
- private class ItemHandler extends CatalogController.CatalogHandler<Catalog.Item> {
-
- private Catalog catalog;
-
- private ItemHandler(Catalog catalog, ElementRequest request, DeferredResult result) {
- catalogController.super(request, result);
- this.catalog = catalog;
- }
-
- public CatalogResponse handleData(Catalog.Item theItem) {
- if (theItem == null) {
- return new CatalogError(this.request, "No such item");
- }
- Catalog.Templates models;
- try {
- models = (Catalog.Templates) theItem.elements("models", Catalog.Templates.class);
- } catch (Exception x) {
- return new CatalogError(this.request, "Failed to decode templates from result", x);
- }
- if (models == null || models.isEmpty()) {
- return new CatalogError(this.request, "Item has no models");
- }
- if (models.size() > 1) {
- return new CatalogError(this.request, "Item has more than one model !?");
- }
- try {
- catalog.template(models.get(0).id()).withInputs().withOutputs().withNodes().withNodeProperties().withNodePropertiesAssignments().withNodeRequirements().withNodeCapabilities().withNodeCapabilityProperties()
- .withNodeCapabilityPropertyAssignments().withPolicies().withPolicyProperties().withPolicyPropertiesAssignments().execute().setHandler(new TemplateHandler(this.catalog, this.request, this.result));
- } catch (Exception e) {
- errLogger.log(LogLevel.ERROR, this.getClass().getName(), "Exception caught during Catalog Item Handler: {}", e);
- }
- return null;
- }
+ public DcaeComponentCatalog getCatalog(String requestId) {
+ List<DcaeComponentCatalog.SubCategoryFolder> folders = sdcRestClient.getResources(AssetType.VF.name(), "DCAE Component", null, requestId).stream()
+ .filter(r -> DcaeBeConstants.LifecycleStateEnum.CERTIFIED == DcaeBeConstants.LifecycleStateEnum.findState(r.getLifecycleState()))
+ .collect(Collectors.groupingBy(Resource::getSubCategory)).entrySet().stream()
+ .map(e -> new DcaeComponentCatalog.SubCategoryFolder(e.getKey(), e.getValue())).collect(Collectors.toList());
+ DcaeComponentCatalog catalog = new DcaeComponentCatalog();
+ catalog.setElements(folders);
+ return catalog;
}
- private class TemplateHandler extends CatalogController.CatalogHandler<Catalog.Template> {
-
- private Catalog catalog;
- private TemplateHandler(Catalog catalog, CatalogRequest request, DeferredResult result) {
- catalogController.super(request, result);
- this.catalog = catalog;
+ private ResourceDetailed fetchAndExtractTemplateAndSchema(String uuid, String requestId) throws IOException {
+ String toscaModelPath = "/sdc/v1/catalog/resources/".concat(uuid).concat("/toscaModel/");
+ if(!catalogController.getCatalog().hasCachedItem(uuid)){
+ ResourceDetailed resourceDetailed = new ResourceDetailed();
+ resourceDetailed.setUuid(uuid);
+ resourceDetailed.setToscaModelURL(toscaModelPath);
+ resourceDetailed.setArtifacts(extractToscaArtifactsFromCsar(sdcRestClient.getResourceToscaModel(uuid, requestId), toscaModelPath));
+ return resourceDetailed;
}
+ ResourceDetailed cachedVf = sdcRestClient.getResource(uuid, requestId);
+ cachedVf.getArtifacts().forEach(a -> a.setArtifactURL(toscaModelPath.concat(a.getArtifactName())));
+ return cachedVf;
+ }
- public CatalogResponse handleData(Catalog.Template theTemplate) {
- CatalogResponse response = new CatalogResponse(this.request);
- if (theTemplate != null) {
- try {
- response.data().put("model", catalogController.patchData(catalog, theTemplate.data()));
- } catch (JSONException e) {
- errLogger.log(LogLevel.ERROR, this.getClass().getName(), "JSONException putting model to response {}", e);
+ private List<Artifact> extractToscaArtifactsFromCsar(byte[] csar, String toscaModelPath) throws IOException {
+ //we are only interested in unzipping files under Artifacts/Deployment/DCAE_TOSCA/
+ String dcaeToscaDir = "Artifacts/Deployment/DCAE_TOSCA/";
+ List<Artifact> extracted = new ArrayList<>();
+ try (ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(csar))) {
+ ZipEntry ze = zis.getNextEntry();
+ while (ze != null) {
+ if(ze.getName().startsWith(dcaeToscaDir)) {
+ String artifactName = ze.getName().replace(dcaeToscaDir,"");
+ extracted.add(SdcRestClientUtils.generateCatalogDcaeToscaArtifact(artifactName, toscaModelPath.concat(artifactName), extractFile(zis)));
}
+ ze = zis.getNextEntry();
}
- return response;
+ return extracted;
}
}
-}
-
-
-
-
+}