WIFI-1601: Bulk Send for SSID Profile provision

WIFI-1602: Change configuration order to reduce UCI resets
This commit is contained in:
Mike Hansen
2021-02-18 17:30:50 -05:00
parent aefc799975
commit 85bf7e8f98
7 changed files with 526 additions and 790 deletions

View File

@@ -1,21 +1,5 @@
package com.telecominfraproject.wlan.opensync.ovsdb; package com.telecominfraproject.wlan.opensync.ovsdb;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress; import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.equipment.RadioType; import com.telecominfraproject.wlan.core.model.equipment.RadioType;
@@ -24,28 +8,27 @@ import com.telecominfraproject.wlan.opensync.external.integration.OpensyncExtern
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbClientInterface; import com.telecominfraproject.wlan.opensync.external.integration.OvsdbClientInterface;
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSession; import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSession;
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSessionMapInterface; import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSessionMapInterface;
import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo; import com.telecominfraproject.wlan.opensync.external.integration.models.*;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPInetState;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPVIFState;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncWifiAssociatedClients;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDao; import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDao;
import com.telecominfraproject.wlan.opensync.util.OvsdbStringConstants; import com.telecominfraproject.wlan.opensync.util.OvsdbStringConstants;
import com.telecominfraproject.wlan.opensync.util.SslUtil; import com.telecominfraproject.wlan.opensync.util.SslUtil;
import com.vmware.ovsdb.callback.ConnectionCallback; import com.vmware.ovsdb.callback.ConnectionCallback;
import com.vmware.ovsdb.callback.MonitorCallback;
import com.vmware.ovsdb.exception.OvsdbClientException; import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.methods.MonitorRequest; import com.vmware.ovsdb.protocol.methods.*;
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.TableUpdate;
import com.vmware.ovsdb.protocol.methods.TableUpdates;
import com.vmware.ovsdb.protocol.operation.notation.Row; import com.vmware.ovsdb.protocol.operation.notation.Row;
import com.vmware.ovsdb.service.OvsdbClient; import com.vmware.ovsdb.service.OvsdbClient;
import com.vmware.ovsdb.service.OvsdbPassiveConnectionListener; import com.vmware.ovsdb.service.OvsdbPassiveConnectionListener;
import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.security.cert.X509Certificate;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@Profile("ovsdb_manager") @Profile("ovsdb_manager")
@Component @Component
@@ -65,9 +48,6 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
@org.springframework.beans.factory.annotation.Value("${tip.wlan.defaultCommandDurationSec:3600}") @org.springframework.beans.factory.annotation.Value("${tip.wlan.defaultCommandDurationSec:3600}")
private long defaultCommandDurationSec; private long defaultCommandDurationSec;
@org.springframework.beans.factory.annotation.Value("${tip.wlan.defaultCommandDelaySec:60}")
private long defaultCommandDelaySec;
@Autowired @Autowired
private SslContext sslContext; private SslContext sslContext;
@@ -100,7 +80,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
String remoteHost = ovsdbClient.getConnectionInfo().getRemoteAddress().getHostAddress(); String remoteHost = ovsdbClient.getConnectionInfo().getRemoteAddress().getHostAddress();
int localPort = ovsdbClient.getConnectionInfo().getLocalPort(); int localPort = ovsdbClient.getConnectionInfo().getLocalPort();
String subjectDn = null; String subjectDn;
try { try {
subjectDn = ((X509Certificate) ovsdbClient.getConnectionInfo().getRemoteCertificate()) subjectDn = ((X509Certificate) ovsdbClient.getConnectionInfo().getRemoteCertificate())
.getSubjectDN().getName(); .getSubjectDN().getName();
@@ -118,8 +98,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
extIntegrationInterface.apConnected(key, connectNodeInfo); extIntegrationInterface.apConnected(key, connectNodeInfo);
// push configuration to AP processConnectRequest(ovsdbClient, clientCn, connectNodeInfo);
connectNodeInfo = processConnectRequest(ovsdbClient, clientCn, connectNodeInfo);
monitorOvsdbStateTables(ovsdbClient, key); monitorOvsdbStateTables(ovsdbClient, key);
@@ -130,12 +109,10 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
LOG.error("autoprovisioning error {}", e.getMessage(), e); LOG.error("autoprovisioning error {}", e.getMessage(), e);
// something is wrong with the SSL // something is wrong with the SSL
ovsdbClient.shutdown(); ovsdbClient.shutdown();
return;
} catch (Exception e) { } catch (Exception e) {
LOG.error("ovsdbClient error", e); LOG.error("ovsdbClient error", e);
// something is wrong with the SSL // something is wrong with the SSL
ovsdbClient.shutdown(); ovsdbClient.shutdown();
return;
} }
} }
@@ -184,7 +161,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
try { try {
ovsdbClient.shutdown(); ovsdbClient.shutdown();
} catch (Exception e) { } catch (Exception e) {
LOG.info("Caught Exception shutting down ovsdb client, may have already been disconnected {}", LOG.error("Caught Exception shutting down ovsdb client, may have already been disconnected",
e); e);
} }
@@ -199,8 +176,8 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
LOG.info("Manager waiting for connection on port {}...", ovsdbListenPort); LOG.info("Manager waiting for connection on port {}...", ovsdbListenPort);
} }
private ConnectNodeInfo processConnectRequest(OvsdbClient ovsdbClient, String clientCn, private void processConnectRequest(OvsdbClient ovsdbClient, String clientCn,
ConnectNodeInfo connectNodeInfo) { ConnectNodeInfo connectNodeInfo) {
LOG.debug("Starting Client connect"); LOG.debug("Starting Client connect");
connectNodeInfo = ovsdbDao.updateConnectNodeInfoOnConnect(ovsdbClient, clientCn, connectNodeInfo, connectNodeInfo = ovsdbDao.updateConnectNodeInfoOnConnect(ovsdbClient, clientCn, connectNodeInfo,
@@ -224,17 +201,16 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
if (opensyncAPConfig != null) { if (opensyncAPConfig != null) {
ovsdbDao.configureNtpServer(ovsdbClient, opensyncAPConfig); ovsdbDao.configureNtpServer(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWifiRadios(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig); ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig); ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig);
ovsdbDao.createVlanNetworkInterfaces(ovsdbClient, opensyncAPConfig); ovsdbDao.createVlanNetworkInterfaces(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig); ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig);
if (opensyncAPConfig.getHotspotConfig() != null) { if (opensyncAPConfig.getHotspotConfig() != null) {
ovsdbDao.configureHotspots(ovsdbClient, opensyncAPConfig); ovsdbDao.configureHotspots(ovsdbClient, opensyncAPConfig);
} }
ovsdbDao.configureInterfaces(ovsdbClient); ovsdbDao.configureInterfaces(ovsdbClient);
ovsdbDao.configureWifiRadios(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureStatsFromProfile(ovsdbClient, opensyncAPConfig); ovsdbDao.configureStatsFromProfile(ovsdbClient, opensyncAPConfig);
if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) { if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) {
@@ -247,7 +223,6 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
} }
LOG.debug("Client connect Done"); LOG.debug("Client connect Done");
return connectNodeInfo;
} }
@Override @Override
@@ -267,9 +242,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
throw new IllegalStateException("AP with id " + apId + " is not connected"); throw new IllegalStateException("AP with id " + apId + " is not connected");
} }
String ret = ovsdbDao.changeRedirectorAddress(ovsdbSession.getOvsdbClient(), apId, newRedirectorAddress); return ovsdbDao.changeRedirectorAddress(ovsdbSession.getOvsdbClient(), apId, newRedirectorAddress);
return ret;
} }
@Override @Override
@@ -293,11 +266,9 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
ovsdbDao.removeAllSsids(ovsdbClient); // always ovsdbDao.removeAllSsids(ovsdbClient); // always
ovsdbDao.removeAllInetConfigs(ovsdbClient); ovsdbDao.removeAllInetConfigs(ovsdbClient);
ovsdbDao.removeWifiRrm(ovsdbClient); ovsdbDao.removeWifiRrm(ovsdbClient);
ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always
extIntegrationInterface.clearEquipmentStatus(apId); extIntegrationInterface.clearEquipmentStatus(apId);
ovsdbDao.configureNtpServer(ovsdbClient, opensyncAPConfig); ovsdbDao.configureNtpServer(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWifiRadios(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig); ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig); ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig);
ovsdbDao.createVlanNetworkInterfaces(ovsdbClient, opensyncAPConfig); ovsdbDao.createVlanNetworkInterfaces(ovsdbClient, opensyncAPConfig);
@@ -308,12 +279,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
} }
ovsdbDao.configureInterfaces(ovsdbClient); ovsdbDao.configureInterfaces(ovsdbClient);
ovsdbDao.configureWifiRadios(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureStatsFromProfile(ovsdbClient, opensyncAPConfig);
if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) {
ovsdbDao.updateDeviceStatsReportingInterval(ovsdbClient, collectionIntervalSecDeviceStats);
}
ovsdbDao.updateEventReportingInterval(ovsdbClient, collectionIntervalSecEvent);
LOG.debug("Finished processConfigChanged for {}", apId); LOG.debug("Finished processConfigChanged for {}", apId);
} }
@@ -404,75 +370,64 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
OvsdbDao.dhcpLeasedIpDbTable + "_" + key, OvsdbDao.dhcpLeasedIpDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.dhcpLeasedIpDbTable, new MonitorRequests(ImmutableMap.of(OvsdbDao.dhcpLeasedIpDbTable,
new MonitorRequest(new MonitorSelect(true, true, true, true)))), new MonitorRequest(new MonitorSelect(true, true, true, true)))),
new MonitorCallback() { tableUpdates -> {
try {
LOG.info(OvsdbDao.dhcpLeasedIpDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
@Override List<Map<String, String>> insert = new ArrayList<>();
public void update(TableUpdates tableUpdates) { List<Map<String, String>> delete = new ArrayList<>();
try { List<Map<String, String>> update = new ArrayList<>();
LOG.info(OvsdbDao.dhcpLeasedIpDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
List<Map<String, String>> insert = new ArrayList<>(); for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
List<Map<String, String>> delete = new ArrayList<>(); for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
List<Map<String, String>> update = new ArrayList<>();
for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) { if (rowUpdate.getNew() == null) {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) { Map<String, String> rowMap = new HashMap<>();
if (rowUpdate.getNew() == null) { rowUpdate.getOld().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
Map<String, String> rowMap = new HashMap<>();
rowUpdate.getOld().getColumns().entrySet().stream().forEach(c -> { delete.add(rowMap);
OvsdbDao.translateDhcpFpValueToString(c, rowMap); // delete
}); } else if (rowUpdate.getOld() == null) {
// insert
Map<String, String> rowMap = new HashMap<>();
delete.add(rowMap); rowUpdate.getNew().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
// delete
} else if (rowUpdate.getOld() == null) {
// insert
Map<String, String> rowMap = new HashMap<>();
rowUpdate.getNew().getColumns().entrySet().stream().forEach(c -> { insert.add(rowMap);
OvsdbDao.translateDhcpFpValueToString(c, rowMap); } else {
});
insert.add(rowMap); // insert
} else { Map<String, String> rowMap = new HashMap<>();
// insert rowUpdate.getOld().getColumns().putAll(rowUpdate.getNew().getColumns());
Map<String, String> rowMap = new HashMap<>(); rowUpdate.getOld().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
rowUpdate.getOld().getColumns().putAll(rowUpdate.getNew().getColumns()); update.add(rowMap);
rowUpdate.getOld().getColumns().entrySet().stream().forEach(c -> {
OvsdbDao.translateDhcpFpValueToString(c, rowMap);
});
update.add(rowMap);
}
} }
} }
if (!insert.isEmpty()) {
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(insert, key,
RowUpdateOperation.INSERT);
}
if (!delete.isEmpty()) {
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(delete, key,
RowUpdateOperation.DELETE);
}
if (!update.isEmpty()) {
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(update, key,
RowUpdateOperation.MODIFY);
}
} catch (Exception e) {
LOG.error("dhcpLeasedIpDbTableUpdate failed", e);
} }
if (!insert.isEmpty()) {
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(insert, key,
RowUpdateOperation.INSERT);
}
if (!delete.isEmpty()) {
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(delete, key,
RowUpdateOperation.DELETE);
}
if (!update.isEmpty()) {
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(update, key,
RowUpdateOperation.MODIFY);
}
} catch (Exception e) {
LOG.error("dhcpLeasedIpDbTableUpdate failed", e);
} }
}); });
@@ -486,75 +441,64 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
CompletableFuture<TableUpdates> csCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, CompletableFuture<TableUpdates> csCf = ovsdbClient.monitor(OvsdbDao.ovsdbName,
OvsdbDao.commandStateDbTable + "_" + key, OvsdbDao.commandStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.commandStateDbTable, new MonitorRequest())), new MonitorRequests(ImmutableMap.of(OvsdbDao.commandStateDbTable, new MonitorRequest())),
new MonitorCallback() { tableUpdates -> {
try {
LOG.info(OvsdbDao.commandStateDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
@Override List<Map<String, String>> insert = new ArrayList<>();
public void update(TableUpdates tableUpdates) { List<Map<String, String>> delete = new ArrayList<>();
try { List<Map<String, String>> update = new ArrayList<>();
LOG.info(OvsdbDao.commandStateDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
List<Map<String, String>> insert = new ArrayList<>(); for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
List<Map<String, String>> delete = new ArrayList<>(); for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
List<Map<String, String>> update = new ArrayList<>();
for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) { if (rowUpdate.getNew() == null) {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) { Map<String, String> rowMap = new HashMap<>();
if (rowUpdate.getNew() == null) { rowUpdate.getOld().getColumns().forEach((key1, value) -> rowMap.put(key1, value.toString()));
Map<String, String> rowMap = new HashMap<>();
rowUpdate.getOld().getColumns().entrySet().stream().forEach(c -> { delete.add(rowMap);
rowMap.put(c.getKey(), c.getValue().toString()); // delete
}); } else if (rowUpdate.getOld() == null) {
// insert
Map<String, String> rowMap = new HashMap<>();
delete.add(rowMap); rowUpdate.getNew().getColumns().forEach((key1, value) -> rowMap.put(key1, value.toString()));
// delete
} else if (rowUpdate.getOld() == null) {
// insert
Map<String, String> rowMap = new HashMap<>();
rowUpdate.getNew().getColumns().entrySet().stream().forEach(c -> { insert.add(rowMap);
rowMap.put(c.getKey(), c.getValue().toString()); } else {
});
insert.add(rowMap); // insert
} else { Map<String, String> rowMap = new HashMap<>();
// insert rowUpdate.getOld().getColumns().putAll(rowUpdate.getNew().getColumns());
Map<String, String> rowMap = new HashMap<>(); rowUpdate.getOld().getColumns().forEach((key1, value) -> rowMap.put(key1, value.toString()));
rowUpdate.getOld().getColumns().putAll(rowUpdate.getNew().getColumns()); update.add(rowMap);
rowUpdate.getOld().getColumns().entrySet().stream().forEach(c -> {
rowMap.put(c.getKey(), c.getValue().toString());
});
update.add(rowMap);
}
} }
} }
if (!insert.isEmpty()) {
extIntegrationInterface.commandStateDbTableUpdate(insert, key,
RowUpdateOperation.INSERT);
}
if (!delete.isEmpty()) {
extIntegrationInterface.commandStateDbTableUpdate(delete, key,
RowUpdateOperation.DELETE);
}
if (!update.isEmpty()) {
extIntegrationInterface.commandStateDbTableUpdate(update, key,
RowUpdateOperation.MODIFY);
}
} catch (Exception e) {
LOG.error("commandStateDbTableUpdate failed", e);
} }
if (!insert.isEmpty()) {
extIntegrationInterface.commandStateDbTableUpdate(insert, key,
RowUpdateOperation.INSERT);
}
if (!delete.isEmpty()) {
extIntegrationInterface.commandStateDbTableUpdate(delete, key,
RowUpdateOperation.DELETE);
}
if (!update.isEmpty()) {
extIntegrationInterface.commandStateDbTableUpdate(update, key,
RowUpdateOperation.MODIFY);
}
} catch (Exception e) {
LOG.error("commandStateDbTableUpdate failed", e);
} }
}); });
@@ -567,21 +511,16 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
CompletableFuture<TableUpdates> awCf = ovsdbClient.monitor( CompletableFuture<TableUpdates> awCf = ovsdbClient.monitor(
OvsdbDao.ovsdbName, OvsdbDao.awlanNodeDbTable + "_" + key, new MonitorRequests(ImmutableMap OvsdbDao.ovsdbName, OvsdbDao.awlanNodeDbTable + "_" + key, new MonitorRequests(ImmutableMap
.of(OvsdbDao.awlanNodeDbTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))), .of(OvsdbDao.awlanNodeDbTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))),
new MonitorCallback() { tableUpdates -> {
try {
LOG.info(OvsdbDao.awlanNodeDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
@Override extIntegrationInterface.awlanNodeDbTableUpdate(
public void update(TableUpdates tableUpdates) { ovsdbDao.getOpensyncAWLANNode(tableUpdates, key, ovsdbClient), key);
try { } catch (Exception e) {
LOG.info(OvsdbDao.awlanNodeDbTable + "_" + key + " monitor callback received {}", LOG.error("awlanNodeDbTableUpdate failed", e);
tableUpdates);
extIntegrationInterface.awlanNodeDbTableUpdate(
ovsdbDao.getOpensyncAWLANNode(tableUpdates, key, ovsdbClient), key);
} catch (Exception e) {
LOG.error("awlanNodeDbTableUpdate failed", e);
}
} }
}); });
extIntegrationInterface.awlanNodeDbTableUpdate(ovsdbDao.getOpensyncAWLANNode(awCf.join(), key, ovsdbClient), extIntegrationInterface.awlanNodeDbTableUpdate(ovsdbDao.getOpensyncAWLANNode(awCf.join(), key, ovsdbClient),
@@ -592,45 +531,40 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
CompletableFuture<TableUpdates> acCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, CompletableFuture<TableUpdates> acCf = ovsdbClient.monitor(OvsdbDao.ovsdbName,
OvsdbDao.wifiAssociatedClientsDbTable + "_" + key, OvsdbDao.wifiAssociatedClientsDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiAssociatedClientsDbTable, new MonitorRequest())), new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiAssociatedClientsDbTable, new MonitorRequest())),
new MonitorCallback() { tableUpdates -> {
@Override try {
public void update(TableUpdates tableUpdates) { LOG.info(
OvsdbDao.wifiAssociatedClientsDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
try { List<OpensyncWifiAssociatedClients> associatedClients = new ArrayList<>();
LOG.info(
OvsdbDao.wifiAssociatedClientsDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
List<OpensyncWifiAssociatedClients> associatedClients = new ArrayList<>(); for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) { for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
if ((rowUpdate.getOld() != null) && (rowUpdate.getNew() == null)) {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) { Row row = rowUpdate.getOld();
if ((rowUpdate.getOld() != null) && (rowUpdate.getNew() == null)) { String deletedClientMac = row.getStringColumn("mac");
Row row = rowUpdate.getOld(); // take care of the deletes as we go
String deletedClientMac = row.getStringColumn("mac"); // through
// take care of the deletes as we go // the updates, as we want to delete
// through // before
// the updates, as we want to delete // adding anyway.
// before extIntegrationInterface.wifiAssociatedClientsDbTableDelete(deletedClientMac,
// adding anyway. key);
extIntegrationInterface.wifiAssociatedClientsDbTableDelete(deletedClientMac, } else {
key); associatedClients.addAll(
} else { ovsdbDao.getOpensyncWifiAssociatedClients(rowUpdate, key, ovsdbClient));
associatedClients.addAll(
ovsdbDao.getOpensyncWifiAssociatedClients(rowUpdate, key, ovsdbClient));
}
} }
} }
// now address the update/add
extIntegrationInterface.wifiAssociatedClientsDbTableUpdate(associatedClients, key);
} catch (Exception e) {
LOG.error("wifiAssociatedClientsDbTableUpdate failed", e);
} }
// now address the update/add
extIntegrationInterface.wifiAssociatedClientsDbTableUpdate(associatedClients, key);
} catch (Exception e) {
LOG.error("wifiAssociatedClientsDbTableUpdate failed", e);
} }
}); });
@@ -645,42 +579,35 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
OvsdbDao.wifiInetStateDbTable + "_" + key, OvsdbDao.wifiInetStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiInetStateDbTable, new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiInetStateDbTable,
new MonitorRequest(new MonitorSelect(true, true, true, true)))), new MonitorRequest(new MonitorSelect(true, true, true, true)))),
new MonitorCallback() { tableUpdates -> {
try {
LOG.info(OvsdbDao.wifiInetStateDbTable + "_" + key + " monitor callback received {}", tableUpdates);
@Override List<OpensyncAPInetState> inetStateInsertOrUpdate = new ArrayList<>();
public void update(TableUpdates tableUpdates) { List<OpensyncAPInetState> inetStateDelete = new ArrayList<>();
try {
LOG.info(OvsdbDao.ovsdbName,
OvsdbDao.wifiInetStateDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
List<OpensyncAPInetState> inetStateInsertOrUpdate = new ArrayList<>(); for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
List<OpensyncAPInetState> inetStateDelete = new ArrayList<>();
for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) { for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
if (rowUpdate.getNew() == null) {
inetStateDelete.addAll(ovsdbDao.getOpensyncApInetStateForRowUpdate(rowUpdate,
key, ovsdbClient));
} else {
inetStateInsertOrUpdate.addAll(ovsdbDao
.getOpensyncApInetStateForRowUpdate(rowUpdate, key, ovsdbClient));
}
if (rowUpdate.getNew() == null) {
inetStateDelete.addAll(ovsdbDao.getOpensyncApInetStateForRowUpdate(rowUpdate,
key, ovsdbClient));
} else {
inetStateInsertOrUpdate.addAll(ovsdbDao
.getOpensyncApInetStateForRowUpdate(rowUpdate, key, ovsdbClient));
} }
} }
// delete first
extIntegrationInterface.wifiInetStateDbTableUpdate(inetStateDelete, key);
// now process updates and mutations
extIntegrationInterface.wifiInetStateDbTableUpdate(inetStateInsertOrUpdate, key);
} catch (Exception e) {
LOG.error("wifiInetStateDbTableUpdate failed", e);
} }
// delete first
extIntegrationInterface.wifiInetStateDbTableUpdate(inetStateDelete, key);
// now process updates and mutations
extIntegrationInterface.wifiInetStateDbTableUpdate(inetStateInsertOrUpdate, key);
} catch (Exception e) {
LOG.error("wifiInetStateDbTableUpdate failed", e);
} }
}); });
@@ -696,21 +623,16 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
OvsdbDao.wifiRadioStateDbTable + "_" + key, OvsdbDao.wifiRadioStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiRadioStateDbTable, new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiRadioStateDbTable,
new MonitorRequest(new MonitorSelect(true, true, true, true)))), new MonitorRequest(new MonitorSelect(true, true, true, true)))),
new MonitorCallback() { tableUpdates -> {
try {
LOG.info(OvsdbDao.wifiRadioStateDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
@Override extIntegrationInterface.wifiRadioStatusDbTableUpdate(
public void update(TableUpdates tableUpdates) { ovsdbDao.getOpensyncAPRadioState(tableUpdates, key, ovsdbClient), key);
try { } catch (Exception e) {
LOG.info(OvsdbDao.wifiRadioStateDbTable + "_" + key + " monitor callback received {}", LOG.error("wifiRadioStatusDbTableUpdate failed", e);
tableUpdates);
extIntegrationInterface.wifiRadioStatusDbTableUpdate(
ovsdbDao.getOpensyncAPRadioState(tableUpdates, key, ovsdbClient), key);
} catch (Exception e) {
LOG.error("wifiRadioStatusDbTableUpdate failed", e);
}
} }
}); });
extIntegrationInterface extIntegrationInterface
.wifiRadioStatusDbTableUpdate(ovsdbDao.getOpensyncAPRadioState(rsCf.join(), key, ovsdbClient), key); .wifiRadioStatusDbTableUpdate(ovsdbDao.getOpensyncAPRadioState(rsCf.join(), key, ovsdbClient), key);
@@ -722,49 +644,44 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
.monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiVifStateDbTable + "_" + key, .monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiVifStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiVifStateDbTable, new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiVifStateDbTable,
new MonitorRequest(new MonitorSelect(false, true, true, true)))), new MonitorRequest(new MonitorSelect(false, true, true, true)))),
new MonitorCallback() { tableUpdates -> {
try {
LOG.info(OvsdbDao.wifiVifStateDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
@Override List<OpensyncAPVIFState> vifsToDelete = new ArrayList<>();
public void update(TableUpdates tableUpdates) { List<OpensyncAPVIFState> vifsToInsertOrUpdate = new ArrayList<>();
try { for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
LOG.info(OvsdbDao.wifiVifStateDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
List<OpensyncAPVIFState> vifsToDelete = new ArrayList<>(); for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
List<OpensyncAPVIFState> vifsToInsertOrUpdate = new ArrayList<>();
for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) { if (rowUpdate.getNew() == null) {
// this is a deletion
vifsToDelete.addAll(ovsdbDao.getOpensyncApVifStateForRowUpdate(
rowUpdate, key, ovsdbClient));
if (rowUpdate.getNew() == null) { } else {
// this is a deletion // either an insert or
vifsToDelete.addAll(ovsdbDao.getOpensyncApVifStateForRowUpdate( // mutuate/update
rowUpdate, key, ovsdbClient)); vifsToInsertOrUpdate.addAll(ovsdbDao.getOpensyncApVifStateForRowUpdate(
rowUpdate, key, ovsdbClient));
} else {
// either an insert or
// mutuate/update
vifsToInsertOrUpdate.addAll(ovsdbDao.getOpensyncApVifStateForRowUpdate(
rowUpdate, key, ovsdbClient));
}
}
// delete first, if required
if (!vifsToDelete.isEmpty()) {
extIntegrationInterface.wifiVIFStateDbTableDelete(vifsToDelete, key);
}
if (!vifsToInsertOrUpdate.isEmpty()) {
extIntegrationInterface.wifiVIFStateDbTableUpdate(vifsToInsertOrUpdate,
key);
} }
} }
} catch (Exception e) {
LOG.error("wifiVIFStateDbTableUpdate failed", e);
}
// delete first, if required
if (!vifsToDelete.isEmpty()) {
extIntegrationInterface.wifiVIFStateDbTableDelete(vifsToDelete, key);
}
if (!vifsToInsertOrUpdate.isEmpty()) {
extIntegrationInterface.wifiVIFStateDbTableUpdate(vifsToInsertOrUpdate,
key);
}
}
} catch (Exception e) {
LOG.error("wifiVIFStateDbTableUpdate failed", e);
} }
}); });
@@ -776,24 +693,20 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
CompletableFuture<TableUpdates> nsCf = ovsdbClient.monitor( CompletableFuture<TableUpdates> nsCf = ovsdbClient.monitor(
OvsdbDao.ovsdbName, OvsdbDao.nodeStateTable + "_" + key, new MonitorRequests(ImmutableMap OvsdbDao.ovsdbName, OvsdbDao.nodeStateTable + "_" + key, new MonitorRequests(ImmutableMap
.of(OvsdbDao.nodeStateTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))), .of(OvsdbDao.nodeStateTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))),
new MonitorCallback() { tableUpdates -> {
@Override LOG.info(OvsdbDao.nodeStateTable + "_" + key + " monitor callback received {}");
public void update(TableUpdates tableUpdates) { tableUpdates.getTableUpdates().forEach((key1, value) -> {
LOG.info(OvsdbDao.nodeStateTable + "_" + key + " monitor callback received {}"); LOG.info("TableUpdate for {}", key1);
tableUpdates.getTableUpdates().entrySet().stream().forEach(t -> { value.getRowUpdates().values().forEach(r -> {
LOG.info("TableUpdate for {}", t.getKey()); if (r.getOld() != null) {
t.getValue().getRowUpdates().values().stream().forEach(r -> { LOG.info("Node_State old row {}", r.getOld().getColumns());
if (r.getOld() != null) { }
LOG.info("Node_State old row {}", r.getOld().getColumns()); if (r.getNew() != null) {
} LOG.info("Node_State new row {}", r.getNew().getColumns());
if (r.getNew() != null) { }
LOG.info("Node_State new row {}", r.getNew().getColumns());
}
});
}); });
}
});
}); });
nsCf.join(); nsCf.join();
} }
@@ -875,10 +788,8 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
try { try {
OvsdbSession session = ovsdbSessionMapInterface.getSession(apId); OvsdbSession session = ovsdbSessionMapInterface.getSession(apId);
OvsdbClient ovsdbClient = session.getOvsdbClient(); OvsdbClient ovsdbClient = session.getOvsdbClient();
Map<String, String> payload = new HashMap<>(); Map<String, String> payload = new HashMap<>();
ovsdbDao.configureCommands(ovsdbClient, OvsdbDao.StopDebugEngineApCommand, payload, Long.valueOf(0L), ovsdbDao.configureCommands(ovsdbClient, OvsdbDao.StopDebugEngineApCommand, payload, 0L, 0L);
Long.valueOf(0L));
LOG.debug("TipWlanOvsdbClient::stopDebugEngine Stop debug engine on AP {}", apId); LOG.debug("TipWlanOvsdbClient::stopDebugEngine Stop debug engine on AP {}", apId);
return "Stop debug engine on AP " + apId; return "Stop debug engine on AP " + apId;

View File

@@ -53,7 +53,7 @@ public class OvsdbDao extends OvsdbDaoBase {
public void configureBlockList(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig, public void configureBlockList(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig,
List<MacAddress> blockList) { List<MacAddress> blockList) {
ovsdbSsid.configureBlockList(ovsdbClient, opensyncAPConfig, blockList); ovsdbSsid.configureBlockList(ovsdbClient, blockList);
} }
public void configureCommands(OvsdbClient ovsdbClient, String startdebugengineapcommand, public void configureCommands(OvsdbClient ovsdbClient, String startdebugengineapcommand,

View File

@@ -122,19 +122,13 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
* @param isNat * @param isNat
*/ */
void configureInetInterface(OvsdbClient ovsdbClient, String ifName, boolean enabled, String ifType, void configureInetInterface(OvsdbClient ovsdbClient, String ifName, boolean enabled, String ifType,
boolean isUpdate, boolean isNat) { boolean isUpdate, boolean isNat, List<Operation> operations) {
try {
List<Operation> operations = new ArrayList<>();
Map<String, Value> tableColumns = new HashMap<>(); Map<String, Value> tableColumns = new HashMap<>();
tableColumns.put("if_type", new Atom<>(ifType)); tableColumns.put("if_type", new Atom<>(ifType));
tableColumns.put("enabled", new Atom<>(enabled)); tableColumns.put("enabled", new Atom<>(enabled));
tableColumns.put("network", new Atom<>(true)); tableColumns.put("network", new Atom<>(true));
tableColumns.put("if_name", new Atom<>(ifName)); tableColumns.put("if_name", new Atom<>(ifName));
tableColumns.put("NAT", new Atom<>(isNat)); tableColumns.put("NAT", new Atom<>(isNat));
Row row = new Row(tableColumns); Row row = new Row(tableColumns);
if (isUpdate) { if (isUpdate) {
List<Condition> conditions = new ArrayList<>(); List<Condition> conditions = new ArrayList<>();
@@ -143,50 +137,24 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
} else { } else {
operations.add(new Insert(wifiInetConfigDbTable, row)); operations.add(new Insert(wifiInetConfigDbTable, row));
} }
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
LOG.debug("Updated Inet {}", ifName);
for (OperationResult res : result) {
if (res instanceof InsertResult) {
LOG.info("configureInetInterface insert new row result {}", (res));
// for insert, make sure it is actually in the table
confirmRowExistsInTable(ovsdbClient, ((InsertResult) res).getUuid(), wifiInetConfigDbTable);
} else if (res instanceof UpdateResult) {
LOG.info("configureInetInterface update new row result {}", (res));
} else if (res instanceof ErrorResult) {
LOG.error("configureInetInterface error {}", (res));
throw new RuntimeException("configureInetInterface " + ((ErrorResult) res).getError() + " "
+ ((ErrorResult) res).getDetails());
}
}
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
LOG.error("Error in updateWifiInetConfig", e);
throw new RuntimeException(e);
}
} }
/** /**
* * @param ovsdbClient
* @param ovsdbClient
* @param vifInterfaceName * @param vifInterfaceName
* @param enabled * @param enabled
* @param networkForwardMode * @param networkForwardMode
* @param operations
*/ */
void configureInetVifInterface(OvsdbClient ovsdbClient, String vifInterfaceName, boolean enabled, void configureInetVifInterface(OvsdbClient ovsdbClient, String vifInterfaceName, boolean enabled,
NetworkForwardMode networkForwardMode) { NetworkForwardMode networkForwardMode, List<Operation> operations) {
Map<String, WifiInetConfigInfo> inetConfigs = ovsdbGet.getProvisionedWifiInetConfigs(ovsdbClient); Map<String, WifiInetConfigInfo> inetConfigs = ovsdbGet.getProvisionedWifiInetConfigs(ovsdbClient);
if (inetConfigs.containsKey(vifInterfaceName)) { if (inetConfigs.containsKey(vifInterfaceName)) {
configureInetInterface(ovsdbClient, vifInterfaceName, enabled, "vif", true, configureInetInterface(ovsdbClient, vifInterfaceName, enabled, "vif", true,
(networkForwardMode == NetworkForwardMode.NAT)); (networkForwardMode == NetworkForwardMode.NAT), operations);
} else { } else {
configureInetInterface(ovsdbClient, vifInterfaceName, enabled, "vif", false, configureInetInterface(ovsdbClient, vifInterfaceName, enabled, "vif", false,
(networkForwardMode == NetworkForwardMode.NAT)); (networkForwardMode == NetworkForwardMode.NAT), operations);
} }
} }

View File

@@ -1,48 +1,37 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao; package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.ArrayList; import com.telecominfraproject.wlan.core.model.equipment.ChannelBandwidth;
import java.util.HashMap; import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import java.util.List; import com.telecominfraproject.wlan.core.model.equipment.SourceType;
import com.telecominfraproject.wlan.equipment.models.*;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiRadioConfigInfo;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiVifConfigInfo;
import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
import com.telecominfraproject.wlan.profile.rf.models.RfElementConfiguration;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.Operation;
import com.vmware.ovsdb.protocol.operation.Update;
import com.vmware.ovsdb.protocol.operation.notation.*;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.service.OvsdbClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.core.model.equipment.ChannelBandwidth;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.core.model.equipment.SourceType;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration;
import com.telecominfraproject.wlan.equipment.models.ElementRadioConfiguration;
import com.telecominfraproject.wlan.equipment.models.MimoMode;
import com.telecominfraproject.wlan.equipment.models.RadioConfiguration;
import com.telecominfraproject.wlan.equipment.models.StateSetting;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
import com.telecominfraproject.wlan.profile.rf.models.RfElementConfiguration;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.Mutate;
import com.vmware.ovsdb.protocol.operation.Operation;
import com.vmware.ovsdb.protocol.operation.Select;
import com.vmware.ovsdb.protocol.operation.Update;
import com.vmware.ovsdb.protocol.operation.notation.Atom;
import com.vmware.ovsdb.protocol.operation.notation.Condition;
import com.vmware.ovsdb.protocol.operation.notation.Function;
import com.vmware.ovsdb.protocol.operation.notation.Mutation;
import com.vmware.ovsdb.protocol.operation.notation.Mutator;
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.OperationResult;
import com.vmware.ovsdb.protocol.operation.result.SelectResult;
import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
import com.vmware.ovsdb.service.OvsdbClient;
@Component @Component
public class OvsdbRadioConfig extends OvsdbDaoBase { public class OvsdbRadioConfig extends OvsdbDaoBase {
@Autowired
OvsdbGet ovsdbGet;
void configureWifiRadios(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) { void configureWifiRadios(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
String country = opensyncAPConfig.getCountryCode(); // should be the String country = opensyncAPConfig.getCountryCode(); // should be the
@@ -54,6 +43,11 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
.getDetails(); .getDetails();
RfConfiguration rfConfig = (RfConfiguration) opensyncAPConfig.getRfProfile().getDetails(); RfConfiguration rfConfig = (RfConfiguration) opensyncAPConfig.getRfProfile().getDetails();
Map<String, WifiRadioConfigInfo> provisionedRadioConfigs = ovsdbGet.getProvisionedWifiRadioConfigs(ovsdbClient);
Map<String, WifiVifConfigInfo> vifConfigs = ovsdbGet.getProvisionedWifiVifConfigs(ovsdbClient);
List<Operation> operations = new ArrayList<>();
for (RadioType radioType : apElementConfiguration.getRadioMap().keySet()) { for (RadioType radioType : apElementConfiguration.getRadioMap().keySet()) {
Map<String, String> hwConfig = new HashMap<>(); Map<String, String> hwConfig = new HashMap<>();
@@ -64,7 +58,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
LOG.debug("configureWifiRadios autoChannelSelection {} activeChannel {} getChannelNumber {} ", LOG.debug("configureWifiRadios autoChannelSelection {} activeChannel {} getChannelNumber {} ",
autoChannelSelection, channel, elementRadioConfig.getChannelNumber()); autoChannelSelection, channel, elementRadioConfig.getChannelNumber());
ChannelBandwidth bandwidth = rfElementConfig.getChannelBandwidth(); ChannelBandwidth bandwidth = rfElementConfig.getChannelBandwidth();
String ht_mode = null; String ht_mode;
switch (bandwidth) { switch (bandwidth) {
case is20MHz: case is20MHz:
ht_mode = "HT20"; ht_mode = "HT20";
@@ -89,7 +83,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
int beaconInterval = rfElementConfig.getBeaconInterval(); int beaconInterval = rfElementConfig.getBeaconInterval();
boolean enabled = radioConfig.getRadioAdminState().equals(StateSetting.enabled); boolean enabled = radioConfig.getRadioAdminState().equals(StateSetting.enabled);
int txPower = 0; int txPower;
if (elementRadioConfig.getEirpTxPower().getSource() == SourceType.profile) { if (elementRadioConfig.getEirpTxPower().getSource() == SourceType.profile) {
txPower = rfElementConfig.getEirpTxPower(); txPower = rfElementConfig.getEirpTxPower();
} else { } else {
@@ -121,7 +115,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
break; break;
default: default:
} }
String freqBand = null; String freqBand;
switch (radioType) { switch (radioType) {
case is2dot4GHz: case is2dot4GHz:
freqBand = "2.4G"; freqBand = "2.4G";
@@ -170,44 +164,77 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
} }
String radioName = null;
for (String key : provisionedRadioConfigs.keySet()) {
if (provisionedRadioConfigs.get(key).freqBand.equals(freqBand)) {
radioName = key;
break;
}
}
if (radioName == null) continue;
String ifName = null; // for vifConfigs
if (radioName.equals(radio0)) {
ifName = defaultRadio0;
} else if (radioName.equals(radio1)) {
ifName = defaultRadio1;
} else if (radioName.equals(radio2)) {
ifName = defaultRadio2;
}
if (ifName == null) continue;
Set<Uuid> vifUuidsForRadio = new HashSet<>();
for (String key : vifConfigs.keySet()) {
if (key.contains(ifName))
vifUuidsForRadio.add(vifConfigs.get(key).uuid);
}
int mimoMode = MimoMode.none.getId(); int mimoMode = MimoMode.none.getId();
if (rfElementConfig.getMimoMode() != null) { if (rfElementConfig.getMimoMode() != null) {
mimoMode = rfElementConfig.getMimoMode().getId(); mimoMode = rfElementConfig.getMimoMode().getId();
} }
if (freqBand != null) { try {
try {
configureWifiRadios(ovsdbClient, freqBand, channel, hwConfig, country.toUpperCase(), beaconInterval,
enabled, hwMode, ht_mode, txPower, mimoMode);
} catch (OvsdbClientException e) {
LOG.error("ConfigureWifiRadios failed with OvsdbClient exception.", e);
throw new RuntimeException(e);
} catch (TimeoutException e) { configureWifiRadios(freqBand, channel, hwConfig, country.toUpperCase(), beaconInterval,
LOG.error("ConfigureWifiRadios failed with Timeout.", e); enabled, hwMode, ht_mode, txPower, mimoMode, vifUuidsForRadio, operations);
throw new RuntimeException(e); } catch (OvsdbClientException e) {
LOG.error("ConfigureWifiRadios failed with OvsdbClient exception.", e);
throw new RuntimeException(e);
} catch (ExecutionException e) { } catch (TimeoutException e) {
LOG.error("ConfigureWifiRadios excecution failed.", e); LOG.error("ConfigureWifiRadios failed with Timeout.", e);
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (InterruptedException e) { } catch (ExecutionException e) {
LOG.error("ConfigureWifiRadios interrupted.", e); LOG.error("ConfigureWifiRadios excecution failed.", e);
throw new RuntimeException(e); throw new RuntimeException(e);
} } catch (InterruptedException e) {
LOG.error("ConfigureWifiRadios interrupted.", e);
throw new RuntimeException(e);
} }
} }
try {
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
LOG.debug("Op Result {}", res);
}
} catch (OvsdbClientException | ExecutionException | InterruptedException | TimeoutException e) {
LOG.error("configureWifiRadios error", e); throw new RuntimeException(e);
}
} }
void configureWifiRadios(OvsdbClient ovsdbClient, String freqBand, int channel, Map<String, String> hwConfig, void configureWifiRadios(String freqBand, int channel, Map<String, String> hwConfig,
String country, int beaconInterval, boolean enabled, String hwMode, String ht_mode, int txPower, String country, int beaconInterval, boolean enabled, String hwMode, String ht_mode, int txPower,
int mimoMode) throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException { int mimoMode, Set<Uuid> vifUuidsForRadio, List<Operation> operations) throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException {
List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>(); Map<String, Value> updateColumns = new HashMap<>();
List<Condition> conditions = new ArrayList<>(); List<Condition> conditions = new ArrayList<>();
conditions.add(new Condition("freq_band", Function.EQUALS, new Atom<>(freqBand))); conditions.add(new Condition("freq_band", Function.EQUALS, new Atom<>(freqBand)));
@@ -234,23 +261,20 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
updateColumns.put("hw_mode", new Atom<>(hwMode)); updateColumns.put("hw_mode", new Atom<>(hwMode));
} }
setTxAndRxChainmask(ovsdbClient, mimoMode, updateColumns); setTxAndRxChainmask(mimoMode, updateColumns);
if (vifUuidsForRadio.size() > 0) {
com.vmware.ovsdb.protocol.operation.notation.Set vifConfigUuids = com.vmware.ovsdb.protocol.operation.notation.Set
.of(vifUuidsForRadio);
updateColumns.put("vif_configs", vifConfigUuids);
}
Row row = new Row(updateColumns); Row row = new Row(updateColumns);
operations.add(new Update(wifiRadioConfigDbTable, conditions, row)); operations.add(new Update(wifiRadioConfigDbTable, conditions, row));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
LOG.debug("Provisioned channel {} for {}", channel, freqBand);
for (OperationResult res : result) {
LOG.debug("Op Result {}", res);
}
} }
void setTxAndRxChainmask(OvsdbClient ovsdbClient, int mimoMode, Map<String, Value> updateColumns) void setTxAndRxChainmask(int mimoMode, Map<String, Value> updateColumns) {
throws InterruptedException, ExecutionException, OvsdbClientException {
/* /*
* Chainmask is a bitmask, so map mimo mode values accordingly * Chainmask is a bitmask, so map mimo mode values accordingly
* Note values 0, 1 remain unchanged * Note values 0, 1 remain unchanged
@@ -270,65 +294,4 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
} }
/**
* Update the vif_configs column of the Wifi_Radio_Config ovsdb table for
* the given freqBand
*
* @param ovsdbClient
* @param ssid
* @param radioFreqBand
* @param vifConfigUuid
* @throws OvsdbClientException
* @throws InterruptedException
* @throws ExecutionException
* @throws TimeoutException
*/
void updateVifConfigsSetForRadio(OvsdbClient ovsdbClient, String ssid, String radioFreqBand, Uuid vifConfigUuid)
throws OvsdbClientException, InterruptedException, ExecutionException, TimeoutException {
List<Operation> operations = new ArrayList<>();
List<Condition> conditions = new ArrayList<>();
conditions.add(new Condition("freq_band", Function.EQUALS, new Atom<>(radioFreqBand)));
List<Mutation> mutations = new ArrayList<>();
Mutation mutation = new Mutation("vif_configs", Mutator.INSERT, new Atom<>(vifConfigUuid));
mutations.add(mutation);
operations.add(new Mutate(wifiRadioConfigDbTable, conditions, mutations));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
if (res instanceof UpdateResult) {
LOG.debug("updateVifConfigsSetForRadio:result {}", res);
} else if (res instanceof ErrorResult) {
LOG.error("updateVifConfigsSetForRadio error {}", (res));
throw new RuntimeException("updateVifConfigsSetForRadio " + ((ErrorResult) res).getError() + " "
+ ((ErrorResult) res).getDetails());
}
}
// confirm the table was updated with the new Wifi_VIF_Config Uuid
operations.clear();
operations.add(new Select(wifiRadioConfigDbTable, conditions));
fResult = ovsdbClient.transact(ovsdbName, operations);
result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
if (res instanceof SelectResult) {
SelectResult selectResult = (SelectResult) res;
Row row = selectResult.getRows().get(0);
if (!row.getSetColumn("vif_configs").contains(vifConfigUuid)) {
throw new RuntimeException("Wifi_Radio_Config " + row
+ "vif_configs table was not updated {} for new Wifi_VIF_Config " + vifConfigUuid);
}
} else if (res instanceof ErrorResult) {
LOG.error("updateVifConfigsSetForRadio error {}", (res));
throw new RuntimeException("updateVifConfigsSetForRadio " + ((ErrorResult) res).getError() + " "
+ ((ErrorResult) res).getDetails());
}
}
LOG.info("Updated WifiRadioConfig {} for SSID {}:", radioFreqBand, ssid);
}
} }

View File

@@ -1,31 +1,8 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao; package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress; import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.equipment.RadioType; import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration; import com.telecominfraproject.wlan.equipment.models.*;
import com.telecominfraproject.wlan.equipment.models.NetworkForwardMode;
import com.telecominfraproject.wlan.equipment.models.RadioConfiguration;
import com.telecominfraproject.wlan.equipment.models.RadioMode;
import com.telecominfraproject.wlan.equipment.models.StateSetting;
import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo; import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig; import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiRadioConfigInfo; import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiRadioConfigInfo;
@@ -46,23 +23,22 @@ import com.telecominfraproject.wlan.profile.ssid.models.NasIdType;
import com.telecominfraproject.wlan.profile.ssid.models.NasIpType; import com.telecominfraproject.wlan.profile.ssid.models.NasIpType;
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration; import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
import com.vmware.ovsdb.exception.OvsdbClientException; import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.Delete; import com.vmware.ovsdb.protocol.operation.*;
import com.vmware.ovsdb.protocol.operation.Insert; import com.vmware.ovsdb.protocol.operation.notation.*;
import com.vmware.ovsdb.protocol.operation.Operation; import com.vmware.ovsdb.protocol.operation.result.*;
import com.vmware.ovsdb.protocol.operation.Select;
import com.vmware.ovsdb.protocol.operation.Update;
import com.vmware.ovsdb.protocol.operation.notation.Atom;
import com.vmware.ovsdb.protocol.operation.notation.Condition;
import com.vmware.ovsdb.protocol.operation.notation.Function;
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.protocol.operation.result.UpdateResult;
import com.vmware.ovsdb.service.OvsdbClient; import com.vmware.ovsdb.service.OvsdbClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.*;
import java.util.Set;
import java.util.Map.Entry;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
@Component @Component
public class OvsdbSsidConfig extends OvsdbDaoBase { public class OvsdbSsidConfig extends OvsdbDaoBase {
@@ -70,8 +46,6 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
@Autowired @Autowired
OvsdbGet getProvisionedData; OvsdbGet getProvisionedData;
@Autowired @Autowired
OvsdbRadioConfig radioConfig;
@Autowired
OvsdbNetworkConfig networkConfig; OvsdbNetworkConfig networkConfig;
@Autowired @Autowired
OvsdbNode ovsdbNode; OvsdbNode ovsdbNode;
@@ -132,7 +106,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
} }
void configureBlockList(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig, List<MacAddress> macBlockList) { void configureBlockList(OvsdbClient ovsdbClient, List<MacAddress> macBlockList) {
LOG.debug("Starting configureBlockList {}", macBlockList); LOG.debug("Starting configureBlockList {}", macBlockList);
@@ -170,18 +144,11 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* *
* @param enable80211k * @param enable80211k
* @param dtimPeriod * @param dtimPeriod
* @param fragThresholdBytes
* @param customOptions * @param customOptions
*/ */
void configureCustomOptionsForDtimFragAnd80211k(boolean enable80211k, int dtimPeriod, int fragThresholdBytes, void configureCustomOptionsForDtimFragAnd80211k(boolean enable80211k, int dtimPeriod,
Map<String, String> customOptions) { Map<String, String> customOptions) {
// TODO: the frag_threshold is not supported on the AP
// customOptions.put("frag_threshold",
// String.valueOf(fragThresholdBytes));
customOptions.put("dtim_period", String.valueOf(dtimPeriod)); customOptions.put("dtim_period", String.valueOf(dtimPeriod));
if (enable80211k) { if (enable80211k) {
customOptions.put("ieee80211k", String.valueOf(1)); customOptions.put("ieee80211k", String.valueOf(1));
} else { } else {
@@ -254,7 +221,6 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @param clientDlLimit * @param clientDlLimit
* @param clientUlLimit * @param clientUlLimit
* @param rtsCtsThreshold * @param rtsCtsThreshold
* @param fragThresholdBytes
* @param dtimPeriod * @param dtimPeriod
* @param radiusNasId * @param radiusNasId
* @param radiusNasIp * @param radiusNasIp
@@ -263,16 +229,16 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @param dynamicVlan * @param dynamicVlan
*/ */
void configureCustomOptionsForSsid(OvsdbClient ovsdbClient, boolean enable80211k, boolean rateLimitEnable, void configureCustomOptionsForSsid(OvsdbClient ovsdbClient, boolean enable80211k, boolean rateLimitEnable,
int ssidDlLimit, int ssidUlLimit, int clientDlLimit, int clientUlLimit, int rtsCtsThreshold, int ssidDlLimit, int ssidUlLimit, int clientDlLimit, int clientUlLimit, int rtsCtsThreshold,
int fragThresholdBytes, int dtimPeriod, String radiusNasId, String radiusNasIp, String radiusOperatorName, int dtimPeriod, String radiusNasId, String radiusNasIp, String radiusOperatorName,
Map<String, Value> updateColumns, int dynamicVlan) { Map<String, Value> updateColumns, int dynamicVlan) {
Map<String, String> customOptions = new HashMap<>(); Map<String, String> customOptions = new HashMap<>();
configureCustomOptionsForRatesAndLimits(rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, configureCustomOptionsForRatesAndLimits(rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit,
rtsCtsThreshold, customOptions); rtsCtsThreshold, customOptions);
configureCustomOptionsForRadiusNas(ovsdbClient, radiusNasId, radiusNasIp, radiusOperatorName, customOptions); configureCustomOptionsForRadiusNas(ovsdbClient, radiusNasId, radiusNasIp, radiusOperatorName, customOptions);
configureCustomOptionsForDtimFragAnd80211k(enable80211k, dtimPeriod, fragThresholdBytes, customOptions); configureCustomOptionsForDtimFragAnd80211k(enable80211k, dtimPeriod, customOptions);
configureCustomOptionsForDynamicVlan(dynamicVlan, customOptions); configureCustomOptionsForDynamicVlan(dynamicVlan, customOptions);
@@ -282,26 +248,22 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
updateColumns.put("custom_options", customMap); updateColumns.put("custom_options", customMap);
} }
Uuid configureSingleSsid(OvsdbClient ovsdbClient, String vifInterfaceName, String ssid, boolean ssidBroadcast, void configureSingleSsid(OvsdbClient ovsdbClient, String vifInterfaceName, String ssid, boolean ssidBroadcast,
Map<String, String> security, String radioFreqBand, int vlanId, boolean rrmEnabled, boolean enable80211r, Map<String, String> security, int vlanId, boolean rrmEnabled, boolean enable80211r,
int mobilityDomain, boolean enable80211v, boolean enable80211k, String minHwMode, boolean enabled, int mobilityDomain, boolean enable80211v, boolean enable80211k, String minHwMode, boolean enabled,
int keyRefresh, boolean uapsdEnabled, boolean apBridge, NetworkForwardMode networkForwardMode, int keyRefresh, boolean uapsdEnabled, boolean apBridge, NetworkForwardMode networkForwardMode,
String gateway, String inet, Map<String, String> dns, String ipAssignScheme, List<MacAddress> macBlockList, List<MacAddress> macBlockList,
boolean rateLimitEnable, int ssidDlLimit, int ssidUlLimit, int clientDlLimit, int clientUlLimit, boolean rateLimitEnable, int ssidDlLimit, int ssidUlLimit, int clientDlLimit, int clientUlLimit,
int rtsCtsThreshold, int fragThresholdBytes, int dtimPeriod, Map<String, String> captiveMap, int rtsCtsThreshold, int dtimPeriod, Map<String, String> captiveMap,
List<String> walledGardenAllowlist, Map<Short, Set<String>> bonjourServiceMap, String radiusNasId, List<String> walledGardenAllowlist, String radiusNasId,
String radiusNasIp, String radiusOperatorName, String greTunnelName, int dynamicVlan) { String radiusNasIp, String radiusOperatorName, String greTunnelName, int dynamicVlan, List<Operation> operations) {
List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>(); Map<String, Value> updateColumns = new HashMap<>();
try {
// If we are doing a NAT SSID, no bridge, else yes // If we are doing a NAT SSID, no bridge, else yes
// If gre tunnel and vlanId > 1 use vlan if name for bridge // If gre tunnel and vlanId > 1 use vlan if name for bridge
String bridgeInterfaceName = defaultWanInterfaceName; String bridgeInterfaceName = defaultWanInterfaceName;
if (greTunnelName != null && vlanId > 1) { if (greTunnelName != null && vlanId > 1) {
bridgeInterfaceName = greTunnelName + "_" + String.valueOf(vlanId); bridgeInterfaceName = greTunnelName + "_" + vlanId;
} else if (networkForwardMode == NetworkForwardMode.NAT) { } else if (networkForwardMode == NetworkForwardMode.NAT) {
bridgeInterfaceName = defaultLanInterfaceName; bridgeInterfaceName = defaultLanInterfaceName;
} }
@@ -320,21 +282,14 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
if (walledGardenAllowlist != null && !walledGardenAllowlist.isEmpty()) { if (walledGardenAllowlist != null && !walledGardenAllowlist.isEmpty()) {
Set<Atom<String>> atomMacList = new HashSet<>(); Set<Atom<String>> atomMacList = new HashSet<>();
walledGardenAllowlist.stream().forEach(allow -> atomMacList.add(new Atom<>(allow))); walledGardenAllowlist.forEach(allow -> atomMacList.add(new Atom<>(allow)));
com.vmware.ovsdb.protocol.operation.notation.Set allowListSet = com.vmware.ovsdb.protocol.operation.notation.Set com.vmware.ovsdb.protocol.operation.notation.Set allowListSet = com.vmware.ovsdb.protocol.operation.notation.Set
.of(atomMacList); .of(atomMacList);
updateColumns.put("captive_allowlist", allowListSet); updateColumns.put("captive_allowlist", allowListSet);
} else { } else {
updateColumns.put("captive_allowlist", new com.vmware.ovsdb.protocol.operation.notation.Set()); updateColumns.put("captive_allowlist", new com.vmware.ovsdb.protocol.operation.notation.Set());
} }
// TODO: when AP support for Bonjour Gateway set values
if (bonjourServiceMap != null && bonjourServiceMap.size() > 0) {
LOG.info("SSID {} Bonjour Services per vlan {}", ssid, bonjourServiceMap);
}
updateColumns.put("bridge", new Atom<>(bridgeInterfaceName)); updateColumns.put("bridge", new Atom<>(bridgeInterfaceName));
if (enable80211v) { if (enable80211v) {
updateColumns.put("btm", new Atom<>(1)); updateColumns.put("btm", new Atom<>(1));
} else { } else {
@@ -353,59 +308,19 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
updateColumns.put("ssid", new Atom<>(ssid)); updateColumns.put("ssid", new Atom<>(ssid));
updateColumns.put("ssid_broadcast", new Atom<>(ssidBroadcast ? "enabled" : "disabled")); updateColumns.put("ssid_broadcast", new Atom<>(ssidBroadcast ? "enabled" : "disabled"));
updateColumns.put("uapsd_enable", new Atom<>(uapsdEnabled)); updateColumns.put("uapsd_enable", new Atom<>(uapsdEnabled));
updateColumns.put("min_hw_mode", new Atom<>(minHwMode)); updateColumns.put("min_hw_mode", new Atom<>(minHwMode));
updateColumns.put("group_rekey", new Atom<>(keyRefresh)); updateColumns.put("group_rekey", new Atom<>(keyRefresh));
updateColumns.put("uapsd_enable", new Atom<>(uapsdEnabled));
updateColumns.put("ap_bridge", new Atom<>(apBridge)); updateColumns.put("ap_bridge", new Atom<>(apBridge));
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> securityMap = com.vmware.ovsdb.protocol.operation.notation.Map com.vmware.ovsdb.protocol.operation.notation.Map<String, String> securityMap = com.vmware.ovsdb.protocol.operation.notation.Map
.of(security); .of(security);
updateColumns.put("security", securityMap); updateColumns.put("security", securityMap);
configureCustomOptionsForSsid(ovsdbClient, enable80211k, rateLimitEnable, ssidDlLimit, ssidUlLimit, configureCustomOptionsForSsid(ovsdbClient, enable80211k, rateLimitEnable, ssidDlLimit, ssidUlLimit,
clientDlLimit, clientUlLimit, rtsCtsThreshold, fragThresholdBytes, dtimPeriod, radiusNasId, clientDlLimit, clientUlLimit, rtsCtsThreshold, dtimPeriod, radiusNasId,
radiusNasIp, radiusOperatorName, updateColumns, dynamicVlan); radiusNasIp, radiusOperatorName, updateColumns, dynamicVlan);
updateBlockList(updateColumns, macBlockList); updateBlockList(updateColumns, macBlockList);
Row row = new Row(updateColumns); Row row = new Row(updateColumns);
operations.add(new Insert(wifiVifConfigDbTable, row)); operations.add(new Insert(wifiVifConfigDbTable, row));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
Uuid vifConfigUuid = null;
for (OperationResult res : result) {
InsertResult insertResult = null;
if (res instanceof InsertResult) {
insertResult = (InsertResult) res;
LOG.info("configureSingleSsid:InsertResult {}", insertResult);
vifConfigUuid = ((InsertResult) res).getUuid();
} else if (res instanceof ErrorResult) {
LOG.error("configureSingleSsid: error {}", (res));
throw new RuntimeException("configureSingleSsid " + ((ErrorResult) res).getError() + " "
+ ((ErrorResult) res).getDetails());
}
}
if (vifConfigUuid == null) {
throw new IllegalStateException("Wifi_VIF_Config entry was not created successfully");
}
confirmRowExistsInTable(ovsdbClient, vifConfigUuid, wifiVifConfigDbTable);
LOG.info("configureSingleSsid:Provisioned SSID {} on interface {} / {}", ssid, vifInterfaceName,
radioFreqBand);
return vifConfigUuid;
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
LOG.error("Error in configureSingleSsid", e);
throw new RuntimeException(e);
}
} }
void configureSsids(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) { void configureSsids(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) {
@@ -420,7 +335,8 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
List<RadioType> enabledRadiosFromAp = new ArrayList<>(); List<RadioType> enabledRadiosFromAp = new ArrayList<>();
getEnabledRadios(ovsdbClient, enabledRadiosFromAp); getEnabledRadios(ovsdbClient, enabledRadiosFromAp);
Map<String, Integer> interfacesPerFreqBand = new HashMap<>();
List<Operation> operations = new ArrayList<>();
for (Profile ssidProfile : opensyncApConfig.getSsidProfile()) { for (Profile ssidProfile : opensyncApConfig.getSsidProfile()) {
SsidConfiguration ssidConfig = (SsidConfiguration) ssidProfile.getDetails(); SsidConfiguration ssidConfig = (SsidConfiguration) ssidProfile.getDetails();
@@ -482,8 +398,8 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
break; break;
} }
} }
if ((radioName == null) || (freqBand == null)) { if (radioName == null) {
LOG.debug("Cannot provision SSID with radio if_name {} and freqBand {}", radioName, freqBand); LOG.debug("Cannot provision SSID with radio if_name null and freqBand {}", freqBand);
continue; continue;
} }
if (radioName.equals(radio0)) { if (radioName.equals(radio0)) {
@@ -494,8 +410,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
ifName = defaultRadio2; ifName = defaultRadio2;
} }
if (ifName == null) { if (ifName == null) {
LOG.debug("Cannot provision SSID for radio {} freqBand {} with VIF if_name {}", radioName, freqBand, LOG.debug("Cannot provision SSID for radio {} freqBand {} with VIF if_name null", radioName, freqBand);
ifName);
continue; continue;
} }
@@ -503,43 +418,18 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
boolean ssidBroadcast = ssidConfig.getBroadcastSsid() == StateSetting.enabled; boolean ssidBroadcast = ssidConfig.getBroadcastSsid() == StateSetting.enabled;
String ipAssignScheme = apElementConfig.getGettingIP().toString();
// the following 5 attributes only applicable to static
// ipAssignScheme,
// else they are
// ignored
String gateway = null;
String inet = null;
Map<String, String> dns = null;
if (ipAssignScheme.equals("manual")) {
if (apElementConfig.getStaticIP() != null) {
ipAssignScheme = "static";
inet = apElementConfig.getStaticIP().getHostAddress();
gateway = apElementConfig.getStaticIpGw().getHostAddress();
dns = new HashMap<>();
dns.put(apElementConfig.getStaticDnsIp1().getHostName(),
apElementConfig.getStaticDnsIp1().getHostAddress());
dns.put(apElementConfig.getStaticDnsIp2().getHostName(),
apElementConfig.getStaticDnsIp2().getHostAddress());
} else {
ipAssignScheme = "none";
}
}
RfElementConfiguration rfElementConfig = rfConfig.getRfConfig(radioType); RfElementConfiguration rfElementConfig = rfConfig.getRfConfig(radioType);
int rtsCtsThreshold = rfElementConfig.getRtsCtsThreshold(); int rtsCtsThreshold = rfElementConfig.getRtsCtsThreshold();
RadioMode radioMode = rfElementConfig.getRadioMode(); RadioMode radioMode = rfElementConfig.getRadioMode();
int dtimPeriod = 2;
int fragThresholdBytes = 2346;
boolean uapsdEnabled = true; boolean uapsdEnabled = true;
boolean apBridge = true; boolean apBridge = true;
RadioConfiguration radioConfiguration = apElementConfig.getAdvancedRadioMap().get(radioType); RadioConfiguration radioConfiguration = apElementConfig.getAdvancedRadioMap().get(radioType);
int dtimPeriod = 2;
if (radioConfiguration != null) { if (radioConfiguration != null) {
dtimPeriod = radioConfiguration.getDtimPeriod(); dtimPeriod = radioConfiguration.getDtimPeriod();
uapsdEnabled = radioConfiguration.getUapsdState() == StateSetting.enabled; uapsdEnabled = radioConfiguration.getUapsdState() == StateSetting.enabled;
apBridge = radioConfiguration.getStationIsolation() == StateSetting.disabled; // stationIsolation apBridge = radioConfiguration.getStationIsolation() == StateSetting.disabled; // stationIsolation
fragThresholdBytes = radioConfiguration.getFragmentationThresholdBytes();
} }
String minHwMode = "11n"; // min_hw_mode is 11n String minHwMode = "11n"; // min_hw_mode is 11n
@@ -634,46 +524,44 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
int vlanId = ssidConfig.getVlanId() != null ? ssidConfig.getVlanId() : 1; int vlanId = ssidConfig.getVlanId() != null ? ssidConfig.getVlanId() : 1;
Optional<GreTunnelConfiguration> tunnelConfiguration = ((ApNetworkConfiguration) opensyncApConfig Optional<GreTunnelConfiguration> tunnelConfiguration = ((ApNetworkConfiguration) opensyncApConfig
.getApProfile().getDetails()).getGreTunnelConfigurations().stream() .getApProfile().getDetails()).getGreTunnelConfigurations().stream()
.filter(new Predicate<GreTunnelConfiguration>() { .filter(t -> t.getVlanIdsInGreTunnel().contains(vlanId)).findFirst();
String greTunnelName = null;
@Override if (tunnelConfiguration.isPresent()) {
public boolean test(GreTunnelConfiguration t) { greTunnelName = tunnelConfiguration.get().getGreTunnelName();
}
return t.getVlanIdsInGreTunnel().contains(vlanId); if (interfacesPerFreqBand.containsKey(freqBand)) {
} Integer numIf = interfacesPerFreqBand.get(freqBand);
ifName = ifName + "_" + numIf.toString();
}).findFirst(); interfacesPerFreqBand.put(freqBand, ++numIf);
} else {
interfacesPerFreqBand.put(freqBand, 1);
}
try { try {
configureSingleSsid(ovsdbClient, ifName, ssidConfig.getSsid(), ssidBroadcast,
ifName = getInterfaceNameForVifConfig(ovsdbClient, opensyncApConfig, ssidConfig, freqBand, ifName); security, vlanId, rrmEnabled, enable80211r, mobilityDomain, enable80211v,
String greTunnelName = null;
if (tunnelConfiguration.isPresent()) {
greTunnelName = tunnelConfiguration.get().getGreTunnelName();
}
Uuid vifConfigUuid = configureSingleSsid(ovsdbClient, ifName, ssidConfig.getSsid(), ssidBroadcast,
security, freqBand, vlanId, rrmEnabled, enable80211r, mobilityDomain, enable80211v,
enable80211k, minHwMode, enabled, keyRefresh, uapsdEnabled, apBridge, enable80211k, minHwMode, enabled, keyRefresh, uapsdEnabled, apBridge,
ssidConfig.getForwardMode(), gateway, inet, dns, ipAssignScheme, macBlockList, ssidConfig.getForwardMode(), macBlockList,
rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, rtsCtsThreshold, rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, rtsCtsThreshold,
fragThresholdBytes, dtimPeriod, captiveMap, walledGardenAllowlist, bonjourServiceMap, dtimPeriod, captiveMap, walledGardenAllowlist,
radiusNasId, radiusNasIp, radiusOperName, greTunnelName, dynamicVlan); radiusNasId, radiusNasIp, radiusOperName, greTunnelName, dynamicVlan,operations);
radioConfig.updateVifConfigsSetForRadio(ovsdbClient, ssidConfig.getSsid(), freqBand, vifConfigUuid); networkConfig.configureInetVifInterface(ovsdbClient, ifName, enabled, ssidConfig.getForwardMode(),operations );
} catch (IllegalStateException e) {
networkConfig.configureInetVifInterface(ovsdbClient, ifName, enabled, ssidConfig.getForwardMode());
} catch (IllegalStateException | OvsdbClientException | InterruptedException | ExecutionException
| TimeoutException e) {
// could not provision this SSID, but still can go on // could not provision this SSID, but still can go on
LOG.warn("could not provision SSID {} on {}", ssidConfig.getSsid(), freqBand); LOG.warn("could not provision SSID {} on {}", ssidConfig.getSsid(), freqBand);
} }
} }
} }
try {
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
LOG.debug("configureSsids result {}", Arrays.toString(result));
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
LOG.error("Unable to configureSsids on AP.", e);
throw new RuntimeException(e);
}
} }
void getBonjourGatewayConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, void getBonjourGatewayConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig,
@@ -689,7 +577,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
Collection<BonjourServiceSet> bonjourServicesCollection = bonjourGatewayConfiguration Collection<BonjourServiceSet> bonjourServicesCollection = bonjourGatewayConfiguration
.getBonjourServices(); .getBonjourServices();
bonjourServicesCollection.stream().forEach(b -> { bonjourServicesCollection.forEach(b -> {
Set<String> serviceSet = new HashSet<>(); Set<String> serviceSet = new HashSet<>();
if (bonjourServiceMap.containsKey(b.getVlanId())) { if (bonjourServiceMap.containsKey(b.getVlanId())) {
serviceSet.addAll(bonjourServiceMap.get(b.getVlanId())); serviceSet.addAll(bonjourServiceMap.get(b.getVlanId()));
@@ -749,7 +637,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
if (captiveProfileDetails.getAuthenticationType().equals(CaptivePortalAuthenticationType.radius)) { if (captiveProfileDetails.getAuthenticationType().equals(CaptivePortalAuthenticationType.radius)) {
Optional<Profile> optional = opensyncApConfig.getRadiusProfiles().stream() Optional<Profile> optional = opensyncApConfig.getRadiusProfiles().stream()
.filter(p -> p.getId() == captiveProfileDetails.getRadiusServiceId()).findFirst(); .filter(p -> p.getId() == captiveProfileDetails.getRadiusServiceId()).findFirst();
if (optional != null && optional.isPresent()) { if (optional.isPresent()) {
Profile profile = optional.get(); Profile profile = optional.get();
RadiusProfile radiusProfile = (RadiusProfile) profile.getDetails(); RadiusProfile radiusProfile = (RadiusProfile) profile.getDetails();
captiveMap.put("radius_server_ip", String.valueOf( captiveMap.put("radius_server_ip", String.valueOf(
@@ -805,46 +693,6 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
} }
} }
/**
* Get the interface name for the new Wifi_VIF_Config. Maximum of 8
* interface names per frequencyBand
*
* @param ovsdbClient
* @param opensyncApConfig
* @param ssidConfig
* @param freqBand
* @param ifName
* @return the interface name, i.e. wlan0, wlan0_1, etc
*/
String getInterfaceNameForVifConfig(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig,
SsidConfiguration ssidConfig, String freqBand, String ifName) {
Map<String, WifiVifConfigInfo> provisionedVifs = getProvisionedData.getProvisionedWifiVifConfigs(ovsdbClient);
List<String> interfaces = new ArrayList<>();
interfaces.add(ifName);
for (int i = 1; i < MAX_VIF_PER_FREQ; i++) {
interfaces.add(ifName + "_" + Integer.toString(i));
}
for (String key : provisionedVifs.keySet()) {
if (key.contains(ifName)) {
String provisionedIfName = provisionedVifs.get(key).ifName;
if (interfaces.remove(provisionedIfName)) {
LOG.info("Interface {} already in use on Radio {}, cannot be used for new Wifi_VIF_Config.",
provisionedIfName, freqBand);
}
}
}
if (interfaces.isEmpty()) {
throw new RuntimeException("No more available interfaces on AP "
+ opensyncApConfig.getCustomerEquipment().getName() + " for frequency band " + freqBand);
} else {
// take the first available interface for this band
ifName = interfaces.get(0);
LOG.info("Configuring new Wifi_VIF_Config for ssid {} with if_name {}", ssidConfig.getSsid(), ifName);
}
return ifName;
}
/** /**
* Maps between the osvdb security definitions and the cloud's security mode * Maps between the osvdb security definitions and the cloud's security mode
* for the give SSID being configured. * for the give SSID being configured.
@@ -854,21 +702,31 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @return * @return
*/ */
String getOpensyncSecurityMode(String ssidSecurityMode, String opensyncSecurityMode) { String getOpensyncSecurityMode(String ssidSecurityMode, String opensyncSecurityMode) {
if (ssidSecurityMode.equals("wpaPSK") || ssidSecurityMode.equals("wpa2PSK") switch (ssidSecurityMode) {
|| ssidSecurityMode.equals("wpa2OnlyPSK")) { case "wpaPSK":
opensyncSecurityMode = "WPA-PSK"; case "wpa2PSK":
} else if (ssidSecurityMode.equals("wep")) { case "wpa2OnlyPSK":
opensyncSecurityMode = "WEP"; opensyncSecurityMode = "WPA-PSK";
} else if (ssidSecurityMode.equals("wpaEAP") || ssidSecurityMode.equals("wpa2EAP") break;
|| ssidSecurityMode.equals("wpa2OnlyEAP")) { case "wep":
opensyncSecurityMode = "WPA-EAP"; opensyncSecurityMode = "WEP";
} else if (ssidSecurityMode.equals("wpaRadius") || ssidSecurityMode.equals("wpa2OnlyRadius") break;
|| ssidSecurityMode.equals("wpa2Radius")) { case "wpaEAP":
opensyncSecurityMode = "WPA-EAP"; case "wpa2EAP":
} else if (ssidSecurityMode.equals("wpa3OnlySAE") || ssidSecurityMode.equals("wpa3MixedSAE")) { case "wpa2OnlyEAP":
opensyncSecurityMode = "WPA-SAE"; case "wpaRadius":
} else if (ssidSecurityMode.equals("wpa3OnlyEAP") || ssidSecurityMode.equals("wpa3MixedEAP")) { case "wpa2OnlyRadius":
opensyncSecurityMode = "WPA3-EAP"; case "wpa2Radius":
opensyncSecurityMode = "WPA-EAP";
break;
case "wpa3OnlySAE":
case "wpa3MixedSAE":
opensyncSecurityMode = "WPA-SAE";
break;
case "wpa3OnlyEAP":
case "wpa3MixedEAP":
opensyncSecurityMode = "WPA3-EAP";
break;
} }
return opensyncSecurityMode; return opensyncSecurityMode;
} }
@@ -882,16 +740,9 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
LOG.debug("Radius Accounting Profiles {}", opensyncApConfig.getRadiusProfiles()); LOG.debug("Radius Accounting Profiles {}", opensyncApConfig.getRadiusProfiles());
List<Profile> radiusProfileList = opensyncApConfig.getRadiusProfiles().stream() List<Profile> radiusProfileList = opensyncApConfig.getRadiusProfiles().stream()
.filter(new Predicate<Profile>() { .filter(t -> t.getId() == ssidConfig.getRadiusServiceId()).collect(Collectors.toList());
@Override if (radiusProfileList.size() > 0) {
public boolean test(Profile t) {
return t.getId() == ssidConfig.getRadiusServiceId();
}
}).collect(Collectors.toList());
if (radiusProfileList != null && radiusProfileList.size() > 0) {
Profile profileRadius = radiusProfileList.get(0); Profile profileRadius = radiusProfileList.get(0);
RadiusProfile profileDetails = ((RadiusProfile) profileRadius.getDetails()); RadiusProfile profileDetails = ((RadiusProfile) profileRadius.getDetails());
RadiusServer rServer = profileDetails.getPrimaryRadiusAccountingServer(); RadiusServer rServer = profileDetails.getPrimaryRadiusAccountingServer();
@@ -907,7 +758,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
} else { } else {
LOG.info("No radius_acct_interval defined for ssid {}, Setting radius_acct_interval to 0", LOG.info("No radius_acct_interval defined for ssid {}, Setting radius_acct_interval to 0",
ssidConfig.getSsid(), rServer); ssidConfig.getSsid());
security.put("radius_acct_interval", "0"); security.put("radius_acct_interval", "0");
} }
LOG.info( LOG.info(
@@ -934,16 +785,9 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
LOG.debug("Radius Profiles {}", opensyncApConfig.getRadiusProfiles()); LOG.debug("Radius Profiles {}", opensyncApConfig.getRadiusProfiles());
List<Profile> radiusProfileList = opensyncApConfig.getRadiusProfiles().stream() List<Profile> radiusProfileList = opensyncApConfig.getRadiusProfiles().stream()
.filter(new Predicate<Profile>() { .filter(t -> t.getId() == ssidConfig.getRadiusServiceId()).collect(Collectors.toList());
@Override if (radiusProfileList.size() > 0) {
public boolean test(Profile t) {
return t.getId() == ssidConfig.getRadiusServiceId();
}
}).collect(Collectors.toList());
if (radiusProfileList != null && radiusProfileList.size() > 0) {
Profile profileRadius = radiusProfileList.get(0); Profile profileRadius = radiusProfileList.get(0);
RadiusProfile profileDetails = ((RadiusProfile) profileRadius.getDetails()); RadiusProfile profileDetails = ((RadiusProfile) profileRadius.getDetails());
RadiusServer radiusServer = profileDetails.getPrimaryRadiusAuthServer(); RadiusServer radiusServer = profileDetails.getPrimaryRadiusAuthServer();
@@ -977,41 +821,51 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
security.put("encryption", opensyncSecurityMode); security.put("encryption", opensyncSecurityMode);
// key and mode is N/A for OPEN security // key and mode is N/A for OPEN security
if (!opensyncSecurityMode.equals("OPEN")) { if (!opensyncSecurityMode.equals("OPEN")) {
if (ssidSecurityMode.equals("wpa2PSK") || ssidSecurityMode.equals("wpa3MixedSAE")) { switch (ssidSecurityMode) {
security.put("key", ssidConfig.getKeyStr()); case "wpa2PSK":
security.put("mode", "mixed"); case "wpa3MixedSAE":
} else if (ssidSecurityMode.equals("wpa2OnlyPSK")) { security.put("key", ssidConfig.getKeyStr());
security.put("key", ssidConfig.getKeyStr()); security.put("mode", "mixed");
security.put("mode", "2"); break;
} else if (ssidSecurityMode.equals("wpa3OnlySAE")) { case "wpa2OnlyPSK":
security.put("key", ssidConfig.getKeyStr()); security.put("key", ssidConfig.getKeyStr());
security.put("mode", "3"); security.put("mode", "2");
} else if (ssidSecurityMode.equals("wpaPSK")) { break;
security.put("key", ssidConfig.getKeyStr()); case "wpa3OnlySAE":
security.put("mode", "1"); security.put("key", ssidConfig.getKeyStr());
} else if (ssidSecurityMode.equals("wpa2OnlyEAP") || ssidSecurityMode.equals("wpa2OnlyRadius")) { security.put("mode", "3");
security.put("mode", "2"); break;
getRadiusConfiguration(opensyncApConfig, ssidConfig, security); case "wpaPSK":
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security); case "wep":
} else if (ssidSecurityMode.equals("wpa3OnlyEAP")) { security.put("key", ssidConfig.getKeyStr());
security.put("mode", "3"); security.put("mode", "1");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security); break;
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security); case "wpa2OnlyEAP":
case "wpa2OnlyRadius":
security.put("mode", "2");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
break;
case "wpa3OnlyEAP":
security.put("mode", "3");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
} else if (ssidSecurityMode.equals("wpa2EAP") || ssidSecurityMode.equals("wpa2Radius") break;
|| ssidSecurityMode.equals("wpa3MixedEAP")) { case "wpa2EAP":
security.put("mode", "mixed"); case "wpa2Radius":
getRadiusConfiguration(opensyncApConfig, ssidConfig, security); case "wpa3MixedEAP":
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security); security.put("mode", "mixed");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
} else if (ssidSecurityMode.equals("wpaEAP") || ssidSecurityMode.equals("wpaRadius")) { break;
security.put("mode", "1"); case "wpaEAP":
getRadiusConfiguration(opensyncApConfig, ssidConfig, security); case "wpaRadius":
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security); security.put("mode", "1");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
} else if (ssidSecurityMode.equals("wep")) { getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
security.put("key", ssidConfig.getKeyStr()); break;
security.put("mode", "1");
} }
} }
} }
@@ -1030,7 +884,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
for (OperationResult res : result) { for (OperationResult res : result) {
LOG.info("Op Result {}", res); LOG.info("Op Result {}", res);
if (res instanceof UpdateResult) { if (res instanceof UpdateResult) {
LOG.info("removeAllSsids:result {}", ((UpdateResult) res).toString()); LOG.info("removeAllSsids:result {}", res.toString());
} else if (res instanceof ErrorResult) { } else if (res instanceof ErrorResult) {
LOG.error("removeAllSsids:result error {}", (res)); LOG.error("removeAllSsids:result error {}", (res));
throw new RuntimeException("removeAllSsids " + ((ErrorResult) res).getError() + " " throw new RuntimeException("removeAllSsids " + ((ErrorResult) res).getError() + " "

View File

@@ -133,10 +133,8 @@ public class OpensyncGatewayTipWlanOvsdbClientTest {
Mockito.verify(ovsdbSession).getOvsdbClient(); Mockito.verify(ovsdbSession).getOvsdbClient();
Mockito.verify(opensyncExternalIntegrationInterface).getApConfig("Test_Client_21P10C68818122"); Mockito.verify(opensyncExternalIntegrationInterface).getApConfig("Test_Client_21P10C68818122");
Mockito.verify(ovsdbDao).removeAllSsids(ovsdbClient); Mockito.verify(ovsdbDao).removeAllSsids(ovsdbClient);
Mockito.verify(ovsdbDao).removeAllStatsConfigs(ovsdbClient);
Mockito.verify(ovsdbDao).configureWifiRadios(ovsdbClient, apConfig); Mockito.verify(ovsdbDao).configureWifiRadios(ovsdbClient, apConfig);
Mockito.verify(ovsdbDao).configureSsids(ovsdbClient, apConfig); Mockito.verify(ovsdbDao).configureSsids(ovsdbClient, apConfig);
Mockito.verify(ovsdbDao).configureStatsFromProfile(ovsdbClient, apConfig);
} }

View File

@@ -1,6 +1,8 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao; package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -14,55 +16,66 @@ import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import com.telecominfraproject.wlan.core.model.entity.CountryCode; import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration; import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration;
import com.telecominfraproject.wlan.equipment.models.Equipment; import com.telecominfraproject.wlan.equipment.models.Equipment;
import com.telecominfraproject.wlan.location.models.Location;
import com.telecominfraproject.wlan.location.models.LocationDetails;
import com.telecominfraproject.wlan.location.models.LocationType;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig; import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.profile.models.Profile; import com.telecominfraproject.wlan.profile.models.Profile;
import com.telecominfraproject.wlan.profile.models.ProfileType;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration; import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
import com.vmware.ovsdb.protocol.operation.result.OperationResult; import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.schema.DatabaseSchema; import com.vmware.ovsdb.protocol.schema.DatabaseSchema;
import com.vmware.ovsdb.protocol.schema.TableSchema; import com.vmware.ovsdb.protocol.schema.TableSchema;
import com.vmware.ovsdb.service.OvsdbClient; import com.vmware.ovsdb.service.OvsdbClient;
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ActiveProfiles(profiles = { "integration_test", }) // NOTE: these profiles will @ActiveProfiles(profiles = { "integration_test", }) // NOTE: these profiles will
// be ADDED to the list of // be ADDED to the list of
// active profiles // active profiles
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = OvsdbRadioConfigTest.class) @SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = OvsdbRadioConfigTest.class)
@Import(value = { OvsdbRadioConfig.class,OvsdbRadioConfigTest.Config.class, @Import(value = { OvsdbRadioConfig.class, OvsdbRadioConfigTest.Config.class, OvsdbGet.class,
}) })
public class OvsdbRadioConfigTest { public class OvsdbRadioConfigTest {
@Autowired @Autowired
OvsdbRadioConfig ovsdbRadioConfig; OvsdbRadioConfig ovsdbRadioConfig;
@MockBean(answer = Answers.RETURNS_DEEP_STUBS)
OvsdbGet ovsdbGet;
@Mock(answer = Answers.RETURNS_MOCKS) @Mock(answer = Answers.RETURNS_MOCKS)
CompletableFuture<OperationResult[]> selectionFutureResult; CompletableFuture<OperationResult[]> selectionFutureResult;
@Mock(answer = Answers.RETURNS_MOCKS) @Mock(answer = Answers.RETURNS_MOCKS)
CompletableFuture<DatabaseSchema> getSchemaResult; CompletableFuture<DatabaseSchema> getSchemaResult;
@Mock(answer = Answers.RETURNS_MOCKS) @Mock(answer = Answers.RETURNS_MOCKS)
DatabaseSchema databaseSchema; DatabaseSchema databaseSchema;
@Mock(answer = Answers.RETURNS_MOCKS) @Mock(answer = Answers.RETURNS_MOCKS)
Map<String,TableSchema> tableSchemaMap; Map<String, TableSchema> tableSchemaMap;
@Mock(answer = Answers.RETURNS_MOCKS) @Mock(answer = Answers.RETURNS_MOCKS)
TableSchema tableSchema; TableSchema tableSchema;
@Mock(answer = Answers.RETURNS_MOCKS) @Mock(answer = Answers.RETURNS_MOCKS)
OvsdbClient ovsdbClient; OvsdbClient ovsdbClient;
OpensyncAPConfig opensyncAPConfig;
@Configuration @Configuration
// @PropertySource({ "classpath:persistence-${envTarget:dev}.properties" }) // @PropertySource({ "classpath:persistence-${envTarget:dev}.properties" })
static class Config { static class Config {
@@ -72,16 +85,60 @@ public class OvsdbRadioConfigTest {
return new OvsdbRadioConfig(); return new OvsdbRadioConfig();
} }
} }
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
Mockito.when(selectionFutureResult.get(Mockito.anyLong(), Mockito.eq(TimeUnit.SECONDS))).thenReturn(new OperationResult[0]);
Mockito.when(selectionFutureResult.get(Mockito.anyLong(), Mockito.eq(TimeUnit.SECONDS)))
.thenReturn(new OperationResult[0]);
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())) Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList()))
.thenReturn(selectionFutureResult); .thenReturn(selectionFutureResult);
Mockito.when(tableSchemaMap.get(Mockito.anyString())).thenReturn(tableSchema); Mockito.when(tableSchemaMap.get(Mockito.anyString())).thenReturn(tableSchema);
Mockito.when(databaseSchema.getTables()).thenReturn(tableSchemaMap); Mockito.when(databaseSchema.getTables()).thenReturn(tableSchemaMap);
Mockito.when(getSchemaResult.get()).thenReturn(databaseSchema); Mockito.when(getSchemaResult.get()).thenReturn(databaseSchema);
Mockito.when(ovsdbClient.getSchema(OvsdbDaoBase.ovsdbName)).thenReturn(getSchemaResult); Mockito.when(ovsdbClient.getSchema(OvsdbDaoBase.ovsdbName)).thenReturn(getSchemaResult);
opensyncAPConfig = new OpensyncAPConfig();
Equipment ce = new Equipment();
ce.setEquipmentType(EquipmentType.AP);
ce.setDetails(ApElementConfiguration.createWithDefaults());
ce.setProfileId(8);
ce.setLocationId(8L);
opensyncAPConfig.setCustomerEquipment(ce);
Location equipmentLocation = new Location();
equipmentLocation.setCustomerId(2);
equipmentLocation.setId(8);
equipmentLocation.setDetails(LocationDetails.createWithDefaults());
equipmentLocation.setLocationType(LocationType.COUNTRY);
equipmentLocation.setName("location");
opensyncAPConfig.setEquipmentLocation(equipmentLocation);
Profile ssidProfile = new Profile();
ssidProfile.setId(2);
ssidProfile.setName("ssid-profile");
ssidProfile.setProfileType(ProfileType.ssid);
ssidProfile.setDetails(SsidConfiguration.createWithDefaults());
opensyncAPConfig.setSsidProfile(List.of(ssidProfile));
Profile rfProfile = new Profile();
rfProfile.setId(4);
rfProfile.setName("rf-profile");
rfProfile.setDetails(RfConfiguration.createWithDefaults());
rfProfile.setProfileType(ProfileType.rf);
opensyncAPConfig.setRfProfile(rfProfile);
Profile apProfile = new Profile();
apProfile.setId(8);
apProfile.setCustomerId(2);
apProfile.setDetails(ApNetworkConfiguration.createWithDefaults());
apProfile.setProfileType(ProfileType.equipment_ap);
apProfile.setName("ap-profile");
apProfile.setChildProfileIds(Set.of(2L, 4L));
opensyncAPConfig.setApProfile(apProfile);
} }
@After @After
@@ -90,22 +147,7 @@ public class OvsdbRadioConfigTest {
@Test @Test
public void testConfigureWifiRadiosOvsdbClientOpensyncAPConfig() throws Exception { public void testConfigureWifiRadiosOvsdbClientOpensyncAPConfig() throws Exception {
OpensyncAPConfig opensyncAPConfig = constructOpensyncAPConfig();
ovsdbRadioConfig.configureWifiRadios(ovsdbClient, opensyncAPConfig); ovsdbRadioConfig.configureWifiRadios(ovsdbClient, opensyncAPConfig);
} }
OpensyncAPConfig constructOpensyncAPConfig() {
ApElementConfiguration equipmentDetails = Mockito.mock(ApElementConfiguration.class, Mockito.RETURNS_MOCKS);
RfConfiguration rfConfig = Mockito.mock(RfConfiguration.class, Mockito.RETURNS_MOCKS);
Profile rfProfile = Mockito.mock(Profile.class, Mockito.RETURNS_MOCKS);
Mockito.when(rfProfile.getDetails()).thenReturn(rfConfig);
Equipment equipment = Mockito.mock(Equipment.class);
Mockito.when(equipment.getDetails()).thenReturn(equipmentDetails);
OpensyncAPConfig opensyncAPConfig = Mockito.mock(OpensyncAPConfig.class, Mockito.RETURNS_MOCKS);
Mockito.when(opensyncAPConfig.getCountryCode()).thenReturn(CountryCode.CA.getName());
Mockito.when(opensyncAPConfig.getCustomerEquipment()).thenReturn(equipment);
Mockito.when(opensyncAPConfig.getRfProfile()).thenReturn(rfProfile);
return opensyncAPConfig;
}
} }