mirror of https://github.com/apache/cloudstack.git
CLOUDSTACK-5697 This patchset fixes a bug with the recently merged
vxlan code. Users can set a physical network to isolation type 'vxlan', put public traffic on that physical network, and it will still attempt to use 'vlan' isolation on the KVM hosts. This is going to be an issue for other isolation types as well, but I'm not familiar with them, so I'm just fixing vxlan for now.
This commit is contained in:
parent
daeea46da0
commit
0502d2f375
|
|
@ -110,7 +110,7 @@ public interface NetworkService {
|
|||
|
||||
long findPhysicalNetworkId(long zoneId, String tag, TrafficType trafficType);
|
||||
|
||||
PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficType, String xenLabel, String kvmLabel, String vmwareLabel,
|
||||
PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficType, String isolationMethod, String xenLabel, String kvmLabel, String vmwareLabel,
|
||||
String simulatorLabel, String vlan, String hypervLabel);
|
||||
|
||||
PhysicalNetworkTrafficType getPhysicalNetworkTrafficType(Long id);
|
||||
|
|
|
|||
|
|
@ -94,7 +94,22 @@ public class Networks {
|
|||
return uri.getSchemeSpecificPart();
|
||||
}
|
||||
},
|
||||
Mido("mido", String.class), Pvlan("pvlan", String.class), Vxlan("vxlan", Long.class), UnDecided(null, null), OpenDaylight("opendaylight", String.class);
|
||||
Mido("mido", String.class), Pvlan("pvlan", String.class),
|
||||
Vxlan("vxlan", Long.class) {
|
||||
@Override
|
||||
public <T> URI toUri(T value) {
|
||||
try {
|
||||
if (value.toString().contains("://"))
|
||||
return new URI(value.toString());
|
||||
else
|
||||
return new URI("vxlan://" + value.toString());
|
||||
} catch (URISyntaxException e) {
|
||||
throw new CloudRuntimeException(
|
||||
"Unable to convert to broadcast URI: " + value);
|
||||
}
|
||||
}
|
||||
},
|
||||
UnDecided(null, null), OpenDaylight("opendaylight", String.class);
|
||||
|
||||
private final String scheme;
|
||||
private final Class<?> type;
|
||||
|
|
|
|||
|
|
@ -344,6 +344,7 @@ public class ApiConstants {
|
|||
public static final String CAPACITY_IOPS = "capacityiops";
|
||||
public static final String NETWORK_SPEED = "networkspeed";
|
||||
public static final String BROADCAST_DOMAIN_RANGE = "broadcastdomainrange";
|
||||
public static final String ISOLATION_METHOD = "isolationmethod";
|
||||
public static final String ISOLATION_METHODS = "isolationmethods";
|
||||
public static final String PHYSICAL_NETWORK_ID = "physicalnetworkid";
|
||||
public static final String DEST_PHYSICAL_NETWORK_ID = "destinationphysicalnetworkid";
|
||||
|
|
|
|||
|
|
@ -77,6 +77,10 @@ public class AddTrafficTypeCmd extends BaseAsyncCreateCmd {
|
|||
@Parameter(name = ApiConstants.VLAN, type = CommandType.STRING, description = "The VLAN id to be used for Management traffic by VMware host")
|
||||
private String vlan;
|
||||
|
||||
@Parameter(name=ApiConstants.ISOLATION_METHOD, type=CommandType.STRING, description="Used if physical network has multiple isolation types and traffic type is public."
|
||||
+ " Choose which isolation method. Valid options currently 'vlan' or 'vxlan', defaults to 'vlan'.")
|
||||
private String isolationMethod;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -118,6 +122,14 @@ public class AddTrafficTypeCmd extends BaseAsyncCreateCmd {
|
|||
return vlan;
|
||||
}
|
||||
|
||||
public String getIsolationMethod() {
|
||||
if (isolationMethod != null && !isolationMethod.isEmpty()) {
|
||||
return isolationMethod;
|
||||
} else {
|
||||
return "vlan";
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -148,7 +160,7 @@ public class AddTrafficTypeCmd extends BaseAsyncCreateCmd {
|
|||
@Override
|
||||
public void create() throws ResourceAllocationException {
|
||||
PhysicalNetworkTrafficType result =
|
||||
_networkService.addTrafficTypeToPhysicalNetwork(getPhysicalNetworkId(), getTrafficType(), getXenLabel(), getKvmLabel(), getVmwareLabel(),
|
||||
_networkService.addTrafficTypeToPhysicalNetwork(getPhysicalNetworkId(), getTrafficType(), getIsolationMethod(), getXenLabel(), getKvmLabel(), getVmwareLabel(),
|
||||
getSimulatorLabel(), getVlan(), getHypervLabel());
|
||||
if (result != null) {
|
||||
setEntityId(result.getId());
|
||||
|
|
|
|||
|
|
@ -327,7 +327,7 @@ public class ManagementServerMock {
|
|||
_znet = _networkService.getPhysicalNetwork(id);
|
||||
List<PhysicalNetworkVO> nets = _physicalNetworkDao.listByZoneAndTrafficType(_zone.getId(), TrafficType.Public);
|
||||
if (nets == null || nets.isEmpty()) {
|
||||
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Public.toString(), null, null, null, null, null, null);
|
||||
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Public.toString(), "vlan", null, null, null, null, null, null);
|
||||
}
|
||||
} catch (InvalidParameterValueException e) {
|
||||
List<String> isolationMethods = new ArrayList<String>();
|
||||
|
|
@ -337,7 +337,7 @@ public class ManagementServerMock {
|
|||
"znet");
|
||||
List<PhysicalNetworkVO> nets = _physicalNetworkDao.listByZoneAndTrafficType(_zone.getId(), TrafficType.Public);
|
||||
if (nets == null || nets.isEmpty()) {
|
||||
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Public.toString(), null, null, null, null, null, null);
|
||||
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Public.toString(), "vlan", null, null, null, null, null, null);
|
||||
}
|
||||
}
|
||||
if (_znet.getState() != PhysicalNetwork.State.Enabled) {
|
||||
|
|
@ -353,7 +353,7 @@ public class ManagementServerMock {
|
|||
}
|
||||
}
|
||||
if (!found) {
|
||||
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Guest.toString(), null, null, null, null, null, null);
|
||||
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Guest.toString(), "vlan", null, null, null, null, null, null);
|
||||
}
|
||||
|
||||
Pair<List<? extends PhysicalNetworkServiceProvider>, Integer> providers =
|
||||
|
|
|
|||
|
|
@ -1689,7 +1689,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
_networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId, TrafficType.Storage);
|
||||
} catch (InvalidParameterValueException noStorage) {
|
||||
PhysicalNetworkTrafficTypeVO mgmtTraffic = _trafficTypeDao.findBy(mgmtPhyNetwork.getId(), TrafficType.Management);
|
||||
_networkSvc.addTrafficTypeToPhysicalNetwork(mgmtPhyNetwork.getId(), TrafficType.Storage.toString(), mgmtTraffic.getXenNetworkLabel(),
|
||||
_networkSvc.addTrafficTypeToPhysicalNetwork(mgmtPhyNetwork.getId(), TrafficType.Storage.toString(), "vlan", mgmtTraffic.getXenNetworkLabel(),
|
||||
mgmtTraffic.getKvmNetworkLabel(), mgmtTraffic.getVmwareNetworkLabel(), mgmtTraffic.getSimulatorNetworkLabel(), mgmtTraffic.getVlan(),
|
||||
mgmtTraffic.getHypervNetworkLabel());
|
||||
s_logger.info("No storage traffic type was specified by admin, create default storage traffic on physical network " + mgmtPhyNetwork.getId()
|
||||
|
|
|
|||
|
|
@ -3534,7 +3534,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
|
|||
@Override
|
||||
@DB
|
||||
@ActionEvent(eventType = EventTypes.EVENT_TRAFFIC_TYPE_CREATE, eventDescription = "Creating Physical Network TrafficType", create = true)
|
||||
public PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficTypeStr, String xenLabel, String kvmLabel, String vmwareLabel,
|
||||
public PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficTypeStr, String isolationMethod, String xenLabel, String kvmLabel, String vmwareLabel,
|
||||
String simulatorLabel, String vlan, String hypervLabel) {
|
||||
|
||||
// verify input parameters
|
||||
|
|
@ -3590,6 +3590,20 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
|
|||
vlan, hypervLabel);
|
||||
pNetworktrafficType = _pNTrafficTypeDao.persist(pNetworktrafficType);
|
||||
|
||||
// For public traffic, get isolation method of physical network and update the public network accordingly
|
||||
// each broadcast type will individually need to be qualified for support of public traffic
|
||||
List<String> isolationMethods = network.getIsolationMethods();
|
||||
if ((isolationMethods.size() == 1 && isolationMethods.get(0).toLowerCase().equals("vxlan"))
|
||||
|| (isolationMethod != null && isolationMethods.contains(isolationMethod) && isolationMethod.toLowerCase().equals("vxlan"))) {
|
||||
// find row in networks table that is defined as 'Public', created when zone was deployed
|
||||
NetworkVO publicNetwork = _networksDao.listByZoneAndTrafficType(network.getDataCenterId(),TrafficType.Public).get(0);
|
||||
if (publicNetwork != null) {
|
||||
s_logger.debug("setting public network " + publicNetwork + " to broadcast type vxlan");
|
||||
publicNetwork.setBroadcastDomainType(BroadcastDomainType.Vxlan);
|
||||
_networksDao.persist(publicNetwork);
|
||||
}
|
||||
}
|
||||
|
||||
return pNetworktrafficType;
|
||||
} catch (Exception ex) {
|
||||
s_logger.warn("Exception: ", ex);
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru {
|
|||
|
||||
if (offering.getTrafficType() == TrafficType.Public) {
|
||||
NetworkVO ntwk =
|
||||
new NetworkVO(offering.getTrafficType(), Mode.Static, BroadcastDomainType.Vlan, offering.getId(), State.Setup, plan.getDataCenterId(),
|
||||
new NetworkVO(offering.getTrafficType(), Mode.Static, network.getBroadcastDomainType(), offering.getId(), State.Setup, plan.getDataCenterId(),
|
||||
plan.getPhysicalNetworkId());
|
||||
return ntwk;
|
||||
} else {
|
||||
|
|
@ -122,9 +122,15 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru {
|
|||
nic.setIp4Address(ip.getAddress().toString());
|
||||
nic.setGateway(ip.getGateway());
|
||||
nic.setNetmask(ip.getNetmask());
|
||||
nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
|
||||
nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
|
||||
nic.setBroadcastType(BroadcastDomainType.Vlan);
|
||||
if (network.getBroadcastDomainType() == BroadcastDomainType.Vxlan) {
|
||||
nic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(ip.getVlanTag()));
|
||||
nic.setBroadcastUri(BroadcastDomainType.Vxlan.toUri(ip.getVlanTag()));
|
||||
nic.setBroadcastType(BroadcastDomainType.Vxlan);
|
||||
} else {
|
||||
nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
|
||||
nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
|
||||
nic.setBroadcastType(BroadcastDomainType.Vlan);
|
||||
}
|
||||
nic.setFormat(AddressFormat.Ip4);
|
||||
nic.setReservationId(String.valueOf(ip.getVlanTag()));
|
||||
nic.setMacAddress(ip.getMacAddress());
|
||||
|
|
|
|||
|
|
@ -1834,9 +1834,17 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
|
|||
defaultNic.setGateway(sourceNatIp.getGateway());
|
||||
defaultNic.setNetmask(sourceNatIp.getNetmask());
|
||||
defaultNic.setMacAddress(sourceNatIp.getMacAddress());
|
||||
defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
|
||||
defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag()));
|
||||
defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag()));
|
||||
// get broadcast from public network
|
||||
Network pubNet = _networkDao.findById(sourceNatIp.getNetworkId());
|
||||
if (pubNet.getBroadcastDomainType() == BroadcastDomainType.Vxlan) {
|
||||
defaultNic.setBroadcastType(BroadcastDomainType.Vxlan);
|
||||
defaultNic.setBroadcastUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag()));
|
||||
defaultNic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag()));
|
||||
} else {
|
||||
defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
|
||||
defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag()));
|
||||
defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag()));
|
||||
}
|
||||
if (hasGuestNetwork) {
|
||||
defaultNic.setDeviceId(2);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -404,10 +404,10 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkOrches
|
|||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkService#addTrafficTypeToPhysicalNetwork(java.lang.Long, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
|
||||
* @see com.cloud.network.NetworkService#addTrafficTypeToPhysicalNetwork(java.lang.Long, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
|
||||
*/
|
||||
@Override
|
||||
public PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficType, String xenLabel, String kvmLabel, String vmwareLabel,
|
||||
public PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficType, String isolationMethod, String xenLabel, String kvmLabel, String vmwareLabel,
|
||||
String simulatorLabel, String vlan, String hypervLabel) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
|
|
|
|||
Loading…
Reference in New Issue