Skip to content

Commit 0502d2f

Browse files
author
Marcus Sorensen
committed
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.
1 parent daeea46 commit 0502d2f

10 files changed

Lines changed: 73 additions & 17 deletions

File tree

api/src/com/cloud/network/NetworkService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ Pair<List<? extends PhysicalNetworkServiceProvider>, Integer> listNetworkService
110110

111111
long findPhysicalNetworkId(long zoneId, String tag, TrafficType trafficType);
112112

113-
PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficType, String xenLabel, String kvmLabel, String vmwareLabel,
113+
PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficType, String isolationMethod, String xenLabel, String kvmLabel, String vmwareLabel,
114114
String simulatorLabel, String vlan, String hypervLabel);
115115

116116
PhysicalNetworkTrafficType getPhysicalNetworkTrafficType(Long id);

api/src/com/cloud/network/Networks.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,22 @@ public String getValueFrom(URI uri) {
9494
return uri.getSchemeSpecificPart();
9595
}
9696
},
97-
Mido("mido", String.class), Pvlan("pvlan", String.class), Vxlan("vxlan", Long.class), UnDecided(null, null), OpenDaylight("opendaylight", String.class);
97+
Mido("mido", String.class), Pvlan("pvlan", String.class),
98+
Vxlan("vxlan", Long.class) {
99+
@Override
100+
public <T> URI toUri(T value) {
101+
try {
102+
if (value.toString().contains("://"))
103+
return new URI(value.toString());
104+
else
105+
return new URI("vxlan://" + value.toString());
106+
} catch (URISyntaxException e) {
107+
throw new CloudRuntimeException(
108+
"Unable to convert to broadcast URI: " + value);
109+
}
110+
}
111+
},
112+
UnDecided(null, null), OpenDaylight("opendaylight", String.class);
98113

99114
private final String scheme;
100115
private final Class<?> type;

api/src/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ public class ApiConstants {
344344
public static final String CAPACITY_IOPS = "capacityiops";
345345
public static final String NETWORK_SPEED = "networkspeed";
346346
public static final String BROADCAST_DOMAIN_RANGE = "broadcastdomainrange";
347+
public static final String ISOLATION_METHOD = "isolationmethod";
347348
public static final String ISOLATION_METHODS = "isolationmethods";
348349
public static final String PHYSICAL_NETWORK_ID = "physicalnetworkid";
349350
public static final String DEST_PHYSICAL_NETWORK_ID = "destinationphysicalnetworkid";

api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficTypeCmd.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ public class AddTrafficTypeCmd extends BaseAsyncCreateCmd {
7777
@Parameter(name = ApiConstants.VLAN, type = CommandType.STRING, description = "The VLAN id to be used for Management traffic by VMware host")
7878
private String vlan;
7979

80+
@Parameter(name=ApiConstants.ISOLATION_METHOD, type=CommandType.STRING, description="Used if physical network has multiple isolation types and traffic type is public."
81+
+ " Choose which isolation method. Valid options currently 'vlan' or 'vxlan', defaults to 'vlan'.")
82+
private String isolationMethod;
83+
8084
/////////////////////////////////////////////////////
8185
/////////////////// Accessors ///////////////////////
8286
/////////////////////////////////////////////////////
@@ -118,6 +122,14 @@ public String getVlan() {
118122
return vlan;
119123
}
120124

125+
public String getIsolationMethod() {
126+
if (isolationMethod != null && !isolationMethod.isEmpty()) {
127+
return isolationMethod;
128+
} else {
129+
return "vlan";
130+
}
131+
}
132+
121133
/////////////////////////////////////////////////////
122134
/////////////// API Implementation///////////////////
123135
/////////////////////////////////////////////////////
@@ -148,7 +160,7 @@ public void execute() {
148160
@Override
149161
public void create() throws ResourceAllocationException {
150162
PhysicalNetworkTrafficType result =
151-
_networkService.addTrafficTypeToPhysicalNetwork(getPhysicalNetworkId(), getTrafficType(), getXenLabel(), getKvmLabel(), getVmwareLabel(),
163+
_networkService.addTrafficTypeToPhysicalNetwork(getPhysicalNetworkId(), getTrafficType(), getIsolationMethod(), getXenLabel(), getKvmLabel(), getVmwareLabel(),
152164
getSimulatorLabel(), getVlan(), getHypervLabel());
153165
if (result != null) {
154166
setEntityId(result.getId());

plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/ManagementServerMock.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ private void locatePhysicalNetwork() {
327327
_znet = _networkService.getPhysicalNetwork(id);
328328
List<PhysicalNetworkVO> nets = _physicalNetworkDao.listByZoneAndTrafficType(_zone.getId(), TrafficType.Public);
329329
if (nets == null || nets.isEmpty()) {
330-
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Public.toString(), null, null, null, null, null, null);
330+
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Public.toString(), "vlan", null, null, null, null, null, null);
331331
}
332332
} catch (InvalidParameterValueException e) {
333333
List<String> isolationMethods = new ArrayList<String>();
@@ -337,7 +337,7 @@ private void locatePhysicalNetwork() {
337337
"znet");
338338
List<PhysicalNetworkVO> nets = _physicalNetworkDao.listByZoneAndTrafficType(_zone.getId(), TrafficType.Public);
339339
if (nets == null || nets.isEmpty()) {
340-
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Public.toString(), null, null, null, null, null, null);
340+
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Public.toString(), "vlan", null, null, null, null, null, null);
341341
}
342342
}
343343
if (_znet.getState() != PhysicalNetwork.State.Enabled) {
@@ -353,7 +353,7 @@ private void locatePhysicalNetwork() {
353353
}
354354
}
355355
if (!found) {
356-
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Guest.toString(), null, null, null, null, null, null);
356+
_networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Guest.toString(), "vlan", null, null, null, null, null, null);
357357
}
358358

359359
Pair<List<? extends PhysicalNetworkServiceProvider>, Integer> providers =

server/src/com/cloud/configuration/ConfigurationManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1689,7 +1689,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
16891689
_networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId, TrafficType.Storage);
16901690
} catch (InvalidParameterValueException noStorage) {
16911691
PhysicalNetworkTrafficTypeVO mgmtTraffic = _trafficTypeDao.findBy(mgmtPhyNetwork.getId(), TrafficType.Management);
1692-
_networkSvc.addTrafficTypeToPhysicalNetwork(mgmtPhyNetwork.getId(), TrafficType.Storage.toString(), mgmtTraffic.getXenNetworkLabel(),
1692+
_networkSvc.addTrafficTypeToPhysicalNetwork(mgmtPhyNetwork.getId(), TrafficType.Storage.toString(), "vlan", mgmtTraffic.getXenNetworkLabel(),
16931693
mgmtTraffic.getKvmNetworkLabel(), mgmtTraffic.getVmwareNetworkLabel(), mgmtTraffic.getSimulatorNetworkLabel(), mgmtTraffic.getVlan(),
16941694
mgmtTraffic.getHypervNetworkLabel());
16951695
s_logger.info("No storage traffic type was specified by admin, create default storage traffic on physical network " + mgmtPhyNetwork.getId()

server/src/com/cloud/network/NetworkServiceImpl.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3534,7 +3534,7 @@ public long findPhysicalNetworkId(long zoneId, String tag, TrafficType trafficTy
35343534
@Override
35353535
@DB
35363536
@ActionEvent(eventType = EventTypes.EVENT_TRAFFIC_TYPE_CREATE, eventDescription = "Creating Physical Network TrafficType", create = true)
3537-
public PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficTypeStr, String xenLabel, String kvmLabel, String vmwareLabel,
3537+
public PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficTypeStr, String isolationMethod, String xenLabel, String kvmLabel, String vmwareLabel,
35383538
String simulatorLabel, String vlan, String hypervLabel) {
35393539

35403540
// verify input parameters
@@ -3590,6 +3590,20 @@ public PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalN
35903590
vlan, hypervLabel);
35913591
pNetworktrafficType = _pNTrafficTypeDao.persist(pNetworktrafficType);
35923592

3593+
// For public traffic, get isolation method of physical network and update the public network accordingly
3594+
// each broadcast type will individually need to be qualified for support of public traffic
3595+
List<String> isolationMethods = network.getIsolationMethods();
3596+
if ((isolationMethods.size() == 1 && isolationMethods.get(0).toLowerCase().equals("vxlan"))
3597+
|| (isolationMethod != null && isolationMethods.contains(isolationMethod) && isolationMethod.toLowerCase().equals("vxlan"))) {
3598+
// find row in networks table that is defined as 'Public', created when zone was deployed
3599+
NetworkVO publicNetwork = _networksDao.listByZoneAndTrafficType(network.getDataCenterId(),TrafficType.Public).get(0);
3600+
if (publicNetwork != null) {
3601+
s_logger.debug("setting public network " + publicNetwork + " to broadcast type vxlan");
3602+
publicNetwork.setBroadcastDomainType(BroadcastDomainType.Vxlan);
3603+
_networksDao.persist(publicNetwork);
3604+
}
3605+
}
3606+
35933607
return pNetworktrafficType;
35943608
} catch (Exception ex) {
35953609
s_logger.warn("Exception: ", ex);

server/src/com/cloud/network/guru/PublicNetworkGuru.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public Network design(NetworkOffering offering, DeploymentPlan plan, Network net
103103

104104
if (offering.getTrafficType() == TrafficType.Public) {
105105
NetworkVO ntwk =
106-
new NetworkVO(offering.getTrafficType(), Mode.Static, BroadcastDomainType.Vlan, offering.getId(), State.Setup, plan.getDataCenterId(),
106+
new NetworkVO(offering.getTrafficType(), Mode.Static, network.getBroadcastDomainType(), offering.getId(), State.Setup, plan.getDataCenterId(),
107107
plan.getPhysicalNetworkId());
108108
return ntwk;
109109
} else {
@@ -122,9 +122,15 @@ protected void getIp(NicProfile nic, DataCenter dc, VirtualMachineProfile vm, Ne
122122
nic.setIp4Address(ip.getAddress().toString());
123123
nic.setGateway(ip.getGateway());
124124
nic.setNetmask(ip.getNetmask());
125-
nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
126-
nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
127-
nic.setBroadcastType(BroadcastDomainType.Vlan);
125+
if (network.getBroadcastDomainType() == BroadcastDomainType.Vxlan) {
126+
nic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(ip.getVlanTag()));
127+
nic.setBroadcastUri(BroadcastDomainType.Vxlan.toUri(ip.getVlanTag()));
128+
nic.setBroadcastType(BroadcastDomainType.Vxlan);
129+
} else {
130+
nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
131+
nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
132+
nic.setBroadcastType(BroadcastDomainType.Vlan);
133+
}
128134
nic.setFormat(AddressFormat.Ip4);
129135
nic.setReservationId(String.valueOf(ip.getVlanTag()));
130136
nic.setMacAddress(ip.getMacAddress());

server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1834,9 +1834,17 @@ protected LinkedHashMap<Network, NicProfile> createRouterNetworks(Account owner,
18341834
defaultNic.setGateway(sourceNatIp.getGateway());
18351835
defaultNic.setNetmask(sourceNatIp.getNetmask());
18361836
defaultNic.setMacAddress(sourceNatIp.getMacAddress());
1837-
defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
1838-
defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag()));
1839-
defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag()));
1837+
// get broadcast from public network
1838+
Network pubNet = _networkDao.findById(sourceNatIp.getNetworkId());
1839+
if (pubNet.getBroadcastDomainType() == BroadcastDomainType.Vxlan) {
1840+
defaultNic.setBroadcastType(BroadcastDomainType.Vxlan);
1841+
defaultNic.setBroadcastUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag()));
1842+
defaultNic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag()));
1843+
} else {
1844+
defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
1845+
defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag()));
1846+
defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag()));
1847+
}
18401848
if (hasGuestNetwork) {
18411849
defaultNic.setDeviceId(2);
18421850
}

server/test/com/cloud/vpc/MockNetworkManagerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,10 +404,10 @@ public long findPhysicalNetworkId(long zoneId, String tag, TrafficType trafficTy
404404
}
405405

406406
/* (non-Javadoc)
407-
* @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)
407+
* @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)
408408
*/
409409
@Override
410-
public PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficType, String xenLabel, String kvmLabel, String vmwareLabel,
410+
public PhysicalNetworkTrafficType addTrafficTypeToPhysicalNetwork(Long physicalNetworkId, String trafficType, String isolationMethod, String xenLabel, String kvmLabel, String vmwareLabel,
411411
String simulatorLabel, String vlan, String hypervLabel) {
412412
// TODO Auto-generated method stub
413413
return null;

0 commit comments

Comments
 (0)