+
+ public void removeExternalSubnet(Uuid subnetId) {
+ InstanceIdentifier<Subnets> subnetsIdentifier = InstanceIdentifier.builder(ExternalSubnets.class)
+ .child(Subnets.class, new SubnetsKey(subnetId)).build();
+ try {
+ LOG.debug("Removing external subnet {}", subnetId);
+ SingleTransactionDataBroker.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, subnetsIdentifier);
+ } catch (TransactionCommitFailedException ex) {
+ LOG.error("Deletion of External Subnets {} failed", subnetId, ex);
+ }
+ }
+
+ public void addRouterIdToExternalSubnet(Uuid networkId, Uuid subnetId, Uuid routerId) {
+ Optional<Subnets> optionalExternalSubnets = NeutronvpnUtils.getOptionalExternalSubnets(dataBroker, subnetId);
+ if (optionalExternalSubnets.isPresent()) {
+ Subnets subnets = optionalExternalSubnets.get();
+ List<Uuid> routerIds;
+ if (subnets.getRouterIds() != null) {
+ routerIds = subnets.getRouterIds();
+ } else {
+ routerIds = new ArrayList<>();
+ }
+
+ if (subnets.getExternalNetworkId() != null
+ && subnets.getExternalNetworkId().equals(networkId) && !routerIds.contains(routerId)) {
+ LOG.debug("Will add routerID {} for external subnet.",
+ routerId, subnetId);
+ routerIds.add(routerId);
+ updateExternalSubnet(networkId, subnetId, routerIds);
+ }
+ }
+ }
+
+ private Subnets createSubnets(Uuid subnetId, Uuid networkId, List<Uuid> routerIds) {
+ SubnetsBuilder subnetsBuilder = new SubnetsBuilder();
+ subnetsBuilder.setKey(new SubnetsKey(subnetId));
+ subnetsBuilder.setId(subnetId);
+ subnetsBuilder.setVpnId(subnetId);
+ subnetsBuilder.setExternalNetworkId(networkId);
+ if (routerIds != null) {
+ subnetsBuilder.setRouterIds(routerIds);
+ }
+
+ return subnetsBuilder.build();
+ }
+
+ private void updateExternalSubnetsForRouter(Uuid routerId, Uuid externalNetworkId,
+ List<ExternalFixedIps> externalFixedIps) {
+ LOG.debug("Updating external subnets for router {} for external network ID {}",
+ routerId, externalNetworkId);
+ Set<Uuid> subnetsUuidsSet = getExternalSubnetsUuidsSetForFixedIps(externalFixedIps);
+ for (Uuid subnetId : subnetsUuidsSet) {
+ addRouterIdToExternalSubnet(externalNetworkId, subnetId, routerId);
+ }
+ }
+
+ private void removeRouterFromExternalSubnets(Uuid routerId, Uuid externalNetworkId,
+ List<ExternalFixedIps> externalFixedIps) {
+ LOG.debug("Removing routerID {} from external subnets of external network{}",
+ routerId, externalNetworkId);
+
+ List<Subnets> fixedIpsSubnets = getSubnets(getExternalSubnetsUuidsSetForFixedIps(externalFixedIps));
+ for (Subnets subnets : fixedIpsSubnets) {
+ Uuid subnetId = subnets.getId();
+ List<Uuid> routerIds = subnets.getRouterIds();
+ if (routerIds != null) {
+ if (subnets.getExternalNetworkId() != null
+ && subnets.getExternalNetworkId().equals(externalNetworkId)
+ && routerIds.contains(routerId)) {
+ routerIds.remove(routerId);
+ LOG.debug("Will remove routerIDs {} from external subnet {} router ID {}",
+ subnetId, routerId);
+ addExternalSubnet(externalNetworkId, subnetId, routerIds);
+ }
+ }
+ }
+ }
+
+ private Set<Uuid> getExternalSubnetsUuidsSetForFixedIps(List<ExternalFixedIps> externalFixedIps) {
+ Set<Uuid> subnetsUuidsSet = new HashSet<>();
+ for (ExternalFixedIps externalFixedIp : externalFixedIps) {
+ subnetsUuidsSet.add(externalFixedIp.getSubnetId());
+ }
+
+ return subnetsUuidsSet;
+ }
+
+ private List<Subnets> getSubnets(Set<Uuid> subnetsUuidsSet) {
+ List<Subnets> subnetsList = new ArrayList<>();
+ for (Uuid subnetId : subnetsUuidsSet) {
+ Optional<Subnets> optionalSubnets = NeutronvpnUtils.getOptionalExternalSubnets(dataBroker, subnetId);
+ if (optionalSubnets.isPresent()) {
+ subnetsList.add(optionalSubnets.get());
+ }
+ }
+
+ return subnetsList;
+ }
+
+ private void addExternalFixedIpToExternalIpsList(List<ExternalIps> externalIps, ExternalFixedIps fixedIps) {
+ Uuid subnetId = fixedIps.getSubnetId();
+ String ip = fixedIps.getIpAddress().getIpv4Address().getValue();
+ ExternalIpsBuilder externalIpsBuilder = new ExternalIpsBuilder();
+ externalIpsBuilder.setKey(new ExternalIpsKey(ip, subnetId));
+ externalIpsBuilder.setIpAddress(ip);
+ externalIpsBuilder.setSubnetId(subnetId);
+ externalIps.add(externalIpsBuilder.build());
+ }