From 024f0feb741d016f24e259bdade747df96cbaacd Mon Sep 17 00:00:00 2001 From: Mike Hansen Date: Mon, 20 Jul 2020 12:58:25 -0400 Subject: [PATCH] Adding support for setting NetworkProbe stats based on syntheticClient status in AP Profile Details. Added JUnits --- .../opensync/ovsdb/TipWlanOvsdbClient.java | 10 +++- .../wlan/opensync/ovsdb/dao/OvsdbDao.java | 46 ++++++++++++++++ ...OpensyncGatewayTipWlanOvsdbClientTest.java | 16 ++++-- .../wlan/opensync/ovsdb/dao/OvsdbDaoTest.java | 54 +++++++++++++++++-- 4 files changed, 117 insertions(+), 9 deletions(-) diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java index b95b4aa..7711f3b 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java @@ -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 {}", diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java index 9dc2dd6..81ce64a 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java @@ -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 operations = new ArrayList<>(); + Map 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 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 operations = new ArrayList<>(); @@ -2696,6 +2741,7 @@ public class OvsdbDao { .of(thresholdMap); Map radioConfigs = getProvisionedWifiRadioConfigs(ovsdbClient); + provisionWifiStatsConfigSurvey(getAllowedChannels(ovsdbClient), radioConfigs, getProvisionedWifiStatsConfigs(ovsdbClient), operations, thresholds); diff --git a/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java b/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java index 5688aa0..4318cbd 100644 --- a/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java +++ b/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java @@ -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"); diff --git a/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDaoTest.java b/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDaoTest.java index a65c6cd..d341bfa 100644 --- a/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDaoTest.java +++ b/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDaoTest.java @@ -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 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 {