Compare commits

..

121 Commits

Author SHA1 Message Date
Kareem Dabbour
52ed5f6344 WIFI-2543 Added delete methods and API endpoints for bulk deletion of client and client sessions 2021-06-07 21:42:15 -04:00
Mike Hansen
f5869961b2 WIFI-2081: AP: ON_CHANNEL survey report sometimes has no information
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-07 15:47:30 -04:00
Mike Hansen
f02cadbdc3 WIFI-2081: AP: ON_CHANNEL survey report sometimes has no information
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-07 15:27:40 -04:00
Mike Hansen
c45cabf607 WIFI-2081: AP: ON_CHANNEL survey report sometimes has no information
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-07 15:25:55 -04:00
norm-traxler
c9faf138da Merge pull request #111 from Telecominfraproject/WIFI-2525
WIFI-2525 Set default value for MaxAutoCellSize in RF Config
2021-06-03 18:05:57 -04:00
Lynn Shi
f6b96fc566 WIFI-2525 Set default value for MaxAutoCellSize in RF Config 2021-06-02 14:03:15 -04:00
Mike Hansen
a089e7b748 AP: ON_CHANNEL survey report sometimes has no information
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-02 09:07:37 -04:00
norm-traxler
e790db2c2b Merge pull request #110 from Telecominfraproject/WIFI-2508
WIFI-2508 added delete endpoint for systemevents that are older than a given timestamp
2021-05-31 17:43:18 -04:00
Kareem Dabbour
b03dccc63f WIFI-2508 added delete endpoint for systemevents that are older than a given time stamp 2021-05-31 17:23:12 -04:00
norm-traxler
03eccfa448 Merge pull request #109 from Telecominfraproject/WIFI-2434
WIFI 2434: Update SDK master to use image tag 1.2.0-SNAPSHOT
2021-05-26 21:27:38 -04:00
Akshay Jagadish
18eeaffa13 Update SDK master to use image tag 1.2.0-SNAPSHOT 2021-05-26 17:59:41 -04:00
Mike Hansen
40aaeb33f4 WIFI-2425: RADSEC: Cloud doesn't send the radius secret as set in the radiusProxyConfigurations
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-25 14:19:40 -04:00
Mike Hansen
fb4ff772e4 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services 2021-05-20 17:00:44 -04:00
Mike Hansen
d9076562d4 WIFI-2030: SDK Gateway/BE: Proxy-ARP service
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-20 17:00:19 -04:00
norm-traxler
5ee517df81 Merge pull request #108 from Telecominfraproject/WIFI-2411-portal-user-event-payload
[NETEXP-2411] Adding new simplified PortalUser model for events
2021-05-20 16:35:13 -04:00
ralphlee
492406b56f [WIFI-2411] Updating yaml 2021-05-20 16:21:37 -04:00
ralphlee
c5648961c4 [NETEXP-2411] Adding new simplified PortalUser model for events 2021-05-20 13:25:52 -04:00
norm-traxler
c2540266d6 Merge pull request #107 from Telecominfraproject/WIFI-2398
WIFI-2398 Adding ClientMac to client session system events
2021-05-19 19:11:27 -04:00
Kareem Dabbour
35047c4fe7 WIFI-2398 Adding ClientMac to client session system events 2021-05-19 18:39:52 -04:00
Mike Hansen
deae54b4e9 WIFI-2397: Add ApcElectionEvent values to EquipmentProtocolStatusData
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-19 17:30:45 -04:00
Mike Hansen
e957cf5a3b WIFI-2120: AP: Support 8x8 MIMO and Max Tx Power
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-19 15:23:59 -04:00
Mike Hansen
09a9002962 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services 2021-05-19 13:10:06 -04:00
Mike Hansen
48040b3cba WIFI-2395: CloudBackend: Universal (Auto) Radio Mode For Configuration
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-19 13:09:32 -04:00
Mike Hansen
a29b6636b8 Merge pull request #106 from Telecominfraproject/WIFI-2380
[WIFI-2380] Fix Event created timestamps for GW and Debug events.
2021-05-18 10:21:22 -04:00
Norm Traxler
9d558695ae [WIFI-2380] Fix Event created timestamps for GW and Debug events. 2021-05-17 15:29:08 -04:00
norm-traxler
81e100b210 Merge pull request #105 from Telecominfraproject/WIFI-2373-Add-getOrNull-API-to-location-service
Wifi 2373 add get or null api to location service
2021-05-13 12:08:46 -04:00
Thomas Currie
5fddfcbdc9 add unit test for new getOrNull api. 2021-05-13 11:50:49 -04:00
Thomas Currie
d86c4e2b0c Add getOrNull API to location service at endpoint /api/location/orNull . 2021-05-13 11:47:04 -04:00
Mike Hansen
5881a00657 Merge pull request #104 from Telecominfraproject/WIFI-2112
Wifi-2112 Support Equipment ApImpacting Provisioning Changes to AP
2021-05-11 09:44:04 -04:00
Lynn Shi
56b0dc08ba Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services into WIFI-2112 2021-05-07 15:55:25 -04:00
Lynn Shi
5ec68adc99 WIFI-2112 Support Equipment ApImpacting Provisioning Changes to AP 2021-05-07 15:47:58 -04:00
Mike Hansen
0357f2d3a4 WIFI-2060: Service - Update equipment_ap profile with additional RadiusProxy data for accounting server and port
Adding acctSharedSecret

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-07 10:47:30 -04:00
Mike Hansen
40c7439a60 Merge pull request #103 from Telecominfraproject/WIFI-2096
WIFI-2096 Add Portal support for cell size management
2021-05-07 10:24:03 -04:00
Lynn Shi
901f1c4517 WIFI-2096 Add Portal support for cell size management, fix test case 2021-05-06 16:44:44 -04:00
Lynn Shi
9c58fda584 WIFI-2096 Add Portal support for cell size management, throw exception for updateCellSizeAttributes on disabled autoCellSizeSelection 2021-05-06 11:06:47 -04:00
Lynn Shi
982ccfdd0e WIFI-2096 Add Portal support for cell size management 2021-05-05 16:18:42 -04:00
Mike Hansen
535df0041e Merge pull request #102 from Telecominfraproject/WIFI-2080
WIFI-2080 Add support for cell size attributes lightweight provisioni…
2021-05-04 12:52:33 -04:00
Lynn Shi
4b100290a7 WIFI-2080 Minor update 2021-04-30 14:08:54 -04:00
Lynn Shi
660326974c WIFI-2080 Update based on review comments 2021-04-30 13:49:58 -04:00
Mike Hansen
ce8ff0885f WIFI-2083: Fix Enum labels on Backend
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-04-30 12:09:14 -04:00
norm-traxler
5c85997548 Merge pull request #99 from Telecominfraproject/WIFI-2074-equipment-search-profileid
[WIFI-2074] Adding profileId to /equipment/forCustomerWithFilter
2021-04-30 10:35:19 -04:00
Lynn Shi
1d77f9f7f2 WIFI-2080 Add support for cell size attributes lightweight provisioning changes to AP 2021-04-29 18:15:38 -04:00
ralphlee
ffc8ffe5e7 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services into WIFI-2074-equipment-search-profileid 2021-04-29 18:04:55 -04:00
norm-traxler
b0f76cb984 Merge pull request #101 from Telecominfraproject/WIFI-2077_2
[WIFI-2077] Fix for 2 alarm events created at the same time
2021-04-29 14:05:20 -04:00
Norm Traxler
dc88bc43b8 [WIFI-2077] Fix for 2 alarm events created at the same time 2021-04-29 13:29:35 -04:00
ralphlee
1e7e29540d Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services into WIFI-2074-equipment-search-profileid 2021-04-29 12:14:06 -04:00
norm-traxler
ae23c46570 Merge pull request #100 from Telecominfraproject/WIFI-2077
[WIFI-2077] Fix location event timestamps and others
2021-04-29 11:03:36 -04:00
Norm Traxler
ab1695a183 [WIFI-2077] Fix location event timestamps and others 2021-04-28 17:28:53 -04:00
ralphlee
8e9db0c95e [WIFI-2074] Adding profileId to /equipment/forCustomerWithFilter 2021-04-27 14:54:59 -04:00
norm-traxler
a4232049d0 Merge pull request #98 from Telecominfraproject/WIFI-2068
[WIFI-2068] Change client session TTL to 24 hours
2021-04-27 10:51:16 -04:00
Mike Hansen
0a65d2e8ca WIFI-2067: Enable setting default reporting interval for on and off-channel wifi stats as VM args 2021-04-26 14:04:14 -04:00
Norm Traxler
dca76d8a6e [WIFI-2068] Change client session TTL to 24 hours 2021-04-26 12:00:28 -04:00
Mike Hansen
02d2e1cef4 WIFI-2060: Service - Update equipment_ap profile with additional RadiusProxy data for accounting server and port -- fix mistake for sharedSecret name in api file 2021-04-23 16:54:55 -04:00
Mike Hansen
dc0593d2ee WIFI-2060: Service - Update equipment_ap profile with additional RadiusProxy data for accounting server and port
WIFI-2061: Service - Update ApcMode enums to handle AP enum changes
2021-04-23 16:44:02 -04:00
norm-traxler
f923587d1e Merge pull request #97 from Telecominfraproject/WIFI-2043
[WIFI-2043] Fix Dashboard count summary
2021-04-20 19:39:05 -04:00
Norm Traxler
62369d210e [WIFI-2043] Fix Dashboard count summary 2021-04-20 19:27:56 -04:00
Mike Hansen
5c21848004 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services 2021-04-20 14:10:13 -04:00
norm-traxler
81616bb4aa Merge pull request #96 from Telecominfraproject/WIFI-2038-alarms-count-by-severity
[WIFI-2038] Adding countsBySeverity to AlarmCounts
2021-04-20 14:05:52 -04:00
Mike Hansen
f275c87290 WIFI-2040: ECW5211, ECW5410, WF194C, WF188N in backoff after upgrade 2021-04-20 14:03:39 -04:00
ralphlee
03f5522cac [WIFI-2038] Adding countsBySeverity to AlarmCounts 2021-04-20 10:42:30 -04:00
norm-traxler
0d5e4b4035 Merge pull request #94 from Telecominfraproject/WIFI-2025-acknowledged-alarm-counts
[WIFI-2025] Adding acknowledged filter to /portal/alarm/counts
2021-04-19 19:34:17 -04:00
ralphlee
a2b159943a [WIFI-2025] Removing unused alarm count tables from cassandra 2021-04-19 16:55:49 -04:00
ralphlee
1a85f976e4 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services into WIFI-2025-acknowledged-alarm-counts 2021-04-19 16:22:21 -04:00
ralphlee
82cdbdbc68 [WIFI-2025] Updating alarm cassandra to do client side filtering on alarm counts 2021-04-19 16:21:42 -04:00
norm-traxler
ae0bd303dd Merge pull request #95 from Telecominfraproject/WIFI-2026
WIFI-2026 Changed pom versions from 0.0.1-SNAPSHOT to 1.1.0-SNAPSHOT
2021-04-16 17:08:23 -04:00
Akshay Jagadish
782d221a70 WIFI-2026 Changed pom versions from 0.0.1-SNAPSHOT to 1.1.0-SNAPSHOT 2021-04-16 15:28:34 -04:00
ralphlee
bc5b0cad5a [WIFI-2025] Adding comments 2021-04-16 11:22:00 -04:00
ralphlee
16ff64b5b9 [WIFI-2025] Adding acknowledged filter to /portal/alarm/counts 2021-04-16 11:12:52 -04:00
Mike Hansen
9d639ccb0c WIFI-1994: NAS-ID use BSSID as default, to support EAP with 11r 2021-04-08 12:06:56 -04:00
Mike Hansen
e7fcaeffc7 Merge pull request #93 from Telecominfraproject/WIFI-1897
WIFI-1897 Add support for channel lightweight provisioning changes to AP
2021-03-30 12:12:25 -04:00
Lynn Shi
b7560bd519 WIFI-1897 update based on review comments 2021-03-30 11:55:28 -04:00
Lynn Shi
800fa9781c WIFI-1897 introduce EquipmentChannelsChangedEvent 2021-03-29 20:21:29 -04:00
Lynn Shi
d8bdb51b21 WIFI-1897 update based on review comments 2021-03-29 15:56:52 -04:00
Mike Hansen
ee5377c2af Merge pull request #92 from Telecominfraproject/WIFI-1893
WIFI-1893 Filter clientMac with address 0 (00:00:00:00:00:00) for Ser…
2021-03-29 10:08:15 -04:00
Lynn Shi
9d1e09c3c9 WIFI-1897 Add support for channel lightweight provisioning changes to AP 2021-03-28 17:13:50 -04:00
Dmitry Toptygin
23d5c9b513 WIFI-1896 - apply client-side filtering for the queries of system events and service metrics in cassandra datastore if the search parameters include locationIds. This is not a full solution. There is still a possibility that entries in the main tables could be overwritten if two location-level events of the same type are stored at exactly the same millisecond for the same customer.In order to fully address the issue, the primary keys of service_metric and wlan_system_event tables need to be changed to include the locationId, and the queries have to be adjusted accordingly, and more index tables would be needed to accommodate all possible combinations of search parameters 2021-03-26 18:27:36 -04:00
Lynn Shi
bf1d76a7c7 WIFI-1893 update based on review comments 2021-03-26 13:43:31 -04:00
Lynn Shi
8dd7c99d11 WIFI-1893 Filter clientMac with address 0 (00:00:00:00:00:00) for ServiceMetricDatastoreInMemory and SystemEventDatastoreInMemory 2021-03-26 11:39:01 -04:00
Mike Hansen
be6b3f69a3 WIFI-1851: Backend: Modelling manufacturing identity data
Pre work for removing ManufacturerName enum.
2021-03-25 15:13:26 -04:00
Mike Hansen
d37b5a55c2 WIFI-1851: Backend: Modelling manufacturing identity data
Pre work for removing ManufacturerName enum.
2021-03-25 14:31:50 -04:00
Mike Hansen
694bb8dc05 WIFI-1851: Backend: Modelling manufacturing identity data -- get EquipmentManufacturer by manufacturer name, not just enum name 2021-03-23 17:36:23 -04:00
Mike Hansen
32d4fb1197 WIFI-1732: Acct-Interim-Interval config not working when configured from radius 2021-03-23 15:12:43 -04:00
Mike Hansen
ac3b928a85 WIFI-1851: Backend: Modelling manufacturing identity data
WIFI-1850: Backend: API Support for manufacturing identity data
2021-03-23 14:39:34 -04:00
Dmitry Toptygin
1693b61c9f Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services 2021-03-22 12:28:21 -04:00
Dmitry Toptygin
7a5cde65f2 WIFI-1877 - add topics in kafka where messages are partitioned by locationId - location_metrics and location_events 2021-03-22 12:27:59 -04:00
Mike Hansen
e43663a290 WIFI-1850: Backend: API Support for manufacturing identity data
WIFI-1851: Backend: Modelling manufacturing identity data
2021-03-19 14:43:06 -04:00
Mike Hansen
bd35d28c70 WIFI-1851: Backend: Modelling manufacturing identity data 2021-03-18 17:52:42 -04:00
Mike Hansen
be9fd94bfc WIFI-1808: AP-NOS Passpoint : Access type and internet value is not getting set Interworking element in Beacon for passpoint SSID
Change PasspointProfile qosMapSetConfiguration from Set to List to allow
for duplicate String values.
2021-03-18 09:39:53 -04:00
Mike Hansen
e9283c85d4 WIFI-1803: Design changes/refactoring based on SME feedback and AP design iterations 2021-03-16 12:02:47 -04:00
Mike Hansen
4cdd220874 WIFI-1803: Design changes/refactoring based on SME feedback and AP design iterations 2021-03-16 11:49:11 -04:00
Mike Hansen
eeeb1d1df6 WIFI-1692: Services: Event support for APC Election
update hash code and equals
2021-03-12 10:15:49 -05:00
Mike Hansen
b47fdab224 WIFI-1691: OpenAPI updates for APC/RadSEC Configuration 2021-03-12 10:13:59 -05:00
Mike Hansen
c93c8b01f2 WIFI-1692: Services: Event support for APC Election 2021-03-12 09:49:45 -05:00
ralphlee3
35620415fc [WIFI-1746] Updating the client SASI indexes to NonTokenizingAnalyzer (#91)
* [WIFI-1746] Updating the client SASI indexes to NonTokenizingAnalyzer

* [WIFI-1746] Updating index names

* [WIFI-1746] Specifying keyspace in client index delete
2021-03-11 17:00:35 -05:00
ralphlee3
659fc5bc9e WIFI 1739 client session forcustomer max items (#90)
* [WIFI-1739] Changing client forCustomer cassandra filtering to get 1 session per returned row

* [WIFI-1739] Fix spacing
2021-03-11 13:53:14 -05:00
Mike Hansen
818cfeb4f0 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-services 2021-03-10 15:22:08 -05:00
Mike Hansen
6e6a7d53d3 WIFI-453: CloudSDK : Support for APC / Radius Proxy (Back End)
WIFI-1690: SSID Profile: APC/RadSEC enable/disable
 adding separate boolean for proxy and for radsec

WIFI-1698: Services - RadSEC certificates
 adding FileType and FileCategory for Certificates to use with
 ManagedFileInfo

WIFI-1689: AP Profile: APC/RadSEC Configuration information
 adding name and passphrase

WIFI-1691: OpenAPI updates for APC/RadSEC Configuration
2021-03-10 15:11:37 -05:00
Kareem Dabbour
dfa5b71a79 WIFI-1718 Updated getAverageSignalStrenght for neighboring APs (#87)
* WIFI-1718 Updated getAverageSignalStrenght for neighboring APs

* WIFI-1718 added null checks and used new overloaded averaging function

* WIFI-1718 updated to use lamda foreach

Co-authored-by: Kareem Dabbour <kareemdabbour@Kareems-MacBook-Pro.local>
2021-03-10 11:42:41 -05:00
ralphlee3
7b657acee7 Wifi 1729 alarm acknowledged update table (#88)
* [WIFI-1729] Adding update to alarm acknowledged cassandra tables and unit test

* [WIFI-1729] Removing comments
2021-03-10 09:54:31 -05:00
Mike Hansen
db5c1bb6c1 WIFI-1689: AP Profile: APC/RadSEC Configuration information 2021-03-09 10:27:23 -05:00
Mike Hansen
8c4ac0e282 WIFI-835: Captive Portal: User List Authentication feature does not work unless user list is pushed to cloud manually. Update AllCloudInOne for local testing 2021-03-05 15:43:16 -05:00
Mike Hansen
f71e6804fa WIFI-1690: SSID Profile: APC/RadSEC enable/disable 2021-03-04 15:29:32 -05:00
Mike Hansen
a3eac7942a WIFI-1689: AP Profile: APC/RadSEC Configuration information 2021-03-04 15:28:58 -05:00
Mike Hansen
e84f7b7765 WIFI-1691: OpenAPI updates for APC/RadSEC Configuration 2021-03-04 15:27:32 -05:00
Dmitry Toptygin
6d133ae448 fixed merge conflict in SsidConfiguration 2021-03-03 17:42:44 -05:00
tomrcurrie
f30d70ae81 Make constants BANDWIDTH_LIMIT_MAX, RADIUS_ACCOUNTING_SERVICE_INTERVAL_MIN, RADIUS_ACCOUNTING_SERVICE_INTERVAL_MAX, MAX_SSID_LENGTH configurable via system properties (#84) 2021-03-03 17:24:39 -05:00
Mike Hansen
d4a516199a Merge pull request #83 from Telecominfraproject/WIFI-1440-Radius-Accounting-Interval-is-not-configurable-by-user
UX/UI: Radius Accounting Interval is not configurable by user
2021-03-03 10:50:19 -05:00
tomrcurrie
ea94c14e63 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
2021-03-03 09:55:46 -05:00
Thomas Currie
a35e2deb84 Fix setter method to use actual provided value for radiusAcountingServiceInterval instead of default min value of 60. 2021-03-03 08:33:07 -05:00
ralphlee3
4c0d39860b [WIFI-1681] Adding macSubstring filter to client API forCustomer (#81)
* [WIFI-1681] Adding macSubstring filter to client API forCustomer

* [WIFI-1681] Client forCustomer to use client session API only when equipmentIds is present
2021-03-02 13:28:20 -05:00
ralphlee3
40a1e597c1 [WIFI-1687] client session api macsubtring empty (#82)
* [WIFI-1687] Adding empty check for macSubstring

* [WIFI-1687] Adding empty checks to rdbms and inmemory
2021-03-02 12:24:01 -05:00
ralphlee3
b10b511c64 [WIFI-1358] Adding macSubstring to client session API forCustomer (#56)
* [WIFI-1358] Initial commit

* [WIFI-1358] Fixing cassandra indexing and added unit tests

* [WIFI-1358] Updated openapi yaml

* [WIFI-1358] Adding customerId filter to macSubstring query to Cassandra

* [WIFI-1358] Adding macAddressString column to postgresql table if not exists

* [WIFI-1358] Updating client session remote unit tests

* [WIFI-1358] Reorder client postgresql sql table initialization lines
2021-03-01 15:22:16 -05:00
Dmitry Toptygin
3ee708925f WIFI-1609 fixed comments in the cassandra schema for alarms 2021-02-25 17:14:40 -05:00
Mike Hansen
e7b40a1be6 Merge pull request #77 from Telecominfraproject/WIFI-1658-2
WIFI-1658 correct one field name for EquipmentChannelStatusData in yaml
2021-02-25 14:44:56 -05:00
Lynn Shi
b00fb6d287 WIFI-1658 correct one field name for EquipmentChannelStatusData in yaml 2021-02-25 14:39:55 -05:00
Mike Hansen
6e8977365a Merge pull request #76 from Telecominfraproject/WIFI-1658
WIFI-1658 Add Channel Number Status Support
2021-02-25 12:00:24 -05:00
Lynn Shi
ea794940a9 WIFI-1658 update based on review comments 2021-02-25 11:54:01 -05:00
ralphlee3
cdebd4485e [WIFI-1609] alarm forcustomer acknowledged filter (#69)
* [WIFI-1609] Added acknowledged flag to forCustomer parameters and support in datastore

* [WIFI-1609] Ignore cassandra tests

* [WIFI-1609] Added handling acknowledged filter with equipmentId, alarmCode, and timestamp
2021-02-25 10:41:49 -05:00
Lynn Shi
272b6836a1 WIFI-1658 Add Channel Number Status Support 2021-02-25 09:03:54 -05:00
Dmitry Toptygin
074f51ea8d WIFI-1652 - implement performance counters for ovsdb, cassandra, and kafka 2021-02-23 19:40:01 -05:00
AkshayJagadish-ne
f26dc9758b WIFI-1641: Dashboard: Number of "In service APs" is not accurate (#75) 2021-02-23 09:41:26 -05:00
569 changed files with 6955 additions and 9151 deletions

View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>

View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>adoption-metrics-datastore-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>adoption-metrics-datastore-common-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>adoption-metrics-datastore-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-jdbc-tests</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>adoption-metrics-datastore-common-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

1
adoption-metrics-models/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

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

View File

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

1
adoption-metrics-service/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-datastore-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

1
adoption-metrics-sp/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>adoption-metrics-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

1
alarm-datastore-cassandra/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-datastore-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-cassandra-tests</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

View File

@@ -7,12 +7,9 @@ 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;
@@ -119,9 +116,6 @@ 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 + " " +
@@ -152,9 +146,6 @@ 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 = ? ";
@@ -172,19 +163,11 @@ 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";
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 = ? ";
// 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_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_ACKNOWLEDGED_ALARM_COUNT_BY_CUSTOMER_ID = "select equipmentId, alarmCode from alarm_by_acknowledged where customerId = ? and acknowledged = ? ";
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();
@@ -192,59 +175,37 @@ 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);
@@ -280,18 +241,6 @@ 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(
@@ -541,18 +490,6 @@ 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(
@@ -600,19 +537,6 @@ 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(),
@@ -650,136 +574,6 @@ 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,
@@ -1048,7 +842,7 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
*
*/
@Override
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIds, Set<AlarmCode> alarmCodes) {
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIds, Set<AlarmCode> alarmCodes, Boolean acknowledged) {
ArrayList<Object> queryArgs = new ArrayList<>();
queryArgs.add(customerId);
@@ -1056,11 +850,13 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
StringBuilder query = new StringBuilder();
if (equipmentIds != null && !equipmentIds.isEmpty()) {
query.append(CQL_GET_EQUIPMENT_ALARM_COUNT_BY_CUSTOMER_ID);
} else {
if (acknowledged == null) {
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
@@ -1069,23 +865,28 @@ public class AlarmDatastoreCassandra implements AlarmDatastore {
//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(",");
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(",");
}
}
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;
@@ -1096,21 +897,11 @@ 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;
if (equipmentIds == null || equipmentIds.isEmpty()) {
alarmCodeColIdx = 0;
equipmentIdColIdx = 0;
countColIdx = 1;
} else {
alarmCodeColIdx = 1;
equipmentIdColIdx = 0;
countColIdx = 2;
}
int equipmentIdColIdx = 0;
int alarmCodeColIdx = 1;
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
@@ -1118,86 +909,17 @@ 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, (int) row.getLong(countColIdx));
alarmCounts.addToCounter(0, ac, 1);
} else {
alarmCounts.addToCounter(row.getLong(equipmentIdColIdx), ac, (int) row.getLong(countColIdx));
alarmCounts.addToCounter(row.getLong(equipmentIdColIdx), ac, 1);
}
}
});
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,26 +67,3 @@ 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_9", "qr_40", "qr_3", "qr_32", "qr_31", "qr_2", "qr_39", "qr_35", "qr_38", "qr_48" });
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" });
}
@Override
protected List<String> getAlarmPagination_expectedPage1EmptySortStrings() {
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" });
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" });
}
@Override

View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>

View File

@@ -30,6 +30,7 @@ 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
@@ -209,9 +210,7 @@ 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);
@@ -233,8 +232,6 @@ public abstract class BaseAlarmDatastoreTest {
testInterface.create(mdl);
}
testInterface.resetAlarmCounters();
for(int i = 0; i< 50; i++){
mdl = createAlarmObject();
mdl.setCustomerId(customerId_2);
@@ -442,14 +439,10 @@ 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(){
@@ -549,6 +542,7 @@ 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());
@@ -560,21 +554,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);
@@ -582,33 +576,71 @@ 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);
AlarmCounts alarmCounts = testInterface.getAlarmCounts(customerId_1, equipmentIds, alarmCodes, null);
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);
AlarmCounts alarmCounts_noEq = testInterface.getAlarmCounts(customerId_1, null, alarmCodes, null);
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));
AlarmCounts alarmCounts_noEq_1code = testInterface.getAlarmCounts(customerId_1, null, Collections.singleton(AlarmCode.CPUUtilization), null);
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_1Eq_1code = testInterface.getAlarmCounts(customerId_1, Collections.singleton(equipmentIds.iterator().next()), Collections.singleton(AlarmCode.CPUUtilization));
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);
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());
@@ -618,10 +650,12 @@ public abstract class BaseAlarmDatastoreTest {
for(int i=0; i< 4; i++) {
smallEqIds.add(iter.next());
}
AlarmCounts alarmCounts_small = testInterface.getAlarmCounts(customerId_1, smallEqIds, alarmCodes);
AlarmCounts alarmCounts_small = testInterface.getAlarmCounts(customerId_1, smallEqIds, alarmCodes, null);
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));
@@ -629,6 +663,38 @@ 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();

1
alarm-datastore-inmemory/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-datastore-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>alarm-datastore-common-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -322,22 +322,37 @@ public class AlarmDatastoreInMemory extends BaseInMemoryDatastore implements Ala
}
@Override
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet) {
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged) {
AlarmCounts alarmCounts = new AlarmCounts();
alarmCounts.setCustomerId(customerId);
alarmCounts.setAcknowledged(acknowledged);
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);
}
}
}
});
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);
}
}
}
});
}
return alarmCounts;
}

1
alarm-datastore-interface/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -66,16 +66,9 @@ 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);
AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged);
/**
* 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

@@ -1,43 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.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

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

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

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

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

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

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

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

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

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

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

View File

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

@@ -1,23 +0,0 @@
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
);

1
alarm-models/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>status-models</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>system-event-models</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -5,14 +5,18 @@ 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;
@@ -20,20 +24,38 @@ public class AlarmCounts extends BaseJsonModel {
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public Map<Long, Map<AlarmCode, AtomicInteger>> getCountsPerEquipmentIdMap() {
public Boolean getAcknowledged() {
return acknowledged;
}
public void setAcknowledged(Boolean acknowledged) {
this.acknowledged = acknowledged;
}
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 void addToCounter(long equipmentId, AlarmCode alarmCode, int valueToAdd) {
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) {
//update total counts
AtomicInteger totalCount = totalCountsPerAlarmCodeMap.get(alarmCode);
if (totalCount == null) {
@@ -42,7 +64,23 @@ 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) {
@@ -50,6 +88,7 @@ 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();
@@ -63,6 +102,14 @@ 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) {
@@ -88,6 +135,12 @@ 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,10 +10,29 @@ 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.getLastModifiedTimestamp(), alarm);
super(alarm.getCustomerId(), alarm.getEquipmentId(), 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.getLastModifiedTimestamp(), alarm);
super(alarm.getCustomerId(), alarm.getEquipmentId(), 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(), System.currentTimeMillis(), alarm);
super(alarm.getCustomerId(), alarm.getEquipmentId(), alarm);
}
/**

1
alarm-service-interface/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -3,7 +3,6 @@ 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;
@@ -110,15 +109,9 @@ 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);
/**
* 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() ;
AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged);
}

1
alarm-service-local/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -8,7 +8,6 @@ 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;
@@ -77,12 +76,8 @@ public class AlarmServiceLocal implements AlarmServiceInterface {
}
@Override
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet) {
return alarmController.getAlarmCounts(customerId, equipmentIdSet, alarmCodeSet);
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged) {
return alarmController.getAlarmCounts(customerId, equipmentIdSet, alarmCodeSet, acknowledged);
}
@Override
public GenericResponse resetAlarmCounters() {
return alarmController.resetAlarmCounters();
}
}

1
alarm-service-remote/.gitignore vendored Normal file
View File

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

View File

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

View File

@@ -17,7 +17,6 @@ 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;
@@ -62,22 +61,6 @@ 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) {
@@ -137,9 +120,9 @@ public class AlarmServiceRemote extends BaseRemoteClient implements AlarmService
}
@Override
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet) {
public AlarmCounts getAlarmCounts(int customerId, Set<Long> equipmentIdSet, Set<AlarmCode> alarmCodeSet, Boolean acknowledged) {
LOG.debug("getAlarmCounts({}, {}, {})", customerId, equipmentIdSet, alarmCodeSet);
LOG.debug("getAlarmCounts({}, {}, {}, {})", customerId, equipmentIdSet, alarmCodeSet, acknowledged);
String equipmentIdSetStr = null;
if (equipmentIdSet != null && !equipmentIdSet.isEmpty()) {
@@ -158,8 +141,8 @@ public class AlarmServiceRemote extends BaseRemoteClient implements AlarmService
}
ResponseEntity<AlarmCounts> responseEntity = restTemplate.exchange(
getBaseUrl() + "/counts?customerId={customerId}&equipmentIdSet={equipmentIdSetStr}&alarmCodeSet={alarmCodeSetStr}", HttpMethod.GET,
null, AlarmCounts.class, customerId, equipmentIdSetStr, alarmCodeSetStr);
getBaseUrl() + "/counts?customerId={customerId}&equipmentIdSet={equipmentIdSetStr}&alarmCodeSet={alarmCodeSetStr}&acknowledged={acknowledged}", HttpMethod.GET,
null, AlarmCounts.class, customerId, equipmentIdSetStr, alarmCodeSetStr, acknowledged);
AlarmCounts ret = responseEntity.getBody();
LOG.debug("completed getAlarmCounts {} ", ret);

View File

@@ -33,6 +33,7 @@ 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.remote.tests.BaseRemoteTest;
import com.telecominfraproject.wlan.status.models.StatusCode;
/**
* @author dtoptygin
@@ -518,6 +519,7 @@ public class AlarmServiceRemoteTest extends BaseRemoteTest {
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());
@@ -528,57 +530,126 @@ public class AlarmServiceRemoteTest extends BaseRemoteTest {
remoteInterface.create(mdl);
}
{
mdl = createAlarmObject();
mdl.setCustomerId(customerId_1);
mdl.setEquipmentId(0);
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();
mdl.setCustomerId(customerId_2);
mdl.setScopeId("qr_"+apNameIdx);
mdl.setScopeId("qr_"+apNameIdx);
mdl.setAcknowledged(false);
mdl.setAlarmCode(AlarmCode.GenericError);
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);
AlarmCounts alarmCounts = remoteInterface.getAlarmCounts(customerId_1, equipmentIds, alarmCodes, null);
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);
AlarmCounts alarmCounts_noEq = remoteInterface.getAlarmCounts(customerId_1, null, alarmCodes, null);
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));
AlarmCounts alarmCounts_noEq_1code = remoteInterface.getAlarmCounts(customerId_1, null, Collections.singleton(AlarmCode.CPUUtilization), null);
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_1Eq_1code = remoteInterface.getAlarmCounts(customerId_1, Collections.singleton(equipmentIds.iterator().next()), Collections.singleton(AlarmCode.CPUUtilization));
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);
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() {
Alarm result = new Alarm();
result.setCustomerId(getNextCustomerId());

1
alarm-service/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-datastore-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

View File

@@ -16,7 +16,6 @@ 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;
@@ -68,8 +67,9 @@ public class AlarmController {
throw new DsDataValidationException("Alarm contains unsupported value");
}
long ts = System.currentTimeMillis();
if (alarm.getCreatedTimestamp() == 0) {
long ts = alarm.getCreatedTimestamp();
if (ts == 0) {
ts = System.currentTimeMillis();
alarm.setCreatedTimestamp(ts);
}
alarm.setLastModifiedTimestamp(ts);
@@ -78,10 +78,9 @@ public class AlarmController {
LOG.debug("Created Alarm {}", ret);
AlarmAddedEvent event = new AlarmAddedEvent(ret);
AlarmAddedEvent event = new AlarmAddedEvent(ret, ts);
publishEvent(event);
return ret;
}
@@ -234,22 +233,17 @@ public class AlarmController {
@RequestMapping(value = "/counts", method = RequestMethod.GET)
public AlarmCounts getAlarmCounts(@RequestParam int customerId,
@RequestParam Set<Long> equipmentIdSet,
@RequestParam Set<AlarmCode> alarmCodeSet) {
@RequestParam Set<AlarmCode> alarmCodeSet,
@RequestParam Boolean acknowledged) {
LOG.debug("Getting Alarm counts for {} {} {}", customerId, equipmentIdSet, alarmCodeSet);
LOG.debug("Getting Alarm counts for {} {} {} {}", customerId, equipmentIdSet, alarmCodeSet, acknowledged);
AlarmCounts ret = alarmDatastore.getAlarmCounts(customerId, equipmentIdSet, alarmCodeSet);
AlarmCounts ret = alarmDatastore.getAlarmCounts(customerId, equipmentIdSet, alarmCodeSet, acknowledged);
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,11 +262,17 @@ 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
@@ -279,6 +285,20 @@ 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
@@ -629,6 +649,12 @@ 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

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -57,6 +57,9 @@ 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
@@ -150,6 +153,8 @@ 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,6 +39,8 @@ 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

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

View File

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

View File

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

View File

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

1
all-cloud-in-one-process/.gitignore vendored Normal file
View File

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

View File

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

View File

@@ -1,12 +1,14 @@
package com.telecominfraproject.wlan.startuptasks;
import java.io.BufferedWriter;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
@@ -325,12 +327,6 @@ 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());
@@ -344,19 +340,15 @@ public class AllInOneStartListener implements ApplicationRunner {
ManagedFileInfo backgroundFile = new ManagedFileInfo();
backgroundFile.setFileCategory(FileCategory.CaptivePortalBackground);
backgroundFile.setFileType(FileType.PNG);
backgroundFile.setApExportUrl("/filestore/tip-logo.png");
backgroundFile.setApExportUrl("tip-logo.png");
ManagedFileInfo logoFile = new ManagedFileInfo();
logoFile.setFileCategory(FileCategory.CaptivePortalLogo);
logoFile.setFileType(FileType.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);
logoFile.setApExportUrl("tip-logo-mobile.png");
captivePortalConfig.setBackgroundFile(backgroundFile);
captivePortalConfig.setLogoFile(logoFile);
captivePortalConfig.setBrowserTitle(profileCaptivePortal.getName());
captivePortalConfig.setUserList(constructCaptivePortalUserList());
profileCaptivePortal.setDetails(captivePortalConfig);
profileCaptivePortal = profileServiceInterface.create(profileCaptivePortal);
@@ -857,7 +849,7 @@ public class AllInOneStartListener implements ApplicationRunner {
return hotspot20IdProviderProfile;
}
protected Path constructCaptivePortalUserList() {
protected List<TimedAccessUserRecord> constructCaptivePortalUserList() {
List<TimedAccessUserRecord> userList = new ArrayList<>();
@@ -942,22 +934,24 @@ public class AllInOneStartListener implements ApplicationRunner {
try {
Files.deleteIfExists(path);
} catch (Exception e) {
e.printStackTrace();
LOG.error("Cannot delete {}", path, e);
}
StringBuilder sb = new StringBuilder();
for (TimedAccessUserRecord userRecord : userList) {
sb.append("username=" + userRecord.getUsername() + ", password=" + userRecord.getPassword()
byte[] bytes = ("username=" + userRecord.getUsername() + ", password=" + userRecord.getPassword()
+ ", firstname=" + userRecord.getUserDetails().getFirstName() + ", lastname="
+ userRecord.getUserDetails().getLastName() + System.lineSeparator());
+ 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);
}
}
}
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;
return userList;
}
private void createFirmwareObjects(Customer customer) {
@@ -1511,19 +1505,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);

1
client-datastore-cassandra/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-datastore-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-cassandra-tests</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>

View File

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

View File

@@ -410,7 +410,7 @@ public class ClientSessionDAO {
queryArgs.addAll(equipmentIds);
query += "and equipmentId in " + CassandraUtils.getBindPlaceholders(equipmentIds);
query_head = "select macAddress from client_session_by_equipment where customerId = ? ";
query_head = "select macAddress, equipmentId 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 from client_session_by_location where ";
query_head = "select macAddress, equipmentId 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 from client_session_by_mac where customerId = ? ";
query_head = "select macAddress, equipmentId 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 from client_session_by_mac_and_equipment where customerId = ? ";
query_head = "select macAddress, equipmentId from client_session_by_mac_and_equipment where customerId = ? ";
}
query = " and macAddressString like ? " + query + " allow filtering";
@@ -494,27 +494,24 @@ public class ClientSessionDAO {
case customer_and_equipment:
case customer_and_location:
case customer_and_macAddress:
//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<>();
//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
while (rs.getAvailableWithoutFetching() > 0) {
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()))
)
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(cs);
}
});
pageItems.add(retSession);
}
}
break;
default:

View File

@@ -26,7 +26,8 @@ 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';
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'};
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 TABLE IF NOT EXISTS tip_wlan_keyspace.client_session (
@@ -41,8 +42,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 30 days'
AND default_time_to_live = 2592000;
) WITH comment='Wireless client sessions used by TIP WLAN CloudSDK. Records automatically expire after 24 hours'
AND default_time_to_live = 86400;
CREATE INDEX IF NOT EXISTS idx_client_session_customerId ON tip_wlan_keyspace.client_session (customerId);
@@ -52,8 +53,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 30 days'
AND default_time_to_live = 2592000;
) 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;
CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session_by_location (
customerId int,
@@ -62,8 +63,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 30 days'
AND default_time_to_live = 2592000;
) 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;
CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session_by_mac (
customerId int,
@@ -73,8 +74,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 30 days'
AND default_time_to_live = 2592000;
) 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;
CREATE TABLE IF NOT EXISTS tip_wlan_keyspace.client_session_by_mac_and_equipment (
customerId int,
@@ -84,8 +85,11 @@ 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 30 days'
AND default_time_to_live = 2592000;
) 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;
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'};
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'};

View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>

View File

@@ -973,6 +973,63 @@ 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();

1
client-datastore-inmemory/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-datastore-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>client-datastore-common-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -156,6 +156,11 @@ public class ClientDatastoreInMemory extends BaseInMemoryDatastore implements Cl
//client is already cloned by the getOrNull method
return client;
}
@Override
public void delete(long createdBeforeTimestamp) {
return;
}
@Override
public List<Client> get(int customerId, Set<MacAddress> clientMacSet) {
@@ -362,6 +367,10 @@ public class ClientDatastoreInMemory extends BaseInMemoryDatastore implements Cl
return clientSession.clone();
}
@Override
public void deleteSessions(long createdBeforeTimestamp) {
return;
}
@Override
public List<ClientSession> getSessions(int customerId, Set<MacAddress> clientMacSet) {

1
client-datastore-interface/.gitignore vendored Normal file
View File

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

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.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.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-exceptions</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

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

View File

@@ -1,43 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>1.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

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

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

@@ -1,18 +0,0 @@
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);
}
}

View File

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

View File

@@ -1,101 +0,0 @@
package com.telecominfraproject.wlan.client.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.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.client.datastore.ClientDatastore;
import com.telecominfraproject.wlan.client.models.Client;
import com.telecominfraproject.wlan.client.session.models.ClientSession;
/**
* @author dtoptygin
*
*/
@Configuration
public class ClientDatastoreRdbms implements ClientDatastore {
@Autowired ClientDAO clientDAO;
@Autowired ClientSessionDAO clientSessionDAO;
@Override
public Client create(Client client) {
return clientDAO.create(client);
}
@Override
public Client getOrNull(int customerId, MacAddress clientMac) {
return clientDAO.getOrNull(customerId, clientMac);
}
@Override
public Client update(Client client) {
return clientDAO.update(client);
}
@Override
public Client delete(int customerId, MacAddress clientMac) {
return clientDAO.delete(customerId, clientMac);
}
@Override
public List<Client> get(int customerId, Set<MacAddress> clientMacSet) {
return clientDAO.get(customerId, clientMacSet);
}
@Override
public List<Client> getBlockedClients(int customerId) {
return clientDAO.getBlockedClients(customerId);
}
@Override
public PaginationResponse<Client> getForCustomer(int customerId, String macSubstring,
List<ColumnAndSort> sortBy, PaginationContext<Client> context) {
if(context == null) {
context = new PaginationContext<>();
}
return clientDAO.getForCustomer(customerId, macSubstring, sortBy, context);
}
@Override
public ClientSession getSessionOrNull(int customerId, long equipmentId, MacAddress clientMac) {
return clientSessionDAO.getSessionOrNull(customerId, equipmentId, clientMac);
}
@Override
public ClientSession updateSession(ClientSession clientSession) {
return clientSessionDAO.updateSession(clientSession);
}
@Override
public ClientSession deleteSession(int customerId, long equipmentId, MacAddress clientMac) {
return clientSessionDAO.deleteSession(customerId, equipmentId, clientMac);
}
@Override
public List<ClientSession> getSessions(int customerId, Set<MacAddress> clientMacSet) {
return clientSessionDAO.getSessions(customerId, clientMacSet);
}
@Override
public PaginationResponse<ClientSession> getSessionsForCustomer(int customerId, Set<Long> equipmentIds, Set<Long> locationIds,
String macSubstring, List<ColumnAndSort> sortBy, PaginationContext<ClientSession> context) {
if(context == null) {
context = new PaginationContext<>();
}
return clientSessionDAO.getSessionsForCustomer(customerId, equipmentIds, locationIds, macSubstring, sortBy, context);
}
}

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