Skip to content

Commit adec5f4

Browse files
authored
kvm: add ssvm storage nic null uri check during plug (#11557)
* kvm: add ssvm storage nic null uri check during plug Fixes #11552 Signed-off-by: Abhishek Kumar <[email protected]> * refactor Signed-off-by: Abhishek Kumar <[email protected]> --------- Signed-off-by: Abhishek Kumar <[email protected]>
1 parent db5b6a5 commit adec5f4

File tree

2 files changed

+67
-18
lines changed

2 files changed

+67
-18
lines changed

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,21 @@ protected boolean isValidProtocolAndVnetId(final String vNetId, final String pro
184184
return vNetId != null && protocol != null && !vNetId.equalsIgnoreCase("untagged");
185185
}
186186

187+
protected String createStorageVnetBridgeIfNeeded(NicTO nic, String trafficLabel,
188+
String storageBrName) throws InternalErrorException {
189+
if (!Networks.BroadcastDomainType.Storage.equals(nic.getBroadcastType()) || nic.getBroadcastUri() == null) {
190+
return storageBrName;
191+
}
192+
String vNetId = Networks.BroadcastDomainType.getValue(nic.getBroadcastUri());
193+
String protocol = Networks.BroadcastDomainType.Vlan.scheme();
194+
if (!isValidProtocolAndVnetId(vNetId, protocol)) {
195+
return storageBrName;
196+
}
197+
logger.debug(String.format("creating a vNet dev and bridge for %s traffic per traffic label %s",
198+
Networks.TrafficType.Storage.name(), trafficLabel));
199+
return createVnetBr(vNetId, storageBrName, protocol);
200+
}
201+
187202
@Override
188203
public LibvirtVMDef.InterfaceDef plug(NicTO nic, String guestOsType, String nicAdapter, Map<String, String> extraConfig) throws InternalErrorException, LibvirtException {
189204

@@ -250,15 +265,7 @@ public LibvirtVMDef.InterfaceDef plug(NicTO nic, String guestOsType, String nicA
250265
intf.defBridgeNet(_bridges.get("private"), null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter));
251266
} else if (nic.getType() == Networks.TrafficType.Storage) {
252267
String storageBrName = nic.getName() == null ? _bridges.get("private") : nic.getName();
253-
if (nic.getBroadcastType() == Networks.BroadcastDomainType.Storage) {
254-
vNetId = Networks.BroadcastDomainType.getValue(nic.getBroadcastUri());
255-
protocol = Networks.BroadcastDomainType.Vlan.scheme();
256-
}
257-
if (isValidProtocolAndVnetId(vNetId, protocol)) {
258-
logger.debug(String.format("creating a vNet dev and bridge for %s traffic per traffic label %s",
259-
Networks.TrafficType.Storage.name(), trafficLabel));
260-
storageBrName = createVnetBr(vNetId, storageBrName, protocol);
261-
}
268+
storageBrName = createStorageVnetBridgeIfNeeded(nic, trafficLabel, storageBrName);
262269
intf.defBridgeNet(storageBrName, null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter));
263270
}
264271
if (nic.getPxeDisable()) {
@@ -291,7 +298,7 @@ private String generateVxnetBrName(String pifName, String vnetId) {
291298
return "brvx-" + vnetId;
292299
}
293300

294-
private String createVnetBr(String vNetId, String pifKey, String protocol) throws InternalErrorException {
301+
protected String createVnetBr(String vNetId, String pifKey, String protocol) throws InternalErrorException {
295302
String nic = _pifs.get(pifKey);
296303
if (nic == null || protocol.equals(Networks.BroadcastDomainType.Vxlan.scheme())) {
297304
// if not found in bridge map, maybe traffic label refers to pif already?

plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriverTest.java

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,29 @@
1616
// under the License.
1717
package com.cloud.hypervisor.kvm.resource;
1818

19+
import java.net.URI;
20+
import java.net.URISyntaxException;
21+
1922
import org.junit.Assert;
20-
import org.junit.Before;
2123
import org.junit.Test;
24+
import org.junit.runner.RunWith;
25+
import org.mockito.InjectMocks;
26+
import org.mockito.Mockito;
27+
import org.mockito.Spy;
28+
import org.mockito.junit.MockitoJUnitRunner;
2229

2330
import com.cloud.agent.api.to.NicTO;
31+
import com.cloud.exception.InternalErrorException;
2432
import com.cloud.network.Networks;
25-
import org.junit.runner.RunWith;
26-
import org.mockito.junit.MockitoJUnitRunner;
2733

2834
@RunWith(MockitoJUnitRunner.class)
2935
public class BridgeVifDriverTest {
3036

31-
private BridgeVifDriver driver;
37+
private static final String BRIDGE_NAME = "cloudbr1";
3238

33-
@Before
34-
public void setUp() throws Exception {
35-
driver = new BridgeVifDriver();
36-
}
39+
@Spy
40+
@InjectMocks
41+
private BridgeVifDriver driver = new BridgeVifDriver();
3742

3843
@Test
3944
public void isBroadcastTypeVlanOrVxlan() {
@@ -58,4 +63,41 @@ public void isValidProtocolAndVnetId() {
5863
Assert.assertTrue(driver.isValidProtocolAndVnetId("123", "vlan"));
5964
Assert.assertTrue(driver.isValidProtocolAndVnetId("456", "vxlan"));
6065
}
66+
67+
@Test
68+
public void createStorageVnetBridgeIfNeededReturnsStorageBrNameWhenBroadcastTypeIsNotStorageButValidValues() throws InternalErrorException {
69+
NicTO nic = new NicTO();
70+
nic.setBroadcastType(Networks.BroadcastDomainType.Storage);
71+
int vlan = 123;
72+
String newBridge = "br-" + vlan;
73+
nic.setBroadcastUri(Networks.BroadcastDomainType.Storage.toUri(vlan));
74+
Mockito.doReturn(newBridge).when(driver).createVnetBr(Mockito.anyString(), Mockito.anyString(), Mockito.anyString());
75+
String result = driver.createStorageVnetBridgeIfNeeded(nic, "trafficLabel", BRIDGE_NAME);
76+
Assert.assertEquals(newBridge, result);
77+
}
78+
79+
@Test
80+
public void createStorageVnetBridgeIfNeededReturnsStorageBrNameWhenBroadcastTypeIsNotStorage() throws InternalErrorException {
81+
NicTO nic = new NicTO();
82+
nic.setBroadcastType(Networks.BroadcastDomainType.Vlan);
83+
String result = driver.createStorageVnetBridgeIfNeeded(nic, "trafficLabel", BRIDGE_NAME);
84+
Assert.assertEquals(BRIDGE_NAME, result);
85+
}
86+
87+
@Test
88+
public void createStorageVnetBridgeIfNeededReturnsStorageBrNameWhenBroadcastUriIsNull() throws InternalErrorException {
89+
NicTO nic = new NicTO();
90+
nic.setBroadcastType(Networks.BroadcastDomainType.Storage);
91+
String result = driver.createStorageVnetBridgeIfNeeded(nic, "trafficLabel", BRIDGE_NAME);
92+
Assert.assertEquals(BRIDGE_NAME, result);
93+
}
94+
95+
@Test
96+
public void createStorageVnetBridgeIfNeededCreatesVnetBridgeWhenUntaggedVlan() throws InternalErrorException, URISyntaxException {
97+
NicTO nic = new NicTO();
98+
nic.setBroadcastType(Networks.BroadcastDomainType.Storage);
99+
nic.setBroadcastUri(new URI(Networks.BroadcastDomainType.Storage.scheme() + "://untagged"));
100+
String result = driver.createStorageVnetBridgeIfNeeded(nic, "trafficLabel", BRIDGE_NAME);
101+
Assert.assertEquals(BRIDGE_NAME, result);
102+
}
61103
}

0 commit comments

Comments
 (0)