Compare commits

..

8 Commits

Author SHA1 Message Date
Mike Hansen
a66ac7ff8a WIFI-1732: Acct-Interim-Interval config not working when configured from radius 2021-03-23 16:12:49 -04:00
Mike Hansen
beb9692bf5 WIFI-1808: AP-NOS Passpoint : Access type and internet value is not getting set Interworking element in Beacon for passpoint SSID
Change qosMapSet to List instead of Set as duplicate values allowed
2021-03-18 20:36:56 -04:00
AkshayJagadish-ne
bf445ba787 Merge pull request #89 from Telecominfraproject/WIFI-1669
WIFI-1669: Propagations
2021-03-10 17:07:44 -05:00
Akshay Jagadish
88de7ebee1 Propagated WIFI-1729 2021-03-10 17:04:23 -05:00
Akshay Jagadish
373a146105 WIFI-1669: Propagations
WIFI-1616
WIFI-1681
WIFI-1687
WIFI-1358
WIFI-1658
WIFI-1641
2021-03-09 17:02:21 -05:00
tomrcurrie
763183e8a1 Propogate WIFI-1440 fix to release branch (#85)
* Fix setter method to use actual provided value for radiusAcountingServiceInterval instead of default min value of 60.

* Make constants BANDWIDTH_LIMIT_MAX, RADIUS_ACCOUNTING_SERVICE_INTERVAL_MIN, RADIUS_ACCOUNTING_SERVICE_INTERVAL_MAX, MAX_SSID_LENGTH configurable via system properties

* WIFI-1616 SSID character length too long causes AP to not pull configuration (#79)

* Add validator for ClientSession, add ssid length check to validator.

* Add null check for ClientSessionDetaiks.Ssid in the validator

* Add some null checking for ClientSession. Undo auto formatting changes (hopefully)

* add ssid length validation to Profile provisioning. Improved exception and error behaviour for ssid error scenarios by using a RuntimeException and logger.

* remove ssid length validator from client session controller

* remove  duplicate variable 'MAX_SSID_LENGTH' from cherry-picked commits
2021-03-03 17:26:37 -05:00
AkshayJagadish-ne
fdc12b641d Merge pull request #80 from Telecominfraproject/WIFI-1669
WIFI:1669 TIP 1.0 Update SDK components in release 1.0 branch
2021-02-27 22:05:38 -05:00
Akshay Jagadish
8b25a31db4 WIFI:1669 TIP 1.0 Update SDK components in release 1.0 branch 2021-02-26 18:16:52 -05:00
584 changed files with 10296 additions and 7804 deletions

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,7 +15,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>adoption-metrics-datastore-interface</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,19 +15,19 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-datastore-inmemory</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>adoption-metrics-datastore-interface</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>adoption-metrics-datastore-common-test</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,12 +15,12 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>adoption-metrics-models</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,26 +15,26 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-jdbc</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>adoption-metrics-datastore-interface</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-jdbc-tests</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>adoption-metrics-datastore-common-test</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,7 +15,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,7 +15,7 @@
<dependency>
<artifactId>adoption-metrics-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -16,13 +16,13 @@
<dependency>
<artifactId>adoption-metrics-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,41 +15,41 @@
<dependency>
<artifactId>adoption-metrics-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>base-client</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- Dependencies for the unit tests -->
<dependency>
<artifactId>base-remote-tests</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>adoption-metrics-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>adoption-metrics-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-empty</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,29 +15,29 @@
<dependency>
<artifactId>base-container</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-datastore-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
@@ -45,7 +45,7 @@
<dependency>
<artifactId>cloud-event-dispatcher-empty</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,25 +15,25 @@
<dependency>
<artifactId>base-stream-consumer</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,26 +15,26 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-cassandra</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-datastore-interface</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-cassandra-tests</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-datastore-common-test</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

View File

@@ -7,9 +7,12 @@ import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.PostConstruct;
@@ -116,6 +119,9 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
" from "+TABLE_NAME+" " +
" where customerId = ? and equipmentId = ? and alarmCode = ? and createdTimestamp = ?";
private static final String CQL_GET_ALL_NO_DETAILS =
"select customerId, equipmentId, alarmCode, createdTimestamp from alarm " ;
private static final String CQL_GET_BY_CUSTOMER_ID =
"select " + ALL_COLUMNS +
" from " + TABLE_NAME + " " +
@@ -146,6 +152,9 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
+ " IF lastModifiedTimestamp = ? "
;
private static final String CQL_COUNTS_BY_EQUIPMENT_AND_ALARM_CODE_HEADER = "select equipmentId, alarmCode, count(1) from alarm where customerId = ? ";
private static final String CQL_COUNTS_BY_EQUIPMENT_AND_ALARM_CODE_FOOTER = " group by equipmentId, alarmCode";
private static final String CQL_INSERT_INTO_BY_ACKNOWLEDGED_TABLE = "insert into alarm_by_acknowledged(customerId, equipmentId, alarmCode, createdTimestamp, acknowledged) values ( ?, ?, ?, ?, ?) ";
private static final String CQL_DELETE_FROM_BY_ACKNOWLEDGED_TABLE = "delete from alarm_by_acknowledged where customerId = ? and equipmentId = ? and alarmCode = ? and createdTimestamp = ? and acknowledged = ? ";
@@ -163,11 +172,19 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
//private static final String CQL_COUNTS_BY_ALARM_CODE_HEADER = "select alarmCode, count(1) from alarm where customerId = ? ";
//private static final String CQL_COUNTS_BY_ALARM_CODE_FOOTER = " group by alarmCode";
// CQL statements for counts
private static final String CQL_GET_CUSTOMER_ALARM_COUNT_BY_CUSTOMER_ID = "select equipmentId, alarmCode from alarm where customerId = ? ";
private static final String CQL_INCREMENT_EQUIPMENT_ALARM_COUNT = "update alarm_counts_by_equipment set alarmCount = alarmCount + 1 where customerId = ? and equipmentId = ? and alarmCode = ? ";
private static final String CQL_DECREMENT_EQUIPMENT_ALARM_COUNT = "update alarm_counts_by_equipment set alarmCount = alarmCount - 1 where customerId = ? and equipmentId = ? and alarmCode = ? ";
private static final String CQL_GET_CUSTOMER_ACKNOWLEDGED_ALARM_COUNT_BY_CUSTOMER_ID = "select equipmentId, alarmCode from alarm_by_acknowledged where customerId = ? and acknowledged = ? ";
private static final String CQL_GET_EQUIPMENT_ALARM_COUNT_BY_CUSTOMER_ID = "select equipmentId, alarmCode, alarmCount from alarm_counts_by_equipment where customerId = ? ";
private static final String CQL_INCREMENT_CUSTOMER_ALARM_COUNT = "update alarm_counts_by_customer set alarmCount = alarmCount + 1 where customerId = ? and alarmCode = ? ";
private static final String CQL_DECREMENT_CUSTOMER_ALARM_COUNT = "update alarm_counts_by_customer set alarmCount = alarmCount - 1 where customerId = ? and alarmCode = ? ";
private static final String CQL_GET_CUSTOMER_ALARM_COUNT_BY_CUSTOMER_ID = "select alarmCode, alarmCount from alarm_counts_by_customer where customerId = ? ";
private static final String CQL_UPDATE_CUSTOMER_ALARM_COUNT = "update alarm_counts_by_customer set alarmCount = alarmCount + ? where customerId = ? and alarmCode = ? ";
private static final String CQL_UPDATE_EQUIPMENT_ALARM_COUNT = "update alarm_counts_by_equipment set alarmCount = alarmCount + ? where customerId = ? and equipmentId = ? and alarmCode = ? ";
private static final RowMapper<Alarm> alarmRowMapper = new AlarmRowMapper();
@@ -175,37 +192,59 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
private CqlSession cqlSession;
private PreparedStatement preparedStmt_getOrNull;
private PreparedStatement preparedStmt_getAllNoDetails;
private PreparedStatement preparedStmt_create;
private PreparedStatement preparedStmt_update;
private PreparedStatement preparedStmt_getLastmod;
private PreparedStatement preparedStmt_delete;
private PreparedStatement preparedStmt_deleteByEquipment;
private PreparedStatement preparedStmt_incrementAlarmCountByEquipment;
private PreparedStatement preparedStmt_decrementAlarmCountByEquipment;
private PreparedStatement preparedStmt_incrementAlarmCountByCustomer;
private PreparedStatement preparedStmt_decrementAlarmCountByCustomer;
private PreparedStatement preparedStmt_updateAlarmCountByEquipment;
private PreparedStatement preparedStmt_updateAlarmCountByCustomer;
// filter by acknowledged statements
private PreparedStatement preparedStmt_insertIntoAlarmByAcknowledged;
private PreparedStatement preparedStmt_deleteFromAlarmByAcknowledged;
private PreparedStatement preparedStmt_insertIntoAlarmByAcknowledgedEquipmentId;
private PreparedStatement preparedStmt_deleteFromAlarmByAcknowledgedEquipmentId;
private PreparedStatement preparedStmt_insertIntoAlarmByAcknowledgedAlarmCode;
private PreparedStatement preparedStmt_deleteFromAlarmByAcknowledgedAlarmCode;
private PreparedStatement preparedStmt_insertIntoAlarmByAcknowledgedTimestamp;
private PreparedStatement preparedStmt_deleteFromAlarmByAcknowledgedTimestamp;
@PostConstruct
private void postConstruct(){
preparedStmt_getOrNull = cqlSession.prepare(CQL_GET_BY_ID);
preparedStmt_getAllNoDetails = cqlSession.prepare(CQL_GET_ALL_NO_DETAILS);
preparedStmt_create = cqlSession.prepare(CQL_INSERT);
preparedStmt_update = cqlSession.prepare(CQL_UPDATE);
preparedStmt_getLastmod = cqlSession.prepare(CQL_GET_LASTMOD_BY_ID);
preparedStmt_delete = cqlSession.prepare(CQL_DELETE);
preparedStmt_deleteByEquipment = cqlSession.prepare(CQL_DELETE_BY_EQUIPMENT);
preparedStmt_incrementAlarmCountByEquipment = cqlSession.prepare(CQL_INCREMENT_EQUIPMENT_ALARM_COUNT);
preparedStmt_decrementAlarmCountByEquipment = cqlSession.prepare(CQL_DECREMENT_EQUIPMENT_ALARM_COUNT);
preparedStmt_incrementAlarmCountByCustomer= cqlSession.prepare(CQL_INCREMENT_CUSTOMER_ALARM_COUNT);
preparedStmt_decrementAlarmCountByCustomer = cqlSession.prepare(CQL_DECREMENT_CUSTOMER_ALARM_COUNT);
preparedStmt_updateAlarmCountByEquipment = cqlSession.prepare(CQL_UPDATE_EQUIPMENT_ALARM_COUNT);
preparedStmt_updateAlarmCountByCustomer= cqlSession.prepare(CQL_UPDATE_CUSTOMER_ALARM_COUNT);
preparedStmt_insertIntoAlarmByAcknowledged = cqlSession.prepare(CQL_INSERT_INTO_BY_ACKNOWLEDGED_TABLE);
preparedStmt_deleteFromAlarmByAcknowledged = cqlSession.prepare(CQL_DELETE_FROM_BY_ACKNOWLEDGED_TABLE);
preparedStmt_insertIntoAlarmByAcknowledgedEquipmentId = cqlSession.prepare(CQL_INSERT_INTO_BY_ACKNOWLEDGED_EQUIPMENTID_TABLE);
preparedStmt_deleteFromAlarmByAcknowledgedEquipmentId = cqlSession.prepare(CQL_DELETE_FROM_BY_ACKNOWLEDGED_EQUIPMENTID_TABLE);
preparedStmt_insertIntoAlarmByAcknowledgedAlarmCode = cqlSession.prepare(CQL_INSERT_INTO_BY_ACKNOWLEDGED_ALARMCODE_TABLE);
preparedStmt_deleteFromAlarmByAcknowledgedAlarmCode = cqlSession.prepare(CQL_DELETE_FROM_BY_ACKNOWLEDGED_ALARMCODE_TABLE);
preparedStmt_insertIntoAlarmByAcknowledgedTimestamp = cqlSession.prepare(CQL_INSERT_INTO_BY_ACKNOWLEDGED_TIMESTAMP_TABLE);
preparedStmt_deleteFromAlarmByAcknowledgedTimestamp = cqlSession.prepare(CQL_DELETE_FROM_BY_ACKNOWLEDGED_TIMESTAMP_TABLE);
@@ -241,6 +280,18 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
));
LOG.debug("Stored Alarm {}", alarm);
//update alarm count
cqlSession.execute(preparedStmt_incrementAlarmCountByEquipment.bind(
alarm.getCustomerId(),
alarm.getEquipmentId(),
alarm.getAlarmCode().getId()
));
cqlSession.execute(preparedStmt_incrementAlarmCountByCustomer.bind(
alarm.getCustomerId(),
alarm.getAlarmCode().getId()
));
//insert entry into acknowledged tables
cqlSession.execute(preparedStmt_insertIntoAlarmByAcknowledged.bind(
@@ -490,6 +541,18 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
cqlSession.execute(preparedStmt_delete.bind(customerId, equipmentId, alarmCode.getId(), createdTimestamp));
LOG.debug("Deleted Alarm {}", ret);
//update alarm count
cqlSession.execute(preparedStmt_decrementAlarmCountByEquipment.bind(
ret.getCustomerId(),
ret.getEquipmentId(),
ret.getAlarmCode().getId()
));
cqlSession.execute(preparedStmt_decrementAlarmCountByCustomer.bind(
ret.getCustomerId(),
ret.getAlarmCode().getId()
));
//delete entry into acknowledged tables
cqlSession.execute(preparedStmt_deleteFromAlarmByAcknowledged.bind(
@@ -537,6 +600,19 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
LOG.debug("Deleted Alarms {}", ret);
ret.forEach(al -> {
//TODO: replace with one update of a counter
//update alarm count
cqlSession.execute(preparedStmt_decrementAlarmCountByEquipment.bind(
al.getCustomerId(),
al.getEquipmentId(),
al.getAlarmCode().getId()
));
cqlSession.execute(preparedStmt_decrementAlarmCountByCustomer.bind(
al.getCustomerId(),
al.getAlarmCode().getId()
));
//delete entry into acknowledged tables
cqlSession.execute(preparedStmt_deleteFromAlarmByAcknowledged.bind(
al.getCustomerId(),
@@ -574,6 +650,136 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
return ret;
}
@Override
public void resetAlarmCounters() {
LOG.debug("Resetting Alarm counters ");
//count real alarms per-customer and per equipment
Map<Integer, AlarmCounts> alarmCountsPerCustomerMap = new HashMap<>();
//select customerId, equipmentId, alarmCode, createdTimestamp from alarm
ResultSet rs = cqlSession.execute(preparedStmt_getAllNoDetails.bind());
rs.forEach(row -> {
int customerId = row.getInt(0);
long equipmentId = row.getLong(1);
AlarmCode alarmCode = AlarmCode.getById(row.getInt(2));
AlarmCounts alarmCounts = alarmCountsPerCustomerMap.get(customerId);
if(alarmCounts == null) {
alarmCounts = new AlarmCounts();
alarmCounts.setCustomerId(customerId);
alarmCountsPerCustomerMap.put(customerId, alarmCounts);
}
alarmCounts.addToCounter(equipmentId, alarmCode, 1);
});
//read existing counters alarms per-customer
Map<Integer, AlarmCounts> existingCustomerCountsPerCustomerMap = new HashMap<>();
rs = cqlSession.execute(cqlSession.prepare("select customerid, alarmcode, alarmcount from alarm_counts_by_customer ").bind());
rs.forEach(row -> {
int customerId = row.getInt(0);
AlarmCode alarmCode = AlarmCode.getById(row.getInt(1));
long count = row.getLong(2);
AlarmCounts alarmCounts = existingCustomerCountsPerCustomerMap.get(customerId);
if(alarmCounts == null) {
alarmCounts = new AlarmCounts();
alarmCounts.setCustomerId(customerId);
existingCustomerCountsPerCustomerMap.put(customerId, alarmCounts);
}
alarmCounts.addToCounter(0, alarmCode, (int) count);
});
//read existing counters alarms per equipment
Map<Integer, AlarmCounts> existingEquipmentCountsPerCustomerMap = new HashMap<>();
rs = cqlSession.execute(cqlSession.prepare("select customerid, equipmentid, alarmcode, alarmcount from alarm_counts_by_equipment ").bind());
rs.forEach(row -> {
int customerId = row.getInt(0);
long equipmentId = row.getLong(1);
AlarmCode alarmCode = AlarmCode.getById(row.getInt(2));
long count = row.getLong(3);
AlarmCounts alarmCounts = existingEquipmentCountsPerCustomerMap.get(customerId);
if(alarmCounts == null) {
alarmCounts = new AlarmCounts();
alarmCounts.setCustomerId(customerId);
existingEquipmentCountsPerCustomerMap.put(customerId, alarmCounts);
}
alarmCounts.addToCounter(equipmentId, alarmCode, (int) count);
});
//set existing counters per customer - first to 0, then to new computed values
existingCustomerCountsPerCustomerMap.values().forEach(customerCounts -> {
AlarmCounts realAlarmCounts = alarmCountsPerCustomerMap.get(customerCounts.getCustomerId());
customerCounts.getTotalCountsPerAlarmCodeMap().forEach((alarmCode, existingCount) -> {
int realCount = realAlarmCounts != null ? realAlarmCounts.getTotalCountsPerAlarmCodeMap().getOrDefault(alarmCode, new AtomicInteger(0)).get(): 0;
//update alarm_counts_by_customer set alarmCount = alarmCount + ? where customerId = ? and alarmCode = ?
cqlSession.execute(preparedStmt_updateAlarmCountByCustomer.bind( (long) (0L - existingCount.get() + realCount), customerCounts.getCustomerId(), alarmCode.getId()));
});
});
//set existing counters per equipment - first to 0, then to new computed values
existingEquipmentCountsPerCustomerMap.values().forEach(customerCounts -> {
int customerId = customerCounts.getCustomerId();
AlarmCounts realAlarmCounts = alarmCountsPerCustomerMap.get(customerId);
customerCounts.getCountsPerEquipmentIdMap().forEach((eqId, perAlarmCodeMap) -> {
perAlarmCodeMap.forEach((alarmCode, existingCount) -> {
int realCount = 0;
if(realAlarmCounts != null && realAlarmCounts.getCountsPerEquipmentIdMap().get(eqId)!=null ) {
realCount = realAlarmCounts.getCountsPerEquipmentIdMap().get(eqId).getOrDefault(alarmCode, new AtomicInteger(0)).get();
}
//update alarm_counts_by_equipment set alarmCount = alarmCount + ? where customerId = ? and equipmentId = ? and alarmCode = ?
cqlSession.execute(preparedStmt_updateAlarmCountByEquipment.bind( (long) ( 0L - existingCount.get() + realCount), customerId, eqId, alarmCode.getId()));
});
});
});
//process new customer counts that are not present in existing counts
alarmCountsPerCustomerMap.values().forEach(customerCounts -> {
AlarmCounts existingAlarmCounts = existingCustomerCountsPerCustomerMap.get(customerCounts.getCustomerId());
if(existingAlarmCounts == null) {
customerCounts.getTotalCountsPerAlarmCodeMap().forEach((alarmCode, newCount) -> {
//update alarm_counts_by_customer set alarmCount = alarmCount + ? where customerId = ? and alarmCode = ?
cqlSession.execute(preparedStmt_updateAlarmCountByCustomer.bind((long) newCount.get(), customerCounts.getCustomerId(), alarmCode.getId()));
});
}
});
//process new equipment counts that are not present in existing counts
alarmCountsPerCustomerMap.values().forEach(customerCounts -> {
int customerId = customerCounts.getCustomerId();
AlarmCounts existingAlarmCounts = existingEquipmentCountsPerCustomerMap.get(customerId);
customerCounts.getCountsPerEquipmentIdMap().forEach((eqId, perAlarmCodeMap) -> {
if(existingAlarmCounts == null || existingAlarmCounts.getCountsPerEquipmentIdMap().get(eqId) == null) {
perAlarmCodeMap.forEach((alarmCode, existingCount) -> {
//update alarm_counts_by_equipment set alarmCount = alarmCount + ? where customerId = ? and equipmentId = ? and alarmCode = ?
cqlSession.execute(preparedStmt_updateAlarmCountByEquipment.bind((long) existingCount.get(), customerId, eqId, alarmCode.getId()));
});
}
});
});
LOG.debug("Completed resetting Alarm counters ");
}
@Override
public List<Alarm> get(int customerId, Set<Long> equipmentIds, Set<AlarmCode> alarmCodes,
@@ -842,7 +1048,7 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
*
*/
@Override
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIds, Set<AlarmCode> alarmCodes, Boolean acknowledged) {
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIds, Set<AlarmCode> alarmCodes) {
ArrayList<Object> queryArgs = new ArrayList<>();
queryArgs.add(customerId);
@@ -850,13 +1056,11 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
StringBuilder query = new StringBuilder();
if (acknowledged == null) {
if (equipmentIds != null && !equipmentIds.isEmpty()) {
query.append(CQL_GET_EQUIPMENT_ALARM_COUNT_BY_CUSTOMER_ID);
} else {
query.append(CQL_GET_CUSTOMER_ALARM_COUNT_BY_CUSTOMER_ID);
} else {
queryArgs.add(acknowledged);
query.append(CQL_GET_CUSTOMER_ACKNOWLEDGED_ALARM_COUNT_BY_CUSTOMER_ID);
}
}
//add alarmCodes filters
@@ -865,28 +1069,23 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
//add equipmentId filters
if (equipmentIds != null && !equipmentIds.isEmpty()) {
queryArgs.addAll(equipmentIds);
if (equipmentIds.size() == 1) {
query.append("and equipmentId = ? ");
} else {
StringBuilder strb = new StringBuilder(100);
strb.append("and equipmentId in (");
for (int i = 0; i < equipmentIds.size(); i++) {
strb.append("?");
if (i < equipmentIds.size() - 1) {
strb.append(",");
}
StringBuilder strb = new StringBuilder(100);
strb.append("and equipmentId in (");
for (int i = 0; i < equipmentIds.size(); i++) {
strb.append("?");
if (i < equipmentIds.size() - 1) {
strb.append(",");
}
strb.append(") ");
query.append(strb);
}
strb.append(") ");
query.append(strb);
}
AlarmCounts alarmCounts = new AlarmCounts();
alarmCounts.setCustomerId(customerId);
alarmCounts.setAcknowledged(acknowledged);
//TODO: create a cache of these prepared statements, keyed by the numberOfEquipmentIds_numberOfAlarmCodes
PreparedStatement preparedStmt_getCounts;
@@ -897,11 +1096,21 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
throw e;
}
ResultSet rs = cqlSession.execute(preparedStmt_getCounts.bind(queryArgs.toArray()));
ResultSet rs = cqlSession.execute(preparedStmt_getCounts.bind(queryArgs.toArray() ));
int alarmCodeColIdx;
int equipmentIdColIdx;
int countColIdx;
int equipmentIdColIdx = 0;
int alarmCodeColIdx = 1;
if (equipmentIds == null || equipmentIds.isEmpty()) {
alarmCodeColIdx = 0;
equipmentIdColIdx = 0;
countColIdx = 1;
} else {
alarmCodeColIdx = 1;
equipmentIdColIdx = 0;
countColIdx = 2;
}
rs.forEach(row -> {
//we will do the client-side filtering for the AlarmCodes, because querying for it as part of CQL does not seem to work
@@ -909,17 +1118,86 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
//the amount of distinct alarm codes per equipment is very small
AlarmCode ac = AlarmCode.getById(row.getInt(alarmCodeColIdx));
if (alarmCodes != null && !alarmCodes.isEmpty() && alarmCodes.contains(ac) || alarmCodes == null || alarmCodes.isEmpty() )
if (alarmCodes != null && !alarmCodes.isEmpty() && alarmCodes.contains(ac)
|| alarmCodes == null || alarmCodes.isEmpty() )
{
if(equipmentIds == null || equipmentIds.isEmpty()) {
alarmCounts.addToCounter(0, ac, 1);
alarmCounts.addToCounter(0, ac, (int) row.getLong(countColIdx));
} else {
alarmCounts.addToCounter(row.getLong(equipmentIdColIdx), ac, 1);
alarmCounts.addToCounter(row.getLong(equipmentIdColIdx), ac, (int) row.getLong(countColIdx));
}
}
});
return alarmCounts;
}
public AlarmCounts getAlarmCounts_raw(int customerId, Set<Long> equipmentIds, Set<AlarmCode> alarmCodes) {
ArrayList<Object> queryArgs = new ArrayList<>();
queryArgs.add(customerId);
//build the query
StringBuilder query = new StringBuilder();
query.append(CQL_COUNTS_BY_EQUIPMENT_AND_ALARM_CODE_HEADER);
//add alarmCodes filters
//we will do the client-side filtering for the AlarmCodes, see below
//add equipmentId filters
if (equipmentIds != null && !equipmentIds.isEmpty()) {
queryArgs.addAll(equipmentIds);
StringBuilder strb = new StringBuilder(100);
strb.append("and equipmentId in (");
for (int i = 0; i < equipmentIds.size(); i++) {
strb.append("?");
if (i < equipmentIds.size() - 1) {
strb.append(",");
}
}
strb.append(") ");
query.append(strb);
}
query.append(CQL_COUNTS_BY_EQUIPMENT_AND_ALARM_CODE_FOOTER);
AlarmCounts alarmCounts = new AlarmCounts();
alarmCounts.setCustomerId(customerId);
//TODO: create a cache of these prepared statements, keyed by the numberOfEquipmentIds_numberOfAlarmCodes
PreparedStatement preparedStmt_getCounts;
try {
preparedStmt_getCounts = cqlSession.prepare(query.toString());
} catch(InvalidQueryException e) {
LOG.error("Cannot prepare cassandra query '{}'", query.toString(), e);
throw e;
}
ResultSet rs = cqlSession.execute(preparedStmt_getCounts.bind(queryArgs.toArray() ));
rs.forEach(row -> {
//we will do the client-side filtering for the AlarmCodes, because querying for it as part of CQL does not seem to work
//we can afford it because there are not that many different alarm codes in total, and during normal operations
//the amount of distinct alarm codes per equipment is very small
AlarmCode ac = AlarmCode.getById(row.getInt(1));
if (alarmCodes != null && !alarmCodes.isEmpty() && alarmCodes.contains(ac)
|| alarmCodes == null || alarmCodes.isEmpty() )
{
if(equipmentIds == null || equipmentIds.isEmpty()) {
alarmCounts.addToCounter(0, ac, (int) row.getLong(2));
} else {
alarmCounts.addToCounter(row.getLong(0), ac, (int) row.getLong(2));
}
}
});
return alarmCounts;
}
}

View File

@@ -67,3 +67,26 @@ CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.alarm_by_acknowledged_timestamp (
# COPY tip_wlan_keyspace.alarm_by_acknowledged_alarmCode(customerId, equipmentId, alarmCode, createdTimestamp, acknowledged) FROM 'alarmToAcknowledgedTable.csv';
# COPY tip_wlan_keyspace.alarm_by_acknowledged_timestamp(customerId, equipmentId, alarmCode, createdTimestamp, acknowledged) FROM 'alarmToAcknowledgedTable.csv';
*/
/*
# Experiment with a separate alarm_counts table because raw alarms table generates warnings like these:
# Query '[5 values] select equipmentId, alarmCode, count(1) from alarm where customerId = ? and equipmentId in (?,?,?,?) group by equipmentId, alarmCode [customerid=2, equipmentid=4, equipmentid=6, equipmentid=8, equipmentid=10]' generated server side warning(s): Aggregation query used on multiple partition keys (IN restriction)
# See https://cassandra.apache.org/doc/latest/cql/types.html#counters
#
*/
CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.alarm_counts_by_customer (
customerId int,
alarmCode int,
alarmCount counter,
PRIMARY KEY ((customerId), alarmCode)
) WITH comment='Counts of Alarms for a Customer generated by the TIP WLAN CloudSDK';
CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.alarm_counts_by_equipment (
customerId int,
equipmentId bigint,
alarmCode int,
alarmCount counter,
PRIMARY KEY ((customerId, equipmentId), alarmCode)
) WITH comment='Counts of Alarms for Equipment generated by the TIP WLAN CloudSDK';

View File

@@ -28,12 +28,12 @@ public class AlarmDatastoreCassandraTests extends BaseAlarmDatastoreTest {
@Override
protected List<String> getAlarmPagination_expectedPage3Strings(){
//in cassandra the sort order is weird but consistent - although it may change on the cassandra server restart
return Arrays.asList(new String[]{"qr_12", "qr_49", "qr_21", "qr_39", "qr_1", "qr_25", "qr_42", "qr_9", "qr_29", "qr_7" });
return Arrays.asList(new String[]{"qr_9", "qr_40", "qr_3", "qr_32", "qr_31", "qr_2", "qr_39", "qr_35", "qr_38", "qr_48" });
}
@Override
protected List<String> getAlarmPagination_expectedPage1EmptySortStrings() {
return Arrays.asList(new String[]{"qr_30", "qr_17", "qr_13", "qr_15", "qr_14", "qr_32", "qr_11", "qr_2", "qr_8", "qr_5" });
return Arrays.asList(new String[]{"qr_28", "qr_21", "qr_46", "qr_20", "qr_22", "qr_15", "qr_49", "qr_45", "qr_43", "qr_42" });
}
@Override

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,7 +15,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-datastore-interface</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>

View File

@@ -30,7 +30,6 @@ 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.status.models.StatusCode;
/**
* @author dtoptygin
@@ -210,7 +209,9 @@ public abstract class BaseAlarmDatastoreTest {
Set<AlarmCode> alarmCodes = new HashSet<>(Arrays.asList(AlarmCode.AccessPointIsUnreachable, AlarmCode.AssocFailure));
long pastTimestamp = 0;
Set<Long> equipmentIds_c2 = new HashSet<>();
testInterface.resetAlarmCounters();
for(int i = 0; i< 50; i++){
mdl = createAlarmObject();
mdl.setCustomerId(customerId_1);
@@ -232,6 +233,8 @@ public abstract class BaseAlarmDatastoreTest {
testInterface.create(mdl);
}
testInterface.resetAlarmCounters();
for(int i = 0; i< 50; i++){
mdl = createAlarmObject();
mdl.setCustomerId(customerId_2);
@@ -439,10 +442,14 @@ public abstract class BaseAlarmDatastoreTest {
page1 = testInterface.getForCustomer(customerId_1, Collections.singleton(equipmentIds.iterator().next()), Collections.singleton(AlarmCode.AccessPointIsUnreachable), -1, null, sortBy, context);
assertEquals(1, page1.getItems().size());
testInterface.resetAlarmCounters();
//clean up after the test
equipmentIds.forEach(eqId -> testInterface.delete(customerId_1, eqId));
equipmentIds_c2.forEach(eqId -> testInterface.delete(customerId_2, eqId));
testInterface.resetAlarmCounters();
}
protected List<String> getAlarmPagination_expectedPage3Strings(){
@@ -542,7 +549,6 @@ public abstract class BaseAlarmDatastoreTest {
mdl.setScopeId("qr_"+apNameIdx);
if((i%2) == 0) {
mdl.setAlarmCode(AlarmCode.CPUUtilization);
mdl.setAcknowledged(true);
equipmentIds_CPUUtilization.add(mdl.getEquipmentId());
} else {
equipmentIds_AccessPointIsUnreachable.add(mdl.getEquipmentId());
@@ -554,21 +560,21 @@ public abstract class BaseAlarmDatastoreTest {
testInterface.create(mdl);
}
mdl = createAlarmObject();
mdl.setCustomerId(customerId_1);
mdl.setEquipmentId(0);
mdl.setAlarmCode(AlarmCode.GenericError);
equipmentIds_c1.add(mdl.getEquipmentId());
testInterface.create(mdl);
{
mdl = createAlarmObject();
mdl.setCustomerId(customerId_1);
mdl.setEquipmentId(0);
mdl.setAlarmCode(AlarmCode.GenericError);
equipmentIds_c1.add(mdl.getEquipmentId());
testInterface.create(mdl);
}
for(int i = 0; i< 50; i++){
mdl = createAlarmObject();
mdl.setCustomerId(customerId_2);
mdl.setScopeId("qr_"+apNameIdx);
equipmentIds_c2.add(mdl.getEquipmentId());
mdl.setAcknowledged(false);
mdl.setAlarmCode(AlarmCode.GenericError);
apNameIdx++;
testInterface.create(mdl);
@@ -576,71 +582,33 @@ public abstract class BaseAlarmDatastoreTest {
Set<AlarmCode> alarmCodes = new HashSet<>(Arrays.asList(AlarmCode.AccessPointIsUnreachable, AlarmCode.GenericError, AlarmCode.CPUUtilization));
AlarmCounts alarmCounts = testInterface.getAlarmCounts(customerId_1, equipmentIds, alarmCodes, null);
AlarmCounts alarmCounts = testInterface.getAlarmCounts(customerId_1, equipmentIds, alarmCodes);
assertEquals(0, alarmCounts.getCounter(0, AlarmCode.GenericError));
assertEquals(25, alarmCounts.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(25, alarmCounts.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(25, alarmCounts.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(25, alarmCounts.getSeverityCounter(StatusCode.error));
equipmentIds_CPUUtilization.forEach(eqId -> assertEquals(1, alarmCounts.getCounter(eqId, AlarmCode.CPUUtilization)));
equipmentIds_AccessPointIsUnreachable.forEach(eqId -> assertEquals(1, alarmCounts.getCounter(eqId, AlarmCode.AccessPointIsUnreachable)) );
AlarmCounts alarmCounts_noEq = testInterface.getAlarmCounts(customerId_1, null, alarmCodes, null);
AlarmCounts alarmCounts_noEq = testInterface.getAlarmCounts(customerId_1, null, alarmCodes);
assertEquals(1, alarmCounts_noEq.getCounter(0, AlarmCode.GenericError));
assertEquals(25, alarmCounts_noEq.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(25, alarmCounts_noEq.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(25, alarmCounts_noEq.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(26, alarmCounts_noEq.getSeverityCounter(StatusCode.error));
assertTrue(alarmCounts_noEq.getCountsPerEquipmentIdMap().isEmpty());
assertEquals(3, alarmCounts_noEq.getTotalCountsPerAlarmCodeMap().size());
AlarmCounts alarmCounts_noEq_1code = testInterface.getAlarmCounts(customerId_1, null, Collections.singleton(AlarmCode.CPUUtilization), null);
AlarmCounts alarmCounts_noEq_1code = testInterface.getAlarmCounts(customerId_1, null, Collections.singleton(AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_noEq_1code.getCounter(0, AlarmCode.GenericError));
assertEquals(25, alarmCounts_noEq_1code.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_noEq_1code.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(25, alarmCounts_noEq_1code.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(0, alarmCounts_noEq_1code.getSeverityCounter(StatusCode.error));
assertTrue(alarmCounts_noEq_1code.getCountsPerEquipmentIdMap().isEmpty());
assertEquals(1, alarmCounts_noEq_1code.getTotalCountsPerAlarmCodeMap().size());
AlarmCounts alarmCounts_acknowledgedT = testInterface.getAlarmCounts(customerId_1, null, Collections.singleton(AlarmCode.CPUUtilization), true);
assertTrue(alarmCounts_acknowledgedT.getAcknowledged());
assertEquals(0, alarmCounts_acknowledgedT.getCounter(0, AlarmCode.GenericError));
assertEquals(25, alarmCounts_acknowledgedT.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_acknowledgedT.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(25, alarmCounts_acknowledgedT.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(0, alarmCounts_acknowledgedT.getSeverityCounter(StatusCode.error));
assertTrue(alarmCounts_acknowledgedT.getCountsPerEquipmentIdMap().isEmpty());
assertEquals(1, alarmCounts_acknowledgedT.getTotalCountsPerAlarmCodeMap().size());
AlarmCounts alarmCounts_acknowledgedF = testInterface.getAlarmCounts(customerId_1, null, Collections.singleton(AlarmCode.CPUUtilization), false);
assertFalse(alarmCounts_acknowledgedF.getAcknowledged());
assertEquals(0, alarmCounts_acknowledgedF.getCounter(0, AlarmCode.GenericError));
assertEquals(0, alarmCounts_acknowledgedF.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_acknowledgedF.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(0, alarmCounts_acknowledgedF.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(0, alarmCounts_acknowledgedF.getSeverityCounter(StatusCode.error));
assertTrue(alarmCounts_acknowledgedF.getCountsPerEquipmentIdMap().isEmpty());
assertEquals(0, alarmCounts_acknowledgedF.getTotalCountsPerAlarmCodeMap().size());
AlarmCounts alarmCounts_acknowledgedF2 = testInterface.getAlarmCounts(customerId_2, null, Collections.singleton(AlarmCode.GenericError), false);
assertFalse(alarmCounts_acknowledgedF2.getAcknowledged());
assertEquals(50, alarmCounts_acknowledgedF2.getCounter(0, AlarmCode.GenericError));
assertEquals(0, alarmCounts_acknowledgedF2.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_acknowledgedF2.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(0, alarmCounts_acknowledgedF2.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(50, alarmCounts_acknowledgedF2.getSeverityCounter(StatusCode.error));
assertTrue(alarmCounts_acknowledgedF2.getCountsPerEquipmentIdMap().isEmpty());
assertEquals(1, alarmCounts_acknowledgedF2.getTotalCountsPerAlarmCodeMap().size());
AlarmCounts alarmCounts_1Eq_1code = testInterface.getAlarmCounts(customerId_1, Collections.singleton(equipmentIds.iterator().next()), Collections.singleton(AlarmCode.CPUUtilization), null);
AlarmCounts alarmCounts_1Eq_1code = testInterface.getAlarmCounts(customerId_1, Collections.singleton(equipmentIds.iterator().next()), Collections.singleton(AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_1Eq_1code.getCounter(0, AlarmCode.GenericError));
assertEquals(1, alarmCounts_1Eq_1code.getCounter(equipmentIds.iterator().next(), AlarmCode.CPUUtilization));
assertEquals(1, alarmCounts_1Eq_1code.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_1Eq_1code.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(1, alarmCounts_1Eq_1code.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(0, alarmCounts_1Eq_1code.getSeverityCounter(StatusCode.error));
assertEquals(1, alarmCounts_1Eq_1code.getCountsPerEquipmentIdMap().size());
assertEquals(1, alarmCounts_1Eq_1code.getTotalCountsPerAlarmCodeMap().size());
@@ -650,12 +618,10 @@ public abstract class BaseAlarmDatastoreTest {
for(int i=0; i< 4; i++) {
smallEqIds.add(iter.next());
}
AlarmCounts alarmCounts_small = testInterface.getAlarmCounts(customerId_1, smallEqIds, alarmCodes, null);
AlarmCounts alarmCounts_small = testInterface.getAlarmCounts(customerId_1, smallEqIds, alarmCodes);
assertEquals(0, alarmCounts_small.getCounter(0, AlarmCode.GenericError));
assertEquals(2, alarmCounts_small.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(2, alarmCounts_small.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(2, alarmCounts_small.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(2, alarmCounts_small.getSeverityCounter(StatusCode.error));
//clean up after the test
equipmentIds_c1.forEach(eqId -> testInterface.delete(customerId_1, eqId));
@@ -663,38 +629,6 @@ public abstract class BaseAlarmDatastoreTest {
}
@Test
public void testAlarmCountsForSingleEquipment() {
//create some Alarms
Alarm mdl;
int customerId = (int) testSequence.incrementAndGet();
long equipmentId = testSequence.incrementAndGet();
mdl = createAlarmObject();
mdl.setCustomerId(customerId);
mdl.setEquipmentId(equipmentId);
mdl.setAlarmCode(AlarmCode.CPUUtilization);
testInterface.create(mdl);
mdl.setAlarmCode(AlarmCode.AccessPointIsUnreachable);
testInterface.create(mdl);
Set<AlarmCode> alarmCodes = new HashSet<>(Arrays.asList(AlarmCode.AccessPointIsUnreachable, AlarmCode.GenericError, AlarmCode.CPUUtilization));
AlarmCounts alarmCounts = testInterface.getAlarmCounts(customerId, Collections.singleton(equipmentId), alarmCodes, null);
assertEquals(0, alarmCounts.getCounter(0, AlarmCode.GenericError));
assertEquals(1, alarmCounts.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(1, alarmCounts.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(2, alarmCounts.getCounter(equipmentId, null));
assertEquals(1, alarmCounts.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(1, alarmCounts.getSeverityCounter(StatusCode.error));
//clean up after the test
testInterface.delete(customerId, equipmentId);
}
protected Alarm createAlarmObject() {
Alarm result = new Alarm();

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,19 +15,19 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-datastore-inmemory</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-datastore-interface</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-datastore-common-test</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -322,37 +322,22 @@ public class AlarmDatastoreInMemory extends BaseInMemoryDatastore implements Ala
}
@Override
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged) {
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet) {
AlarmCounts alarmCounts = new AlarmCounts();
alarmCounts.setCustomerId(customerId);
alarmCounts.setAcknowledged(acknowledged);
if (acknowledged == null) {
idToAlarmMap.values().forEach(a -> {
if(a.getCustomerId() == customerId) {
if( alarmCodeSet ==null || alarmCodeSet.isEmpty() || alarmCodeSet.contains(a.getAlarmCode()) ) {
if( equipmentIdSet != null && !equipmentIdSet.isEmpty() && equipmentIdSet.contains(a.getEquipmentId()) ) {
alarmCounts.addToCounter(a.getEquipmentId(), a.getAlarmCode(), 1);
} else if (equipmentIdSet == null || equipmentIdSet.isEmpty()) {
alarmCounts.addToCounter(0, a.getAlarmCode(), 1);
}
}
}
});
} else {
idToAlarmMap.values().forEach(a -> {
if(a.getCustomerId() == customerId && acknowledged.equals(a.isAcknowledged())) {
if( alarmCodeSet ==null || alarmCodeSet.isEmpty() || alarmCodeSet.contains(a.getAlarmCode()) ) {
if( equipmentIdSet != null && !equipmentIdSet.isEmpty() && equipmentIdSet.contains(a.getEquipmentId()) ) {
alarmCounts.addToCounter(a.getEquipmentId(), a.getAlarmCode(), 1);
} else if (equipmentIdSet == null || equipmentIdSet.isEmpty()) {
alarmCounts.addToCounter(0, a.getAlarmCode(), 1);
}
}
}
});
}
idToAlarmMap.values().forEach(a -> {
if(a.getCustomerId() == customerId) {
if( alarmCodeSet ==null || alarmCodeSet.isEmpty() || alarmCodeSet.contains(a.getAlarmCode()) ) {
if( equipmentIdSet != null && !equipmentIdSet.isEmpty() && equipmentIdSet.contains(a.getEquipmentId()) ) {
alarmCounts.addToCounter(a.getEquipmentId(), a.getAlarmCode(), 1);
} else if( equipmentIdSet == null || equipmentIdSet.isEmpty()) {
alarmCounts.addToCounter(0, a.getAlarmCode(), 1);
}
}
}
});
return alarmCounts;
}

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,12 +15,12 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-models</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -66,9 +66,16 @@ public interface AlarmDatastore {
* @param customerId
* @param equipmentIdSet - if empty, then only total counts of all alarms for customer per alarm code will be counted
* @param alarmCodeSet - can be empty, in which case all alarm codes will be counted
* @param acknowledged - can by empty, in which case acknowledged will be ignored
* @return alarm counts for the given filters
*/
AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged);
AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet);
/**
* In some datastores (i.e. Cassandra) it makes sense to store counts of alarms in a separate table for fast retrieval by UI.
* Unfortunately, there are some situations where those counters get out of sync with the real alarm counts.
* This method is here to re-calculate the counter values and bring them in-sync with the real alarms.
*/
default void resetAlarmCounters() {
//only Cassandra datastore needs to implement this
}
}

View File

@@ -0,0 +1,43 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>alarm-datastore-rdbms</artifactId>
<name>alarm-datastore-rdbms</name>
<description>SQL implementation of the data store</description>
<dependencies>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-jdbc</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-datastore-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-jdbc-tests</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-datastore-common-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,651 @@
package com.telecominfraproject.wlan.alarm.datastore.rdbms;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
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.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.core.server.jdbc.BaseJdbcDao;
import com.telecominfraproject.wlan.datastore.exceptions.DsConcurrentModificationException;
import com.telecominfraproject.wlan.datastore.exceptions.DsDuplicateEntityException;
import com.telecominfraproject.wlan.datastore.exceptions.DsEntityNotFoundException;
/**
* @author dtoptygin
*
*/
@Repository
@Transactional(propagation = Propagation.MANDATORY)
public class AlarmDAO extends BaseJdbcDao {
private static final Logger LOG = LoggerFactory.getLogger(AlarmDatastoreRdbms.class);
private static final String[] GENERATED_KEY_COLS = { };
private static final String[] ALL_COLUMNS_LIST = {
//TODO: add colums from properties Alarm in here
"customerId",
"equipmentId",
"alarmCode",
"createdTimestamp",
"originatorType",
"severity",
"scopeType",
"scopeId",
"details",
"acknowledged",
//make sure the order of properties matches this list and list in AlarmRowMapper and list in create/update methods
"lastModifiedTimestamp"
};
private static final Set<String> columnsToSkipForInsert = new HashSet<>(Arrays.asList());
private static final Set<String> columnsToSkipForUpdate = new HashSet<>(Arrays.asList(
"customerId",
"equipmentId",
"alarmCode",
"createdTimestamp"));
private static final String TABLE_NAME = "alarm";
private static final String TABLE_PREFIX = "s.";
private static final String ALL_COLUMNS;
private static final Set<String> ALL_COLUMNS_LOWERCASE = new HashSet<>();
@SuppressWarnings("unused")
//use this for queries where multiple tables are involved
private static final String ALL_COLUMNS_WITH_PREFIX;
private static final String ALL_COLUMNS_FOR_INSERT;
private static final String BIND_VARS_FOR_INSERT;
private static final String ALL_COLUMNS_UPDATE;
static{
StringBuilder strbAllColumns = new StringBuilder(1024);
StringBuilder strbAllColumnsWithPrefix = new StringBuilder(1024);
StringBuilder strbAllColumnsForInsert = new StringBuilder(1024);
StringBuilder strbBindVarsForInsert = new StringBuilder(128);
StringBuilder strbColumnsForUpdate = new StringBuilder(512);
for(String colName: ALL_COLUMNS_LIST){
ALL_COLUMNS_LOWERCASE.add(colName.toLowerCase());
strbAllColumns.append(colName).append(",");
strbAllColumnsWithPrefix.append(TABLE_PREFIX).append(colName).append(",");
if(!columnsToSkipForInsert.contains(colName)){
strbAllColumnsForInsert.append(colName).append(",");
strbBindVarsForInsert.append("?,");
}
if(!columnsToSkipForUpdate.contains(colName)){
strbColumnsForUpdate.append(colName).append("=?,");
}
}
// remove trailing ','
strbAllColumns.deleteCharAt(strbAllColumns.length() - 1);
strbAllColumnsWithPrefix.deleteCharAt(strbAllColumnsWithPrefix.length() - 1);
strbAllColumnsForInsert.deleteCharAt(strbAllColumnsForInsert.length() - 1);
strbBindVarsForInsert.deleteCharAt(strbBindVarsForInsert.length() - 1);
strbColumnsForUpdate.deleteCharAt(strbColumnsForUpdate.length() - 1);
ALL_COLUMNS = strbAllColumns.toString();
ALL_COLUMNS_WITH_PREFIX = strbAllColumnsWithPrefix.toString();
ALL_COLUMNS_FOR_INSERT = strbAllColumnsForInsert.toString();
BIND_VARS_FOR_INSERT = strbBindVarsForInsert.toString();
ALL_COLUMNS_UPDATE = strbColumnsForUpdate.toString();
}
private static final String SQL_GET_BY_ID =
"select " + ALL_COLUMNS +
" from "+TABLE_NAME+" " +
" where customerId = ? and equipmentId = ? and alarmCode = ? and createdTimestamp = ?";
private static final String SQL_GET_BY_CUSTOMER_ID =
"select " + ALL_COLUMNS +
" from " + TABLE_NAME + " " +
" where customerId = ? ";
private static final String SQL_GET_LASTMOD_BY_ID =
"select lastModifiedTimestamp " +
" from "+TABLE_NAME+" " +
" where customerId = ? and equipmentId = ? and alarmCode = ? and createdTimestamp = ?";
private static final String SQL_INSERT =
"insert into "+TABLE_NAME+" ( "
+ ALL_COLUMNS_FOR_INSERT
+ " ) values ( "+BIND_VARS_FOR_INSERT+" ) ";
private static final String SQL_DELETE =
"delete from "+TABLE_NAME+
" where customerId = ? and equipmentId = ? and alarmCode = ? and createdTimestamp = ?";
private static final String SQL_DELETE_BY_EQUIPMENT =
"delete from "+TABLE_NAME+
" where customerId = ? and equipmentId = ? ";
private static final String SQL_UPDATE =
"update "+TABLE_NAME+" set "
+ ALL_COLUMNS_UPDATE +
" where customerId = ? and equipmentId = ? and alarmCode = ? and createdTimestamp = ?"
+ " and ( lastModifiedTimestamp = ? or ? = true) " //last parameter will allow us to skip check for concurrent modification, if necessary
;
private static final String SQL_PAGING_SUFFIX = " LIMIT ? OFFSET ? ";
private static final String SORT_SUFFIX = "";
private static final String SQL_COUNTS_BY_EQUIPMENT_AND_ALARM_CODE_HEADER = "select equipmentId, alarmCode, count(1) from alarm where customerId = ? ";
private static final String SQL_COUNTS_BY_EQUIPMENT_AND_ALARM_CODE_FOOTER = " group by equipmentId, alarmCode";
private static final String SQL_COUNTS_BY_ALARM_CODE_HEADER = "select alarmCode, count(1) from alarm where customerId = ? ";
private static final String SQL_COUNTS_BY_ALARM_CODE_FOOTER = " group by alarmCode";
private static final RowMapper<Alarm> alarmRowMapper = new AlarmRowMapper();
@Autowired(required=false)
public void setDataSource(AlarmDataSourceInterface dataSource) {
setDataSource((DataSource)dataSource);
}
public Alarm create(final Alarm alarm) {
final long ts = System.currentTimeMillis();
if(alarm.getCreatedTimestamp()<=0) {
alarm.setCreatedTimestamp(ts);
}
alarm.setLastModifiedTimestamp(ts);
try{
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(SQL_INSERT );
int colIdx = 1;
//TODO: add remaining properties from Alarm here
ps.setInt(colIdx++, alarm.getCustomerId());
ps.setLong(colIdx++, alarm.getEquipmentId());
ps.setInt(colIdx++, alarm.getAlarmCode().getId());
ps.setLong(colIdx++, alarm.getCreatedTimestamp());
ps.setInt(colIdx++, alarm.getOriginatorType().getId());
ps.setInt(colIdx++, alarm.getSeverity().getId());
ps.setInt(colIdx++, alarm.getScopeType().getId());
ps.setString(colIdx++, alarm.getScopeId());
ps.setBytes(colIdx++, (alarm.getDetails()!=null)?alarm.getDetails().toZippedBytes():null);
ps.setBoolean(colIdx++, alarm.isAcknowledged());
ps.setLong(colIdx++, alarm.getLastModifiedTimestamp());
return ps;
}
});
}catch (DuplicateKeyException e) {
throw new DsDuplicateEntityException(e);
}
LOG.debug("Stored Alarm {}", alarm);
return alarm.clone();
}
public Alarm get(int customerId, long equipmentId, AlarmCode alarmCode, long createdTimestamp) {
LOG.debug("Looking up Alarm for id {} {} {} {}", customerId, equipmentId, alarmCode, createdTimestamp);
try {
Alarm alarm = this.jdbcTemplate.queryForObject(
SQL_GET_BY_ID,
alarmRowMapper, customerId, equipmentId, alarmCode.getId(), createdTimestamp);
LOG.debug("Found Alarm {}", alarm);
return alarm;
}catch (EmptyResultDataAccessException e) {
throw new DsEntityNotFoundException(e);
}
}
@Transactional(noRollbackFor = { EmptyResultDataAccessException.class })
public Alarm getOrNull(int customerId, long equipmentId, AlarmCode alarmCode, long createdTimestamp) {
LOG.debug("Looking up Alarm for id {} {} {} {}", customerId, equipmentId, alarmCode, createdTimestamp);
try{
Alarm alarm = this.jdbcTemplate.queryForObject(
SQL_GET_BY_ID,
alarmRowMapper, customerId, equipmentId, alarmCode.getId(), createdTimestamp);
LOG.debug("Found Alarm {}", alarm);
return alarm;
}catch (EmptyResultDataAccessException e) {
LOG.debug("Could not find Alarm for id {} {} {} {}", customerId, equipmentId, alarmCode, createdTimestamp);
return null;
}
}
public Alarm update(Alarm alarm) {
long newLastModifiedTs = System.currentTimeMillis();
long incomingLastModifiedTs = alarm.getLastModifiedTimestamp();
int updateCount = this.jdbcTemplate.update(SQL_UPDATE, new Object[]{
//TODO: add remaining properties from Alarm here
alarm.getOriginatorType().getId(),
alarm.getSeverity().getId(),
alarm.getScopeType().getId(),
alarm.getScopeId(),
(alarm.getDetails()!=null)?alarm.getDetails().toZippedBytes():null ,
alarm.isAcknowledged(),
newLastModifiedTs,
// use id for update operation
alarm.getCustomerId(),
alarm.getEquipmentId(),
alarm.getAlarmCode().getId(),
alarm.getCreatedTimestamp(),
// use lastModifiedTimestamp for data protection against concurrent modifications
incomingLastModifiedTs,
isSkipCheckForConcurrentUpdates()
});
if(updateCount==0){
try{
if(isSkipCheckForConcurrentUpdates()){
//in this case we did not request protection against concurrent updates,
//so the updateCount is 0 because record in db was not found
throw new EmptyResultDataAccessException(1);
}
//find out if record could not be updated because it does not exist or because it was modified concurrently
long recordTimestamp = this.jdbcTemplate.queryForObject(
SQL_GET_LASTMOD_BY_ID,
Long.class,
alarm.getCustomerId(),
alarm.getEquipmentId(),
alarm.getAlarmCode().getId(),
alarm.getCreatedTimestamp()
);
LOG.debug("Concurrent modification detected for Alarm with id {} {} {} {} expected version is {} but version in db was {}",
alarm.getCustomerId(),
alarm.getEquipmentId(),
alarm.getAlarmCode().getId(),
alarm.getCreatedTimestamp(),
incomingLastModifiedTs,
recordTimestamp
);
throw new DsConcurrentModificationException("Concurrent modification detected for Alarm with id " +
alarm.getCustomerId() + " " +
alarm.getEquipmentId() + " " +
alarm.getAlarmCode().getId() + " " +
alarm.getCreatedTimestamp() + " "
+" expected version is " + incomingLastModifiedTs
+" but version in db was " + recordTimestamp
);
}catch (EmptyResultDataAccessException e) {
LOG.debug("Cannot find Alarm for {} {} {} {} ", alarm.getCustomerId(),
alarm.getEquipmentId(),
alarm.getAlarmCode().getId(),
alarm.getCreatedTimestamp());
throw new DsEntityNotFoundException("Alarm not found " +
alarm.getCustomerId() + " " +
alarm.getEquipmentId() + " " +
alarm.getAlarmCode().getId() + " " +
alarm.getCreatedTimestamp());
}
}
//make a copy so that we don't accidentally update caller's version by reference
Alarm alarmCopy = alarm.clone();
alarmCopy.setLastModifiedTimestamp(newLastModifiedTs);
LOG.debug("Updated Alarm {}", alarmCopy);
return alarmCopy;
}
public Alarm delete(int customerId, long equipmentId, AlarmCode alarmCode, long createdTimestamp) {
Alarm ret = get(customerId, equipmentId, alarmCode, createdTimestamp);
this.jdbcTemplate.update(SQL_DELETE, customerId, equipmentId, alarmCode.getId(), createdTimestamp);
LOG.debug("Deleted Alarm {}", ret);
return ret;
}
public List<Alarm> delete(int customerId, long equipmentId) {
List<Alarm> ret = get(customerId, Collections.singleton(equipmentId), null, -1);
this.jdbcTemplate.update(SQL_DELETE_BY_EQUIPMENT, customerId, equipmentId);
LOG.debug("Deleted Alarms {}", ret);
return ret;
}
public List<Alarm> get(int customerId, Set<Long> equipmentIds, Set<AlarmCode> alarmCodes,
long createdAfterTimestamp) {
if(equipmentIds == null || equipmentIds.isEmpty()) {
throw new IllegalArgumentException("equipmentIds must be provided");
}
LOG.debug("Looking up Alarms for customer {} equipment {} codes {} createdAfter {}",
customerId, equipmentIds, alarmCodes, createdAfterTimestamp);
String query = SQL_GET_BY_CUSTOMER_ID;
// add filters for the query
ArrayList<Object> queryArgs = new ArrayList<>();
queryArgs.add(customerId);
//add equipmentId filters
if (equipmentIds != null && !equipmentIds.isEmpty()) {
queryArgs.addAll(equipmentIds);
StringBuilder strb = new StringBuilder(100);
strb.append("and equipmentId in (");
for (int i = 0; i < equipmentIds.size(); i++) {
strb.append("?");
if (i < equipmentIds.size() - 1) {
strb.append(",");
}
}
strb.append(") ");
query += strb.toString();
}
//add alarmCodes filters
if (alarmCodes != null && !alarmCodes.isEmpty()) {
alarmCodes.forEach(ac -> queryArgs.add(ac.getId()));
StringBuilder strb = new StringBuilder(100);
strb.append("and alarmCode in (");
for (int i = 0; i < alarmCodes.size(); i++) {
strb.append("?");
if (i < alarmCodes.size() - 1) {
strb.append(",");
}
}
strb.append(") ");
query += strb.toString();
}
if(createdAfterTimestamp > 0) {
query += " and createdTimestamp > ?" ;
queryArgs.add(createdAfterTimestamp);
}
List<Alarm> ret = this.jdbcTemplate.query(query, queryArgs.toArray(),
alarmRowMapper);
LOG.debug("Found {} Alarms for customer {} equipment {} codes {} createdAfter {}",
ret.size(),
customerId, equipmentIds, alarmCodes, createdAfterTimestamp);
return ret;
}
public List<Alarm> getAllForCustomer(int customerId) {
LOG.debug("Looking up Alarms for customer {}", customerId);
List<Alarm> ret = this.jdbcTemplate.query(SQL_GET_BY_CUSTOMER_ID,
alarmRowMapper, customerId);
LOG.debug("Found Alarms for customer {} : {}", customerId, ret);
return ret;
}
public PaginationResponse<Alarm> getForCustomer(int customerId,
Set<Long> equipmentIds, Set<AlarmCode> alarmCodes, long createdAfterTimestamp, Boolean acknowledged,
List<ColumnAndSort> sortBy, PaginationContext<Alarm> context) {
PaginationResponse<Alarm> ret = new PaginationResponse<>();
ret.setContext(context.clone());
if (ret.getContext().isLastPage()) {
// no more pages available according to the context
LOG.debug(
"No more pages available when looking up Alarms for customer {} with last returned page number {}",
customerId, context.getLastReturnedPageNumber());
return ret;
}
LOG.debug("Looking up Alarms for customer {} with last returned page number {}",
customerId, context.getLastReturnedPageNumber());
String query = SQL_GET_BY_CUSTOMER_ID;
// add filters for the query
ArrayList<Object> queryArgs = new ArrayList<>();
queryArgs.add(customerId);
//add equipmentId filters
if (equipmentIds != null && !equipmentIds.isEmpty()) {
queryArgs.addAll(equipmentIds);
StringBuilder strb = new StringBuilder(100);
strb.append("and equipmentId in (");
for (int i = 0; i < equipmentIds.size(); i++) {
strb.append("?");
if (i < equipmentIds.size() - 1) {
strb.append(",");
}
}
strb.append(") ");
query += strb.toString();
}
//add alarmCodes filters
if (alarmCodes != null && !alarmCodes.isEmpty()) {
alarmCodes.forEach(ac -> queryArgs.add(ac.getId()));
StringBuilder strb = new StringBuilder(100);
strb.append("and alarmCode in (");
for (int i = 0; i < alarmCodes.size(); i++) {
strb.append("?");
if (i < alarmCodes.size() - 1) {
strb.append(",");
}
}
strb.append(") ");
query += strb.toString();
}
if(createdAfterTimestamp > 0) {
query += " and createdTimestamp > ?" ;
queryArgs.add(createdAfterTimestamp);
}
if (acknowledged != null) {
query += " and acknowledged = ? ";
queryArgs.add(acknowledged);
}
// add sorting options for the query
StringBuilder strbSort = new StringBuilder(100);
strbSort.append(" order by ");
if (sortBy != null && !sortBy.isEmpty()) {
// use supplied sorting options
for (ColumnAndSort column : sortBy) {
if (!ALL_COLUMNS_LOWERCASE.contains(column.getColumnName().toLowerCase())) {
// unknown column, skip it
continue;
}
strbSort.append(column.getColumnName());
if (column.getSortOrder() == SortOrder.desc) {
strbSort.append(" desc");
}
strbSort.append(",");
}
// remove last ','
strbSort.deleteCharAt(strbSort.length() - 1);
} else {
// no sort order was specified - sort by id to have consistent
// paging
strbSort.append(" equipmentId, createdTimestamp");
}
query += strbSort.toString();
// add pagination parameters for the query
query += SQL_PAGING_SUFFIX ;
queryArgs.add(context.getMaxItemsPerPage());
queryArgs.add(context.getTotalItemsReturned());
/*
* https://www.citusdata.com/blog/2016/03/30/five-ways-to-paginate/
* Choosing offset=1000 makes cost about 19 and has a 0.609 ms execution
* time. Once offset=5,000,000 the cost goes up to 92734 and execution
* time is 758.484 ms. - DT: still acceptable for our use case
*/
List<Alarm> pageItems = this.jdbcTemplate.query(query, queryArgs.toArray(),
alarmRowMapper);
LOG.debug("Found {} Alarms for customer {} with last returned page number {}",
pageItems.size(), customerId, context.getLastReturnedPageNumber());
ret.setItems(pageItems);
// adjust context for the next page
ret.prepareForNextPage();
// startAfterItem is not used in RDBMS datastores, set it to null
ret.getContext().setStartAfterItem(null);
return ret;
}
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIds, Set<AlarmCode> alarmCodes) {
ArrayList<Object> queryArgs = new ArrayList<>();
queryArgs.add(customerId);
//build the query
StringBuilder query = new StringBuilder();
if(equipmentIds == null || equipmentIds.isEmpty()) {
query.append(SQL_COUNTS_BY_ALARM_CODE_HEADER);
} else {
query.append(SQL_COUNTS_BY_EQUIPMENT_AND_ALARM_CODE_HEADER);
}
//add alarmCodes filters
if (alarmCodes != null && !alarmCodes.isEmpty()) {
alarmCodes.forEach(ac -> queryArgs.add(ac.getId()));
StringBuilder strb = new StringBuilder(100);
strb.append("and alarmCode in (");
for (int i = 0; i < alarmCodes.size(); i++) {
strb.append("?");
if (i < alarmCodes.size() - 1) {
strb.append(",");
}
}
strb.append(") ");
query.append(strb);
}
//add equipmentId filters
if (equipmentIds != null && !equipmentIds.isEmpty()) {
queryArgs.addAll(equipmentIds);
StringBuilder strb = new StringBuilder(100);
strb.append("and equipmentId in (");
for (int i = 0; i < equipmentIds.size(); i++) {
strb.append("?");
if (i < equipmentIds.size() - 1) {
strb.append(",");
}
}
strb.append(") ");
query.append(strb);
}
if(equipmentIds == null || equipmentIds.isEmpty()) {
query.append(SQL_COUNTS_BY_ALARM_CODE_FOOTER);
} else {
query.append(SQL_COUNTS_BY_EQUIPMENT_AND_ALARM_CODE_FOOTER);
}
AlarmCounts alarmCounts = new AlarmCounts();
alarmCounts.setCustomerId(customerId);
this.jdbcTemplate.query(query.toString(), queryArgs.toArray(),
new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
if(equipmentIds == null || equipmentIds.isEmpty()) {
alarmCounts.addToCounter(0, AlarmCode.getById(rs.getInt(1)), rs.getInt(2));
} else {
alarmCounts.addToCounter(rs.getLong(1), AlarmCode.getById(rs.getInt(2)), rs.getInt(3));
}
}
});
return alarmCounts;
}
}

View File

@@ -0,0 +1,31 @@
package com.telecominfraproject.wlan.alarm.datastore.rdbms;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.core.server.jdbc.BaseDataSourceConfig;
/**
* @author dtoptygin
*
*/
@Component
@Profile("!use_single_ds")
@PropertySource({ "${alarm-ds.props:classpath:alarm-ds.properties}" })
public class AlarmDataSourceConfig extends BaseDataSourceConfig {
@Bean
public AlarmDataSourceInterface alarmDataSourceInterface(){
AlarmDataSourceInterface ret = new AlarmDataSourceImpl(getDataSource(), getKeyColumnConverter());
return ret;
}
@Override
public String getDataSourceName() {
return "alarm-ds";
}
}

View File

@@ -0,0 +1,18 @@
package com.telecominfraproject.wlan.alarm.datastore.rdbms;
import javax.sql.DataSource;
import com.telecominfraproject.wlan.core.server.jdbc.BaseJDbcDataSource;
import com.telecominfraproject.wlan.core.server.jdbc.BaseKeyColumnConverter;
/**
* @author dtoptygin
* SQL DataSource that is used by Alarm Service
*/
public class AlarmDataSourceImpl extends BaseJDbcDataSource implements AlarmDataSourceInterface {
public AlarmDataSourceImpl(DataSource targetDataSource, BaseKeyColumnConverter keyColumnConverter){
super(targetDataSource, keyColumnConverter);
}
}

View File

@@ -0,0 +1,11 @@
package com.telecominfraproject.wlan.alarm.datastore.rdbms;
import javax.sql.DataSource;
/**
* @author dtoptygin
* Marker interface to distinguish SQL DataSource that is used by Alarm Service
*/
public interface AlarmDataSourceInterface extends DataSource {
}

View File

@@ -0,0 +1,76 @@
package com.telecominfraproject.wlan.alarm.datastore.rdbms;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
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.alarm.datastore.AlarmDatastore;
import com.telecominfraproject.wlan.alarm.models.Alarm;
import com.telecominfraproject.wlan.alarm.models.AlarmCode;
import com.telecominfraproject.wlan.alarm.models.AlarmCounts;
/**
* @author dtoptygin
*
*/
@Configuration
public class AlarmDatastoreRdbms implements AlarmDatastore {
@Autowired AlarmDAO alarmDAO;
@Override
public Alarm create(Alarm alarm) {
return alarmDAO.create(alarm);
}
@Override
public Alarm getOrNull(int customerId, long equipmentId, AlarmCode alarmCode, long createdTimestamp) {
return alarmDAO.getOrNull(customerId, equipmentId, alarmCode, createdTimestamp);
}
@Override
public Alarm update(Alarm alarm) {
return alarmDAO.update(alarm);
}
@Override
public Alarm delete(int customerId, long equipmentId, AlarmCode alarmCode, long createdTimestamp) {
return alarmDAO.delete(customerId, equipmentId, alarmCode, createdTimestamp);
}
@Override
public List<Alarm> delete(int customerId, long equipmentId) {
return alarmDAO.delete(customerId, equipmentId);
}
@Override
public List<Alarm> get(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet,
long createdAfterTimestamp) {
return alarmDAO.get(customerId, equipmentIdSet, alarmCodeSet, createdAfterTimestamp);
}
@Override
public PaginationResponse<Alarm> getForCustomer(int customerId, Set<Long> equipmentIdSet,
Set<AlarmCode> alarmCodeSet, long createdAfterTimestamp, Boolean acknowledged, List<ColumnAndSort> sortBy,
PaginationContext<Alarm> context) {
if(context == null) {
context = new PaginationContext<>();
}
return alarmDAO.getForCustomer(customerId, equipmentIdSet,
alarmCodeSet, createdAfterTimestamp, acknowledged, sortBy,
context);
}
@Override
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet) {
return alarmDAO.getAlarmCounts(customerId, equipmentIdSet, alarmCodeSet);
}
}

View File

@@ -0,0 +1,58 @@
package com.telecominfraproject.wlan.alarm.datastore.rdbms;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.RowMapper;
import com.telecominfraproject.wlan.alarm.models.Alarm;
import com.telecominfraproject.wlan.alarm.models.AlarmCode;
import com.telecominfraproject.wlan.alarm.models.AlarmDetails;
import com.telecominfraproject.wlan.alarm.models.AlarmScopeType;
import com.telecominfraproject.wlan.alarm.models.OriginatorType;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.status.models.StatusCode;
/**
* @author dtoptygin
*
*/
public class AlarmRowMapper implements RowMapper<Alarm> {
private static final Logger LOG = LoggerFactory.getLogger(AlarmRowMapper.class);
public Alarm mapRow(ResultSet rs, int rowNum) throws SQLException {
Alarm alarm = new Alarm();
int colIdx=1;
//TODO: add columns from properties Alarm in here.
//make sure order of fields is the same as defined in Alarm
alarm.setCustomerId(rs.getInt(colIdx++));
alarm.setEquipmentId(rs.getLong(colIdx++));
alarm.setAlarmCode(AlarmCode.getById(rs.getInt(colIdx++)));
alarm.setCreatedTimestamp(rs.getLong(colIdx++));
alarm.setOriginatorType(OriginatorType.getById(rs.getInt(colIdx++)));
alarm.setSeverity(StatusCode.getById(rs.getInt(colIdx++)));
alarm.setScopeType(AlarmScopeType.getById(rs.getInt(colIdx++)));
alarm.setScopeId(rs.getString(colIdx++));
byte[] zippedBytes = rs.getBytes(colIdx++);
if (zippedBytes !=null) {
try {
AlarmDetails details = BaseJsonModel.fromZippedBytes(zippedBytes, AlarmDetails.class);
alarm.setDetails(details);
} catch (RuntimeException exp) {
LOG.error("Failed to decode AlarmDetails from database for {}", alarm);
}
}
alarm.setAcknowledged(rs.getBoolean(colIdx++));
alarm.setLastModifiedTimestamp(rs.getLong(colIdx++));
return alarm;
}
}

View File

@@ -0,0 +1,22 @@
create table if not exists alarm (
customerId int not null,
equipmentId bigint default 0 not null,
alarmCode int not null,
createdTimestamp bigint not null,
originatorType int not null,
severity int not null,
scopeType int not null,
scopeId varchar(255) not null,
details bytea,
acknowledged boolean,
lastModifiedTimestamp bigint not null,
primary key (customerId, equipmentId, alarmCode, createdTimestamp)
);
create index if not exists idx_alarm_customerId on alarm (customerId);
create index if not exists idx_alarm_equipmentId on alarm (equipmentId );

View File

@@ -0,0 +1,70 @@
package com.telecominfraproject.wlan.alarm.datastore.rdbms;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import com.telecominfraproject.wlan.core.server.jdbc.test.BaseJdbcTest;
import com.telecominfraproject.wlan.core.server.jdbc.test.TestWithEmbeddedDB;
import com.telecominfraproject.wlan.alarm.models.Alarm;
import com.telecominfraproject.wlan.alarm.models.AlarmCode;
/**
* @author dtoptygin
*
*/
@Import(value = {
AlarmDatastoreRdbms.class,
AlarmDataSourceConfig.class,
AlarmDAO.class,
BaseJdbcTest.Config.class
})
@TestWithEmbeddedDB
public class AlarmDatastoreRdbmsPlumbingTests extends BaseJdbcTest {
@Autowired(required=false) private EmbeddedDatabase db;
@Autowired private AlarmDatastoreRdbms alarmDatastore;
@Autowired private AlarmDAO alarmDAO;
@Before
public void setUp() {
}
@Test
public void testDataAccess() {
if(db!=null){
//this is a simple test to see if embedded db is working in test environment
JdbcTemplate jdbcTemplate = new JdbcTemplate(db);
Long ret = jdbcTemplate.queryForObject(
"select equipmentId from alarm where customerId = ? and equipmentId = ? and alarmCode = ? and createdTimestamp = ?",
Long.class, 1, 1L, 4, 1L);
assertEquals((Long)1L, ret);
}
}
@Test
public void testCreateUpdateDeleteAlarm() {
//GET by Id test
assertNotNull(alarmDatastore.getOrNull(1, 1L, AlarmCode.AccessPointIsUnreachable, 1L));
//DELETE Test
alarmDatastore.delete(1, 1L, AlarmCode.AccessPointIsUnreachable, 1L);
assertNull(alarmDatastore.getOrNull(1, 1L, AlarmCode.AccessPointIsUnreachable, 1L));
}
}

View File

@@ -0,0 +1,29 @@
package com.telecominfraproject.wlan.alarm.datastore.rdbms;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.context.annotation.Import;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import com.telecominfraproject.wlan.core.server.jdbc.test.BaseJdbcTest;
import com.telecominfraproject.wlan.core.server.jdbc.test.TestWithEmbeddedDB;
import com.telecominfraproject.wlan.alarm.datastore.BaseAlarmDatastoreTest;
/**
* @author dtoptygin
*
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = BaseJdbcTest.Config.class)
@Rollback(value = true)
@Transactional
@Import(value = { AlarmDatastoreRdbms.class, AlarmDataSourceConfig.class,
AlarmDAO.class, BaseJdbcTest.Config.class })
@TestWithEmbeddedDB
public class AlarmDatastoreRdbmsTests extends BaseAlarmDatastoreTest {
}

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<conversionRule conversionWord="filteredStack"
converterClass="com.telecominfraproject.wlan.server.exceptions.logback.ExceptionCompressingConverter" />
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%filteredStack%nopex</pattern>
<!-- See http://logback.qos.ch/manual/layouts.html for details -->
<!-- %ex{5} - add at the end to display only 5 levels of the exception stack trace -->
<!-- %nopex - add at the end to not display any of the exception stack traces -->
<!-- %ex{full} - add at the end to display all the levels of the exception stack trace -->
</encoder>
</appender>
<!--
details: http://logback.qos.ch/manual/configuration.html#auto_configuration
runtime configuration, if need to override the defaults:
-Dlogging.config=file:///home/ec2-user/opensync/logback.xml
for log configuration debugging - use
-Dlogback.statusListenerClass=ch.qos.logback.core.status.OnConsoleStatusListener
log levels:
OFF ERROR WARN INFO DEBUG TRACE
-->
<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
<logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="INFO"/>
<logger name="org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer" level="INFO"/>
<logger name="org.springframework.security.web.authentication.preauth" level="OFF"/>
<logger name="com.netflix.servo.tag.aws.AwsInjectableTag" level="OFF"/>
<logger name="com.telecominfraproject" level="WARN"/>
<root level="WARN">
<appender-ref ref="stdout"/>
</root>
</configuration>

View File

@@ -0,0 +1,24 @@
drop table alarm if exists;
create table alarm (
customerId int not null,
equipmentId bigint default 0 not null,
alarmCode int not null,
createdTimestamp bigint not null,
originatorType int not null,
severity int not null,
scopeType int not null,
scopeId varchar(255) not null,
details varbinary(65535),
acknowledged boolean,
lastModifiedTimestamp bigint not null,
primary key (customerId, equipmentId, alarmCode, createdTimestamp)
);
create index idx_alarm_customerId on alarm (customerId);
create index idx_alarm_equipmentId on alarm (equipmentId );

View File

@@ -0,0 +1,23 @@
insert into alarm (
customerId,
equipmentId,
alarmCode,
createdTimestamp,
originatorType,
severity,
scopeType,
scopeId,
details,
acknowledged,
lastModifiedTimestamp
) values (
1,1,4,1,
1,1,1, '-1',
null,
false,0
);

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,17 +15,17 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>status-models</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>system-event-models</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

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", "Metrics are not received from the equipment"),
NoMetricsReceived = new AlarmCode(6, "NoMetricsReceived", "Equipment is not report metrics"),
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

@@ -5,18 +5,14 @@ import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import com.telecominfraproject.wlan.core.model.json.BaseJsonModel;
import com.telecominfraproject.wlan.status.models.StatusCode;
public class AlarmCounts extends BaseJsonModel {
private static final long serialVersionUID = -8513006445975878351L;
private int customerId;
private Boolean acknowledged;
private Map<Long, Map<AlarmCode, AtomicInteger>> countsPerEquipmentIdMap = new HashMap<>();
private Map<Long, AtomicInteger> totalCountsPerEquipmentIdMap = new HashMap<>();
private Map<AlarmCode, AtomicInteger> totalCountsPerAlarmCodeMap = new HashMap<>();
private Map<StatusCode, AtomicInteger> totalCountsBySeverityMap = new HashMap<>();
public int getCustomerId() {
return customerId;
@@ -24,38 +20,20 @@ public class AlarmCounts extends BaseJsonModel {
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public Boolean getAcknowledged() {
return acknowledged;
}
public void setAcknowledged(Boolean acknowledged) {
this.acknowledged = acknowledged;
}
public Map<Long, Map<AlarmCode, AtomicInteger>> getCountsPerEquipmentIdMap() {
public Map<Long, Map<AlarmCode, AtomicInteger>> getCountsPerEquipmentIdMap() {
return countsPerEquipmentIdMap;
}
public void setCountsPerEquipmentIdMap(Map<Long, Map<AlarmCode, AtomicInteger>> countsPerEquipmentIdMap) {
this.countsPerEquipmentIdMap = countsPerEquipmentIdMap;
}
public Map<Long, AtomicInteger> getTotalCountsPerEquipmentIdMap() {
return totalCountsPerEquipmentIdMap;
}
public void setTotalCountsPerEquipmentIdMap(Map<Long, AtomicInteger> totalCountsPerEquipmentIdMap) {
this.totalCountsPerEquipmentIdMap = totalCountsPerEquipmentIdMap;
}
public Map<AlarmCode, AtomicInteger> getTotalCountsPerAlarmCodeMap() {
return totalCountsPerAlarmCodeMap;
}
public void setTotalCountsPerAlarmCodeMap(Map<AlarmCode, AtomicInteger> totalCountsPerAlarmCodeMap) {
this.totalCountsPerAlarmCodeMap = totalCountsPerAlarmCodeMap;
}
public Map<StatusCode, AtomicInteger> getTotalCountsBySeverityMap() {
return totalCountsBySeverityMap;
}
public void setTotalCountsBySeverityMap(Map<StatusCode, AtomicInteger> totalCountsBySeverityMap) {
this.totalCountsBySeverityMap = totalCountsBySeverityMap;
}
public void addToCounter(long equipmentId, AlarmCode alarmCode, int valueToAdd) {
public void addToCounter(long equipmentId, AlarmCode alarmCode, int valueToAdd) {
//update total counts
AtomicInteger totalCount = totalCountsPerAlarmCodeMap.get(alarmCode);
if (totalCount == null) {
@@ -64,23 +42,7 @@ public class AlarmCounts extends BaseJsonModel {
}
totalCount.addAndGet(valueToAdd);
//update total counts by severity
AtomicInteger totalBySeverityCount = totalCountsBySeverityMap.get(alarmCode.getSeverity());
if (totalBySeverityCount == null) {
totalBySeverityCount = new AtomicInteger();
totalCountsBySeverityMap.put(alarmCode.getSeverity(), totalBySeverityCount);
}
totalBySeverityCount.addAndGet(valueToAdd);
if(equipmentId>0) {
//update total counts by equipmentId
AtomicInteger totalEquipmentIdCount = totalCountsPerEquipmentIdMap.get(equipmentId);
if (totalEquipmentIdCount == null) {
totalEquipmentIdCount = new AtomicInteger();
totalCountsPerEquipmentIdMap.put(equipmentId, totalEquipmentIdCount);
}
totalEquipmentIdCount.addAndGet(valueToAdd);
//update per-equipmentId counts only for real equipmentIds
Map<AlarmCode, AtomicInteger> perEquipmentMap = countsPerEquipmentIdMap.get(equipmentId);
if(perEquipmentMap == null) {
@@ -88,7 +50,6 @@ public class AlarmCounts extends BaseJsonModel {
countsPerEquipmentIdMap.put(equipmentId, perEquipmentMap);
}
//update counts by equipmentId and alarmCode
AtomicInteger perEqCount = perEquipmentMap.get(alarmCode);
if(perEqCount == null) {
perEqCount = new AtomicInteger();
@@ -102,14 +63,6 @@ public class AlarmCounts extends BaseJsonModel {
public int getCounter(long equipmentId, AlarmCode alarmCode) {
if(equipmentId>0) {
if (alarmCode == null) {
AtomicInteger perEqTotalCount = totalCountsPerEquipmentIdMap.get(equipmentId);
if (perEqTotalCount == null) {
return 0;
}
return perEqTotalCount.get();
}
//get from per-equipmentId counts only for real equipmentIds
Map<AlarmCode, AtomicInteger> perEquipmentMap = countsPerEquipmentIdMap.get(equipmentId);
if(perEquipmentMap == null) {
@@ -135,12 +88,6 @@ public class AlarmCounts extends BaseJsonModel {
}
}
public int getSeverityCounter(StatusCode severity) {
AtomicInteger ret = totalCountsBySeverityMap.get(severity);
if (ret == null) {
return 0;
}
return ret.get();
}
}

View File

@@ -10,29 +10,10 @@ import com.telecominfraproject.wlan.systemevent.models.EquipmentEventWithPayload
public class AlarmAddedEvent extends EquipmentEventWithPayload<Alarm> {
private static final long serialVersionUID = 7142208487917559985L;
/**
* Constructor with current event time stamp
* @param alarm
*/
public AlarmAddedEvent(Alarm alarm){
super(alarm.getCustomerId(), alarm.getEquipmentId(), alarm);
super(alarm.getCustomerId(), alarm.getEquipmentId(), alarm.getLastModifiedTimestamp(), alarm);
}
/**
* Constructor with explicit event time stamp. This constructor is used to
* workaround the issue with how the System events are defined in the cassandra
* schema: No two events can have the same combination of
* customerId+equipmentId+dataType+eventTimestamp, so the application code must
* work around this limitation by creating unique event time stamps if 2
* alarms are raised at the same time.
*
* @param alarm
* @param eventTimestamp
*/
public AlarmAddedEvent(Alarm alarm, long eventTimestamp){
super(alarm.getCustomerId(), alarm.getEquipmentId(), eventTimestamp, alarm);
}
/**
* Constructor used by JSON
*/

View File

@@ -11,7 +11,7 @@ public class AlarmChangedEvent extends EquipmentEventWithPayload<Alarm> {
private static final long serialVersionUID = 7142209997917559985L;
public AlarmChangedEvent(Alarm alarm){
super(alarm.getCustomerId(), alarm.getEquipmentId(), alarm);
super(alarm.getCustomerId(), alarm.getEquipmentId(), alarm.getLastModifiedTimestamp(), alarm);
}
/**

View File

@@ -11,7 +11,7 @@ public class AlarmRemovedEvent extends EquipmentEventWithPayload<Alarm> {
private static final long serialVersionUID = 7142208488887559985L;
public AlarmRemovedEvent(Alarm alarm){
super(alarm.getCustomerId(), alarm.getEquipmentId(), alarm);
super(alarm.getCustomerId(), alarm.getEquipmentId(), System.currentTimeMillis(), alarm);
}
/**

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,7 +15,7 @@
<dependency>
<artifactId>alarm-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -3,6 +3,7 @@ package com.telecominfraproject.wlan.alarm;
import java.util.List;
import java.util.Set;
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;
@@ -109,9 +110,15 @@ public interface AlarmServiceInterface {
* @param customerId
* @param equipmentIdSet - if empty, then only total counts of all alarms for customer per alarm code will be counted
* @param alarmCodeSet - can be empty, in which case all alarm codes will be counted
* @param acknowledged - can be empty, in which case acknowledged would be ignored
* @return alarm counts for the given filters
*/
AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged);
AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet);
/**
* In some datastores (i.e. Cassandra) it makes sense to store counts of alarms in a separate table for fast retrieval by UI.
* Unfortunately, there are some situations where those counters get out of sync with the real alarm counts.
* This method is here to re-calculate the counter values and bring them in-sync with the real alarms.
*/
GenericResponse resetAlarmCounters() ;
}

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -16,13 +16,13 @@
<dependency>
<artifactId>alarm-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
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;
@@ -76,8 +77,12 @@ public class AlarmServiceLocal implements AlarmServiceInterface {
}
@Override
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged) {
return alarmController.getAlarmCounts(customerId, equipmentIdSet, alarmCodeSet, acknowledged);
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet) {
return alarmController.getAlarmCounts(customerId, equipmentIdSet, alarmCodeSet);
}
@Override
public GenericResponse resetAlarmCounters() {
return alarmController.resetAlarmCounters();
}
}

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,53 +15,41 @@
<dependency>
<artifactId>alarm-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>base-client</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- Dependencies for the unit tests -->
<dependency>
<artifactId>base-remote-tests</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>alarm-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>alarm-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-empty</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>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>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

View File

@@ -17,6 +17,7 @@ import com.telecominfraproject.wlan.alarm.models.AlarmCode;
import com.telecominfraproject.wlan.alarm.models.AlarmCounts;
import com.telecominfraproject.wlan.core.client.BaseRemoteClient;
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;
@@ -61,6 +62,22 @@ public class AlarmServiceRemote extends BaseRemoteClient implements AlarmService
return ret;
}
@Override
public GenericResponse resetAlarmCounters() {
LOG.debug("calling resetAlarmCounters ");
ResponseEntity<GenericResponse> responseEntity = restTemplate.postForEntity(
getBaseUrl() + "/resetCounts",
null, GenericResponse.class);
GenericResponse ret = responseEntity.getBody();
LOG.debug("completed resetAlarmCounters {} ", ret);
return ret;
}
@Override
public Alarm getOrNull(int customerId, long equipmentId, AlarmCode alarmCode, long createdTimestamp) {
@@ -120,9 +137,9 @@ public class AlarmServiceRemote extends BaseRemoteClient implements AlarmService
}
@Override
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged) {
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet) {
LOG.debug("getAlarmCounts({}, {}, {}, {})", customerId, equipmentIdSet, alarmCodeSet, acknowledged);
LOG.debug("getAlarmCounts({}, {}, {})", customerId, equipmentIdSet, alarmCodeSet);
String equipmentIdSetStr = null;
if (equipmentIdSet != null && !equipmentIdSet.isEmpty()) {
@@ -141,8 +158,8 @@ public class AlarmServiceRemote extends BaseRemoteClient implements AlarmService
}
ResponseEntity<AlarmCounts> responseEntity = restTemplate.exchange(
getBaseUrl() + "/counts?customerId={customerId}&equipmentIdSet={equipmentIdSetStr}&alarmCodeSet={alarmCodeSetStr}&acknowledged={acknowledged}", HttpMethod.GET,
null, AlarmCounts.class, customerId, equipmentIdSetStr, alarmCodeSetStr, acknowledged);
getBaseUrl() + "/counts?customerId={customerId}&equipmentIdSet={equipmentIdSetStr}&alarmCodeSet={alarmCodeSetStr}", HttpMethod.GET,
null, AlarmCounts.class, customerId, equipmentIdSetStr, alarmCodeSetStr);
AlarmCounts ret = responseEntity.getBody();
LOG.debug("completed getAlarmCounts {} ", ret);

View File

@@ -19,7 +19,6 @@ 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;
@@ -27,19 +26,13 @@ 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;
/**
* @author dtoptygin
@@ -50,16 +43,10 @@ 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");
@@ -517,10 +504,8 @@ public class AlarmServiceRemoteTest extends BaseRemoteTest {
public void testAlarmCountsRetrieval() {
//create some Alarms
Alarm mdl;
final int customerId_1 = getNextCustomerId();
final int customerId_2 = getNextCustomerId();
final long equipmentId_1 = createEquipmentObject(customerId_1).getId();
int customerId_1 = getNextCustomerId();
int customerId_2 = getNextCustomerId();
int apNameIdx = 0;
Set<Long> equipmentIds = new HashSet<>();
@@ -528,12 +513,11 @@ public class AlarmServiceRemoteTest extends BaseRemoteTest {
Set<Long> equipmentIds_AccessPointIsUnreachable = new HashSet<>();
for(int i = 0; i< 50; i++){
mdl = createAlarmObject(customerId_1, createEquipmentObject(customerId_1).getId());
mdl.setEquipmentId(createEquipmentObject(customerId_1).getId());
mdl = createAlarmObject();
mdl.setCustomerId(customerId_1);
mdl.setScopeId("qr_"+apNameIdx);
if((i%2) == 0) {
mdl.setAlarmCode(AlarmCode.CPUUtilization);
mdl.setAcknowledged(true);
equipmentIds_CPUUtilization.add(mdl.getEquipmentId());
} else {
equipmentIds_AccessPointIsUnreachable.add(mdl.getEquipmentId());
@@ -544,152 +528,70 @@ public class AlarmServiceRemoteTest extends BaseRemoteTest {
remoteInterface.create(mdl);
}
mdl = createAlarmObject(customerId_1, equipmentId_1);
mdl.setCustomerId(customerId_1);
mdl.setAlarmCode(AlarmCode.GenericError);
remoteInterface.create(mdl);
{
mdl = createAlarmObject();
mdl.setCustomerId(customerId_1);
mdl.setEquipmentId(0);
mdl.setAlarmCode(AlarmCode.GenericError);
remoteInterface.create(mdl);
}
for(int i = 0; i< 50; i++){
mdl = createAlarmObject(customerId_2, createEquipmentObject(customerId_2).getId());
mdl.setScopeId("qr_"+apNameIdx);
mdl.setAcknowledged(false);
mdl.setAlarmCode(AlarmCode.GenericError);
mdl = createAlarmObject();
mdl.setCustomerId(customerId_2);
mdl.setScopeId("qr_"+apNameIdx);
apNameIdx++;
remoteInterface.create(mdl);
}
Set<AlarmCode> alarmCodes = new HashSet<>(Arrays.asList(AlarmCode.AccessPointIsUnreachable, AlarmCode.GenericError, AlarmCode.CPUUtilization));
AlarmCounts alarmCounts = remoteInterface.getAlarmCounts(customerId_1, equipmentIds, alarmCodes, null);
AlarmCounts alarmCounts = remoteInterface.getAlarmCounts(customerId_1, equipmentIds, alarmCodes);
assertEquals(0, alarmCounts.getCounter(0, AlarmCode.GenericError));
assertEquals(25, alarmCounts.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(25, alarmCounts.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(25, alarmCounts.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(25, alarmCounts.getSeverityCounter(StatusCode.error));
equipmentIds_CPUUtilization.forEach(eqId -> assertEquals(1, alarmCounts.getCounter(eqId, AlarmCode.CPUUtilization)));
equipmentIds_AccessPointIsUnreachable.forEach(eqId -> assertEquals(1, alarmCounts.getCounter(eqId, AlarmCode.AccessPointIsUnreachable)) );
AlarmCounts alarmCounts_noEq = remoteInterface.getAlarmCounts(customerId_1, null, alarmCodes, null);
AlarmCounts alarmCounts_noEq = remoteInterface.getAlarmCounts(customerId_1, null, alarmCodes);
assertEquals(1, alarmCounts_noEq.getCounter(0, AlarmCode.GenericError));
assertEquals(25, alarmCounts_noEq.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(25, alarmCounts_noEq.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(25, alarmCounts_noEq.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(26, alarmCounts_noEq.getSeverityCounter(StatusCode.error));
assertTrue(alarmCounts_noEq.getCountsPerEquipmentIdMap().isEmpty());
assertEquals(3, alarmCounts_noEq.getTotalCountsPerAlarmCodeMap().size());
AlarmCounts alarmCounts_noEq_1code = remoteInterface.getAlarmCounts(customerId_1, null, Collections.singleton(AlarmCode.CPUUtilization), null);
AlarmCounts alarmCounts_noEq_1code = remoteInterface.getAlarmCounts(customerId_1, null, Collections.singleton(AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_noEq_1code.getCounter(0, AlarmCode.GenericError));
assertEquals(25, alarmCounts_noEq_1code.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_noEq_1code.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(25, alarmCounts_noEq_1code.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(0, alarmCounts_noEq_1code.getSeverityCounter(StatusCode.error));
assertTrue(alarmCounts_noEq_1code.getCountsPerEquipmentIdMap().isEmpty());
assertEquals(1, alarmCounts_noEq_1code.getTotalCountsPerAlarmCodeMap().size());
AlarmCounts alarmCounts_acknowledgedT = remoteInterface.getAlarmCounts(customerId_1, null, Collections.singleton(AlarmCode.CPUUtilization), true);
assertTrue(alarmCounts_acknowledgedT.getAcknowledged());
assertEquals(0, alarmCounts_acknowledgedT.getCounter(0, AlarmCode.GenericError));
assertEquals(25, alarmCounts_acknowledgedT.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_acknowledgedT.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(25, alarmCounts_acknowledgedT.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(0, alarmCounts_acknowledgedT.getSeverityCounter(StatusCode.error));
assertTrue(alarmCounts_acknowledgedT.getCountsPerEquipmentIdMap().isEmpty());
assertEquals(1, alarmCounts_acknowledgedT.getTotalCountsPerAlarmCodeMap().size());
AlarmCounts alarmCounts_acknowledgedF = remoteInterface.getAlarmCounts(customerId_1, null, Collections.singleton(AlarmCode.CPUUtilization), false);
assertFalse(alarmCounts_acknowledgedF.getAcknowledged());
assertEquals(0, alarmCounts_acknowledgedF.getCounter(0, AlarmCode.GenericError));
assertEquals(0, alarmCounts_acknowledgedF.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_acknowledgedF.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(0, alarmCounts_acknowledgedF.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(0, alarmCounts_acknowledgedF.getSeverityCounter(StatusCode.error));
assertTrue(alarmCounts_acknowledgedF.getCountsPerEquipmentIdMap().isEmpty());
assertEquals(0, alarmCounts_acknowledgedF.getTotalCountsPerAlarmCodeMap().size());
AlarmCounts alarmCounts_acknowledgedF2 = remoteInterface.getAlarmCounts(customerId_2, null, Collections.singleton(AlarmCode.GenericError), false);
assertFalse(alarmCounts_acknowledgedF2.getAcknowledged());
assertEquals(50, alarmCounts_acknowledgedF2.getCounter(0, AlarmCode.GenericError));
assertEquals(0, alarmCounts_acknowledgedF2.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_acknowledgedF2.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(0, alarmCounts_acknowledgedF2.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(50, alarmCounts_acknowledgedF2.getSeverityCounter(StatusCode.error));
assertTrue(alarmCounts_acknowledgedF2.getCountsPerEquipmentIdMap().isEmpty());
assertEquals(1, alarmCounts_acknowledgedF2.getTotalCountsPerAlarmCodeMap().size());
AlarmCounts alarmCounts_1Eq_1code = remoteInterface.getAlarmCounts(customerId_1, Collections.singleton(equipmentIds.iterator().next()), Collections.singleton(AlarmCode.CPUUtilization), null);
AlarmCounts alarmCounts_1Eq_1code = remoteInterface.getAlarmCounts(customerId_1, Collections.singleton(equipmentIds.iterator().next()), Collections.singleton(AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_1Eq_1code.getCounter(0, AlarmCode.GenericError));
assertEquals(1, alarmCounts_1Eq_1code.getCounter(equipmentIds.iterator().next(), AlarmCode.CPUUtilization));
assertEquals(1, alarmCounts_1Eq_1code.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(0, alarmCounts_1Eq_1code.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(1, alarmCounts_1Eq_1code.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(0, alarmCounts_1Eq_1code.getSeverityCounter(StatusCode.error));
assertEquals(1, alarmCounts_1Eq_1code.getCountsPerEquipmentIdMap().size());
assertEquals(1, alarmCounts_1Eq_1code.getTotalCountsPerAlarmCodeMap().size());
}
@Test
public void testAlarmCountsForSingleEquipment() {
//create some Alarms
Alarm mdl;
int customerId = getNextCustomerId();
long equipmentId = getNextEquipmentId();
mdl = createAlarmObject();
mdl.setCustomerId(customerId);
mdl.setEquipmentId(equipmentId);
mdl.setAlarmCode(AlarmCode.CPUUtilization);
remoteInterface.create(mdl);
mdl.setAlarmCode(AlarmCode.AccessPointIsUnreachable);
remoteInterface.create(mdl);
Set<AlarmCode> alarmCodes = new HashSet<>(Arrays.asList(AlarmCode.AccessPointIsUnreachable, AlarmCode.GenericError, AlarmCode.CPUUtilization));
AlarmCounts alarmCounts = remoteInterface.getAlarmCounts(customerId, Collections.singleton(equipmentId), alarmCodes, null);
assertEquals(0, alarmCounts.getCounter(0, AlarmCode.GenericError));
assertEquals(1, alarmCounts.getCounter(0, AlarmCode.CPUUtilization));
assertEquals(1, alarmCounts.getCounter(0, AlarmCode.AccessPointIsUnreachable));
assertEquals(2, alarmCounts.getCounter(equipmentId, null));
assertEquals(1, alarmCounts.getSeverityCounter(StatusCode.requiresAttention));
assertEquals(1, alarmCounts.getSeverityCounter(StatusCode.error));
//clean up after the test
remoteInterface.delete(customerId, equipmentId);
}
private Alarm createAlarmObject() {
int customerId = getNextCustomerId();
return createAlarmObject(customerId, createEquipmentObject(customerId).getId());
}
private Alarm createAlarmObject(int customerId, long equipmentId) {
Alarm result = new Alarm();
result.setCustomerId(customerId);
Alarm result = new Alarm();
result.setCustomerId(getNextCustomerId());
result.setEquipmentId(getNextEquipmentId());
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

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,46 +15,29 @@
<dependency>
<artifactId>base-container</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-datastore-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.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>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
@@ -62,7 +45,7 @@
<dependency>
<artifactId>cloud-event-dispatcher-empty</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

View File

@@ -16,11 +16,11 @@ import org.springframework.web.bind.annotation.RestController;
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherInterface;
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;
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;
@@ -49,7 +49,6 @@ public class AlarmController {
@Autowired private AlarmDatastore alarmDatastore;
@Autowired private CloudEventDispatcherInterface cloudEventDispatcher;
@Autowired private EquipmentServiceInterface equipmentServiceInterface;
/**
@@ -68,18 +67,9 @@ 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) {
ts = System.currentTimeMillis();
long ts = System.currentTimeMillis();
if (alarm.getCreatedTimestamp() == 0) {
alarm.setCreatedTimestamp(ts);
}
alarm.setLastModifiedTimestamp(ts);
@@ -88,9 +78,10 @@ public class AlarmController {
LOG.debug("Created Alarm {}", ret);
AlarmAddedEvent event = new AlarmAddedEvent(ret, ts);
AlarmAddedEvent event = new AlarmAddedEvent(ret);
publishEvent(event);
return ret;
}
@@ -243,17 +234,22 @@ public class AlarmController {
@RequestMapping(value = "/counts", method = RequestMethod.GET)
public AlarmCounts getAlarmCounts(@RequestParam int customerId,
@RequestParam Set<Long> equipmentIdSet,
@RequestParam Set<AlarmCode> alarmCodeSet,
@RequestParam Boolean acknowledged) {
@RequestParam Set<AlarmCode> alarmCodeSet) {
LOG.debug("Getting Alarm counts for {} {} {} {}", customerId, equipmentIdSet, alarmCodeSet, acknowledged);
LOG.debug("Getting Alarm counts for {} {} {}", customerId, equipmentIdSet, alarmCodeSet);
AlarmCounts ret = alarmDatastore.getAlarmCounts(customerId, equipmentIdSet, alarmCodeSet, acknowledged);
AlarmCounts ret = alarmDatastore.getAlarmCounts(customerId, equipmentIdSet, alarmCodeSet);
LOG.debug("Alarm counts: {}", ret);
return ret;
}
@RequestMapping(value = "/resetCounts", method = RequestMethod.POST)
public GenericResponse resetAlarmCounters() {
alarmDatastore.resetAlarmCounters();
return new GenericResponse(true, "");
}
private void publishEvent(SystemEvent event) {
if (event == null) {
return;

View File

@@ -262,17 +262,11 @@ components:
customerId:
type: integer
format: int32
acknowledged:
type: boolean
countsPerEquipmentIdMap:
$ref: '#/components/schemas/CountsPerEquipmentIdPerAlarmCodeMap'
totalCountsPerAlarmCodeMap:
$ref: '#/components/schemas/CountsPerAlarmCodeMap'
totalCountsPerEquipmentIdMap:
$ref: '#/components/schemas/CountsPerEquipmentIdMap'
totalCountsBySeverityMap:
$ref: '#/components/schemas/CountsBySeverityMap'
CountsPerAlarmCodeMap:
description: map of AlarmCode to the integer count of alarms
type: object
@@ -285,20 +279,6 @@ components:
type: object
additionalProperties:
$ref: '#/components/schemas/CountsPerAlarmCodeMap'
CountsPerEquipmentIdMap:
description: map of equipmentId to integer count of alarms
type: object
additionalProperties:
type: integer
format: int32
CountsBySeverityMap:
description: map of severity to integer count of alarms
type: object
additionalProperties:
type: integer
format: int32
#
# Other related objects
@@ -649,12 +629,6 @@ paths:
type: array
items:
$ref: '#/components/schemas/AlarmCode'
- name: acknowledged
in: query
description: Acknowledged flag
required: true
schema:
type: boolean
responses:
200:
description: successful operation

View File

@@ -17,11 +17,7 @@ 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;
@@ -43,14 +39,10 @@ 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
@@ -67,9 +59,8 @@ public class AlarmControllerTest {
//Create new Alarm - success
Alarm alarm = new Alarm();
int customerId = (int) testSequence.getAndIncrement();
alarm.setCustomerId(customerId);
alarm.setEquipmentId(createEquipmentObject(customerId).getId());
alarm.setCustomerId((int) testSequence.getAndIncrement());
alarm.setEquipmentId(testSequence.getAndIncrement());
alarm.setAlarmCode(AlarmCode.AccessPointIsUnreachable);
alarm.setCreatedTimestamp(System.currentTimeMillis());
@@ -100,14 +91,5 @@ 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

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>all-cloud-and-opensync-gw-in-one-docker</artifactId>
@@ -22,7 +22,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>all-cloud-and-opensync-gw-in-one-process</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -57,9 +57,6 @@ OVSDB_DEVICE_RADIO_1="${OVSDB_DEVICE_RADIO_1:=radio1}"
echo $OVSDB_DEVICE_RADIO_1
OVSDB_DEVICE_RADIO_2="${OVSDB_DEVICE_RADIO_2:=radio2}"
echo $OVSDB_DEVICE_RADIO_2
OVSDB_OFF_CHANNEL_REPORTING_INTERVAL_SECONDS="${OVSDB_OFF_CHANNEL_REPORTING_INTERVAL_SECONDS:=120}"
OVSDB_REPORTING_INTERVAL_SECONDS="${OVSDB_REPORTING_INTERVAL_SECONDS:=60}"
echo Reading AP configuration from $OVSDB_CONFIG_FILE
@@ -153,8 +150,6 @@ OVSDB_PROPS="$OVSDB_PROPS -Dtip.wlan.ovsdb.wifi-iface.default_radio2=$OVSDB_IF_D
OVSDB_PROPS="$OVSDB_PROPS -Dtip.wlan.ovsdb.wifi-device.radio0=$OVSDB_DEVICE_RADIO_0"
OVSDB_PROPS="$OVSDB_PROPS -Dtip.wlan.ovsdb.wifi-device.radio1=$OVSDB_DEVICE_RADIO_1"
OVSDB_PROPS="$OVSDB_PROPS -Dtip.wlan.ovsdb.wifi-device.radio2=$OVSDB_DEVICE_RADIO_2"
OVSDB_PROPS="$OVSDB_PROPS -Dtip.wlan.defaultOffChannelReportingIntervalSeconds=$OVSDB_OFF_CHANNEL_REPORTING_INTERVAL_SECONDS"
OVSDB_PROPS="$OVSDB_PROPS -Dtip.wlan.defaultReportingIntervalSeconds=$OVSDB_REPORTING_INTERVAL_SECONDS"
echo OVSDB_PROPS $OVSDB_PROPS

View File

@@ -39,8 +39,6 @@ OVSDB_PROPS+=" -Dtip.wlan.ovsdb.wifi-iface.default_radio2=$OVSDB_IF_DEFAULT_RADI
OVSDB_PROPS+=" -Dtip.wlan.ovsdb.wifi-device.radio0=$OVSDB_DEVICE_RADIO_0"
OVSDB_PROPS+=" -Dtip.wlan.ovsdb.wifi-device.radio1=$OVSDB_DEVICE_RADIO_1"
OVSDB_PROPS+=" -Dtip.wlan.ovsdb.wifi-device.radio2=$OVSDB_DEVICE_RADIO_2"
OVSDB_PROPS+=" -Dtip.wlan.defaultOffChannelReportingIntervalSeconds=$OVSDB_OFF_CHANNEL_REPORTING_INTERVAL_SECONDS"
OVSDB_PROPS+=" -Dtip.wlan.defaultReportingIntervalSeconds=$OVSDB_REPORTING_INTERVAL_SECONDS"
echo OVSDB_PROPS $OVSDB_PROPS

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -21,344 +21,350 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>opensync-ext-cloud</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- PortForwarding Gateway - to support remote ssh connections to APs -->
<dependency>
<artifactId>port-forwarding-gateway</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- portal services -->
<dependency>
<artifactId>webtoken-auth-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-services</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>customer-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>location-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>profile-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-user-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>status-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>routing-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>firmware-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>manufacturer-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>filestore-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- prov services -->
<dependency>
<artifactId>customer-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>customer-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>location-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>location-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>equipment-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>profile-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>profile-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-user-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>portal-user-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>firmware-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>firmware-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>manufacturer-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>manufacturer-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>adoption-metrics-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- ssc services -->
<dependency>
<artifactId>cloud-event-dispatcher</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>service-metric-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>system-event-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>alarm-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>status-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>status-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>client-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>routing-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>routing-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- Stream Processors -->
<dependency>
<artifactId>single-process-streams</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>provisioning-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>dashboard-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-alarms-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-gateway-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -23,7 +23,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>all-cloud-in-one-process-with-persistence</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -23,7 +23,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>all-cloud-in-one-process</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -22,244 +22,322 @@
<dependency>
<artifactId>webtoken-auth-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-services</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>customer-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>location-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>profile-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-user-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>status-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>routing-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>firmware-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>manufacturer-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>filestore-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- prov services -->
<dependency>
<artifactId>customer-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>customer-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>location-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>location-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>profile-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>profile-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-user-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-user-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>firmware-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>firmware-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>manufacturer-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>manufacturer-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- ssc services -->
<dependency>
<artifactId>cloud-event-dispatcher</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>status-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>status-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>routing-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>routing-datastore-rdbms</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- Stream Processors -->
<dependency>
<artifactId>single-process-streams</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>provisioning-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>dashboard-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-alarms-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-gateway-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -21,337 +21,343 @@
<dependency>
<artifactId>webtoken-auth-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-services</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>customer-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>location-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>profile-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-user-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>status-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>routing-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>firmware-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>manufacturer-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>filestore-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- prov services -->
<dependency>
<artifactId>customer-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>customer-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>location-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>location-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>equipment-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>profile-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>profile-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-user-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>portal-user-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>firmware-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>firmware-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>manufacturer-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>manufacturer-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>adoption-metrics-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- ssc services -->
<dependency>
<artifactId>cloud-event-dispatcher</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>service-metric-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>system-event-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>alarm-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>status-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>status-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>client-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>routing-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<!-- Use in-memory DS for now, later switch to RDBMS -->
<artifactId>routing-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- Stream Processors -->
<dependency>
<artifactId>single-process-streams</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>provisioning-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>dashboard-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-alarms-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-sp</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-gateway-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>port-forwarding-gateway-local</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1,10 +1,11 @@
package com.telecominfraproject.wlan.startuptasks;
import java.io.IOException;
import java.io.BufferedWriter;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -324,6 +325,12 @@ public class AllInOneStartListener implements ApplicationRunner {
rfConfig.getRfConfigMap().forEach((x, y) -> y.setRf("TipWlan-rf"));
profileRf.setDetails(rfConfig);
profileRf = profileServiceInterface.create(profileRf);
// create userlist file
Path path = constructCaptivePortalUserList();
LOG.debug("Path to userlist {}", path);
// Captive portal profile
Profile profileCaptivePortal = new Profile();
profileCaptivePortal.setCustomerId(customer.getId());
@@ -337,15 +344,19 @@ public class AllInOneStartListener implements ApplicationRunner {
ManagedFileInfo backgroundFile = new ManagedFileInfo();
backgroundFile.setFileCategory(FileCategory.CaptivePortalBackground);
backgroundFile.setFileType(FileType.PNG);
backgroundFile.setApExportUrl("tip-logo.png");
backgroundFile.setApExportUrl("/filestore/tip-logo.png");
ManagedFileInfo logoFile = new ManagedFileInfo();
logoFile.setFileCategory(FileCategory.CaptivePortalLogo);
logoFile.setFileType(FileType.PNG);
logoFile.setApExportUrl("tip-logo-mobile.png");
logoFile.setApExportUrl("/filestore/tip-logo-mobile.png");
ManagedFileInfo usernamePasswordFile = new ManagedFileInfo();
usernamePasswordFile.setFileCategory(FileCategory.UsernamePasswordList);
usernamePasswordFile.setFileType(FileType.TEXT);
usernamePasswordFile.setApExportUrl("/filestore/userlist.txt");
captivePortalConfig.setUsernamePasswordFile(usernamePasswordFile);
captivePortalConfig.setBackgroundFile(backgroundFile);
captivePortalConfig.setLogoFile(logoFile);
captivePortalConfig.setBrowserTitle(profileCaptivePortal.getName());
captivePortalConfig.setUserList(constructCaptivePortalUserList());
profileCaptivePortal.setDetails(captivePortalConfig);
profileCaptivePortal = profileServiceInterface.create(profileCaptivePortal);
@@ -846,7 +857,7 @@ public class AllInOneStartListener implements ApplicationRunner {
return hotspot20IdProviderProfile;
}
protected List<TimedAccessUserRecord> constructCaptivePortalUserList() {
protected Path constructCaptivePortalUserList() {
List<TimedAccessUserRecord> userList = new ArrayList<>();
@@ -931,24 +942,22 @@ public class AllInOneStartListener implements ApplicationRunner {
try {
Files.deleteIfExists(path);
} catch (Exception e) {
LOG.error("Cannot delete {}", path, e);
e.printStackTrace();
}
StringBuilder sb = new StringBuilder();
for (TimedAccessUserRecord userRecord : userList) {
byte[] bytes = ("username=" + userRecord.getUsername() + ", password=" + userRecord.getPassword()
sb.append("username=" + userRecord.getUsername() + ", password=" + userRecord.getPassword()
+ ", firstname=" + userRecord.getUserDetails().getFirstName() + ", lastname="
+ userRecord.getUserDetails().getLastName() + System.lineSeparator()).getBytes();
try {
Files.write(path, bytes, StandardOpenOption.APPEND);
LOG.debug("Successfully written data to the file {}", path);
} catch (IOException e) {
try {
Files.write(path, bytes);
} catch (IOException e1) {
throw new RuntimeException(e1);
}
}
+ userRecord.getUserDetails().getLastName() + System.lineSeparator());
}
return userList;
try (BufferedWriter bw = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.CREATE_NEW)) {
bw.write(sb.toString());
System.out.println("Successfully written data to the file");
} catch (Exception e) {
e.printStackTrace();
}
return path;
}
private void createFirmwareObjects(Customer customer) {
@@ -1502,19 +1511,19 @@ public class AllInOneStartListener implements ApplicationRunner {
status.setDetails(eqRadioUtilReport);
statusList.add(status);
status = new Status();
status.setCustomerId(equipment.getCustomerId());
status.setEquipmentId(equipment.getId());
EquipmentChannelStatusData eqChannelStatus = new EquipmentChannelStatusData();
Map<RadioType, Integer> channelStatusDataMap = new EnumMap<>(RadioType.class);
channelStatusDataMap.put(RadioType.is2dot4GHz, 6);
channelStatusDataMap.put(RadioType.is5GHzL, 36);
channelStatusDataMap.put(RadioType.is5GHzU, 157);
eqChannelStatus.setChannelNumberStatusDataMap(channelStatusDataMap);
status.setDetails(eqChannelStatus);
statusList.add(status);

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,26 +15,26 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-cassandra</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-datastore-interface</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-cassandra-tests</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-datastore-common-test</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

View File

@@ -12,7 +12,6 @@ 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;
@@ -46,12 +45,6 @@ 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);
@@ -87,12 +80,6 @@ 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) {
@@ -109,13 +96,6 @@ 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

@@ -410,7 +410,7 @@ public class ClientSessionDAO {
queryArgs.addAll(equipmentIds);
query += "and equipmentId in " + CassandraUtils.getBindPlaceholders(equipmentIds);
query_head = "select macAddress, equipmentId from client_session_by_equipment where customerId = ? ";
query_head = "select macAddress from client_session_by_equipment where customerId = ? ";
filterOptions = FilterOptions.customer_and_equipment;
}
@@ -425,7 +425,7 @@ public class ClientSessionDAO {
}
query = " locationId in " + CassandraUtils.getBindPlaceholders(locationIds) + query;
query_head = "select macAddress, equipmentId from client_session_by_location where ";
query_head = "select macAddress from client_session_by_location where ";
filterOptions = FilterOptions.customer_and_location;
}
@@ -435,7 +435,7 @@ public class ClientSessionDAO {
queryArgs.clear();
queryArgs.add(customerId);
queryArgs.add("%" + macSubstring.toLowerCase() + "%");
query_head = "select macAddress, equipmentId from client_session_by_mac where customerId = ? ";
query_head = "select macAddress from client_session_by_mac where customerId = ? ";
if (locationIds != null && !locationIds.isEmpty()) {
queryArgs.addAll(locationIds);
@@ -443,7 +443,7 @@ public class ClientSessionDAO {
}
if (equipmentIds != null && !equipmentIds.isEmpty()) {
queryArgs.addAll(equipmentIds);
query_head = "select macAddress, equipmentId from client_session_by_mac_and_equipment where customerId = ? ";
query_head = "select macAddress from client_session_by_mac_and_equipment where customerId = ? ";
}
query = " and macAddressString like ? " + query + " allow filtering";
@@ -494,25 +494,28 @@ public class ClientSessionDAO {
case customer_and_equipment:
case customer_and_location:
case customer_and_macAddress:
//the query was against client_session_by_equipment, client_session_by_location, or client_session_by_mac(_and_equipment) table
//find all the macAddresses and equipmentId for the page, then retrieve records for them from client_session table
//the query was against client_session_by_equipment or client_session_by_location table
//find all the macAddresses for the page, then retrieve records for them from client_session table
Set<MacAddress> macAddrSet = new HashSet<>();
while (rs.getAvailableWithoutFetching() > 0) {
Row row = rs.one();
MacAddress macAddr = new MacAddress(row.getLong("macAddress"));
long eqId = row.getLong("equipmentId");
// get a single client session per customerId, returned equipmentId, and returned macAddress from filter tables
ClientSession retSession = getSessionOrNull(customerId, eqId, macAddr);
if (retSession != null
&& (locationIds == null || locationIds.isEmpty() || locationIds.contains(retSession.getLocationId()))
&& (equipmentIds == null || equipmentIds.isEmpty() || equipmentIds.contains(retSession.getEquipmentId()))
&& (macSubstring == null || macSubstring.isEmpty() || retSession.getMacAddress().getAddressAsString().toLowerCase().contains(macSubstring.toLowerCase()))
)
{
pageItems.add(retSession);
}
macAddrSet.add(new MacAddress(rs.one().getLong("macAddress")));
}
//get all the sessions for the involved mac addresses
List<ClientSession> pageSessions = getSessions(customerId, macAddrSet);
//apply local filtering because retrieved sessions may be from different equipments and locations
pageSessions.forEach(cs -> {
//apply locationId and equipmentId filtering in here
if ((locationIds == null || locationIds.isEmpty() || locationIds.contains(cs.getLocationId()))
&& (equipmentIds == null || equipmentIds.isEmpty() || equipmentIds.contains(cs.getEquipmentId()))
&& (macSubstring == null || macSubstring.isEmpty() || cs.getMacAddress().getAddressAsString().toLowerCase().contains(macSubstring.toLowerCase()))
)
{
pageItems.add(cs);
}
});
break;
default:
LOG.warn("Unknown filter option:", filterOptions);

View File

@@ -26,8 +26,7 @@ CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_by_mac_string (
PRIMARY KEY (customerId, macAddressString)
) WITH comment='Index Table to look up wireless client details by macAddress in text form used by TIP WLAN CloudSDK';
DROP INDEX IF EXISTS tip_wlan_keyspace.idx_client_macAddressString;
CREATE CUSTOM INDEX IF NOT EXISTS idx_client_macAddressString_nonTokenizing ON tip_wlan_keyspace.client_by_mac_string (macAddressString) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};
CREATE CUSTOM INDEX IF NOT EXISTS idx_client_macAddressString ON tip_wlan_keyspace.client_by_mac_string (macAddressString) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', 'case_sensitive': 'false'};
CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session (
@@ -42,8 +41,8 @@ CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session (
details blob,
PRIMARY KEY ((customerId, macAddress), equipmentId)
) WITH comment='Wireless client sessions used by TIP WLAN CloudSDK. Records automatically expire after 24 hours'
AND default_time_to_live = 86400;
) WITH comment='Wireless client sessions used by TIP WLAN CloudSDK. Records automatically expire after 30 days'
AND default_time_to_live = 2592000;
CREATE INDEX IF NOT EXISTS idx_client_session_customerId ON tip_wlan_keyspace.client_session (customerId);
@@ -53,8 +52,8 @@ CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session_by_equipment (
macAddress bigint ,
PRIMARY KEY ((customerId, equipmentId), macAddress)
) WITH comment='Index Table to look up wireless client sessions by equipmentId used by TIP WLAN CloudSDK. Records automatically expire after 24 hours'
AND default_time_to_live = 86400;
) WITH comment='Index Table to look up wireless client sessions by equipmentId used by TIP WLAN CloudSDK. Records automatically expire after 30 days'
AND default_time_to_live = 2592000;
CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session_by_location (
customerId int,
@@ -63,8 +62,8 @@ CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session_by_location (
macAddress bigint,
PRIMARY KEY ((locationId), equipmentId, macAddress)
) WITH comment='Index Table to look up wireless client sessions by location and equipment used by TIP WLAN CloudSDK. Records automatically expire after 24 hours'
AND default_time_to_live = 86400;
) WITH comment='Index Table to look up wireless client sessions by location and equipment used by TIP WLAN CloudSDK. Records automatically expire after 30 days'
AND default_time_to_live = 2592000;
CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session_by_mac (
customerId int,
@@ -74,8 +73,8 @@ CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session_by_mac (
macAddressString text,
PRIMARY KEY ((macAddress), locationId, equipmentId, macAddressString)
) WITH comment='Index Table to look up wireless client sessions by macAddressString, location, and equipment by TIP WLAN CloudSDK. Records automatically expire after 24 hours'
AND default_time_to_live = 86400;
) WITH comment='Index Table to look up wireless client sessions by macAddressString, location, and equipment by TIP WLAN CloudSDK. Records automatically expire after 30 days'
AND default_time_to_live = 2592000;
CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session_by_mac_and_equipment (
customerId int,
@@ -85,11 +84,8 @@ CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session_by_mac_and_equipment
macAddressString text,
PRIMARY KEY ((macAddress), equipmentId, locationId, macAddressString)
) WITH comment='Index Table to look up wireless client sessions by macAddressString, location, and equipment by TIP WLAN CloudSDK. Records automatically expire after 24 hours'
AND default_time_to_live = 86400;
) WITH comment='Index Table to look up wireless client sessions by macAddressString, location, and equipment by TIP WLAN CloudSDK. Records automatically expire after 30 days'
AND default_time_to_live = 2592000;
DROP INDEX IF EXISTS tip_wlan_keyspace.idx_client_session_by_mac_macAddressString;
DROP INDEX IF EXISTS tip_wlan_keyspace.idx_client_session_by_mac_and_equipment_macAddressString;
CREATE CUSTOM INDEX IF NOT EXISTS idx_client_session_by_mac_macAddressString_nonTokenizing ON tip_wlan_keyspace.client_session_by_mac (macAddressString) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};
CREATE CUSTOM INDEX IF NOT EXISTS idx_client_session_by_mac_and_equipment_macAddressString_nonTokenizing ON tip_wlan_keyspace.client_session_by_mac_and_equipment (macAddressString) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};
CREATE CUSTOM INDEX IF NOT EXISTS idx_client_session_by_mac_macAddressString ON tip_wlan_keyspace.client_session_by_mac (macAddressString) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', 'case_sensitive': 'false'};
CREATE CUSTOM INDEX IF NOT EXISTS idx_client_session_by_mac_and_equipment_macAddressString ON tip_wlan_keyspace.client_session_by_mac_and_equipment (macAddressString) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', 'case_sensitive': 'false'};

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,7 +15,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-datastore-interface</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>

View File

@@ -973,63 +973,6 @@ public abstract class BaseClientDatastoreTest {
return new ArrayList<>(Arrays.asList(new String[]{"qr_49", "qr_48", "qr_47", "qr_46", "qr_45", "qr_44", "qr_43", "qr_42", "qr_41", "qr_40" }));
}
@Test
public void testClientSessionPaginationMaxItems()
{
//create 100 Client sessions
ClientSession mdl;
int customerId = (int) testSequence.incrementAndGet();
long locationId = testSequence.incrementAndGet();
int apNameIdx = 0;
List<ClientSession> sessionsToCreate = new ArrayList<>();
for(int i = 0; i< 10; i++){
mdl = new ClientSession();
mdl.setCustomerId(customerId);
mdl.setLocationId(locationId);
mdl.setEquipmentId(testSequence.incrementAndGet());
mdl.setMacAddress(new MacAddress("A1:FF:FF:FF:FF:FF"));
ClientSessionDetails details = new ClientSessionDetails();
details.setApFingerprint("qr_"+apNameIdx);
mdl.setDetails(details );
apNameIdx++;
sessionsToCreate.add(mdl);
}
List<ClientSession> createdList = testInterface.updateSessions(sessionsToCreate);
List<ClientSessionDetails> createdDetailsList = new ArrayList<>();
List<ClientSessionDetails> detailsToCreateList = new ArrayList<>();
sessionsToCreate.forEach(s -> detailsToCreateList.add(s.getDetails()));
createdList.forEach(s -> createdDetailsList.add(s.getDetails()));
assertEquals(detailsToCreateList, createdDetailsList);
PaginationContext<ClientSession> context = new PaginationContext<>(5);
PaginationResponse<ClientSession> page1 = testInterface.getSessionsForCustomer(customerId, null, new HashSet<Long>(Arrays.asList(locationId)), null, Collections.emptyList(), context);
assertEquals(5, page1.getItems().size());
page1 = testInterface.getSessionsForCustomer(customerId, null, null, "A1", Collections.emptyList(), context);
assertEquals(5, page1.getItems().size());
context = new PaginationContext<>(10);
page1 = testInterface.getSessionsForCustomer(customerId, null, new HashSet<Long>(Arrays.asList(locationId)), null, Collections.emptyList(), context);
assertEquals(10, page1.getItems().size());
context = new PaginationContext<>(20);
page1 = testInterface.getSessionsForCustomer(customerId, null, new HashSet<Long>(Arrays.asList(locationId)), null, Collections.emptyList(), context);
assertEquals(10, page1.getItems().size());
createdList.forEach(c -> testInterface.deleteSession(c.getCustomerId(), c.getEquipmentId(), c.getMacAddress()));
}
protected ClientSession createClientSessionObject() {
ClientSession result = new ClientSession();

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,19 +15,19 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-datastore-inmemory</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-datastore-interface</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-datastore-common-test</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -3,7 +3,6 @@ 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;
@@ -16,7 +15,6 @@ 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;
@@ -158,11 +156,6 @@ 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) {
@@ -369,10 +362,6 @@ 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) {
@@ -514,56 +503,4 @@ public class ClientDatastoreInMemory extends BaseInMemoryDatastore implements Cl
return ret;
}
@Override
public ClientSessionCounts getSessionCounts(int customerId) {
ClientSessionCounts counts = new ClientSessionCounts();
counts.setCustomerId(customerId);
long totalCount = 0;
Map<String, Long> perEquipmentMap = new HashMap<>();
Map<String, Long> perOuiMap = new HashMap<>();
Map<String, Long> perRadioMap = new HashMap<>();
for (ClientSession session : idToClientSessionMap.values()) {
if (session.getCustomerId() == customerId) {
totalCount++;
String equipmentIdString = Long.toString(session.getEquipmentId());
Long cnt = perEquipmentMap.get(equipmentIdString);
if (cnt == null) {
cnt = 0L;
} else {
cnt++;
}
perEquipmentMap.put(equipmentIdString, cnt);
if (session.getOui() != null) {
cnt = perOuiMap.get(session.getOui());
if (cnt == null) {
cnt = 0L;
} else {
cnt++;
}
perOuiMap.put(session.getOui(), cnt);
}
if (session.getDetails() != null && session.getDetails().getRadioType() != null) {
String radioTypeString = session.getDetails().getRadioType().toString();
cnt = perRadioMap.get(radioTypeString);
if (cnt == null) {
cnt = 0L;
} else {
cnt++;
}
perRadioMap.put(radioTypeString, cnt);
}
}
}
counts.setTotalCount(totalCount);
counts.setEquipmentCounts(perEquipmentMap);
counts.setOuiCounts(perOuiMap);
counts.setRadioCounts(perRadioMap);
return counts;
}
}

View File

@@ -1 +0,0 @@
/target/

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
@@ -15,12 +15,12 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-models</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>1.2.0-SNAPSHOT</version>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -4,7 +4,6 @@ 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;
@@ -22,7 +21,6 @@ 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.
@@ -74,7 +72,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.
*
@@ -106,12 +104,5 @@ 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,43 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>client-datastore-rdbms</artifactId>
<name>client-datastore-rdbms</name>
<description>SQL implementation of the data store</description>
<dependencies>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-jdbc</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-datastore-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-jdbc-tests</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-datastore-common-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,493 @@
package com.telecominfraproject.wlan.client.datastore.rdbms;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.telecominfraproject.wlan.client.info.models.ClientInfoDetails;
import com.telecominfraproject.wlan.client.models.Client;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
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.core.server.jdbc.BaseJdbcDao;
import com.telecominfraproject.wlan.datastore.exceptions.DsConcurrentModificationException;
import com.telecominfraproject.wlan.datastore.exceptions.DsDuplicateEntityException;
import com.telecominfraproject.wlan.datastore.exceptions.DsEntityNotFoundException;
/**
* @author dtoptygin
*
*/
@Repository
@Transactional(propagation = Propagation.MANDATORY)
public class ClientDAO extends BaseJdbcDao {
private static final Logger LOG = LoggerFactory.getLogger(ClientDatastoreRdbms.class);
private static final String COL_ID = "macAddress";
private static final String[] GENERATED_KEY_COLS = { };
private static final String[] ALL_COLUMNS_LIST = {
COL_ID,
"macAddressString",
//TODO: add colums from properties Client in here
"customerId",
"details",
//make sure the order of properties matches this list and list in ClientRowMapper and list in create/update methods
"createdTimestamp",
"lastModifiedTimestamp"
};
private static final Set<String> columnsToSkipForInsert = new HashSet<>(Arrays.asList());
private static final Set<String> columnsToSkipForUpdate = new HashSet<>(Arrays.asList(COL_ID, "macAddressString", "createdTimestamp", "customerId"));
private static final String TABLE_NAME = "client";
private static final String TABLE_PREFIX = "c.";
private static final String ALL_COLUMNS;
private static final Set<String> ALL_COLUMNS_LOWERCASE = new HashSet<>();
@SuppressWarnings("unused")
//use this for queries where multiple tables are involved
private static final String ALL_COLUMNS_WITH_PREFIX;
private static final String ALL_COLUMNS_FOR_INSERT;
private static final String BIND_VARS_FOR_INSERT;
private static final String ALL_COLUMNS_UPDATE;
static{
StringBuilder strbAllColumns = new StringBuilder(1024);
StringBuilder strbAllColumnsWithPrefix = new StringBuilder(1024);
StringBuilder strbAllColumnsForInsert = new StringBuilder(1024);
StringBuilder strbBindVarsForInsert = new StringBuilder(128);
StringBuilder strbColumnsForUpdate = new StringBuilder(512);
for(String colName: ALL_COLUMNS_LIST){
ALL_COLUMNS_LOWERCASE.add(colName.toLowerCase());
strbAllColumns.append(colName).append(",");
strbAllColumnsWithPrefix.append(TABLE_PREFIX).append(colName).append(",");
if(!columnsToSkipForInsert.contains(colName)){
strbAllColumnsForInsert.append(colName).append(",");
strbBindVarsForInsert.append("?,");
}
if(!columnsToSkipForUpdate.contains(colName)){
strbColumnsForUpdate.append(colName).append("=?,");
}
}
// remove trailing ','
strbAllColumns.deleteCharAt(strbAllColumns.length() - 1);
strbAllColumnsWithPrefix.deleteCharAt(strbAllColumnsWithPrefix.length() - 1);
strbAllColumnsForInsert.deleteCharAt(strbAllColumnsForInsert.length() - 1);
strbBindVarsForInsert.deleteCharAt(strbBindVarsForInsert.length() - 1);
strbColumnsForUpdate.deleteCharAt(strbColumnsForUpdate.length() - 1);
ALL_COLUMNS = strbAllColumns.toString();
ALL_COLUMNS_WITH_PREFIX = strbAllColumnsWithPrefix.toString();
ALL_COLUMNS_FOR_INSERT = strbAllColumnsForInsert.toString();
BIND_VARS_FOR_INSERT = strbBindVarsForInsert.toString();
ALL_COLUMNS_UPDATE = strbColumnsForUpdate.toString();
}
private static final String SQL_GET_BY_ID =
"select " + ALL_COLUMNS +
" from "+TABLE_NAME+" " +
" where customerId = ? and " + COL_ID + " = ?";
private static final String SQL_GET_BY_CUSTOMER_ID =
"select " + ALL_COLUMNS +
" from " + TABLE_NAME + " " +
" where customerId = ? ";
private static final String SQL_GET_BLOCKED_CLIENTS = "select " + ALL_COLUMNS_WITH_PREFIX +
" from " + TABLE_NAME + " c , client_blocklist cb " +
" where cb.customerId = ? and c.customerId = cb.customerId and c.macAddress = cb.macAddress ";
private static final String SQL_GET_LASTMOD_BY_ID =
"select lastModifiedTimestamp " +
" from "+TABLE_NAME+" " +
" where customerId = ? and " + COL_ID + " = ?";
private static final String SQL_INSERT =
"insert into "+TABLE_NAME+" ( "
+ ALL_COLUMNS_FOR_INSERT
+ " ) values ( "+BIND_VARS_FOR_INSERT+" ) ";
private static final String SQL_DELETE =
"delete from "+TABLE_NAME+" where customerId = ? and " + COL_ID + " = ? ";
private static final String SQL_UPDATE =
"update "+TABLE_NAME+" set "
+ ALL_COLUMNS_UPDATE +
" where customerId = ? and " + COL_ID + " = ? "
+ " and ( lastModifiedTimestamp = ? or ? = true) " //last parameter will allow us to skip check for concurrent modification, if necessary
;
private static final String SQL_GET_ALL_IN_SET = "select " + ALL_COLUMNS + " from "+TABLE_NAME + " where customerId = ? and "+ COL_ID +" in ";
private static final String SQL_APPEND_SEARCH_MAC_SUBSTRING =
"and macAddressString like ? ";
private static final String SQL_PAGING_SUFFIX = " LIMIT ? OFFSET ? ";
private static final String SORT_SUFFIX = "";
private static final String SQL_INSERT_BLOCK_LIST = "insert into client_blocklist (customerId, macAddress) values (?, ?) ";
private static final String SQL_DELETE_BLOCK_LIST = "delete from client_blocklist where customerId = ? and macAddress = ? ";
private static final RowMapper<Client> clientRowMapper = new ClientRowMapper();
@Autowired(required=false)
public void setDataSource(ClientDataSourceInterface dataSource) {
setDataSource((DataSource)dataSource);
}
public Client create(final Client client) {
final long ts = System.currentTimeMillis();
try{
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(SQL_INSERT );
int colIdx = 1;
//TODO: add remaining properties from Client here
ps.setLong(colIdx++, client.getMacAddress().getAddressAsLong());
ps.setString(colIdx++, client.getMacAddress().getAddressAsString());
ps.setInt(colIdx++, client.getCustomerId());
ps.setBytes(colIdx++, (client.getDetails()!=null)?client.getDetails().toZippedBytes():null);
ps.setLong(colIdx++, ts);
ps.setLong(colIdx++, ts);
return ps;
}
});
}catch (DuplicateKeyException e) {
throw new DsDuplicateEntityException(e);
}
//update blocked_client table, if needed
if((client.getDetails() instanceof ClientInfoDetails)
&& ((ClientInfoDetails)client.getDetails()).getBlocklistDetails()!=null
&& ((ClientInfoDetails)client.getDetails()).getBlocklistDetails().isEnabled()
) {
this.jdbcTemplate.update( SQL_INSERT_BLOCK_LIST,
client.getCustomerId(), client.getMacAddress().getAddressAsLong());
client.setNeedToUpdateBlocklist(true);
}
client.setCreatedTimestamp(ts);
client.setLastModifiedTimestamp(ts);
LOG.debug("Stored Client {}", client);
return client.clone();
}
@Transactional(noRollbackFor = { EmptyResultDataAccessException.class })
public Client getOrNull(int customerId, MacAddress clientMac) {
LOG.debug("Looking up Client for id {} {}", customerId, clientMac);
try{
Client client = this.jdbcTemplate.queryForObject(
SQL_GET_BY_ID,
clientRowMapper, customerId, clientMac.getAddressAsLong());
LOG.debug("Found Client {}", client);
return client;
}catch (EmptyResultDataAccessException e) {
LOG.debug("Could not find Client for id {} {}", customerId, clientMac);
return null;
}
}
public Client update(Client client) {
long newLastModifiedTs = System.currentTimeMillis();
long incomingLastModifiedTs = client.getLastModifiedTimestamp();
Client existingClient = getOrNull(client.getCustomerId(), client.getMacAddress());
if(existingClient==null) {
LOG.debug("Cannot find Client for {} {}", client.getCustomerId(), client.getMacAddress());
throw new DsEntityNotFoundException("Client not found " + client.getCustomerId() + " " + client.getMacAddress());
}
int updateCount = this.jdbcTemplate.update(SQL_UPDATE, new Object[]{
//TODO: add remaining properties from Client here
(client.getDetails()!=null)?client.getDetails().toZippedBytes():null ,
//client.getCreatedTimestamp(), - not updating this one
newLastModifiedTs,
// use id for update operation
client.getCustomerId(),
client.getMacAddress().getAddressAsLong(),
// use lastModifiedTimestamp for data protection against concurrent modifications
incomingLastModifiedTs,
isSkipCheckForConcurrentUpdates()
});
if(updateCount==0){
if(isSkipCheckForConcurrentUpdates()){
//in this case we did not request protection against concurrent updates,
//so the updateCount is 0 because record in db was not found
throw new EmptyResultDataAccessException(1);
}
long recordTimestamp = existingClient.getLastModifiedTimestamp();
LOG.debug("Concurrent modification detected for Client with id {} {} expected version is {} but version in db was {}",
client.getCustomerId(),
client.getMacAddress().getAddressAsLong(),
incomingLastModifiedTs,
recordTimestamp
);
throw new DsConcurrentModificationException("Concurrent modification detected for Client with id "
+ client.getCustomerId() + " " + client.getMacAddress()
+" expected version is " + incomingLastModifiedTs
+" but version in db was " + recordTimestamp
);
}
//update client_blocklist table, if the blocking state of the client has changed
boolean existingClientBlocked = (existingClient.getDetails() instanceof ClientInfoDetails)
&& ((ClientInfoDetails)existingClient.getDetails()).getBlocklistDetails()!=null
&& ((ClientInfoDetails)existingClient.getDetails()).getBlocklistDetails().isEnabled();
boolean updatedClientBlocked = (client.getDetails() instanceof ClientInfoDetails)
&& ((ClientInfoDetails)client.getDetails()).getBlocklistDetails()!=null
&& ((ClientInfoDetails)client.getDetails()).getBlocklistDetails().isEnabled();
if(existingClientBlocked != updatedClientBlocked) {
if(updatedClientBlocked) {
//insert record into client_blocklist table
this.jdbcTemplate.update( SQL_INSERT_BLOCK_LIST,
client.getCustomerId(), client.getMacAddress().getAddressAsLong());
} else {
//delete record from client_blocklist table
this.jdbcTemplate.update( SQL_DELETE_BLOCK_LIST,
client.getCustomerId(), client.getMacAddress().getAddressAsLong());
}
//notify the caller that block list needs to be updated
client.setNeedToUpdateBlocklist(true);
}
//make a copy so that we don't accidentally update caller's version by reference
Client clientCopy = client.clone();
clientCopy.setLastModifiedTimestamp(newLastModifiedTs);
LOG.debug("Updated Client {}", clientCopy);
return clientCopy;
}
public Client delete(int customerId, MacAddress clientMac) {
Client client = getOrNull(customerId, clientMac);
if(client!=null) {
this.jdbcTemplate.update(SQL_DELETE, customerId, clientMac.getAddressAsLong());
} else {
throw new DsEntityNotFoundException("Cannot find Client for id " + customerId + " " + clientMac);
}
//delete from client_blocklist table happens by foreign key cascade
//but we still need to tell the caller if the blocklist need to be updated
if((client.getDetails() instanceof ClientInfoDetails)
&& ((ClientInfoDetails)client.getDetails()).getBlocklistDetails()!=null
&& ((ClientInfoDetails)client.getDetails()).getBlocklistDetails().isEnabled()
) {
client.setNeedToUpdateBlocklist(true);
}
LOG.debug("Deleted Client {} {}", customerId, clientMac);
return client;
}
public List<Client> getAllForCustomer(int customerId) {
LOG.debug("Looking up Clients for customer {}", customerId);
List<Client> ret = this.jdbcTemplate.query(SQL_GET_BY_CUSTOMER_ID,
clientRowMapper, customerId);
LOG.debug("Found Clients for customer {} : {}", customerId, ret);
return ret;
}
public List<Client> get(int customerId, Set<MacAddress> clientMacSet) {
LOG.debug("calling get({}, {})", customerId, clientMacSet);
if (clientMacSet == null || clientMacSet.isEmpty()) {
return Collections.emptyList();
}
StringBuilder set = new StringBuilder(256);
set.append("(");
for(int i =0; i< clientMacSet.size(); i++) {
set.append("?,");
}
//remove last comma
set.deleteCharAt(set.length()-1);
set.append(")");
String query = SQL_GET_ALL_IN_SET + set;
ArrayList<Object> bindVars = new ArrayList<>();
bindVars.add(customerId);
clientMacSet.forEach(m -> bindVars.add(m.getAddressAsLong()) );
List<Client> results = this.jdbcTemplate.query(query, bindVars.toArray(), clientRowMapper);
LOG.debug("get({}, {}) returns {} record(s)", customerId, clientMacSet, results.size());
return results;
}
public PaginationResponse<Client> getForCustomer(int customerId, String macSubstring,
List<ColumnAndSort> sortBy, PaginationContext<Client> context) {
PaginationResponse<Client> ret = new PaginationResponse<>();
ret.setContext(context.clone());
if (ret.getContext().isLastPage()) {
// no more pages available according to the context
LOG.debug(
"No more pages available when looking up Clients for customer {} macSubstring {} with last returned page number {}",
customerId, macSubstring, context.getLastReturnedPageNumber());
return ret;
}
LOG.debug("Looking up Clients for customer {} macSubstring {} with last returned page number {}",
customerId, macSubstring, context.getLastReturnedPageNumber());
String query = SQL_GET_BY_CUSTOMER_ID;
// add filters for the query
ArrayList<Object> queryArgs = new ArrayList<>();
queryArgs.add(customerId);
if (macSubstring != null) {
query += SQL_APPEND_SEARCH_MAC_SUBSTRING;
queryArgs.add("%" + macSubstring.toLowerCase() + "%");
}
// add sorting options for the query
StringBuilder strbSort = new StringBuilder(100);
strbSort.append(" order by ");
if (sortBy != null && !sortBy.isEmpty()) {
// use supplied sorting options
for (ColumnAndSort column : sortBy) {
if (!ALL_COLUMNS_LOWERCASE.contains(column.getColumnName().toLowerCase())) {
// unknown column, skip it
continue;
}
strbSort.append(column.getColumnName());
if (column.getSortOrder() == SortOrder.desc) {
strbSort.append(" desc");
}
strbSort.append(",");
}
// remove last ','
strbSort.deleteCharAt(strbSort.length() - 1);
} else {
// no sort order was specified - sort by id to have consistent
// paging
strbSort.append(COL_ID);
}
query += strbSort.toString();
// add pagination parameters for the query
query += SQL_PAGING_SUFFIX ;
queryArgs.add(context.getMaxItemsPerPage());
queryArgs.add(context.getTotalItemsReturned());
/*
* https://www.citusdata.com/blog/2016/03/30/five-ways-to-paginate/
* Choosing offset=1000 makes cost about 19 and has a 0.609 ms execution
* time. Once offset=5,000,000 the cost goes up to 92734 and execution
* time is 758.484 ms. - DT: still acceptable for our use case
*/
List<Client> pageItems = this.jdbcTemplate.query(query, queryArgs.toArray(),
clientRowMapper);
LOG.debug("Found {} Clients for customer {} macSubstring {} with last returned page number {}",
pageItems.size(), customerId, macSubstring, context.getLastReturnedPageNumber());
ret.setItems(pageItems);
// adjust context for the next page
ret.prepareForNextPage();
// startAfterItem is not used in RDBMS datastores, set it to null
ret.getContext().setStartAfterItem(null);
return ret;
}
public List<Client> getBlockedClients(int customerId) {
LOG.debug("calling getBlockedClients({})", customerId);
List<Client> results = this.jdbcTemplate.query(SQL_GET_BLOCKED_CLIENTS, clientRowMapper, customerId);
LOG.debug("getBlockedClients({}) returns {} record(s)", customerId, results.size());
return results;
}
}

View File

@@ -0,0 +1,31 @@
package com.telecominfraproject.wlan.client.datastore.rdbms;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.core.server.jdbc.BaseDataSourceConfig;
/**
* @author dtoptygin
*
*/
@Component
@Profile("!use_single_ds")
@PropertySource({ "${client-ds.props:classpath:client-ds.properties}" })
public class ClientDataSourceConfig extends BaseDataSourceConfig {
@Bean
public ClientDataSourceInterface clientDataSourceInterface(){
ClientDataSourceInterface ret = new ClientDataSourceImpl(getDataSource(), getKeyColumnConverter());
return ret;
}
@Override
public String getDataSourceName() {
return "client-ds";
}
}

View File

@@ -0,0 +1,18 @@
package com.telecominfraproject.wlan.client.datastore.rdbms;
import javax.sql.DataSource;
import com.telecominfraproject.wlan.core.server.jdbc.BaseJDbcDataSource;
import com.telecominfraproject.wlan.core.server.jdbc.BaseKeyColumnConverter;
/**
* @author dtoptygin
* SQL DataSource that is used by Client Service
*/
public class ClientDataSourceImpl extends BaseJDbcDataSource implements ClientDataSourceInterface {
public ClientDataSourceImpl(DataSource targetDataSource, BaseKeyColumnConverter keyColumnConverter){
super(targetDataSource, keyColumnConverter);
}
}

Some files were not shown because too many files have changed in this diff Show More