You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mu...@apache.org on 2014/03/14 11:38:06 UTC
[53/54] [abbrv] git commit: updated refs/heads/distributedrouter to
42b553e
couple of bug fixes
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/7b0677a2
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/7b0677a2
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/7b0677a2
Branch: refs/heads/distributedrouter
Commit: 7b0677a2c2ab0c78fb2e507dbf4858dcb3f09ec0
Parents: 07c85d5
Author: Murali Reddy <mu...@gmail.com>
Authored: Thu Mar 13 19:18:41 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:59:04 2014 +0530
----------------------------------------------------------------------
.../schema/src/com/cloud/network/vpc/VpcVO.java | 1 +
.../xen/resource/CitrixResourceBase.java | 12 +-
.../network/ovs/OvsNetworkTopologyGuru.java | 5 +
.../network/ovs/OvsNetworkTopologyGuruImpl.java | 18 ++
.../cloud/network/ovs/OvsTunnelManagerImpl.java | 251 ++++++++++++-------
.../xenserver/cloudstack_pluginlib.py | 26 +-
.../vm/hypervisor/xenserver/ovs-vif-flows.py | 27 +-
7 files changed, 223 insertions(+), 117 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/engine/schema/src/com/cloud/network/vpc/VpcVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/VpcVO.java b/engine/schema/src/com/cloud/network/vpc/VpcVO.java
index d7aaa95..dea8c31 100644
--- a/engine/schema/src/com/cloud/network/vpc/VpcVO.java
+++ b/engine/schema/src/com/cloud/network/vpc/VpcVO.java
@@ -206,6 +206,7 @@ public class VpcVO implements Vpc {
@Override
public IAMEntityType getEntityType() {
return IAMEntityType.Vpc;
+ }
@Override
public boolean usesDistributedRouter() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 273c08c..57debc6 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -5284,15 +5284,17 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
public Answer execute(OvsVpcPhysicalTopologyConfigCommand cmd) {
Connection conn = getConnection();
try {
+ Network nw = findOrCreateTunnelNetwork(conn, cmd.getBridgeName());
+ String bridgeName = nw.getBridge(conn);;
String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge",
- cmd.getBridgeName(), "config", cmd.getVpcConfigInJson());
- if (result.equalsIgnoreCase("SUCCESS")) {
+ bridgeName, "config", cmd.getVpcConfigInJson(), "host-id", ((Long)cmd.getHostId()).toString());
+ if (result.startsWith("SUCCESS")) {
return new Answer(cmd, true, result);
} else {
return new Answer(cmd, false, result);
}
} catch (Exception e) {
- s_logger.warn("caught exception while updating host with latest routing polcies", e);
+ s_logger.warn("caught exception while updating host with latest VPC topology", e);
return new Answer(cmd, false, e.getMessage());
}
}
@@ -5303,13 +5305,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_routing_policies", "bridge",
cmd.getBridgeName(), "host-id", ((Long)cmd.getHostId()).toString(), "config",
cmd.getVpcConfigInJson());
- if (result.equalsIgnoreCase("SUCCESS")) {
+ if (result.startsWith("SUCCESS")) {
return new Answer(cmd, true, result);
} else {
return new Answer(cmd, false, result);
}
} catch (Exception e) {
- s_logger.warn("caught exception while updating host with latest VPC topology", e);
+ s_logger.warn("caught exception while updating host with latest routing policies", e);
return new Answer(cmd, false, e.getMessage());
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
index 122175c..a9b62bf 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
@@ -56,4 +56,9 @@ public interface OvsNetworkTopologyGuru extends Manager {
* get the list of all Vm id's in the network that are running on the host
*/
public List<Long> getActiveVmsInNetworkOnHost(long vpcId, long hostId);
+
+ /**
+ * get the list of all Vpc id's in which, a VM has a nic in the network that is part of VPC
+ */
+ public List<Long> getVpcIdsVmIsPartOf(long vmId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
index 7715641..740df80 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
@@ -187,4 +187,22 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
}
return vmIds;
}
+
+ @Override
+ public List<Long> getVpcIdsVmIsPartOf(long vmId) {
+ List<Long> vpcIds = new ArrayList<>();
+ List<NicVO> nics = _nicDao.listByVmId(vmId);
+ if (nics == null)
+ return null;
+
+ for (Nic nic: nics) {
+ Network network = _networkDao.findById(nic.getNetworkId());
+ if (network != null && network.getTrafficType() == Networks.TrafficType.Guest && network.getVpcId() != null) {
+ if (!vpcIds.contains(network.getVpcId())) {
+ vpcIds.add(network.getVpcId());
+ }
+ }
+ }
+ return vpcIds;
+ }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
index eeb22b1..30088aa 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
@@ -36,6 +36,7 @@ import com.cloud.network.vpc.dao.VpcDao;
import com.cloud.network.vpc.VpcManager;
import com.cloud.network.vpc.VpcVO;
import com.cloud.network.vpc.dao.NetworkACLDao;
+import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.dao.VMInstanceDao;
import com.cloud.vm.Nic;
import com.cloud.vm.NicVO;
@@ -80,13 +81,14 @@ import com.cloud.network.ovs.dao.OvsTunnel;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB;
+import com.cloud.utils.fsm.StateListener;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
@Component
@Local(value = {OvsTunnelManager.class})
-public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManager {
+public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManager, StateListener<VirtualMachine.State, VirtualMachine.Event, VirtualMachine> {
public static final Logger s_logger = Logger.getLogger(OvsTunnelManagerImpl.class.getName());
// boolean _isEnabled;
@@ -133,7 +135,12 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
_executorPool = Executors.newScheduledThreadPool(10, new NamedThreadFactory("OVS"));
_cleanupExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("OVS-Cleanup"));
+ // register for network ACL updated for a VPC.
_messageBus.subscribe("Network_ACL_Replaced", new NetworkAclEventsSubscriber());
+
+ // register for VM state transition updates
+ VirtualMachine.State.getStateMachine().registerListener(this);
+
return true;
}
@@ -540,92 +547,6 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
return "OVS-DR-VPC-Bridge" + vpcId;
}
- public boolean sendVpcTopologyChangeUpdate(OvsVpcPhysicalTopologyConfigCommand updateCmd, long hostId, String bridgeName) {
- try {
- s_logger.debug("Sending VPC topology update to the host " + hostId);
- updateCmd.setHostId(hostId);
- updateCmd.setBridgeName(bridgeName);
- Answer ans = _agentMgr.send(hostId, updateCmd);
- if (ans.getResult()) {
- s_logger.debug("Successfully updated the host " + hostId + " with latest VPC topology." );
- return true;
- } else {
- s_logger.debug("Failed to update the host " + hostId + " with latest VPC topology." );
- return false;
- }
- } catch (Exception e) {
- s_logger.debug("Failed to updated the host " + hostId + " with latest VPC topology." );
- return false;
- }
- }
-
- OvsVpcPhysicalTopologyConfigCommand prepareVpcTopologyUpdate(long vpcId) {
- VpcVO vpc = _vpcDao.findById(vpcId);
- assert (vpc != null): "invalid vpc id";
-
- List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(vpcId);
- List<Long> hostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
- List<Long> vmIds = _ovsNetworkToplogyGuru.getAllActiveVmsInVpc(vpcId);
-
- List<OvsVpcPhysicalTopologyConfigCommand.Host> hosts = new ArrayList<>();
- List<OvsVpcPhysicalTopologyConfigCommand.Tier> tiers = new ArrayList<>();
- List<OvsVpcPhysicalTopologyConfigCommand.Vm> vms = new ArrayList<>();
-
- for (Long hostId : hostIds) {
- HostVO hostDetails = _hostDao.findById(hostId);
- String remoteIp = null;
- for (Network network: vpcNetworks) {
- try {
- remoteIp = getGreEndpointIP(hostDetails, network);
- } catch (Exception e) {
-
- }
- }
- OvsVpcPhysicalTopologyConfigCommand.Host host = new OvsVpcPhysicalTopologyConfigCommand.Host(hostId, remoteIp);
- hosts.add(host);
- }
-
- for (Network network: vpcNetworks) {
- String key = network.getBroadcastUri().getAuthority();
- long gre_key;
- if (key.contains(".")) {
- String[] parts = key.split("\\.");
- gre_key = Long.parseLong(parts[1]);
- } else {
- try {
- gre_key = Long.parseLong(BroadcastDomainType.getValue(key));
- } catch (Exception e) {
- return null;
- }
- }
- NicVO nic = _nicDao.findByIp4AddressAndNetworkId(network.getGateway(), network.getId());
- OvsVpcPhysicalTopologyConfigCommand.Tier tier = new OvsVpcPhysicalTopologyConfigCommand.Tier(gre_key,
- network.getUuid(), network.getGateway(), nic.getMacAddress(), network.getCidr());
- tiers.add(tier);
- }
-
- for (long vmId: vmIds) {
- VirtualMachine vmInstance = _vmInstanceDao.findById(vmId);
- List<OvsVpcPhysicalTopologyConfigCommand.Nic> vmNics = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Nic>();
- for (Nic vmNic :_nicDao.listByVmId(vmId)) {
- Network network = _networkDao.findById(vmNic.getNetworkId());
- if (network.getTrafficType() == TrafficType.Guest) {
- OvsVpcPhysicalTopologyConfigCommand.Nic nic = new OvsVpcPhysicalTopologyConfigCommand.Nic(
- vmNic.getIp4Address(), vmNic.getMacAddress(), ((Long)vmNic.getNetworkId()).toString());
- vmNics.add(nic);
- }
- }
- OvsVpcPhysicalTopologyConfigCommand.Vm vm = new OvsVpcPhysicalTopologyConfigCommand.Vm(
- vmInstance.getHostId(), vmNics.toArray(new OvsVpcPhysicalTopologyConfigCommand.Nic[vmNics.size()]));
- vms.add(vm);
- }
- return new OvsVpcPhysicalTopologyConfigCommand(
- hosts.toArray(new OvsVpcPhysicalTopologyConfigCommand.Host[hosts.size()]),
- tiers.toArray(new OvsVpcPhysicalTopologyConfigCommand.Tier[tiers.size()]),
- vms.toArray(new OvsVpcPhysicalTopologyConfigCommand.Vm[vms.size()]),
- vpc.getCidr());
- }
-
@DB
protected void checkAndCreateVpcTunnelNetworks(Host host, long vpcId) {
@@ -731,16 +652,158 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
s_logger.warn("Ovs Tunnel network created tunnel failed", e);
}
}
+ }
+
+ @Override
+ public boolean preStateTransitionEvent(VirtualMachine.State oldState,
+ VirtualMachine.Event event, VirtualMachine.State newState,
+ VirtualMachine vo, boolean status, Object opaque) {
+ return true;
+ }
+
+ @Override
+ public boolean postStateTransitionEvent(VirtualMachine.State oldState, VirtualMachine.Event event,
+ VirtualMachine.State newState, VirtualMachine vm,
+ boolean status, Object opaque) {
+
+ if (!status) {
+ return false;
+ }
+
+ if (VirtualMachine.State.isVmStarted(oldState, event, newState)) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Security Group Mgr: handling start of vm id" + vm.getId());
+ }
+ handleVmStateChange((VMInstanceVO)vm);
+ } else if (VirtualMachine.State.isVmStopped(oldState, event, newState)) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Security Group Mgr: handling stop of vm id" + vm.getId());
+ }
+ handleVmStateChange((VMInstanceVO)vm);
+ } else if (VirtualMachine.State.isVmMigrated(oldState, event, newState)) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Security Group Mgr: handling migration of vm id" + vm.getId());
+ }
+ handleVmStateChange((VMInstanceVO)vm);
+ }
+
+ return true;
+ }
+
+ public void handleVmStateChange(VMInstanceVO vm) {
+
+ // get the VPC's impacted with the VM start
+ List<Long> vpcIds = _ovsNetworkToplogyGuru.getVpcIdsVmIsPartOf(vm.getId());
+ if (vpcIds == null || vpcIds.isEmpty()) {
+ return;
+ }
+
+ for (Long vpcId: vpcIds) {
+ VpcVO vpc = _vpcDao.findById(vpcId);
+ if (vpc == null || !vpc.usesDistributedRouter()) {
+ return;
+ }
+
+ // get the list of hosts on which VPC spans (i.e hosts that need to be aware of VPC topology change update)
+ List<Long> vpcSpannedHostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
+ String bridgeName=generateBridgeNameForVpc(vpcId);
- OvsVpcPhysicalTopologyConfigCommand topologyConfigCommand = prepareVpcTopologyUpdate(vpcId);
- for (Long id: vpcSpannedHostIds) {
- if (!sendVpcTopologyChangeUpdate(topologyConfigCommand, id, bridgeName)) {
- s_logger.debug("Failed to send VPC topology change update to host : " + id + ". Moving on with rest of" +
- "the host update.");
+ OvsVpcPhysicalTopologyConfigCommand topologyConfigCommand = prepareVpcTopologyUpdate(vpcId);
+ for (Long id: vpcSpannedHostIds) {
+ if (!sendVpcTopologyChangeUpdate(topologyConfigCommand, id, bridgeName)) {
+ s_logger.debug("Failed to send VPC topology change update to host : " + id + ". Moving on " +
+ "with rest of the host update.");
+ }
+ }
+ }
+ }
+
+ public boolean sendVpcTopologyChangeUpdate(OvsVpcPhysicalTopologyConfigCommand updateCmd, long hostId, String bridgeName) {
+ try {
+ s_logger.debug("Sending VPC topology update to the host " + hostId);
+ updateCmd.setHostId(hostId);
+ updateCmd.setBridgeName(bridgeName);
+ Answer ans = _agentMgr.send(hostId, updateCmd);
+ if (ans.getResult()) {
+ s_logger.debug("Successfully updated the host " + hostId + " with latest VPC topology." );
+ return true;
+ } else {
+ s_logger.debug("Failed to update the host " + hostId + " with latest VPC topology." );
+ return false;
}
+ } catch (Exception e) {
+ s_logger.debug("Failed to updated the host " + hostId + " with latest VPC topology." );
+ return false;
}
}
+ OvsVpcPhysicalTopologyConfigCommand prepareVpcTopologyUpdate(long vpcId) {
+ VpcVO vpc = _vpcDao.findById(vpcId);
+ assert (vpc != null): "invalid vpc id";
+
+ List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(vpcId);
+ List<Long> hostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
+ List<Long> vmIds = _ovsNetworkToplogyGuru.getAllActiveVmsInVpc(vpcId);
+
+ List<OvsVpcPhysicalTopologyConfigCommand.Host> hosts = new ArrayList<>();
+ List<OvsVpcPhysicalTopologyConfigCommand.Tier> tiers = new ArrayList<>();
+ List<OvsVpcPhysicalTopologyConfigCommand.Vm> vms = new ArrayList<>();
+
+ for (Long hostId : hostIds) {
+ HostVO hostDetails = _hostDao.findById(hostId);
+ String remoteIp = null;
+ for (Network network: vpcNetworks) {
+ try {
+ remoteIp = getGreEndpointIP(hostDetails, network);
+ } catch (Exception e) {
+
+ }
+ }
+ OvsVpcPhysicalTopologyConfigCommand.Host host = new OvsVpcPhysicalTopologyConfigCommand.Host(hostId, remoteIp);
+ hosts.add(host);
+ }
+
+ for (Network network: vpcNetworks) {
+ String key = network.getBroadcastUri().getAuthority();
+ long gre_key;
+ if (key.contains(".")) {
+ String[] parts = key.split("\\.");
+ gre_key = Long.parseLong(parts[1]);
+ } else {
+ try {
+ gre_key = Long.parseLong(BroadcastDomainType.getValue(key));
+ } catch (Exception e) {
+ return null;
+ }
+ }
+ NicVO nic = _nicDao.findByIp4AddressAndNetworkId(network.getGateway(), network.getId());
+ OvsVpcPhysicalTopologyConfigCommand.Tier tier = new OvsVpcPhysicalTopologyConfigCommand.Tier(gre_key,
+ network.getUuid(), network.getGateway(), nic.getMacAddress(), network.getCidr());
+ tiers.add(tier);
+ }
+
+ for (long vmId: vmIds) {
+ VirtualMachine vmInstance = _vmInstanceDao.findById(vmId);
+ List<OvsVpcPhysicalTopologyConfigCommand.Nic> vmNics = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Nic>();
+ for (Nic vmNic :_nicDao.listByVmId(vmId)) {
+ Network network = _networkDao.findById(vmNic.getNetworkId());
+ if (network.getTrafficType() == TrafficType.Guest) {
+ OvsVpcPhysicalTopologyConfigCommand.Nic nic = new OvsVpcPhysicalTopologyConfigCommand.Nic(
+ vmNic.getIp4Address(), vmNic.getMacAddress(), network.getUuid());
+ vmNics.add(nic);
+ }
+ }
+ OvsVpcPhysicalTopologyConfigCommand.Vm vm = new OvsVpcPhysicalTopologyConfigCommand.Vm(
+ vmInstance.getHostId(), vmNics.toArray(new OvsVpcPhysicalTopologyConfigCommand.Nic[vmNics.size()]));
+ vms.add(vm);
+ }
+ return new OvsVpcPhysicalTopologyConfigCommand(
+ hosts.toArray(new OvsVpcPhysicalTopologyConfigCommand.Host[hosts.size()]),
+ tiers.toArray(new OvsVpcPhysicalTopologyConfigCommand.Tier[tiers.size()]),
+ vms.toArray(new OvsVpcPhysicalTopologyConfigCommand.Vm[vms.size()]),
+ vpc.getCidr());
+ }
+
// Subscriber to ACL replace events. On acl replace event, if the vpc is enabled for distributed routing
// send the ACL update to all the hosts on which VPC spans
public class NetworkAclEventsSubscriber implements MessageSubscriber {
@@ -755,14 +818,14 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
for (Long id: vpcSpannedHostIds) {
if (!sendVpcRoutingPolicyChangeUpdate(cmd, id, bridgeName)) {
s_logger.debug("Failed to send VPC routing policy change update to host : " + id +
- ". Moving on with rest of the host updates.");
+ ". But moving on with sending the host updates to the rest of the hosts.");
}
}
}
}
}
- OvsVpcRoutingPolicyConfigCommand prepareVpcRoutingPolicyUpdate(long vpcId) {
+ private OvsVpcRoutingPolicyConfigCommand prepareVpcRoutingPolicyUpdate(long vpcId) {
VpcVO vpc = _vpcDao.findById(vpcId);
assert (vpc != null): "invalid vpc id";
List<OvsVpcRoutingPolicyConfigCommand.Acl> acls = new ArrayList<>();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
index ac8a11d..1c9d513 100644
--- a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
+++ b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
@@ -239,7 +239,7 @@ def clear_flooding_rules_for_port(bridge, ofport):
def add_flooding_rules_for_port(bridge, in_ofport, out_ofports):
action = "".join("output:%s," %ofport for ofport in out_ofports)[:-1]
- add_flow(bridge, priority=1100, in_port=in_ofport, table=1, actions=action)
+ add_flow(bridge, priority=1100, in_port=in_ofport, table=2, actions=action)
def get_ofport_for_vif(vif_name):
return do_cmd([VSCTL_PATH, "get", "interface", vif_name, "ofport"])
@@ -259,28 +259,30 @@ def get_vif_name_from_macaddress(macaddress):
return "vif"+vm_domain_id+"."+vif_device_id
def add_mac_lookup_table_entry(bridge, mac_address, out_of_port):
- add_flow(bridge, priority=1100, dl_dst=mac_address, table=1, actions="output:%s" % out_of_port)
+ action = "output=%s" %out_of_port
+ add_flow(bridge, priority=1100, dl_dst=mac_address, table=1, actions=action)
def delete_mac_lookup_table_entry(bridge, mac_address):
del_flows(bridge, dl_dst=mac_address, table=1)
def add_ip_lookup_table_entry(bridge, ip, dst_tier_gateway_mac, dst_vm_mac):
- action_str = "mod_dl_sr:%s" % dst_tier_gateway_mac + ",mod_dl_dst:%s" % dst_vm_mac +",resubmit(,5)"
- addflow = [OFCTL_PATH, "add-flow", bridge, "table=4", "nw_dst=%s" % ip, "actions=%s" %action_str]
+ action_str = "mod_dl_src:%s" % dst_tier_gateway_mac + ",mod_dl_dst:%s" % dst_vm_mac + ",resubmit(,5)"
+ action_str = "table=4, ip, nw_dst=%s" % ip + ", actions=%s" %action_str
+ addflow = [OFCTL_PATH, "add-flow", bridge, action_str]
do_cmd(addflow)
def get_vms_on_host(vpc, host_id):
all_vms = vpc.vms
vms_on_host = []
for vm in all_vms:
- if vm.hostid == host_id:
+ if str(vm.hostid) == (host_id):
vms_on_host.append(vm)
return vms_on_host
def get_network_details(vpc, network_uuid):
tiers = vpc.tiers
for tier in tiers:
- if tier.networkuuid == network_uuid:
+ if str(tier.networkuuid) == (network_uuid):
return tier
return None
@@ -338,20 +340,22 @@ def configure_bridge_for_network_topology(bridge, this_host_id, json_config):
add_ip_lookup_table_entry(bridge, ip, network.gatewaymac, mac_addr)
# Add flow entry to send with intra tier traffic from the NIC to L2 lookup path)
- addflow = [OFCTL_PATH, "add-flow", bridge, "table=0", "in_port=%s" % of_port,
- "nw_dst=%s" %network.cidr, "actions=resubmit(,1)"]
+ action_str = "table=0, in_port=%s," %of_port + " ip, nw_dst=%s," %network.cidr + " actions=resubmit(,1)"
+ addflow = [OFCTL_PATH, "add-flow", bridge, action_str]
do_cmd(addflow)
#add flow entry to send inter-tier traffic from the NIC to egress ACL table(to L3 lookup path)
- addflow = [OFCTL_PATH, "add-flow", bridge, "table=0", "in_port=%s" % of_port,
- "dl_dst=%s" %network.gatewaymac, "nw_dst=%s" %vpconfig.cidr, "actions=resubmit(,3)"]
+ action_str = "table=0, in_port=%s," % of_port + " ip, dl_dst=%s," %network.gatewaymac +\
+ "nw_dst=%s," %vpconfig.cidr + "actions=resubmit(,3)"
+ addflow = [OFCTL_PATH, "add-flow", bridge, action_str]
+
do_cmd(addflow)
# get the list of hosts on which VPC spans from the JSON config
vpc_spanning_hosts = vpconfig.hosts
for host in vpc_spanning_hosts:
- if this_host_id == host.hostid:
+ if str(this_host_id) == str(host.hostid):
continue
other_host_vms = get_vms_on_host(vpconfig, host.hostid)
for vm in other_host_vms:
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py b/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
index ae37525..1445d94 100644
--- a/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
+++ b/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
@@ -21,9 +21,11 @@
import copy
import os
import sys
+import logging
import cloudstack_pluginlib as pluginlib
+pluginlib.setup_logging("/var/log/cloud/ovstunnel.log")
def clear_flows(bridge, this_vif_ofport, vif_ofports):
# Remove flow entries originating from given ofport
@@ -83,18 +85,26 @@ def main(command, vif_raw):
bridge = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'iface-to-br', this_vif])
- # find xs network for this bridge, verify is used for ovs tunnel network
+ # find xs network for this bridge, verify is used for ovs tunnel network
xs_nw_uuid = pluginlib.do_cmd([pluginlib.XE_PATH, "network-list",
"bridge=%s" % bridge, "--minimal"])
- ovs_tunnel_network = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
+ ovs_tunnel_network = False
+ try:
+ ovs_tunnel_network = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
"uuid=%s" % xs_nw_uuid,
"param-name=other-config",
"param-key=is-ovs-tun-network", "--minimal"])
+ except:
+ pass
- ovs_vpc_distributed_vr_network = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
+ ovs_vpc_distributed_vr_network = False
+ try:
+ ovs_vpc_distributed_vr_network = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
"uuid=%s" % xs_nw_uuid,
"param-name=other-config",
"param-key=is-ovs_vpc_distributed_vr_network", "--minimal"])
+ except:
+ pass
if ovs_tunnel_network == 'True':
vlan = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'br-to-vlan', bridge])
@@ -121,6 +131,7 @@ def main(command, vif_raw):
apply_flows(bridge, this_vif_ofport, vif_ofports)
+ # handle case where brdige is setup for VPC and VPC is enabled for distributed routing
if ovs_vpc_distributed_vr_network == 'True':
vlan = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'br-to-vlan', bridge])
if vlan != '0':
@@ -136,15 +147,15 @@ def main(command, vif_raw):
ports = vsctl_output.split('\n')
for port in ports:
- if_ofport = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'get', 'Interface', vif, 'ofport'])
- if vif.startswith('vif'):
+ if_ofport = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'get', 'Interface', port, 'ofport'])
+ if port.startswith('vif'):
# check VIF is in same network as that of plugged vif
if vif_network_id != pluginlib.get_network_id_for_vif(port):
continue
vnet_vif_ofports.append(if_ofport)
vnet_all_ofports.append(if_ofport)
- if vif.startswith('t'):
+ if port.startswith('t'):
# check tunnel port is in same network as that of plugged vif
if vif_network_id != pluginlib.get_network_id_for_tunnel_port(port):
continue
@@ -159,7 +170,8 @@ def main(command, vif_raw):
for port in vnet_tunnelif_ofports:
pluginlib.add_flooding_rules_for_port(bridge, port, vnet_vif_ofports)
- # send on all VIF and tunnel port excluding the port on which packet arrived
+ # for a packet arrived from VIF port send on all VIF and tunnel port excluding the port
+ # on which packet arrived
for port in vnet_vif_ofports:
vnet_all_ofports_copy = copy.copy(vnet_all_ofports)
vnet_all_ofports_copy.remove(port)
@@ -167,6 +179,7 @@ def main(command, vif_raw):
#learn that MAC is reachable through the VIF port
mac = pluginlib.get_macaddress_of_vif(this_vif)
+ this_vif_ofport = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'get', 'Interface', this_vif, 'ofport'])
pluginlib.add_mac_lookup_table_entry(bridge, mac, this_vif_ofport)
if command == 'offline':