Compare commits

...

86 Commits

Author SHA1 Message Date
Lynn Shi
fa77d3896d WIFI-4732 add equipmentId in error msg 2021-10-20 16:12:40 -04:00
Lynn Shi
55c4671211 Wifi 4732 update based on review comments 2021-10-20 15:31:46 -04:00
Lynn Shi
a540274210 WIFI-4732 Minor update 2021-10-19 23:48:38 -04:00
Lynn Shi
56f43d8e7f WIFI-4732 add null check 2021-10-19 22:41:34 -04:00
Lynn Shi
607c1c815e WIFI-4732 EquipmentPortalController reset defaults channels for equipment country change 2021-10-19 22:32:43 -04:00
Rahul Sharma
f750d0cad2 Merge pull request #164 from Telecominfraproject/wifi-4417_2
Adding method to retrieve profile based on ModelType
2021-10-17 22:18:43 -04:00
Rahul Sharma
1551babca2 Adding method to retrieve profile based on ModelType 2021-10-17 22:06:03 -04:00
Rahul Sharma
70bd1f5eda Merge pull request #163 from Telecominfraproject/Wifi-4417_1
Adding models for EthernetPort profile
2021-10-15 20:50:01 -04:00
Rahul Sharma
88fa6ca8a5 Adding models for EthernetPort profile 2021-10-15 20:36:01 -04:00
norm-traxler
e090bd6b00 Merge pull request #161 from Telecominfraproject/WIFI-4900
WIFI-4900 Empty firmware version is displayed when AP is moved from W…
2021-10-12 12:14:29 -04:00
Lynn Shi
aa1fbfd645 WIFI-4900 Empty firmware version is displayed when AP is moved from Walled Garden 2021-10-12 12:05:29 -04:00
norm-traxler
9ee24beb64 Merge pull request #160 from Telecominfraproject/WIFI-4732
WIFI-4732 Default 5G backup channel is not applicable to all countries
2021-10-06 16:01:59 -04:00
Lynn Shi
95a07188d5 WIFI-4732 Default 5G backup channel is not applicable to all countries 2021-10-06 15:21:43 -04:00
norm-traxler
6839ff3e97 Merge pull request #159 from Telecominfraproject/WIFI-4422
[WIFI-4422] Performance improvements for gateway
2021-09-27 15:26:13 -04:00
norm-traxler
299f59767e Merge pull request #158 from Telecominfraproject/WIFI-4415
[WIFI-4415] remove unnecessary code
2021-09-27 15:23:43 -04:00
Thomas-Leung2021
936aeae135 [NETEXP-2957] fix failed test 2021-09-27 15:03:44 -04:00
Thomas-Leung2021
5b3d05bc21 [NETEXP-2957] remove numRxData attributes in ClientMetrics.java 2021-09-27 15:03:44 -04:00
Thomas-Leung2021
ee3c62559a [NETEXP-2957] remove rxLastRssi attributes in ClientMetrics.java 2021-09-27 15:03:44 -04:00
Thomas-Leung2021
d3bb9f6e51 [NETEXP-2957] remove classificationName and channelBandwidth attributes in ClientMetrics.java 2021-09-27 15:03:44 -04:00
Thomas-Leung2021
a1ebf265f9 [NETEXP-2957] remove secondsSinceLastRecv attributes 2021-09-27 15:03:44 -04:00
Thomas-Leung2021
64b1432251 [NETEXP-2957] remove rates attribute 2021-09-27 15:03:44 -04:00
Thomas-Leung2021
ccb7680933 [WIFI-4415] remove unnecessary code 2021-09-27 13:33:48 -04:00
norm-traxler
e74570121c Merge pull request #157 from Telecominfraproject/WIFI-4415
[Wifi 4415] Add Gateway and backend support to turn LED on/off
2021-09-27 11:06:09 -04:00
Thomas Leung
b4b697376c Merged in NETEXP-2959 (pull request #10)
NETEXP-2959 Undo blinkLEDs api

Approved-by: mike.hansen
2021-09-24 17:37:14 -04:00
Thomas-Leung2021
b57fb2dd4f Merge branch 'NETEXP-2959' of bitbucket.org:connectustechnologies/wlan-cloud-services into NETEXP-2959 2021-09-24 17:35:42 -04:00
Thomas-Leung2021
d25c1d6167 [WIFI-4415] Undo blinkLEDs api 2021-09-24 17:34:52 -04:00
Thomas-Leung2021
57c2d7d6f4 [NETEXP-2959] update Equipment Profile when blinkAllLEDs changed 2021-09-24 17:21:08 -04:00
norm-traxler
faf0a3a385 Merge pull request #155 from Telecominfraproject/WIFI-4339
WIFI-4339 Moving the AP from one location to another with different C…
2021-09-24 14:59:49 -04:00
norm-traxler
a7a836440e Merge pull request #156 from Telecominfraproject/WIFI-4340
WIFI-4340 Configure Auto Channel Exclusions in RF Profile
2021-09-24 14:59:34 -04:00
Lynn Shi
999e597493 WIFI-4340 Configure Auto Channel Exclusions in RF Profile 2021-09-23 17:19:53 -04:00
Lynn Shi
5f4ed530fe WIFI-4339 Moving the AP from one location to another with different Country code does not trigger reg domain changes on AP 2021-09-23 16:09:08 -04:00
Mike Hansen
0dca8bb943 Merge pull request #154 from Telecominfraproject/WIFI-4152-bugfix-alarm-forCustomer
[WIFI-4152] Removing null entries from alarm Cassandra forCustomer
2021-09-15 13:55:21 -04:00
ralphlee
c8c7217d38 [WIFI-4152] Removing null entries from alarm Cassandra forCustomer 2021-09-15 13:48:47 -04:00
Mike Hansen
b41e35a536 Merge pull request #151 from Telecominfraproject/WIFI-3404
[WIFI-3404] Clean up unused schema definition in yaml files
2021-08-11 08:33:02 -04:00
Mike Hansen
64bd468ade Merge pull request #149 from Telecominfraproject/WIFI-3358
[WIFI-3358] remove more unused attributes in ClientMetrics
2021-08-11 08:32:01 -04:00
Mike Hansen
fe488e9d5f Merge pull request #148 from Telecominfraproject/WIFI-3403
[WIFI-3403] remove unused attributes in RadioStatistics
2021-08-11 08:31:01 -04:00
norm-traxler
a79778b083 Merge pull request #150 from Telecominfraproject/WIFI-3397
Fix to not remove the active sessions.
2021-08-10 22:18:54 -04:00
Thomas-Leung2021
d5b86d0c8d [WIFI-3404] Clean up unused schema definitions for RadioStatistics 2021-08-10 18:43:02 -04:00
Rahul Sharma
15698e99cb Fix to not remove the active sessions.
Also added some more logging
2021-08-10 18:29:47 -04:00
Thomas-Leung2021
e06c28e85a [WIFI-3404] Clean up unused schema definition in yaml files 2021-08-10 18:08:13 -04:00
Thomas-Leung2021
c307f59e8a [WIFI-3358] remove more unused attributes in ClientMetrics 2021-08-10 17:35:38 -04:00
Thomas-Leung2021
1e23a691d7 [WIFI-3403] remove unused attributes in RadioStatistics 2021-08-10 14:11:32 -04:00
Mike Hansen
015e662e68 Merge pull request #147 from Telecominfraproject/revert-146-revert-144-WIFI-3358
Revert "Revert "[WIFI 3358] Client Metrics report performance improvements""
2021-08-09 19:26:14 -04:00
Mike Hansen
9f3af6773b Revert "Revert "[WIFI 3358] Client Metrics report performance improvements"" 2021-08-09 19:26:00 -04:00
Mike Hansen
b7eedf6b8c Merge pull request #146 from Telecominfraproject/revert-144-WIFI-3358
Revert "[WIFI 3358] Client Metrics report performance improvements"
2021-08-09 19:14:01 -04:00
Mike Hansen
468e7bcddb Revert "[WIFI 3358] Client Metrics report performance improvements" 2021-08-09 19:13:50 -04:00
Mike Hansen
9b712d6fb5 Merge pull request #145 from Telecominfraproject/WIFI-3397
Adding more logging to find the cause of Remote-SSH sessions drop
2021-08-09 18:52:01 -04:00
Mike Hansen
99475d3f2f Merge pull request #144 from Telecominfraproject/WIFI-3358
[WIFI 3358] Client Metrics report performance improvements
2021-08-09 18:49:46 -04:00
Rahul Sharma
7216b08ac7 Adding more logging to find the cause of Remote-SSH sessions drop 2021-08-09 18:35:33 -04:00
Thomas-Leung2021
34da98b9a8 [WIFI-3358] remove unused methods in ClientRadioUtils.java 2021-08-09 17:20:21 -04:00
Thomas-Leung2021
65aeadeaa7 [WIFI-3358] remove WmmQueueStats.java 2021-08-09 17:06:15 -04:00
Thomas-Leung2021
148a6762dc [WIFI-3358] remove McsType.java 2021-08-09 17:06:15 -04:00
Thomas-Leung2021
178378f8b6 [WIFI-3358] remove McsStats.java 2021-08-09 17:06:15 -04:00
Thomas-Leung2021
d0e6866345 [WIFI-3358] remove unused attributes in McsStats 2021-08-09 17:06:15 -04:00
Thomas-Leung2021
a2b3e711ea [WIFI-3358] remove ClientQoEMetrics.java 2021-08-09 17:06:15 -04:00
Thomas-Leung2021
b5f5c6d19f [WIFI-3358] remove unused attributes for SsidStatistics 2021-08-09 17:06:15 -04:00
Thomas-Leung2021
a5079d04a7 [WIFI-3358] remove unused attributes in ClientMetrics 2021-08-09 17:06:15 -04:00
Mike Hansen
35d89a1cf0 Merge pull request #143 from Telecominfraproject/WIFI-3358-id
[WIFI-3358] remove sessionId in ClientMetrics
2021-08-09 15:56:07 -04:00
Thomas-Leung2021
534ed3e9c0 [WIFI-3358] remove sessionId in ClientMetrics 2021-08-09 14:42:14 -04:00
Mike Hansen
a6ec1d6e7f Merge pull request #142 from Telecominfraproject/WIFI-3344
[WIFI-3344] remove ClientSessionMetricDetails
2021-08-04 19:35:16 -04:00
Thomas-Leung2021
a19fc425c2 [WIFI-3344] remove ClientSessionMetricDetails 2021-08-04 16:57:40 -04:00
Mike Hansen
fc8cab6a50 Merge pull request #141 from Telecominfraproject/NETEXP-2677
[NETEXP-2677] set clients disconnected in current client list when moving AP to another SP
2021-08-04 10:27:58 -04:00
Thomas-Leung2021
daabf38510 [NETEXP-2677] set clients disconnected in current client list when moving AP to another SP 2021-08-03 18:05:31 -04:00
Mike Hansen
78c4d3a862 Merge pull request #140 from Telecominfraproject/WIFI-3285
WIFI-3285 Use base channel as default value on 5G for backupChannelNu…
2021-08-03 18:04:42 -04:00
Lynn Shi
3f3e40d2dd WIFI-3285 Use base channel as default value on 5G for backupChannelNumber and manualBackupChannelNumber in Equipment Config 2021-08-03 14:08:29 -04:00
Mike Hansen
91877f5305 Merge pull request #139 from Telecominfraproject/WIFI-3259-portal-user-event-payload-fix
[WIFI-3259] Adding default constructor to PortalUserEventPayload for …
2021-07-29 10:10:39 -04:00
ralphlee
11314e3395 [WIFI-3259] Adding default constructor to PortalUserEventPayload for serialization, updated yamls 2021-07-28 12:58:46 -04:00
Mike Hansen
fa6795369c Merge pull request #138 from Telecominfraproject/NETEXP-1632-temp
fix missing RADIO_CHANNEL status
2021-07-27 08:41:07 -04:00
Thomas-Leung2021
e6e06d7b70 fix missing RADIO_CHANNEL status 2021-07-26 17:29:49 -04:00
Mike Hansen
1e15e3cd94 Merge pull request #137 from Telecominfraproject/WIFI-3218-add-null-checks-to-rrm-bulk-update
[WIFI-3218] Adding null checks to RrmBulkUpdateItem
2021-07-22 17:25:38 -04:00
ralphlee
02e03780db [WIFI-3218] Adding null checks to RrmBulkUpdateItem 2021-07-22 17:19:03 -04:00
Mike Hansen
aac34150b2 APs running into Backoff shows as connected
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-22 15:31:58 -04:00
Mike Hansen
3085c34cde Merge pull request #135 from Telecominfraproject/WIFI-3180-portal-user-search-case-insensitive
[WIFI-3180] Adding case insensitivity to Portal User API Search
2021-07-20 11:53:47 -04:00
Mike Hansen
35fd038113 [WIFI-3166] Session ID is a -ve number in opensyncgw logs and on UI logs
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-20 11:31:07 -04:00
ralphlee
7c387f1940 [WIFI-3180] Adding case insensitivity to Portal User API Search 2021-07-20 10:38:04 -04:00
Mike Hansen
abb9b59659 Gateway pushes the threshholds as empty which causes AP not to connect any client
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-20 10:02:59 -04:00
norm-traxler
7f0497754c Merge pull request #134 from Telecominfraproject/WIFI-3042-alarm-remote-fix
[WIFI-3042] Fix alarmCode get url parameter
2021-07-20 08:30:40 -04:00
Norm Traxler
82095510f7 [WIFI-3042] Fix alarmCode get url parameter 2021-07-20 08:23:58 -04:00
Mike Hansen
0afd414870 Merge pull request #133 from Telecominfraproject/change_sessionId_to_String
[WIFI-3166] Session ID is a -ve number in opensyncgw logs and on UI logs
2021-07-19 19:30:42 -04:00
Mike Hansen
772beab902 [WIFI-3166] Session ID is a -ve number in opensyncgw logs and on UI logs
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-19 19:10:37 -04:00
Mike Hansen
4a764db007 [WIFI-3166] Session ID is a -ve number in opensyncgw logs and on UI logs
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-19 18:03:13 -04:00
Mike Hansen
41add1922b Merge pull request #132 from Telecominfraproject/WIFI-3041
[WIFI-3041] move if statusment for custmerId check to a different location
2021-07-19 17:54:58 -04:00
Mike Hansen
1e277f5650 [WIFI-3165] Keep last stats received timestamp in gateway client session map
Adding API call to gateway controller

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-19 14:13:19 -04:00
Mike Hansen
716ba7e043 Merge pull request #131 from Telecominfraproject/WIFI-3041
[Wifi 3041] A disconnected Alarm is raised when a disconnected AP is moved out of a Customer Inventory.
2021-07-16 16:28:16 -04:00
Mike Hansen
f9dbe12c8c Merge pull request #130 from Telecominfraproject/WIFI-3056-event-stats
[WIFI-3056] Add API to get system event statistics
2021-07-16 07:44:06 -04:00
Norm Traxler
910a2cbe0c [WIFI-3056] Add API to get system event statistics 2021-07-15 22:15:01 -04:00
83 changed files with 1867 additions and 21165 deletions

View File

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

View File

@@ -259,7 +259,7 @@ public class AlarmServiceRemote extends BaseRemoteClient implements AlarmService
try {
ResponseEntity<List<Alarm>> responseEntity =
restTemplate.exchange(getBaseUrl() + "/forAlarmCode?alarmCodeSet={alarmCodeSetStr}&createdAfterTimestamp={createdAfterTimestamp}",
restTemplate.exchange(getBaseUrl() + "/forAlarmCode?alarmCode={alarmCodeSetStr}&createdAfterTimestamp={createdAfterTimestamp}",
HttpMethod.GET, null, Alarm_LIST_CLASS_TOKEN, alarmCodeSetStr, createdAfterTimestamp);
List<Alarm> result = responseEntity.getBody();

View File

@@ -31,7 +31,6 @@ 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;
@@ -811,10 +810,10 @@ public class AllInOneWithGatewayStartListener implements ApplicationRunner {
sessionDetails.setRadioType(radioType);
sessionDetails.setSecurityType(SecurityType.PSK);
sessionDetails.setSsid(ssidConfig.getSsid());
sessionDetails.setSessionId(System.currentTimeMillis());
sessionDetails.setSessionId(Long.toUnsignedString(System.currentTimeMillis()));
sessionDetails.setAssocTimestamp(System.currentTimeMillis() - getRandomLong(10000, 1000000));
ClientDhcpDetails dhcpDetails = new ClientDhcpDetails(System.currentTimeMillis());
ClientDhcpDetails dhcpDetails = new ClientDhcpDetails(Long.toUnsignedString(System.currentTimeMillis()));
dhcpDetails.setLeaseStartTimestamp(System.currentTimeMillis() - getRandomLong(0, TimeUnit.HOURS.toMillis(4)));
dhcpDetails.setLeaseTimeInSeconds((int)TimeUnit.HOURS.toSeconds(4));
try {
@@ -829,16 +828,6 @@ 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,7 +38,6 @@ 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;
@@ -1238,8 +1237,6 @@ public class AllInOneStartListener implements ApplicationRunner {
clientMetrics.setNumRxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setNumTxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setSessionId(getRandomLong(3000000, 7000000));
clientMetrics.setTxRetries(getRandomInt(30, 70));
clientMetrics.setRxDuplicatePackets(getRandomInt(30, 70));
clientMetrics.setSnr(getRandomInt(-70, -30));
@@ -1265,8 +1262,6 @@ public class AllInOneStartListener implements ApplicationRunner {
clientMetrics.setNumRxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setNumTxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setSessionId(getRandomLong(3000000, 7000000));
clientMetrics.setTxRetries(getRandomInt(30, 70));
clientMetrics.setRxDuplicatePackets(getRandomInt(30, 70));
clientMetrics.setSnr(getRandomInt(-70, -30));
@@ -1292,8 +1287,6 @@ public class AllInOneStartListener implements ApplicationRunner {
clientMetrics.setNumRxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setNumTxBytes(getRandomLong(3000000, 7000000));
clientMetrics.setSessionId(getRandomLong(3000000, 7000000));
clientMetrics.setTxRetries(getRandomInt(30, 70));
clientMetrics.setRxDuplicatePackets(getRandomInt(30, 70));
clientMetrics.setSnr(getRandomInt(-70, -30));
@@ -1361,10 +1354,10 @@ public class AllInOneStartListener implements ApplicationRunner {
sessionDetails.setRadioType(radioType);
sessionDetails.setSecurityType(SecurityType.PSK);
sessionDetails.setSsid(ssidConfig.getSsid());
sessionDetails.setSessionId(System.currentTimeMillis());
sessionDetails.setSessionId(Long.toUnsignedString(System.currentTimeMillis()));
sessionDetails.setAssocTimestamp(System.currentTimeMillis() - getRandomLong(10000, 1000000));
ClientDhcpDetails dhcpDetails = new ClientDhcpDetails(System.currentTimeMillis());
ClientDhcpDetails dhcpDetails = new ClientDhcpDetails(Long.toUnsignedString(System.currentTimeMillis()));
dhcpDetails
.setLeaseStartTimestamp(System.currentTimeMillis() - getRandomLong(0, TimeUnit.HOURS.toMillis(4)));
dhcpDetails.setLeaseTimeInSeconds((int) TimeUnit.HOURS.toSeconds(4));
@@ -1380,16 +1373,6 @@ 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

@@ -12,7 +12,7 @@ import com.telecominfraproject.wlan.systemevent.equipment.realtime.RealTimeEvent
public class ClientAssocEvent extends RealTimeEvent implements HasClientMac {
private static final long serialVersionUID = 7015822981315570338L;
private long sessionId;
private String sessionId;
private String ssid;
private MacAddress clientMacAddress;
private RadioType radioType;
@@ -29,7 +29,7 @@ public class ClientAssocEvent extends RealTimeEvent implements HasClientMac {
}
public ClientAssocEvent(int customerId, long locationId, long equipmentId, long timestamp, long sessionId, String ssid,
public ClientAssocEvent(int customerId, long locationId, long equipmentId, long timestamp, String sessionId, String ssid,
MacAddress clientMacAddress, RadioType radioType, boolean isReassociation, WlanStatusCode status,
Integer internalSC, Integer rssi) {
super(RealTimeEventType.STA_Client_Assoc, customerId, locationId, equipmentId, timestamp);
@@ -50,7 +50,7 @@ public class ClientAssocEvent extends RealTimeEvent implements HasClientMac {
/**
* @return the sessionId
*/
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
@@ -58,7 +58,7 @@ public class ClientAssocEvent extends RealTimeEvent implements HasClientMac {
* @param sessionId
* the sessionId to set
*/
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -13,7 +13,7 @@ public class ClientAuthEvent extends RealTimeEvent implements HasClientMac {
private static final long serialVersionUID = 1221389696911864515L;
private long sessionId;
private String sessionId;
private String ssid;
private MacAddress clientMacAddress;
private WlanStatusCode authStatus;
@@ -32,11 +32,11 @@ public class ClientAuthEvent extends RealTimeEvent implements HasClientMac {
super(eventType, timestamp);
}
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -14,7 +14,7 @@ public class ClientConnectSuccessEvent extends RealTimeEvent implements HasClien
private static final long serialVersionUID = -6082134146801575193L;
private MacAddress clientMacAddress;
private long sessionId;
private String sessionId;
private RadioType radioType;
private boolean isReassociation;
private String ssid;
@@ -61,7 +61,7 @@ public class ClientConnectSuccessEvent extends RealTimeEvent implements HasClien
/**
* @return the sessionId
*/
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
@@ -69,7 +69,7 @@ public class ClientConnectSuccessEvent extends RealTimeEvent implements HasClien
* @param sessionId
* the sessionId to set
*/
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -45,7 +45,7 @@ public class ClientDisconnectEvent extends RealTimeEvent implements HasClientMac
}
private static final long serialVersionUID = -7674230178565760938L;
private long sessionId;
private String sessionId;
private byte[] macAddressBytes;
private MacAddress clientMacAddress;
private long lastRecvTime;
@@ -104,7 +104,7 @@ public class ClientDisconnectEvent extends RealTimeEvent implements HasClientMac
return rssi;
}
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
@@ -148,7 +148,7 @@ public class ClientDisconnectEvent extends RealTimeEvent implements HasClientMac
this.rssi = rssi;
}
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -14,7 +14,7 @@ import com.telecominfraproject.wlan.systemevent.equipment.realtime.RealTimeEvent
public class ClientFailureEvent extends RealTimeEvent implements HasClientMac {
private static final long serialVersionUID = -16021752050335131L;
private long sessionId;
private String sessionId;
private String ssid;
private MacAddress clientMacAddress;
private WlanReasonCode reasonCode;
@@ -38,11 +38,11 @@ public class ClientFailureEvent extends RealTimeEvent implements HasClientMac {
this.clientMacAddress = clientMacAddress;
}
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -10,7 +10,7 @@ import com.telecominfraproject.wlan.systemevent.equipment.realtime.RealTimeEvent
public class ClientFirstDataEvent extends RealTimeEvent implements HasClientMac {
private static final long serialVersionUID = 298223061973506469L;
private long sessionId;
private String sessionId;
private MacAddress clientMacAddress;
private long firstDataRcvdTs;
private long firstDataSentTs;
@@ -28,11 +28,11 @@ public class ClientFirstDataEvent extends RealTimeEvent implements HasClientMac
super(eventType, timestamp);
}
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -1,6 +1,7 @@
package com.telecominfraproject.wlan.client.models.events.realtime;
import java.util.Arrays;
import java.util.Objects;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.json.interfaces.HasClientMac;
@@ -10,7 +11,7 @@ import com.telecominfraproject.wlan.systemevent.equipment.realtime.RealTimeEvent
public class ClientIdEvent extends RealTimeEvent implements HasClientMac {
private static final long serialVersionUID = 298223061973506469L;
private long sessionId;
private String sessionId;
private byte[] macAddressBytes;
private MacAddress clientMacAddress;
private String userId;
@@ -27,7 +28,7 @@ public class ClientIdEvent extends RealTimeEvent implements HasClientMac {
/**
* @return the sessionId
*/
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
@@ -35,7 +36,7 @@ public class ClientIdEvent extends RealTimeEvent implements HasClientMac {
* @param sessionId
* the sessionId to set
*/
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
@@ -65,58 +66,28 @@ public class ClientIdEvent extends RealTimeEvent implements HasClientMac {
this.userId = userId;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
int result = super.hashCode();
result = prime * result + Arrays.hashCode(macAddressBytes);
result = prime * result + (int) (sessionId ^ (sessionId >>> 32));
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
result = prime * result + ((clientMacAddress == null) ? 0 : clientMacAddress.hashCode());
result = prime * result + Objects.hash(clientMacAddress, sessionId, userId);
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
if (this == obj)
return true;
}
if (obj == null) {
if (!super.equals(obj))
return false;
}
if (!super.equals(obj)) {
if (getClass() != obj.getClass())
return false;
}
if (!(obj instanceof ClientIdEvent)) {
return false;
}
ClientIdEvent other = (ClientIdEvent) obj;
if (!Arrays.equals(macAddressBytes, other.macAddressBytes))
return false;
if (sessionId != other.sessionId)
return false;
if (userId == null) {
if (other.userId != null)
return false;
} else if (!userId.equals(other.userId))
return false;
if (clientMacAddress == null) {
if (other.clientMacAddress != null)
return false;
} else if (!clientMacAddress.equals(other.clientMacAddress))
return false;
return true;
return Objects.equals(clientMacAddress, other.clientMacAddress) && Arrays.equals(macAddressBytes, other.macAddressBytes)
&& Objects.equals(sessionId, other.sessionId) && Objects.equals(userId, other.userId);
}
@Override

View File

@@ -12,7 +12,7 @@ public class ClientIpAddressEvent extends RealTimeEvent implements HasClientMac
private static final long serialVersionUID = -5332534925768685589L;
private long sessionId;
private String sessionId;
private MacAddress clientMacAddress;
private InetAddress ipAddr;
@@ -29,11 +29,11 @@ public class ClientIpAddressEvent extends RealTimeEvent implements HasClientMac
super(eventType, timestamp);
}
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -26,7 +26,7 @@ public class ClientTimeoutEvent extends RealTimeEvent implements HasClientMac {
}
}
private long sessionId;
private String sessionId;
private MacAddress clientMacAddress;
private long lastRecvTime;
private long lastSentTime;
@@ -45,11 +45,11 @@ public class ClientTimeoutEvent extends RealTimeEvent implements HasClientMac {
super(eventType, timestamp);
}
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -1,6 +1,7 @@
package com.telecominfraproject.wlan.client.session.models;
import java.net.InetAddress;
import java.util.Objects;
import com.telecominfraproject.wlan.core.model.equipment.WiFiSessionUtility;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
@@ -29,10 +30,9 @@ public class ClientDhcpDetails extends BaseJsonModel {
/**
* Identifies the association where DHCP last occurred.
*/
private long associationId;
private String associationId;
public ClientDhcpDetails(long sessionId) {
public ClientDhcpDetails(String sessionId) {
this.associationId = sessionId;
}
@@ -101,10 +101,10 @@ public class ClientDhcpDetails extends BaseJsonModel {
this.firstDiscoverTimestamp = firstDiscoverTimestamp;
}
public long getAssociationId() {
public String getAssociationId() {
return associationId;
}
public void setAssociationId(Long associationId) {
public void setAssociationId(String associationId) {
this.associationId = associationId;
}
@@ -116,123 +116,6 @@ public class ClientDhcpDetails extends BaseJsonModel {
this.nakTimestamp = nakTimestamp;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (associationId ^ (associationId >>> 32));
result = prime * result + ((dhcpServerIp == null) ? 0 : dhcpServerIp.hashCode());
result = prime * result + ((firstDiscoverTimestamp == null) ? 0 : firstDiscoverTimestamp.hashCode());
result = prime * result + ((firstOfferTimestamp == null) ? 0 : firstOfferTimestamp.hashCode());
result = prime * result + ((firstRequestTimestamp == null) ? 0 : firstRequestTimestamp.hashCode());
result = prime * result + (fromInternal ? 1231 : 1237);
result = prime * result + ((gatewayIp == null) ? 0 : gatewayIp.hashCode());
result = prime * result + ((leaseStartTimestamp == null) ? 0 : leaseStartTimestamp.hashCode());
result = prime * result + ((leaseTimeInSeconds == null) ? 0 : leaseTimeInSeconds.hashCode());
result = prime * result + ((nakTimestamp == null) ? 0 : nakTimestamp.hashCode());
result = prime * result + ((primaryDns == null) ? 0 : primaryDns.hashCode());
result = prime * result + ((secondaryDns == null) ? 0 : secondaryDns.hashCode());
result = prime * result + ((subnetMask == null) ? 0 : subnetMask.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof ClientDhcpDetails)) {
return false;
}
ClientDhcpDetails other = (ClientDhcpDetails) obj;
if (associationId != other.associationId) {
return false;
}
if (dhcpServerIp == null) {
if (other.dhcpServerIp != null) {
return false;
}
} else if (!dhcpServerIp.equals(other.dhcpServerIp)) {
return false;
}
if (firstDiscoverTimestamp == null) {
if (other.firstDiscoverTimestamp != null) {
return false;
}
} else if (!firstDiscoverTimestamp.equals(other.firstDiscoverTimestamp)) {
return false;
}
if (firstOfferTimestamp == null) {
if (other.firstOfferTimestamp != null) {
return false;
}
} else if (!firstOfferTimestamp.equals(other.firstOfferTimestamp)) {
return false;
}
if (firstRequestTimestamp == null) {
if (other.firstRequestTimestamp != null) {
return false;
}
} else if (!firstRequestTimestamp.equals(other.firstRequestTimestamp)) {
return false;
}
if (fromInternal != other.fromInternal) {
return false;
}
if (gatewayIp == null) {
if (other.gatewayIp != null) {
return false;
}
} else if (!gatewayIp.equals(other.gatewayIp)) {
return false;
}
if (leaseStartTimestamp == null) {
if (other.leaseStartTimestamp != null) {
return false;
}
} else if (!leaseStartTimestamp.equals(other.leaseStartTimestamp)) {
return false;
}
if (leaseTimeInSeconds == null) {
if (other.leaseTimeInSeconds != null) {
return false;
}
} else if (!leaseTimeInSeconds.equals(other.leaseTimeInSeconds)) {
return false;
}
if (nakTimestamp == null) {
if (other.nakTimestamp != null) {
return false;
}
} else if (!nakTimestamp.equals(other.nakTimestamp)) {
return false;
}
if (primaryDns == null) {
if (other.primaryDns != null) {
return false;
}
} else if (!primaryDns.equals(other.primaryDns)) {
return false;
}
if (secondaryDns == null) {
if (other.secondaryDns != null) {
return false;
}
} else if (!secondaryDns.equals(other.secondaryDns)) {
return false;
}
if (subnetMask == null) {
if (other.subnetMask != null) {
return false;
}
} else if (!subnetMask.equals(other.subnetMask)) {
return false;
}
return true;
}
@Override
public ClientDhcpDetails clone() {
ClientDhcpDetails ret = (ClientDhcpDetails) super.clone();
@@ -241,8 +124,7 @@ public class ClientDhcpDetails extends BaseJsonModel {
public void mergeDetails(ClientDhcpDetails other) {
if(other == null) return;
if(WiFiSessionUtility.decodeWiFiAssociationId(other.associationId)>WiFiSessionUtility.decodeWiFiAssociationId(associationId)) {
if(WiFiSessionUtility.decodeWiFiAssociationId(Long.parseUnsignedLong(other.associationId))>WiFiSessionUtility.decodeWiFiAssociationId(Long.parseUnsignedLong(associationId))) {
// The other dhcp details are from a newer session and so everything must be reset.
this.dhcpServerIp = null;
this.firstDiscoverTimestamp = null;
@@ -258,8 +140,7 @@ public class ClientDhcpDetails extends BaseJsonModel {
this.associationId = other.associationId;
this.fromInternal = false;
}
else if(other.associationId != associationId) {
// other is older, ignore it
if(!Objects.equals(this.associationId, other.associationId)) {
return;
}
dhcpServerIp = (InetAddress) assignOtherIfOtherNotNull(dhcpServerIp, other.dhcpServerIp);
@@ -305,4 +186,28 @@ public class ClientDhcpDetails extends BaseJsonModel {
this.fromInternal = fromInternal;
}
@Override
public int hashCode() {
return Objects.hash(associationId, dhcpServerIp, firstDiscoverTimestamp, firstOfferTimestamp, firstRequestTimestamp, fromInternal, gatewayIp,
leaseStartTimestamp, leaseTimeInSeconds, nakTimestamp, primaryDns, secondaryDns, subnetMask);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ClientDhcpDetails other = (ClientDhcpDetails) obj;
return Objects.equals(associationId, other.associationId) && Objects.equals(dhcpServerIp, other.dhcpServerIp)
&& Objects.equals(firstDiscoverTimestamp, other.firstDiscoverTimestamp) && Objects.equals(firstOfferTimestamp, other.firstOfferTimestamp)
&& Objects.equals(firstRequestTimestamp, other.firstRequestTimestamp) && fromInternal == other.fromInternal
&& Objects.equals(gatewayIp, other.gatewayIp) && Objects.equals(leaseStartTimestamp, other.leaseStartTimestamp)
&& Objects.equals(leaseTimeInSeconds, other.leaseTimeInSeconds) && Objects.equals(nakTimestamp, other.nakTimestamp)
&& Objects.equals(primaryDns, other.primaryDns) && Objects.equals(secondaryDns, other.secondaryDns)
&& Objects.equals(subnetMask, other.subnetMask);
}
}

View File

@@ -19,7 +19,7 @@ public class ClientSessionDetails extends BaseJsonModel {
private static final long serialVersionUID = -7714023056859882994L;
private long sessionId;
private String sessionId;
private Long authTimestamp;
private Long assocTimestamp;
private Integer assocInternalSC;
@@ -42,7 +42,6 @@ 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;
@@ -54,22 +53,22 @@ public class ClientSessionDetails extends BaseJsonModel {
private Boolean is11VUsed;
private SecurityType securityType;
private SteerType steerType;
private Long previousValidSessionId;
private String previousValidSessionId;
private ClientFailureDetails lastFailureDetails;
private ClientFailureDetails firstFailureDetails;
private Integer associationStatus;
private Integer dynamicVlan;
private Integer assocRssi;
private Long priorSessionId;
private String priorSessionId;
private Long priorEquipmentId;
private String classificationName;
private AssociationState associationState;
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
@@ -154,12 +153,6 @@ 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;
}
@@ -192,13 +185,7 @@ public class ClientSessionDetails extends BaseJsonModel {
}
public Long getLastRxTimestamp() {
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();
return lastRxTimestamp;
}
public void setLastRxTimestamp(Long lastRxTimestamp) {
@@ -206,12 +193,7 @@ public class ClientSessionDetails extends BaseJsonModel {
}
public Long getLastTxTimestamp() {
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();
return lastTxTimestamp;
}
public void setLastTxTimestamp(Long lastTxTimestamp) {
@@ -257,14 +239,6 @@ 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
*
@@ -413,11 +387,11 @@ public class ClientSessionDetails extends BaseJsonModel {
this.steerType = steerType;
}
public Long getPreviousValidSessionId() {
public String getPreviousValidSessionId() {
return previousValidSessionId;
}
public void setPreviousValidSessionId(Long previousValidSessionId) {
public void setPreviousValidSessionId(String previousValidSessionId) {
this.previousValidSessionId = previousValidSessionId;
}
@@ -514,9 +488,7 @@ public class ClientSessionDetails extends BaseJsonModel {
return AssociationState.Cloud_Timeout;
}
if (firstDataRcvdTimestamp != null || firstDataSentTimestamp != null
|| (getMetricDetails() != null && (getMetricDetails().getLastRxTimestamp() != null
|| getMetricDetails().getLastTxTimestamp() != null))) {
if (firstDataRcvdTimestamp != null || firstDataSentTimestamp != null) {
return AssociationState.Active_Data;
}
if (assocTimestamp != null) {
@@ -535,9 +507,6 @@ 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());
}
@@ -554,7 +523,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, metricDetails,
lastEventTimestamp, lastFailureDetails, lastRxTimestamp, lastTxTimestamp,
portEnabledTimestamp, previousValidSessionId, priorEquipmentId, priorSessionId, radioType,
radiusUsername, securityType, sessionId, ssid, steerType, timeoutTimestamp, userAgentStr,
associationState);
@@ -594,7 +563,6 @@ 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)
@@ -677,9 +645,6 @@ 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();
@@ -821,11 +786,11 @@ public class ClientSessionDetails extends BaseJsonModel {
this.assocRssi = assocRssi;
}
public Long getPriorSessionId() {
public String getPriorSessionId() {
return priorSessionId;
}
public void setPriorSessionId(Long priorSessionId) {
public void setPriorSessionId(String priorSessionId) {
this.priorSessionId = priorSessionId;
}

View File

@@ -1,365 +0,0 @@
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

@@ -147,8 +147,7 @@ components:
type: object
properties:
sessionId:
type: integer
format: int64
type: string
authTimestamp:
type: integer
format: int64
@@ -235,8 +234,7 @@ components:
steerType:
$ref: '#/components/schemas/SteerType'
previousValidSessionId:
type: integer
format: int64
type: string
lastFailureDetails:
$ref: '#/components/schemas/ClientFailureDetails'
firstFailureDetails:
@@ -251,8 +249,7 @@ components:
type: integer
format: int32
priorSessionId:
type: integer
format: int64
type: string
priorEquipmentId:
type: integer
format: int64

View File

@@ -0,0 +1,13 @@
package com.telecominfraproject.wlan.equipmentgateway.models;
public class CEGWMostRecentStatsTimestamp extends CEGatewayCommand {
private static final long serialVersionUID = -9087897865195978158L;
public CEGWMostRecentStatsTimestamp() {
}
public CEGWMostRecentStatsTimestamp(CEGWCommandType commandType, String inventoryId, long equipmentId) {
super(commandType,inventoryId,equipmentId);
}
}

View File

@@ -344,7 +344,6 @@ 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,5 +309,4 @@ public abstract class CommonElementConfiguration extends EquipmentDetails implem
this.blinkAllLEDs = blinkAllLEDs;
}
}

View File

@@ -1,6 +1,8 @@
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;
@@ -48,6 +50,38 @@ 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
@@ -60,19 +94,8 @@ public class ElementRadioConfiguration extends BaseJsonModel
returnValue.setRadioType(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);
}
returnValue.setChannelNumber(getDefaultChannelNumber(radioType));
returnValue.setBackupChannelNumber(getDefaultBackupChannelNumber(radioType));
return returnValue;
}

View File

@@ -118,33 +118,40 @@ 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 ((erc.getClientDisconnectThresholdDb() == null && updateDetails.getClientDisconnectThresholdDb() != null)
|| !erc.getClientDisconnectThresholdDb().equals(updateDetails.getClientDisconnectThresholdDb())) {
erc.setClientDisconnectThresholdDb(updateDetails.getClientDisconnectThresholdDb());
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.getProbeResponseThresholdDb() == null && updateDetails.getProbeResponseThresholdDb() != null)
|| !erc.getProbeResponseThresholdDb().equals(updateDetails.getProbeResponseThresholdDb())) {
erc.setProbeResponseThresholdDb(updateDetails.getProbeResponseThresholdDb());
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.getRxCellSizeDb() == null && updateDetails.getRxCellSizeDb() != null)
|| !erc.getRxCellSizeDb().equals(updateDetails.getRxCellSizeDb())) {
erc.setRxCellSizeDb(updateDetails.getRxCellSizeDb());
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);
}
}

View File

@@ -36,11 +36,9 @@ 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;
@@ -623,94 +621,6 @@ 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.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()
{
@@ -869,7 +779,6 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
// Clean up after test
createdSet.forEach( c-> remoteInterface.delete(c));
}
@Test
@@ -932,9 +841,9 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
assertEquals(11, radioMap.get(RadioType.is2dot4GHz).getManualBackupChannelNumber().intValue());
assertEquals(36, radioMap.get(RadioType.is5GHz).getChannelNumber().intValue());
assertEquals(153, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(44, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(36, radioMap.get(RadioType.is5GHz).getManualChannelNumber().intValue());
assertEquals(153, radioMap.get(RadioType.is5GHz).getManualBackupChannelNumber().intValue());
assertEquals(44, radioMap.get(RadioType.is5GHz).getManualBackupChannelNumber().intValue());
Map<RadioType, Integer> primaryChannels = new EnumMap<>(RadioType.class);
Map<RadioType, Integer> backupChannels = new EnumMap<>(RadioType.class);
@@ -970,7 +879,7 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
assertEquals(6, radioMap.get(RadioType.is2dot4GHz).getManualBackupChannelNumber().intValue());
assertEquals(36, radioMap.get(RadioType.is5GHz).getChannelNumber().intValue());
assertEquals(153, 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());
@@ -980,7 +889,7 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
backupChannels.clear();
backupChannels.put(RadioType.is2dot4GHz, 6);
backupChannels.put(RadioType.is5GHz, 44);
backupChannels.put(RadioType.is5GHz, 149);
autoChannelSelections.clear();
autoChannelSelections.put(RadioType.is2dot4GHz, true);
@@ -1007,7 +916,7 @@ public class EquipmentServiceRemoteTest extends BaseRemoteTest {
assertEquals(6, radioMap.get(RadioType.is2dot4GHz).getManualBackupChannelNumber().intValue());
assertEquals(161, radioMap.get(RadioType.is5GHz).getChannelNumber().intValue());
assertEquals(44, radioMap.get(RadioType.is5GHz).getBackupChannelNumber().intValue());
assertEquals(149, 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,12 +1,10 @@
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;
@@ -34,7 +32,6 @@ 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;
@@ -263,14 +260,12 @@ public class EquipmentController {
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) {
@@ -280,10 +275,12 @@ public class EquipmentController {
LOG.debug("Updated Equipment {}", ret);
EquipmentChangedEvent event;
if (equipment.getCustomerId() != existingEquipment.getCustomerId()) {
if (ret.getCustomerId() != existingEquipment.getCustomerId()) {
publishEvent(new EquipmentCustomerChangedEvent(existingEquipment, ret));
}
if ((equipment.getProfileId() != existingEquipment.getProfileId()) || (existingApElementConfig != null && updatedApElementConfig != null &&
if ((ret.getProfileId() != existingEquipment.getProfileId()) ||
ret.getLocationId() != existingEquipment.getLocationId() ||
(existingApElementConfig != null && updatedApElementConfig != null &&
updatedApElementConfig.needsToBeUpdatedOnDevice(existingApElementConfig))) {
event = new EquipmentApImpactingChangedEvent(ret);
} else if (existingApElementConfig != null && existingApElementConfig.isBlinkAllLEDs() != updatedApElementConfig.isBlinkAllLEDs()) {
@@ -297,39 +294,6 @@ 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
*
@@ -572,25 +536,13 @@ 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 EquipmentChangedEvent(eq)));
equipmentAfterUpdate.forEach(eq -> events.add(new EquipmentApImpactingChangedEvent(eq)));
publishEvents(events);
return new GenericResponse(true, "");

View File

@@ -48,11 +48,12 @@ 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
* @param connectToPortOnEquipment
* @param inventoryId: Equipment's AssetId
* @param connectToPortOnEquipment: Port to connect on the AP
* @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 {
@@ -191,7 +192,7 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
LOG.debug("[{}] Stopped polling inputstream on local socket {}", inventoryId, localSocket.getPort());
} catch (IOException e) {
LOG.error("[{}] Session {} got exception {} for the socket on port {}", inventoryId, forwarderSession.getSessionId(), e, port);
LOG.error("[{}] Session {} got IOException {} for the socket on port {}", inventoryId, forwarderSession.getSessionId(), port, e);
} finally {
//notify the other end that forwarding session is terminated
@@ -209,7 +210,7 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
localSocket.close();
forwarderSession.getServerSocket().close();
} catch (IOException e) {
//do nothing here
LOG.error("IO Exception when closing socket", e);
}
sessionIdToForwarderSessionMap.remove(forwarderSession.getSessionId());
@@ -232,12 +233,12 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
socketInputStreamReaderThread.setDaemon(true);
forwarderSession.setSocketStreamReaderThread(socketInputStreamReaderThread);
} catch (IOException e) {
LOG.error("[{}] error accepting conection on port {} - closing forwarding session {}", inventoryId, listenOnLocalPort, forwarderSession.getSessionId());
} catch (Exception e) {
LOG.error("[{}] error accepting connection on port {} - closing forwarding session {}", inventoryId, listenOnLocalPort, forwarderSession.getSessionId(), e);
try {
serverSocket.close();
} catch (IOException e1) {
// do nothing here
LOG.error("IO Exception when closing socket", e1);
}
sessionIdToForwarderSessionMap.remove(forwarderSession.getSessionId());
}
@@ -259,6 +260,7 @@ 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);
@@ -266,6 +268,7 @@ 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());
@@ -274,11 +277,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
@@ -286,10 +289,9 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
sessionIdToForwarderSessionMap.remove(forwarderSession.getSessionId());
} catch (IOException e) {
// do nothing here
LOG.error("Encountered IOException when closing connection for forwarder session {}", forwarderSession, e);
sessionIdToForwarderSessionMap.remove(forwarderSession.getSessionId());
}
sessionIdToForwarderSessionMap.remove(forwarderSession.getSessionId());
LOG.info("[{}] Stopped forwarder session {}", forwarderSession.getInventoryId(), sessionId);
}
@@ -322,7 +324,6 @@ 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()){
@@ -332,7 +333,7 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
}
}
LOG.debug("[{}] Session {} got message {}", webSocketSessionKey, session, payload);
LOG.debug("[{}] Session {} got message {} with forwarderSession {}", webSocketSessionKey, session, payload, forwarderSession);
if(payload.startsWith(CONNECTED_TO_CE_PORT_MSG)){
//start reader thread to forward packets from local socket to websocket
@@ -371,10 +372,8 @@ 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();
@@ -384,6 +383,7 @@ 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,6 +419,14 @@ 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());
}
}
}
@@ -442,28 +450,29 @@ public class PortForwarderWebSocketHandler extends AbstractWebSocketHandler {
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
LOG.info("[{}] Closed portForwarder websocket connection {} : {}", getWebSocketSessionKey(session), session, closeStatus);
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) {
String webSocketSessionKey = getWebSocketSessionKey(session);
webSocketSessionMap.remove(webSocketSessionKey);
//close and remove all forwarder sessions for that CE
LOG.info("[{}] Closed portForwarder websocket connection {} : {}", webSocketSessionKey, session, closeStatus);
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();
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();
}
}
iter.remove();
} catch (Exception ex) {
LOG.error("Encountered exception when closing-sockets and removing sessions for Key {} ", webSocketSessionKey, ex);
}
}
private String getWebSocketSessionKey(WebSocketSession session) {

View File

@@ -161,6 +161,42 @@
<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,7 +6,9 @@ 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;
@@ -27,8 +29,10 @@ 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;
@@ -36,7 +40,9 @@ 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;
/**
@@ -48,6 +54,9 @@ 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;
@@ -71,6 +80,9 @@ public class EquipmentPortalController {
@Autowired
private ProfileServiceInterface profileServiceInterface;
@Autowired
private LocationServiceInterface locationServiceInterface;
@RequestMapping(value = "/equipment", method = RequestMethod.GET)
public Equipment getEquipment(@RequestParam long equipmentId) {
@@ -86,14 +98,25 @@ 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());
Equipment existing = equipmentServiceInterface.getOrNull(equipment.getId());
existing = equipmentServiceInterface.getOrNull(equipment.getId());
equipment.setLastModifiedTimestamp(existing.getLastModifiedTimestamp());
}
}
@@ -105,9 +128,115 @@ 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);
}
@@ -302,6 +431,20 @@ 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,8 +12,10 @@ 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.CEGWFirmwareDownloadRequest;
@@ -137,11 +139,12 @@ public class EquipmentGatewayPortalController {
return new GenericResponse(false, "Failed to trigger AP factory reset: " + response.getResultCode() + " " + response.getResultDetail());
}
}
@RequestMapping(value = "/equipmentGateway/requestApBlinkLEDs", method = RequestMethod.POST)
public GenericResponse requestApBlinkLEDs(@RequestParam long equipmentId, @RequestParam boolean blinkAllLEDs) {
String action = "stop blinking LEDs on AP ";
if (blinkAllLEDs) action = "start blinking LEDs on AP ";
String action = "stop blinking LEDs on AP";
if (blinkAllLEDs)
action = "start blinking LEDs on AP";
Equipment equipment = equipmentServiceInterface.get(equipmentId);
LOG.debug("Request {} for AP {}", action, equipment.getInventoryId());
@@ -150,10 +153,12 @@ public class EquipmentGatewayPortalController {
apBlinkLEDs.setBlinkAllLEDs(blinkAllLEDs);
EquipmentCommandResponse response = equipmentGatewayServiceInterface.sendCommand(apBlinkLEDs);
LOG.debug("{} response {}", action,response);
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());

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,509 @@
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

@@ -148,7 +148,7 @@ public class PortalUserDatastoreInMemory extends BaseInMemoryDatastore implement
PortalUser ret = null;
for (PortalUser mdl : idToPortalUserMap.values()) {
if(mdl.getCustomerId() == customerId && mdl.getUsername().equals(username)) {
if(mdl.getCustomerId() == customerId && mdl.getUsername().toLowerCase().equals(username.toLowerCase())) {
ret = mdl.clone();
}
}
@@ -161,7 +161,7 @@ public class PortalUserDatastoreInMemory extends BaseInMemoryDatastore implement
List<PortalUser> listOfPortalUsers = new ArrayList<>();
for (PortalUser portalUser : idToPortalUserMap.values()) {
if (portalUser.getUsername().equals(username)) {
if (portalUser.getUsername().toLowerCase().equals(username.toLowerCase())) {
listOfPortalUsers.add(portalUser);
}
}

View File

@@ -75,7 +75,6 @@ public class PortalUserDAO extends BaseJdbcDao {
public static final Set<String> ALL_COLUMNS_LOWERCASE = new HashSet<>();
@SuppressWarnings("unused")
//use this for queries where multiple tables are involved
public static final String ALL_COLUMNS_WITH_PREFIX;
@@ -135,10 +134,10 @@ public class PortalUserDAO extends BaseJdbcDao {
private static final String SQL_GET_BY_USERNAME =
"select " + ALL_COLUMNS +
" from " + TABLE_NAME + " " +
" where username = ? ";
" where lower(username) = ? ";
private static final String SQL_GET_BY_CUSTOMERID_AND_USERNAME = SQL_GET_BY_CUSTOMER_ID +
" and username = ?";
" and lower(username) = ?";
private static final String SQL_GET_LASTMOD_BY_ID =
"select lastModifiedTimestamp " +
@@ -463,7 +462,7 @@ public class PortalUserDAO extends BaseJdbcDao {
try{
PortalUser portalUser = this.jdbcTemplate.queryForObject(
SQL_GET_BY_CUSTOMERID_AND_USERNAME,
portalUserRowMapper, customerId, username);
portalUserRowMapper, customerId, username.toLowerCase());
LOG.debug("Found PortalUser {}", portalUser);
@@ -478,7 +477,7 @@ public class PortalUserDAO extends BaseJdbcDao {
LOG.debug("Looking up PortalUsers for username {} {}", username);
List<PortalUser> ret = this.jdbcTemplate.query(SQL_GET_BY_USERNAME,
portalUserRowMapper, username);
portalUserRowMapper, username.toLowerCase());
LOG.debug("Found List of Portal Users {}", ret);

View File

@@ -20,6 +20,8 @@ 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

@@ -0,0 +1,94 @@
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

@@ -0,0 +1,112 @@
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,6 +5,8 @@ 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
@@ -40,6 +42,26 @@ 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,6 +62,8 @@ 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

@@ -93,7 +93,7 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
}
public Boolean getLedControlEnabled() {
public Boolean isLedControlEnabled() {
return ledControlEnabled;
}

View File

@@ -4,6 +4,8 @@ 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;
@@ -80,6 +82,8 @@ 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();
@@ -112,7 +116,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.is80MHz);
ret.setChannelBandwidth(ChannelBandwidth.is40MHz);
ret.setRadioMode(RadioMode.modeAC);
} else {
ret.setChannelBandwidth(ChannelBandwidth.is20MHz);
@@ -362,9 +366,25 @@ 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() {
return (RfElementConfiguration) super.clone();
RfElementConfiguration ret = (RfElementConfiguration) super.clone();
if (autoExclusionChannels != null) {
ret.autoExclusionChannels = new TreeSet<>(autoExclusionChannels);
}
return ret;
}
@Override
@@ -409,7 +429,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);
rxCellSizeDb, autoCellSizeSelection, maxAutoCellSize, autoExclusionChannels);
}
@Override
@@ -439,7 +459,8 @@ 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(rxCellSizeDb, other.rxCellSizeDb)
&& Objects.equals(autoExclusionChannels, other.autoExclusionChannels);
}
}

View File

@@ -1,8 +1,16 @@
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;
@@ -56,4 +64,33 @@ 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));
}
}

View File

@@ -15,6 +15,9 @@ 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;
@@ -75,6 +78,8 @@ public class EquipmentConfigPushTrigger extends StreamProcessor {
private StatusServiceInterface statusServiceInterface;
@Autowired
private AlarmServiceInterface alarmServiceInterface;
@Autowired
private ClientServiceInterface clientServiceInterface;
@Override
protected boolean acceptMessage(QueuedStreamMessage message) {
@@ -264,6 +269,11 @@ 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);
@@ -275,10 +285,49 @@ 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.");
}
}
}

View File

@@ -114,10 +114,6 @@ 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++;
@@ -132,10 +128,6 @@ 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++;
@@ -150,10 +142,6 @@ 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++;
@@ -200,43 +188,18 @@ 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()));
@@ -336,9 +299,8 @@ 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,11 +15,8 @@ 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.
@@ -79,14 +76,8 @@ 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;
}
@@ -262,25 +253,6 @@ 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
//
@@ -404,31 +376,14 @@ 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, mcsStatsPerRadio, networkProbeMetrics, noiseFloorPerRadio,
cloudLinkAvailability, cloudLinkLatencyInMs, networkProbeMetrics, noiseFloorPerRadio,
periodLengthSec, radioStatsPerRadio, radioUtilizationPerRadio, radiusMetrics, rxBytesPerRadio,
tunnelMetrics, txBytesPerRadio, vlanSubnet, wmmQueuesPerRadio);
tunnelMetrics, txBytesPerRadio, vlanSubnet);
return result;
}
@@ -449,7 +404,6 @@ 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)
@@ -459,8 +413,7 @@ 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(wmmQueuesPerRadio, other.wmmQueuesPerRadio);
&& Objects.equals(vlanSubnet, other.vlanSubnet);
}
@Override
@@ -484,14 +437,6 @@ 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;
}
@@ -518,25 +463,6 @@ 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

@@ -1,160 +0,0 @@
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

@@ -1,91 +0,0 @@
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

@@ -1,161 +0,0 @@
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

@@ -1,245 +0,0 @@
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,10 +127,6 @@ 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);
@@ -144,10 +140,6 @@ 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);
@@ -161,10 +153,6 @@ 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);
@@ -209,43 +197,18 @@ 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);
}
@@ -338,7 +301,6 @@ 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,8 +56,7 @@ public class StatusDatastoreCassandra implements StatusDatastore {
private static final Set<String> columnsToSkipForUpdate = new HashSet<>(Arrays.asList(
"customerId",
"equipmentId",
"statusDataType",
"createdTimestamp"));
"statusDataType"));
private static final String TABLE_NAME = "status";
private static final String ALL_COLUMNS;
@@ -230,11 +229,14 @@ 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,
@@ -253,6 +255,9 @@ 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,6 +5,7 @@ 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

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

View File

@@ -0,0 +1,67 @@
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

@@ -0,0 +1,149 @@
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

@@ -101,6 +101,9 @@ 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

@@ -33,6 +33,7 @@ import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.core.server.cassandra.RowMapper;
import com.telecominfraproject.wlan.systemevent.datastore.SystemEventDatastore;
import com.telecominfraproject.wlan.systemevent.models.SystemEventRecord;
import com.telecominfraproject.wlan.systemevent.models.SystemEventStats;
/**
@@ -1031,4 +1032,9 @@ public class SystemEventDatastoreCassandra implements SystemEventDatastore {
return nextPagingState;
}
@Override
public SystemEventStats getSystemEventStats(String filterAttributeName, String filterAttributeValue, long fromTime, long toTime) {
return new SystemEventStats();
}
}

View File

@@ -3,6 +3,7 @@ package com.telecominfraproject.wlan.systemevent.datastore.inmemory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -20,8 +21,10 @@ import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.core.model.pagination.SortOrder;
import com.telecominfraproject.wlan.datastore.inmemory.BaseInMemoryDatastore;
import com.telecominfraproject.wlan.systemevent.datastore.SystemEventDatastore;
import com.telecominfraproject.wlan.systemevent.models.EquipmentEventStats;
import com.telecominfraproject.wlan.systemevent.models.SystemEventRecord;
import com.telecominfraproject.wlan.systemevent.models.SystemEventRecordKey;
import com.telecominfraproject.wlan.systemevent.models.SystemEventStats;
/**
* @author dtoptygin
@@ -228,4 +231,38 @@ public class SystemEventDatastoreInMemory extends BaseInMemoryDatastore implemen
return clientMacAddresses.contains(macAddress);
}
@Override
public SystemEventStats getSystemEventStats(String filterAttributeName, String filterAttributeValue, long fromTime, long toTime) {
List<SystemEventRecord> items = new LinkedList<>();
// apply filters and build the full result list first - inefficient, but ok for testing
for (SystemEventRecord mdl : idToSystemEventRecordMap.values()) {
if (mdl.getEventTimestamp() >= fromTime && mdl.getEventTimestamp() <= toTime) {
items.add(mdl);
}
}
SystemEventStats stats = new SystemEventStats();
stats.setTotalCount(items.size());
Map<String, EquipmentEventStats> eqptStatsMap = new HashMap<>();
for (SystemEventRecord mdl : items) {
EquipmentEventStats eqptStats = eqptStatsMap.get(Long.toString(mdl.getEquipmentId()));
if (eqptStats == null) {
eqptStats = new EquipmentEventStats();
eqptStats.setEquipmentId(mdl.getEquipmentId());
eqptStatsMap.put(Long.toString(mdl.getEquipmentId()), eqptStats);
}
eqptStats.setTotalCount(eqptStats.getTotalCount() + 1);
if (mdl.getEventTimestamp() > eqptStats.getLastEventTime()) {
eqptStats.setLastEventTime(mdl.getEventTimestamp());
}
items.add(mdl);
}
List<EquipmentEventStats> equipmentStats = new ArrayList<>();
stats.setEquipmentStats(equipmentStats);
return stats;
}
}

View File

@@ -8,6 +8,7 @@ import com.telecominfraproject.wlan.core.model.pagination.ColumnAndSort;
import com.telecominfraproject.wlan.core.model.pagination.PaginationContext;
import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.systemevent.models.SystemEventRecord;
import com.telecominfraproject.wlan.systemevent.models.SystemEventStats;
/**
* @author dtoptygin
@@ -60,4 +61,13 @@ public interface SystemEventDatastore {
List<ColumnAndSort> sortBy,
PaginationContext<SystemEventRecord> context);
/**
* @param filterAttributeName
* @param filterAttributeValue
* @param fromTime
* @param toTime
* @return Returns system event statistics for the given time range.
*/
SystemEventStats getSystemEventStats(String filterAttributeName, String filterAttributeValue, long fromTime, long toTime);
}

View File

@@ -20,12 +20,12 @@ public abstract class BaseDhcpEvent extends SystemEvent implements HasClientMac,
private InetAddress clientIp;
private InetAddress relayIp;
private MacAddress clientMacAddress;
private long sessionId; // association sessionid
private String sessionId; // association sessionid
private int customerId;
private long equipmentId;
private long locationId;
public BaseDhcpEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, long sessionId) {
public BaseDhcpEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, String sessionId) {
super(eventTimestamp);
this.customerId = customerId;
this.locationId = locationId;
@@ -113,11 +113,11 @@ public abstract class BaseDhcpEvent extends SystemEvent implements HasClientMac,
this.relayIp = relayIp;
}
public long getSessionId() {
public String getSessionId() {
return sessionId;
}
public void setSessionId(long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -22,12 +22,12 @@ public class DhcpAckEvent extends BaseDhcpEvent {
*/
private boolean fromInternal = false;
public DhcpAckEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, long sessionId) {
public DhcpAckEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, String sessionId) {
super(customerId, locationId, equipmentId, eventTimestamp, sessionId);
}
public DhcpAckEvent() {
super(0, 0L,0L,0L,0L);
super(0, 0L,0L,0L,"0");
}
public InetAddress getGatewayIp() {

View File

@@ -10,12 +10,12 @@ package com.telecominfraproject.wlan.systemevent.equipment;
public class DhcpDeclineEvent extends BaseDhcpEvent {
private static final long serialVersionUID = -7745659083975485467L;
public DhcpDeclineEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, long sessionId){
public DhcpDeclineEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, String sessionId){
super(customerId, locationId, equipmentId,eventTimestamp, sessionId);
}
public DhcpDeclineEvent() {
super(0,0L, 0L,0L,0L);
super(0,0L, 0L,0L,"0");
}
@Override

View File

@@ -9,12 +9,12 @@ public class DhcpDiscoverEvent extends BaseDhcpEvent {
private static final long serialVersionUID = -8290687227649478971L;
private String hostName;
public DhcpDiscoverEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, long sessionId){
public DhcpDiscoverEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, String sessionId){
super(customerId, locationId,equipmentId,eventTimestamp,sessionId);
}
public DhcpDiscoverEvent() {
super(0, 0L,0L,0L,0L);
super(0, 0L,0L,0L,"0");
}
/**

View File

@@ -10,12 +10,12 @@ package com.telecominfraproject.wlan.systemevent.equipment;
public class DhcpInformEvent extends BaseDhcpEvent {
private static final long serialVersionUID = 7053813308222200205L;
public DhcpInformEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, long sessionId){
public DhcpInformEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, String sessionId){
super(customerId, locationId,equipmentId,eventTimestamp, sessionId);
}
public DhcpInformEvent() {
super(0, 0L,0L,0L,0L);
super(0, 0L,0L,0L,"0");
}
@Override

View File

@@ -9,12 +9,12 @@ public class DhcpNakEvent extends BaseDhcpEvent {
private static final long serialVersionUID = -8648265834227002667L;
private boolean fromInternal = false;
public DhcpNakEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, long sessionId) {
public DhcpNakEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, String sessionId) {
super(customerId, locationId, equipmentId, eventTimestamp, sessionId);
}
public DhcpNakEvent() {
super(0, 0L,0L,0L,0L);
super(0, 0L,0L,0L,"0");
}
/**

View File

@@ -10,12 +10,12 @@ public class DhcpOfferEvent extends BaseDhcpEvent {
*/
private boolean fromInternal = false;
public DhcpOfferEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, long sessionId) {
public DhcpOfferEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, String sessionId) {
super(customerId, locationId, equipmentId, eventTimestamp, sessionId);
}
public DhcpOfferEvent() {
super(0, 0L,0L,0L,0L);
super(0, 0L,0L,0L,"0");
}
/**

View File

@@ -9,12 +9,12 @@ public class DhcpRequestEvent extends BaseDhcpEvent {
private static final long serialVersionUID = 906425685437156761L;
private String hostName;
public DhcpRequestEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, long sessionId){
public DhcpRequestEvent(int customerId, long locationId, long equipmentId, long eventTimestamp, String sessionId){
super(customerId, locationId,equipmentId,eventTimestamp, sessionId);
}
public DhcpRequestEvent() {
super(0, 0L,0L,0L,0L);
super(0, 0L,0L,0L,"0");
}
/**

View File

@@ -28,7 +28,7 @@ public abstract class RealTimeSipCallEventWithStats extends RealTimeEvent
private static final long serialVersionUID = -8908272967317508366L;
private Long sipCallId;
private Long associationId;
private String associationId;
private MacAddress clientMacAddress;
private List<RtpFlowStats> statuses;
private int channel;
@@ -49,12 +49,12 @@ public abstract class RealTimeSipCallEventWithStats extends RealTimeEvent
this.sipCallId = sipCallId;
}
public Long getAssociationId() {
public String getAssociationId() {
return associationId;
}
public void setAssociationId(Long associationId) {
this.associationId = associationId;
public void setAssociationId(String string) {
this.associationId = string;
}
@Override
@@ -79,7 +79,7 @@ public abstract class RealTimeSipCallEventWithStats extends RealTimeEvent
}
public boolean hasValidAssociationId() {
return (associationId != null) && (associationId != 0);
return (associationId != null) && (!associationId.equals("0"));
}
public int getChannel() {

View File

@@ -18,7 +18,7 @@ public class RealTimeSipCallStartEvent extends RealTimeEvent
*/
private static final long serialVersionUID = -7289926906539107435L;
private Long sipCallId;
private Long associationId;
private String associationId;
private MacAddress macAddress;
private List<String> codecs;
private String providerDomain;
@@ -52,7 +52,7 @@ public class RealTimeSipCallStartEvent extends RealTimeEvent
&& Objects.equals(channel, other.channel) && Objects.equals(radioType, other.radioType);
}
public Long getAssociationId() {
public String getAssociationId() {
return associationId;
}
@@ -92,7 +92,7 @@ public class RealTimeSipCallStartEvent extends RealTimeEvent
return result;
}
public void setAssociationId(Long associationId) {
public void setAssociationId(String associationId) {
this.associationId = associationId;
}
@@ -131,7 +131,7 @@ public class RealTimeSipCallStartEvent extends RealTimeEvent
}
public boolean hasValidAssociationId() {
return (associationId != null) && (associationId != 0);
return (associationId != null) && (!associationId.equals("0"));
}
public int getChannel() {

View File

@@ -13,8 +13,8 @@ public class RealTimeStreamingStartEvent extends RealTimeEvent
implements HasCustomerId, HasEquipmentId, HasClientMac, HasProducedTimestamp {
private static final long serialVersionUID = -591221857158333271L;
private Long videoSessionId;
private Long sessionId;
private String videoSessionId;
private String sessionId;
private MacAddress clientMac;
private InetAddress serverIp;
private String serverDnsName;
@@ -40,19 +40,19 @@ public class RealTimeStreamingStartEvent extends RealTimeEvent
this.serverDnsName = serverDnsName;
}
public Long getVideoSessionId() {
public String getVideoSessionId() {
return videoSessionId;
}
public void setVideoSessionId(Long videoSessionId) {
public void setVideoSessionId(String videoSessionId) {
this.videoSessionId = videoSessionId;
}
public Long getSessionId() {
public String getSessionId() {
return sessionId;
}
public void setSessionId(Long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -13,8 +13,8 @@ public class RealTimeStreamingStartSessionEvent extends RealTimeEvent
implements HasCustomerId, HasEquipmentId, HasClientMac, HasProducedTimestamp {
private static final long serialVersionUID = 4395850344272425198L;
private Long videoSessionId;
private Long sessionId;
private String videoSessionId;
private String sessionId;
private MacAddress clientMac;
private InetAddress serverIp;
private StreamingVideoType type;
@@ -31,19 +31,19 @@ public class RealTimeStreamingStartSessionEvent extends RealTimeEvent
super(RealTimeEventType.VideoStreamDebugStart, customerId, locationId, equipmentId, eventTimestamp);
}
public Long getVideoSessionId() {
public String getVideoSessionId() {
return videoSessionId;
}
public void setVideoSessionId(Long videoSessionId) {
public void setVideoSessionId(String videoSessionId) {
this.videoSessionId = videoSessionId;
}
public Long getSessionId() {
public String getSessionId() {
return sessionId;
}
public void setSessionId(Long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -13,8 +13,8 @@ public class RealTimeStreamingStopEvent extends RealTimeEvent
implements HasCustomerId, HasEquipmentId, HasClientMac, HasProducedTimestamp {
private static final long serialVersionUID = 6433913573274597688L;
private Long videoSessionId;
private Long sessionId;
private String videoSessionId;
private String sessionId;
private MacAddress clientMac;
private InetAddress serverIp;
private Long totalBytes;
@@ -33,19 +33,19 @@ public class RealTimeStreamingStopEvent extends RealTimeEvent
super(RealTimeEventType.VideoStreamStop, customerId, locationId, equipmentId, eventTimestamp);
}
public Long getVideoSessionId() {
public String getVideoSessionId() {
return videoSessionId;
}
public void setVideoSessionId(Long videoSessionId) {
public void setVideoSessionId(String videoSessionId) {
this.videoSessionId = videoSessionId;
}
public Long getSessionId() {
public String getSessionId() {
return sessionId;
}
public void setSessionId(Long sessionId) {
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}

View File

@@ -0,0 +1,58 @@
package com.telecominfraproject.wlan.systemevent.models;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
/**
* Total and per-oui/equipment/radio counts of the Client Sessions
*/
public class EquipmentEventStats extends BaseJsonModel {
private static final long serialVersionUID = 6630012772286577077L;
/**
* The equipment ID.
*/
private long equipmentId;
/**
* Count of system events for the equipment.
*/
private long totalCount;
/**
* Last event time.
*/
private long lastEventTime;
public long getEquipmentId() {
return equipmentId;
}
public void setEquipmentId(long equipmentId) {
this.equipmentId = equipmentId;
}
public long getTotalCount() {
return totalCount;
}
public void setTotalCount(long totalCount) {
this.totalCount = totalCount;
}
public long getLastEventTime() {
return lastEventTime;
}
public void setLastEventTime(long lastEventTime) {
this.lastEventTime = lastEventTime;
}
@Override
public EquipmentEventStats clone() {
EquipmentEventStats ret = (EquipmentEventStats) super.clone();
return ret;
}
}

View File

@@ -0,0 +1,51 @@
package com.telecominfraproject.wlan.systemevent.models;
import java.util.ArrayList;
import java.util.List;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
/**
* Total and per equipment counts of the System Events
*/
public class SystemEventStats extends BaseJsonModel {
private static final long serialVersionUID = 6630012772286577077L;
/**
* Total count of all system events.
*/
private long totalCount;
/**
* Counts of system events per equipment Id.
*/
private List<EquipmentEventStats> equipmentStats = new ArrayList<>();
public long getTotalCount() {
return totalCount;
}
public void setTotalCount(long totalCount) {
this.totalCount = totalCount;
}
public List<EquipmentEventStats> getEquipmentStats() {
return equipmentStats;
}
public void setEquipmentStats(List<EquipmentEventStats> equipmentStats) {
this.equipmentStats = equipmentStats;
}
@Override
public SystemEventStats clone() {
SystemEventStats ret = (SystemEventStats) super.clone();
if (equipmentStats != null) {
ret.equipmentStats = new ArrayList<>(equipmentStats);
}
return ret;
}
}

View File

@@ -9,6 +9,7 @@ import com.telecominfraproject.wlan.core.model.pagination.ColumnAndSort;
import com.telecominfraproject.wlan.core.model.pagination.PaginationContext;
import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.systemevent.models.SystemEventRecord;
import com.telecominfraproject.wlan.systemevent.models.SystemEventStats;
/**
@@ -70,4 +71,13 @@ public interface SystemEventServiceInterface {
return getForCustomer(fromTime, toTime, customerId, null, equipmentIds, null, dataTypes, sortBy, context);
}
/**
* @param filterAttributeName
* @param filterAttributeValue
* @param fromTime
* @param toTime
* @return Returns system event statistics for the given time range.
*/
SystemEventStats getSystemEventStats(String filterAttributeName, String filterAttributeValue, long fromTime, long toTime);
}

View File

@@ -15,6 +15,7 @@ import com.telecominfraproject.wlan.core.model.pagination.PaginationContext;
import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.systemevent.controller.SystemEventController;
import com.telecominfraproject.wlan.systemevent.models.SystemEventRecord;
import com.telecominfraproject.wlan.systemevent.models.SystemEventStats;
/**
* @author dtoptygin
@@ -56,11 +57,17 @@ public class SystemEventServiceLocal implements SystemEventServiceInterface {
Set<Long> locationIds, Set<Long> equipmentIds, Set<MacAddress> clientMacAdresses, Set<String> dataTypes, List<ColumnAndSort> sortBy,
PaginationContext<SystemEventRecord> context) {
LOG.debug("calling serviceMetricController.getForCustomer {} {} {} ", fromTime, toTime, customerId);
LOG.debug("calling systemEventController.getForCustomer {} {} {} ", fromTime, toTime, customerId);
return systemEventController.getForCustomer(fromTime, toTime, customerId,
locationIds, equipmentIds, clientMacAdresses, dataTypes, sortBy, context);
}
@Override
public SystemEventStats getSystemEventStats(String filterAttributeName, String filterAttributeValue, long fromTime, long toTime) {
LOG.debug("calling systemEventController.getSystemEventStats {} {} {} {}", filterAttributeName, filterAttributeValue, fromTime, toTime);
return systemEventController.getSystemEventStats(filterAttributeName, filterAttributeValue, fromTime, toTime);
}
}

View File

@@ -20,6 +20,7 @@ import com.telecominfraproject.wlan.core.model.pagination.PaginationContext;
import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.datastore.exceptions.DsDataValidationException;
import com.telecominfraproject.wlan.systemevent.models.SystemEventRecord;
import com.telecominfraproject.wlan.systemevent.models.SystemEventStats;
/**
* @author dtoptygin
@@ -175,5 +176,22 @@ public class SystemEventServiceRemote extends BaseRemoteClient implements System
return baseUrl;
}
@Override
public SystemEventStats getSystemEventStats(String filterAttributeName, String filterAttributeValue, long fromTime, long toTime) {
LOG.debug("calling getSystemEventStats( {}, {}, {}, {} )", filterAttributeName, filterAttributeValue, fromTime, toTime);
try {
ResponseEntity<SystemEventStats> responseEntity = restTemplate.exchange(getBaseUrl() +
"/stats?filterAttributeName={filterAttributeName}&filterAttributeValue={filterAttributeValue}&fromTime={fromTime}&toTime={toTime}",
HttpMethod.GET, null, SystemEventStats.class, filterAttributeName, filterAttributeValue, fromTime, toTime);
SystemEventStats result = responseEntity.getBody();
LOG.debug("getSessionCounts({}, {}, {}, {}) returns {} ", filterAttributeName, filterAttributeValue, fromTime, toTime, result);
return result;
} catch (Exception exp) {
LOG.error("getSessionCounts({}, {}, {}, {}) exception ", filterAttributeName, filterAttributeValue, fromTime, toTime, exp);
throw exp;
}
}
}

View File

@@ -7,6 +7,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@@ -22,6 +23,7 @@ import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.datastore.exceptions.DsDataValidationException;
import com.telecominfraproject.wlan.systemevent.datastore.SystemEventDatastore;
import com.telecominfraproject.wlan.systemevent.models.SystemEventRecord;
import com.telecominfraproject.wlan.systemevent.models.SystemEventStats;
/**
@@ -141,7 +143,6 @@ public class SystemEventController {
return ret;
}
/**
* Deletes SystemEventRecord records
*
@@ -173,5 +174,23 @@ public class SystemEventController {
return new GenericResponse(true, "");
}
/**
* @param filterAttributeName
* @param filterAttributeValue
* @param fromTime
* @param toTime
* @return Returns system event statistics for the given time range.
*/
@GetMapping("/stats")
public SystemEventStats getSystemEventStats(
@RequestParam String filterAttributeName,
@RequestParam String filterAttributeValue,
@RequestParam long fromTime,
@RequestParam long toTime) {
SystemEventStats ret = systemEventDatastore.getSystemEventStats(filterAttributeName, filterAttributeValue, fromTime, toTime);
LOG.debug("getSystemEventStats({},{},{},{}) {}", filterAttributeName, filterAttributeName, fromTime, toTime, ret);
return ret;
}
}

View File

@@ -679,8 +679,7 @@ components:
clientMacAddress:
$ref: '#/components/schemas/MacAddress'
sessionId:
type: integer
format: int64
type: string
customerId:
type: integer
format: int32
@@ -776,8 +775,7 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
sessionId:
type: integer
format: int64
type: string
ssid:
type: string
clientMacAddress:
@@ -808,8 +806,7 @@ components:
clientMacAddress:
$ref: '#/components/schemas/MacAddress'
sessionId:
type: integer
format: int64
type: string
radioType:
$ref: '#/components/schemas/RadioType'
isReassociation:
@@ -861,8 +858,7 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
sessionId:
type: integer
format: int64
type: string
ssid:
type: string
clientMacAddress:
@@ -877,8 +873,7 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
sessionId:
type: integer
format: int64
type: string
macAddressBytes:
type: array
items:
@@ -901,8 +896,7 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
sessionId:
type: integer
format: int64
type: string
clientMacAddress:
$ref: '#/components/schemas/MacAddress'
lastRecvTime:
@@ -919,8 +913,7 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
sessionId:
type: integer
format: int64
type: string
ssid:
type: string
clientMacAddress:
@@ -951,8 +944,7 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
sessionId:
type: integer
format: int64
type: string
ssid:
type: string
clientMacAddress:
@@ -988,8 +980,7 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
sessionId:
type: integer
format: int64
type: string
clientMacAddress:
$ref: '#/components/schemas/MacAddress'
firstDataRcvdTs:
@@ -1004,8 +995,7 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
sessionId:
type: integer
format: int64
type: string
clientMacAddress:
$ref: '#/components/schemas/MacAddress'
ipAddr:
@@ -1078,8 +1068,7 @@ components:
type: integer
format: int64
associationId:
type: integer
format: int64
type: string
clientMacAddress:
$ref: '#/components/schemas/MacAddress'
radioType:
@@ -1121,8 +1110,7 @@ components:
type: integer
format: int64
associationId:
type: integer
format: int64
type: string
macAddress:
$ref: '#/components/schemas/MacAddress'
radioType:
@@ -1161,11 +1149,9 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
videoSessionId:
type: integer
format: int64
type: string
sessionId:
type: integer
format: int64
type: string
clientMac:
$ref: '#/components/schemas/MacAddress'
serverIp:
@@ -1181,11 +1167,9 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
videoSessionId:
type: integer
format: int64
type: string
sessionId:
type: integer
format: int64
type: string
clientMac:
$ref: '#/components/schemas/MacAddress'
serverIp:
@@ -1199,11 +1183,9 @@ components:
allOf:
$ref: '#/components/schemas/RealTimeEvent'
videoSessionId:
type: integer
format: int64
type: string
sessionId:
type: integer
format: int64
type: string
clientMac:
$ref: '#/components/schemas/MacAddress'
serverIp:
@@ -1569,8 +1551,7 @@ components:
type: object
properties:
sessionId:
type: integer
format: int64
type: string
authTimestamp:
type: integer
format: int64
@@ -1657,8 +1638,7 @@ components:
steerType:
$ref: '#/components/schemas/SteerType'
previousValidSessionId:
type: integer
format: int64
type: string
lastFailureDetails:
$ref: '#/components/schemas/ClientFailureDetails'
firstFailureDetails:
@@ -1673,8 +1653,7 @@ components:
type: integer
format: int32
priorSessionId:
type: integer
format: int64
type: string
priorEquipmentId:
type: integer
format: int64
@@ -2436,8 +2415,6 @@ components:
example:
customerId: 2
username: new_user
password: pwd
role: CustomerIT
PortalUserRole:
type: string