You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ya...@apache.org on 2013/01/31 09:43:05 UTC
[1/12] IPv6: Accept IPv6 parameter for createNetworkCmd
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/guru/DirectNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
index b290c1d..d6a8812 100755
--- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@ -42,7 +42,9 @@ import com.cloud.network.NetworkVO;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.Mode;
import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PublicIpv6AddressVO;
import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.PublicIpv6AddressDao;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.user.Account;
@@ -72,6 +74,8 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
IPAddressDao _ipAddressDao;
@Inject
NetworkOfferingDao _networkOfferingDao;
+ @Inject
+ PublicIpv6AddressDao _ipv6Dao;
private static final TrafficType[] _trafficTypes = {TrafficType.Guest};
@@ -120,11 +124,20 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
throw new InvalidParameterValueException("cidr and gateway must be specified together.");
}
+ if ((userSpecified.getIp6Cidr() == null && userSpecified.getIp6Gateway() != null) || (userSpecified.getIp6Cidr() != null && userSpecified.getIp6Gateway() == null)) {
+ throw new InvalidParameterValueException("cidrv6 and gatewayv6 must be specified together.");
+ }
+
if (userSpecified.getCidr() != null) {
config.setCidr(userSpecified.getCidr());
config.setGateway(userSpecified.getGateway());
}
+ if (userSpecified.getIp6Cidr() != null) {
+ config.setIp6Cidr(userSpecified.getIp6Cidr());
+ config.setIp6Gateway(userSpecified.getIp6Gateway());
+ }
+
if (userSpecified.getBroadcastUri() != null) {
config.setBroadcastUri(userSpecified.getBroadcastUri());
config.setState(State.Setup);
@@ -137,6 +150,9 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
boolean isSecurityGroupEnabled = _networkModel.areServicesSupportedByNetworkOffering(offering.getId(), Service.SecurityGroup);
if (isSecurityGroupEnabled) {
+ if (userSpecified.getIp6Cidr() != null) {
+ throw new InvalidParameterValueException("Didn't support security group with IPv6");
+ }
config.setName("SecurityGroupEnabledNetwork");
config.setDisplayText("SecurityGroupEnabledNetwork");
}
@@ -165,13 +181,13 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
if (nic == null) {
nic = new NicProfile(ReservationStrategy.Create, null, null, null, null);
- } else if (nic.getIp4Address() == null) {
+ } else if (nic.getIp4Address() == null && nic.getIp6Address() == null) {
nic.setStrategy(ReservationStrategy.Start);
} else {
nic.setStrategy(ReservationStrategy.Create);
}
- _networkMgr.allocateDirectIp(nic, dc, vm, network, nic.getRequestedIp());
+ _networkMgr.allocateDirectIp(nic, dc, vm, network, nic.getRequestedIpv4(), nic.getRequestedIpv6());
nic.setStrategy(ReservationStrategy.Create);
return nic;
@@ -180,8 +196,8 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
@Override
public void reserve(NicProfile nic, Network network, VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest, ReservationContext context)
throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException {
- if (nic.getIp4Address() == null) {
- _networkMgr.allocateDirectIp(nic, dest.getDataCenter(), vm, network, null);
+ if (nic.getIp4Address() == null && nic.getIp6Address() == null) {
+ _networkMgr.allocateDirectIp(nic, dest.getDataCenter(), vm, network, null, null);
nic.setStrategy(ReservationStrategy.Create);
}
}
@@ -202,14 +218,23 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
s_logger.debug("Deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address());
}
- IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
- if (ip != null) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _networkMgr.markIpAsUnavailable(ip.getId());
- _ipAddressDao.unassignIpAddress(ip.getId());
- txn.commit();
- }
+ if (nic.getIp4Address() != null) {
+ IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
+ if (ip != null) {
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ _networkMgr.markIpAsUnavailable(ip.getId());
+ _ipAddressDao.unassignIpAddress(ip.getId());
+ txn.commit();
+ }
+ }
+
+ if (nic.getIp6Address() != null) {
+ PublicIpv6AddressVO ip = _ipv6Dao.findByDcIdAndIp(network.getDataCenterId(), nic.getIp6Address());
+ if (ip != null) {
+ _ipv6Dao.remove(ip.getId());
+ }
+ }
nic.deallocate();
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
index 8ca4547..709d280 100755
--- a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
@@ -96,7 +96,7 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru {
rsStrategy = ReservationStrategy.Create;
}
- if (nic != null && nic.getRequestedIp() != null) {
+ if (nic != null && nic.getRequestedIpv4() != null) {
throw new CloudRuntimeException("Does not support custom ip allocation at this time: " + nic);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
index f8a8a95..7a09d94 100644
--- a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
@@ -195,7 +195,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru {
public NicProfile allocate(Network config, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm) throws InsufficientVirtualNetworkCapcityException,
InsufficientAddressCapacityException {
- if (_networkModel.networkIsConfiguredForExternalNetworking(config.getDataCenterId(), config.getId()) && nic != null && nic.getRequestedIp() != null) {
+ if (_networkModel.networkIsConfiguredForExternalNetworking(config.getDataCenterId(), config.getId()) && nic != null && nic.getRequestedIpv4() != null) {
throw new CloudRuntimeException("Does not support custom ip allocation at this time: " + nic);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/guru/GuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/com/cloud/network/guru/GuestNetworkGuru.java
index 9587885..79ab87b 100755
--- a/server/src/com/cloud/network/guru/GuestNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java
@@ -352,7 +352,7 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur
String guestIp = null;
if (network.getSpecifyIpRanges()) {
- _networkMgr.allocateDirectIp(nic, dc, vm, network, nic.getRequestedIp());
+ _networkMgr.allocateDirectIp(nic, dc, vm, network, nic.getRequestedIpv4(), null);
} else {
//if Vm is router vm and source nat is enabled in the network, set ip4 to the network gateway
boolean isGateway = false;
@@ -371,7 +371,7 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur
if (isGateway) {
guestIp = network.getGateway();
} else {
- guestIp = _networkMgr.acquireGuestIpAddress(network, nic.getRequestedIp());
+ guestIp = _networkMgr.acquireGuestIpAddress(network, nic.getRequestedIpv4());
if (guestIp == null) {
throw new InsufficientVirtualNetworkCapcityException("Unable to acquire Guest IP" +
" address for network " + network, DataCenter.class, dc.getId());
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java
index b513325..bbe568d 100755
--- a/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java
@@ -100,7 +100,7 @@ public class PodBasedNetworkGuru extends AdapterBase implements NetworkGuru {
assert trafficType == TrafficType.Management || trafficType == TrafficType.Storage: "Well, I can't take care of this config now can I? " + config;
if (nic != null) {
- if (nic.getRequestedIp() != null) {
+ if (nic.getRequestedIpv4() != null) {
throw new CloudRuntimeException("Does not support custom ip allocation at this time: " + nic);
}
nic.setStrategy(nic.getIp4Address() != null ? ReservationStrategy.Create : ReservationStrategy.Start);
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/guru/PublicNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/PublicNetworkGuru.java b/server/src/com/cloud/network/guru/PublicNetworkGuru.java
index ddee5a5..8e912d6 100755
--- a/server/src/com/cloud/network/guru/PublicNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/PublicNetworkGuru.java
@@ -142,7 +142,7 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru {
DataCenter dc = _dcDao.findById(network.getDataCenterId());
- if (nic != null && nic.getRequestedIp() != null) {
+ if (nic != null && nic.getRequestedIpv4() != null) {
throw new CloudRuntimeException("Does not support custom ip allocation at this time: " + nic);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 2a2a625..4782015 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -1607,7 +1607,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
}
}
- NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp);
+ NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp, null);
if (setupPublicNetwork) {
if (isRedundant) {
gatewayNic.setIp4Address(_networkMgr.acquireGuestIpAddress(guestNetwork, null));
@@ -2960,11 +2960,11 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
}
private void createDhcpEntryCommand(VirtualRouter router, UserVm vm, NicVO nic, Commands cmds) {
- DhcpEntryCommand dhcpCommand = new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), vm.getHostName());
+ DhcpEntryCommand dhcpCommand = new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), vm.getHostName(), nic.getIp6Address());
DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn());
String gatewayIp = findGatewayIp(vm.getId());
boolean needGateway = true;
- if (!gatewayIp.equals(nic.getGateway())) {
+ if (gatewayIp != null && !gatewayIp.equals(nic.getGateway())) {
needGateway = false;
GuestOSVO guestOS = _guestOSDao.findById(vm.getGuestOSId());
// Do set dhcp:router option for non-default nic on certain OS(including Windows), and leave other OS unset.
@@ -2980,7 +2980,9 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
gatewayIp = "0.0.0.0";
}
dhcpCommand.setDefaultRouter(gatewayIp);
+ dhcpCommand.setIp6Gateway(nic.getIp6Gateway());
dhcpCommand.setDefaultDns(findDefaultDnsIp(vm.getId()));
+ dhcpCommand.setDuid(NetUtils.getDuidLL(nic.getMacAddress()));
dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId()));
dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index e95c54f..8014f6d 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -1884,7 +1884,7 @@ public class VpcManagerImpl implements VpcManager, Manager{
//2) Create network
Network guestNetwork = _ntwkMgr.createGuestNetwork(ntwkOffId, name, displayText, gateway, cidr, vlanId,
- networkDomain, owner, domainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId);
+ networkDomain, owner, domainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, null, null);
return guestNetwork;
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/vm/NicVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/NicVO.java b/server/src/com/cloud/vm/NicVO.java
index 3e9b4dc..b40cad8 100644
--- a/server/src/com/cloud/vm/NicVO.java
+++ b/server/src/com/cloud/vm/NicVO.java
@@ -98,6 +98,12 @@ public class NicVO implements Nic, Identity {
@Column(name = "default_nic")
boolean defaultNic;
+ @Column(name = "ip6_gateway")
+ String ip6Gateway;
+
+ @Column(name = "ip6_cidr")
+ String ip6Cidr;
+
@Column(name = "strategy")
@Enumerated(value = EnumType.STRING)
ReservationStrategy reservationStrategy;
@@ -155,6 +161,7 @@ public class NicVO implements Nic, Identity {
this.defaultNic = defaultNic;
}
+ @Override
public String getIp6Address() {
return ip6Address;
}
@@ -323,4 +330,22 @@ public class NicVO implements Nic, Identity {
public void setUuid(String uuid) {
this.uuid = uuid;
}
+
+ @Override
+ public String getIp6Gateway() {
+ return ip6Gateway;
+ }
+
+ public void setIp6Gateway(String ip6Gateway) {
+ this.ip6Gateway = ip6Gateway;
+ }
+
+ @Override
+ public String getIp6Cidr() {
+ return ip6Cidr;
+ }
+
+ public void setIp6Cidr(String ip6Cidr) {
+ this.ip6Cidr = ip6Cidr;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index a437e1f..a1f6167 100644
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -2176,7 +2176,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
s_logger.debug("Creating network for account " + owner + " from the network offering id=" +requiredOfferings.get(0).getId() + " as a part of deployVM process");
Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(),
owner.getAccountName() + "-network", owner.getAccountName() + "-network", null, null,
- null, null, owner, null, physicalNetwork, zone.getId(), ACLType.Account, null, null);
+ null, null, owner, null, physicalNetwork, zone.getId(), ACLType.Account, null, null, null, null);
defaultNetwork = _networkDao.findById(newNetwork.getId());
} else if (virtualNetworks.size() > 1) {
throw new InvalidParameterValueException("More than 1 default Isolated networks are found for account " + owner + "; please specify networkIds");
@@ -2364,13 +2364,13 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
requestedIp = requestedIps.get(network.getId());
}
- NicProfile profile = new NicProfile(requestedIp);
+ NicProfile profile = new NicProfile(requestedIp, null);
if (defaultNetworkNumber == 0) {
defaultNetworkNumber++;
// if user requested specific ip for default network, add it
if (defaultNetworkIp != null) {
- profile = new NicProfile(defaultNetworkIp);
+ profile = new NicProfile(defaultNetworkIp, null);
}
profile.setDefaultNic(true);
@@ -3615,7 +3615,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
requiredOfferings.get(0).getId() + " as a part of deployVM process");
Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(),
newAccount.getAccountName() + "-network", newAccount.getAccountName() + "-network", null, null,
- null, null, newAccount, null, physicalNetwork, zone.getId(), ACLType.Account, null, null);
+ null, null, newAccount, null, physicalNetwork, zone.getId(), ACLType.Account, null, null, null, null);
defaultNetwork = _networkDao.findById(newNetwork.getId());
} else if (virtualNetworks.size() > 1) {
throw new InvalidParameterValueException("More than 1 default Isolated networks are found " +
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java
index cfaa169..87998ba 100755
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@ -243,7 +243,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
@Override
public Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, String networkDomain, Account owner, Long domainId,
- PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
+ PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String gatewayv6, String cidrv6) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
// TODO Auto-generated method stub
return null;
}
@@ -678,7 +678,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
*/
@Override
public void allocateDirectIp(NicProfile nic, DataCenter dc, VirtualMachineProfile<? extends VirtualMachine> vm,
- Network network, String requestedIp) throws InsufficientVirtualNetworkCapcityException,
+ Network network, String requestedIpv4, String requestedIpv6) throws InsufficientVirtualNetworkCapcityException,
InsufficientAddressCapacityException {
// TODO Auto-generated method stub
@@ -786,4 +786,12 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
// TODO Auto-generated method stub
return null;
}
+
+ @Override
+ public PublicIpv6Address assignPublicIp6Address(long dcId, Long podId,
+ Account owner, VlanType type, Long networkId, String requestedIpv6,
+ boolean isSystem) throws InsufficientAddressCapacityException {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/test/com/cloud/network/MockNetworkModelImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkModelImpl.java b/server/test/com/cloud/network/MockNetworkModelImpl.java
index fae5ad3..0ca6a3d 100644
--- a/server/test/com/cloud/network/MockNetworkModelImpl.java
+++ b/server/test/com/cloud/network/MockNetworkModelImpl.java
@@ -797,4 +797,9 @@ public class MockNetworkModelImpl implements NetworkModel, Manager {
return null;
}
+ @Override
+ public Vlan getVlanForNetwork(long networkId) {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
index 2a25886..3e17a37 100644
--- a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
@@ -495,7 +495,7 @@ public class MockConfigurationManagerImpl implements ConfigurationManager, Confi
*/
@Override
public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, Long podId, String startIP, String endIP, String vlanGateway, String vlanNetmask, String vlanId,
- Account vlanOwner) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException {
+ Account vlanOwner, String startIPv6, String endIPv6, String vlanGatewayv6, String vlanCidrv6) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException {
// TODO Auto-generated method stub
return null;
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
index 1a3cbae..3913ec5 100644
--- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
@@ -35,6 +35,7 @@ import com.cloud.network.Network.GuestType;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PublicIpv6Address;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.NetworkServiceMapDao;
import com.cloud.network.element.NetworkElement;
@@ -824,7 +825,7 @@ public class MockNetworkManagerImpl implements NetworkManager, NetworkService, M
@Override
public Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway,
String cidr, String vlanId, String networkDomain, Account owner, Long domainId,
- PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId)
+ PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String gatewayv6, String cidrv6)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
// TODO Auto-generated method stub
return null;
@@ -989,10 +990,9 @@ public class MockNetworkManagerImpl implements NetworkManager, NetworkService, M
*/
@Override
public void allocateDirectIp(NicProfile nic, DataCenter dc, VirtualMachineProfile<? extends VirtualMachine> vm,
- Network network, String requestedIp) throws InsufficientVirtualNetworkCapcityException,
+ Network network, String requestedIpv4, String requestedIpv6) throws InsufficientVirtualNetworkCapcityException,
InsufficientAddressCapacityException {
// TODO Auto-generated method stub
-
}
@@ -1261,6 +1261,11 @@ public class MockNetworkManagerImpl implements NetworkManager, NetworkService, M
return null;
}
-
-
+ @Override
+ public PublicIpv6Address assignPublicIp6Address(long dcId, Long podId,
+ Account owner, VlanType type, Long networkId, String requestedIpv6,
+ boolean isSystem) throws InsufficientAddressCapacityException {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/setup/db/create-schema.sql
----------------------------------------------------------------------
diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql
index 1b6ee5d..f03d285 100755
--- a/setup/db/create-schema.sql
+++ b/setup/db/create-schema.sql
@@ -206,6 +206,8 @@ CREATE TABLE `cloud`.`networks` (
`broadcast_uri` varchar(255) COMMENT 'broadcast domain specifier',
`gateway` varchar(15) COMMENT 'gateway for this network configuration',
`cidr` varchar(18) COMMENT 'network cidr',
+ `ip6_gateway` varchar(50) COMMENT 'IPv6 gateway for this network',
+ `ip6_cidr` varchar(50) COMMENT 'IPv6 cidr for this network',
`mode` varchar(32) COMMENT 'How to retrieve ip address in this network',
`network_offering_id` bigint unsigned NOT NULL COMMENT 'network offering id that this configuration is created from',
`physical_network_id` bigint unsigned COMMENT 'physical network id that this configuration is based on',
@@ -269,6 +271,8 @@ CREATE TABLE `cloud`.`nics` (
`update_time` timestamp NOT NULL COMMENT 'time the state was changed',
`isolation_uri` varchar(255) COMMENT 'id for isolation',
`ip6_address` char(40) COMMENT 'ip6 address',
+ `ip6_gateway` varchar(50) COMMENT 'gateway for ip6 address',
+ `ip6_cidr` varchar(50) COMMENT 'cidr for ip6 address',
`default_nic` tinyint NOT NULL COMMENT "None",
`vm_type` varchar(32) COMMENT 'type of vm: System or User vm',
`created` datetime NOT NULL COMMENT 'date created',
@@ -499,7 +503,10 @@ CREATE TABLE `cloud`.`vlan` (
`vlan_id` varchar(255),
`vlan_gateway` varchar(255),
`vlan_netmask` varchar(255),
+ `ip6_gateway` varchar(255),
+ `ip6_cidr` varchar(255),
`description` varchar(255),
+ `ip6_range` varchar(255),
`vlan_type` varchar(255),
`data_center_id` bigint unsigned NOT NULL,
`network_id` bigint unsigned NOT NULL COMMENT 'id of corresponding network offering',
@@ -2544,4 +2551,29 @@ INSERT INTO `cloud`.`counter` (id, source, name, value,created) VALUES (2,'snmp'
INSERT INTO `cloud`.`counter` (id, source, name, value,created) VALUES (3,'snmp','Linux CPU Idle - percentage', '1.3.6.1.4.1.2021.11.11.0', now());
INSERT INTO `cloud`.`counter` (id, source, name, value,created) VALUES (100,'netscaler','Response Time - microseconds', 'RESPTIME', now());
+CREATE TABLE `cloud`.`public_ipv6_address` (
+ `id` bigint unsigned NOT NULL UNIQUE auto_increment,
+ `uuid` varchar(40),
+ `account_id` bigint unsigned NULL,
+ `domain_id` bigint unsigned NULL,
+ `ip_address` char(50) NOT NULL,
+ `data_center_id` bigint unsigned NOT NULL COMMENT 'zone that it belongs to',
+ `vlan_id` bigint unsigned NOT NULL,
+ `state` char(32) NOT NULL default 'Free' COMMENT 'state of the ip address',
+ `mac_address` varchar(40) NOT NULL COMMENT 'mac address of this ip',
+ `source_network_id` bigint unsigned NOT NULL COMMENT 'network id ip belongs to',
+ `network_id` bigint unsigned COMMENT 'network this public ip address is associated with',
+ `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id that this configuration is based on',
+ `created` datetime NULL COMMENT 'Date this ip was allocated to someone',
+ PRIMARY KEY (`id`),
+ UNIQUE (`ip_address`, `source_network_id`),
+ CONSTRAINT `fk_public_ipv6_address__source_network_id` FOREIGN KEY (`source_network_id`) REFERENCES `networks`(`id`),
+ CONSTRAINT `fk_public_ipv6_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`),
+ CONSTRAINT `fk_public_ipv6_address__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`),
+ CONSTRAINT `fk_public_ipv6_address__vlan_id` FOREIGN KEY (`vlan_id`) REFERENCES `vlan`(`id`) ON DELETE CASCADE,
+ CONSTRAINT `fk_public_ipv6_address__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE,
+ CONSTRAINT `uc_public_ipv6_address__uuid` UNIQUE (`uuid`),
+ CONSTRAINT `fk_public_ipv6_address__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
SET foreign_key_checks = 1;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/utils/pom.xml
----------------------------------------------------------------------
diff --git a/utils/pom.xml b/utils/pom.xml
index 1ee8b7e..126c179 100644
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -124,6 +124,11 @@
<version>${cs.ejb.version}</version>
</dependency>
<dependency>
+ <groupId>com.googlecode.java-ipv6</groupId>
+ <artifactId>java-ipv6</artifactId>
+ <version>${cs.java-ipv6.version}</version>
+ </dependency>
+ <dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>${cs.configuration.version}</version>
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/utils/src/com/cloud/utils/net/NetUtils.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java
index c456cdc..8bfd376 100755
--- a/utils/src/com/cloud/utils/net/NetUtils.java
+++ b/utils/src/com/cloud/utils/net/NetUtils.java
@@ -41,6 +41,9 @@ import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
+import com.googlecode.ipv6.IPv6Address;
+import com.googlecode.ipv6.IPv6Network;
+
import com.cloud.utils.IteratorUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.script.Script;
@@ -1142,4 +1145,73 @@ public class NetUtils {
return true;
}
+
+ public static boolean isValidIPv6(String ip) {
+ try {
+ IPv6Address address = IPv6Address.fromString(ip);
+ } catch (IllegalArgumentException ex) {
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean isValidIp6Cidr(String ip6Cidr) {
+ try {
+ IPv6Network network = IPv6Network.fromString(ip6Cidr);
+ } catch (IllegalArgumentException ex) {
+ return false;
+ }
+ return true;
+ }
+
+ public static int getIp6CidrSize(String ip6Cidr) {
+ IPv6Network network = null;
+ try {
+ network = IPv6Network.fromString(ip6Cidr);
+ } catch (IllegalArgumentException ex) {
+ return 0;
+ }
+ return network.getNetmask().asPrefixLength();
+ }
+
+ //FIXME: only able to cover lower 32 bits
+ public static String getIp6FromRange(String ip6Range) {
+ String[] ips = ip6Range.split("-");
+ String startIp = ips[0];
+ long gap = countIp6InRange(ip6Range);
+ IPv6Address start = IPv6Address.fromString(startIp);
+ // Find a random number based on lower 32 bits
+ int d = _rand.nextInt((int)(gap % Integer.MAX_VALUE));
+ // And a number based on the difference of lower 32 bits
+ IPv6Address ip = start.add(d);
+ return ip.toString();
+ }
+
+ //RFC3315, section 9.4
+ public static String getDuidLL(String macAddress) {
+ String duid = "00:03:00:06:" + macAddress;
+ return duid;
+ }
+
+ //FIXME: only able to cover lower 64 bits
+ public static long countIp6InRange(String ip6Range) {
+ String[] ips = ip6Range.split("-");
+ String startIp = ips[0];
+ String endIp = null;
+ if (ips.length > 1) {
+ endIp = ips[1];
+ }
+ IPv6Address start, end;
+ try {
+ start = IPv6Address.fromString(startIp);
+ end = IPv6Address.fromString(endIp);
+ } catch (IllegalArgumentException ex) {
+ return 0;
+ }
+ long startLow = start.getLowBits(), endLow = end.getLowBits();
+ if (startLow > endLow) {
+ return 0;
+ }
+ return endLow - startLow + 1;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4bdc94aa/utils/test/com/cloud/utils/net/NetUtilsTest.java
----------------------------------------------------------------------
diff --git a/utils/test/com/cloud/utils/net/NetUtilsTest.java b/utils/test/com/cloud/utils/net/NetUtilsTest.java
index 1eccba3..6290cd6 100644
--- a/utils/test/com/cloud/utils/net/NetUtilsTest.java
+++ b/utils/test/com/cloud/utils/net/NetUtilsTest.java
@@ -69,4 +69,18 @@ public class NetUtilsTest extends TestCase {
assertFalse(NetUtils.isValidS2SVpnPolicy(";modp1536"));
assertFalse(NetUtils.isValidS2SVpnPolicy(",aes;modp1536,,,"));
}
+
+ public void testIpv6() {
+ assertTrue(NetUtils.isValidIPv6("fc00::1"));
+ assertFalse(NetUtils.isValidIPv6(""));
+ assertFalse(NetUtils.isValidIPv6(null));
+ assertFalse(NetUtils.isValidIPv6("1234:5678::1/64"));
+ assertTrue(NetUtils.isValidIp6Cidr("1234:5678::1/64"));
+ assertFalse(NetUtils.isValidIp6Cidr("1234:5678::1"));
+ assertEquals(NetUtils.getIp6CidrSize("1234:5678::1/32"), 32);
+ assertEquals(NetUtils.getIp6CidrSize("1234:5678::1"), 0);
+ assertEquals(NetUtils.countIp6InRange("1234:5678::1-1234:5678::2"), 2);
+ assertEquals(NetUtils.countIp6InRange("1234:5678::2-1234:5678::0"), 0);
+ assertEquals(NetUtils.getIp6FromRange("1234:5678::1-1234:5678::1"), "1234:5678::1");
+ }
}