Compare commits

...

23 Commits

Author SHA1 Message Date
Kareem Dabbour
1f6996abb2 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services into WIFI-2664 2021-06-17 11:46:20 -04:00
Kareem Dabbour
1ebaa4a539 WIFI-2664 added private macs to return map 2021-06-17 11:44:02 -04:00
norm-traxler
f1e1bdffd7 Merge pull request #117 from Telecominfraproject/WIFI-2664
WIFI-2664 added private mac address filtering to /oui/list endpoint
2021-06-16 13:36:26 -04:00
Kareem Dabbour
37f5872552 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services into WIFI-2664 2021-06-16 12:59:23 -04:00
Kareem Dabbour
367b9ec428 WIFI-2664 adjusting unit tests to reflect added oui of ffffff 2021-06-16 12:55:57 -04:00
Kareem Dabbour
87ca619ad5 WIFI-2664 added private mac address filtering to /oui/list endpoint 2021-06-16 12:28:01 -04:00
norm-traxler
622f78f681 Merge pull request #116 from Telecominfraproject/WIFI-2664
WIFI-2664 Non-global mac addresses will now return an Uknown (private address) rather than null
2021-06-15 16:44:59 -04:00
Kareem Dabbour
faeb65d8d6 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services into WIFI-2664 2021-06-15 16:43:14 -04:00
Kareem Dabbour
34841a3a04 WIFI-2664 moving logic from in memory and DAO to controller 2021-06-15 16:37:30 -04:00
Kareem Dabbour
4fc8bc4018 WIFI-2664 renamed group to global address and did some refractoring 2021-06-15 15:26:51 -04:00
Kareem Dabbour
cce36019fe WIFI-2664 Non-global mac addresses will now return an Uknown (private address) rather than null 2021-06-15 14:46:14 -04:00
norm-traxler
4596280090 Merge pull request #115 from Telecominfraproject/WIFI-2670
[WIFI-2670] Client Session API support OUI attribute and count query
2021-06-15 14:44:44 -04:00
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
27 changed files with 447 additions and 80 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;
@@ -108,6 +109,13 @@ public class ClientDatastoreCassandra implements ClientDatastore {
return clientSessionDAO.getSessionsForCustomer(customerId, equipmentIds, locationIds, macSubstring, sortBy, context);
}
@Override
public ClientSessionCounts getSessionCounts(int customerId) {
// Not yet supported.
ClientSessionCounts counts = new ClientSessionCounts();
return counts;
}
}

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;
@@ -512,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;
@@ -105,5 +106,12 @@ public interface ClientDatastore {
*/
PaginationResponse<ClientSession> getSessionsForCustomer(int customerId, Set<Long> equipmentIds, Set<Long> locationIds, String macSubstring, List<ColumnAndSort> sortBy, PaginationContext<ClientSession> context);
/**
* Get Client Session counts for the given customerId.
*
* @param customerId
* @return
*/
ClientSessionCounts getSessionCounts(int customerId);
}

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

@@ -8,7 +8,7 @@ import com.telecominfraproject.wlan.core.model.json.GenericResponse;
import com.telecominfraproject.wlan.core.model.pagination.ColumnAndSort;
import com.telecominfraproject.wlan.core.model.pagination.PaginationContext;
import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.client.info.models.ClientSessionCounts;
import com.telecominfraproject.wlan.client.models.Client;
import com.telecominfraproject.wlan.client.session.models.ClientSession;
@@ -144,4 +144,12 @@ public interface ClientServiceInterface {
*/
PaginationResponse<ClientSession> getSessionsForCustomer(int customerId, Set<Long> equipmentIds, Set<Long> locationIds, String macSubstring, List<ColumnAndSort> sortBy, PaginationContext<ClientSession> context);
/**
* Get Client Session counts for the given customerId.
*
* @param customerId
* @return
*/
ClientSessionCounts getSessionCounts(int customerId);
}

View File

@@ -3,13 +3,12 @@ package com.telecominfraproject.wlan.client;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.client.controller.ClientController;
import com.telecominfraproject.wlan.client.controller.ClientController.ListOfClientSessions;
import com.telecominfraproject.wlan.client.info.models.ClientSessionCounts;
import com.telecominfraproject.wlan.client.models.Client;
import com.telecominfraproject.wlan.client.session.models.ClientSession;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
@@ -26,7 +25,6 @@ import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
public class ClientServiceLocal implements ClientServiceInterface {
@Autowired private ClientController clientController;
private static final Logger LOG = LoggerFactory.getLogger(ClientServiceLocal.class);
@Override
public Client create(Client client) {
@@ -109,5 +107,10 @@ public class ClientServiceLocal implements ClientServiceInterface {
public GenericResponse deleteSessions(long createdBeforeTimestamp) {
return clientController.deleteSessions(createdBeforeTimestamp);
}
@Override
public ClientSessionCounts getSessionCounts(int customerId) {
return clientController.getSessionCounts(customerId);
}
}

View File

@@ -12,6 +12,7 @@ import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.client.info.models.ClientSessionCounts;
import com.telecominfraproject.wlan.client.models.Client;
import com.telecominfraproject.wlan.client.session.models.ClientSession;
import com.telecominfraproject.wlan.core.client.BaseRemoteClient;
@@ -365,5 +366,21 @@ public class ClientServiceRemote extends BaseRemoteClient implements ClientServi
return baseUrl;
}
@Override
public ClientSessionCounts getSessionCounts(int customerId) {
LOG.debug("calling getSessionCounts( {} )", customerId);
try {
ResponseEntity<ClientSessionCounts> responseEntity = restTemplate.exchange(getBaseUrl() + "/session/countsForCustomer?customerId={customerId}",
HttpMethod.GET, null, ClientSessionCounts.class, customerId);
ClientSessionCounts result = responseEntity.getBody();
LOG.debug("getSessionCounts({}) returns {} ", customerId, result);
return result;
} catch (Exception exp) {
LOG.error("getSessionCounts({}) exception ", customerId, exp);
throw exp;
}
}
}

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;
@@ -430,6 +432,13 @@ public class ClientController {
return new GenericResponse(true, "");
}
@GetMapping("/session/countsForCustomer")
public ClientSessionCounts getSessionCounts(@RequestParam int customerId) {
ClientSessionCounts ret = clientDatastore.getSessionCounts(customerId);
LOG.debug("countsForCustomer({}) {}", customerId, ret);
return ret;
}
private void publishEvent(SystemEvent event) {
if (event == null) {

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:

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

@@ -191,18 +191,18 @@ public class ManufacturerServiceRemoteTest extends BaseRemoteTest {
Set<String> ouiList = new HashSet<>();
ouiList.add(oui1);
ouiListSearchResult = remoteInterface.getManufacturerDetailsForOuiSet(ouiList);
assertTrue(ouiListSearchResult.size() == 1);
assertTrue(ouiListSearchResult.size() == 2);
assertTrue(ouiListSearchResult.get(oui1).equals(ret1));
ouiList.add(oui2);
ouiListSearchResult = remoteInterface.getManufacturerDetailsForOuiSet(ouiList);
assertTrue(ouiListSearchResult.size() == 2);
assertTrue(ouiListSearchResult.size() == 3);
assertTrue(ouiListSearchResult.get(oui1).equals(ret1));
assertTrue(ouiListSearchResult.get(oui2).equals(ret2));
ouiList.add(oui3);
ouiListSearchResult = remoteInterface.getManufacturerDetailsForOuiSet(ouiList);
assertTrue(ouiListSearchResult.size() == 3);
assertTrue(ouiListSearchResult.size() == 4);
assertTrue(ouiListSearchResult.get(oui1).equals(ret1));
assertTrue(ouiListSearchResult.get(oui2).equals(ret2));
assertTrue(ouiListSearchResult.get(oui3).equals(ret3));
@@ -211,7 +211,7 @@ public class ManufacturerServiceRemoteTest extends BaseRemoteTest {
ouiList.add(String.format("%06d", i));
}
ouiListSearchResult = remoteInterface.getManufacturerDetailsForOuiSet(ouiList);
assertEquals(3,ouiListSearchResult.size());
assertEquals(4,ouiListSearchResult.size());
assertTrue(ouiListSearchResult.get(oui1).equals(ret1));
assertTrue(ouiListSearchResult.get(oui2).equals(ret2));
assertTrue(ouiListSearchResult.get(oui3).equals(ret3));

View File

@@ -35,7 +35,10 @@ import com.telecominfraproject.wlan.manufacturer.models.ManufacturerOuiDetails;
public class ManufacturerController {
private static final Logger LOG = LoggerFactory.getLogger(ManufacturerController.class);
private static final int GLOBE_BIT = (0x1 << 1);
private static final ManufacturerOuiDetails PRIVATE_MAC_RESPONSE = new ManufacturerOuiDetails();
@Autowired
private ManufacturerDatastoreInterface manufacturerDatastore;
@@ -43,6 +46,11 @@ public class ManufacturerController {
private static final long serialVersionUID = -8035392255039609079L;
}
static {
PRIVATE_MAC_RESPONSE.setOui("ffffff");
PRIVATE_MAC_RESPONSE.setManufacturerName("Unknown (Private Address)");
PRIVATE_MAC_RESPONSE.setManufacturerAlias("Unknown");
}
@PostMapping(value = "/oui")
public ManufacturerOuiDetails createOuiDetails(@RequestBody ManufacturerOuiDetails ouiDetails) {
LOG.debug("Creating OUI details {} ", ouiDetails);
@@ -76,9 +84,7 @@ public class ManufacturerController {
@GetMapping(value = "/oui")
public ManufacturerOuiDetails getByOui(@RequestParam String oui) {
LOG.debug("Retrieving OUI details for OUI {} ", oui);
ManufacturerOuiDetails ret = manufacturerDatastore.getByOui(oui);
ManufacturerOuiDetails ret = isGlobalAddress(oui) ? manufacturerDatastore.getByOui(oui) : PRIVATE_MAC_RESPONSE;
LOG.debug("Retrieved OUI details {} ", ret);
return ret;
}
@@ -157,7 +163,11 @@ public class ManufacturerController {
public Map<String, ManufacturerOuiDetails> getManufacturerDetailsForOuiList(
@RequestParam List<String> ouiList) {
LOG.debug("calling getManufacturerDetailsForOuiList ");
return manufacturerDatastore.getManufacturerDetailsForOuiList(ouiList);
Map<String, ManufacturerOuiDetails> manufMap = manufacturerDatastore.getManufacturerDetailsForOuiList(ouiList);
ouiList.forEach(oui -> {if (!isGlobalAddress(oui)) manufMap.put(oui, PRIVATE_MAC_RESPONSE);});
manufMap.put(PRIVATE_MAC_RESPONSE.getOui(), PRIVATE_MAC_RESPONSE);
return manufMap;
}
@PutMapping(value = "/oui/alias")
@@ -180,4 +190,14 @@ public class ManufacturerController {
LOG.debug("Retrieving alias values that begin with {}", prefix);
return manufacturerDatastore.getAliasValuesThatBeginWith(prefix, maxResults);
}
private boolean isGlobalAddress(String oui) {
if (oui != null && oui.length() == 6) {
// we only need to check the first Byte of the OUI
Integer hex = Integer.parseInt(oui.substring(0, 2), 16);
byte firstByte = hex.byteValue();
return (firstByte & GLOBE_BIT) == 0;
}
return false;
}
}

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:
@@ -14238,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

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

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