kvm: when untagged vxlan is used, use the default guest/public bridge (#3037)

When vxlan://untagged is used for public (or guest) network, use the
default public/guest bridge device same as how vlan://untagged works.

Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
Rohit Yadav 2018-11-28 22:22:30 +05:30 committed by GitHub
parent d425a409fc
commit 29b8a9da48
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 6 deletions

View File

@ -206,6 +206,15 @@ public class BridgeVifDriver extends VifDriverBase {
return fname.matches(commonPattern.toString());
}
protected boolean isBroadcastTypeVlanOrVxlan(final NicTO nic) {
return nic != null && (nic.getBroadcastType() == Networks.BroadcastDomainType.Vlan
|| nic.getBroadcastType() == Networks.BroadcastDomainType.Vxlan);
}
protected boolean isValidProtocolAndVnetId(final String vNetId, final String protocol) {
return vNetId != null && protocol != null && !vNetId.equalsIgnoreCase("untagged");
}
@Override
public LibvirtVMDef.InterfaceDef plug(NicTO nic, String guestOsType, String nicAdapter) throws InternalErrorException, LibvirtException {
@ -220,7 +229,7 @@ public class BridgeVifDriver extends VifDriverBase {
String vNetId = null;
String protocol = null;
if (nic.getBroadcastType() == Networks.BroadcastDomainType.Vlan || nic.getBroadcastType() == Networks.BroadcastDomainType.Vxlan) {
if (isBroadcastTypeVlanOrVxlan(nic)) {
vNetId = Networks.BroadcastDomainType.getValue(nic.getBroadcastUri());
protocol = Networks.BroadcastDomainType.getSchemeValue(nic.getBroadcastUri()).scheme();
} else if (nic.getBroadcastType() == Networks.BroadcastDomainType.Lswitch) {
@ -233,8 +242,7 @@ public class BridgeVifDriver extends VifDriverBase {
}
if (nic.getType() == Networks.TrafficType.Guest) {
if ((nic.getBroadcastType() == Networks.BroadcastDomainType.Vlan) && (vNetId != null) && (protocol != null) && (!vNetId.equalsIgnoreCase("untagged")) ||
(nic.getBroadcastType() == Networks.BroadcastDomainType.Vxlan)) {
if (isBroadcastTypeVlanOrVxlan(nic) && isValidProtocolAndVnetId(vNetId, protocol)) {
if (trafficLabel != null && !trafficLabel.isEmpty()) {
s_logger.debug("creating a vNet dev and bridge for guest traffic per traffic label " + trafficLabel);
String brName = createVnetBr(vNetId, trafficLabel, protocol);
@ -257,8 +265,7 @@ public class BridgeVifDriver extends VifDriverBase {
createControlNetwork();
intf.defBridgeNet(_bridges.get("linklocal"), null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter));
} else if (nic.getType() == Networks.TrafficType.Public) {
if ((nic.getBroadcastType() == Networks.BroadcastDomainType.Vlan) && (vNetId != null) && (protocol != null) && (!vNetId.equalsIgnoreCase("untagged")) ||
(nic.getBroadcastType() == Networks.BroadcastDomainType.Vxlan)) {
if (isBroadcastTypeVlanOrVxlan(nic) && isValidProtocolAndVnetId(vNetId, protocol)) {
if (trafficLabel != null && !trafficLabel.isEmpty()) {
s_logger.debug("creating a vNet dev and bridge for public traffic per traffic label " + trafficLabel);
String brName = createVnetBr(vNetId, trafficLabel, protocol);
@ -276,7 +283,7 @@ public class BridgeVifDriver extends VifDriverBase {
String storageBrName = nic.getName() == null ? _bridges.get("private") : nic.getName();
intf.defBridgeNet(storageBrName, null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter));
}
if (nic.getPxeDisable() == true) {
if (nic.getPxeDisable()) {
intf.setPxeDisable(true);
}

View File

@ -0,0 +1,58 @@
// 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.hypervisor.kvm.resource;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.cloud.agent.api.to.NicTO;
import com.cloud.network.Networks;
public class BridgeVifDriverTest {
private BridgeVifDriver driver;
@Before
public void setUp() throws Exception {
driver = new BridgeVifDriver();
}
@Test
public void isBroadcastTypeVlanOrVxlan() {
final NicTO nic = new NicTO();
nic.setBroadcastType(Networks.BroadcastDomainType.Native);
Assert.assertFalse(driver.isBroadcastTypeVlanOrVxlan(null));
Assert.assertFalse(driver.isBroadcastTypeVlanOrVxlan(nic));
// Test VLAN
nic.setBroadcastType(Networks.BroadcastDomainType.Vlan);
Assert.assertTrue(driver.isBroadcastTypeVlanOrVxlan(nic));
// Test VXLAN
nic.setBroadcastType(Networks.BroadcastDomainType.Vxlan);
Assert.assertTrue(driver.isBroadcastTypeVlanOrVxlan(nic));
}
@Test
public void isValidProtocolAndVnetId() {
Assert.assertFalse(driver.isValidProtocolAndVnetId(null, null));
Assert.assertFalse(driver.isValidProtocolAndVnetId("123", null));
Assert.assertFalse(driver.isValidProtocolAndVnetId(null, "vlan"));
Assert.assertFalse(driver.isValidProtocolAndVnetId("untagged", "vxlan"));
Assert.assertTrue(driver.isValidProtocolAndVnetId("123", "vlan"));
Assert.assertTrue(driver.isValidProtocolAndVnetId("456", "vxlan"));
}
}