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:
wilderrodrigues 2015-01-15 06:29:20 +01:00
parent eee891be3e
commit edd839ab10
13 changed files with 292 additions and 170 deletions

View File

@ -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;
}

View File

@ -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;
}
}
}

View File

@ -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) {

View File

@ -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()));

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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)));
}
}

View File

@ -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

View File

@ -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())

View File

@ -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)

View File

@ -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()

View File

@ -29,4 +29,4 @@ do
sleep 3
fi
result=`ip addr show | grep $ip`
done
done &