Compare commits

..

21 Commits

Author SHA1 Message Date
Norm Traxler
caaa8fb4e3 [WIFI-2670] Client Session API support OUI attribute and count query 2021-06-15 14:15:52 -04:00
Mike Hansen
b957c8bf72 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services 2021-06-14 11:55:58 -04:00
Mike Hansen
b797cc392f WIFI-2639: CloudBackend: upgrade CEGWBlinkRequest definition
Adding API call to portal, /portal/equipmentGateway/requestApBlinkLEDs

Adding RequestMapping to EquipmentPortalGatewayController

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-14 11:53:54 -04:00
norm-traxler
5fc9715649 Merge pull request #114 from Telecominfraproject/WIFI-2601-Add-check-for-valid-equipment-ID-when-creating-new-alarms-via-the-alarm-prov-controller
add check for validity of equipment ID when creating new alarms
2021-06-14 11:07:28 -04:00
Mike Hansen
0a66897e48 WIFI-2639: CloudBackend: upgrade CEGWBlinkRequest definition
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-11 15:58:30 -04:00
Mike Hansen
8d77fcb090 WIFI-2607: CloudBackend: add dynamicDiscovery attribute to RadiusProxyConfiguration
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-09 15:10:02 -04:00
Thomas Currie
256d9fbd16 throw better exception when equipment ID does not exist. 2021-06-09 09:20:30 -04:00
Thomas Currie
39e14da2e6 add check for validity of equipment ID when creating new alarms 2021-06-09 08:55:16 -04:00
Mike Hansen
996c60adf6 Merge pull request #113 from Telecominfraproject/alarmImprovement1516
Changed AccessPointIsUnreachable to NoMetricsReceived Alarm
2021-06-08 21:29:50 -04:00
Thomas-Leung2021
879abe3beb Changed AccessPointIsUnreachable to NoMetricsReceived Alarm 2021-06-08 17:51:12 -04:00
norm-traxler
796d657952 Merge pull request #112 from Telecominfraproject/WIFI-2543
WIFI-2543 Added delete methods and API endpoints for bulk deletion of client and client sessions
2021-06-08 11:45:10 -04:00
Kareem Dabbour
52ed5f6344 WIFI-2543 Added delete methods and API endpoints for bulk deletion of client and client sessions 2021-06-07 21:42:15 -04:00
Mike Hansen
f5869961b2 WIFI-2081: AP: ON_CHANNEL survey report sometimes has no information
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-07 15:47:30 -04:00
Mike Hansen
f02cadbdc3 WIFI-2081: AP: ON_CHANNEL survey report sometimes has no information
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-07 15:27:40 -04:00
Mike Hansen
c45cabf607 WIFI-2081: AP: ON_CHANNEL survey report sometimes has no information
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-07 15:25:55 -04:00
norm-traxler
c9faf138da Merge pull request #111 from Telecominfraproject/WIFI-2525
WIFI-2525 Set default value for MaxAutoCellSize in RF Config
2021-06-03 18:05:57 -04:00
Lynn Shi
f6b96fc566 WIFI-2525 Set default value for MaxAutoCellSize in RF Config 2021-06-02 14:03:15 -04:00
Mike Hansen
a089e7b748 AP: ON_CHANNEL survey report sometimes has no information
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-02 09:07:37 -04:00
norm-traxler
e790db2c2b Merge pull request #110 from Telecominfraproject/WIFI-2508
WIFI-2508 added delete endpoint for systemevents that are older than a given timestamp
2021-05-31 17:43:18 -04:00
Kareem Dabbour
b03dccc63f WIFI-2508 added delete endpoint for systemevents that are older than a given time stamp 2021-05-31 17:23:12 -04:00
norm-traxler
03eccfa448 Merge pull request #109 from Telecominfraproject/WIFI-2434
WIFI 2434: Update SDK master to use image tag 1.2.0-SNAPSHOT
2021-05-26 21:27:38 -04:00
38 changed files with 1052 additions and 237 deletions

View File

@@ -53,7 +53,7 @@ public class AlarmCode implements EnumWithId {
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", "Equipment is not report metrics"),
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"),

View File

@@ -52,6 +52,18 @@
<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>

View File

@@ -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);
}
}

View File

@@ -34,12 +34,29 @@
<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>

View File

@@ -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) {

View File

@@ -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);
}
}

View File

@@ -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;
@@ -45,6 +46,12 @@ public class ClientDatastoreCassandra implements ClientDatastore {
return clientDAO.delete(customerId, clientMac);
}
@Override
public void delete(long createdBeforeTimestamp) {
//This should be handled by Cassandra's life cycle for data.
return;
}
@Override
public List<Client> get(int customerId, Set<MacAddress> clientMacSet) {
return clientDAO.get(customerId, clientMacSet);
@@ -80,6 +87,12 @@ public class ClientDatastoreCassandra implements ClientDatastore {
public ClientSession deleteSession(int customerId, long equipmentId, MacAddress clientMac) {
return clientSessionDAO.deleteSession(customerId, equipmentId, clientMac);
}
@Override
public void deleteSessions(long createdBeforeTimestamp) {
//This should be handled by Cassandra's lifecycle for data.
return;
}
@Override
public List<ClientSession> getSessions(int customerId, Set<MacAddress> clientMacSet) {
@@ -96,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;
}
}

View File

@@ -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;
@@ -156,6 +158,11 @@ public class ClientDatastoreInMemory extends BaseInMemoryDatastore implements Cl
//client is already cloned by the getOrNull method
return client;
}
@Override
public void delete(long createdBeforeTimestamp) {
return;
}
@Override
public List<Client> get(int customerId, Set<MacAddress> clientMacSet) {
@@ -362,6 +369,10 @@ public class ClientDatastoreInMemory extends BaseInMemoryDatastore implements Cl
return clientSession.clone();
}
@Override
public void deleteSessions(long createdBeforeTimestamp) {
return;
}
@Override
public List<ClientSession> getSessions(int customerId, Set<MacAddress> clientMacSet) {
@@ -503,4 +514,30 @@ public class ClientDatastoreInMemory extends BaseInMemoryDatastore implements Cl
return ret;
}
@Override
public ClientSessionCounts getSessionCounts(int customerId) {
ClientSessionCounts counts = new ClientSessionCounts();
int totalCount = 0;
Map<String, Integer> perOuiMap = new HashMap<>();
for (ClientSession session : idToClientSessionMap.values()) {
if (session.getCustomerId() == customerId) {
totalCount++;
if (session.getOui() != null) {
Integer cnt = perOuiMap.get(session.getOui());
if (cnt == null) {
cnt = 0;
} else {
cnt++;
}
perOuiMap.put(session.getOui(), cnt);
}
}
}
counts.setTotalCount(totalCount);
counts.setOuiCounts(perOuiMap);
return counts;
}
}

View File

@@ -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;
@@ -21,6 +22,7 @@ public interface ClientDatastore {
Client getOrNull(int customerId, MacAddress clientMac);
Client update(Client client);
Client delete(int customerId, MacAddress clientMac);
void delete(long createdBeforeTimestamp);
/**
* Retrieves a list of Client records that which have their mac address in the provided set.
@@ -72,7 +74,7 @@ public interface ClientDatastore {
ClientSession deleteSession(int customerId, long equipmentId, MacAddress clientMac);
void deleteSessions(long createdBeforeTimestamp);
/**
* Retrieves a list of Client sessions that which have their mac address in the provided set.
*
@@ -104,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);
}

View File

@@ -0,0 +1,44 @@
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 counts of the Client Sessions
*/
public class ClientSessionCounts extends BaseJsonModel {
private static final long serialVersionUID = 7697349699510565184L;
private int totalCount;
private Map<String, Integer> ouiCounts = new HashMap<>();
public Map<String, Integer> getOuiCounts() {
return ouiCounts;
}
public void setOuiCounts(Map<String, Integer> ouiCounts) {
this.ouiCounts = ouiCounts;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
@Override
public ClientSessionCounts clone() {
ClientSessionCounts ret = (ClientSessionCounts) super.clone();
if (ouiCounts != null) {
ret.ouiCounts = new HashMap<>(ouiCounts);
}
return ret;
}
}

View File

@@ -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

View File

@@ -4,10 +4,11 @@ import java.util.List;
import java.util.Set;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
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;
@@ -59,7 +60,15 @@ public interface ClientServiceInterface {
* @param clientMac
* @return deleted Client object
*/
Client delete(int customerId, MacAddress clientMac );
Client delete(int customerId, MacAddress clientMac);
/**
* Deletes Clients that are older than a given timestamp
*
* @param createdBeforeTimestamp
* @return GenericResponse
*/
GenericResponse delete(long createdBeforeTimestamp);
/**
* <br>Retrieves all of the Client records that are mapped to the provided customerId and optional macSubstring filter.
@@ -96,6 +105,14 @@ public interface ClientServiceInterface {
ClientSession deleteSession(int customerId, long equipmentId, MacAddress clientMac);
/**
* Deletes Client Sessions that older than a given timestamp
*
* @param createdBeforeTimestamp
* @return GenericResponse
*/
GenericResponse deleteSessions(long createdBeforeTimestamp);
/**
* Retrieves a list of Client sessions that which have their mac address in the provided set.
*
@@ -127,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);
}

View File

@@ -3,16 +3,16 @@ 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;
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;
@@ -25,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) {
@@ -57,6 +56,11 @@ public class ClientServiceLocal implements ClientServiceInterface {
public Client delete(int customerId, MacAddress macAddress) {
return clientController.delete(customerId, macAddress);
}
@Override
public GenericResponse delete(long createdBeforeTimestamp) {
return clientController.delete(createdBeforeTimestamp);
}
@Override
public List<Client> getBlockedClients(int customerId) {
@@ -98,5 +102,15 @@ public class ClientServiceLocal implements ClientServiceInterface {
public ClientSession deleteSession(int customerId, long equipmentId, MacAddress macAddress) {
return clientController.deleteSession(customerId, equipmentId, macAddress);
}
@Override
public GenericResponse deleteSessions(long createdBeforeTimestamp) {
return clientController.deleteSessions(createdBeforeTimestamp);
}
@Override
public ClientSessionCounts getSessionCounts(int customerId) {
return clientController.getSessionCounts(customerId);
}
}

View File

@@ -12,11 +12,13 @@ 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;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
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;
@@ -182,7 +184,22 @@ public class ClientServiceRemote extends BaseRemoteClient implements ClientServi
LOG.debug("completed client.delete {} ", ret);
return ret;
}
}
@Override
public GenericResponse delete(long createdBeforeTimestamp) {
LOG.debug("calling client.delete {}", createdBeforeTimestamp);
ResponseEntity<GenericResponse> responseEntity = restTemplate.exchange(
getBaseUrl()
+"/bulk?createdBeforeTimestamp={createdBeforeTimestamp}",
HttpMethod.DELETE, null, GenericResponse.class, createdBeforeTimestamp);
GenericResponse ret = responseEntity.getBody();
LOG.debug("completed client.delete {}", createdBeforeTimestamp);
return ret;
}
//
// Methods for managing client sessions
@@ -304,6 +321,21 @@ public class ClientServiceRemote extends BaseRemoteClient implements ClientServi
return ret;
}
@Override
public GenericResponse deleteSessions(long createdBeforeTimestamp) {
LOG.debug("calling client.deleteSessions {}", createdBeforeTimestamp);
ResponseEntity<GenericResponse> responseEntity = restTemplate.exchange(
getBaseUrl()
+"/session/bulk?createdBeforeTimestamp={createdBeforeTimestamp}",
HttpMethod.DELETE, null, GenericResponse.class, createdBeforeTimestamp);
GenericResponse ret = responseEntity.getBody();
LOG.debug("completed client.deleteSessions {}", createdBeforeTimestamp);
return ret;
}
@Override
public List<ClientSession> updateSessions(List<ClientSession> clientSessions) {
LOG.debug("calling session.update {} ", clientSessions);
@@ -334,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;
}
}
}

View File

@@ -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;
@@ -26,6 +28,7 @@ import com.telecominfraproject.wlan.client.session.models.ClientSession;
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherInterface;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
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;
@@ -246,6 +249,16 @@ public class ClientController {
return ret;
}
@RequestMapping(value="/bulk", method=RequestMethod.DELETE)
public GenericResponse delete(@RequestParam long createdBeforeTimestamp) {
LOG.debug("Deleting Clients older than: {}", createdBeforeTimestamp);
clientDatastore.delete(createdBeforeTimestamp);
LOG.debug("Deleted Clients");
return new GenericResponse(true, "");
}
//
// Client Session -related methods
@@ -408,8 +421,24 @@ public class ClientController {
return ret;
}
@RequestMapping(value="/session/bulk", method=RequestMethod.DELETE)
public GenericResponse deleteSessions(@RequestParam long createdBeforeTimestamp) {
LOG.debug("Deleting Client session older than {}", createdBeforeTimestamp);
clientDatastore.deleteSessions(createdBeforeTimestamp);
LOG.debug("Deleted old Client sessions");
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) {

View File

@@ -2856,6 +2856,9 @@ components:
sharedSecret:
type: string
format: password
dynamicDiscovery:
description: 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.
type: boolean
example:
model_type: RadiusProxyConfiguration
caCert:
@@ -4865,11 +4868,16 @@ components:
$ref: '#/components/schemas/ServiceMetricDataType'
createdTimestamp:
type: integer
format: int64
format: int64
details:
$ref: '#/components/schemas/ServiceMetricDetails'
ServiceMetricDetails:
type: object
properties:
sourceTimestampMs:
type: integer
format: int64
oneOf:
- $ref: '#/components/schemas/ApNodeMetrics'
- $ref: '#/components/schemas/ApSsidMetrics'
@@ -4877,7 +4885,7 @@ components:
- $ref: '#/components/schemas/ClientMetrics'
- $ref: '#/components/schemas/NeighbourScanReports'
discriminator:
propertyName: model_type
propertyName: model_type
NeighbourScanReports:
properties:
@@ -6753,7 +6761,11 @@ components:
description: The number of aggregation frames sent using single MPDU (where the A-MPDU contains only one MPDU ).
type: integer
format: int32
sourceTimestampMs:
type: integer
format: int64
wmmQueueStats:
$ref: '#/components/schemas/WmmQueueStatsPerQueueTypeMap'
@@ -6902,6 +6914,9 @@ components:
type: array
items:
$ref: '#/components/schemas/PerProcessUtilization'
sourceTimestampMs:
type: integer
format: int64
EthernetLinkState:
type: string
@@ -6948,6 +6963,9 @@ components:
type: array
items:
$ref: '#/components/schemas/DnsProbeMetric'
sourceTimestampMs:
type: integer
format: int64
StateUpDownError:
type: string
@@ -8762,7 +8780,10 @@ components:
numRxVHT_3466_8_Mbps:
type: integer
format: int64
sourceTimestampMs:
type: integer
format: int64
ListOfRadioUtilizationPerRadioMap:
properties:
@@ -8810,6 +8831,9 @@ components:
unAvailableCapacity:
type: number
format: double
sourceTimestampMs:
type: integer
format: int64
ListOfMacsPerRadioMap:
properties:

View File

@@ -15,7 +15,7 @@ import com.telecominfraproject.wlan.servicemetric.apnode.models.ApNodeMetrics;
* <li>AlarmCode.CPUTemperature
* <li>AlarmCode.CPUUtilization
* <li>AlarmCode.MemoryUtilization
* <li>AlarmCode.AccessPointIsUnreachable
* <li>AlarmCode.NoMetricsReceived
* </ul>
*
* @author dtop
@@ -112,7 +112,7 @@ public class EquipmentAlarmsContext {
AtomicInteger count = new AtomicInteger();
//check alarms against thresholds
if(alarmCode.getId() == AlarmCode.AccessPointIsUnreachable.getId()) {
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(); });
@@ -149,7 +149,7 @@ public class EquipmentAlarmsContext {
AtomicInteger count = new AtomicInteger();
//check alarms against thresholds
if(alarmCode.getId() == AlarmCode.AccessPointIsUnreachable.getId()) {
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(); });

View File

@@ -40,7 +40,7 @@ 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> "AP out of reach" alarm is raised when no APNodeMetrics have been received for the equipment in the last interval, cleared when APNodeMetrics appear again
* <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
@@ -304,10 +304,10 @@ public class EquipmentAlarmsProcessor extends StreamProcessor {
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);
alarmCodeSet.add(AlarmCode.AccessPointIsUnreachable);
}

View File

@@ -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;
}
}

View File

@@ -346,6 +346,7 @@ components:
- 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 +358,8 @@ components:
type: string
enum:
- CEGWBlinkRequest
blinkAllLEDs:
type: boolean
colour1:
$ref: '#/components/schemas/LEDColour'
colour2:
@@ -375,6 +378,7 @@ components:
inventoryId: inv-1
model_type: CEGWBlinkRequest
commandType: BlinkRequest
blinkAllLEDs: true
colour1: blue
colour2: red
colour1DurationMs: 1000

View File

@@ -1,3 +1,4 @@
package com.telecominfraproject.wlan.portal.controller.equipmentgateway;
import org.slf4j.Logger;
@@ -13,6 +14,7 @@ import com.telecominfraproject.wlan.core.model.json.GenericResponse;
import com.telecominfraproject.wlan.equipment.EquipmentServiceInterface;
import com.telecominfraproject.wlan.equipment.models.Equipment;
import com.telecominfraproject.wlan.equipment.models.RadioChannelChangeSettings;
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 +32,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 +51,113 @@ 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) {
return new GenericResponse(true, "");
} else {
return new GenericResponse(false, "Failed to " + action + " for AP: " + response.getResultCode() + " " + response.getResultDetail());
}
}
}

View File

@@ -1865,6 +1865,9 @@ components:
sharedSecret:
type: string
format: password
dynamicDiscovery:
description: 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.
type: boolean
example:
model_type: RadiusProxyConfiguration
caCert:
@@ -5041,6 +5044,11 @@ components:
$ref: '#/components/schemas/ServiceMetricDetails'
ServiceMetricDetails:
type: object
properties:
sourceTimestampMs:
type: integer
format: int64
oneOf:
- $ref: '#/components/schemas/ApNodeMetrics'
- $ref: '#/components/schemas/ApSsidMetrics'
@@ -6940,7 +6948,10 @@ components:
description: The number of aggregation frames sent using single MPDU (where the A-MPDU contains only one MPDU ).
type: integer
format: int32
sourceTimestampMs:
type: integer
format: int64
wmmQueueStats:
$ref: '#/components/schemas/WmmQueueStatsPerQueueTypeMap'
@@ -7093,6 +7104,9 @@ components:
type: array
items:
$ref: '#/components/schemas/PerProcessUtilization'
sourceTimestampMs:
type: integer
format: int64
EthernetLinkState:
type: string
@@ -7139,6 +7153,10 @@ components:
type: array
items:
$ref: '#/components/schemas/DnsProbeMetric'
sourceTimestampMs:
type: integer
format: int64
StateUpDownError:
type: string
@@ -8953,7 +8971,10 @@ components:
numRxVHT_3466_8_Mbps:
type: integer
format: int64
sourceTimestampMs:
type: integer
format: int64
ListOfRadioUtilizationPerRadioMap:
properties:
@@ -9001,6 +9022,9 @@ components:
unAvailableCapacity:
type: number
format: double
sourceTimestampMs:
type: integer
format: int64
ListOfMacsPerRadioMap:
properties:
@@ -14217,6 +14241,36 @@ paths:
$ref: '#/components/schemas/GenericResponse'
500:
$ref: '#/components/responses/GenericApiError'
/portal/equipmentGateway/requestApBlinkLEDs:
post:
tags:
- Equipment Gateway
summary: Request to enable or disable the blinking of LEDs on the AP
operationId: requestApBlinkLEDs
parameters:
- name: equipmentId
in: query
description: Equipment id for AP on which the enabling or disabling of blinking LEDs is requested.
required: true
schema:
type: integer
format: int64
- name: blinkAllLEDs
in: query
description: enable (true) or disable (false) the LEDs blinking state.
required: true
schema:
type: boolean
responses:
200:
description: successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/GenericResponse'
500:
$ref: '#/components/responses/GenericApiError'
/portal/equipmentGateway/requestChannelChange:
post:

View File

@@ -28,6 +28,8 @@ 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 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 +72,7 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
}
public Integer getPort() {
if (port == null) return -1;
return port;
}
@@ -86,6 +89,7 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
}
public Integer getAcctPort() {
if (acctPort == null) return -1;
return acctPort;
}
@@ -118,6 +122,7 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
}
public Boolean getUseRadSec() {
if (useRadSec == null) return false;
return useRadSec;
}
@@ -141,6 +146,21 @@ public class RadiusProxyConfiguration extends BaseJsonModel implements PushableC
this.acctSharedSecret = acctSharedSecret;
}
/**
* @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) {
return !Objects.deepEquals(this, previousVersion);
@@ -153,8 +173,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);
}
@Override
@@ -168,9 +188,10 @@ 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);
}

View File

@@ -324,6 +324,13 @@ public class RfElementConfiguration extends BaseJsonModel {
}
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);
}
}
return maxAutoCellSize;
}

View File

@@ -491,6 +491,9 @@ components:
sharedSecret:
type: string
format: password
dynamicDiscovery:
description: 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.
type: boolean
example:
model_type: RadiusProxyConfiguration
caCert:

View File

@@ -8,13 +8,14 @@ import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.json.interfaces.HasSourceTimestamp;
/**
* @author yongli
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApPerformance extends BaseJsonModel {
public class ApPerformance extends BaseJsonModel implements HasSourceTimestamp {
private static final long serialVersionUID = 4520822419578448525L;
@@ -69,6 +70,11 @@ public class ApPerformance extends BaseJsonModel {
*/
private Long cloudRxBytes;
/**
* Timestamp of the stats report used to generate this metric (i.e. timestamp from the AP)
*/
private long sourceTimestampMs;
/**
* Top CPU consuming processes.
* CPU usage in percent.
@@ -100,16 +106,20 @@ public class ApPerformance extends BaseJsonModel {
return ret;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(cpuUtilized);
result = prime * result + Objects.hash(camiCrashed, cloudRxBytes, cloudTxBytes, cpuTemperature, ethLinkState,
freeMemory, lowMemoryReboot, psCpuUtil, psMemUtil, upTime);
result = prime * result + Objects.hash(camiCrashed, cloudRxBytes, cloudTxBytes, cpuTemperature, ethLinkState, freeMemory, lowMemoryReboot, psCpuUtil,
psMemUtil, sourceTimestampMs, upTime);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
@@ -120,13 +130,14 @@ public class ApPerformance extends BaseJsonModel {
return false;
ApPerformance other = (ApPerformance) obj;
return Objects.equals(camiCrashed, other.camiCrashed) && Objects.equals(cloudRxBytes, other.cloudRxBytes)
&& Objects.equals(cloudTxBytes, other.cloudTxBytes)
&& Objects.equals(cpuTemperature, other.cpuTemperature) && Arrays.equals(cpuUtilized, other.cpuUtilized)
&& ethLinkState == other.ethLinkState && Objects.equals(freeMemory, other.freeMemory)
&& Objects.equals(cloudTxBytes, other.cloudTxBytes) && Objects.equals(cpuTemperature, other.cpuTemperature)
&& Arrays.equals(cpuUtilized, other.cpuUtilized) && ethLinkState == other.ethLinkState && Objects.equals(freeMemory, other.freeMemory)
&& Objects.equals(lowMemoryReboot, other.lowMemoryReboot) && Objects.equals(psCpuUtil, other.psCpuUtil)
&& Objects.equals(psMemUtil, other.psMemUtil) && Objects.equals(upTime, other.upTime);
&& Objects.equals(psMemUtil, other.psMemUtil) && sourceTimestampMs == other.sourceTimestampMs && Objects.equals(upTime, other.upTime);
}
@JsonIgnore
public Float getAvgCpuUtilized() {
if (cpuUtilized == null) {
@@ -192,7 +203,6 @@ public class ApPerformance extends BaseJsonModel {
return psMemUtil;
}
@Override
public boolean hasUnsupportedValue() {
return (super.hasUnsupportedValue() || EthernetLinkState.isUnsupported(this.ethLinkState));
@@ -254,4 +264,13 @@ public class ApPerformance extends BaseJsonModel {
this.psMemUtil = psMemUtil;
}
public void setSourceTimestampMs(long sourceTimestamp) {
this.sourceTimestampMs = sourceTimestamp;
}
@Override
public long getSourceTimestampMs() {
return sourceTimestampMs;
}
}

View File

@@ -3,8 +3,10 @@ package com.telecominfraproject.wlan.servicemetric.apnode.models;
import java.util.List;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.json.interfaces.HasSourceTimestamp;
/**
* Metric Data from network probes that are running on CE
@@ -13,7 +15,7 @@ import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class NetworkProbeMetrics extends BaseJsonModel {
public class NetworkProbeMetrics extends BaseJsonModel implements HasSourceTimestamp {
private static final long serialVersionUID = 7293164162279703547L;
@@ -30,6 +32,11 @@ public class NetworkProbeMetrics extends BaseJsonModel {
private List<DnsProbeMetric> dnsProbeResults;
/**
* timestamp for the source data (AP stats) for this metrics report
*/
private long sourceTimestampMs;
public String getVlanIF()
{
return this.vlanIF;
@@ -109,39 +116,7 @@ public void setDnsProbeResults(List<DnsProbeMetric> dnsProbeResults) {
this.dnsProbeResults = dnsProbeResults;
}
@Override
public int hashCode()
{
return Objects.hash(this.dhcpState,
this.dhcpLatencyMs,
this.dnsState,
this.dnsLatencyMs,
this.vlanIF,
this.radiusLatencyMs,
this.radiusState,
this.dnsProbeResults);
}
@Override
public boolean equals(Object obj)
{
if(obj instanceof NetworkProbeMetrics)
{
NetworkProbeMetrics casted = (NetworkProbeMetrics) obj;
return Objects.equals(casted.dhcpState, dhcpState) &&
Objects.equals(casted.dnsState, dnsState) &&
Objects.equals(casted.dnsLatencyMs, dnsLatencyMs) &&
Objects.equals(casted.dhcpLatencyMs, dhcpLatencyMs) &&
Objects.equals(casted.vlanIF, vlanIF) &&
Objects.equals(casted.radiusLatencyMs, radiusLatencyMs) &&
Objects.equals(casted.dnsProbeResults, dnsProbeResults) &&
Objects.equals(casted.radiusState, radiusState);
}
return false;
}
@Override
public boolean hasUnsupportedValue() {
@@ -166,4 +141,32 @@ public void setDnsProbeResults(List<DnsProbeMetric> dnsProbeResults) {
public NetworkProbeMetrics clone() {
return (NetworkProbeMetrics) super.clone();
}
@Override
public int hashCode() {
return Objects.hash(dhcpLatencyMs, dhcpState, dnsLatencyMs, dnsProbeResults, dnsState, radiusLatencyMs, radiusState, sourceTimestampMs, vlanIF);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
NetworkProbeMetrics other = (NetworkProbeMetrics) obj;
return dhcpLatencyMs == other.dhcpLatencyMs && dhcpState == other.dhcpState && dnsLatencyMs == other.dnsLatencyMs
&& Objects.equals(dnsProbeResults, other.dnsProbeResults) && dnsState == other.dnsState && radiusLatencyMs == other.radiusLatencyMs
&& radiusState == other.radiusState && sourceTimestampMs == other.sourceTimestampMs && Objects.equals(vlanIF, other.vlanIF);
}
public void setSourceTimestampMs(long sourceTimestamp) {
this.sourceTimestampMs = sourceTimestamp;
}
@Override
public long getSourceTimestampMs() {
return this.sourceTimestampMs;
}
}

View File

@@ -2,12 +2,15 @@ package com.telecominfraproject.wlan.servicemetric.apnode.models;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.json.interfaces.HasSourceTimestamp;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RadioStatistics extends BaseJsonModel {
public class RadioStatistics extends BaseJsonModel implements HasSourceTimestamp {
private static final long serialVersionUID = 1185985309064758000L;
/**
@@ -697,6 +700,8 @@ public class RadioStatistics extends BaseJsonModel {
private Long numRxVHT_2808_Mbps;
private Long numRxVHT_3120_Mbps;
private Long numRxVHT_3466_8_Mbps;
private long sourceTimestampMs;
@Override
@@ -3682,5 +3687,272 @@ public class RadioStatistics extends BaseJsonModel {
public void setNumRxVHT_3466_8_Mbps(Long numRxVHT_3466_8_Mbps) {
this.numRxVHT_3466_8_Mbps = numRxVHT_3466_8_Mbps;
}
public void setSourceTimestampMs(long sourceTimestamp) {
this.sourceTimestampMs = sourceTimestamp;
}
@Override
public long getSourceTimestampMs() {
return this.sourceTimestampMs;
}
@Override
public int hashCode() {
return Objects.hash(actualCellSize, curBackupChannel, curChannel, curEirp, elevenGProtection, numChanChanges, numChannelBusy64s, numFreeTxBuf,
numRadarChanChanges, numRadioResets, numRcvBcForTx, numRcvFrameForTx, numRx, numRxAck, numRxAmsduDeaggItmd, numRxAmsduDeaggLast,
numRxAmsduDeaggSeq, numRxBcMc, numRxBeacon, numRxControl, numRxCts, numRxData, numRxDataFrames, numRxDataFramesRetried,
numRxDataFrames_108_Mbps, numRxDataFrames_12_Mbps, numRxDataFrames_1300Plus_Mbps, numRxDataFrames_1300_Mbps, numRxDataFrames_300_Mbps,
numRxDataFrames_450_Mbps, numRxDataFrames_54_Mbps, numRxDropAmsduNoRcv, numRxDropBadProtocol, numRxDropEthHdrRunt, numRxDropInvalidSrcMac,
numRxDropNoFcField, numRxDropRunt, numRxDup, numRxErr, numRxFcsErr, numRxFramesReceived, numRxHT_104_Mbps, numRxHT_108_Mbps, numRxHT_115_5_Mbps,
numRxHT_117_1_Mbps, numRxHT_117_Mbps, numRxHT_120_Mbps, numRxHT_121_5_Mbps, numRxHT_130_3_Mbps, numRxHT_130_Mbps, numRxHT_135_Mbps,
numRxHT_13_5_Mbps, numRxHT_13_Mbps, numRxHT_144_3_Mbps, numRxHT_14_3_Mbps, numRxHT_150_Mbps, numRxHT_156_Mbps, numRxHT_15_Mbps,
numRxHT_162_Mbps, numRxHT_173_1_Mbps, numRxHT_173_3_Mbps, numRxHT_175_5_Mbps, numRxHT_180_Mbps, numRxHT_195_Mbps, numRxHT_19_5_Mbps,
numRxHT_200_Mbps, numRxHT_208_Mbps, numRxHT_216_6_Mbps, numRxHT_216_Mbps, numRxHT_21_7_Mbps, numRxHT_231_1_Mbps, numRxHT_234_Mbps,
numRxHT_240_Mbps, numRxHT_243_Mbps, numRxHT_260_Mbps, numRxHT_263_2_Mbps, numRxHT_26_Mbps, numRxHT_270_Mbps, numRxHT_27_Mbps,
numRxHT_288_7_Mbps, numRxHT_288_8_Mbps, numRxHT_28_7_Mbps, numRxHT_28_8_Mbps, numRxHT_292_5_Mbps, numRxHT_29_2_Mbps, numRxHT_300_Mbps,
numRxHT_30_Mbps, numRxHT_312_Mbps, numRxHT_324_Mbps, numRxHT_325_Mbps, numRxHT_32_5_Mbps, numRxHT_346_7_Mbps, numRxHT_351_2_Mbps,
numRxHT_351_Mbps, numRxHT_360_Mbps, numRxHT_39_Mbps, numRxHT_40_5_Mbps, numRxHT_43_2_Mbps, numRxHT_45_Mbps, numRxHT_52_Mbps, numRxHT_54_Mbps,
numRxHT_57_5_Mbps, numRxHT_57_7_Mbps, numRxHT_58_5_Mbps, numRxHT_60_Mbps, numRxHT_65_Mbps, numRxHT_6_5_Mbps, numRxHT_72_1_Mbps, numRxHT_78_Mbps,
numRxHT_7_1_Mbps, numRxHT_81_Mbps, numRxHT_86_6_Mbps, numRxHT_86_8_Mbps, numRxHT_87_8_Mbps, numRxHT_90_Mbps, numRxHT_97_5_Mbps, numRxLdpc,
numRxManagement, numRxNoFcsErr, numRxNullData, numRxOffChan, numRxProbeReq, numRxProbeResp, numRxPspoll, numRxRetry, numRxRetryFrames, numRxRts,
numRxStbc, numRxTimeData, numRxTimeToMe, numRxVHT_1040_Mbps, numRxVHT_1053_1_Mbps, numRxVHT_1053_Mbps, numRxVHT_1170_Mbps, numRxVHT_1300_Mbps,
numRxVHT_1404_Mbps, numRxVHT_1560_Mbps, numRxVHT_1579_5_Mbps, numRxVHT_1733_1_Mbps, numRxVHT_1733_4_Mbps, numRxVHT_1755_Mbps,
numRxVHT_1872_Mbps, numRxVHT_1950_Mbps, numRxVHT_2080_Mbps, numRxVHT_2106_Mbps, numRxVHT_2340_Mbps, numRxVHT_2600_Mbps, numRxVHT_2808_Mbps,
numRxVHT_292_5_Mbps, numRxVHT_3120_Mbps, numRxVHT_325_Mbps, numRxVHT_3466_8_Mbps, numRxVHT_364_5_Mbps, numRxVHT_390_Mbps, numRxVHT_400_Mbps,
numRxVHT_403_Mbps, numRxVHT_405_Mbps, numRxVHT_432_Mbps, numRxVHT_433_2_Mbps, numRxVHT_450_Mbps, numRxVHT_468_Mbps, numRxVHT_480_Mbps,
numRxVHT_486_Mbps, numRxVHT_520_Mbps, numRxVHT_526_5_Mbps, numRxVHT_540_Mbps, numRxVHT_585_Mbps, numRxVHT_600_Mbps, numRxVHT_648_Mbps,
numRxVHT_650_Mbps, numRxVHT_702_Mbps, numRxVHT_720_Mbps, numRxVHT_780_Mbps, numRxVHT_800_Mbps, numRxVHT_866_7_Mbps, numRxVHT_877_5_Mbps,
numRxVHT_936_Mbps, numRxVHT_975_Mbps, numRx_12_Mbps, numRx_18_Mbps, numRx_1_Mbps, numRx_24_Mbps, numRx_36_Mbps, numRx_48_Mbps, numRx_54_Mbps,
numRx_6_Mbps, numRx_9_Mbps, numScanReq, numScanSucc, numTxAction, numTxAggrOneMpdu, numTxAggrSucc, numTxBcDropped, numTxBeaconFail,
numTxBeaconSuFail, numTxBeaconSucc, numTxControl, numTxCts, numTxData, numTxDataFrames, numTxDataFrames_108_Mbps, numTxDataFrames_12_Mbps,
numTxDataFrames_1300Plus_Mbps, numTxDataFrames_1300_Mbps, numTxDataFrames_300_Mbps, numTxDataFrames_450_Mbps, numTxDataFrames_54_Mbps,
numTxDataRetries, numTxDataTransmitted, numTxDataTransmittedRetried, numTxDropped, numTxDtimMc, numTxEapol, numTxFramesTransmitted,
numTxHT_104_Mbps, numTxHT_108_Mbps, numTxHT_115_5_Mbps, numTxHT_117_1_Mbps, numTxHT_117_Mbps, numTxHT_120_Mbps, numTxHT_121_5_Mbps,
numTxHT_130_3_Mbps, numTxHT_130_Mbps, numTxHT_135_Mbps, numTxHT_13_5_Mbps, numTxHT_13_Mbps, numTxHT_144_3_Mbps, numTxHT_14_3_Mbps,
numTxHT_150_Mbps, numTxHT_156_Mbps, numTxHT_15_Mbps, numTxHT_162_Mbps, numTxHT_173_1_Mbps, numTxHT_173_3_Mbps, numTxHT_175_5_Mbps,
numTxHT_180_Mbps, numTxHT_195_Mbps, numTxHT_19_5_Mbps, numTxHT_200_Mbps, numTxHT_208_Mbps, numTxHT_216_6_Mbps, numTxHT_216_Mbps,
numTxHT_21_7_Mbps, numTxHT_231_1_Mbps, numTxHT_234_Mbps, numTxHT_240_Mbps, numTxHT_243_Mbps, numTxHT_260_Mbps, numTxHT_263_2_Mbps,
numTxHT_26_Mbps, numTxHT_270_Mbps, numTxHT_27_Mbps, numTxHT_288_7_Mbps, numTxHT_288_8_Mbps, numTxHT_28_7_Mbps, numTxHT_28_8_Mbps,
numTxHT_292_5_Mbps, numTxHT_29_2_Mbps, numTxHT_300_Mbps, numTxHT_30_Mbps, numTxHT_312_Mbps, numTxHT_324_Mbps, numTxHT_325_Mbps,
numTxHT_32_5_Mbps, numTxHT_346_7_Mbps, numTxHT_351_2_Mbps, numTxHT_351_Mbps, numTxHT_360_Mbps, numTxHT_39_Mbps, numTxHT_40_5_Mbps,
numTxHT_43_2_Mbps, numTxHT_45_Mbps, numTxHT_52_Mbps, numTxHT_54_Mbps, numTxHT_57_5_Mbps, numTxHT_57_7_Mbps, numTxHT_58_5_Mbps, numTxHT_60_Mbps,
numTxHT_65_Mbps, numTxHT_6_5_Mbps, numTxHT_72_1_Mbps, numTxHT_78_Mbps, numTxHT_7_1_Mbps, numTxHT_81_Mbps, numTxHT_86_6_Mbps, numTxHT_86_8_Mbps,
numTxHT_87_8_Mbps, numTxHT_90_Mbps, numTxHT_97_5_Mbps, numTxLdpc, numTxManagement, numTxMultiRetries, numTxMultipleRetries, numTxNoAck,
numTxPowerChanges, numTxProbeResp, numTxPsUnicast, numTxQueued, numTxRateLimitDrop, numTxRetryAttemps, numTxRetryDropped, numTxRtsFail,
numTxRtsSucc, numTxStbc, numTxSucc, numTxSuccNoRetry, numTxSuccRetries, numTxSuccessWithRetry, numTxTimeData, numTxTimeFramesTransmitted,
numTxTime_BC_MC_Data, numTxTotalAttemps, numTxVHT_1040_Mbps, numTxVHT_1053_1_Mbps, numTxVHT_1053_Mbps, numTxVHT_1170_Mbps, numTxVHT_1300_Mbps,
numTxVHT_1404_Mbps, numTxVHT_1560_Mbps, numTxVHT_1579_5_Mbps, numTxVHT_1733_1_Mbps, numTxVHT_1733_4_Mbps, numTxVHT_1755_Mbps,
numTxVHT_1872_Mbps, numTxVHT_1950_Mbps, numTxVHT_2080_Mbps, numTxVHT_2106_Mbps, numTxVHT_2340_Mbps, numTxVHT_2600_Mbps, numTxVHT_2808_Mbps,
numTxVHT_292_5_Mbps, numTxVHT_3120_Mbps, numTxVHT_325_Mbps, numTxVHT_3466_8_Mbps, numTxVHT_364_5_Mbps, numTxVHT_390_Mbps, numTxVHT_400_Mbps,
numTxVHT_403_Mbps, numTxVHT_405_Mbps, numTxVHT_432_Mbps, numTxVHT_433_2_Mbps, numTxVHT_450_Mbps, numTxVHT_468_Mbps, numTxVHT_480_Mbps,
numTxVHT_486_Mbps, numTxVHT_520_Mbps, numTxVHT_526_5_Mbps, numTxVHT_540_Mbps, numTxVHT_585_Mbps, numTxVHT_600_Mbps, numTxVHT_648_Mbps,
numTxVHT_650_Mbps, numTxVHT_702_Mbps, numTxVHT_720_Mbps, numTxVHT_780_Mbps, numTxVHT_800_Mbps, numTxVHT_866_7_Mbps, numTxVHT_877_5_Mbps,
numTxVHT_936_Mbps, numTxVHT_975_Mbps, numTx_12_Mbps, numTx_18_Mbps, numTx_1_Mbps, numTx_24_Mbps, numTx_36_Mbps, numTx_48_Mbps, numTx_54_Mbps,
numTx_6_Mbps, numTx_9_Mbps, rxDataBytes, rxLastRssi, sourceTimestampMs);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RadioStatistics other = (RadioStatistics) obj;
return Objects.equals(actualCellSize, other.actualCellSize) && Objects.equals(curBackupChannel, other.curBackupChannel)
&& Objects.equals(curChannel, other.curChannel) && Objects.equals(curEirp, other.curEirp)
&& Objects.equals(elevenGProtection, other.elevenGProtection) && Objects.equals(numChanChanges, other.numChanChanges)
&& Objects.equals(numChannelBusy64s, other.numChannelBusy64s) && Objects.equals(numFreeTxBuf, other.numFreeTxBuf)
&& Objects.equals(numRadarChanChanges, other.numRadarChanChanges) && Objects.equals(numRadioResets, other.numRadioResets)
&& Objects.equals(numRcvBcForTx, other.numRcvBcForTx) && Objects.equals(numRcvFrameForTx, other.numRcvFrameForTx)
&& Objects.equals(numRx, other.numRx) && Objects.equals(numRxAck, other.numRxAck)
&& Objects.equals(numRxAmsduDeaggItmd, other.numRxAmsduDeaggItmd) && Objects.equals(numRxAmsduDeaggLast, other.numRxAmsduDeaggLast)
&& Objects.equals(numRxAmsduDeaggSeq, other.numRxAmsduDeaggSeq) && Objects.equals(numRxBcMc, other.numRxBcMc)
&& Objects.equals(numRxBeacon, other.numRxBeacon) && Objects.equals(numRxControl, other.numRxControl)
&& Objects.equals(numRxCts, other.numRxCts) && Objects.equals(numRxData, other.numRxData)
&& Objects.equals(numRxDataFrames, other.numRxDataFrames) && Objects.equals(numRxDataFramesRetried, other.numRxDataFramesRetried)
&& Objects.equals(numRxDataFrames_108_Mbps, other.numRxDataFrames_108_Mbps)
&& Objects.equals(numRxDataFrames_12_Mbps, other.numRxDataFrames_12_Mbps)
&& Objects.equals(numRxDataFrames_1300Plus_Mbps, other.numRxDataFrames_1300Plus_Mbps)
&& Objects.equals(numRxDataFrames_1300_Mbps, other.numRxDataFrames_1300_Mbps)
&& Objects.equals(numRxDataFrames_300_Mbps, other.numRxDataFrames_300_Mbps)
&& Objects.equals(numRxDataFrames_450_Mbps, other.numRxDataFrames_450_Mbps)
&& Objects.equals(numRxDataFrames_54_Mbps, other.numRxDataFrames_54_Mbps) && Objects.equals(numRxDropAmsduNoRcv, other.numRxDropAmsduNoRcv)
&& Objects.equals(numRxDropBadProtocol, other.numRxDropBadProtocol) && Objects.equals(numRxDropEthHdrRunt, other.numRxDropEthHdrRunt)
&& Objects.equals(numRxDropInvalidSrcMac, other.numRxDropInvalidSrcMac) && Objects.equals(numRxDropNoFcField, other.numRxDropNoFcField)
&& Objects.equals(numRxDropRunt, other.numRxDropRunt) && Objects.equals(numRxDup, other.numRxDup) && Objects.equals(numRxErr, other.numRxErr)
&& Objects.equals(numRxFcsErr, other.numRxFcsErr) && Objects.equals(numRxFramesReceived, other.numRxFramesReceived)
&& Objects.equals(numRxHT_104_Mbps, other.numRxHT_104_Mbps) && Objects.equals(numRxHT_108_Mbps, other.numRxHT_108_Mbps)
&& Objects.equals(numRxHT_115_5_Mbps, other.numRxHT_115_5_Mbps) && Objects.equals(numRxHT_117_1_Mbps, other.numRxHT_117_1_Mbps)
&& Objects.equals(numRxHT_117_Mbps, other.numRxHT_117_Mbps) && Objects.equals(numRxHT_120_Mbps, other.numRxHT_120_Mbps)
&& Objects.equals(numRxHT_121_5_Mbps, other.numRxHT_121_5_Mbps) && Objects.equals(numRxHT_130_3_Mbps, other.numRxHT_130_3_Mbps)
&& Objects.equals(numRxHT_130_Mbps, other.numRxHT_130_Mbps) && Objects.equals(numRxHT_135_Mbps, other.numRxHT_135_Mbps)
&& Objects.equals(numRxHT_13_5_Mbps, other.numRxHT_13_5_Mbps) && Objects.equals(numRxHT_13_Mbps, other.numRxHT_13_Mbps)
&& Objects.equals(numRxHT_144_3_Mbps, other.numRxHT_144_3_Mbps) && Objects.equals(numRxHT_14_3_Mbps, other.numRxHT_14_3_Mbps)
&& Objects.equals(numRxHT_150_Mbps, other.numRxHT_150_Mbps) && Objects.equals(numRxHT_156_Mbps, other.numRxHT_156_Mbps)
&& Objects.equals(numRxHT_15_Mbps, other.numRxHT_15_Mbps) && Objects.equals(numRxHT_162_Mbps, other.numRxHT_162_Mbps)
&& Objects.equals(numRxHT_173_1_Mbps, other.numRxHT_173_1_Mbps) && Objects.equals(numRxHT_173_3_Mbps, other.numRxHT_173_3_Mbps)
&& Objects.equals(numRxHT_175_5_Mbps, other.numRxHT_175_5_Mbps) && Objects.equals(numRxHT_180_Mbps, other.numRxHT_180_Mbps)
&& Objects.equals(numRxHT_195_Mbps, other.numRxHT_195_Mbps) && Objects.equals(numRxHT_19_5_Mbps, other.numRxHT_19_5_Mbps)
&& Objects.equals(numRxHT_200_Mbps, other.numRxHT_200_Mbps) && Objects.equals(numRxHT_208_Mbps, other.numRxHT_208_Mbps)
&& Objects.equals(numRxHT_216_6_Mbps, other.numRxHT_216_6_Mbps) && Objects.equals(numRxHT_216_Mbps, other.numRxHT_216_Mbps)
&& Objects.equals(numRxHT_21_7_Mbps, other.numRxHT_21_7_Mbps) && Objects.equals(numRxHT_231_1_Mbps, other.numRxHT_231_1_Mbps)
&& Objects.equals(numRxHT_234_Mbps, other.numRxHT_234_Mbps) && Objects.equals(numRxHT_240_Mbps, other.numRxHT_240_Mbps)
&& Objects.equals(numRxHT_243_Mbps, other.numRxHT_243_Mbps) && Objects.equals(numRxHT_260_Mbps, other.numRxHT_260_Mbps)
&& Objects.equals(numRxHT_263_2_Mbps, other.numRxHT_263_2_Mbps) && Objects.equals(numRxHT_26_Mbps, other.numRxHT_26_Mbps)
&& Objects.equals(numRxHT_270_Mbps, other.numRxHT_270_Mbps) && Objects.equals(numRxHT_27_Mbps, other.numRxHT_27_Mbps)
&& Objects.equals(numRxHT_288_7_Mbps, other.numRxHT_288_7_Mbps) && Objects.equals(numRxHT_288_8_Mbps, other.numRxHT_288_8_Mbps)
&& Objects.equals(numRxHT_28_7_Mbps, other.numRxHT_28_7_Mbps) && Objects.equals(numRxHT_28_8_Mbps, other.numRxHT_28_8_Mbps)
&& Objects.equals(numRxHT_292_5_Mbps, other.numRxHT_292_5_Mbps) && Objects.equals(numRxHT_29_2_Mbps, other.numRxHT_29_2_Mbps)
&& Objects.equals(numRxHT_300_Mbps, other.numRxHT_300_Mbps) && Objects.equals(numRxHT_30_Mbps, other.numRxHT_30_Mbps)
&& Objects.equals(numRxHT_312_Mbps, other.numRxHT_312_Mbps) && Objects.equals(numRxHT_324_Mbps, other.numRxHT_324_Mbps)
&& Objects.equals(numRxHT_325_Mbps, other.numRxHT_325_Mbps) && Objects.equals(numRxHT_32_5_Mbps, other.numRxHT_32_5_Mbps)
&& Objects.equals(numRxHT_346_7_Mbps, other.numRxHT_346_7_Mbps) && Objects.equals(numRxHT_351_2_Mbps, other.numRxHT_351_2_Mbps)
&& Objects.equals(numRxHT_351_Mbps, other.numRxHT_351_Mbps) && Objects.equals(numRxHT_360_Mbps, other.numRxHT_360_Mbps)
&& Objects.equals(numRxHT_39_Mbps, other.numRxHT_39_Mbps) && Objects.equals(numRxHT_40_5_Mbps, other.numRxHT_40_5_Mbps)
&& Objects.equals(numRxHT_43_2_Mbps, other.numRxHT_43_2_Mbps) && Objects.equals(numRxHT_45_Mbps, other.numRxHT_45_Mbps)
&& Objects.equals(numRxHT_52_Mbps, other.numRxHT_52_Mbps) && Objects.equals(numRxHT_54_Mbps, other.numRxHT_54_Mbps)
&& Objects.equals(numRxHT_57_5_Mbps, other.numRxHT_57_5_Mbps) && Objects.equals(numRxHT_57_7_Mbps, other.numRxHT_57_7_Mbps)
&& Objects.equals(numRxHT_58_5_Mbps, other.numRxHT_58_5_Mbps) && Objects.equals(numRxHT_60_Mbps, other.numRxHT_60_Mbps)
&& Objects.equals(numRxHT_65_Mbps, other.numRxHT_65_Mbps) && Objects.equals(numRxHT_6_5_Mbps, other.numRxHT_6_5_Mbps)
&& Objects.equals(numRxHT_72_1_Mbps, other.numRxHT_72_1_Mbps) && Objects.equals(numRxHT_78_Mbps, other.numRxHT_78_Mbps)
&& Objects.equals(numRxHT_7_1_Mbps, other.numRxHT_7_1_Mbps) && Objects.equals(numRxHT_81_Mbps, other.numRxHT_81_Mbps)
&& Objects.equals(numRxHT_86_6_Mbps, other.numRxHT_86_6_Mbps) && Objects.equals(numRxHT_86_8_Mbps, other.numRxHT_86_8_Mbps)
&& Objects.equals(numRxHT_87_8_Mbps, other.numRxHT_87_8_Mbps) && Objects.equals(numRxHT_90_Mbps, other.numRxHT_90_Mbps)
&& Objects.equals(numRxHT_97_5_Mbps, other.numRxHT_97_5_Mbps) && Objects.equals(numRxLdpc, other.numRxLdpc)
&& Objects.equals(numRxManagement, other.numRxManagement) && Objects.equals(numRxNoFcsErr, other.numRxNoFcsErr)
&& Objects.equals(numRxNullData, other.numRxNullData) && Objects.equals(numRxOffChan, other.numRxOffChan)
&& Objects.equals(numRxProbeReq, other.numRxProbeReq) && Objects.equals(numRxProbeResp, other.numRxProbeResp)
&& Objects.equals(numRxPspoll, other.numRxPspoll) && Objects.equals(numRxRetry, other.numRxRetry)
&& Objects.equals(numRxRetryFrames, other.numRxRetryFrames) && Objects.equals(numRxRts, other.numRxRts)
&& Objects.equals(numRxStbc, other.numRxStbc) && Objects.equals(numRxTimeData, other.numRxTimeData)
&& Objects.equals(numRxTimeToMe, other.numRxTimeToMe) && Objects.equals(numRxVHT_1040_Mbps, other.numRxVHT_1040_Mbps)
&& Objects.equals(numRxVHT_1053_1_Mbps, other.numRxVHT_1053_1_Mbps) && Objects.equals(numRxVHT_1053_Mbps, other.numRxVHT_1053_Mbps)
&& Objects.equals(numRxVHT_1170_Mbps, other.numRxVHT_1170_Mbps) && Objects.equals(numRxVHT_1300_Mbps, other.numRxVHT_1300_Mbps)
&& Objects.equals(numRxVHT_1404_Mbps, other.numRxVHT_1404_Mbps) && Objects.equals(numRxVHT_1560_Mbps, other.numRxVHT_1560_Mbps)
&& Objects.equals(numRxVHT_1579_5_Mbps, other.numRxVHT_1579_5_Mbps) && Objects.equals(numRxVHT_1733_1_Mbps, other.numRxVHT_1733_1_Mbps)
&& Objects.equals(numRxVHT_1733_4_Mbps, other.numRxVHT_1733_4_Mbps) && Objects.equals(numRxVHT_1755_Mbps, other.numRxVHT_1755_Mbps)
&& Objects.equals(numRxVHT_1872_Mbps, other.numRxVHT_1872_Mbps) && Objects.equals(numRxVHT_1950_Mbps, other.numRxVHT_1950_Mbps)
&& Objects.equals(numRxVHT_2080_Mbps, other.numRxVHT_2080_Mbps) && Objects.equals(numRxVHT_2106_Mbps, other.numRxVHT_2106_Mbps)
&& Objects.equals(numRxVHT_2340_Mbps, other.numRxVHT_2340_Mbps) && Objects.equals(numRxVHT_2600_Mbps, other.numRxVHT_2600_Mbps)
&& Objects.equals(numRxVHT_2808_Mbps, other.numRxVHT_2808_Mbps) && Objects.equals(numRxVHT_292_5_Mbps, other.numRxVHT_292_5_Mbps)
&& Objects.equals(numRxVHT_3120_Mbps, other.numRxVHT_3120_Mbps) && Objects.equals(numRxVHT_325_Mbps, other.numRxVHT_325_Mbps)
&& Objects.equals(numRxVHT_3466_8_Mbps, other.numRxVHT_3466_8_Mbps) && Objects.equals(numRxVHT_364_5_Mbps, other.numRxVHT_364_5_Mbps)
&& Objects.equals(numRxVHT_390_Mbps, other.numRxVHT_390_Mbps) && Objects.equals(numRxVHT_400_Mbps, other.numRxVHT_400_Mbps)
&& Objects.equals(numRxVHT_403_Mbps, other.numRxVHT_403_Mbps) && Objects.equals(numRxVHT_405_Mbps, other.numRxVHT_405_Mbps)
&& Objects.equals(numRxVHT_432_Mbps, other.numRxVHT_432_Mbps) && Objects.equals(numRxVHT_433_2_Mbps, other.numRxVHT_433_2_Mbps)
&& Objects.equals(numRxVHT_450_Mbps, other.numRxVHT_450_Mbps) && Objects.equals(numRxVHT_468_Mbps, other.numRxVHT_468_Mbps)
&& Objects.equals(numRxVHT_480_Mbps, other.numRxVHT_480_Mbps) && Objects.equals(numRxVHT_486_Mbps, other.numRxVHT_486_Mbps)
&& Objects.equals(numRxVHT_520_Mbps, other.numRxVHT_520_Mbps) && Objects.equals(numRxVHT_526_5_Mbps, other.numRxVHT_526_5_Mbps)
&& Objects.equals(numRxVHT_540_Mbps, other.numRxVHT_540_Mbps) && Objects.equals(numRxVHT_585_Mbps, other.numRxVHT_585_Mbps)
&& Objects.equals(numRxVHT_600_Mbps, other.numRxVHT_600_Mbps) && Objects.equals(numRxVHT_648_Mbps, other.numRxVHT_648_Mbps)
&& Objects.equals(numRxVHT_650_Mbps, other.numRxVHT_650_Mbps) && Objects.equals(numRxVHT_702_Mbps, other.numRxVHT_702_Mbps)
&& Objects.equals(numRxVHT_720_Mbps, other.numRxVHT_720_Mbps) && Objects.equals(numRxVHT_780_Mbps, other.numRxVHT_780_Mbps)
&& Objects.equals(numRxVHT_800_Mbps, other.numRxVHT_800_Mbps) && Objects.equals(numRxVHT_866_7_Mbps, other.numRxVHT_866_7_Mbps)
&& Objects.equals(numRxVHT_877_5_Mbps, other.numRxVHT_877_5_Mbps) && Objects.equals(numRxVHT_936_Mbps, other.numRxVHT_936_Mbps)
&& Objects.equals(numRxVHT_975_Mbps, other.numRxVHT_975_Mbps) && Objects.equals(numRx_12_Mbps, other.numRx_12_Mbps)
&& Objects.equals(numRx_18_Mbps, other.numRx_18_Mbps) && Objects.equals(numRx_1_Mbps, other.numRx_1_Mbps)
&& Objects.equals(numRx_24_Mbps, other.numRx_24_Mbps) && Objects.equals(numRx_36_Mbps, other.numRx_36_Mbps)
&& Objects.equals(numRx_48_Mbps, other.numRx_48_Mbps) && Objects.equals(numRx_54_Mbps, other.numRx_54_Mbps)
&& Objects.equals(numRx_6_Mbps, other.numRx_6_Mbps) && Objects.equals(numRx_9_Mbps, other.numRx_9_Mbps)
&& Objects.equals(numScanReq, other.numScanReq) && Objects.equals(numScanSucc, other.numScanSucc)
&& Objects.equals(numTxAction, other.numTxAction) && Objects.equals(numTxAggrOneMpdu, other.numTxAggrOneMpdu)
&& Objects.equals(numTxAggrSucc, other.numTxAggrSucc) && Objects.equals(numTxBcDropped, other.numTxBcDropped)
&& Objects.equals(numTxBeaconFail, other.numTxBeaconFail) && Objects.equals(numTxBeaconSuFail, other.numTxBeaconSuFail)
&& Objects.equals(numTxBeaconSucc, other.numTxBeaconSucc) && Objects.equals(numTxControl, other.numTxControl)
&& Objects.equals(numTxCts, other.numTxCts) && Objects.equals(numTxData, other.numTxData)
&& Objects.equals(numTxDataFrames, other.numTxDataFrames) && Objects.equals(numTxDataFrames_108_Mbps, other.numTxDataFrames_108_Mbps)
&& Objects.equals(numTxDataFrames_12_Mbps, other.numTxDataFrames_12_Mbps)
&& Objects.equals(numTxDataFrames_1300Plus_Mbps, other.numTxDataFrames_1300Plus_Mbps)
&& Objects.equals(numTxDataFrames_1300_Mbps, other.numTxDataFrames_1300_Mbps)
&& Objects.equals(numTxDataFrames_300_Mbps, other.numTxDataFrames_300_Mbps)
&& Objects.equals(numTxDataFrames_450_Mbps, other.numTxDataFrames_450_Mbps)
&& Objects.equals(numTxDataFrames_54_Mbps, other.numTxDataFrames_54_Mbps) && Objects.equals(numTxDataRetries, other.numTxDataRetries)
&& Objects.equals(numTxDataTransmitted, other.numTxDataTransmitted)
&& Objects.equals(numTxDataTransmittedRetried, other.numTxDataTransmittedRetried) && Objects.equals(numTxDropped, other.numTxDropped)
&& Objects.equals(numTxDtimMc, other.numTxDtimMc) && Objects.equals(numTxEapol, other.numTxEapol)
&& Objects.equals(numTxFramesTransmitted, other.numTxFramesTransmitted) && Objects.equals(numTxHT_104_Mbps, other.numTxHT_104_Mbps)
&& Objects.equals(numTxHT_108_Mbps, other.numTxHT_108_Mbps) && Objects.equals(numTxHT_115_5_Mbps, other.numTxHT_115_5_Mbps)
&& Objects.equals(numTxHT_117_1_Mbps, other.numTxHT_117_1_Mbps) && Objects.equals(numTxHT_117_Mbps, other.numTxHT_117_Mbps)
&& Objects.equals(numTxHT_120_Mbps, other.numTxHT_120_Mbps) && Objects.equals(numTxHT_121_5_Mbps, other.numTxHT_121_5_Mbps)
&& Objects.equals(numTxHT_130_3_Mbps, other.numTxHT_130_3_Mbps) && Objects.equals(numTxHT_130_Mbps, other.numTxHT_130_Mbps)
&& Objects.equals(numTxHT_135_Mbps, other.numTxHT_135_Mbps) && Objects.equals(numTxHT_13_5_Mbps, other.numTxHT_13_5_Mbps)
&& Objects.equals(numTxHT_13_Mbps, other.numTxHT_13_Mbps) && Objects.equals(numTxHT_144_3_Mbps, other.numTxHT_144_3_Mbps)
&& Objects.equals(numTxHT_14_3_Mbps, other.numTxHT_14_3_Mbps) && Objects.equals(numTxHT_150_Mbps, other.numTxHT_150_Mbps)
&& Objects.equals(numTxHT_156_Mbps, other.numTxHT_156_Mbps) && Objects.equals(numTxHT_15_Mbps, other.numTxHT_15_Mbps)
&& Objects.equals(numTxHT_162_Mbps, other.numTxHT_162_Mbps) && Objects.equals(numTxHT_173_1_Mbps, other.numTxHT_173_1_Mbps)
&& Objects.equals(numTxHT_173_3_Mbps, other.numTxHT_173_3_Mbps) && Objects.equals(numTxHT_175_5_Mbps, other.numTxHT_175_5_Mbps)
&& Objects.equals(numTxHT_180_Mbps, other.numTxHT_180_Mbps) && Objects.equals(numTxHT_195_Mbps, other.numTxHT_195_Mbps)
&& Objects.equals(numTxHT_19_5_Mbps, other.numTxHT_19_5_Mbps) && Objects.equals(numTxHT_200_Mbps, other.numTxHT_200_Mbps)
&& Objects.equals(numTxHT_208_Mbps, other.numTxHT_208_Mbps) && Objects.equals(numTxHT_216_6_Mbps, other.numTxHT_216_6_Mbps)
&& Objects.equals(numTxHT_216_Mbps, other.numTxHT_216_Mbps) && Objects.equals(numTxHT_21_7_Mbps, other.numTxHT_21_7_Mbps)
&& Objects.equals(numTxHT_231_1_Mbps, other.numTxHT_231_1_Mbps) && Objects.equals(numTxHT_234_Mbps, other.numTxHT_234_Mbps)
&& Objects.equals(numTxHT_240_Mbps, other.numTxHT_240_Mbps) && Objects.equals(numTxHT_243_Mbps, other.numTxHT_243_Mbps)
&& Objects.equals(numTxHT_260_Mbps, other.numTxHT_260_Mbps) && Objects.equals(numTxHT_263_2_Mbps, other.numTxHT_263_2_Mbps)
&& Objects.equals(numTxHT_26_Mbps, other.numTxHT_26_Mbps) && Objects.equals(numTxHT_270_Mbps, other.numTxHT_270_Mbps)
&& Objects.equals(numTxHT_27_Mbps, other.numTxHT_27_Mbps) && Objects.equals(numTxHT_288_7_Mbps, other.numTxHT_288_7_Mbps)
&& Objects.equals(numTxHT_288_8_Mbps, other.numTxHT_288_8_Mbps) && Objects.equals(numTxHT_28_7_Mbps, other.numTxHT_28_7_Mbps)
&& Objects.equals(numTxHT_28_8_Mbps, other.numTxHT_28_8_Mbps) && Objects.equals(numTxHT_292_5_Mbps, other.numTxHT_292_5_Mbps)
&& Objects.equals(numTxHT_29_2_Mbps, other.numTxHT_29_2_Mbps) && Objects.equals(numTxHT_300_Mbps, other.numTxHT_300_Mbps)
&& Objects.equals(numTxHT_30_Mbps, other.numTxHT_30_Mbps) && Objects.equals(numTxHT_312_Mbps, other.numTxHT_312_Mbps)
&& Objects.equals(numTxHT_324_Mbps, other.numTxHT_324_Mbps) && Objects.equals(numTxHT_325_Mbps, other.numTxHT_325_Mbps)
&& Objects.equals(numTxHT_32_5_Mbps, other.numTxHT_32_5_Mbps) && Objects.equals(numTxHT_346_7_Mbps, other.numTxHT_346_7_Mbps)
&& Objects.equals(numTxHT_351_2_Mbps, other.numTxHT_351_2_Mbps) && Objects.equals(numTxHT_351_Mbps, other.numTxHT_351_Mbps)
&& Objects.equals(numTxHT_360_Mbps, other.numTxHT_360_Mbps) && Objects.equals(numTxHT_39_Mbps, other.numTxHT_39_Mbps)
&& Objects.equals(numTxHT_40_5_Mbps, other.numTxHT_40_5_Mbps) && Objects.equals(numTxHT_43_2_Mbps, other.numTxHT_43_2_Mbps)
&& Objects.equals(numTxHT_45_Mbps, other.numTxHT_45_Mbps) && Objects.equals(numTxHT_52_Mbps, other.numTxHT_52_Mbps)
&& Objects.equals(numTxHT_54_Mbps, other.numTxHT_54_Mbps) && Objects.equals(numTxHT_57_5_Mbps, other.numTxHT_57_5_Mbps)
&& Objects.equals(numTxHT_57_7_Mbps, other.numTxHT_57_7_Mbps) && Objects.equals(numTxHT_58_5_Mbps, other.numTxHT_58_5_Mbps)
&& Objects.equals(numTxHT_60_Mbps, other.numTxHT_60_Mbps) && Objects.equals(numTxHT_65_Mbps, other.numTxHT_65_Mbps)
&& Objects.equals(numTxHT_6_5_Mbps, other.numTxHT_6_5_Mbps) && Objects.equals(numTxHT_72_1_Mbps, other.numTxHT_72_1_Mbps)
&& Objects.equals(numTxHT_78_Mbps, other.numTxHT_78_Mbps) && Objects.equals(numTxHT_7_1_Mbps, other.numTxHT_7_1_Mbps)
&& Objects.equals(numTxHT_81_Mbps, other.numTxHT_81_Mbps) && Objects.equals(numTxHT_86_6_Mbps, other.numTxHT_86_6_Mbps)
&& Objects.equals(numTxHT_86_8_Mbps, other.numTxHT_86_8_Mbps) && Objects.equals(numTxHT_87_8_Mbps, other.numTxHT_87_8_Mbps)
&& Objects.equals(numTxHT_90_Mbps, other.numTxHT_90_Mbps) && Objects.equals(numTxHT_97_5_Mbps, other.numTxHT_97_5_Mbps)
&& Objects.equals(numTxLdpc, other.numTxLdpc) && Objects.equals(numTxManagement, other.numTxManagement)
&& Objects.equals(numTxMultiRetries, other.numTxMultiRetries) && Objects.equals(numTxMultipleRetries, other.numTxMultipleRetries)
&& Objects.equals(numTxNoAck, other.numTxNoAck) && Objects.equals(numTxPowerChanges, other.numTxPowerChanges)
&& Objects.equals(numTxProbeResp, other.numTxProbeResp) && Objects.equals(numTxPsUnicast, other.numTxPsUnicast)
&& Objects.equals(numTxQueued, other.numTxQueued) && Objects.equals(numTxRateLimitDrop, other.numTxRateLimitDrop)
&& Objects.equals(numTxRetryAttemps, other.numTxRetryAttemps) && Objects.equals(numTxRetryDropped, other.numTxRetryDropped)
&& Objects.equals(numTxRtsFail, other.numTxRtsFail) && Objects.equals(numTxRtsSucc, other.numTxRtsSucc)
&& Objects.equals(numTxStbc, other.numTxStbc) && Objects.equals(numTxSucc, other.numTxSucc)
&& Objects.equals(numTxSuccNoRetry, other.numTxSuccNoRetry) && Objects.equals(numTxSuccRetries, other.numTxSuccRetries)
&& Objects.equals(numTxSuccessWithRetry, other.numTxSuccessWithRetry) && Objects.equals(numTxTimeData, other.numTxTimeData)
&& Objects.equals(numTxTimeFramesTransmitted, other.numTxTimeFramesTransmitted)
&& Objects.equals(numTxTime_BC_MC_Data, other.numTxTime_BC_MC_Data) && Objects.equals(numTxTotalAttemps, other.numTxTotalAttemps)
&& Objects.equals(numTxVHT_1040_Mbps, other.numTxVHT_1040_Mbps) && Objects.equals(numTxVHT_1053_1_Mbps, other.numTxVHT_1053_1_Mbps)
&& Objects.equals(numTxVHT_1053_Mbps, other.numTxVHT_1053_Mbps) && Objects.equals(numTxVHT_1170_Mbps, other.numTxVHT_1170_Mbps)
&& Objects.equals(numTxVHT_1300_Mbps, other.numTxVHT_1300_Mbps) && Objects.equals(numTxVHT_1404_Mbps, other.numTxVHT_1404_Mbps)
&& Objects.equals(numTxVHT_1560_Mbps, other.numTxVHT_1560_Mbps) && Objects.equals(numTxVHT_1579_5_Mbps, other.numTxVHT_1579_5_Mbps)
&& Objects.equals(numTxVHT_1733_1_Mbps, other.numTxVHT_1733_1_Mbps) && Objects.equals(numTxVHT_1733_4_Mbps, other.numTxVHT_1733_4_Mbps)
&& Objects.equals(numTxVHT_1755_Mbps, other.numTxVHT_1755_Mbps) && Objects.equals(numTxVHT_1872_Mbps, other.numTxVHT_1872_Mbps)
&& Objects.equals(numTxVHT_1950_Mbps, other.numTxVHT_1950_Mbps) && Objects.equals(numTxVHT_2080_Mbps, other.numTxVHT_2080_Mbps)
&& Objects.equals(numTxVHT_2106_Mbps, other.numTxVHT_2106_Mbps) && Objects.equals(numTxVHT_2340_Mbps, other.numTxVHT_2340_Mbps)
&& Objects.equals(numTxVHT_2600_Mbps, other.numTxVHT_2600_Mbps) && Objects.equals(numTxVHT_2808_Mbps, other.numTxVHT_2808_Mbps)
&& Objects.equals(numTxVHT_292_5_Mbps, other.numTxVHT_292_5_Mbps) && Objects.equals(numTxVHT_3120_Mbps, other.numTxVHT_3120_Mbps)
&& Objects.equals(numTxVHT_325_Mbps, other.numTxVHT_325_Mbps) && Objects.equals(numTxVHT_3466_8_Mbps, other.numTxVHT_3466_8_Mbps)
&& Objects.equals(numTxVHT_364_5_Mbps, other.numTxVHT_364_5_Mbps) && Objects.equals(numTxVHT_390_Mbps, other.numTxVHT_390_Mbps)
&& Objects.equals(numTxVHT_400_Mbps, other.numTxVHT_400_Mbps) && Objects.equals(numTxVHT_403_Mbps, other.numTxVHT_403_Mbps)
&& Objects.equals(numTxVHT_405_Mbps, other.numTxVHT_405_Mbps) && Objects.equals(numTxVHT_432_Mbps, other.numTxVHT_432_Mbps)
&& Objects.equals(numTxVHT_433_2_Mbps, other.numTxVHT_433_2_Mbps) && Objects.equals(numTxVHT_450_Mbps, other.numTxVHT_450_Mbps)
&& Objects.equals(numTxVHT_468_Mbps, other.numTxVHT_468_Mbps) && Objects.equals(numTxVHT_480_Mbps, other.numTxVHT_480_Mbps)
&& Objects.equals(numTxVHT_486_Mbps, other.numTxVHT_486_Mbps) && Objects.equals(numTxVHT_520_Mbps, other.numTxVHT_520_Mbps)
&& Objects.equals(numTxVHT_526_5_Mbps, other.numTxVHT_526_5_Mbps) && Objects.equals(numTxVHT_540_Mbps, other.numTxVHT_540_Mbps)
&& Objects.equals(numTxVHT_585_Mbps, other.numTxVHT_585_Mbps) && Objects.equals(numTxVHT_600_Mbps, other.numTxVHT_600_Mbps)
&& Objects.equals(numTxVHT_648_Mbps, other.numTxVHT_648_Mbps) && Objects.equals(numTxVHT_650_Mbps, other.numTxVHT_650_Mbps)
&& Objects.equals(numTxVHT_702_Mbps, other.numTxVHT_702_Mbps) && Objects.equals(numTxVHT_720_Mbps, other.numTxVHT_720_Mbps)
&& Objects.equals(numTxVHT_780_Mbps, other.numTxVHT_780_Mbps) && Objects.equals(numTxVHT_800_Mbps, other.numTxVHT_800_Mbps)
&& Objects.equals(numTxVHT_866_7_Mbps, other.numTxVHT_866_7_Mbps) && Objects.equals(numTxVHT_877_5_Mbps, other.numTxVHT_877_5_Mbps)
&& Objects.equals(numTxVHT_936_Mbps, other.numTxVHT_936_Mbps) && Objects.equals(numTxVHT_975_Mbps, other.numTxVHT_975_Mbps)
&& Objects.equals(numTx_12_Mbps, other.numTx_12_Mbps) && Objects.equals(numTx_18_Mbps, other.numTx_18_Mbps)
&& Objects.equals(numTx_1_Mbps, other.numTx_1_Mbps) && Objects.equals(numTx_24_Mbps, other.numTx_24_Mbps)
&& Objects.equals(numTx_36_Mbps, other.numTx_36_Mbps) && Objects.equals(numTx_48_Mbps, other.numTx_48_Mbps)
&& Objects.equals(numTx_54_Mbps, other.numTx_54_Mbps) && Objects.equals(numTx_6_Mbps, other.numTx_6_Mbps)
&& Objects.equals(numTx_9_Mbps, other.numTx_9_Mbps) && Objects.equals(rxDataBytes, other.rxDataBytes)
&& Objects.equals(rxLastRssi, other.rxLastRssi) && sourceTimestampMs == other.sourceTimestampMs;
}
}

View File

@@ -3,15 +3,19 @@
*/
package com.telecominfraproject.wlan.servicemetric.apnode.models;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.json.interfaces.HasSourceTimestamp;
/**
* @author ekeddy
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RadioUtilization extends BaseJsonModel {
public class RadioUtilization extends BaseJsonModel implements HasSourceTimestamp {
private static final long serialVersionUID = -6295155025058221865L;
@@ -21,7 +25,7 @@ public class RadioUtilization extends BaseJsonModel {
private Integer unassocClientRx;
private Integer nonWifi;
private Integer timestampSeconds;
private long sourceTimestampMs;
//
// If the two value below are null and the value above aren't, we'll
// calculate them on the spot.
@@ -111,106 +115,40 @@ public class RadioUtilization extends BaseJsonModel {
this.unAvailableCapacity = unAvailableCapacity;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((assocClientTx == null) ? 0 : assocClientTx.hashCode());
result = prime * result
+ ((unassocClientTx == null) ? 0 : unassocClientTx.hashCode());
result = prime * result
+ ((assocClientRx == null) ? 0 : assocClientRx.hashCode());
result = prime * result
+ ((unassocClientRx == null) ? 0 : unassocClientRx.hashCode());
result = prime * result
+ ((nonWifi == null) ? 0 : nonWifi.hashCode());
result = prime * result
+ ((timestampSeconds == null) ? 0 : timestampSeconds.hashCode());
result = prime * result
+ ((ibss == null) ? 0 : ibss.hashCode());
result = prime * result
+ ((unAvailableCapacity == null) ? 0 : unAvailableCapacity.hashCode());
return result;
return Objects.hash(assocClientRx, assocClientTx, ibss, nonWifi, sourceTimestampMs, timestampSeconds, unAvailableCapacity, unassocClientRx,
unassocClientTx);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
if (this == obj)
return true;
}
if (obj == null) {
if (obj == null)
return false;
}
if (getClass() != obj.getClass()) {
if (getClass() != obj.getClass())
return false;
}
RadioUtilization other = (RadioUtilization) obj;
if (assocClientTx == null) {
if (other.assocClientTx != null) {
return false;
}
} else if (!assocClientTx.equals(other.assocClientTx)) {
return false;
}
if (unassocClientTx == null) {
if (other.unassocClientTx != null) {
return false;
}
} else if (!unassocClientTx.equals(other.unassocClientTx)) {
return false;
}
if (assocClientRx == null) {
if (other.assocClientRx != null) {
return false;
}
} else if (!assocClientRx.equals(other.assocClientRx)) {
return false;
}
if (unassocClientRx == null) {
if (other.unassocClientRx != null) {
return false;
}
} else if (!unassocClientRx.equals(other.unassocClientRx)) {
return false;
}
if (nonWifi == null) {
if (other.nonWifi != null) {
return false;
}
} else if (!nonWifi.equals(other.nonWifi)) {
return false;
}
if (timestampSeconds == null) {
if (other.timestampSeconds != null) {
return false;
}
} else if (!timestampSeconds.equals(other.timestampSeconds)) {
return false;
}
if (ibss == null) {
if (other.ibss != null) {
return false;
}
} else if (!ibss.equals(other.ibss)) {
return false;
}
if (unAvailableCapacity == null) {
if (other.unAvailableCapacity != null) {
return false;
}
} else if (!unAvailableCapacity.equals(other.unAvailableCapacity)) {
return false;
}
return true;
return Objects.equals(assocClientRx, other.assocClientRx) && Objects.equals(assocClientTx, other.assocClientTx) && Objects.equals(ibss, other.ibss)
&& Objects.equals(nonWifi, other.nonWifi) && sourceTimestampMs == other.sourceTimestampMs
&& Objects.equals(timestampSeconds, other.timestampSeconds) && Objects.equals(unAvailableCapacity, other.unAvailableCapacity)
&& Objects.equals(unassocClientRx, other.unassocClientRx) && Objects.equals(unassocClientTx, other.unassocClientTx);
}
@Override
public RadioUtilization clone() {
return (RadioUtilization) super.clone();
}
public void setSourceTimestampMs(long sourceTimestamp) {
this.sourceTimestampMs = sourceTimestamp;
}
@Override
public long getSourceTimestampMs() {
return this.sourceTimestampMs;
}
}

View File

@@ -5,9 +5,11 @@ import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.json.interfaces.HasSourceTimestamp;
import com.telecominfraproject.wlan.servicemetric.models.McsStats;
import com.telecominfraproject.wlan.servicemetric.models.WmmQueueStats;
import com.telecominfraproject.wlan.servicemetric.models.WmmQueueStats.WmmQueueType;
@@ -17,7 +19,7 @@ import com.telecominfraproject.wlan.servicemetric.models.WmmQueueStats.WmmQueueT
*
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SsidStatistics extends BaseJsonModel {
public class SsidStatistics extends BaseJsonModel implements HasSourceTimestamp {
private static final long serialVersionUID = 8903368367046455020L;
@@ -261,6 +263,11 @@ public class SsidStatistics extends BaseJsonModel {
private Map<WmmQueueType, WmmQueueStats> wmmQueueStats;
private List<McsStats> mcsStats;
/**
* Timestamp from the AP source statistics used for this metric
*/
private long sourceTimestampMs;
@Override
public SsidStatistics clone() {
@@ -1091,4 +1098,13 @@ public class SsidStatistics extends BaseJsonModel {
public void setWmmQueueStats(Map<WmmQueueType, WmmQueueStats> wmmQueueStats) {
this.wmmQueueStats = wmmQueueStats;
}
public void setSourceTimestampMs(long sourceTimestamp) {
this.sourceTimestampMs = sourceTimestamp;
}
@Override
public long getSourceTimestampMs() {
return this.sourceTimestampMs;
}
}

View File

@@ -24,7 +24,7 @@ public class ServiceMetric extends BaseJsonModel implements HasCustomerId, HasEq
private long locationId;
private long clientMac;
private ServiceMetricDataType dataType;
private long createdTimestamp;
private long createdTimestamp;
private ServiceMetricDetails details;
@@ -106,7 +106,7 @@ public class ServiceMetric extends BaseJsonModel implements HasCustomerId, HasEq
this.createdTimestamp = createdTimestamp;
}
@Override
@Override
public MacAddress getClientMacAddress() {
if(clientMac==0) {
return null;
@@ -175,5 +175,4 @@ public class ServiceMetric extends BaseJsonModel implements HasCustomerId, HasEq
return createdTimestamp;
}
}

View File

@@ -3,15 +3,17 @@ package com.telecominfraproject.wlan.servicemetric.models;
import java.util.Objects;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.core.model.json.interfaces.HasSourceTimestamp;
/**
* @author dtoptygin
*
*/
public abstract class ServiceMetricDetails extends BaseJsonModel {
public abstract class ServiceMetricDetails extends BaseJsonModel implements HasSourceTimestamp {
private static final long serialVersionUID = 5570757656953699233L;
private long sourceTimestamp;
public abstract ServiceMetricDataType getDataType();
@Override
@@ -28,21 +30,30 @@ public abstract class ServiceMetricDetails extends BaseJsonModel {
return (ServiceMetricDetails) super.clone();
}
@Override
public int hashCode() {
return Objects.hash(getDataType());
}
@Override
public int hashCode() {
return Objects.hash(sourceTimestamp);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof ServiceMetricDetails)) {
return false;
}
ServiceMetricDetails other = (ServiceMetricDetails) obj;
return Objects.equals(getDataType(), other.getDataType());
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ServiceMetricDetails other = (ServiceMetricDetails) obj;
return sourceTimestamp == other.sourceTimestamp;
}
public void setSourceTimestampMs(long sourceTimestampMs) {
this.sourceTimestamp = sourceTimestampMs;
}
@Override
public long getSourceTimestampMs() {
return sourceTimestamp;
}
}

View File

@@ -100,6 +100,11 @@ components:
$ref: '#/components/schemas/ServiceMetricDetails'
ServiceMetricDetails:
type: object
properties:
sourceTimestampMs:
type: integer
format: int64
oneOf:
- $ref: '#/components/schemas/ApNodeMetrics'
- $ref: '#/components/schemas/ApSsidMetrics'
@@ -108,7 +113,7 @@ components:
- $ref: '#/components/schemas/NeighbourScanReports'
discriminator:
propertyName: model_type
NeighbourScanReports:
properties:
neighbourReports:
@@ -1983,7 +1988,11 @@ components:
description: The number of aggregation frames sent using single MPDU (where the A-MPDU contains only one MPDU ).
type: integer
format: int32
sourceTimestampMs:
type: integer
format: int64
wmmQueueStats:
$ref: '#/components/schemas/WmmQueueStatsPerQueueTypeMap'
@@ -2132,7 +2141,10 @@ components:
type: array
items:
$ref: '#/components/schemas/PerProcessUtilization'
sourceTimestampMs:
type: integer
format: int64
EthernetLinkState:
type: string
enum:
@@ -2178,6 +2190,9 @@ components:
type: array
items:
$ref: '#/components/schemas/DnsProbeMetric'
sourceTimestampMs:
type: integer
format: int64
StateUpDownError:
type: string
@@ -3992,7 +4007,10 @@ components:
numRxVHT_3466_8_Mbps:
type: integer
format: int64
sourceTimestampMs:
type: integer
format: int64
ListOfRadioUtilizationPerRadioMap:
properties:
@@ -4040,6 +4058,9 @@ components:
unAvailableCapacity:
type: number
format: double
sourceTimestampMs:
type: integer
format: int64
ListOfMacsPerRadioMap:
properties:

View File

@@ -20,6 +20,7 @@ public interface SystemEventServiceInterface {
GenericResponse create(SystemEventRecord systemEventRecord);
GenericResponse create(List<SystemEventRecord> systemEventRecords);
GenericResponse delete(int customerId, long equipmentId, long createdBeforeTimestamp);
GenericResponse delete(long createdBeforeTimestamp);
/**
* <br>Retrieves all of the SystemEvent records that are mapped to the provided customerId.

View File

@@ -44,6 +44,12 @@ public class SystemEventServiceLocal implements SystemEventServiceInterface {
LOG.debug("calling systemEventController.delete {} {} {}", customerId, equipmentId, createdBeforeTimestamp);
return systemEventController.delete(customerId, equipmentId, createdBeforeTimestamp);
}
@Override
public GenericResponse delete(long createdBeforeTimestamp) {
LOG.debug("calling systemEventController.delete {}", createdBeforeTimestamp);
return systemEventController.delete(createdBeforeTimestamp);
}
@Override
public PaginationResponse<SystemEventRecord> getForCustomer(long fromTime, long toTime, int customerId,

View File

@@ -150,7 +150,22 @@ public class SystemEventServiceRemote extends BaseRemoteClient implements System
LOG.debug("completed systemEventRecord.delete {} {} {}", customerId, equipmentId, createdBeforeTimestamp);
return ret;
}
}
@Override
public GenericResponse delete(long createdBeforeTimestamp) {
LOG.debug("calling systemEventRecord.delete {}", createdBeforeTimestamp);
ResponseEntity<GenericResponse> responseEntity = restTemplate.exchange(
getBaseUrl()
+"/delete?createdBeforeTimestamp={createdBeforeTimestamp}",
HttpMethod.DELETE, null, GenericResponse.class, createdBeforeTimestamp);
GenericResponse ret = responseEntity.getBody();
LOG.debug("completed systemEventRecords.delete {}", createdBeforeTimestamp);
return ret;
}
public String getBaseUrl() {
if(baseUrl==null) {

View File

@@ -157,4 +157,21 @@ public class SystemEventController {
return new GenericResponse(true, "");
}
/**
* Deletes SystemEventRecord records before a given time stamp
*
*/
@RequestMapping(value="/delete", method=RequestMethod.DELETE)
public GenericResponse delete(@RequestParam long createdBeforeTimestamp) {
LOG.debug("Deleting SystemEventRecords created before {}", createdBeforeTimestamp);
systemEventDatastore.delete(createdBeforeTimestamp);
LOG.debug("Deleted SystemEventRecords created before {}", createdBeforeTimestamp);
return new GenericResponse(true, "");
}
}

View File

@@ -2864,6 +2864,9 @@ components:
sharedSecret:
type: string
format: password
dynamicDiscovery:
description: 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.
type: boolean
example:
model_type: RadiusProxyConfiguration
caCert: