diff options
author | 2022-04-13 11:21:15 +0100 | |
---|---|---|
committer | 2022-04-21 09:48:05 +0000 | |
commit | 30ff812c65389f5ca4c91d9774d425e81ef62049 (patch) | |
tree | b7d293c23621df6c1084b9ff7dbde9c7d7d888ac /openecomp-be/api/openecomp-sdc-rest-webapp/vendor-license-rest/vendor-license-rest-services/src/main | |
parent | 225dabdf0812d1a3d9eb3a96740507744bb2b807 (diff) |
Check if VLM is used before deleting
Checks if the VLM is in use by any VSP before allowing to delete it.
Add unit tests for the delete method, considering the restriction.
Applies minor refactors with related code.
Change-Id: I4ff6ddf3959a4ca92ab68b29c8913fc6f0ebdb3c
Issue-ID: SDC-3966
Signed-off-by: andre.schmid <andre.schmid@est.tech>
Diffstat (limited to 'openecomp-be/api/openecomp-sdc-rest-webapp/vendor-license-rest/vendor-license-rest-services/src/main')
2 files changed, 171 insertions, 23 deletions
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-license-rest/vendor-license-rest-services/src/main/java/org/openecomp/sdcrests/vendorlicense/rest/exception/VendorLicenseModelExceptionSupplier.java b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-license-rest/vendor-license-rest-services/src/main/java/org/openecomp/sdcrests/vendorlicense/rest/exception/VendorLicenseModelExceptionSupplier.java new file mode 100644 index 0000000000..330a2dd4d1 --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-license-rest/vendor-license-rest-services/src/main/java/org/openecomp/sdcrests/vendorlicense/rest/exception/VendorLicenseModelExceptionSupplier.java @@ -0,0 +1,87 @@ +/* + * - + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdcrests.vendorlicense.rest.exception; + +import static org.openecomp.sdc.vendorlicense.errors.VendorLicenseErrorCodes.VLM_IS_CERTIFIED_DELETE_ERROR; +import static org.openecomp.sdc.vendorlicense.errors.VendorLicenseErrorCodes.VLM_IS_IN_USE_DELETE_ERROR; + +import java.util.List; +import java.util.function.Supplier; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.common.errors.ErrorCode; +import org.openecomp.sdc.common.errors.ErrorCode.ErrorCodeBuilder; +import org.openecomp.sdc.vendorlicense.errors.VendorLicenseModelNotFoundErrorBuilder; + +/** + * Supplies exceptions happened for a Vendor License Model operation . + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class VendorLicenseModelExceptionSupplier { + + /** + * Provides a could not find Vendor License Model exception. + * + * @param vlmId the Vendor License Model id + * @return a Supplier for the exception + */ + public static Supplier<CoreException> couldNotFindVlm(final String vlmId) { + final ErrorCode errorCode = new VendorLicenseModelNotFoundErrorBuilder(vlmId).build(); + return () -> new CoreException((errorCode)); + } + + /** + * Provides a cannot delete used Vendor License Model exception. + * + * @param vmlId the Vendor License Model id + * @param vspNameList the list of VSP names that uses the VLM + * @return a Supplier for the exception + */ + public static Supplier<CoreException> cantDeleteUsedVlm(final String vmlId, final List<String> vspNameList) { + final String errorMsg = String.format( + "Vendor License Model '%s' is in use by %s Vendor Software Product(s) and cannot be deleted.", + vmlId, String.join(", ", vspNameList) + ); + final ErrorCode errorCode = new ErrorCodeBuilder() + .withId(VLM_IS_IN_USE_DELETE_ERROR) + .withMessage(errorMsg) + .build(); + return () -> new CoreException((errorCode)); + } + + /** + * Provides a cannot delete certified Vendor License Model exception. + * + * @param vmlId the Vendor License Model id + * @return a Supplier for the exception + */ + public static Supplier<CoreException> cantDeleteCertifiedVlm(final String vmlId) { + final String errorMsg = String.format("Vendor License Model '%s' has been certified and cannot be deleted.", vmlId); + final ErrorCode errorCode = new ErrorCodeBuilder() + .withId(VLM_IS_CERTIFIED_DELETE_ERROR) + .withMessage(errorMsg) + .build(); + return () -> new CoreException((errorCode)); + } + +} diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-license-rest/vendor-license-rest-services/src/main/java/org/openecomp/sdcrests/vendorlicense/rest/services/VendorLicenseModelsImpl.java b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-license-rest/vendor-license-rest-services/src/main/java/org/openecomp/sdcrests/vendorlicense/rest/services/VendorLicenseModelsImpl.java index 0255b14753..f4e638c07b 100644 --- a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-license-rest/vendor-license-rest-services/src/main/java/org/openecomp/sdcrests/vendorlicense/rest/services/VendorLicenseModelsImpl.java +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-license-rest/vendor-license-rest-services/src/main/java/org/openecomp/sdcrests/vendorlicense/rest/services/VendorLicenseModelsImpl.java @@ -23,10 +23,12 @@ import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.VERS import static org.openecomp.sdc.versioning.VersioningNotificationConstansts.VERSION_NAME; import static org.openecomp.sdcrests.vendorlicense.types.VendorLicenseModelActionRequestDto.VendorLicenseModelAction.Submit; +import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.Predicate; +import java.util.stream.Collectors; import javax.inject.Named; import javax.ws.rs.core.Response; import org.openecomp.core.dao.UniqueValueDaoFactory; @@ -35,8 +37,6 @@ import org.openecomp.sdc.activitylog.ActivityLogManager; import org.openecomp.sdc.activitylog.ActivityLogManagerFactory; import org.openecomp.sdc.activitylog.dao.type.ActivityLogEntity; import org.openecomp.sdc.activitylog.dao.type.ActivityType; -import org.openecomp.sdc.common.errors.CoreException; -import org.openecomp.sdc.common.errors.ErrorCode; import org.openecomp.sdc.common.errors.Messages; import org.openecomp.sdc.datatypes.model.ItemType; import org.openecomp.sdc.healing.factory.HealingManagerFactory; @@ -52,6 +52,9 @@ import org.openecomp.sdc.vendorlicense.VendorLicenseConstants; import org.openecomp.sdc.vendorlicense.VendorLicenseManager; import org.openecomp.sdc.vendorlicense.VendorLicenseManagerFactory; import org.openecomp.sdc.vendorlicense.dao.types.VendorLicenseModelEntity; +import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao; +import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDaoFactory; +import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails; import org.openecomp.sdc.versioning.AsdcItemManager; import org.openecomp.sdc.versioning.AsdcItemManagerFactory; import org.openecomp.sdc.versioning.VersioningManager; @@ -67,6 +70,7 @@ import org.openecomp.sdcrests.item.types.ItemCreationDto; import org.openecomp.sdcrests.item.types.ItemDto; import org.openecomp.sdcrests.item.types.VersionDto; import org.openecomp.sdcrests.vendorlicense.rest.VendorLicenseModels; +import org.openecomp.sdcrests.vendorlicense.rest.exception.VendorLicenseModelExceptionSupplier; import org.openecomp.sdcrests.vendorlicense.rest.mapping.MapVendorLicenseModelEntityToDto; import org.openecomp.sdcrests.vendorlicense.rest.mapping.MapVendorLicenseModelRequestDtoToVendorLicenseModelEntity; import org.openecomp.sdcrests.vendorlicense.types.VendorLicenseModelActionRequestDto; @@ -86,13 +90,55 @@ public class VendorLicenseModelsImpl implements VendorLicenseModels { private static final String SUBMIT_ITEM_ACTION = "Submit_Item"; private static final String SUBMIT_HEALED_VERSION_ERROR = "VLM Id %s: Error while submitting version %s created based on Certified version %s for healing purpose."; private static final Logger LOGGER = LoggerFactory.getLogger(VendorLicenseModelsImpl.class); - private PermissionsManager permissionsManager = PermissionsManagerFactory.getInstance().createInterface(); - private NotificationPropagationManager notifier = NotificationPropagationManagerFactory.getInstance().createInterface(); - private AsdcItemManager asdcItemManager = AsdcItemManagerFactory.getInstance().createInterface(); - private VersioningManager versioningManager = VersioningManagerFactory.getInstance().createInterface(); - private VendorLicenseManager vendorLicenseManager = VendorLicenseManagerFactory.getInstance().createInterface(); - private ActivityLogManager activityLogManager = ActivityLogManagerFactory.getInstance().createInterface(); - private UniqueValueUtil uniqueValueUtil = new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface()); + + private final PermissionsManager permissionsManager; + private final NotificationPropagationManager notifier; + private final AsdcItemManager asdcItemManager; + private final VersioningManager versioningManager; + private final VendorLicenseManager vendorLicenseManager; + private final ActivityLogManager activityLogManager; + private final UniqueValueUtil uniqueValueUtil; + private final VendorSoftwareProductInfoDao vendorSoftwareProductInfoDao; + + public VendorLicenseModelsImpl() { + this.permissionsManager = PermissionsManagerFactory.getInstance().createInterface(); + this.notifier = NotificationPropagationManagerFactory.getInstance().createInterface(); + this.asdcItemManager = AsdcItemManagerFactory.getInstance().createInterface(); + this.versioningManager = VersioningManagerFactory.getInstance().createInterface(); + this.vendorLicenseManager = VendorLicenseManagerFactory.getInstance().createInterface(); + this.activityLogManager = ActivityLogManagerFactory.getInstance().createInterface(); + this.uniqueValueUtil = new UniqueValueUtil(UniqueValueDaoFactory.getInstance().createInterface()); + this.vendorSoftwareProductInfoDao = VendorSoftwareProductInfoDaoFactory.getInstance().createInterface(); + } + + /** + * Test purpose constructor. + * @param permissionsManager the {@link PermissionsManager} instance + * @param notifier the {@link NotificationPropagationManager} instance + * @param asdcItemManager the {@link AsdcItemManager} instance + * @param versioningManager the {@link VersioningManager} instance + * @param vendorLicenseManager the {@link VendorLicenseManager} instance + * @param activityLogManager the {@link ActivityLogManager} instance + * @param uniqueValueUtil the {@link UniqueValueUtil} instance + * @param vendorSoftwareProductInfoDao the {@link VendorSoftwareProductInfoDao} instance + */ + VendorLicenseModelsImpl(final PermissionsManager permissionsManager, + final NotificationPropagationManager notifier, + final AsdcItemManager asdcItemManager, + final VersioningManager versioningManager, + final VendorLicenseManager vendorLicenseManager, + final ActivityLogManager activityLogManager, + final UniqueValueUtil uniqueValueUtil, + final VendorSoftwareProductInfoDao vendorSoftwareProductInfoDao) { + this.permissionsManager = permissionsManager; + this.notifier = notifier; + this.asdcItemManager = asdcItemManager; + this.versioningManager = versioningManager; + this.vendorLicenseManager = vendorLicenseManager; + this.activityLogManager = activityLogManager; + this.uniqueValueUtil = uniqueValueUtil; + this.vendorSoftwareProductInfoDao = vendorSoftwareProductInfoDao; + } @Override public Response listLicenseModels(String versionStatus, String itemStatus, String user) { @@ -158,21 +204,28 @@ public class VendorLicenseModelsImpl implements VendorLicenseModels { } @Override - public Response deleteLicenseModel(String vlmId, String user) { - Item vlm = asdcItemManager.get(vlmId); - if (!vlm.getType().equals(ItemType.vlm.name())) { - throw new CoreException((new ErrorCode.ErrorCodeBuilder().withMessage(String.format("Vlm with id %s does not exist.", vlmId)).build())); + public Response deleteLicenseModel(final String vlmId, final String user) { + final Item vlm = asdcItemManager.get(vlmId); + if (vlm == null || !ItemType.vlm.getName().equals(vlm.getType())) { + throw VendorLicenseModelExceptionSupplier.couldNotFindVlm(vlmId).get(); } - Integer certifiedVersionsCounter = vlm.getVersionStatusCounters().get(VersionStatus.Certified); - if (Objects.isNull(certifiedVersionsCounter) || certifiedVersionsCounter == 0) { - asdcItemManager.delete(vlm); - permissionsManager.deleteItemPermissions(vlmId); - uniqueValueUtil.deleteUniqueValue(VendorLicenseConstants.UniqueValues.VENDOR_NAME, vlm.getName()); - notifyUsers(vlmId, vlm.getName(), null, null, user, NotificationEventTypes.DELETE); - return Response.ok().build(); - } else { - return Response.status(Response.Status.FORBIDDEN).entity(new Exception(Messages.DELETE_VLM_ERROR.getErrorMessage())).build(); + + final List<String> vlmUsedByAnyVsp = findVspsUsingVlm(vlm.getId()); + if (!vlmUsedByAnyVsp.isEmpty()) { + throw VendorLicenseModelExceptionSupplier.cantDeleteUsedVlm(vlmId, vlmUsedByAnyVsp).get(); } + + final Integer certifiedVersionsCounter = vlm.getVersionStatusCounters().get(VersionStatus.Certified); + final boolean wasVlmAtLeastOnceCertified = certifiedVersionsCounter != null && certifiedVersionsCounter > 0; + if (wasVlmAtLeastOnceCertified) { + throw VendorLicenseModelExceptionSupplier.cantDeleteCertifiedVlm(vlmId).get(); + } + + asdcItemManager.delete(vlm); + permissionsManager.deleteItemPermissions(vlmId); + uniqueValueUtil.deleteUniqueValue(VendorLicenseConstants.UniqueValues.VENDOR_NAME, vlm.getName()); + notifyUsers(vlmId, vlm.getName(), null, null, user, NotificationEventTypes.DELETE); + return Response.ok().build(); } @Override @@ -189,6 +242,14 @@ public class VendorLicenseModelsImpl implements VendorLicenseModels { return Response.ok().build(); } + private List<String> findVspsUsingVlm(final String vlmId) { + final Collection<VspDetails> vspDetailsList = vendorSoftwareProductInfoDao.list(null); + return vspDetailsList.stream() + .filter(vspDetails -> vlmId.equals(vspDetails.getVendorId())) + .map(VspDetails::getName) + .collect(Collectors.toList()); + } + private void submit(String vlmId, Version version, String message, String user) { vendorLicenseManager.validate(vlmId, version); versioningManager.submit(vlmId, version, message); |