You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2013/02/02 00:27:31 UTC
[37/50] [abbrv] Sync javelin with master up to
894cb8f7d9fc8b5561754a9fa541fef8f235148a
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 7925ff8,c8acf3b..5c30e9a
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@@ -2276,11 -2278,23 +2276,23 @@@ public class ConfigurationManagerImpl e
@DB
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) {
+ String vlanId, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr) {
+ Network network = _networkModel.getNetwork(networkId);
-
+
+ boolean ipv4 = false, ipv6 = false;
-
+
- Network network = _networkModel.getNetwork(networkId);
+ if (startIP != null) {
+ ipv4 = true;
+ }
+
+ if (startIPv6 != null) {
+ ipv6 = true;
+ }
+
+ if (!ipv4 && !ipv6) {
+ throw new InvalidParameterValueException("Please specify IPv4 or IPv6 address.");
+ }
-
+
//Validate the zone
DataCenterVO zone = _zoneDao.findById(zoneId);
if (zone == null) {
@@@ -2345,91 -2359,134 +2357,134 @@@
throw new InvalidParameterValueException("Vlan owner can be defined only in the zone of type " + NetworkType.Advanced);
}
+ if (ipv4) {
- // Make sure the gateway is valid
- if (!NetUtils.isValidIp(vlanGateway)) {
- throw new InvalidParameterValueException("Please specify a valid gateway");
- }
+ // Make sure the gateway is valid
+ if (!NetUtils.isValidIp(vlanGateway)) {
+ throw new InvalidParameterValueException("Please specify a valid gateway");
+ }
- // Make sure the netmask is valid
- if (!NetUtils.isValidIp(vlanNetmask)) {
- throw new InvalidParameterValueException("Please specify a valid netmask");
- }
+ // Make sure the netmask is valid
+ if (!NetUtils.isValidIp(vlanNetmask)) {
+ throw new InvalidParameterValueException("Please specify a valid netmask");
}
-
++ }
+
+ if (ipv6) {
+ if (!NetUtils.isValidIpv6(vlanIp6Gateway)) {
+ throw new InvalidParameterValueException("Please specify a valid IPv6 gateway");
+ }
+ if (!NetUtils.isValidIp6Cidr(vlanIp6Cidr)) {
+ throw new InvalidParameterValueException("Please specify a valid IPv6 CIDR");
+ }
+ }
+
+ if (ipv4) {
- String newVlanSubnet = NetUtils.getSubNet(vlanGateway, vlanNetmask);
-
- // Check if the new VLAN's subnet conflicts with the guest network in
- // the specified zone (guestCidr is null for basic zone)
- String guestNetworkCidr = zone.getGuestNetworkCidr();
- if (guestNetworkCidr != null) {
- String[] cidrPair = guestNetworkCidr.split("\\/");
- String guestIpNetwork = NetUtils.getIpRangeStartIpFromCidr(cidrPair[0], Long.parseLong(cidrPair[1]));
- long guestCidrSize = Long.parseLong(cidrPair[1]);
- long vlanCidrSize = NetUtils.getCidrSize(vlanNetmask);
-
- long cidrSizeToUse = -1;
- if (vlanCidrSize < guestCidrSize) {
- cidrSizeToUse = vlanCidrSize;
- } else {
- cidrSizeToUse = guestCidrSize;
- }
+ String newVlanSubnet = NetUtils.getSubNet(vlanGateway, vlanNetmask);
- String guestSubnet = NetUtils.getCidrSubNet(guestIpNetwork, cidrSizeToUse);
+ // Check if the new VLAN's subnet conflicts with the guest network in
+ // the specified zone (guestCidr is null for basic zone)
+ String guestNetworkCidr = zone.getGuestNetworkCidr();
+ if (guestNetworkCidr != null) {
+ String[] cidrPair = guestNetworkCidr.split("\\/");
+ String guestIpNetwork = NetUtils.getIpRangeStartIpFromCidr(cidrPair[0], Long.parseLong(cidrPair[1]));
+ long guestCidrSize = Long.parseLong(cidrPair[1]);
+ long vlanCidrSize = NetUtils.getCidrSize(vlanNetmask);
- if (newVlanSubnet.equals(guestSubnet)) {
- throw new InvalidParameterValueException("The new IP range you have specified has the same subnet as the guest network in zone: " + zone.getName()
- + ". Please specify a different gateway/netmask.");
- }
- }
+ long cidrSizeToUse = -1;
+ if (vlanCidrSize < guestCidrSize) {
+ cidrSizeToUse = vlanCidrSize;
+ } else {
+ cidrSizeToUse = guestCidrSize;
+ }
- // Check if there are any errors with the IP range
- checkPublicIpRangeErrors(zoneId, vlanId, vlanGateway, vlanNetmask, startIP, endIP);
-
- // Throw an exception if any of the following is true:
- // 1. Another VLAN in the same zone has a different tag but the same
- // subnet as the new VLAN. Make an exception for the
- // case when both vlans are Direct.
- // 2. Another VLAN in the same zone that has the same tag and subnet as
- // the new VLAN has IPs that overlap with the IPs
- // being added
- // 3. Another VLAN in the same zone that has the same tag and subnet as
- // the new VLAN has a different gateway than the
- // new VLAN
- // 4. If VLAN is untagged and Virtual, and there is existing UNTAGGED
- // vlan with different subnet
- List<VlanVO> vlans = _vlanDao.listByZone(zone.getId());
- for (VlanVO vlan : vlans) {
- String otherVlanGateway = vlan.getVlanGateway();
+ String guestSubnet = NetUtils.getCidrSubNet(guestIpNetwork, cidrSizeToUse);
+
+ if (newVlanSubnet.equals(guestSubnet)) {
+ throw new InvalidParameterValueException("The new IP range you have specified has the same subnet as the guest network in zone: " + zone.getName()
+ + ". Please specify a different gateway/netmask.");
+ }
+ }
+
+ // Check if there are any errors with the IP range
+ checkPublicIpRangeErrors(zoneId, vlanId, vlanGateway, vlanNetmask, startIP, endIP);
+
+ // Throw an exception if any of the following is true:
+ // 1. Another VLAN in the same zone has a different tag but the same
+ // subnet as the new VLAN. Make an exception for the
+ // case when both vlans are Direct.
+ // 2. Another VLAN in the same zone that has the same tag and subnet as
+ // the new VLAN has IPs that overlap with the IPs
+ // being added
+ // 3. Another VLAN in the same zone that has the same tag and subnet as
+ // the new VLAN has a different gateway than the
+ // new VLAN
+ // 4. If VLAN is untagged and Virtual, and there is existing UNTAGGED
+ // vlan with different subnet
+ List<VlanVO> vlans = _vlanDao.listByZone(zone.getId());
+ for (VlanVO vlan : vlans) {
+ String otherVlanGateway = vlan.getVlanGateway();
+ // Continue if it's not IPv4
+ if (otherVlanGateway == null) {
+ continue;
+ }
- String otherVlanSubnet = NetUtils.getSubNet(vlan.getVlanGateway(), vlan.getVlanNetmask());
- String[] otherVlanIpRange = vlan.getIpRange().split("\\-");
- String otherVlanStartIP = otherVlanIpRange[0];
- String otherVlanEndIP = null;
- if (otherVlanIpRange.length > 1) {
- otherVlanEndIP = otherVlanIpRange[1];
- }
+ String otherVlanSubnet = NetUtils.getSubNet(vlan.getVlanGateway(), vlan.getVlanNetmask());
+ String[] otherVlanIpRange = vlan.getIpRange().split("\\-");
+ String otherVlanStartIP = otherVlanIpRange[0];
+ String otherVlanEndIP = null;
+ if (otherVlanIpRange.length > 1) {
+ otherVlanEndIP = otherVlanIpRange[1];
+ }
- if (forVirtualNetwork && !vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet) && !allowIpRangeOverlap(vlan, forVirtualNetwork, networkId)) {
- throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " in zone " + zone.getName()
- + " has the same subnet. Please specify a different gateway/netmask.");
- }
+ if (forVirtualNetwork && !vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet) && !allowIpRangeOverlap(vlan, forVirtualNetwork, networkId)) {
+ throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " in zone " + zone.getName()
+ + " has the same subnet. Please specify a different gateway/netmask.");
+ }
- boolean vlansUntaggedAndVirtual = (vlanId.equals(Vlan.UNTAGGED) && vlanId.equals(vlan.getVlanTag()) && forVirtualNetwork && vlan.getVlanType() == VlanType.VirtualNetwork);
+ boolean vlansUntaggedAndVirtual = (vlanId.equals(Vlan.UNTAGGED) && vlanId.equals(vlan.getVlanTag()) && forVirtualNetwork && vlan.getVlanType() == VlanType.VirtualNetwork);
- if (vlansUntaggedAndVirtual && !newVlanSubnet.equals(otherVlanSubnet)) {
- throw new InvalidParameterValueException("The Untagged ip range with different subnet already exists in zone " + zone.getId());
- }
+ if (vlansUntaggedAndVirtual && !newVlanSubnet.equals(otherVlanSubnet)) {
+ throw new InvalidParameterValueException("The Untagged ip range with different subnet already exists in zone " + zone.getId());
+ }
- if (vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet)) {
- if (NetUtils.ipRangesOverlap(startIP, endIP, otherVlanStartIP, otherVlanEndIP)) {
- throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag()
- + " already has IPs that overlap with the new range. Please specify a different start IP/end IP.");
- }
+ if (vlanId.equals(vlan.getVlanTag()) && newVlanSubnet.equals(otherVlanSubnet)) {
+ if (NetUtils.ipRangesOverlap(startIP, endIP, otherVlanStartIP, otherVlanEndIP)) {
+ throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag()
+ + " already has IPs that overlap with the new range. Please specify a different start IP/end IP.");
+ }
- if (!vlanGateway.equals(otherVlanGateway)) {
- throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " has already been added with gateway " + otherVlanGateway
- + ". Please specify a different tag.");
- }
- }
- }
+ if (!vlanGateway.equals(otherVlanGateway)) {
+ throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " has already been added with gateway " + otherVlanGateway
+ + ". Please specify a different tag.");
+ }
+ }
+ }
+ }
+
+ String ipv6Range = null;
+ if (ipv6) {
+ ipv6Range = startIPv6;
+ if (endIPv6 != null) {
+ ipv6Range += "-" + endIPv6;
+ }
+
+ List<VlanVO> vlans = _vlanDao.listByZone(zone.getId());
+ for (VlanVO vlan : vlans) {
+ if (vlan.getIp6Gateway() == null) {
+ continue;
+ }
+ if (vlanId.equals(vlan.getVlanTag())) {
+ if (NetUtils.isIp6RangeOverlap(ipv6Range, vlan.getIp6Range())) {
+ throw new InvalidParameterValueException("The IPv6 range with tag: " + vlan.getVlanTag()
+ + " already has IPs that overlap with the new range. Please specify a different start IP/end IP.");
+ }
+
+ if (!vlanIp6Gateway.equals(vlan.getIp6Gateway())) {
+ throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanTag() + " has already been added with gateway " + vlan.getIp6Gateway()
+ + ". Please specify a different tag.");
+ }
+ }
+ }
+ }
// Check if a guest VLAN is using the same tag
if (_zoneDao.findVnet(zoneId, physicalNetworkId, vlanId).size() > 0) {
@@@ -2450,11 -2507,15 +2505,15 @@@
}
}
- String ipRange = startIP;
+ String ipRange = null;
+
+ if (ipv4) {
+ ipRange = startIP;
- if (endIP != null) {
- ipRange += "-" + endIP;
- }
+ if (endIP != null) {
+ ipRange += "-" + endIP;
}
-
++ }
+
// Everything was fine, so persist the VLAN
Transaction txn = Transaction.currentTxn();
txn.start();
@@@ -2463,8 -2524,11 +2522,11 @@@
s_logger.debug("Saving vlan range " + vlan);
vlan = _vlanDao.persist(vlan);
+ // IPv6 use a used ip map, is different from ipv4, no need to save public ip range
+ if (ipv4) {
- if (!savePublicIPRange(startIP, endIP, zoneId, vlan.getId(), networkId, physicalNetworkId)) {
+ if (!savePublicIPRange(startIP, endIP, zoneId, vlan.getId(), networkId, physicalNetworkId)) {
- throw new CloudRuntimeException("Failed to save IP range. Please contact Cloud Support.");
+ throw new CloudRuntimeException("Failed to save IPv4 range. Please contact Cloud Support.");
+ }
}
if (vlanOwner != null) {
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/Ipv6AddressManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/Ipv6AddressManagerImpl.java
index 0000000,6666596..0122772
mode 000000,100644..100644
--- a/server/src/com/cloud/network/Ipv6AddressManagerImpl.java
+++ b/server/src/com/cloud/network/Ipv6AddressManagerImpl.java
@@@ -1,0 -1,132 +1,109 @@@
+ // Licensed to the Apache Software Foundation (ASF) under one
+ // or more contributor license agreements. See the NOTICE file
+ // distributed with this work for additional information
+ // regarding copyright ownership. The ASF licenses this file
+ // to you under the Apache License, Version 2.0 (the
+ // "License"); you may not use this file except in compliance
+ // with the License. You may obtain a copy of the License at
+ //
+ // http://www.apache.org/licenses/LICENSE-2.0
+ //
+ // Unless required by applicable law or agreed to in writing,
+ // software distributed under the License is distributed on an
+ // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ // KIND, either express or implied. See the License for the
+ // specific language governing permissions and limitations
+ // under the License.
+
+ package com.cloud.network;
+
+ import java.util.Map;
+
+ import javax.ejb.Local;
++import javax.inject.Inject;
+ import javax.naming.ConfigurationException;
+
+ import org.apache.log4j.Logger;
+
+ import com.cloud.dc.DataCenterVO;
+ import com.cloud.dc.Vlan;
+ import com.cloud.dc.dao.DataCenterDao;
+ import com.cloud.dc.dao.VlanDao;
+ import com.cloud.exception.InsufficientAddressCapacityException;
+ import com.cloud.network.dao.UserIpv6AddressDao;
+ import com.cloud.user.Account;
-import com.cloud.utils.component.Inject;
++import com.cloud.utils.component.ManagerBase;
+ import com.cloud.utils.exception.CloudRuntimeException;
+ import com.cloud.utils.net.NetUtils;
+
+ @Local(value = { Ipv6AddressManager.class } )
-public class Ipv6AddressManagerImpl implements Ipv6AddressManager {
++public class Ipv6AddressManagerImpl extends ManagerBase implements Ipv6AddressManager {
+ public static final Logger s_logger = Logger.getLogger(Ipv6AddressManagerImpl.class.getName());
+
- String _name = null;
-
+ @Inject
+ DataCenterDao _dcDao;
+ @Inject
+ VlanDao _vlanDao;
+ @Inject
+ NetworkModel _networkModel;
+ @Inject
+ UserIpv6AddressDao _ipv6Dao;
+
+ @Override
- public boolean configure(String name, Map<String, Object> params)
- throws ConfigurationException {
- _name = name;
- return true;
- }
-
- @Override
- public boolean start() {
- return true;
- }
-
- @Override
- public boolean stop() {
- return true;
- }
-
- @Override
- public String getName() {
- return _name;
- }
-
- @Override
+ public UserIpv6Address assignDirectIp6Address(long dcId, Account owner, Long networkId, String requestedIp6)
+ throws InsufficientAddressCapacityException {
+ Vlan vlan = _networkModel.getVlanForNetwork(networkId);
+ if (vlan == null) {
+ s_logger.debug("Cannot find related vlan or too many vlan attached to network " + networkId);
+ return null;
+ }
+ String ip = null;
+ if (requestedIp6 == null) {
+ int count = 0;
+ while (ip == null || count >= 10) {
+ ip = NetUtils.getIp6FromRange(vlan.getIp6Range());
+ //Check for duplicate IP
+ if (_ipv6Dao.findByNetworkIdAndIp(networkId, ip) == null) {
+ break;
+ } else {
+ ip = null;
+ }
+ count ++;
+ }
+ if (ip == null) {
+ throw new CloudRuntimeException("Fail to get unique ipv6 address after 10 times trying!");
+ }
+ } else {
+ if (!NetUtils.isIp6InRange(requestedIp6, vlan.getIp6Range())) {
+ throw new CloudRuntimeException("Requested IPv6 is not in the predefined range!");
+ }
+ ip = requestedIp6;
+ if (_ipv6Dao.findByNetworkIdAndIp(networkId, ip) != null) {
+ throw new CloudRuntimeException("The requested IP is already taken!");
+ }
+ }
+ DataCenterVO dc = _dcDao.findById(dcId);
+ Long mac = dc.getMacAddress();
+ Long nextMac = mac + 1;
+ dc.setMacAddress(nextMac);
+ _dcDao.update(dc.getId(), dc);
+
+ String macAddress = NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(mac));
+ UserIpv6AddressVO ipVO = new UserIpv6AddressVO(ip, dcId, macAddress, vlan.getId());
+ ipVO.setPhysicalNetworkId(vlan.getPhysicalNetworkId());
+ ipVO.setSourceNetworkId(vlan.getNetworkId());
+ ipVO.setState(UserIpv6Address.State.Allocated);
+ ipVO.setDomainId(owner.getDomainId());
+ ipVO.setAccountId(owner.getAccountId());
+ _ipv6Dao.persist(ipVO);
+ return ipVO;
+ }
+
+ @Override
+ public void revokeDirectIpv6Address(long networkId, String ip6Address) {
+ UserIpv6AddressVO ip = _ipv6Dao.findByNetworkIdAndIp(networkId, ip6Address);
+ if (ip != null) {
+ _ipv6Dao.remove(ip.getId());
+ }
+ }
+ }
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/NetworkManager.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/NetworkManagerImpl.java
index 0235bf1,67568da..643f1a4
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@@ -119,7 -112,7 +119,8 @@@ import com.cloud.network.dao.PhysicalNe
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
+import com.cloud.network.dao.PhysicalNetworkVO;
+ import com.cloud.network.dao.UserIpv6AddressDao;
import com.cloud.network.element.DhcpServiceProvider;
import com.cloud.network.element.IpDeployer;
import com.cloud.network.element.LoadBalancingServiceProvider;
@@@ -1313,10 -1317,8 +1318,8 @@@ public class NetworkManagerImpl extend
vo.setDefaultNic(profile.isDefaultNic());
- if (profile.getIp4Address() != null) {
- vo.setIp4Address(profile.getIp4Address());
+ vo.setIp4Address(profile.getIp4Address());
- vo.setAddressFormat(AddressFormat.Ip4);
- }
+ vo.setAddressFormat(profile.getFormat());
if (profile.getMacAddress() != null) {
vo.setMacAddress(profile.getMacAddress());
@@@ -1967,11 -1986,11 +1987,11 @@@
throw new InvalidParameterValueException("StartIp/endIp/gateway/netmask can't be specified for zone of type " + NetworkType.Basic);
}
- // Check if cidr is RFC1918 compliant if the network is Guest Isolated
+ // Check if cidr is RFC1918 compliant if the network is Guest Isolated for IPv4
if (cidr != null && ntwkOff.getGuestType() == Network.GuestType.Isolated && ntwkOff.getTrafficType() == TrafficType.Guest) {
- if (!NetUtils.validateGuestCidr(cidr)) {
- throw new InvalidParameterValueException("Virtual Guest Cidr " + cidr + " is not RFC1918 compliant");
- }
+ if (!NetUtils.validateGuestCidr(cidr)) {
+ throw new InvalidParameterValueException("Virtual Guest Cidr " + cidr + " is not RFC1918 compliant");
+ }
}
Transaction txn = Transaction.currentTxn();
@@@ -1998,7 -2017,21 +2018,21 @@@
}
}
}
-
+
+ if (ip6Cidr != null && ip6Gateway != null) {
+ userNetwork.setIp6Cidr(ip6Cidr);
+ userNetwork.setIp6Gateway(ip6Gateway);
+ if (vlanId != null) {
+ userNetwork.setBroadcastUri(URI.create("vlan://" + vlanId));
+ userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
+ if (!vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) {
+ userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
+ } else {
+ userNetwork.setBroadcastDomainType(BroadcastDomainType.Native);
+ }
+ }
+ }
+
List<NetworkVO> networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId,
aclType, subdomainAccess, vpcId);
@@@ -2566,12 -2599,12 +2600,12 @@@
throw new InvalidParameterValueException("Unable to find physical network with id: "+physicalNetworkId + " and tag: " +requiredOfferings.get(0).getTags());
}
- s_logger.debug("Creating network for account " + owner + " from the network offering id=" +
- requiredOfferings.get(0).getId() + " as a part of createVlanIpRange process");
+ s_logger.debug("Creating network for account " + owner + " from the network offering id=" +
+ requiredOfferings.get(0).getId() + " as a part of createVlanIpRange process");
guestNetwork = createGuestNetwork(requiredOfferings.get(0).getId(), owner.getAccountName() + "-network"
- , owner.getAccountName() + "-network", null, null, null, null, owner, null, physicalNetwork,
+ , owner.getAccountName() + "-network", null, null, null, null, owner, null, physicalNetwork,
zoneId, ACLType.Account,
- null, null);
+ null, null, null, null);
if (guestNetwork == null) {
s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId);
throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT " +
@@@ -3347,28 -3380,56 +3381,56 @@@
return success;
}
- @Override
- public void allocateDirectIp(NicProfile nic, DataCenter dc, VirtualMachineProfile<? extends VirtualMachine> vm, Network network, String requestedIp) throws InsufficientVirtualNetworkCapcityException,
+ public void allocateDirectIp(NicProfile nic, DataCenter dc, VirtualMachineProfile<? extends VirtualMachine> vm, Network network,
+ String requestedIpv4, String requestedIpv6) throws InsufficientVirtualNetworkCapcityException,
- InsufficientAddressCapacityException {
+ InsufficientAddressCapacityException {
+ boolean ipv4 = false, ipv6 = false;
+ if (network.getGateway() != null) {
- if (nic.getIp4Address() == null) {
+ if (nic.getIp4Address() == null) {
- PublicIp ip = assignPublicIpAddress(dc.getId(), null, vm.getOwner(), VlanType.DirectAttached, network.getId(), requestedIp, false);
+ ipv4 = true;
+ PublicIp ip = assignPublicIpAddress(dc.getId(), null, vm.getOwner(), VlanType.DirectAttached, network.getId(), requestedIpv4, false);
- nic.setIp4Address(ip.getAddress().toString());
- nic.setGateway(ip.getGateway());
- nic.setNetmask(ip.getNetmask());
- nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
- nic.setBroadcastType(BroadcastDomainType.Vlan);
- nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
- nic.setFormat(AddressFormat.Ip4);
- nic.setReservationId(String.valueOf(ip.getVlanTag()));
- nic.setMacAddress(ip.getMacAddress());
- }
+ nic.setIp4Address(ip.getAddress().toString());
+ nic.setGateway(ip.getGateway());
+ nic.setNetmask(ip.getNetmask());
+ nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
+ nic.setBroadcastType(BroadcastDomainType.Vlan);
+ nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
+ nic.setFormat(AddressFormat.Ip4);
+ nic.setReservationId(String.valueOf(ip.getVlanTag()));
+ nic.setMacAddress(ip.getMacAddress());
+ }
+ }
+
+ if (network.getIp6Gateway() != null) {
+ if (nic.getIp6Address() == null) {
+ ipv6 = true;
+ UserIpv6Address ip = _ipv6Mgr.assignDirectIp6Address(dc.getId(), vm.getOwner(), network.getId(), requestedIpv6);
+ Vlan vlan = _networkModel.getVlanForNetwork(network.getId());
+ if (vlan == null) {
+ s_logger.debug("Cannot find related vlan or too many vlan attached to network " + network.getId());
+ return;
+ }
+ nic.setIp6Address(ip.getAddress().toString());
+ nic.setIp6Gateway(vlan.getIp6Gateway());
+ nic.setIp6Cidr(vlan.getIp6Cidr());
+ if (ipv4) {
+ nic.setFormat(AddressFormat.DualStack);
+ } else {
+ nic.setIsolationUri(IsolationType.Vlan.toUri(vlan.getVlanTag()));
+ nic.setBroadcastType(BroadcastDomainType.Vlan);
+ nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan.getVlanTag()));
+ nic.setFormat(AddressFormat.Ip6);
+ nic.setReservationId(String.valueOf(vlan.getVlanTag()));
+ nic.setMacAddress(ip.getMacAddress());
+ }
+ }
+ }
nic.setDns1(dc.getDns1());
nic.setDns2(dc.getDns2());
}
-
- @Override
+ @Override
public boolean setupDns(Network network, Provider provider) {
boolean dnsProvided = _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dns, provider );
boolean dhcpProvided =_networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp,
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/NetworkModelImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/NetworkModelImpl.java
index 7aba59f,a74b589..ff97911
--- a/server/src/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/com/cloud/network/NetworkModelImpl.java
@@@ -71,7 -66,7 +72,8 @@@ import com.cloud.network.dao.PhysicalNe
import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
+import com.cloud.network.dao.PhysicalNetworkVO;
+ import com.cloud.network.dao.UserIpv6AddressDao;
import com.cloud.network.element.NetworkElement;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.network.rules.FirewallRule.Purpose;
@@@ -516,7 -513,15 +519,15 @@@ public class NetworkModelImpl extends M
}
boolean hasFreeIps = true;
if (network.getGuestType() == GuestType.Shared) {
+ if (network.getGateway() != null) {
- hasFreeIps = _ipAddressDao.countFreeIPsInNetwork(network.getId()) > 0;
+ hasFreeIps = _ipAddressDao.countFreeIPsInNetwork(network.getId()) > 0;
+ }
+ if (!hasFreeIps) {
+ return false;
+ }
+ if (network.getIp6Gateway() != null) {
+ hasFreeIps = isIP6AddressAvailable(network);
+ }
} else {
hasFreeIps = (getAvailableIps(network, null)).size() > 0;
}
@@@ -524,9 -529,27 +535,27 @@@
return hasFreeIps;
}
+ @Override
+ public Vlan getVlanForNetwork(long networkId) {
+ List<VlanVO> vlans = _vlanDao.listVlansByNetworkId(networkId);
+ if (vlans == null || vlans.size() > 1) {
+ s_logger.debug("Cannot find related vlan or too many vlan attached to network " + networkId);
+ return null;
+ }
+ return vlans.get(0);
+ }
-
+
+ private boolean isIP6AddressAvailable(Network network) {
+ if (network.getIp6Gateway() == null) {
+ return false;
+ }
+ Vlan vlan = getVlanForNetwork(network.getId());
+ long existedCount = _ipv6Dao.countExistedIpsInNetwork(network.getId());
+ long rangeCount = NetUtils.countIp6InRange(vlan.getIp6Range());
+ return (existedCount < rangeCount);
+ }
- @Override
+ @Override
public Map<Service, Map<Capability, String>> getNetworkCapabilities(long networkId) {
Map<Service, Map<Capability, String>> networkCapabilities = new HashMap<Service, Map<Capability, String>>();
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/NetworkServiceImpl.java
index 9020281,4467727..f0282ab
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@@ -727,37 -735,90 +731,90 @@@ public class NetworkServiceImpl extend
UserContext.current().setAccountId(owner.getAccountId());
- // VALIDATE IP INFO
+ boolean ipv4 = false, ipv6 = false;
+ if (startIP != null) {
+ ipv4 = true;
+ }
+ if (startIPv6 != null) {
+ ipv6 = true;
+ }
+
+ String cidr = null;
+ if (ipv4) {
- // if end ip is not specified, default it to startIp
- if (startIP != null) {
- if (!NetUtils.isValidIp(startIP)) {
- throw new InvalidParameterValueException("Invalid format for the startIp parameter");
- }
- if (endIP == null) {
- endIP = startIP;
- } else if (!NetUtils.isValidIp(endIP)) {
- throw new InvalidParameterValueException("Invalid format for the endIp parameter");
- }
- }
+ // if end ip is not specified, default it to startIp
+ if (startIP != null) {
+ if (!NetUtils.isValidIp(startIP)) {
+ throw new InvalidParameterValueException("Invalid format for the startIp parameter");
+ }
+ if (endIP == null) {
+ endIP = startIP;
+ } else if (!NetUtils.isValidIp(endIP)) {
+ throw new InvalidParameterValueException("Invalid format for the endIp parameter");
+ }
+ }
- if (startIP != null && endIP != null) {
- if (!(gateway != null && netmask != null)) {
- throw new InvalidParameterValueException("gateway and netmask should be defined when startIP/endIP are passed in");
- }
- }
+ if (startIP != null && endIP != null) {
+ if (!(gateway != null && netmask != null)) {
+ throw new InvalidParameterValueException("gateway and netmask should be defined when startIP/endIP are passed in");
+ }
+ }
- String cidr = null;
- if (gateway != null && netmask != null) {
- if (!NetUtils.isValidIp(gateway)) {
- throw new InvalidParameterValueException("Invalid gateway");
- }
- if (!NetUtils.isValidNetmask(netmask)) {
- throw new InvalidParameterValueException("Invalid netmask");
- }
+ if (gateway != null && netmask != null) {
+ if (!NetUtils.isValidIp(gateway)) {
+ throw new InvalidParameterValueException("Invalid gateway");
+ }
+ if (!NetUtils.isValidNetmask(netmask)) {
+ throw new InvalidParameterValueException("Invalid netmask");
+ }
- cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
- }
+ cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
+ }
+ }
+
+ if (ipv6) {
+ if (!NetUtils.isValidIpv6(startIPv6)) {
+ throw new InvalidParameterValueException("Invalid format for the startIPv6 parameter");
+ }
+ if (endIPv6 == null) {
+ endIPv6 = startIPv6;
+ } else if (!NetUtils.isValidIpv6(endIPv6)) {
+ throw new InvalidParameterValueException("Invalid format for the endIPv6 parameter");
+ }
+
+ if (!(ip6Gateway != null && ip6Cidr != null)) {
+ throw new InvalidParameterValueException("ip6Gateway and ip6Cidr should be defined when startIPv6/endIPv6 are passed in");
+ }
+
+ if (!NetUtils.isValidIpv6(ip6Gateway)) {
+ throw new InvalidParameterValueException("Invalid ip6Gateway");
+ }
+ if (!NetUtils.isValidIp6Cidr(ip6Cidr)) {
+ throw new InvalidParameterValueException("Invalid ip6cidr");
+ }
+ if (!NetUtils.isIp6InRange(startIPv6, ip6Cidr)) {
+ throw new InvalidParameterValueException("startIPv6 is not in ip6cidr indicated network range!");
+ }
+ if (!NetUtils.isIp6InRange(endIPv6, ip6Cidr)) {
+ throw new InvalidParameterValueException("endIPv6 is not in ip6cidr indicated network range!");
+ }
+ if (!NetUtils.isIp6InRange(ip6Gateway, ip6Cidr)) {
+ throw new InvalidParameterValueException("ip6Gateway is not in ip6cidr indicated network range!");
+ }
+
+ int cidrSize = NetUtils.getIp6CidrSize(ip6Cidr);
+ // Ipv6 cidr limit should be at least /64
+ if (cidrSize < 64) {
+ throw new InvalidParameterValueException("The cidr size of IPv6 network must be no less than 64 bits!");
+ }
+ }
+
+ if (ipv6) {
+ if (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() != Network.GuestType.Shared) {
+ throw new InvalidParameterValueException("Can only support create IPv6 network with advance shared network!");
+ }
+ }
+
// Regular user can create Guest Isolated Source Nat enabled network only
if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL
&& (ntwkOff.getTrafficType() != TrafficType.Guest || ntwkOff.getGuestType() != Network.GuestType.Isolated
@@@ -771,19 -832,25 +828,25 @@@
if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL && (ntwkOff.getSpecifyVlan() || vlanId != null)) {
throw new InvalidParameterValueException("Regular user is not allowed to specify vlanId");
}
-
+
+ if (ipv4) {
- // For non-root admins check cidr limit - if it's allowed by global config value
- if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN && cidr != null) {
+ // For non-root admins check cidr limit - if it's allowed by global config value
+ if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN && cidr != null) {
- String[] cidrPair = cidr.split("\\/");
- int cidrSize = Integer.valueOf(cidrPair[1]);
+ String[] cidrPair = cidr.split("\\/");
+ int cidrSize = Integer.valueOf(cidrPair[1]);
- if (cidrSize < _cidrLimit) {
- throw new InvalidParameterValueException("Cidr size can't be less than " + _cidrLimit);
- }
- }
+ if (cidrSize < _cidrLimit) {
+ throw new InvalidParameterValueException("Cidr size can't be less than " + _cidrLimit);
+ }
+ }
+ }
Collection<String> ntwkProviders = _networkMgr.finalizeServicesAndProvidersForNetwork(ntwkOff, physicalNetworkId).values();
+ if (ipv6 && providersConfiguredForExternalNetworking(ntwkProviders)) {
+ throw new InvalidParameterValueException("Cannot support IPv6 on network offering with external devices!");
+ }
+
if (cidr != null && providersConfiguredForExternalNetworking(ntwkProviders)) {
if (ntwkOff.getGuestType() == GuestType.Shared && (zone.getNetworkType() == NetworkType.Advanced) &&
isSharedNetworkOfferingWithServices(networkOfferingId)) {
@@@ -800,9 -866,16 +862,16 @@@
// 2) GuestType is Isolated, but SourceNat service is disabled
boolean createVlan = (startIP != null && endIP != null && zone.getNetworkType() == NetworkType.Advanced
&& ((ntwkOff.getGuestType() == Network.GuestType.Shared)
- || (ntwkOff.getGuestType() == GuestType.Isolated &&
- !areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat))));
-
+ || (ntwkOff.getGuestType() == GuestType.Isolated &&
+ !areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat))));
+
+ if (!createVlan) {
+ // Only support advance shared network in IPv6, which means createVlan is a must
+ if (ipv6) {
+ createVlan = true;
+ }
+ }
+
// Can add vlan range only to the network which allows it
if (createVlan && !ntwkOff.getSpecifyIpRanges()) {
InvalidParameterValueException ex = new InvalidParameterValueException("Network offering with specified id doesn't support adding multiple ip ranges");
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/addr/PublicIp.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/dao/NetworkVO.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/dao/NetworkVO.java
index b89cb65,0000000..5ecb22f
mode 100644,000000..100644
--- a/server/src/com/cloud/network/dao/NetworkVO.java
+++ b/server/src/com/cloud/network/dao/NetworkVO.java
@@@ -1,499 -1,0 +1,523 @@@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.network.dao;
+
+import java.net.URI;
+import java.util.Date;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Transient;
+
+import org.apache.cloudstack.acl.ControlledEntity;
+
+import com.cloud.network.Network;
+import com.cloud.network.Networks;
+import com.cloud.network.Network.GuestType;
+import com.cloud.network.Network.State;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.Networks.Mode;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.db.GenericDao;
+import com.cloud.utils.net.NetUtils;
+
+/**
+ * NetworkConfigurationVO contains information about a specific network.
+ *
+ */
+@Entity
+@Table(name="networks")
+public class NetworkVO implements Network {
+ @Id
+ @TableGenerator(name="networks_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="networks_seq", allocationSize=1)
+ @Column(name="id")
+ long id;
+
+ @Column(name="mode")
+ @Enumerated(value=EnumType.STRING)
+ Mode mode;
+
+ @Column(name="broadcast_domain_type")
+ @Enumerated(value=EnumType.STRING)
+ BroadcastDomainType broadcastDomainType;
+
+ @Column(name="traffic_type")
+ @Enumerated(value=EnumType.STRING)
+ TrafficType trafficType;
+
+ @Column(name="name")
+ String name;
+
+ @Column(name="display_text")
+ String displayText;;
+
+ @Column(name="broadcast_uri")
+ URI broadcastUri;
+
+ @Column(name="gateway")
+ String gateway;
+
+ @Column(name="cidr")
+ String cidr;
+
+ @Column(name="network_offering_id")
+ long networkOfferingId;
+
+ @Column(name="vpc_id")
+ Long vpcId;
+
+ @Column(name="physical_network_id")
+ Long physicalNetworkId;
+
+ @Column(name="data_center_id")
+ long dataCenterId;
+
+ @Column(name="related")
+ long related;
+
+ @Column(name="guru_name")
+ String guruName;
+
+ @Column(name="state")
+ @Enumerated(value=EnumType.STRING)
+ State state;
+
+ @Column(name="dns1")
+ String dns1;
+
+ @Column(name="domain_id")
+ long domainId;
+
+ @Column(name="account_id")
+ long accountId;
+
+ @Column(name="set_fields")
+ long setFields;
+
+ @TableGenerator(name="mac_address_seq", table="op_networks", pkColumnName="id", valueColumnName="mac_address_seq", allocationSize=1)
+ @Transient
+ long macAddress = 1;
+
+ @Column(name="guru_data", length=1024)
+ String guruData;
+
+ @Column(name="dns2")
+ String dns2;
+
+ @Column(name="network_domain")
+ String networkDomain;
+
+ @Column(name=GenericDao.REMOVED_COLUMN)
+ Date removed;
+
+ @Column(name=GenericDao.CREATED_COLUMN)
+ Date created;
+
+ @Column(name="reservation_id")
+ String reservationId;
+
+ @Column(name="uuid")
+ String uuid;
+
+ @Column(name="guest_type")
+ @Enumerated(value=EnumType.STRING)
+ Network.GuestType guestType;
+
+ @Column(name="acl_type")
+ @Enumerated(value=EnumType.STRING)
+ ControlledEntity.ACLType aclType;
+
+ @Column(name="restart_required")
+ boolean restartRequired = false;
+
+ @Column(name="specify_ip_ranges")
+ boolean specifyIpRanges = false;
+
++ @Column(name="ip6_gateway")
++ String ip6Gateway;
++
++ @Column(name="ip6_cidr")
++ String ip6Cidr;
++
+ public NetworkVO() {
+ this.uuid = UUID.randomUUID().toString();
+ }
+
+ /**
+ * Constructor to be used for the adapters because it only initializes what's needed.
+ * @param trafficType
+ * @param mode
+ * @param broadcastDomainType
+ * @param networkOfferingId
+ * @param state TODO
+ * @param dataCenterId
+ * @param physicalNetworkId TODO
+ */
+ public NetworkVO(TrafficType trafficType, Mode mode, BroadcastDomainType broadcastDomainType, long networkOfferingId,
+ State state, long dataCenterId, Long physicalNetworkId) {
+ this.trafficType = trafficType;
+ this.mode = mode;
+ this.broadcastDomainType = broadcastDomainType;
+ this.networkOfferingId = networkOfferingId;
+ this.dataCenterId = dataCenterId;
+ this.physicalNetworkId = physicalNetworkId;
+ if (state == null) {
+ state = State.Allocated;
+ } else {
+ this.state = state;
+ }
+ this.id = -1;
+ this.uuid = UUID.randomUUID().toString();
+ }
+
+ public NetworkVO(long id, Network that, long offeringId, String guruName, long domainId, long accountId,
+ long related, String name, String displayText, String networkDomain, GuestType guestType, long dcId,
+ Long physicalNetworkId, ACLType aclType, boolean specifyIpRanges, Long vpcId) {
+ this(id, that.getTrafficType(), that.getMode(), that.getBroadcastDomainType(), offeringId, domainId, accountId,
+ related, name, displayText, networkDomain, guestType, dcId, physicalNetworkId, aclType, specifyIpRanges, vpcId);
+ this.gateway = that.getGateway();
+ this.cidr = that.getCidr();
+ this.broadcastUri = that.getBroadcastUri();
+ this.broadcastDomainType = that.getBroadcastDomainType();
+ this.guruName = guruName;
+ this.state = that.getState();
+ if (state == null) {
+ state = State.Allocated;
+ }
+ this.uuid = UUID.randomUUID().toString();
++ this.ip6Gateway = that.getIp6Gateway();
++ this.ip6Cidr = that.getIp6Cidr();
+ }
+
+ /**
+ * Constructor for the actual DAO object.
+ * @param trafficType
+ * @param mode
+ * @param broadcastDomainType
+ * @param networkOfferingId
+ * @param domainId
+ * @param accountId
+ * @param name
+ * @param displayText
+ * @param networkDomain
+ * @param guestType TODO
+ * @param aclType TODO
+ * @param specifyIpRanges TODO
+ * @param vpcId TODO
+ * @param dataCenterId
+ */
+ public NetworkVO(long id, TrafficType trafficType, Mode mode, BroadcastDomainType broadcastDomainType,
+ long networkOfferingId, long domainId, long accountId, long related, String name, String displayText,
+ String networkDomain, GuestType guestType, long dcId, Long physicalNetworkId, ACLType aclType, boolean specifyIpRanges, Long vpcId) {
+ this(trafficType, mode, broadcastDomainType, networkOfferingId, State.Allocated, dcId, physicalNetworkId);
+ this.domainId = domainId;
+ this.accountId = accountId;
+ this.related = related;
+ this.id = id;
+ this.name = name;
+ this.displayText = displayText;
+ this.aclType = aclType;
+ this.networkDomain = networkDomain;
+ this.uuid = UUID.randomUUID().toString();
+ this.guestType = guestType;
+ this.specifyIpRanges = specifyIpRanges;
+ this.vpcId = vpcId;
+ }
+
+ @Override
+ public String getReservationId() {
+ return reservationId;
+ }
+
+ public void setReservationId(String reservationId) {
+ this.reservationId = reservationId;
+ }
+
+ @Override
+ public State getState() {
+ return state;
+ }
+
+ public void setState(State state) {
+ this.state = state;
+ }
+
+ @Override
+ public long getRelated() {
+ return related;
+ }
+
+ @Override
+ public long getId() {
+ return id;
+ }
+
+ @Override
+ public Mode getMode() {
+ return mode;
+ }
+
+ @Override
+ public long getAccountId() {
+ return accountId;
+ }
+
+ @Override
+ public long getDomainId() {
+ return domainId;
+ }
+
+ @Override
+ public long getNetworkOfferingId() {
+ return networkOfferingId;
+ }
+
+ public void setNetworkOfferingId(long networkOfferingId) {
+ this.networkOfferingId = networkOfferingId;
+ }
+
+ public void setMode(Mode mode) {
+ this.mode = mode;
+ }
+
+ @Override
+ public BroadcastDomainType getBroadcastDomainType() {
+ return broadcastDomainType;
+ }
+
+ public String getGuruData() {
+ return guruData;
+ }
+
+ public void setGuruData(String guruData) {
+ this.guruData = guruData;
+ }
+
+ public String getGuruName() {
+ return guruName;
+ }
+
+ public void setGuruName(String guruName) {
+ this.guruName = guruName;
+ }
+
+ public void setBroadcastDomainType(BroadcastDomainType broadcastDomainType) {
+ this.broadcastDomainType = broadcastDomainType;
+ }
+
+ @Override
+ public String getNetworkDomain() {
+ return networkDomain;
+ }
+
+ public void setNetworkDomain(String networkDomain) {
+ this.networkDomain = networkDomain;
+ }
+
+ @Override
+ public TrafficType getTrafficType() {
+ return trafficType;
+ }
+
+ public void setTrafficType(TrafficType trafficType) {
+ this.trafficType = trafficType;
+ }
+
+ @Override
+ public String getGateway() {
+ return gateway;
+ }
+
+ public void setGateway(String gateway) {
+ this.gateway = gateway;
+ }
+
+ @Override
+ public String getCidr() {
+ return cidr;
+ }
+
+ public void setCidr(String cidr) {
+ this.cidr = cidr;
+ }
+
+ @Override
+ public URI getBroadcastUri() {
+ return broadcastUri;
+ }
+
+ public void setBroadcastUri(URI broadcastUri) {
+ this.broadcastUri = broadcastUri;
+ }
+
+ @Override
+ public int hashCode() {
+ return NumbersUtil.hash(id);
+ }
+
+ @Override
+ public Long getPhysicalNetworkId() {
+ return physicalNetworkId;
+ }
+
+ @Override
+ public void setPhysicalNetworkId(Long physicalNetworkId) {
+ this.physicalNetworkId = physicalNetworkId;
+ }
+
+ @Override
+ public long getDataCenterId() {
+ return dataCenterId;
+ }
+
+ public String getDns1() {
+ return dns1;
+ }
+
+ public void setDns1(String dns) {
+ this.dns1 = dns;
+ }
+
+ public String getDns2() {
+ return dns2;
+ }
+
+ public void setDns2(String dns) {
+ this.dns2 = dns;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String getDisplayText() {
+ return displayText;
+ }
+
+ public void setDisplayText(String displayText) {
+ this.displayText = displayText;
+ }
+
+ public Date getRemoved() {
+ return removed;
+ }
+
+ public void setRemoved(Date removed) {
+ this.removed = removed;
+ }
+
+ public Date getCreated() {
+ return created;
+ }
+
+ public void setCreated(Date created) {
+ this.created = created;
+ }
+
+ @Override
+ public Network.GuestType getGuestType() {
+ return guestType;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof NetworkVO)) {
+ return false;
+ }
+ NetworkVO that = (NetworkVO)obj;
+ if (this.trafficType != that.trafficType) {
+ return false;
+ }
+
+ if ((this.cidr == null && that.cidr != null) || (this.cidr != null && that.cidr == null)) {
+ return false;
+ }
+
+ if (this.cidr == null && that.cidr == null) {
+ return true;
+ }
+
+ return NetUtils.isNetworkAWithinNetworkB(this.cidr, that.cidr);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder buf = new StringBuilder("Ntwk[");
+ buf.append(id).append("|").append(trafficType).append("|").append(networkOfferingId).append("]");
+ return buf.toString();
+ }
+
+ public String getUuid() {
+ return this.uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+ public ControlledEntity.ACLType getAclType() {
+ return aclType;
+ }
+
+ public void setRestartRequired(boolean restartRequired) {
+ this.restartRequired = restartRequired;
+ }
+
+ @Override
+ public boolean isRestartRequired() {
+ return restartRequired;
+ }
+
+ @Override
+ public boolean getSpecifyIpRanges() {
+ return specifyIpRanges;
+ }
+
+ @Override
+ public Long getVpcId() {
+ return vpcId;
+ }
++
++ public String getIp6Cidr() {
++ return ip6Cidr;
++ }
++
++ public void setIp6Cidr(String ip6Cidr) {
++ this.ip6Cidr = ip6Cidr;
++ }
++
++ public String getIp6Gateway() {
++ return ip6Gateway;
++ }
++
++ public void setIp6Gateway(String ip6Gateway) {
++ this.ip6Gateway = ip6Gateway;
++ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/dao/UserIpv6AddressDaoImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/dao/UserIpv6AddressDaoImpl.java
index 0000000,6989c40..14935c3
mode 000000,100644..100644
--- a/server/src/com/cloud/network/dao/UserIpv6AddressDaoImpl.java
+++ b/server/src/com/cloud/network/dao/UserIpv6AddressDaoImpl.java
@@@ -1,0 -1,96 +1,98 @@@
+ package com.cloud.network.dao;
+
+ import java.util.List;
+ import java.util.Map;
+
+ import javax.ejb.Local;
+ import javax.naming.ConfigurationException;
+
+ import org.apache.log4j.Logger;
++import org.springframework.stereotype.Component;
+
+ import com.cloud.network.Network;
+ import com.cloud.network.UserIpv6AddressVO;
+ import com.cloud.utils.Pair;
+ import com.cloud.utils.db.Filter;
+ import com.cloud.utils.db.GenericDaoBase;
+ import com.cloud.utils.db.GenericSearchBuilder;
+ import com.cloud.utils.db.SearchBuilder;
+ import com.cloud.utils.db.SearchCriteria;
+ import com.cloud.utils.db.SearchCriteria.Func;
+ import com.cloud.utils.db.SearchCriteria.Op;
+ import com.cloud.utils.db.SearchCriteria2;
+
++@Component
+ @Local(value=UserIpv6AddressDao.class)
+ public class UserIpv6AddressDaoImpl extends GenericDaoBase<UserIpv6AddressVO, Long> implements UserIpv6AddressDao {
+ private static final Logger s_logger = Logger.getLogger(IPAddressDaoImpl.class);
+
+ protected final SearchBuilder<UserIpv6AddressVO> AllFieldsSearch;
+ protected GenericSearchBuilder<UserIpv6AddressVO, Long> CountFreePublicIps;
+
+ public UserIpv6AddressDaoImpl() {
+ AllFieldsSearch = createSearchBuilder();
+ AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(), Op.EQ);
+ AllFieldsSearch.and("dataCenterId", AllFieldsSearch.entity().getDataCenterId(), Op.EQ);
+ AllFieldsSearch.and("ipAddress", AllFieldsSearch.entity().getAddress(), Op.EQ);
+ AllFieldsSearch.and("vlan", AllFieldsSearch.entity().getVlanId(), Op.EQ);
+ AllFieldsSearch.and("accountId", AllFieldsSearch.entity().getAccountId(), Op.EQ);
+ AllFieldsSearch.and("network", AllFieldsSearch.entity().getNetworkId(), Op.EQ);
+ AllFieldsSearch.and("physicalNetworkId", AllFieldsSearch.entity().getPhysicalNetworkId(), Op.EQ);
+ AllFieldsSearch.done();
+
+ CountFreePublicIps = createSearchBuilder(Long.class);
+ CountFreePublicIps.select(null, Func.COUNT, null);
+ CountFreePublicIps.and("networkId", CountFreePublicIps.entity().getSourceNetworkId(), SearchCriteria.Op.EQ);
+ CountFreePublicIps.done();
+ }
+
+ @Override
+ public List<UserIpv6AddressVO> listByAccount(long accountId) {
+ SearchCriteria<UserIpv6AddressVO> sc = AllFieldsSearch.create();
+ sc.setParameters("accountId", accountId);
+ return listBy(sc);
+ }
+
+ @Override
+ public List<UserIpv6AddressVO> listByVlanId(long vlanId) {
+ SearchCriteria<UserIpv6AddressVO> sc = AllFieldsSearch.create();
+ sc.setParameters("vlan", vlanId);
+ return listBy(sc);
+ }
+
+ @Override
+ public List<UserIpv6AddressVO> listByDcId(long dcId) {
+ SearchCriteria<UserIpv6AddressVO> sc = AllFieldsSearch.create();
+ sc.setParameters("dataCenterId", dcId);
+ return listBy(sc);
+ }
+
+ @Override
+ public List<UserIpv6AddressVO> listByNetwork(long networkId) {
+ SearchCriteria<UserIpv6AddressVO> sc = AllFieldsSearch.create();
+ sc.setParameters("network", networkId);
+ return listBy(sc);
+ }
+
+ @Override
+ public UserIpv6AddressVO findByNetworkIdAndIp(long networkId, String ipAddress) {
+ SearchCriteria<UserIpv6AddressVO> sc = AllFieldsSearch.create();
+ sc.setParameters("networkId", networkId);
+ sc.setParameters("ipAddress", ipAddress);
+ return findOneBy(sc);
+ }
+
+ @Override
+ public List<UserIpv6AddressVO> listByPhysicalNetworkId(long physicalNetworkId) {
+ SearchCriteria<UserIpv6AddressVO> sc = AllFieldsSearch.create();
+ sc.setParameters("physicalNetworkId", physicalNetworkId);
+ return listBy(sc);
+ }
+
+ @Override
+ public long countExistedIpsInNetwork(long networkId) {
+ SearchCriteria<Long> sc = CountFreePublicIps.create();
+ sc.setParameters("networkId", networkId);
+ return customSearch(sc, null).get(0);
+ }
+ }
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/element/VirtualRouterElement.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/element/VirtualRouterElement.java
index e065255,b224537..500d0b6
--- a/server/src/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VirtualRouterElement.java
@@@ -841,7 -841,12 +841,12 @@@ public class VirtualRouterElement exten
if (vm.getType() != VirtualMachine.Type.User) {
return false;
}
-
+
+ if (network.getIp6Gateway() != null) {
+ s_logger.info("Skip password and userdata service setup for IPv6 VM");
+ return true;
+ }
+
@SuppressWarnings("unchecked")
VirtualMachineProfile<UserVm> uservm = (VirtualMachineProfile<UserVm>) vm;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/guru/DirectNetworkGuru.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/guru/DirectNetworkGuru.java
index 4be7491,0d5425f..7ea988f
--- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@@ -31,6 -30,8 +31,7 @@@ import com.cloud.exception.ConcurrentOp
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.network.IPAddressVO;
+ import com.cloud.network.Ipv6AddressManager;
import com.cloud.network.Network;
import com.cloud.network.Network.GuestType;
import com.cloud.network.Network.Service;
@@@ -41,9 -42,10 +42,11 @@@ import com.cloud.network.NetworkProfile
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.Mode;
import com.cloud.network.Networks.TrafficType;
+ import com.cloud.network.UserIpv6AddressVO;
import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.NetworkVO;
+ import com.cloud.network.dao.UserIpv6AddressDao;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.user.Account;
@@@ -202,14 -221,20 +221,20 @@@ public class DirectNetworkGuru extends
s_logger.debug("Deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address());
}
+ 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();
- }
+ 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) {
+ _ipv6Mgr.revokeDirectIpv6Address(nic.getNetworkId(), nic.getIp6Address());
+ }
nic.deallocate();
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/guru/GuestNetworkGuru.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/guru/PublicNetworkGuru.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index a787079,dee418b..1abca51
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@@ -1924,11 -1908,25 +1924,25 @@@ public class VirtualNetworkApplianceMan
String defaultDns2 = null;
for (NicProfile nic : profile.getNics()) {
int deviceId = nic.getDeviceId();
+ boolean ipv4 = false, ipv6 = false;
+ if (nic.getIp4Address() != null) {
+ ipv4 = true;
- buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address());
- buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask());
+ buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address());
+ buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask());
+ }
+ if (nic.getIp6Address() != null) {
+ ipv6 = true;
+ buf.append(" eth").append(deviceId).append("ip6=").append(nic.getIp6Address());
+ buf.append(" eth").append(deviceId).append("ip6prelen=").append(NetUtils.getIp6CidrSize(nic.getIp6Cidr()));
+ }
if (nic.isDefaultNic()) {
+ if (ipv4) {
- buf.append(" gateway=").append(nic.getGateway());
+ buf.append(" gateway=").append(nic.getGateway());
+ }
+ if (ipv6) {
+ buf.append(" ip6gateway=").append(nic.getIp6Gateway());
+ }
defaultDns1 = nic.getDns1();
defaultDns2 = nic.getDns2();
}
@@@ -3068,11 -3066,11 +3082,11 @@@
}
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());
+ DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
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.
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/user/AccountManagerImpl.java
index eceeb84,f116cad..5512d3f
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@@ -139,11 -140,11 +139,11 @@@ import com.cloud.vm.dao.InstanceGroupDa
import com.cloud.vm.dao.UserVmDao;
import com.cloud.vm.dao.VMInstanceDao;
+@Component
@Local(value = { AccountManager.class, AccountService.class })
- public class AccountManagerImpl extends ManagerBase implements AccountManager, AccountService {
-public class AccountManagerImpl implements AccountManager, Manager {
++public class AccountManagerImpl extends ManagerBase implements AccountManager, Manager {
public static final Logger s_logger = Logger.getLogger(AccountManagerImpl.class);
- private String _name;
@Inject
private AccountDao _accountDao;
@Inject
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/UserVmManagerImpl.java
index dd60da7,655d6c8..ad358eb
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@@ -133,22 -63,12 +133,24 @@@ import com.cloud.host.HostVO
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
+import com.cloud.network.Network;
+ import com.cloud.network.*;
+ import com.cloud.network.Network.IpAddresses;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkModel;
import com.cloud.network.Networks.TrafficType;
-import com.cloud.network.dao.*;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.LoadBalancerVMMapDao;
+import com.cloud.network.dao.LoadBalancerVMMapVO;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.rules.FirewallManager;
@@@ -2874,16 -2384,10 +2867,10 @@@ public class UserVmManagerImpl extends
}
@Override
- public UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone,
- ServiceOffering serviceOffering, VirtualMachineTemplate template,
- List<Long> networkIdList, List<Long> securityGroupIdList,
- Account owner, String hostName, String displayName,
- Long diskOfferingId, Long diskSize, String group,
- HypervisorType hypervisor, String userData, String sshKeyPair,
- Map<Long, String> requestedIps, String defaultIp, String keyboard)
- throws InsufficientCapacityException, ConcurrentOperationException,
- ResourceUnavailableException, StorageUnavailableException,
+ public UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Long> networkIdList,
+ List<Long> securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, String userData,
+ String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, String keyboard) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException,
- ResourceAllocationException {
+ ResourceAllocationException {
Account caller = UserContext.current().getCaller();
List<NetworkVO> networkList = new ArrayList<NetworkVO>();
@@@ -3051,29 -2520,17 +3029,20 @@@
if (virtualNetworks.isEmpty()) {
long physicalNetworkId = _networkModel.findPhysicalNetworkId(zone.getId(), requiredOfferings.get(0).getTags(), requiredOfferings.get(0).getTrafficType());
// Validate physical network
- PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
+ PhysicalNetwork physicalNetwork = _physicalNetworkDao
+ .findById(physicalNetworkId);
if (physicalNetwork == null) {
- throw new InvalidParameterValueException(
- "Unable to find physical network with id: "
- + physicalNetworkId + " and tag: "
- + requiredOfferings.get(0).getTags());
+ throw new InvalidParameterValueException("Unable to find physical network with id: "+physicalNetworkId + " and tag: " +requiredOfferings.get(0).getTags());
}
- 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);
+ 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);
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");
+ throw new InvalidParameterValueException(
+ "More than 1 default Isolated networks are found for account "
+ + owner + "; please specify networkIds");
} else {
defaultNetwork = _networkDao.findById(virtualNetworks.get(0).getId());
}
@@@ -3159,13 -2587,10 +3117,13 @@@
long accountId = owner.getId();
- assert !(requestedIps != null && defaultNetworkIp != null) : "requestedIp list and defaultNetworkIp should never be specified together";
+ assert !(requestedIps != null && (defaultIps.getIp4Address() != null || defaultIps.getIp6Address() != null)) : "requestedIp list and defaultNetworkIp should never be specified together";
- if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(caller.getType())) {
- throw new PermissionDeniedException("Cannot perform this operation, Zone is currently disabled: " + zone.getId());
+ if (Grouping.AllocationState.Disabled == zone.getAllocationState()
+ && !_accountMgr.isRootAdmin(caller.getType())) {
+ throw new PermissionDeniedException(
+ "Cannot perform this operation, Zone is currently disabled: "
+ + zone.getId());
}
if (zone.getDomainId() != null) {
@@@ -3265,17 -2708,21 +3223,23 @@@
boolean vpcNetwork = false;
for (NetworkVO network : networkList) {
if (network.getDataCenterId() != zone.getId()) {
- throw new InvalidParameterValueException("Network id=" + network.getId() + " doesn't belong to zone " + zone.getId());
+ throw new InvalidParameterValueException("Network id="
+ + network.getId() + " doesn't belong to zone "
+ + zone.getId());
}
- String requestedIp = null;
+ IpAddresses requestedIpPair = null;
if (requestedIps != null && !requestedIps.isEmpty()) {
- requestedIp = requestedIps.get(network.getId());
+ requestedIpPair = requestedIps.get(network.getId());
}
-
+
- NicProfile profile = new NicProfile(requestedIp);
+ if (requestedIpPair == null) {
+ requestedIpPair = new IpAddresses(null, null);
+ } else {
+ checkRequestedIpAddresses(requestedIpPair.getIp4Address(), requestedIpPair.getIp6Address());
+ }
+
+ NicProfile profile = new NicProfile(requestedIpPair.getIp4Address(), requestedIpPair.getIp6Address());
if (defaultNetworkNumber == 0) {
defaultNetworkNumber++;
@@@ -3460,7 -2866,20 +3425,20 @@@
return vm;
}
+ private void checkRequestedIpAddresses(String ip4, String ip6) throws InvalidParameterValueException {
+ if (ip4 != null) {
+ if (!NetUtils.isValidIp(ip4)) {
+ throw new InvalidParameterValueException("Invalid specified IPv4 address " + ip4);
+ }
+ }
+ if (ip6 != null) {
+ if (!NetUtils.isValidIpv6(ip6)) {
+ throw new InvalidParameterValueException("Invalid specified IPv6 address " + ip6);
+ }
+ }
+ }
+
- private void validateUserData(String userData) {
+ private void validateUserData(String userData) {
byte[] decodedUserData = null;
if (userData != null) {
if (!Base64.isBase64(userData)) {
@@@ -4690,16 -3904,14 +4668,16 @@@
throw new InvalidParameterValueException("Unable to find physical network with id: "+physicalNetworkId + " and tag: " +requiredOfferings.get(0).getTags());
}
s_logger.debug("Creating network for account " + newAccount + " from the network offering id=" +
- requiredOfferings.get(0).getId() + " as a part of deployVM process");
+ 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 " +
- "for account " + newAccount + "; please specify networkIds");
+ throw new InvalidParameterValueException(
+ "More than 1 default Isolated networks are found "
+ + "for account " + newAccount
+ + "; please specify networkIds");
} else {
defaultNetwork = _networkDao.findById(virtualNetworks.get(0).getId());
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/network/MockNetworkManagerImpl.java
index fbd3e27,af0b03f..4a24f9a
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@@ -666,10 -661,10 +666,10 @@@ public class MockNetworkManagerImpl ext
*/
@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
-
+
}
/* (non-Javadoc)
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/test/com/cloud/network/MockNetworkModelImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/test/com/cloud/user/MockAccountManagerImpl.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/user/MockAccountManagerImpl.java
index e5a7ada,135ae9a..1893d67
--- a/server/test/com/cloud/user/MockAccountManagerImpl.java
+++ b/server/test/com/cloud/user/MockAccountManagerImpl.java
@@@ -45,9 -44,8 +45,9 @@@ import com.cloud.utils.db.SearchBuilder
import com.cloud.utils.db.SearchCriteria;
+@Component
@Local(value = { AccountManager.class, AccountService.class })
- public class MockAccountManagerImpl extends ManagerBase implements AccountManager, AccountService {
-public class MockAccountManagerImpl implements Manager, AccountManager {
++public class MockAccountManagerImpl extends ManagerBase implements Manager, AccountManager {
@Override
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/test/com/cloud/vm/MockUserVmManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7bd8bec6/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/vpc/MockNetworkManagerImpl.java
index 7c8226a,5d9c436..534df1c
--- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
@@@ -56,10 -56,9 +56,11 @@@ import com.cloud.network.PhysicalNetwor
import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.network.PhysicalNetworkTrafficType;
import com.cloud.network.PublicIpAddress;
+ import com.cloud.network.UserIpv6Address;
import com.cloud.network.addr.PublicIp;
+import com.cloud.network.dao.IPAddressVO;
import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.NetworkVO;
import com.cloud.network.element.LoadBalancingServiceProvider;
import com.cloud.network.element.NetworkElement;
import com.cloud.network.element.StaticNatServiceProvider;
@@@ -849,8 -847,8 +850,8 @@@ public class MockNetworkManagerImpl ext
@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 {
+ throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
// TODO Auto-generated method stub
return null;
}