From 8818e226f9d6434883cd9f766f0f4b1eaea4cdaf Mon Sep 17 00:00:00 2001 From: DTop Date: Mon, 10 Feb 2020 16:33:23 -0500 Subject: [PATCH] TW-19 - Populate APDemoMetric, ApClientMetrics, NeighbourScanReports from plume protobuf reports --- opensync_ext_kdc/pom.xml | 5 + .../OpensyncExternalIntegrationKDC.java | 323 +++++++++++++++++- opensync_gateway_build/pom.xml | 31 ++ 3 files changed, 358 insertions(+), 1 deletion(-) create mode 100644 opensync_gateway_build/pom.xml diff --git a/opensync_ext_kdc/pom.xml b/opensync_ext_kdc/pom.xml index 93c0e08..de7ad54 100644 --- a/opensync_ext_kdc/pom.xml +++ b/opensync_ext_kdc/pom.xml @@ -40,6 +40,11 @@ order-and-subscription-management-service-remote 0.0.1-SNAPSHOT + + com.whizcontrol + equipment-metrics-collector-service-remote + 0.0.1-SNAPSHOT + diff --git a/opensync_ext_kdc/src/main/java/ai/connectus/opensync/external/integration/OpensyncExternalIntegrationKDC.java b/opensync_ext_kdc/src/main/java/ai/connectus/opensync/external/integration/OpensyncExternalIntegrationKDC.java index a7616a4..93507a6 100644 --- a/opensync_ext_kdc/src/main/java/ai/connectus/opensync/external/integration/OpensyncExternalIntegrationKDC.java +++ b/opensync_ext_kdc/src/main/java/ai/connectus/opensync/external/integration/OpensyncExternalIntegrationKDC.java @@ -18,8 +18,13 @@ import org.springframework.cache.CacheManager; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; +import com.whizcontrol.core.model.equipment.DetectedAuthMode; import com.whizcontrol.core.model.equipment.EquipmentType; +import com.whizcontrol.core.model.equipment.MacAddress; +import com.whizcontrol.core.model.equipment.NeighboreScanPacketType; +import com.whizcontrol.core.model.equipment.NetworkType; import com.whizcontrol.core.model.equipment.RadioType; +import com.whizcontrol.core.model.equipment.Toggle; import com.whizcontrol.equipmentandnetworkconfig.models.ApElementConfiguration; import com.whizcontrol.equipmentandnetworkconfig.models.ApElementConfiguration.ApModel; import com.whizcontrol.equipmentandnetworkconfig.models.CountryCode; @@ -36,14 +41,30 @@ import com.whizcontrol.equipmentandnetworkmanagement.EquipmentAndNetworkManageme import com.whizcontrol.equipmentconfigurationmanager.EquipmentConfigurationManagerInterface; import com.whizcontrol.equipmentconfigurationmanager.models.ResolvedEquipmentConfiguration; import com.whizcontrol.equipmentinventory.models.CustomerEquipment; +import com.whizcontrol.equipmentmetricscollector.EquipmentMetricsCollectorInterface; import com.whizcontrol.equipmentrouting.EquipmentRoutingInterface; import com.whizcontrol.equipmentroutinginfo.models.EquipmentRoutingRecord; import com.whizcontrol.orderandsubscriptionmanagement.OrderAndSubscriptionManagementInterface; +import com.whizcontrol.servicemetrics.models.APDemoMetric; +import com.whizcontrol.servicemetrics.models.ApClientMetrics; +import com.whizcontrol.servicemetrics.models.ApPerformance; +import com.whizcontrol.servicemetrics.models.ClientMetrics; +import com.whizcontrol.servicemetrics.models.EthernetLinkState; +import com.whizcontrol.servicemetrics.models.NeighbourReport; +import com.whizcontrol.servicemetrics.models.NeighbourScanReports; +import com.whizcontrol.servicemetrics.models.SingleMetricRecord; import ai.connectus.opensync.external.integration.controller.OpensyncKDCGatewayController; import ai.connectus.opensync.external.integration.models.OpensyncAPConfig; import ai.connectus.opensync.external.integration.models.OpensyncAPRadioConfig; import ai.connectus.opensync.external.integration.models.OpensyncAPSsidConfig; +import sts.PlumeStats.Client; +import sts.PlumeStats.ClientReport; +import sts.PlumeStats.Device; +import sts.PlumeStats.Device.RadioTemp; +import sts.PlumeStats.Neighbor; +import sts.PlumeStats.Neighbor.NeighborBss; +import sts.PlumeStats.RadioBandType; import sts.PlumeStats.Report; import traffic.NetworkMetadata.FlowReport; import wc.stats.IpDnsTelemetry.WCStatsReport; @@ -63,6 +84,9 @@ public class OpensyncExternalIntegrationKDC implements OpensyncExternalIntegrati @Autowired private OrderAndSubscriptionManagementInterface orderAndSubscriptionManagementInterface; + @Autowired + private EquipmentMetricsCollectorInterface equipmentMetricsCollectorInterface; + /** * Equipment routing provide the qrCode to CE gateway mapping */ @@ -340,14 +364,311 @@ public class OpensyncExternalIntegrationKDC implements OpensyncExternalIntegrati return -1; } - + + public long extractEquipmentIdFromTopic(String topic) { + + String apId = extractApIdFromTopic(topic); + if(apId == null) { + return -1; + } + + OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(apId); + + if(ovsdbSession!=null) { + return ovsdbSession.getEquipmentId(); + } + + return -1; + + } + public void processMqttMessage(String topic, Report report) { LOG.info("Received report on topic {} for ap {}", topic, report.getNodeID()); int customerId = extractCustomerIdFromTopic(topic); if(customerId>0) { kdcGwController.updateActiveCustomer(customerId); } + + long equipmentId = extractEquipmentIdFromTopic(topic); + if(equipmentId <= 0 || customerId <=0) { + LOG.warn("Cannot determine equipment ids from topic {} - customerId {} equipmentId {}", topic, customerId, equipmentId); + return; + } + + List metricRecordList = new ArrayList<>(); + + populateAPDemoMetrics(metricRecordList, report, customerId, equipmentId); + populateApClientMetrics(metricRecordList, report, customerId, equipmentId); + populateNeighbourScanReports(metricRecordList, report, customerId, equipmentId); + + populateApSsidMetrics(metricRecordList, report, customerId, equipmentId); + populateChannelInfoReports(metricRecordList, report, customerId, equipmentId); + + if(!metricRecordList.isEmpty()) { + equipmentMetricsCollectorInterface.createRecordList(metricRecordList); + } + + } + + private void populateNeighbourScanReports(List metricRecordList, Report report, int customerId, long equipmentId) { + + for(Neighbor neighbor: report.getNeighborsList()){ + + SingleMetricRecord smr = new SingleMetricRecord(customerId, equipmentId); + metricRecordList.add(smr); + NeighbourScanReports neighbourScanReports = new NeighbourScanReports(); + smr.setData(neighbourScanReports); + + smr.setCreatedTimestamp(neighbor.getTimestampMs()); + + List neighbourReports = new ArrayList<>(); + neighbourScanReports.setNeighbourReports(neighbourReports); + + for(NeighborBss nBss: neighbor.getBssListList()) { + NeighbourReport nr = new NeighbourReport(); + neighbourReports.add(nr); + + // "band": "BAND5GL", + // "scanType": "ONCHAN_SCAN", + // "timestampMs": "1581118421629", + // "bssList": [ + // { + // "bssid": "80:D0:4A:E6:66:C9", + // "ssid": "", + // "rssi": 4, + // "tsf": "0", + // "chanWidth": "CHAN_WIDTH_80MHZ", + // "channel": 44, + // "status": "ADDED" + // }, + + if(neighbor.getBand()==RadioBandType.BAND2G) { + nr.setAcMode(Toggle.off); + nr.setbMode(Toggle.off); + nr.setnMode(Toggle.on); + nr.setRadioType(RadioType.is2dot4GHz); + } else { + nr.setAcMode(Toggle.on); + nr.setbMode(Toggle.off); + nr.setnMode(Toggle.off); + nr.setRadioType(RadioType.is5GHz); + } + + nr.setChannel(nBss.getChannel()); + nr.setMacAddress(MacAddress.valueOf(nBss.getBssid()).getAddress()); + nr.setNetworkType(NetworkType.AP); + nr.setPacketType(NeighboreScanPacketType.BEACON); + nr.setPrivacy((nBss.getSsid()==null || nBss.getSsid().isEmpty())?Toggle.on:Toggle.off); + //nr.setRate(rate); + nr.setRssi(nBss.getRssi()); + //nr.setScanTimeInSeconds(scanTimeInSeconds); + nr.setSecureMode(DetectedAuthMode.WPA); + //nr.setSignal(signal); + nr.setSsid(nBss.getSsid()); + } + } + } + + private void populateChannelInfoReports(List metricRecordList, Report report, int customerId, long equipmentId) { + + //TODO: implement me! //TODO: continue from here --->>> + + +// { +// SingleMetricRecord smr = new SingleMetricRecord(customerId, equipmentId); +// metricRecordList.add(smr); +// ChannelInfoReports channelInfoReports = new ChannelInfoReports(); +// smr.setData(channelInfoReports); +// +// List channelInformationReports2g = new ArrayList<>(); +// channelInfoReports.setChannelInformationReports2g(channelInformationReports2g); +// +// List channelInformationReports5g = new ArrayList<>(); +// channelInfoReports.setChannelInformationReports5g(channelInformationReports5g); +// +// ChannelInfo chInfo = new ChannelInfo(); +// chInfo.setBandwidth(bandwidth); +// chInfo.setChanNumber(chanNumber); +// chInfo.setNoiseFloor(noiseFloor); +// chInfo.setTotalUtilization(totalUtilization); +// chInfo.setWifiUtilization(wifiUtilization); +// +// channelInformationReports2g.add(chInfo); +// +// chInfo = new ChannelInfo(); +// chInfo.setBandwidth(bandwidth); +// chInfo.setChanNumber(chanNumber); +// chInfo.setNoiseFloor(noiseFloor); +// chInfo.setTotalUtilization(totalUtilization); +// chInfo.setWifiUtilization(wifiUtilization); +// +// channelInformationReports5g.add(chInfo); +// +// } + } + + private void populateApSsidMetrics(List metricRecordList, Report report, int customerId, long equipmentId) { + //TODO: implement me! +// { +// SingleMetricRecord smr = new SingleMetricRecord(customerId, equipmentId); +// metricRecordList.add(smr); +// +// ApSsidMetrics apSsidMetrics = new ApSsidMetrics(); +// smr.setData(apSsidMetrics); +// +// List ssidStats2g = new ArrayList<>(); +// apSsidMetrics.setSsidStats2g(ssidStats2g ); +// +// List ssidStats5g = new ArrayList<>(); +// apSsidMetrics.setSsidStats5g(ssidStats5g ); +// +// SsidStatistics ssidStat = new SsidStatistics(); +// ssidStats2g.add(ssidStat); +// ssidStat.setBssid(bssid); +// ssidStat.setSsid(ssid); +// ssidStat.setNumClient(numClient); +// ssidStat.setRxBytes(rxBytes); +// ssidStat.setRxLastRssi(rxLastRssi); +// ssidStat.setNumTxBytesSucc(numTxBytesSucc); +// +// ssidStat = new SsidStatistics(); +// ssidStats5g.add(ssidStat); +// ssidStat.setBssid(bssid); +// ssidStat.setSsid(ssid); +// ssidStat.setNumClient(numClient); +// ssidStat.setRxBytes(rxBytes); +// ssidStat.setRxLastRssi(rxLastRssi); +// ssidStat.setNumTxBytesSucc(numTxBytesSucc); +// } + } + + private void populateApClientMetrics(List metricRecordList, Report report, int customerId, long equipmentId) { + + for(ClientReport clReport: report.getClientsList()){ + SingleMetricRecord smr = new SingleMetricRecord(customerId, equipmentId); + metricRecordList.add(smr); + + ApClientMetrics apClientMetrics = new ApClientMetrics(); + smr.setData(apClientMetrics); + smr.setCreatedTimestamp(clReport.getTimestampMs()); + + Integer periodLengthSec = 60; //matches what's configured by OvsdbDao.configureStats(OvsdbClient) + apClientMetrics.setPeriodLengthSec(periodLengthSec); + + List clientMetrics = new ArrayList<>(); + + for(Client cl: clReport.getClientListList()) { + //clReport.getChannel(); + ClientMetrics cMetrics = new ClientMetrics(); + clientMetrics.add(cMetrics); + cMetrics.setRadioType((clReport.getBand() == RadioBandType.BAND2G)?RadioType.is2dot4GHz:RadioType.is5GHz); + cMetrics.setDeviceMacAddress(new MacAddress(cl.getMacAddress())); + + if(cl.hasStats()) { + if(cl.getStats().hasRssi()) { + cMetrics.setRssi(cl.getStats().getRssi()); + } + + //we'll report each device as having a single (very long) session + cMetrics.setSessionId(cMetrics.getDeviceMacAddress().getAddressAsLong()); + + //populate Rx stats + if(cl.getStats().hasRxBytes()) { + cMetrics.setRxBytes(cl.getStats().getRxBytes()); + } + + if(cl.getStats().hasRxRate()) { + cMetrics.setAverageRxRate(cl.getStats().getRxRate()); + } + + if(cl.getStats().hasRxErrors()) { + cMetrics.setNumRxNoFcsErr((int)cl.getStats().getRxErrors()); + } + + if(cl.getStats().hasRxFrames()) { + cMetrics.setNumRxFramesReceived(cl.getStats().getRxFrames()); + } + + if(cl.getStats().hasRxRetries()) { + cMetrics.setNumRxRetry((int)cl.getStats().getRxRetries()); + } + + //populate Tx stats + if(cl.getStats().hasTxBytes()) { + cMetrics.setNumTxBytes(cl.getStats().getTxBytes()); + } + + if(cl.getStats().hasTxRate()) { + cMetrics.setAverageTxRate(cl.getStats().getTxRate()); + } + + if(cl.getStats().hasTxErrors()) { + cMetrics.setNumTxDropped((int)cl.getStats().getTxErrors()); + } + + if(cl.getStats().hasTxFrames()) { + cMetrics.setNumTxFramesTransmitted(cl.getStats().getTxFrames()); + } + + if(cl.getStats().hasTxRetries()) { + cMetrics.setNumTxDataRetries((int)cl.getStats().getTxRetries()); + } + + } + } + + if(clReport.getBand() == RadioBandType.BAND2G) { + apClientMetrics.setClientMetrics2g(clientMetrics.toArray(new ClientMetrics[0])); + } else { + apClientMetrics.setClientMetrics5g(clientMetrics.toArray(new ClientMetrics[0])); + } + + } + } + + private void populateAPDemoMetrics(List metricRecordList, Report report, int customerId, long equipmentId) { + for(Device deviceReport : report.getDeviceList()) { + + SingleMetricRecord smr = new SingleMetricRecord(customerId, equipmentId); + metricRecordList.add(smr); + + APDemoMetric data = new APDemoMetric(); + smr.setData(data); + ApPerformance apPerformance = new ApPerformance(); + data.setApPerformance(apPerformance); + + smr.setCreatedTimestamp(deviceReport.getTimestampMs()); +// data.setChannelUtilization2G(channelUtilization2G); +// data.setChannelUtilization5G(channelUtilization5G); + + if(deviceReport.getRadioTempCount()>0) { + int cpuTemperature = 0; + int numSamples = 0; + for(RadioTemp r: deviceReport.getRadioTempList()) { + if(r.hasValue()) { + cpuTemperature += r.getValue(); + numSamples++; + } + } + + if(numSamples>0) { + apPerformance.setCpuTemperature( cpuTemperature / numSamples ); + } + } + + if(deviceReport.hasCpuUtil() && deviceReport.getCpuUtil().hasCpuUtil()) { + apPerformance.setCpuUtilized(new byte[]{(byte) (deviceReport.getCpuUtil().getCpuUtil()), (byte) (0)}); + } + + apPerformance.setEthLinkState(EthernetLinkState.UP1000_FULL_DUPLEX); + + if(deviceReport.hasMemUtil() && deviceReport.getMemUtil().hasMemTotal() && deviceReport.getMemUtil().hasMemUsed()) { + apPerformance.setFreeMemory(deviceReport.getMemUtil().getMemTotal() - deviceReport.getMemUtil().getMemUsed()); + } + apPerformance.setUpTime(new Long(deviceReport.getUptime())); + + } } public void processMqttMessage(String topic, FlowReport flowReport) { diff --git a/opensync_gateway_build/pom.xml b/opensync_gateway_build/pom.xml new file mode 100644 index 0000000..8f28a51 --- /dev/null +++ b/opensync_gateway_build/pom.xml @@ -0,0 +1,31 @@ + + 4.0.0 + + com.whizcontrol + root-pom + 0.0.1-SNAPSHOT + + ai.connectus + opensync_gateway_build + pom + opensync_gateway_build + Aggregation of modules, to build everything related to Opensync Gateway + + + + all-modules + + true + + + + ../opensync_ext_interface + ../opensync_ext_kdc + ../opensync_ext_static + ../opensync_gateway + ../opensync_gateway_kdc_process + ../opensync_gateway_static_process + + + + \ No newline at end of file