Compare commits

..

1 Commits

Author SHA1 Message Date
Mike Hansen
af604289cc WIFI-2988: Ovsdb schema check for Wifi_Radio_Config and Wifi_RRM_Config
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-13 15:17:50 -04:00
2 changed files with 179 additions and 153 deletions

View File

@@ -1,8 +1,27 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao; package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.core.model.equipment.ChannelBandwidth; import com.telecominfraproject.wlan.core.model.equipment.ChannelBandwidth;
import com.telecominfraproject.wlan.core.model.equipment.RadioType; import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.equipment.models.*; 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.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiRadioConfigInfo; import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiRadioConfigInfo;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiVifConfigInfo; import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiVifConfigInfo;
@@ -11,19 +30,15 @@ import com.telecominfraproject.wlan.profile.rf.models.RfElementConfiguration;
import com.vmware.ovsdb.exception.OvsdbClientException; import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.Operation; import com.vmware.ovsdb.protocol.operation.Operation;
import com.vmware.ovsdb.protocol.operation.Update; import com.vmware.ovsdb.protocol.operation.Update;
import com.vmware.ovsdb.protocol.operation.notation.*; 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.OperationResult; import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.schema.DatabaseSchema;
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.*;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@Component @Component
public class OvsdbRadioConfig extends OvsdbDaoBase { public class OvsdbRadioConfig extends OvsdbDaoBase {
@@ -39,13 +54,15 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
Map<String, WifiRadioConfigInfo> provisionedRadioConfigs = ovsdbGet.getProvisionedWifiRadioConfigs(ovsdbClient); Map<String, WifiRadioConfigInfo> provisionedRadioConfigs = ovsdbGet.getProvisionedWifiRadioConfigs(ovsdbClient);
Map<String, WifiVifConfigInfo> vifConfigs = ovsdbGet.getProvisionedWifiVifConfigs(ovsdbClient); Map<String, WifiVifConfigInfo> vifConfigs = ovsdbGet.getProvisionedWifiVifConfigs(ovsdbClient);
List<Operation> operations = new ArrayList<>(); List<Operation> operations = new ArrayList<>();
try {
CompletableFuture<DatabaseSchema> cfDatabaseSchema = ovsdbClient.getSchema(ovsdbName);
DatabaseSchema databaseSchema = cfDatabaseSchema.get();
Set<String> columnNames = databaseSchema.getTables().get(wifiRadioConfigDbTable).getColumns().keySet();
for (RadioType radioType : apElementConfiguration.getRadioMap().keySet()) { for (RadioType radioType : apElementConfiguration.getRadioMap().keySet()) {
Map<String, String> hwConfig = new HashMap<>(); Map<String, String> hwConfig = new HashMap<>();
ElementRadioConfiguration elementRadioConfig = apElementConfiguration.getRadioMap().get(radioType); ElementRadioConfiguration elementRadioConfig = apElementConfiguration.getRadioMap().get(radioType);
RfElementConfiguration rfElementConfig = rfConfig.getRfConfig(radioType); RfElementConfiguration rfElementConfig = rfConfig.getRfConfig(radioType);
if (elementRadioConfig == null || rfElementConfig == null) {
continue;
}
boolean autoChannelSelection = rfElementConfig.getAutoChannelSelection(); boolean autoChannelSelection = rfElementConfig.getAutoChannelSelection();
int channel = elementRadioConfig.getActiveChannel(autoChannelSelection); int channel = elementRadioConfig.getActiveChannel(autoChannelSelection);
LOG.debug("configureWifiRadios autoChannelSelection {} activeChannel {} getChannelNumber {} ", LOG.debug("configureWifiRadios autoChannelSelection {} activeChannel {} getChannelNumber {} ",
@@ -55,14 +72,11 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
RadioConfiguration radioConfig = apElementConfiguration.getAdvancedRadioMap().get(radioType); RadioConfiguration radioConfig = apElementConfiguration.getAdvancedRadioMap().get(radioType);
int beaconInterval = rfElementConfig.getBeaconInterval(); int beaconInterval = rfElementConfig.getBeaconInterval();
boolean enabled = radioConfig.getRadioAdminState().equals(StateSetting.enabled); boolean enabled = radioConfig.getRadioAdminState().equals(StateSetting.enabled);
boolean autoCellSizeSelection = rfElementConfig.getAutoCellSizeSelection(); int txPower;
int txPower = 0; if (elementRadioConfig.getEirpTxPower().getSource() == SourceType.profile) {
if (autoCellSizeSelection) {
if (elementRadioConfig.getEirpTxPower() != null) {
txPower = elementRadioConfig.getEirpTxPower().getValue();
}
} else {
txPower = rfElementConfig.getEirpTxPower(); txPower = rfElementConfig.getEirpTxPower();
} else {
txPower = elementRadioConfig.getEirpTxPower().getValue();
} }
String hwMode = getHwMode(rfElementConfig); String hwMode = getHwMode(rfElementConfig);
String freqBand = getHwConfigAndFreq(radioType, hwConfig); String freqBand = getHwConfigAndFreq(radioType, hwConfig);
@@ -98,7 +112,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
} }
try { try {
configureWifiRadios(freqBand, channel, hwConfig, country.toUpperCase(), beaconInterval, configureWifiRadios(freqBand, channel, hwConfig, country.toUpperCase(), beaconInterval,
enabled, hwMode, ht_mode, txPower, mimoMode, vifUuidsForRadio, operations, maxNumClients); enabled, hwMode, ht_mode, txPower, mimoMode, vifUuidsForRadio, operations, maxNumClients,columnNames);
} catch (OvsdbClientException e) { } catch (OvsdbClientException e) {
LOG.error("ConfigureWifiRadios failed with OvsdbClient exception.", e); LOG.error("ConfigureWifiRadios failed with OvsdbClient exception.", e);
throw new RuntimeException(e); throw new RuntimeException(e);
@@ -113,7 +127,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
try {
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations); CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS); OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) { for (OperationResult res : result) {
@@ -222,7 +236,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
void configureWifiRadios(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, Set<Uuid> vifUuidsForRadio, List<Operation> operations, int maxNumClients) throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException { int mimoMode, Set<Uuid> vifUuidsForRadio, List<Operation> operations, int maxNumClients, Set<String> tableColumns) throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException {
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)));
@@ -248,7 +262,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
updateColumns.put("hw_mode", new Atom<>(hwMode)); updateColumns.put("hw_mode", new Atom<>(hwMode));
} }
configureCustomOptionsMap(maxNumClients, updateColumns); configureCustomOptionsMap(maxNumClients, updateColumns);
setTxAndRxChainmask(mimoMode, updateColumns); setTxAndRxChainmask(mimoMode, updateColumns,tableColumns);
if (vifUuidsForRadio.size() > 0) { if (vifUuidsForRadio.size() > 0) {
com.vmware.ovsdb.protocol.operation.notation.Set vifConfigUuids = com.vmware.ovsdb.protocol.operation.notation.Set com.vmware.ovsdb.protocol.operation.notation.Set vifConfigUuids = com.vmware.ovsdb.protocol.operation.notation.Set
.of(vifUuidsForRadio); .of(vifUuidsForRadio);
@@ -267,7 +281,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
updateColumns.put("custom_options", customOptionsMap); updateColumns.put("custom_options", customOptionsMap);
} }
void setTxAndRxChainmask(int mimoMode, Map<String, Value> updateColumns) { void setTxAndRxChainmask(int mimoMode, Map<String, Value> updateColumns, Set<String> tableColumns) {
/* /*
* 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
@@ -279,11 +293,17 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
* 3 7 * 3 7
* 4 15 * 4 15
*/ */
if (mimoMode == 2) {mimoMode = 3;} if (mimoMode == 2) {
else if (mimoMode == 3) {mimoMode = 7;} mimoMode = 3;
else if (mimoMode == 4) {mimoMode = 15;} } else if (mimoMode == 3) {
mimoMode = 7;
} else if (mimoMode == 4) {
mimoMode = 15;
}
updateColumns.put("tx_chainmask", new Atom<>(mimoMode)); updateColumns.put("tx_chainmask", new Atom<>(mimoMode));
if (tableColumns.contains("rx_chainmask")) {
updateColumns.put("rx_chainmask", new Atom<>(mimoMode)); updateColumns.put("rx_chainmask", new Atom<>(mimoMode));
} }
}
} }

View File

@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; 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.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -39,6 +40,7 @@ import com.vmware.ovsdb.protocol.operation.result.ErrorResult;
import com.vmware.ovsdb.protocol.operation.result.InsertResult; import com.vmware.ovsdb.protocol.operation.result.InsertResult;
import com.vmware.ovsdb.protocol.operation.result.OperationResult; import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.operation.result.UpdateResult; import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
import com.vmware.ovsdb.protocol.schema.DatabaseSchema;
import com.vmware.ovsdb.service.OvsdbClient; import com.vmware.ovsdb.service.OvsdbClient;
@Component @Component
@@ -72,19 +74,21 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
boolean autoChannelSelection = rfElementConfig.getAutoChannelSelection(); boolean autoChannelSelection = rfElementConfig.getAutoChannelSelection();
int backupChannel = elementRadioConfig.getActiveBackupChannel(autoChannelSelection); int backupChannel = elementRadioConfig.getActiveBackupChannel(autoChannelSelection);
LOG.debug("configureWifiRadios autoChannelSelection {} activeBackupChannel {}",
autoChannelSelection, backupChannel);
boolean autoCellSizeSelection = rfElementConfig.getAutoCellSizeSelection(); AutoOrManualValue probeResponseThresholdDb = null;
Integer probeResponseThresholdDb = null; AutoOrManualValue clientDisconnectThresholdDb = null;
Integer clientDisconnectThresholdDb = null;
if (elementRadioConfig.getProbeResponseThresholdDb() != null) { if (elementRadioConfig.getProbeResponseThresholdDb() != null) {
probeResponseThresholdDb = getSourcedValue(autoCellSizeSelection, probeResponseThresholdDb = getSourcedValue(elementRadioConfig.getProbeResponseThresholdDb().getSource(),
rfElementConfig.getProbeResponseThresholdDb(), rfElementConfig.getProbeResponseThresholdDb(),
elementRadioConfig.getProbeResponseThresholdDb().getValue()); elementRadioConfig.getProbeResponseThresholdDb().getValue());
} }
if (elementRadioConfig.getClientDisconnectThresholdDb() != null) { if (elementRadioConfig.getClientDisconnectThresholdDb() != null) {
clientDisconnectThresholdDb = getSourcedValue(autoCellSizeSelection, clientDisconnectThresholdDb = getSourcedValue(
elementRadioConfig.getClientDisconnectThresholdDb().getSource(),
rfElementConfig.getClientDisconnectThresholdDb(), rfElementConfig.getClientDisconnectThresholdDb(),
elementRadioConfig.getClientDisconnectThresholdDb().getValue()); elementRadioConfig.getClientDisconnectThresholdDb().getValue());
} }
@@ -95,13 +99,15 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
RadioBestApSettings bestApSettings = null; RadioBestApSettings bestApSettings = null;
if (radioConfig != null) { if (radioConfig != null) {
if (radioConfig.getMulticastRate() != null) { if (radioConfig.getMulticastRate() != null) {
multicastRate = autoCellSizeSelection ? multicastRate = radioConfig.getMulticastRate().getSource() == SourceType.profile
radioConfig.getMulticastRate().getValue() : rfElementConfig.getMulticastRate(); ? rfElementConfig.getMulticastRate()
: radioConfig.getMulticastRate().getValue();
} }
if (radioConfig.getManagementRate() != null) { if (radioConfig.getManagementRate() != null) {
managementRate = autoCellSizeSelection ? managementRate = radioConfig.getManagementRate().getSource() == SourceType.profile
radioConfig.getManagementRate().getValue() : rfElementConfig.getManagementRate(); ? rfElementConfig.getManagementRate()
: radioConfig.getManagementRate().getValue();
} }
if (radioConfig.getBestApSettings() != null) { if (radioConfig.getBestApSettings() != null) {
@@ -132,40 +138,50 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
} }
void configureWifiRrm(OvsdbClient ovsdbClient, String freqBand, int backupChannel, void configureWifiRrm(OvsdbClient ovsdbClient, String freqBand, int backupChannel,
Integer probeResponseThreshold, Integer clientDisconnectThreshold, AutoOrManualValue probeResponseThreshold, AutoOrManualValue clientDisconnectThreshold,
ManagementRate managementRate, RadioBestApSettings bestApSettings, MulticastRate multicastRate) ManagementRate managementRate, RadioBestApSettings bestApSettings, MulticastRate multicastRate)
throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException { throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException {
CompletableFuture<DatabaseSchema> cfDatabaseSchema = ovsdbClient.getSchema(ovsdbName);
DatabaseSchema databaseSchema = cfDatabaseSchema.get();
Set<String> columnNames = databaseSchema.getTables().get(wifiRrmConfigDbTable).getColumns().keySet();
List<Operation> operations = new ArrayList<>(); List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>(); Map<String, Value> updateColumns = new HashMap<>();
updateColumns.put("freq_band", new Atom<>(freqBand)); updateColumns.put("freq_band", new Atom<>(freqBand));
updateColumns.put("backup_channel", new Atom<>(backupChannel)); updateColumns.put("backup_channel", new Atom<>(backupChannel));
if (columnNames.contains("freq_band")) updateColumns.put("freq_band", new Atom<>(freqBand));
if (columnNames.contains("backup_channel")) updateColumns.put("backup_channel", new Atom<>(backupChannel));
if (columnNames.contains("mcast_rate")) {
if (multicastRate == null || multicastRate == MulticastRate.auto) { if (multicastRate == null || multicastRate == MulticastRate.auto) {
updateColumns.put("mcast_rate", new Atom<>(0)); updateColumns.put("mcast_rate", new Atom<>(0));
} else { } else {
updateColumns.put("mcast_rate", new Atom<>(multicastRate.getId())); updateColumns.put("mcast_rate", new Atom<>(managementRate.getId()));
} }
}
if (probeResponseThreshold == null) { if (columnNames.contains("probe_resp_threshold")) {
if (probeResponseThreshold == null || probeResponseThreshold.isAuto()) {
updateColumns.put("probe_resp_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set()); updateColumns.put("probe_resp_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else { } else {
updateColumns.put("probe_resp_threshold", new Atom<>(probeResponseThreshold.intValue())); updateColumns.put("probe_resp_threshold", new Atom<>(probeResponseThreshold.getValue()));
} }
}
if (clientDisconnectThreshold == null) { if (columnNames.contains("client_disconnect_threshold")) {
if (clientDisconnectThreshold == null || clientDisconnectThreshold.isAuto()) {
updateColumns.put("client_disconnect_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set()); updateColumns.put("client_disconnect_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else { } else {
updateColumns.put("client_disconnect_threshold", new Atom<>(clientDisconnectThreshold.intValue())); updateColumns.put("client_disconnect_threshold", new Atom<>(clientDisconnectThreshold.getValue()));
} }
}
if (columnNames.contains("beacon_rate")) {
if (managementRate == null || managementRate == ManagementRate.auto) { if (managementRate == null || managementRate == ManagementRate.auto) {
updateColumns.put("beacon_rate", new Atom<>(0)); updateColumns.put("beacon_rate", new Atom<>(0));
} else { } else {
updateColumns.put("beacon_rate", new Atom<>(managementRate.getId() * 10)); updateColumns.put("beacon_rate", new Atom<>(managementRate.getId() * 10));
} }
}
if (columnNames.contains("min_load") && columnNames.contains("snr_percentage_drop")) {
if (bestApSettings == null) { if (bestApSettings == null) {
updateColumns.put("min_load", new com.vmware.ovsdb.protocol.operation.notation.Set()); updateColumns.put("min_load", new com.vmware.ovsdb.protocol.operation.notation.Set());
updateColumns.put("snr_percentage_drop", new com.vmware.ovsdb.protocol.operation.notation.Set()); updateColumns.put("snr_percentage_drop", new com.vmware.ovsdb.protocol.operation.notation.Set());
@@ -181,7 +197,7 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
updateColumns.put("min_load", new Atom<>(bestApSettings.getMinLoadFactor())); updateColumns.put("min_load", new Atom<>(bestApSettings.getMinLoadFactor()));
} }
} }
}
Row row = new Row(updateColumns); Row row = new Row(updateColumns);
operations.add(new Insert(wifiRrmConfigDbTable, row)); operations.add(new Insert(wifiRrmConfigDbTable, row));
@@ -213,16 +229,6 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
return AutoOrManualValue.createManualInstance(equipmentValue); return AutoOrManualValue.createManualInstance(equipmentValue);
} }
//For cell size related attributes, the “manual" mode is not supported any more,
//user can create a new RF profile with desired values to achieve it
int getSourcedValue(boolean autoCellSizeSelection, int profileValue, int equipmentValue) {
if (autoCellSizeSelection) {
return equipmentValue;
} else {
return profileValue;
}
}
void processNewChannelsRequest(OvsdbClient ovsdbClient, Map<RadioType, Integer> backupChannelMap, void processNewChannelsRequest(OvsdbClient ovsdbClient, Map<RadioType, Integer> backupChannelMap,
Map<RadioType, Integer> primaryChannelMap) { Map<RadioType, Integer> primaryChannelMap) {
@@ -313,7 +319,7 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
Map<String, Value> updateRadioColumns = new HashMap<>(); Map<String, Value> updateRadioColumns = new HashMap<>();
Integer txPower = cellSizeAttributes.getEirpTxPowerDb(); Integer txPower = cellSizeAttributes.getEirpTxPowerDb();
if (txPower != null && txPower > 0) { if (txPower > 0) {
updateRadioColumns.put("tx_power", new Atom<>(txPower)); updateRadioColumns.put("tx_power", new Atom<>(txPower));
} else { } else {
updateRadioColumns.put("tx_power", new com.vmware.ovsdb.protocol.operation.notation.Set()); updateRadioColumns.put("tx_power", new com.vmware.ovsdb.protocol.operation.notation.Set());