shwstppr commented on a change in pull request #5786:
URL: https://github.com/apache/cloudstack/pull/5786#discussion_r821438759



##########
File path: 
server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
##########
@@ -1884,6 +1899,83 @@ private void checkIpRangeContainsTakenAddresses(final 
HostPodVO pod,final String
         }
     }
 
+    @Override
+    @DB
+    public DataCenterGuestIpv6Prefix createDataCenterGuestIpv6Prefix(final 
CreateGuestNetworkIpv6PrefixCmd cmd) throws ConcurrentOperationException {
+        final long zoneId = cmd.getZoneId();
+        final DataCenterVO zone = _zoneDao.findById(zoneId);
+        if (zone == null) {
+            throw new InvalidParameterValueException("Unable to find zone by 
id: " + zoneId);
+        }
+        final String prefix = cmd.getPrefix();
+        IPv6Network prefixNet = IPv6Network.fromString(prefix);
+        if (prefixNet.getNetmask().asPrefixLength() > 
Ipv6Service.IPV6_SLAAC_CIDR_NETMASK) {
+            throw new InvalidParameterValueException(String.format("IPv6 
prefix must be /%d or less", Ipv6Service.IPV6_SLAAC_CIDR_NETMASK));
+        }
+        List<DataCenterGuestIpv6PrefixVO> existingPrefixes = 
dataCenterGuestIpv6PrefixDao.listByDataCenterId(zoneId);
+        for (DataCenterGuestIpv6PrefixVO existingPrefix : existingPrefixes) {
+            IPv6Network existingPrefixNet = 
IPv6Network.fromString(existingPrefix.getPrefix());
+            if (NetUtils.ipv6NetworksOverlap(existingPrefixNet, prefixNet)) {
+                throw new InvalidParameterValueException(String.format("IPv6 
prefix %s overlaps with the existing IPv6 prefix %s", prefixNet, 
existingPrefixNet));
+            }
+        }
+        DataCenterGuestIpv6Prefix dataCenterGuestIpv6Prefix = null;
+        try {
+            dataCenterGuestIpv6Prefix = Transaction.execute(new 
TransactionCallback<DataCenterGuestIpv6Prefix>() {
+                @Override
+                public DataCenterGuestIpv6Prefix 
doInTransaction(TransactionStatus status) {
+                    DataCenterGuestIpv6PrefixVO dataCenterGuestIpv6PrefixVO = 
new DataCenterGuestIpv6PrefixVO(zoneId, prefix);
+                    
dataCenterGuestIpv6PrefixDao.persist(dataCenterGuestIpv6PrefixVO);
+                    return dataCenterGuestIpv6PrefixVO;
+                }
+            });
+        } catch (final Exception e) {
+            s_logger.error(String.format("Unable to add IPv6 prefix for zone: 
%s due to %s", zone, e.getMessage()), e);
+            throw new CloudRuntimeException(String.format("Unable to add IPv6 
prefix for zone ID: %s. Please contact Cloud Support.", zone.getUuid()));
+        }
+        return dataCenterGuestIpv6Prefix;
+    }
+
+    @Override
+    public List<? extends DataCenterGuestIpv6Prefix> 
listDataCenterGuestIpv6Prefixes(final ListGuestNetworkIpv6PrefixesCmd cmd) 
throws ConcurrentOperationException {
+        final Long id = cmd.getId();
+        final Long zoneId = cmd.getZoneId();
+        if (id != null) {
+            DataCenterGuestIpv6PrefixVO prefix = 
dataCenterGuestIpv6PrefixDao.findById(id);
+            List<DataCenterGuestIpv6PrefixVO> prefixes = new ArrayList<>();
+            if (prefix != null) {
+                prefixes.add(prefix);
+            }
+            return prefixes;
+        }
+        if (zoneId != null) {
+            final DataCenterVO zone = _zoneDao.findById(zoneId);
+            if (zone == null) {
+                throw new InvalidParameterValueException("Unable to find zone 
by id: " + zoneId);
+            }
+            return dataCenterGuestIpv6PrefixDao.listByDataCenterId(zoneId);
+        }
+        return dataCenterGuestIpv6PrefixDao.listAll();
+    }
+
+    @Override
+    public boolean 
deleteDataCenterGuestIpv6Prefix(DeleteGuestNetworkIpv6PrefixCmd cmd) {
+        final long prefixId = cmd.getId();
+        final DataCenterGuestIpv6PrefixVO prefix = 
dataCenterGuestIpv6PrefixDao.findById(prefixId);
+        if (prefix == null) {
+            throw new InvalidParameterValueException("Unable to find guest 
network IPv6 prefix by id: " + prefixId);
+        }
+        List<Ipv6GuestPrefixSubnetNetworkMapVO> prefixSubnets = 
ipv6GuestPrefixSubnetNetworkMapDao.listUsedByPrefix(prefixId);
+        if (CollectionUtils.isNotEmpty(prefixSubnets)) {
+            List<String> usedSubnets = 
prefixSubnets.stream().map(Ipv6GuestPrefixSubnetNetworkMapVO::getSubnet).collect(Collectors.toList());
+            s_logger.error(String.format("Subnets for guest IPv6 prefix {ID: 
%s, %s} are in use: %s", prefix.getUuid(), prefix.getPrefix(), String.join(", 
", usedSubnets)));
+            throw new CloudRuntimeException(String.format("Unable to delete 
guest network IPv6 prefix ID: %s. Prefix subnets are in use.", 
prefix.getUuid()));
+        }
+        ipv6GuestPrefixSubnetNetworkMapDao.deleteByPrefixId(prefixId);

Review comment:
       @weizhouapache `prefixSubnets` holds the list of subnets in Allocated or 
Allocating state. Table may still contain entries with state=Free




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to