mirror of
https://github.com/Telecominfraproject/wlan-cloud-services.git
synced 2026-03-20 21:39:21 +00:00
Compare commits
168 Commits
fixBugs
...
release/v1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df522d58ee | ||
|
|
2f791e1364 | ||
|
|
a792c602df | ||
|
|
0bfdfc2d56 | ||
|
|
f64816dbbe | ||
|
|
f87600d283 | ||
|
|
9d19a6c436 | ||
|
|
eb19907513 | ||
|
|
1502913097 | ||
|
|
27e7c0173a | ||
|
|
051458b9d4 | ||
|
|
d98d5a2ad3 | ||
|
|
dda25eac2e | ||
|
|
c8c3e85a55 | ||
|
|
d5df9485f6 | ||
|
|
83e4f3613a | ||
|
|
aa77c4a2d5 | ||
|
|
3a4561b323 | ||
|
|
7abc4c8554 | ||
|
|
34bec5009a | ||
|
|
824568a128 | ||
|
|
5211ed7e68 | ||
|
|
1bffb4f96a | ||
|
|
fa77d3896d | ||
|
|
55c4671211 | ||
|
|
a540274210 | ||
|
|
56f43d8e7f | ||
|
|
607c1c815e | ||
|
|
f750d0cad2 | ||
|
|
1551babca2 | ||
|
|
70bd1f5eda | ||
|
|
88fa6ca8a5 | ||
|
|
e090bd6b00 | ||
|
|
aa1fbfd645 | ||
|
|
9ee24beb64 | ||
|
|
95a07188d5 | ||
|
|
6839ff3e97 | ||
|
|
299f59767e | ||
|
|
936aeae135 | ||
|
|
5b3d05bc21 | ||
|
|
ee3c62559a | ||
|
|
d3bb9f6e51 | ||
|
|
a1ebf265f9 | ||
|
|
64b1432251 | ||
|
|
ccb7680933 | ||
|
|
e74570121c | ||
|
|
b4b697376c | ||
|
|
b57fb2dd4f | ||
|
|
d25c1d6167 | ||
|
|
57c2d7d6f4 | ||
|
|
faf0a3a385 | ||
|
|
a7a836440e | ||
|
|
999e597493 | ||
|
|
5f4ed530fe | ||
|
|
0dca8bb943 | ||
|
|
c8c7217d38 | ||
|
|
b41e35a536 | ||
|
|
64bd468ade | ||
|
|
fe488e9d5f | ||
|
|
a79778b083 | ||
|
|
d5b86d0c8d | ||
|
|
15698e99cb | ||
|
|
e06c28e85a | ||
|
|
c307f59e8a | ||
|
|
1e23a691d7 | ||
|
|
015e662e68 | ||
|
|
9f3af6773b | ||
|
|
b7eedf6b8c | ||
|
|
468e7bcddb | ||
|
|
9b712d6fb5 | ||
|
|
99475d3f2f | ||
|
|
7216b08ac7 | ||
|
|
34da98b9a8 | ||
|
|
65aeadeaa7 | ||
|
|
148a6762dc | ||
|
|
178378f8b6 | ||
|
|
d0e6866345 | ||
|
|
a2b3e711ea | ||
|
|
b5f5c6d19f | ||
|
|
a5079d04a7 | ||
|
|
35d89a1cf0 | ||
|
|
534ed3e9c0 | ||
|
|
a6ec1d6e7f | ||
|
|
a19fc425c2 | ||
|
|
fc8cab6a50 | ||
|
|
daabf38510 | ||
|
|
78c4d3a862 | ||
|
|
3f3e40d2dd | ||
|
|
91877f5305 | ||
|
|
11314e3395 | ||
|
|
fa6795369c | ||
|
|
e6e06d7b70 | ||
|
|
1e15e3cd94 | ||
|
|
02e03780db | ||
|
|
aac34150b2 | ||
|
|
3085c34cde | ||
|
|
35fd038113 | ||
|
|
7c387f1940 | ||
|
|
abb9b59659 | ||
|
|
7f0497754c | ||
|
|
82095510f7 | ||
|
|
0afd414870 | ||
|
|
772beab902 | ||
|
|
4a764db007 | ||
|
|
41add1922b | ||
|
|
90ac57b988 | ||
|
|
0cc90764c6 | ||
|
|
1e277f5650 | ||
|
|
716ba7e043 | ||
|
|
3d2f4db32a | ||
|
|
c75d44ff03 | ||
|
|
f9dbe12c8c | ||
|
|
910a2cbe0c | ||
|
|
799b243cc4 | ||
|
|
8834c33d90 | ||
|
|
e9c54a892b | ||
|
|
8353dd375f | ||
|
|
46de84b28b | ||
|
|
9edca1fd9d | ||
|
|
5714c9bf32 | ||
|
|
2b2e34a064 | ||
|
|
d7a75faf4c | ||
|
|
5fd977f064 | ||
|
|
bafec1fdd8 | ||
|
|
6b046e0a7a | ||
|
|
fb6604cdf5 | ||
|
|
2c1c60344e | ||
|
|
9e959e258f | ||
|
|
2410233046 | ||
|
|
a7f91a29f8 | ||
|
|
80cd0abd58 | ||
|
|
4555ff339b | ||
|
|
04a13877d1 | ||
|
|
e148bab291 | ||
|
|
9ad3cec4af | ||
|
|
dc0b838f83 | ||
|
|
7cac7fff3f | ||
|
|
b48340b709 | ||
|
|
44b3836758 | ||
|
|
4f0b032549 | ||
|
|
5ba0c4c242 | ||
|
|
304e80332a | ||
|
|
9fd3e73398 | ||
|
|
b9db744aee | ||
|
|
1eee65d284 | ||
|
|
75c943211a | ||
|
|
d0a0ed59fe | ||
|
|
a200fcc12e | ||
|
|
1f6996abb2 | ||
|
|
1ebaa4a539 | ||
|
|
f1e1bdffd7 | ||
|
|
37f5872552 | ||
|
|
367b9ec428 | ||
|
|
87ca619ad5 | ||
|
|
622f78f681 | ||
|
|
faeb65d8d6 | ||
|
|
34841a3a04 | ||
|
|
4fc8bc4018 | ||
|
|
cce36019fe | ||
|
|
4596280090 | ||
|
|
caaa8fb4e3 | ||
|
|
b957c8bf72 | ||
|
|
b797cc392f | ||
|
|
5fc9715649 | ||
|
|
0a66897e48 | ||
|
|
8d77fcb090 | ||
|
|
256d9fbd16 | ||
|
|
39e14da2e6 |
@@ -121,6 +121,10 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
|
||||
" from " + TABLE_NAME + " " +
|
||||
" where customerId = ? ";
|
||||
|
||||
private static final String CQL_GET_ALL =
|
||||
"select " + ALL_COLUMNS +
|
||||
" from " + TABLE_NAME + " ";
|
||||
|
||||
private static final String CQL_GET_LASTMOD_BY_ID =
|
||||
"select lastModifiedTimestamp " +
|
||||
" from "+TABLE_NAME+" " +
|
||||
@@ -791,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:
|
||||
@@ -922,4 +929,51 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
|
||||
return alarmCounts;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Alarm> get(Set<AlarmCode> alarmCodes, long createdAfterTimestamp) {
|
||||
|
||||
if (alarmCodes == null || alarmCodes.isEmpty()) {
|
||||
throw new IllegalArgumentException("alarmCodes must be provided");
|
||||
}
|
||||
|
||||
LOG.debug("Looking up Alarms for alarmCodes {} createdAfter {}", alarmCodes, createdAfterTimestamp);
|
||||
|
||||
String query = CQL_GET_ALL;
|
||||
|
||||
// add filters for the query
|
||||
ArrayList<Object> queryArgs = new ArrayList<>();
|
||||
|
||||
// add alarmCodes filters
|
||||
alarmCodes.forEach(ac -> queryArgs.add(ac.getId()));
|
||||
|
||||
StringBuilder strb = new StringBuilder(100);
|
||||
strb.append("where alarmCode in (");
|
||||
for (int i = 0; i < alarmCodes.size(); i++) {
|
||||
strb.append("?");
|
||||
if (i < alarmCodes.size() - 1) {
|
||||
strb.append(",");
|
||||
}
|
||||
}
|
||||
strb.append(") ");
|
||||
|
||||
if (createdAfterTimestamp > 0) {
|
||||
strb.append(" and createdTimestamp > ?");
|
||||
queryArgs.add(createdAfterTimestamp);
|
||||
}
|
||||
strb.append(" allow filtering");
|
||||
query += strb.toString();
|
||||
|
||||
List<Alarm> ret = new ArrayList<>();
|
||||
|
||||
PreparedStatement preparedStmt_getListForCustomer = cqlSession.prepare(query);
|
||||
|
||||
ResultSet rs = cqlSession.execute(preparedStmt_getListForCustomer.bind(queryArgs.toArray()));
|
||||
|
||||
rs.forEach(row -> ret.add(alarmRowMapper.mapRow(row)));
|
||||
|
||||
LOG.debug("Found {} Alarms for alarmCodes {} createdAfter {}", ret.size(), alarmCodes, createdAfterTimestamp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -356,4 +356,25 @@ public class AlarmDatastoreInMemory extends BaseInMemoryDatastore implements Ala
|
||||
|
||||
return alarmCounts;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<Alarm> get(Set<AlarmCode> alarmCodeSet, long createdAfterTimestamp) {
|
||||
|
||||
if (alarmCodeSet == null || alarmCodeSet.isEmpty()) {
|
||||
throw new IllegalArgumentException("alarmCodeSet must be provided");
|
||||
}
|
||||
|
||||
List<Alarm> ret = new ArrayList<>();
|
||||
|
||||
idToAlarmMap.values().forEach(a -> {
|
||||
if (alarmCodeSet.contains(a.getAlarmCode()) && a.getCreatedTimestamp() > createdAfterTimestamp) {
|
||||
ret.add(a.clone());
|
||||
}
|
||||
});
|
||||
|
||||
LOG.debug("Found Alarms {}", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,4 +71,14 @@ public interface AlarmDatastore {
|
||||
*/
|
||||
AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged);
|
||||
|
||||
/**
|
||||
* Retrieves a list of Alarms for the given alarm codes.
|
||||
*
|
||||
* @param alarmCodeSet - null or empty means include all alarm codes
|
||||
* @param createdAfterTimestamp
|
||||
* @return list of matching Alarm objects.
|
||||
* @throws IllegalArgumentException if supplied alarmCodeSet is null or empty
|
||||
*/
|
||||
List<Alarm> get(Set<AlarmCode> alarmCodeSet, long createdAfterTimestamp);
|
||||
|
||||
}
|
||||
|
||||
@@ -48,16 +48,16 @@ public class AlarmCode implements EnumWithId {
|
||||
private static final Map<Integer, AlarmCode> ELEMENTS = new ConcurrentHashMap<>();
|
||||
private static final Map<String, AlarmCode> ELEMENTS_BY_NAME = new ConcurrentHashMap<>();
|
||||
private static final Map<Integer, AlarmCode> VALID_VALUES = new ConcurrentHashMap<>();
|
||||
|
||||
private static final Map<Integer, AlarmCode> USER_VISIBLE_VALUES = new ConcurrentHashMap<>();
|
||||
|
||||
public static final AlarmCode
|
||||
LimitedCloudConnectivity = new AlarmCode(3, "LimitedCloudConnectivity", "Equipment is connected, however it's not reporting status or metrics", StatusCode.error, "Service AP and verify networking path to cloud"),
|
||||
AccessPointIsUnreachable = new AlarmCode(4, "AccessPointIsUnreachable", "Equipment is not reachable from cloud", StatusCode.error, "Service AP and verify networking path to cloud"),
|
||||
NoMetricsReceived = new AlarmCode(6, "NoMetricsReceived", "Metrics are not received from the equipment"),
|
||||
NoiseFloor2G = new AlarmCode(7, "NoiseFloor2G", "Noise floor is too high on 2G radio", StatusCode.requiresAttention, "Investigate interference sources"),
|
||||
ChannelUtilization2G = new AlarmCode(8, "ChannelUtilization2G", "Channel utilization is too high on 2G radio", StatusCode.requiresAttention, "Consider adding more APs"),
|
||||
NoiseFloor5G = new AlarmCode(9, "NoiseFloor5G", "Noise floor is too high on 5G radio", StatusCode.requiresAttention, "Investigate interference sources"),
|
||||
ChannelUtilization5G = new AlarmCode(10, "ChannelUtilization5G", "Channel utilization is too high on 5G radio", StatusCode.requiresAttention, "Consider adding more APs"),
|
||||
NoMetricsReceived = new AlarmCode(6, "NoMetricsReceived", "Metrics are not received from the equipment", true),
|
||||
NoiseFloor2G = new AlarmCode(7, "NoiseFloor2G", "Noise floor is too high on 2G radio", StatusCode.requiresAttention, "Investigate interference sources", true),
|
||||
ChannelUtilization2G = new AlarmCode(8, "ChannelUtilization2G", "Channel utilization is too high on 2G radio", StatusCode.requiresAttention, "Consider adding more APs", true),
|
||||
NoiseFloor5G = new AlarmCode(9, "NoiseFloor5G", "Noise floor is too high on 5G radio", StatusCode.requiresAttention, "Investigate interference sources", true),
|
||||
ChannelUtilization5G = new AlarmCode(10, "ChannelUtilization5G", "Channel utilization is too high on 5G radio", StatusCode.requiresAttention, "Consider adding more APs", true),
|
||||
DNS = new AlarmCode(11, "DNS", "Issue with Domain Name System (DNS)", StatusCode.error, "Service DNS server and network path"),
|
||||
DNSLatency = new AlarmCode(12, "DNSLatency", "DNS query takes too long", StatusCode.requiresAttention, "Service DNS server and network path"),
|
||||
DHCP = new AlarmCode(13, "DHCP", "Issue with DHCP", StatusCode.error, "Service DHCP server and network path"),
|
||||
@@ -66,10 +66,10 @@ public class AlarmCode implements EnumWithId {
|
||||
RadiusLatency = new AlarmCode(16, "RadiusLatency", "RADIUS request takes too long", StatusCode.requiresAttention, "Service RADIUS server and network path"),
|
||||
CloudLink = new AlarmCode(17, "CloudLink", "Issue reported by equipment with connection with Cloud", StatusCode.error, "Investigate networking path to Cloud"),
|
||||
CloudLinkLatency = new AlarmCode(18, "CloudLinkLatency", "Cloud request take too long", StatusCode.requiresAttention, "Investigate networking path to Cloud"),
|
||||
CPUUtilization = new AlarmCode(19, "CPUUtilization", "CPU utilization is too high", StatusCode.requiresAttention, "Contact Tech Suport"),
|
||||
MemoryUtilization = new AlarmCode(20, "MemoryUtilization", "Memory utilization is too high", StatusCode.requiresAttention, "Contact Tech Suport"),
|
||||
Disconnected = new AlarmCode(22, "Disconnected", "Equipment is not connected to the cloud", StatusCode.error, "Service AP and verify networking path to cloud"),
|
||||
CPUTemperature = new AlarmCode(23, "CPUTemperature", "CPU Temperature is too high", StatusCode.requiresAttention, "Verify AP location"),
|
||||
CPUUtilization = new AlarmCode(19, "CPUUtilization", "CPU utilization is too high", StatusCode.requiresAttention, "Contact Tech Suport", true),
|
||||
MemoryUtilization = new AlarmCode(20, "MemoryUtilization", "Memory utilization is too high", StatusCode.requiresAttention, "Contact Tech Suport", true),
|
||||
Disconnected = new AlarmCode(22, "Disconnected", "Equipment is not connected to the cloud", StatusCode.error, "Service AP and verify networking path to cloud", true),
|
||||
CPUTemperature = new AlarmCode(23, "CPUTemperature", "CPU Temperature is too high", StatusCode.requiresAttention, "Verify AP location", true),
|
||||
LowMemoryReboot = new AlarmCode(25, "LowMemoryReboot", "Equipment rebooted due to low memory"),
|
||||
CountryCodeMisMatch = new AlarmCode(26, "CountryCodeMisMatch", "Equipment country code does not match with location", StatusCode.error, "Service AP"),
|
||||
HardwareIssueDiagnostic = new AlarmCode(29, "HardwareIssueDiagnostic", "Hardware issue encountered on equipment", StatusCode.error, "Reboot AP and contact tech support for RMA"),
|
||||
@@ -131,17 +131,29 @@ public class AlarmCode implements EnumWithId {
|
||||
private final StatusCode severity;
|
||||
private final String recommendedAction;
|
||||
private final AlarmCategory category;
|
||||
private final boolean propagateFast;
|
||||
private final boolean propagateFast;
|
||||
private final boolean userVisible;
|
||||
|
||||
protected AlarmCode(int id, String name, String description){
|
||||
this(id, name, description, StatusCode.error, "", AlarmCategory.CustomerNetworkAffecting, false);
|
||||
this(id, name, description, StatusCode.error, "", AlarmCategory.CustomerNetworkAffecting, false, false);
|
||||
}
|
||||
|
||||
protected AlarmCode(int id, String name, String description, boolean userVisible){
|
||||
|
||||
this(id, name, description, StatusCode.error, "", AlarmCategory.CustomerNetworkAffecting, false, userVisible);
|
||||
|
||||
}
|
||||
|
||||
protected AlarmCode(int id, String name, String description, StatusCode severity, String recommendedAction){
|
||||
this(id, name, description, severity, recommendedAction, AlarmCategory.CustomerNetworkAffecting, false);
|
||||
this(id, name, description, severity, recommendedAction, AlarmCategory.CustomerNetworkAffecting, false, false);
|
||||
}
|
||||
|
||||
protected AlarmCode(int id, String name, String description, StatusCode severity, String recommendedAction, boolean userVisible){
|
||||
this(id, name, description, severity, recommendedAction, AlarmCategory.CustomerNetworkAffecting, false, userVisible);
|
||||
}
|
||||
|
||||
protected AlarmCode(int id, String name, String description, StatusCode severity, String recommendedAction, AlarmCategory category, boolean propagateFast){
|
||||
protected AlarmCode(int id, String name, String description, StatusCode severity, String recommendedAction,
|
||||
AlarmCategory category, boolean propagateFast, boolean userVisible){
|
||||
|
||||
synchronized(lock) {
|
||||
|
||||
@@ -154,6 +166,7 @@ public class AlarmCode implements EnumWithId {
|
||||
this.recommendedAction = recommendedAction;
|
||||
this.category = category;
|
||||
this.propagateFast = propagateFast;
|
||||
this.userVisible = userVisible;
|
||||
|
||||
ELEMENTS_BY_NAME.values().forEach(s -> {
|
||||
if(s.getName().equals(name)) {
|
||||
@@ -179,6 +192,9 @@ public class AlarmCode implements EnumWithId {
|
||||
|
||||
if (!field.isAnnotationPresent(Deprecated.class)) {
|
||||
VALID_VALUES.put(id, this);
|
||||
if (userVisible) {
|
||||
USER_VISIBLE_VALUES.put(id, this);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -232,6 +248,11 @@ public class AlarmCode implements EnumWithId {
|
||||
public boolean isPropagateFast() {
|
||||
return propagateFast;
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
public boolean isUserVisible() {
|
||||
return userVisible;
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
public String name() {
|
||||
@@ -269,6 +290,10 @@ public class AlarmCode implements EnumWithId {
|
||||
public static boolean isUnsupported(AlarmCode value) {
|
||||
return (UNSUPPORTED.equals(value));
|
||||
}
|
||||
|
||||
public static List<AlarmCode> getUserVisibleValues() {
|
||||
return new ArrayList<>(USER_VISIBLE_VALUES.values());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
|
||||
@@ -113,5 +113,16 @@ public interface AlarmServiceInterface {
|
||||
* @return alarm counts for the given filters
|
||||
*/
|
||||
AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged);
|
||||
|
||||
/**
|
||||
* Retrieves a list of Alarms for the given alarm codes.
|
||||
*
|
||||
* @param alarmCodeSet - null or empty means include all alarm codes
|
||||
* @param createdAfterTimestamp
|
||||
* @return list of matching Alarm objects.
|
||||
* @throws IllegalArgumentException if supplied alarmCodeSet is null or empty
|
||||
*/
|
||||
List<Alarm> get(Set<AlarmCode> alarmCodeSet, long createdAfterTimestamp);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -47,6 +47,10 @@ public class AlarmServiceLocal implements AlarmServiceInterface {
|
||||
return alarmController.getAllForEquipment(customerId, equipmentIdSet, alarmCodeSet, createdAfterTimestamp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Alarm> get(Set<AlarmCode> alarmCodeSet, long createdAfterTimestamp) {
|
||||
return alarmController.getAllForAlarmCode(alarmCodeSet, createdAfterTimestamp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Alarm update(Alarm alarm) {
|
||||
|
||||
@@ -52,6 +52,17 @@
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-service-local</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>equipment-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -241,14 +241,45 @@ public class AlarmServiceRemote extends BaseRemoteClient implements AlarmService
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<Alarm> get(Set<AlarmCode> alarmCodeSet, long createdAfterTimestamp) {
|
||||
LOG.debug("get({},{})", alarmCodeSet, createdAfterTimestamp);
|
||||
|
||||
if (alarmCodeSet == null || alarmCodeSet.isEmpty()) {
|
||||
throw new IllegalArgumentException("alarmCodeSet must be provided");
|
||||
}
|
||||
|
||||
String alarmCodeSetStr = alarmCodeSet.toString();
|
||||
// remove [] around the string, otherwise will get:
|
||||
// Failed to convert value of type 'java.lang.String' to required
|
||||
// type 'java.util.Set'; nested exception is
|
||||
// java.lang.NumberFormatException: For input string: "[690]"
|
||||
alarmCodeSetStr = alarmCodeSetStr.substring(1, alarmCodeSetStr.length() - 1);
|
||||
|
||||
try {
|
||||
ResponseEntity<List<Alarm>> responseEntity =
|
||||
restTemplate.exchange(getBaseUrl() + "/forAlarmCode?alarmCode={alarmCodeSetStr}&createdAfterTimestamp={createdAfterTimestamp}",
|
||||
HttpMethod.GET, null, Alarm_LIST_CLASS_TOKEN, alarmCodeSetStr, createdAfterTimestamp);
|
||||
|
||||
List<Alarm> result = responseEntity.getBody();
|
||||
if (null == result) {
|
||||
result = Collections.emptyList();
|
||||
}
|
||||
LOG.debug("get({},{}) return {} entries", alarmCodeSet, createdAfterTimestamp, result.size());
|
||||
return result;
|
||||
} catch (Exception exp) {
|
||||
LOG.error("getAllInSet({},{}) exception ", alarmCodeSet, createdAfterTimestamp, exp);
|
||||
throw exp;
|
||||
}
|
||||
}
|
||||
|
||||
public String getBaseUrl() {
|
||||
if(baseUrl==null) {
|
||||
baseUrl = environment.getProperty("tip.wlan.alarmServiceBaseUrl").trim()+"/api/alarm";
|
||||
}
|
||||
|
||||
return baseUrl;
|
||||
return baseUrl;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@@ -26,12 +27,17 @@ import com.telecominfraproject.wlan.alarm.models.Alarm;
|
||||
import com.telecominfraproject.wlan.alarm.models.AlarmCode;
|
||||
import com.telecominfraproject.wlan.alarm.models.AlarmCounts;
|
||||
import com.telecominfraproject.wlan.alarm.models.AlarmDetails;
|
||||
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherEmpty;
|
||||
import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
|
||||
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.core.model.pagination.SortOrder;
|
||||
import com.telecominfraproject.wlan.datastore.exceptions.DsConcurrentModificationException;
|
||||
import com.telecominfraproject.wlan.datastore.exceptions.DsEntityNotFoundException;
|
||||
import com.telecominfraproject.wlan.equipment.EquipmentServiceLocal;
|
||||
import com.telecominfraproject.wlan.equipment.datastore.inmemory.EquipmentDatastoreInMemory;
|
||||
import com.telecominfraproject.wlan.equipment.models.Equipment;
|
||||
import com.telecominfraproject.wlan.remote.tests.BaseRemoteTest;
|
||||
import com.telecominfraproject.wlan.status.models.StatusCode;
|
||||
|
||||
@@ -44,10 +50,16 @@ import com.telecominfraproject.wlan.status.models.StatusCode;
|
||||
"integration_test",
|
||||
"no_ssl","http_digest_auth","rest-template-single-user-per-service-digest-auth",
|
||||
}) //NOTE: these profiles will be ADDED to the list of active profiles
|
||||
@Import(value = {
|
||||
EquipmentServiceLocal.class,
|
||||
EquipmentDatastoreInMemory.class,
|
||||
CloudEventDispatcherEmpty.class
|
||||
})
|
||||
public class AlarmServiceRemoteTest extends BaseRemoteTest {
|
||||
|
||||
|
||||
@Autowired AlarmServiceRemote remoteInterface;
|
||||
@Autowired EquipmentServiceLocal equipmentServicelocal;
|
||||
|
||||
@Before public void urlSetup(){
|
||||
configureBaseUrl("tip.wlan.alarmServiceBaseUrl");
|
||||
@@ -505,8 +517,10 @@ public class AlarmServiceRemoteTest extends BaseRemoteTest {
|
||||
public void testAlarmCountsRetrieval() {
|
||||
//create some Alarms
|
||||
Alarm mdl;
|
||||
int customerId_1 = getNextCustomerId();
|
||||
int customerId_2 = getNextCustomerId();
|
||||
final int customerId_1 = getNextCustomerId();
|
||||
final int customerId_2 = getNextCustomerId();
|
||||
final long equipmentId_1 = createEquipmentObject(customerId_1).getId();
|
||||
|
||||
|
||||
int apNameIdx = 0;
|
||||
Set<Long> equipmentIds = new HashSet<>();
|
||||
@@ -514,8 +528,8 @@ public class AlarmServiceRemoteTest extends BaseRemoteTest {
|
||||
Set<Long> equipmentIds_AccessPointIsUnreachable = new HashSet<>();
|
||||
|
||||
for(int i = 0; i< 50; i++){
|
||||
mdl = createAlarmObject();
|
||||
mdl.setCustomerId(customerId_1);
|
||||
mdl = createAlarmObject(customerId_1, createEquipmentObject(customerId_1).getId());
|
||||
mdl.setEquipmentId(createEquipmentObject(customerId_1).getId());
|
||||
mdl.setScopeId("qr_"+apNameIdx);
|
||||
if((i%2) == 0) {
|
||||
mdl.setAlarmCode(AlarmCode.CPUUtilization);
|
||||
@@ -530,16 +544,14 @@ public class AlarmServiceRemoteTest extends BaseRemoteTest {
|
||||
remoteInterface.create(mdl);
|
||||
}
|
||||
|
||||
mdl = createAlarmObject();
|
||||
mdl = createAlarmObject(customerId_1, equipmentId_1);
|
||||
mdl.setCustomerId(customerId_1);
|
||||
mdl.setEquipmentId(0);
|
||||
mdl.setAlarmCode(AlarmCode.GenericError);
|
||||
|
||||
remoteInterface.create(mdl);
|
||||
|
||||
for(int i = 0; i< 50; i++){
|
||||
mdl = createAlarmObject();
|
||||
mdl.setCustomerId(customerId_2);
|
||||
mdl = createAlarmObject(customerId_2, createEquipmentObject(customerId_2).getId());
|
||||
mdl.setScopeId("qr_"+apNameIdx);
|
||||
mdl.setAcknowledged(false);
|
||||
mdl.setAlarmCode(AlarmCode.GenericError);
|
||||
@@ -651,18 +663,33 @@ public class AlarmServiceRemoteTest extends BaseRemoteTest {
|
||||
}
|
||||
|
||||
private Alarm createAlarmObject() {
|
||||
Alarm result = new Alarm();
|
||||
result.setCustomerId(getNextCustomerId());
|
||||
result.setEquipmentId(getNextEquipmentId());
|
||||
int customerId = getNextCustomerId();
|
||||
return createAlarmObject(customerId, createEquipmentObject(customerId).getId());
|
||||
}
|
||||
|
||||
private Alarm createAlarmObject(int customerId, long equipmentId) {
|
||||
Alarm result = new Alarm();
|
||||
result.setCustomerId(customerId);
|
||||
result.setAlarmCode(AlarmCode.AccessPointIsUnreachable);
|
||||
result.setCreatedTimestamp(System.currentTimeMillis());
|
||||
result.setEquipmentId(equipmentId);
|
||||
|
||||
result.setScopeId("test-scope-" + result.getEquipmentId());
|
||||
|
||||
AlarmDetails details = new AlarmDetails();
|
||||
details.setMessage("test-details-" + result.getEquipmentId());
|
||||
result.setDetails(details );
|
||||
result.setDetails(details );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private Equipment createEquipmentObject(int customerId)
|
||||
{
|
||||
Equipment equipment = new Equipment();
|
||||
equipment.setName("testName");
|
||||
equipment.setInventoryId("test-inv");
|
||||
equipment.setEquipmentType(EquipmentType.AP);
|
||||
equipment.setCustomerId(customerId);
|
||||
return equipmentServicelocal.create(equipment);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,70 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<artifactId>tip-wlan-cloud-root-pom</artifactId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<relativePath>../../wlan-cloud-root</relativePath>
|
||||
</parent>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<artifactId>tip-wlan-cloud-root-pom</artifactId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<relativePath>../../wlan-cloud-root</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>alarm-service</artifactId>
|
||||
<name>alarm-service</name>
|
||||
<description>Server side implementation of the service.</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<artifactId>base-container</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>alarm-models</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>alarm-datastore-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>alarm-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<artifactId>alarm-service</artifactId>
|
||||
<name>alarm-service</name>
|
||||
<description>Server side implementation of the service.</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<artifactId>base-container</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-empty</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
<dependency>
|
||||
<artifactId>alarm-models</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>alarm-datastore-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>equipment-service-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>alarm-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>equipment-service-local</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>equipment-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-empty</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -20,6 +20,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.datastore.exceptions.DsDataValidationException;
|
||||
import com.telecominfraproject.wlan.equipment.EquipmentServiceInterface;
|
||||
import com.telecominfraproject.wlan.systemevent.models.SystemEvent;
|
||||
|
||||
import com.telecominfraproject.wlan.alarm.datastore.AlarmDatastore;
|
||||
@@ -48,6 +49,7 @@ public class AlarmController {
|
||||
|
||||
@Autowired private AlarmDatastore alarmDatastore;
|
||||
@Autowired private CloudEventDispatcherInterface cloudEventDispatcher;
|
||||
@Autowired private EquipmentServiceInterface equipmentServiceInterface;
|
||||
|
||||
|
||||
/**
|
||||
@@ -66,6 +68,14 @@ public class AlarmController {
|
||||
LOG.error("Failed to create Alarm, request contains unsupported value: {}", alarm);
|
||||
throw new DsDataValidationException("Alarm contains unsupported value");
|
||||
}
|
||||
|
||||
if (alarm.getEquipmentId() != 0)
|
||||
{
|
||||
if (equipmentServiceInterface.getOrNull(alarm.getEquipmentId()) == null)
|
||||
{
|
||||
throw new DsDataValidationException(String.format("Unable to create alarm for non-existant equipment ID: %d", alarm.getEquipmentId()));
|
||||
}
|
||||
}
|
||||
|
||||
long ts = alarm.getCreatedTimestamp();
|
||||
if (ts == 0) {
|
||||
@@ -119,6 +129,24 @@ public class AlarmController {
|
||||
throw exp;
|
||||
}
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/forAlarmCode", method = RequestMethod.GET)
|
||||
public ListOfAlarms getAllForAlarmCode(
|
||||
@RequestParam Set<AlarmCode> alarmCode,
|
||||
@RequestParam long createdAfterTimestamp) {
|
||||
LOG.debug("getAllForAlarmCode({}, {})", alarmCode, createdAfterTimestamp);
|
||||
try {
|
||||
List<Alarm> result = alarmDatastore.get(alarmCode, createdAfterTimestamp);
|
||||
LOG.debug("getAllForAlarmCode({},{}) return {} entries", alarmCode, createdAfterTimestamp, result.size());
|
||||
ListOfAlarms ret = new ListOfAlarms();
|
||||
ret.addAll(result);
|
||||
return ret;
|
||||
} catch (Exception exp) {
|
||||
LOG.error("getAllForAlarmCode({},{}) exception ", alarmCode, createdAfterTimestamp, exp);
|
||||
throw exp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "/forCustomer", method = RequestMethod.GET)
|
||||
public PaginationResponse<Alarm> getForCustomer(@RequestParam int customerId,
|
||||
@@ -234,7 +262,7 @@ public class AlarmController {
|
||||
public AlarmCounts getAlarmCounts(@RequestParam int customerId,
|
||||
@RequestParam Set<Long> equipmentIdSet,
|
||||
@RequestParam Set<AlarmCode> alarmCodeSet,
|
||||
@RequestParam Boolean acknowledged) {
|
||||
@RequestParam(required = false) Boolean acknowledged) {
|
||||
|
||||
LOG.debug("Getting Alarm counts for {} {} {} {}", customerId, equipmentIdSet, alarmCodeSet, acknowledged);
|
||||
|
||||
|
||||
@@ -17,7 +17,11 @@ import org.springframework.test.context.ActiveProfiles;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherEmpty;
|
||||
|
||||
import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
|
||||
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.Equipment;
|
||||
import com.telecominfraproject.wlan.alarm.datastore.inmemory.AlarmDatastoreInMemory;
|
||||
import com.telecominfraproject.wlan.alarm.models.Alarm;
|
||||
import com.telecominfraproject.wlan.alarm.models.AlarmCode;
|
||||
@@ -39,10 +43,14 @@ import com.telecominfraproject.wlan.alarm.models.AlarmDetails;
|
||||
CloudEventDispatcherEmpty.class,
|
||||
AlarmDatastoreInMemory.class,
|
||||
AlarmControllerTest.Config.class,
|
||||
EquipmentServiceLocal.class,
|
||||
EquipmentController.class,
|
||||
EquipmentDatastoreInMemory.class
|
||||
})
|
||||
public class AlarmControllerTest {
|
||||
|
||||
@Autowired private AlarmController alarmController;
|
||||
@Autowired EquipmentServiceLocal equipmentServicelocal;
|
||||
|
||||
|
||||
@Configuration
|
||||
@@ -59,8 +67,9 @@ public class AlarmControllerTest {
|
||||
|
||||
//Create new Alarm - success
|
||||
Alarm alarm = new Alarm();
|
||||
alarm.setCustomerId((int) testSequence.getAndIncrement());
|
||||
alarm.setEquipmentId(testSequence.getAndIncrement());
|
||||
int customerId = (int) testSequence.getAndIncrement();
|
||||
alarm.setCustomerId(customerId);
|
||||
alarm.setEquipmentId(createEquipmentObject(customerId).getId());
|
||||
alarm.setAlarmCode(AlarmCode.AccessPointIsUnreachable);
|
||||
alarm.setCreatedTimestamp(System.currentTimeMillis());
|
||||
|
||||
@@ -91,5 +100,14 @@ public class AlarmControllerTest {
|
||||
assertEquals(expected.getDetails(), actual.getDetails());
|
||||
//TODO: add more fields to check here
|
||||
}
|
||||
|
||||
|
||||
private Equipment createEquipmentObject(int customerId)
|
||||
{
|
||||
Equipment equipment = new Equipment();
|
||||
equipment.setName("testName");
|
||||
equipment.setInventoryId("test-inv");
|
||||
equipment.setEquipmentType(EquipmentType.AP);
|
||||
equipment.setCustomerId(customerId);
|
||||
return equipmentServicelocal.create(equipment);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -349,12 +349,6 @@
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-alarms-sp</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>adoption-metrics-sp</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -250,12 +250,6 @@
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-alarms-sp</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>adoption-metrics-sp</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
|
||||
@@ -336,12 +336,6 @@
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-alarms-sp</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>adoption-metrics-sp</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
package com.telecominfraproject.wlan.startuptasks;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.IOException;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
@@ -41,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;
|
||||
@@ -638,7 +634,7 @@ public class AllInOneStartListener implements ApplicationRunner {
|
||||
((PasspointProfile) passpointHotspotConfig.getDetails()).setPasspointVenueProfileId(passpointVenueProfileId);
|
||||
((PasspointProfile) passpointHotspotConfig.getDetails()).setOsuSsidProfileId(profileSsidOpenId);
|
||||
((PasspointProfile) passpointHotspotConfig.getDetails())
|
||||
.setAssociatedAccessSsidProfileIds(List.of(profileSsidPskId));
|
||||
.setAssociatedAccessSsidProfileIds(Set.of(profileSsidPskId));
|
||||
|
||||
return profileServiceInterface.create(passpointHotspotConfig);
|
||||
}
|
||||
@@ -1241,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));
|
||||
@@ -1268,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));
|
||||
@@ -1295,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));
|
||||
@@ -1364,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));
|
||||
@@ -1383,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);
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.telecominfraproject.wlan.core.model.pagination.PaginationContext;
|
||||
import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
|
||||
|
||||
import com.telecominfraproject.wlan.client.datastore.ClientDatastore;
|
||||
import com.telecominfraproject.wlan.client.info.models.ClientSessionCounts;
|
||||
import com.telecominfraproject.wlan.client.models.Client;
|
||||
import com.telecominfraproject.wlan.client.session.models.ClientSession;
|
||||
|
||||
@@ -108,6 +109,13 @@ public class ClientDatastoreCassandra implements ClientDatastore {
|
||||
|
||||
return clientSessionDAO.getSessionsForCustomer(customerId, equipmentIds, locationIds, macSubstring, sortBy, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientSessionCounts getSessionCounts(int customerId) {
|
||||
// Not yet supported.
|
||||
ClientSessionCounts counts = new ClientSessionCounts();
|
||||
return counts;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.telecominfraproject.wlan.client.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;
|
||||
@@ -15,6 +16,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import com.telecominfraproject.wlan.client.datastore.ClientDatastore;
|
||||
import com.telecominfraproject.wlan.client.info.models.ClientInfoDetails;
|
||||
import com.telecominfraproject.wlan.client.info.models.ClientSessionCounts;
|
||||
import com.telecominfraproject.wlan.client.models.Client;
|
||||
import com.telecominfraproject.wlan.client.session.models.ClientSession;
|
||||
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
|
||||
@@ -512,4 +514,56 @@ public class ClientDatastoreInMemory extends BaseInMemoryDatastore implements Cl
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientSessionCounts getSessionCounts(int customerId) {
|
||||
ClientSessionCounts counts = new ClientSessionCounts();
|
||||
counts.setCustomerId(customerId);
|
||||
|
||||
long totalCount = 0;
|
||||
Map<String, Long> perEquipmentMap = new HashMap<>();
|
||||
Map<String, Long> perOuiMap = new HashMap<>();
|
||||
Map<String, Long> perRadioMap = new HashMap<>();
|
||||
|
||||
for (ClientSession session : idToClientSessionMap.values()) {
|
||||
if (session.getCustomerId() == customerId) {
|
||||
totalCount++;
|
||||
String equipmentIdString = Long.toString(session.getEquipmentId());
|
||||
Long cnt = perEquipmentMap.get(equipmentIdString);
|
||||
if (cnt == null) {
|
||||
cnt = 0L;
|
||||
} else {
|
||||
cnt++;
|
||||
}
|
||||
perEquipmentMap.put(equipmentIdString, cnt);
|
||||
|
||||
if (session.getOui() != null) {
|
||||
cnt = perOuiMap.get(session.getOui());
|
||||
if (cnt == null) {
|
||||
cnt = 0L;
|
||||
} else {
|
||||
cnt++;
|
||||
}
|
||||
perOuiMap.put(session.getOui(), cnt);
|
||||
}
|
||||
|
||||
if (session.getDetails() != null && session.getDetails().getRadioType() != null) {
|
||||
String radioTypeString = session.getDetails().getRadioType().toString();
|
||||
cnt = perRadioMap.get(radioTypeString);
|
||||
if (cnt == null) {
|
||||
cnt = 0L;
|
||||
} else {
|
||||
cnt++;
|
||||
}
|
||||
perRadioMap.put(radioTypeString, cnt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
counts.setTotalCount(totalCount);
|
||||
counts.setEquipmentCounts(perEquipmentMap);
|
||||
counts.setOuiCounts(perOuiMap);
|
||||
counts.setRadioCounts(perRadioMap);
|
||||
return counts;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.telecominfraproject.wlan.client.info.models.ClientSessionCounts;
|
||||
import com.telecominfraproject.wlan.client.models.Client;
|
||||
import com.telecominfraproject.wlan.client.session.models.ClientSession;
|
||||
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
|
||||
@@ -105,5 +106,12 @@ public interface ClientDatastore {
|
||||
*/
|
||||
PaginationResponse<ClientSession> getSessionsForCustomer(int customerId, Set<Long> equipmentIds, Set<Long> locationIds, String macSubstring, List<ColumnAndSort> sortBy, PaginationContext<ClientSession> context);
|
||||
|
||||
/**
|
||||
* Get Client Session counts for the given customerId.
|
||||
*
|
||||
* @param customerId
|
||||
* @return
|
||||
*/
|
||||
ClientSessionCounts getSessionCounts(int customerId);
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
|
||||
package com.telecominfraproject.wlan.client.info.models;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
|
||||
|
||||
/**
|
||||
* Total and per-oui/equipment/radio counts of the Client Sessions
|
||||
*/
|
||||
public class ClientSessionCounts extends BaseJsonModel {
|
||||
|
||||
private static final long serialVersionUID = 7697349699510565184L;
|
||||
|
||||
private int customerId;
|
||||
/**
|
||||
* Total count of all client sessions for the customer Id.
|
||||
*/
|
||||
private long totalCount;
|
||||
/**
|
||||
* Counts of client sessions per equipment Id.
|
||||
*/
|
||||
private Map<String, Long> equipmentCounts = new HashMap<>();
|
||||
/**
|
||||
* Counts of client sessions per OUI.
|
||||
*/
|
||||
private Map<String, Long> ouiCounts = new HashMap<>();
|
||||
/**
|
||||
* Counts of client sessions per Radio Type.
|
||||
*/
|
||||
private Map<String, Long> radioCounts = new HashMap<>();
|
||||
|
||||
public int getCustomerId() {
|
||||
return customerId;
|
||||
}
|
||||
|
||||
public void setCustomerId(int customerId) {
|
||||
this.customerId = customerId;
|
||||
}
|
||||
|
||||
public long getTotalCount() {
|
||||
return totalCount;
|
||||
}
|
||||
|
||||
public void setTotalCount(long totalCount) {
|
||||
this.totalCount = totalCount;
|
||||
}
|
||||
|
||||
public Map<String, Long> getEquipmentCounts() {
|
||||
return equipmentCounts;
|
||||
}
|
||||
|
||||
public void setEquipmentCounts(Map<String, Long> equipmentCounts) {
|
||||
this.equipmentCounts = equipmentCounts;
|
||||
}
|
||||
|
||||
public Map<String, Long> getOuiCounts() {
|
||||
return ouiCounts;
|
||||
}
|
||||
|
||||
public void setOuiCounts(Map<String, Long> ouiCounts) {
|
||||
this.ouiCounts = ouiCounts;
|
||||
}
|
||||
|
||||
public Map<String, Long> getRadioCounts() {
|
||||
return radioCounts;
|
||||
}
|
||||
|
||||
public void setRadioCounts(Map<String, Long> radioCounts) {
|
||||
this.radioCounts = radioCounts;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientSessionCounts clone() {
|
||||
ClientSessionCounts ret = (ClientSessionCounts) super.clone();
|
||||
if (equipmentCounts != null) {
|
||||
ret.equipmentCounts = new HashMap<>(equipmentCounts);
|
||||
}
|
||||
if (ouiCounts != null) {
|
||||
ret.ouiCounts = new HashMap<>(ouiCounts);
|
||||
}
|
||||
if (radioCounts != null) {
|
||||
ret.radioCounts = new HashMap<>(radioCounts);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.telecominfraproject.wlan.client.models.events.realtime;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.net.InetAddress;
|
||||
import java.util.Objects;
|
||||
|
||||
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
|
||||
@@ -12,9 +12,9 @@ public class ClientIpAddressEvent extends RealTimeEvent implements HasClientMac
|
||||
|
||||
private static final long serialVersionUID = -5332534925768685589L;
|
||||
|
||||
private long sessionId;
|
||||
private String sessionId;
|
||||
private MacAddress clientMacAddress;
|
||||
private byte[] ipAddr;
|
||||
private InetAddress ipAddr;
|
||||
|
||||
public ClientIpAddressEvent() {
|
||||
// serialization
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -45,11 +45,11 @@ public class ClientIpAddressEvent extends RealTimeEvent implements HasClientMac
|
||||
this.clientMacAddress = clientMacAddress;
|
||||
}
|
||||
|
||||
public byte[] getIpAddr() {
|
||||
public InetAddress getIpAddr() {
|
||||
return ipAddr;
|
||||
}
|
||||
|
||||
public void setIpAddr(byte[] ipAddr) {
|
||||
public void setIpAddr(InetAddress ipAddr) {
|
||||
this.ipAddr = ipAddr;
|
||||
}
|
||||
|
||||
@@ -57,8 +57,7 @@ public class ClientIpAddressEvent extends RealTimeEvent implements HasClientMac
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + Arrays.hashCode(this.ipAddr);
|
||||
result = prime * result + Objects.hash(clientMacAddress, sessionId);
|
||||
result = prime * result + Objects.hash(ipAddr, clientMacAddress, sessionId);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -74,7 +73,7 @@ public class ClientIpAddressEvent extends RealTimeEvent implements HasClientMac
|
||||
return false;
|
||||
}
|
||||
ClientIpAddressEvent other = (ClientIpAddressEvent) obj;
|
||||
return Objects.equals(clientMacAddress, other.clientMacAddress) && Arrays.equals(ipAddr, other.ipAddr)
|
||||
return Objects.equals(clientMacAddress, other.clientMacAddress) && Objects.equals(ipAddr, other.ipAddr)
|
||||
&& this.sessionId == other.sessionId;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ import com.telecominfraproject.wlan.core.model.json.interfaces.HasCustomerId;
|
||||
|
||||
public class ClientSession extends BaseJsonModel implements HasCustomerId {
|
||||
|
||||
private static final String UNKNOWN_OUI = "ffffff";
|
||||
|
||||
private static final long serialVersionUID = -7714023056859882994L;
|
||||
|
||||
private MacAddress macAddress;
|
||||
@@ -16,6 +18,7 @@ public class ClientSession extends BaseJsonModel implements HasCustomerId {
|
||||
private long locationId;
|
||||
private ClientSessionDetails details;
|
||||
private long lastModifiedTimestamp;
|
||||
private String oui;
|
||||
|
||||
public long getEquipmentId() {
|
||||
return equipmentId;
|
||||
@@ -47,6 +50,12 @@ public class ClientSession extends BaseJsonModel implements HasCustomerId {
|
||||
|
||||
public void setMacAddress(MacAddress macAddress) {
|
||||
this.macAddress = macAddress;
|
||||
if (macAddress != null && macAddress.isGlobalAddress()) {
|
||||
this.oui = macAddress.toOuiString();
|
||||
}
|
||||
else {
|
||||
this.oui = UNKNOWN_OUI;
|
||||
}
|
||||
}
|
||||
|
||||
public long getLastModifiedTimestamp() {
|
||||
@@ -65,6 +74,14 @@ public class ClientSession extends BaseJsonModel implements HasCustomerId {
|
||||
this.details = details;
|
||||
}
|
||||
|
||||
public String getOui() {
|
||||
return oui;
|
||||
}
|
||||
|
||||
public void setOui(String oui) {
|
||||
this.oui = oui;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientSession clone() {
|
||||
ClientSession ret = (ClientSession) super.clone();
|
||||
@@ -79,7 +96,7 @@ public class ClientSession extends BaseJsonModel implements HasCustomerId {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(customerId, details, equipmentId, locationId, lastModifiedTimestamp, macAddress);
|
||||
return Objects.hash(customerId, details, equipmentId, locationId, lastModifiedTimestamp, macAddress, oui);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -95,7 +112,8 @@ public class ClientSession extends BaseJsonModel implements HasCustomerId {
|
||||
&& equipmentId == other.equipmentId
|
||||
&& locationId == other.locationId
|
||||
&& lastModifiedTimestamp == other.lastModifiedTimestamp
|
||||
&& Objects.equals(macAddress, other.macAddress);
|
||||
&& Objects.equals(macAddress, other.macAddress)
|
||||
&& Objects.equals(oui, other.oui);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.Objects;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
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.core.model.equipment.SecurityType;
|
||||
import com.telecominfraproject.wlan.core.model.equipment.SteerType;
|
||||
@@ -19,7 +20,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;
|
||||
@@ -32,6 +33,7 @@ public class ClientSessionDetails extends BaseJsonModel {
|
||||
private InetAddress ipAddress;
|
||||
private String radiusUsername;
|
||||
private String ssid;
|
||||
private MacAddress bssid;
|
||||
private RadioType radioType;
|
||||
private Long lastEventTimestamp;
|
||||
private String hostname;
|
||||
@@ -42,7 +44,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 +55,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 +155,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 +187,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 +195,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 +241,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 +389,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;
|
||||
}
|
||||
|
||||
@@ -436,6 +412,14 @@ public class ClientSessionDetails extends BaseJsonModel {
|
||||
public void setFirstFailureDetails(ClientFailureDetails firstFailureDetails) {
|
||||
this.firstFailureDetails = firstFailureDetails;
|
||||
}
|
||||
|
||||
public MacAddress getBssid() {
|
||||
return bssid;
|
||||
}
|
||||
|
||||
public void setBssid(MacAddress bssid) {
|
||||
this.bssid = bssid;
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
public boolean isTerminated() {
|
||||
@@ -514,9 +498,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 +517,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,10 +533,10 @@ 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);
|
||||
associationState, bssid);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -594,7 +573,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)
|
||||
@@ -603,7 +581,8 @@ public class ClientSessionDetails extends BaseJsonModel {
|
||||
&& sessionId == other.sessionId && Objects.equals(ssid, other.ssid) && steerType == other.steerType
|
||||
&& Objects.equals(timeoutTimestamp, other.timeoutTimestamp)
|
||||
&& Objects.equals(userAgentStr, other.userAgentStr)
|
||||
&& Objects.equals(associationState, other.associationState);
|
||||
&& Objects.equals(associationState, other.associationState)
|
||||
&& Objects.equals(bssid, other.bssid);
|
||||
|
||||
}
|
||||
|
||||
@@ -677,9 +656,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();
|
||||
@@ -759,6 +735,10 @@ public class ClientSessionDetails extends BaseJsonModel {
|
||||
if (null != latest.getUserAgentStr()) {
|
||||
this.userAgentStr = latest.getUserAgentStr();
|
||||
}
|
||||
|
||||
if (null != latest.getBssid()) {
|
||||
this.bssid = latest.bssid;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -821,11 +801,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -8,7 +8,7 @@ import com.telecominfraproject.wlan.core.model.json.GenericResponse;
|
||||
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.client.info.models.ClientSessionCounts;
|
||||
import com.telecominfraproject.wlan.client.models.Client;
|
||||
import com.telecominfraproject.wlan.client.session.models.ClientSession;
|
||||
|
||||
@@ -144,4 +144,12 @@ public interface ClientServiceInterface {
|
||||
*/
|
||||
PaginationResponse<ClientSession> getSessionsForCustomer(int customerId, Set<Long> equipmentIds, Set<Long> locationIds, String macSubstring, List<ColumnAndSort> sortBy, PaginationContext<ClientSession> context);
|
||||
|
||||
/**
|
||||
* Get Client Session counts for the given customerId.
|
||||
*
|
||||
* @param customerId
|
||||
* @return
|
||||
*/
|
||||
ClientSessionCounts getSessionCounts(int customerId);
|
||||
|
||||
}
|
||||
|
||||
@@ -3,13 +3,12 @@ package com.telecominfraproject.wlan.client;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.telecominfraproject.wlan.client.controller.ClientController;
|
||||
import com.telecominfraproject.wlan.client.controller.ClientController.ListOfClientSessions;
|
||||
import com.telecominfraproject.wlan.client.info.models.ClientSessionCounts;
|
||||
import com.telecominfraproject.wlan.client.models.Client;
|
||||
import com.telecominfraproject.wlan.client.session.models.ClientSession;
|
||||
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
|
||||
@@ -26,7 +25,6 @@ import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
|
||||
public class ClientServiceLocal implements ClientServiceInterface {
|
||||
|
||||
@Autowired private ClientController clientController;
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ClientServiceLocal.class);
|
||||
|
||||
@Override
|
||||
public Client create(Client client) {
|
||||
@@ -109,5 +107,10 @@ public class ClientServiceLocal implements ClientServiceInterface {
|
||||
public GenericResponse deleteSessions(long createdBeforeTimestamp) {
|
||||
return clientController.deleteSessions(createdBeforeTimestamp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientSessionCounts getSessionCounts(int customerId) {
|
||||
return clientController.getSessionCounts(customerId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.telecominfraproject.wlan.client.info.models.ClientSessionCounts;
|
||||
import com.telecominfraproject.wlan.client.models.Client;
|
||||
import com.telecominfraproject.wlan.client.session.models.ClientSession;
|
||||
import com.telecominfraproject.wlan.core.client.BaseRemoteClient;
|
||||
@@ -365,5 +366,21 @@ public class ClientServiceRemote extends BaseRemoteClient implements ClientServi
|
||||
return baseUrl;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientSessionCounts getSessionCounts(int customerId) {
|
||||
LOG.debug("calling getSessionCounts( {} )", customerId);
|
||||
|
||||
try {
|
||||
ResponseEntity<ClientSessionCounts> responseEntity = restTemplate.exchange(getBaseUrl() + "/session/countsForCustomer?customerId={customerId}",
|
||||
HttpMethod.GET, null, ClientSessionCounts.class, customerId);
|
||||
|
||||
ClientSessionCounts result = responseEntity.getBody();
|
||||
LOG.debug("getSessionCounts({}) returns {} ", customerId, result);
|
||||
return result;
|
||||
} catch (Exception exp) {
|
||||
LOG.error("getSessionCounts({}) exception ", customerId, exp);
|
||||
throw exp;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,6 +8,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;
|
||||
@@ -15,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import com.telecominfraproject.wlan.client.datastore.ClientDatastore;
|
||||
import com.telecominfraproject.wlan.client.info.models.ClientSessionCounts;
|
||||
import com.telecominfraproject.wlan.client.models.Client;
|
||||
import com.telecominfraproject.wlan.client.models.events.ClientAddedEvent;
|
||||
import com.telecominfraproject.wlan.client.models.events.ClientBlockListChangedEvent;
|
||||
@@ -22,6 +24,7 @@ import com.telecominfraproject.wlan.client.models.events.ClientChangedEvent;
|
||||
import com.telecominfraproject.wlan.client.models.events.ClientRemovedEvent;
|
||||
import com.telecominfraproject.wlan.client.models.events.ClientSessionChangedEvent;
|
||||
import com.telecominfraproject.wlan.client.models.events.ClientSessionRemovedEvent;
|
||||
import com.telecominfraproject.wlan.client.session.models.AssociationState;
|
||||
import com.telecominfraproject.wlan.client.session.models.ClientSession;
|
||||
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherInterface;
|
||||
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
|
||||
@@ -349,6 +352,8 @@ public class ClientController {
|
||||
throw new DsDataValidationException("Client session contains unsupported value");
|
||||
}
|
||||
|
||||
forceDisconnectOtherClientSessions(clientSession);
|
||||
|
||||
ClientSession ret = clientDatastore.updateSession(clientSession);
|
||||
|
||||
LOG.debug("Updated Client session {}", ret);
|
||||
@@ -382,6 +387,8 @@ public class ClientController {
|
||||
throw new DsDataValidationException("Client session contains unsupported value");
|
||||
}
|
||||
|
||||
clientSessions.forEach(s -> forceDisconnectOtherClientSessions(s));
|
||||
|
||||
ListOfClientSessions ret = new ListOfClientSessions();
|
||||
|
||||
ret.addAll(clientDatastore.updateSessions(clientSessions));
|
||||
@@ -430,6 +437,13 @@ public class ClientController {
|
||||
|
||||
return new GenericResponse(true, "");
|
||||
}
|
||||
|
||||
@GetMapping("/session/countsForCustomer")
|
||||
public ClientSessionCounts getSessionCounts(@RequestParam int customerId) {
|
||||
ClientSessionCounts ret = clientDatastore.getSessionCounts(customerId);
|
||||
LOG.debug("countsForCustomer({}) {}", customerId, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
private void publishEvent(SystemEvent event) {
|
||||
if (event == null) {
|
||||
@@ -451,5 +465,39 @@ public class ClientController {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Force disconnects other client sessions with the same client Mac address.
|
||||
* In an ideal world, this doesn't happen often.
|
||||
* This usually happens when a client is roaming from one AP to another and the AP does not send a
|
||||
* disconnect until much later (5+ minutes timeout on the AP).
|
||||
* Also happens if the AP was disconnected from the cloud from some time and we "missed" the disconnect event.
|
||||
* @param clientSession
|
||||
*/
|
||||
private void forceDisconnectOtherClientSessions(ClientSession clientSession) {
|
||||
if (clientSession.getDetails().getAssociationState() != AssociationState._802_11_Associated) {
|
||||
// updating a session that is not associated should not disconnect other sessions
|
||||
return;
|
||||
}
|
||||
|
||||
List<ClientSession> allSessions = clientDatastore.getSessions(clientSession.getCustomerId(), Set.of(clientSession.getMacAddress()));
|
||||
|
||||
if (allSessions == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (ClientSession cl : allSessions) {
|
||||
if (cl.getEquipmentId() == clientSession.getEquipmentId()) {
|
||||
// Don't disconnect ourselves!
|
||||
continue;
|
||||
}
|
||||
|
||||
if (cl.getDetails().getAssociationState() == AssociationState._802_11_Associated) {
|
||||
// Force disconnect this client session:
|
||||
LOG.info("Forcing a Disconnect of Client session {}", cl);
|
||||
cl.getDetails().setAssociationState(AssociationState.Disconnected);
|
||||
cl.setLastModifiedTimestamp(System.currentTimeMillis());
|
||||
updateSession(cl);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,8 +147,7 @@ components:
|
||||
type: object
|
||||
properties:
|
||||
sessionId:
|
||||
type: integer
|
||||
format: int64
|
||||
type: string
|
||||
authTimestamp:
|
||||
type: integer
|
||||
format: int64
|
||||
@@ -182,6 +181,8 @@ components:
|
||||
type: string
|
||||
ssid:
|
||||
type: string
|
||||
bssid:
|
||||
$ref: '#/components/schemas/MacAddress'
|
||||
radioType:
|
||||
$ref: '#/components/schemas/RadioType'
|
||||
lastEventTimestamp:
|
||||
@@ -235,8 +236,7 @@ components:
|
||||
steerType:
|
||||
$ref: '#/components/schemas/SteerType'
|
||||
previousValidSessionId:
|
||||
type: integer
|
||||
format: int64
|
||||
type: string
|
||||
lastFailureDetails:
|
||||
$ref: '#/components/schemas/ClientFailureDetails'
|
||||
firstFailureDetails:
|
||||
@@ -251,8 +251,7 @@ components:
|
||||
type: integer
|
||||
format: int32
|
||||
priorSessionId:
|
||||
type: integer
|
||||
format: int64
|
||||
type: string
|
||||
priorEquipmentId:
|
||||
type: integer
|
||||
format: int64
|
||||
|
||||
@@ -59,8 +59,7 @@
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
|
||||
|
||||
<dependency>
|
||||
<artifactId>base-stream-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.cache.Cache;
|
||||
import org.springframework.cache.CacheManager;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
@@ -32,8 +33,8 @@ public class CloudEventDispatcherController {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(CloudEventDispatcherController.class);
|
||||
|
||||
@Autowired @Qualifier("metricStreamInterface") private StreamInterface<ServiceMetric> metricStream;
|
||||
@Autowired @Qualifier("eventStreamInterface") private StreamInterface<SystemEventRecord> systemEventStream;
|
||||
@Autowired @Qualifier("metricStreamInterface") @Lazy private StreamInterface<ServiceMetric> metricStream;
|
||||
@Autowired @Qualifier("eventStreamInterface") @Lazy private StreamInterface<SystemEventRecord> systemEventStream;
|
||||
@Autowired private ServiceMetricServiceInterface serviceMetricInterface;
|
||||
@Autowired private SystemEventServiceInterface systemEventInterface;
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -189,7 +189,6 @@
|
||||
|
||||
<module>../provisioning-sp</module>
|
||||
<module>../dashboard-sp</module>
|
||||
<module>../equipment-alarms-sp</module>
|
||||
<module>../adoption-metrics-sp</module>
|
||||
|
||||
<module>../single-process-streams</module>
|
||||
|
||||
1
equipment-alarms-sp/.gitignore
vendored
1
equipment-alarms-sp/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
/target/
|
||||
@@ -1,111 +0,0 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<artifactId>tip-wlan-cloud-root-pom</artifactId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<relativePath>../../wlan-cloud-root</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>equipment-alarms-sp</artifactId>
|
||||
<name>equipment-alarms-sp</name>
|
||||
<description>Stream Processors for raising/clearing equipment alarms based on reported metrics.</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<artifactId>base-stream-consumer</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>service-metric-models</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>system-event-models</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>alarm-service-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>status-service-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-service-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- unit tests dependencies -->
|
||||
<dependency>
|
||||
<artifactId>single-process-streams</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>status-service-local</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-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-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-empty</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
|
||||
@@ -1,187 +0,0 @@
|
||||
package com.telecominfraproject.wlan.streams.equipmentalarms;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import com.telecominfraproject.wlan.alarm.models.Alarm;
|
||||
import com.telecominfraproject.wlan.alarm.models.AlarmCode;
|
||||
import com.telecominfraproject.wlan.servicemetric.apnode.models.ApNodeMetrics;
|
||||
|
||||
/**
|
||||
* <br>This context keeps track of information needed for raising/clearing the alarms with the following codes:
|
||||
* <ul>
|
||||
* <li>AlarmCode.CPUTemperature
|
||||
* <li>AlarmCode.CPUUtilization
|
||||
* <li>AlarmCode.MemoryUtilization
|
||||
* <li>AlarmCode.NoMetricsReceived
|
||||
* </ul>
|
||||
*
|
||||
* @author dtop
|
||||
*/
|
||||
public class EquipmentAlarmsContext {
|
||||
|
||||
private final int customerId;
|
||||
private final long equipmentId;
|
||||
private final Map<AlarmCode, Alarm> existingAlarms = new ConcurrentHashMap<>();
|
||||
private final long timeBucketMs;
|
||||
private final int temperatureThresholdInC;
|
||||
private final int cpuUtilThresholdPct;
|
||||
private final int memoryUtilThresholdPct;
|
||||
|
||||
private final Map<Long, Integer> cpuTempSamples = new ConcurrentHashMap<>();
|
||||
private final Map<Long, Integer> cpuUtilSamples = new ConcurrentHashMap<>();
|
||||
private final Map<Long, Integer> memoryUtilSamples = new ConcurrentHashMap<>();
|
||||
private final Map<Long, Long> metricReceivedTimestamps = new ConcurrentHashMap<>();
|
||||
|
||||
private long totalAvailableMemoryKb;
|
||||
private final long contextCreationTimestampMs = System.currentTimeMillis();
|
||||
|
||||
public EquipmentAlarmsContext(int customerId, long equipmentId, List<Alarm> existingAlarmsList, long timeBucketMs, int temperatureThresholdInC, int cpuUtilThresholdPct, int memoryUtilThresholdPct) {
|
||||
this.customerId = customerId;
|
||||
this.equipmentId = equipmentId;
|
||||
existingAlarmsList.forEach(a -> this.existingAlarms.put(a.getAlarmCode(), a));
|
||||
this.timeBucketMs = timeBucketMs;
|
||||
this.temperatureThresholdInC = temperatureThresholdInC;
|
||||
this.cpuUtilThresholdPct = cpuUtilThresholdPct;
|
||||
this.memoryUtilThresholdPct = memoryUtilThresholdPct;
|
||||
}
|
||||
|
||||
public long getTotalAvailableMemoryKb() {
|
||||
return totalAvailableMemoryKb;
|
||||
}
|
||||
|
||||
public void setTotalAvailableMemoryKb(long totalAvailableMemoryKb) {
|
||||
this.totalAvailableMemoryKb = totalAvailableMemoryKb;
|
||||
}
|
||||
|
||||
public int getCustomerId() {
|
||||
return customerId;
|
||||
}
|
||||
|
||||
public long getEquipmentId() {
|
||||
return equipmentId;
|
||||
}
|
||||
|
||||
public Map<AlarmCode, Alarm> getExistingAlarms() {
|
||||
return existingAlarms;
|
||||
}
|
||||
|
||||
|
||||
public void addDataSamples(long timestamp, ApNodeMetrics model) {
|
||||
// add new samples
|
||||
if(model.getApPerformance()!=null ) {
|
||||
if(model.getApPerformance().getCpuTemperature()!=null) {
|
||||
cpuTempSamples.put(timestamp, model.getApPerformance().getCpuTemperature());
|
||||
}
|
||||
|
||||
if(model.getApPerformance().getAvgCpuUtilized()!=null) {
|
||||
cpuUtilSamples.put(timestamp, model.getApPerformance().getAvgCpuUtilized().intValue());
|
||||
}
|
||||
|
||||
if(model.getApPerformance().getFreeMemory()!=null && totalAvailableMemoryKb>0) {
|
||||
memoryUtilSamples.put(timestamp, 100 - (int) (model.getApPerformance().getFreeMemory() * 100 / totalAvailableMemoryKb));
|
||||
}
|
||||
}
|
||||
|
||||
//we are using our own timestamp in here in case AP's time is out of sync - we do not want to raise connectivity alarm in that case
|
||||
Long currentTs = System.currentTimeMillis();
|
||||
metricReceivedTimestamps.put(currentTs, currentTs);
|
||||
|
||||
}
|
||||
|
||||
public void removeOldDataSamples() {
|
||||
// remove samples older than timeBucketMs
|
||||
long timeThresholdMs = System.currentTimeMillis() - timeBucketMs;
|
||||
cpuTempSamples.entrySet().removeIf( t -> t.getKey() < timeThresholdMs );
|
||||
cpuUtilSamples.entrySet().removeIf( t -> t.getKey() < timeThresholdMs );
|
||||
memoryUtilSamples.entrySet().removeIf( t -> t.getKey() < timeThresholdMs );
|
||||
metricReceivedTimestamps.entrySet().removeIf( t -> t.getKey() < timeThresholdMs );
|
||||
}
|
||||
|
||||
public boolean isAlarmNeedsToBeRaised(AlarmCode alarmCode) {
|
||||
|
||||
if(existingAlarms.containsKey(alarmCode) || System.currentTimeMillis() < contextCreationTimestampMs + timeBucketMs) {
|
||||
//no need to check for thresholds - alarm is either already present, or it is too early to tell because the first time bucket has not been filled yet
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean ret = false;
|
||||
AtomicInteger sum = new AtomicInteger();
|
||||
AtomicInteger count = new AtomicInteger();
|
||||
|
||||
//check alarms against thresholds
|
||||
if(alarmCode.getId() == AlarmCode.NoMetricsReceived.getId()) {
|
||||
ret = metricReceivedTimestamps.isEmpty();
|
||||
} else if(alarmCode.getId() == AlarmCode.CPUTemperature.getId()) {
|
||||
cpuTempSamples.values().forEach(v -> { sum.addAndGet(v); count.incrementAndGet(); });
|
||||
if(count.get() > 0) {
|
||||
int avg = sum.get() / count.get();
|
||||
ret = avg >= temperatureThresholdInC ;
|
||||
}
|
||||
} else if(alarmCode.getId() == AlarmCode.CPUUtilization.getId()) {
|
||||
cpuUtilSamples.values().forEach(v -> { sum.addAndGet(v); count.incrementAndGet(); });
|
||||
if(count.get() > 0) {
|
||||
int avg = sum.get() / count.get();
|
||||
ret = avg >= cpuUtilThresholdPct ;
|
||||
}
|
||||
} else if(alarmCode.getId() == AlarmCode.MemoryUtilization.getId()) {
|
||||
memoryUtilSamples.values().forEach(v -> { sum.addAndGet(v); count.incrementAndGet(); });
|
||||
if(count.get() > 0) {
|
||||
int avg = sum.get() / count.get();
|
||||
ret = avg >= memoryUtilThresholdPct ;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public boolean isAlarmNeedsToBeCleared(AlarmCode alarmCode) {
|
||||
|
||||
if(!existingAlarms.containsKey(alarmCode) || System.currentTimeMillis() < contextCreationTimestampMs + timeBucketMs) {
|
||||
//no need to check for thresholds - alarm is either not present, or it is too early to tell because the first time bucket has not been filled yet
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean ret = false;
|
||||
AtomicInteger sum = new AtomicInteger();
|
||||
AtomicInteger count = new AtomicInteger();
|
||||
|
||||
//check alarms against thresholds
|
||||
if(alarmCode.getId() == AlarmCode.NoMetricsReceived.getId()) {
|
||||
ret = !metricReceivedTimestamps.isEmpty();
|
||||
} else if(alarmCode.getId() == AlarmCode.CPUTemperature.getId()) {
|
||||
cpuTempSamples.values().forEach(v -> { sum.addAndGet(v); count.incrementAndGet(); });
|
||||
if(count.get() > 0) {
|
||||
int avg = sum.get() / count.get();
|
||||
ret = avg < temperatureThresholdInC ;
|
||||
} else {
|
||||
//no new data available, but the alarm exists -> clear the alarm
|
||||
ret = true;
|
||||
}
|
||||
} else if(alarmCode.getId() == AlarmCode.CPUUtilization.getId()) {
|
||||
cpuUtilSamples.values().forEach(v -> { sum.addAndGet(v); count.incrementAndGet(); });
|
||||
if(count.get() > 0) {
|
||||
int avg = sum.get() / count.get();
|
||||
ret = avg < cpuUtilThresholdPct ;
|
||||
} else {
|
||||
//no new data available, but the alarm exists -> clear the alarm
|
||||
ret = true;
|
||||
}
|
||||
} else if(alarmCode.getId() == AlarmCode.MemoryUtilization.getId()) {
|
||||
memoryUtilSamples.values().forEach(v -> { sum.addAndGet(v); count.incrementAndGet(); });
|
||||
if(count.get() > 0) {
|
||||
int avg = sum.get() / count.get();
|
||||
ret = avg < memoryUtilThresholdPct ;
|
||||
} else {
|
||||
//no new data available, but the alarm exists -> clear the alarm
|
||||
ret = true;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,322 +0,0 @@
|
||||
package com.telecominfraproject.wlan.streams.equipmentalarms;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.telecominfraproject.wlan.alarm.AlarmServiceInterface;
|
||||
import com.telecominfraproject.wlan.alarm.models.Alarm;
|
||||
import com.telecominfraproject.wlan.alarm.models.AlarmCode;
|
||||
import com.telecominfraproject.wlan.alarm.models.AlarmDetails;
|
||||
import com.telecominfraproject.wlan.alarm.models.AlarmScopeType;
|
||||
import com.telecominfraproject.wlan.alarm.models.OriginatorType;
|
||||
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
|
||||
import com.telecominfraproject.wlan.core.model.streams.QueuedStreamMessage;
|
||||
import com.telecominfraproject.wlan.equipment.EquipmentServiceInterface;
|
||||
import com.telecominfraproject.wlan.equipment.models.Equipment;
|
||||
import com.telecominfraproject.wlan.servicemetric.apnode.models.ApNodeMetrics;
|
||||
import com.telecominfraproject.wlan.servicemetric.models.ServiceMetric;
|
||||
import com.telecominfraproject.wlan.servicemetric.models.ServiceMetricDetails;
|
||||
import com.telecominfraproject.wlan.status.StatusServiceInterface;
|
||||
import com.telecominfraproject.wlan.status.equipment.report.models.OperatingSystemPerformance;
|
||||
import com.telecominfraproject.wlan.status.models.Status;
|
||||
import com.telecominfraproject.wlan.status.models.StatusCode;
|
||||
import com.telecominfraproject.wlan.status.models.StatusDataType;
|
||||
import com.telecominfraproject.wlan.stream.StreamProcessor;
|
||||
|
||||
/**
|
||||
* @author dtop
|
||||
* <br> This stream processor is listening for APNodeMetrics, aggregating them in sliding windows of 5 minutes and raising/clearing alarms based on preconfigured thresholds.
|
||||
* <br> "No metrics received" alarm is raised when no APNodeMetrics have been received for the equipment in the last interval, cleared when APNodeMetrics appear again
|
||||
* <br> "Temperature too high" alarm is raised when average temperature over the last interval goes above the configured threshold of 80C, cleared when average temperature goes below the threshold
|
||||
* <br> "CPU utilization is too high" alarm is raised when average CPU utilization on AP over the last interval goes above the configured threshold of 80%, cleared when average CPU utilization goes below the threshold
|
||||
* <br> "Memory utilization is too high" alarm is raised when average RAM utilization on AP over the last interval goes above the configured threshold of 70%, cleared when average RAM utilization goes below the threshold
|
||||
*
|
||||
*/
|
||||
@Component
|
||||
public class EquipmentAlarmsProcessor extends StreamProcessor {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(EquipmentAlarmsProcessor.class);
|
||||
|
||||
@Value("${tip.wlan.wlanServiceMetricsTopic:wlan_service_metrics}")
|
||||
private String wlanServiceMetricsTopic;
|
||||
|
||||
@Value("${tip.wlan.equipmentAlarmProcessor.timeBucketMs:300000}") //5 minutes aggregation buckets
|
||||
private long timeBucketMs;
|
||||
|
||||
@Value("${tip.wlan.equipmentAlarmProcessor.checkAlarmsIntervalMs:15000}") //check for raising/clearing alarms every 15 seconds
|
||||
private long checkAlarmsIntervalMs;
|
||||
|
||||
@Value("${tip.wlan.equipmentAlarmProcessor.temperatureThresholdInC:80}")
|
||||
private int temperatureThresholdInC;
|
||||
|
||||
@Value("${tip.wlan.equipmentAlarmProcessor.cpuUtilThresholdPct:80}")
|
||||
private int cpuUtilThresholdPct;
|
||||
|
||||
@Value("${tip.wlan.equipmentAlarmProcessor.memoryUtilThresholdPct:70}")
|
||||
private int memoryUtilThresholdPct;
|
||||
|
||||
|
||||
private final ConcurrentHashMap<Long, EquipmentAlarmsContext> contextPerEquipmentIdMap = new ConcurrentHashMap<>();
|
||||
|
||||
private final Set<AlarmCode> alarmCodeSet = new HashSet<>();
|
||||
|
||||
@Autowired
|
||||
private AlarmServiceInterface alarmServiceInterface;
|
||||
|
||||
@Autowired
|
||||
private StatusServiceInterface statusServiceInterface;
|
||||
|
||||
@Autowired
|
||||
private EquipmentServiceInterface equipmentServiceInterface;
|
||||
|
||||
@Override
|
||||
protected boolean acceptMessage(QueuedStreamMessage message) {
|
||||
boolean ret = message.getTopic().equals(wlanServiceMetricsTopic);
|
||||
|
||||
if(ret && ( message.getModel() instanceof ServiceMetric) ) {
|
||||
|
||||
ServiceMetric sm = (ServiceMetric) message.getModel();
|
||||
ret = ret &&
|
||||
(
|
||||
sm.getDetails() instanceof ApNodeMetrics
|
||||
);
|
||||
} else {
|
||||
ret = false;
|
||||
}
|
||||
|
||||
LOG.trace("acceptMessage {}", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void processMessage(QueuedStreamMessage message) {
|
||||
|
||||
ServiceMetric mdl = (ServiceMetric) message.getModel();
|
||||
ServiceMetricDetails smd = mdl.getDetails();
|
||||
LOG.debug("Processing {}", mdl);
|
||||
|
||||
switch ( smd.getClass().getSimpleName() ) {
|
||||
case "ApNodeMetrics":
|
||||
process(mdl.getCustomerId(), mdl.getCreatedTimestamp(), mdl.getEquipmentId(), (ApNodeMetrics) smd);
|
||||
break;
|
||||
default:
|
||||
process(mdl);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void process(int customerId, long timestamp, long equipmentId, ApNodeMetrics model) {
|
||||
LOG.debug("Processing ApNodeMetrics");
|
||||
//get context for the equipmentId
|
||||
EquipmentAlarmsContext context = contextPerEquipmentIdMap.get(equipmentId);
|
||||
if(context == null) {
|
||||
|
||||
//When creating EquipmentAlarmsContext - read currently raised alarms of the types we're interested, keep it in memory.
|
||||
//Only this SP is responsible for raising/clearing those alarms for this particular equipment
|
||||
List<Alarm> existingAlarms = alarmServiceInterface.get(customerId, Collections.singleton(equipmentId), alarmCodeSet);
|
||||
|
||||
//All alarms that are handled by this stream processor logically exist only once-per-alarmCode-per-equipment.
|
||||
//Ensure that there is only one alarm per alarmCode per equipment (the latest one), remove all others.
|
||||
//This is needed to recover from some corner-case scenarios that can happen with the distributed datastores (for example split-brain).
|
||||
existingAlarms = cleanUpDuplicateAlarms(existingAlarms);
|
||||
|
||||
context = new EquipmentAlarmsContext(customerId, equipmentId, existingAlarms, timeBucketMs, temperatureThresholdInC, cpuUtilThresholdPct, memoryUtilThresholdPct);
|
||||
context = contextPerEquipmentIdMap.putIfAbsent(equipmentId, context);
|
||||
if(context == null) {
|
||||
context = contextPerEquipmentIdMap.get(equipmentId);
|
||||
}
|
||||
}
|
||||
|
||||
//find out TotalAvailableMemory in kb, which is available as part of the OperatingSystemPerformance status object
|
||||
//we look for it separately because this status may not be populated when the first service_metrics_collection_config are coming in
|
||||
if(context.getTotalAvailableMemoryKb()==0L) {
|
||||
Status osPerformanceStatus = statusServiceInterface.getOrNull(customerId, equipmentId, StatusDataType.OS_PERFORMANCE);
|
||||
if(osPerformanceStatus!=null) {
|
||||
OperatingSystemPerformance osPerformance = (OperatingSystemPerformance) osPerformanceStatus.getDetails();
|
||||
if(osPerformance !=null && osPerformance.getTotalAvailableMemoryKb() > 0) {
|
||||
context.setTotalAvailableMemoryKb(osPerformance.getTotalAvailableMemoryKb());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update counters on the context
|
||||
context.addDataSamples(timestamp, model);
|
||||
|
||||
LOG.debug("Processed {}", model);
|
||||
}
|
||||
|
||||
private List<Alarm> cleanUpDuplicateAlarms(List<Alarm> existingAlarms) {
|
||||
|
||||
Map<AlarmCode, Alarm> alarmsToKeep= new HashMap<>();
|
||||
|
||||
//find out the latest existing alarms for each alarmCode
|
||||
existingAlarms.forEach(a -> {
|
||||
Alarm eA = alarmsToKeep.get(a.getAlarmCode());
|
||||
if(eA == null) {
|
||||
eA = a;
|
||||
alarmsToKeep.put(a.getAlarmCode(), a);
|
||||
}
|
||||
|
||||
if(eA.getCreatedTimestamp() < a.getCreatedTimestamp() ) {
|
||||
alarmsToKeep.put(a.getAlarmCode(), a);
|
||||
}
|
||||
});
|
||||
|
||||
List<Alarm> alarmsToRemove = new ArrayList<>(existingAlarms);
|
||||
alarmsToRemove.removeAll(alarmsToKeep.values());
|
||||
|
||||
alarmsToRemove.forEach(a -> {
|
||||
try {
|
||||
alarmServiceInterface.delete(a.getCustomerId(), a.getEquipmentId(), a.getAlarmCode(), a.getCreatedTimestamp());
|
||||
} catch(Exception e) {
|
||||
LOG.debug("Alarm was already deleted: {}", a);
|
||||
}
|
||||
});
|
||||
|
||||
return new ArrayList<>(alarmsToKeep.values());
|
||||
}
|
||||
|
||||
private void process(BaseJsonModel model) {
|
||||
LOG.warn("Unprocessed model: {}", model);
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
private void postCreate() {
|
||||
|
||||
Thread equipmentAlarmsThread = new Thread( new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
LOG.info("Starting equipmentAlarmsThread");
|
||||
while(true) {
|
||||
LOG.trace("Checking if alarms need to be raised");
|
||||
|
||||
//take a snapshot of existing contexts for this iteration of alarm checks
|
||||
List<EquipmentAlarmsContext> contexts = new ArrayList<>(contextPerEquipmentIdMap.values());
|
||||
|
||||
HashSet<Long> equipmentIdsFromContexts = new HashSet<>();
|
||||
contexts.forEach(ctx -> equipmentIdsFromContexts.add(ctx.getEquipmentId()));
|
||||
|
||||
//get a list of equipment records for the current contexts
|
||||
HashSet<Long> existingEquipmentIds = new HashSet<>();
|
||||
|
||||
try {
|
||||
List<Equipment> existingEquipment = equipmentServiceInterface.get(equipmentIdsFromContexts);
|
||||
existingEquipment.forEach(e -> existingEquipmentIds.add(e.getId()));
|
||||
} catch(Exception e) {
|
||||
LOG.error("Error when retrieving existing equipment", e);
|
||||
sleep(checkAlarmsIntervalMs);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
for(EquipmentAlarmsContext context : contexts ) {
|
||||
|
||||
if(!existingEquipmentIds.contains(context.getEquipmentId())) {
|
||||
//equipment was removed, let's delete the context and remove all existing alarms for that equipmentId
|
||||
try {
|
||||
contextPerEquipmentIdMap.remove(context.getEquipmentId());
|
||||
alarmServiceInterface.delete(context.getCustomerId(), context.getEquipmentId());
|
||||
} catch(Exception e) {
|
||||
LOG.error("Error when removing stale alarms for deleted equipment", e);
|
||||
}
|
||||
//nothing else to do for this context
|
||||
continue;
|
||||
}
|
||||
|
||||
context.removeOldDataSamples();
|
||||
|
||||
alarmCodeSet.forEach(alarmCode -> {
|
||||
try {
|
||||
//check alarms against thresholds
|
||||
//if alarm needs to be raised - check if it is currently present, and if not - raise it, and add it to the context
|
||||
if(context.isAlarmNeedsToBeRaised(alarmCode)) {
|
||||
Alarm alarm = new Alarm();
|
||||
alarm.setCustomerId(context.getCustomerId());
|
||||
alarm.setEquipmentId(context.getEquipmentId());
|
||||
alarm.setAlarmCode(alarmCode);
|
||||
alarm.setOriginatorType(OriginatorType.AP);
|
||||
alarm.setSeverity(alarmCode.getSeverity());
|
||||
alarm.setScopeType(AlarmScopeType.EQUIPMENT);
|
||||
alarm.setScopeId("" + context.getEquipmentId());
|
||||
AlarmDetails alarmDetails = new AlarmDetails();
|
||||
alarmDetails.setMessage(alarmCode.getDescription());
|
||||
alarmDetails.setAffectedEquipmentIds(Collections.singletonList(context.getEquipmentId()));
|
||||
alarm.setDetails(alarmDetails);
|
||||
|
||||
alarm = alarmServiceInterface.create(alarm);
|
||||
context.getExistingAlarms().put(alarmCode, alarm);
|
||||
}
|
||||
|
||||
if(context.isAlarmNeedsToBeCleared(alarmCode)) {
|
||||
//if alarm needs to be cleared - check if it is currently present, and if it is - clear it, and remove it from the context
|
||||
Alarm alarm = context.getExistingAlarms().remove(alarmCode);
|
||||
if(alarm!=null) {
|
||||
//All alarms that are handled by this stream processor logically exist only once-per-alarmCode-per-equipment.
|
||||
//In order to self-heal from the corner cases with the datastore where more than one alarm with the same alarmCode
|
||||
// is raised per equipment (for example when the datastore experienced a split-brain scenario), we would remove
|
||||
// all alarms with the specified alarmCode for this equipment.
|
||||
//Most of the time the existingAlarms list below would contain only one alarm.
|
||||
//
|
||||
List<Alarm> existingAlarms = alarmServiceInterface.get(alarm.getCustomerId(), Collections.singleton(alarm.getEquipmentId()), Collections.singleton(alarmCode));
|
||||
existingAlarms.forEach(a -> {
|
||||
try {
|
||||
alarmServiceInterface.delete(a.getCustomerId(), a.getEquipmentId(), a.getAlarmCode(), a.getCreatedTimestamp());
|
||||
} catch(Exception e) {
|
||||
LOG.debug("Alarm was already deleted: {}", alarm);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch(Exception e) {
|
||||
LOG.error("Error when processing context for customer {}", context.getCustomerId(), e);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
LOG.trace("Done alarms check");
|
||||
|
||||
sleep(checkAlarmsIntervalMs);
|
||||
|
||||
}
|
||||
}
|
||||
}, "equipmentAlarmsThread");
|
||||
|
||||
equipmentAlarmsThread.setDaemon(true);
|
||||
equipmentAlarmsThread.start();
|
||||
|
||||
//populate alarm codes this SP is responsible for
|
||||
alarmCodeSet.add(AlarmCode.NoMetricsReceived);
|
||||
alarmCodeSet.add(AlarmCode.CPUTemperature);
|
||||
alarmCodeSet.add(AlarmCode.CPUUtilization);
|
||||
alarmCodeSet.add(AlarmCode.MemoryUtilization);
|
||||
|
||||
}
|
||||
|
||||
private static void sleep(long ms) {
|
||||
try {
|
||||
Thread.sleep(ms);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,342 +0,0 @@
|
||||
package com.telecominfraproject.wlan.streams.equipmentalarms;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import com.telecominfraproject.wlan.alarm.AlarmServiceInterface;
|
||||
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.alarm.models.Alarm;
|
||||
import com.telecominfraproject.wlan.alarm.models.AlarmCode;
|
||||
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherEmpty;
|
||||
import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
|
||||
import com.telecominfraproject.wlan.equipment.EquipmentServiceInterface;
|
||||
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.Equipment;
|
||||
import com.telecominfraproject.wlan.servicemetric.apnode.models.ApNodeMetrics;
|
||||
import com.telecominfraproject.wlan.servicemetric.apnode.models.ApPerformance;
|
||||
import com.telecominfraproject.wlan.servicemetric.models.ServiceMetric;
|
||||
import com.telecominfraproject.wlan.status.StatusServiceLocal;
|
||||
import com.telecominfraproject.wlan.status.controller.StatusController;
|
||||
import com.telecominfraproject.wlan.status.datastore.inmemory.StatusDatastoreInMemory;
|
||||
import com.telecominfraproject.wlan.stream.StreamInterface;
|
||||
import com.telecominfraproject.wlan.stream.StreamMessageDispatcher;
|
||||
import com.telecominfraproject.wlan.streams.simple.SimpleStreamsConfig;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = EquipmentAlarmsProcessor.class)
|
||||
@Import(value = { EquipmentAlarmsProcessor.class, SimpleStreamsConfig.class, StreamMessageDispatcher.class,
|
||||
AlarmServiceLocal.class, AlarmController.class, AlarmDatastoreInMemory.class,
|
||||
StatusServiceLocal.class, StatusController.class, StatusDatastoreInMemory.class,
|
||||
EquipmentServiceLocal.class, EquipmentController.class, EquipmentDatastoreInMemory.class,
|
||||
CloudEventDispatcherEmpty.class,
|
||||
//EquipmentAlarmsProcessorTests.Config.class,
|
||||
})
|
||||
@Ignore("make these tests more robust, there are intermittent failures")
|
||||
/*
|
||||
expected: <0> but was: <1>
|
||||
org.opentest4j.AssertionFailedError: expected: <0> but was: <1>
|
||||
at com.telecominfraproject.wlan.streams.equipmentalarms.EquipmentAlarmsProcessorTests.testAccessPointIsUnreachableAlarm(EquipmentAlarmsProcessorTests.java:313)
|
||||
|
||||
*/
|
||||
public class EquipmentAlarmsProcessorTests {
|
||||
|
||||
private static final long testTimeBucketMs = 200;
|
||||
private static final long testCheckAlarmsIntervalMs = 50;
|
||||
|
||||
static {
|
||||
System.setProperty("tip.wlan.equipmentAlarmProcessor.checkAlarmsIntervalMs", "" + testCheckAlarmsIntervalMs);
|
||||
System.setProperty("tip.wlan.equipmentAlarmProcessor.timeBucketMs", "" + testTimeBucketMs);
|
||||
}
|
||||
|
||||
@Autowired @Qualifier("metricStreamInterface")
|
||||
StreamInterface<ServiceMetric> metricStreamInterface;
|
||||
|
||||
@Autowired
|
||||
EquipmentAlarmsProcessor equipmentAlarmsProcessor;
|
||||
|
||||
@Autowired
|
||||
AlarmServiceInterface alarmService;
|
||||
|
||||
@Autowired
|
||||
EquipmentServiceInterface equipmentService;
|
||||
|
||||
protected static final AtomicLong testSequence = new AtomicLong(1);
|
||||
|
||||
@Configuration
|
||||
public static class Config {
|
||||
|
||||
//Another way of configuring dependencies (instead of mentioning them in the pom.xml with the test scope) :
|
||||
// @Bean
|
||||
// AlarmServiceInterface getAlarmServiceInterface() {
|
||||
// return new AlarmServiceInterface() {
|
||||
// ...
|
||||
// };
|
||||
// }
|
||||
|
||||
// @Bean
|
||||
// StatusServiceInterface getStatusServiceInterface() {
|
||||
// return new StatusServiceInterface() {
|
||||
// ...
|
||||
// };
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCPUTemperatureAlarm() {
|
||||
int customerId = getNextCustomerId();
|
||||
|
||||
Equipment equipment = new Equipment();
|
||||
equipment.setCustomerId(customerId);
|
||||
equipment.setEquipmentType(EquipmentType.AP);
|
||||
equipment.setInventoryId("testCPUTemperatureAlarm");
|
||||
equipment.setName(equipment.getInventoryId());
|
||||
equipment = equipmentService.create(equipment);
|
||||
long equipmentId = equipment.getId();
|
||||
|
||||
ServiceMetric record = new ServiceMetric(customerId , equipmentId );
|
||||
//create metric a bit in the future so that it gets picked up by the processor and not simply discarded
|
||||
record.setCreatedTimestamp(System.currentTimeMillis() + 2 * testTimeBucketMs);
|
||||
|
||||
ApNodeMetrics apNodeMetrics = new ApNodeMetrics();
|
||||
record.setDetails(apNodeMetrics);
|
||||
|
||||
ApPerformance apPerformance = new ApPerformance();
|
||||
apNodeMetrics.setApPerformance(apPerformance);
|
||||
|
||||
//we will force the CPUTemperature alarm to be raised
|
||||
apPerformance.setCpuTemperature(85);
|
||||
|
||||
apPerformance.setCpuUtilized(new int[] { 70, 70 });
|
||||
|
||||
apPerformance.setFreeMemory(30000000);
|
||||
|
||||
//publish metric that should trigger alarm for the CPU Temperature
|
||||
metricStreamInterface.publish(record );
|
||||
|
||||
//wait for the metric to be processed
|
||||
sleep(2 * testTimeBucketMs);
|
||||
|
||||
//verify that alarm was raised
|
||||
List<Alarm> alarms = alarmService.get(customerId, Collections.singleton(equipmentId), Collections.singleton(AlarmCode.CPUTemperature));
|
||||
assertEquals(1, alarms.size());
|
||||
|
||||
//Now create a metric that should clear the alarm
|
||||
ServiceMetric recordToClearAlarm = record.clone();
|
||||
recordToClearAlarm.setCreatedTimestamp(System.currentTimeMillis() + 2* testTimeBucketMs );
|
||||
((ApNodeMetrics)recordToClearAlarm.getDetails()).getApPerformance().setCpuTemperature(70);
|
||||
|
||||
//publish metric that should clear the alarm for the CPU Temperature
|
||||
metricStreamInterface.publish(recordToClearAlarm);
|
||||
|
||||
//wait for the metric to be processed
|
||||
sleep(2 * testTimeBucketMs);
|
||||
|
||||
//verify that alarm was cleared
|
||||
alarms = alarmService.get(customerId, Collections.singleton(equipmentId), Collections.singleton(AlarmCode.CPUTemperature));
|
||||
assertEquals(0, alarms.size());
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCPUTemperatureAlarm_NoEquipment() {
|
||||
int customerId = getNextCustomerId();
|
||||
long equipmentId = -5;
|
||||
|
||||
ServiceMetric record = new ServiceMetric(customerId , equipmentId );
|
||||
//create metric a bit in the future so that it gets picked up by the processor and not simply discarded
|
||||
record.setCreatedTimestamp(System.currentTimeMillis() + 2 * testTimeBucketMs);
|
||||
|
||||
ApNodeMetrics apNodeMetrics = new ApNodeMetrics();
|
||||
record.setDetails(apNodeMetrics);
|
||||
|
||||
ApPerformance apPerformance = new ApPerformance();
|
||||
apNodeMetrics.setApPerformance(apPerformance);
|
||||
|
||||
//we will force the CPUTemperature alarm to be raised
|
||||
apPerformance.setCpuTemperature(85);
|
||||
|
||||
apPerformance.setCpuUtilized(new int[] { 70, 70 });
|
||||
|
||||
apPerformance.setFreeMemory(30000000);
|
||||
|
||||
//publish metric that should trigger alarm for the CPU Temperature
|
||||
metricStreamInterface.publish(record );
|
||||
|
||||
//wait for the metric to be processed
|
||||
sleep(2 * testTimeBucketMs);
|
||||
|
||||
//verify that alarm was not raised - because equipment for that alarm does not exist
|
||||
List<Alarm> alarms = alarmService.get(customerId, Collections.singleton(equipmentId), Collections.singleton(AlarmCode.CPUTemperature));
|
||||
assertEquals(0, alarms.size());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCPUUtilizationAlarm() {
|
||||
int customerId = getNextCustomerId();
|
||||
|
||||
Equipment equipment = new Equipment();
|
||||
equipment.setCustomerId(customerId);
|
||||
equipment.setEquipmentType(EquipmentType.AP);
|
||||
equipment.setInventoryId("testCPUUtilizationAlarm");
|
||||
equipment.setName(equipment.getInventoryId());
|
||||
equipment = equipmentService.create(equipment);
|
||||
long equipmentId = equipment.getId();
|
||||
|
||||
ServiceMetric record = new ServiceMetric(customerId , equipmentId );
|
||||
//create metric a bit in the future so that it gets picked up by the processor and not simply discarded
|
||||
record.setCreatedTimestamp(System.currentTimeMillis() + 2 * testTimeBucketMs);
|
||||
|
||||
ApNodeMetrics apNodeMetrics = new ApNodeMetrics();
|
||||
record.setDetails(apNodeMetrics);
|
||||
|
||||
ApPerformance apPerformance = new ApPerformance();
|
||||
apNodeMetrics.setApPerformance(apPerformance);
|
||||
|
||||
apPerformance.setCpuTemperature(55);
|
||||
|
||||
//we will force the CPUUtilization alarm to be raised
|
||||
apPerformance.setCpuUtilized(new int[] { 90, 90 });
|
||||
|
||||
apPerformance.setFreeMemory(30000000);
|
||||
|
||||
//publish metric that should trigger alarm for the CPU Utilization
|
||||
metricStreamInterface.publish(record );
|
||||
|
||||
//wait for the metric to be processed
|
||||
sleep(2 * testTimeBucketMs);
|
||||
|
||||
//verify that alarm was raised
|
||||
List<Alarm> alarms = alarmService.get(customerId, Collections.singleton(equipmentId), Collections.singleton(AlarmCode.CPUUtilization));
|
||||
assertEquals(1, alarms.size());
|
||||
|
||||
//Now create a metric that should clear the alarm
|
||||
ServiceMetric recordToClearAlarm = record.clone();
|
||||
recordToClearAlarm.setCreatedTimestamp(System.currentTimeMillis() + 2* testTimeBucketMs );
|
||||
((ApNodeMetrics)recordToClearAlarm.getDetails()).getApPerformance().setCpuUtilized(new int[] { 50, 50 });
|
||||
|
||||
//publish metric that should clear the alarm for the CPU Utilization
|
||||
metricStreamInterface.publish(recordToClearAlarm);
|
||||
|
||||
//wait for the metric to be processed
|
||||
sleep(2 * testTimeBucketMs);
|
||||
|
||||
//verify that alarm was cleared
|
||||
alarms = alarmService.get(customerId, Collections.singleton(equipmentId), Collections.singleton(AlarmCode.CPUUtilization));
|
||||
assertEquals(0, alarms.size());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAccessPointIsUnreachableAlarm() {
|
||||
int customerId = getNextCustomerId();
|
||||
|
||||
Equipment equipment = new Equipment();
|
||||
equipment.setCustomerId(customerId);
|
||||
equipment.setEquipmentType(EquipmentType.AP);
|
||||
equipment.setInventoryId("testAccessPointIsUnreachableAlarm");
|
||||
equipment.setName(equipment.getInventoryId());
|
||||
equipment = equipmentService.create(equipment);
|
||||
long equipmentId = equipment.getId();
|
||||
|
||||
ServiceMetric record = new ServiceMetric(customerId , equipmentId );
|
||||
//create metric a bit in the future so that it gets picked up by the processor and not simply discarded
|
||||
record.setCreatedTimestamp(System.currentTimeMillis() + testTimeBucketMs);
|
||||
|
||||
ApNodeMetrics apNodeMetrics = new ApNodeMetrics();
|
||||
record.setDetails(apNodeMetrics);
|
||||
|
||||
ApPerformance apPerformance = new ApPerformance();
|
||||
apNodeMetrics.setApPerformance(apPerformance);
|
||||
|
||||
apPerformance.setCpuTemperature(55);
|
||||
|
||||
//we will force the CPUUtilization alarm to be raised
|
||||
apPerformance.setCpuUtilized(new int[] { 50, 50 });
|
||||
|
||||
apPerformance.setFreeMemory(30000000);
|
||||
|
||||
//publish metric that should not trigger AccessPointIsUnreachable alarm
|
||||
metricStreamInterface.publish(record );
|
||||
|
||||
//wait for the metric to be processed
|
||||
sleep(testTimeBucketMs);
|
||||
|
||||
//verify that alarm was not raised
|
||||
List<Alarm> alarms = alarmService.get(customerId, Collections.singleton(equipmentId), Collections.singleton(AlarmCode.AccessPointIsUnreachable));
|
||||
assertEquals(0, alarms.size());
|
||||
|
||||
//Now wait for the alarm to be raised because no service_metrics_collection_config were posted
|
||||
sleep(testTimeBucketMs);
|
||||
|
||||
//verify that alarm was raised
|
||||
for(int i = 0; i < 50; i++) {
|
||||
alarms = alarmService.get(customerId, Collections.singleton(equipmentId), Collections.singleton(AlarmCode.AccessPointIsUnreachable));
|
||||
if(!alarms.isEmpty()) {
|
||||
break;
|
||||
}else {
|
||||
sleep(5);
|
||||
}
|
||||
}
|
||||
assertEquals(1, alarms.size());
|
||||
|
||||
//Now create a metric that should clear the alarm
|
||||
ServiceMetric recordToClearAlarm = record.clone();
|
||||
recordToClearAlarm.setCreatedTimestamp(System.currentTimeMillis() + testTimeBucketMs );
|
||||
|
||||
//publish metric that should clear the AccessPointIsUnreachable alarm
|
||||
metricStreamInterface.publish(recordToClearAlarm);
|
||||
|
||||
//wait for the metric to be processed
|
||||
sleep(testTimeBucketMs);
|
||||
|
||||
//verify that alarm was cleared
|
||||
for(int i = 0; i < 50; i++) {
|
||||
alarms = alarmService.get(customerId, Collections.singleton(equipmentId), Collections.singleton(AlarmCode.AccessPointIsUnreachable));
|
||||
if(alarms.isEmpty()) {
|
||||
break;
|
||||
}else {
|
||||
sleep(5);
|
||||
}
|
||||
}
|
||||
assertEquals(0, alarms.size());
|
||||
|
||||
}
|
||||
|
||||
public int getNextCustomerId() {
|
||||
return (int) testSequence.incrementAndGet();
|
||||
}
|
||||
|
||||
public long getNextEquipmentId() {
|
||||
return testSequence.incrementAndGet();
|
||||
}
|
||||
|
||||
public void sleep(long ms) {
|
||||
try {
|
||||
Thread.sleep( ms );
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<configuration>
|
||||
<conversionRule conversionWord="filteredStack"
|
||||
converterClass="com.telecominfraproject.wlan.server.exceptions.logback.ExceptionCompressingConverter" />
|
||||
|
||||
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%filteredStack%nopex</pattern>
|
||||
<!-- See http://logback.qos.ch/manual/layouts.html for details -->
|
||||
<!-- %ex{5} - add at the end to display only 5 levels of the exception stack trace -->
|
||||
<!-- %nopex - add at the end to not display any of the exception stack traces -->
|
||||
<!-- %ex{full} - add at the end to display all the levels of the exception stack trace -->
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!--
|
||||
details: http://logback.qos.ch/manual/configuration.html#auto_configuration
|
||||
|
||||
runtime configuration, if need to override the defaults:
|
||||
-Dlogging.config=file:///home/ec2-user/opensync/logback.xml
|
||||
|
||||
for log configuration debugging - use
|
||||
-Dlogback.statusListenerClass=ch.qos.logback.core.status.OnConsoleStatusListener
|
||||
|
||||
log levels:
|
||||
OFF ERROR WARN INFO DEBUG TRACE
|
||||
-->
|
||||
<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
|
||||
<logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="INFO"/>
|
||||
<logger name="org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer" level="INFO"/>
|
||||
<logger name="org.springframework.security.web.authentication.preauth" level="OFF"/>
|
||||
<logger name="com.netflix.servo.tag.aws.AwsInjectableTag" level="OFF"/>
|
||||
|
||||
<logger name="com.telecominfraproject" level="WARN"/>
|
||||
|
||||
<!--
|
||||
<logger name="com.telecominfraproject.wlan.streams.simple" level="TRACE"/>
|
||||
<logger name="com.telecominfraproject.wlan.streams.equipmentalarms" level="TRACE"/>
|
||||
-->
|
||||
|
||||
<root level="WARN">
|
||||
<appender-ref ref="stdout"/>
|
||||
</root>
|
||||
|
||||
</configuration>
|
||||
@@ -263,7 +263,8 @@ public class EquipmentDAO extends BaseJdbcDao {
|
||||
},
|
||||
keyHolder);
|
||||
}catch (DuplicateKeyException e) {
|
||||
throw new DsDuplicateEntityException(e);
|
||||
LOG.error("Duplicate equipment found", e);
|
||||
throw new DsDuplicateEntityException("Equipment with the assetId " + equipment.getInventoryId() + " already exists!");
|
||||
}
|
||||
|
||||
// keyHolder.getKey() now contains the generated key
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
package com.telecominfraproject.wlan.equipmentgateway.models;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import com.telecominfraproject.wlan.core.model.equipment.LEDColour;
|
||||
|
||||
public class CEGWBlinkRequest extends EquipmentCommand {
|
||||
|
||||
private static final long serialVersionUID = 3464950479960821571L;
|
||||
|
||||
private boolean blinkAllLEDs;
|
||||
private int numCycles;
|
||||
private int colour1DurationMs;
|
||||
private int colour2DurationMs;
|
||||
@@ -28,6 +31,14 @@ public class CEGWBlinkRequest extends EquipmentCommand {
|
||||
public CEGWBlinkRequest() {
|
||||
super(CEGWCommandType.BlinkRequest, null, 0);
|
||||
}
|
||||
|
||||
public boolean getBlinkAllLEDs() {
|
||||
return this.blinkAllLEDs;
|
||||
}
|
||||
|
||||
public void setBlinkAllLEDs(boolean blinkAllLEDs) {
|
||||
this.blinkAllLEDs = blinkAllLEDs;
|
||||
}
|
||||
|
||||
public int getNumCycles() {
|
||||
return numCycles;
|
||||
@@ -79,4 +90,25 @@ public class CEGWBlinkRequest extends EquipmentCommand {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + Objects.hash(blinkAllLEDs, colour1, colour1DurationMs, colour2, colour2DurationMs, numCycles);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (!super.equals(obj))
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
CEGWBlinkRequest other = (CEGWBlinkRequest) obj;
|
||||
return blinkAllLEDs == other.blinkAllLEDs && colour1 == other.colour1 && colour1DurationMs == other.colour1DurationMs && colour2 == other.colour2
|
||||
&& colour2DurationMs == other.colour2DurationMs && numCycles == other.numCycles;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -344,8 +344,8 @@ 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:
|
||||
- $ref: '#/components/schemas/CEGWBaseCommand'
|
||||
properties:
|
||||
@@ -357,6 +357,8 @@ components:
|
||||
type: string
|
||||
enum:
|
||||
- CEGWBlinkRequest
|
||||
blinkAllLEDs:
|
||||
type: boolean
|
||||
colour1:
|
||||
$ref: '#/components/schemas/LEDColour'
|
||||
colour2:
|
||||
@@ -375,6 +377,7 @@ components:
|
||||
inventoryId: inv-1
|
||||
model_type: CEGWBlinkRequest
|
||||
commandType: BlinkRequest
|
||||
blinkAllLEDs: true
|
||||
colour1: blue
|
||||
colour2: red
|
||||
colour1DurationMs: 1000
|
||||
|
||||
@@ -37,6 +37,7 @@ public abstract class CommonElementConfiguration extends EquipmentDetails implem
|
||||
private AntennaType antennaType;
|
||||
private Boolean costSavingEventsEnabled;
|
||||
private NetworkForwardMode forwardMode;
|
||||
private boolean blinkAllLEDs;
|
||||
|
||||
/**
|
||||
* this constructor is used for CAMI only
|
||||
@@ -69,37 +70,33 @@ public abstract class CommonElementConfiguration extends EquipmentDetails implem
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + Objects.hash(antennaType, blinkAllLEDs, costSavingEventsEnabled, deploymentType, deviceMode, deviceName, elementConfigVersion,
|
||||
equipmentType, forwardMode, frameReportThrottleEnabled, gettingDNS, gettingIP, locallyConfigured, locallyConfiguredMgmtVlan, locationData,
|
||||
peerInfoList, staticDnsIp1, staticDnsIp2, staticIP, staticIpGw, staticIpMaskCidr, syntheticClientEnabled);
|
||||
return result;
|
||||
}
|
||||
|
||||
if (!super.equals(obj)) {
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (!super.equals(obj))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(obj instanceof CommonElementConfiguration)) {
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
}
|
||||
CommonElementConfiguration other = (CommonElementConfiguration) obj;
|
||||
return this.antennaType == other.antennaType
|
||||
&& Objects.equals(costSavingEventsEnabled, other.costSavingEventsEnabled)
|
||||
&& this.deploymentType == other.deploymentType && this.deviceMode == other.deviceMode
|
||||
&& Objects.equals(deviceName, other.deviceName)
|
||||
&& Objects.equals(elementConfigVersion, other.elementConfigVersion)
|
||||
&& this.equipmentType == other.equipmentType && this.forwardMode == other.forwardMode
|
||||
&& Objects.equals(frameReportThrottleEnabled, other.frameReportThrottleEnabled)
|
||||
&& this.gettingDNS == other.gettingDNS && this.gettingIP == other.gettingIP
|
||||
&& this.locallyConfigured == other.locallyConfigured
|
||||
&& this.locallyConfiguredMgmtVlan == other.locallyConfiguredMgmtVlan
|
||||
&& Objects.equals(locationData, other.locationData) && Objects.equals(peerInfoList, other.peerInfoList)
|
||||
&& Objects.equals(staticDnsIp1, other.staticDnsIp1) && Objects.equals(staticDnsIp2, other.staticDnsIp2)
|
||||
&& Objects.equals(staticIP, other.staticIP) && Objects.equals(staticIpGw, other.staticIpGw)
|
||||
&& Objects.equals(staticIpMaskCidr, other.staticIpMaskCidr)
|
||||
&& Objects.equals(syntheticClientEnabled, other.syntheticClientEnabled);
|
||||
return antennaType == other.antennaType && blinkAllLEDs == other.blinkAllLEDs && Objects.equals(costSavingEventsEnabled, other.costSavingEventsEnabled)
|
||||
&& deploymentType == other.deploymentType && deviceMode == other.deviceMode && Objects.equals(deviceName, other.deviceName)
|
||||
&& Objects.equals(elementConfigVersion, other.elementConfigVersion) && Objects.equals(equipmentType, other.equipmentType)
|
||||
&& forwardMode == other.forwardMode && Objects.equals(frameReportThrottleEnabled, other.frameReportThrottleEnabled)
|
||||
&& gettingDNS == other.gettingDNS && gettingIP == other.gettingIP && locallyConfigured == other.locallyConfigured
|
||||
&& locallyConfiguredMgmtVlan == other.locallyConfiguredMgmtVlan && Objects.equals(locationData, other.locationData)
|
||||
&& Objects.equals(peerInfoList, other.peerInfoList) && Objects.equals(staticDnsIp1, other.staticDnsIp1)
|
||||
&& Objects.equals(staticDnsIp2, other.staticDnsIp2) && Objects.equals(staticIP, other.staticIP) && Objects.equals(staticIpGw, other.staticIpGw)
|
||||
&& Objects.equals(staticIpMaskCidr, other.staticIpMaskCidr) && Objects.equals(syntheticClientEnabled, other.syntheticClientEnabled);
|
||||
}
|
||||
|
||||
public AntennaType getAntennaType() {
|
||||
@@ -189,14 +186,6 @@ public abstract class CommonElementConfiguration extends EquipmentDetails implem
|
||||
return syntheticClientEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(antennaType, costSavingEventsEnabled, deploymentType, deviceMode, deviceName,
|
||||
elementConfigVersion, equipmentType, forwardMode, frameReportThrottleEnabled, gettingDNS, gettingIP,
|
||||
locallyConfigured, locallyConfiguredMgmtVlan, locationData, peerInfoList, staticDnsIp1, staticDnsIp2,
|
||||
staticIP, staticIpGw, staticIpMaskCidr, syntheticClientEnabled);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasUnsupportedValue() {
|
||||
if (super.hasUnsupportedValue()) {
|
||||
@@ -311,4 +300,13 @@ public abstract class CommonElementConfiguration extends EquipmentDetails implem
|
||||
public void setSyntheticClientEnabled(Boolean syntheticClientEnabled) {
|
||||
this.syntheticClientEnabled = syntheticClientEnabled;
|
||||
}
|
||||
|
||||
public boolean isBlinkAllLEDs() {
|
||||
return blinkAllLEDs;
|
||||
}
|
||||
|
||||
public void setBlinkAllLEDs(boolean blinkAllLEDs) {
|
||||
this.blinkAllLEDs = blinkAllLEDs;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.telecominfraproject.wlan.equipment.models.events;
|
||||
|
||||
import com.telecominfraproject.wlan.equipment.models.Equipment;
|
||||
|
||||
public class EquipmentBlinkLEDsEvent extends EquipmentChangedEvent {
|
||||
private static final long serialVersionUID = 5222048279956123654L;
|
||||
public EquipmentBlinkLEDsEvent(Equipment equipment){
|
||||
super(equipment);
|
||||
setEquipmentChangeType(EquipmentChangeType.blinkLEDs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor used by JSON
|
||||
*/
|
||||
private EquipmentBlinkLEDsEvent() {
|
||||
super();
|
||||
}
|
||||
}
|
||||
@@ -10,11 +10,11 @@ import com.telecominfraproject.wlan.core.model.json.JsonDeserializationUtils;
|
||||
|
||||
public enum EquipmentChangeType {
|
||||
|
||||
All(0), ChannelsOnly(1), CellSizeAttributesOnly(2), ApImpacting(3), UNSUPPORTED(-1);
|
||||
All(0), ChannelsOnly(1), CellSizeAttributesOnly(2), ApImpacting(3), blinkLEDs(4), CustomerOnly(5), UNSUPPORTED(-1);
|
||||
|
||||
private final int id;
|
||||
private static final Map<Integer, EquipmentChangeType> ELEMENTS = new HashMap<>();
|
||||
private static final EquipmentChangeType validValues[] = { All, ChannelsOnly, CellSizeAttributesOnly, ApImpacting};
|
||||
private static final EquipmentChangeType validValues[] = { All, ChannelsOnly, CellSizeAttributesOnly, ApImpacting,blinkLEDs};
|
||||
|
||||
private EquipmentChangeType(int id) {
|
||||
this.id = id;
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.telecominfraproject.wlan.equipment.models.events;
|
||||
|
||||
import com.telecominfraproject.wlan.equipment.models.Equipment;
|
||||
|
||||
public class EquipmentCustomerChangedEvent extends EquipmentChangedEvent {
|
||||
|
||||
private static final long serialVersionUID = 4650302079238674307L;
|
||||
private Equipment existingEquipment; // old equipment
|
||||
private Equipment equipment; // new configured equipment
|
||||
|
||||
public EquipmentCustomerChangedEvent(Equipment existingEquipment, Equipment equipment) {
|
||||
super(equipment);
|
||||
setEquipmentChangeType(EquipmentChangeType.CustomerOnly);
|
||||
this.setExistingEquipment(existingEquipment);
|
||||
this.setEquipment(equipment);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor used by JSON
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
private EquipmentCustomerChangedEvent() {
|
||||
super();
|
||||
}
|
||||
|
||||
public Equipment getExistingEquipment() {
|
||||
return existingEquipment;
|
||||
}
|
||||
|
||||
public void setExistingEquipment(Equipment existingEquipment) {
|
||||
this.existingEquipment = existingEquipment;
|
||||
}
|
||||
|
||||
public Equipment getEquipment() {
|
||||
return equipment;
|
||||
}
|
||||
|
||||
public void setEquipment(Equipment equipment) {
|
||||
this.equipment = equipment;
|
||||
}
|
||||
}
|
||||
@@ -1,57 +1,58 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<artifactId>tip-wlan-cloud-root-pom</artifactId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<relativePath>../../wlan-cloud-root</relativePath>
|
||||
</parent>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<artifactId>tip-wlan-cloud-root-pom</artifactId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<relativePath>../../wlan-cloud-root</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>equipment-service-remote</artifactId>
|
||||
<name>equipment-service-remote</name>
|
||||
<description>Remote client for accessing the service, uses REST API calls.</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<artifactId>equipment-service-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>base-client</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<artifactId>equipment-service-remote</artifactId>
|
||||
<name>equipment-service-remote</name>
|
||||
<description>Remote client for accessing the service, uses REST API calls.</description>
|
||||
|
||||
<!-- Dependencies for the unit tests -->
|
||||
<dependency>
|
||||
<artifactId>base-remote-tests</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-service</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<artifactId>equipment-service-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>base-client</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-empty</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- Dependencies for the unit tests -->
|
||||
<dependency>
|
||||
<artifactId>base-remote-tests</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
<dependency>
|
||||
<artifactId>equipment-service</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-empty</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -1,53 +1,59 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<artifactId>tip-wlan-cloud-root-pom</artifactId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<relativePath>../../wlan-cloud-root</relativePath>
|
||||
</parent>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<artifactId>tip-wlan-cloud-root-pom</artifactId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<relativePath>../../wlan-cloud-root</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>equipment-service</artifactId>
|
||||
<name>equipment-service</name>
|
||||
<description>Server side implementation of the service.</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<artifactId>base-container</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-models</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>equipment-datastore-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>equipment-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<artifactId>equipment-service</artifactId>
|
||||
<name>equipment-service</name>
|
||||
<description>Server side implementation of the service.</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<artifactId>alarm-service-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-empty</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>base-container</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>equipment-models</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>equipment-datastore-interface</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>equipment-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-empty</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -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;
|
||||
@@ -47,14 +44,15 @@ import com.telecominfraproject.wlan.equipment.models.SourceSelectionMulticast;
|
||||
import com.telecominfraproject.wlan.equipment.models.bulkupdate.rrm.EquipmentRrmBulkUpdateRequest;
|
||||
import com.telecominfraproject.wlan.equipment.models.events.EquipmentAddedEvent;
|
||||
import com.telecominfraproject.wlan.equipment.models.events.EquipmentApImpactingChangedEvent;
|
||||
import com.telecominfraproject.wlan.equipment.models.events.EquipmentBlinkLEDsEvent;
|
||||
import com.telecominfraproject.wlan.equipment.models.events.EquipmentCellSizeAttributesChangedEvent;
|
||||
import com.telecominfraproject.wlan.equipment.models.events.EquipmentChangedEvent;
|
||||
import com.telecominfraproject.wlan.equipment.models.events.EquipmentChannelsChangedEvent;
|
||||
import com.telecominfraproject.wlan.equipment.models.events.EquipmentCustomerChangedEvent;
|
||||
import com.telecominfraproject.wlan.equipment.models.events.EquipmentRemovedEvent;
|
||||
import com.telecominfraproject.wlan.server.exceptions.ConfigurationException;
|
||||
import com.telecominfraproject.wlan.systemevent.models.SystemEvent;
|
||||
|
||||
|
||||
/**
|
||||
* @author dtoptygin
|
||||
*
|
||||
@@ -73,7 +71,6 @@ public class EquipmentController {
|
||||
@Autowired private EquipmentDatastore equipmentDatastore;
|
||||
@Autowired private CloudEventDispatcherInterface cloudEventDispatcher;
|
||||
|
||||
|
||||
/**
|
||||
* Creates new Equipment.
|
||||
*
|
||||
@@ -91,12 +88,7 @@ public class EquipmentController {
|
||||
throw new DsDataValidationException("Equipment contains unsupported value");
|
||||
}
|
||||
|
||||
long ts = System.currentTimeMillis();
|
||||
if (equipment.getCreatedTimestamp() == 0) {
|
||||
equipment.setCreatedTimestamp(ts);
|
||||
}
|
||||
equipment.setLastModifiedTimestamp(ts);
|
||||
|
||||
updateValuesIfNeeded(equipment);
|
||||
Equipment ret = equipmentDatastore.create(equipment);
|
||||
|
||||
LOG.debug("Created Equipment {}", ret);
|
||||
@@ -107,7 +99,24 @@ public class EquipmentController {
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
private void updateValuesIfNeeded(Equipment equipment) {
|
||||
// strip out whitespaces from user entered inventoryId and name strings
|
||||
if (equipment.getName() != null) {
|
||||
equipment.setName(equipment.getName().strip());
|
||||
}
|
||||
if (equipment.getInventoryId() != null) {
|
||||
equipment.setInventoryId(equipment.getInventoryId().strip());
|
||||
}
|
||||
|
||||
// Update timestamp
|
||||
long ts = System.currentTimeMillis();
|
||||
if (equipment.getCreatedTimestamp() == 0) {
|
||||
equipment.setCreatedTimestamp(ts);
|
||||
}
|
||||
equipment.setLastModifiedTimestamp(ts);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves Equipment by id
|
||||
* @param equipmentId
|
||||
@@ -263,14 +272,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,51 +287,25 @@ public class EquipmentController {
|
||||
LOG.debug("Updated Equipment {}", ret);
|
||||
|
||||
EquipmentChangedEvent event;
|
||||
if ((equipment.getProfileId() != existingEquipment.getProfileId()) || (existingApElementConfig != null && updatedApElementConfig != null &&
|
||||
if (ret.getCustomerId() != existingEquipment.getCustomerId()) {
|
||||
publishEvent(new EquipmentCustomerChangedEvent(existingEquipment, ret));
|
||||
}
|
||||
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()) {
|
||||
LOG.debug("Updated BlinkingLEDs {}", ret);
|
||||
event = new EquipmentBlinkLEDsEvent(ret);
|
||||
} else {
|
||||
event = new EquipmentChangedEvent(ret);
|
||||
}
|
||||
publishEvent(event);
|
||||
|
||||
|
||||
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
|
||||
*
|
||||
@@ -567,25 +548,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, "");
|
||||
|
||||
@@ -220,6 +220,8 @@ components:
|
||||
type: boolean
|
||||
forwardMode:
|
||||
$ref: '#/components/schemas/NetworkForwardMode'
|
||||
blinkAllLEDs:
|
||||
type: boolean
|
||||
radioMap:
|
||||
$ref: '#/components/schemas/RadioMap'
|
||||
advancedRadioMap:
|
||||
|
||||
@@ -34,7 +34,7 @@ import com.telecominfraproject.wlan.equipment.models.Equipment;
|
||||
EquipmentController.class,
|
||||
CloudEventDispatcherEmpty.class,
|
||||
EquipmentDatastoreInMemory.class,
|
||||
EquipmentControllerTest.Config.class,
|
||||
EquipmentControllerTest.Config.class
|
||||
})
|
||||
public class EquipmentControllerTest {
|
||||
|
||||
@@ -71,11 +71,33 @@ public class EquipmentControllerTest {
|
||||
equipmentController.delete(ret.getId());
|
||||
|
||||
}
|
||||
|
||||
private void assertEqualEquipments(
|
||||
Equipment expected,
|
||||
Equipment actual) {
|
||||
|
||||
|
||||
@Test
|
||||
public void testEquipmentCRUD_ValidateSpaceInInputString() {
|
||||
|
||||
//Create new Equipment - success
|
||||
Equipment equipment = new Equipment();
|
||||
equipment.setName(" nameAndInventoryIdWithTrailingSpaces ");
|
||||
equipment.setInventoryId(" C4411EAA31F5 ");
|
||||
equipment.setEquipmentType(EquipmentType.AP);
|
||||
|
||||
Equipment ret = equipmentController.create(equipment);
|
||||
assertNotNull(ret);
|
||||
|
||||
ret = equipmentController.get(ret.getId());
|
||||
assertEqualEquipments(equipment, ret);
|
||||
|
||||
ret = equipmentController.getOrNull(ret.getId());
|
||||
assertEqualEquipments(equipment, ret);
|
||||
|
||||
assertNull(equipmentController.getOrNull(-1));
|
||||
|
||||
//Delete - success
|
||||
equipmentController.delete(ret.getId());
|
||||
|
||||
}
|
||||
|
||||
private void assertEqualEquipments(Equipment expected, Equipment actual) {
|
||||
assertEquals(expected.getName(), actual.getName());
|
||||
//TODO: add more fields to check here
|
||||
}
|
||||
|
||||
@@ -209,6 +209,7 @@ public class CustomerFirmwareTrackDAO extends BaseJdbcDao {
|
||||
return copy;
|
||||
}
|
||||
|
||||
@Transactional(noRollbackFor = { EmptyResultDataAccessException.class })
|
||||
public CustomerFirmwareTrackRecord getCustomerFirmwareTrackRecord(int customerId) {
|
||||
CustomerFirmwareTrackRecord ret = null;
|
||||
try {
|
||||
|
||||
@@ -57,6 +57,7 @@ public interface FirmwareServiceInterface {
|
||||
CustomerFirmwareTrackRecord updateCustomerFirmwareTrackRecord(CustomerFirmwareTrackRecord record);
|
||||
CustomerFirmwareTrackRecord deleteCustomerFirmwareTrackRecord(int customerId);
|
||||
CustomerFirmwareTrackSettings getDefaultCustomerTrackSetting();
|
||||
CustomerFirmwareTrackSettings updateDefaultCustomerTrackSetting(CustomerFirmwareTrackSettings defaultSettings);
|
||||
|
||||
/**
|
||||
* @param equipmentType
|
||||
|
||||
@@ -81,6 +81,9 @@ public class FirmwareServiceLocal implements FirmwareServiceInterface {
|
||||
public CustomerFirmwareTrackSettings getDefaultCustomerTrackSetting() {
|
||||
return firmwareController.getDefaultCustomerTrackSetting();
|
||||
}
|
||||
public CustomerFirmwareTrackSettings updateDefaultCustomerTrackSetting(CustomerFirmwareTrackSettings defaultSettings) {
|
||||
return firmwareController.updateDefaultCustomerTrackSetting(defaultSettings);
|
||||
}
|
||||
public CustomerFirmwareTrackRecord getCustomerFirmwareTrackRecord(int customerId) {
|
||||
return firmwareController.getCustomerFirmwareTrackRecord(customerId);
|
||||
}
|
||||
|
||||
@@ -387,6 +387,23 @@ public class FirmwareServiceRemote extends BaseRemoteClient implements FirmwareS
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public CustomerFirmwareTrackSettings updateDefaultCustomerTrackSetting(CustomerFirmwareTrackSettings defaultSettings) {
|
||||
LOG.debug("calling updateDefaultCustomerTrackSetting {} ", defaultSettings);
|
||||
|
||||
HttpEntity<String> request = new HttpEntity<String>( defaultSettings.toString(), headers );
|
||||
|
||||
ResponseEntity<CustomerFirmwareTrackSettings> responseEntity = restTemplate.exchange(
|
||||
getBaseUrl()
|
||||
+"/customerTrack/default", HttpMethod.PUT, request,
|
||||
CustomerFirmwareTrackSettings.class);
|
||||
|
||||
CustomerFirmwareTrackSettings ret = responseEntity.getBody();
|
||||
|
||||
LOG.debug("completed updateDefaultCustomerTrackSetting {} ", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import com.telecominfraproject.wlan.datastore.exceptions.DsConcurrentModificatio
|
||||
import com.telecominfraproject.wlan.datastore.exceptions.DsDuplicateEntityException;
|
||||
import com.telecominfraproject.wlan.datastore.exceptions.DsEntityNotFoundException;
|
||||
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackRecord;
|
||||
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackSettings;
|
||||
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackSettings.TrackFlag;
|
||||
import com.telecominfraproject.wlan.firmware.models.FirmwareTrackAssignmentDetails;
|
||||
import com.telecominfraproject.wlan.firmware.models.FirmwareTrackAssignmentRecord;
|
||||
@@ -276,6 +277,47 @@ public class FirmwareServiceRemoteTest extends BaseRemoteTest {
|
||||
assertNull(res);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateUpdateDefaultCustomerFirmwareTrackSettings() {
|
||||
// test initialization
|
||||
FirmwareTrackRecord ftr = new FirmwareTrackRecord();
|
||||
ftr.setTrackName("DEFAULT");
|
||||
ftr = remoteInterface.createFirmwareTrack(ftr);
|
||||
CustomerFirmwareTrackSettings track1 = remoteInterface.getDefaultCustomerTrackSetting();
|
||||
|
||||
assertEquals(TrackFlag.NEVER, track1.getAutoUpgradeDeprecatedOnBind());
|
||||
assertEquals(TrackFlag.NEVER, track1.getAutoUpgradeUnknownOnBind());
|
||||
assertEquals(TrackFlag.NEVER, track1.getAutoUpgradeDeprecatedDuringMaintenance());
|
||||
assertEquals(TrackFlag.NEVER, track1.getAutoUpgradeUnknownDuringMaintenance());
|
||||
|
||||
// test persistent save
|
||||
CustomerFirmwareTrackRecord defaultCustomerSettings = remoteInterface.getCustomerFirmwareTrackRecord(0);
|
||||
assertEquals(track1, defaultCustomerSettings.getSettings());
|
||||
|
||||
// test update
|
||||
track1.setAutoUpgradeDeprecatedOnBind(TrackFlag.ALWAYS);
|
||||
CustomerFirmwareTrackSettings track2 = remoteInterface.updateDefaultCustomerTrackSetting(track1);
|
||||
|
||||
assertEquals(TrackFlag.ALWAYS, track2.getAutoUpgradeDeprecatedOnBind());
|
||||
assertEquals(TrackFlag.NEVER, track2.getAutoUpgradeUnknownOnBind());
|
||||
assertEquals(TrackFlag.NEVER, track2.getAutoUpgradeDeprecatedDuringMaintenance());
|
||||
assertEquals(TrackFlag.NEVER, track2.getAutoUpgradeUnknownDuringMaintenance());
|
||||
|
||||
defaultCustomerSettings = remoteInterface.getCustomerFirmwareTrackRecord(0);
|
||||
assertEquals(track2, defaultCustomerSettings.getSettings());
|
||||
|
||||
// Delete test
|
||||
remoteInterface.deleteCustomerFirmwareTrackRecord(0);
|
||||
|
||||
// test update initialization
|
||||
CustomerFirmwareTrackSettings track3 = remoteInterface.updateDefaultCustomerTrackSetting(track2);
|
||||
assertEquals(track3, track2);
|
||||
|
||||
// Clean up test
|
||||
remoteInterface.deleteCustomerFirmwareTrackRecord(0);
|
||||
remoteInterface.deleteFirmwareTrackRecord(ftr.getRecordId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateUpdateDeleteFirmwareTrackAssignment() {
|
||||
|
||||
@@ -2,8 +2,6 @@ package com.telecominfraproject.wlan.firmware.controller;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -22,11 +20,11 @@ import com.telecominfraproject.wlan.datastore.exceptions.DsEntityNotFoundExcepti
|
||||
import com.telecominfraproject.wlan.firmware.datastore.FirmwareDatastore;
|
||||
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackRecord;
|
||||
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackSettings;
|
||||
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackSettings.TrackFlag;
|
||||
import com.telecominfraproject.wlan.firmware.models.FirmwareTrackAssignmentDetails;
|
||||
import com.telecominfraproject.wlan.firmware.models.FirmwareTrackAssignmentRecord;
|
||||
import com.telecominfraproject.wlan.firmware.models.FirmwareTrackRecord;
|
||||
import com.telecominfraproject.wlan.firmware.models.FirmwareVersion;
|
||||
import com.telecominfraproject.wlan.firmware.models.CustomerFirmwareTrackSettings.TrackFlag;
|
||||
import com.telecominfraproject.wlan.systemevent.models.SystemEvent;
|
||||
|
||||
|
||||
@@ -44,35 +42,11 @@ public class FirmwareController {
|
||||
@Autowired private FirmwareDatastore firmwareDatastore;
|
||||
@Autowired private CloudEventDispatcherInterface cloudEventDispatcher;
|
||||
@Autowired Environment environment;
|
||||
|
||||
CustomerFirmwareTrackSettings defaultCustomerTrackSettings;
|
||||
|
||||
@PostConstruct
|
||||
private void postConstruct() {
|
||||
defaultCustomerTrackSettings = new CustomerFirmwareTrackSettings();
|
||||
defaultCustomerTrackSettings.setAutoUpgradeDeprecatedOnBind(environment
|
||||
.getProperty("whizcontrol.autoupgrade.deprecated", TrackFlag.class, TrackFlag.NEVER));
|
||||
defaultCustomerTrackSettings.setAutoUpgradeUnknownOnBind(environment
|
||||
.getProperty("whizcontrol.autoupgrade.unknown", TrackFlag.class, TrackFlag.NEVER));
|
||||
defaultCustomerTrackSettings.setAutoUpgradeDeprecatedDuringMaintenance(environment.getProperty(
|
||||
"whizcontrol.maintenanceupgrade.deprecated", TrackFlag.class, TrackFlag.NEVER));
|
||||
defaultCustomerTrackSettings.setAutoUpgradeUnknownDuringMaintenance(environment
|
||||
.getProperty("whizcontrol.maintenanceupgrade.unknown", TrackFlag.class, TrackFlag.NEVER));
|
||||
LOG.info("Default CustomerFirmwareTrackSettings: {}", defaultCustomerTrackSettings);
|
||||
}
|
||||
|
||||
private void publishEvent(SystemEvent event) {
|
||||
if (event == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
cloudEventDispatcher.publishEvent(event);
|
||||
} catch (Exception e) {
|
||||
LOG.error("Failed to publish event : {}", event, e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FirmwareVersion API
|
||||
*/
|
||||
@RequestMapping(value = "/version", method = RequestMethod.POST)
|
||||
public FirmwareVersion createFirmwareVersion(@RequestBody FirmwareVersion firmwareVersion) {
|
||||
|
||||
@@ -149,6 +123,10 @@ public class FirmwareController {
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FirmwareTrackRecord API
|
||||
*/
|
||||
@RequestMapping(value = "/track", method = RequestMethod.POST)
|
||||
public FirmwareTrackRecord createFirmwareTrack(@RequestBody FirmwareTrackRecord firmwareTrack) {
|
||||
LOG.debug("calling createFirmwareTrack({})", firmwareTrack);
|
||||
@@ -193,7 +171,10 @@ public class FirmwareController {
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* FirmwareTrackAssignmentDetails API
|
||||
*/
|
||||
@RequestMapping(value = "/trackAssignment", method = RequestMethod.GET)
|
||||
public List<FirmwareTrackAssignmentDetails> getFirmwareTrackAssignments (
|
||||
@RequestParam String firmwareTrackName) {
|
||||
@@ -220,33 +201,50 @@ public class FirmwareController {
|
||||
FirmwareTrackAssignmentDetails result = new FirmwareTrackAssignmentDetails(assignment, version);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* CustomerFirmwareTrackSettings API
|
||||
*/
|
||||
@RequestMapping(value = "/customerTrack/default", method = RequestMethod.GET)
|
||||
public CustomerFirmwareTrackSettings getDefaultCustomerTrackSetting() {
|
||||
if (defaultCustomerTrackSettings == null) {
|
||||
if (defaultCustomerTrackSettings == null) {
|
||||
defaultCustomerTrackSettings = new CustomerFirmwareTrackSettings();
|
||||
defaultCustomerTrackSettings.setAutoUpgradeDeprecatedOnBind(environment
|
||||
.getProperty("whizcontrol.autoupgrade.deprecated", TrackFlag.class, TrackFlag.NEVER));
|
||||
defaultCustomerTrackSettings.setAutoUpgradeUnknownOnBind(environment
|
||||
.getProperty("whizcontrol.autoupgrade.unknown", TrackFlag.class, TrackFlag.NEVER));
|
||||
defaultCustomerTrackSettings.setAutoUpgradeDeprecatedDuringMaintenance(environment.getProperty(
|
||||
"whizcontrol.maintenanceupgrade.deprecated", TrackFlag.class, TrackFlag.NEVER));
|
||||
defaultCustomerTrackSettings.setAutoUpgradeUnknownDuringMaintenance(environment
|
||||
.getProperty("whizcontrol.maintenanceupgrade.unknown", TrackFlag.class, TrackFlag.NEVER));
|
||||
LOG.info("Default CustomerFirmwareTrackSettings: {}", defaultCustomerTrackSettings);
|
||||
}
|
||||
CustomerFirmwareTrackRecord defaultRecord = firmwareDatastore.getCustomerFirmwareTrackRecord(0);
|
||||
if (defaultRecord == null) {
|
||||
LOG.debug("No default record exists, creating the default");
|
||||
defaultRecord = new CustomerFirmwareTrackRecord();
|
||||
defaultRecord.setCustomerId(0);
|
||||
CustomerFirmwareTrackSettings defaultSettings = new CustomerFirmwareTrackSettings();
|
||||
defaultSettings.setAutoUpgradeDeprecatedOnBind(TrackFlag.NEVER);
|
||||
defaultSettings.setAutoUpgradeUnknownOnBind(TrackFlag.NEVER);
|
||||
defaultSettings.setAutoUpgradeDeprecatedDuringMaintenance(TrackFlag.NEVER);
|
||||
defaultSettings.setAutoUpgradeUnknownDuringMaintenance(TrackFlag.NEVER);
|
||||
|
||||
defaultRecord.setSettings(defaultSettings);
|
||||
defaultRecord.setTrackRecordId(firmwareDatastore.getFirmwareTrackByName("DEFAULT").getRecordId());
|
||||
defaultRecord = firmwareDatastore.createCustomerFirmwareTrackRecord(defaultRecord);
|
||||
}
|
||||
return defaultCustomerTrackSettings;
|
||||
return defaultRecord.getSettings();
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "/customerTrack/default", method = RequestMethod.PUT)
|
||||
public CustomerFirmwareTrackSettings updateDefaultCustomerTrackSetting(@RequestBody CustomerFirmwareTrackSettings customerTrackSettings) {
|
||||
CustomerFirmwareTrackRecord defaultRecord = firmwareDatastore.getCustomerFirmwareTrackRecord(0);
|
||||
if (defaultRecord == null) {
|
||||
defaultRecord = new CustomerFirmwareTrackRecord();
|
||||
defaultRecord.setCustomerId(0);
|
||||
defaultRecord.setSettings(customerTrackSettings);
|
||||
defaultRecord.setTrackRecordId(firmwareDatastore.getFirmwareTrackByName("DEFAULT").getRecordId());
|
||||
return firmwareDatastore.createCustomerFirmwareTrackRecord(defaultRecord).getSettings();
|
||||
}
|
||||
defaultRecord.setSettings(customerTrackSettings);
|
||||
return firmwareDatastore.updateCustomerFirmwareTrackRecord(defaultRecord).getSettings();
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/customerTrack", method = RequestMethod.GET)
|
||||
public CustomerFirmwareTrackRecord getCustomerFirmwareTrackRecord(@RequestParam int customerId) {
|
||||
LOG.debug("calling getCustomerFirmwareTrackRecord({})", customerId);
|
||||
return firmwareDatastore.getCustomerFirmwareTrackRecord(customerId);
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "/customerTrack", method = RequestMethod.POST)
|
||||
public CustomerFirmwareTrackRecord createCustomerFirmwareTrackRecord(@RequestBody CustomerFirmwareTrackRecord customerTrack) {
|
||||
@@ -255,7 +253,6 @@ public class FirmwareController {
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "/customerTrack", method = RequestMethod.PUT)
|
||||
public CustomerFirmwareTrackRecord updateCustomerFirmwareTrackRecord(@RequestBody CustomerFirmwareTrackRecord customerTrack) {
|
||||
LOG.debug("calling updateCustomerFirmwareTrackRecord({})", customerTrack);
|
||||
@@ -270,8 +267,6 @@ public class FirmwareController {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@RequestMapping(value = "/customerTrack", method = RequestMethod.DELETE)
|
||||
public CustomerFirmwareTrackRecord deleteCustomerFirmwareTrackRecord(@RequestParam int customerId) {
|
||||
@@ -279,6 +274,17 @@ public class FirmwareController {
|
||||
CustomerFirmwareTrackRecord result = firmwareDatastore.deleteCustomerFirmwareTrackRecord(customerId);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private void publishEvent(SystemEvent event) {
|
||||
if (event == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
cloudEventDispatcher.publishEvent(event);
|
||||
} catch (Exception e) {
|
||||
LOG.error("Failed to publish event : {}", event, e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -619,11 +619,12 @@ paths:
|
||||
$ref: '#/components/schemas/FirmwareTrackAssignmentDetails'
|
||||
500:
|
||||
$ref: '#/components/responses/GenericApiError'
|
||||
|
||||
/api/firmware/customerTrack/default:
|
||||
get:
|
||||
tags:
|
||||
- Firmware Data
|
||||
summary: Get customer firmware track settings
|
||||
summary: Get customer firmware track settings, if it doesn't exist, create it
|
||||
operationId: getCustomerFirmwareTrackSettings
|
||||
responses:
|
||||
200:
|
||||
@@ -634,6 +635,27 @@ paths:
|
||||
$ref: '#/components/schemas/CustomerFirmwareTrackSettings'
|
||||
500:
|
||||
$ref: '#/components/responses/GenericApiError'
|
||||
put:
|
||||
tags:
|
||||
- Firmware Data
|
||||
summary: Update customer firmware track settings, if it doesn't exist, create it
|
||||
operationId: updateCustomerFirmwareTrackSettings
|
||||
requestBody:
|
||||
description: CustomerFirmwareTrackSettings
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/CustomerFirmwareTrackSettings'
|
||||
responses:
|
||||
200:
|
||||
description: Successful operation
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/CustomerFirmwareTrackSettings'
|
||||
500:
|
||||
$ref: '#/components/responses/GenericApiError'
|
||||
|
||||
/api/firmware/customerTrack:
|
||||
post:
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
package com.telecominfraproject.wlan.location.models.events;
|
||||
|
||||
import com.telecominfraproject.wlan.core.model.json.interfaces.HasLocationId;
|
||||
import com.telecominfraproject.wlan.location.models.Location;
|
||||
import com.telecominfraproject.wlan.systemevent.models.CustomerEventWithPayload;
|
||||
|
||||
public class LocationChangedApImpactingEvent extends CustomerEventWithPayload<Location> implements HasLocationId {
|
||||
private static final long serialVersionUID = -8369849230866347412L;
|
||||
|
||||
public LocationChangedApImpactingEvent(Location location){
|
||||
super(location.getCustomerId(), location);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLocationId() {
|
||||
if (getPayload() != null) {
|
||||
return getPayload().getId();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor used by JSON
|
||||
*/
|
||||
public LocationChangedApImpactingEvent() {
|
||||
super(0, 0, null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -80,7 +80,7 @@ public class LocationServiceRemoteTest extends BaseRemoteTest {
|
||||
location.setLocationType(LocationType.FLOOR);
|
||||
location.setCustomerId(getNextCustomerId());
|
||||
location.setName("testName_updated");
|
||||
location.setDetails(generateDetails(CountryCode.US));
|
||||
location.setDetails(generateDetails(CountryCode.CA));
|
||||
|
||||
Location retFromUpdate = testInterface.update(location);
|
||||
assertFieldEquals(location, retFromUpdate);
|
||||
@@ -95,6 +95,14 @@ public class LocationServiceRemoteTest extends BaseRemoteTest {
|
||||
// expected it
|
||||
}
|
||||
|
||||
//UPDATE test - fail because country code cannot be modified once created
|
||||
try {
|
||||
location.setDetails(generateDetails(CountryCode.US));
|
||||
testInterface.update(location);
|
||||
fail("failed to detect country code update");
|
||||
} catch (IllegalStateException e) {
|
||||
// expected it
|
||||
}
|
||||
|
||||
//DELETE Test
|
||||
testInterface.delete(ret.getId());
|
||||
|
||||
@@ -25,7 +25,6 @@ import com.telecominfraproject.wlan.datastore.exceptions.DsEntityNotFoundExcepti
|
||||
import com.telecominfraproject.wlan.location.datastore.LocationDatastore;
|
||||
import com.telecominfraproject.wlan.location.models.Location;
|
||||
import com.telecominfraproject.wlan.location.models.events.LocationAddedEvent;
|
||||
import com.telecominfraproject.wlan.location.models.events.LocationChangedApImpactingEvent;
|
||||
import com.telecominfraproject.wlan.location.models.events.LocationChangedEvent;
|
||||
import com.telecominfraproject.wlan.location.models.events.LocationRemovedEvent;
|
||||
import com.telecominfraproject.wlan.systemevent.models.SystemEvent;
|
||||
@@ -97,14 +96,15 @@ public class LocationServiceController {
|
||||
}
|
||||
|
||||
Location existingLocation = locationDatastore.get(location.getId());
|
||||
|
||||
if (location.needsToBeUpdatedOnDevice(existingLocation)) {
|
||||
throw new IllegalStateException("Cannot update location. Country code is not allow to modify once created.");
|
||||
}
|
||||
|
||||
Location ret = locationDatastore.update(location);
|
||||
|
||||
List<SystemEvent> events = new ArrayList<>();
|
||||
|
||||
if (ret.needsToBeUpdatedOnDevice(existingLocation)) {
|
||||
events.add(new LocationChangedApImpactingEvent(ret));
|
||||
}
|
||||
events.add(new LocationChangedEvent(ret));
|
||||
|
||||
publishEvents(events);
|
||||
|
||||
@@ -191,18 +191,18 @@ public class ManufacturerServiceRemoteTest extends BaseRemoteTest {
|
||||
Set<String> ouiList = new HashSet<>();
|
||||
ouiList.add(oui1);
|
||||
ouiListSearchResult = remoteInterface.getManufacturerDetailsForOuiSet(ouiList);
|
||||
assertTrue(ouiListSearchResult.size() == 1);
|
||||
assertTrue(ouiListSearchResult.size() == 2);
|
||||
assertTrue(ouiListSearchResult.get(oui1).equals(ret1));
|
||||
|
||||
ouiList.add(oui2);
|
||||
ouiListSearchResult = remoteInterface.getManufacturerDetailsForOuiSet(ouiList);
|
||||
assertTrue(ouiListSearchResult.size() == 2);
|
||||
assertTrue(ouiListSearchResult.size() == 3);
|
||||
assertTrue(ouiListSearchResult.get(oui1).equals(ret1));
|
||||
assertTrue(ouiListSearchResult.get(oui2).equals(ret2));
|
||||
|
||||
ouiList.add(oui3);
|
||||
ouiListSearchResult = remoteInterface.getManufacturerDetailsForOuiSet(ouiList);
|
||||
assertTrue(ouiListSearchResult.size() == 3);
|
||||
assertTrue(ouiListSearchResult.size() == 4);
|
||||
assertTrue(ouiListSearchResult.get(oui1).equals(ret1));
|
||||
assertTrue(ouiListSearchResult.get(oui2).equals(ret2));
|
||||
assertTrue(ouiListSearchResult.get(oui3).equals(ret3));
|
||||
@@ -211,7 +211,7 @@ public class ManufacturerServiceRemoteTest extends BaseRemoteTest {
|
||||
ouiList.add(String.format("%06d", i));
|
||||
}
|
||||
ouiListSearchResult = remoteInterface.getManufacturerDetailsForOuiSet(ouiList);
|
||||
assertEquals(3,ouiListSearchResult.size());
|
||||
assertEquals(4,ouiListSearchResult.size());
|
||||
assertTrue(ouiListSearchResult.get(oui1).equals(ret1));
|
||||
assertTrue(ouiListSearchResult.get(oui2).equals(ret2));
|
||||
assertTrue(ouiListSearchResult.get(oui3).equals(ret3));
|
||||
|
||||
@@ -35,7 +35,10 @@ import com.telecominfraproject.wlan.manufacturer.models.ManufacturerOuiDetails;
|
||||
public class ManufacturerController {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ManufacturerController.class);
|
||||
|
||||
|
||||
private static final int GLOBE_BIT = (0x1 << 1);
|
||||
private static final ManufacturerOuiDetails PRIVATE_MAC_RESPONSE = new ManufacturerOuiDetails();
|
||||
|
||||
@Autowired
|
||||
private ManufacturerDatastoreInterface manufacturerDatastore;
|
||||
|
||||
@@ -43,6 +46,11 @@ public class ManufacturerController {
|
||||
private static final long serialVersionUID = -8035392255039609079L;
|
||||
}
|
||||
|
||||
static {
|
||||
PRIVATE_MAC_RESPONSE.setOui("ffffff");
|
||||
PRIVATE_MAC_RESPONSE.setManufacturerName("Unknown (Private Address)");
|
||||
PRIVATE_MAC_RESPONSE.setManufacturerAlias("Unknown");
|
||||
}
|
||||
@PostMapping(value = "/oui")
|
||||
public ManufacturerOuiDetails createOuiDetails(@RequestBody ManufacturerOuiDetails ouiDetails) {
|
||||
LOG.debug("Creating OUI details {} ", ouiDetails);
|
||||
@@ -76,9 +84,7 @@ public class ManufacturerController {
|
||||
@GetMapping(value = "/oui")
|
||||
public ManufacturerOuiDetails getByOui(@RequestParam String oui) {
|
||||
LOG.debug("Retrieving OUI details for OUI {} ", oui);
|
||||
|
||||
ManufacturerOuiDetails ret = manufacturerDatastore.getByOui(oui);
|
||||
|
||||
ManufacturerOuiDetails ret = isGlobalAddress(oui) ? manufacturerDatastore.getByOui(oui) : PRIVATE_MAC_RESPONSE;
|
||||
LOG.debug("Retrieved OUI details {} ", ret);
|
||||
return ret;
|
||||
}
|
||||
@@ -157,7 +163,11 @@ public class ManufacturerController {
|
||||
public Map<String, ManufacturerOuiDetails> getManufacturerDetailsForOuiList(
|
||||
@RequestParam List<String> ouiList) {
|
||||
LOG.debug("calling getManufacturerDetailsForOuiList ");
|
||||
return manufacturerDatastore.getManufacturerDetailsForOuiList(ouiList);
|
||||
Map<String, ManufacturerOuiDetails> manufMap = manufacturerDatastore.getManufacturerDetailsForOuiList(ouiList);
|
||||
|
||||
ouiList.forEach(oui -> {if (!isGlobalAddress(oui)) manufMap.put(oui, PRIVATE_MAC_RESPONSE);});
|
||||
manufMap.put(PRIVATE_MAC_RESPONSE.getOui(), PRIVATE_MAC_RESPONSE);
|
||||
return manufMap;
|
||||
}
|
||||
|
||||
@PutMapping(value = "/oui/alias")
|
||||
@@ -180,4 +190,14 @@ public class ManufacturerController {
|
||||
LOG.debug("Retrieving alias values that begin with {}", prefix);
|
||||
return manufacturerDatastore.getAliasValuesThatBeginWith(prefix, maxResults);
|
||||
}
|
||||
|
||||
private boolean isGlobalAddress(String oui) {
|
||||
if (oui != null && oui.length() == 6) {
|
||||
// we only need to check the first Byte of the OUI
|
||||
Integer hex = Integer.parseInt(oui.substring(0, 2), 16);
|
||||
byte firstByte = hex.byteValue();
|
||||
return (firstByte & GLOBE_BIT) == 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -118,6 +118,85 @@
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- test dependencies -->
|
||||
<dependency>
|
||||
<artifactId>equipment-service-local</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>equipment-service</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>equipment-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>cloud-event-dispatcher-empty</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>profile-service-local</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>profile-service</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<version>1.2.0-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<artifactId>profile-datastore-inmemory</artifactId>
|
||||
<groupId>com.telecominfraproject.wlan</groupId>
|
||||
<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>
|
||||
|
||||
|
||||
@@ -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, "");
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
package com.telecominfraproject.wlan.portal.controller.equipmentgateway;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
@@ -11,8 +12,11 @@ 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;
|
||||
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWNewChannelRequest;
|
||||
@@ -30,7 +34,7 @@ import com.telecominfraproject.wlan.status.equipment.models.EquipmentResetMethod
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping(value = "/portal")
|
||||
public class EquipmentGatewayPortalController {
|
||||
public class EquipmentGatewayPortalController {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(EquipmentGatewayPortalController.class);
|
||||
|
||||
@@ -49,94 +53,116 @@ public class EquipmentGatewayPortalController {
|
||||
|
||||
Equipment equipment = equipmentServiceInterface.get(equipmentId);
|
||||
FirmwareVersion fwVersion = firmwareServiceInterface.getFirmwareVersion(firmwareVersionId);
|
||||
|
||||
CEGWFirmwareDownloadRequest fwDownloadRequest = new CEGWFirmwareDownloadRequest(equipment.getInventoryId(),
|
||||
equipment.getId(), fwVersion.getVersionName(), fwVersion.getFilename());
|
||||
|
||||
CEGWFirmwareDownloadRequest fwDownloadRequest =
|
||||
new CEGWFirmwareDownloadRequest(equipment.getInventoryId(), equipment.getId(), fwVersion.getVersionName(), fwVersion.getFilename());
|
||||
|
||||
EquipmentCommandResponse response = equipmentGatewayServiceInterface.sendCommand(fwDownloadRequest);
|
||||
LOG.debug("FW Download Response {}", response);
|
||||
|
||||
if(response.getResultCode() == CEGWCommandResultCode.Success) {
|
||||
return new GenericResponse(true,"");
|
||||
if (response.getResultCode() == CEGWCommandResultCode.Success) {
|
||||
return new GenericResponse(true, "");
|
||||
} else {
|
||||
return new GenericResponse(false, "Failed to request firmware update: "+ response.getResultCode() + " " + response.getResultDetail());
|
||||
return new GenericResponse(false, "Failed to request firmware update: " + response.getResultCode() + " " + response.getResultDetail());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "/equipmentGateway/requestChannelChange", method = RequestMethod.POST)
|
||||
public GenericResponse requestChannelChange(@RequestParam long equipmentId, @RequestBody RadioChannelChangeSettings radioChannelChangeSettings) {
|
||||
LOG.debug("requestChannelChange {} {}", equipmentId);
|
||||
|
||||
Equipment equipment = equipmentServiceInterface.get(equipmentId);
|
||||
|
||||
CEGWNewChannelRequest newChannelRequest = new CEGWNewChannelRequest(equipment.getInventoryId(), equipmentId, radioChannelChangeSettings.getBackupChannel(), radioChannelChangeSettings.getPrimaryChannel());
|
||||
|
||||
Equipment equipment = equipmentServiceInterface.get(equipmentId);
|
||||
|
||||
CEGWNewChannelRequest newChannelRequest = new CEGWNewChannelRequest(equipment.getInventoryId(), equipmentId,
|
||||
radioChannelChangeSettings.getBackupChannel(), radioChannelChangeSettings.getPrimaryChannel());
|
||||
|
||||
EquipmentCommandResponse response = equipmentGatewayServiceInterface.sendCommand(newChannelRequest);
|
||||
LOG.debug("Channel Change Response {}", response);
|
||||
|
||||
if(response.getResultCode() == CEGWCommandResultCode.Success) {
|
||||
return new GenericResponse(true,"");
|
||||
if (response.getResultCode() == CEGWCommandResultCode.Success) {
|
||||
return new GenericResponse(true, "");
|
||||
} else {
|
||||
return new GenericResponse(false, "Failed to initiate channel change: "+ response.getResultCode() + " " + response.getResultDetail());
|
||||
return new GenericResponse(false, "Failed to initiate channel change: " + response.getResultCode() + " " + response.getResultDetail());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "/equipmentGateway/requestApReboot", method = RequestMethod.POST)
|
||||
public GenericResponse requestApReboot(@RequestParam long equipmentId) {
|
||||
LOG.debug("requestApReboot {}", equipmentId);
|
||||
|
||||
Equipment equipment = equipmentServiceInterface.get(equipmentId);
|
||||
// No config change, just plain reboot
|
||||
CEGWRebootRequest apRebootRequest = new CEGWRebootRequest(equipment.getInventoryId(),
|
||||
equipment.getId(), false, EquipmentResetMethod.NoReset);
|
||||
// No config change, just plain reboot
|
||||
CEGWRebootRequest apRebootRequest = new CEGWRebootRequest(equipment.getInventoryId(), equipment.getId(), false, EquipmentResetMethod.NoReset);
|
||||
|
||||
EquipmentCommandResponse response = equipmentGatewayServiceInterface.sendCommand(apRebootRequest);
|
||||
LOG.debug("AP reboot response {}", response);
|
||||
|
||||
if(response.getResultCode() == CEGWCommandResultCode.Success) {
|
||||
return new GenericResponse(true,"");
|
||||
if (response.getResultCode() == CEGWCommandResultCode.Success) {
|
||||
return new GenericResponse(true, "");
|
||||
} else {
|
||||
return new GenericResponse(false, "Failed to trigger AP reboot: "+ response.getResultCode() + " " + response.getResultDetail());
|
||||
return new GenericResponse(false, "Failed to trigger AP reboot: " + response.getResultCode() + " " + response.getResultDetail());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "/equipmentGateway/requestApSwitchSoftwareBank", method = RequestMethod.POST)
|
||||
public GenericResponse requestApSwitchSoftwareBank(@RequestParam long equipmentId) {
|
||||
LOG.debug("requestApSwitchSoftwareBank {}", equipmentId);
|
||||
|
||||
Equipment equipment = equipmentServiceInterface.get(equipmentId);
|
||||
// Reboot, switch active/inactive software bank
|
||||
CEGWRebootRequest apSwitchSoftwareBank = new CEGWRebootRequest(equipment.getInventoryId(),
|
||||
equipment.getId(), true, EquipmentResetMethod.NoReset);
|
||||
// Reboot, switch active/inactive software bank
|
||||
CEGWRebootRequest apSwitchSoftwareBank = new CEGWRebootRequest(equipment.getInventoryId(), equipment.getId(), true, EquipmentResetMethod.NoReset);
|
||||
|
||||
EquipmentCommandResponse response = equipmentGatewayServiceInterface.sendCommand(apSwitchSoftwareBank);
|
||||
LOG.debug("AP switch software bank response {}", response);
|
||||
|
||||
if(response.getResultCode() == CEGWCommandResultCode.Success) {
|
||||
return new GenericResponse(true,"");
|
||||
if (response.getResultCode() == CEGWCommandResultCode.Success) {
|
||||
return new GenericResponse(true, "");
|
||||
} else {
|
||||
return new GenericResponse(false, "Failed to trigger AP switch software bank: "+ response.getResultCode() + " " + response.getResultDetail());
|
||||
return new GenericResponse(false, "Failed to trigger AP switch software bank: " + response.getResultCode() + " " + response.getResultDetail());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "/equipmentGateway/requestApFactoryReset", method = RequestMethod.POST)
|
||||
public GenericResponse requestApFactoryReset(@RequestParam long equipmentId) {
|
||||
LOG.debug("requestApFactoryReset {}", equipmentId);
|
||||
|
||||
Equipment equipment = equipmentServiceInterface.get(equipmentId);
|
||||
// Reboot Ap with factory settings
|
||||
CEGWRebootRequest apFactoryReset = new CEGWRebootRequest(equipment.getInventoryId(),
|
||||
equipment.getId(), false, EquipmentResetMethod.FactoryReset);
|
||||
// Reboot Ap with factory settings
|
||||
CEGWRebootRequest apFactoryReset = new CEGWRebootRequest(equipment.getInventoryId(), equipment.getId(), false, EquipmentResetMethod.FactoryReset);
|
||||
|
||||
EquipmentCommandResponse response = equipmentGatewayServiceInterface.sendCommand(apFactoryReset);
|
||||
LOG.debug("AP factory reset response {}", response);
|
||||
|
||||
if(response.getResultCode() == CEGWCommandResultCode.Success) {
|
||||
return new GenericResponse(true,"");
|
||||
if (response.getResultCode() == CEGWCommandResultCode.Success) {
|
||||
return new GenericResponse(true, "");
|
||||
} else {
|
||||
return new GenericResponse(false, "Failed to trigger AP factory reset: "+ response.getResultCode() + " " + response.getResultDetail());
|
||||
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";
|
||||
Equipment equipment = equipmentServiceInterface.get(equipmentId);
|
||||
LOG.debug("Request {} for AP {}", action, equipment.getInventoryId());
|
||||
|
||||
// Turn LEDs on Ap on or off based on blinkAllLEDs value
|
||||
CEGWBlinkRequest apBlinkLEDs = new CEGWBlinkRequest(equipment.getInventoryId(), equipment.getId());
|
||||
apBlinkLEDs.setBlinkAllLEDs(blinkAllLEDs);
|
||||
|
||||
EquipmentCommandResponse response = equipmentGatewayServiceInterface.sendCommand(apBlinkLEDs);
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -173,6 +173,11 @@ public class FirmwarePortalController {
|
||||
return firmwareServiceInterface.getDefaultCustomerTrackSetting();
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/customerTrack/default", method = RequestMethod.PUT)
|
||||
public CustomerFirmwareTrackSettings updateDefaultCustomerTrackSetting(@RequestBody CustomerFirmwareTrackSettings defaultSettings) {
|
||||
LOG.debug("calling updateDefaultCustomerTrackSetting({})", defaultSettings);
|
||||
return firmwareServiceInterface.updateDefaultCustomerTrackSetting(defaultSettings);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/customerTrack", method = RequestMethod.GET)
|
||||
public CustomerFirmwareTrackRecord getCustomerFirmwareTrackRecord(@RequestParam int customerId) {
|
||||
|
||||
@@ -158,55 +158,66 @@ public class ProfilePortalController {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping(value = "/profile/equipmentCounts", method = RequestMethod.GET)
|
||||
public ListOfPairLongLong getCountsOfEquipmentThatUseProfiles(@RequestParam Set<Long> profileIdSet) {
|
||||
LOG.debug("getCountsOfEquipmentThatUseProfiles({})", profileIdSet);
|
||||
|
||||
//first get top-level profiles for the supplied set - only top-level profiles are linked to equipment
|
||||
List<PairLongLong> topLevelProfiles = this.profileServiceInterface.getTopLevelProfiles(profileIdSet);
|
||||
Map<Long, AtomicInteger> profileIdToCountMap = new HashMap<Long, AtomicInteger>();
|
||||
profileIdSet.forEach(profileId -> profileIdToCountMap.put(profileId, new AtomicInteger(0)));
|
||||
|
||||
//Maps child at all top level profiles that reference it. A top level profile references itself int this map
|
||||
Map<Long, List<Long>> childProfileToTopProfileMap = new HashMap<Long, List<Long>>();
|
||||
|
||||
List<PairLongLong> topLevelProfileList = profileServiceInterface.getTopLevelProfiles(profileIdSet);
|
||||
Set<Long> topProfileIdSet= new HashSet<Long>();
|
||||
|
||||
topLevelProfileList.forEach(pair ->
|
||||
{
|
||||
if (childProfileToTopProfileMap.putIfAbsent(
|
||||
pair.getValue1(),
|
||||
new ArrayList<Long>() {{ add(pair.getValue2());}}
|
||||
) != null)
|
||||
{
|
||||
childProfileToTopProfileMap.compute(pair.getValue1(), (k,v) ->
|
||||
new ArrayList<Long>() {{
|
||||
addAll(v);
|
||||
add(pair.getValue2());}});
|
||||
}
|
||||
topProfileIdSet.add(pair.getValue2());
|
||||
});
|
||||
|
||||
Map<Long, AtomicInteger> topProfileToEquipmentCountMap = new HashMap<>();
|
||||
topProfileIdSet.forEach(p -> topProfileToEquipmentCountMap.put(p, new AtomicInteger()));
|
||||
|
||||
PaginationContext<PairLongLong> context = new PaginationContext<>(500);
|
||||
equipmentServiceInterface.getEquipmentIdsByProfileIds(topProfileIdSet, context);
|
||||
|
||||
while(!context.isLastPage()) {
|
||||
PaginationResponse<PairLongLong> page = equipmentServiceInterface.getEquipmentIdsByProfileIds(topProfileIdSet, context );
|
||||
context = page.getContext();
|
||||
|
||||
page.getItems().forEach(p -> {
|
||||
AtomicInteger cnt = topProfileToEquipmentCountMap.get(p.getValue1());
|
||||
if(cnt!=null) {
|
||||
cnt.incrementAndGet();
|
||||
}
|
||||
});
|
||||
|
||||
LOG.debug("Page {} - counted {} equipmentids", context.getLastReturnedPageNumber(), context.getTotalItemsReturned());
|
||||
}
|
||||
|
||||
// assemble profile count for return, using child to top level profile id map
|
||||
childProfileToTopProfileMap.forEach((childKey,TopLevelIdList) ->
|
||||
{
|
||||
for (Long topProfileId : TopLevelIdList)
|
||||
{
|
||||
profileIdToCountMap.get(childKey).addAndGet(topProfileToEquipmentCountMap.get(topProfileId).get());
|
||||
}
|
||||
});
|
||||
//package results to get equipment counts for the original profile ids
|
||||
ListOfPairLongLong ret = new ListOfPairLongLong();
|
||||
profileIdToCountMap.forEach((id, count) -> ret.add(new PairLongLong(id, count.get())));
|
||||
|
||||
//map each supplied profile to its top-level parent
|
||||
Map<Long, Long> profileIdToTopProfileIdMap = new HashMap<>();
|
||||
topLevelProfiles.forEach(pair -> profileIdToTopProfileIdMap.put(pair.getValue1(), pair.getValue2()));
|
||||
|
||||
//gather top-level profile ids
|
||||
Set<Long> topProfileIds = new HashSet<>();
|
||||
topLevelProfiles.forEach(pair -> topProfileIds.add(pair.getValue2()));
|
||||
|
||||
|
||||
//TODO: this may be more efficiently done by a specialized count method on equipment datastore
|
||||
|
||||
//now get pages of equipmentIds that refer to the top-level profiles and count the equipmentIds
|
||||
PaginationContext<PairLongLong> context = new PaginationContext<>(500);
|
||||
this.equipmentServiceInterface.getEquipmentIdsByProfileIds(topProfileIds, context );
|
||||
|
||||
//prepare map of top-level profileId to the count of equipmentIds
|
||||
Map<Long, AtomicInteger> topProfileIdToEquipmentCountsMap = new HashMap<>();
|
||||
topProfileIds.forEach(p -> topProfileIdToEquipmentCountsMap.put(p, new AtomicInteger()));
|
||||
|
||||
while(!context.isLastPage()) {
|
||||
PaginationResponse<PairLongLong> page = equipmentServiceInterface.getEquipmentIdsByProfileIds(topProfileIds, context );
|
||||
context = page.getContext();
|
||||
|
||||
page.getItems().forEach(p -> {
|
||||
AtomicInteger cnt = topProfileIdToEquipmentCountsMap.get(p.getValue1());
|
||||
if(cnt!=null) {
|
||||
cnt.incrementAndGet();
|
||||
}
|
||||
});
|
||||
|
||||
LOG.debug("Page {} - counted {} equipmentids", context.getLastReturnedPageNumber(), context.getTotalItemsReturned());
|
||||
}
|
||||
|
||||
|
||||
//package results to get equipment counts for the original profile ids
|
||||
profileIdToTopProfileIdMap.forEach((p, tp) -> ret.add(new PairLongLong(p, topProfileIdToEquipmentCountsMap.get(tp).intValue())));
|
||||
|
||||
LOG.debug("getCountsOfEquipmentThatUseProfiles({}) return {}", profileIdSet, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,200 @@
|
||||
package com.telecominfraproject.wlan.portal.controller.profile;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
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.cloudeventdispatcher.CloudEventDispatcherEmpty;
|
||||
import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
|
||||
import com.telecominfraproject.wlan.core.model.pair.PairLongLong;
|
||||
import com.telecominfraproject.wlan.equipment.EquipmentServiceLocal;
|
||||
import com.telecominfraproject.wlan.equipment.controller.EquipmentController;
|
||||
import com.telecominfraproject.wlan.equipment.datastore.EquipmentDatastore;
|
||||
import com.telecominfraproject.wlan.equipment.datastore.inmemory.EquipmentDatastoreInMemory;
|
||||
import com.telecominfraproject.wlan.equipment.models.Equipment;
|
||||
import com.telecominfraproject.wlan.portal.controller.profile.ProfilePortalController.ListOfPairLongLong;
|
||||
import com.telecominfraproject.wlan.profile.ProfileServiceLocal;
|
||||
import com.telecominfraproject.wlan.profile.controller.ProfileController;
|
||||
import com.telecominfraproject.wlan.profile.datastore.ProfileDatastore;
|
||||
import com.telecominfraproject.wlan.profile.datastore.inmemory.ProfileDatastoreInMemory;
|
||||
import com.telecominfraproject.wlan.profile.models.Profile;
|
||||
import com.telecominfraproject.wlan.profile.models.ProfileByCustomerRequestFactory;
|
||||
import com.telecominfraproject.wlan.profile.models.ProfileType;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@ActiveProfiles(profiles = {
|
||||
"integration_test",
|
||||
}) //NOTE: these profiles will be ADDED to the list of active profiles
|
||||
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = ProfilePortalControllerTest.class)
|
||||
@Import(value = {
|
||||
EquipmentServiceLocal.class,
|
||||
EquipmentController.class,
|
||||
EquipmentDatastoreInMemory.class,
|
||||
ProfileServiceLocal.class,
|
||||
ProfileController.class,
|
||||
ProfileDatastoreInMemory.class,
|
||||
ProfileByCustomerRequestFactory.class,
|
||||
CloudEventDispatcherEmpty.class,
|
||||
ProfilePortalController.class
|
||||
})
|
||||
public class ProfilePortalControllerTest {
|
||||
private static AtomicLong profileIncrementer = new AtomicLong(1);
|
||||
private static AtomicLong equipmentIncrementer = new AtomicLong(1);
|
||||
private static Set<Long> profileIds = new HashSet<Long>();
|
||||
private static Set<Long> equipmentIds = new HashSet<Long>();
|
||||
|
||||
@Autowired private ProfilePortalController profilePortalController;
|
||||
@Autowired private EquipmentDatastore equipmentDatastore;
|
||||
@Autowired private ProfileDatastore profileDatastore;
|
||||
|
||||
@BeforeEach
|
||||
public void setup()
|
||||
{
|
||||
profileIds.clear();
|
||||
equipmentIds.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getCountsOfEquipmentThatUseProfilesTest()
|
||||
{
|
||||
|
||||
Profile parentProfile_1 = createProfile(); // 3 equipment
|
||||
Profile parentProfile_2 = createProfile(); // 2 equipment
|
||||
Profile parentProfile_3 = createProfile(); // 1 equipment
|
||||
|
||||
Profile ssidProfile_1 = createSsidProfile(); // linked to parent ids: 1 = 3 expected count
|
||||
Profile ssidProfile_2 = createSsidProfile(); // linked to parent ids: 1,2 = 5 expected count
|
||||
Profile ssidProfile_3 = createSsidProfile(); // linked to parent ids: 3 = 1 expected count
|
||||
|
||||
Profile captivePortalProfile_1 = createCaptivePortalProfile(); // linked to 4 -> 1 = 3 expected count
|
||||
Profile captivePortalProfile_2 = createCaptivePortalProfile(); // linked to 5 and 6 -> 5 + 1 = 6 expected count
|
||||
|
||||
Profile radiusProfile_1 = createRadiusProfile(); // 7, 8 -> 4, 5, 6 -> 1 , 2 , 3 -> 6 expected
|
||||
Profile radiusProfile_2 = createRadiusProfile(); // 0 expected
|
||||
|
||||
// link ssid to AP profiles
|
||||
linkChildToParent(ssidProfile_1.getId(), parentProfile_1.getId());
|
||||
linkChildToParent(ssidProfile_2.getId(), parentProfile_1.getId());
|
||||
linkChildToParent(ssidProfile_2.getId(), parentProfile_2.getId());
|
||||
linkChildToParent(ssidProfile_3.getId(), parentProfile_3.getId());
|
||||
|
||||
//link captive portal profiles to ssid profiles
|
||||
linkChildToParent(captivePortalProfile_1.getId(), ssidProfile_1.getId());
|
||||
linkChildToParent(captivePortalProfile_2.getId(), ssidProfile_2.getId());
|
||||
linkChildToParent(captivePortalProfile_2.getId(), ssidProfile_3.getId());
|
||||
|
||||
//link radius profiles to captive portal profiles
|
||||
linkChildToParent(radiusProfile_1.getId(), captivePortalProfile_1.getId());
|
||||
linkChildToParent(radiusProfile_1.getId(), captivePortalProfile_2.getId());
|
||||
|
||||
createEquipment(parentProfile_1.getId());
|
||||
createEquipment(parentProfile_1.getId());
|
||||
createEquipment(parentProfile_1.getId());
|
||||
createEquipment(parentProfile_2.getId());
|
||||
createEquipment(parentProfile_2.getId());
|
||||
createEquipment(parentProfile_3.getId());
|
||||
|
||||
ListOfPairLongLong ret = profilePortalController.getCountsOfEquipmentThatUseProfiles(profileIds);
|
||||
|
||||
List<PairLongLong> expectedReturn = new ArrayList<PairLongLong>() {{
|
||||
add(new PairLongLong(parentProfile_1.getId(), 3));
|
||||
add(new PairLongLong(parentProfile_2.getId(), 2));
|
||||
add(new PairLongLong(parentProfile_3.getId(), 1));
|
||||
add(new PairLongLong(ssidProfile_1.getId(), 3));
|
||||
add(new PairLongLong(ssidProfile_2.getId(), 5));
|
||||
add(new PairLongLong(ssidProfile_3.getId(), 1));
|
||||
add(new PairLongLong(captivePortalProfile_1.getId(), 3));
|
||||
add(new PairLongLong(captivePortalProfile_2.getId(), 6));
|
||||
add(new PairLongLong(radiusProfile_1.getId(), 6));
|
||||
add(new PairLongLong(radiusProfile_2.getId(), 0));
|
||||
}};
|
||||
|
||||
expectedReturn.forEach(pair -> assertTrue(ret.contains(pair)));
|
||||
equipmentIds.forEach(id -> equipmentDatastore.delete(id));
|
||||
profileIds.forEach(id -> profileDatastore.delete(id));
|
||||
}
|
||||
|
||||
private Profile createProfile()
|
||||
{
|
||||
Profile profile = new Profile();
|
||||
profile.setName("test" + profileIncrementer.getAndIncrement());
|
||||
profile.setProfileType(ProfileType.equipment_ap);
|
||||
profile.setCustomerId(2);
|
||||
|
||||
Profile created = profileDatastore.create(profile);
|
||||
profileIds.add(created.getId());
|
||||
|
||||
return created;
|
||||
}
|
||||
|
||||
private Profile createSsidProfile()
|
||||
{
|
||||
Profile profile = new Profile();
|
||||
profile.setName("test" + profileIncrementer.getAndIncrement());
|
||||
profile.setProfileType(ProfileType.ssid);
|
||||
profile.setCustomerId(2);
|
||||
|
||||
Profile created = profileDatastore.create(profile);
|
||||
profileIds.add(created.getId());
|
||||
|
||||
return created;
|
||||
}
|
||||
|
||||
private Profile createCaptivePortalProfile()
|
||||
{
|
||||
Profile profile = new Profile();
|
||||
profile.setName("test" + profileIncrementer.getAndIncrement());
|
||||
profile.setProfileType(ProfileType.captive_portal);
|
||||
profile.setCustomerId(2);
|
||||
|
||||
Profile created = profileDatastore.create(profile);
|
||||
profileIds.add(created.getId());
|
||||
|
||||
return created;
|
||||
}
|
||||
|
||||
private Profile createRadiusProfile()
|
||||
{
|
||||
Profile profile = new Profile();
|
||||
profile.setName("test" + profileIncrementer.getAndIncrement());
|
||||
profile.setProfileType(ProfileType.radius);
|
||||
profile.setCustomerId(2);
|
||||
|
||||
Profile created = profileDatastore.create(profile);
|
||||
profileIds.add(created.getId());
|
||||
|
||||
return created;
|
||||
}
|
||||
|
||||
private void linkChildToParent(long childId, long parentId)
|
||||
{
|
||||
Profile parentProfile = profileDatastore.get(parentId);
|
||||
parentProfile.getChildProfileIds().add(childId);
|
||||
|
||||
profileDatastore.update(parentProfile);
|
||||
}
|
||||
|
||||
private Equipment createEquipment(long profileId)
|
||||
{
|
||||
Equipment equipment = new Equipment();
|
||||
equipment.setCustomerId(2);
|
||||
equipment.setEquipmentType(EquipmentType.AP);
|
||||
equipment.setName("test" + equipmentIncrementer.getAndIncrement());
|
||||
equipment.setProfileId(profileId);
|
||||
return equipmentDatastore.create(equipment);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,15 +69,14 @@ public class PortalUserDAO extends BaseJdbcDao {
|
||||
private static final Set<String> columnsToSkipForInsert = new HashSet<>(Arrays.asList(COL_ID));
|
||||
private static final Set<String> columnsToSkipForUpdate = new HashSet<>(Arrays.asList(COL_ID, "createdTimestamp"));
|
||||
|
||||
private static final String TABLE_NAME = "portal_user";
|
||||
private static final String TABLE_PREFIX = "s.";
|
||||
private static final String ALL_COLUMNS;
|
||||
public static final String TABLE_NAME = "portal_user";
|
||||
public static final String TABLE_PREFIX = "s.";
|
||||
public static final String ALL_COLUMNS;
|
||||
|
||||
private static final Set<String> ALL_COLUMNS_LOWERCASE = new HashSet<>();
|
||||
public static final Set<String> ALL_COLUMNS_LOWERCASE = new HashSet<>();
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
//use this for queries where multiple tables are involved
|
||||
private static final String ALL_COLUMNS_WITH_PREFIX;
|
||||
public static final String ALL_COLUMNS_WITH_PREFIX;
|
||||
|
||||
private static final String ALL_COLUMNS_FOR_INSERT;
|
||||
private static final String BIND_VARS_FOR_INSERT;
|
||||
@@ -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 " +
|
||||
@@ -162,8 +161,8 @@ public class PortalUserDAO extends BaseJdbcDao {
|
||||
|
||||
private static final String SQL_GET_ALL_IN_SET = "select " + ALL_COLUMNS + " from "+TABLE_NAME + " where "+ COL_ID +" in ";
|
||||
|
||||
private static final String SQL_PAGING_SUFFIX = " LIMIT ? OFFSET ? ";
|
||||
private static final String SORT_SUFFIX = "";
|
||||
public static final String SQL_PAGING_SUFFIX = " LIMIT ? OFFSET ? ";
|
||||
public static final String SORT_SUFFIX = "";
|
||||
|
||||
|
||||
private static final RowMapper<PortalUser> portalUserRowMapper = new PortalUserRowMapper();
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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<>();
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -28,6 +28,7 @@ public class ApNetworkConfiguration extends CommonNetworkConfiguration
|
||||
public static final Boolean DEFAULT_SYNTHETIC_CLIENT_ENABLED = Boolean.TRUE;
|
||||
public static final Boolean DEFAULT_LED_CONTROL_ENABLED = Boolean.TRUE;
|
||||
public static final Boolean DEFAULT_EQUIPMENT_DISCOVERY_ENABLED = Boolean.FALSE;
|
||||
public static final Boolean DEFAULT_DYNAMIC_RADIUS_PROXY_ENABLED = Boolean.FALSE;
|
||||
|
||||
/**
|
||||
* Added as a profile level setting that can be used to provide
|
||||
@@ -59,6 +60,7 @@ public class ApNetworkConfiguration extends CommonNetworkConfiguration
|
||||
setSyntheticClientEnabled(DEFAULT_SYNTHETIC_CLIENT_ENABLED);
|
||||
setLedControlEnabled(DEFAULT_LED_CONTROL_ENABLED);
|
||||
setEquipmentDiscovery(DEFAULT_EQUIPMENT_DISCOVERY_ENABLED);
|
||||
setDynamicRadiusProxyEnabled(DEFAULT_DYNAMIC_RADIUS_PROXY_ENABLED);
|
||||
|
||||
// initialize the profile level radio map settings parameter
|
||||
radioMap = new EnumMap<>(RadioType.class);
|
||||
|
||||
@@ -23,6 +23,7 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
|
||||
private Boolean syntheticClientEnabled;
|
||||
private Boolean ledControlEnabled;
|
||||
private Boolean equipmentDiscovery;
|
||||
private Boolean dynamicRadiusProxyEnabled;
|
||||
|
||||
public CommonNetworkConfiguration() {
|
||||
}
|
||||
@@ -67,7 +68,6 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
|
||||
this.vlanNative = bool;
|
||||
}
|
||||
|
||||
|
||||
public AutoOrManualString getNtpServer() {
|
||||
return ntpServer;
|
||||
}
|
||||
@@ -92,8 +92,7 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
|
||||
this.syntheticClientEnabled = syntheticClientEnabled;
|
||||
}
|
||||
|
||||
|
||||
public Boolean getLedControlEnabled() {
|
||||
public Boolean isLedControlEnabled() {
|
||||
return ledControlEnabled;
|
||||
}
|
||||
|
||||
@@ -108,6 +107,23 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
|
||||
public void setRtlsSettings(RtlsSettings rtlsSettings) {
|
||||
this.rtlsSettings = rtlsSettings;
|
||||
}
|
||||
|
||||
public Boolean isDynamicRadiusProxyEnabled() {
|
||||
return dynamicRadiusProxyEnabled;
|
||||
}
|
||||
|
||||
public void setDynamicRadiusProxyEnabled(Boolean dynamicRadiusProxyEnabled) {
|
||||
this.dynamicRadiusProxyEnabled = dynamicRadiusProxyEnabled;
|
||||
}
|
||||
|
||||
public Boolean getEquipmentDiscovery() {
|
||||
return equipmentDiscovery;
|
||||
}
|
||||
|
||||
public void setEquipmentDiscovery(Boolean equipmentDiscovery) {
|
||||
this.equipmentDiscovery = equipmentDiscovery;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public CommonNetworkConfiguration clone() {
|
||||
@@ -124,7 +140,9 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
|
||||
ret.setVlan(getVlan());
|
||||
ret.setVlanNative(isVlanNative());
|
||||
ret.setSyntheticClientEnabled(getSyntheticClientEnabled());
|
||||
|
||||
ret.setLedControlEnabled(isLedControlEnabled());
|
||||
ret.setEquipmentDiscovery(getEquipmentDiscovery());
|
||||
ret.setDynamicRadiusProxyEnabled(isDynamicRadiusProxyEnabled());
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -145,26 +163,10 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
|
||||
return false;
|
||||
}
|
||||
|
||||
public Boolean getEquipmentDiscovery() {
|
||||
return equipmentDiscovery;
|
||||
}
|
||||
|
||||
public void setEquipmentDiscovery(Boolean equipmentDiscovery) {
|
||||
this.equipmentDiscovery = equipmentDiscovery;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public Boolean getVlanNative() {
|
||||
return vlanNative;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(equipmentDiscovery, equipmentType, ledControlEnabled, networkConfigVersion, ntpServer, rtlsSettings,
|
||||
syntheticClientEnabled, syslogRelay, vlan, vlanNative);
|
||||
syntheticClientEnabled, syslogRelay, vlan, vlanNative, dynamicRadiusProxyEnabled);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -183,7 +185,8 @@ public abstract class CommonNetworkConfiguration extends ProfileDetails {
|
||||
&& Objects.equals(ntpServer, other.ntpServer) && Objects.equals(rtlsSettings, other.rtlsSettings)
|
||||
&& Objects.equals(syntheticClientEnabled, other.syntheticClientEnabled)
|
||||
&& Objects.equals(syslogRelay, other.syslogRelay) && vlan == other.vlan
|
||||
&& Objects.equals(vlanNative, other.vlanNative);
|
||||
&& Objects.equals(vlanNative, other.vlanNative)
|
||||
&& Objects.equals(dynamicRadiusProxyEnabled, other.dynamicRadiusProxyEnabled);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -28,6 +28,9 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
|
||||
private Boolean useRadSec;
|
||||
private String sharedSecret; // if useRadSec is false
|
||||
private String acctSharedSecret; // if useRadSec is false
|
||||
private String radiusProxySecret;
|
||||
private Boolean dynamicDiscovery; // dynamic discovery of HSP and IdPs (home service and identity providers).
|
||||
// regardless of configured value, this will only be set 'true' on the AP if useRadSec is also true.
|
||||
|
||||
private RadiusProxyConfiguration() {
|
||||
|
||||
@@ -70,6 +73,7 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
|
||||
}
|
||||
|
||||
public Integer getPort() {
|
||||
if (port == null) return -1;
|
||||
return port;
|
||||
}
|
||||
|
||||
@@ -86,6 +90,7 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
|
||||
}
|
||||
|
||||
public Integer getAcctPort() {
|
||||
if (acctPort == null) return -1;
|
||||
return acctPort;
|
||||
}
|
||||
|
||||
@@ -118,6 +123,7 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
|
||||
}
|
||||
|
||||
public Boolean getUseRadSec() {
|
||||
if (useRadSec == null) return false;
|
||||
return useRadSec;
|
||||
}
|
||||
|
||||
@@ -140,6 +146,29 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
|
||||
public void setAcctSharedSecret(String acctSharedSecret) {
|
||||
this.acctSharedSecret = acctSharedSecret;
|
||||
}
|
||||
|
||||
public String getRadiusProxySecret() {
|
||||
return radiusProxySecret;
|
||||
}
|
||||
|
||||
public void setRadiusProxySecret(String radiusProxySecret) {
|
||||
this.radiusProxySecret = radiusProxySecret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the dynamicDiscovery
|
||||
*/
|
||||
public Boolean getDynamicDiscovery() {
|
||||
if (dynamicDiscovery == null) return false;
|
||||
return dynamicDiscovery;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param dynamicDiscovery the dynamicDiscovery to set
|
||||
*/
|
||||
public void setDynamicDiscovery(Boolean dynamicDiscovery) {
|
||||
this.dynamicDiscovery = dynamicDiscovery;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsToBeUpdatedOnDevice(RadiusProxyConfiguration previousVersion) {
|
||||
@@ -153,8 +182,8 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(acctPort, acctServer, acctSharedSecret, caCert, clientCert, clientKey, name, passphrase, port, realm, server, sharedSecret,
|
||||
useRadSec);
|
||||
return Objects.hash(acctPort, acctServer, acctSharedSecret, caCert, clientCert, clientKey, dynamicDiscovery, name, passphrase, port, realm, server,
|
||||
sharedSecret, useRadSec, radiusProxySecret);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -168,9 +197,11 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
|
||||
RadiusProxyConfiguration other = (RadiusProxyConfiguration) obj;
|
||||
return Objects.equals(acctPort, other.acctPort) && Objects.equals(acctServer, other.acctServer)
|
||||
&& Objects.equals(acctSharedSecret, other.acctSharedSecret) && Objects.equals(caCert, other.caCert)
|
||||
&& Objects.equals(clientCert, other.clientCert) && Objects.equals(clientKey, other.clientKey) && Objects.equals(name, other.name)
|
||||
&& Objects.equals(passphrase, other.passphrase) && Objects.equals(port, other.port) && Objects.equals(realm, other.realm)
|
||||
&& Objects.equals(server, other.server) && Objects.equals(sharedSecret, other.sharedSecret) && Objects.equals(useRadSec, other.useRadSec);
|
||||
&& Objects.equals(clientCert, other.clientCert) && Objects.equals(clientKey, other.clientKey)
|
||||
&& Objects.equals(dynamicDiscovery, other.dynamicDiscovery) && Objects.equals(name, other.name) && Objects.equals(passphrase, other.passphrase)
|
||||
&& Objects.equals(port, other.port) && Objects.equals(realm, other.realm) && Objects.equals(server, other.server)
|
||||
&& Objects.equals(sharedSecret, other.sharedSecret) && Objects.equals(useRadSec, other.useRadSec)
|
||||
&& Objects.equals(radiusProxySecret, other.radiusProxySecret);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ public class PasspointProfile extends ProfileDetails implements PushableConfigur
|
||||
private boolean enable2pt4GHz;
|
||||
private boolean enable5GHz;
|
||||
|
||||
private List<Long> associatedAccessSsidProfileIds;
|
||||
private Set<Long> associatedAccessSsidProfileIds;
|
||||
|
||||
private Long osuSsidProfileId;
|
||||
|
||||
@@ -321,11 +321,11 @@ public class PasspointProfile extends ProfileDetails implements PushableConfigur
|
||||
this.passpointNetworkAuthenticationType = passpointNetworkAuthenticationType;
|
||||
}
|
||||
|
||||
public List<Long> getAssociatedAccessSsidProfileIds() {
|
||||
public Set<Long> getAssociatedAccessSsidProfileIds() {
|
||||
return associatedAccessSsidProfileIds;
|
||||
}
|
||||
|
||||
public void setAssociatedAccessSsidProfileIds(List<Long> associatedAccessSsidProfileIds) {
|
||||
public void setAssociatedAccessSsidProfileIds(Set<Long> associatedAccessSsidProfileIds) {
|
||||
this.associatedAccessSsidProfileIds = associatedAccessSsidProfileIds;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
@@ -323,17 +327,16 @@ public class RfElementConfiguration extends BaseJsonModel {
|
||||
this.minAutoCellSize = minAutoCellSize;
|
||||
}
|
||||
|
||||
//Always return default value
|
||||
public Integer getMaxAutoCellSize() {
|
||||
if (maxAutoCellSize == null) {
|
||||
if (MAX_CELL_SIZE_MAP.containsKey(this.radioType)) {
|
||||
return MAX_CELL_SIZE_MAP.get(this.radioType);
|
||||
} else {
|
||||
return MAX_CELL_SIZE_MAP.get(RadioType.is2dot4GHz);
|
||||
}
|
||||
if (MAX_CELL_SIZE_MAP.containsKey(this.radioType)) {
|
||||
return MAX_CELL_SIZE_MAP.get(this.radioType);
|
||||
} else {
|
||||
return MAX_CELL_SIZE_MAP.get(RadioType.is2dot4GHz);
|
||||
}
|
||||
return maxAutoCellSize;
|
||||
}
|
||||
|
||||
// not allow user to configure
|
||||
public void setMaxAutoCellSize(Integer maxAutoCellSize) {
|
||||
this.maxAutoCellSize = maxAutoCellSize;
|
||||
}
|
||||
@@ -362,9 +365,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 +428,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 +458,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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -370,11 +370,9 @@ public class SsidConfiguration extends ProfileDetails implements PushableConfigu
|
||||
|
||||
public static enum SecureMode {
|
||||
|
||||
open(0L), wpaPSK(1L), wpa2PSK(2L), wpaRadius(3L), wpa2Radius(4L), wpa2OnlyPSK(5L), wpa2OnlyRadius(6L), wep(
|
||||
7L), wpaEAP(8L), wpa2EAP(
|
||||
9L), wpa2OnlyEAP(10L), wpa3OnlySAE(11L), wpa3MixedSAE(12L), wpa3OnlyEAP(13L), wpa3MixedEAP(14L),
|
||||
|
||||
UNSUPPORTED(-1L);
|
||||
open(0L), wpaPSK(1L), wpa2PSK(2L), wpaRadius(3L), wpa2Radius(4L), wpa2OnlyPSK(5L), wpa2OnlyRadius(6L), wep(7L),
|
||||
wpaEAP(8L), wpa2EAP(9L), wpa2OnlyEAP(10L), wpa3OnlySAE(11L), wpa3MixedSAE(12L), wpa3OnlyEAP(13L), wpa3MixedEAP(14L),
|
||||
wpa3OnlyEAP192(15L), UNSUPPORTED(-1L);
|
||||
|
||||
private final long id;
|
||||
private static final Map<Long, SecureMode> ELEMENTS = new HashMap<>();
|
||||
@@ -415,7 +413,7 @@ public class SsidConfiguration extends ProfileDetails implements PushableConfigu
|
||||
}
|
||||
|
||||
public static boolean isWPA3_Enterprise_or_Personal(SecureMode mode) {
|
||||
return mode == wpa3OnlySAE || mode == wpa3OnlyEAP;
|
||||
return mode == wpa3OnlySAE || mode == wpa3OnlyEAP || mode == wpa3OnlyEAP192;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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,45 @@ public class RfConfigurationTests {
|
||||
rfConfig2_4.setRadioMode(RadioMode.modeGN);
|
||||
rfConfig5.setRadioMode(RadioMode.modeGN);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAutoExclusionChannels() {
|
||||
RfElementConfiguration rfConfig = RfElementConfiguration.createWithDefaults(RadioType.is5GHz);
|
||||
assertNotNull(rfConfig.getAutoExclusionChannels());
|
||||
assertTrue(rfConfig.getAutoExclusionChannels().isEmpty());
|
||||
|
||||
Set<Integer> unsortedSet = new HashSet<Integer>(Arrays.asList(1, 23, 45, 12));
|
||||
rfConfig.setAutoExclusionChannels(unsortedSet);
|
||||
|
||||
Set<Integer> sortedSet = rfConfig.getAutoExclusionChannels();
|
||||
List<Integer> list = new ArrayList<Integer>(sortedSet);
|
||||
|
||||
assertEquals(Integer.valueOf(1), list.get(0));
|
||||
assertEquals(Integer.valueOf(12), list.get(1));
|
||||
assertEquals(Integer.valueOf(23), list.get(2));
|
||||
assertEquals(Integer.valueOf(45), list.get(3));
|
||||
|
||||
Set<Integer> unsortedSet2 = new HashSet<Integer>(Arrays.asList(10, 45, 23, 12));
|
||||
rfConfig.setAutoExclusionChannels(unsortedSet2);
|
||||
|
||||
Set<Integer> sortedSet2 = rfConfig.getAutoExclusionChannels();
|
||||
List<Integer> list2 = new ArrayList<Integer>(sortedSet2);
|
||||
|
||||
assertEquals(Integer.valueOf(10), list2.get(0));
|
||||
assertEquals(Integer.valueOf(12), list2.get(1));
|
||||
assertEquals(Integer.valueOf(23), list2.get(2));
|
||||
assertEquals(Integer.valueOf(45), list2.get(3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMaxAutoCellSize() {
|
||||
RfElementConfiguration rfConfig = RfElementConfiguration.createWithDefaults(RadioType.is5GHz);
|
||||
assertNotNull(rfConfig.getMaxAutoCellSize());
|
||||
|
||||
assertEquals(RfElementConfiguration.DEFAULT_MAX_CELL_SIZE_DB, rfConfig.getMaxAutoCellSize().intValue());
|
||||
|
||||
rfConfig.setMaxAutoCellSize(-93);
|
||||
//getMaxAutoCellSize always return default MaxAutoCellSize
|
||||
assertEquals(RfElementConfiguration.DEFAULT_MAX_CELL_SIZE_DB, rfConfig.getMaxAutoCellSize().intValue());
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user