This is an automated email from the ASF dual-hosted git repository. pearl11594 pushed a commit to branch netris-integration-upstream in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit 773870ad47b2b017623875a4053777c6bf35a946 Author: Pearl Dsilva <pearl1...@gmail.com> AuthorDate: Wed Oct 23 10:01:35 2024 -0400 Add support to delete VNets and Subnets (#13) * Add support to delete VNets and Subnets * Add support to delete vnet resources * Add support to delete vnet resources * extract code to method --------- Co-authored-by: nvazquez <nicovazque...@gmail.com> --- .../com/cloud/network/netris/NetrisService.java | 1 + .../agent/api/DeleteNetrisVnetCommand.java | 29 ++++-- .../apache/cloudstack/resource/NetrisResource.java | 18 ++++ .../resource/NetrisResourceObjectUtils.java | 4 +- .../apache/cloudstack/service/NetrisApiClient.java | 3 + .../cloudstack/service/NetrisApiClientImpl.java | 114 ++++++++++++++++++++- .../apache/cloudstack/service/NetrisElement.java | 55 +++++++++- .../cloudstack/service/NetrisServiceImpl.java | 8 ++ 8 files changed, 218 insertions(+), 14 deletions(-) diff --git a/api/src/main/java/com/cloud/network/netris/NetrisService.java b/api/src/main/java/com/cloud/network/netris/NetrisService.java index e11fb640632..f6203874c2d 100644 --- a/api/src/main/java/com/cloud/network/netris/NetrisService.java +++ b/api/src/main/java/com/cloud/network/netris/NetrisService.java @@ -22,4 +22,5 @@ public interface NetrisService { boolean createVpcResource(long zoneId, long accountId, long domainId, Long vpcId, String vpcName, boolean sourceNatEnabled, String cidr, boolean isVpcNetwork); boolean deleteVpcResource(long zoneId, long accountId, long domainId, Vpc vpc); boolean createVnetResource(Long zoneId, long accountId, long domainId, String vpcName, Long vpcId, String networkName, Long networkId, String cidr); + boolean deleteVnetResource(long zoneId, long accountId, long domainId, String vpcName, Long vpcId, String networkName, Long networkId, String cidr); } diff --git a/api/src/main/java/com/cloud/network/netris/NetrisService.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/DeleteNetrisVnetCommand.java similarity index 53% copy from api/src/main/java/com/cloud/network/netris/NetrisService.java copy to plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/DeleteNetrisVnetCommand.java index e11fb640632..8fbe9e04a71 100644 --- a/api/src/main/java/com/cloud/network/netris/NetrisService.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/DeleteNetrisVnetCommand.java @@ -14,12 +14,29 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.network.netris; +package org.apache.cloudstack.agent.api; -import com.cloud.network.vpc.Vpc; +public class DeleteNetrisVnetCommand extends NetrisCommand { + private String vpcName; + private Long vpcId; + private final String vNetCidr; -public interface NetrisService { - boolean createVpcResource(long zoneId, long accountId, long domainId, Long vpcId, String vpcName, boolean sourceNatEnabled, String cidr, boolean isVpcNetwork); - boolean deleteVpcResource(long zoneId, long accountId, long domainId, Vpc vpc); - boolean createVnetResource(Long zoneId, long accountId, long domainId, String vpcName, Long vpcId, String networkName, Long networkId, String cidr); + public DeleteNetrisVnetCommand(long zoneId, long accountId, long domainId, String name, long id, String vpcName, Long vpcId, String vNetCidr, boolean isVpc) { + super(zoneId, accountId, domainId, name, id, isVpc); + this.vpcName = vpcName; + this.vpcId = vpcId; + this.vNetCidr = vNetCidr; + } + + public String getVpcName() { + return vpcName; + } + + public Long getVpcId() { + return vpcId; + } + + public String getVNetCidr() { + return vNetCidr; + } } diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java index ac3f06e34f5..0fdb0913053 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java @@ -30,6 +30,7 @@ import com.cloud.resource.ServerResource; import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.agent.api.CreateNetrisVnetCommand; import org.apache.cloudstack.agent.api.CreateNetrisVpcCommand; +import org.apache.cloudstack.agent.api.DeleteNetrisVnetCommand; import org.apache.cloudstack.agent.api.DeleteNetrisVpcCommand; import org.apache.cloudstack.agent.api.NetrisAnswer; import org.apache.cloudstack.StartupNetrisCommand; @@ -91,6 +92,8 @@ public class NetrisResource implements ServerResource { return executeRequest((DeleteNetrisVpcCommand) cmd); } else if (cmd instanceof CreateNetrisVnetCommand) { return executeRequest((CreateNetrisVnetCommand) cmd); + } else if (cmd instanceof DeleteNetrisVnetCommand) { + return executeRequest((DeleteNetrisVnetCommand) cmd); } else { return Answer.createUnsupportedCommandAnswer(cmd); } @@ -224,6 +227,21 @@ public class NetrisResource implements ServerResource { } } + private Answer executeRequest(DeleteNetrisVnetCommand cmd) { + try { + String networkName = cmd.getName(); + boolean result = netrisApiClient.deleteVnet(cmd); + if (!result) { + return new NetrisAnswer(cmd, false, String.format("Netris vNet: %s deletion failed", networkName)); + } + return new NetrisAnswer(cmd, true, "OK"); + } catch (CloudRuntimeException e) { + String msg = String.format("Error deleting Netris vNet: %s", e.getMessage()); + logger.error(msg, e); + return new NetrisAnswer(cmd, new CloudRuntimeException(msg)); + } + } + private Answer executeRequest(DeleteNetrisVpcCommand cmd) { boolean result = netrisApiClient.deleteVpc(cmd); if (!result) { diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResourceObjectUtils.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResourceObjectUtils.java index 8cfc5ea7918..127636dd7d5 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResourceObjectUtils.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResourceObjectUtils.java @@ -46,9 +46,11 @@ public class NetrisResourceObjectUtils { } break; case IPAM_ALLOCATION: - case IPAM_SUBNET: stringBuilder.append(String.format("%s%s", prefix, objectId)); break; + case IPAM_SUBNET: + stringBuilder.append(String.format("-N%s", objectId)); + break; case VNET: break; default: diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java index f0317687b95..42cb9a772fc 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java @@ -22,6 +22,7 @@ import io.netris.model.VPCListing; import io.netris.model.response.TenantResponse; import org.apache.cloudstack.agent.api.CreateNetrisVnetCommand; import org.apache.cloudstack.agent.api.CreateNetrisVpcCommand; +import org.apache.cloudstack.agent.api.DeleteNetrisVnetCommand; import org.apache.cloudstack.agent.api.DeleteNetrisVpcCommand; import java.util.List; @@ -47,4 +48,6 @@ public interface NetrisApiClient { boolean deleteVpc(DeleteNetrisVpcCommand cmd); boolean createVnet(CreateNetrisVnetCommand cmd); + + boolean deleteVnet(DeleteNetrisVnetCommand cmd); } diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java index 5acaafefe17..16f5f7fc0d8 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java @@ -29,12 +29,16 @@ import io.netris.api.v2.VNetApi; import io.netris.api.v2.VpcApi; import io.netris.model.AllocationBody; import io.netris.model.AllocationBodyVpc; +import io.netris.model.FilterBySites; +import io.netris.model.FilterByVpc; import io.netris.model.GetSiteBody; import io.netris.model.InlineResponse2004; import io.netris.model.IpTreeAllocationTenant; +import io.netris.model.IpTreeSubnet; import io.netris.model.IpTreeSubnetSites; import io.netris.model.SitesResponseOK; import io.netris.model.SubnetBody; +import io.netris.model.SubnetResBody; import io.netris.model.VPCAdminTenant; import io.netris.model.VPCCreate; import io.netris.model.VPCListing; @@ -49,11 +53,15 @@ import io.netris.model.VnetAddBodyDhcpOptionSet; import io.netris.model.VnetAddBodyGateways; import io.netris.model.VnetAddBodyVpc; import io.netris.model.VnetResAddBody; +import io.netris.model.VnetResDeleteBody; +import io.netris.model.VnetResListBody; +import io.netris.model.VnetsBody; import io.netris.model.response.AuthResponse; import io.netris.model.response.TenantResponse; import io.netris.model.response.TenantsResponse; import org.apache.cloudstack.agent.api.CreateNetrisVnetCommand; import org.apache.cloudstack.agent.api.CreateNetrisVpcCommand; +import org.apache.cloudstack.agent.api.DeleteNetrisVnetCommand; import org.apache.cloudstack.agent.api.DeleteNetrisVpcCommand; import org.apache.cloudstack.resource.NetrisResourceObjectUtils; import org.apache.commons.collections.CollectionUtils; @@ -63,6 +71,7 @@ import org.apache.logging.log4j.Logger; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; public class NetrisApiClientImpl implements NetrisApiClient { @@ -238,6 +247,10 @@ public class NetrisApiClientImpl implements NetrisApiClient { VpcApi vpcApi = apiClient.getApiStubForMethod(VpcApi.class); VPCResponseResourceOK vpcResourcesResponse = vpcApi.apiV2VpcVpcIdResourcesGet(vpcResource.getId()); VPCResourceIpam vpcAllocationResource = getVpcAllocationResource(vpcResourcesResponse); + if (Objects.isNull(vpcAllocationResource)) { + logger.info("No VPC IPAM Allocation found for VPC {}", vpcCidr); + return; + } IpamApi ipamApi = apiClient.getApiStubForMethod(IpamApi.class); logger.debug("Removing the IPAM allocation {} with ID {}", vpcAllocationResource.getName(), vpcAllocationResource.getId()); ipamApi.apiV2IpamTypeIdDelete("allocation", vpcAllocationResource.getId()); @@ -304,11 +317,11 @@ public class NetrisApiClientImpl implements NetrisApiClient { String vnetCidr = cmd.getCidr(); boolean isVpc = cmd.isVpc(); - String suffix = String.format("%s-%s", vpcId, vpcName); + String suffix = getNetrisVpcNameSuffix(vpcId, vpcName, networkId, networkName, isVpc); String netrisVpcName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.VPC, suffix); VPCListing associatedVpc = getVpcByNameAndTenant(netrisVpcName); if (associatedVpc == null) { - logger.error(String.format("Failed to find Netris VPC with name: %s, to create the corresponding vNet for network %s", vpcName, networkName)); + logger.error("Failed to find Netris VPC with name: {}, to create the corresponding vNet for network {}", netrisVpcName, networkName); return false; } @@ -324,20 +337,102 @@ public class NetrisApiClientImpl implements NetrisApiClient { InlineResponse2004 subnetResponse = createVpcSubnetInternal(associatedVpc, vNetName, vnetCidr, netrisSubnetName); if (subnetResponse == null || !subnetResponse.isIsSuccess()) { String reason = subnetResponse == null ? "Empty response" : "Operation failed on Netris"; - logger.debug("The Netris Subnet {} for VPC {} for network {} creation failed: {}", vnetCidr, vpcName, networkName, reason); + logger.debug("The Netris Subnet {} for network {} creation failed: {}", vnetCidr, networkName, reason); return false; } - logger.debug("Successfully created VPC {} and its IPAM Subnet {} on Netris", vpcName, vnetCidr); + logger.debug("Successfully created IPAM Subnet {} for network {} on Netris", netrisSubnetName, networkName); VnetResAddBody vnetResponse = createVnetInternal(associatedVpc, netrisVnetName, vnetCidr); if (vnetResponse == null || !vnetResponse.isIsSuccess()) { String reason = vnetResponse == null ? "Empty response" : "Operation failed on Netris"; - logger.debug("The Netris vNet creation {} for VPC {} failed: {}", vNetName, vpcName, reason); + logger.debug("The Netris vNet creation {} failed: {}", vNetName, reason); return false; } return true; } + @Override + public boolean deleteVnet(DeleteNetrisVnetCommand cmd) { + String vpcName = cmd.getVpcName(); + Long vpcId = cmd.getVpcId(); + String networkName = cmd.getName(); + Long networkId = cmd.getId(); + boolean isVpc = cmd.isVpc(); + String vnetCidr = cmd.getVNetCidr(); + try { + String suffix = getNetrisVpcNameSuffix(vpcId, vpcName, networkId, networkName, isVpc); + String netrisVpcName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.VPC, suffix); + VPCListing associatedVpc = getVpcByNameAndTenant(netrisVpcName); + if (associatedVpc == null) { + logger.error("Failed to find Netris VPC with name: {}, to create the corresponding vNet for network {}", netrisVpcName, networkName); + return false; + } + + String vNetName; + if (isVpc) { + vNetName = String.format("V%s-N%s-%s", vpcId, networkId, networkName); + } else { + vNetName = String.format("N%s-%s", networkId, networkName); + } + + String netrisVnetName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.VNET, vNetName) ; + String netrisSubnetName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.IPAM_SUBNET, vnetCidr) ; + FilterByVpc vpcFilter = new FilterByVpc(); + vpcFilter.add(associatedVpc.getId()); + FilterBySites siteFilter = new FilterBySites(); + siteFilter.add(siteId); + deleteVnetInternal(associatedVpc, siteFilter, vpcFilter, netrisVnetName, vNetName); + + logger.debug("Successfully deleted vNet {}", vNetName); + deleteSubnetInternal(vpcFilter, netrisVnetName, netrisSubnetName); + + } catch (Exception e) { + throw new CloudRuntimeException(String.format("Failed to delete Netris vNet %s", networkName), e); + } + return true; + } + + private void deleteVnetInternal(VPCListing associatedVpc, FilterBySites siteFilter, FilterByVpc vpcFilter, String netrisVnetName, String vNetName) { + try { + VNetApi vNetApi = apiClient.getApiStubForMethod(VNetApi.class); + VnetResListBody vnetList = vNetApi.apiV2VnetGet(siteFilter, vpcFilter); + if (vnetList == null || !vnetList.isIsSuccess()) { + throw new CloudRuntimeException(String.format("Failed to list vNets for the given VPC: %s and site: %s", associatedVpc.getName(), siteName)); + } + List<VnetsBody> vnetsList = vnetList.getData().stream().filter(vnet -> vnet.getName().equals(netrisVnetName)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(vnetsList)) { + logger.debug("vNet: {} for the given VPC: {} appears to already be deleted on Netris", vNetName, associatedVpc.getName()); + return; + } + VnetsBody vnetsBody = vnetsList.get(0); + + VnetResDeleteBody deleteVnetResponse = vNetApi.apiV2VnetIdDelete(vnetsBody.getId().intValue()); + if (deleteVnetResponse == null || !deleteVnetResponse.isIsSuccess()) { + throw new CloudRuntimeException(String.format("Failed to delete vNet: %s", vNetName)); + } + } catch (ApiException e) { + logAndThrowException(String.format("Failed to delete vNet: %s", netrisVnetName), e); + } + } + + private void deleteSubnetInternal(FilterByVpc vpcFilter, String netrisVnetName, String netrisSubnetName) { + try { + logger.debug("Deleting Netris VPC IPAM Subnet {} for vNet: {}", netrisSubnetName, netrisVnetName); + IpamApi ipamApi = apiClient.getApiStubForMethod(IpamApi.class); + SubnetResBody subnetsResponse = ipamApi.apiV2IpamSubnetsGet(vpcFilter); + List<IpTreeSubnet> subnets = subnetsResponse.getData(); + List<IpTreeSubnet> matchedSubnets = subnets.stream().filter(subnet -> subnet.getName().equals(netrisSubnetName)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(matchedSubnets)) { + logger.debug("IPAM subnet: {} for the given vNet: {} appears to already be deleted on Netris", netrisSubnetName, netrisVnetName); + return; + } + + ipamApi.apiV2IpamTypeIdDelete("subnet", matchedSubnets.get(0).getId().intValue()); + } catch (ApiException e) { + logAndThrowException(String.format("Failed to delete vNet: %s", netrisVnetName), e); + } + } + private InlineResponse2004 createVpcSubnetInternal(VPCListing associatedVpc, String vNetName, String vNetCidr, String netrisSubnetName) { logger.debug("Creating Netris VPC Subnet {} for VPC {} for vNet {}", vNetCidr, associatedVpc.getName(), vNetName); try { @@ -427,4 +522,13 @@ public class NetrisApiClientImpl implements NetrisApiClient { return null; } } + + private String getNetrisVpcNameSuffix(Long vpcId, String vpcName, Long networkId, String networkName, boolean isVpc) { + String suffix = null; + if (isVpc) { + suffix = String.format("%s-%s", vpcId, vpcName); + } else { + suffix = String.format("%s-%s", networkId, networkName); + } + } } diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java index f15090dc3f4..9a29a410862 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java @@ -23,7 +23,11 @@ import com.cloud.agent.api.AgentControlCommand; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DeployDestination; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ConnectionException; import com.cloud.exception.InsufficientCapacityException; @@ -35,8 +39,11 @@ import com.cloud.network.IpAddress; import com.cloud.network.Network; import com.cloud.network.NetworkModel; import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkVO; import com.cloud.network.element.DhcpServiceProvider; import com.cloud.network.element.DnsServiceProvider; +import com.cloud.network.element.NetworkACLServiceProvider; import com.cloud.network.element.VirtualRouterElement; import com.cloud.network.element.VpcProvider; import com.cloud.network.netris.NetrisService; @@ -45,12 +52,17 @@ import com.cloud.network.vpc.NetworkACLItem; import com.cloud.network.vpc.PrivateGateway; import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.network.vpc.Vpc; +import com.cloud.network.vpc.VpcVO; +import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offering.NetworkOffering; import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceStateAdapter; import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachineProfile; @@ -64,11 +76,12 @@ import javax.naming.ConfigurationException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; @Component -public class NetrisElement extends AdapterBase implements DhcpServiceProvider, DnsServiceProvider, ResourceStateAdapter, - Listener, VpcProvider { +public class NetrisElement extends AdapterBase implements DhcpServiceProvider, DnsServiceProvider, VpcProvider, + NetworkACLServiceProvider, ResourceStateAdapter, Listener { @Inject NetworkModel networkModel; @@ -78,6 +91,16 @@ public class NetrisElement extends AdapterBase implements DhcpServiceProvider, D ResourceManager resourceManager; @Inject private NetrisService netrisService; + @Inject + private AccountManager accountManager; + @Inject + private DataCenterDao dataCenterDao; + @Inject + private NetworkDao networkDao; + @Inject + private DomainDao domainDao; + @Inject + private VpcDao vpcDao; protected Logger logger = LogManager.getLogger(getClass()); @@ -268,6 +291,24 @@ public class NetrisElement extends AdapterBase implements DhcpServiceProvider, D @Override public boolean destroy(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException { + Account account = accountManager.getAccount(network.getAccountId()); + NetworkVO networkVO = networkDao.findById(network.getId()); + DataCenterVO zone = dataCenterDao.findById(network.getDataCenterId()); + DomainVO domain = domainDao.findById(account.getDomainId()); + if (Objects.isNull(zone)) { + String msg = String.format("Cannot find zone with ID %s", network.getDataCenterId()); + logger.error(msg); + throw new CloudRuntimeException(msg); + } + String vpcName = null; + Long vpcId = network.getVpcId(); + if (Objects.nonNull(vpcId)) { + VpcVO vpc = vpcDao.findById(vpcId); + if (Objects.nonNull(vpc)) { + vpcName = vpc.getName(); + } + } + netrisService.deleteVnetResource(zone.getId(), account.getId(), domain.getId(), vpcName, vpcId, networkVO.getName(), network.getId(), network.getCidr()); return true; } @@ -347,4 +388,14 @@ public class NetrisElement extends AdapterBase implements DhcpServiceProvider, D public boolean updateVpcSourceNatIp(Vpc vpc, IpAddress address) { return true; } + + @Override + public boolean applyNetworkACLs(Network config, List<? extends NetworkACLItem> rules) throws ResourceUnavailableException { + return true; + } + + @Override + public boolean reorderAclRules(Vpc vpc, List<? extends Network> networks, List<? extends NetworkACLItem> networkACLItems) { + return false; + } } diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java index 66d972b043e..eb2046718c2 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java @@ -25,6 +25,7 @@ import com.cloud.network.netris.NetrisService; import com.cloud.network.vpc.Vpc; import org.apache.cloudstack.agent.api.CreateNetrisVnetCommand; import org.apache.cloudstack.agent.api.CreateNetrisVpcCommand; +import org.apache.cloudstack.agent.api.DeleteNetrisVnetCommand; import org.apache.cloudstack.agent.api.DeleteNetrisVpcCommand; import org.apache.cloudstack.agent.api.NetrisAnswer; import org.apache.cloudstack.agent.api.NetrisCommand; @@ -94,4 +95,11 @@ public class NetrisServiceImpl implements NetrisService, Configurable { NetrisAnswer answer = sendNetrisCommand(cmd, zoneId); return answer.getResult(); } + + @Override + public boolean deleteVnetResource(long zoneId, long accountId, long domainId, String vpcName, Long vpcId, String networkName, Long networkId, String cidr) { + DeleteNetrisVnetCommand cmd = new DeleteNetrisVnetCommand(zoneId, accountId, domainId, networkName, networkId, vpcName, vpcId, cidr, Objects.nonNull(vpcName)); + NetrisAnswer answer = sendNetrisCommand(cmd, zoneId); + return answer.getResult(); + } }