From a98cca3d8cb5b99dacaa095dfeafcefa7a3c1032 Mon Sep 17 00:00:00 2001 From: Lynn Shi Date: Thu, 29 Apr 2021 18:21:59 -0400 Subject: [PATCH] WIFI-2080 Add support for cell size attributes lightweight provisioning changes to AP --- .../OpensyncCloudGatewayController.java | 15 ++ .../integration/OvsdbClientInterface.java | 3 + .../opensync/ovsdb/TipWlanOvsdbClient.java | 19 +++ .../wlan/opensync/ovsdb/dao/OvsdbDao.java | 5 + .../opensync/ovsdb/dao/OvsdbRrmConfig.java | 130 ++++++++++++------ 5 files changed, 133 insertions(+), 39 deletions(-) diff --git a/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/controller/OpensyncCloudGatewayController.java b/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/controller/OpensyncCloudGatewayController.java index c2aa0ba..841fa54 100644 --- a/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/controller/OpensyncCloudGatewayController.java +++ b/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/controller/OpensyncCloudGatewayController.java @@ -32,6 +32,7 @@ import com.telecominfraproject.wlan.core.model.service.GatewayType; import com.telecominfraproject.wlan.core.model.service.ServiceInstanceInformation; import com.telecominfraproject.wlan.core.server.container.ConnectorProperties; import com.telecominfraproject.wlan.datastore.exceptions.DsEntityNotFoundException; +import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes; import com.telecominfraproject.wlan.equipmentgateway.models.CEGWBaseCommand; import com.telecominfraproject.wlan.equipmentgateway.models.CEGWBlinkRequest; import com.telecominfraproject.wlan.equipmentgateway.models.CEGWChangeRedirectorHost; @@ -42,6 +43,7 @@ import com.telecominfraproject.wlan.equipmentgateway.models.CEGWConfigChangeNoti import com.telecominfraproject.wlan.equipmentgateway.models.CEGWFirmwareDownloadRequest; import com.telecominfraproject.wlan.equipmentgateway.models.CEGWFirmwareFlashRequest; import com.telecominfraproject.wlan.equipmentgateway.models.CEGWNewChannelRequest; +import com.telecominfraproject.wlan.equipmentgateway.models.CEGWCellSizeRequest; import com.telecominfraproject.wlan.equipmentgateway.models.CEGWRadioResetRequest; import com.telecominfraproject.wlan.equipmentgateway.models.CEGWRebootRequest; import com.telecominfraproject.wlan.equipmentgateway.models.CEGWRouteCheck; @@ -205,6 +207,9 @@ public class OpensyncCloudGatewayController { case NewChannelRequest: ret.add(sendNewChannelRequest(session, (CEGWNewChannelRequest) command)); break; + case CellSizeRequest: + ret.add(sendCellSizeRequest(session, (CEGWCellSizeRequest) command)); + break; default: LOG.warn("[{}] Failed to deliver command {}, unsupported command type", inventoryId, command); ret.add(new EquipmentCommandResponse( @@ -296,6 +301,10 @@ public class OpensyncCloudGatewayController { private EquipmentCommandResponse sendNewChannelRequest(OvsdbSession session, CEGWNewChannelRequest command) { return sendMessage(session, command.getInventoryId(), command); } + + private EquipmentCommandResponse sendCellSizeRequest(OvsdbSession session, CEGWCellSizeRequest command) { + return sendMessage(session, command.getInventoryId(), command); + } /** * Deliver a message in payload to the CE @@ -333,6 +342,12 @@ public class OpensyncCloudGatewayController { String resultDetails = tipwlanOvsdbClient.processNewChannelsRequest(inventoryId, newBackupChannels,newPrimaryChannels); response.setResultDetail(resultDetails); + } else if (command instanceof CEGWCellSizeRequest) { + CEGWCellSizeRequest request = (CEGWCellSizeRequest) command; + Map cellSizeAttributeMap = request.getCellSizeAttributesMap(); + + String resultDetails = tipwlanOvsdbClient.processCellSizeAttributesRequest(inventoryId, cellSizeAttributeMap); + response.setResultDetail(resultDetails); } else if (command instanceof CEGWFirmwareDownloadRequest) { diff --git a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OvsdbClientInterface.java b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OvsdbClientInterface.java index a4bb897..c13eed0 100644 --- a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OvsdbClientInterface.java +++ b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OvsdbClientInterface.java @@ -6,6 +6,7 @@ import java.util.Set; import com.telecominfraproject.wlan.core.model.equipment.MacAddress; import com.telecominfraproject.wlan.core.model.equipment.RadioType; +import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes; public interface OvsdbClientInterface { @@ -33,4 +34,6 @@ public interface OvsdbClientInterface { String processNewChannelsRequest(String apId, Map backupChannelMap, Map primaryChannelMap); + String processCellSizeAttributesRequest(String apId, Map cellSizeAttributeMap); + } diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java index bcd4170..6b6eaa6 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java @@ -10,6 +10,7 @@ import com.netflix.servo.tag.TagList; import com.telecominfraproject.wlan.cloudmetrics.CloudMetricsTags; import com.telecominfraproject.wlan.core.model.equipment.MacAddress; import com.telecominfraproject.wlan.core.model.equipment.RadioType; +import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes; import com.telecominfraproject.wlan.opensync.external.integration.OpensyncExternalIntegrationInterface; import com.telecominfraproject.wlan.opensync.external.integration.OpensyncExternalIntegrationInterface.RowUpdateOperation; import com.telecominfraproject.wlan.opensync.external.integration.OvsdbClientInterface; @@ -965,5 +966,23 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface { return "failed to change backup and/or primary channels for AP " + apId; } } + + public String processCellSizeAttributesRequest(String apId, Map cellSizeAttributeMap) { + LOG.info("TipWlanOvsdbClient::processCellSizeAttributesRequest for AP {}", apId); + + try { + OvsdbSession session = ovsdbSessionMapInterface.getSession(apId); + OvsdbClient ovsdbClient = session.getOvsdbClient(); + ovsdbDao.processCellSizeAttributesRequest(ovsdbClient, cellSizeAttributeMap); + LOG.info("TipWlanOvsdbClient::processCellSizeAttributesRequest change cellSizeAttributes for AP {}", + apId); + return " change cell size attributes for AP " + apId; + } catch (Exception e) { + LOG.error( + "TipWlanOvsdbClient::processCellSizeAttributesRequest failed to change cell size attributes for AP {}", + apId, e); + return "failed to change cell size attributes for AP " + apId; + } + } } diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java index 3d11125..7b8901d 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Component; import com.telecominfraproject.wlan.core.model.equipment.MacAddress; import com.telecominfraproject.wlan.core.model.equipment.RadioType; +import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes; 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.OpensyncAPInetState; @@ -188,6 +189,10 @@ public class OvsdbDao extends OvsdbDaoBase { Map primaryChannelMap) { ovsdbRrm.processNewChannelsRequest(ovsdbClient, backupChannelMap, primaryChannelMap); } + + public void processCellSizeAttributesRequest(OvsdbClient ovsdbClient, Map cellSizeAttributeMap) { + ovsdbRrm.processCellSizeAttributesRequest(ovsdbClient, cellSizeAttributeMap); + } public void rebootOrResetAp(OvsdbClient ovsdbClient, String ovsdbAwlanApSwitchSoftwareBank) { ovsdbNode.rebootOrResetAp(ovsdbClient, ovsdbAwlanApSwitchSoftwareBank); diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbRrmConfig.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbRrmConfig.java index bc81f75..c9c03bb 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbRrmConfig.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbRrmConfig.java @@ -16,6 +16,7 @@ import com.telecominfraproject.wlan.core.model.equipment.RadioBestApSettings; 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.CellSizeAttributes; import com.telecominfraproject.wlan.equipment.models.ElementRadioConfiguration; import com.telecominfraproject.wlan.equipment.models.ManagementRate; import com.telecominfraproject.wlan.equipment.models.MulticastRate; @@ -114,43 +115,10 @@ public class OvsdbRrmConfig extends OvsdbDaoBase { } } - int multicastRateMbps = 0; - if (multicastRate != null) { - switch (multicastRate) { - case rate6mbps: - multicastRateMbps = 6; - break; - case rate9mbps: - multicastRateMbps = 9; - break; - case rate12mbps: - multicastRateMbps = 12; - break; - case rate18mbps: - multicastRateMbps = 18; - break; - case rate24mbps: - multicastRateMbps = 24; - break; - case rate36mbps: - multicastRateMbps = 36; - break; - case rate48mbps: - multicastRateMbps = 48; - break; - case rate54mbps: - multicastRateMbps = 54; - break; - case auto: - default: - multicastRateMbps = 0; - } - } - if (freqBand != null) { try { configureWifiRrm(ovsdbClient, freqBand, backupChannel, probeResponseThresholdDb, - clientDisconnectThresholdDb, managementRate, bestApSettings, multicastRateMbps); + clientDisconnectThresholdDb, managementRate, bestApSettings, multicastRate); } catch (OvsdbClientException e) { LOG.error("configureRrm failed with OvsdbClient exception.", e); throw new RuntimeException(e); @@ -169,7 +137,7 @@ public class OvsdbRrmConfig extends OvsdbDaoBase { void configureWifiRrm(OvsdbClient ovsdbClient, String freqBand, int backupChannel, AutoOrManualValue probeResponseThreshold, AutoOrManualValue clientDisconnectThreshold, - ManagementRate managementRate, RadioBestApSettings bestApSettings, int multicastRate) + ManagementRate managementRate, RadioBestApSettings bestApSettings, MulticastRate multicastRate) throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException { List operations = new ArrayList<>(); @@ -178,7 +146,11 @@ public class OvsdbRrmConfig extends OvsdbDaoBase { updateColumns.put("freq_band", new Atom<>(freqBand)); updateColumns.put("backup_channel", new Atom<>(backupChannel)); - updateColumns.put("mcast_rate", new Atom<>(multicastRate)); + if (multicastRate == null || multicastRate == MulticastRate.auto) { + updateColumns.put("mcast_rate", new Atom<>(0)); + } else { + updateColumns.put("mcast_rate", new Atom<>(managementRate.getId())); + } if (probeResponseThreshold == null || probeResponseThreshold.isAuto()) { updateColumns.put("probe_resp_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set()); @@ -186,7 +158,7 @@ public class OvsdbRrmConfig extends OvsdbDaoBase { updateColumns.put("probe_resp_threshold", new Atom<>(probeResponseThreshold.getValue())); } - if (probeResponseThreshold == null || clientDisconnectThreshold.isAuto()) { + if (clientDisconnectThreshold == null || clientDisconnectThreshold.isAuto()) { updateColumns.put("client_disconnect_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set()); } else { updateColumns.put("client_disconnect_threshold", new Atom<>(clientDisconnectThreshold.getValue())); @@ -219,7 +191,7 @@ public class OvsdbRrmConfig extends OvsdbDaoBase { CompletableFuture fResult = ovsdbClient.transact(ovsdbName, operations); OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS); - + LOG.debug("Provisioned rrm config with multicastRate {} Mbps for {}", multicastRate, freqBand); for (OperationResult res : result) { @@ -233,7 +205,6 @@ public class OvsdbRrmConfig extends OvsdbDaoBase { LOG.error("configureWifiRrm error {}", (res)); throw new RuntimeException("configureWifiRrm " + ((ErrorResult) res).getError() + " " + ((ErrorResult) res).getDetails()); } - } } @@ -289,6 +260,87 @@ public class OvsdbRrmConfig extends OvsdbDaoBase { } } + + void processCellSizeAttributesRequest(OvsdbClient ovsdbClient, Map cellSizeAttributesMap) { + + LOG.info("OvsdbDao::processCellSizeAttributesRequest cellSizeAttributes {}", cellSizeAttributesMap); + try { + List operations = new ArrayList<>(); + + cellSizeAttributesMap.entrySet().stream().forEach(c -> { + String freqBand = OvsdbToWlanCloudTypeMappingUtility.getOvsdbRadioFreqBandForRadioType(c.getKey()); + List conditions = new ArrayList<>(); + conditions.add(new Condition("freq_band", Function.EQUALS, new Atom<>(freqBand))); + Map updateRrmColumns = new HashMap<>(); + + CellSizeAttributes cellSizeAttributes = c.getValue(); + MulticastRate multicastRate = cellSizeAttributes.getMulticastRate(); + if (multicastRate == null || multicastRate == MulticastRate.auto) { + updateRrmColumns.put("mcast_rate", new Atom<>(0)); + } else { + updateRrmColumns.put("mcast_rate", new Atom<>(multicastRate.getId())); + } + + Integer probeResponseThreshold = cellSizeAttributes.getProbeResponseThresholdDb(); + if (probeResponseThreshold == null) { + updateRrmColumns.put("probe_resp_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set()); + } else { + updateRrmColumns.put("probe_resp_threshold", new Atom<>(probeResponseThreshold.intValue())); + } + + Integer clientDisconnectThreshold = cellSizeAttributes.getClientDisconnectThresholdDb(); + if (clientDisconnectThreshold == null) { + updateRrmColumns.put("client_disconnect_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set()); + } else { + updateRrmColumns.put("client_disconnect_threshold", new Atom<>(clientDisconnectThreshold.intValue())); + } + + ManagementRate managementRate = cellSizeAttributes.getManagementRate(); + if (managementRate == null || managementRate == ManagementRate.auto) { + updateRrmColumns.put("beacon_rate", new Atom<>(0)); + } else { + updateRrmColumns.put("beacon_rate", new Atom<>(managementRate.getId() * 10)); + } + + Row rowRrm = new Row(updateRrmColumns); + operations.add(new Update(wifiRrmConfigDbTable, conditions, rowRrm)); + + Map updateRadioColumns = new HashMap<>(); + Integer txPower = cellSizeAttributes.getEirpTxPowerDb(); + if (txPower > 0) { + updateRadioColumns.put("tx_power", new Atom<>(txPower)); + } else { + updateRadioColumns.put("tx_power", new com.vmware.ovsdb.protocol.operation.notation.Set()); + } + Row rowRadio = new Row(updateRadioColumns); + operations.add(new Update(wifiRadioConfigDbTable, conditions, rowRadio)); + }); + + CompletableFuture fResult = ovsdbClient.transact(ovsdbName, operations); + OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS); + + for (OperationResult res : result) { + LOG.info("Op Result {}", res); + + if (res instanceof InsertResult) { + LOG.info("processCellSizeAttributesRequest insert new row result {}", (res)); + // for insert, make sure it is actually in the table + confirmRowExistsInTable(ovsdbClient, ((InsertResult) res).getUuid(), wifiRrmConfigDbTable); + } else if (res instanceof ErrorResult) { + LOG.error("configureWifiRrm error {}", (res)); + throw new RuntimeException("configureWifiRrm " + ((ErrorResult) res).getError() + " " + ((ErrorResult) res).getDetails()); + } + } + + LOG.info("Updated ovsdb config for cell size attributes."); + } catch (ExecutionException e) { + LOG.error("Error in processCellSizeAttributesRequest", e); + } catch (OvsdbClientException | TimeoutException | InterruptedException e) { + LOG.error("Error in processCellSizeAttributesRequest", e); + throw new RuntimeException(e); + } + + } void removeWifiRrm(OvsdbClient ovsdbClient) { try {