mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
some bug fixes
This commit is contained in:
parent
e045883c52
commit
2c7786992f
@ -999,7 +999,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
||||
/**
|
||||
* This method creates a XenServer network and configures it for being used as a L2-in-L3 tunneled network
|
||||
*/
|
||||
private synchronized Network configureTunnelNetwork(Connection conn, long networkId, long hostId, String bridgeName) {
|
||||
private synchronized Network configureTunnelNetwork(Connection conn, Long networkId, long hostId, String bridgeName) {
|
||||
try {
|
||||
Network nw = findOrCreateTunnelNetwork(conn, bridgeName);
|
||||
String nwName = bridgeName;
|
||||
@ -1038,7 +1038,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
||||
String[] res = result.split(":");
|
||||
if (res.length != 2 || !res[0].equalsIgnoreCase("SUCCESS")) {
|
||||
//TODO: Should make this error not fatal?
|
||||
throw new CloudRuntimeException("Unable to pre-configure OVS bridge " + bridge + " for network ID:" + networkId + " - " + res);
|
||||
throw new CloudRuntimeException("Unable to pre-configure OVS bridge " + bridge );
|
||||
}
|
||||
}
|
||||
return nw;
|
||||
@ -1090,7 +1090,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
||||
_isOvs = true;
|
||||
return setupvSwitchNetwork(conn);
|
||||
} else {
|
||||
return findOrCreateTunnelNetwork(conn, getOvsTunnelNetworkName(BroadcastDomainType.getValue(uri)));
|
||||
return findOrCreateTunnelNetwork(conn, getOvsTunnelNetworkName(uri.getAuthority()));
|
||||
}
|
||||
} else if (type == BroadcastDomainType.Storage) {
|
||||
if (uri == null) {
|
||||
@ -1114,7 +1114,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
||||
|
||||
private String getOvsTunnelNetworkName(String broadcastUri) {
|
||||
if (broadcastUri.contains(".")) {
|
||||
String[] parts = broadcastUri.split(".");
|
||||
String[] parts = broadcastUri.split("\\.");
|
||||
return "OVS-DR-VPC-Bridge"+parts[0];
|
||||
} else {
|
||||
try {
|
||||
@ -5266,7 +5266,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
||||
}
|
||||
|
||||
String bridge = nw.getBridge(conn);
|
||||
String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge", bridge, "in_port", cmd.getInPortName());
|
||||
String result = callHostPlugin(conn, "ovstunnel", "destroy_tunnel", "bridge", bridge, "in_port", cmd.getInPortName());
|
||||
|
||||
if (result.equalsIgnoreCase("SUCCESS")) {
|
||||
return new Answer(cmd, true, result);
|
||||
} else {
|
||||
@ -5282,7 +5283,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
||||
Connection conn = getConnection();
|
||||
try {
|
||||
String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge",
|
||||
cmd.getBridgeName(), "host-id", ((Long)cmd.getHostId()).toString());
|
||||
cmd.getBridgeName(), "host-id", ((Long)cmd.getHostId()).toString(), "config",
|
||||
cmd.getjsonVpcConfig());
|
||||
if (result.equalsIgnoreCase("SUCCESS")) {
|
||||
return new Answer(cmd, true, result);
|
||||
} else {
|
||||
|
||||
@ -0,0 +1,33 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
package com.cloud.agent.api;
|
||||
|
||||
/**
|
||||
* This command represents view of how a VPC is laid out (on which hosts, which VM is on which host etc)
|
||||
* on the physical infrastructure.
|
||||
*/
|
||||
public class OvsVpcLogicalTopologyConfigCommand extends Command {
|
||||
|
||||
public OvsVpcLogicalTopologyConfigCommand() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean executeInSequence() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -20,8 +20,11 @@ import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
|
||||
/**
|
||||
* This command represents view of how a VPC is laid out (on which hosts, which VM is on which host etc)
|
||||
* on the physical infrastructure.
|
||||
* This command represents physical view of how a VPC is laid out on the physical infrastructure.
|
||||
* - on which hypervisor hosts VPC spans (host is running in at least one VM from the VPC)
|
||||
* - information of tiers, so we can figure how one VM can talk to a different VM in same tier or different tier
|
||||
* - information on all the VM's in the VPC.
|
||||
* - information of NIC's of each VM in the VPC
|
||||
*/
|
||||
public class OvsVpcPhysicalTopologyConfigCommand extends Command {
|
||||
|
||||
|
||||
@ -75,7 +75,6 @@ import com.cloud.vm.NicProfile;
|
||||
import com.cloud.vm.ReservationContext;
|
||||
import com.cloud.vm.VirtualMachineProfile;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.UserVmVO;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
|
||||
@Local(value = {NetworkElement.class, ConnectivityProvider.class,
|
||||
@ -205,23 +204,6 @@ StaticNatServiceProvider, IpDeployer {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<UserVmVO> userVms = _userVmDao.listByAccountIdAndHostId(vm.getVirtualMachine().getAccountId(),
|
||||
vm.getVirtualMachine().getHostId());
|
||||
if (vm.getType() == VirtualMachine.Type.User) {
|
||||
if (userVms.size() > 1) {
|
||||
return true;
|
||||
}
|
||||
|
||||
List<DomainRouterVO> routers = _routerDao.findByNetwork(network.getId());
|
||||
for (DomainRouterVO router : routers) {
|
||||
if (router.getHostId().equals(vm.getVirtualMachine().getHostId())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else if (vm.getType() == VirtualMachine.Type.DomainRouter && userVms.size() != 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
HostVO host = _hostDao.findById(vm.getVirtualMachine().getHostId());
|
||||
_ovsTunnelMgr.checkAndRemoveHostFromTunnelNetwork(network, host);
|
||||
return true;
|
||||
|
||||
@ -154,7 +154,7 @@ public class OvsGuestNetworkGuru extends GuestNetworkGuru {
|
||||
if (network.getVpcId() != null && isVpcEnabledForDistributedRouter(network.getVpcId())) {
|
||||
String keyStr = BroadcastDomainType.getValue(implemented.getBroadcastUri());
|
||||
Long vpcid= network.getVpcId();
|
||||
implemented.setBroadcastUri(BroadcastDomainType.Vswitch.toUri(vpcid.toString()+keyStr));
|
||||
implemented.setBroadcastUri(BroadcastDomainType.Vswitch.toUri(vpcid.toString() + "." + keyStr));
|
||||
}
|
||||
|
||||
return implemented;
|
||||
|
||||
@ -37,6 +37,11 @@ public interface OvsNetworkTopologyGuru extends Manager {
|
||||
*/
|
||||
public List<Long> getVpcOnHost(long hostId);
|
||||
|
||||
/**
|
||||
* get the list of all active Vm id's in a network
|
||||
*/
|
||||
public List<Long> getAllActiveVmsInNetwork(long networkId);
|
||||
|
||||
/**
|
||||
* get the list of all active Vm id's in the VPC for all ther tiers
|
||||
*/
|
||||
@ -46,4 +51,9 @@ public interface OvsNetworkTopologyGuru extends Manager {
|
||||
* get the list of all Vm id's in the VPC for all the tiers that are running on the host
|
||||
*/
|
||||
public List<Long> getActiveVmsInVpcOnHost(long vpcId, long hostId);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
@ -1,14 +1,24 @@
|
||||
package com.cloud.network.ovs;
|
||||
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.Networks;
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.utils.component.ManagerBase;
|
||||
import com.cloud.vm.DomainRouterVO;
|
||||
import com.cloud.vm.UserVmVO;
|
||||
import com.cloud.vm.VMInstanceVO;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.NicVO;
|
||||
import com.cloud.vm.Nic;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.dao.NicDao;
|
||||
import com.cloud.vm.dao.UserVmDao;
|
||||
import com.cloud.vm.dao.VMInstanceDao;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import javax.ejb.Local;
|
||||
import javax.inject.Inject;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -21,6 +31,14 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
|
||||
UserVmDao _userVmDao;
|
||||
@Inject
|
||||
DomainRouterDao _routerDao;
|
||||
@Inject
|
||||
VpcManager _vpcMgr;
|
||||
@Inject
|
||||
VMInstanceDao _vmInstanceDao;
|
||||
@Inject
|
||||
NicDao _nicDao;
|
||||
@Inject
|
||||
NetworkDao _networkDao;
|
||||
|
||||
/**
|
||||
* get the list of hypervisor hosts on which VM's belonging to a network currently spans
|
||||
@ -52,23 +70,121 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
|
||||
return hostIds;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the list of hypervisor hosts on which VM's belonging to a VPC currently spans
|
||||
*/
|
||||
@Override
|
||||
public List<Long> getVpcSpannedHosts(long vpId) {
|
||||
return null;
|
||||
public List<Long> getVpcSpannedHosts(long vpcId) {
|
||||
List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(vpcId);
|
||||
List<Long> vpcHostIds = new ArrayList<>();
|
||||
for (Network vpcNetwork : vpcNetworks) {
|
||||
List<Long> networkHostIds = new ArrayList<Long>();
|
||||
networkHostIds = getNetworkSpanedHosts(vpcNetwork.getId());
|
||||
if (networkHostIds != null && !networkHostIds.isEmpty()) {
|
||||
for (Long hostId : networkHostIds) {
|
||||
if (!vpcHostIds.contains(hostId)) {
|
||||
vpcHostIds.add(hostId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return vpcHostIds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Long> getVpcOnHost(long hostId) {
|
||||
return null;
|
||||
List<Long> vpcIds = new ArrayList<>();
|
||||
List<VMInstanceVO> vmInstances = _vmInstanceDao.listByHostId(hostId);
|
||||
for (VMInstanceVO instance : vmInstances) {
|
||||
List<NicVO> nics = _nicDao.listByVmId(instance.getId());
|
||||
for (Nic nic: nics) {
|
||||
Network network = _networkDao.findById(nic.getNetworkId());
|
||||
if (network.getTrafficType() == Networks.TrafficType.Guest && network.getVpcId() != null) {
|
||||
if (!vpcIds.contains(network.getVpcId())) {
|
||||
vpcIds.add(network.getVpcId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return vpcIds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Long> getAllActiveVmsInNetwork(long networkId) {
|
||||
List <Long> vmIds = new ArrayList<>();
|
||||
List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(networkId,
|
||||
VirtualMachine.State.Running, VirtualMachine.State.Starting, VirtualMachine.State.Stopping, VirtualMachine.State.Unknown,
|
||||
VirtualMachine.State.Migrating);
|
||||
// Find routers for the network
|
||||
List<DomainRouterVO> routers = _routerDao.findByNetwork(networkId);
|
||||
List<VMInstanceVO> ins = new ArrayList<VMInstanceVO>();
|
||||
|
||||
if (vms != null) {
|
||||
for (UserVmVO vm : vms) {
|
||||
vmIds.add(vm.getId());
|
||||
}
|
||||
}
|
||||
if (routers.size() != 0) {
|
||||
for (DomainRouterVO router: routers) {
|
||||
vmIds.add(router.getId());
|
||||
}
|
||||
}
|
||||
return vmIds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Long> getAllActiveVmsInVpc(long vpcId) {
|
||||
return null;
|
||||
|
||||
Set<Long> vmIdsSet = new HashSet<>();
|
||||
List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(vpcId);
|
||||
for (Network network : vpcNetworks) {
|
||||
List<Long> networkVmIds = getAllActiveVmsInNetwork(network.getId());
|
||||
if (networkVmIds != null && !networkVmIds.isEmpty()) {
|
||||
vmIdsSet.addAll(networkVmIds);
|
||||
}
|
||||
}
|
||||
List<Long> vmIds = new ArrayList<>();
|
||||
vmIds.addAll(vmIdsSet);
|
||||
return vmIds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Long> getActiveVmsInVpcOnHost(long vpcId, long hostId) {
|
||||
return null;
|
||||
Set<Long> vmIdsSet = new HashSet<>();
|
||||
List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(vpcId);
|
||||
for (Network network : vpcNetworks) {
|
||||
List<Long> networkVmIds = getActiveVmsInNetworkOnHost(network.getId(), hostId);
|
||||
if (networkVmIds != null && !networkVmIds.isEmpty()) {
|
||||
vmIdsSet.addAll(networkVmIds);
|
||||
}
|
||||
}
|
||||
List<Long> vmIds = new ArrayList<>();
|
||||
vmIds.addAll(vmIdsSet);
|
||||
return vmIds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Long> getActiveVmsInNetworkOnHost(long networkId, long hostId) {
|
||||
List <Long> vmIds = new ArrayList<>();
|
||||
List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(networkId,
|
||||
VirtualMachine.State.Running, VirtualMachine.State.Starting, VirtualMachine.State.Stopping, VirtualMachine.State.Unknown,
|
||||
VirtualMachine.State.Migrating);
|
||||
// Find routers for the network
|
||||
List<DomainRouterVO> routers = _routerDao.findByNetwork(networkId);
|
||||
List<VMInstanceVO> ins = new ArrayList<VMInstanceVO>();
|
||||
|
||||
if (vms != null) {
|
||||
for (UserVmVO vm : vms) {
|
||||
if (vm.getHostId() == hostId)
|
||||
vmIds.add(vm.getId());
|
||||
}
|
||||
}
|
||||
if (routers.size() != 0) {
|
||||
for (DomainRouterVO router: routers) {
|
||||
if (router.getHostId() == hostId)
|
||||
vmIds.add(router.getId());
|
||||
}
|
||||
}
|
||||
return vmIds;
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,10 +18,10 @@ package com.cloud.network.ovs;
|
||||
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.vm.dao.VMInstanceDao;
|
||||
import com.cloud.vm.Nic;
|
||||
import com.cloud.vm.NicVO;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.dao.VMInstanceDao;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -260,9 +260,9 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
|
||||
int key = 0;
|
||||
try {
|
||||
//The GRE key is actually in the host part of the URI
|
||||
String keyStr = BroadcastDomainType.getValue(network.getBroadcastUri());
|
||||
String keyStr = network.getBroadcastUri().getAuthority();
|
||||
if (keyStr.contains(".")) {
|
||||
String[] parts = keyStr.split(".");
|
||||
String[] parts = keyStr.split("\\.");
|
||||
key = Integer.parseInt(parts[1]);
|
||||
} else {
|
||||
key = Integer.parseInt(keyStr);
|
||||
@ -445,34 +445,72 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
|
||||
@Override
|
||||
public void checkAndRemoveHostFromTunnelNetwork(Network nw, Host host) {
|
||||
|
||||
try {
|
||||
/* Now we are last one on host, destroy the bridge with all
|
||||
* the tunnels for this network */
|
||||
int key = getGreKey(nw);
|
||||
String bridgeName = generateBridgeName(nw, key);
|
||||
Command cmd = new OvsDestroyBridgeCommand(nw.getId(), bridgeName);
|
||||
s_logger.debug("Destroying bridge for network " + nw.getId() + " on host:" + host.getId());
|
||||
Answer ans = _agentMgr.send(host.getId(), cmd);
|
||||
handleDestroyBridgeAnswer(ans, host.getId(), nw.getId());
|
||||
|
||||
/* Then ask hosts have peer tunnel with me to destroy them */
|
||||
List<OvsTunnelNetworkVO> peers =
|
||||
_tunnelNetworkDao.listByToNetwork(host.getId(),
|
||||
nw.getId());
|
||||
for (OvsTunnelNetworkVO p : peers) {
|
||||
// If the tunnel was not successfully created don't bother to remove it
|
||||
if (p.getState().equals(OvsTunnel.State.Established.name())) {
|
||||
cmd = new OvsDestroyTunnelCommand(p.getNetworkId(), bridgeName,
|
||||
p.getPortName());
|
||||
s_logger.debug("Destroying tunnel to " + host.getId() +
|
||||
" from " + p.getFrom());
|
||||
ans = _agentMgr.send(p.getFrom(), cmd);
|
||||
handleDestroyTunnelAnswer(ans, p.getFrom(),
|
||||
p.getTo(), p.getNetworkId());
|
||||
}
|
||||
if (nw.getVpcId() != null && isVpcEnabledForDistributedRouter(nw.getVpcId())) {
|
||||
List<Long> vmIds = _ovsNetworkToplogyGuru.getActiveVmsInVpcOnHost(nw.getVpcId(), host.getId());
|
||||
if (vmIds != null && !vmIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(nw.getVpcId());
|
||||
try {
|
||||
for (Network network: vpcNetworks) {
|
||||
int key = getGreKey(nw);
|
||||
String bridgeName = generateBridgeName(nw, key);
|
||||
/* Then ask hosts have peer tunnel with me to destroy them */
|
||||
List<OvsTunnelNetworkVO> peers = _tunnelNetworkDao.listByToNetwork(host.getId(),nw.getId());
|
||||
for (OvsTunnelNetworkVO p : peers) {
|
||||
// If the tunnel was not successfully created don't bother to remove it
|
||||
if (p.getState().equals(OvsTunnel.State.Established.name())) {
|
||||
Command cmd= new OvsDestroyTunnelCommand(p.getNetworkId(), bridgeName,
|
||||
p.getPortName());
|
||||
s_logger.debug("Destroying tunnel to " + host.getId() +
|
||||
" from " + p.getFrom());
|
||||
Answer ans = _agentMgr.send(p.getFrom(), cmd);
|
||||
handleDestroyTunnelAnswer(ans, p.getFrom(), p.getTo(), p.getNetworkId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Command cmd = new OvsDestroyBridgeCommand(nw.getId(), generateBridgeNameForVpc(nw.getVpcId()));
|
||||
s_logger.debug("Destroying bridge for network " + nw.getId() + " on host:" + host.getId());
|
||||
Answer ans = _agentMgr.send(host.getId(), cmd);
|
||||
handleDestroyBridgeAnswer(ans, host.getId(), nw.getId());
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
} else {
|
||||
List<Long> vmIds = _ovsNetworkToplogyGuru.getActiveVmsInNetworkOnHost(nw.getId(), host.getId());
|
||||
if (vmIds != null && !vmIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
/* Now we are last one on host, destroy the bridge with all
|
||||
* the tunnels for this network */
|
||||
int key = getGreKey(nw);
|
||||
String bridgeName = generateBridgeName(nw, key);
|
||||
Command cmd = new OvsDestroyBridgeCommand(nw.getId(), bridgeName);
|
||||
s_logger.debug("Destroying bridge for network " + nw.getId() + " on host:" + host.getId());
|
||||
Answer ans = _agentMgr.send(host.getId(), cmd);
|
||||
handleDestroyBridgeAnswer(ans, host.getId(), nw.getId());
|
||||
|
||||
/* Then ask hosts have peer tunnel with me to destroy them */
|
||||
List<OvsTunnelNetworkVO> peers =
|
||||
_tunnelNetworkDao.listByToNetwork(host.getId(),
|
||||
nw.getId());
|
||||
for (OvsTunnelNetworkVO p : peers) {
|
||||
// If the tunnel was not successfully created don't bother to remove it
|
||||
if (p.getState().equals(OvsTunnel.State.Established.name())) {
|
||||
cmd = new OvsDestroyTunnelCommand(p.getNetworkId(), bridgeName,
|
||||
p.getPortName());
|
||||
s_logger.debug("Destroying tunnel to " + host.getId() +
|
||||
" from " + p.getFrom());
|
||||
ans = _agentMgr.send(p.getFrom(), cmd);
|
||||
handleDestroyTunnelAnswer(ans, p.getFrom(),
|
||||
p.getTo(), p.getNetworkId());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
s_logger.warn(String.format("Destroy tunnel failed", e));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
s_logger.warn(String.format("Destroy tunnel failed", e));
|
||||
}
|
||||
}
|
||||
|
||||
@ -514,9 +552,9 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
|
||||
List<Long> hostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
|
||||
List<Long> vmIds = _ovsNetworkToplogyGuru.getAllActiveVmsInVpc(vpcId);
|
||||
|
||||
List<OvsVpcPhysicalTopologyConfigCommand.Host> hosts = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Host>();
|
||||
List<OvsVpcPhysicalTopologyConfigCommand.Tier> tiers = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Tier>();
|
||||
List<OvsVpcPhysicalTopologyConfigCommand.Vm> vms = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Vm>();
|
||||
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);
|
||||
@ -533,10 +571,10 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
|
||||
}
|
||||
|
||||
for (Network network: vpcNetworks) {
|
||||
String key = BroadcastDomainType.getValue(network.getBroadcastUri());
|
||||
String key = network.getBroadcastUri().getAuthority();
|
||||
long gre_key;
|
||||
if (key.contains(".")) {
|
||||
String[] parts = key.split(".");
|
||||
String[] parts = key.split("\\.");
|
||||
gre_key = Long.parseLong(parts[1]);
|
||||
} else {
|
||||
try {
|
||||
@ -580,6 +618,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
|
||||
List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(vpcId);
|
||||
List<Long> vpcSpannedHostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
|
||||
String bridgeName=generateBridgeNameForVpc(vpcId);
|
||||
boolean bridgeNotSetup = true;
|
||||
|
||||
for (Network vpcNetwork: vpcNetworks) {
|
||||
int key = getGreKey(vpcNetwork);
|
||||
@ -643,7 +682,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
|
||||
+ " to create gre tunnel to " + i);
|
||||
Answer[] answers = _agentMgr.send(hostId, cmds);
|
||||
handleCreateTunnelAnswer(answers);
|
||||
noHost = false;
|
||||
bridgeNotSetup = false;
|
||||
}
|
||||
|
||||
for (Long i : fromHostIds) {
|
||||
@ -656,7 +695,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
|
||||
+ hostId);
|
||||
Answer[] answers = _agentMgr.send(i, cmds);
|
||||
handleCreateTunnelAnswer(answers);
|
||||
noHost = false;
|
||||
bridgeNotSetup = false;
|
||||
}
|
||||
} catch (GreTunnelException | OperationTimedoutException | AgentUnavailableException e) {
|
||||
// I really thing we should do a better handling of these exceptions
|
||||
@ -664,6 +703,20 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
|
||||
}
|
||||
}
|
||||
|
||||
// If no tunnels have been configured, perform the bridge setup
|
||||
// anyway. This will ensure VIF rules will be triggered
|
||||
if (bridgeNotSetup) {
|
||||
try {
|
||||
Commands cmds = new Commands(new OvsSetupBridgeCommand(bridgeName, hostId, null));
|
||||
s_logger.debug("Ask host " + hostId + " to configure bridge for vpc");
|
||||
Answer[] answers = _agentMgr.send(hostId, cmds);
|
||||
handleSetupBridgeAnswer(answers);
|
||||
} catch (OperationTimedoutException | AgentUnavailableException e) {
|
||||
// I really thing we should do a better handling of these exceptions
|
||||
s_logger.warn("Ovs Tunnel network created tunnel failed", e);
|
||||
}
|
||||
}
|
||||
|
||||
OvsVpcPhysicalTopologyConfigCommand topologyConfigCommand = prepareVpcTopologyUpdate(vpcId);
|
||||
for (Long id: vpcSpannedHostIds) {
|
||||
if (!sendVpcTopologyChangeUpdate(topologyConfigCommand, id, bridgeName)) {
|
||||
|
||||
@ -21,7 +21,7 @@ import ConfigParser
|
||||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
import json
|
||||
import simplejson as json
|
||||
|
||||
from time import localtime, asctime
|
||||
|
||||
@ -181,7 +181,7 @@ def _build_flow_expr(**kwargs):
|
||||
proto = 'proto' in kwargs and ",%s" % kwargs['proto'] or ''
|
||||
ip = ('nw_src' in kwargs or 'nw_dst' in kwargs) and ',ip' or ''
|
||||
flow = (flow + in_port + dl_type + dl_src + dl_dst +
|
||||
(ip or proto) + nw_src + nw_dst)
|
||||
(ip or proto) + nw_src + nw_dst + table)
|
||||
return flow
|
||||
|
||||
|
||||
|
||||
@ -137,8 +137,8 @@ def setup_ovs_bridge_for_distributed_routing(session, args):
|
||||
|
||||
logging.debug("About to manually create the bridge:%s" % bridge)
|
||||
# create a bridge with the same name as the xapi network
|
||||
res = lib.do_cmd([lib.VSCTL_PATH, "--", "--may-exist", "add-br", bridge,
|
||||
"--", "set", "bridge", bridge])
|
||||
res = lib.do_cmd([lib.VSCTL_PATH, "--", "--may-exist", "add-br", bridge])
|
||||
|
||||
logging.debug("Bridge has been manually created:%s" % res)
|
||||
# TODO: Make sure xs-network-uuid is set into external_ids
|
||||
lib.do_cmd([lib.VSCTL_PATH, "set", "Bridge", bridge,
|
||||
@ -149,12 +149,8 @@ def setup_ovs_bridge_for_distributed_routing(session, args):
|
||||
result = "FAILURE:%s" % res
|
||||
else:
|
||||
# Verify the bridge actually exists, with the gre_key properly set
|
||||
res = lib.do_cmd([lib.VSCTL_PATH, "get", "bridge",
|
||||
bridge, "other_config:gre_key"])
|
||||
if key in res:
|
||||
result = "SUCCESS:%s" % bridge
|
||||
else:
|
||||
result = "FAILURE:%s" % res
|
||||
res = lib.do_cmd([lib.VSCTL_PATH, "list", "bridge", bridge])
|
||||
|
||||
# Finally note in the xenapi network object that the network has
|
||||
# been configured
|
||||
xs_nw_uuid = lib.do_cmd([lib.XE_PATH, "network-list",
|
||||
@ -191,6 +187,8 @@ def setup_ovs_bridge_for_distributed_routing(session, args):
|
||||
# add a default rule in egress table to forward packet to L3 lookup table
|
||||
lib.add_flow(bridge, priority=0, table=5, actions='drop')
|
||||
|
||||
result = "SUCCESS: successfully setup bridge with flow rules"
|
||||
|
||||
logging.debug("Setup_ovs_bridge completed with result:%s" % result)
|
||||
return result
|
||||
|
||||
|
||||
@ -107,6 +107,10 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru {
|
||||
@Override
|
||||
public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) {
|
||||
|
||||
if (_networkModel.areServicesSupportedByNetworkOffering(offering.getId(), Network.Service.Connectivity)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
NetworkVO config = (NetworkVO)super.design(offering, plan, userSpecified, owner);
|
||||
if (config == null) {
|
||||
return null;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user