Adding support for setting NetworkProbe stats based on syntheticClient status in AP Profile Details. Added JUnits

This commit is contained in:
Mike Hansen
2020-07-20 12:58:25 -04:00
parent 9799070c83
commit 024f0feb74
4 changed files with 117 additions and 9 deletions

View File

@@ -27,6 +27,7 @@ import com.telecominfraproject.wlan.opensync.external.integration.models.Opensyn
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPVIFState;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDao;
import com.telecominfraproject.wlan.opensync.util.SslUtil;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.vmware.ovsdb.callback.ConnectionCallback;
import com.vmware.ovsdb.callback.MonitorCallback;
import com.vmware.ovsdb.exception.OvsdbClientException;
@@ -199,7 +200,10 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) {
ovsdbDao.updateDeviceStatsReportingInterval(ovsdbClient, collectionIntervalSecDeviceStats);
}
if (((ApNetworkConfiguration) opensyncAPConfig.getApProfile().getDetails()).getSyntheticClientEnabled()) {
ovsdbDao.enableNetworkProbeForSyntheticClient(ovsdbClient);
}
// ovsdbDao.configureWifiInet(ovsdbClient);
LOG.debug("Client connect Done");
@@ -262,6 +266,10 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) {
ovsdbDao.updateDeviceStatsReportingInterval(ovsdbClient, collectionIntervalSecDeviceStats);
}
if (((ApNetworkConfiguration) opensyncAPConfig.getApProfile().getDetails()).getSyntheticClientEnabled()) {
ovsdbDao.enableNetworkProbeForSyntheticClient(ovsdbClient);
}
} catch (OvsdbClientException e) {
LOG.error("Could not enable/disable table state monitors, cannot proccess config change for AP {}",

View File

@@ -580,6 +580,51 @@ public class OvsdbDao {
}
/**
* @param ovsdbClient
* @param value
* of reporting_interval column for the stats_type=device from
* the Wifi_Stats_Config table. If value is not provisioned then
* return -1.
*/
public void enableNetworkProbeForSyntheticClient(OvsdbClient ovsdbClient) {
LOG.debug("Enable network_probe metrics for synthetic client");
try {
List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>();
updateColumns.put("reporting_interval", new Atom<>(60));
updateColumns.put("radio_type", new Atom<>("2.4G"));
updateColumns.put("stats_type", new Atom<>("network_probe"));
Row row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
if (LOG.isDebugEnabled()) {
for (OperationResult res : result) {
if (res instanceof ErrorResult) {
LOG.error("Could not update {}:", wifiStatsConfigDbTable);
LOG.error("Error: {} Details: {}",
((ErrorResult) res).getError(), ((ErrorResult) res).getDetails());
} else {
LOG.debug("Updated {}:", wifiStatsConfigDbTable);
LOG.debug("Op Result {}", res);
}
}
}
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
}
public void performRedirect(OvsdbClient ovsdbClient, String clientCn) {
List<Operation> operations = new ArrayList<>();
@@ -2696,6 +2741,7 @@ public class OvsdbDao {
.of(thresholdMap);
Map<String, WifiRadioConfigInfo> radioConfigs = getProvisionedWifiRadioConfigs(ovsdbClient);
provisionWifiStatsConfigSurvey(getAllowedChannels(ovsdbClient), radioConfigs,
getProvisionedWifiStatsConfigs(ovsdbClient), operations, thresholds);

View File

@@ -28,6 +28,7 @@ import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSession;
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSessionMapInterface;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDao;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.vmware.ovsdb.callback.MonitorCallback;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.methods.MonitorRequests;
@@ -42,9 +43,8 @@ import io.netty.handler.ssl.SslContext;
// active profiles
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = OpensyncGatewayTipWlanOvsdbClientTest.class)
@Import(value = { OpensyncGatewayTipWlanOvsdbClientTest.Config.class, TipWlanOvsdbClient.class,
TipWlanOvsdbRedirector.class, OvsdbListenerConfig.class,
OvsdbSessionMapInterface.class, OvsdbDao.class, OpensyncExternalIntegrationInterface.class,
OvsdbSession.class, SslContext.class })
TipWlanOvsdbRedirector.class, OvsdbListenerConfig.class, OvsdbSessionMapInterface.class, OvsdbDao.class,
OpensyncExternalIntegrationInterface.class, OvsdbSession.class, SslContext.class })
public class OpensyncGatewayTipWlanOvsdbClientTest {
@MockBean
@@ -55,11 +55,10 @@ public class OpensyncGatewayTipWlanOvsdbClientTest {
@MockBean
private OvsdbSessionMapInterface ovsdbSessionMapInterface;
@MockBean
private SslContext sslContext;
@MockBean
private OvsdbDao ovsdbDao;
@@ -81,6 +80,7 @@ public class OpensyncGatewayTipWlanOvsdbClientTest {
.thenReturn(Mockito.mock(OvsdbSession.class, Mockito.RETURNS_DEEP_STUBS));
Mockito.when(opensyncExternalIntegrationInterface.getApConfig(Mockito.anyString()))
.thenReturn(Mockito.mock(OpensyncAPConfig.class, Mockito.RETURNS_DEEP_STUBS));
Mockito.when(ovsdbClient.monitor(Mockito.anyString(), Mockito.anyString(), Mockito.any(MonitorRequests.class),
Mockito.any(MonitorCallback.class))).thenReturn(completableFuture);
@@ -115,6 +115,12 @@ public class OpensyncGatewayTipWlanOvsdbClientTest {
Mockito.when(ovsdbSession.getOvsdbClient()).thenReturn(ovsdbClient);
Mockito.when(ovsdbSessionMapInterface.getSession("Test_Client_21P10C68818122")).thenReturn(ovsdbSession);
OpensyncAPConfig apConfig = Mockito.mock(OpensyncAPConfig.class, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(apConfig.getApProfile().getDetails()).thenReturn(Mockito.mock(ApNetworkConfiguration.class));
Mockito.when(opensyncExternalIntegrationInterface.getApConfig(Mockito.anyString())).thenReturn(apConfig);
tipwlanOvsdbClient.processConfigChanged("Test_Client_21P10C68818122");
Mockito.verify(ovsdbSessionMapInterface).getSession("Test_Client_21P10C68818122");

View File

@@ -3,11 +3,10 @@ package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@@ -38,14 +37,17 @@ import com.telecominfraproject.wlan.opensync.external.integration.models.Connect
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPInetState;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPRadioState;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPVIFState;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.jsonrpc.v1.util.JsonUtil;
import com.vmware.ovsdb.protocol.methods.RowUpdate;
import com.vmware.ovsdb.protocol.methods.TableUpdate;
import com.vmware.ovsdb.protocol.methods.TableUpdates;
import com.vmware.ovsdb.protocol.operation.notation.Atom;
import com.vmware.ovsdb.protocol.operation.notation.Row;
import com.vmware.ovsdb.protocol.operation.notation.Uuid;
import com.vmware.ovsdb.protocol.operation.notation.Value;
import com.vmware.ovsdb.protocol.operation.result.ErrorResult;
import com.vmware.ovsdb.protocol.operation.result.InsertResult;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.operation.result.SelectResult;
import com.vmware.ovsdb.service.OvsdbClient;
@@ -95,7 +97,7 @@ public class OvsdbDaoTest {
@Mock(answer = Answers.RETURNS_MOCKS)
OvsdbClient ovsdbClient;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
@Mock
CompletableFuture<OperationResult[]> futureResult;
@Autowired
@@ -472,6 +474,52 @@ public class OvsdbDaoTest {
}
@Test
public void testObsdbDaoEnableNetworkProbe() throws Exception {
Uuid rowUuid = Uuid.of(UUID.randomUUID());
OperationResult[] wifiStatsConfigEnableNetworkProbe = new OperationResult[] { new InsertResult(rowUuid) };
Mockito.when(futureResult.get(30L, TimeUnit.SECONDS)).thenReturn(wifiStatsConfigEnableNetworkProbe);
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);
ovsdbDao.enableNetworkProbeForSyntheticClient(ovsdbClient);
Mockito.verify(futureResult).get(30L, TimeUnit.SECONDS);
}
@Test
public void testObsdbDaoEnableNetworkProbeError() throws Exception {
OperationResult[] wifiStatsConfigEnableNetworkProbeFail = new OperationResult[] { new ErrorResult(
"constraint violation",
"network_probe is not one of the allowed values ([capacity, client, device, essid, neighbor, quality, radio, rssi, steering, survey])") };
Mockito.when(futureResult.get(30L, TimeUnit.SECONDS)).thenReturn(wifiStatsConfigEnableNetworkProbeFail);
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);
ovsdbDao.enableNetworkProbeForSyntheticClient(ovsdbClient);
Mockito.verify(futureResult).get(30L, TimeUnit.SECONDS);
}
@Test(expected = RuntimeException.class)
public void testObsdbDaoEnableNetworkProbeException() throws Exception {
Mockito.when(futureResult.get(30L, TimeUnit.SECONDS))
.thenThrow(new OvsdbClientException("OvsdbClientException"));
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);
ovsdbDao.enableNetworkProbeForSyntheticClient(ovsdbClient);
}
@Test
public void testOvsdbDaoGetOpensyncAPInetState() throws Exception {