From fde8eabf914cf0438f58b9fcb5286be28e7f5dbc Mon Sep 17 00:00:00 2001 From: Mike Hansen Date: Mon, 30 Mar 2020 20:55:38 -0400 Subject: [PATCH] TW-208: Notified Table Status changes to ExternalInterfaceKDC --- .../OpensyncExternalIntegrationInterface.java | 18 +++ .../OpensyncExternalIntegrationSimple.java | 78 +++++++++++-- .../opensync/ovsdb/ConnectusOvsdbClient.java | 109 ++++++++---------- .../wlan/opensync/ovsdb/dao/OvsdbDao.java | 97 +++++----------- 4 files changed, 169 insertions(+), 133 deletions(-) diff --git a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationInterface.java b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationInterface.java index 5bb8e51..383c815 100644 --- a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationInterface.java +++ b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationInterface.java @@ -1,7 +1,10 @@ package com.telecominfraproject.wlan.opensync.external.integration; +import java.util.Map; + import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo; import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig; +import com.vmware.ovsdb.protocol.operation.notation.Value; import sts.PlumeStats.Report; import traffic.NetworkMetadata.FlowReport; @@ -9,9 +12,24 @@ import wc.stats.IpDnsTelemetry.WCStatsReport; public interface OpensyncExternalIntegrationInterface { void apConnected(String apId, ConnectNodeInfo connectNodeInfo); + void apDisconnected(String apId); + OpensyncAPConfig getApConfig(String apId); + + void wirelessStatusChanged(Map row,String apId); + + void deviceStatusChanged(Map row,String apId); + + void networkStatusChanged(Map row,String apId); + void processMqttMessage(String topic, Report report); + void processMqttMessage(String topic, FlowReport flowReport); + void processMqttMessage(String topic, WCStatsReport wcStatsReport); + + void handleClientsChanged(Map row, String connectedClientId); + + void awlanChanged(Map row, String connectedClientId); } diff --git a/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java b/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java index 5e9fc7d..cfe4f1b 100644 --- a/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java +++ b/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java @@ -1,6 +1,8 @@ package com.telecominfraproject.wlan.opensync.external.integration; import java.io.IOException; +import java.util.Map; +import java.util.Set; import javax.annotation.PostConstruct; @@ -10,9 +12,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; -import com.telecominfraproject.wlan.opensync.external.integration.OpensyncExternalIntegrationInterface; import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo; import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig; +import com.vmware.ovsdb.protocol.operation.notation.Uuid; import sts.PlumeStats.Report; import traffic.NetworkMetadata.FlowReport; @@ -23,27 +25,31 @@ import wc.stats.IpDnsTelemetry.WCStatsReport; public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegrationInterface { private static final Logger LOG = LoggerFactory.getLogger(OpensyncExternalIntegrationSimple.class); - + @Value("${connectus.ovsdb.configFileName:/Users/dtop/Documents/TIP_WLAN_repos/opensync_wifi_controller/opensync_ext_static/src/main/resources/config_2_ssids.json}") private String configFileName; @PostConstruct - private void postCreate(){ + private void postCreate() { LOG.info("Using Static integration"); } public void apConnected(String apId, ConnectNodeInfo connectNodeInfo) { LOG.info("AP {} got connected to the gateway", apId); + LOG.info("ConnectNodeInfo {}", connectNodeInfo); + } public void apDisconnected(String apId) { LOG.info("AP {} got disconnected from the gateway", apId); } + + public OpensyncAPConfig getApConfig(String apId) { LOG.info("Retrieving config for AP {} from file {}", apId, configFileName); OpensyncAPConfig ret = null; - + try { ret = OpensyncAPConfig.fromFile(configFileName, OpensyncAPConfig.class); } catch (IOException e) { @@ -51,12 +57,34 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr } LOG.debug("Config content : {}", ret); - + return ret; } public void processMqttMessage(String topic, Report report) { - LOG.info("Received report on topic {} for ap {}", topic, report.getNodeID()); + + LOG.info("Received PlumeStatsReport on topic {} for ap {}", topic, report.getNodeID()); + + if (report.getClientsCount() > 0) { + LOG.debug("Received {} client reports for AP {}", report.getClientsCount(), report.getNodeID()); + report.getClientsList().forEach(c -> LOG.trace("ClientReport {}", c)); + } + if (report.getNeighborsCount() > 0) { + LOG.debug("Received {} neighbor reports for AP {}", report.getNeighborsCount(), report.getNodeID()); + report.getNeighborsList().forEach(c -> LOG.trace("NeighborReport {}", c)); + } + if (report.getDeviceCount() > 0) { + LOG.debug("Received {} device reports for AP {}", report.getDeviceCount(), report.getNodeID()); + report.getDeviceList().forEach(c -> LOG.trace("DeviceReport {}", c)); + } + if (report.getSurveyCount() > 0) { + LOG.debug("Received {} survey reports for AP {}", report.getSurveyCount(), report.getNodeID()); + report.getSurveyList().forEach(c -> LOG.trace("SurveyReport {}", c)); + } + if (report.getRssiReportCount() > 0) { + LOG.debug("Received {} rssi reports for AP {}", report.getRssiReportCount(), report.getNodeID()); + report.getRssiReportList().forEach(c -> LOG.trace("RSSI Report {}", c)); + } } public void processMqttMessage(String topic, FlowReport flowReport) { @@ -64,7 +92,43 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr } public void processMqttMessage(String topic, WCStatsReport wcStatsReport) { - LOG.info("Received wcStatsReport on topic {} for ap {}", topic, wcStatsReport.getObservationPoint().getNodeId()); + LOG.info("Received wcStatsReport on topic {} for ap {}", topic, + wcStatsReport.getObservationPoint().getNodeId()); } + @Override + public void wirelessStatusChanged(Map row, + String apId) { + // TODO Auto-generated method stub + + } + + @Override + public void deviceStatusChanged(Map row, String apId) { + // TODO Auto-generated method stub + + } + + @Override + public void networkStatusChanged(Map row, String apId) { + // TODO Auto-generated method stub + + } + + @Override + public void handleClientsChanged(Map row, + String connectedClientId) { + // TODO Auto-generated method stub + + } + + @Override + public void awlanChanged(Map row, + String connectedClientId) { + // TODO Auto-generated method stub + + } + + + } diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/ConnectusOvsdbClient.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/ConnectusOvsdbClient.java index 753beea..978940c 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/ConnectusOvsdbClient.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/ConnectusOvsdbClient.java @@ -2,6 +2,7 @@ package com.telecominfraproject.wlan.opensync.ovsdb; import java.security.cert.X509Certificate; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.UUID; @@ -26,7 +27,6 @@ import com.vmware.ovsdb.callback.MonitorCallback; import com.vmware.ovsdb.protocol.methods.RowUpdate; import com.vmware.ovsdb.protocol.methods.TableUpdates; import com.vmware.ovsdb.protocol.operation.notation.Row; -import com.vmware.ovsdb.protocol.operation.notation.Value; import com.vmware.ovsdb.service.OvsdbClient; import com.vmware.ovsdb.service.OvsdbPassiveConnectionListener; @@ -66,15 +66,6 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { public void listenForConnections() { - // This class is only used here, therefore changed it back to an inner - // class, - // removed the package level class. - // All calling classes related to OVSDB are calling the MonitorCallback - // interface, so the implementation can remain - // hidden. This also gives handy access to the Autowired instances in - // the - // container class. - class ConnectusMonitorCallback implements MonitorCallback { private String connectedClientId; @@ -88,59 +79,56 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { Set tableNames = tableUpdates.getTableUpdates().keySet(); for (String name : tableNames) { - LOG.trace("Receive update for table {}", name); + if (name.equals(OvsdbDao.wifiAssociatedClientsDbTable)) { + Map updates = tableUpdates.getTableUpdates().get(name).getRowUpdates(); + for (UUID id : updates.keySet()) { - Map updates = tableUpdates.getTableUpdates().get(name).getRowUpdates(); + Row row = updates.get(id).getNew(); - for (UUID id : updates.keySet()) { - - LOG.trace("Receive row update for uuid {}", id); - - RowUpdate rowUpdate = updates.get(id); - - Row newRow = rowUpdate.getNew(); - if (newRow != null) { - Set newRowColumns = newRow.getColumns().keySet(); - Row oldRow = rowUpdate.getOld(); - - for (String column : newRowColumns) { - - Value oldVal = null; - if (oldRow != null && oldRow.getColumns().containsKey(column)) - oldVal = oldRow.getColumns().get(column); - - Value newVal = newRow.getColumns().get(column); - - } + if (row != null) + extIntegrationInterface.handleClientsChanged(row.getColumns(), connectedClientId); } + } else if (name.equals(OvsdbDao.awlanNodeDbTable)) { + Map updates = tableUpdates.getTableUpdates().get(name).getRowUpdates(); + for (UUID id : updates.keySet()) { + + Row row = updates.get(id).getNew(); + + if (row != null) + extIntegrationInterface.awlanChanged(row.getColumns(), connectedClientId); + } + } else if (name.equals(OvsdbDao.wifiVifStateDbTable)) { + Map updates = tableUpdates.getTableUpdates().get(name).getRowUpdates(); + for (UUID id : updates.keySet()) { + + Row row = updates.get(id).getNew(); + + if (row != null) + extIntegrationInterface.wirelessStatusChanged(row.getColumns(), connectedClientId); + } + } else if (name.equals(OvsdbDao.wifiInetStateDbTable)) { + Map updates = tableUpdates.getTableUpdates().get(name).getRowUpdates(); + + for (UUID id : updates.keySet()) { + + Row row = updates.get(id).getNew(); + + if (row != null) + extIntegrationInterface.networkStatusChanged(row.getColumns(), connectedClientId); + } + } else if (name.equals(OvsdbDao.wifiRadioStateDbTable)) { + Map updates = tableUpdates.getTableUpdates().get(name).getRowUpdates(); + for (UUID id : updates.keySet()) { + + Row row = updates.get(id).getNew(); + + if (row != null) + extIntegrationInterface.deviceStatusChanged(row.getColumns(), connectedClientId); + } } - } - // get session information for this client - // OvsdbSession ovsdbSession = - // ovsdbSessionMapInterface.getSession(connectedClientId); - // if (ovsdbSession == null) { - // throw new IllegalStateException("AP with id " + - // connectedClientId + " is not connected"); - // } - // - // OvsdbClient ovsdbClient = ovsdbSession.getOvsdbClient(); - // OpensyncAPConfig opensyncAPConfig = - // extIntegrationInterface.getApConfig(connectedClientId); - - // TODO: - // example wifiVifStateDbTable get MAC ADDRESS via ovsdbClient - // from - // Wifi_Associated_Clients given the associated UUID for the - // client - - // TODO: - // Changes from other Status (Wifi, Inet, etc.) tables? - // Updates to session etc. - // Needs to be reflected in the Cloud - } } @@ -181,10 +169,11 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { ovsdbDao.monitorInetState(ovsdbClient, new ConnectusMonitorCallback(key)); // monitor vif state ovsdbDao.monitorVIFState(ovsdbClient, new ConnectusMonitorCallback(key)); - // monitor Route state - ovsdbDao.monitorRouteState(ovsdbClient, new ConnectusMonitorCallback(key)); - // monitor Master State - ovsdbDao.monitorMasterState(ovsdbClient, new ConnectusMonitorCallback(key)); + // monitor AWLAN_Node + ovsdbDao.monitorAwlanNode(ovsdbClient, new ConnectusMonitorCallback(key)); + // monitor Wifi_Associated_Clients + ovsdbDao.monitorAssociatedClients(ovsdbClient, new ConnectusMonitorCallback(key)); + } catch (Exception e) { LOG.error("ovsdbClient error", e); // something is wrong with the SSL 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 3115984..6cb8be7 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 @@ -84,81 +84,39 @@ public class OvsdbDao { public static final String wifiInetConfigDbTable = "Wifi_Inet_Config"; public static final String wifiInetStateDbTable = "Wifi_Inet_State"; - public static final String wifiRouteStateDbTable = "Wifi_Route_State"; - public static final String wifiMasterStateDbTable = "Wifi_Master_State"; + public static final String wifiAssociatedClientsDbTable = "Wifi_Associated_Clients"; private static final String wifiRadioStateDbTableMonitorId = "Wifi_Radio_State_Monitor_Id"; private static final String wifiInetStateDbTableMonitorId = "Wifi_Inet_State_Monitor_Id"; private static final String wifiVifStateDbTableMonitorId = "Wifi_VIF_State_Monitor_Id"; - private static final String wifiRouteStateDbTableMonitorId = "Wifi_Route_State_Monitor_Id"; - private static final String wifiMasterStateDbTableMonitorId = "Wifi_Master_State_Monitor_Id"; - - public void monitorRouteState(OvsdbClient ovsdbClient, MonitorCallback monitorCallback) { - - List columns = new ArrayList<>(); - columns.add("_uuid"); - columns.add("_version"); - columns.add("dest_addr"); - columns.add("dest_mask"); - columns.add("gateway"); - columns.add("gateway_hwaddr"); - columns.add("if_name"); + private static final String wifiAwlanNodeDbTableMonitorId = "AWLAN_Node_Monitor_Id"; + private static final String wifiAssociatedClientsDbTableMonitorId = "Wifi_Associated_Clients_Monitor_Id"; + public void monitorAwlanNode(OvsdbClient ovsdbClient, MonitorCallback monitorCallback) { MonitorRequest monitorRequest = new MonitorRequest(); - MonitorRequests monitorRequests = new MonitorRequests(ImmutableMap.of(wifiRouteStateDbTable, monitorRequest)); - try { - ovsdbClient.monitor(ovsdbName, wifiRouteStateDbTableMonitorId, monitorRequests, monitorCallback); - } catch (OvsdbClientException e) { - LOG.error("Unable to add Monitor to table " + wifiRouteStateDbTable, e); - } + MonitorRequests monitorRequests = new MonitorRequests(ImmutableMap.of(awlanNodeDbTable, monitorRequest)); + try { + ovsdbClient.monitor(ovsdbName, wifiAwlanNodeDbTableMonitorId, monitorRequests, monitorCallback); + } catch (OvsdbClientException e) { + LOG.error("Unable to add Monitor to table " + awlanNodeDbTable, e); + } } - public void monitorMasterState(OvsdbClient ovsdbClient, MonitorCallback monitorCallback) { - List columns = new ArrayList<>(); - columns.add("_uuid"); - columns.add("_version"); - columns.add("dhcpc"); - columns.add("if_name"); - columns.add("if_type"); - columns.add("inet_addr"); - columns.add("netmask"); - columns.add("network_state"); - columns.add("port_state"); - + public void monitorAssociatedClients(OvsdbClient ovsdbClient, MonitorCallback monitorCallback) { MonitorRequest monitorRequest = new MonitorRequest(); - MonitorRequests monitorRequests = new MonitorRequests(ImmutableMap.of(wifiMasterStateDbTable, monitorRequest)); + MonitorRequests monitorRequests = new MonitorRequests( + ImmutableMap.of(wifiAssociatedClientsDbTable, monitorRequest)); try { - ovsdbClient.monitor(ovsdbName, wifiMasterStateDbTableMonitorId, monitorRequests, monitorCallback); + ovsdbClient.monitor(ovsdbName, wifiAssociatedClientsDbTableMonitorId, monitorRequests, monitorCallback); } catch (OvsdbClientException e) { - LOG.error("Unable to add Monitor to table " + wifiMasterStateDbTable, e); + LOG.error("Unable to add Monitor to table " + wifiAssociatedClientsDbTable, e); } + } public void monitorVIFState(OvsdbClient ovsdbClient, MonitorCallback monitorCallback) { - List columns = new ArrayList<>(); - columns.add("_uuid"); - columns.add("_version"); - columns.add("ap_bridge"); - columns.add("associated_clients"); - columns.add("bridge"); - columns.add("btm"); - columns.add("channel"); - columns.add("dynamic_beacon"); - columns.add("enabled"); - columns.add("group_rekey"); - columns.add("if_name"); - columns.add("mac"); - columns.add("min_hw_mode"); - columns.add("mode"); - columns.add("rrm"); - columns.add("security"); - columns.add("ssid"); - columns.add("ssid_broadcast"); - columns.add("uapsd_enable"); - columns.add("vif_config"); - columns.add("vif_radio_idx"); MonitorRequest monitorRequest = new MonitorRequest(); MonitorRequests monitorRequests = new MonitorRequests(ImmutableMap.of(wifiVifStateDbTable, monitorRequest)); @@ -208,8 +166,8 @@ public class OvsdbDao { ovsdbClient.cancelMonitor(wifiRadioStateDbTableMonitorId); ovsdbClient.cancelMonitor(wifiVifStateDbTableMonitorId); ovsdbClient.cancelMonitor(wifiInetStateDbTableMonitorId); - ovsdbClient.cancelMonitor(wifiRouteStateDbTableMonitorId); - ovsdbClient.cancelMonitor(wifiMasterStateDbTableMonitorId); + ovsdbClient.cancelMonitor(wifiAssociatedClientsDbTableMonitorId); + ovsdbClient.cancelMonitor(wifiAwlanNodeDbTableMonitorId); } catch (OvsdbClientException e) { LOG.debug("Could not cancel Monitor. {}", e.getLocalizedMessage()); } @@ -1560,7 +1518,7 @@ public class OvsdbDao { updateColumns.put("sampling_interval", new Atom<>(0)); updateColumns.put("stats_type", new Atom<>("device")); // updateColumns.put("survey_interval_ms", new Atom<>(10) ); - // updateColumns.put("survey_type", new Atom<>("on-chan") ); + updateColumns.put("survey_type", new Atom<>("on-chan")); // updateColumns.put("threshold", thresholds ); row = new Row(updateColumns); @@ -1641,11 +1599,13 @@ public class OvsdbDao { updateColumns = new HashMap<>(); // updateColumns.put("channel_list", channels ); updateColumns.put("radio_type", new Atom<>("5GL")); + updateColumns.put("report_type", new Atom<>("average")); + updateColumns.put("reporting_interval", new Atom<>(60)); updateColumns.put("sampling_interval", new Atom<>(10)); updateColumns.put("stats_type", new Atom<>("client")); // updateColumns.put("survey_interval_ms", new Atom<>(0) ); - // updateColumns.put("survey_type", new Atom<>("on-chan") ); + updateColumns.put("survey_type", new Atom<>("on-chan")); // updateColumns.put("threshold", thresholds ); row = new Row(updateColumns); @@ -1658,11 +1618,13 @@ public class OvsdbDao { updateColumns = new HashMap<>(); // updateColumns.put("channel_list", channels ); updateColumns.put("radio_type", new Atom<>("5GU")); + updateColumns.put("report_type", new Atom<>("average")); + updateColumns.put("reporting_interval", new Atom<>(60)); updateColumns.put("sampling_interval", new Atom<>(10)); updateColumns.put("stats_type", new Atom<>("client")); // updateColumns.put("survey_interval_ms", new Atom<>(0) ); - // updateColumns.put("survey_type", new Atom<>("on-chan") ); + updateColumns.put("survey_type", new Atom<>("on-chan")); // updateColumns.put("threshold", thresholds ); row = new Row(updateColumns); @@ -1692,11 +1654,13 @@ public class OvsdbDao { updateColumns = new HashMap<>(); // updateColumns.put("channel_list", channels ); updateColumns.put("radio_type", new Atom<>("2.4G")); + updateColumns.put("report_type", new Atom<>("average")); + updateColumns.put("reporting_interval", new Atom<>(60)); updateColumns.put("sampling_interval", new Atom<>(10)); updateColumns.put("stats_type", new Atom<>("client")); // updateColumns.put("survey_interval_ms", new Atom<>(0) ); - // updateColumns.put("survey_type", new Atom<>("on-chan") ); + updateColumns.put("survey_type", new Atom<>("on-chan")); // updateColumns.put("threshold", thresholds ); row = new Row(updateColumns); @@ -1759,12 +1723,13 @@ public class OvsdbDao { updateColumns = new HashMap<>(); updateColumns.put("radio_type", new Atom<>(band)); updateColumns.put("reporting_interval", new Atom<>(120)); - updateColumns.put("sampling_interval", new Atom<>(0)); + updateColumns.put("sampling_interval", new Atom<>(10)); + updateColumns.put("report_type", new Atom<>("average")); updateColumns.put("stats_type", new Atom<>("rssi")); updateColumns.put("survey_interval_ms", new Atom<>(0)); updateColumns.put("survey_type", new Atom<>("on-chan")); row = new Row(updateColumns); - + if (provisionedWifiStatsConfigs.containsKey(band + "_rssi_onChannel")) { operations.add(new Update(wifiStatsConfigDbTable, row)); } else {