diff --git a/api/src/com/cloud/network/NetworkProfile.java b/api/src/com/cloud/network/NetworkProfile.java index d8733ca6c50..bf21c93c89f 100644 --- a/api/src/com/cloud/network/NetworkProfile.java +++ b/api/src/com/cloud/network/NetworkProfile.java @@ -16,12 +16,12 @@ // under the License. package com.cloud.network; +import java.net.URI; + import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; -import java.net.URI; - public class NetworkProfile implements Network { private final long id; private final String uuid; @@ -33,6 +33,7 @@ public class NetworkProfile implements Network { private URI broadcastUri; private final State state; private boolean isRedundant; + private boolean isRollingRestart = false; private final String name; private final Mode mode; private final BroadcastDomainType broadcastDomainType; @@ -92,6 +93,7 @@ public class NetworkProfile implements Network { guruName = network.getGuruName(); strechedL2Subnet = network.isStrechedL2Network(); isRedundant = network.isRedundant(); + isRollingRestart = network.isRollingRestart(); externalId = network.getExternalId(); } @@ -157,7 +159,7 @@ public class NetworkProfile implements Network { @Override public boolean isRollingRestart() { - return false; + return isRollingRestart; } @Override diff --git a/engine/schema/src/com/cloud/vm/dao/NicDao.java b/engine/schema/src/com/cloud/vm/dao/NicDao.java index 0d86964974a..df4fb06325f 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicDao.java +++ b/engine/schema/src/com/cloud/vm/dao/NicDao.java @@ -26,6 +26,8 @@ import com.cloud.vm.VirtualMachine; public interface NicDao extends GenericDao { List listByVmId(long instanceId); + List listByVmIdOrderByDeviceId(long instanceId); + List listIpAddressInNetwork(long networkConfigId); List listByVmIdIncludingRemoved(long instanceId); diff --git a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java index f953a4c1f93..c125d80c534 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java @@ -118,6 +118,13 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { return listBy(sc); } + @Override + public List listByVmIdOrderByDeviceId(long instanceId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("instance", instanceId); + return customSearch(sc, new Filter(NicVO.class, "deviceId", true, null, null)); + } + @Override public List listByVmIdIncludingRemoved(long instanceId) { SearchCriteria sc = AllFieldsSearch.create(); diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index d22dcbafbba..fefd97217af 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -316,7 +316,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian final List> publicNics = new ArrayList>(); final Map vlanMacAddress = new HashMap(); - final List routerNics = _nicDao.listByVmId(profile.getId()); + final List routerNics = _nicDao.listByVmIdOrderByDeviceId(profile.getId()); for (final Nic routerNic : routerNics) { final Network network = _networkModel.getNetwork(routerNic.getNetworkId()); if (network.getTrafficType() == TrafficType.Guest) { diff --git a/systemvm/debian/opt/cloud/bin/cs_ip.py b/systemvm/debian/opt/cloud/bin/cs_ip.py index 1e7b326a1ec..a4e0c33e798 100755 --- a/systemvm/debian/opt/cloud/bin/cs_ip.py +++ b/systemvm/debian/opt/cloud/bin/cs_ip.py @@ -16,9 +16,21 @@ # specific language governing permissions and limitations # under the License. +import os from netaddr import * +def macdevice_map(): + device_map = {} + for eth in os.listdir('/sys/class/net'): + if not eth.startswith('eth'): + continue + with open('/sys/class/net/%s/address' % eth) as f: + mac_address = f.read().replace('\n', '') + device_map[mac_address] = eth[3:] + return device_map + + def merge(dbag, ip): nic_dev_id = None for dev in dbag: @@ -33,6 +45,11 @@ def merge(dbag, ip): ipo = IPNetwork(ip['public_ip'] + '/' + ip['netmask']) if 'nic_dev_id' in ip: nic_dev_id = ip['nic_dev_id'] + if 'vif_mac_address' in ip: + mac_address = ip['vif_mac_address'] + device_map = macdevice_map() + if mac_address in device_map: + nic_dev_id = device_map[mac_address] ip['device'] = 'eth' + str(nic_dev_id) ip['broadcast'] = str(ipo.broadcast) ip['cidr'] = str(ipo.ip) + '/' + str(ipo.prefixlen) diff --git a/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java b/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java index 80d25e874a2..262e928b68b 100644 --- a/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java +++ b/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java @@ -37,13 +37,13 @@ import java.net.UnknownHostException; import java.util.SortedSet; import java.util.TreeSet; -import com.googlecode.ipv6.IPv6Network; import org.apache.log4j.Logger; import org.junit.Test; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils.SupersetOrSubset; import com.googlecode.ipv6.IPv6Address; +import com.googlecode.ipv6.IPv6Network; public class NetUtilsTest { @@ -682,6 +682,8 @@ public class NetUtilsTest { @Test public void testAllIpsOfDefaultNic() { final String defaultHostIp = NetUtils.getDefaultHostIp(); - assertTrue(NetUtils.getAllDefaultNicIps().stream().anyMatch(defaultHostIp::contains)); + if (defaultHostIp != null) { + assertTrue(NetUtils.getAllDefaultNicIps().stream().anyMatch(defaultHostIp::contains)); + } } }