TW-208: Notified Table Status changes to ExternalInterfaceKDC

This commit is contained in:
Mike Hansen
2020-03-30 20:55:38 -04:00
parent 03e627fb26
commit fde8eabf91
4 changed files with 169 additions and 133 deletions

View File

@@ -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 <String,Value> row,String apId);
void deviceStatusChanged(Map <String,Value> row,String apId);
void networkStatusChanged(Map <String,Value> row,String apId);
void processMqttMessage(String topic, Report report);
void processMqttMessage(String topic, FlowReport flowReport);
void processMqttMessage(String topic, WCStatsReport wcStatsReport);
void handleClientsChanged(Map <String,Value> row, String connectedClientId);
void awlanChanged(Map <String,Value> row, String connectedClientId);
}

View File

@@ -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<String, com.vmware.ovsdb.protocol.operation.notation.Value> row,
String apId) {
// TODO Auto-generated method stub
}
@Override
public void deviceStatusChanged(Map<String, com.vmware.ovsdb.protocol.operation.notation.Value> row, String apId) {
// TODO Auto-generated method stub
}
@Override
public void networkStatusChanged(Map<String, com.vmware.ovsdb.protocol.operation.notation.Value> row, String apId) {
// TODO Auto-generated method stub
}
@Override
public void handleClientsChanged(Map<String, com.vmware.ovsdb.protocol.operation.notation.Value> row,
String connectedClientId) {
// TODO Auto-generated method stub
}
@Override
public void awlanChanged(Map<String, com.vmware.ovsdb.protocol.operation.notation.Value> row,
String connectedClientId) {
// TODO Auto-generated method stub
}
}

View File

@@ -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<String> tableNames = tableUpdates.getTableUpdates().keySet();
for (String name : tableNames) {
LOG.trace("Receive update for table {}", name);
if (name.equals(OvsdbDao.wifiAssociatedClientsDbTable)) {
Map<UUID, RowUpdate> updates = tableUpdates.getTableUpdates().get(name).getRowUpdates();
for (UUID id : updates.keySet()) {
Map<UUID, RowUpdate> 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<String> 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<UUID, RowUpdate> 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<UUID, RowUpdate> 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<UUID, RowUpdate> 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<UUID, RowUpdate> 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

View File

@@ -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<String> 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<String> 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<String> 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 {