Compare commits

..

1 Commits

Author SHA1 Message Date
Kareem Dabbour
1018bafa0e WIFI-3201 Equipments cusId/locId/profIds can no longer be updated to 0 with REST API 2021-07-21 14:08:25 -04:00
67 changed files with 21026 additions and 1789 deletions

View File

@@ -795,10 +795,7 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
long equipmentIdPostQuery = row.getLong("equipmentId");
int alarmCodePostQuery = row.getInt("alarmCode");
long createdTimestampPostQuery = row.getLong("createdTimestamp");
Alarm alarmToAdd = getOrNull(customerId, equipmentIdPostQuery, AlarmCode.getById(alarmCodePostQuery), createdTimestampPostQuery);
if (alarmToAdd != null) {
pageItems.add(alarmToAdd);
}
pageItems.add(getOrNull(customerId, equipmentIdPostQuery, AlarmCode.getById(alarmCodePostQuery), createdTimestampPostQuery));
}
break;
default:

View File

@@ -262,7 +262,7 @@ public class AlarmController {
public AlarmCounts getAlarmCounts(@RequestParam int customerId,
@RequestParam Set<Long> equipmentIdSet,
@RequestParam Set<AlarmCode> alarmCodeSet,
@RequestParam(required = false) Boolean acknowledged) {
@RequestParam Boolean acknowledged) {
LOG.debug("Getting Alarm counts for {} {} {} {}", customerId, equipmentIdSet, alarmCodeSet, acknowledged);

View File

@@ -31,6 +31,7 @@ import com.telecominfraproject.wlan.client.models.Client;
import com.telecominfraproject.wlan.client.session.models.ClientDhcpDetails;
import com.telecominfraproject.wlan.client.session.models.ClientSession;
import com.telecominfraproject.wlan.client.session.models.ClientSessionDetails;
import com.telecominfraproject.wlan.client.session.models.ClientSessionMetricDetails;
import com.telecominfraproject.wlan.core.model.entity.CountryCode;
import com.telecominfraproject.wlan.core.model.entity.MinMaxAvgValueInt;
import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
@@ -828,6 +829,16 @@ public class AllInOneWithGatewayStartListener implements ApplicationRunner {
sessionDetails.setDhcpDetails(dhcpDetails );
ClientSessionMetricDetails metricDetails = new ClientSessionMetricDetails();
metricDetails.setRssi(getRandomInt(-60, -40));
metricDetails.setRxBytes(getRandomLong(10000, 10000000));
metricDetails.setTxBytes(getRandomLong(10000, 10000000));
metricDetails.setRxMbps(getRandomFloat(50, 100));
metricDetails.setTxMbps(getRandomFloat(50, 100));
metricDetails.setSnr(getRandomInt(-90, -50));
sessionDetails.setMetricDetails(metricDetails);
clientSession.setDetails(sessionDetails);
this.clientServiceInterface.updateSession(clientSession);

View File

@@ -38,6 +38,7 @@ import com.telecominfraproject.wlan.client.models.Client;
import com.telecominfraproject.wlan.client.session.models.ClientDhcpDetails;
import com.telecominfraproject.wlan.client.session.models.ClientSession;
import com.telecominfraproject.wlan.client.session.models.ClientSessionDetails;
import com.telecominfraproject.wlan.client.session.models.ClientSessionMetricDetails;
import com.telecominfraproject.wlan.core.model.entity.CountryCode;
import com.telecominfraproject.wlan.core.model.entity.MinMaxAvgValueInt;
import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
@@ -634,7 +635,7 @@ public class AllInOneStartListener implements ApplicationRunner {
((PasspointProfile) passpointHotspotConfig.getDetails()).setPasspointVenueProfileId(passpointVenueProfileId);
((PasspointProfile) passpointHotspotConfig.getDetails()).setOsuSsidProfileId(profileSsidOpenId);
((PasspointProfile) passpointHotspotConfig.getDetails())
.setAssociatedAccessSsidProfileIds(Set.of(profileSsidPskId));
.setAssociatedAccessSsidProfileIds(List.of(profileSsidPskId));
return profileServiceInterface.create(passpointHotspotConfig);
}
@@ -1237,6 +1238,8 @@ public class AllInOneStartListener implements ApplicationRunner {
clientMetrics.setNumRxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setNumTxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setSessionId(Long.toUnsignedString(getRandomLong(3000000, 7000000)));
clientMetrics.setTxRetries(getRandomInt(30, 70));
clientMetrics.setRxDuplicatePackets(getRandomInt(30, 70));
clientMetrics.setSnr(getRandomInt(-70, -30));
@@ -1262,6 +1265,8 @@ public class AllInOneStartListener implements ApplicationRunner {
clientMetrics.setNumRxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setNumTxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setSessionId(Long.toUnsignedString(getRandomLong(3000000, 7000000)));
clientMetrics.setTxRetries(getRandomInt(30, 70));
clientMetrics.setRxDuplicatePackets(getRandomInt(30, 70));
clientMetrics.setSnr(getRandomInt(-70, -30));
@@ -1287,6 +1292,8 @@ public class AllInOneStartListener implements ApplicationRunner {
clientMetrics.setNumRxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setNumTxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setSessionId(Long.toUnsignedString(getRandomLong(3000000, 7000000)));
clientMetrics.setTxRetries(getRandomInt(30, 70));
clientMetrics.setRxDuplicatePackets(getRandomInt(30, 70));
clientMetrics.setSnr(getRandomInt(-70, -30));
@@ -1373,6 +1380,16 @@ public class AllInOneStartListener implements ApplicationRunner {
sessionDetails.setDhcpDetails(dhcpDetails);
ClientSessionMetricDetails metricDetails = new ClientSessionMetricDetails();
metricDetails.setRssi(getRandomInt(-60, -40));
metricDetails.setRxBytes(getRandomLong(10000, 10000000));
metricDetails.setTxBytes(getRandomLong(10000, 10000000));
metricDetails.setRxMbps(getRandomFloat(50, 100));
metricDetails.setTxMbps(getRandomFloat(50, 100));
metricDetails.setSnr(getRandomInt(-90, -50));
sessionDetails.setMetricDetails(metricDetails);
clientSession.setDetails(sessionDetails);
this.clientServiceInterface.updateSession(clientSession);

View File

@@ -42,6 +42,7 @@ public class ClientSessionDetails extends BaseJsonModel {
private String cpUsername;
private ClientDhcpDetails dhcpDetails;
private ClientEapDetails eapDetails;
private ClientSessionMetricDetails metricDetails;
private Boolean isReassociation;
private Integer disconnectByApReasonCode;
private Integer disconnectByClientReasonCode;
@@ -153,6 +154,12 @@ public class ClientSessionDetails extends BaseJsonModel {
}
public Long getLastEventTimestamp() {
if (getMetricDetails() != null) {
if (lastEventTimestamp != null) {
return Math.max(getMetricDetails().getLastMetricTimestamp(), lastEventTimestamp);
}
return getMetricDetails().getLastMetricTimestamp();
}
return lastEventTimestamp;
}
@@ -185,7 +192,13 @@ public class ClientSessionDetails extends BaseJsonModel {
}
public Long getLastRxTimestamp() {
return lastRxTimestamp;
if (lastRxTimestamp != null && getMetricDetails() != null && getMetricDetails().getLastRxTimestamp() != null) {
return Math.max(lastRxTimestamp, getMetricDetails().getLastRxTimestamp());
} else if (lastRxTimestamp != null) {
return lastRxTimestamp;
}
return getMetricDetails() == null ? null : getMetricDetails().getLastRxTimestamp();
}
public void setLastRxTimestamp(Long lastRxTimestamp) {
@@ -193,7 +206,12 @@ public class ClientSessionDetails extends BaseJsonModel {
}
public Long getLastTxTimestamp() {
return lastTxTimestamp;
if (lastTxTimestamp != null && getMetricDetails() != null && getMetricDetails().getLastTxTimestamp() != null) {
return Math.max(lastTxTimestamp, getMetricDetails().getLastTxTimestamp());
} else if (lastTxTimestamp != null) {
return lastTxTimestamp;
}
return getMetricDetails() == null ? null : getMetricDetails().getLastTxTimestamp();
}
public void setLastTxTimestamp(Long lastTxTimestamp) {
@@ -239,6 +257,14 @@ public class ClientSessionDetails extends BaseJsonModel {
this.eapDetails = eapDetails;
}
public ClientSessionMetricDetails getMetricDetails() {
return metricDetails;
}
public void setMetricDetails(ClientSessionMetricDetails metricDetails) {
this.metricDetails = metricDetails;
}
/**
* RADIUS 802.1x EAP_Success timestamp
*
@@ -488,7 +514,9 @@ public class ClientSessionDetails extends BaseJsonModel {
return AssociationState.Cloud_Timeout;
}
if (firstDataRcvdTimestamp != null || firstDataSentTimestamp != null) {
if (firstDataRcvdTimestamp != null || firstDataSentTimestamp != null
|| (getMetricDetails() != null && (getMetricDetails().getLastRxTimestamp() != null
|| getMetricDetails().getLastTxTimestamp() != null))) {
return AssociationState.Active_Data;
}
if (assocTimestamp != null) {
@@ -507,6 +535,9 @@ public class ClientSessionDetails extends BaseJsonModel {
if (this.eapDetails != null) {
ret.setEapDetails(this.eapDetails.clone());
}
if (this.metricDetails != null) {
ret.setMetricDetails(this.metricDetails.clone());
}
if (this.lastFailureDetails != null) {
ret.setLastFailureDetails(this.lastFailureDetails.clone());
}
@@ -523,7 +554,7 @@ public class ClientSessionDetails extends BaseJsonModel {
disconnectByApTimestamp, disconnectByClientInternalReasonCode, disconnectByClientReasonCode,
disconnectByClientTimestamp, dynamicVlan, eapDetails, firstDataRcvdTimestamp, firstDataSentTimestamp,
firstFailureDetails, hostname, ipAddress, ipTimestamp, is11KUsed, is11RUsed, is11VUsed, isReassociation,
lastEventTimestamp, lastFailureDetails, lastRxTimestamp, lastTxTimestamp,
lastEventTimestamp, lastFailureDetails, lastRxTimestamp, lastTxTimestamp, metricDetails,
portEnabledTimestamp, previousValidSessionId, priorEquipmentId, priorSessionId, radioType,
radiusUsername, securityType, sessionId, ssid, steerType, timeoutTimestamp, userAgentStr,
associationState);
@@ -563,6 +594,7 @@ public class ClientSessionDetails extends BaseJsonModel {
&& Objects.equals(lastFailureDetails, other.lastFailureDetails)
&& Objects.equals(lastRxTimestamp, other.lastRxTimestamp)
&& Objects.equals(lastTxTimestamp, other.lastTxTimestamp)
&& Objects.equals(metricDetails, other.metricDetails)
&& Objects.equals(portEnabledTimestamp, other.portEnabledTimestamp)
&& Objects.equals(previousValidSessionId, other.previousValidSessionId)
&& Objects.equals(priorEquipmentId, other.priorEquipmentId)
@@ -645,6 +677,9 @@ public class ClientSessionDetails extends BaseJsonModel {
} else if (latest.eapDetails != null) {
this.eapDetails.mergeDetails(latest.eapDetails);
}
if (null != latest.metricDetails) {
this.metricDetails = latest.metricDetails;
}
if (null != latest.getIsReassociation()) {
this.isReassociation = latest.getIsReassociation();

View File

@@ -0,0 +1,365 @@
package com.telecominfraproject.wlan.client.session.models;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
/**
* @author ekeddy
*
*/
public class ClientSessionMetricDetails extends BaseJsonModel
{
private static final long serialVersionUID = -6626815155700131150L;
private static final Logger LOG = LoggerFactory.getLogger(ClientSessionMetricDetails.class);
private Long rxBytes;
private Long txBytes;
private Long totalRxPackets;
private Long totalTxPackets;
private Float rxMbps;
private Float txMbps;
private Integer rssi;
private Integer snr;
private Long rxRateKbps; // from MCS
private Long txRateKbps; // from MCS
private long lastMetricTimestamp;
private Long lastRxTimestamp;
private Long lastTxTimestamp;
private String classification;
/**
* The number of dataframes transmitted TO the client from the AP.
*/
private Integer txDataFrames;
/**
* The number of data frames transmitted TO the client that were retried.
* Note this is not the same as the number of retries.
*/
private Integer txDataFramesRetried;
/**
* The number of dataframes transmitted FROM the client TO the AP.
*/
private Integer rxDataFrames;
public Long getRxBytes() {
return rxBytes;
}
public void setRxBytes(Long rxBytes) {
this.rxBytes = rxBytes;
}
public Long getTxBytes() {
return txBytes;
}
public void setTxBytes(Long txBytes) {
this.txBytes = txBytes;
}
public Long getTotalRxPackets() {
return totalRxPackets;
}
public void setTotalRxPackets(Long totalRxPackets) {
this.totalRxPackets = totalRxPackets;
}
public Long getTotalTxPackets() {
return totalTxPackets;
}
public void setTotalTxPackets(Long totalTxPackets) {
this.totalTxPackets = totalTxPackets;
}
public Float getRxMbps() {
return rxMbps;
}
public void setRxMbps(Float rxMbps) {
this.rxMbps = rxMbps;
}
public Float getTxMbps() {
return txMbps;
}
public void setTxMbps(Float txMbps) {
this.txMbps = txMbps;
}
public Integer getRssi() {
return rssi;
}
public void setRssi(Integer rssi) {
this.rssi = rssi;
}
public Integer getSnr() {
return snr;
}
public void setSnr(Integer snr) {
this.snr = snr;
}
public Long getRxRateKbps() {
return rxRateKbps;
}
public void setRxRateKbps(Long rxRateKbps) {
this.rxRateKbps = rxRateKbps;
}
public Long getTxRateKbps() {
return txRateKbps;
}
public void setTxRateKbps(Long txRateKbps) {
this.txRateKbps = txRateKbps;
}
public Integer getTxDataFrames() {
return txDataFrames;
}
public void setTxDataFrames(Integer txDataFrames) {
this.txDataFrames = txDataFrames;
}
public Integer getTxDataFramesRetried() {
return txDataFramesRetried;
}
public void setTxDataFramesRetried(Integer txDataFramesRetried) {
this.txDataFramesRetried = txDataFramesRetried;
}
public long getLastMetricTimestamp() {
return lastMetricTimestamp;
}
public void setLastMetricTimestamp(long lastMetricTimestamp) {
this.lastMetricTimestamp = lastMetricTimestamp;
}
public Long getLastRxTimestamp() {
return lastRxTimestamp;
}
public void setLastRxTimestamp(Long lastRxTimestamp) {
this.lastRxTimestamp = lastRxTimestamp;
}
public Long getLastTxTimestamp() {
return lastTxTimestamp;
}
public void setLastTxTimestamp(Long lastTxTimestamp) {
this.lastTxTimestamp = lastTxTimestamp;
}
public Integer getRxDataFrames() {
return rxDataFrames;
}
public void setRxDataFrames(Integer rxDataFrames) {
this.rxDataFrames = rxDataFrames;
}
public String getClassification() {
return classification;
}
public void setClassification(String classification) {
this.classification = classification;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((classification == null) ? 0 : classification.hashCode());
result = prime * result + (int) (lastMetricTimestamp ^ (lastMetricTimestamp >>> 32));
result = prime * result + ((lastRxTimestamp == null) ? 0 : lastRxTimestamp.hashCode());
result = prime * result + ((lastTxTimestamp == null) ? 0 : lastTxTimestamp.hashCode());
result = prime * result + ((rssi == null) ? 0 : rssi.hashCode());
result = prime * result + ((rxBytes == null) ? 0 : rxBytes.hashCode());
result = prime * result + ((rxDataFrames == null) ? 0 : rxDataFrames.hashCode());
result = prime * result + ((rxMbps == null) ? 0 : rxMbps.hashCode());
result = prime * result + ((rxRateKbps == null) ? 0 : rxRateKbps.hashCode());
result = prime * result + ((snr == null) ? 0 : snr.hashCode());
result = prime * result + ((totalRxPackets == null) ? 0 : totalRxPackets.hashCode());
result = prime * result + ((totalTxPackets == null) ? 0 : totalTxPackets.hashCode());
result = prime * result + ((txBytes == null) ? 0 : txBytes.hashCode());
result = prime * result + ((txDataFrames == null) ? 0 : txDataFrames.hashCode());
result = prime * result + ((txDataFramesRetried == null) ? 0 : txDataFramesRetried.hashCode());
result = prime * result + ((txMbps == null) ? 0 : txMbps.hashCode());
result = prime * result + ((txRateKbps == null) ? 0 : txRateKbps.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ClientSessionMetricDetails other = (ClientSessionMetricDetails) obj;
if (classification == null) {
if (other.classification != null)
return false;
} else if (!classification.equals(other.classification))
return false;
if (lastMetricTimestamp != other.lastMetricTimestamp)
return false;
if (lastRxTimestamp == null) {
if (other.lastRxTimestamp != null)
return false;
} else if (!lastRxTimestamp.equals(other.lastRxTimestamp))
return false;
if (lastTxTimestamp == null) {
if (other.lastTxTimestamp != null)
return false;
} else if (!lastTxTimestamp.equals(other.lastTxTimestamp))
return false;
if (rssi == null) {
if (other.rssi != null)
return false;
} else if (!rssi.equals(other.rssi))
return false;
if (rxBytes == null) {
if (other.rxBytes != null)
return false;
} else if (!rxBytes.equals(other.rxBytes))
return false;
if (rxDataFrames == null) {
if (other.rxDataFrames != null)
return false;
} else if (!rxDataFrames.equals(other.rxDataFrames))
return false;
if (rxMbps == null) {
if (other.rxMbps != null)
return false;
} else if (!rxMbps.equals(other.rxMbps))
return false;
if (rxRateKbps == null) {
if (other.rxRateKbps != null)
return false;
} else if (!rxRateKbps.equals(other.rxRateKbps))
return false;
if (snr == null) {
if (other.snr != null)
return false;
} else if (!snr.equals(other.snr))
return false;
if (totalRxPackets == null) {
if (other.totalRxPackets != null)
return false;
} else if (!totalRxPackets.equals(other.totalRxPackets))
return false;
if (totalTxPackets == null) {
if (other.totalTxPackets != null)
return false;
} else if (!totalTxPackets.equals(other.totalTxPackets))
return false;
if (txBytes == null) {
if (other.txBytes != null)
return false;
} else if (!txBytes.equals(other.txBytes))
return false;
if (txDataFrames == null) {
if (other.txDataFrames != null)
return false;
} else if (!txDataFrames.equals(other.txDataFrames))
return false;
if (txDataFramesRetried == null) {
if (other.txDataFramesRetried != null)
return false;
} else if (!txDataFramesRetried.equals(other.txDataFramesRetried))
return false;
if (txMbps == null) {
if (other.txMbps != null)
return false;
} else if (!txMbps.equals(other.txMbps))
return false;
if (txRateKbps == null) {
if (other.txRateKbps != null)
return false;
} else if (!txRateKbps.equals(other.txRateKbps))
return false;
return true;
}
@Override
public ClientSessionMetricDetails clone() {
ClientSessionMetricDetails ret = (ClientSessionMetricDetails) super.clone();
return ret;
}
public void merge(ClientSessionMetricDetails other) {
boolean isLatestMetric = false;
if(lastMetricTimestamp<other.lastMetricTimestamp) {
this.setLastMetricTimestamp(other.lastMetricTimestamp);
isLatestMetric = true;
}
// These properties just take the latest value
if(isLatestMetric) {
if(other.rssi != null) {
this.rssi = other.rssi;
}
if(other.rxMbps != null) {
this.rxMbps = other.rxMbps;
}
if(other.txMbps != null) {
this.txMbps = other.txMbps;
}
if(other.rxRateKbps != null) {
this.rxRateKbps = other.rxRateKbps;
}
if(other.txRateKbps != null) {
this.txRateKbps = other.txRateKbps;
}
if(other.totalRxPackets != null) {
this.totalRxPackets = other.totalRxPackets;
}
if(other.totalTxPackets != null) {
this.totalTxPackets = other.totalTxPackets;
}
if(other.lastRxTimestamp != null) {
this.lastRxTimestamp = other.lastRxTimestamp;
}
if(other.lastTxTimestamp != null) {
this.lastTxTimestamp = other.lastTxTimestamp;
}
}
if(other.txDataFrames != null) {
// this is a delta
this.setTxDataFrames(sum(this.txDataFrames,other.txDataFrames));
}
if(other.txDataFramesRetried != null) {
// this is a delta
this.setTxDataFramesRetried(sum(this.txDataFramesRetried,other.txDataFramesRetried));
}
if(other.rxDataFrames != null) {
// this is a delta
this.setRxDataFrames(sum(this.rxDataFrames,other.rxDataFrames));
}
if(other.rxBytes != null)
{
// We keep the sum going
LOG.trace("RxBytes: adding {} to {}", this.rxBytes, other.rxBytes);
this.setRxBytes(sum(this.rxBytes, other.rxBytes));
}
if(other.txBytes != null)
{
// We keep the sum going
LOG.trace("TxBytes: adding {} to {}", this.txBytes, other.txBytes);
this.setTxBytes(sum(this.txBytes, other.txBytes));
}
if(other.classification != null)
{
this.classification = other.classification;
}
}
private static Integer sum(Integer v1, Integer v2) {
if(v1 == null) return v2;
if(v2 == null) return v1;
return Integer.sum(v1, v2);
}
private static Long sum(Long v1, Long v2) {
if(v1 == null) return v2;
if(v2 == null) return v1;
return Long.sum(v1, v2);
}
}

View File

@@ -11,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@@ -33,8 +32,8 @@ public class CloudEventDispatcherController {
private static final Logger LOG = LoggerFactory.getLogger(CloudEventDispatcherController.class);
@Autowired @Qualifier("metricStreamInterface") @Lazy private StreamInterface<ServiceMetric> metricStream;
@Autowired @Qualifier("eventStreamInterface") @Lazy private StreamInterface<SystemEventRecord> systemEventStream;
@Autowired @Qualifier("metricStreamInterface") private StreamInterface<ServiceMetric> metricStream;
@Autowired @Qualifier("eventStreamInterface") private StreamInterface<SystemEventRecord> systemEventStream;
@Autowired private ServiceMetricServiceInterface serviceMetricInterface;
@Autowired private SystemEventServiceInterface systemEventInterface;

View File

@@ -263,8 +263,7 @@ public class EquipmentDAO extends BaseJdbcDao {
},
keyHolder);
}catch (DuplicateKeyException e) {
LOG.error("Duplicate equipment found", e);
throw new DsDuplicateEntityException("Equipment with the assetId " + equipment.getInventoryId() + " already exists!");
throw new DsDuplicateEntityException(e);
}
// keyHolder.getKey() now contains the generated key

View File

@@ -59,6 +59,11 @@ public enum CEGWCommandType {
WdsRequest,
ClientBlocklistChangeNotification,
/**
* Most recent timestamp for receipt of stats data from this AP.
*/
MostRecentStatsTimestamp,
UNSUPPORTED;

View File

@@ -344,6 +344,7 @@ components:
- cyan
- white
- off
CEGWBlinkRequest:
description: Turn all LEDs on the AP to blinking, or turn off. The blinkAllLEDs attribute is the only currently supported functionality on the AP.
allOf:

View File

@@ -309,4 +309,5 @@ public abstract class CommonElementConfiguration extends EquipmentDetails implem
this.blinkAllLEDs = blinkAllLEDs;
}
}

View File

@@ -1,8 +1,6 @@
package com.telecominfraproject.wlan.equipment.models;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
@@ -50,38 +48,6 @@ public class ElementRadioConfiguration extends BaseJsonModel
private Boolean deauthAttackDetection;
private Set<ChannelPowerLevel> allowedChannelsPowerLevels = new HashSet<>();
public final static int DEFAULT_CHANNEL_NUMBER_2DOT4GHZ = 6;
public final static int DEFAULT_BACKUP_CHANNEL_NUMBER_2DOT4GHZ = 11;
public final static int DEFAULT_CHANNEL_NUMBER_5GHZ = 36;
public final static int DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZ = 44;
public final static int DEFAULT_CHANNEL_NUMBER_5GHZL = 36;
public final static int DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZL = 44;
public final static int DEFAULT_CHANNEL_NUMBER_5GHZU = 149;
public final static int DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZU = 157;
private static final Map<RadioType, Integer> defaultChannelNumberMap = new EnumMap<>(RadioType.class);
private static final Map<RadioType, Integer> defaultBackupChannelNumberMap = new EnumMap<>(RadioType.class);
static {
defaultChannelNumberMap.put(RadioType.is2dot4GHz, DEFAULT_CHANNEL_NUMBER_2DOT4GHZ);
defaultChannelNumberMap.put(RadioType.is5GHz, DEFAULT_CHANNEL_NUMBER_5GHZ);
defaultChannelNumberMap.put(RadioType.is5GHzL, DEFAULT_CHANNEL_NUMBER_5GHZL);
defaultChannelNumberMap.put(RadioType.is5GHzU, DEFAULT_CHANNEL_NUMBER_5GHZU);
defaultBackupChannelNumberMap.put(RadioType.is2dot4GHz, DEFAULT_BACKUP_CHANNEL_NUMBER_2DOT4GHZ);
defaultBackupChannelNumberMap.put(RadioType.is5GHz, DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZ);
defaultBackupChannelNumberMap.put(RadioType.is5GHzL, DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZL);
defaultBackupChannelNumberMap.put(RadioType.is5GHzU, DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZU);
}
public static Integer getDefaultChannelNumber(RadioType radioType) {
return defaultChannelNumberMap.get(radioType);
}
public static Integer getDefaultBackupChannelNumber(RadioType radioType) {
return defaultBackupChannelNumberMap.get(radioType);
}
/**
* Static creator
@@ -94,8 +60,19 @@ public class ElementRadioConfiguration extends BaseJsonModel
returnValue.setRadioType(radioType);
returnValue.setChannelNumber(getDefaultChannelNumber(radioType));
returnValue.setBackupChannelNumber(getDefaultBackupChannelNumber(radioType));
if (radioType == RadioType.is5GHz) {
returnValue.setChannelNumber(36);
returnValue.setBackupChannelNumber(153);
} else if (radioType == RadioType.is5GHzL) {
returnValue.setChannelNumber(36);
returnValue.setBackupChannelNumber(44);
} else if (radioType == RadioType.is5GHzU) {
returnValue.setChannelNumber(149);
returnValue.setBackupChannelNumber(157);
} else {
returnValue.setChannelNumber(6);
returnValue.setBackupChannelNumber(11);
}
return returnValue;
}

View File

@@ -118,40 +118,33 @@ public class EquipmentRrmBulkUpdateItem extends BaseJsonModel {
finalDetails.getRadioMap().put(rt, erc);
}
if(erc.getManualChannelNumber() == null
|| erc.getManualChannelNumber().intValue() != updateDetails.getChannelNumber()) {
if(erc.getManualChannelNumber()== null || erc.getManualChannelNumber().intValue() != updateDetails.getChannelNumber()) {
erc.setManualChannelNumber(updateDetails.getChannelNumber());
modelChanged.set(true);
}
if(erc.getManualBackupChannelNumber() == null
|| erc.getManualBackupChannelNumber().intValue() != updateDetails.getBackupChannelNumber()) {
if(erc.getManualBackupChannelNumber()== null ||
erc.getManualBackupChannelNumber().intValue() != updateDetails.getBackupChannelNumber()) {
erc.setManualBackupChannelNumber(updateDetails.getBackupChannelNumber());
modelChanged.set(true);
}
if (updateDetails.getClientDisconnectThresholdDb() != null) {
if ((erc.getClientDisconnectThresholdDb() == null && updateDetails.getClientDisconnectThresholdDb() != null)
|| !erc.getClientDisconnectThresholdDb().equals(updateDetails.getClientDisconnectThresholdDb())) {
erc.setClientDisconnectThresholdDb(updateDetails.getClientDisconnectThresholdDb());
modelChanged.set(true);
}
if ((erc.getClientDisconnectThresholdDb() == null && updateDetails.getClientDisconnectThresholdDb() != null)
|| !erc.getClientDisconnectThresholdDb().equals(updateDetails.getClientDisconnectThresholdDb())) {
erc.setClientDisconnectThresholdDb(updateDetails.getClientDisconnectThresholdDb());
modelChanged.set(true);
}
if (updateDetails.getProbeResponseThresholdDb() != null) {
if ((erc.getProbeResponseThresholdDb() == null && updateDetails.getProbeResponseThresholdDb() != null)
|| !erc.getProbeResponseThresholdDb().equals(updateDetails.getProbeResponseThresholdDb())) {
erc.setProbeResponseThresholdDb(updateDetails.getProbeResponseThresholdDb());
modelChanged.set(true);
}
if ((erc.getProbeResponseThresholdDb() == null && updateDetails.getProbeResponseThresholdDb() != null)
|| !erc.getProbeResponseThresholdDb().equals(updateDetails.getProbeResponseThresholdDb())) {
erc.setProbeResponseThresholdDb(updateDetails.getProbeResponseThresholdDb());
modelChanged.set(true);
}
if (updateDetails.getRxCellSizeDb() != null) {
if ((erc.getRxCellSizeDb() == null && updateDetails.getRxCellSizeDb() != null)
|| !erc.getRxCellSizeDb().equals(updateDetails.getRxCellSizeDb())) {
erc.setRxCellSizeDb(updateDetails.getRxCellSizeDb());
modelChanged.set(true);
}
if ((erc.getRxCellSizeDb() == null && updateDetails.getRxCellSizeDb() != null)
|| !erc.getRxCellSizeDb().equals(updateDetails.getRxCellSizeDb())) {
erc.setRxCellSizeDb(updateDetails.getRxCellSizeDb());
modelChanged.set(true);
}

View File

@@ -36,9 +36,11 @@ import com.telecominfraproject.wlan.core.model.pagination.PaginationContext;
import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.core.model.pagination.SortOrder;
import com.telecominfraproject.wlan.core.model.pair.PairLongLong;
import com.telecominfraproject.wlan.datastore.exceptions.DsDataValidationException;
import com.telecominfraproject.wlan.equipment.models.AntennaType;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration;
import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes;
import com.telecominfraproject.wlan.equipment.models.ChannelPowerLevel;
import com.telecominfraproject.wlan.equipment.models.CustomerEquipmentCounts;
import com.telecominfraproject.wlan.equipment.models.ElementRadioConfiguration;
import com.telecominfraproject.wlan.equipment.models.Equipment;
@@ -81,7 +83,10 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
equipment.setName("testName-"+getNextEquipmentId());
equipment.setInventoryId("test-inv-"+getNextEquipmentId());
equipment.setEquipmentType(EquipmentType.AP);
equipment.setLocationId(1);
equipment.setProfileId(1);
equipment.setCustomerId(1);
Equipment ret = remoteInterface.create(equipment);
assertNotNull(ret);
@@ -621,6 +626,97 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
}
@Test
public void testEquipmentUpdateChannelNumValidation() {
//Create new Equipment - success
Equipment equipment = new Equipment();
equipment.setName("testName-"+getNextEquipmentId());
equipment.setInventoryId("test-inv-"+getNextEquipmentId());
equipment.setEquipmentType(EquipmentType.AP);
equipment.setCustomerId(1);
equipment.setLocationId(1);
equipment.setProfileId(1);
equipment.setDetails(ApElementConfiguration.createWithDefaults());
ElementRadioConfiguration element2dot4RadioConfig = ((ApElementConfiguration)equipment.getDetails()).getRadioMap().get(RadioType.is2dot4GHz);
element2dot4RadioConfig.setAllowedChannelsPowerLevels(new HashSet<>());
for (int i = 1; i <= 11; i++) {
ChannelPowerLevel cpl = new ChannelPowerLevel();
cpl.setChannelNumber(i);
cpl.setChannelWidth(20);
cpl.setDfs(false);
cpl.setPowerLevel(30);
element2dot4RadioConfig.getAllowedChannelsPowerLevels().add(cpl);
}
Equipment ret = remoteInterface.create(equipment);
assertNotNull(ret);
ret = remoteInterface.get(ret.getId());
assertEqualEquipments(equipment, ret);
ElementRadioConfiguration retElement2dot4RadioConfig = ((ApElementConfiguration)ret.getDetails()).getRadioMap().get(RadioType.is2dot4GHz);
assertEquals(retElement2dot4RadioConfig.getChannelNumber().intValue(), 6);
//Update success
retElement2dot4RadioConfig.setChannelNumber(1);
retElement2dot4RadioConfig.setManualChannelNumber(2);
retElement2dot4RadioConfig.setBackupChannelNumber(3);
retElement2dot4RadioConfig.setManualBackupChannelNumber(4);
Equipment updatedEquipment = remoteInterface.update(ret);
Equipment retUpdate = remoteInterface.get(ret.getId());
assertEqualEquipments(retUpdate, updatedEquipment);
ElementRadioConfiguration ret2Element2dot4RadioConfig = ((ApElementConfiguration)retUpdate.getDetails()).getRadioMap().get(RadioType.is2dot4GHz);
assertEquals(retElement2dot4RadioConfig.getChannelNumber().intValue(), 1);
assertEquals(retElement2dot4RadioConfig.getManualChannelNumber().intValue(), 2);
assertEquals(retElement2dot4RadioConfig.getBackupChannelNumber().intValue(), 3);
assertEquals(retElement2dot4RadioConfig.getManualBackupChannelNumber().intValue(), 4);
//Update failure
ret2Element2dot4RadioConfig.setChannelNumber(12);
try {
remoteInterface.update(retUpdate);
fail("EquipmentService update channelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
ret2Element2dot4RadioConfig.setChannelNumber(6);
ret2Element2dot4RadioConfig.setManualChannelNumber(13);
try {
remoteInterface.update(retUpdate);
fail("EquipmentService update manualChannelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
ret2Element2dot4RadioConfig.setManualChannelNumber(7);
ret2Element2dot4RadioConfig.setBackupChannelNumber(14);
try {
remoteInterface.update(retUpdate);
fail("EquipmentService update backupChannelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
ret2Element2dot4RadioConfig.setBackupChannelNumber(8);
ret2Element2dot4RadioConfig.setManualBackupChannelNumber(15);
try {
remoteInterface.update(retUpdate);
fail("EquipmentService update manualBackupChannelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
//Tolerate null now
ret2Element2dot4RadioConfig.setManualBackupChannelNumber(null);
remoteInterface.update(retUpdate);
}
@Test
public void testGetPaginatedEquipmentIds()
{
@@ -779,6 +875,7 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
// Clean up after test
createdSet.forEach( c-> remoteInterface.delete(c));
}
@Test
@@ -841,9 +938,9 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
assertEquals(11, radioMap.get(RadioType.is2dot4GHz).getManualBackupChannelNumber().intValue());
assertEquals(36, radioMap.get(RadioType.is5GHz).getChannelNumber().intValue());
assertEquals(44, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(153, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(36, radioMap.get(RadioType.is5GHz).getManualChannelNumber().intValue());
assertEquals(44, radioMap.get(RadioType.is5GHz).getManualBackupChannelNumber().intValue());
assertEquals(153, radioMap.get(RadioType.is5GHz).getManualBackupChannelNumber().intValue());
Map<RadioType, Integer> primaryChannels = new EnumMap<>(RadioType.class);
Map<RadioType, Integer> backupChannels = new EnumMap<>(RadioType.class);
@@ -879,7 +976,7 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
assertEquals(6, radioMap.get(RadioType.is2dot4GHz).getManualBackupChannelNumber().intValue());
assertEquals(36, radioMap.get(RadioType.is5GHz).getChannelNumber().intValue());
assertEquals(44, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(153, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(40, radioMap.get(RadioType.is5GHz).getManualChannelNumber().intValue());
assertEquals(48, radioMap.get(RadioType.is5GHz).getManualBackupChannelNumber().intValue());
@@ -889,7 +986,7 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
backupChannels.clear();
backupChannels.put(RadioType.is2dot4GHz, 6);
backupChannels.put(RadioType.is5GHz, 149);
backupChannels.put(RadioType.is5GHz, 44);
autoChannelSelections.clear();
autoChannelSelections.put(RadioType.is2dot4GHz, true);
@@ -916,7 +1013,7 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
assertEquals(6, radioMap.get(RadioType.is2dot4GHz).getManualBackupChannelNumber().intValue());
assertEquals(161, radioMap.get(RadioType.is5GHz).getChannelNumber().intValue());
assertEquals(149, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(44, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(40, radioMap.get(RadioType.is5GHz).getManualChannelNumber().intValue());
assertEquals(48, radioMap.get(RadioType.is5GHz).getManualBackupChannelNumber().intValue());

View File

@@ -1,10 +1,12 @@
package com.telecominfraproject.wlan.equipment.controller;
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.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -32,6 +34,7 @@ import com.telecominfraproject.wlan.datastore.exceptions.DsDataValidationExcepti
import com.telecominfraproject.wlan.equipment.datastore.EquipmentDatastore;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration;
import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes;
import com.telecominfraproject.wlan.equipment.models.ChannelPowerLevel;
import com.telecominfraproject.wlan.equipment.models.CustomerEquipmentCounts;
import com.telecominfraproject.wlan.equipment.models.ElementRadioConfiguration;
import com.telecominfraproject.wlan.equipment.models.Equipment;
@@ -88,7 +91,12 @@ public class EquipmentController {
throw new DsDataValidationException("Equipment contains unsupported value");
}
updateValuesIfNeeded(equipment);
long ts = System.currentTimeMillis();
if (equipment.getCreatedTimestamp() == 0) {
equipment.setCreatedTimestamp(ts);
}
equipment.setLastModifiedTimestamp(ts);
Equipment ret = equipmentDatastore.create(equipment);
LOG.debug("Created Equipment {}", ret);
@@ -99,24 +107,7 @@ public class EquipmentController {
return ret;
}
private void updateValuesIfNeeded(Equipment equipment) {
// strip out whitespaces from user entered inventoryId and name strings
if (equipment.getName() != null) {
equipment.setName(equipment.getName().strip());
}
if (equipment.getInventoryId() != null) {
equipment.setInventoryId(equipment.getInventoryId().strip());
}
// Update timestamp
long ts = System.currentTimeMillis();
if (equipment.getCreatedTimestamp() == 0) {
equipment.setCreatedTimestamp(ts);
}
equipment.setLastModifiedTimestamp(ts);
}
/**
* Retrieves Equipment by id
* @param equipmentId
@@ -267,17 +258,22 @@ public class EquipmentController {
LOG.debug("Updating Equipment {}", equipment);
if (BaseJsonModel.hasUnsupportedValue(equipment)) {
if (BaseJsonModel.hasUnsupportedValue(equipment)
|| equipment.getCustomerId() == 0
|| equipment.getLocationId() == 0
|| equipment.getProfileId() == 0) {
LOG.error("Failed to update Equipment, request contains unsupported value: {}", equipment);
throw new DsDataValidationException("Equipment contains unsupported value");
}
validateChannelNum(equipment);
Equipment existingEquipment = equipmentDatastore.getOrNull(equipment.getId());
ApElementConfiguration existingApElementConfig = null;
if (existingEquipment != null && existingEquipment.getDetails() instanceof ApElementConfiguration) {
existingApElementConfig = (ApElementConfiguration) existingEquipment.getDetails();
}
Equipment ret = equipmentDatastore.update(equipment);
ApElementConfiguration updatedApElementConfig = null;
if (ret != null && ret.getDetails() instanceof ApElementConfiguration) {
@@ -290,9 +286,7 @@ public class EquipmentController {
if (ret.getCustomerId() != existingEquipment.getCustomerId()) {
publishEvent(new EquipmentCustomerChangedEvent(existingEquipment, ret));
}
if ((ret.getProfileId() != existingEquipment.getProfileId()) ||
ret.getLocationId() != existingEquipment.getLocationId() ||
(existingApElementConfig != null && updatedApElementConfig != null &&
if ((ret.getProfileId() != existingEquipment.getProfileId()) || (existingApElementConfig != null && updatedApElementConfig != null &&
updatedApElementConfig.needsToBeUpdatedOnDevice(existingApElementConfig))) {
event = new EquipmentApImpactingChangedEvent(ret);
} else if (existingApElementConfig != null && existingApElementConfig.isBlinkAllLEDs() != updatedApElementConfig.isBlinkAllLEDs()) {
@@ -306,6 +300,39 @@ public class EquipmentController {
return ret;
}
private void validateChannelNum(Equipment equipment) {
if (equipment.getDetails() instanceof ApElementConfiguration) {
ApElementConfiguration apElementConfiguration = (ApElementConfiguration) equipment.getDetails();
if (apElementConfiguration.getRadioMap() != null) {
for (RadioType radioType : apElementConfiguration.getRadioMap().keySet()) {
ElementRadioConfiguration elementRadioConfig = apElementConfiguration.getRadioMap().get(radioType);
Integer channelNum = elementRadioConfig.getChannelNumber();
Integer manualChannelNum = elementRadioConfig.getManualChannelNumber();
Integer backupChannelNum = elementRadioConfig.getBackupChannelNumber();
Integer manualBackupChannelNum = elementRadioConfig.getManualBackupChannelNumber();
List<Integer> allowedChannels = elementRadioConfig.getAllowedChannelsPowerLevels().stream().map(ChannelPowerLevel::getChannelNumber).collect(Collectors.toList());
if (allowedChannels != null && !allowedChannels.isEmpty()) {
checkAllowedChannels(channelNum, "channelNumber", allowedChannels);
checkAllowedChannels(backupChannelNum, "backupChannelNumber", allowedChannels);
checkAllowedChannels(manualChannelNum, "manualChannelNumber", allowedChannels);
checkAllowedChannels(manualBackupChannelNum, "manualBackupChannelNumber", allowedChannels);
}
}
}
}
}
private void checkAllowedChannels(Integer channelNum, String channelType, List<Integer> allowedChannels) {
if (channelNum != null && !allowedChannels.contains(channelNum)) {
LOG.error("Failed to update Equipment. The {} ({}) is out of the allowed channels range {}",
channelType, channelNum, allowedChannels);
throw new DsDataValidationException("Equipment contains disallowed " + channelType);
}
}
/**
* Updates Equipment Channels
*
@@ -548,13 +575,25 @@ public class EquipmentController {
Set<Long> equipmentIds = new HashSet<>();
request.getItems().forEach(item -> equipmentIds.add(item.getEquipmentId()));
//validate equipment before the bulk update
List<Equipment> equipmentBeforeUpdate = equipmentDatastore.get(equipmentIds);
Map<Long, Equipment> eqMap = new HashMap<>();
equipmentBeforeUpdate.forEach(eq -> eqMap.put(eq.getId(), eq));
request.getItems().forEach(item -> {
Equipment eq = eqMap.get(item.getEquipmentId());
if(item.applyToEquipment(eq)) {
validateChannelNum(eq);
}
});
equipmentDatastore.updateRrmBulk(request);
//send events after the bulk update
List<Equipment> equipmentAfterUpdate = equipmentDatastore.get(equipmentIds);
List<SystemEvent> events = new ArrayList<>();
equipmentAfterUpdate.forEach(eq -> events.add(new EquipmentApImpactingChangedEvent(eq)));
equipmentAfterUpdate.forEach(eq -> events.add(new EquipmentChangedEvent(eq)));
publishEvents(events);
return new GenericResponse(true, "");

View File

@@ -71,33 +71,11 @@ public class EquipmentControllerTest {
equipmentController.delete(ret.getId());
}
@Test
public void testEquipmentCRUD_ValidateSpaceInInputString() {
//Create new Equipment - success
Equipment equipment = new Equipment();
equipment.setName(" nameAndInventoryIdWithTrailingSpaces ");
equipment.setInventoryId(" C4411EAA31F5 ");
equipment.setEquipmentType(EquipmentType.AP);
Equipment ret = equipmentController.create(equipment);
assertNotNull(ret);
ret = equipmentController.get(ret.getId());
assertEqualEquipments(equipment, ret);
ret = equipmentController.getOrNull(ret.getId());
assertEqualEquipments(equipment, ret);
assertNull(equipmentController.getOrNull(-1));
//Delete - success
equipmentController.delete(ret.getId());
}
private void assertEqualEquipments(Equipment expected, Equipment actual) {
private void assertEqualEquipments(
Equipment expected,
Equipment actual) {
assertEquals(expected.getName(), actual.getName());
//TODO: add more fields to check here
}

View File

@@ -209,7 +209,6 @@ public class CustomerFirmwareTrackDAO extends BaseJdbcDao {
return copy;
}
@Transactional(noRollbackFor = { EmptyResultDataAccessException.class })
public CustomerFirmwareTrackRecord getCustomerFirmwareTrackRecord(int customerId) {
CustomerFirmwareTrackRecord ret = null;
try {

View File

@@ -57,7 +57,6 @@ public interface FirmwareServiceInterface {
CustomerFirmwareTrackRecord updateCustomerFirmwareTrackRecord(CustomerFirmwareTrackRecord record);
CustomerFirmwareTrackRecord deleteCustomerFirmwareTrackRecord(int customerId);
CustomerFirmwareTrackSettings getDefaultCustomerTrackSetting();
CustomerFirmwareTrackSettings updateDefaultCustomerTrackSetting(CustomerFirmwareTrackSettings defaultSettings);
/**
* @param equipmentType

View File

@@ -81,9 +81,6 @@ public class FirmwareServiceLocal implements FirmwareServiceInterface {
public CustomerFirmwareTrackSettings getDefaultCustomerTrackSetting() {
return firmwareController.getDefaultCustomerTrackSetting();
}
public CustomerFirmwareTrackSettings updateDefaultCustomerTrackSetting(CustomerFirmwareTrackSettings defaultSettings) {
return firmwareController.updateDefaultCustomerTrackSetting(defaultSettings);
}
public CustomerFirmwareTrackRecord getCustomerFirmwareTrackRecord(int customerId) {
return firmwareController.getCustomerFirmwareTrackRecord(customerId);
}

View File

@@ -387,21 +387,6 @@ public class FirmwareServiceRemote extends BaseRemoteClient implements FirmwareS
return ret;
}
@Override
public CustomerFirmwareTrackSettings updateDefaultCustomerTrackSetting(CustomerFirmwareTrackSettings defaultSettings) {
LOG.debug("calling updateDefaultCustomerTrackSetting {} ", defaultSettings);
ResponseEntity<CustomerFirmwareTrackSettings> responseEntity = restTemplate.exchange(
getBaseUrl()
+"/customerTrack/default", HttpMethod.PUT, null,
CustomerFirmwareTrackSettings.class, defaultSettings);
CustomerFirmwareTrackSettings ret = responseEntity.getBody();
LOG.debug("completed updateDefaultCustomerTrackSetting {} ", ret);
return ret;
}
}

View File

@@ -2,6 +2,8 @@ package com.telecominfraproject.wlan.firmware.controller;
import java.util.List;
import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -20,11 +22,11 @@ import com.telecominfraproject.wlan.datastore.exceptions.DsEntityNotFoundExcepti
import com.telecominfraproject.wlan.firmware.datastore.FirmwareDatastore;
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackRecord;
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackSettings;
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackSettings.TrackFlag;
import com.telecominfraproject.wlan.firmware.models.FirmwareTrackAssignmentDetails;
import com.telecominfraproject.wlan.firmware.models.FirmwareTrackAssignmentRecord;
import com.telecominfraproject.wlan.firmware.models.FirmwareTrackRecord;
import com.telecominfraproject.wlan.firmware.models.FirmwareVersion;
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackSettings.TrackFlag;
import com.telecominfraproject.wlan.systemevent.models.SystemEvent;
@@ -42,11 +44,35 @@ public class FirmwareController {
@Autowired private FirmwareDatastore firmwareDatastore;
@Autowired private CloudEventDispatcherInterface cloudEventDispatcher;
@Autowired Environment environment;
/*
* FirmwareVersion API
*/
CustomerFirmwareTrackSettings defaultCustomerTrackSettings;
@PostConstruct
private void postConstruct() {
defaultCustomerTrackSettings = new CustomerFirmwareTrackSettings();
defaultCustomerTrackSettings.setAutoUpgradeDeprecatedOnBind(environment
.getProperty("whizcontrol.autoupgrade.deprecated", TrackFlag.class, TrackFlag.NEVER));
defaultCustomerTrackSettings.setAutoUpgradeUnknownOnBind(environment
.getProperty("whizcontrol.autoupgrade.unknown", TrackFlag.class, TrackFlag.NEVER));
defaultCustomerTrackSettings.setAutoUpgradeDeprecatedDuringMaintenance(environment.getProperty(
"whizcontrol.maintenanceupgrade.deprecated", TrackFlag.class, TrackFlag.NEVER));
defaultCustomerTrackSettings.setAutoUpgradeUnknownDuringMaintenance(environment
.getProperty("whizcontrol.maintenanceupgrade.unknown", TrackFlag.class, TrackFlag.NEVER));
LOG.info("Default CustomerFirmwareTrackSettings: {}", defaultCustomerTrackSettings);
}
private void publishEvent(SystemEvent event) {
if (event == null) {
return;
}
try {
cloudEventDispatcher.publishEvent(event);
} catch (Exception e) {
LOG.error("Failed to publish event : {}", event, e);
}
}
@RequestMapping(value = "/version", method = RequestMethod.POST)
public FirmwareVersion createFirmwareVersion(@RequestBody FirmwareVersion firmwareVersion) {
@@ -123,10 +149,6 @@ public class FirmwareController {
return ret;
}
/*
* FirmwareTrackRecord API
*/
@RequestMapping(value = "/track", method = RequestMethod.POST)
public FirmwareTrackRecord createFirmwareTrack(@RequestBody FirmwareTrackRecord firmwareTrack) {
LOG.debug("calling createFirmwareTrack({})", firmwareTrack);
@@ -171,10 +193,7 @@ public class FirmwareController {
return result;
}
/*
* FirmwareTrackAssignmentDetails API
*/
@RequestMapping(value = "/trackAssignment", method = RequestMethod.GET)
public List<FirmwareTrackAssignmentDetails> getFirmwareTrackAssignments (
@RequestParam String firmwareTrackName) {
@@ -201,50 +220,33 @@ public class FirmwareController {
FirmwareTrackAssignmentDetails result = new FirmwareTrackAssignmentDetails(assignment, version);
return result;
}
/*
* CustomerFirmwareTrackSettings API
*/
@RequestMapping(value = "/customerTrack/default", method = RequestMethod.GET)
public CustomerFirmwareTrackSettings getDefaultCustomerTrackSetting() {
CustomerFirmwareTrackRecord defaultRecord = firmwareDatastore.getCustomerFirmwareTrackRecord(0);
if (defaultRecord == null) {
LOG.debug("No default record exists, creating the default");
defaultRecord = new CustomerFirmwareTrackRecord();
defaultRecord.setCustomerId(0);
CustomerFirmwareTrackSettings defaultSettings = new CustomerFirmwareTrackSettings();
defaultSettings.setAutoUpgradeDeprecatedOnBind(TrackFlag.NEVER);
defaultSettings.setAutoUpgradeUnknownOnBind(TrackFlag.NEVER);
defaultSettings.setAutoUpgradeDeprecatedDuringMaintenance(TrackFlag.NEVER);
defaultSettings.setAutoUpgradeUnknownDuringMaintenance(TrackFlag.NEVER);
defaultRecord.setSettings(defaultSettings);
defaultRecord.setTrackRecordId(firmwareDatastore.getFirmwareTrackByName("DEFAULT").getRecordId());
defaultRecord = firmwareDatastore.createCustomerFirmwareTrackRecord(defaultRecord);
if (defaultCustomerTrackSettings == null) {
if (defaultCustomerTrackSettings == null) {
defaultCustomerTrackSettings = new CustomerFirmwareTrackSettings();
defaultCustomerTrackSettings.setAutoUpgradeDeprecatedOnBind(environment
.getProperty("whizcontrol.autoupgrade.deprecated", TrackFlag.class, TrackFlag.NEVER));
defaultCustomerTrackSettings.setAutoUpgradeUnknownOnBind(environment
.getProperty("whizcontrol.autoupgrade.unknown", TrackFlag.class, TrackFlag.NEVER));
defaultCustomerTrackSettings.setAutoUpgradeDeprecatedDuringMaintenance(environment.getProperty(
"whizcontrol.maintenanceupgrade.deprecated", TrackFlag.class, TrackFlag.NEVER));
defaultCustomerTrackSettings.setAutoUpgradeUnknownDuringMaintenance(environment
.getProperty("whizcontrol.maintenanceupgrade.unknown", TrackFlag.class, TrackFlag.NEVER));
LOG.info("Default CustomerFirmwareTrackSettings: {}", defaultCustomerTrackSettings);
}
}
return defaultRecord.getSettings();
return defaultCustomerTrackSettings;
}
@RequestMapping(value = "/customerTrack/default", method = RequestMethod.PUT)
public CustomerFirmwareTrackSettings updateDefaultCustomerTrackSetting(@RequestBody CustomerFirmwareTrackSettings customerTrackSettings) {
CustomerFirmwareTrackRecord defaultRecord = firmwareDatastore.getCustomerFirmwareTrackRecord(0);
if (defaultRecord == null) {
defaultRecord = new CustomerFirmwareTrackRecord();
defaultRecord.setCustomerId(0);
defaultRecord.setSettings(customerTrackSettings);
defaultRecord.setTrackRecordId(firmwareDatastore.getFirmwareTrackByName("DEFAULT").getRecordId());
return firmwareDatastore.createCustomerFirmwareTrackRecord(defaultRecord).getSettings();
}
defaultRecord.setSettings(customerTrackSettings);
return firmwareDatastore.updateCustomerFirmwareTrackRecord(defaultRecord).getSettings();
}
@RequestMapping(value = "/customerTrack", method = RequestMethod.GET)
public CustomerFirmwareTrackRecord getCustomerFirmwareTrackRecord(@RequestParam int customerId) {
LOG.debug("calling getCustomerFirmwareTrackRecord({})", customerId);
return firmwareDatastore.getCustomerFirmwareTrackRecord(customerId);
}
@RequestMapping(value = "/customerTrack", method = RequestMethod.POST)
public CustomerFirmwareTrackRecord createCustomerFirmwareTrackRecord(@RequestBody CustomerFirmwareTrackRecord customerTrack) {
@@ -253,6 +255,7 @@ public class FirmwareController {
return result;
}
@RequestMapping(value = "/customerTrack", method = RequestMethod.PUT)
public CustomerFirmwareTrackRecord updateCustomerFirmwareTrackRecord(@RequestBody CustomerFirmwareTrackRecord customerTrack) {
LOG.debug("calling updateCustomerFirmwareTrackRecord({})", customerTrack);
@@ -267,6 +270,8 @@ public class FirmwareController {
}
return result;
}
@RequestMapping(value = "/customerTrack", method = RequestMethod.DELETE)
public CustomerFirmwareTrackRecord deleteCustomerFirmwareTrackRecord(@RequestParam int customerId) {
@@ -274,17 +279,6 @@ public class FirmwareController {
CustomerFirmwareTrackRecord result = firmwareDatastore.deleteCustomerFirmwareTrackRecord(customerId);
return result;
}
private void publishEvent(SystemEvent event) {
if (event == null) {
return;
}
try {
cloudEventDispatcher.publishEvent(event);
} catch (Exception e) {
LOG.error("Failed to publish event : {}", event, e);
}
}
}

View File

@@ -619,12 +619,11 @@ paths:
$ref: '#/components/schemas/FirmwareTrackAssignmentDetails'
500:
$ref: '#/components/responses/GenericApiError'
/api/firmware/customerTrack/default:
get:
tags:
- Firmware Data
summary: Get customer firmware track settings, if it doesn't exist, create it
summary: Get customer firmware track settings
operationId: getCustomerFirmwareTrackSettings
responses:
200:
@@ -635,27 +634,6 @@ paths:
$ref: '#/components/schemas/CustomerFirmwareTrackSettings'
500:
$ref: '#/components/responses/GenericApiError'
put:
tags:
- Firmware Data
summary: Update customer firmware track settings, if it doesn't exist, create it
operationId: updateCustomerFirmwareTrackSettings
requestBody:
description: CustomerFirmwareTrackSettings
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CustomerFirmwareTrackSettings'
responses:
200:
description: Successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/CustomerFirmwareTrackSettings'
500:
$ref: '#/components/responses/GenericApiError'
/api/firmware/customerTrack:
post:

View File

@@ -0,0 +1,30 @@
package com.telecominfraproject.wlan.location.models.events;
import com.telecominfraproject.wlan.core.model.json.interfaces.HasLocationId;
import com.telecominfraproject.wlan.location.models.Location;
import com.telecominfraproject.wlan.systemevent.models.CustomerEventWithPayload;
public class LocationChangedApImpactingEvent extends CustomerEventWithPayload<Location> implements HasLocationId {
private static final long serialVersionUID = -8369849230866347412L;
public LocationChangedApImpactingEvent(Location location){
super(location.getCustomerId(), location);
}
@Override
public long getLocationId() {
if (getPayload() != null) {
return getPayload().getId();
}
return 0;
}
/**
* Constructor used by JSON
*/
public LocationChangedApImpactingEvent() {
super(0, 0, null);
}
}

View File

@@ -80,7 +80,7 @@ public class LocationServiceRemoteTest extends BaseRemoteTest {
location.setLocationType(LocationType.FLOOR);
location.setCustomerId(getNextCustomerId());
location.setName("testName_updated");
location.setDetails(generateDetails(CountryCode.CA));
location.setDetails(generateDetails(CountryCode.US));
Location retFromUpdate = testInterface.update(location);
assertFieldEquals(location, retFromUpdate);
@@ -95,14 +95,6 @@ public class LocationServiceRemoteTest extends BaseRemoteTest {
// expected it
}
//UPDATE test - fail because country code cannot be modified once created
try {
location.setDetails(generateDetails(CountryCode.US));
testInterface.update(location);
fail("failed to detect country code update");
} catch (IllegalStateException e) {
// expected it
}
//DELETE Test
testInterface.delete(ret.getId());

View File

@@ -25,6 +25,7 @@ import com.telecominfraproject.wlan.datastore.exceptions.DsEntityNotFoundExcepti
import com.telecominfraproject.wlan.location.datastore.LocationDatastore;
import com.telecominfraproject.wlan.location.models.Location;
import com.telecominfraproject.wlan.location.models.events.LocationAddedEvent;
import com.telecominfraproject.wlan.location.models.events.LocationChangedApImpactingEvent;
import com.telecominfraproject.wlan.location.models.events.LocationChangedEvent;
import com.telecominfraproject.wlan.location.models.events.LocationRemovedEvent;
import com.telecominfraproject.wlan.systemevent.models.SystemEvent;
@@ -96,15 +97,14 @@ public class LocationServiceController {
}
Location existingLocation = locationDatastore.get(location.getId());
if (location.needsToBeUpdatedOnDevice(existingLocation)) {
throw new IllegalStateException("Cannot update location. Country code is not allow to modify once created.");
}
Location ret = locationDatastore.update(location);
List<SystemEvent> events = new ArrayList<>();
if (ret.needsToBeUpdatedOnDevice(existingLocation)) {
events.add(new LocationChangedApImpactingEvent(ret));
}
events.add(new LocationChangedEvent(ret));
publishEvents(events);

View File

@@ -48,12 +48,11 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
* To test this method:
* curl --digest --user user:password --request POST --insecure --header "Content-Type: application/json; charset=utf-8" --data '' https://localhost:7072/api/portFwd/createSession/inventoryId/dev-ap-0001/port/22/
*
* @param inventoryId: Equipment's AssetId
* @param connectToPortOnEquipment: Port to connect on the AP
* @param inventoryId
* @param connectToPortOnEquipment
* @return session id of a newly created forwarder session
*/
public String startForwarderSession(final String inventoryId, int connectToPortOnEquipment){
LOG.debug("Received create Session request for inventoryId {} on port {}", inventoryId, connectToPortOnEquipment);
//inventoryId is used to tie ForwarderSession to WebSocketSession
try {
@@ -192,7 +191,7 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
LOG.debug("[{}] Stopped polling inputstream on local socket {}", inventoryId, localSocket.getPort());
} catch (IOException e) {
LOG.error("[{}] Session {} got IOException {} for the socket on port {}", inventoryId, forwarderSession.getSessionId(), port, e);
LOG.error("[{}] Session {} got exception {} for the socket on port {}", inventoryId, forwarderSession.getSessionId(), e, port);
} finally {
//notify the other end that forwarding session is terminated
@@ -210,7 +209,7 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
localSocket.close();
forwarderSession.getServerSocket().close();
} catch (IOException e) {
LOG.error("IO Exception when closing socket", e);
//do nothing here
}
sessionIdToForwarderSessionMap.remove(forwarderSession.getSessionId());
@@ -233,12 +232,12 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
socketInputStreamReaderThread.setDaemon(true);
forwarderSession.setSocketStreamReaderThread(socketInputStreamReaderThread);
} catch (Exception e) {
LOG.error("[{}] error accepting connection on port {} - closing forwarding session {}", inventoryId, listenOnLocalPort, forwarderSession.getSessionId(), e);
} catch (IOException e) {
LOG.error("[{}] error accepting conection on port {} - closing forwarding session {}", inventoryId, listenOnLocalPort, forwarderSession.getSessionId());
try {
serverSocket.close();
} catch (IOException e1) {
LOG.error("IO Exception when closing socket", e1);
// do nothing here
}
sessionIdToForwarderSessionMap.remove(forwarderSession.getSessionId());
}
@@ -260,7 +259,6 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
}
public void stopForwarderSession(String sessionId){
LOG.debug("Received stop forwarding Session request for sessionId {}", sessionId);
ForwarderSession forwarderSession = sessionIdToForwarderSessionMap.get(sessionId);
if(forwarderSession==null){
LOG.info("Could not find session {}", sessionId);
@@ -268,7 +266,6 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
}
try {
LOG.debug("Found forwarderSession {} for sessionId {}", forwarderSession, sessionId);
//find websocket session by inventoryId and send control messages to disconnect from target port on the client side of the port forwarder
WebSocketSession webSocketSession = webSocketSessionMap.get(forwarderSession.getInventoryId());
TextMessage message = new TextMessage(DISCONNECT_FROM_CE_PORT_COMMAND + forwarderSession.getConnectToPortOnEquipment());
@@ -277,11 +274,11 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
LOG.debug("[{}] Session {} sent command {}", forwarderSession.getInventoryId(), forwarderSession.getSessionId(), message.getPayload());
}
if(forwarderSession.getServerSocket() != null){
if(forwarderSession.getServerSocket()!=null){
forwarderSession.getServerSocket().close();
}
if(forwarderSession.getLocalSocket() != null){
if(forwarderSession.getLocalSocket()!=null){
forwarderSession.getLocalSocket().close();
}
//stream reader will stop in a separate thread by themselves
@@ -289,9 +286,10 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
sessionIdToForwarderSessionMap.remove(forwarderSession.getSessionId());
} catch (IOException e) {
LOG.error("Encountered IOException when closing connection for forwarder session {}", forwarderSession, e);
sessionIdToForwarderSessionMap.remove(forwarderSession.getSessionId());
// do nothing here
}
sessionIdToForwarderSessionMap.remove(forwarderSession.getSessionId());
LOG.info("[{}] Stopped forwarder session {}", forwarderSession.getInventoryId(), sessionId);
}
@@ -324,6 +322,7 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
if(payload.indexOf(':')>0){
port = Integer.parseInt(payload.substring(payload.indexOf(':')+1));
}
//find forwarderSession by inventoryId and CEPort
ForwarderSession forwarderSession = null;
for(ForwarderSession fs: sessionIdToForwarderSessionMap.values()){
@@ -333,7 +332,7 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
}
}
LOG.debug("[{}] Session {} got message {} with forwarderSession {}", webSocketSessionKey, session, payload, forwarderSession);
LOG.debug("[{}] Session {} got message {}", webSocketSessionKey, session, payload);
if(payload.startsWith(CONNECTED_TO_CE_PORT_MSG)){
//start reader thread to forward packets from local socket to websocket
@@ -372,8 +371,10 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
*/
@Override
protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
//TODO: may need to have message ack for each binary packet, and do not send the next packet until previous one has been acknowledged
//DT: this has not been an issue so far
String webSocketSessionKey = getWebSocketSessionKey(session);
ByteBuffer payload = message.getPayload();
@@ -383,7 +384,6 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
//find forwarderSession by inventoryId and CEPort
ForwarderSession forwarderSession = null;
for(ForwarderSession fs: sessionIdToForwarderSessionMap.values()){
if(fs.getInventoryId().equals(webSocketSessionKey) && fs.getConnectToPortOnEquipment()==port){
forwarderSession = fs;
@@ -419,14 +419,6 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
}
} else {
LOG.debug("[{}] Session {} received message that cannot be delivered because local socket is inoperable {}", webSocketSessionKey, session, message);
if (forwarderSession == null) {
LOG.debug("forwarderSession not found for webSocketSessionKey {}", webSocketSessionKey);
} else if (forwarderSession.getLocalSocket() == null) {
LOG.debug("forwarderSession local socket is null for webSocketSessionKey {}", webSocketSessionKey);
} else {
LOG.debug("forwarderSession local socket for webSocketSessionKey {} is closed = {} and connected = {} ",
webSocketSessionKey, forwarderSession.getLocalSocket().isClosed(), forwarderSession.getLocalSocket().isConnected());
}
}
}
@@ -450,29 +442,28 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) {
String webSocketSessionKey = getWebSocketSessionKey(session);
LOG.info("[{}] Closed portForwarder websocket connection {} : {}", webSocketSessionKey, session, closeStatus);
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
LOG.info("[{}] Closed portForwarder websocket connection {} : {}", getWebSocketSessionKey(session), session, closeStatus);
String webSocketSessionKey = getWebSocketSessionKey(session);
webSocketSessionMap.remove(webSocketSessionKey);
//close and remove all forwarder sessions for that CE
try {
Iterator<ForwarderSession> iter = sessionIdToForwarderSessionMap.values().iterator();
while (iter.hasNext()) {
ForwarderSession fs = iter.next();
if (fs.getInventoryId().equals(webSocketSessionKey)) {
if (fs.getLocalSocket() != null && !fs.getLocalSocket().isClosed()) {
fs.getLocalSocket().close();
}
if (fs.getServerSocket() != null && !fs.getServerSocket().isClosed()) {
fs.getServerSocket().close();
}
iter.remove();
Iterator<ForwarderSession> iter = sessionIdToForwarderSessionMap.values().iterator();
while(iter.hasNext()){
ForwarderSession fs = iter.next();
if(fs.getInventoryId().equals(webSocketSessionKey) ){
if(fs.getLocalSocket()!=null && !fs.getLocalSocket().isClosed()){
fs.getLocalSocket().close();
}
if(fs.getServerSocket()!=null && !fs.getServerSocket().isClosed()){
fs.getServerSocket().close();
}
}
} catch (Exception ex) {
LOG.error("Encountered exception when closing-sockets and removing sessions for Key {} ", webSocketSessionKey, ex);
iter.remove();
}
}
private String getWebSocketSessionKey(WebSocketSession session) {

View File

@@ -161,42 +161,6 @@
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>location-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>location-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>alarm-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>alarm-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>status-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>status-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -6,9 +6,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,10 +27,8 @@ import com.telecominfraproject.wlan.core.model.pagination.PaginationContext;
import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.core.model.pair.PairLongLong;
import com.telecominfraproject.wlan.datastore.exceptions.DsConcurrentModificationException;
import com.telecominfraproject.wlan.datastore.exceptions.DsDataValidationException;
import com.telecominfraproject.wlan.equipment.EquipmentServiceInterface;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration;
import com.telecominfraproject.wlan.equipment.models.ChannelPowerLevel;
import com.telecominfraproject.wlan.equipment.models.ElementRadioConfiguration;
import com.telecominfraproject.wlan.equipment.models.Equipment;
import com.telecominfraproject.wlan.equipment.models.EquipmentCellSizeAttributesUpdateRequest;
@@ -40,9 +36,7 @@ import com.telecominfraproject.wlan.equipment.models.EquipmentChannelsUpdateRequ
import com.telecominfraproject.wlan.equipment.models.EquipmentDetails;
import com.telecominfraproject.wlan.equipment.models.RadioConfiguration;
import com.telecominfraproject.wlan.equipment.models.bulkupdate.rrm.EquipmentRrmBulkUpdateRequest;
import com.telecominfraproject.wlan.location.service.LocationServiceInterface;
import com.telecominfraproject.wlan.profile.ProfileServiceInterface;
import com.telecominfraproject.wlan.location.models.Location;
import com.telecominfraproject.wlan.status.StatusServiceInterface;
/**
@@ -54,9 +48,6 @@ import com.telecominfraproject.wlan.status.StatusServiceInterface;
public class EquipmentPortalController {
private static final Logger LOG = LoggerFactory.getLogger(EquipmentPortalController.class);
public static enum CHANNEL_NUMBER_TYPE {channelNumber, backupChannelNumber, manualChannelNumber,
manualBackupChannelNumber};
@Value("${tip.wlan.portal.equipment.numRetryUpdate:10}")
private int numRetryUpdate;
@@ -80,9 +71,6 @@ public class EquipmentPortalController {
@Autowired
private ProfileServiceInterface profileServiceInterface;
@Autowired
private LocationServiceInterface locationServiceInterface;
@RequestMapping(value = "/equipment", method = RequestMethod.GET)
public Equipment getEquipment(@RequestParam long equipmentId) {
@@ -98,25 +86,14 @@ public class EquipmentPortalController {
LOG.debug("Updating equipment {}", equipment.getId());
Equipment ret = null;
Equipment existing = equipmentServiceInterface.getOrNull(equipment.getId());
for(int i=0; i<numRetryUpdate; i++) {
try {
if (equipment != null && existing != null && equipment.getLocationId() != existing.getLocationId()) {
Location location = locationServiceInterface.get(equipment.getLocationId());
Location existingLocation = locationServiceInterface.get(existing.getLocationId());
if (!Objects.equals(Location.getCountryCode(location), Location.getCountryCode(existingLocation))) {
updateEquipmentWithDefaultChannels(equipment);
}
}
validateChannelNum(equipment);
ret = equipmentServiceInterface.update(equipment);
break;
} catch (DsConcurrentModificationException e) {
LOG.debug("Equipment was concurrently updated, retrying: {}", e.getMessage());
existing = equipmentServiceInterface.getOrNull(equipment.getId());
Equipment existing = equipmentServiceInterface.getOrNull(equipment.getId());
equipment.setLastModifiedTimestamp(existing.getLastModifiedTimestamp());
}
}
@@ -128,115 +105,9 @@ public class EquipmentPortalController {
return ret;
}
private void updateEquipmentWithDefaultChannels(Equipment equipment) {
if (equipment.getDetails() instanceof ApElementConfiguration) {
ApElementConfiguration apElementConfiguration = (ApElementConfiguration) equipment.getDetails();
if (apElementConfiguration.getRadioMap() != null) {
for (RadioType radioType : apElementConfiguration.getRadioMap().keySet()) {
ElementRadioConfiguration elementRadioConfig = apElementConfiguration.getRadioMap().get(radioType);
elementRadioConfig.setChannelNumber(ElementRadioConfiguration.getDefaultChannelNumber(radioType));
elementRadioConfig.setBackupChannelNumber(ElementRadioConfiguration.getDefaultBackupChannelNumber(radioType));
elementRadioConfig.setManualChannelNumber(ElementRadioConfiguration.getDefaultChannelNumber(radioType));
elementRadioConfig.setManualBackupChannelNumber(ElementRadioConfiguration.getDefaultBackupChannelNumber(radioType));
}
}
}
}
private void validateChannelNum(Equipment equipment) {
if (equipment != null && equipment.getDetails() instanceof ApElementConfiguration) {
ApElementConfiguration apElementConfiguration = (ApElementConfiguration) equipment.getDetails();
if (apElementConfiguration.getRadioMap() != null) {
for (RadioType radioType : apElementConfiguration.getRadioMap().keySet()) {
ElementRadioConfiguration elementRadioConfig = apElementConfiguration.getRadioMap().get(radioType);
List<Integer> allowedChannels = elementRadioConfig.getAllowedChannelsPowerLevels().stream().map(
ChannelPowerLevel::getChannelNumber).collect(Collectors.toList());
if (allowedChannels != null && !allowedChannels.isEmpty()) {
for (CHANNEL_NUMBER_TYPE channelType : CHANNEL_NUMBER_TYPE.values()) {
checkAllowedChannels(equipment.getId(), elementRadioConfig, channelType, allowedChannels, radioType);
}
}
}
}
}
}
private Integer getChannelNumber( ElementRadioConfiguration elementRadioConfig, CHANNEL_NUMBER_TYPE channelType) {
Integer channelNum = null;
switch (channelType) {
case channelNumber: {
channelNum = elementRadioConfig.getChannelNumber();
break;
}
case backupChannelNumber: {
channelNum = elementRadioConfig.getBackupChannelNumber();
break;
}
case manualChannelNumber: {
channelNum = elementRadioConfig.getManualChannelNumber();
break;
}
case manualBackupChannelNumber: {
channelNum = elementRadioConfig.getManualBackupChannelNumber();
break;
}
}
return channelNum;
}
private void checkAllowedChannels(long equipmentId, ElementRadioConfiguration elementRadioConfig, CHANNEL_NUMBER_TYPE channelType,
List<Integer> allowedChannels, RadioType radioType) {
Integer channelNum = getChannelNumber(elementRadioConfig, channelType);
checkAllowedChannels(equipmentId, channelNum, channelType, allowedChannels, radioType);
}
private void checkAllowedChannels(long equipmentId, Integer channelNum, CHANNEL_NUMBER_TYPE channelType,
List<Integer> allowedChannels, RadioType radioType) {
if (channelNum != null && !allowedChannels.contains(channelNum)) {
LOG.error("Failed to update Equipment {}. The {} ({}) is out of the allowed channels range {} for radioType {}",
equipmentId, channelType, channelNum, allowedChannels, radioType);
throw new DsDataValidationException("Failed to update Equipment. The " + channelType + "(" + channelNum +
") is out of the allowed channels range " + allowedChannels + " for radioType " +
RadioType.getRadioDisplayString(radioType));
}
}
@RequestMapping(value = "/equipment/channel", method = RequestMethod.PUT)
public Equipment updateEquipmentChannels(@RequestBody EquipmentChannelsUpdateRequest request) {
LOG.debug("updateEquipmentChannels {}", request);
Map<RadioType, Integer> primaryChannels = request.getPrimaryChannels();
Map<RadioType, Integer> backupChannels = request.getBackupChannels();
long equipmentId = request.getEquipmentId();
Equipment existing = equipmentServiceInterface.getOrNull(equipmentId);
if (existing != null && existing.getDetails() instanceof ApElementConfiguration) {
ApElementConfiguration apElementConfiguration = (ApElementConfiguration) existing.getDetails();
if (apElementConfiguration.getRadioMap() != null) {
for (RadioType radioType : apElementConfiguration.getRadioMap().keySet()) {
ElementRadioConfiguration elementRadioConfig = apElementConfiguration.getRadioMap().get(radioType);
List<Integer> allowedChannels = elementRadioConfig.getAllowedChannelsPowerLevels().stream().map(
ChannelPowerLevel::getChannelNumber).collect(Collectors.toList());
if (allowedChannels != null && !allowedChannels.isEmpty()) {
if (primaryChannels != null && primaryChannels.get(radioType) != null) {
checkAllowedChannels(equipmentId, primaryChannels.get(radioType), CHANNEL_NUMBER_TYPE.channelNumber, allowedChannels, radioType);
}
if (backupChannels != null && backupChannels.get(radioType) != null) {
checkAllowedChannels(equipmentId, backupChannels.get(radioType), CHANNEL_NUMBER_TYPE.backupChannelNumber, allowedChannels, radioType);
}
}
}
}
}
return equipmentServiceInterface.updateChannels(request);
}
@@ -431,20 +302,6 @@ public class EquipmentPortalController {
@RequestMapping(value = "/equipment/rrmBulk", method=RequestMethod.PUT)
public GenericResponse updateRrmBulk(@RequestBody EquipmentRrmBulkUpdateRequest request) {
LOG.debug("updateRrmBulk {}", request);
//validate equipment before the bulk update
Set<Long> equipmentIds = new HashSet<>();
request.getItems().forEach(item -> equipmentIds.add(item.getEquipmentId()));
List<Equipment> equipmentBeforeUpdate = equipmentServiceInterface.get(equipmentIds);
Map<Long, Equipment> eqMap = new HashMap<>();
equipmentBeforeUpdate.forEach(eq -> eqMap.put(eq.getId(), eq));
request.getItems().forEach(item -> {
Equipment eq = eqMap.get(item.getEquipmentId());
if(item.applyToEquipment(eq)) {
validateChannelNum(eq);
}
});
equipmentServiceInterface.updateRrmBulk(request);
return new GenericResponse(true, "");
}

View File

@@ -12,15 +12,16 @@ import org.springframework.web.bind.annotation.RestController;
import com.telecominfraproject.wlan.core.model.json.GenericResponse;
import com.telecominfraproject.wlan.equipment.EquipmentServiceInterface;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration;
import com.telecominfraproject.wlan.equipment.models.Equipment;
import com.telecominfraproject.wlan.equipment.models.RadioChannelChangeSettings;
import com.telecominfraproject.wlan.equipment.models.events.EquipmentBlinkLEDsEvent;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWBlinkRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWCommandResultCode;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWCommandType;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWFirmwareDownloadRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWMostRecentStatsTimestamp;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWNewChannelRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWRebootRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGatewayCommand;
import com.telecominfraproject.wlan.equipmentgateway.models.EquipmentCommandResponse;
import com.telecominfraproject.wlan.equipmentgateway.service.EquipmentGatewayServiceInterface;
import com.telecominfraproject.wlan.firmware.FirmwareServiceInterface;
@@ -142,9 +143,9 @@ public class EquipmentGatewayPortalController {
@RequestMapping(value = "/equipmentGateway/requestApBlinkLEDs", method = RequestMethod.POST)
public GenericResponse requestApBlinkLEDs(@RequestParam long equipmentId, @RequestParam boolean blinkAllLEDs) {
String action = "stop blinking LEDs on AP";
String action = "stop blinking LEDs on AP ";
if (blinkAllLEDs)
action = "start blinking LEDs on AP";
action = "start blinking LEDs on AP ";
Equipment equipment = equipmentServiceInterface.get(equipmentId);
LOG.debug("Request {} for AP {}", action, equipment.getInventoryId());
@@ -156,13 +157,23 @@ public class EquipmentGatewayPortalController {
LOG.debug("{} response {}", action, response);
if (response.getResultCode() == CEGWCommandResultCode.Success) {
ApElementConfiguration apElementConfig = (ApElementConfiguration) equipment.getDetails();
apElementConfig.setBlinkAllLEDs(blinkAllLEDs);
equipmentServiceInterface.update(equipment);
return new GenericResponse(true, "");
} else {
return new GenericResponse(false, "Failed to " + action + " for AP: " + response.getResultCode() + " " + response.getResultDetail());
}
}
@RequestMapping(value = "/equipmentGateway/lastReceivedStatsTimestamp", method = RequestMethod.GET)
public GenericResponse lastReceivedStatsTimestamp(@RequestParam long equipmentId) {
Equipment equipment = equipmentServiceInterface.get(equipmentId);
String apId = equipment.getInventoryId();
CEGWMostRecentStatsTimestamp mostRecentStatsTimestamp = new CEGWMostRecentStatsTimestamp(CEGWCommandType.MostRecentStatsTimestamp, apId, equipmentId);
EquipmentCommandResponse response = equipmentGatewayServiceInterface.sendCommand(mostRecentStatsTimestamp);
LOG.debug("lastReceivedStatsTimestamp response {}", response);
if (response.getResultCode() == CEGWCommandResultCode.Success) {
return new GenericResponse(true, response.getResultDetail());
} else {
return new GenericResponse(false, response.getResultCode() + " - Failed to get last received stats timestamp for " + apId);
}
}
}

View File

@@ -173,11 +173,6 @@ public class FirmwarePortalController {
return firmwareServiceInterface.getDefaultCustomerTrackSetting();
}
@RequestMapping(value = "/customerTrack/default", method = RequestMethod.PUT)
public CustomerFirmwareTrackSettings updateDefaultCustomerTrackSetting(@RequestBody CustomerFirmwareTrackSettings defaultSettings) {
LOG.debug("calling updateDefaultCustomerTrackSetting({})", defaultSettings);
return firmwareServiceInterface.updateDefaultCustomerTrackSetting(defaultSettings);
}
@RequestMapping(value = "/customerTrack", method = RequestMethod.GET)
public CustomerFirmwareTrackRecord getCustomerFirmwareTrackRecord(@RequestParam int customerId) {

File diff suppressed because it is too large Load Diff

View File

@@ -1,509 +0,0 @@
package com.telecominfraproject.wlan.portal.controller.equipment;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import com.telecominfraproject.wlan.alarm.AlarmServiceLocal;
import com.telecominfraproject.wlan.alarm.controller.AlarmController;
import com.telecominfraproject.wlan.alarm.datastore.inmemory.AlarmDatastoreInMemory;
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherEmpty;
import com.telecominfraproject.wlan.core.model.entity.CountryCode;
import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.datastore.exceptions.DsDataValidationException;
import com.telecominfraproject.wlan.equipment.EquipmentServiceLocal;
import com.telecominfraproject.wlan.equipment.controller.EquipmentController;
import com.telecominfraproject.wlan.equipment.datastore.inmemory.EquipmentDatastoreInMemory;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration;
import com.telecominfraproject.wlan.equipment.models.ChannelPowerLevel;
import com.telecominfraproject.wlan.equipment.models.ElementRadioConfiguration;
import com.telecominfraproject.wlan.equipment.models.Equipment;
import com.telecominfraproject.wlan.equipment.models.EquipmentChannelsUpdateRequest;
import com.telecominfraproject.wlan.equipment.models.RadioConfiguration;
import com.telecominfraproject.wlan.location.datastore.LocationDatastore;
import com.telecominfraproject.wlan.location.datastore.inmemory.LocationDatastoreInMemory;
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.location.service.LocationServiceController;
import com.telecominfraproject.wlan.location.service.LocationServiceLocal;
import com.telecominfraproject.wlan.profile.ProfileServiceLocal;
import com.telecominfraproject.wlan.profile.controller.ProfileController;
import com.telecominfraproject.wlan.profile.datastore.inmemory.ProfileDatastoreInMemory;
import com.telecominfraproject.wlan.profile.models.ProfileByCustomerRequestFactory;
import com.telecominfraproject.wlan.status.StatusServiceLocal;
import com.telecominfraproject.wlan.status.controller.StatusController;
import com.telecominfraproject.wlan.status.datastore.inmemory.StatusDatastoreInMemory;
@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = {
"integration_test",
}) //NOTE: these profiles will be ADDED to the list of active profiles
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = EquipmentPortalControllerTest.class)
@Import(value = {
EquipmentServiceLocal.class,
EquipmentController.class,
EquipmentDatastoreInMemory.class,
EquipmentPortalController.class,
LocationServiceLocal.class,
LocationServiceController.class,
LocationDatastoreInMemory.class,
CloudEventDispatcherEmpty.class,
AlarmServiceLocal.class,
AlarmController.class,
AlarmDatastoreInMemory.class,
ProfileServiceLocal.class,
ProfileDatastoreInMemory.class,
ProfileController.class,
ProfileByCustomerRequestFactory.class,
StatusServiceLocal.class,
StatusDatastoreInMemory.class,
StatusController.class
})
public class EquipmentPortalControllerTest {
private static AtomicLong locationIncrementer = new AtomicLong(1);
private static AtomicLong equipmentIncrementer = new AtomicLong(1);
private static Set<Long> locationIds = new HashSet<Long>();
private static Set<Long> equipmentIds = new HashSet<Long>();
@Autowired private EquipmentPortalController equipmentPortalController;
@Autowired private LocationDatastore locationDatastore;
@BeforeEach
public void setup()
{
locationIds.clear();
equipmentIds.clear();
}
protected Location createLocation(int customerId, LocationType locationType, CountryCode countryCode) {
Location location = new Location();
location.setCustomerId(customerId);
// Setup location details with default CmapLocationActivityDetails
LocationDetails details = LocationDetails.createWithDefaults();
details.setCountryCode(countryCode);
location.setDetails(details);
location.setName("Location-UT" + locationIncrementer.getAndIncrement());
location.setLocationType(locationType);
Location created = locationDatastore.create(location);
assertNotNull(created);
return created;
}
@Test
public void testEquipmentUpdateChannelNumValidation() {
Location location = createLocation(2, LocationType.SITE, CountryCode.US);
//Create new Equipment - success
Equipment equipment = new Equipment();
equipment.setName("testName-"+ equipmentIncrementer.getAndIncrement());
equipment.setInventoryId("test-inv-"+equipmentIncrementer.getAndIncrement());
equipment.setEquipmentType(EquipmentType.AP);
equipment.setLocationId(location.getId());
equipment.setDetails(ApElementConfiguration.createWithDefaults());
ElementRadioConfiguration element2dot4RadioConfig = ((ApElementConfiguration)equipment.getDetails()).getRadioMap().get(RadioType.is2dot4GHz);
element2dot4RadioConfig.setAllowedChannelsPowerLevels(new HashSet<>());
for (int i = 1; i <= 11; i++) {
ChannelPowerLevel cpl = new ChannelPowerLevel();
cpl.setChannelNumber(i);
cpl.setChannelWidth(20);
cpl.setDfs(false);
cpl.setPowerLevel(30);
element2dot4RadioConfig.getAllowedChannelsPowerLevels().add(cpl);
}
Equipment ret = equipmentPortalController.createEquipment(equipment);
assertNotNull(ret);
long equipmentId = ret.getId();
ret = equipmentPortalController.getEquipment(equipmentId);
assertEqualEquipments(equipment, ret);
ElementRadioConfiguration retElement2dot4RadioConfig = ((ApElementConfiguration)ret.getDetails()).getRadioMap().get(RadioType.is2dot4GHz);
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_2DOT4GHZ, retElement2dot4RadioConfig.getChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_2DOT4GHZ, retElement2dot4RadioConfig.getBackupChannelNumber().intValue());
//Update success
retElement2dot4RadioConfig.setChannelNumber(1);
retElement2dot4RadioConfig.setManualChannelNumber(2);
retElement2dot4RadioConfig.setBackupChannelNumber(3);
retElement2dot4RadioConfig.setManualBackupChannelNumber(4);
Equipment updatedEquipment = equipmentPortalController.updateEquipment(ret);
Equipment retUpdate = equipmentPortalController.getEquipment(ret.getId());
assertEqualEquipments(retUpdate, updatedEquipment);
ElementRadioConfiguration ret2Element2dot4RadioConfig = ((ApElementConfiguration)retUpdate.getDetails()).getRadioMap().get(RadioType.is2dot4GHz);
assertEquals(1, ret2Element2dot4RadioConfig.getChannelNumber().intValue());
assertEquals(2, ret2Element2dot4RadioConfig.getManualChannelNumber().intValue());
assertEquals(3, ret2Element2dot4RadioConfig.getBackupChannelNumber().intValue());
assertEquals(4, ret2Element2dot4RadioConfig.getManualBackupChannelNumber().intValue());
//Update failure
ret2Element2dot4RadioConfig.setChannelNumber(12);
try {
equipmentPortalController.updateEquipment(retUpdate);
fail("EquipmentService update channelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
ret2Element2dot4RadioConfig.setChannelNumber(6);
ret2Element2dot4RadioConfig.setManualChannelNumber(13);
try {
equipmentPortalController.updateEquipment(retUpdate);
fail("EquipmentService update manualChannelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
ret2Element2dot4RadioConfig.setManualChannelNumber(7);
ret2Element2dot4RadioConfig.setBackupChannelNumber(14);
try {
equipmentPortalController.updateEquipment(retUpdate);
fail("EquipmentService update backupChannelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
ret2Element2dot4RadioConfig.setBackupChannelNumber(8);
ret2Element2dot4RadioConfig.setManualBackupChannelNumber(15);
try {
equipmentPortalController.updateEquipment(retUpdate);
fail("EquipmentService update manualBackupChannelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
//Tolerate null now
ret2Element2dot4RadioConfig.setManualBackupChannelNumber(null);
equipmentPortalController.updateEquipment(retUpdate);
// Clean up after test
equipmentPortalController.deleteEquipment(equipmentId);
locationDatastore.delete(location.getId());
}
@Test
public void testEquipmentUpdateChannelNumValidationWithCorrection() {
Location location1 = createLocation(2, LocationType.SITE, CountryCode.US);
Location location2 = createLocation(2, LocationType.BUILDING, CountryCode.SA);
//Create new Equipment - success
Equipment equipment = new Equipment();
equipment.setName("testName-"+equipmentIncrementer.getAndIncrement());
equipment.setInventoryId("test-inv-"+equipmentIncrementer.getAndIncrement());
equipment.setEquipmentType(EquipmentType.AP);
equipment.setLocationId(location1.getId());
ApElementConfiguration apConfig = ApElementConfiguration.createWithDefaults();
if (apConfig.getElementRadioConfiguration(RadioType.is5GHz) == null) {
Map<RadioType, ElementRadioConfiguration> radioMapInit = apConfig.getRadioMap();
Map<RadioType, RadioConfiguration> advRadioMapInit = apConfig.getAdvancedRadioMap();
radioMapInit.put(RadioType.is5GHz, ElementRadioConfiguration.createWithDefaults(RadioType.is5GHz));
apConfig.setRadioMap(radioMapInit);
advRadioMapInit.put(RadioType.is5GHz, RadioConfiguration.createWithDefaults(RadioType.is5GHz));
apConfig.setAdvancedRadioMap(advRadioMapInit);
}
equipment.setDetails(apConfig);
ElementRadioConfiguration element5GRadioConfig = ((ApElementConfiguration)equipment.getDetails()).getRadioMap().get(RadioType.is5GHz);
element5GRadioConfig.setAllowedChannelsPowerLevels(new HashSet<>());
for (int i = 36; i <= 64; i=i+4) {
ChannelPowerLevel cpl = new ChannelPowerLevel();
cpl.setChannelNumber(i);
cpl.setChannelWidth(20);
cpl.setDfs(false);
cpl.setPowerLevel(30);
element5GRadioConfig.getAllowedChannelsPowerLevels().add(cpl);
}
for (int i = 149; i <= 161; i=i+4) {
ChannelPowerLevel cpl = new ChannelPowerLevel();
cpl.setChannelNumber(i);
cpl.setChannelWidth(20);
cpl.setDfs(false);
cpl.setPowerLevel(30);
element5GRadioConfig.getAllowedChannelsPowerLevels().add(cpl);
}
Equipment ret = equipmentPortalController.createEquipment(equipment);
assertNotNull(ret);
long equipmentId = ret.getId();
ret = equipmentPortalController.getEquipment(equipmentId);
assertEqualEquipments(equipment, ret);
ElementRadioConfiguration retElement5GRadioConfig = ((ApElementConfiguration)ret.getDetails()).getRadioMap().get(RadioType.is5GHz);
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_5GHZ, retElement5GRadioConfig.getChannelNumber().intValue());
assertEquals( ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZ, retElement5GRadioConfig.getBackupChannelNumber().intValue());
//Update success
retElement5GRadioConfig.setChannelNumber(149);
retElement5GRadioConfig.setManualChannelNumber(52);
retElement5GRadioConfig.setBackupChannelNumber(157);
retElement5GRadioConfig.setManualBackupChannelNumber(60);
Equipment updatedEquipment = equipmentPortalController.updateEquipment(ret);
Equipment retUpdate = equipmentPortalController.getEquipment(ret.getId());
assertEqualEquipments(retUpdate, updatedEquipment);
ElementRadioConfiguration ret2Element5GRadioConfig = ((ApElementConfiguration)retUpdate.getDetails()).getRadioMap().get(RadioType.is5GHz);
assertEquals(149, ret2Element5GRadioConfig.getChannelNumber().intValue());
assertEquals(52, ret2Element5GRadioConfig.getManualChannelNumber().intValue());
assertEquals(157, ret2Element5GRadioConfig.getBackupChannelNumber().intValue());
assertEquals(60, ret2Element5GRadioConfig.getManualBackupChannelNumber().intValue());
//Update failure
ret2Element5GRadioConfig.setChannelNumber(165);
try {
equipmentPortalController.updateEquipment(retUpdate);
fail("EquipmentService update channelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
ret2Element5GRadioConfig.setChannelNumber(157);
ret2Element5GRadioConfig.setManualChannelNumber(165);
try {
equipmentPortalController.updateEquipment(retUpdate);
fail("EquipmentService update manualChannelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
ret2Element5GRadioConfig.setManualChannelNumber(44);
ret2Element5GRadioConfig.setBackupChannelNumber(14);
try {
equipmentPortalController.updateEquipment(retUpdate);
fail("EquipmentService update backupChannelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
ret2Element5GRadioConfig.setBackupChannelNumber(36);
ret2Element5GRadioConfig.setManualBackupChannelNumber(15);
try {
equipmentPortalController.updateEquipment(retUpdate);
fail("EquipmentService update manualBackupChannelNumber failed");
} catch (DsDataValidationException e) {
// pass
}
ret2Element5GRadioConfig.setManualBackupChannelNumber(52);
equipmentPortalController.updateEquipment(retUpdate);
Equipment ret2Update = equipmentPortalController.getEquipment(ret.getId());
ElementRadioConfiguration ret3Element5GRadioConfig = ((ApElementConfiguration)ret2Update.getDetails()).getRadioMap().get(RadioType.is5GHz);
assertEquals(157, ret3Element5GRadioConfig.getChannelNumber().intValue());
assertEquals(44, ret3Element5GRadioConfig.getManualChannelNumber().intValue());
assertEquals(36, ret3Element5GRadioConfig.getBackupChannelNumber().intValue());
assertEquals(52, ret3Element5GRadioConfig.getManualBackupChannelNumber().intValue());
// CHANGE Country Code
ret2Update.setLocationId(location2.getId());
Equipment ret3Update = equipmentPortalController.updateEquipment(ret2Update);
ElementRadioConfiguration ret4Element5GRadioConfig = ((ApElementConfiguration) ret3Update.getDetails())
.getRadioMap().get(RadioType.is5GHz);
// These are auto-corrected values
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_5GHZ, ret4Element5GRadioConfig.getChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_5GHZ, ret4Element5GRadioConfig.getManualChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZ, ret4Element5GRadioConfig.getBackupChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZ, ret4Element5GRadioConfig.getManualBackupChannelNumber().intValue());
for (int i = 149; i <= 161; i = i + 4) {
ChannelPowerLevel cpl = new ChannelPowerLevel();
cpl.setChannelNumber(i);
cpl.setChannelWidth(20);
cpl.setDfs(false);
cpl.setPowerLevel(30);
ret4Element5GRadioConfig.getAllowedChannelsPowerLevels().remove(cpl);
}
Equipment ret5Update = equipmentPortalController.updateEquipment(ret3Update);
ElementRadioConfiguration ret5Element5GRadioConfig = ((ApElementConfiguration) ret5Update.getDetails())
.getRadioMap().get(RadioType.is5GHz);
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_5GHZ, ret5Element5GRadioConfig.getChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_5GHZ, ret5Element5GRadioConfig.getManualChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZ, ret5Element5GRadioConfig.getBackupChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZ, ret5Element5GRadioConfig.getManualBackupChannelNumber().intValue());
// Clean up after test
equipmentPortalController.deleteEquipment(equipmentId);
locationDatastore.delete(location1.getId());
locationDatastore.delete(location2.getId());
}
@Test
public void testChannelsUpdateChannelNumValidation() {
Location location = createLocation(2, LocationType.SITE, CountryCode.US);
//Create test Equipment
Equipment equipment = new Equipment();
equipment.setName("test_ChannelsUpdate");
equipment.setLocationId(location.getId());
equipment.setEquipmentType(EquipmentType.AP);
equipment.setInventoryId("inv-" + equipment.getName());
ApElementConfiguration apConfig = ApElementConfiguration.createWithDefaults();
equipment.setDetails(apConfig);
if (apConfig.getElementRadioConfiguration(RadioType.is5GHz) == null) {
Map<RadioType, ElementRadioConfiguration> radioMap = apConfig.getRadioMap();
radioMap.put(RadioType.is5GHz, ElementRadioConfiguration.createWithDefaults(RadioType.is5GHz));
apConfig.setRadioMap(radioMap);
}
ElementRadioConfiguration element2dot4RadioConfig = ((ApElementConfiguration)equipment.getDetails()).getRadioMap().get(RadioType.is2dot4GHz);
element2dot4RadioConfig.setAllowedChannelsPowerLevels(new HashSet<>());
for (int i = 1; i <= 11; i++) {
ChannelPowerLevel cpl = new ChannelPowerLevel();
cpl.setChannelNumber(i);
cpl.setChannelWidth(20);
cpl.setDfs(false);
cpl.setPowerLevel(30);
element2dot4RadioConfig.getAllowedChannelsPowerLevels().add(cpl);
}
ElementRadioConfiguration element5GRadioConfig = ((ApElementConfiguration)equipment.getDetails()).getRadioMap().get(RadioType.is5GHz);
element5GRadioConfig.setAllowedChannelsPowerLevels(new HashSet<>());
for (int i = 36; i <= 64; i=i+4) {
ChannelPowerLevel cpl = new ChannelPowerLevel();
cpl.setChannelNumber(i);
cpl.setChannelWidth(20);
cpl.setDfs(false);
cpl.setPowerLevel(30);
element5GRadioConfig.getAllowedChannelsPowerLevels().add(cpl);
}
for (int i = 149; i <= 161; i=i+4) {
ChannelPowerLevel cpl = new ChannelPowerLevel();
cpl.setChannelNumber(i);
cpl.setChannelWidth(20);
cpl.setDfs(false);
cpl.setPowerLevel(30);
element5GRadioConfig.getAllowedChannelsPowerLevels().add(cpl);
}
Equipment equipmentCreated = equipmentPortalController.createEquipment(equipment);
long equipmentId = equipmentCreated.getId();
Equipment equipmentGet = equipmentPortalController.getEquipment(equipmentId);
assertNotNull(equipmentGet);
ApElementConfiguration apElementConfiguration = (ApElementConfiguration)equipmentGet.getDetails();
assertNotNull(apElementConfiguration);
Map<RadioType, ElementRadioConfiguration> radioMap = apElementConfiguration.getRadioMap();
assertNotNull(radioMap);
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_2DOT4GHZ, radioMap.get(RadioType.is2dot4GHz).getChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_2DOT4GHZ, radioMap.get(RadioType.is2dot4GHz).getBackupChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_2DOT4GHZ, radioMap.get(RadioType.is2dot4GHz).getManualChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_2DOT4GHZ, radioMap.get(RadioType.is2dot4GHz).getManualBackupChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_5GHZ, radioMap.get(RadioType.is5GHz).getChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZ, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_5GHZ, radioMap.get(RadioType.is5GHz).getManualChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZ, radioMap.get(RadioType.is5GHz).getManualBackupChannelNumber().intValue());
Map<RadioType, Integer> primaryChannels = new EnumMap<>(RadioType.class);
Map<RadioType, Integer> backupChannels = new EnumMap<>(RadioType.class);
Map<RadioType, Boolean> autoChannelSelections = new EnumMap<>(RadioType.class);
primaryChannels.put(RadioType.is2dot4GHz, 1);
primaryChannels.put(RadioType.is5GHz, 52);
backupChannels.put(RadioType.is2dot4GHz, 6);
backupChannels.put(RadioType.is5GHz, 149);
autoChannelSelections.put(RadioType.is2dot4GHz, false);
autoChannelSelections.put(RadioType.is5GHz, false);
EquipmentChannelsUpdateRequest channelsUpdateRequest = new EquipmentChannelsUpdateRequest();
channelsUpdateRequest.setEquipmentId(equipmentId);
channelsUpdateRequest.setPrimaryChannels(primaryChannels);
channelsUpdateRequest.setBackupChannels(backupChannels);
channelsUpdateRequest.setAutoChannelSelections(autoChannelSelections);
Equipment equipmentUpdate1 = equipmentPortalController.updateEquipmentChannels(channelsUpdateRequest);
Equipment equipmentGetUpdate1 = equipmentPortalController.getEquipment(equipmentId);
assertEqualEquipments(equipmentGetUpdate1, equipmentUpdate1);
apElementConfiguration = (ApElementConfiguration)equipmentGetUpdate1.getDetails();
assertNotNull(apElementConfiguration);
radioMap = apElementConfiguration.getRadioMap();
assertNotNull(radioMap);
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_2DOT4GHZ, radioMap.get(RadioType.is2dot4GHz).getChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_2DOT4GHZ, radioMap.get(RadioType.is2dot4GHz).getBackupChannelNumber().intValue());
assertEquals(1, radioMap.get(RadioType.is2dot4GHz).getManualChannelNumber().intValue());
assertEquals(6, radioMap.get(RadioType.is2dot4GHz).getManualBackupChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_CHANNEL_NUMBER_5GHZ, radioMap.get(RadioType.is5GHz).getChannelNumber().intValue());
assertEquals(ElementRadioConfiguration.DEFAULT_BACKUP_CHANNEL_NUMBER_5GHZ, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(52, radioMap.get(RadioType.is5GHz).getManualChannelNumber().intValue());
assertEquals(149, radioMap.get(RadioType.is5GHz).getManualBackupChannelNumber().intValue());
primaryChannels.clear();
primaryChannels.put(RadioType.is2dot4GHz, 30);
primaryChannels.put(RadioType.is5GHz, 200);
backupChannels.clear();
backupChannels.put(RadioType.is2dot4GHz, 20);
backupChannels.put(RadioType.is5GHz, 300);
channelsUpdateRequest = new EquipmentChannelsUpdateRequest();
channelsUpdateRequest.setEquipmentId(equipmentId);
channelsUpdateRequest.setPrimaryChannels(primaryChannels);
channelsUpdateRequest.setBackupChannels(backupChannels);
channelsUpdateRequest.setAutoChannelSelections(autoChannelSelections);
try {
Equipment equipmentUpdate2 = equipmentPortalController.updateEquipmentChannels(channelsUpdateRequest);
} catch (DsDataValidationException e) {
// pass
}
// Clean up after test
equipmentPortalController.deleteEquipment(equipmentId);
locationDatastore.delete(location.getId());
}
private void assertEqualEquipments(
Equipment expected,
Equipment actual) {
assertEquals(expected.getName(), actual.getName());
//TODO: add more fields to check here
}
}

View File

@@ -20,8 +20,6 @@ public class PortalUserEventPayload extends BaseJsonModel implements HasCustomer
private long createdTimestamp;
private long lastModifiedTimestamp;
public PortalUserEventPayload() {}
public PortalUserEventPayload(PortalUser portalUser) {
this.setId(portalUser.getId());
this.setCustomerId(portalUser.getCustomerId());

View File

@@ -1,94 +0,0 @@
package com.telecominfraproject.wlan.profile.ethernetport.models;
import com.telecominfraproject.wlan.core.model.equipment.PushableConfiguration;
import com.telecominfraproject.wlan.profile.models.ProfileDetails;
import com.telecominfraproject.wlan.profile.models.ProfileType;
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
* @author rsharma
*/
public class WiredEthernetPortConfiguration extends ProfileDetails implements PushableConfiguration<WiredEthernetPortConfiguration> {
private static final long serialVersionUID = 5326345492525165619L;
private String equipmentModel; // e.g., MR8300-CA, EC420-G1
private Set<WiredPort> ethPorts;
public WiredEthernetPortConfiguration() {
// for Serialization
}
public WiredEthernetPortConfiguration(String equipmentModel, Set<WiredPort> ethPorts) {
this.equipmentModel = equipmentModel;
this.ethPorts = ethPorts;
}
public static WiredEthernetPortConfiguration createWithDefaults() {
return new WiredEthernetPortConfiguration();
}
public String getEquipmentModel() {
return equipmentModel;
}
public void setEquipmentModel(String equipmentModel) {
this.equipmentModel = equipmentModel;
}
public Set<WiredPort> getEthPorts() {
return ethPorts;
}
public void setEthPorts(Set<WiredPort> ethPorts) {
this.ethPorts = ethPorts;
}
@Override
public boolean needsToBeUpdatedOnDevice(WiredEthernetPortConfiguration previousVersion) {
if (previousVersion != null) {
return !Objects.equals(this, previousVersion);
}
return true;
}
@Override
public ProfileType getProfileType() {
return ProfileType.wired_ethernet_port;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof WiredEthernetPortConfiguration)) {
return false;
}
WiredEthernetPortConfiguration that = (WiredEthernetPortConfiguration) o;
return Objects.equals(getEquipmentModel(), that.getEquipmentModel()) &&
Objects.equals(getEthPorts(), that.getEthPorts());
}
@Override
public int hashCode() {
return Objects.hash(getEquipmentModel(), getEthPorts());
}
@Override
public WiredEthernetPortConfiguration clone() {
WiredEthernetPortConfiguration ret = (WiredEthernetPortConfiguration)super.clone();
if (ethPorts != null) {
ret.ethPorts = new HashSet<>(ethPorts);
}
return ret;
}
}

View File

@@ -1,112 +0,0 @@
package com.telecominfraproject.wlan.profile.ethernetport.models;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author rsharma
*/
public class WiredPort extends BaseJsonModel {
private static final long serialVersionUID = 6595665507927422135L;
private String name; //eth0 or eth1
private String displayName; // LAN-1, WAN-0 etc
private String ifName; // lan, wan etc
private String ifType; // bridge/Nat
private int vlanId; // native vlanId/tagged vlanId
private boolean trunkEnabled; // trunk enabled or disabled
private List<Integer> allowedVlanIds; // allowed vlanIds
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getIfName() {
return ifName;
}
public void setIfName(String ifName) {
this.ifName = ifName;
}
public String getIfType() {
return ifType;
}
public void setIfType(String ifType) {
this.ifType = ifType;
}
public int getVlanId() {
return vlanId;
}
public void setVlanId(int vlanId) {
this.vlanId = vlanId;
}
public boolean isTrunkEnabled() {
return trunkEnabled;
}
public void setTrunkEnabled(boolean trunkEnabled) {
this.trunkEnabled = trunkEnabled;
}
public List<Integer> getAllowedVlanIds() {
return allowedVlanIds;
}
public void setAllowedVlanIds(List<Integer> allowedVlanIds) {
this.allowedVlanIds = allowedVlanIds;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof WiredPort)) {
return false;
}
WiredPort wiredPort = (WiredPort) o;
return getVlanId() == wiredPort.getVlanId() && isTrunkEnabled() == wiredPort.isTrunkEnabled()
&& Objects.equals(getName(), wiredPort.getName())
&& Objects.equals(getDisplayName(), wiredPort.getDisplayName())
&& Objects.equals(getIfName(), wiredPort.getIfName())
&& Objects.equals(getIfType(), wiredPort.getIfType())
&& Objects.equals(getAllowedVlanIds(), wiredPort.getAllowedVlanIds());
}
@Override
public int hashCode() {
return Objects.hash(getName(), getDisplayName(), getIfName(), getIfType(), getVlanId(), isTrunkEnabled(), getAllowedVlanIds());
}
@Override
public WiredPort clone() {
WiredPort port = (WiredPort) super.clone();
if (getAllowedVlanIds() != null) {
port.allowedVlanIds = new ArrayList<>(getAllowedVlanIds());
}
return port;
}
}

View File

@@ -5,8 +5,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.telecominfraproject.wlan.profile.ethernetport.models.WiredEthernetPortConfiguration;
/**
* @author dtop
* Utility class for dealing with profiles
@@ -42,26 +40,6 @@ public class ProfileContainer {
return ret.get(0);
}
public Profile getChildOfTypeOrNullByEquipmentModel(long profileId, ProfileType childProfileType,
String equipmentModel) {
// The profile type of the profileId should be equipment_ap
Profile apProfile = profileMap.get(profileId);
if (apProfile != null && apProfile.getProfileType() == ProfileType.equipment_ap) {
List<Profile> profiles = getChildrenOfType(profileId, childProfileType);
for (Profile ret : profiles) {
WiredEthernetPortConfiguration config = (WiredEthernetPortConfiguration) ret.getDetails();
if (config != null && config.getEquipmentModel() != null
&& config.getEquipmentModel().equals(equipmentModel)) {
return ret;
}
}
} else {
throw new IllegalArgumentException("Profile Id " + profileId + " is not of type equipment_ap");
}
return null;
}
public List<Profile> getChildrenOfType(long profileId, ProfileType childProfileType) {
Profile parent = profileMap.get(profileId);
List<Profile> ret = new ArrayList<>();

View File

@@ -62,8 +62,6 @@ public class ProfileType implements EnumWithId {
passpoint_venue = new ProfileType(12,"passpoint_venue"),
passpoint_osu_id_provider = new ProfileType(13,"passpoint_osu_id_provider"),
ap_event_rate = new ProfileType(14,"ap_event_rate"),
metrics = new ProfileType(15,"metrics"),
wired_ethernet_port = new ProfileType(16, "wired_ethernet_port"),
UNSUPPORTED = new ProfileType(-1, "UNSUPPORTED");
static {

View File

@@ -28,7 +28,6 @@ public class ApNetworkConfiguration extends CommonNetworkConfiguration
public static final Boolean DEFAULT_SYNTHETIC_CLIENT_ENABLED = Boolean.TRUE;
public static final Boolean DEFAULT_LED_CONTROL_ENABLED = Boolean.TRUE;
public static final Boolean DEFAULT_EQUIPMENT_DISCOVERY_ENABLED = Boolean.FALSE;
public static final Boolean DEFAULT_DYNAMIC_RADIUS_PROXY_ENABLED = Boolean.FALSE;
/**
* Added as a profile level setting that can be used to provide
@@ -60,7 +59,6 @@ public class ApNetworkConfiguration extends CommonNetworkConfiguration
setSyntheticClientEnabled(DEFAULT_SYNTHETIC_CLIENT_ENABLED);
setLedControlEnabled(DEFAULT_LED_CONTROL_ENABLED);
setEquipmentDiscovery(DEFAULT_EQUIPMENT_DISCOVERY_ENABLED);
setDynamicRadiusProxyEnabled(DEFAULT_DYNAMIC_RADIUS_PROXY_ENABLED);
// initialize the profile level radio map settings parameter
radioMap = new EnumMap<>(RadioType.class);

View File

@@ -23,7 +23,6 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
private Boolean syntheticClientEnabled;
private Boolean ledControlEnabled;
private Boolean equipmentDiscovery;
private Boolean dynamicRadiusProxyEnabled;
public CommonNetworkConfiguration() {
}
@@ -68,6 +67,7 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
this.vlanNative = bool;
}
public AutoOrManualString getNtpServer() {
return ntpServer;
}
@@ -92,7 +92,8 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
this.syntheticClientEnabled = syntheticClientEnabled;
}
public Boolean isLedControlEnabled() {
public Boolean getLedControlEnabled() {
return ledControlEnabled;
}
@@ -107,23 +108,6 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
public void setRtlsSettings(RtlsSettings rtlsSettings) {
this.rtlsSettings = rtlsSettings;
}
public Boolean isDynamicRadiusProxyEnabled() {
return dynamicRadiusProxyEnabled;
}
public void setDynamicRadiusProxyEnabled(Boolean dynamicRadiusProxyEnabled) {
this.dynamicRadiusProxyEnabled = dynamicRadiusProxyEnabled;
}
public Boolean getEquipmentDiscovery() {
return equipmentDiscovery;
}
public void setEquipmentDiscovery(Boolean equipmentDiscovery) {
this.equipmentDiscovery = equipmentDiscovery;
}
@Override
public CommonNetworkConfiguration clone() {
@@ -140,9 +124,7 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
ret.setVlan(getVlan());
ret.setVlanNative(isVlanNative());
ret.setSyntheticClientEnabled(getSyntheticClientEnabled());
ret.setLedControlEnabled(isLedControlEnabled());
ret.setEquipmentDiscovery(getEquipmentDiscovery());
ret.setDynamicRadiusProxyEnabled(isDynamicRadiusProxyEnabled());
return ret;
}
@@ -163,10 +145,26 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
return false;
}
public Boolean getEquipmentDiscovery() {
return equipmentDiscovery;
}
public void setEquipmentDiscovery(Boolean equipmentDiscovery) {
this.equipmentDiscovery = equipmentDiscovery;
}
public Boolean getVlanNative() {
return vlanNative;
}
@Override
public int hashCode() {
return Objects.hash(equipmentDiscovery, equipmentType, ledControlEnabled, networkConfigVersion, ntpServer, rtlsSettings,
syntheticClientEnabled, syslogRelay, vlan, vlanNative, dynamicRadiusProxyEnabled);
syntheticClientEnabled, syslogRelay, vlan, vlanNative);
}
@Override
@@ -185,8 +183,7 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
&& Objects.equals(ntpServer, other.ntpServer) && Objects.equals(rtlsSettings, other.rtlsSettings)
&& Objects.equals(syntheticClientEnabled, other.syntheticClientEnabled)
&& Objects.equals(syslogRelay, other.syslogRelay) && vlan == other.vlan
&& Objects.equals(vlanNative, other.vlanNative)
&& Objects.equals(dynamicRadiusProxyEnabled, other.dynamicRadiusProxyEnabled);
&& Objects.equals(vlanNative, other.vlanNative);
}

View File

@@ -28,7 +28,6 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
private Boolean useRadSec;
private String sharedSecret; // if useRadSec is false
private String acctSharedSecret; // if useRadSec is false
private String radiusProxySecret;
private Boolean dynamicDiscovery; // dynamic discovery of HSP and IdPs (home service and identity providers).
// regardless of configured value, this will only be set 'true' on the AP if useRadSec is also true.
@@ -146,14 +145,6 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
public void setAcctSharedSecret(String acctSharedSecret) {
this.acctSharedSecret = acctSharedSecret;
}
public String getRadiusProxySecret() {
return radiusProxySecret;
}
public void setRadiusProxySecret(String radiusProxySecret) {
this.radiusProxySecret = radiusProxySecret;
}
/**
* @return the dynamicDiscovery
@@ -183,7 +174,7 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
@Override
public int hashCode() {
return Objects.hash(acctPort, acctServer, acctSharedSecret, caCert, clientCert, clientKey, dynamicDiscovery, name, passphrase, port, realm, server,
sharedSecret, useRadSec, radiusProxySecret);
sharedSecret, useRadSec);
}
@Override
@@ -200,8 +191,7 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
&& Objects.equals(clientCert, other.clientCert) && Objects.equals(clientKey, other.clientKey)
&& Objects.equals(dynamicDiscovery, other.dynamicDiscovery) && Objects.equals(name, other.name) && Objects.equals(passphrase, other.passphrase)
&& Objects.equals(port, other.port) && Objects.equals(realm, other.realm) && Objects.equals(server, other.server)
&& Objects.equals(sharedSecret, other.sharedSecret) && Objects.equals(useRadSec, other.useRadSec)
&& Objects.equals(radiusProxySecret, other.radiusProxySecret);
&& Objects.equals(sharedSecret, other.sharedSecret) && Objects.equals(useRadSec, other.useRadSec);
}

View File

@@ -63,7 +63,7 @@ public class PasspointProfile extends ProfileDetails implements PushableConfigur
private boolean enable2pt4GHz;
private boolean enable5GHz;
private Set<Long> associatedAccessSsidProfileIds;
private List<Long> associatedAccessSsidProfileIds;
private Long osuSsidProfileId;
@@ -321,11 +321,11 @@ public class PasspointProfile extends ProfileDetails implements PushableConfigur
this.passpointNetworkAuthenticationType = passpointNetworkAuthenticationType;
}
public Set<Long> getAssociatedAccessSsidProfileIds() {
public List<Long> getAssociatedAccessSsidProfileIds() {
return associatedAccessSsidProfileIds;
}
public void setAssociatedAccessSsidProfileIds(Set<Long> associatedAccessSsidProfileIds) {
public void setAssociatedAccessSsidProfileIds(List<Long> associatedAccessSsidProfileIds) {
this.associatedAccessSsidProfileIds = associatedAccessSsidProfileIds;
}

View File

@@ -4,8 +4,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
import com.telecominfraproject.wlan.core.model.equipment.ChannelBandwidth;
import com.telecominfraproject.wlan.core.model.equipment.ChannelHopSettings;
@@ -82,8 +80,6 @@ public class RfElementConfiguration extends BaseJsonModel {
private Boolean useMaxTxPower;
private Integer eirpTxPower;
private RadioBestApSettings bestApSettings;
private Set<Integer> autoExclusionChannels = new TreeSet<Integer>();
private RfElementConfiguration() {
long timestamp = System.currentTimeMillis();
@@ -116,7 +112,7 @@ public class RfElementConfiguration extends BaseJsonModel {
ret.setMinAutoCellSize(MIN_CELL_SIZE_MAP.get(radioType));
ret.setMaxAutoCellSize(MAX_CELL_SIZE_MAP.get(radioType));
if (radioType == RadioType.is5GHz || radioType == RadioType.is5GHzL || radioType == RadioType.is5GHzU) {
ret.setChannelBandwidth(ChannelBandwidth.is40MHz);
ret.setChannelBandwidth(ChannelBandwidth.is80MHz);
ret.setRadioMode(RadioMode.modeAC);
} else {
ret.setChannelBandwidth(ChannelBandwidth.is20MHz);
@@ -327,16 +323,17 @@ public class RfElementConfiguration extends BaseJsonModel {
this.minAutoCellSize = minAutoCellSize;
}
//Always return default value
public Integer getMaxAutoCellSize() {
if (MAX_CELL_SIZE_MAP.containsKey(this.radioType)) {
return MAX_CELL_SIZE_MAP.get(this.radioType);
} else {
return MAX_CELL_SIZE_MAP.get(RadioType.is2dot4GHz);
if (maxAutoCellSize == null) {
if (MAX_CELL_SIZE_MAP.containsKey(this.radioType)) {
return MAX_CELL_SIZE_MAP.get(this.radioType);
} else {
return MAX_CELL_SIZE_MAP.get(RadioType.is2dot4GHz);
}
}
return maxAutoCellSize;
}
// not allow user to configure
public void setMaxAutoCellSize(Integer maxAutoCellSize) {
this.maxAutoCellSize = maxAutoCellSize;
}
@@ -365,25 +362,9 @@ public class RfElementConfiguration extends BaseJsonModel {
this.bestApSettings = bestApSettings;
}
public Set<Integer> getAutoExclusionChannels() {
return autoExclusionChannels;
}
public void setAutoExclusionChannels(Set<Integer> autoExclusionChannels) {
if (autoExclusionChannels != null) {
this.autoExclusionChannels.clear();
this.autoExclusionChannels.addAll(autoExclusionChannels);
}
}
@Override
public RfElementConfiguration clone() {
RfElementConfiguration ret = (RfElementConfiguration) super.clone();
if (autoExclusionChannels != null) {
ret.autoExclusionChannels = new TreeSet<>(autoExclusionChannels);
}
return ret;
return (RfElementConfiguration) super.clone();
}
@Override
@@ -428,7 +409,7 @@ public class RfElementConfiguration extends BaseJsonModel {
channelBandwidth, channelHopSettings, clientDisconnectThresholdDb, eirpTxPower, forceScanDuringVoice,
managementRate, maxNumClients, mimoMode, minAutoCellSize, multicastRate, neighbouringListApConfig,
perimeterDetectionEnabled, probeResponseThresholdDb, radioMode, radioType, rf, rtsCtsThreshold,
rxCellSizeDb, autoCellSizeSelection, maxAutoCellSize, autoExclusionChannels);
rxCellSizeDb, autoCellSizeSelection, maxAutoCellSize);
}
@Override
@@ -458,8 +439,7 @@ public class RfElementConfiguration extends BaseJsonModel {
&& Objects.equals(probeResponseThresholdDb, other.probeResponseThresholdDb)
&& radioMode == other.radioMode && radioType == other.radioType && Objects.equals(rf, other.rf)
&& Objects.equals(rtsCtsThreshold, other.rtsCtsThreshold)
&& Objects.equals(rxCellSizeDb, other.rxCellSizeDb)
&& Objects.equals(autoExclusionChannels, other.autoExclusionChannels);
&& Objects.equals(rxCellSizeDb, other.rxCellSizeDb);
}
}

View File

@@ -1,16 +1,8 @@
package com.telecominfraproject.wlan.profile.rf.models;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Test;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
@@ -64,45 +56,4 @@ public class RfConfigurationTests {
rfConfig2_4.setRadioMode(RadioMode.modeGN);
rfConfig5.setRadioMode(RadioMode.modeGN);
}
@Test
public void testAutoExclusionChannels() {
RfElementConfiguration rfConfig = RfElementConfiguration.createWithDefaults(RadioType.is5GHz);
assertNotNull(rfConfig.getAutoExclusionChannels());
assertTrue(rfConfig.getAutoExclusionChannels().isEmpty());
Set<Integer> unsortedSet = new HashSet<Integer>(Arrays.asList(1, 23, 45, 12));
rfConfig.setAutoExclusionChannels(unsortedSet);
Set<Integer> sortedSet = rfConfig.getAutoExclusionChannels();
List<Integer> list = new ArrayList<Integer>(sortedSet);
assertEquals(Integer.valueOf(1), list.get(0));
assertEquals(Integer.valueOf(12), list.get(1));
assertEquals(Integer.valueOf(23), list.get(2));
assertEquals(Integer.valueOf(45), list.get(3));
Set<Integer> unsortedSet2 = new HashSet<Integer>(Arrays.asList(10, 45, 23, 12));
rfConfig.setAutoExclusionChannels(unsortedSet2);
Set<Integer> sortedSet2 = rfConfig.getAutoExclusionChannels();
List<Integer> list2 = new ArrayList<Integer>(sortedSet2);
assertEquals(Integer.valueOf(10), list2.get(0));
assertEquals(Integer.valueOf(12), list2.get(1));
assertEquals(Integer.valueOf(23), list2.get(2));
assertEquals(Integer.valueOf(45), list2.get(3));
}
@Test
public void testMaxAutoCellSize() {
RfElementConfiguration rfConfig = RfElementConfiguration.createWithDefaults(RadioType.is5GHz);
assertNotNull(rfConfig.getMaxAutoCellSize());
assertEquals(RfElementConfiguration.DEFAULT_MAX_CELL_SIZE_DB, rfConfig.getMaxAutoCellSize().intValue());
rfConfig.setMaxAutoCellSize(-93);
//getMaxAutoCellSize always return default MaxAutoCellSize
assertEquals(RfElementConfiguration.DEFAULT_MAX_CELL_SIZE_DB, rfConfig.getMaxAutoCellSize().intValue());
}
}

View File

@@ -31,7 +31,6 @@ import com.telecominfraproject.wlan.profile.models.ProfileType;
import com.telecominfraproject.wlan.profile.models.events.ProfileAddedEvent;
import com.telecominfraproject.wlan.profile.models.events.ProfileChangedEvent;
import com.telecominfraproject.wlan.profile.models.events.ProfileRemovedEvent;
import com.telecominfraproject.wlan.profile.passpoint.models.PasspointProfile;
/**
@@ -210,20 +209,6 @@ public class ProfileController {
LOG.error("Failed to update Profile, request contains unsupported value: {}", profile);
throw new DsDataValidationException("Profile contains unsupported value");
}
// WIFI-6855: To handle SSID-Passpoint association update when SSID profiles are updated
// If the passpoint profile update is requested, but no change is made to the details, then skip the update
if (profile.getProfileType().equals(ProfileType.passpoint)) {
Profile existingProfile = profileDatastore.getOrNull(profile.getId());
if (existingProfile != null) {
PasspointProfile existingDetails = (PasspointProfile) existingProfile.getDetails();
PasspointProfile newDetails = (PasspointProfile) profile.getDetails();
if (existingDetails.equals(newDetails)) {
LOG.info("No change was made to this profile, skip update on profile {}", profile.getId());
return profile;
}
}
}
Profile ret = profileDatastore.update(profile);

View File

@@ -15,9 +15,6 @@ import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.alarm.AlarmServiceInterface;
import com.telecominfraproject.wlan.alarm.models.Alarm;
import com.telecominfraproject.wlan.client.ClientServiceInterface;
import com.telecominfraproject.wlan.client.session.models.AssociationState;
import com.telecominfraproject.wlan.client.session.models.ClientSession;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.pagination.PaginationContext;
import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
@@ -39,6 +36,7 @@ import com.telecominfraproject.wlan.equipmentgateway.models.CEGWConfigChangeNoti
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWNewChannelRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWCellSizeAttributesRequest;
import com.telecominfraproject.wlan.equipmentgateway.service.EquipmentGatewayServiceInterface;
import com.telecominfraproject.wlan.location.models.events.LocationChangedApImpactingEvent;
import com.telecominfraproject.wlan.profile.ProfileServiceInterface;
import com.telecominfraproject.wlan.profile.models.Profile;
import com.telecominfraproject.wlan.profile.models.events.ProfileAddedEvent;
@@ -77,8 +75,6 @@ public class EquipmentConfigPushTrigger extends StreamProcessor {
private StatusServiceInterface statusServiceInterface;
@Autowired
private AlarmServiceInterface alarmServiceInterface;
@Autowired
private ClientServiceInterface clientServiceInterface;
@Override
protected boolean acceptMessage(QueuedStreamMessage message) {
@@ -91,7 +87,7 @@ public class EquipmentConfigPushTrigger extends StreamProcessor {
|| ser.getDetails() instanceof EquipmentChannelsChangedEvent || ser.getDetails() instanceof EquipmentCellSizeAttributesChangedEvent
|| ser.getDetails() instanceof EquipmentRemovedEvent || ser.getDetails() instanceof ProfileAddedEvent
|| ser.getDetails() instanceof ProfileChangedEvent || ser.getDetails() instanceof ProfileRemovedEvent
|| ser.getDetails() instanceof EquipmentCustomerChangedEvent);
|| ser.getDetails() instanceof LocationChangedApImpactingEvent || ser.getDetails() instanceof EquipmentCustomerChangedEvent);
} else {
ret = false;
}
@@ -132,6 +128,9 @@ public class EquipmentConfigPushTrigger extends StreamProcessor {
case "ProfileRemovedEvent":
process((ProfileRemovedEvent) se);
break;
case "LocationChangedApImpactingEvent":
process((LocationChangedApImpactingEvent) se);
break;
case "EquipmentCustomerChangedEvent":
process((EquipmentCustomerChangedEvent) se);
default:
@@ -167,7 +166,6 @@ public class EquipmentConfigPushTrigger extends StreamProcessor {
private void process(EquipmentRemovedEvent model) {
LOG.debug("Processing EquipmentRemovedEvent");
equipmentGatewayInterface.sendCommand(new CEGWCloseSessionRequest(model.getPayload().getInventoryId(), model.getEquipmentId()));
cleanUpClientSessions(model.getPayload());
}
private void process(ProfileAddedEvent model) {
@@ -219,6 +217,36 @@ public class EquipmentConfigPushTrigger extends StreamProcessor {
LOG.debug("Finished processing profile {}", profile.getId());
}
private void process(LocationChangedApImpactingEvent model) {
LOG.debug("Processing LocationChangedApImpactingEvent {}", model.getPayload().getId());
Set<Long> locationIds = new HashSet<>(Arrays.asList(model.getPayload().getId()));
// go through all equipmentIds that reside in the specified location and trigger change config notification on
// them
PaginationContext<PairLongLong> context = new PaginationContext<>(100);
while (!context.isLastPage()) {
PaginationResponse<PairLongLong> page = equipmentServiceInterface.getEquipmentIdsByLocationIds(locationIds, context);
context = page.getContext();
Set<Long> equipmentIds = new HashSet<>();
page.getItems().forEach(p -> equipmentIds.add(p.getValue2()));
// retrieve full equipment objects to get the inventory id
List<Equipment> equipmentForPage = equipmentServiceInterface.get(equipmentIds);
List<CEGWBaseCommand> commands = new ArrayList<>(equipmentForPage.size());
equipmentForPage.forEach(eq -> commands.add(new CEGWConfigChangeNotification(eq.getInventoryId(), eq.getId())));
equipmentGatewayInterface.sendCommands(commands);
LOG.debug("Page {} - sent {} commands to equipment gateway", context.getLastReturnedPageNumber(), commands.size());
}
LOG.debug("Finished processing LocationChangedApImpactingEvent {}", model.getPayload().getId());
}
private void process(EquipmentCustomerChangedEvent model) {
LOG.info("Processing EquipmentCustomerChangedEvent {}", model.getPayload().getId());
@@ -236,11 +264,6 @@ public class EquipmentConfigPushTrigger extends StreamProcessor {
status.setCustomerId(equipment.getCustomerId());
statusServiceInterface.update(status);
}
status = statusServiceInterface.getOrNull(existingEquipment.getCustomerId(), existingEquipment.getId(), StatusDataType.FIRMWARE);
if (status != null) {
status.setCustomerId(equipment.getCustomerId());
statusServiceInterface.update(status);
}
// Alarms has to move to new customerId as well
List<Alarm> oldCustomerAlarms = alarmServiceInterface.get(existingEquipment.getCustomerId(), Set.of(existingEquipment.getId()), null);
@@ -252,64 +275,10 @@ public class EquipmentConfigPushTrigger extends StreamProcessor {
});
}
alarmServiceInterface.delete(existingEquipment.getCustomerId(), existingEquipment.getId());
// Disconnect all associated client devices from existing equipment
disconnectClients(existingEquipment);
}
private void process(BaseJsonModel model) {
LOG.warn("Unprocessed model: {}", model);
}
private void disconnectClients(Equipment ce) {
LOG.info("EquipmentConfigPushTrigger::disconnectClients for Equipment {}", ce);
PaginationResponse<ClientSession> clientSessions = clientServiceInterface.getSessionsForCustomer(
ce.getCustomerId(), Set.of(ce.getId()), Set.of(ce.getLocationId()), null, null,
new PaginationContext<ClientSession>(100));
if (clientSessions == null) {
LOG.info("There are no existing client sessions to disconnect.");
return;
}
List<ClientSession> toBeDisconnected = new ArrayList<>();
clientSessions.getItems().stream().forEach(c -> {
if (c.getDetails().getAssociationState() != null
&& !c.getDetails().getAssociationState().equals(AssociationState.Disconnected)) {
LOG.info("Change association state for client {} from {} to {}", c.getMacAddress(),
c.getDetails().getAssociationState(), AssociationState.Disconnected);
c.getDetails().setAssociationState(AssociationState.Disconnected);
toBeDisconnected.add(c);
}
});
if (!toBeDisconnected.isEmpty()) {
LOG.info("Sending disconnect for client sessions {}", toBeDisconnected);
List<ClientSession> disconnectedSessions = clientServiceInterface.updateSessions(toBeDisconnected);
LOG.info("Result of client disconnect {}", disconnectedSessions);
} else {
LOG.info("There are no existing client sessions that are not already in Disconnected state.");
}
}
private void cleanUpClientSessions(Equipment ce) {
LOG.info("EquipmentConfigPushTrigger::cleanUpClientSessions for Equipment {}", ce);
PaginationResponse<ClientSession> clientSessions = clientServiceInterface.getSessionsForCustomer(
ce.getCustomerId(), Set.of(ce.getId()), Set.of(ce.getLocationId()), null, null,
new PaginationContext<ClientSession>(100));
if (clientSessions.getItems().isEmpty() || clientSessions == null) {
LOG.info("There are no existing client sessions to clean up.");
return;
}
clientSessions.getItems().stream().forEach(c -> clientServiceInterface.deleteSession(c.getCustomerId(), c.getEquipmentId(), c.getMacAddress()));
LOG.info("Cleaned up client sessions for deleted Equipment {}", ce.getId());
}
}

View File

@@ -114,6 +114,10 @@ public abstract class BaseServiceMetricDatastoreTest {
serviceMetric.setEquipmentId(testSequence.incrementAndGet());
serviceMetric.setClientMac(testSequence.incrementAndGet());
serviceMetric.setCreatedTimestamp(baseTimestamp - 100000 + testSequence.incrementAndGet());
ClientMetrics details2 = new ClientMetrics();
details2.setClassificationName("qr_"+apNameIdx);
serviceMetric.setDetails(details2);
apNameIdx++;
@@ -128,6 +132,10 @@ public abstract class BaseServiceMetricDatastoreTest {
serviceMetric.setEquipmentId(testSequence.incrementAndGet());
serviceMetric.setClientMac(testSequence.incrementAndGet());
serviceMetric.setCreatedTimestamp(baseTimestamp + testSequence.incrementAndGet());
ClientMetrics details2 = new ClientMetrics();
details2.setClassificationName("qr_"+apNameIdx);
serviceMetric.setDetails(details2);
apNameIdx++;
@@ -142,6 +150,10 @@ public abstract class BaseServiceMetricDatastoreTest {
serviceMetric.setEquipmentId(testSequence.incrementAndGet());
serviceMetric.setClientMac(testSequence.incrementAndGet());
serviceMetric.setCreatedTimestamp(baseTimestamp - 100000 + testSequence.incrementAndGet());
ClientMetrics details2 = new ClientMetrics();
details2.setClassificationName("qr_"+apNameIdx);
serviceMetric.setDetails(details2);
apNameIdx++;
@@ -188,18 +200,43 @@ public abstract class BaseServiceMetricDatastoreTest {
assertTrue(page6.getContext().isLastPage());
assertTrue(page7.getContext().isLastPage());
List<String> expectedPage3Strings = new ArrayList<>(Arrays.asList(new String[]{"qr_20", "qr_21", "qr_22", "qr_23", "qr_24", "qr_25", "qr_26", "qr_27", "qr_28", "qr_29" }));
List<String> actualPage3Strings = new ArrayList<>();
page3.getItems().stream().forEach( ce -> actualPage3Strings.add(((ClientMetrics) ce.getDetails()).getClassificationName()) );
assertEquals(expectedPage3Strings, actualPage3Strings);
//test first page of the results with empty sort order -> default sort order (by createdTimestamp ascending)
PaginationResponse<ServiceMetric> page1EmptySort = testInterface.getForCustomer(fromTime, toTime, customerId_1, null, null, null, null, Collections.emptyList(), context);
assertEquals(10, page1EmptySort.getItems().size());
List<String> expectedPage1EmptySortStrings = new ArrayList<>(Arrays.asList(new String[]{"qr_0", "qr_1", "qr_2", "qr_3", "qr_4", "qr_5", "qr_6", "qr_7", "qr_8", "qr_9" }));
List<String> actualPage1EmptySortStrings = new ArrayList<>();
page1EmptySort.getItems().stream().forEach( ce -> actualPage1EmptySortStrings.add(((ClientMetrics) ce.getDetails()).getClassificationName() ) );
assertEquals(expectedPage1EmptySortStrings, actualPage1EmptySortStrings);
//test first page of the results with null sort order -> default sort order (by createdTimestamp ascending)
PaginationResponse<ServiceMetric> page1NullSort = testInterface.getForCustomer(fromTime, toTime, customerId_1, null, null, null, null, null, context);
assertEquals(10, page1NullSort.getItems().size());
List<String> expectedPage1NullSortStrings = new ArrayList<>(Arrays.asList(new String[]{"qr_0", "qr_1", "qr_2", "qr_3", "qr_4", "qr_5", "qr_6", "qr_7", "qr_8", "qr_9" }));
List<String> actualPage1NullSortStrings = new ArrayList<>();
page1NullSort.getItems().stream().forEach( ce -> actualPage1NullSortStrings.add(((ClientMetrics) ce.getDetails()).getClassificationName() ) );
assertEquals(expectedPage1NullSortStrings, actualPage1NullSortStrings);
//test first page of the results with sort descending order by a equipmentId property
PaginationResponse<ServiceMetric> page1SingleSortDesc = testInterface.getForCustomer(fromTime, toTime, customerId_1, null, null, null, null, Collections.singletonList(new ColumnAndSort("equipmentId", SortOrder.desc)), context);
assertEquals(10, page1SingleSortDesc.getItems().size());
List<String> expectedPage1SingleSortDescStrings = getPagination_expectedPage1SingleSortDescStrings();
List<String> actualPage1SingleSortDescStrings = new ArrayList<>();
page1SingleSortDesc.getItems().stream().forEach( ce -> actualPage1SingleSortDescStrings.add(((ClientMetrics) ce.getDetails()).getClassificationName() ) );
assertEquals(expectedPage1SingleSortDescStrings, actualPage1SingleSortDescStrings);
used_equipmentIds.forEach(eqId -> testInterface.delete(customerId_1, eqId, System.currentTimeMillis()));
used_equipmentIds.forEach(eqId -> testInterface.delete(customerId_2, eqId, System.currentTimeMillis()));
@@ -299,8 +336,9 @@ public abstract class BaseServiceMetricDatastoreTest {
serviceMetric.setCreatedTimestamp(baseTimestamp - testSequence.incrementAndGet());
ClientMetrics details2 = new ClientMetrics();
details2.setClassificationName("qr_"+apNameIdx);
serviceMetric.setDetails(details2);
testInterface.create(serviceMetric);
//third metric - neighbour

View File

@@ -15,8 +15,11 @@ import org.springframework.util.CollectionUtils;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.servicemetric.models.McsStats;
import com.telecominfraproject.wlan.servicemetric.models.ServiceMetricDataType;
import com.telecominfraproject.wlan.servicemetric.models.ServiceMetricDetails;
import com.telecominfraproject.wlan.servicemetric.models.WmmQueueStats;
import com.telecominfraproject.wlan.servicemetric.models.WmmQueueStats.WmmQueueType;
/**
* Node-level metric data from the Access Point.
@@ -76,8 +79,14 @@ public class ApNodeMetrics extends ServiceMetricDetails
private Map<RadioType, List<RadioUtilization>> radioUtilizationPerRadio = new EnumMap<>(RadioType.class);
private Map<RadioType, RadioStatistics> radioStatsPerRadio = new EnumMap<>(RadioType.class);
private Map<RadioType, List<McsStats>> mcsStatsPerRadio = new EnumMap<>(RadioType.class);
private Map<RadioType, Map<WmmQueueType, WmmQueueStats>> wmmQueuesPerRadio = new EnumMap<>(RadioType.class);
public Integer getPeriodLengthSec() {
return periodLengthSec;
}
@@ -253,6 +262,25 @@ public class ApNodeMetrics extends ServiceMetricDetails
this.radioStatsPerRadio.put(radioType, radioStats);
}
public List<McsStats> getMcsStats(RadioType radioType) {
return mcsStatsPerRadio.get(radioType);
}
public void setMcsStats(RadioType radioType, List<McsStats> mcsStats) {
this.mcsStatsPerRadio.put(radioType, mcsStats);
}
public Map<WmmQueueType, WmmQueueStats> getWmmQueue(RadioType radioType) {
return wmmQueuesPerRadio.get(radioType);
}
public void setWmmQueue(RadioType radioType, Map<WmmQueueType, WmmQueueStats> wmmQueue) {
this.wmmQueuesPerRadio.put(radioType, wmmQueue);
}
//
// Utility Functions
//
@@ -376,14 +404,31 @@ public class ApNodeMetrics extends ServiceMetricDetails
this.radioStatsPerRadio = radioStatsPerRadio;
}
public Map<RadioType, List<McsStats>> getMcsStatsPerRadio() {
return mcsStatsPerRadio;
}
public void setMcsStatsPerRadio(Map<RadioType, List<McsStats>> mcsStatsPerRadio) {
this.mcsStatsPerRadio = mcsStatsPerRadio;
}
public Map<RadioType, Map<WmmQueueType, WmmQueueStats>> getWmmQueuesPerRadio() {
return wmmQueuesPerRadio;
}
public void setWmmQueuesPerRadio(Map<RadioType, Map<WmmQueueType, WmmQueueStats>> wmmQueuesPerRadio) {
this.wmmQueuesPerRadio = wmmQueuesPerRadio;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + Objects.hash(apPerformance, channelUtilizationPerRadio, clientMacAddressesPerRadio,
cloudLinkAvailability, cloudLinkLatencyInMs, networkProbeMetrics, noiseFloorPerRadio,
cloudLinkAvailability, cloudLinkLatencyInMs, mcsStatsPerRadio, networkProbeMetrics, noiseFloorPerRadio,
periodLengthSec, radioStatsPerRadio, radioUtilizationPerRadio, radiusMetrics, rxBytesPerRadio,
tunnelMetrics, txBytesPerRadio, vlanSubnet);
tunnelMetrics, txBytesPerRadio, vlanSubnet, wmmQueuesPerRadio);
return result;
}
@@ -404,6 +449,7 @@ public class ApNodeMetrics extends ServiceMetricDetails
&& Objects.equals(clientMacAddressesPerRadio, other.clientMacAddressesPerRadio)
&& Objects.equals(cloudLinkAvailability, other.cloudLinkAvailability)
&& Objects.equals(cloudLinkLatencyInMs, other.cloudLinkLatencyInMs)
&& Objects.equals(mcsStatsPerRadio, other.mcsStatsPerRadio)
&& Objects.equals(networkProbeMetrics, other.networkProbeMetrics)
&& Objects.equals(noiseFloorPerRadio, other.noiseFloorPerRadio)
&& Objects.equals(periodLengthSec, other.periodLengthSec)
@@ -413,7 +459,8 @@ public class ApNodeMetrics extends ServiceMetricDetails
&& Objects.equals(rxBytesPerRadio, other.rxBytesPerRadio)
&& Objects.equals(tunnelMetrics, other.tunnelMetrics)
&& Objects.equals(txBytesPerRadio, other.txBytesPerRadio)
&& Objects.equals(vlanSubnet, other.vlanSubnet);
&& Objects.equals(vlanSubnet, other.vlanSubnet)
&& Objects.equals(wmmQueuesPerRadio, other.wmmQueuesPerRadio);
}
@Override
@@ -437,6 +484,14 @@ public class ApNodeMetrics extends ServiceMetricDetails
radioStatsPerRadio.values().forEach(c -> { if (hasUnsupportedValue(c)) { ai.incrementAndGet();} });
}
if(mcsStatsPerRadio!=null) {
mcsStatsPerRadio.values().forEach(c -> { if (hasUnsupportedValue(c)) { ai.incrementAndGet();} });
}
if(wmmQueuesPerRadio!=null) {
wmmQueuesPerRadio.values().forEach(c -> { if (hasUnsupportedValue(c)) { ai.incrementAndGet();} });
}
if(ai.get()>0) {
return true;
}
@@ -463,6 +518,25 @@ public class ApNodeMetrics extends ServiceMetricDetails
}
if(this.wmmQueuesPerRadio!=null) {
ret.wmmQueuesPerRadio = new EnumMap<>(RadioType.class);
this.wmmQueuesPerRadio.forEach((rt, wq) -> {
Map<WmmQueueStats.WmmQueueType, WmmQueueStats> newWm = new EnumMap<>(WmmQueueType.class);
ret.wmmQueuesPerRadio.put(rt, newWm);
wq.forEach((k, v) -> newWm.put(k, v.clone()));
});
}
if(this.mcsStatsPerRadio !=null) {
ret.mcsStatsPerRadio = new EnumMap<>(RadioType.class);
this.mcsStatsPerRadio.forEach((k, listV) -> {
List<McsStats> newList = new ArrayList<>();
ret.mcsStatsPerRadio.put(k, newList);
listV.forEach(mcs -> newList.add(mcs.clone()));
});
}
if(this.networkProbeMetrics !=null) {
ret.networkProbeMetrics = new ArrayList<>();
for(NetworkProbeMetrics npm: this.networkProbeMetrics){

View File

@@ -0,0 +1,160 @@
package com.telecominfraproject.wlan.servicemetric.client.qoe.models;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telecominfraproject.wlan.servicemetric.models.ServiceMetricDataType;
import com.telecominfraproject.wlan.servicemetric.models.ServiceMetricDetails;
/**
* QoE related metrics which is independent of RadioType
*
* @author yongli
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ClientQoEMetrics extends ServiceMetricDetails {
private static final long serialVersionUID = 5242617221447159480L;
/**
* How many seconds the AP measured for the metric
*/
private Integer periodLengthSec = 5;
private Integer secondsSinceLastRecv;
// Connectivity QoE stats.
private Long qoeEventualSuccessTimeTaken;
private Long qoeNumOfAttempts;
private Long qoeNumOfSuccess;
private Long qoeAttemptDuration;
private Long qoeAssociatedDuration;
private Long qoeDeltaDuration;
private Long qoeNumRepeatedAttempts;
private Long qoeUserError;
@Override
public ServiceMetricDataType getDataType() {
return ServiceMetricDataType.ClientQoE;
}
@Override
public ClientQoEMetrics clone() {
return (ClientQoEMetrics) super.clone();
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + Objects.hash(periodLengthSec, qoeAssociatedDuration, qoeAttemptDuration,
qoeDeltaDuration, qoeEventualSuccessTimeTaken, qoeNumOfAttempts, qoeNumOfSuccess,
qoeNumRepeatedAttempts, qoeUserError, secondsSinceLastRecv);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (!(obj instanceof ClientQoEMetrics)) {
return false;
}
ClientQoEMetrics other = (ClientQoEMetrics) obj;
return Objects.equals(periodLengthSec, other.periodLengthSec)
&& Objects.equals(qoeAssociatedDuration, other.qoeAssociatedDuration)
&& Objects.equals(qoeAttemptDuration, other.qoeAttemptDuration)
&& Objects.equals(qoeDeltaDuration, other.qoeDeltaDuration)
&& Objects.equals(qoeEventualSuccessTimeTaken, other.qoeEventualSuccessTimeTaken)
&& Objects.equals(qoeNumOfAttempts, other.qoeNumOfAttempts)
&& Objects.equals(qoeNumOfSuccess, other.qoeNumOfSuccess)
&& Objects.equals(qoeNumRepeatedAttempts, other.qoeNumRepeatedAttempts)
&& Objects.equals(qoeUserError, other.qoeUserError)
&& Objects.equals(secondsSinceLastRecv, other.secondsSinceLastRecv);
}
public Long getQoeAssociatedDuration() {
return qoeAssociatedDuration;
}
public Long getQoeAttemptDuration() {
return qoeAttemptDuration;
}
public Long getQoeDeltaDuration() {
return qoeDeltaDuration;
}
public Long getQoeEventualSuccessTimeTaken() {
return qoeEventualSuccessTimeTaken;
}
public Long getQoeNumOfAttempts() {
return qoeNumOfAttempts;
}
public Long getQoeNumOfSuccess() {
return qoeNumOfSuccess;
}
public Long getQoeNumRepeatedAttempts() {
return qoeNumRepeatedAttempts;
}
public Long getQoeUserError() {
return qoeUserError;
}
public void setQoeAssociatedDuration(Long qoeAssociatedDuration) {
this.qoeAssociatedDuration = qoeAssociatedDuration;
}
public void setQoeAttemptDuration(Long qoeAttemptDuration) {
this.qoeAttemptDuration = qoeAttemptDuration;
}
public void setQoeDeltaDuration(Long qoeDeltaDuration) {
this.qoeDeltaDuration = qoeDeltaDuration;
}
public void setQoeEventualSuccessTimeTaken(Long qoeEventualSuccessTimeTaken) {
this.qoeEventualSuccessTimeTaken = qoeEventualSuccessTimeTaken;
}
public void setQoeNumOfAttempts(Long qoeNumOfAttempts) {
this.qoeNumOfAttempts = qoeNumOfAttempts;
}
public void setQoeNumOfSuccess(Long qoeNumOfSuccess) {
this.qoeNumOfSuccess = qoeNumOfSuccess;
}
public void setQoeNumRepeatedAttempts(Long qoeNumRepeatedAttempts) {
this.qoeNumRepeatedAttempts = qoeNumRepeatedAttempts;
}
public void setQoeUserError(Long qoeUserError) {
this.qoeUserError = qoeUserError;
}
public Integer getPeriodLengthSec() {
return periodLengthSec;
}
public void setPeriodLengthSec(Integer periodLengthSec) {
this.periodLengthSec = periodLengthSec;
}
public Integer getSecondsSinceLastRecv() {
return secondsSinceLastRecv;
}
public void setSecondsSinceLastRecv(Integer secondsSinceLastRecv) {
this.secondsSinceLastRecv = secondsSinceLastRecv;
}
}

View File

@@ -0,0 +1,91 @@
package com.telecominfraproject.wlan.servicemetric.models;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class McsStats extends BaseJsonModel
{
private static final long serialVersionUID = 2366899901343104028L;
/**
* The MCS number. This is table index.
*/
private McsType mcsNum;
/**
* The number of successfully transmitted frames at this rate. Do not count failed transmission.
*/
private Integer txFrames;
/**
* The number of received frames at this rate.
*/
private Integer rxFrames;
private Long rate;
public McsStats()
{
// for serialization
}
public McsType getMcsNum() {
return mcsNum;
}
public void setMcsNum(McsType mcsNum) {
this.mcsNum = mcsNum;
}
public Integer getTxFrames() {
return txFrames;
}
public void setTxFrames(Integer txFrames) {
this.txFrames = txFrames;
}
public Integer getRxFrames() {
return rxFrames;
}
public void setRxFrames(Integer rxFrames) {
this.rxFrames = rxFrames;
}
public Long getRate() {
return rate;
}
public void setRate(Long rate) {
this.rate = rate;
}
@Override
public McsStats clone() {
McsStats ret = (McsStats) super.clone();
return ret;
}
@Override
public boolean hasUnsupportedValue() {
if (super.hasUnsupportedValue()) {
return true;
}
if (McsType.isUnsupported(mcsNum)) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,161 @@
package com.telecominfraproject.wlan.servicemetric.models;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.telecominfraproject.wlan.core.model.json.JsonDeserializationUtils;
/**
* MCS index values
* @author ekeddy
*
*/
public enum McsType {
//McsType(int id, boolean isHt, boolean isVht, int numSpacialStreams, int mcsIndex)
MCS_1 (0, false, false, 1, 1), // 2.4GHz only
MCS_2 (1, false, false, 1, 2), // 2.4GHz only
MCS_5dot5(2, false, false, 1, 5), // 2.4GHz only
MCS_11 (3, false, false, 1, 11), // 2.4GHz only
MCS_6 (4, false, false, 1, 13),
MCS_9 (5, false, false, 1, 16),
MCS_12 (6, false, false, 1, 5),
MCS_18 (7, false, false, 1, 7),
MCS_24 (8, false, false, 1, 9),
MCS_36 (9, false, false, 1, 11),
MCS_48 (10, false, false, 1, 1),
MCS_54 (11, false, false, 1, 3),
MCS_N_0 (12, true, false, 1, 0),
MCS_N_1 (13, true, false, 1, 1),
MCS_N_2 (14, true, false, 1, 2),
MCS_N_3 (15, true, false, 1, 3),
MCS_N_4 (16, true, false, 1, 4),
MCS_N_5 (17, true, false, 1, 5),
MCS_N_6 (18, true, false, 1, 6),
MCS_N_7 (19, true, false, 1, 7),
MCS_N_8 (20, true, false, 2, 8),
MCS_N_9 (21, true, false, 2, 9),
MCS_N_10(22, true, false, 2, 10),
MCS_N_11(23, true, false, 2, 11),
MCS_N_12(24, true, false, 2, 12),
MCS_N_13(25, true, false, 2, 13),
MCS_N_14(26, true, false, 2, 14),
MCS_N_15(27, true, false, 2, 15),
MCS_AC_1x1_0(28, false, true, 1, 0),
MCS_AC_1x1_1(29, false, true, 1, 1),
MCS_AC_1x1_2(30, false, true, 1, 2),
MCS_AC_1x1_3(31, false, true, 1, 3),
MCS_AC_1x1_4(32, false, true, 1, 4),
MCS_AC_1x1_5(33, false, true, 1, 5),
MCS_AC_1x1_6(34, false, true, 1, 6),
MCS_AC_1x1_7(35, false, true, 1, 7),
MCS_AC_1x1_8(36, false, true, 1, 8),
MCS_AC_1x1_9(37, false, true, 1, 9),
MCS_AC_2x2_0(38, false, true, 2, 0),
MCS_AC_2x2_1(39, false, true, 2, 1),
MCS_AC_2x2_2(40, false, true, 2, 2),
MCS_AC_2x2_3(41, false, true, 2, 3),
MCS_AC_2x2_4(42, false, true, 2, 4),
MCS_AC_2x2_5(43, false, true, 2, 5),
MCS_AC_2x2_6(44, false, true, 2, 6),
MCS_AC_2x2_7(45, false, true, 2, 7),
MCS_AC_2x2_8(46, false, true, 2, 8),
MCS_AC_2x2_9(47, false, true, 2, 9),
MCS_AC_3x3_0(48, false, true, 3, 0),
MCS_AC_3x3_1(49, false, true, 3, 1),
MCS_AC_3x3_2(50, false, true, 3, 2),
MCS_AC_3x3_3(51, false, true, 3, 3),
MCS_AC_3x3_4(52, false, true, 3, 4),
MCS_AC_3x3_5(53, false, true, 3, 5),
MCS_AC_3x3_6(54, false, true, 3, 6),
MCS_AC_3x3_7(55, false, true, 3, 7),
MCS_AC_3x3_8(56, false, true, 3, 8),
MCS_AC_3x3_9(57, false, true, 3, 9),
MCS_N_16(58, true, false, 3, 16),
MCS_N_17(59, true, false, 3, 17),
MCS_N_18(60, true, false, 3, 18),
MCS_N_19(61, true, false, 3, 19),
MCS_N_20(62, true, false, 3, 20),
MCS_N_21(63, true, false, 3, 21),
MCS_N_22(64, true, false, 3, 22),
MCS_N_23(65, true, false, 3, 23),
MCS_N_24(66, true, false, 4, 24),
MCS_N_25(67, true, false, 4, 25),
MCS_N_26(68, true, false, 4, 26),
MCS_N_27(69, true, false, 4, 27),
MCS_N_28(70, true, false, 4, 28),
MCS_N_29(71, true, false, 4, 29),
MCS_N_30(72, true, false, 4, 30),
MCS_N_31(73, true, false, 4, 31),
MCS_AC_4x4_0(74, false, true, 4, 0),
MCS_AC_4x4_1(75, false, true, 4, 1),
MCS_AC_4x4_2(76, false, true, 4, 2),
MCS_AC_4x4_3(77, false, true, 4, 3),
MCS_AC_4x4_4(78, false, true, 4, 4),
MCS_AC_4x4_5(79, false, true, 4, 5),
MCS_AC_4x4_6(80, false, true, 4, 6),
MCS_AC_4x4_7(81, false, true, 4, 7),
MCS_AC_4x4_8(82, false, true, 4, 8),
MCS_AC_4x4_9(83, false, true, 4, 9),
//last used index 83
UNSUPPORTED(-1, false, false, 0, -1);
private final int id;
private final boolean isHt;
private final boolean isVht;
private final int numSpacialStreams;
private final int mcsIndex;
private static final Map<Integer, McsType> ELEMENTS = new HashMap<>();
private McsType(int id, boolean isHt, boolean isVht, int numSpacialStreams, int mcsIndex){
this.id = id;
this.isHt = isHt;
this.isVht = isVht;
this.numSpacialStreams = numSpacialStreams;
this.mcsIndex = mcsIndex;
}
public int getId(){
return this.id;
}
public int getMcsIndex() {
return mcsIndex;
}
public int getNumSpacialStreams() {
return numSpacialStreams;
}
public boolean isHt() {
return isHt;
}
public boolean isVht() {
return isVht;
}
public static McsType getById(int enumId){
if(ELEMENTS.isEmpty()){
//initialize elements map
for(McsType met : McsType.values()){
ELEMENTS.put(met.getId(), met);
}
}
return ELEMENTS.get(enumId);
}
@JsonCreator
public static McsType getByName(String value) {
return JsonDeserializationUtils.deserializEnum(value, McsType.class, UNSUPPORTED);
}
public static boolean isUnsupported(McsType value) {
return UNSUPPORTED.equals(value);
}
}

View File

@@ -0,0 +1,245 @@
package com.telecominfraproject.wlan.servicemetric.models;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.json.JsonDeserializationUtils;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class WmmQueueStats extends BaseJsonModel {
private static final long serialVersionUID = 1784481171729854130L;
public static enum WmmQueueType {
BE, BK, VI, VO, UNSUPPORTED;
@JsonCreator
public static WmmQueueType getByName(String value) {
return JsonDeserializationUtils.deserializEnum(value, WmmQueueType.class, UNSUPPORTED);
}
public static boolean isUnsupported(WmmQueueType queueType) {
return UNSUPPORTED.equals(queueType);
}
}
private WmmQueueType queueType;
private long txFrames;
private long txBytes;
private long txFailedFrames;
private long txFailedBytes;
private long rxFrames;
private long rxBytes;
private long rxFailedFrames;
private long rxFailedBytes;
private long forwardFrames;
private long forwardBytes;
private long txExpiredFrames;
private long txExpiredBytes;
public WmmQueueStats() {
// for serialization
}
public WmmQueueStats(WmmQueueType queueType, long txFrames, long txBytes, long txFailedFrames, long txFailedBytes,
long rxFrames, long rxBytes, long rxFailedFrames, long rxFailedBytes, long forwardFrames, long forwardBytes,
long txExpiredFrames, long txExpiredBytes) {
super();
this.queueType = queueType;
this.txFrames = txFrames;
this.txBytes = txBytes;
this.txFailedFrames = txFailedFrames;
this.txFailedBytes = txFailedBytes;
this.rxFrames = rxFrames;
this.rxBytes = rxBytes;
this.rxFailedFrames = rxFailedFrames;
this.rxFailedBytes = rxFailedBytes;
this.forwardFrames = forwardFrames;
this.forwardBytes = forwardBytes;
this.txExpiredFrames = txExpiredFrames;
this.txExpiredBytes = txExpiredBytes;
}
public WmmQueueType getQueueType() {
return queueType;
}
public void setQueueType(WmmQueueType queueType) {
this.queueType = queueType;
}
public long getTxFrames() {
return txFrames;
}
public void setTxFrames(long txFrames) {
this.txFrames = txFrames;
}
public long getTxBytes() {
return txBytes;
}
public void setTxBytes(long txBytes) {
this.txBytes = txBytes;
}
public long getTxFailedFrames() {
return txFailedFrames;
}
public void setTxFailedFrames(long txFailedFrames) {
this.txFailedFrames = txFailedFrames;
}
public long getTxFailedBytes() {
return txFailedBytes;
}
public void setTxFailedBytes(long txFailedBytes) {
this.txFailedBytes = txFailedBytes;
}
public long getRxFrames() {
return rxFrames;
}
public void setRxFrames(long rxFrames) {
this.rxFrames = rxFrames;
}
public long getRxBytes() {
return rxBytes;
}
public void setRxBytes(long rxBytes) {
this.rxBytes = rxBytes;
}
public long getRxFailedFrames() {
return rxFailedFrames;
}
public void setRxFailedFrames(long rxFailedFrames) {
this.rxFailedFrames = rxFailedFrames;
}
public long getRxFailedBytes() {
return rxFailedBytes;
}
public void setRxFailedBytes(long rxFailedBytes) {
this.rxFailedBytes = rxFailedBytes;
}
public long getForwardFrames() {
return forwardFrames;
}
public void setForwardFrames(long forwardFrames) {
this.forwardFrames = forwardFrames;
}
public long getForwardBytes() {
return forwardBytes;
}
public void setForwardBytes(long forwardBytes) {
this.forwardBytes = forwardBytes;
}
public long getTxExpiredFrames() {
return txExpiredFrames;
}
public void setTxExpiredFrames(long txExpiredFrames) {
this.txExpiredFrames = txExpiredFrames;
}
public long getTxExpiredBytes() {
return txExpiredBytes;
}
public void setTxExpiredBytes(long txExpiredBytes) {
this.txExpiredBytes = txExpiredBytes;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (forwardBytes ^ (forwardBytes >>> 32));
result = prime * result + (int) (forwardFrames ^ (forwardFrames >>> 32));
result = prime * result + ((queueType == null) ? 0 : queueType.hashCode());
result = prime * result + (int) (rxBytes ^ (rxBytes >>> 32));
result = prime * result + (int) (rxFailedBytes ^ (rxFailedBytes >>> 32));
result = prime * result + (int) (rxFailedFrames ^ (rxFailedFrames >>> 32));
result = prime * result + (int) (rxFrames ^ (rxFrames >>> 32));
result = prime * result + (int) (txBytes ^ (txBytes >>> 32));
result = prime * result + (int) (txExpiredBytes ^ (txExpiredBytes >>> 32));
result = prime * result + (int) (txExpiredFrames ^ (txExpiredFrames >>> 32));
result = prime * result + (int) (txFailedBytes ^ (txFailedBytes >>> 32));
result = prime * result + (int) (txFailedFrames ^ (txFailedFrames >>> 32));
result = prime * result + (int) (txFrames ^ (txFrames >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
WmmQueueStats other = (WmmQueueStats) obj;
if (forwardBytes != other.forwardBytes)
return false;
if (forwardFrames != other.forwardFrames)
return false;
if (queueType != other.queueType)
return false;
if (rxBytes != other.rxBytes)
return false;
if (rxFailedBytes != other.rxFailedBytes)
return false;
if (rxFailedFrames != other.rxFailedFrames)
return false;
if (rxFrames != other.rxFrames)
return false;
if (txBytes != other.txBytes)
return false;
if (txExpiredBytes != other.txExpiredBytes)
return false;
if (txExpiredFrames != other.txExpiredFrames)
return false;
if (txFailedBytes != other.txFailedBytes)
return false;
if (txFailedFrames != other.txFailedFrames)
return false;
if (txFrames != other.txFrames)
return false;
return true;
}
@Override
public boolean hasUnsupportedValue() {
if (super.hasUnsupportedValue()) {
return true;
}
if (WmmQueueType.isUnsupported(queueType)) {
return true;
}
return false;
}
@Override
public WmmQueueStats clone() {
return (WmmQueueStats) super.clone();
}
}

View File

@@ -127,6 +127,10 @@ public class ServiceMetricServiceRemoteTest extends BaseRemoteTest {
serviceMetric.setClientMac(getNextEquipmentId());
serviceMetric.setCreatedTimestamp(baseTimestamp - 100000 + getNextEquipmentId());
ClientMetrics details2 = new ClientMetrics();
details2.setClassificationName("qr_"+apNameIdx);
serviceMetric.setDetails(details2);
apNameIdx++;
remoteInterface.create(serviceMetric);
@@ -140,6 +144,10 @@ public class ServiceMetricServiceRemoteTest extends BaseRemoteTest {
serviceMetric.setClientMac(getNextEquipmentId());
serviceMetric.setCreatedTimestamp(baseTimestamp + getNextEquipmentId());
ClientMetrics details2 = new ClientMetrics();
details2.setClassificationName("qr_"+apNameIdx);
serviceMetric.setDetails(details2);
apNameIdx++;
remoteInterface.create(serviceMetric);
@@ -153,6 +161,10 @@ public class ServiceMetricServiceRemoteTest extends BaseRemoteTest {
serviceMetric.setClientMac(getNextEquipmentId());
serviceMetric.setCreatedTimestamp(baseTimestamp - 100000 + getNextEquipmentId());
ClientMetrics details2 = new ClientMetrics();
details2.setClassificationName("qr_"+apNameIdx);
serviceMetric.setDetails(details2);
apNameIdx++;
remoteInterface.create(serviceMetric);
@@ -197,18 +209,43 @@ public class ServiceMetricServiceRemoteTest extends BaseRemoteTest {
assertTrue(page6.getContext().isLastPage());
assertTrue(page7.getContext().isLastPage());
List<String> expectedPage3Strings = new ArrayList<>(Arrays.asList(new String[]{"qr_20", "qr_21", "qr_22", "qr_23", "qr_24", "qr_25", "qr_26", "qr_27", "qr_28", "qr_29" }));
List<String> actualPage3Strings = new ArrayList<>();
page3.getItems().stream().forEach( ce -> actualPage3Strings.add(((ClientMetrics) ce.getDetails()).getClassificationName()) );
assertEquals(expectedPage3Strings, actualPage3Strings);
//test first page of the results with empty sort order -> default sort order (by createdTimestamp ascending)
PaginationResponse<ServiceMetric> page1EmptySort = remoteInterface.getForCustomer(fromTime, toTime, customerId_1, null, null, null, null, Collections.emptyList(), context);
assertEquals(10, page1EmptySort.getItems().size());
List<String> expectedPage1EmptySortStrings = new ArrayList<>(Arrays.asList(new String[]{"qr_0", "qr_1", "qr_2", "qr_3", "qr_4", "qr_5", "qr_6", "qr_7", "qr_8", "qr_9" }));
List<String> actualPage1EmptySortStrings = new ArrayList<>();
page1EmptySort.getItems().stream().forEach( ce -> actualPage1EmptySortStrings.add(((ClientMetrics) ce.getDetails()).getClassificationName() ) );
assertEquals(expectedPage1EmptySortStrings, actualPage1EmptySortStrings);
//test first page of the results with null sort order -> default sort order (by createdTimestamp ascending)
PaginationResponse<ServiceMetric> page1NullSort = remoteInterface.getForCustomer(fromTime, toTime, customerId_1, null, null, null, null, null, context);
assertEquals(10, page1NullSort.getItems().size());
List<String> expectedPage1NullSortStrings = new ArrayList<>(Arrays.asList(new String[]{"qr_0", "qr_1", "qr_2", "qr_3", "qr_4", "qr_5", "qr_6", "qr_7", "qr_8", "qr_9" }));
List<String> actualPage1NullSortStrings = new ArrayList<>();
page1NullSort.getItems().stream().forEach( ce -> actualPage1NullSortStrings.add(((ClientMetrics) ce.getDetails()).getClassificationName() ) );
assertEquals(expectedPage1NullSortStrings, actualPage1NullSortStrings);
//test first page of the results with sort descending order by a equipmentId property
PaginationResponse<ServiceMetric> page1SingleSortDesc = remoteInterface.getForCustomer(fromTime, toTime, customerId_1, null, null, null, null, Collections.singletonList(new ColumnAndSort("equipmentId", SortOrder.desc)), context);
assertEquals(10, page1SingleSortDesc.getItems().size());
List<String> expectedPage1SingleSortDescStrings = new ArrayList< >(Arrays.asList(new String[]{"qr_49", "qr_48", "qr_47", "qr_46", "qr_45", "qr_44", "qr_43", "qr_42", "qr_41", "qr_40" }));
List<String> actualPage1SingleSortDescStrings = new ArrayList<>();
page1SingleSortDesc.getItems().stream().forEach( ce -> actualPage1SingleSortDescStrings.add(((ClientMetrics) ce.getDetails()).getClassificationName() ) );
assertEquals(expectedPage1SingleSortDescStrings, actualPage1SingleSortDescStrings);
}
@@ -301,6 +338,7 @@ public class ServiceMetricServiceRemoteTest extends BaseRemoteTest {
serviceMetric.setCreatedTimestamp(baseTimestamp - getNextEquipmentId());
ClientMetrics details2 = new ClientMetrics();
details2.setClassificationName("qr_"+apNameIdx);
serviceMetric.setDetails(details2);
remoteInterface.create(serviceMetric);

View File

@@ -56,7 +56,8 @@ public class StatusDatastoreCassandra implements StatusDatastore {
private static final Set<String> columnsToSkipForUpdate = new HashSet<>(Arrays.asList(
"customerId",
"equipmentId",
"statusDataType"));
"statusDataType",
"createdTimestamp"));
private static final String TABLE_NAME = "status";
private static final String ALL_COLUMNS;
@@ -229,14 +230,11 @@ public class StatusDatastoreCassandra implements StatusDatastore {
//This DAO does not enforce check for concurrent updates. Last one always wins.
long newLastModifiedTs = System.currentTimeMillis();
boolean isCreateNotSet = status.getCreatedTimestamp() == 0;
cqlSession.execute(preparedStmt_update.bind(
//TODO: add remaining properties from Status here
(status.getDetails()!=null) ? ByteBuffer.wrap(status.getDetails().toZippedBytes()) : null ,
isCreateNotSet ? newLastModifiedTs : status.getCreatedTimestamp(),
newLastModifiedTs,
@@ -255,9 +253,6 @@ public class StatusDatastoreCassandra implements StatusDatastore {
//make a copy so that we don't accidentally update caller's version by reference
Status statusCopy = status.clone();
if(isCreateNotSet) {
statusCopy.setCreatedTimestamp(newLastModifiedTs);
}
statusCopy.setLastModifiedTimestamp(newLastModifiedTs);
LOG.debug("Updated Status {}", statusCopy);

View File

@@ -5,7 +5,6 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import com.telecominfraproject.wlan.core.model.equipment.LedStatus;
import com.telecominfraproject.wlan.status.models.StatusCode;
import com.telecominfraproject.wlan.status.models.StatusDataType;
import com.telecominfraproject.wlan.status.models.StatusDetails;

View File

@@ -4,7 +4,6 @@ import java.util.EnumMap;
import java.util.Map;
import java.util.Objects;
import com.telecominfraproject.wlan.core.model.equipment.ChannelBandwidth;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.status.models.StatusDataType;
import com.telecominfraproject.wlan.status.models.StatusDetails;
@@ -13,7 +12,6 @@ public class EquipmentChannelStatusData extends StatusDetails {
private static final long serialVersionUID = 470569467119609438L;
private Map<RadioType, Integer> channelNumberStatusDataMap = new EnumMap<>(RadioType.class);
private Map<RadioType, ChannelBandwidth> channelBandwidthStatusDataMap = new EnumMap<>(RadioType.class);
private Map<RadioType, Integer> txPowerDataMap = new EnumMap<>(RadioType.class);
@@ -31,7 +29,6 @@ public class EquipmentChannelStatusData extends StatusDetails {
{
if (data !=null) {
this.channelNumberStatusDataMap.putAll(data.channelNumberStatusDataMap);
this.channelBandwidthStatusDataMap.putAll(data.channelBandwidthStatusDataMap);
}
}
@@ -39,10 +36,6 @@ public class EquipmentChannelStatusData extends StatusDetails {
return channelNumberStatusDataMap;
}
public Map<RadioType, ChannelBandwidth> getChannelBandwidthStatusDataMap() {
return channelBandwidthStatusDataMap;
}
public Map<RadioType, Integer> getTxPowerDataMap() {
return txPowerDataMap;
}
@@ -51,10 +44,6 @@ public class EquipmentChannelStatusData extends StatusDetails {
this.channelNumberStatusDataMap = channelNumberStatusDataMap;
}
public void setChannelBandwidthStatusDataMap(Map<RadioType, ChannelBandwidth> channelBandwidthStatusDataMap) {
this.channelBandwidthStatusDataMap = channelBandwidthStatusDataMap;
}
public void setTxPowerDataMap(Map<RadioType, Integer> txPowerDataMap) {
this.txPowerDataMap = txPowerDataMap;
}
@@ -70,14 +59,6 @@ public class EquipmentChannelStatusData extends StatusDetails {
});
}
if (getChannelBandwidthStatusDataMap() != null) {
result.setChannelBandwidthStatusDataMap(new EnumMap<>(RadioType.class));
this.channelBandwidthStatusDataMap.forEach((k, v) -> {
result.channelBandwidthStatusDataMap.put(k, v);
});
}
if (getTxPowerDataMap() != null) {
result.setTxPowerDataMap(new EnumMap<>(RadioType.class));
@@ -90,7 +71,7 @@ public class EquipmentChannelStatusData extends StatusDetails {
@Override
public int hashCode() {
return Objects.hash(channelNumberStatusDataMap, channelBandwidthStatusDataMap, txPowerDataMap);
return Objects.hash(channelNumberStatusDataMap, txPowerDataMap);
}
@Override
@@ -103,7 +84,6 @@ public class EquipmentChannelStatusData extends StatusDetails {
return false;
EquipmentChannelStatusData other = (EquipmentChannelStatusData) obj;
return Objects.equals(channelNumberStatusDataMap, other.channelNumberStatusDataMap)
&& Objects.equals(channelBandwidthStatusDataMap, other.channelBandwidthStatusDataMap)
&& Objects.equals(txPowerDataMap, other.txPowerDataMap);
}

View File

@@ -0,0 +1,6 @@
package com.telecominfraproject.wlan.status.equipment.models;
public enum LedStatus {
led_blink, led_off, UNKNOWN,
}

View File

@@ -1,67 +0,0 @@
package com.telecominfraproject.wlan.status.equipment.report.models;
import com.telecominfraproject.wlan.status.models.StatusDataType;
import com.telecominfraproject.wlan.status.models.StatusDetails;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author rsharma
*/
public class WiredEthernetPortStatusData extends StatusDetails {
private static final long serialVersionUID = 1684955685155400122L;
// key is ifName, value is the list of wiredPortStatus that link to the ifName
private Map<String, List<WiredPortStatus>> interfacePortStatusMap;
public WiredEthernetPortStatusData() {
this.interfacePortStatusMap = new HashMap<>();
}
public WiredEthernetPortStatusData(Map<String, List<WiredPortStatus>> interfacePortStatusMap) {
this.interfacePortStatusMap = interfacePortStatusMap;
}
public Map<String, List<WiredPortStatus>> getInterfacePortStatusMap() {
return interfacePortStatusMap;
}
public void setInterfacePortStatusMap(Map<String, List<WiredPortStatus>> interfacePortStatusMap) {
this.interfacePortStatusMap = interfacePortStatusMap;
}
@Override
public StatusDataType getStatusDataType() {
return StatusDataType.WIRED_ETHERNET_PORT;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof WiredEthernetPortStatusData)) {
return false;
}
WiredEthernetPortStatusData that = (WiredEthernetPortStatusData) o;
return Objects.equals(getInterfacePortStatusMap(), that.getInterfacePortStatusMap());
}
@Override
public int hashCode() {
return Objects.hash(getInterfacePortStatusMap());
}
@Override
public WiredEthernetPortStatusData clone() {
WiredEthernetPortStatusData data = (WiredEthernetPortStatusData) super.clone();
if (interfacePortStatusMap != null) {
data.interfacePortStatusMap = new HashMap<>(interfacePortStatusMap);
}
return data;
}
}

View File

@@ -1,149 +0,0 @@
package com.telecominfraproject.wlan.status.equipment.report.models;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import java.util.List;
import java.util.Objects;
/**
* @author rsharma
*/
public class WiredPortStatus extends BaseJsonModel {
private static final long serialVersionUID = 5525006111579379607L;
private String name; // eth_port: eth0 or eth1
private String originalIfName; // ifName when the AP came up (lan, wan etc.)
private String currentIfName; // Current ifName (e.g. lan, wan etc.)
private String ifType; // bridge/Nat/eth/vlan
private int speed; // in MBPS
private String duplex; // full, half
private String operationalState; // Operational State
private int vlanId; // tagged VlanId
private boolean trunkEnabled; // trunk enabled or disabled
private List<Integer> allowedVlanIds; // allowed vlanIds
public WiredPortStatus() {
}
public WiredPortStatus(String name, String originalIfName, String currentIfName, String ifType, int speed, String duplex,
String operationalState, int vlanId, boolean trunkEnabled, List<Integer> allowedVlanIds) {
this.name = name;
this.originalIfName = originalIfName;
this.currentIfName = currentIfName;
this.ifType = ifType;
this.speed = speed;
this.duplex = duplex;
this.operationalState = operationalState;
this.vlanId = vlanId;
this.trunkEnabled = trunkEnabled;
this.allowedVlanIds = allowedVlanIds;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof WiredPortStatus)) {
return false;
}
WiredPortStatus that = (WiredPortStatus) o;
return getSpeed() == that.getSpeed() && Objects.equals(getName(), that.getName())
&& Objects.equals(getOriginalIfName(), that.getOriginalIfName())
&& Objects.equals(getCurrentIfName(), that.getCurrentIfName())
&& Objects.equals(getIfType(), that.getIfType())
&& Objects.equals(getDuplex(), that.getDuplex())
&& Objects.equals(getOperationalState(), that.getOperationalState())
&& getVlanId() == that.getVlanId()
&& Objects.equals(getAllowedVlanIds(), that.getAllowedVlanIds())
&& Objects.equals(isTrunkEnabled(), that.isTrunkEnabled());
}
@Override
public int hashCode() {
return Objects.hash(getName(), getOriginalIfName(), getCurrentIfName(), getIfType(), getSpeed(), getDuplex(),
getOperationalState(), getVlanId(), getAllowedVlanIds(), isTrunkEnabled());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOriginalIfName() {
return originalIfName;
}
public void setOriginalIfName(String originalIfName) {
this.originalIfName = originalIfName;
}
public String getCurrentIfName() {
return currentIfName;
}
public void setCurrentIfName(String currentIfName) {
this.currentIfName = currentIfName;
}
public String getIfType() {
return ifType;
}
public void setIfType(String ifType) {
this.ifType = ifType;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public String getDuplex() {
return duplex;
}
public void setDuplex(String duplex) {
this.duplex = duplex;
}
public String getOperationalState() {
return operationalState;
}
public void setOperationalState(String operationalState) {
this.operationalState = operationalState;
}
public int getVlanId() {
return vlanId;
}
public void setVlanId(int vlanId) {
this.vlanId = vlanId;
}
public List<Integer> getAllowedVlanIds() {
return allowedVlanIds;
}
public void setAllowedVlanIds(List<Integer> allowedVlanIds) {
this.allowedVlanIds = allowedVlanIds;
}
public boolean isTrunkEnabled() {
return trunkEnabled;
}
public void setTrunkEnabled(boolean trunkEnabled) {
this.trunkEnabled = trunkEnabled;
}
}

View File

@@ -64,11 +64,7 @@ public class StatusDataType implements EnumWithId {
/**
* Protocol status
*/
PROTOCOL = new StatusDataType(4, "PROTOCOL"
// some of the properties of this status need to be preserved across equipment connections
// example - reportedCfgDataVersion
//, Set.of(StatusTrait.DeleteOnEquipmentDisconnect)
) ,
PROTOCOL = new StatusDataType(4, "PROTOCOL", Set.of(StatusTrait.DeleteOnEquipmentDisconnect)) ,
/**
* Firmware upgrade status
*/
@@ -105,9 +101,6 @@ public class StatusDataType implements EnumWithId {
*/
EQUIPMENT_MANUFACTURER_DATA = new StatusDataType(17, "EQUIPMENT_MANUFACTURER_DATA", Set.of(StatusTrait.DeleteOnEquipmentDisconnect)),
// STATUS OF ETHERNET PORTS ON THE DEVICE
WIRED_ETHERNET_PORT = new StatusDataType(18, "WIRED_ETHERNET_PORT", Set.of(StatusTrait.DeleteOnEquipmentDisconnect)),
UNSUPPORTED = new StatusDataType(-1, "UNSUPPORTED") ;
static {

View File

@@ -257,6 +257,7 @@ public class SystemEventDatastoreInMemory extends BaseInMemoryDatastore implemen
if (mdl.getEventTimestamp() > eqptStats.getLastEventTime()) {
eqptStats.setLastEventTime(mdl.getEventTimestamp());
}
items.add(mdl);
}
List<EquipmentEventStats> equipmentStats = new ArrayList<>();

View File

@@ -2415,6 +2415,8 @@ components:
example:
customerId: 2
username: new_user
password: pwd
role: CustomerIT
PortalUserRole:
type: string
@@ -3435,17 +3437,7 @@ components:
type: integer
format: int64
ChannelBandwidthPerRadioTypeMap:
properties:
is5GHz:
$ref: '#/components/schemas/ChannelBandwidth'
is5GHzU:
$ref: '#/components/schemas/ChannelBandwidth'
is5GHzL:
$ref: '#/components/schemas/ChannelBandwidth'
is2dot4GHz:
$ref: '#/components/schemas/ChannelBandwidth'
EquipmentAdminStatusData:
type: object
properties:
@@ -4405,8 +4397,6 @@ components:
- RADIO_CHANNEL
channelNumberStatusDataMap:
$ref: '#/components/schemas/IntegerPerRadioTypeMap'
channelBandwidthStatusDataMap:
$ref: '#/components/schemas/ChannelBandwidthPerRadioTypeMap'
txPowerDataMap:
$ref: '#/components/schemas/IntegerPerRadioTypeMap'