diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index 614fe6076de2..7d85d16ccf20 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -1047,6 +1047,7 @@ public class ApiConstants { public static final String VNF_NICS = "vnfnics"; public static final String VNF_DETAILS = "vnfdetails"; public static final String CLEAN_UP_VNF_DETAILS = "cleanupvnfdetails"; + public static final String CLEAN_UP_VNF_NICS = "cleanupvnfnics"; /** * This enum specifies IO Drivers, each option controls specific policies on I/O. diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/UpdateVnfTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/UpdateVnfTemplateCmd.java index 72135e96f958..7479dd3be091 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/UpdateVnfTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/UpdateVnfTemplateCmd.java @@ -56,9 +56,14 @@ public class UpdateVnfTemplateCmd extends UpdateTemplateCmd implements UserCmd { @Parameter(name = ApiConstants.CLEAN_UP_VNF_DETAILS, type = CommandType.BOOLEAN, - description = "optional boolean field, which indicates if VNF details should be cleaned up or not") + description = "optional boolean field, which indicates if VNF details will be cleaned up or not") private Boolean cleanupVnfDetails = null; + @Parameter(name = ApiConstants.CLEAN_UP_VNF_NICS, + type = CommandType.BOOLEAN, + description = "optional boolean field, which indicates if VNF nics will be cleaned up or not") + private Boolean cleanupVnfNics = null; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -75,4 +80,8 @@ public Map getVnfDetails() { public boolean isCleanupVnfDetails(){ return cleanupVnfDetails == null ? false : cleanupVnfDetails.booleanValue(); } + + public boolean isCleanupVnfNics(){ + return cleanupVnfNics == null ? false : cleanupVnfNics.booleanValue(); + } } diff --git a/server/src/main/java/org/apache/cloudstack/storage/template/VnfTemplateManagerImpl.java b/server/src/main/java/org/apache/cloudstack/storage/template/VnfTemplateManagerImpl.java index a3b5d0d44e8f..3f88d34b603f 100644 --- a/server/src/main/java/org/apache/cloudstack/storage/template/VnfTemplateManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/storage/template/VnfTemplateManagerImpl.java @@ -119,12 +119,13 @@ private void updateVnfTemplateDetails(long templateId, UpdateVnfTemplateCmd cmd) } private void updateVnfTemplateNics(long templateId, UpdateVnfTemplateCmd cmd) { - List nics = cmd.getVnfNics(); - if (CollectionUtils.isEmpty(nics)) { - return; + boolean cleanupVnfNics = cmd.isCleanupVnfNics(); + if (cleanupVnfNics) { + vnfTemplateNicDao.deleteByTemplateId(templateId); + } else if (CollectionUtils.isNotEmpty(cmd.getVnfNics())) { + vnfTemplateNicDao.deleteByTemplateId(templateId); + persistVnfTemplateNics(templateId, cmd.getVnfNics()); } - vnfTemplateNicDao.deleteByTemplateId(templateId); - persistVnfTemplateNics(templateId, nics); } @Override diff --git a/server/src/test/java/org/apache/cloudstack/storage/template/VnfTemplateManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/storage/template/VnfTemplateManagerImplTest.java index d2f489843c96..9c3f3fb1c6aa 100644 --- a/server/src/test/java/org/apache/cloudstack/storage/template/VnfTemplateManagerImplTest.java +++ b/server/src/test/java/org/apache/cloudstack/storage/template/VnfTemplateManagerImplTest.java @@ -129,9 +129,11 @@ public void testPersistVnfTemplateUpdate() { public void testPersistVnfTemplateUpdateWithoutNics() { UpdateVnfTemplateCmd cmd = new UpdateVnfTemplateCmd(); ReflectionTestUtils.setField(cmd,"vnfDetails", vnfDetails); + ReflectionTestUtils.setField(cmd,"cleanupVnfNics", true); vnfTemplateManagerImpl.updateVnfTemplate(templateId, cmd); + Mockito.verify(vnfTemplateNicDao, Mockito.times(1)).deleteByTemplateId(templateId); Mockito.verify(vnfTemplateNicDao, Mockito.times(0)).persist(any(VnfTemplateNicVO.class)); Mockito.verify(vnfTemplateDetailsDao, Mockito.times(1)).removeDetails(templateId); Mockito.verify(vnfTemplateDetailsDao, Mockito.times(5)).addDetail(eq(templateId), anyString(), anyString(), eq(true)); diff --git a/ui/src/views/image/TemplateVnfSettings.vue b/ui/src/views/image/TemplateVnfSettings.vue index dc1440cf5b01..df6cae24473f 100644 --- a/ui/src/views/image/TemplateVnfSettings.vue +++ b/ui/src/views/image/TemplateVnfSettings.vue @@ -704,6 +704,9 @@ export default { if (areNicsChanged) { let i = 0 + if (this.vnfNics.length === 0) { + params.cleanupvnfnics = true + } for (var index = 0; index < this.vnfNics.length; index++) { var nic = this.vnfNics[index] params['vnfnics[' + i + '].deviceid'] = nic.deviceid