mirror of https://github.com/apache/cloudstack.git
Fix: allow multiple VIFs per Mac Address
Fix: RTNETLINK errors
- Management Server health check trying to create already existing interface
- Changes on update_config.py, cs_guestnetwork.py, merger.py
Fix: replace RRouTER_LOG in the CsRedundant.py per log file location
Fix: Guest Net address association during Router restart
- Changes on NicProfileHelper, NicProfileHelperImpl
Fix: aggregationExecution() method on VirtualNetworkApplianceManagerImpl
- Do not send an AggregationControlCommand to a non-configured router
Some classes have been formatted.
This commit is contained in:
parent
eee891be3e
commit
edd839ab10
|
|
@ -19,10 +19,10 @@
|
|||
|
||||
package com.cloud.agent.api.routing;
|
||||
|
||||
import com.cloud.agent.api.Command;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.cloud.agent.api.Command;
|
||||
|
||||
public abstract class NetworkElementCommand extends Command {
|
||||
HashMap<String, String> accessDetails = new HashMap<String, String>(0);
|
||||
|
||||
|
|
@ -45,11 +45,11 @@ public abstract class NetworkElementCommand extends Command {
|
|||
super();
|
||||
}
|
||||
|
||||
public void setAccessDetail(String name, String value) {
|
||||
public void setAccessDetail(final String name, final String value) {
|
||||
accessDetails.put(name, value);
|
||||
}
|
||||
|
||||
public String getAccessDetail(String name) {
|
||||
public String getAccessDetail(final String name) {
|
||||
return accessDetails.get(name);
|
||||
}
|
||||
|
||||
|
|
@ -62,7 +62,7 @@ public abstract class NetworkElementCommand extends Command {
|
|||
return routerAccessIp;
|
||||
}
|
||||
|
||||
public void setRouterAccessIp(String routerAccessIp) {
|
||||
public void setRouterAccessIp(final String routerAccessIp) {
|
||||
this.routerAccessIp = routerAccessIp;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,8 +34,8 @@ public class GuestNetwork extends ConfigBase {
|
|||
super(ConfigBase.GUEST_NETWORK);
|
||||
}
|
||||
|
||||
public GuestNetwork(boolean add, String macAddress, String device, String routerGuestIp, String routerGuestNetmask, String routerGuestGateway, String cidr, String dns,
|
||||
String domainName) {
|
||||
public GuestNetwork(final boolean add, final String macAddress, final String device, final String routerGuestIp, final String routerGuestNetmask, final String routerGuestGateway,
|
||||
final String cidr, final String dns, final String domainName) {
|
||||
super(ConfigBase.GUEST_NETWORK);
|
||||
this.add = add;
|
||||
this.macAddress = macAddress;
|
||||
|
|
@ -52,7 +52,7 @@ public class GuestNetwork extends ConfigBase {
|
|||
return add;
|
||||
}
|
||||
|
||||
public void setAdd(boolean add) {
|
||||
public void setAdd(final boolean add) {
|
||||
this.add = add;
|
||||
}
|
||||
|
||||
|
|
@ -60,7 +60,7 @@ public class GuestNetwork extends ConfigBase {
|
|||
return macAddress;
|
||||
}
|
||||
|
||||
public void setMacAddress(String macAddress) {
|
||||
public void setMacAddress(final String macAddress) {
|
||||
this.macAddress = macAddress;
|
||||
}
|
||||
|
||||
|
|
@ -68,7 +68,7 @@ public class GuestNetwork extends ConfigBase {
|
|||
return device;
|
||||
}
|
||||
|
||||
public void setDevice(String device) {
|
||||
public void setDevice(final String device) {
|
||||
this.device = device;
|
||||
}
|
||||
|
||||
|
|
@ -76,7 +76,7 @@ public class GuestNetwork extends ConfigBase {
|
|||
return routerGuestIp;
|
||||
}
|
||||
|
||||
public void setRouterGuestIp(String routerGuestIp) {
|
||||
public void setRouterGuestIp(final String routerGuestIp) {
|
||||
this.routerGuestIp = routerGuestIp;
|
||||
}
|
||||
|
||||
|
|
@ -84,7 +84,7 @@ public class GuestNetwork extends ConfigBase {
|
|||
return routerGuestNetmask;
|
||||
}
|
||||
|
||||
public void setRouterGuestNetmask(String routerGuestNetmask) {
|
||||
public void setRouterGuestNetmask(final String routerGuestNetmask) {
|
||||
this.routerGuestNetmask = routerGuestNetmask;
|
||||
}
|
||||
|
||||
|
|
@ -92,7 +92,7 @@ public class GuestNetwork extends ConfigBase {
|
|||
return routerGuestGateway;
|
||||
}
|
||||
|
||||
public void setRouterGuestGateway(String routerGuestGateway) {
|
||||
public void setRouterGuestGateway(final String routerGuestGateway) {
|
||||
this.routerGuestGateway = routerGuestGateway;
|
||||
}
|
||||
|
||||
|
|
@ -100,7 +100,7 @@ public class GuestNetwork extends ConfigBase {
|
|||
return cidr;
|
||||
}
|
||||
|
||||
public void setCidr(String cidr) {
|
||||
public void setCidr(final String cidr) {
|
||||
this.cidr = cidr;
|
||||
}
|
||||
|
||||
|
|
@ -108,7 +108,7 @@ public class GuestNetwork extends ConfigBase {
|
|||
return dns;
|
||||
}
|
||||
|
||||
public void setDns(String dns) {
|
||||
public void setDns(final String dns) {
|
||||
this.dns = dns;
|
||||
}
|
||||
|
||||
|
|
@ -116,8 +116,7 @@ public class GuestNetwork extends ConfigBase {
|
|||
return domainName;
|
||||
}
|
||||
|
||||
public void setDomainName(String domainName) {
|
||||
public void setDomainName(final String domainName) {
|
||||
this.domainName = domainName;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1622,7 +1622,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
if (result != null) {
|
||||
return new CheckSshAnswer(cmd, "Can not ping System vm " + vmName + "due to:" + result);
|
||||
}
|
||||
destroyPatchVbd(conn, vmName);
|
||||
//destroyPatchVbd(conn, vmName);
|
||||
} catch (final Exception e) {
|
||||
return new CheckSshAnswer(cmd, e);
|
||||
}
|
||||
|
|
@ -7162,9 +7162,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
}
|
||||
|
||||
// Wilder Rodrigues - replaced this code with the code above.
|
||||
// VIF vif = getVifByMac(conn, vm, nic.getMac());
|
||||
// final VIF vif = getVifByMac(conn, vm, nic.getMac());
|
||||
// if (vif != null) {
|
||||
// String msg = " Plug Nic failed due to a VIF with the same mac " + nic.getMac() + " exists";
|
||||
// final String msg = " Plug Nic failed due to a VIF with the same mac " + nic.getMac() + " exists";
|
||||
// s_logger.warn(msg);
|
||||
// return new PlugNicAnswer(cmd, false, msg);
|
||||
// }
|
||||
|
|
@ -7172,6 +7172,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||
final String deviceId = getLowestAvailableVIFDeviceNum(conn, vm);
|
||||
nic.setDeviceId(Integer.parseInt(deviceId));
|
||||
final VIF vif = createVif(conn, vmName, vm, null, nic);
|
||||
// vif = createVif(conn, vmName, vm, null, nic);
|
||||
vif.plug(conn);
|
||||
return new PlugNicAnswer(cmd, true, "success");
|
||||
} catch (final Exception e) {
|
||||
|
|
|
|||
|
|
@ -482,100 +482,8 @@ public class CommandSetupHelper {
|
|||
}
|
||||
|
||||
public void createAssociateIPCommands(final VirtualRouter router, final List<? extends PublicIpAddress> ips, final Commands cmds, final long vmId) {
|
||||
|
||||
// Ensure that in multiple vlans case we first send all ip addresses of
|
||||
// vlan1, then all ip addresses of vlan2, etc..
|
||||
final Map<String, ArrayList<PublicIpAddress>> vlanIpMap = new HashMap<String, ArrayList<PublicIpAddress>>();
|
||||
for (final PublicIpAddress ipAddress : ips) {
|
||||
final String vlanTag = ipAddress.getVlanTag();
|
||||
ArrayList<PublicIpAddress> ipList = vlanIpMap.get(vlanTag);
|
||||
if (ipList == null) {
|
||||
ipList = new ArrayList<PublicIpAddress>();
|
||||
}
|
||||
// domR doesn't support release for sourceNat IP address; so reset
|
||||
// the state
|
||||
if (ipAddress.isSourceNat() && ipAddress.getState() == IpAddress.State.Releasing) {
|
||||
ipAddress.setState(IpAddress.State.Allocated);
|
||||
}
|
||||
ipList.add(ipAddress);
|
||||
vlanIpMap.put(vlanTag, ipList);
|
||||
}
|
||||
|
||||
final List<NicVO> nics = _nicDao.listByVmId(router.getId());
|
||||
String baseMac = null;
|
||||
for (final NicVO nic : nics) {
|
||||
final NetworkVO nw = _networkDao.findById(nic.getNetworkId());
|
||||
if (nw.getTrafficType() == TrafficType.Public) {
|
||||
baseMac = nic.getMacAddress();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (final Map.Entry<String, ArrayList<PublicIpAddress>> vlanAndIp : vlanIpMap.entrySet()) {
|
||||
final List<PublicIpAddress> ipAddrList = vlanAndIp.getValue();
|
||||
// Source nat ip address should always be sent first
|
||||
Collections.sort(ipAddrList, new Comparator<PublicIpAddress>() {
|
||||
@Override
|
||||
public int compare(final PublicIpAddress o1, final PublicIpAddress o2) {
|
||||
final boolean s1 = o1.isSourceNat();
|
||||
final boolean s2 = o2.isSourceNat();
|
||||
return s1 ^ s2 ? s1 ^ true ? 1 : -1 : 0;
|
||||
}
|
||||
});
|
||||
|
||||
// Get network rate - required for IpAssoc
|
||||
final Integer networkRate = _networkModel.getNetworkRate(ipAddrList.get(0).getNetworkId(), router.getId());
|
||||
final Network network = _networkModel.getNetwork(ipAddrList.get(0).getNetworkId());
|
||||
|
||||
final IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()];
|
||||
int i = 0;
|
||||
boolean firstIP = true;
|
||||
|
||||
for (final PublicIpAddress ipAddr : ipAddrList) {
|
||||
|
||||
final boolean add = ipAddr.getState() == IpAddress.State.Releasing ? false : true;
|
||||
boolean sourceNat = ipAddr.isSourceNat();
|
||||
/* enable sourceNAT for the first ip of the public interface */
|
||||
if (firstIP) {
|
||||
sourceNat = true;
|
||||
}
|
||||
final String vlanId = ipAddr.getVlanTag();
|
||||
final String vlanGateway = ipAddr.getGateway();
|
||||
final String vlanNetmask = ipAddr.getNetmask();
|
||||
String vifMacAddress = null;
|
||||
// For non-source nat IP, set the mac to be something based on
|
||||
// first public nic's MAC
|
||||
// We cannot depends on first ip because we need to deal with
|
||||
// first ip of other nics
|
||||
if (!ipAddr.isSourceNat() && ipAddr.getVlanId() != 0) {
|
||||
vifMacAddress = NetUtils.generateMacOnIncrease(baseMac, ipAddr.getVlanId());
|
||||
} else {
|
||||
vifMacAddress = ipAddr.getMacAddress();
|
||||
}
|
||||
|
||||
final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask,
|
||||
vifMacAddress, networkRate, ipAddr.isOneToOneNat());
|
||||
|
||||
ip.setTrafficType(network.getTrafficType());
|
||||
ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network));
|
||||
ipsToSend[i++] = ip;
|
||||
/*
|
||||
* send the firstIP = true for the first Add, this is to create
|
||||
* primary on interface
|
||||
*/
|
||||
if (!firstIP || add) {
|
||||
firstIP = false;
|
||||
}
|
||||
}
|
||||
final IpAssocCommand cmd = new IpAssocCommand(ipsToSend);
|
||||
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
|
||||
cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getAssociatedWithNetworkId(), router.getId()));
|
||||
cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
|
||||
final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
|
||||
cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
|
||||
|
||||
cmds.addCommand("IPAssocCommand", cmd);
|
||||
}
|
||||
final String ipAssocCommand = "IPAssocCommand";
|
||||
createRedundantAssociateIPCommands(router, ips, cmds, ipAssocCommand, vmId);
|
||||
}
|
||||
|
||||
public void createNetworkACLsCommands(final List<? extends NetworkACLItem> rules, final VirtualRouter router, final Commands cmds, final long guestNetworkId,
|
||||
|
|
@ -741,6 +649,12 @@ public class CommandSetupHelper {
|
|||
public void createVpcAssociatePublicIPCommands(final VirtualRouter router, final List<? extends PublicIpAddress> ips, final Commands cmds,
|
||||
final Map<String, String> vlanMacAddress) {
|
||||
|
||||
final String ipAssocCommand = "IPAssocVpcCommand";
|
||||
if (router.getIsRedundantRouter()) {
|
||||
createRedundantAssociateIPCommands(router, ips, cmds, ipAssocCommand, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
Pair<IpAddressTO, Long> sourceNatIpAdd = null;
|
||||
Boolean addSourceNat = null;
|
||||
// Ensure that in multiple vlans case we first send all ip addresses of
|
||||
|
|
@ -794,7 +708,7 @@ public class CommandSetupHelper {
|
|||
final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
|
||||
cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
|
||||
|
||||
cmds.addCommand("IPAssocVpcCommand", cmd);
|
||||
cmds.addCommand(ipAssocCommand, cmd);
|
||||
}
|
||||
|
||||
// set source nat ip
|
||||
|
|
@ -809,6 +723,114 @@ public class CommandSetupHelper {
|
|||
}
|
||||
}
|
||||
|
||||
public void createRedundantAssociateIPCommands(final VirtualRouter router, final List<? extends PublicIpAddress> ips, final Commands cmds, final String ipAssocCommand, final long vmId) {
|
||||
|
||||
// Ensure that in multiple vlans case we first send all ip addresses of
|
||||
// vlan1, then all ip addresses of vlan2, etc..
|
||||
final Map<String, ArrayList<PublicIpAddress>> vlanIpMap = new HashMap<String, ArrayList<PublicIpAddress>>();
|
||||
for (final PublicIpAddress ipAddress : ips) {
|
||||
final String vlanTag = ipAddress.getVlanTag();
|
||||
ArrayList<PublicIpAddress> ipList = vlanIpMap.get(vlanTag);
|
||||
if (ipList == null) {
|
||||
ipList = new ArrayList<PublicIpAddress>();
|
||||
}
|
||||
// domR doesn't support release for sourceNat IP address; so reset
|
||||
// the state
|
||||
if (ipAddress.isSourceNat() && ipAddress.getState() == IpAddress.State.Releasing) {
|
||||
ipAddress.setState(IpAddress.State.Allocated);
|
||||
}
|
||||
ipList.add(ipAddress);
|
||||
vlanIpMap.put(vlanTag, ipList);
|
||||
}
|
||||
|
||||
final List<NicVO> nics = _nicDao.listByVmId(router.getId());
|
||||
String baseMac = null;
|
||||
for (final NicVO nic : nics) {
|
||||
final NetworkVO nw = _networkDao.findById(nic.getNetworkId());
|
||||
if (nw.getTrafficType() == TrafficType.Public) {
|
||||
baseMac = nic.getMacAddress();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (final Map.Entry<String, ArrayList<PublicIpAddress>> vlanAndIp : vlanIpMap.entrySet()) {
|
||||
final List<PublicIpAddress> ipAddrList = vlanAndIp.getValue();
|
||||
// Source nat ip address should always be sent first
|
||||
Collections.sort(ipAddrList, new Comparator<PublicIpAddress>() {
|
||||
@Override
|
||||
public int compare(final PublicIpAddress o1, final PublicIpAddress o2) {
|
||||
final boolean s1 = o1.isSourceNat();
|
||||
final boolean s2 = o2.isSourceNat();
|
||||
return s1 ^ s2 ? s1 ^ true ? 1 : -1 : 0;
|
||||
}
|
||||
});
|
||||
|
||||
// Get network rate - required for IpAssoc
|
||||
final Integer networkRate = _networkModel.getNetworkRate(ipAddrList.get(0).getNetworkId(), router.getId());
|
||||
final Network network = _networkModel.getNetwork(ipAddrList.get(0).getNetworkId());
|
||||
|
||||
final IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()];
|
||||
int i = 0;
|
||||
boolean firstIP = true;
|
||||
|
||||
for (final PublicIpAddress ipAddr : ipAddrList) {
|
||||
|
||||
final boolean add = ipAddr.getState() == IpAddress.State.Releasing ? false : true;
|
||||
boolean sourceNat = ipAddr.isSourceNat();
|
||||
/* enable sourceNAT for the first ip of the public interface */
|
||||
if (firstIP) {
|
||||
sourceNat = true;
|
||||
}
|
||||
final String vlanId = ipAddr.getVlanTag();
|
||||
final String vlanGateway = ipAddr.getGateway();
|
||||
final String vlanNetmask = ipAddr.getNetmask();
|
||||
String vifMacAddress = null;
|
||||
// For non-source nat IP, set the mac to be something based on
|
||||
// first public nic's MAC
|
||||
// We cannot depend on first ip because we need to deal with
|
||||
// first ip of other nics
|
||||
if (router.getVpcId() != null) {
|
||||
//vifMacAddress = NetUtils.generateMacOnIncrease(baseMac, ipAddr.getVlanId());
|
||||
vifMacAddress = ipAddr.getMacAddress();
|
||||
} else {
|
||||
if (!sourceNat && ipAddr.getVlanId() != 0) {
|
||||
vifMacAddress = NetUtils.generateMacOnIncrease(baseMac, ipAddr.getVlanId());
|
||||
} else {
|
||||
vifMacAddress = ipAddr.getMacAddress();
|
||||
}
|
||||
}
|
||||
|
||||
final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask,
|
||||
vifMacAddress, networkRate, ipAddr.isOneToOneNat());
|
||||
|
||||
ip.setTrafficType(network.getTrafficType());
|
||||
ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network));
|
||||
ipsToSend[i++] = ip;
|
||||
/*
|
||||
* send the firstIP = true for the first Add, this is to create
|
||||
* primary on interface
|
||||
*/
|
||||
if (!firstIP || add) {
|
||||
firstIP = false;
|
||||
}
|
||||
}
|
||||
|
||||
Long associatedWithNetworkId = ipAddrList.get(0).getAssociatedWithNetworkId();
|
||||
if (associatedWithNetworkId == null || associatedWithNetworkId == 0) {
|
||||
associatedWithNetworkId = ipAddrList.get(0).getNetworkId();
|
||||
}
|
||||
|
||||
final IpAssocCommand cmd = new IpAssocCommand(ipsToSend);
|
||||
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
|
||||
cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(associatedWithNetworkId, router.getId()));
|
||||
cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
|
||||
final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
|
||||
cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
|
||||
|
||||
cmds.addCommand(ipAssocCommand, cmd);
|
||||
}
|
||||
}
|
||||
|
||||
public void createStaticRouteCommands(final List<StaticRouteProfile> staticRoutes, final DomainRouterVO router, final Commands cmds) {
|
||||
final SetStaticRouteCommand cmd = new SetStaticRouteCommand(staticRoutes);
|
||||
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
|
||||
|
|
|
|||
|
|
@ -16,6 +16,8 @@
|
|||
// under the License.
|
||||
package com.cloud.network.router;
|
||||
|
||||
import org.cloud.network.router.deployment.RouterDeploymentDefinition;
|
||||
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.vpc.VpcGateway;
|
||||
import com.cloud.vm.NicProfile;
|
||||
|
|
@ -25,7 +27,7 @@ public interface NicProfileHelper {
|
|||
public abstract NicProfile createPrivateNicProfileForGateway(
|
||||
VpcGateway privateGateway);
|
||||
|
||||
public abstract NicProfile createGuestNicProfileForVpcRouter(
|
||||
public abstract NicProfile createGuestNicProfileForVpcRouter(final RouterDeploymentDefinition vpcRouterDeploymentDefinition,
|
||||
Network guestNetwork);
|
||||
|
||||
}
|
||||
|
|
@ -22,6 +22,9 @@ import java.net.URI;
|
|||
import javax.ejb.Local;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.cloud.network.router.deployment.RouterDeploymentDefinition;
|
||||
|
||||
import com.cloud.network.IpAddressManager;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.NetworkModel;
|
||||
import com.cloud.network.Networks.AddressFormat;
|
||||
|
|
@ -53,30 +56,31 @@ public class NicProfileHelperImpl implements NicProfileHelper {
|
|||
protected VpcManager _vpcMgr;
|
||||
@Inject
|
||||
protected NicDao _nicDao;
|
||||
|
||||
@Inject
|
||||
protected IpAddressManager _ipAddrMgr;
|
||||
|
||||
@Override
|
||||
@DB
|
||||
public NicProfile createPrivateNicProfileForGateway(VpcGateway privateGateway) {
|
||||
Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId());
|
||||
PrivateIpVO ipVO = _privateIpDao.allocateIpAddress(privateNetwork.getDataCenterId(), privateNetwork.getId(), privateGateway.getIp4Address());
|
||||
Nic privateNic = _nicDao.findByIp4AddressAndNetworkId(ipVO.getIpAddress(), privateNetwork.getId());
|
||||
public NicProfile createPrivateNicProfileForGateway(final VpcGateway privateGateway) {
|
||||
final Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId());
|
||||
final PrivateIpVO ipVO = _privateIpDao.allocateIpAddress(privateNetwork.getDataCenterId(), privateNetwork.getId(), privateGateway.getIp4Address());
|
||||
final Nic privateNic = _nicDao.findByIp4AddressAndNetworkId(ipVO.getIpAddress(), privateNetwork.getId());
|
||||
|
||||
NicProfile privateNicProfile = new NicProfile();
|
||||
|
||||
if (privateNic != null) {
|
||||
VirtualMachine vm = _vmDao.findById(privateNic.getInstanceId());
|
||||
final VirtualMachine vm = _vmDao.findById(privateNic.getInstanceId());
|
||||
privateNicProfile =
|
||||
new NicProfile(privateNic, privateNetwork, privateNic.getBroadcastUri(), privateNic.getIsolationUri(), _networkModel.getNetworkRate(
|
||||
privateNetwork.getId(), vm.getId()), _networkModel.isSecurityGroupSupportedInNetwork(privateNetwork), _networkModel.getNetworkTag(
|
||||
vm.getHypervisorType(), privateNetwork));
|
||||
new NicProfile(privateNic, privateNetwork, privateNic.getBroadcastUri(), privateNic.getIsolationUri(), _networkModel.getNetworkRate(
|
||||
privateNetwork.getId(), vm.getId()), _networkModel.isSecurityGroupSupportedInNetwork(privateNetwork), _networkModel.getNetworkTag(
|
||||
vm.getHypervisorType(), privateNetwork));
|
||||
} else {
|
||||
String netmask = NetUtils.getCidrNetmask(privateNetwork.getCidr());
|
||||
PrivateIpAddress ip =
|
||||
new PrivateIpAddress(ipVO, privateNetwork.getBroadcastUri().toString(), privateNetwork.getGateway(), netmask,
|
||||
NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ipVO.getMacAddress())));
|
||||
final String netmask = NetUtils.getCidrNetmask(privateNetwork.getCidr());
|
||||
final PrivateIpAddress ip =
|
||||
new PrivateIpAddress(ipVO, privateNetwork.getBroadcastUri().toString(), privateNetwork.getGateway(), netmask,
|
||||
NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ipVO.getMacAddress())));
|
||||
|
||||
URI netUri = BroadcastDomainType.fromString(ip.getBroadcastUri());
|
||||
final URI netUri = BroadcastDomainType.fromString(ip.getBroadcastUri());
|
||||
privateNicProfile.setIp4Address(ip.getIpAddress());
|
||||
privateNicProfile.setGateway(ip.getGateway());
|
||||
privateNicProfile.setNetmask(ip.getNetmask());
|
||||
|
|
@ -94,14 +98,20 @@ public class NicProfileHelperImpl implements NicProfileHelper {
|
|||
}
|
||||
|
||||
@Override
|
||||
public NicProfile createGuestNicProfileForVpcRouter(final Network guestNetwork) {
|
||||
NicProfile guestNic = new NicProfile();
|
||||
guestNic.setIp4Address(guestNetwork.getGateway());
|
||||
public NicProfile createGuestNicProfileForVpcRouter(final RouterDeploymentDefinition vpcRouterDeploymentDefinition, final Network guestNetwork) {
|
||||
final NicProfile guestNic = new NicProfile();
|
||||
|
||||
if (vpcRouterDeploymentDefinition.isRedundant()) {
|
||||
guestNic.setIp4Address(_ipAddrMgr.acquireGuestIpAddress(guestNetwork, null));
|
||||
} else {
|
||||
guestNic.setIp4Address(guestNetwork.getGateway());
|
||||
}
|
||||
|
||||
guestNic.setBroadcastUri(guestNetwork.getBroadcastUri());
|
||||
guestNic.setBroadcastType(guestNetwork.getBroadcastDomainType());
|
||||
guestNic.setIsolationUri(guestNetwork.getBroadcastUri());
|
||||
guestNic.setMode(guestNetwork.getMode());
|
||||
String gatewayCidr = guestNetwork.getCidr();
|
||||
final String gatewayCidr = guestNetwork.getCidr();
|
||||
guestNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr));
|
||||
|
||||
return guestNic;
|
||||
|
|
|
|||
|
|
@ -2631,15 +2631,19 @@ Configurable, StateListener<State, VirtualMachine.Event, VirtualMachine> {
|
|||
|
||||
protected boolean aggregationExecution(final AggregationControlCommand.Action action, final Network network, final List<DomainRouterVO> routers)
|
||||
throws AgentUnavailableException, ResourceUnavailableException {
|
||||
|
||||
int errors = 0;
|
||||
|
||||
for (final DomainRouterVO router : routers) {
|
||||
|
||||
final String routerControlIp = _routerControlHelper.getRouterControlIp(router.getId());
|
||||
final String routerIpInNetwork = _routerControlHelper.getRouterIpInNetwork(network.getId(), router.getId());
|
||||
|
||||
if (routerIpInNetwork == null) {
|
||||
//Guest Nics are getting removed during the procedure and added back again.
|
||||
//Returniung false here and waiting for the retry.
|
||||
return false;
|
||||
// Nic hasn't been created in this router yet. Try to configure the next one.
|
||||
s_logger.warn("The Network is not configured in the router " + router.getHostName() + " yet. Try the next router!");
|
||||
errors++;
|
||||
continue;
|
||||
}
|
||||
|
||||
final AggregationControlCommand cmd = new AggregationControlCommand(action, router.getInstanceName(), routerControlIp, routerIpInNetwork);
|
||||
|
|
@ -2648,6 +2652,10 @@ Configurable, StateListener<State, VirtualMachine.Event, VirtualMachine> {
|
|||
return false;
|
||||
}
|
||||
}
|
||||
if (errors == routers.size()) {
|
||||
s_logger.error("aggregationExecution() on " + getClass().getName() + " failed! Network is not configured in any router.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ public class VpcNetworkHelperImpl extends NetworkHelperImpl {
|
|||
continue;
|
||||
}
|
||||
if (guestNetwork.getState() == Network.State.Implemented || guestNetwork.getState() == Network.State.Setup) {
|
||||
final NicProfile guestNic = nicProfileHelper.createGuestNicProfileForVpcRouter(guestNetwork);
|
||||
final NicProfile guestNic = nicProfileHelper.createGuestNicProfileForVpcRouter(vpcRouterDeploymentDefinition, guestNetwork);
|
||||
networks.put(guestNetwork, new ArrayList<NicProfile>(Arrays.asList(guestNic)));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -103,8 +103,8 @@ public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
|
|||
final VirtualRouter router = acls.getRouter();
|
||||
final Network network = acls.getNetwork();
|
||||
|
||||
Commands commands = new Commands(Command.OnError.Continue);
|
||||
List<? extends NetworkACLItem> rules = acls.getRules();
|
||||
final Commands commands = new Commands(Command.OnError.Continue);
|
||||
final List<? extends NetworkACLItem> rules = acls.getRules();
|
||||
_commandSetupHelper.createNetworkACLsCommands(rules, router, commands, network.getId(), acls.isPrivateGateway());
|
||||
|
||||
return _networkGeneralHelper.sendCommandsToRouter(router, commands);
|
||||
|
|
@ -114,9 +114,9 @@ public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
|
|||
public boolean visit(final VpcIpAssociationRules vpcip) throws ResourceUnavailableException {
|
||||
final VirtualRouter router = vpcip.getRouter();
|
||||
|
||||
Commands cmds = new Commands(Command.OnError.Continue);
|
||||
Map<String, String> vlanMacAddress = vpcip.getVlanMacAddress();
|
||||
List<PublicIpAddress> ipsToSend = vpcip.getIpsToSend();
|
||||
final Commands cmds = new Commands(Command.OnError.Continue);
|
||||
final Map<String, String> vlanMacAddress = vpcip.getVlanMacAddress();
|
||||
final List<PublicIpAddress> ipsToSend = vpcip.getIpsToSend();
|
||||
|
||||
if (!ipsToSend.isEmpty()) {
|
||||
_commandSetupHelper.createVpcAssociatePublicIPCommands(router, ipsToSend, cmds, vlanMacAddress);
|
||||
|
|
@ -135,16 +135,16 @@ public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
|
|||
|
||||
if (router.getState() == State.Running) {
|
||||
|
||||
PrivateIpVO ipVO = privateGW.retrivePrivateIP(this);
|
||||
Network network = privateGW.retrievePrivateNetwork(this);
|
||||
final PrivateIpVO ipVO = privateGW.retrivePrivateIP(this);
|
||||
final Network network = privateGW.retrievePrivateNetwork(this);
|
||||
|
||||
String netmask = NetUtils.getCidrNetmask(network.getCidr());
|
||||
PrivateIpAddress ip = new PrivateIpAddress(ipVO, network.getBroadcastUri().toString(), network.getGateway(), netmask, nicProfile.getMacAddress());
|
||||
final String netmask = NetUtils.getCidrNetmask(network.getCidr());
|
||||
final PrivateIpAddress ip = new PrivateIpAddress(ipVO, network.getBroadcastUri().toString(), network.getGateway(), netmask, nicProfile.getMacAddress());
|
||||
|
||||
List<PrivateIpAddress> privateIps = new ArrayList<PrivateIpAddress>(1);
|
||||
final List<PrivateIpAddress> privateIps = new ArrayList<PrivateIpAddress>(1);
|
||||
privateIps.add(ip);
|
||||
|
||||
Commands cmds = new Commands(Command.OnError.Stop);
|
||||
final Commands cmds = new Commands(Command.OnError.Stop);
|
||||
_commandSetupHelper.createVpcAssociatePrivateIPCommands(router, privateIps, cmds, isAddOperation);
|
||||
|
||||
try {
|
||||
|
|
@ -155,7 +155,7 @@ public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
|
|||
s_logger.warn("Failed to associate ip address " + ip + " in vpc network " + network);
|
||||
return false;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
} catch (final Exception ex) {
|
||||
s_logger.warn("Failed to send " + (isAddOperation ? "add " : "delete ") + " private network " + network + " commands to rotuer ");
|
||||
return false;
|
||||
}
|
||||
|
|
@ -177,7 +177,7 @@ public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
|
|||
|
||||
// In fact we send command to the host of router, we're not programming
|
||||
// router but the host
|
||||
Commands cmds = new Commands(Command.OnError.Stop);
|
||||
final Commands cmds = new Commands(Command.OnError.Stop);
|
||||
cmds.addCommand(setupCommand);
|
||||
|
||||
try {
|
||||
|
|
@ -191,9 +191,9 @@ public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
|
|||
@Override
|
||||
public boolean visit(final StaticRoutesRules staticRoutesRules) throws ResourceUnavailableException {
|
||||
final VirtualRouter router = staticRoutesRules.getRouter();
|
||||
List<StaticRouteProfile> staticRoutes = staticRoutesRules.getStaticRoutes();
|
||||
final List<StaticRouteProfile> staticRoutes = staticRoutesRules.getStaticRoutes();
|
||||
|
||||
Commands cmds = new Commands(Command.OnError.Continue);
|
||||
final Commands cmds = new Commands(Command.OnError.Continue);
|
||||
_commandSetupHelper.createStaticRouteCommands(staticRoutes, router, cmds);
|
||||
|
||||
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
|
||||
|
|
@ -202,9 +202,9 @@ public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
|
|||
@Override
|
||||
public boolean visit(final AdvancedVpnRules vpnRules) throws ResourceUnavailableException {
|
||||
final VirtualRouter router = vpnRules.getRouter();
|
||||
List<? extends VpnUser> users = vpnRules.getUsers();
|
||||
final List<? extends VpnUser> users = vpnRules.getUsers();
|
||||
|
||||
Commands cmds = new Commands(Command.OnError.Continue);
|
||||
final Commands cmds = new Commands(Command.OnError.Continue);
|
||||
_commandSetupHelper.createApplyVpnUsersCommand(users, router, cmds);
|
||||
|
||||
// Currently we receive just one answer from the agent. In the future we
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ class CsRedundant(object):
|
|||
CONNTRACKD_BIN = "/usr/sbin/conntrackd"
|
||||
CONNTRACKD_LOCK = "/var/lock/conntrack.lock"
|
||||
CONNTRACKD_CONFIG = "/etc/conntrackd/conntrackd.conf"
|
||||
RROUTER_LOG = "/var/log/cloud.log"
|
||||
|
||||
def __init__(self, config):
|
||||
self.cl = config.cmdline()
|
||||
|
|
@ -86,6 +87,11 @@ class CsRedundant(object):
|
|||
CsHelper.copy_if_needed("%s/%s" % (self.CS_TEMPLATES_DIR, "conntrackd.conf.templ"), "/etc/conntrackd/conntrackd.conf")
|
||||
CsHelper.copy_if_needed("%s/%s" % (self.CS_TEMPLATES_DIR, "checkrouter.sh.templ"), "/opt/cloud/bin/checkrouter.sh")
|
||||
|
||||
# checkrouter.sh configuration
|
||||
file = CsFile("/opt/cloud/bin/checkrouter.sh")
|
||||
file.greplace("[RROUTER_LOG]", self.RROUTER_LOG)
|
||||
file.commit()
|
||||
|
||||
# keepalived configuration
|
||||
file = CsFile("/etc/keepalived/keepalived.conf")
|
||||
file.search(" router_id ", " router_id %s" % self.cl.get_name())
|
||||
|
|
|
|||
|
|
@ -126,6 +126,10 @@ class updateDataBag:
|
|||
|
||||
def processGuestNetwork(self, dbag):
|
||||
d = self.qFile.data
|
||||
|
||||
if not set(['device']).issubset(d):
|
||||
return dbag
|
||||
|
||||
dp = {}
|
||||
dp['public_ip'] = d['router_guest_ip']
|
||||
dp['netmask'] = d['router_guest_netmask']
|
||||
|
|
@ -139,7 +143,7 @@ class updateDataBag:
|
|||
qf.load({'ip_address': [dp], 'type': 'ips'})
|
||||
if 'domain_name' not in d.keys() or d['domain_name'] == '':
|
||||
d['domain_name'] = "cloudnine.internal"
|
||||
return cs_guestnetwork.merge(dbag, self.qFile.data)
|
||||
return cs_guestnetwork.merge(dbag, d)
|
||||
|
||||
def process_dhcp_entry(self, dbag):
|
||||
return cs_dhcp.merge(dbag, self.qFile.data)
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ from subprocess import PIPE, STDOUT
|
|||
import os
|
||||
import os.path
|
||||
import configure
|
||||
import json
|
||||
|
||||
logging.basicConfig(filename='/var/log/cloud.log', level=logging.DEBUG, format='%(asctime)s %(message)s')
|
||||
|
||||
|
|
@ -33,23 +34,92 @@ if (len(sys.argv) != 2):
|
|||
sys.exit(1)
|
||||
|
||||
# FIXME we should get this location from a configuration class
|
||||
filePath = "/var/cache/cloud/%s" % sys.argv[1]
|
||||
if not (os.path.isfile(filePath) and os.access(filePath, os.R_OK)):
|
||||
print "[ERROR]: You are telling me to process %s, but i can't access it" % filePath
|
||||
jsonPath = "/var/cache/cloud/%s"
|
||||
jsonCmdConfigPath = jsonPath % sys.argv[1]
|
||||
currentGuestNetConfig = "/etc/cloudstack/guestnetwork.json"
|
||||
|
||||
def finish_config():
|
||||
# Converge
|
||||
returncode = configure.main([])
|
||||
sys.exit(returncode)
|
||||
|
||||
def process_file():
|
||||
print "[INFO] Processing JSON file %s" % sys.argv[1]
|
||||
qf = QueueFile()
|
||||
qf.setFile(sys.argv[1])
|
||||
qf.load(None)
|
||||
# Converge
|
||||
finish_config()
|
||||
|
||||
def is_guestnet_configured(guestnet_dict, key):
|
||||
|
||||
existing_key = None
|
||||
new_eth_key = None
|
||||
|
||||
for k1, v in guestnet_dict.iteritems():
|
||||
for k2 in key:
|
||||
if k1 == k2 and len(guestnet_dict[k1]) > 0:
|
||||
existing_key = k1
|
||||
if existing_key:
|
||||
break
|
||||
|
||||
if not existing_key:
|
||||
return False
|
||||
|
||||
file = open(jsonCmdConfigPath)
|
||||
new_guestnet_dict = json.load(file)
|
||||
|
||||
for k1, v in new_guestnet_dict.iteritems():
|
||||
for k2 in key:
|
||||
if k1 == k2 and len(new_guestnet_dict[k1]) > 0:
|
||||
new_eth_key = k1
|
||||
if new_eth_key:
|
||||
break
|
||||
|
||||
if not new_eth_key:
|
||||
'''
|
||||
Why is the new guest net dictionary empty?
|
||||
1. It might be setting up a single VPC, no need to continue.
|
||||
2. Did we get any RTNETLINK error? If so, it might be trying to unplug the Guest Net NIC. Let's not allow it for now.
|
||||
3. Might be a bug on the Java side.
|
||||
Return True so we won't process an empty file. However, we have to investigate it!
|
||||
'''
|
||||
return True
|
||||
|
||||
old_eth = guestnet_dict[existing_key][0]
|
||||
new_eth = new_guestnet_dict[new_eth_key][0]
|
||||
|
||||
new_mac = new_eth["mac_address"].encode('utf-8')
|
||||
old_mac = old_eth["mac_address"].encode('utf-8')
|
||||
new_ip = new_eth["router_guest_ip"].encode('utf-8')
|
||||
old_ip = old_eth["router_guest_ip"].encode('utf-8')
|
||||
|
||||
if (new_mac == old_mac) and (new_ip == old_ip):
|
||||
print "[WARN] Guest Network already configured. Will skip the file to avoid RTNETLINK errors."
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
if not (os.path.isfile(jsonCmdConfigPath) and os.access(jsonCmdConfigPath, os.R_OK)):
|
||||
print "[ERROR]: You are telling me to process %s, but i can't access it" % jsonCmdConfigPath
|
||||
sys.exit(1)
|
||||
|
||||
# If the command line json file is unprocessed process it
|
||||
# This is important or, the control interfaces will get deleted!
|
||||
if os.path.isfile("filePath/%s" % "cmd_line.json"):
|
||||
if os.path.isfile(jsonPath % "cmd_line.json"):
|
||||
qf = QueueFile()
|
||||
qf.setFile("cmd_line.json")
|
||||
qf.load(None)
|
||||
|
||||
qf = QueueFile()
|
||||
qf.setFile(sys.argv[1])
|
||||
qf.load(None)
|
||||
|
||||
# Converge
|
||||
returncode = configure.main([])
|
||||
|
||||
sys.exit(returncode)
|
||||
# If the guest network is already configured and have the same IP, do not try to configure it again otherwise it will break
|
||||
if sys.argv[1] == "guest_network.json":
|
||||
if os.path.isfile(currentGuestNetConfig):
|
||||
file = open(currentGuestNetConfig)
|
||||
guestnet_dict = json.load(file)
|
||||
|
||||
if not is_guestnet_configured(guestnet_dict, ['eth1', 'eth2', 'eth3']):
|
||||
process_file()
|
||||
else:
|
||||
finish_config()
|
||||
else:
|
||||
process_file()
|
||||
|
|
@ -29,4 +29,4 @@ do
|
|||
sleep 3
|
||||
fi
|
||||
result=`ip addr show | grep $ip`
|
||||
done
|
||||
done &
|
||||
Loading…
Reference in New Issue