diff options
author | Stone, Avi (as206k) <as206k@att.com> | 2018-05-24 16:12:32 +0300 |
---|---|---|
committer | Stone, Avi (as206k) <as206k@att.com> | 2018-05-24 16:12:32 +0300 |
commit | 1a0189f890e4ff65ee245be9b7ef67788ac53a61 (patch) | |
tree | 15c269d48d03ef35770763169bd85f4cf31398c0 /dcaedt_be | |
parent | cd0441658018dfbab0950f959c9b718ad9601f6d (diff) |
Update code
Update to latest version after improving testing and sonar coverage
Change-Id: I527f4bc38d3b4e1005d38e3a2584fa730857425d
Issue-ID: SDC-1313
Signed-off-by: Stone, Avi (as206k) <as206k@att.com>
Diffstat (limited to 'dcaedt_be')
17 files changed, 668 insertions, 492 deletions
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/BaseController.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/BaseController.java index 818a30d..131efad 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/BaseController.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/BaseController.java @@ -1,37 +1,23 @@ package org.onap.sdc.dcae.composition.controller; -import javax.servlet.http.HttpServletRequest; - +import com.google.gson.Gson; +import org.onap.sdc.common.onaplog.Enums.LogLevel; import org.onap.sdc.common.onaplog.OnapLoggerDebug; import org.onap.sdc.common.onaplog.OnapLoggerError; -import org.onap.sdc.common.onaplog.Enums.LogLevel; import org.onap.sdc.dcae.composition.impl.BaseBusinessLogic; -import org.onap.sdc.dcae.composition.restmodels.sdc.Asset; -import org.onap.sdc.dcae.composition.restmodels.sdc.ResourceDetailed; -import org.onap.sdc.dcae.composition.util.DcaeBeConstants; -import org.onap.sdc.dcae.composition.util.SystemProperties; -import org.onap.sdc.dcae.enums.AssetType; -import org.onap.sdc.dcae.enums.LifecycleOperationType; -import org.onap.sdc.dcae.errormng.ActionStatus; -import org.onap.sdc.dcae.errormng.DcaeException; import org.onap.sdc.dcae.errormng.ErrConfMgr; import org.onap.sdc.dcae.errormng.ErrConfMgr.ApiType; -import org.onap.sdc.dcae.errormng.ResponseFormat; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; -import com.google.gson.Gson; +import javax.servlet.http.HttpServletRequest; public abstract class BaseController { protected Gson gson = new Gson(); @Autowired - protected SystemProperties systemProperties; - - @Autowired protected BaseBusinessLogic baseBusinessLogic; protected OnapLoggerError errLogger = OnapLoggerError.getInstance(); @@ -42,48 +28,8 @@ public abstract class BaseController { return request.getAttribute("requestId").toString(); } - ResourceDetailed checkoutVfcmt(String userId, String uuid, String requestId) { - return baseBusinessLogic.getSdcRestClient().changeResourceLifecycleState(userId, uuid, LifecycleOperationType.CHECKOUT.name(), null, requestId); - } - - ResourceDetailed checkinVfcmt(String userId, String uuid, String requestId) { - return baseBusinessLogic.getSdcRestClient().changeResourceLifecycleState(userId, uuid, LifecycleOperationType.CHECKIN.name(), "checking in vfcmt" + uuid, requestId); - } - - - boolean isNeedToCheckOut(String lifecycleState) { - return DcaeBeConstants.LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT != DcaeBeConstants.LifecycleStateEnum.findState(lifecycleState); - } - - void checkUserIfResourceCheckedOut(String userId, Asset asset) { - if (DcaeBeConstants.LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT == DcaeBeConstants.LifecycleStateEnum.findState(asset.getLifecycleState())) { - String lastUpdaterUserId = asset.getLastUpdaterUserId(); - if (lastUpdaterUserId != null && !lastUpdaterUserId.equals(userId)) { - errLogger.log(LogLevel.ERROR, this.getClass().getName(), "User conflicts. Operation not allowed for user {} on resource checked out by {}", userId, lastUpdaterUserId); - ResponseFormat responseFormat = ErrConfMgr.INSTANCE.getResponseFormat(ActionStatus.USER_CONFLICT, null, userId, asset.getName(), lastUpdaterUserId); - throw new DcaeException(HttpStatus.FORBIDDEN, responseFormat.getRequestError()); - } - } - } - - void checkVfcmtType(ResourceDetailed vfcmt) { - if (AssetType.VFCMT != getValidAssetTypeOrNull(vfcmt.getResourceType()) || !"Template".equals(vfcmt.getCategory())) { - ResponseFormat responseFormat = ErrConfMgr.INSTANCE.getResponseFormat(ActionStatus.RESOURCE_NOT_VFCMT_ERROR, null, vfcmt.getUuid()); - throw new DcaeException(HttpStatus.BAD_REQUEST, responseFormat.getRequestError()); - } - } - ResponseEntity handleException(Exception e, ApiType apiType, String... variables){ errLogger.log(LogLevel.ERROR, this.getClass().getName(), e.getMessage()); return ErrConfMgr.INSTANCE.handleException(e, apiType, variables); } - - AssetType getValidAssetTypeOrNull(String type) { - try { - return AssetType.getAssetTypeByName(type); - } catch (IllegalArgumentException e) { - debugLogger.log(LogLevel.ERROR, this.getClass().getName(), "invalid asset type: {}. Error: {}", type, e); - return null; - } - } } diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/BlueprintController.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/BlueprintController.java index 5f4cee7..0d638d9 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/BlueprintController.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/BlueprintController.java @@ -7,48 +7,44 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import javax.annotation.PostConstruct; - @RestController @EnableAutoConfiguration @CrossOrigin public class BlueprintController extends BaseController { - @Autowired - private BlueprintBusinessLogic blueprintBusinessLogic; + @Autowired + private BlueprintBusinessLogic blueprintBusinessLogic; - @PostConstruct - public void init(){ + /*** + * VFCMT - Resource, blueprint - as an artifact as an service. + * @param context + * @param userId + * @param vfcmtUuid + * @param serviceUuid + * @param instanceName + * @param requestId + * @return ResponseEntity + */ + @RequestMapping(value = "{context}/createBluePrint/{VFCMTUuid}/{serviceUuid}/{instanceName}", method = RequestMethod.POST) + public ResponseEntity createBlueprint( + @RequestHeader("USER_ID") String userId, + @PathVariable String context, + @PathVariable("VFCMTUuid") String vfcmtUuid, + @PathVariable("serviceUuid") String serviceUuid, + @PathVariable("instanceName") String instanceName, + @ModelAttribute("requestId") String requestId) { + return blueprintBusinessLogic.generateAndSaveBlueprint(userId, context, vfcmtUuid, serviceUuid, instanceName, "", requestId); } - /*** - * VFCMT - Resource, blueprint - as an artifact as an service. - * @param context - * @param userId - * @param vfcmtUuid - * @param serviceUuid - * @param instanceName - * @param requestId - * @return ResponseEntity - */ - @RequestMapping(value = "{context}/createBluePrint/{VFCMTUuid}/{serviceUuid}/{instanceName}", method = RequestMethod.POST) - public ResponseEntity createBlueprint(@RequestHeader("USER_ID") String userId, - @PathVariable String context, - @PathVariable("VFCMTUuid") String vfcmtUuid, - @PathVariable("serviceUuid") String serviceUuid, - @PathVariable("instanceName") String instanceName, - @ModelAttribute("requestId") String requestId) { - return blueprintBusinessLogic.generateAndSaveBlueprint(userId, context, vfcmtUuid, serviceUuid, instanceName, "", requestId); - } - - @Deprecated - @RequestMapping(value = "/createBluePrint/{VFCMTUuid}/{serviceUuid}/{instanceName}/{monitoringFlowType}", method = RequestMethod.POST) - public ResponseEntity createBluePrintWithFlowType(@RequestHeader("USER_ID") String userId, - @PathVariable("VFCMTUuid") String vfcmtUuid, - @PathVariable("serviceUuid") String serviceUuid, - @PathVariable("instanceName") String serviceInstanceName, - @PathVariable("monitoringFlowType") String monitoringFlowType, - @ModelAttribute("requestId") String requestId) { - return blueprintBusinessLogic.generateAndSaveBlueprint(userId, AssetType.SERVICE.name(), vfcmtUuid, serviceUuid, serviceInstanceName, monitoringFlowType, requestId); - } + @Deprecated + @RequestMapping(value = "/createBluePrint/{VFCMTUuid}/{serviceUuid}/{instanceName}/{monitoringFlowType}", method = RequestMethod.POST) + public ResponseEntity createBluePrintWithFlowType( + @RequestHeader("USER_ID") String userId, + @PathVariable("VFCMTUuid") String vfcmtUuid, + @PathVariable("serviceUuid") String serviceUuid, + @PathVariable("instanceName") String instanceName, + @PathVariable("monitoringFlowType") String monitoringFlowType, + @ModelAttribute("requestId") String requestId) { + return blueprintBusinessLogic.generateAndSaveBlueprint(userId, AssetType.SERVICE.name(), vfcmtUuid, serviceUuid, instanceName, monitoringFlowType, requestId); + } } diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/CompositionController.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/CompositionController.java index 3261ddc..dbcbcc9 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/CompositionController.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/CompositionController.java @@ -1,17 +1,15 @@ package org.onap.sdc.dcae.composition.controller; -import org.json.JSONArray; -import org.json.JSONException; import org.onap.sdc.common.onaplog.Enums.LogLevel; +import org.onap.sdc.dcae.catalog.engine.CatalogResponse; +import org.onap.sdc.dcae.catalog.engine.ElementRequest; +import org.onap.sdc.dcae.catalog.engine.ItemsRequest; import org.onap.sdc.dcae.composition.impl.CompositionBusinessLogic; +import org.onap.sdc.dcae.composition.impl.CompositionCatalogBusinessLogic; import org.onap.sdc.dcae.composition.restmodels.MessageResponse; import org.onap.sdc.dcae.composition.restmodels.ReferenceUUID; import org.onap.sdc.dcae.composition.restmodels.sdc.Artifact; -import org.onap.sdc.dcae.composition.restmodels.sdc.Asset; import org.onap.sdc.dcae.composition.restmodels.sdc.ResourceDetailed; -import org.onap.sdc.dcae.catalog.Catalog; -import org.onap.sdc.dcae.catalog.Catalog.*; -import org.onap.sdc.dcae.catalog.engine.*; import org.onap.sdc.dcae.composition.util.DcaeBeConstants; import org.onap.sdc.dcae.enums.LifecycleOperationType; import org.onap.sdc.dcae.errormng.ActionStatus; @@ -25,8 +23,6 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; -import javax.annotation.PostConstruct; -import java.net.URI; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,22 +34,22 @@ import java.util.stream.Collectors; @CrossOrigin public class CompositionController extends BaseController { - @Autowired private CatalogController catalogController; + @Autowired + private CompositionCatalogBusinessLogic compositionCatalogBusinessLogic; - @Autowired private CompositionBusinessLogic compositionBusinessLogic; + @Autowired + private CompositionBusinessLogic compositionBusinessLogic; - @PostConstruct public void init() { - catalogController.setDefaultCatalog(URI.create(systemProperties.getProperties().getProperty(DcaeBeConstants.Config.ASDC_CATALOG_URL))); - } - - @RequestMapping(value = { "/utils/clone/{assetType}/{sourceId}/{targetId}" }, method = { RequestMethod.GET }, produces = { "application/json" }) public ResponseEntity clone(@RequestHeader("USER_ID") String userId, + @Deprecated + @RequestMapping(value = { "/utils/clone/{assetType}/{sourceId}/{targetId}" }, method = { RequestMethod.GET }, produces = { "application/json" }) + public ResponseEntity clone(@RequestHeader("USER_ID") String userId, @PathVariable("assetType") String theAssetType, @PathVariable("sourceId") String theSourceId, @PathVariable("targetId") String theTargetId, @ModelAttribute("requestId") String requestId) { MessageResponse response = new MessageResponse(); try { // fetch the source and assert it is a vfcmt containing clone worthy artifacts (composition + rules) ResourceDetailed sourceVfcmt = baseBusinessLogic.getSdcRestClient().getResource(theSourceId, requestId); - checkVfcmtType(sourceVfcmt); + baseBusinessLogic.checkVfcmtType(sourceVfcmt); List<Artifact> artifactsToClone = CollectionUtils.isEmpty(sourceVfcmt.getArtifacts()) ? null : sourceVfcmt.getArtifacts().stream().filter(p -> DcaeBeConstants.Composition.fileNames.COMPOSITION_YML.equals(p.getArtifactName()) || p.getArtifactName().endsWith(DcaeBeConstants.Composition.fileNames.MAPPING_RULE_POSTFIX)) @@ -66,9 +62,9 @@ public class CompositionController extends BaseController { // fetch the target ResourceDetailed vfcmt = baseBusinessLogic.getSdcRestClient().getResource(theTargetId, requestId); debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), vfcmt.toString()); - checkVfcmtType(vfcmt); - checkUserIfResourceCheckedOut(userId, vfcmt); - boolean isTargetNeed2Checkout = isNeedToCheckOut(vfcmt.getLifecycleState()); + baseBusinessLogic.checkVfcmtType(vfcmt); + baseBusinessLogic.checkUserIfResourceCheckedOut(userId, vfcmt); + boolean isTargetNeed2Checkout = baseBusinessLogic.isNeedToCheckOut(vfcmt.getLifecycleState()); if (isTargetNeed2Checkout) { ResourceDetailed targetVfcmt = baseBusinessLogic.getSdcRestClient().changeResourceLifecycleState(userId, theTargetId, LifecycleOperationType.CHECKOUT.name(), "checking out VFCMT before clone", requestId); if (null == targetVfcmt) { @@ -95,183 +91,39 @@ public class CompositionController extends BaseController { } } - @RequestMapping(value = "/elements", method = { RequestMethod.POST, RequestMethod.GET }, produces = "application/json") public DeferredResult<CatalogResponse> items(@RequestBody(required = false) ItemsRequest theRequest) { - - final ItemsRequest request = (theRequest == null) ? ItemsRequest.EMPTY_REQUEST : theRequest; - - Catalog catalog = catalogController.getCatalog(request.getCatalog()); - DeferredResult<CatalogResponse> result = new DeferredResult<CatalogResponse>(request.getTimeout()); - - catalog.rootsByLabel(request.getStartingLabel()).setHandler(catalogController.new CatalogHandler<Folders>(request, result) { - public CatalogResponse handleData(Folders theFolders) { - JSONArray ja = new JSONArray(); - if (theFolders != null) { - for (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; - } - }); - return result; + @RequestMapping(value = "/elements", method = { RequestMethod.POST, RequestMethod.GET }, produces = "application/json") + public DeferredResult<CatalogResponse> items(@RequestBody(required = false) ItemsRequest theRequest) { + return compositionCatalogBusinessLogic.getItems(theRequest); } - @RequestMapping(value = "/{theItemId}/elements", method = { RequestMethod.POST, RequestMethod.GET }, produces = "application/json") public DeferredResult<CatalogResponse> items(@RequestBody(required = false) ItemsRequest theRequest, - @PathVariable String theItemId) { - - final ItemsRequest request = (theRequest == null) ? ItemsRequest.EMPTY_REQUEST : theRequest; - - Catalog catalog = catalogController.getCatalog(request.getCatalog()); - DeferredResult<CatalogResponse> result = new DeferredResult<CatalogResponse>(request.getTimeout()); - - catalog - // .fetchFolderByItemId(theItemId) - .folder(theItemId).withParts().withPartAnnotations().withItems().withItemAnnotations().withItemModels().execute().setHandler(catalogController.new CatalogHandler<Folder>(request, result) { - public CatalogResponse handleData(Folder theFolder) { - CatalogResponse response = new CatalogResponse(this.request); - if (theFolder == null) { - return response; - } - - try { - Elements folders = theFolder.elements("parts", Folders.class); - if (folders != null) { - for (Object folder : folders) { - catalogController.patchData(catalog, ((Element) folder).data()); - // lots of ephemere proxies created here .. - Elements annotations = ((Element) folder).elements("annotations", Annotations.class); - if (annotations != null) { - for (Object a : annotations) { - catalogController.patchData(catalog, ((Annotation) a).data()); - } - } - } - } - Elements items = theFolder.elements("items", Items.class); - if (items != null) { - for (Object i : items) { - catalogController.patchData(catalog, ((Element) i).data()); - // lots of ephemere proxies created here .. - Elements annotations = ((Element) i).elements("annotations", Annotations.class); - if (annotations != null) { - for (Object a : annotations) { - catalogController.patchData(catalog, ((Annotation) a).data()); - } - } - } - } - } 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; - } - }); - - return result; + @RequestMapping(value = "/{theItemId}/elements", method = { RequestMethod.POST, RequestMethod.GET }, produces = "application/json") + public DeferredResult<CatalogResponse> items(@RequestBody(required = false) ItemsRequest theRequest, @PathVariable String theItemId) { + return compositionCatalogBusinessLogic.getItemById(theRequest, theItemId); } - @RequestMapping(value = "/{theItemId}/model", method = { RequestMethod.POST, RequestMethod.GET }, produces = "application/json") public DeferredResult model(@RequestBody(required = false) ElementRequest theRequest, - @PathVariable String theItemId) { - final ElementRequest request = (theRequest == null) ? ElementRequest.EMPTY_REQUEST : theRequest; - - Catalog catalog = catalogController.getCatalog(request.getCatalog()); - DeferredResult<CatalogResponse> result = new DeferredResult<>(request.getTimeout()); - - catalog.item(theItemId).withModels().execute().setHandler(catalogController.new CatalogHandler<Item>(request, result) { - public CatalogResponse handleData(Item theItem) { - if (theItem == null) { - return new CatalogError(this.request, "No such item"); - } - Templates models = null; - try { - models = (Templates) theItem.elements("models", Templates.class); - 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 !?"); - } - catalog.template(models.get(0).id()).withInputs().withOutputs().withNodes().withNodeProperties().withNodePropertiesAssignments().withNodeRequirements().withNodeCapabilities().withNodeCapabilityProperties() - .withNodeCapabilityPropertyAssignments().withPolicies().withPolicyProperties().withPolicyPropertiesAssignments().execute().setHandler(catalogController.new CatalogHandler<Template>(this.request, this.result) { - public CatalogResponse handleData(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); - } - } - return response; - } - }); - } catch (Exception e) { - handleException(e, ApiType.GET_MODEL, models.get(0).name()); - } - return null; - } - }); - - return result; + @RequestMapping(value = "/{theItemId}/model", method = { RequestMethod.POST, RequestMethod.GET }, produces = "application/json") + public DeferredResult model(@RequestBody(required = false) ElementRequest theRequest, @PathVariable String theItemId) { + return compositionCatalogBusinessLogic.getModelById(theRequest, theItemId); } - @RequestMapping(value = "/{theItemId}/type/{theTypeName}", method = { RequestMethod.POST, RequestMethod.GET }, produces = "application/json") public DeferredResult<CatalogResponse> model(@RequestBody(required = false) ElementRequest theRequest, - @PathVariable String theItemId, @PathVariable String theTypeName) { - final ElementRequest request = (theRequest == null) ? ElementRequest.EMPTY_REQUEST : theRequest; - - Catalog catalog = catalogController.getCatalog(request.getCatalog()); - DeferredResult<CatalogResponse> result = new DeferredResult<CatalogResponse>(request.getTimeout()); - - catalog.type(theItemId, theTypeName).withHierarchy().withCapabilities().withRequirements().execute().setHandler(catalogController.new CatalogHandler<Type>(request, result) { - public CatalogResponse handleData(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; - } - }); - - return result; + @RequestMapping(value = "/{theItemId}/type/{theTypeName}", method = { RequestMethod.POST, RequestMethod.GET }, produces = "application/json") + public DeferredResult<CatalogResponse> model(@RequestBody(required = false) ElementRequest theRequest, @PathVariable String theItemId, @PathVariable String theTypeName) { + return compositionCatalogBusinessLogic.getTypeInfo(theRequest, theItemId, theTypeName); } - @RequestMapping(value = { "/getComposition/{vfcmtUuid}" }, method = { RequestMethod.GET }, produces = { "application/json" }) public ResponseEntity getComposition(@PathVariable("vfcmtUuid") String vfcmtUuid, - @ModelAttribute("requestId") String requestId) { + @RequestMapping(value = { "/getComposition/{vfcmtUuid}" }, method = { RequestMethod.GET }, produces = { "application/json" }) + public ResponseEntity getComposition(@PathVariable("vfcmtUuid") String vfcmtUuid, @ModelAttribute("requestId") String requestId) { MessageResponse response = new MessageResponse(); try { - ResourceDetailed vfcmt = baseBusinessLogic.getSdcRestClient().getResource(vfcmtUuid, requestId); - debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), vfcmt.toString()); - checkVfcmtType(vfcmt); - - Artifact compositionArtifact = CollectionUtils.isEmpty(vfcmt.getArtifacts()) ? null : vfcmt.getArtifacts().stream().filter(a -> DcaeBeConstants.Composition.fileNames.COMPOSITION_YML.equals(a.getArtifactName())).findAny().orElse(null); - + Artifact compositionArtifact = compositionBusinessLogic.getComposition(vfcmtUuid, requestId); if (null == compositionArtifact) { debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Couldn't find {} in VFCMT artifacts", DcaeBeConstants.Composition.fileNames.COMPOSITION_YML); response.setErrorResponse("No Artifacts"); return new ResponseEntity<>(response, HttpStatus.NO_CONTENT); } - String artifact = baseBusinessLogic.getSdcRestClient().getResourceArtifact(vfcmtUuid, compositionArtifact.getArtifactUUID(), requestId); - - debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "ARTIFACT: {}", artifact); - response.setSuccessResponse(artifact); + debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "ARTIFACT: {}", compositionArtifact.getPayloadData()); + response.setSuccessResponse(compositionArtifact.getPayloadData()); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { return handleException(e, ApiType.GET_CDUMP); diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/ConfigurationController.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/ConfigurationController.java index 4f083ca..65663f6 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/ConfigurationController.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/ConfigurationController.java @@ -26,7 +26,7 @@ import io.swagger.annotations.ApiResponses; @EnableAutoConfiguration @CrossOrigin @RequestMapping("/conf") -public class ConfigurationController extends BaseController{ +public class ConfigurationController extends BaseController { @Autowired private CompositionConfig compositionConfig; diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/LifecycleController.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/LifecycleController.java index 4fa8c18..1c90359 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/LifecycleController.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/LifecycleController.java @@ -1,6 +1,5 @@ package org.onap.sdc.dcae.composition.controller; -import org.onap.sdc.common.onaplog.Enums.LogLevel; import org.onap.sdc.dcae.composition.restmodels.sdc.ResourceDetailed; import org.onap.sdc.dcae.enums.AssetType; import org.onap.sdc.dcae.enums.LifecycleOperationType; @@ -25,8 +24,8 @@ public class LifecycleController extends BaseController { @ModelAttribute("requestId") String requestId) { try { - if (AssetType.VFCMT == getValidAssetTypeOrNull(assetType)) { - ResourceDetailed resCheckin = checkinVfcmt(userId, uuid.toString(), requestId); + if (AssetType.VFCMT == baseBusinessLogic.getValidAssetTypeOrNull(assetType)) { + ResourceDetailed resCheckin = baseBusinessLogic.checkinVfcmt(userId, uuid.toString(), requestId); return new ResponseEntity<>(resCheckin, HttpStatus.OK); } else { return new ResponseEntity<>(HttpStatus.BAD_REQUEST); @@ -44,8 +43,8 @@ public class LifecycleController extends BaseController { @ModelAttribute("requestId") String requestId) { try { - if (AssetType.VFCMT == getValidAssetTypeOrNull(assetType)) { - ResourceDetailed asset = checkoutVfcmt(userId, uuid.toString(), requestId); + if (AssetType.VFCMT == baseBusinessLogic.getValidAssetTypeOrNull(assetType)) { + ResourceDetailed asset = baseBusinessLogic.checkoutVfcmt(userId, uuid.toString(), requestId); return new ResponseEntity<>(asset, HttpStatus.OK); } else { return new ResponseEntity<>(HttpStatus.BAD_REQUEST); @@ -63,7 +62,7 @@ public class LifecycleController extends BaseController { @ModelAttribute("requestId") String requestId) { try { - if (AssetType.VFCMT == getValidAssetTypeOrNull(assetType)) { + if (AssetType.VFCMT == baseBusinessLogic.getValidAssetTypeOrNull(assetType)) { ResourceDetailed vfcmt = baseBusinessLogic.getSdcRestClient().changeResourceLifecycleState(userId, uuid, LifecycleOperationType.CERTIFY.name(), "certifying VFCMT", requestId); return new ResponseEntity<>(vfcmt, HttpStatus.OK); diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/RuleEditorController.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/RuleEditorController.java index 8de8520..d7ddd6f 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/RuleEditorController.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/RuleEditorController.java @@ -14,8 +14,6 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("/rule-editor") public class RuleEditorController extends BaseController { - private static final String EXCEPTION = "Exception {}"; - @Autowired private RuleEditorBusinessLogic ruleEditorBusinessLogic; @@ -70,7 +68,7 @@ public class RuleEditorController extends BaseController { * @param configParam - the name of the DCAE Component configuration property the rule is linked to * @return json representing the rule editor UI */ - @RequestMapping(value = "/rule/{vfcmtUuid}/{dcaeCompLabel}/{nid}/{configParam}", method = {RequestMethod.GET}, produces = "application/json") + @RequestMapping(value = "/rule/{vfcmtUuid}/{dcaeCompLabel}/{nid}/{configParam:.*}", method = {RequestMethod.GET}, produces = "application/json") public ResponseEntity getRules( @PathVariable("vfcmtUuid") String vfcmtUuid, @PathVariable("dcaeCompLabel") String dcaeCompLabel, @@ -119,9 +117,8 @@ public class RuleEditorController extends BaseController { * 1. That the user is able to edit the VFCMT * 2. That the cdump holds a dcae component with such nid (to avoid orphan rules) * 3. Check that the fetched VFCMT is actually a VFCMT and not a regular VF - * @throws Exception */ - @RequestMapping(value = "/rule/translate/{vfcmtUuid}/{dcaeCompLabel}/{nid}/{configParam}", method = {RequestMethod.GET}, produces = "application/json") + @RequestMapping(value = "/rule/translate/{vfcmtUuid}/{dcaeCompLabel}/{nid}/{configParam:.*}", method = {RequestMethod.GET}, produces = "application/json") public ResponseEntity translateRules(@PathVariable("vfcmtUuid") String vfcmtUuid, @ModelAttribute("requestId") String requestId, @PathVariable("dcaeCompLabel") String dcaeCompLabel, @PathVariable("nid") String nid, @@ -140,6 +137,4 @@ public class RuleEditorController extends BaseController { debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Starting getExistingRuleTargets ", vfcmtUuid); return ruleEditorBusinessLogic.getExistingRuleTargets(vfcmtUuid, requestId, dcaeCompLabel, nid); } - - } diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/VfcmtController.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/VfcmtController.java index 7d64dad..4fbce49 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/VfcmtController.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/controller/VfcmtController.java @@ -23,7 +23,6 @@ import java.util.List; @CrossOrigin public class VfcmtController extends BaseController{ - @Autowired private VfcmtBusinessLogic vfcmtBusinessLogic; @Autowired @@ -33,8 +32,6 @@ public class VfcmtController extends BaseController{ private static final String BASE_MONITORING_TEMPLATE = "Base Monitoring Template"; private static final String MONITORING_TEMPLATE = "Monitoring Template"; - - /*** * Get one resource information * @param theResourceId retrieved resource id diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/BaseBusinessLogic.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/BaseBusinessLogic.java index bfec7ed..6779257 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/BaseBusinessLogic.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/BaseBusinessLogic.java @@ -11,6 +11,7 @@ import org.onap.sdc.dcae.composition.restmodels.CreateMcResponse; import org.onap.sdc.dcae.composition.restmodels.VfcmtData; import org.onap.sdc.dcae.composition.restmodels.sdc.*; import org.onap.sdc.dcae.composition.util.DcaeBeConstants; +import org.onap.sdc.dcae.composition.util.SystemProperties; import org.onap.sdc.dcae.enums.AssetType; import org.onap.sdc.dcae.enums.LifecycleOperationType; import org.onap.sdc.dcae.errormng.ActionStatus; @@ -21,7 +22,6 @@ import org.onap.sdc.dcae.utils.Normalizers; import org.onap.sdc.dcae.utils.SdcRestClientUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.Base64Utils; @@ -29,6 +29,10 @@ import java.io.IOException; @Component public class BaseBusinessLogic { + + @Autowired + protected SystemProperties systemProperties; + @Autowired protected ISdcClient sdcRestClient; @@ -39,6 +43,10 @@ public class BaseBusinessLogic { return sdcRestClient; } + public SystemProperties getSystemProperties() { + return systemProperties; + } + void setSdcRestClient(ISdcClient sdcRestClient) { this.sdcRestClient = sdcRestClient; } @@ -85,7 +93,7 @@ public class BaseBusinessLogic { return new CreateMcResponse(vfcmt, new ObjectMapper().readValue(cdumpPayload, Object.class)); } - public Artifact fetchCdump(ResourceDetailed vfcmt, String requestId) { + Artifact fetchCdump(ResourceDetailed vfcmt, String requestId) { Artifact cdumpArtifactData = findCdumpArtifactData(vfcmt); if (null != cdumpArtifactData) { String cdumpPayload = sdcRestClient.getResourceArtifact(vfcmt.getUuid(), cdumpArtifactData.getArtifactUUID(), requestId); @@ -110,22 +118,19 @@ public class BaseBusinessLogic { .filter(p -> Normalizers.normalizeComponentInstanceName(vfiName).equals(Normalizers.normalizeComponentInstanceName(p.getResourceInstanceName()))).findAny().orElse(null); } - public String extractFlowTypeFromCdump(String cdump) { + String extractFlowTypeFromCdump(String cdump) { return StringUtils.substringBetween(cdump,"\"flowType\":\"","\""); } - // TODO - reuse - - ResourceDetailed checkinVfcmt(String userId, String uuid, String requestId) { + public ResourceDetailed checkinVfcmt(String userId, String uuid, String requestId) { return getSdcRestClient().changeResourceLifecycleState(userId, uuid, LifecycleOperationType.CHECKIN.name(), "checking in vfcmt" + uuid, requestId); } - ResourceDetailed checkoutVfcmt(String userId, String uuid, String requestId) { + public ResourceDetailed checkoutVfcmt(String userId, String uuid, String requestId) { return getSdcRestClient().changeResourceLifecycleState(userId, uuid, LifecycleOperationType.CHECKOUT.name(), null, requestId); } - // TODO - remove from BaseController - void checkUserIfResourceCheckedOut(String userId, Asset asset) { + public void checkUserIfResourceCheckedOut(String userId, Asset asset) { if (DcaeBeConstants.LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT == DcaeBeConstants.LifecycleStateEnum.findState(asset.getLifecycleState())) { String lastUpdaterUserId = asset.getLastUpdaterUserId(); if (lastUpdaterUserId != null && !lastUpdaterUserId.equals(userId)) { @@ -136,18 +141,18 @@ public class BaseBusinessLogic { } } - boolean isNeedToCheckOut(String lifecycleState) { + public boolean isNeedToCheckOut(String lifecycleState) { return DcaeBeConstants.LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT != DcaeBeConstants.LifecycleStateEnum.findState(lifecycleState); } - void checkVfcmtType(ResourceDetailed vfcmt) { + public void checkVfcmtType(ResourceDetailed vfcmt) { if (AssetType.VFCMT != getValidAssetTypeOrNull(vfcmt.getResourceType()) || !"Template".equals(vfcmt.getCategory())) { ResponseFormat responseFormat = ErrConfMgr.INSTANCE.getResponseFormat(ActionStatus.RESOURCE_NOT_VFCMT_ERROR, null, vfcmt.getUuid()); throw new DcaeException(HttpStatus.BAD_REQUEST, responseFormat.getRequestError()); } } - AssetType getValidAssetTypeOrNull(String type) { + public AssetType getValidAssetTypeOrNull(String type) { try { return AssetType.getAssetTypeByName(type); } catch (IllegalArgumentException e) { @@ -156,9 +161,4 @@ public class BaseBusinessLogic { } } - ResponseEntity handleException(Exception e, ErrConfMgr.ApiType apiType, String... variables){ - errLogger.log(LogLevel.ERROR, this.getClass().getName(), e.getMessage()); - return ErrConfMgr.INSTANCE.handleException(e, apiType, variables); - } - } diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/BlueprintBusinessLogic.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/BlueprintBusinessLogic.java index 0ccb6d8..7a6f9a7 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/BlueprintBusinessLogic.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/BlueprintBusinessLogic.java @@ -10,7 +10,6 @@ import org.onap.sdc.dcae.composition.restmodels.VfcmtData; import org.onap.sdc.dcae.composition.restmodels.sdc.Artifact; import org.onap.sdc.dcae.composition.restmodels.sdc.ResourceDetailed; import org.onap.sdc.dcae.composition.util.DcaeBeConstants; -import org.onap.sdc.dcae.composition.util.SystemProperties; import org.onap.sdc.dcae.errormng.ActionStatus; import org.onap.sdc.dcae.errormng.ErrConfMgr; import org.springframework.beans.factory.annotation.Autowired; @@ -23,15 +22,12 @@ import java.io.StringReader; import java.net.URI; @Component -public class BlueprintBusinessLogic extends BaseBusinessLogic { +public class BlueprintBusinessLogic extends CompositionBusinessLogic { @Autowired private Blueprinter blueprinter; @Autowired private ASDC asdc; - @Autowired - private SystemProperties systemProperties; - @Autowired private CompositionBusinessLogic compositionBusinessLogic; @PostConstruct @@ -41,6 +37,7 @@ public class BlueprintBusinessLogic extends BaseBusinessLogic { debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "SDC uri: {}", sdcUri); } + public ResponseEntity generateAndSaveBlueprint(String userId, String context, String vfcmtUuid, String serviceUuid, String vfiName, String flowType, String requestId) { try { // prepare - fetch vfcmt and cdump @@ -69,7 +66,7 @@ public class BlueprintBusinessLogic extends BaseBusinessLogic { } VfcmtData vfcmtData = new VfcmtData(vfcmt, vfiName, flowTypeFromCdump, serviceUuid); - Artifact blueprintArtifactResult = compositionBusinessLogic.submitComposition(userId, context, vfcmtData, resultBlueprintCreation, requestId); + Artifact blueprintArtifactResult = submitComposition(userId, context, vfcmtData, resultBlueprintCreation, requestId); if (null == blueprintArtifactResult) { return ErrConfMgr.INSTANCE.buildErrorResponse(ActionStatus.SUBMIT_BLUEPRINT_ERROR); } @@ -78,7 +75,8 @@ public class BlueprintBusinessLogic extends BaseBusinessLogic { response.setSuccessResponse("Blueprint build complete \n. Blueprint=" + blueprintArtifactResult.getArtifactName()); return new ResponseEntity<>(response, HttpStatus.OK); } catch (Exception e) { - return handleException(e, ErrConfMgr.ApiType.SUBMIT_BLUEPRINT); + errLogger.log(LogLevel.ERROR, this.getClass().getName(), e.getMessage()); + return ErrConfMgr.INSTANCE.handleException(e, ErrConfMgr.ApiType.SUBMIT_BLUEPRINT); } } diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionBusinessLogic.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionBusinessLogic.java index e81ffe0..a3c68f6 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionBusinessLogic.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionBusinessLogic.java @@ -31,6 +31,13 @@ public class CompositionBusinessLogic extends BaseBusinessLogic { private static final String CREATE_DESC = "creating new artifact blueprint on the service vfi"; private static final String UPDATE_DESC = "updating artifact blueprint on the service vfi"; + //canvas cdump as simple string + public Artifact getComposition(String vfcmtUuid, String requestId) { + ResourceDetailed vfcmt = sdcRestClient.getResource(vfcmtUuid, requestId); + return fetchCdump(vfcmt, requestId); + } + + //cdump and vfcmt for monitoring configuration public CreateMcResponse getDataAndComposition(String vfcmtUuid, String requestId) throws IOException { ResourceDetailed vfcmt = sdcRestClient.getResource(vfcmtUuid, requestId); Artifact composition = fetchCdump(vfcmt, requestId); @@ -73,7 +80,7 @@ public class CompositionBusinessLogic extends BaseBusinessLogic { } } - public Artifact submitComposition(String userId, String context, VfcmtData vfcmtData, String resultBlueprintCreation, String requestId) throws JsonProcessingException { + Artifact submitComposition(String userId, String context, VfcmtData vfcmtData, String resultBlueprintCreation, String requestId) throws JsonProcessingException { // get service / find vfi ServiceDetailed service = sdcRestClient.getAssetMetadata(context, vfcmtData.getServiceUuid(), requestId); 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 new file mode 100644 index 0000000..ff596b5 --- /dev/null +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogic.java @@ -0,0 +1,205 @@ +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.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.async.DeferredResult; + +@Component +public class CompositionCatalogBusinessLogic { + + @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()); + + 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; + } + }); + return result; + } + + 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; + } + + 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 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; + } + }); + return result; + } + + /// Nested Catalog Data Handlers /// + + private class FolderHandler extends CatalogController.CatalogHandler<Catalog.Folder> { + + private Catalog catalog; + + 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; + } + } + + 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; + } + } + + 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; + } + + 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); + } + } + return response; + } + } +} + + + + + + diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/ReferenceBusinessLogic.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/ReferenceBusinessLogic.java index 1396cc9..9c950b6 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/ReferenceBusinessLogic.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/ReferenceBusinessLogic.java @@ -34,7 +34,7 @@ public class ReferenceBusinessLogic extends BaseBusinessLogic { .ifPresent(artifact -> sdcRestClient.deleteInstanceArtifact(userId, context, serviceUuid, normalizedVfiName, artifact.getArtifactUUID(), requestId)); } } catch (Exception e) { - debugLogger.log(LogLevel.DEBUG, this.getClass().getName(),"Failed to delete blueprint with serviceUuid {}, vfcmtUuid . message: {} ", serviceUuid, vfcmtUuid, e); + debugLogger.log(LogLevel.DEBUG, this.getClass().getName(),"Failed to delete blueprint with serviceUuid {}, vfcmtUuid {}, message: {} ", serviceUuid, vfcmtUuid, e); return ErrConfMgr.INSTANCE.buildErrorResponse(ActionStatus.DELETE_BLUEPRINT_FAILED, e.getMessage()); } return new ResponseEntity<>(HttpStatus.OK); diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/RuleEditorBusinessLogic.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/RuleEditorBusinessLogic.java index d17a6bf..298ffac 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/RuleEditorBusinessLogic.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/RuleEditorBusinessLogic.java @@ -29,7 +29,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.Base64Utils; import org.springframework.util.CollectionUtils; -import org.springframework.web.bind.annotation.*; import java.util.*; import java.util.stream.Collectors; diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/ServiceBusinessLogic.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/ServiceBusinessLogic.java index d04c67a..8dbe2e9 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/ServiceBusinessLogic.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/composition/impl/ServiceBusinessLogic.java @@ -1,29 +1,29 @@ package org.onap.sdc.dcae.composition.impl; - import org.onap.sdc.common.onaplog.Enums.LogLevel; - import org.onap.sdc.dcae.composition.restmodels.AttachVFCMTServiceRequest; - import org.onap.sdc.dcae.composition.restmodels.DcaeMinimizedService; - import org.onap.sdc.dcae.composition.restmodels.MessageResponse; - import org.onap.sdc.dcae.composition.restmodels.sdc.*; - import org.onap.sdc.dcae.composition.util.DcaeBeConstants; - import org.onap.sdc.dcae.enums.ArtifactType; - import org.onap.sdc.dcae.enums.LifecycleOperationType; - import org.onap.sdc.dcae.errormng.ActionStatus; - import org.onap.sdc.dcae.errormng.DcaeException; - import org.onap.sdc.dcae.errormng.ErrConfMgr; - import org.onap.sdc.dcae.errormng.ResponseFormat; - import org.onap.sdc.dcae.utils.SdcRestClientUtils; - import org.springframework.http.HttpStatus; - import org.springframework.http.ResponseEntity; - import org.springframework.stereotype.Component; - import org.springframework.util.Base64Utils; - import org.springframework.util.CollectionUtils; - - import java.util.ArrayList; - import java.util.Comparator; - import java.util.LinkedHashMap; - import java.util.List; - import java.util.stream.Collectors; +import org.onap.sdc.common.onaplog.Enums.LogLevel; +import org.onap.sdc.dcae.composition.restmodels.AttachVFCMTServiceRequest; +import org.onap.sdc.dcae.composition.restmodels.DcaeMinimizedService; +import org.onap.sdc.dcae.composition.restmodels.MessageResponse; +import org.onap.sdc.dcae.composition.restmodels.sdc.*; +import org.onap.sdc.dcae.composition.util.DcaeBeConstants; +import org.onap.sdc.dcae.enums.ArtifactType; +import org.onap.sdc.dcae.enums.LifecycleOperationType; +import org.onap.sdc.dcae.errormng.ActionStatus; +import org.onap.sdc.dcae.errormng.DcaeException; +import org.onap.sdc.dcae.errormng.ErrConfMgr; +import org.onap.sdc.dcae.errormng.ResponseFormat; +import org.onap.sdc.dcae.utils.SdcRestClientUtils; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.util.Base64Utils; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.stream.Collectors; @Component public class ServiceBusinessLogic extends BaseBusinessLogic { diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/validators/RuleValidator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/validators/RuleValidator.java index e03ca8a..33e1b33 100644 --- a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/validators/RuleValidator.java +++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/validators/RuleValidator.java @@ -20,11 +20,11 @@ public class RuleValidator implements IRuleElementValidator<Rule> { private RuleValidator(){} - public boolean validate(Rule rule, List<ResponseFormat> errors) { boolean valid = true; - if(rule.isConditionalRule()) + if(rule.isConditionalRule()) { valid = getConditionValidator(rule.getCondition()).validate(rule.getCondition(), errors); + } if(!ValidationUtils.validateNotEmpty(rule.getDescription())) { valid = false; errors.add(ErrConfMgr.INSTANCE.getResponseFormat(ActionStatus.MISSING_RULE_DESCRIPTION, null, null)); diff --git a/dcaedt_be/src/test/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogicTest.java b/dcaedt_be/src/test/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogicTest.java new file mode 100644 index 0000000..ac12f8d --- /dev/null +++ b/dcaedt_be/src/test/java/org/onap/sdc/dcae/composition/impl/CompositionCatalogBusinessLogicTest.java @@ -0,0 +1,74 @@ +package org.onap.sdc.dcae.composition.impl; + +import org.json.JSONException; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.onap.sdc.dcae.catalog.asdc.ASDCCatalog; +import org.onap.sdc.dcae.catalog.engine.CatalogController; +import org.onap.sdc.dcae.catalog.engine.CatalogError; +import org.onap.sdc.dcae.catalog.engine.CatalogResponse; +import org.springframework.web.context.request.async.DeferredResult; + +import java.net.URI; +import java.util.UUID; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.*; + +public class CompositionCatalogBusinessLogicTest { + + @Mock + private CatalogController catalogController; + + private ASDCCatalog asdcCatalog = new ASDCCatalog(URI.create("https://mockUri:8888#mock")); + + @InjectMocks + private CompositionCatalogBusinessLogic compositionCatalogBusinessLogic = new CompositionCatalogBusinessLogic(); + + @Before + public void init() throws JSONException { + MockitoAnnotations.initMocks(this); + when(catalogController.getCatalog(any())).thenReturn(asdcCatalog); + } + + @Test + public void getItemsTest() { + compositionCatalogBusinessLogic.getItems(null).getResult(); + verify(catalogController, times(7)).patchData(any(), any()); + } + + @Test + public void getItemByIdNoSuchFolderFailureTest() { + DeferredResult<CatalogResponse> result = compositionCatalogBusinessLogic.getItemById(null, "No Such Category"); + verify(catalogController).getCatalog(any()); + verify(catalogController, times(0)).patchData(any(), any()); + CatalogError error = (CatalogError)result.getResult(); + assertEquals("{\"exception\":\"java.lang.RuntimeException: No such folder No Such Category\",\"message\":\"Catalog API failed\"}", error.getError()); + } + + @Test + public void getModelByIdInvalidUuidFailureTest() { + try { + compositionCatalogBusinessLogic.getModelById(null, "Invalid-UUID"); + } catch (IllegalArgumentException e) { + assertEquals("Invalid UUID string: Invalid-UUID", e.getMessage()); + verify(catalogController).getCatalog(any()); + verify(catalogController, times(0)).patchData(any(), any()); + } + } + + @Test + public void getTypeInfoModelNotLoadedFailureTest() { + // this is pretty awful. you cannot call 'getTypeInfo' unless it is preceded by a 'getModel' call of the containing model, so that the 'catalogs' item is populated by the container model id. + String uuid = UUID.randomUUID().toString(); + DeferredResult<CatalogResponse> result = compositionCatalogBusinessLogic.getTypeInfo(null, uuid, "tosca.nodes.Root"); + verify(catalogController).getCatalog(any()); + verify(catalogController, times(0)).patchData(any(), any()); + CatalogError error = (CatalogError)result.getResult(); + assertEquals("{\"exception\":\"java.lang.Exception: No catalog available for resource " + uuid + ". You might want to fetch the model first.\",\"message\":\"Catalog API failed\"}", error.getError()); + } +}
\ No newline at end of file diff --git a/dcaedt_be/src/test/java/org/onap/sdc/dcae/composition/impl/ServiceBusinessLogicTest.java b/dcaedt_be/src/test/java/org/onap/sdc/dcae/composition/impl/ServiceBusinessLogicTest.java index 3cac355..a6f82f6 100644 --- a/dcaedt_be/src/test/java/org/onap/sdc/dcae/composition/impl/ServiceBusinessLogicTest.java +++ b/dcaedt_be/src/test/java/org/onap/sdc/dcae/composition/impl/ServiceBusinessLogicTest.java @@ -1,173 +1,281 @@ package org.onap.sdc.dcae.composition.impl; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.when; - -import java.util.*; -import java.util.stream.Collectors; - import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.junit.Before; +import org.junit.Test; import org.mockito.InjectMocks; -import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.onap.sdc.dcae.client.ISdcClient; +import org.onap.sdc.dcae.composition.restmodels.AttachVFCMTServiceRequest; import org.onap.sdc.dcae.composition.restmodels.DcaeMinimizedService; -import org.onap.sdc.dcae.composition.impl.ServiceBusinessLogic; +import org.onap.sdc.dcae.composition.restmodels.MessageResponse; import org.onap.sdc.dcae.composition.restmodels.ruleeditor.ActionDeserializer; import org.onap.sdc.dcae.composition.restmodels.ruleeditor.BaseAction; import org.onap.sdc.dcae.composition.restmodels.ruleeditor.BaseCondition; import org.onap.sdc.dcae.composition.restmodels.ruleeditor.ConditionDeserializer; -import org.onap.sdc.dcae.composition.restmodels.sdc.Artifact; -import org.onap.sdc.dcae.composition.restmodels.sdc.ResourceInstance; -import org.onap.sdc.dcae.composition.restmodels.sdc.ServiceDetailed; +import org.onap.sdc.dcae.composition.restmodels.sdc.*; import org.onap.sdc.dcae.composition.util.DcaeBeConstants; -import org.onap.sdc.dcae.composition.util.DcaeBeConstants.LifecycleStateEnum; import org.onap.sdc.dcae.errormng.ErrorConfigurationLoader; -import org.testng.annotations.Test; +import org.onap.sdc.dcae.errormng.ResponseFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + + +import java.util.*; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.when; +import static org.testng.Assert.assertNotEquals; public class ServiceBusinessLogicTest { - private String userId = "me"; - private String requestId = "1"; - private String monitoringComponentName = "monitoringComponentName"; - private String serviceUuid = "serviceUuid"; - private String vfiName = "vfiName"; + private String uuid = "b632b1da-e6ab-419d-8853-420e259097d9"; + private String userId = "gc786h"; + private String requestId = "1"; + private String monitoringComponentName = "monitoringComponentName"; + private String serviceUuid = "serviceUuid"; + private String vfiName = "vfiName"; + private String vfcmtUuid = "26e8d4b5-f087-4821-a75a-0b9514b5a7ab"; + private ResourceDetailed vfcmt = Mockito.mock(ResourceDetailed.class); + private String categoryName = "Template"; + private String resourceType = "VFCMT"; + private ISdcClient sdcClientMock = Mockito.mock(ISdcClient.class); + + + private static Gson gson = new GsonBuilder() + .registerTypeAdapter(BaseAction.class, new ActionDeserializer()) + .registerTypeAdapter(BaseCondition.class, new ConditionDeserializer()).create(); + + @InjectMocks + ServiceBusinessLogic serviceBusinessLogic = new ServiceBusinessLogic(); + + + @Before + public void setUp() { + + MockitoAnnotations.initMocks(this); + serviceBusinessLogic.setSdcRestClient(sdcClientMock); + + new ErrorConfigurationLoader(System.getProperty("user.dir") + "/src/main/webapp/WEB-INF"); + + setServicesMock(); + setVfcmtMock(); + } + + private void setVfcmtMock() { + + when(vfcmt.getResourceType()).thenReturn(resourceType); + when(vfcmt.getCategory()).thenReturn(categoryName); + when(vfcmt.getLifecycleState()).thenReturn("NOT_CERTIFIED_CHECKIN"); + when(vfcmt.getUuid()).thenReturn(vfcmtUuid); + List<Artifact> artifactList = new ArrayList<>(); + Artifact artifact = Mockito.mock(Artifact.class);//gson.fromJson(artifactJson, Artifact.class); + artifactList.add(artifact); + when(vfcmt.getArtifacts()).thenReturn(artifactList); + + when(artifact.getArtifactName()).thenReturn(DcaeBeConstants.Composition.fileNames.SVC_REF); + + when(serviceBusinessLogic.getSdcRestClient().getResource(anyString(), anyString())).thenReturn(vfcmt); + when(serviceBusinessLogic.getSdcRestClient().changeResourceLifecycleState(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(vfcmt); + + } + + private void setServicesMock() { + + ServiceDetailed serviceDetailed = new ServiceDetailed(); + ResourceInstance resourceInstance = new ResourceInstance(); + Artifact artifact = new Artifact(); + artifact.setArtifactName("." + monitoringComponentName + "." + DcaeBeConstants.Composition.fileNames.EVENT_PROC_BP_YAML); + resourceInstance.setArtifacts(Collections.singletonList(artifact)); + resourceInstance.setResourceInstanceName(vfiName); + resourceInstance.setResoucreType("VF"); + serviceDetailed.setResources(Collections.singletonList(resourceInstance)); + when(serviceBusinessLogic.getSdcRestClient().getService(anyString(), anyString())).thenReturn(serviceDetailed); + + String serviceJson = "{\n\"lastUpdaterFullName\":\"GALCOHEN\",\n\"resources\":[{\n\"resourceInstanceName\":\"LiavVf0\",\n\"resourceName\":\"LiavVf\",\n\"resourceInvariantUUID\":\"47d5c3d6-83d8-4cbc-831c-1c7e52bd2964\",\n\"resourceVersion\":\"0.1\",\n\"resoucreType\":\"VF\",\n\"resourceUUID\":\"6e3a2db2-213b-41a4-b9eb-afab3c3b1463\",\n\"artifacts\":null\n}],\n\"artifacts\":null,\n\"distributionStatus\":\"DISTRIBUTION_NOT_APPROVED\",\n\"uuid\":\"b632b1da-e6ab-419d-8853-420e259097d9\",\n\"invariantUUID\":\"4cc1f274-107c-48e7-a7c7-9768c88043f7\",\n\"name\":\"Rony7777777\",\n\"version\":\"0.2\",\n\"toscaModelURL\":\"/sdc/v1/catalog/services/b632b1da-e6ab-419d-8853-420e259097d9/toscaModel\",\n\"lastUpdaterUserId\":\"gc786h\",\n\"category\":\"NetworkL1-3\",\n\"lifecycleState\":\"NOT_CERTIFIED_CHECKOUT\"\n}\n"; + Service service = gson.fromJson(serviceJson, Service.class); + List<Service> serviceList = new ArrayList<>(); + serviceList.add(service); + when(serviceBusinessLogic.getSdcRestClient().getServices(requestId)).thenReturn(serviceList); + + } + + @Test + public void test_Service() { + + ResponseEntity<ServiceDetailed> result = serviceBusinessLogic.service(uuid, requestId); - private static Gson gson = new GsonBuilder() - .registerTypeAdapter(BaseAction.class, new ActionDeserializer()) - .registerTypeAdapter(BaseCondition.class, new ConditionDeserializer()).create(); + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertEquals("vfiName", result.getBody().getResources().get(0).getResourceInstanceName()); + assertEquals("VF", result.getBody().getResources().get(0).getResoucreType()); + } - ServiceBusinessLogic target = new ServiceBusinessLogic(); + @Test + public void test_Services() { + ResponseEntity<List<Service>> result = serviceBusinessLogic.services(userId, vfcmtUuid, requestId); + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertNotEquals(0, result.getBody().size()); + assertEquals(uuid, result.getBody().get(0).getUuid()); - @Test - public void parseAndFliterServicesByUser_nullServices_TBD() { + } + + @Test + public void test_AttachService() { + + AttachVFCMTServiceRequest request = new AttachVFCMTServiceRequest(); + request.setServiceUuid(serviceUuid); + request.setInstanceName(vfiName); + + + ResponseEntity<MessageResponse> result = serviceBusinessLogic.attachService(vfcmtUuid, userId, request, requestId); + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertThat(result.getBody().getSuccessResponse()).isEqualTo("Artifact updated"); + } + + @Test + public void test_AttachService_verifyVfiExists_Exception() { + + AttachVFCMTServiceRequest request = new AttachVFCMTServiceRequest(); + request.setServiceUuid(serviceUuid); + request.setInstanceName("WrongName"); + when(serviceBusinessLogic.checkinVfcmt(userId, uuid, requestId)).thenReturn(null); + + ResponseEntity<ResponseFormat> result = serviceBusinessLogic.attachService(vfcmtUuid, userId, request, requestId); + assertEquals(HttpStatus.NOT_FOUND, result.getStatusCode()); + assertEquals("SVC6039", result.getBody().getRequestError().getServiceException().getMessageId()); + } + + @Test + public void test_GetAttachedService() { + + when(serviceBusinessLogic.getSdcRestClient().getResourceArtifact(anyString(), anyString(), anyString())).thenReturn("artifact data"); + + ResponseEntity<MessageResponse> result = serviceBusinessLogic.getAttachedService(vfcmtUuid, requestId); + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertThat(result.getBody().getSuccessResponse()).isEqualTo("artifact data"); + } + + + @Test + public void test_parseAndFliterServicesByUser_nullServices_TBD() { // fail("TODO Auto-generated method stub"); - } - - - @Test - public void parseAndFliterServicesByUser_emptyList_emptyList() { - // arrange - String user_id = "test"; - String lastUpdaterUserId = "test"; - List<LinkedHashMap<String, String>> services = new ArrayList<LinkedHashMap<String, String>>(); - // act - List<DcaeMinimizedService> result = target.parseAndFilterServicesByUser(lastUpdaterUserId, services, user_id); - // assert - assertThat(result).isEqualTo(new ArrayList<DcaeMinimizedService>()); - } - - - @Test - public void parseAndFliterServicesByUser_singleServicesAsMap_singleServiceParsed() { - // arrange - String user_id = "test"; - String lastUpdaterUserId = user_id; - String uuid = "a"; - String invariantUUID = "1"; - String lifecycleState = LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name(); - String version = "0.1"; - String serviceName = "TestService"; - - LinkedHashMap<String, String> service = createServiceAsMap(lastUpdaterUserId, uuid, invariantUUID, - lifecycleState, version, serviceName); - List<LinkedHashMap<String, String>> services = new ArrayList<LinkedHashMap<String, String>>( - Arrays.asList(service)); - - DcaeMinimizedService expected = new DcaeMinimizedService(uuid, serviceName, lastUpdaterUserId, lifecycleState, - version, invariantUUID); - // act - List<DcaeMinimizedService> result = target.parseAndFilterServicesByUser(lastUpdaterUserId, services, user_id); - // assert - assertThat(result).usingRecursiveFieldByFieldElementComparator().contains(expected); - } - - - @Test - public void parseAndFliterServicesByUser_unsortedServices_sortedServices() { - // arrange - String user_id = "test"; - String lastUpdaterUserId = user_id; - String uuid = "a"; - String lifecycleState = LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name(); - String version = "0.1"; - - List<LinkedHashMap<String, String>> unsortedServices = Arrays.asList("d", "a", "c", "b").stream() - .map(x -> createServiceAsMap(lastUpdaterUserId, uuid, UUID.randomUUID().toString(), lifecycleState, version, x)) - .collect(Collectors.toList()); - - - // act - List<DcaeMinimizedService> result = target.parseAndFilterServicesByUser(lastUpdaterUserId, unsortedServices, - user_id); - // assert - assertThat(result).extracting("name").containsExactly("a","b","c","d"); - } - - - @Test - public void parseAndFliterServicesByUser_allOptionsForLastUpdaterAndIsCheckout_allOptionsButIsCheckoutAndNotLastUpdater() { - // ------------user == last_updater - // -----------------True----False-- - // isCheckout---------------------- - // --------True------V--------X---- - // --------False-----V--------V---- - // -------------------------------- + } + + + @Test + public void test_parseAndFliterServicesByUser_emptyList_emptyList() { + // arrange + String user_id = "test"; + String lastUpdaterUserId = "test"; + List<LinkedHashMap<String, String>> services = new ArrayList<LinkedHashMap<String, String>>(); + // act + List<DcaeMinimizedService> result = serviceBusinessLogic.parseAndFilterServicesByUser(lastUpdaterUserId, services, user_id); + // assert + assertThat(result).isEqualTo(new ArrayList<DcaeMinimizedService>()); + } + + + @Test + public void test_parseAndFliterServicesByUser_singleServicesAsMap_singleServiceParsed() { + // arrange + String user_id = "test"; + String lastUpdaterUserId = user_id; + String uuid = "a"; + String invariantUUID = "1"; + String lifecycleState = DcaeBeConstants.LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name(); + String version = "0.1"; + String serviceName = "TestService"; + + LinkedHashMap<String, String> service = createServiceAsMap(lastUpdaterUserId, uuid, invariantUUID, + lifecycleState, version, serviceName); + List<LinkedHashMap<String, String>> services = new ArrayList<LinkedHashMap<String, String>>( + Arrays.asList(service)); + + DcaeMinimizedService expected = new DcaeMinimizedService(uuid, serviceName, lastUpdaterUserId, lifecycleState, + version, invariantUUID); + // act + List<DcaeMinimizedService> result = serviceBusinessLogic.parseAndFilterServicesByUser(lastUpdaterUserId, services, user_id); + // assert + assertThat(result).usingRecursiveFieldByFieldElementComparator().contains(expected); + } + + + @Test + public void test_parseAndFliterServicesByUser_unsortedServices_sortedServices() { + // arrange + String user_id = "test"; + String lastUpdaterUserId = user_id; + String uuid = "a"; + String lifecycleState = DcaeBeConstants.LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name(); + String version = "0.1"; + + List<LinkedHashMap<String, String>> unsortedServices = Arrays.asList("d", "a", "c", "b").stream() + .map(x -> createServiceAsMap(lastUpdaterUserId, uuid, UUID.randomUUID().toString(), lifecycleState, version, x)) + .collect(Collectors.toList()); + + + // act + List<DcaeMinimizedService> result = serviceBusinessLogic.parseAndFilterServicesByUser(lastUpdaterUserId, unsortedServices, + user_id); + // assert + assertThat(result).extracting("name").containsExactly("a", "b", "c", "d"); + } + + + @Test + public void test_parseAndFliterServicesByUser_allOptionsForLastUpdaterAndIsCheckout_allOptionsButIsCheckoutAndNotLastUpdater() { + // ------------user == last_updater + // -----------------True----False-- + // isCheckout---------------------- + // --------True------V--------X---- + // --------False-----V--------V---- + // -------------------------------- // fail("TODO Auto-generated method stub"); - } - - - @Test - public void parseAndFliterServicesByUser_singleServiceWithMultiVersions_singleServiceWithLatestVersion() { - // arrange - String user_id = "test"; - String lastUpdaterUserId = user_id; - String uuid = "a"; - String invariantUUID = "1"; - String lifecycleState = LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name(); - String serviceName = "TestService"; - - List<LinkedHashMap<String, String>> singleServiceWithMultiVersions = Arrays.asList("1.0", "0.3", "11.0", "2.0", "1.8").stream() - .map(x -> createServiceAsMap(lastUpdaterUserId, uuid, invariantUUID, lifecycleState, x, serviceName)) - .collect(Collectors.toList()); - - // act - List<DcaeMinimizedService> result = target.parseAndFilterServicesByUser(lastUpdaterUserId, singleServiceWithMultiVersions, user_id); - - // assert - assertThat(result).extracting("version").containsExactly("11.0"); - } - - - private static LinkedHashMap<String, String> createServiceAsMap(String lastUpdaterUserId, String uuid, - String invariantUUID, String lifecycleState, String version, String serviceName) { - - LinkedHashMap<String, String> service = new LinkedHashMap<String, String>() { - { - put("invariantUUID", invariantUUID); - put("uuid", uuid); - put("name", serviceName); - put("lastUpdaterUserId", lastUpdaterUserId); - put("lifecycleState", lifecycleState); - put("version", version); - } - }; - - return service; - } - private void mockGetService() - { - ServiceDetailed serviceDetailed = new ServiceDetailed(); - ResourceInstance resourceInstance = new ResourceInstance(); - Artifact artifact = new Artifact(); - artifact.setArtifactName("." + monitoringComponentName + "." + DcaeBeConstants.Composition.fileNames.EVENT_PROC_BP_YAML); - resourceInstance.setArtifacts(Collections.singletonList(artifact)); - resourceInstance.setResourceInstanceName(vfiName); - serviceDetailed.setResources(Collections.singletonList(resourceInstance)); - when(target.getSdcRestClient().getService(serviceUuid, requestId)).thenReturn(serviceDetailed); - } -} + } + + + @Test + public void test_parseAndFliterServicesByUser_singleServiceWithMultiVersions_singleServiceWithLatestVersion() { + // arrange + String user_id = "test"; + String lastUpdaterUserId = user_id; + String uuid = "a"; + String invariantUUID = "1"; + String lifecycleState = DcaeBeConstants.LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name(); + String serviceName = "TestService"; + + List<LinkedHashMap<String, String>> singleServiceWithMultiVersions = Arrays.asList("1.0", "0.3", "11.0", "2.0", "1.8").stream() + .map(x -> createServiceAsMap(lastUpdaterUserId, uuid, invariantUUID, lifecycleState, x, serviceName)) + .collect(Collectors.toList()); + + // act + List<DcaeMinimizedService> result = serviceBusinessLogic.parseAndFilterServicesByUser(lastUpdaterUserId, singleServiceWithMultiVersions, user_id); + + // assert + assertThat(result).extracting("version").containsExactly("11.0"); + } + + + private static LinkedHashMap<String, String> createServiceAsMap(String lastUpdaterUserId, String uuid, + String invariantUUID, String lifecycleState, String version, String serviceName) { + + LinkedHashMap<String, String> service = new LinkedHashMap<String, String>() { + { + put("invariantUUID", invariantUUID); + put("uuid", uuid); + put("name", serviceName); + put("lastUpdaterUserId", lastUpdaterUserId); + put("lifecycleState", lifecycleState); + put("version", version); + } + }; + + return service; + } +}
\ No newline at end of file |