From 05a51794045971093ddf2b6a2fc3efeba62d0c41 Mon Sep 17 00:00:00 2001 From: Mandal Date: Tue, 12 Dec 2017 15:28:01 +0530 Subject: [PATCH] Fixed the issue osc-core issue #543 Modified and added test cases. --- .../persistence/VirtualSystemEntityMgr.java | 5 +- ...eDistributedApplianceRequestValidator.java | 48 +++++++++++++ ...tributedApplianceRequestValidatorTest.java | 70 +++++++++++++++++++ 3 files changed, 120 insertions(+), 3 deletions(-) diff --git a/osc-server/src/main/java/org/osc/core/broker/service/persistence/VirtualSystemEntityMgr.java b/osc-server/src/main/java/org/osc/core/broker/service/persistence/VirtualSystemEntityMgr.java index 7be6bcddd..cfa2e514b 100644 --- a/osc-server/src/main/java/org/osc/core/broker/service/persistence/VirtualSystemEntityMgr.java +++ b/osc-server/src/main/java/org/osc/core/broker/service/persistence/VirtualSystemEntityMgr.java @@ -115,7 +115,7 @@ public static List findByMcApplianceAndSwVer(EntityManager em, List ls = query.getResultList(); - List dtoList = new ArrayList(); + List dtoList = new ArrayList<>(); for (Object[] arr : ls) { @@ -185,7 +185,6 @@ public static synchronized Long generateUniqueTag(EntityManager em, VirtualSyste } public static boolean isProtectingWorkload(VirtualSystem vs) { - return !vs.getServiceFunctionChains().isEmpty() || - CollectionUtils.emptyIfNull(vs.getDeploymentSpecs()).stream().anyMatch(ds -> DeploymentSpecEntityMgr.isProtectingWorkload(ds)); + return CollectionUtils.emptyIfNull(vs.getDeploymentSpecs()).stream().anyMatch(ds -> DeploymentSpecEntityMgr.isProtectingWorkload(ds)); } } diff --git a/osc-server/src/main/java/org/osc/core/broker/service/validator/DeleteDistributedApplianceRequestValidator.java b/osc-server/src/main/java/org/osc/core/broker/service/validator/DeleteDistributedApplianceRequestValidator.java index 8a5e4c6b2..36103c23f 100644 --- a/osc-server/src/main/java/org/osc/core/broker/service/validator/DeleteDistributedApplianceRequestValidator.java +++ b/osc-server/src/main/java/org/osc/core/broker/service/validator/DeleteDistributedApplianceRequestValidator.java @@ -16,11 +16,18 @@ *******************************************************************************/ package org.osc.core.broker.service.validator; +import java.util.List; +import java.util.stream.Collectors; + import javax.persistence.EntityManager; import org.osc.core.broker.model.entities.appliance.DistributedAppliance; +import org.osc.core.broker.model.entities.appliance.VirtualSystem; +import org.osc.core.broker.model.entities.virtualization.SecurityGroup; +import org.osc.core.broker.model.entities.virtualization.ServiceFunctionChain; import org.osc.core.broker.service.exceptions.VmidcBrokerValidationException; import org.osc.core.broker.service.persistence.DistributedApplianceEntityMgr; +import org.osc.core.broker.service.persistence.SecurityGroupEntityMgr; import org.osc.core.broker.service.request.BaseDeleteRequest; public class DeleteDistributedApplianceRequestValidator implements RequestValidator { @@ -53,6 +60,8 @@ public DistributedAppliance validateAndLoad(BaseDeleteRequest request) throws Ex da.getId())); } + validateDAReferenceToSfcAndSecurityGroup(em, da); + if (!da.getMarkedForDeletion() && request.isForceDelete()) { throw new VmidcBrokerValidationException( "Distributed Appilance with ID " @@ -62,4 +71,43 @@ public DistributedAppliance validateAndLoad(BaseDeleteRequest request) throws Ex return da; } + + private void validateDAReferenceToSfcAndSecurityGroup(EntityManager em, DistributedAppliance da) throws Exception { + for (VirtualSystem vs : da.getVirtualSystems()) { + validateVSReferenceToSfcAndSecurityGroup(em, da, vs); + } + } + + private void validateVSReferenceToSfcAndSecurityGroup(EntityManager em, DistributedAppliance da, VirtualSystem vs) + throws Exception { + + if (!getSFCs(vs)) { + if (validateSfcReferenceToSecurityGroup(em, da, vs) != null) { + throw validateSfcReferenceToSecurityGroup(em, da, vs); + } + } + } + + private VmidcBrokerValidationException validateSfcReferenceToSecurityGroup(EntityManager em, + DistributedAppliance da, VirtualSystem vs) { + for (ServiceFunctionChain sfc : vs.getServiceFunctionChains()) { + List sgList = SecurityGroupEntityMgr.listSecurityGroupsBySfcId(em, sfc.getId()); + String sgNames = sgList.stream().filter(sg -> !sg.getMarkedForDeletion()).map(sg -> sg.getName()) + .collect(Collectors.joining(", ")); + if (!sgNames.isEmpty()) { + return new VmidcBrokerValidationException(String.format( + "Cannot delete deployment appliance with name '%s' which is currently referencing Service Function Chain '%s' and binded to a SecurityGroup(s) '%s'", + da.getName(), sfc.getName(), sgNames)); + } else if (!sfc.getMarkedForDeletion() && sfc != null) { + return new VmidcBrokerValidationException(String.format( + "Cannot delete deployment appliance with name '%s' which is currently referencing Service Function Chain '%s'", + da.getName(), sfc.getName())); + } + } + return null; + } + + private boolean getSFCs(VirtualSystem vs) { + return vs.getServiceFunctionChains().isEmpty(); + } } diff --git a/osc-server/src/test/java/org/osc/core/broker/service/request/DeleteDistributedApplianceRequestValidatorTest.java b/osc-server/src/test/java/org/osc/core/broker/service/request/DeleteDistributedApplianceRequestValidatorTest.java index b80c8577a..f9607bdd9 100644 --- a/osc-server/src/test/java/org/osc/core/broker/service/request/DeleteDistributedApplianceRequestValidatorTest.java +++ b/osc-server/src/test/java/org/osc/core/broker/service/request/DeleteDistributedApplianceRequestValidatorTest.java @@ -16,7 +16,9 @@ *******************************************************************************/ package org.osc.core.broker.service.request; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import javax.persistence.EntityManager; @@ -25,16 +27,24 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.osc.core.broker.model.entities.appliance.DistributedAppliance; import org.osc.core.broker.model.entities.appliance.TagEncapsulationType; import org.osc.core.broker.model.entities.appliance.VirtualSystem; +import org.osc.core.broker.model.entities.virtualization.SecurityGroup; import org.osc.core.broker.model.entities.virtualization.ServiceFunctionChain; import org.osc.core.broker.service.exceptions.VmidcBrokerValidationException; +import org.osc.core.broker.service.persistence.SecurityGroupEntityMgr; import org.osc.core.broker.service.validator.DeleteDistributedApplianceRequestValidator; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +@RunWith(PowerMockRunner.class) +@PrepareForTest({SecurityGroupEntityMgr.class}) public class DeleteDistributedApplianceRequestValidatorTest { private static final Long VALID_ID = 1l; @@ -56,6 +66,9 @@ public class DeleteDistributedApplianceRequestValidatorTest { @Mock EntityManager em; + @Mock + SecurityGroupEntityMgr sem; + private DeleteDistributedApplianceRequestValidator validator; @Before @@ -150,6 +163,63 @@ public void testValidateAndLoad_WhenChainedToSfcDeleteRequest_ThrowsValidationEx this.validator.validateAndLoad(createRequest(VALID_ID_WITH_SFC, false)); } + @Test + public void testValidateSfcToSecurityGroup_WhenDADeleteRequest_ThrowsValidationException() throws Exception { + // Arrange + final Long VALID_ID_WITH_SFC = 4l; + DistributedAppliance da = createDA(VALID_ID_WITH_SFC, false); + da.setName("DA"); + List sgList=new ArrayList<>(); + SecurityGroup sg=new SecurityGroup(null,null,null); + sg.setName("sg"); + sgList.add(sg); + ServiceFunctionChain sfc = new ServiceFunctionChain("sfc-1", null); + sfc.setId(VALID_ID_WITH_SFC); + VirtualSystem vs = new VirtualSystem(null); + vs.setName("vs-1"); + vs.setEncapsulationType(TagEncapsulationType.VLAN); + vs.setServiceFunctionChains(Arrays.asList(sfc)); + + da.addVirtualSystem(vs); + PowerMockito.mockStatic(SecurityGroupEntityMgr.class); + Mockito.when(SecurityGroupEntityMgr.listSecurityGroupsBySfcId(em,VALID_ID_WITH_SFC)).thenReturn(sgList); + Mockito.when(em.find(Mockito.eq(DistributedAppliance.class), Mockito.eq(VALID_ID_WITH_SFC))) + .thenReturn(da); + exception.expect(VmidcBrokerValidationException.class); + exception.expectMessage( + String.format("Cannot delete deployment appliance with name '%s' which is currently referencing Service Function Chain '%s' and binded to a SecurityGroup(s) '%s'", + da.getName(), sfc.getName(), sg.getName())); + + // Act + validator.validateAndLoad(createRequest(VALID_ID_WITH_SFC, false)); + } + + @Test + public void testValidateDaToSfc_WhenDADeleteRequest_ThrowsValidationException() throws Exception { + // Arrange + final Long VALID_ID_WITH_SFC = 4l; + DistributedAppliance da = createDA(VALID_ID_WITH_SFC, false); + da.setName("DA"); + ServiceFunctionChain sfc = new ServiceFunctionChain("sfc-1", null); + List sgList=new ArrayList<>(); + VirtualSystem vs = new VirtualSystem(null); + vs.setName("vs-1"); + vs.setEncapsulationType(TagEncapsulationType.VLAN); + vs.setServiceFunctionChains(Arrays.asList(sfc)); + da.addVirtualSystem(vs); + PowerMockito.mockStatic(SecurityGroupEntityMgr.class); + Mockito.when(SecurityGroupEntityMgr.listSecurityGroupsBySfcId(em,VALID_ID_WITH_SFC)).thenReturn(sgList); + Mockito.when(em.find(Mockito.eq(DistributedAppliance.class), Mockito.eq(VALID_ID_WITH_SFC))) + .thenReturn(da); + exception.expect(VmidcBrokerValidationException.class); + exception.expectMessage( + String.format("Cannot delete deployment appliance with name '%s' which is currently referencing Service Function Chain '%s'", + da.getName(), sfc.getName())); + + // Act + validator.validateAndLoad(createRequest(VALID_ID_WITH_SFC, false)); + } + private static BaseDeleteRequest createRequest(Long id, boolean forceDelete) { BaseDeleteRequest request = new BaseDeleteRequest(id); request.setForceDelete(forceDelete);