diff --git a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/ConnectusOvsdbClientInterface.java b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/ConnectusOvsdbClientInterface.java index e181d43..37919e5 100644 --- a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/ConnectusOvsdbClientInterface.java +++ b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/ConnectusOvsdbClientInterface.java @@ -3,6 +3,22 @@ package com.telecominfraproject.wlan.opensync.external.integration; import java.util.Set; public interface ConnectusOvsdbClientInterface { + + static final String[] AWLAN_NODE_DB_TABLE_COLUMNS = new String[] { "device_mode", "id", "model", + "serial_number", "firmware_version", "platform_version", "redirector_addr" }; + + static final String[] WIFI_VIF_STATE_DB_TABLE_COLUMNS = new String[] { "min_hw_mode", "if_name", "security", + "bridge", "channel", "enabled", "ssid_broadcast", "mac", "ssid" }; + + static final String[] WIFI_INET_STATE_DB_TABLE_COLUMNS = new String[] { "hwaddr", "if_type", "if_name", + "inet_addr", "dhcpc", "network" }; + + static final String[] WIFI_RADIO_STATE_DB_TABLE_COLUMNS = new String[] { "ht_mode", "hw_mode", "hw_params", + "hw_type", "mac", "if_name", "freq_band", "country", "channel" }; + + static final String[] WIFI_ASSOCIATED_CLIENTS_DB_TABLE_COLUMNS = new String[] { "mac" }; + + Set getConnectedClientIds(); String changeRedirectorAddress(String apId, String newRedirectorAddress); void processConfigChanged(String apId); 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 232d334..f0588e4 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 @@ -4,7 +4,6 @@ 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; @@ -13,15 +12,19 @@ import wc.stats.IpDnsTelemetry.WCStatsReport; public interface OpensyncExternalIntegrationInterface { void apConnected(String apId, ConnectNodeInfo connectNodeInfo); + public enum RowUpdateOperation { + INIT, INSERT, DELETE, MODIFY + } + void apDisconnected(String apId); OpensyncAPConfig getApConfig(String apId); - void wifiVIFStateDbTableUpdate(Map row,String apId); + void wifiVIFStateDbTableUpdate(Map row, String apId, RowUpdateOperation operation); - void wifiRadioStatusDbTableUpdate(Map row,String apId); + void wifiRadioStatusDbTableUpdate(Map row, String apId, RowUpdateOperation operation); - void wifiInetStateDbTableUpdate(Map row,String apId); + void wifiInetStateDbTableUpdate(Map row, String apId, RowUpdateOperation operation); void processMqttMessage(String topic, Report report); @@ -29,7 +32,7 @@ public interface OpensyncExternalIntegrationInterface { void processMqttMessage(String topic, WCStatsReport wcStatsReport); - void handleClientsChanged(Map row, String connectedClientId); - - void awlanChanged(Map row, String connectedClientId); + void wifiAssociatedClientsDbTableUpdate(Map row, String apId, RowUpdateOperation operation); + + void awlan_NodeDbTableUpdate(Map row, String connectedClientId, RowUpdateOperation operation); } 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 ddc0218..6b67b23 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 @@ -97,34 +97,34 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr } @Override - public void wifiVIFStateDbTableUpdate(Map row, - String apId) { + public void wifiVIFStateDbTableUpdate(Map row, + String apId, RowUpdateOperation operation) { // TODO Auto-generated method stub } @Override - public void wifiRadioStatusDbTableUpdate(Map row, String apId) { + public void wifiRadioStatusDbTableUpdate(Map row, String apId, RowUpdateOperation operation) { // TODO Auto-generated method stub } @Override - public void wifiInetStateDbTableUpdate(Map row, String apId) { + public void wifiInetStateDbTableUpdate(Map row, String apId, RowUpdateOperation operation) { // TODO Auto-generated method stub } @Override - public void handleClientsChanged(Map row, - String connectedClientId) { + public void wifiAssociatedClientsDbTableUpdate(Map row, + String apId, RowUpdateOperation operation) { // TODO Auto-generated method stub } @Override - public void awlanChanged(Map row, - String connectedClientId) { + public void awlan_NodeDbTableUpdate(Map row, String connectedClientId, + RowUpdateOperation operation) { // 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 38a55ce..e825eb5 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.Arrays; +import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -31,6 +32,7 @@ import com.vmware.ovsdb.protocol.methods.MonitorRequests; import com.vmware.ovsdb.protocol.methods.MonitorSelect; 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.service.OvsdbClient; import com.vmware.ovsdb.service.OvsdbPassiveConnectionListener; @@ -40,18 +42,6 @@ import io.netty.handler.ssl.SslContext; @Component public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { - private static final String[] AWLAN_NODE_DB_TABLE_COLUMNS = new String[] { "device_mode", "id", "model", - "serial_number", "firmware_version", "platform_version", "redirector_addr" }; - - private static final String[] WIFI_VIF_STATE_DB_TABLE_COLUMNS = new String[] { "min_hw_mode", "if_name", "security", - "bridge", "channel", "enabled", "ssid_broadcast", "mac", "ssid" }; - - private static final String[] WIFI_INET_STATE_DB_TABLE_COLUMNS = new String[] { "hwaddr", "if_type", "if_name", - "inet_addr", "dhcpc", "network" }; - - private static final String[] WIFI_RADIO_STATE_DB_TABLE_COLUMNS = new String[] { "ht_mode", "hw_mode", "hw_params", - "hw_type", "mac", "if_name", "freq_band", "country", "channel" }; - private static final Logger LOG = LoggerFactory.getLogger(ConnectusOvsdbClient.class); @org.springframework.beans.factory.annotation.Value("${connectus.ovsdb.listenPort:6640}") @@ -126,8 +116,25 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { tableUpdates.getTableUpdates().entrySet().stream().forEach(e -> { Map rowUpdates = e.getValue().getRowUpdates(); for (UUID uuid : rowUpdates.keySet()) { - extIntegrationInterface.wifiRadioStatusDbTableUpdate( - rowUpdates.get(uuid).getNew().getColumns(), key); + // initial, insert, modify, + // null if delete + Row newRow = rowUpdates.get(uuid).getNew(); + // delete, modify, null if + // init or insert + Row oldRow = rowUpdates.get(uuid).getOld(); + Map rowContents = new HashMap(); + + if (oldRow != null && newRow.getColumns().keySet() + .containsAll(oldRow.getColumns().keySet())) { + for (String column : oldRow.getColumns().keySet()) { + rowContents.put(column, + ovsdbDao.getSingleValueFromSet(newRow, column)); + } + extIntegrationInterface.wifiRadioStatusDbTableUpdate( + rowContents, key, + OpensyncExternalIntegrationInterface.RowUpdateOperation.MODIFY); + } + } }); @@ -149,8 +156,42 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { tableUpdates.getTableUpdates().entrySet().stream().forEach(e -> { Map rowUpdates = e.getValue().getRowUpdates(); for (UUID uuid : rowUpdates.keySet()) { - extIntegrationInterface.wifiInetStateDbTableUpdate( - rowUpdates.get(uuid).getNew().getColumns(), key); + // initial, insert, modify, + // null if delete + Row newRow = rowUpdates.get(uuid).getNew(); + // delete, modify, null if + // init or insert + Row oldRow = rowUpdates.get(uuid).getOld(); + Map rowContents = new HashMap(); + + if (oldRow == null) { + // row init, or insert + for (String column : newRow.getColumns().keySet()) { + rowContents.put(column, + ovsdbDao.getSingleValueFromSet(newRow, column)); + } + extIntegrationInterface.wifiInetStateDbTableUpdate(rowContents, + key, + OpensyncExternalIntegrationInterface.RowUpdateOperation.INSERT); + } else if (newRow == null) { + for (String column : oldRow.getColumns().keySet()) { + rowContents.put(column, + ovsdbDao.getSingleValueFromSet(oldRow, column)); + } + extIntegrationInterface.wifiInetStateDbTableUpdate(rowContents, + key, + OpensyncExternalIntegrationInterface.RowUpdateOperation.DELETE); + } else if (newRow.getColumns().keySet() + .containsAll(oldRow.getColumns().keySet())) { + for (String column : oldRow.getColumns().keySet()) { + rowContents.put(column, + ovsdbDao.getSingleValueFromSet(newRow, column)); + } + extIntegrationInterface.wifiInetStateDbTableUpdate(rowContents, + key, + OpensyncExternalIntegrationInterface.RowUpdateOperation.MODIFY); + } + } }); @@ -163,7 +204,7 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { .monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiVifStateDbTable, new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiVifStateDbTable, new MonitorRequest(Arrays.asList(WIFI_VIF_STATE_DB_TABLE_COLUMNS), - new MonitorSelect(true, false, false, true)))), + new MonitorSelect(true, true, true, true)))), new MonitorCallback() { @Override @@ -172,8 +213,42 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { tableUpdates.getTableUpdates().entrySet().stream().forEach(e -> { Map rowUpdates = e.getValue().getRowUpdates(); for (UUID uuid : rowUpdates.keySet()) { - extIntegrationInterface.wifiVIFStateDbTableUpdate( - rowUpdates.get(uuid).getNew().getColumns(), key); + // initial, insert, modify, + // null if delete + Row newRow = rowUpdates.get(uuid).getNew(); + // delete, modify, null if + // init or insert + Row oldRow = rowUpdates.get(uuid).getOld(); + Map rowContents = new HashMap(); + + if (oldRow == null) { + // row init, or insert + for (String column : newRow.getColumns().keySet()) { + rowContents.put(column, + ovsdbDao.getSingleValueFromSet(newRow, column)); + } + extIntegrationInterface.wifiVIFStateDbTableUpdate(rowContents, + key, + OpensyncExternalIntegrationInterface.RowUpdateOperation.INSERT); + } else if (newRow == null) { + for (String column : oldRow.getColumns().keySet()) { + rowContents.put(column, + ovsdbDao.getSingleValueFromSet(oldRow, column)); + } + extIntegrationInterface.wifiVIFStateDbTableUpdate(rowContents, + key, + OpensyncExternalIntegrationInterface.RowUpdateOperation.DELETE); + } else if (newRow.getColumns().keySet() + .containsAll(oldRow.getColumns().keySet())) { + for (String column : oldRow.getColumns().keySet()) { + rowContents.put(column, + ovsdbDao.getSingleValueFromSet(newRow, column)); + } + extIntegrationInterface.wifiVIFStateDbTableUpdate(rowContents, + key, + OpensyncExternalIntegrationInterface.RowUpdateOperation.MODIFY); + } + } }); @@ -194,8 +269,72 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { tableUpdates.getTableUpdates().entrySet().stream().forEach(e -> { Map rowUpdates = e.getValue().getRowUpdates(); for (UUID uuid : rowUpdates.keySet()) { - extIntegrationInterface.awlanChanged( - rowUpdates.get(uuid).getNew().getColumns(), key); + // initial, insert, modify, + // null if delete + Row newRow = rowUpdates.get(uuid).getNew(); + // delete, modify, null if + // init or insert + Row oldRow = rowUpdates.get(uuid).getOld(); + Map rowContents = new HashMap(); + + if (oldRow != null && newRow.getColumns().keySet() + .containsAll(oldRow.getColumns().keySet())) { + for (String column : oldRow.getColumns().keySet()) { + rowContents.put(column, + ovsdbDao.getSingleValueFromSet(newRow, column)); + } + extIntegrationInterface.awlan_NodeDbTableUpdate(rowContents, + key, + OpensyncExternalIntegrationInterface.RowUpdateOperation.MODIFY); + } + + } + }); + + } + + }); + + ovsdbClient + .monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiAssociatedClientsDbTable, + new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiAssociatedClientsDbTable, + new MonitorRequest(Arrays.asList(WIFI_ASSOCIATED_CLIENTS_DB_TABLE_COLUMNS), + new MonitorSelect(true, true, true, false)))), + new MonitorCallback() { + + @Override + public void update(TableUpdates tableUpdates) { + + tableUpdates.getTableUpdates().entrySet().stream().forEach(e -> { + Map rowUpdates = e.getValue().getRowUpdates(); + for (UUID uuid : rowUpdates.keySet()) { + // initial, insert, modify, + // null if delete + Row newRow = rowUpdates.get(uuid).getNew(); + // delete, modify, null if + // init or insert + Row oldRow = rowUpdates.get(uuid).getOld(); + Map rowContents = new HashMap(); + + if (oldRow == null) { + // row init, or insert + for (String column : newRow.getColumns().keySet()) { + rowContents.put(column, + ovsdbDao.getSingleValueFromSet(newRow, column)); + } + extIntegrationInterface.wifiAssociatedClientsDbTableUpdate( + rowContents, key, + OpensyncExternalIntegrationInterface.RowUpdateOperation.INSERT); + } else if (newRow == null) { + for (String column : oldRow.getColumns().keySet()) { + rowContents.put(column, + ovsdbDao.getSingleValueFromSet(oldRow, column)); + } + extIntegrationInterface.wifiAssociatedClientsDbTableUpdate( + rowContents, key, + OpensyncExternalIntegrationInterface.RowUpdateOperation.DELETE); + } + } });